<?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=Belogorie</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=Belogorie"/>
		<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/Belogorie"/>
		<updated>2026-05-13T01:30:45Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:%D0%9E%D1%82%D0%B2%D0%B5%D1%82%D1%8B</id>
		<title>LXF98:Ответы</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:%D0%9E%D1%82%D0%B2%D0%B5%D1%82%D1%8B"/>
				<updated>2008-04-04T13:42:00Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;font color=red&amp;gt;Важно! Расрасить, докинуть изображения&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ответы==&lt;br /&gt;
&lt;br /&gt;
===BIOS с «тараканами»===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я купил, как мне казалось, самый лучший компьютер по соотношению цена-производительность, и продолжаю считать его таковым. Но кое-что меня беспокоит. При включении компьютера и выборе загрузки Ubuntu из ''Grub'', на экран выводится сообщение об ошибке MP-BIOS 8254 и каком-то неподключенном таймере. Также почти все дистрибутивы с DVD журнала не запускаются без опции &amp;lt;font color=darkred&amp;gt;noapic&amp;lt;/font&amp;gt; в строке загрузки. При загрузке '''LXFDVD95''' выводится текст&lt;br /&gt;
&lt;br /&gt;
 MP-BIOS bug: 8254 timer not connected to IO_APIC&lt;br /&gt;
 Kernel panic - not syncing: OI_APIC + timer doesn’t work!&lt;br /&gt;
&lt;br /&gt;
Искал и в Google, и в справке Ubuntu, но нашел только скудные заявления, что мой таймер не работает. Думаю, что это как-то связано с моей видеокартой&lt;br /&gt;
NVIDIA 7300LE (известно, что дешевые вещи обходятся дорого), но в чем все-таки причина? Возможно, пригодится другой факт. Все 3D-изображения на моем&lt;br /&gt;
компьютере становятся нестабильными и содержат множество ошибок. Нужно ли мне покупать видеокарту получше?&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;font color=orange&amp;gt;Иво Иванов [Ivo Ivanov]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Дело не в видеокарте: причиной ваших проблем с графикой может быть APIC (Advanced Programmable Interrupt Controller &amp;lt;font color=darkblue&amp;gt;[Расширенный программируемый контроллер прерываний, – прим. пер.]&amp;lt;/font&amp;gt;), управляющий таймингами и прерываниями для различных компонентов вашей материнской платы, включая контроллер дисков и разъемы видеокарт. Контроллеры ACPI довольно часто отходят от спецификаций: многие изготовители полагают, что если плата «работает в Windows», то стандартам следовать не обязательно. Вы уже обнаружили, что надо добавить &amp;lt;font color=darkred&amp;gt;noapic&amp;lt;/font&amp;gt; в параметры загрузки LiveCD, но необходимо также делать это при загрузке с жесткого диска.&lt;br /&gt;
&lt;br /&gt;
Но сначала проверьте наличие обновлений BIOS на сайте изготовителя: вполне возможно, что ваша проблема была решена в последней версии прошивки.&lt;br /&gt;
Если нет, придется переделать меню загрузки, чтобы всегда использовалась опция &amp;lt;font color=darkred&amp;gt;noapic&amp;lt;/font&amp;gt;. Ubuntu не включает программу для настройки процесса загрузки, и&lt;br /&gt;
Вам придется править файл конфигурации вручную. Нажмите &amp;lt;font color=darkblue&amp;gt;Alt+F2&amp;lt;/font&amp;gt; и наберите&lt;br /&gt;
&lt;br /&gt;
 sudo gedit /boot/grub/menu.lst&lt;br /&gt;
&lt;br /&gt;
Это откроет файл конфигурации меню загрузки в текстовом редакторе. Большинство строк там начинаются с &amp;lt;font color=darkred&amp;gt;#&amp;lt;/font&amp;gt; – это комментарии, и их можно игнорировать. Найдите первую строку, начинающуюся с &amp;lt;font color=darkred&amp;gt;title&amp;lt;/font&amp;gt;; это первый пункт меню загрузки. Вам нужно изменить следующую строчку, начинающуюся с &amp;lt;font color=darkred&amp;gt;kernel&amp;lt;/font&amp;gt;,&lt;br /&gt;
добавив &amp;lt;font color=darkred&amp;gt;noapic&amp;lt;/font&amp;gt; в ее конец, обязательно через пробел после последнего слова в строке. Файл сохраните. После перезагрузки сообщение об ошибке BIOS&lt;br /&gt;
исчезнет, и 3D-графика станет стабильной. Видимо, будут и другие улучшения в работе, потому что «глючная» прошивка APIC способна вызывать разные проблемы, от снижения скорости доступа к дискам до неверного хода часов.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;font color=orange&amp;gt;Нейл Ботвик&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Беспроводная сеть, ау!===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я уже использовал Linux в 1996–1997 годах для запуска UNIX-приложений на ноутбуке, так как Linux был бесплатным, а Sparcbook стоил 10 000 фунтов. Позже я решил, что было бы неплохо использовать его снова и установить его на моем домашнем DELL XPS m1210. Порывшись в Интернете, я нашел, что для моей машины идеален Slackware 10, благополучно установил его и использовал ''Lilo'' для двойной загрузки Windows Vista и Linux.&lt;br /&gt;
&lt;br /&gt;
К сожалению, я не смог заставить работать беспроводную сетевую карту; точнее, я не знаю, как это сделать. Я смотрел в Сети, находил там решения, но все они были на чуждом для меня языке. За прошедшие десять лет я очень многое перезабыл и чувствую себя полным «чайником». Моя беспроводная карта: Intel PRO/Wireless 3945ABG Network Connection.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;font color=orange&amp;gt;Грег [Greg]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существует официальный драйвер от Intel для этой беспроводной карты, найти его можно здесь: http://ipw3945.sourceforge.net, но он требует довольно свежего ядра для работы, как минимум 2.6.13. Slackware 10 старше трех лет и значительно старше этого драйвера, и использует ядро версии 2.4. Для нормальной работы нового аппаратного обеспечения Вам нужен дистрибутив – и в частности, ядро – такой же новый, как оборудование. Если вы хотите держаться Slackware, то установите новейшую версию 12.0: это первый релиз с ядром 2.6, которое необходимо вашей беспроводной карте, по умолчанию. Пакеты для использования вашей карты со Slackware 12 есть на сайте ftp://ftp.slackware.at/slackware-12.0/extra/intel-wlan-ipw3945.&lt;br /&gt;
&lt;br /&gt;
Как альтернативу, можно установить любой другой дистрибутив, в репозитории которого есть пакет ''ipw3945''. Неплохой выбор – Ubuntu c '''DVDLXF94''',&lt;br /&gt;
поскольку драйвер ''ipw3945'' включен в установку по умолчанию и должен «просто работать». В Fedora 7 с '''DVDLXF95''' также имеется ipw3945, но перед его&lt;br /&gt;
установкой требуется добавить репозиторий ''ATrpms'' в менеджер пакетов. Как добавить репозиторий, можно прочитать по адресу http://atrpms.net/install.html. Этот сайт содержит отнюдь не одни беспроводные драйверы – там множество самых разнообразных пакетов – и заслуживает добавления в ваш список репозиториев.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;font color=orange&amp;gt;Майк Сондерс&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Желание синхронности===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хочу перейти на Linux, но боюсь, что синхронизация ''Microsoft Outlook'' на моем PDA не будет работать. Еще у меня на PDA стоит Money for PPC, это важная для меня программа – предоставляет ли ''GnuCash'' похожие возможности?&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;font color=orange&amp;gt;Герхард Штигер [Gerhard Stieger]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Синхронизацию Linux-приложений с устройствами Windows Pocket PC позволяет производить каркас ''SyncCE'' ([http://www.synce.org/index.php/SynCE-Wiki www.synce.org/index.php/SynCE-Wiki]); степень его дружелюбия к пользователю и качество зависят от приложения. Проще всего синхронизируются приложения пакета KDE PIM – ''KMail'', ''Kontact'', ''KAddressBook'' и ''KOrganiser''. Чтобы сделать это, необходимо установить пакет ''synce-kde'', присутствующий во многих дистрибутивах, но не во всех устанавливаемый по умолчанию. После установки системы запустите менеджер пакетов и установите ''synce-kde'', если он не помечен как установленный. После этого вы&lt;br /&gt;
сможете синхронизировать свою почту и контакты.&lt;br /&gt;
&lt;br /&gt;
Однако это потребует запуска системы на базе KDE, типа Mandriva, Kubuntu, PCLinuxOS или SUSE. Все они присутствуют на DVD-дисках ''LinuxFormat'', но вы&lt;br /&gt;
также можете найти ссылки на них и на множество других дистрибутивов на [http://www.distrowatch.com www.distrowatch.com].&lt;br /&gt;
&lt;br /&gt;
Синхронизация ваших записей о финансах – это другая тема. ''GnuCash'' может импортировать стандартные учетные записи QIF, но не экспортировать&lt;br /&gt;
их. Зато ''KMyMoney'' (http://kmymoney2.sourceforge.net) умеет делать и импорт, и экспорт, так что Вы сможете импортировать файлы с вашего PDA и переносить их назад после модификации. Те, кто не разбираются в бухгалтерском учете профессионально или не имеют опыта работы, вероятно, сочтут ''KMyMoney'' более легким, чем ''GnuCash''. ''KMyMoney'' – тоже KDE-приложение, оно должно присутствовать в любом из перечисленных выше дистрибутивов.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;font color=orange&amp;gt;Ник Вейч&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Перезапись URL===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пишу web-сайт со множеством PNG-изображений – большинство из них использует прозрачность. Он великолепно работает во всех последних версиях браузеров, но (как и ожидалось) не в ''IE6''. Чтобы исправить это, я создал GIF-версии для каждой картинки (а также таблицу стилей), загружаемые вместо PNG, если пользователь использует ''IE6''.&lt;br /&gt;
&lt;br /&gt;
Я хочу сделать это с помощью &amp;lt;font color=darkred&amp;gt;mod_rewrite&amp;lt;/font&amp;gt; и '''.htaccess''', чтобы '''images/png/image1.png''' переписывался в '''images/gif/image1.gif'''. Вот мой файл '''.htaccess''':&lt;br /&gt;
&lt;br /&gt;
 RewriteEngine On&lt;br /&gt;
 RewriteCond %{HTTP_USER_AGENT} “MSIE 6”&lt;br /&gt;
 RewriteRule /images/png/([A-Za-z0-9])+\.png$/images/gif/$1+\.gif&lt;br /&gt;
 RewriteCond %{HTTP_USER_AGENT} “MSIE 6”&lt;br /&gt;
 RewriteRule css/style.css css/iestyle.css&lt;br /&gt;
&lt;br /&gt;
Перезапись CSS работает четко, но картинки (PNG на GIF) не заменяются. &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;font color=orange&amp;gt;OnlyTheTony, с форумов&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вы предложили хорошую идею использовать &amp;lt;font color=darkred&amp;gt;mod_rewrite&amp;lt;/font&amp;gt; для смены URL. Сбой происходит потому, что Вы используете &amp;lt;font color=darkred&amp;gt;+&amp;lt;/font&amp;gt; для объединения строк, а &amp;lt;font color=darkred&amp;gt;mod_rewrite&amp;lt;/font&amp;gt; работает с регулярными выражениями, где &amp;lt;font color=darkred&amp;gt;+&amp;lt;/font&amp;gt; означает «одно или более повторений», а не оператор конкатенации.&lt;br /&gt;
&lt;br /&gt;
В регулярных выражениях не нужно соединять строки: чтобы отметить неизменяемые части, используются скобки, а &amp;lt;font color=darkred&amp;gt;$1, $2...&amp;lt;/font&amp;gt; включат их в путь назначения, как у Вас и делается, и все является либо текстом, либо символами регулярных выражений. Так, чтобы заменить последнее вхождение &amp;lt;font color=darkred&amp;gt;foo&amp;lt;/font&amp;gt; в строке на&amp;lt;font color=darkred&amp;gt; bar&amp;lt;/font&amp;gt;, потребуется выражение&lt;br /&gt;
&lt;br /&gt;
 /(.*)foo(.*)/$1bar$2/&lt;br /&gt;
&lt;br /&gt;
В вашем случае надо взять нечто, начинающееся с &amp;lt;font color=darkred&amp;gt;image/png&amp;lt;/font&amp;gt; и заканчивающееся на &amp;lt;font color=darkred&amp;gt;.png&amp;lt;/font&amp;gt;, и заменить везде &amp;lt;font color=darkred&amp;gt;png&amp;lt;/font&amp;gt; на &amp;lt;font color=darkred&amp;gt;gif&amp;lt;/font&amp;gt;. Вы можете сделать это, вставив одну из следующих строк вместо первого правила &amp;lt;font color=darkred&amp;gt;RewriteRule&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
  RewriteRule /images/png/(.*)\.png$ /images/gif/$1\.gif&lt;br /&gt;
  RewriteRule /(.*)/png/(.*)\.png$ /$1/gif/$2\.gif&lt;br /&gt;
&lt;br /&gt;
Первая строка легче читается, зато вторая также будет работать с изображениями в других директориях.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;font color=orange&amp;gt;Нейл Ботвик&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Восстановить NTFS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У меня внешний жесткий диск, отформатированный в ''NTFS''. Мне нужно произвести его дефрагментацию, но я не хочу потерять все данные на нем. Можно ли выполнить дефрагментацию ''NTFS'' из Linux? Я запускаю Ubuntu Feisty Fawn на старом компьютере PC2800.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;font color=orange&amp;gt;churst1, с форумов&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Короткий ответ – нет, нельзя. Во-первых, почему на этом диске ''NTFS''? Если с него загружают Windows, любые попытки выполнить дефрагментацию из-под Linux могут привести к ее незагружаемости. Но если диск уже содержит Windows, то почему бы не провести дефрагментацию из нее – Windows ведь не только для того, чтобы баловаться игрушками. Если же диск используется только для хранения данных, вы можете снизить фрагментацию, скопировав все их с него, отформатировав диск и записав данные обратно. Это действие требует драйвера файловой системы ''NTFS'' с полной поддержкой записи, такой, как коммерческая ''Paragon NTFS for Linux'', которую мы рассматривали в прошлом месяце, или ''NTFS-3G'', включенная в репозиторий Ubuntu. Также необходим пакет ''ntfsprogs'', поэтому запустите ''Synaptic'' и инсталлируйте оба.&lt;br /&gt;
&lt;br /&gt;
Теперь надо проделать небольшую работу по открытию терминала, выбору директории, достаточно просторной для хранения содержимого ''NTFS''-диска, и&lt;br /&gt;
запуску следующей команды:&lt;br /&gt;
&lt;br /&gt;
 tar cf ntfs.tar /mnt/ntfs &amp;amp;&amp;amp; umount /mnt/ntfs &amp;amp;&amp;amp; mkntfs /dev/sda1 &amp;amp;&amp;amp; mount /dev/sda1/mnt/ntfs -t ntfs-3g &amp;amp;&amp;amp; tar xf ntfs.tar -C /mnt/ntfs&lt;br /&gt;
&lt;br /&gt;
Мы сцепили вместе две долгоиграющих команды &amp;lt;font color=darkred&amp;gt;tar&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;mkntfs&amp;lt;/font&amp;gt; – это позволит Вам не быть сиделкой у компьютера, но каждая следующая команда выполнится, только если предыдущая отработает без ошибок (совершенно незачем переформатировать диск, если произойдет сбой в копировании). Данный пример подразумевает, что Ваш диск – '''/dev/sda1''' и смонтирован он в '''/mnt/NTFS'''. Перед запуском команды убедитесь, что подставлены правильные пути для Вашего компьютера.&lt;br /&gt;
&lt;br /&gt;
Если у Вас мало места для хранения данных, можете создать сжатый архив, но это продлится гораздо дольше, чем простое копирование с диска. Вы можете&lt;br /&gt;
сделать это так:&lt;br /&gt;
&lt;br /&gt;
 tar czf ntfs.tar.gz /mnt/ntfs &amp;amp;&amp;amp; umount /mnt/ntfs &amp;amp;&amp;amp; mkntfs /dev/sda1 &amp;amp;&amp;amp; mount /dev/sda1 /mnt/ntfs -t ntfs-3g &amp;amp;&amp;amp; tar xf ntfs.tar.gz -C /mnt/ntfs&lt;br /&gt;
&lt;br /&gt;
Если Вы используете NTFS только ради чтения из Windows (а зачем она еще нужна?) и только с Вашим компьютером, где стоит Windows, лучшим решением&lt;br /&gt;
будет переформатирование диска в '''ext2''' и установка драйвера '''ext2''' с [http://www.fs-driver.org www.fs-driver.org] в Windows. Это снимет проблему фрагментации, и Вы получите лучшее быстродействие в Linux. В вышеприведенных командах для этого надо заменить &amp;lt;font color=darkred&amp;gt;mkntfs&amp;lt;/font&amp;gt; на &amp;lt;font color=darkred&amp;gt;mke2fs&amp;lt;/font&amp;gt; и удалить&lt;br /&gt;
&lt;br /&gt;
 -t ntfs-3g&lt;br /&gt;
&lt;br /&gt;
из команды &amp;lt;font color=darkred&amp;gt;mount&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;font color=orange&amp;gt;Нейл Ботвик&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Нужен легковес===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я присматриваю ОС для AMD K6/200. Думал, что NetBSD – лучший выбор, но максимум, чего я добился в результате установки – это режим командной строки. ''XFree86'' (не ''XOrg'') требует отдельной настройки. Я инвалид, и лишние усилия для меня проблема. Существуют ли «простые» версии, наподобие PC-BSD или Desktop BSD – легких версий FreeBSD?&lt;br /&gt;
&lt;br /&gt;
Пробовал DSL на машине P2/400 – ничего особенного, но я открыл DSL-N. Там даже был настоящий тестовый процессор! Что будет с производительностью, если установить Gnome или KDE на NetBSD или DSL-N? Fedora Core с Gnome работает на P2/400 с жуткими тормозами.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;font color=orange&amp;gt;Гэри Причард [Gary Prichard]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Процессор K6/200 по нынешним меркам очень медленный, поэтому необходим «легкий» дистрибутив для получения терпимой производительности. А в первую очередь нужен нетребовательный оконный менеджер: среды Gnome и KDE к таковым не относятся. Гораздо лучше ''FluxBox'', ''Xfce'' или ''IceWM''. С учетом текстового процессора, ''Xfce'' был бы лучшим выбором: он использует ''GTK'', как и ''AbiWord''. Раз ресурсы у вас ограничены, выбирайте набор приложений, использующих одни и те же библиотеки, чтобы Ваша система работала более эффективно.&lt;br /&gt;
&lt;br /&gt;
Кстати о ресурсах: один из лучших способов увеличения производительности любой Linux-системы – увеличение объема ОЗУ. Потратив немного фунтов/&lt;br /&gt;
долларов/евро/песо на дополнительную память, вы получите больший прирост скорости, чем при вложении тех же средств в более быстрый процессор.&lt;br /&gt;
&lt;br /&gt;
Есть целый набор дистрибутивов, предназначенных для «слабых» систем: вы уже открыли для себя DSL и DSL-N, но советую также изучить Puppy Linux&lt;br /&gt;
с [http://www.puppylinux.org www.puppylinux.org]. DSL ограничен объемом ISO-образа в 50 МБ, а Puppy Linux больше раза в два. Это означает, что он включает гораздо больше программ,&lt;br /&gt;
например, текстовый процессор ''AbiWord'' и сопутствующие офисные приложения, ''SeaMonkey'' (новое имя ''Mozilla'') для Web и почты и много чего еще. Недостаток&lt;br /&gt;
Puppy в том, что процесс инсталляции на жесткий диск очень запутан, так как он спроектирован как LiveCD-система. Зато вы можете запускать его прямо&lt;br /&gt;
с CD, используя жесткий диск только для хранения данных и настроек.&lt;br /&gt;
&lt;br /&gt;
Другая альтернатива – правда, потяжелее – это Zenwalk ([http://www.zenwalk.org www.zenwalk.org]). Если объем Вашего ОЗУ такой, какой обычно использовался на 200 МГц машинах, когда они были в новинку, то его не хватит; но Zenwalk дает больше функций, чем маленькие дистрибутивы.&lt;br /&gt;
&lt;br /&gt;
Запуск любой ОС на K-6/200 – это всегда компромисс между возможностями и производительностью, но он вполне возможен; тем более, если увеличить ОЗУ.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;font color=orange&amp;gt;Нейл Ботвик&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Работка для Ubuntu===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пытаясь запустить или инсталлировать Ubuntu, я получаю следующее сообщение после появления заставки:&lt;br /&gt;
&lt;br /&gt;
 unable to access tty job control turned off&lt;br /&gt;
&lt;br /&gt;
и возвращаюсь в командную строку. Ubuntu явно пытается обратиться к моему флоппи-дисководу, потому что перед появлением сообщения об ошибке&lt;br /&gt;
он включается.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;font color=orange&amp;gt;Дэвид Лоусон [David Lowson]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Похоже, что ошибка связана с ядром: не найдя загрузочный диск, оно ищет его на всех подряд устройствах, прописанных в BIOS. Потому-то дисковод и начинает работать. Эта проблема не у Вас одного, и существует более чем одно решение.&lt;br /&gt;
&lt;br /&gt;
Первое заключается в загрузке с установочного диска и правке ''fstab'' в установленной системе. Если ваш корневой раздел находится на '''/dev/sda1''', нужны следующие команды:&lt;br /&gt;
&lt;br /&gt;
 sudo -i&lt;br /&gt;
 mount /dev/sda1 /mnt&lt;br /&gt;
 gedit /mnt/etc/fstab&lt;br /&gt;
&lt;br /&gt;
В ''fstab'' вы должны найти строчку, где монтируется корневой раздел, она выглядит примерно так:&lt;br /&gt;
&lt;br /&gt;
 # /dev/sda1&lt;br /&gt;
 UUID=71f72f22-0a14-45b7-9057-f7b0bd9d819c /ext3&lt;br /&gt;
 defaults....&lt;br /&gt;
&lt;br /&gt;
UUID ('''U'''niversally '''U'''nique '''ID'''entifier [Универсальный Уникальный Идентификатор]) позволяет Ubuntu находить корневой раздел, даже если сменилась точка&lt;br /&gt;
подключения устройства (например, при добавлении нового диска), но здесь бывают проблемы. Смените &amp;lt;font color=darkred&amp;gt;UUID=xyz&amp;lt;/font&amp;gt; на путь вашего устройства, и система снова начнет загружаться. ''Fstab'' в этом случае должен выглядеть так:&lt;br /&gt;
&lt;br /&gt;
 # /dev/sda1&lt;br /&gt;
 /dev/sda1 / ext3 defaults....&lt;br /&gt;
&lt;br /&gt;
Другое решение более экстремальное, так что используйте его только в случае провала трюка с ''fstab''. Вы должны открыть корпус вашего компьютера и&lt;br /&gt;
отключить все лишние дисковые устройства, оставив только загрузочный диск и DVD, с которого выполнялась установка – но не забудьте сперва выключить&lt;br /&gt;
компьютер! Дисковод также отключите – достаточно отсоединить кабели питания от неиспользуемых устройств. После этого ваша система должна загружаться. Затем добавьте модуль ''piix'' к образу, который Ubuntu загружает при запуске, с помощью команд&lt;br /&gt;
&lt;br /&gt;
 sudo echo piix &amp;gt;&amp;gt;/etc/initramfs-tools/modules&lt;br /&gt;
 sudo update-initramfs -u&lt;br /&gt;
&lt;br /&gt;
Теперь вам надо выключить компьютер, снова подсоединить все устройства и перезапустить его. Данная ошибка замечена небольшим числом пользователей Ubuntu, у которых подключено много устройств. Сообщалось также, что если проблема во флоппи-дисководе, ее можно обойти, оставив в нем дискету, но мы не смогли этого проверить, и в любом случае, это не метод.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;font color=orange&amp;gt;Ник Вейч&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Сервис резервирования===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Откликаясь на ''Сравнение «Онлайн-резервирование» (LXF94)'', расскажу о мелкой, но, надеюсь, решаемой проблеме. Я использую ''iBackup'', потому что делаю резервное копирование с моего ПК (Ubuntu) и компьютера жены с Windows. Она справляется с резервным копированием без моей помощи.&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что в процессе резервирования с моего компьютера, запускаемого ''cron'', соединение часто прерывается. Когда это происходит, создаваемый '''stunnel''' рушится, уничтожая резервирование, и я получаю частично скопированные данные на ''iBackup''-сервере. Есть ли способ восстановить все при обрыве&lt;br /&gt;
соединения или даже возобновить процесс после восстановления связи без потери данных?&lt;br /&gt;
&lt;br /&gt;
Сервер ''iBackup'' не позволяет настраивать время или дату для копируемых файлов, поэтому все файлы имеют дату и время копирования. Из-за этого я копирую сжатые в ''tar'' файлы и теряю возможности ''rsync''.&lt;br /&gt;
&lt;br /&gt;
Это хороший повод переключиться на использование [http://Rsync.net Rsync.net], но мне надо копировать файлы также и с компьютера моей жены. С ''iBackup '' у нее свое соединение и URL.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;font color=orange&amp;gt;Гуус [Guus]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если Вы используете ''rsync'', рестарт резервирования не должен вызывать проблем, потому что ''rsync'' «поднимается» с того места, где произошел сбой. Не исключено, что сервер устанавливает время копирования как время создания файлов, потому что так указано в опциях ''rsync''. Вам нужно вызывать ''rsync'' с опцией &amp;lt;font color=darkred&amp;gt;--times&amp;lt;/font&amp;gt; для сохранения времени файлов. Опция &amp;lt;font color=darkred&amp;gt;--archive&amp;lt;/font&amp;gt; – комбинация нескольких опций резервирования, включая &amp;lt;font color=darkred&amp;gt;--times&amp;lt;/font&amp;gt;. Это снимет необходимость копирования ''tar''-архивов на сервер и позволит копировать индивидуальные файлы в том виде, в котором они хранятся на вашей машине, что сильно упрощает перезапуск копирования.&lt;br /&gt;
&lt;br /&gt;
Я попробовал [http://Rsync.net Rsync.net] после чтения статьи (раньше у меня был ''Strongspace'') и переключился на него полностью. Резервирование нескольких машин выполняется легко, если Вы можете более или менее свободно обращаться с имеющейся памятью – удобно будет создать по директории на резервную копию каждой машины. [http://Rsync.net Rsync.net] использует SSH для работы ''rsync'', так что в '''stunnel''' нужды нет, и вы можете применить ''Duplicity'' для шифрования данных.&lt;br /&gt;
&lt;br /&gt;
Альтернативное решение – резервирование данных на локальный диск и синхронизация их с удаленным сервером. Преимущество здесь в том, что Ваш первый шаг резервирования локален: это позволяет быстро восстановить данные, но требует, чтобы компьютер для резервных копий был включен всегда, когда требуется их создать.&lt;br /&gt;
&lt;br /&gt;
===Новый диск хромает===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Найдя, что мне необходим жесткий диск побольше, я подключил новый диск как '''hdb''', разбил его, как надо, скопировал файловые системы со старого диска ('''hda''') и попытался загрузиться с нового диска. К сожалению, ничего не вышло.&lt;br /&gt;
&lt;br /&gt;
Я сделал копии разделов '''/''', '''/boot''', '''/usr''', '''/home''' и некоторых других. Я также создал swap-раздел. '''/boot''', первый основной раздел, сделал загрузочным. Я cписал MBR, используя '''lilo -M /dev/hdb'''. Далее монтировал '''/boot''' и '''/''' разделы, редактируя новую копию '''/etc/lilo.conf''', (теперь на '''/mnt/hdb5''') и запускал '''lilo -C /hdb5/etc/lilo.conf -b /dev/hdb1''' – на вид вроде работало.&lt;br /&gt;
&lt;br /&gt;
Когда я пытаюсь загрузиться с нового диска, я прохожу через стадию загрузочного окна ''Lilo'' и вижу сообщения, заканчивающиеся на&lt;br /&gt;
&lt;br /&gt;
 initrd finished&lt;br /&gt;
 Freeing unused kernel memory&lt;br /&gt;
 Warning: Unable to open an input console&lt;br /&gt;
&lt;br /&gt;
После этого только нажатие на reset выводит компьютер из ступора. У меня стоит “Mandrakelinux release 10.2 (Limited Edition 2005) for i586”.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;font color=orange&amp;gt;Родни М. Бэйтс [Rodney M Bates]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проблема не в загрузчике. Раз уж ядро загрузилось, значит, загрузчик свое дело сделал. Такая ошибка показывает на отсутствие файла в '''/dev''' – возможно, в '''/dev/console'''. Хотя динамические файловые системы ''dev'', типа ''udev'' и ее предшественника ''devfs'', создают записи устройств в '''/dev''' автоматически, некоторые из них нужны еще до запуска ''devfs/udev''. Подозреваю, что вы пропустили содержимое '''/dev''', копируя свой корневой раздел – забыли включить его в команду копирования или исключили «прочие» файловые системы при копировании (вы не пояснили, как именно копировали файловые системы, но ''cp'', ''rsync'' и ''tar'' имеют опции по исключению других файловых систем).&lt;br /&gt;
&lt;br /&gt;
Содержимое вашей исходной директории '''/dev''' теперь скрыто, потому что новая, динамическая '''/dev''' была примонтирована поверх нее, но, как вы можете видеть, все еще доступна.&lt;br /&gt;
&lt;br /&gt;
 mkdir /mnt/tmp&lt;br /&gt;
 mount --bind / /mnt/tmp&lt;br /&gt;
&lt;br /&gt;
позволит обратиться ко всему корневому разделу через '''/mnt/tmp''' без других подмонтированных файловых систем. '''/mnt/tmp/home''' должен быть пуст, а '''/tmp/mnt/dev''' должен содержать файлы устройств. Скопируйте их в '''/dev''' на Вашем новом разделе, и ошибка при загрузке исчезнет. Самый простой способ убедиться, что новый корневой раздел содержит все файлы со старого –&lt;br /&gt;
&lt;br /&gt;
 rsync -a --delete /mnt/tmp/ /mnt/newroot/&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;font color=orange&amp;gt;Пол Хадсон&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Рота, подъем!===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для Mac OS X и Windows существуют специальные программы, которые позволяют организовать включение компьютера по расписанию. А есть ли что-нибудь подобное в Linux?&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;font color=orange&amp;gt;Анатолий Евдокимов&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Самый простой способ организовать «подъем по распорядку» – это воспользоваться функцией ACPI WakeUp, которой обладает большинство современных материнских плат. Linux предоставляет к ней два интерфейса.&lt;br /&gt;
&lt;br /&gt;
В ядрах старше 2.6.22 используется файл '''/proc/acpi/alarm''', в который можно записать дату в формате «ГГГГ-ММ-ДД ЧЧ:ММ:СС», например,&lt;br /&gt;
&lt;br /&gt;
 echo “2007-10-18 23:30:00” &amp;gt;/proc/acpi/alarm&lt;br /&gt;
&lt;br /&gt;
после чего можно выключать компьютер обычным образом. Конечно, следует проследить, чтобы системный блок остался подключенным к электросети и выключатель на его блоке питания находился в положении &amp;lt;font color=darkblue&amp;gt;ON&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ядра 2.6.22 и выше предоставляют новый интерфейс через файл '''/sys/class/rtc/rtcX/wakealarm'''. Для установки «будильника» в него следует записать&lt;br /&gt;
желаемый момент времени в виде числа секунд, прошедших с начала эпохи (1 января 1970 года, 00:00:00) – формате, столь любимом ветеранами Unix.&lt;br /&gt;
Чтобы отменить пробуждение, достаточно записать в файл значение 0. Кроме того, необходимо удостовериться, что аппаратные часы вашего компьютера&lt;br /&gt;
настроены на UTC, иначе пробуждение произойдет не в то время.&lt;br /&gt;
&lt;br /&gt;
Несмотря на свою простоту, данный способ не лишен недостатков. Так, некоторые материнские платы отказываются принимать во внимание значение, установленное программно, и отдают предпочтение времени, указанному непосредственно через BIOS. Исходя из этого, рекомендуется отключить в BIOS данную функцию – обычно она называется как-то вроде Wake from RTC/Alarm. Иногда пробуждение по таймеру автоматически отменяется, если после его установки в аппаратные часы были внесены изменения – а это делают многие дистрибутивы при выключении. Поищите команду ''hwclock'' в скриптах '''/etc/init.d''', и если она там встречается, обеспечьте, чтобы время пробуждения устанавливалось после нее повторно.&lt;br /&gt;
&lt;br /&gt;
Можно пойти другим путем и воспользоваться программой ''nvram-wakeup'' (http://http//sourceforge.net/projects/nvram-wakeup), изменяющей установки&lt;br /&gt;
прямо в энергонезависимой памяти BIOS (отсюда и название). Поскольку формат хранения данных в памяти меняется от производителя к производителю,&lt;br /&gt;
это получится только на поддерживаемых программой материнских платах, зато будет работать, как часы.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;font color=orange&amp;gt;Валентин Синицын&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Grub, который загрузит всех===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Надоело каждый раз устанавливать в BIOS загрузку с CD, чтобы попробовать новый дистрибутив. Есть ли способ добавить соответствующую опцию в ''Grub''?&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;font color=orange&amp;gt;Иван Пуренко&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Научить ''Grub'' запускать загрузчик с CD несложно, но для решения этой задачи придется привлечь два других проекта: MEMDISK &lt;br /&gt;
(http://syslinux.zytor.com/memdisk.php) и Smart Boot Manager (http://btmgr.sourceforge.net/about.html или '''Главное/SBM''' на нашем DVD). MEMDISK является частью SYSLINUX и должен быть доступен в вашем дистрибутиве в виде одноименного пакета. Разверните данный пакет и извлеките из него файл '''memdisk''', который следует скопировать в каталог '''/boot'''. Далее, возьмите из каталога '''Главное/SBM''' на первой стороне нашего DVD файл '''btmgr.floppy.bz2''' – это образ загрузочной дискеты Smart Boot Manager. Нам потребуются ее первые 18 КБ: откройте root-терминал и наберите &lt;br /&gt;
&lt;br /&gt;
 dd if=btmgr.floppy of=/boot/sbm.bin bs=1k count=18&lt;br /&gt;
&lt;br /&gt;
Наконец, необходимо создать соответствующую запись в меню ''Grub'':&lt;br /&gt;
&lt;br /&gt;
 title Boot from CD&lt;br /&gt;
              kernel /boot/memdisk&lt;br /&gt;
              initrd /boot/sbm.bin&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;font color=orange&amp;gt;Валентин Синицын&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Врезки==&lt;br /&gt;
&lt;br /&gt;
===Коротко про…===&lt;br /&gt;
&lt;br /&gt;
'''MD5'''&lt;br /&gt;
&lt;br /&gt;
''Как избежать сравнения больших потоков чисел.''&lt;br /&gt;
&lt;br /&gt;
Если вы загружали ISO-образы различных дистрибутивов, то, безусловно, видели рядом с ISO-файлами файлы с именами типа '''cooldistro1.0.iso.md5''', и, возможно, задавались вопросом: а зачем они? Сумма MD5 – это 128-битный криптографический хэш содержимого файла. Один и тот же файл всегда генерирует&lt;br /&gt;
одну и ту же сумму, но стоит изменить в нем всего один бит, и сумма окажется совершенно иной. MD5 был первоначально разработан для обеспечения безопасности. Проверив сумму MD5, вы можете убедиться, что файл не был подменен.&lt;br /&gt;
&lt;br /&gt;
Ныне MD5 также используется для проверки случайного повреждения во время передачи. При загрузке ISO-образа, скачайте заодно и файл MD5. Прежде чем &lt;br /&gt;
тратить время на запись файла на компакт-диск и попытки с него загрузиться, проверьте, не был ли файл поврежден, командой:&lt;br /&gt;
&lt;br /&gt;
 md5sum cooldistro1.0.iso&lt;br /&gt;
&lt;br /&gt;
Она вернет строку шестнадцатеричных символов, подобную хранящейся в '''cooldistro1.0.iso.md5'''. Конечно, ручное сличение 128-битных шестнадцатеричных чисел друг с другом, возможно, не самое лучшее времяпрепровождение (спешу добавить – для меня), особенно если вы скачали много файлов, так что предоставим программе сделать это за нас: &lt;br /&gt;
&lt;br /&gt;
 md5sum --check cooldistro1.0.iso.md5&lt;br /&gt;
&lt;br /&gt;
Эта команда позволит узнать, соответствует ли контрольная сумма оригиналу или нет. MD5-файл может содержать контрольные суммы нескольких файлов.&lt;br /&gt;
Например, исходные тексты Gnome состоят из множества файлов, а их суммы MD5 содержатся в одном. По договоренности, этот файл часто называется '''MD5SUMS'''.&lt;br /&gt;
Можно загрузить все необходимые вам файлы и проверить их за один раз:&lt;br /&gt;
&lt;br /&gt;
 md5sum -c MD5SUMS&lt;br /&gt;
&lt;br /&gt;
Кроме того, можно создать файл '''MD5SUMS''':&lt;br /&gt;
&lt;br /&gt;
 ms5sum *.iso &amp;gt;MD5SUMS&lt;br /&gt;
&lt;br /&gt;
SHA1-файлы работают по аналогичному принципу, но с несколько более высоким уровнем безопасности. Синтаксис тот же, только используется программа&lt;br /&gt;
''sha1sum''.&lt;br /&gt;
&lt;br /&gt;
===Часто задаваемые вопросы===&lt;br /&gt;
&lt;br /&gt;
'''FISH'''&lt;br /&gt;
&lt;br /&gt;
''Не путайте с языком программирования FISh…''&lt;br /&gt;
&lt;br /&gt;
*'''Тогда что это такое?'''&lt;br /&gt;
&lt;br /&gt;
Это сокращение от FIles (Файлов), передаваемых через протокол (оболочки) SHell.&lt;br /&gt;
&lt;br /&gt;
*'''Стоп, не так заумно. Что он делает?''' Проще говоря, он дает доступ к файлам на удаленной машине только через SSH (или RSH). На удаленной машине не&lt;br /&gt;
нужно никакого специального программного обеспечения, кроме SSH и стандартных команд оболочки. Ваш компьютер должен иметь установленными FISH-программы для доступа к этим файлам.&lt;br /&gt;
&lt;br /&gt;
*'''Где такое ПО можно взять?'''&lt;br /&gt;
&lt;br /&gt;
Скорее всего, оно у вас есть; наберите&lt;br /&gt;
&lt;br /&gt;
 cd /#sh:user@hostname/some/path&lt;br /&gt;
&lt;br /&gt;
в ''Midnight Commander'', и вы получите список содержимого '''/some/path''' на удаленной машине. Если вы опустите часть '''user@''', то будет использоваться текущее имя пользователя.&lt;br /&gt;
&lt;br /&gt;
*'''Выходит, через FISH кто-то может читать файлы на моем компьютере?'''&lt;br /&gt;
&lt;br /&gt;
Нет, потому что используется SSH. Но, если вы не используете аутентификацию по ключу, необходимо установить пароль на учетную запись. В обоих случаях,&lt;br /&gt;
доступ сможете получить только вы.&lt;br /&gt;
&lt;br /&gt;
*'''Ну, ладно, но Midnight Commander малость устарел, верно? В смысле, это ведь консольная программа, а как насчет GUI?'''&lt;br /&gt;
&lt;br /&gt;
Если у вас KDE, откройте ''Konqueror'' (или мини-консоль &amp;lt;font color=darkblue&amp;gt;Alt+F2&amp;lt;/font&amp;gt;) и наберите&lt;br /&gt;
&lt;br /&gt;
 fish://user@hostname/some/path&lt;br /&gt;
&lt;br /&gt;
Используя магию ''kio_slaves'', эта команда загрузит удаленную директорию в ''Konqueror''. Благодаря свойству разбиения ''Konqueror'' на два окна, легко сравнивать или переписывать локальную и удаленную копии директорий.&lt;br /&gt;
&lt;br /&gt;
*'''Итак, я могу использовать это для управления файлами в Konqueror или Midnight Commander?'''&lt;br /&gt;
&lt;br /&gt;
Управление файлами – это еще не все. Любое приложение KDE, работающее с файлами, может получать их через FISH. Хотите отредактировать файл на вашем&lt;br /&gt;
web-сервере на другом конце земного шара? Просто наберите&lt;br /&gt;
&lt;br /&gt;
 kate fish://me@my.server iffypagename.html&lt;br /&gt;
&lt;br /&gt;
для загрузки его в ''Kate'', и при нажатии &amp;lt;font color=darkblue&amp;gt;Save&amp;lt;/font&amp;gt; модифицированный файл отправится обратно на сервер. Конечно, web-страницами вы не ограничены: столь же удобно использовать это для редактирования файлов конфигурации.&lt;br /&gt;
&lt;br /&gt;
*'''Значит, можно использовать FISH для управления файлами на службах удаленного резервирования, вроде Rsync.net или StrongSpace?'''&lt;br /&gt;
&lt;br /&gt;
К сожалению, нет. FISH предусмотрен только для входа через учетную запись с правами запуска базовых команд оболочки. Эти сервисы не дают установить&lt;br /&gt;
полный вход в оболочку, и FISH не работает, но есть альтернатива. SSHFS (http://fuse.sourceforge.net/sshfs.html) – файловая система FUSE, позволяющая монтировать себя на учетных записях с возможностью только копировать файлы (''scp'' или ''rsync''), но требуется монтировать удаленную файловую систему, даже если вам нужно взять всего один файл.&lt;br /&gt;
&lt;br /&gt;
===Вопрос-победитель (английская версия)===&lt;br /&gt;
&lt;br /&gt;
'''Загружаясь с DVD'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я хочу установить DVD с '''LXF94''' на старый ПК в двойную загрузу с Windows 98SE. Это 7-летний Athlon 600 на материнской плате MSI со 128 МБ ОЗУ, двумя жесткими дисками и приводами DVD и CD-RW. Его BIOS не имеет опции загрузки с DVD. Загрузочная последовательность позволяет мне использовать CD-ROM как&lt;br /&gt;
первое устройство, и я спокойно могу ее изменить. На форумах мне советовали установить сперва Windows, если нужна двойная загрузка (а так и есть).&lt;br /&gt;
Я использовал ''Partition Magic V5'' для создания и FAT, и Linux-разделов.&lt;br /&gt;
&lt;br /&gt;
По-моему, Linux использует другой формат файлов по сравнению с FAT, но я пытался использовать загрузочную дискету Windows для «установки» или «инсталляции» с DVD, и неудачно. Будет ли это работать, если диск будет CD-ROM? Дискета Red Hat 6.1 позволила мне запустить CD Red Hat, но она требует именно CD Red Hat и не работает с DVD LXF94. С CD Red Hat CD все получилось, но я прервал установку, потому что предпочитаю (K)ubuntu. Могу ли я сделать загрузочную дискету с DVD-драйверами на ней для установки DVD '''LXF94'''?&lt;br /&gt;
&lt;br /&gt;
:Джон Паттерсон [John Patterson]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С точки зрения BIOS, загрузка с CD и DVD – одно и тоже: DVD распознается просто как большой CD-ROM. Старые дистрибутивы Linux использовали загрузочную дискету для быстрого старта установки с CD, поскольку в то время множество компьютеров не поддерживало загрузку с CD. Ваше поколение техники должно&lt;br /&gt;
поддерживать загрузку с оптических дисков – неважно, CD это или DVD. Установив в BIOS загрузку с CD, Вы не должны иметь проблем. Но могут сказываться личные особенности BIOS: некоторые старые BIOS дают сбой, если подключено более одного оптического привода. Если вы установили в BIOS загрузку с CD и&lt;br /&gt;
не можете загрузиться с DVD, попробуйте отсоединить кабель от вашего CD-RW, чтобы остался только один оптический привод.&lt;br /&gt;
&lt;br /&gt;
В наше время использование загрузочной дискеты для установки с CD или DVD – это уже экзотика, но на всякий случай мы поместили одну на DVD. ''Smart Boot Manager'' в каталоге '''Essential/SBM''' на DVD как раз и есть загрузочная дискета для запуска с оптического или жесткого диска. Запустите '''RAWWRITE.EXE''' в Windows, вставьте чистую дискету в дисковод и выберите '''sbootmgr.dsk''' как исходный образ. Загрузившись с этой дискеты, вы сможете загрузить ваш DVD.&lt;br /&gt;
&lt;br /&gt;
Различия в файловых системах Windows и Linux в этом случае к делу не относятся, так как все данные поступают с DVD, имеющего другую файловую систему (ту же, что у CD). Использование Windows-инструментов для создания разделов Linux способно порождать трудности. Посредством ''Partition Magic'' удалите созданные Linux-разделы, включая swap, и оставьте просто неразмеченное место. Затем велите установщику Ubuntu использовать все свободное место на диске&lt;br /&gt;
(«свободное» в этом случае означает «неразмеченное», а не место внутри размеченных разделов).&lt;br /&gt;
&lt;br /&gt;
Ваш компьютер может «тормозить» также из-за памяти. 128 МБ – очень мало по сегодняшним стандартам: современный рабочий стол, вроде KDE в Kubuntu, будет&lt;br /&gt;
работать очень медленно. Версия Ubuntu на '''LXFDVD''' наряду с жадными до ресурсов Gnome и KDE включает нетребовательный рабочий стол ''Xfce'', используемый в Xubuntu.&lt;br /&gt;
&lt;br /&gt;
===Большой вопрос===&lt;br /&gt;
&lt;br /&gt;
'''Администратор через браузер'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас учетная запись web-хостинга, предоставляющего ''Apache'', PHP и ''MySQL''. Мы имеем FTP-доступ для загрузки файлов, но не доступ к командам оболочки, из-за чего настройка базы данных SQL и других вещей затруднительна. Нам нельзя устанавливать на сервер дополнительное ПО. Мы могли бы поискать другое место с shell-доступом, но нам нравится та цена, которую мы здесь платим. Есть ли способ получить административный доступ через web-браузер, и что для этого надо сделать?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хотя переход на хостинг, поддерживающий SSH-доступ, добавит гибкости, существуют решения, привлекательные даже в случае отсутствия командной строки.&lt;br /&gt;
Основное из них – ''phphMyAdmin'' ([http://www.phpmyadmin.net www.phpmyadmin.net]). Как видно из имени, это программа администрирования ''MySQL'', написанная на PHP; она устанавливается как набор файлов в вашей учетной записи после настройки безопасности и конфигурации. Многие web-хостинги предоставляют доступ к базам данных только с локальных IP, чтобы скрипты запускались на сервере, а не на вашей машине.&lt;br /&gt;
&lt;br /&gt;
Загрузите и распакуйте один из ''tar''-архивов с сайта ''phpMyAdmin'' (они различаются только языком и методом сжатия). Традиционный метод конфигурирования ''phpMyAdmin'' – создать подходящий файл '''config.inc.php''', взяв за основу включенные примеры, но есть также и скрипт установки, который запускается всего один раз после копирования файлов на сервер. Прежде чем что-то делать, убедитесь, что это безопасно. Любой получивший доступ к директории ''phpMyAdmin'' может читать и изменять вашу базу данных, так что обезопасьте себя с помощью файла '''.htaccess''' (или другим способом), чтобы подключение было возможно только с защищенной паролем учетной записи. По возможности, включите его на раздел вашего пространства хостинга, доступный через HTTPS, ведь вы передаете пароль при запуске установочного скрипта. Создайте директорию '''config''' в директории '''phpmyadmin''' и скопируйте всю директорию (включая '''.htaccess''') на сервер хостинга.&lt;br /&gt;
&lt;br /&gt;
Зайдите на https://www.ваш.сайт/phpmyadmindir/setup.php и заполните поля своего подключения к ''MySQL''. Теперь перейдите на https://www.ваш.сайт/phphmyadmindir/ – вы увидите список ваших баз данных. Выбор одной из них покажет входящие в нее таблицы. Отсюда можно просматривать, выполнять запросы и модифицировать ваши SQL-таблицы, как вам нравится. Если у вас ''PostgreSQL'', а не ''MySQL'', то существует аналогичная программа, ''phpPgAdm'', доступная по адресу http://phppgadmin.sourceforge.net.&lt;br /&gt;
&lt;br /&gt;
Не только SQL-базы можно администрировать через web-интерфейс. ''Webmin'' позволяет изменять все, что вообще разрешено менять на *nix-машинах, не ограничиваясь серверами. В вашем случае ''Webmin'' невыгоден потому, что должен быть установлен и запущен от имени root, поскольку использует собственный встроенный сервер, отличающийся от подобных ''Apache''. Спросите об этом своего хостинг-провайдера: может, он уже установил ''Webmin'' или его бедного родственника ''Usermin''. Если нет, то он может захотеть его установить: это будет выгодно всем заказчикам. Он также может установить для вас ''phpMyAdmin'', и у вас не будет нужды тратить на это свою дисковую квоту и трафик.&lt;br /&gt;
&lt;br /&gt;
====Шаг за шагом: соединяемся с phpMyAdmin====&lt;br /&gt;
&lt;br /&gt;
#'''Прячем свой пароль'''&amp;lt;br&amp;gt;Перед копированием файлов ''phpMyAdmin'' (''pMA'') на ваш web-сервер, убедитесь, что они защищены от посторонних взглядов.&lt;br /&gt;
#'''Мастер конфигурации'''&amp;lt;br&amp;gt;Загрузив '''setup.php''' в своем браузере, вы сможете легко настроить ''phpMyAdmin'', но подключайтесь через HTTPS, чтобы держать пароль в секрете.&lt;br /&gt;
#'''Ручная конфигурация'''&amp;lt;br&amp;gt;Или же сконфигурируйте ''pMA'' перед загрузкой файлов на web-сервер, отредактировав '''config.sample.inc.php''' и сохранив его как '''config.inc.php'''.&lt;br /&gt;
#'''Вот оно!'''&amp;lt;br&amp;gt;''pMA'' позволяет работать с данными и схемами ''MySQL'' одним кликом мышки. Его можно использовать и для создания резервных копий вашей базы.&lt;br /&gt;
#'''А также PostgreSQL'''&amp;lt;br&amp;gt;Пользователям ''PostgreSQL'' не придется терять чувство превосходства – для них есть ''phpPgAdm'', эквивалент ''pMA''.&lt;br /&gt;
#'''Глобальная конфигурация'''&amp;lt;br&amp;gt;C ''Webmin'' вы можете сконфигурировать на компьютере все что угодно... точнее, все, что позволит владелец компьютера.&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:%D0%9E%D1%82%D0%B2%D0%B5%D1%82%D1%8B</id>
		<title>LXF98:Ответы</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:%D0%9E%D1%82%D0%B2%D0%B5%D1%82%D1%8B"/>
				<updated>2008-04-04T13:33:23Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;font color=red&amp;gt;Важно! Расрасить, докинуть изображения&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ответы==&lt;br /&gt;
&lt;br /&gt;
===BIOS с «тараканами»===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я купил, как мне казалось, самый лучший компьютер по соотношению цена-производительность, и продолжаю считать его таковым. Но кое-что меня беспокоит. При включении компьютера и выборе загрузки Ubuntu из ''Grub'', на экран выводится сообщение об ошибке MP-BIOS 8254 и каком-то неподключенном таймере. Также почти все дистрибутивы с DVD журнала не запускаются без опции &amp;lt;font color=darkred&amp;gt;noapic&amp;lt;/font&amp;gt; в строке загрузки. При загрузке '''LXFDVD95''' выводится текст&lt;br /&gt;
&lt;br /&gt;
 MP-BIOS bug: 8254 timer not connected to IO_APIC&lt;br /&gt;
 Kernel panic - not syncing: OI_APIC + timer doesn’t work!&lt;br /&gt;
&lt;br /&gt;
Искал и в Google, и в справке Ubuntu, но нашел только скудные заявления, что мой таймер не работает. Думаю, что это как-то связано с моей видеокартой&lt;br /&gt;
NVIDIA 7300LE (известно, что дешевые вещи обходятся дорого), но в чем все-таки причина? Возможно, пригодится другой факт. Все 3D-изображения на моем&lt;br /&gt;
компьютере становятся нестабильными и содержат множество ошибок. Нужно ли мне покупать видеокарту получше?&lt;br /&gt;
&lt;br /&gt;
:Иво Иванов [Ivo Ivanov]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Дело не в видеокарте: причиной ваших проблем с графикой может быть APIC (Advanced Programmable Interrupt Controller &amp;lt;font color=darkblue&amp;gt;[Расширенный программируемый контроллер прерываний, – прим. пер.]&amp;lt;/font&amp;gt;), управляющий таймингами и прерываниями для различных компонентов вашей материнской платы, включая контроллер дисков и разъемы видеокарт. Контроллеры ACPI довольно часто отходят от спецификаций: многие изготовители полагают, что если плата «работает в Windows», то стандартам следовать не обязательно. Вы уже обнаружили, что надо добавить &amp;lt;font color=darkred&amp;gt;noapic&amp;lt;/font&amp;gt; в параметры загрузки LiveCD, но необходимо также делать это при загрузке с жесткого диска.&lt;br /&gt;
&lt;br /&gt;
Но сначала проверьте наличие обновлений BIOS на сайте изготовителя: вполне возможно, что ваша проблема была решена в последней версии прошивки.&lt;br /&gt;
Если нет, придется переделать меню загрузки, чтобы всегда использовалась опция &amp;lt;font color=darkred&amp;gt;noapic&amp;lt;/font&amp;gt;. Ubuntu не включает программу для настройки процесса загрузки, и&lt;br /&gt;
Вам придется править файл конфигурации вручную. Нажмите &amp;lt;font color=darkblue&amp;gt;Alt+F2&amp;lt;/font&amp;gt; и наберите&lt;br /&gt;
&lt;br /&gt;
 sudo gedit /boot/grub/menu.lst&lt;br /&gt;
&lt;br /&gt;
Это откроет файл конфигурации меню загрузки в текстовом редакторе. Большинство строк там начинаются с &amp;lt;font color=darkred&amp;gt;#&amp;lt;/font&amp;gt; – это комментарии, и их можно игнорировать. Найдите первую строку, начинающуюся с &amp;lt;font color=darkred&amp;gt;title&amp;lt;/font&amp;gt;; это первый пункт меню загрузки. Вам нужно изменить следующую строчку, начинающуюся с &amp;lt;font color=darkred&amp;gt;kernel&amp;lt;/font&amp;gt;,&lt;br /&gt;
добавив &amp;lt;font color=darkred&amp;gt;noapic&amp;lt;/font&amp;gt; в ее конец, обязательно через пробел после последнего слова в строке. Файл сохраните. После перезагрузки сообщение об ошибке BIOS&lt;br /&gt;
исчезнет, и 3D-графика станет стабильной. Видимо, будут и другие улучшения в работе, потому что «глючная» прошивка APIC способна вызывать разные проблемы, от снижения скорости доступа к дискам до неверного хода часов.&lt;br /&gt;
&lt;br /&gt;
===Беспроводная сеть, ау!===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я уже использовал Linux в 1996–1997 годах для запуска UNIX-приложений на ноутбуке, так как Linux был бесплатным, а Sparcbook стоил 10 000 фунтов. Позже я решил, что было бы неплохо использовать его снова и установить его на моем домашнем DELL XPS m1210. Порывшись в Интернете, я нашел, что для моей машины идеален Slackware 10, благополучно установил его и использовал ''Lilo'' для двойной загрузки Windows Vista и Linux.&lt;br /&gt;
&lt;br /&gt;
К сожалению, я не смог заставить работать беспроводную сетевую карту; точнее, я не знаю, как это сделать. Я смотрел в Сети, находил там решения, но все они были на чуждом для меня языке. За прошедшие десять лет я очень многое перезабыл и чувствую себя полным «чайником». Моя беспроводная карта: Intel PRO/Wireless 3945ABG Network Connection.&lt;br /&gt;
&lt;br /&gt;
:Грег [Greg]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существует официальный драйвер от Intel для этой беспроводной карты, найти его можно здесь: http://ipw3945.sourceforge.net, но он требует довольно свежего ядра для работы, как минимум 2.6.13. Slackware 10 старше трех лет и значительно старше этого драйвера, и использует ядро версии 2.4. Для нормальной работы нового аппаратного обеспечения Вам нужен дистрибутив – и в частности, ядро – такой же новый, как оборудование. Если вы хотите держаться Slackware, то установите новейшую версию 12.0: это первый релиз с ядром 2.6, которое необходимо вашей беспроводной карте, по умолчанию. Пакеты для использования вашей карты со Slackware 12 есть на сайте ftp://ftp.slackware.at/slackware-12.0/extra/intel-wlan-ipw3945.&lt;br /&gt;
&lt;br /&gt;
Как альтернативу, можно установить любой другой дистрибутив, в репозитории которого есть пакет ''ipw3945''. Неплохой выбор – Ubuntu c '''DVDLXF94''',&lt;br /&gt;
поскольку драйвер ''ipw3945'' включен в установку по умолчанию и должен «просто работать». В Fedora 7 с '''DVDLXF95''' также имеется ipw3945, но перед его&lt;br /&gt;
установкой требуется добавить репозиторий ''ATrpms'' в менеджер пакетов. Как добавить репозиторий, можно прочитать по адресу http://atrpms.net/install.html. Этот сайт содержит отнюдь не одни беспроводные драйверы – там множество самых разнообразных пакетов – и заслуживает добавления в ваш список репозиториев.&lt;br /&gt;
&lt;br /&gt;
===Желание синхронности===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хочу перейти на Linux, но боюсь, что синхронизация ''Microsoft Outlook'' на моем PDA не будет работать. Еще у меня на PDA стоит Money for PPC, это важная для меня программа – предоставляет ли ''GnuCash'' похожие возможности?&lt;br /&gt;
&lt;br /&gt;
:Герхард Штигер [Gerhard Stieger]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Синхронизацию Linux-приложений с устройствами Windows Pocket PC позволяет производить каркас ''SyncCE'' ([http://www.synce.org/index.php/SynCE-Wiki www.synce.org/index.php/SynCE-Wiki]); степень его дружелюбия к пользователю и качество зависят от приложения. Проще всего синхронизируются приложения пакета KDE PIM – ''KMail'', ''Kontact'', ''KAddressBook'' и ''KOrganiser''. Чтобы сделать это, необходимо установить пакет ''synce-kde'', присутствующий во многих дистрибутивах, но не во всех устанавливаемый по умолчанию. После установки системы запустите менеджер пакетов и установите ''synce-kde'', если он не помечен как установленный. После этого вы&lt;br /&gt;
сможете синхронизировать свою почту и контакты.&lt;br /&gt;
&lt;br /&gt;
Однако это потребует запуска системы на базе KDE, типа Mandriva, Kubuntu, PCLinuxOS или SUSE. Все они присутствуют на DVD-дисках ''LinuxFormat'', но вы&lt;br /&gt;
также можете найти ссылки на них и на множество других дистрибутивов на [http://www.distrowatch.com www.distrowatch.com].&lt;br /&gt;
&lt;br /&gt;
Синхронизация ваших записей о финансах – это другая тема. ''GnuCash'' может импортировать стандартные учетные записи QIF, но не экспортировать&lt;br /&gt;
их. Зато ''KMyMoney'' (http://kmymoney2.sourceforge.net) умеет делать и импорт, и экспорт, так что Вы сможете импортировать файлы с вашего PDA и переносить их назад после модификации. Те, кто не разбираются в бухгалтерском учете профессионально или не имеют опыта работы, вероятно, сочтут ''KMyMoney'' более легким, чем ''GnuCash''. ''KMyMoney'' – тоже KDE-приложение, оно должно присутствовать в любом из перечисленных выше дистрибутивов.&lt;br /&gt;
&lt;br /&gt;
===Перезапись URL===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пишу web-сайт со множеством PNG-изображений – большинство из них использует прозрачность. Он великолепно работает во всех последних версиях браузеров, но (как и ожидалось) не в ''IE6''. Чтобы исправить это, я создал GIF-версии для каждой картинки (а также таблицу стилей), загружаемые вместо PNG, если пользователь использует ''IE6''.&lt;br /&gt;
&lt;br /&gt;
Я хочу сделать это с помощью &amp;lt;font color=darkred&amp;gt;mod_rewrite&amp;lt;/font&amp;gt; и '''.htaccess''', чтобы '''images/png/image1.png''' переписывался в '''images/gif/image1.gif'''. Вот мой файл '''.htaccess''':&lt;br /&gt;
&lt;br /&gt;
 RewriteEngine On&lt;br /&gt;
 RewriteCond %{HTTP_USER_AGENT} “MSIE 6”&lt;br /&gt;
 RewriteRule /images/png/([A-Za-z0-9])+\.png$/images/gif/$1+\.gif&lt;br /&gt;
 RewriteCond %{HTTP_USER_AGENT} “MSIE 6”&lt;br /&gt;
 RewriteRule css/style.css css/iestyle.css&lt;br /&gt;
&lt;br /&gt;
Перезапись CSS работает четко, но картинки (PNG на GIF) не заменяются. &lt;br /&gt;
&lt;br /&gt;
:OnlyTheTony, с форумов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вы предложили хорошую идею использовать &amp;lt;font color=darkred&amp;gt;mod_rewrite&amp;lt;/font&amp;gt; для смены URL. Сбой происходит потому, что Вы используете &amp;lt;font color=darkred&amp;gt;+&amp;lt;/font&amp;gt; для объединения строк, а &amp;lt;font color=darkred&amp;gt;mod_rewrite&amp;lt;/font&amp;gt; работает с регулярными выражениями, где &amp;lt;font color=darkred&amp;gt;+&amp;lt;/font&amp;gt; означает «одно или более повторений», а не оператор конкатенации.&lt;br /&gt;
&lt;br /&gt;
В регулярных выражениях не нужно соединять строки: чтобы отметить неизменяемые части, используются скобки, а &amp;lt;font color=darkred&amp;gt;$1, $2...&amp;lt;/font&amp;gt; включат их в путь назначения, как у Вас и делается, и все является либо текстом, либо символами регулярных выражений. Так, чтобы заменить последнее вхождение &amp;lt;font color=darkred&amp;gt;foo&amp;lt;/font&amp;gt; в строке на&amp;lt;font color=darkred&amp;gt; bar&amp;lt;/font&amp;gt;, потребуется выражение&lt;br /&gt;
&lt;br /&gt;
 /(.*)foo(.*)/$1bar$2/&lt;br /&gt;
&lt;br /&gt;
В вашем случае надо взять нечто, начинающееся с &amp;lt;font color=darkred&amp;gt;image/png&amp;lt;/font&amp;gt; и заканчивающееся на &amp;lt;font color=darkred&amp;gt;.png&amp;lt;/font&amp;gt;, и заменить везде &amp;lt;font color=darkred&amp;gt;png&amp;lt;/font&amp;gt; на &amp;lt;font color=darkred&amp;gt;gif&amp;lt;/font&amp;gt;. Вы можете сделать это, вставив одну из следующих строк вместо первого правила &amp;lt;font color=darkred&amp;gt;RewriteRule&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
  RewriteRule /images/png/(.*)\.png$ /images/gif/$1\.gif&lt;br /&gt;
  RewriteRule /(.*)/png/(.*)\.png$ /$1/gif/$2\.gif&lt;br /&gt;
&lt;br /&gt;
Первая строка легче читается, зато вторая также будет работать с изображениями в других директориях.&lt;br /&gt;
&lt;br /&gt;
===Восстановить NTFS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У меня внешний жесткий диск, отформатированный в ''NTFS''. Мне нужно произвести его дефрагментацию, но я не хочу потерять все данные на нем. Можно ли выполнить дефрагментацию ''NTFS'' из Linux? Я запускаю Ubuntu Feisty Fawn на старом компьютере PC2800.&lt;br /&gt;
&lt;br /&gt;
:churst1, с форумов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Короткий ответ – нет, нельзя. Во-первых, почему на этом диске ''NTFS''? Если с него загружают Windows, любые попытки выполнить дефрагментацию из-под Linux могут привести к ее незагружаемости. Но если диск уже содержит Windows, то почему бы не провести дефрагментацию из нее – Windows ведь не только для того, чтобы баловаться игрушками. Если же диск используется только для хранения данных, вы можете снизить фрагментацию, скопировав все их с него, отформатировав диск и записав данные обратно. Это действие требует драйвера файловой системы ''NTFS'' с полной поддержкой записи, такой, как коммерческая ''Paragon NTFS for Linux'', которую мы рассматривали в прошлом месяце, или ''NTFS-3G'', включенная в репозиторий Ubuntu. Также необходим пакет ''ntfsprogs'', поэтому запустите ''Synaptic'' и инсталлируйте оба.&lt;br /&gt;
&lt;br /&gt;
Теперь надо проделать небольшую работу по открытию терминала, выбору директории, достаточно просторной для хранения содержимого ''NTFS''-диска, и&lt;br /&gt;
запуску следующей команды:&lt;br /&gt;
&lt;br /&gt;
 tar cf ntfs.tar /mnt/ntfs &amp;amp;&amp;amp; umount /mnt/ntfs &amp;amp;&amp;amp; mkntfs /dev/sda1 &amp;amp;&amp;amp; mount /dev/sda1/mnt/ntfs -t ntfs-3g &amp;amp;&amp;amp; tar xf ntfs.tar -C /mnt/ntfs&lt;br /&gt;
&lt;br /&gt;
Мы сцепили вместе две долгоиграющих команды &amp;lt;font color=darkred&amp;gt;tar&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;mkntfs&amp;lt;/font&amp;gt; – это позволит Вам не быть сиделкой у компьютера, но каждая следующая команда выполнится, только если предыдущая отработает без ошибок (совершенно незачем переформатировать диск, если произойдет сбой в копировании). Данный пример подразумевает, что Ваш диск – '''/dev/sda1''' и смонтирован он в '''/mnt/NTFS'''. Перед запуском команды убедитесь, что подставлены правильные пути для Вашего компьютера.&lt;br /&gt;
&lt;br /&gt;
Если у Вас мало места для хранения данных, можете создать сжатый архив, но это продлится гораздо дольше, чем простое копирование с диска. Вы можете&lt;br /&gt;
сделать это так:&lt;br /&gt;
&lt;br /&gt;
 tar czf ntfs.tar.gz /mnt/ntfs &amp;amp;&amp;amp; umount /mnt/ntfs &amp;amp;&amp;amp; mkntfs /dev/sda1 &amp;amp;&amp;amp; mount /dev/sda1 /mnt/ntfs -t ntfs-3g &amp;amp;&amp;amp; tar xf ntfs.tar.gz -C /mnt/ntfs&lt;br /&gt;
&lt;br /&gt;
Если Вы используете NTFS только ради чтения из Windows (а зачем она еще нужна?) и только с Вашим компьютером, где стоит Windows, лучшим решением&lt;br /&gt;
будет переформатирование диска в '''ext2''' и установка драйвера '''ext2''' с [http://www.fs-driver.org www.fs-driver.org] в Windows. Это снимет проблему фрагментации, и Вы получите лучшее быстродействие в Linux. В вышеприведенных командах для этого надо заменить &amp;lt;font color=darkred&amp;gt;mkntfs&amp;lt;/font&amp;gt; на &amp;lt;font color=darkred&amp;gt;mke2fs&amp;lt;/font&amp;gt; и удалить&lt;br /&gt;
&lt;br /&gt;
 -t ntfs-3g&lt;br /&gt;
&lt;br /&gt;
из команды &amp;lt;font color=darkred&amp;gt;mount&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Нужен легковес===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я присматриваю ОС для AMD K6/200. Думал, что NetBSD – лучший выбор, но максимум, чего я добился в результате установки – это режим командной строки. ''XFree86'' (не ''XOrg'') требует отдельной настройки. Я инвалид, и лишние усилия для меня проблема. Существуют ли «простые» версии, наподобие PC-BSD или Desktop BSD – легких версий FreeBSD?&lt;br /&gt;
&lt;br /&gt;
Пробовал DSL на машине P2/400 – ничего особенного, но я открыл DSL-N. Там даже был настоящий тестовый процессор! Что будет с производительностью, если установить Gnome или KDE на NetBSD или DSL-N? Fedora Core с Gnome работает на P2/400 с жуткими тормозами.&lt;br /&gt;
&lt;br /&gt;
:Гэри Причард [Gary Prichard]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Процессор K6/200 по нынешним меркам очень медленный, поэтому необходим «легкий» дистрибутив для получения терпимой производительности. А в первую очередь нужен нетребовательный оконный менеджер: среды Gnome и KDE к таковым не относятся. Гораздо лучше ''FluxBox'', ''Xfce'' или ''IceWM''. С учетом текстового процессора, ''Xfce'' был бы лучшим выбором: он использует ''GTK'', как и ''AbiWord''. Раз ресурсы у вас ограничены, выбирайте набор приложений, использующих одни и те же библиотеки, чтобы Ваша система работала более эффективно.&lt;br /&gt;
&lt;br /&gt;
Кстати о ресурсах: один из лучших способов увеличения производительности любой Linux-системы – увеличение объема ОЗУ. Потратив немного фунтов/&lt;br /&gt;
долларов/евро/песо на дополнительную память, вы получите больший прирост скорости, чем при вложении тех же средств в более быстрый процессор.&lt;br /&gt;
&lt;br /&gt;
Есть целый набор дистрибутивов, предназначенных для «слабых» систем: вы уже открыли для себя DSL и DSL-N, но советую также изучить Puppy Linux&lt;br /&gt;
с [http://www.puppylinux.org www.puppylinux.org]. DSL ограничен объемом ISO-образа в 50 МБ, а Puppy Linux больше раза в два. Это означает, что он включает гораздо больше программ,&lt;br /&gt;
например, текстовый процессор ''AbiWord'' и сопутствующие офисные приложения, ''SeaMonkey'' (новое имя ''Mozilla'') для Web и почты и много чего еще. Недостаток&lt;br /&gt;
Puppy в том, что процесс инсталляции на жесткий диск очень запутан, так как он спроектирован как LiveCD-система. Зато вы можете запускать его прямо&lt;br /&gt;
с CD, используя жесткий диск только для хранения данных и настроек.&lt;br /&gt;
&lt;br /&gt;
Другая альтернатива – правда, потяжелее – это Zenwalk ([http://www.zenwalk.org www.zenwalk.org]). Если объем Вашего ОЗУ такой, какой обычно использовался на 200 МГц машинах, когда они были в новинку, то его не хватит; но Zenwalk дает больше функций, чем маленькие дистрибутивы.&lt;br /&gt;
&lt;br /&gt;
Запуск любой ОС на K-6/200 – это всегда компромисс между возможностями и производительностью, но он вполне возможен; тем более, если увеличить ОЗУ.&lt;br /&gt;
&lt;br /&gt;
===Работка для Ubuntu===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пытаясь запустить или инсталлировать Ubuntu, я получаю следующее сообщение после появления заставки:&lt;br /&gt;
&lt;br /&gt;
 unable to access tty job control turned off&lt;br /&gt;
&lt;br /&gt;
и возвращаюсь в командную строку. Ubuntu явно пытается обратиться к моему флоппи-дисководу, потому что перед появлением сообщения об ошибке&lt;br /&gt;
он включается.&lt;br /&gt;
&lt;br /&gt;
:Дэвид Лоусон [David Lowson]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Похоже, что ошибка связана с ядром: не найдя загрузочный диск, оно ищет его на всех подряд устройствах, прописанных в BIOS. Потому-то дисковод и начинает работать. Эта проблема не у Вас одного, и существует более чем одно решение.&lt;br /&gt;
&lt;br /&gt;
Первое заключается в загрузке с установочного диска и правке ''fstab'' в установленной системе. Если ваш корневой раздел находится на '''/dev/sda1''', нужны следующие команды:&lt;br /&gt;
&lt;br /&gt;
 sudo -i&lt;br /&gt;
 mount /dev/sda1 /mnt&lt;br /&gt;
 gedit /mnt/etc/fstab&lt;br /&gt;
&lt;br /&gt;
В ''fstab'' вы должны найти строчку, где монтируется корневой раздел, она выглядит примерно так:&lt;br /&gt;
&lt;br /&gt;
 # /dev/sda1&lt;br /&gt;
 UUID=71f72f22-0a14-45b7-9057-f7b0bd9d819c /ext3&lt;br /&gt;
 defaults....&lt;br /&gt;
&lt;br /&gt;
UUID ('''U'''niversally '''U'''nique '''ID'''entifier [Универсальный Уникальный Идентификатор]) позволяет Ubuntu находить корневой раздел, даже если сменилась точка&lt;br /&gt;
подключения устройства (например, при добавлении нового диска), но здесь бывают проблемы. Смените &amp;lt;font color=darkred&amp;gt;UUID=xyz&amp;lt;/font&amp;gt; на путь вашего устройства, и система снова начнет загружаться. ''Fstab'' в этом случае должен выглядеть так:&lt;br /&gt;
&lt;br /&gt;
 # /dev/sda1&lt;br /&gt;
 /dev/sda1 / ext3 defaults....&lt;br /&gt;
&lt;br /&gt;
Другое решение более экстремальное, так что используйте его только в случае провала трюка с ''fstab''. Вы должны открыть корпус вашего компьютера и&lt;br /&gt;
отключить все лишние дисковые устройства, оставив только загрузочный диск и DVD, с которого выполнялась установка – но не забудьте сперва выключить&lt;br /&gt;
компьютер! Дисковод также отключите – достаточно отсоединить кабели питания от неиспользуемых устройств. После этого ваша система должна загружаться. Затем добавьте модуль ''piix'' к образу, который Ubuntu загружает при запуске, с помощью команд&lt;br /&gt;
&lt;br /&gt;
 sudo echo piix &amp;gt;&amp;gt;/etc/initramfs-tools/modules&lt;br /&gt;
 sudo update-initramfs -u&lt;br /&gt;
&lt;br /&gt;
Теперь вам надо выключить компьютер, снова подсоединить все устройства и перезапустить его. Данная ошибка замечена небольшим числом пользователей Ubuntu, у которых подключено много устройств. Сообщалось также, что если проблема во флоппи-дисководе, ее можно обойти, оставив в нем дискету, но мы не смогли этого проверить, и в любом случае, это не метод.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Сервис резервирования===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Откликаясь на ''Сравнение «Онлайн-резервирование» (LXF94)'', расскажу о мелкой, но, надеюсь, решаемой проблеме. Я использую ''iBackup'', потому что делаю резервное копирование с моего ПК (Ubuntu) и компьютера жены с Windows. Она справляется с резервным копированием без моей помощи.&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что в процессе резервирования с моего компьютера, запускаемого ''cron'', соединение часто прерывается. Когда это происходит, создаваемый '''stunnel''' рушится, уничтожая резервирование, и я получаю частично скопированные данные на ''iBackup''-сервере. Есть ли способ восстановить все при обрыве&lt;br /&gt;
соединения или даже возобновить процесс после восстановления связи без потери данных?&lt;br /&gt;
&lt;br /&gt;
Сервер ''iBackup'' не позволяет настраивать время или дату для копируемых файлов, поэтому все файлы имеют дату и время копирования. Из-за этого я копирую сжатые в ''tar'' файлы и теряю возможности ''rsync''.&lt;br /&gt;
&lt;br /&gt;
Это хороший повод переключиться на использование [http://Rsync.net Rsync.net], но мне надо копировать файлы также и с компьютера моей жены. С ''iBackup '' у нее свое соединение и URL.&lt;br /&gt;
&lt;br /&gt;
:Гуус [Guus]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если Вы используете ''rsync'', рестарт резервирования не должен вызывать проблем, потому что ''rsync'' «поднимается» с того места, где произошел сбой. Не исключено, что сервер устанавливает время копирования как время создания файлов, потому что так указано в опциях ''rsync''. Вам нужно вызывать ''rsync'' с опцией &amp;lt;font color=darkred&amp;gt;--times&amp;lt;/font&amp;gt; для сохранения времени файлов. Опция &amp;lt;font color=darkred&amp;gt;--archive&amp;lt;/font&amp;gt; – комбинация нескольких опций резервирования, включая &amp;lt;font color=darkred&amp;gt;--times&amp;lt;/font&amp;gt;. Это снимет необходимость копирования ''tar''-архивов на сервер и позволит копировать индивидуальные файлы в том виде, в котором они хранятся на вашей машине, что сильно упрощает перезапуск копирования.&lt;br /&gt;
&lt;br /&gt;
Я попробовал [http://Rsync.net Rsync.net] после чтения статьи (раньше у меня был ''Strongspace'') и переключился на него полностью. Резервирование нескольких машин выполняется легко, если Вы можете более или менее свободно обращаться с имеющейся памятью – удобно будет создать по директории на резервную копию каждой машины. [http://Rsync.net Rsync.net] использует SSH для работы ''rsync'', так что в '''stunnel''' нужды нет, и вы можете применить ''Duplicity'' для шифрования данных.&lt;br /&gt;
&lt;br /&gt;
Альтернативное решение – резервирование данных на локальный диск и синхронизация их с удаленным сервером. Преимущество здесь в том, что Ваш первый шаг резервирования локален: это позволяет быстро восстановить данные, но требует, чтобы компьютер для резервных копий был включен всегда, когда требуется их создать.&lt;br /&gt;
&lt;br /&gt;
===Новый диск хромает===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Найдя, что мне необходим жесткий диск побольше, я подключил новый диск как '''hdb''', разбил его, как надо, скопировал файловые системы со старого диска ('''hda''') и попытался загрузиться с нового диска. К сожалению, ничего не вышло.&lt;br /&gt;
&lt;br /&gt;
Я сделал копии разделов '''/''', '''/boot''', '''/usr''', '''/home''' и некоторых других. Я также создал swap-раздел. '''/boot''', первый основной раздел, сделал загрузочным. Я cписал MBR, используя '''lilo -M /dev/hdb'''. Далее монтировал '''/boot''' и '''/''' разделы, редактируя новую копию '''/etc/lilo.conf''', (теперь на '''/mnt/hdb5''') и запускал '''lilo -C /hdb5/etc/lilo.conf -b /dev/hdb1''' – на вид вроде работало.&lt;br /&gt;
&lt;br /&gt;
Когда я пытаюсь загрузиться с нового диска, я прохожу через стадию загрузочного окна ''Lilo'' и вижу сообщения, заканчивающиеся на&lt;br /&gt;
&lt;br /&gt;
 initrd finished&lt;br /&gt;
 Freeing unused kernel memory&lt;br /&gt;
 Warning: Unable to open an input console&lt;br /&gt;
&lt;br /&gt;
После этого только нажатие на reset выводит компьютер из ступора. У меня стоит “Mandrakelinux release 10.2 (Limited Edition 2005) for i586”.&lt;br /&gt;
&lt;br /&gt;
:Родни М. Бэйтс [Rodney M Bates]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проблема не в загрузчике. Раз уж ядро загрузилось, значит, загрузчик свое дело сделал. Такая ошибка показывает на отсутствие файла в '''/dev''' – возможно, в '''/dev/console'''. Хотя динамические файловые системы ''dev'', типа ''udev'' и ее предшественника ''devfs'', создают записи устройств в '''/dev''' автоматически, некоторые из них нужны еще до запуска ''devfs/udev''. Подозреваю, что вы пропустили содержимое '''/dev''', копируя свой корневой раздел – забыли включить его в команду копирования или исключили «прочие» файловые системы при копировании (вы не пояснили, как именно копировали файловые системы, но ''cp'', ''rsync'' и ''tar'' имеют опции по исключению других файловых систем).&lt;br /&gt;
&lt;br /&gt;
Содержимое вашей исходной директории '''/dev''' теперь скрыто, потому что новая, динамическая '''/dev''' была примонтирована поверх нее, но, как вы можете видеть, все еще доступна.&lt;br /&gt;
&lt;br /&gt;
 mkdir /mnt/tmp&lt;br /&gt;
 mount --bind / /mnt/tmp&lt;br /&gt;
&lt;br /&gt;
позволит обратиться ко всему корневому разделу через '''/mnt/tmp''' без других подмонтированных файловых систем. '''/mnt/tmp/home''' должен быть пуст, а '''/tmp/mnt/dev''' должен содержать файлы устройств. Скопируйте их в '''/dev''' на Вашем новом разделе, и ошибка при загрузке исчезнет. Самый простой способ убедиться, что новый корневой раздел содержит все файлы со старого –&lt;br /&gt;
&lt;br /&gt;
 rsync -a --delete /mnt/tmp/ /mnt/newroot/&lt;br /&gt;
&lt;br /&gt;
===Рота, подъем!===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для Mac OS X и Windows существуют специальные программы, которые позволяют организовать включение компьютера по расписанию. А есть ли что-нибудь подобное в Linux?&lt;br /&gt;
&lt;br /&gt;
:Анатолий Евдокимов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Самый простой способ организовать «подъем по распорядку» – это воспользоваться функцией ACPI WakeUp, которой обладает большинство современных материнских плат. Linux предоставляет к ней два интерфейса.&lt;br /&gt;
&lt;br /&gt;
В ядрах старше 2.6.22 используется файл '''/proc/acpi/alarm''', в который можно записать дату в формате «ГГГГ-ММ-ДД ЧЧ:ММ:СС», например,&lt;br /&gt;
&lt;br /&gt;
 echo “2007-10-18 23:30:00” &amp;gt;/proc/acpi/alarm&lt;br /&gt;
&lt;br /&gt;
после чего можно выключать компьютер обычным образом. Конечно, следует проследить, чтобы системный блок остался подключенным к электросети и выключатель на его блоке питания находился в положении &amp;lt;font color=darkblue&amp;gt;ON&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ядра 2.6.22 и выше предоставляют новый интерфейс через файл '''/sys/class/rtc/rtcX/wakealarm'''. Для установки «будильника» в него следует записать&lt;br /&gt;
желаемый момент времени в виде числа секунд, прошедших с начала эпохи (1 января 1970 года, 00:00:00) – формате, столь любимом ветеранами Unix.&lt;br /&gt;
Чтобы отменить пробуждение, достаточно записать в файл значение 0. Кроме того, необходимо удостовериться, что аппаратные часы вашего компьютера&lt;br /&gt;
настроены на UTC, иначе пробуждение произойдет не в то время.&lt;br /&gt;
&lt;br /&gt;
Несмотря на свою простоту, данный способ не лишен недостатков. Так, некоторые материнские платы отказываются принимать во внимание значение, установленное программно, и отдают предпочтение времени, указанному непосредственно через BIOS. Исходя из этого, рекомендуется отключить в BIOS данную функцию – обычно она называется как-то вроде Wake from RTC/Alarm. Иногда пробуждение по таймеру автоматически отменяется, если после его установки в аппаратные часы были внесены изменения – а это делают многие дистрибутивы при выключении. Поищите команду ''hwclock'' в скриптах '''/etc/init.d''', и если она там встречается, обеспечьте, чтобы время пробуждения устанавливалось после нее повторно.&lt;br /&gt;
&lt;br /&gt;
Можно пойти другим путем и воспользоваться программой ''nvram-wakeup'' (http://http//sourceforge.net/projects/nvram-wakeup), изменяющей установки&lt;br /&gt;
прямо в энергонезависимой памяти BIOS (отсюда и название). Поскольку формат хранения данных в памяти меняется от производителя к производителю,&lt;br /&gt;
это получится только на поддерживаемых программой материнских платах, зато будет работать, как часы.&lt;br /&gt;
&lt;br /&gt;
===Grub, который загрузит всех===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Надоело каждый раз устанавливать в BIOS загрузку с CD, чтобы попробовать новый дистрибутив. Есть ли способ добавить соответствующую опцию в ''Grub''?&lt;br /&gt;
&lt;br /&gt;
:Иван Пуренко&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Научить ''Grub'' запускать загрузчик с CD несложно, но для решения этой задачи придется привлечь два других проекта: MEMDISK &lt;br /&gt;
(http://syslinux.zytor.com/memdisk.php) и Smart Boot Manager (http://btmgr.sourceforge.net/about.html или '''Главное/SBM''' на нашем DVD). MEMDISK является частью SYSLINUX и должен быть доступен в вашем дистрибутиве в виде одноименного пакета. Разверните данный пакет и извлеките из него файл '''memdisk''', который следует скопировать в каталог '''/boot'''. Далее, возьмите из каталога '''Главное/SBM''' на первой стороне нашего DVD файл '''btmgr.floppy.bz2''' – это образ загрузочной дискеты Smart Boot Manager. Нам потребуются ее первые 18 КБ: откройте root-терминал и наберите &lt;br /&gt;
&lt;br /&gt;
 dd if=btmgr.floppy of=/boot/sbm.bin bs=1k count=18&lt;br /&gt;
&lt;br /&gt;
Наконец, необходимо создать соответствующую запись в меню ''Grub'':&lt;br /&gt;
&lt;br /&gt;
 title Boot from CD&lt;br /&gt;
              kernel /boot/memdisk&lt;br /&gt;
              initrd /boot/sbm.bin&lt;br /&gt;
&lt;br /&gt;
==Врезки==&lt;br /&gt;
&lt;br /&gt;
===Коротко про…===&lt;br /&gt;
&lt;br /&gt;
'''MD5'''&lt;br /&gt;
&lt;br /&gt;
''Как избежать сравнения больших потоков чисел.''&lt;br /&gt;
&lt;br /&gt;
Если вы загружали ISO-образы различных дистрибутивов, то, безусловно, видели рядом с ISO-файлами файлы с именами типа '''cooldistro1.0.iso.md5''', и, возможно, задавались вопросом: а зачем они? Сумма MD5 – это 128-битный криптографический хэш содержимого файла. Один и тот же файл всегда генерирует&lt;br /&gt;
одну и ту же сумму, но стоит изменить в нем всего один бит, и сумма окажется совершенно иной. MD5 был первоначально разработан для обеспечения безопасности. Проверив сумму MD5, вы можете убедиться, что файл не был подменен.&lt;br /&gt;
&lt;br /&gt;
Ныне MD5 также используется для проверки случайного повреждения во время передачи. При загрузке ISO-образа, скачайте заодно и файл MD5. Прежде чем &lt;br /&gt;
тратить время на запись файла на компакт-диск и попытки с него загрузиться, проверьте, не был ли файл поврежден, командой:&lt;br /&gt;
&lt;br /&gt;
 md5sum cooldistro1.0.iso&lt;br /&gt;
&lt;br /&gt;
Она вернет строку шестнадцатеричных символов, подобную хранящейся в '''cooldistro1.0.iso.md5'''. Конечно, ручное сличение 128-битных шестнадцатеричных чисел друг с другом, возможно, не самое лучшее времяпрепровождение (спешу добавить – для меня), особенно если вы скачали много файлов, так что предоставим программе сделать это за нас: &lt;br /&gt;
&lt;br /&gt;
 md5sum --check cooldistro1.0.iso.md5&lt;br /&gt;
&lt;br /&gt;
Эта команда позволит узнать, соответствует ли контрольная сумма оригиналу или нет. MD5-файл может содержать контрольные суммы нескольких файлов.&lt;br /&gt;
Например, исходные тексты Gnome состоят из множества файлов, а их суммы MD5 содержатся в одном. По договоренности, этот файл часто называется '''MD5SUMS'''.&lt;br /&gt;
Можно загрузить все необходимые вам файлы и проверить их за один раз:&lt;br /&gt;
&lt;br /&gt;
 md5sum -c MD5SUMS&lt;br /&gt;
&lt;br /&gt;
Кроме того, можно создать файл '''MD5SUMS''':&lt;br /&gt;
&lt;br /&gt;
 ms5sum *.iso &amp;gt;MD5SUMS&lt;br /&gt;
&lt;br /&gt;
SHA1-файлы работают по аналогичному принципу, но с несколько более высоким уровнем безопасности. Синтаксис тот же, только используется программа&lt;br /&gt;
''sha1sum''.&lt;br /&gt;
&lt;br /&gt;
===Часто задаваемые вопросы===&lt;br /&gt;
&lt;br /&gt;
'''FISH'''&lt;br /&gt;
&lt;br /&gt;
''Не путайте с языком программирования FISh…''&lt;br /&gt;
&lt;br /&gt;
*'''Тогда что это такое?'''&lt;br /&gt;
&lt;br /&gt;
Это сокращение от FIles (Файлов), передаваемых через протокол (оболочки) SHell.&lt;br /&gt;
&lt;br /&gt;
*'''Стоп, не так заумно. Что он делает?''' Проще говоря, он дает доступ к файлам на удаленной машине только через SSH (или RSH). На удаленной машине не&lt;br /&gt;
нужно никакого специального программного обеспечения, кроме SSH и стандартных команд оболочки. Ваш компьютер должен иметь установленными FISH-программы для доступа к этим файлам.&lt;br /&gt;
&lt;br /&gt;
*'''Где такое ПО можно взять?'''&lt;br /&gt;
&lt;br /&gt;
Скорее всего, оно у вас есть; наберите&lt;br /&gt;
&lt;br /&gt;
 cd /#sh:user@hostname/some/path&lt;br /&gt;
&lt;br /&gt;
в ''Midnight Commander'', и вы получите список содержимого '''/some/path''' на удаленной машине. Если вы опустите часть '''user@''', то будет использоваться текущее имя пользователя.&lt;br /&gt;
&lt;br /&gt;
*'''Выходит, через FISH кто-то может читать файлы на моем компьютере?'''&lt;br /&gt;
&lt;br /&gt;
Нет, потому что используется SSH. Но, если вы не используете аутентификацию по ключу, необходимо установить пароль на учетную запись. В обоих случаях,&lt;br /&gt;
доступ сможете получить только вы.&lt;br /&gt;
&lt;br /&gt;
*'''Ну, ладно, но Midnight Commander малость устарел, верно? В смысле, это ведь консольная программа, а как насчет GUI?'''&lt;br /&gt;
&lt;br /&gt;
Если у вас KDE, откройте ''Konqueror'' (или мини-консоль &amp;lt;font color=darkblue&amp;gt;Alt+F2&amp;lt;/font&amp;gt;) и наберите&lt;br /&gt;
&lt;br /&gt;
 fish://user@hostname/some/path&lt;br /&gt;
&lt;br /&gt;
Используя магию ''kio_slaves'', эта команда загрузит удаленную директорию в ''Konqueror''. Благодаря свойству разбиения ''Konqueror'' на два окна, легко сравнивать или переписывать локальную и удаленную копии директорий.&lt;br /&gt;
&lt;br /&gt;
*'''Итак, я могу использовать это для управления файлами в Konqueror или Midnight Commander?'''&lt;br /&gt;
&lt;br /&gt;
Управление файлами – это еще не все. Любое приложение KDE, работающее с файлами, может получать их через FISH. Хотите отредактировать файл на вашем&lt;br /&gt;
web-сервере на другом конце земного шара? Просто наберите&lt;br /&gt;
&lt;br /&gt;
 kate fish://me@my.server iffypagename.html&lt;br /&gt;
&lt;br /&gt;
для загрузки его в ''Kate'', и при нажатии &amp;lt;font color=darkblue&amp;gt;Save&amp;lt;/font&amp;gt; модифицированный файл отправится обратно на сервер. Конечно, web-страницами вы не ограничены: столь же удобно использовать это для редактирования файлов конфигурации.&lt;br /&gt;
&lt;br /&gt;
*'''Значит, можно использовать FISH для управления файлами на службах удаленного резервирования, вроде Rsync.net или StrongSpace?'''&lt;br /&gt;
&lt;br /&gt;
К сожалению, нет. FISH предусмотрен только для входа через учетную запись с правами запуска базовых команд оболочки. Эти сервисы не дают установить&lt;br /&gt;
полный вход в оболочку, и FISH не работает, но есть альтернатива. SSHFS (http://fuse.sourceforge.net/sshfs.html) – файловая система FUSE, позволяющая монтировать себя на учетных записях с возможностью только копировать файлы (''scp'' или ''rsync''), но требуется монтировать удаленную файловую систему, даже если вам нужно взять всего один файл.&lt;br /&gt;
&lt;br /&gt;
===Вопрос-победитель (английская версия)===&lt;br /&gt;
&lt;br /&gt;
'''Загружаясь с DVD'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я хочу установить DVD с '''LXF94''' на старый ПК в двойную загрузу с Windows 98SE. Это 7-летний Athlon 600 на материнской плате MSI со 128 МБ ОЗУ, двумя жесткими дисками и приводами DVD и CD-RW. Его BIOS не имеет опции загрузки с DVD. Загрузочная последовательность позволяет мне использовать CD-ROM как&lt;br /&gt;
первое устройство, и я спокойно могу ее изменить. На форумах мне советовали установить сперва Windows, если нужна двойная загрузка (а так и есть).&lt;br /&gt;
Я использовал ''Partition Magic V5'' для создания и FAT, и Linux-разделов.&lt;br /&gt;
&lt;br /&gt;
По-моему, Linux использует другой формат файлов по сравнению с FAT, но я пытался использовать загрузочную дискету Windows для «установки» или «инсталляции» с DVD, и неудачно. Будет ли это работать, если диск будет CD-ROM? Дискета Red Hat 6.1 позволила мне запустить CD Red Hat, но она требует именно CD Red Hat и не работает с DVD LXF94. С CD Red Hat CD все получилось, но я прервал установку, потому что предпочитаю (K)ubuntu. Могу ли я сделать загрузочную дискету с DVD-драйверами на ней для установки DVD '''LXF94'''?&lt;br /&gt;
&lt;br /&gt;
:Джон Паттерсон [John Patterson]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С точки зрения BIOS, загрузка с CD и DVD – одно и тоже: DVD распознается просто как большой CD-ROM. Старые дистрибутивы Linux использовали загрузочную дискету для быстрого старта установки с CD, поскольку в то время множество компьютеров не поддерживало загрузку с CD. Ваше поколение техники должно&lt;br /&gt;
поддерживать загрузку с оптических дисков – неважно, CD это или DVD. Установив в BIOS загрузку с CD, Вы не должны иметь проблем. Но могут сказываться личные особенности BIOS: некоторые старые BIOS дают сбой, если подключено более одного оптического привода. Если вы установили в BIOS загрузку с CD и&lt;br /&gt;
не можете загрузиться с DVD, попробуйте отсоединить кабель от вашего CD-RW, чтобы остался только один оптический привод.&lt;br /&gt;
&lt;br /&gt;
В наше время использование загрузочной дискеты для установки с CD или DVD – это уже экзотика, но на всякий случай мы поместили одну на DVD. ''Smart Boot Manager'' в каталоге '''Essential/SBM''' на DVD как раз и есть загрузочная дискета для запуска с оптического или жесткого диска. Запустите '''RAWWRITE.EXE''' в Windows, вставьте чистую дискету в дисковод и выберите '''sbootmgr.dsk''' как исходный образ. Загрузившись с этой дискеты, вы сможете загрузить ваш DVD.&lt;br /&gt;
&lt;br /&gt;
Различия в файловых системах Windows и Linux в этом случае к делу не относятся, так как все данные поступают с DVD, имеющего другую файловую систему (ту же, что у CD). Использование Windows-инструментов для создания разделов Linux способно порождать трудности. Посредством ''Partition Magic'' удалите созданные Linux-разделы, включая swap, и оставьте просто неразмеченное место. Затем велите установщику Ubuntu использовать все свободное место на диске&lt;br /&gt;
(«свободное» в этом случае означает «неразмеченное», а не место внутри размеченных разделов).&lt;br /&gt;
&lt;br /&gt;
Ваш компьютер может «тормозить» также из-за памяти. 128 МБ – очень мало по сегодняшним стандартам: современный рабочий стол, вроде KDE в Kubuntu, будет&lt;br /&gt;
работать очень медленно. Версия Ubuntu на '''LXFDVD''' наряду с жадными до ресурсов Gnome и KDE включает нетребовательный рабочий стол ''Xfce'', используемый в Xubuntu.&lt;br /&gt;
&lt;br /&gt;
===Большой вопрос===&lt;br /&gt;
&lt;br /&gt;
'''Администратор через браузер'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас учетная запись web-хостинга, предоставляющего ''Apache'', PHP и ''MySQL''. Мы имеем FTP-доступ для загрузки файлов, но не доступ к командам оболочки, из-за чего настройка базы данных SQL и других вещей затруднительна. Нам нельзя устанавливать на сервер дополнительное ПО. Мы могли бы поискать другое место с shell-доступом, но нам нравится та цена, которую мы здесь платим. Есть ли способ получить административный доступ через web-браузер, и что для этого надо сделать?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хотя переход на хостинг, поддерживающий SSH-доступ, добавит гибкости, существуют решения, привлекательные даже в случае отсутствия командной строки.&lt;br /&gt;
Основное из них – ''phphMyAdmin'' ([http://www.phpmyadmin.net www.phpmyadmin.net]). Как видно из имени, это программа администрирования ''MySQL'', написанная на PHP; она устанавливается как набор файлов в вашей учетной записи после настройки безопасности и конфигурации. Многие web-хостинги предоставляют доступ к базам данных только с локальных IP, чтобы скрипты запускались на сервере, а не на вашей машине.&lt;br /&gt;
&lt;br /&gt;
Загрузите и распакуйте один из ''tar''-архивов с сайта ''phpMyAdmin'' (они различаются только языком и методом сжатия). Традиционный метод конфигурирования ''phpMyAdmin'' – создать подходящий файл '''config.inc.php''', взяв за основу включенные примеры, но есть также и скрипт установки, который запускается всего один раз после копирования файлов на сервер. Прежде чем что-то делать, убедитесь, что это безопасно. Любой получивший доступ к директории ''phpMyAdmin'' может читать и изменять вашу базу данных, так что обезопасьте себя с помощью файла '''.htaccess''' (или другим способом), чтобы подключение было возможно только с защищенной паролем учетной записи. По возможности, включите его на раздел вашего пространства хостинга, доступный через HTTPS, ведь вы передаете пароль при запуске установочного скрипта. Создайте директорию '''config''' в директории '''phpmyadmin''' и скопируйте всю директорию (включая '''.htaccess''') на сервер хостинга.&lt;br /&gt;
&lt;br /&gt;
Зайдите на https://www.ваш.сайт/phpmyadmindir/setup.php и заполните поля своего подключения к ''MySQL''. Теперь перейдите на https://www.ваш.сайт/phphmyadmindir/ – вы увидите список ваших баз данных. Выбор одной из них покажет входящие в нее таблицы. Отсюда можно просматривать, выполнять запросы и модифицировать ваши SQL-таблицы, как вам нравится. Если у вас ''PostgreSQL'', а не ''MySQL'', то существует аналогичная программа, ''phpPgAdm'', доступная по адресу http://phppgadmin.sourceforge.net.&lt;br /&gt;
&lt;br /&gt;
Не только SQL-базы можно администрировать через web-интерфейс. ''Webmin'' позволяет изменять все, что вообще разрешено менять на *nix-машинах, не ограничиваясь серверами. В вашем случае ''Webmin'' невыгоден потому, что должен быть установлен и запущен от имени root, поскольку использует собственный встроенный сервер, отличающийся от подобных ''Apache''. Спросите об этом своего хостинг-провайдера: может, он уже установил ''Webmin'' или его бедного родственника ''Usermin''. Если нет, то он может захотеть его установить: это будет выгодно всем заказчикам. Он также может установить для вас ''phpMyAdmin'', и у вас не будет нужды тратить на это свою дисковую квоту и трафик.&lt;br /&gt;
&lt;br /&gt;
====Шаг за шагом: соединяемся с phpMyAdmin====&lt;br /&gt;
&lt;br /&gt;
#'''Прячем свой пароль'''&amp;lt;br&amp;gt;Перед копированием файлов ''phpMyAdmin'' (''pMA'') на ваш web-сервер, убедитесь, что они защищены от посторонних взглядов.&lt;br /&gt;
#'''Мастер конфигурации'''&amp;lt;br&amp;gt;Загрузив '''setup.php''' в своем браузере, вы сможете легко настроить ''phpMyAdmin'', но подключайтесь через HTTPS, чтобы держать пароль в секрете.&lt;br /&gt;
#'''Ручная конфигурация'''&amp;lt;br&amp;gt;Или же сконфигурируйте ''pMA'' перед загрузкой файлов на web-сервер, отредактировав '''config.sample.inc.php''' и сохранив его как '''config.inc.php'''.&lt;br /&gt;
#'''Вот оно!'''&amp;lt;br&amp;gt;''pMA'' позволяет работать с данными и схемами ''MySQL'' одним кликом мышки. Его можно использовать и для создания резервных копий вашей базы.&lt;br /&gt;
#'''А также PostgreSQL'''&amp;lt;br&amp;gt;Пользователям ''PostgreSQL'' не придется терять чувство превосходства – для них есть ''phpPgAdm'', эквивалент ''pMA''.&lt;br /&gt;
#'''Глобальная конфигурация'''&amp;lt;br&amp;gt;C ''Webmin'' вы можете сконфигурировать на компьютере все что угодно... точнее, все, что позволит владелец компьютера.&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:%D0%9E%D1%82%D0%B2%D0%B5%D1%82%D1%8B</id>
		<title>LXF98:Ответы</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:%D0%9E%D1%82%D0%B2%D0%B5%D1%82%D1%8B"/>
				<updated>2008-04-01T17:42:13Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: /* Ответы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;font color=red&amp;gt;Важно! Расрасить, докинуть изображения&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ответы==&lt;br /&gt;
&lt;br /&gt;
===BIOS с «тараканами»===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я купил, как мне казалось, самый лучший компьютер по соотношению цена-производительность, и продолжаю считать его таковым. Но кое-что меня беспокоит. При включении компьютера и выборе загрузки Ubuntu из Grub, на экран выводится сообщение об ошибке MP-BIOS 8254 и каком-то неподключенном таймере. Также почти все дистрибутивы с DVD журнала не запускаются без опции noapic в строке загрузки. При загрузке LXFDVD95 выводится текст&lt;br /&gt;
 MP-BIOS bug: 8254 timer not connected to IO_APIC&lt;br /&gt;
 Kernel panic - not syncing: OI_APIC + timer doesn’t work!&lt;br /&gt;
&lt;br /&gt;
Искал и в Google, и в справке Ubuntu, но нашел только скудные заявления, что мой таймер не работает. Думаю, что это как-то связано с моей видеокартой&lt;br /&gt;
NVIDIA 7300LE (известно, что дешевые вещи обходятся дорого), но в чем все-таки причина? Возможно, пригодится другой факт. Все 3D-изображения на моем&lt;br /&gt;
компьютере становятся нестабильными и содержат множество ошибок. Нужно ли мне покупать видеокарту получше?&lt;br /&gt;
&lt;br /&gt;
:Иво Иванов [Ivo Ivanov]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Дело не в видеокарте: причиной ваших проблем с графикой может быть APIC (Advanced Programmable Interrupt Controller [Расширенный программируемый контроллер прерываний, – прим. пер.]), управляющий таймингами и прерываниями для различных компонентов вашей материнской платы, включая контроллер дисков и разъемы видеокарт. Контроллеры ACPI довольно часто отходят от спецификаций: многие изготовители полагают, что если плата «работает в Windows», то стандартам следовать не обязательно. Вы уже обнаружили, что надо добавить noapic в параметры загрузки LiveCD, но необходимо также делать это при загрузке с жесткого диска.&lt;br /&gt;
&lt;br /&gt;
Но сначала проверьте наличие обновлений BIOS на сайте изготовителя: вполне возможно, что ваша проблема была решена в последней версии прошивки.&lt;br /&gt;
Если нет, придется переделать меню загрузки, чтобы всегда использовалась опция noapic. Ubuntu не включает программу для настройки процесса загрузки, и&lt;br /&gt;
Вам придется править файл конфигурации вручную. Нажмите Alt+F2 и наберите&lt;br /&gt;
&lt;br /&gt;
 sudo gedit /boot/grub/menu.lst&lt;br /&gt;
&lt;br /&gt;
Это откроет файл конфигурации меню загрузки в текстовом редакторе. Большинство строк там начинаются с # – это комментарии, и их можно игнорировать. Найдите первую строку, начинающуюся с title; это первый пункт меню загрузки. Вам нужно изменить следующую строчку, начинающуюся с kernel,&lt;br /&gt;
добавив noapic в ее конец, обязательно через пробел после последнего слова в строке. Файл сохраните. После перезагрузки сообщение об ошибке BIOS&lt;br /&gt;
исчезнет, и 3D-графика станет стабильной. Видимо, будут и другие улучшения в работе, потому что «глючная» прошивка APIC способна вызывать разные проблемы, от снижения скорости доступа к дискам до неверного хода часов.&lt;br /&gt;
&lt;br /&gt;
===Беспроводная сеть, ау!===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я уже использовал Linux в 1996–1997 годах для запуска UNIX-приложений на ноутбуке, так как Linux был бесплатным, а Sparcbook стоил 10 000 фунтов. Позже я решил, что было бы неплохо использовать его снова и установить его на моем домашнем DELL XPS m1210. Порывшись в Интернете, я нашел, что для моей машины идеален Slackware 10, благополучно установил его и использовал Lilo для двойной загрузки Windows Vista и Linux.&lt;br /&gt;
&lt;br /&gt;
К сожалению, я не смог заставить работать беспроводную сетевую карту; точнее, я не знаю, как это сделать. Я смотрел в Сети, находил там решения, но все они были на чуждом для меня языке. За прошедшие десять лет я очень многое перезабыл и чувствую себя полным «чайником». Моя беспроводная карта: Intel PRO/Wireless 3945ABG Network Connection.&lt;br /&gt;
&lt;br /&gt;
:Грег [Greg]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существует официальный драйвер от Intel для этой беспроводной карты, найти его можно здесь: http://ipw3945.sourceforge.net, но он требует довольно свежего ядра для работы, как минимум 2.6.13. Slackware 10 старше трех лет и значительно старше этого драйвера, и использует ядро версии 2.4. Для нормальной работы нового аппаратного обеспечения Вам нужен дистрибутив – и в частности, ядро – такой же новый, как оборудование. Если вы хотите держаться Slackware, то установите новейшую версию 12.0: это первый релиз с ядром 2.6, которое необходимо вашей беспроводной карте, по умолчанию. Пакеты для использования вашей карты со Slackware 12 есть на сайте ftp://ftp.slackware.at/slackware-12.0/extra/intel-wlan-ipw3945.&lt;br /&gt;
&lt;br /&gt;
Как альтернативу, можно установить любой другой дистрибутив, в репозитории которого есть пакет ipw3945. Неплохой выбор – Ubuntu c DVDLXF94,&lt;br /&gt;
поскольку драйвер ipw3945 включен в установку по умолчанию и должен «просто работать». В Fedora 7 с DVDLXF95 также имеется ipw3945, но перед его&lt;br /&gt;
установкой требуется добавить репозиторий ATrpms в менеджер пакетов. Как добавить репозиторий, можно прочитать по адресу http://atrpms.net/install.html. Этот сайт содержит отнюдь не одни беспроводные драйверы – там множество самых разнообразных пакетов – и заслуживает добавления в ваш список репозиториев.&lt;br /&gt;
&lt;br /&gt;
===Желание синхронности===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хочу перейти на Linux, но боюсь, что синхронизация Microsoft Outlook на моем PDA не будет работать. Еще у меня на PDA стоит Money for PPC, это важная для меня программа – предоставляет ли GnuCash похожие возможности?&lt;br /&gt;
&lt;br /&gt;
:Герхард Штигер [Gerhard Stieger]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Синхронизацию Linux-приложений с устройствами Windows Pocket PC позволяет производить каркас SyncCE (www.synce.org/index.php/SynCE-Wiki); степень его дружелюбия к пользователю и качество зависят от приложения. Проще всего синхронизируются приложения пакета KDE PIM – KMail, Kontact, KAddressBook и KOrganiser. Чтобы сделать это, необходимо установить пакет synce-kde, присутствующий во многих дистрибутивах, но не во всех устанавливаемый по умолчанию. После установки системы запустите менеджер пакетов и установите synce-kde, если он не помечен как установленный. После этого вы&lt;br /&gt;
сможете синхронизировать свою почту и контакты.&lt;br /&gt;
&lt;br /&gt;
Однако это потребует запуска системы на базе KDE, типа Mandriva, Kubuntu, PCLinuxOS или SUSE. Все они присутствуют на DVD-дисках LinuxFormat, но вы&lt;br /&gt;
также можете найти ссылки на них и на множество других дистрибутивов на www.distrowatch.com.&lt;br /&gt;
&lt;br /&gt;
Синхронизация ваших записей о финансах – это другая тема. GnuCash может импортировать стандартные учетные записи QIF, но не экспортировать&lt;br /&gt;
их. Зато KMyMoney (http://kmymoney2.sourceforge.net) умеет делать и импорт, и экспорт, так что Вы сможете импортировать файлы с вашего PDA и переносить их назад после модификации. Те, кто не разбираются в бухгалтерском учете профессионально или не имеют опыта работы, вероятно, сочтут KMyMoney более легким, чем GnuCash. KMyMoney – тоже KDE-приложение, оно должно присутствовать в любом из перечисленных выше дистрибутивов.&lt;br /&gt;
&lt;br /&gt;
===Перезапись URL===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пишу web-сайт со множеством PNG-изображений – большинство из них использует прозрачность. Он великолепно работает во всех последних версиях браузеров, но (как и ожидалось) не в IE6. Чтобы исправить это, я создал GIF-версии для каждой картинки (а также таблицу стилей), загружаемые вместо PNG, если пользователь использует IE6.&lt;br /&gt;
&lt;br /&gt;
Я хочу сделать это с помощью mod_rewrite и .htaccess, чтобы images/png/image1.png переписывался в images/gif/image1.gif. Вот мой файл .htaccess:&lt;br /&gt;
&lt;br /&gt;
 RewriteEngine On&lt;br /&gt;
 RewriteCond %{HTTP_USER_AGENT} “MSIE 6”&lt;br /&gt;
 RewriteRule /images/png/([A-Za-z0-9])+\.png$&lt;br /&gt;
 /images/gif/$1+\.gif&lt;br /&gt;
 RewriteCond %{HTTP_USER_AGENT} “MSIE 6”&lt;br /&gt;
 RewriteRule css/style.css css/iestyle.css&lt;br /&gt;
&lt;br /&gt;
Перезапись CSS работает четко, но картинки (PNG на GIF) не заменяются. &lt;br /&gt;
&lt;br /&gt;
:OnlyTheTony, с форумов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вы предложили хорошую идею использовать mod_rewrite для смены URL. Сбой происходит потому, что Вы используете + для объединения строк, а mod_rewrite работает с регулярными выражениями, где + означает «одно или более повторений», а не оператор конкатенации.&lt;br /&gt;
&lt;br /&gt;
В регулярных выражениях не нужно соединять строки: чтобы отметить неизменяемые части, используются скобки, а $1, $2... включат их в путь назначения, как у Вас и делается, и все является либо текстом, либо символами регулярных выражений. Так, чтобы заменить последнее вхождение foo в строке на bar,&lt;br /&gt;
потребуется выражение&lt;br /&gt;
&lt;br /&gt;
 /(.*)foo(.*)/$1bar$2/&lt;br /&gt;
&lt;br /&gt;
В вашем случае надо взять нечто, начинающееся с image/png и заканчивающееся на .png, и заменить везде png на gif. Вы можете сделать это, вставив&lt;br /&gt;
одну из следующих строк вместо первого правила RewriteRule:&lt;br /&gt;
&lt;br /&gt;
  RewriteRule /images/png/(.*)\.png$ /images/gif/$1\.gif&lt;br /&gt;
  RewriteRule /(.*)/png/(.*)\.png$ /$1/gif/$2\.gif&lt;br /&gt;
&lt;br /&gt;
Первая строка легче читается, зато вторая также будет работать с изображениями в других директориях.&lt;br /&gt;
&lt;br /&gt;
===Восстановить NTFS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У меня внешний жесткий диск, отформатированный в NTFS. Мне нужно произвести его дефрагментацию, но я не хочу потерять все данные на нем. Можно ли выполнить дефрагментацию NTFS из Linux? Я запускаю Ubuntu Feisty Fawn на старом компьютере PC2800.&lt;br /&gt;
&lt;br /&gt;
:churst1, с форумов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Короткий ответ – нет, нельзя. Во-первых, почему на этом диске NTFS? Если с него загружают Windows, любые попытки выполнить дефрагментацию из-под Linux могут привести к ее незагружаемости. Но если диск уже содержит Windows, то почему бы не провести дефрагментацию из нее – Windows ведь не только для того, чтобы баловаться игрушками. Если же диск используется только для хранения данных, вы можете снизить фрагментацию, скопировав все их с него, отформатировав диск и записав данные обратно. Это действие требует драйвера файловой системы NTFS с полной поддержкой записи, такой, как коммерческая Paragon NTFS for Linux, которую мы рассматривали в прошлом месяце, или NTFS-3G, включенная в репозиторий Ubuntu. Также необходим пакет ntfsprogs, поэтому запустите Synaptic и инсталлируйте оба.&lt;br /&gt;
&lt;br /&gt;
Теперь надо проделать небольшую работу по открытию терминала, выбору директории, достаточно просторной для хранения содержимого NTFS-диска, и&lt;br /&gt;
запуску следующей команды:&lt;br /&gt;
&lt;br /&gt;
 tar cf ntfs.tar /mnt/ntfs &amp;amp;&amp;amp; umount /mnt/ntfs &amp;amp;&amp;amp; mkntfs /dev/sda1 &amp;amp;&amp;amp; mount /dev/sda1/mnt/ntfs -t ntfs-3g &amp;amp;&amp;amp; tar xf ntfs.tar -C /mnt/ntfs&lt;br /&gt;
&lt;br /&gt;
Все это надо записать в одну строку. Мы сцепили вместе две долгоиграющих команды tar и mkntfs – это позволит Вам не быть сиделкой у компьютера, но каж-&lt;br /&gt;
дая следующая команда выполнится, только если предыдущая отработает без ошибок (совершенно незачем переформатировать диск, если произойдет сбой&lt;br /&gt;
в копировании). Данный пример подразумевает, что Ваш диск – /dev/sda1 и смонтирован он в /mnt/NTFS. Перед запуском команды убедитесь, что подставлены&lt;br /&gt;
правильные пути для Вашего компьютера.&lt;br /&gt;
&lt;br /&gt;
Если у Вас мало места для хранения данных, можете создать сжатый архив, но это продлится гораздо дольше, чем простое копирование с диска. Вы можете&lt;br /&gt;
сделать это так:&lt;br /&gt;
&lt;br /&gt;
 tar czf ntfs.tar.gz /mnt/ntfs &amp;amp;&amp;amp; umount /mnt/ntfs &amp;amp;&amp;amp; mkntfs /dev/sda1 &amp;amp;&amp;amp; mount /dev/sda1 /mnt/ntfs -t ntfs-3g &amp;amp;&amp;amp; tar xf ntfs.tar.gz -C /mnt/ntfs&lt;br /&gt;
&lt;br /&gt;
Если Вы используете NTFS только ради чтения из Windows (а зачем она еще нужна?) и только с Вашим компьютером, где стоит Windows, лучшим решением&lt;br /&gt;
будет переформатирование диска в ext2 и установка драйвера ext2 с www.fs-driver.org в Windows. Это снимет проблему фрагментации, и Вы получите луч-&lt;br /&gt;
шее быстродействие в Linux. В вышеприведенных командах для этого надо заменить mkntfs на mke2fs и удалить&lt;br /&gt;
 &lt;br /&gt;
 -t ntfs-3g&lt;br /&gt;
&lt;br /&gt;
из команды mount.&lt;br /&gt;
&lt;br /&gt;
===Нужен легковес===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я присматриваю ОС для AMD K6/200. Думал, что NetBSD – лучший выбор, но максимум, чего я добился в результате установки – это режим командной строки. XFree86 (не XOrg) требует отдельной настройки. Я инвалид, и лишние усилия для меня проблема. Существуют ли «простые» версии, наподобие PC-BSD или Desktop BSD – легких версий FreeBSD?&lt;br /&gt;
&lt;br /&gt;
Пробовал DSL на машине P2/400 – ничего особенного, но я открыл DSL-N. Там даже был настоящий тестовый процессор! Что будет с производительностью, если установить Gnome или KDE на NetBSD или DSL-N? Fedora Core с Gnome работает на P2/400 с жуткими тормозами.&lt;br /&gt;
&lt;br /&gt;
:Гэри Причард [Gary Prichard]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Процессор K6/200 по нынешним меркам очень медленный, поэтому необходим «легкий» дистрибутив для получения терпимой производительности. А в первую очередь нужен нетребовательный оконный менеджер: среды Gnome и KDE к таковым не относятся. Гораздо лучше FluxBox, Xfce или IceWM. С учетом текстового процессора, Xfce был бы лучшим выбором: он использует GTK, как и AbiWord. Раз ресурсы у вас ограничены, выбирайте набор приложений, использующих одни и те же библиотеки, чтобы Ваша система работала более эффективно.&lt;br /&gt;
&lt;br /&gt;
Кстати о ресурсах: один из лучших способов увеличения производительности любой Linux-системы – увеличение объема ОЗУ. Потратив немного фунтов/&lt;br /&gt;
долларов/евро/песо на дополнительную память, вы получите больший прирост скорости, чем при вложении тех же средств в более быстрый процессор.&lt;br /&gt;
&lt;br /&gt;
Есть целый набор дистрибутивов, предназначенных для «слабых» систем: вы уже открыли для себя DSL и DSL-N, но советую также изучить Puppy Linux&lt;br /&gt;
с www.puppylinux.org. DSL ограничен объемом ISO-образа в 50 МБ, а Puppy Linux больше раза в два. Это означает, что он включает гораздо больше программ,&lt;br /&gt;
например, текстовый процессор AbiWord и сопутствующие офисные приложения, SeaMonkey (новое имя Mozilla) для Web и почты и много чего еще. Недостаток&lt;br /&gt;
Puppy в том, что процесс инсталляции на жесткий диск очень запутан, так как он спроектирован как LiveCD-система. Зато вы можете запускать его прямо&lt;br /&gt;
с CD, используя жесткий диск только для хранения данных и настроек.&lt;br /&gt;
&lt;br /&gt;
Другая альтернатива – правда, потяжелее – это Zenwalk (www.zenwalk.org). Если объем Вашего ОЗУ такой, какой обычно использовался на 200 МГц машинах, когда они были в новинку, то его не хватит; но Zenwalk дает больше функций, чем маленькие дистрибутивы.&lt;br /&gt;
&lt;br /&gt;
Запуск любой ОС на K-6/200 – это всегда компромисс между возможностями и производительностью, но он вполне возможен; тем более, если увеличить ОЗУ.&lt;br /&gt;
&lt;br /&gt;
===Работка для Ubuntu===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пытаясь запустить или инсталлировать Ubuntu, я получаю следующее сообщение после появления заставки:&lt;br /&gt;
&lt;br /&gt;
 unable to access tty job control turned off&lt;br /&gt;
&lt;br /&gt;
и возвращаюсь в командную строку. Ubuntu явно пытается обратиться к моему флоппи-дисководу, потому что перед появлением сообщения об ошибке&lt;br /&gt;
он включается.&lt;br /&gt;
&lt;br /&gt;
:Дэвид Лоусон [David Lowson]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Похоже, что ошибка связана с ядром: не найдя загрузочный диск, оно ищет его на всех подряд устройствах, прописанных в BIOS. Потому-то дисковод и начинает работать. Эта проблема не у Вас одного, и существует более чем одно решение.&lt;br /&gt;
&lt;br /&gt;
Первое заключается в загрузке с установочного диска и правке fstab в установленной системе. Если ваш корневой раздел находится на /dev/sda1, нужны&lt;br /&gt;
следующие команды:&lt;br /&gt;
&lt;br /&gt;
 sudo -i&lt;br /&gt;
 mount /dev/sda1 /mnt&lt;br /&gt;
 gedit /mnt/etc/fstab&lt;br /&gt;
&lt;br /&gt;
В fstab вы должны найти строчку, где монтируется корневой раздел, она выглядит примерно так:&lt;br /&gt;
&lt;br /&gt;
 # /dev/sda1&lt;br /&gt;
 UUID=71f72f22-0a14-45b7-9057-f7b0bd9d819c /ext3&lt;br /&gt;
 defaults....&lt;br /&gt;
&lt;br /&gt;
UUID (Universally Unique IDentifier [Универсальный Уникальный Идентификатор]) позволяет Ubuntu находить корневой раздел, даже если сменилась точка&lt;br /&gt;
подключения устройства (например, при добавлении нового диска), но здесь бывают проблемы. Смените UUID=xyz на путь вашего устройства, и система снова начнет загружаться. Fstab в этом случае должен выглядеть так:&lt;br /&gt;
&lt;br /&gt;
 # /dev/sda1&lt;br /&gt;
 /dev/sda1 / ext3 defaults....&lt;br /&gt;
&lt;br /&gt;
Другое решение более экстремальное, так что используйте его только в случае провала трюка с fstab. Вы должны открыть корпус вашего компьютера и&lt;br /&gt;
отключить все лишние дисковые устройства, оставив только загрузочный диск и DVD, с которого выполнялась установка – но не забудьте сперва выключить&lt;br /&gt;
компьютер! Дисковод также отключите – достаточно отсоединить кабели питания от неиспользуемых устройств. После этого ваша система должна загружаться. Затем добавьте модуль piix к образу, который Ubuntu загружает при запуске, с помощью команд&lt;br /&gt;
&lt;br /&gt;
 sudo echo piix &amp;gt;&amp;gt;/etc/initramfs-tools/modules&lt;br /&gt;
 sudo update-initramfs -u&lt;br /&gt;
&lt;br /&gt;
Теперь вам надо выключить компьютер, снова подсоединить все устройства и перезапустить его. Данная ошибка замечена небольшим числом пользователей Ubuntu, у которых подключено много устройств. Сообщалось также, что если проблема во флоппи-дисководе, ее можно обойти, оставив в нем дискету, но мы не смогли этого проверить, и в любом случае, это не метод.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Сервис резервирования===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Откликаясь на Сравнение «Онлайн-резервирование» (LXF94), расскажу о мелкой, но, надеюсь, решаемой проблеме. Я использую iBackup, потому что делаю резервное копирование с моего ПК (Ubuntu) и компьютера жены с Windows. Она справляется с резервным копированием без моей помощи.&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что в процессе резервирования с моего компьютера, запускаемого cron, соединение часто прерывается. Когда это происходит, создаваемый stunnel рушится, уничтожая резервирование, и я получаю частично скопированные данные на iBackup-сервере. Есть ли способ восстановить все при обрыве&lt;br /&gt;
соединения или даже возобновить процесс после восстановления связи без потери данных?&lt;br /&gt;
&lt;br /&gt;
Сервер iBackup не позволяет настраивать время или дату для копируемых файлов, поэтому все файлы имеют дату и время копирования. Из-за этого я копирую сжатые в tar файлы и теряю возможности rsync.&lt;br /&gt;
&lt;br /&gt;
Это хороший повод переключиться на использование Rsync.net, но мне надо копировать файлы также и с компьютера моей жены. С iBackup у нее свое соединение и URL.&lt;br /&gt;
&lt;br /&gt;
:Гуус [Guus]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если Вы используете rsync, рестарт резервирования не должен вызывать проблем, потому что rsync «поднимается» с того места, где произошел сбой. Не исключено, что сервер устанавливает время копирования как время создания файлов, потому что так указано в опциях rsync. Вам нужно вызывать rsync с опцией --times для сохранения времени файлов. Опция --archive – комбинация нескольких опций резервирования, включая --times. Это снимет необходимость копирования tar-архивов на сервер и позволит копировать индивидуальные файлы в том виде, в котором они хранятся на вашей машине, что сильно упрощает перезапуск копирования.&lt;br /&gt;
&lt;br /&gt;
Я попробовал Rsync.net после чтения статьи (раньше у меня был Strongspace) и переключился на него полностью. Резервирование нескольких машин&lt;br /&gt;
выполняется легко, если Вы можете более или менее свободно обращаться с имеющейся памятью – удобно будет создать по директории на резервную копию&lt;br /&gt;
каждой машины. Rsync.net использует SSH для работы rsync, так что в stunnel нужды нет, и вы можете применить Duplicity для шифрования данных.&lt;br /&gt;
&lt;br /&gt;
Альтернативное решение – резервирование данных на локальный диск и синхронизация их с удаленным сервером. Преимущество здесь в том, что Ваш первый шаг резервирования локален: это позволяет быстро восстановить данные, но требует, чтобы компьютер для резервных копий был включен всегда, когда требуется их создать.&lt;br /&gt;
&lt;br /&gt;
===Новый диск хромает===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Найдя, что мне необходим жесткий диск побольше, я подключил новый диск как hdb, разбил его, как надо, скопировал файловые системы со старого диска (hda) и попытался загрузиться с нового диска. К сожалению, ничего не вышло.&lt;br /&gt;
&lt;br /&gt;
Я сделал копии разделов /, /boot, /usr, /home и некоторых других. Я также создал swap-раздел. /boot, первый основной раздел, сделал загрузочным. Я cпи-&lt;br /&gt;
сал MBR, используя lilo -M /dev/hdb. Далее монтировал /boot и / разделы, редактируя новую копию /etc/lilo.conf, (теперь на /mnt/hdb5) и запускал lilo -C /hdb5/etc/lilo.conf -b /dev/hdb1 – на вид вроде работало.&lt;br /&gt;
&lt;br /&gt;
Когда я пытаюсь загрузиться с нового диска, я прохожу через стадию загрузочного окна Lilo и вижу сообщения, заканчивающиеся на&lt;br /&gt;
&lt;br /&gt;
 initrd finished&lt;br /&gt;
 Freeing unused kernel memory&lt;br /&gt;
 Warning: Unable to open an input console&lt;br /&gt;
&lt;br /&gt;
После этого только нажатие на reset выводит компьютер из ступора. У меня стоит “Mandrakelinux release 10.2 (Limited Edition 2005) for i586”.&lt;br /&gt;
&lt;br /&gt;
:Родни М. Бэйтс [Rodney M Bates]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проблема не в загрузчике. Раз уж ядро загрузилось, значит, загрузчик свое дело сделал. Такая ошибка показывает на отсутствие файла в /dev – возможно, в /dev/console. Хотя динамические файловые системы dev, типа udev и ее предшественника devfs, создают записи устройств в /dev автоматически, некоторые из них нужны еще до запуска devfs/udev. Подозреваю, что вы пропустили содержимое /dev, копируя свой корневой раздел – забыли включить его в команду копирования или исключили «прочие» файловые системы при копировании (вы не пояснили, как именно копировали файловые системы, но cp, rsync и tar имеют опции по исключению других файловых систем).&lt;br /&gt;
&lt;br /&gt;
Содержимое вашей исходной директории /dev теперь скрыто, потому что новая, динамическая /dev была примонтирована поверх нее, но, как вы можете&lt;br /&gt;
видеть, все еще доступна.&lt;br /&gt;
&lt;br /&gt;
 mkdir /mnt/tmp&lt;br /&gt;
 mount --bind / /mnt/tmp&lt;br /&gt;
&lt;br /&gt;
позволит обратиться ко всему корневому разделу через /mnt/tmp без других подмонтированных файловых систем. /mnt/tmp/home должен быть пуст, а&lt;br /&gt;
/tmp/mnt/dev должен содержать файлы устройств. Скопируйте их в /dev на Вашем новом разделе, и ошибка при загрузке исчезнет. Самый простой способ&lt;br /&gt;
убедиться, что новый корневой раздел содержит все файлы со старого –&lt;br /&gt;
&lt;br /&gt;
  rsync -a --delete /mnt/tmp/ /mnt/newroot/&lt;br /&gt;
&lt;br /&gt;
===Рота, подъем!===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для Mac OS X и Windows существуют специальные программы, которые позволяют организовать включение компьютера по расписанию. А есть ли что-нибудь подобное в Linux?&lt;br /&gt;
&lt;br /&gt;
:Анатолий Евдокимов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Самый простой способ организовать «подъем по распорядку» – это воспользоваться функцией ACPI WakeUp, которой обладает большинство современных материнских плат. Linux предоставляет к ней два интерфейса.&lt;br /&gt;
&lt;br /&gt;
В ядрах старше 2.6.22 используется файл /proc/acpi/alarm, в который можно записать дату в формате «ГГГГ-ММ-ДД ЧЧ:ММ:СС», например,  echo “2007-10-18 23:30:00” &amp;gt;/proc/acpi/alarm после чего можно выключать компьютер обычным образом. Конечно, следует проследить, чтобы системный блок остался подключенным к электросети и выключатель на его блоке питания находился в положении ON.&lt;br /&gt;
&lt;br /&gt;
Ядра 2.6.22 и выше предоставляют новый интерфейс через файл /sys/class/rtc/rtcX/wakealarm. Для установки «будильника» в него следует записать&lt;br /&gt;
желаемый момент времени в виде числа секунд, прошедших с начала эпохи (1 января 1970 года, 00:00:00) – формате, столь любимом ветеранами Unix.&lt;br /&gt;
Чтобы отменить пробуждение, достаточно записать в файл значение 0. Кроме того, необходимо удостовериться, что аппаратные часы вашего компьютера&lt;br /&gt;
настроены на UTC, иначе пробуждение произойдет не в то время.&lt;br /&gt;
&lt;br /&gt;
Несмотря на свою простоту, данный способ не лишен недостатков. Так, некоторые материнские платы отказываются принимать во внимание значение, установленное программно, и отдают предпочтение времени, указанному непосредственно через BIOS. Исходя из этого, рекомендуется отключить в BIOS данную функцию – обычно она называется как-то вроде Wake from RTC/Alarm. Иногда пробуждение по таймеру автоматически отменяется, если после его установки в аппаратные часы были внесены изменения – а это делают многие дистрибутивы при выключении. Поищите команду hwclock в скриптах /etc/init.d, и если&lt;br /&gt;
она там встречается, обеспечьте, чтобы время пробуждения устанавливалось после нее повторно.&lt;br /&gt;
&lt;br /&gt;
Можно пойти другим путем и воспользоваться программой nvram-wakeup (http://http//sourceforge.net/projects/nvram-wakeup), изменяющей установки&lt;br /&gt;
прямо в энергонезависимой памяти BIOS (отсюда и название). Поскольку формат хранения данных в памяти меняется от производителя к производителю,&lt;br /&gt;
это получится только на поддерживаемых программой материнских платах, зато будет работать, как часы.&lt;br /&gt;
&lt;br /&gt;
===Grub, который загрузит всех===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Надоело каждый раз устанавливать в BIOS загрузку с CD, чтобы попробовать новый дистрибутив. Есть ли способ добавить соответствующую опцию в Grub?&lt;br /&gt;
&lt;br /&gt;
:Иван Пуренко&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Научить Grub запускать загрузчик с CD несложно, но для решения этой задачи придется привлечь два других проекта: MEMDISK &lt;br /&gt;
(http://syslinux.zytor.com/memdisk.php) и Smart Boot Manager (http://btmgr.sourceforge.net/about.html или Главное/SBM на нашем DVD). MEMDISK является частью SYSLINUX и должен быть доступен в вашем дистрибутиве в виде одноименного пакета. Разверните данный пакет и извлеките из него файл memdisk,&lt;br /&gt;
который следует скопировать в каталог /boot. Далее, возьмите из каталога Главное/SBM на первой стороне нашего DVD файл btmgr.floppy.bz2 – это образ загрузочной дискеты Smart Boot Manager. Нам потребуются ее первые 18 КБ: откройте root-терминал и наберите &lt;br /&gt;
&lt;br /&gt;
 dd if=btmgr.floppy of=/boot/sbm.bin bs=1k count=18&lt;br /&gt;
&lt;br /&gt;
Наконец, необходимо создать соответствующую запись в меню Grub:&lt;br /&gt;
&lt;br /&gt;
 title Boot from CD&lt;br /&gt;
              kernel /boot/memdisk&lt;br /&gt;
              initrd /boot/sbm.bin&lt;br /&gt;
&lt;br /&gt;
==Врезки==&lt;br /&gt;
&lt;br /&gt;
===Коротко про…===&lt;br /&gt;
&lt;br /&gt;
'''MD5'''&lt;br /&gt;
&lt;br /&gt;
''Как избежать сравнения больших потоков чисел.''&lt;br /&gt;
&lt;br /&gt;
Если вы загружали ISO-образы различных дистрибутивов, то, безусловно, видели рядом с ISO-файлами файлы с именами типа cooldistro1.0.iso.md5, и, возможно, задавались вопросом: а зачем они? Сумма MD5 – это 128-битный криптографический хэш содержимого файла. Один и тот же файл всегда генерирует&lt;br /&gt;
одну и ту же сумму, но стоит изменить в нем всего один бит, и сумма окажется совершенно иной. MD5 был первоначально разработан для обеспечения безопасности. Проверив сумму MD5, вы можете убедиться, что файл не был подменен.&lt;br /&gt;
&lt;br /&gt;
Ныне MD5 также используется для проверки случайного повреждения во время передачи. При загрузке ISO-образа, скачайте заодно и файл MD5. Прежде чем &lt;br /&gt;
тратить время на запись файла на компакт-диск и попытки с него загрузиться, проверьте, не был ли файл поврежден, командой:&lt;br /&gt;
&lt;br /&gt;
 md5sum cooldistro1.0.iso&lt;br /&gt;
&lt;br /&gt;
Она вернет строку шестнадцатеричных символов, подобную хранящейся в cooldistro1.0.iso.md5. Конечно, ручное сличение 128-битных шестнадцатеричных чисел&lt;br /&gt;
друг с другом, возможно, не самое лучшее времяпрепровождение (спешу добавить – для меня), особенно если вы скачали много файлов, так что предоставим&lt;br /&gt;
программе сделать это за нас: &lt;br /&gt;
&lt;br /&gt;
 md5sum --check cooldistro1.0.iso.md5&lt;br /&gt;
&lt;br /&gt;
Эта команда позволит узнать, соответствует ли контрольная сумма оригиналу или нет. MD5-файл может содержать контрольные суммы нескольких файлов.&lt;br /&gt;
Например, исходные тексты Gnome состоят из множества файлов, а их суммы MD5 содержатся в одном. По договоренности, этот файл часто называется MD5SUMS.&lt;br /&gt;
Можно загрузить все необходимые вам файлы и проверить их за один раз:&lt;br /&gt;
&lt;br /&gt;
 md5sum -c MD5SUMS&lt;br /&gt;
&lt;br /&gt;
Кроме того, можно создать файл MD5SUMS:&lt;br /&gt;
&lt;br /&gt;
 ms5sum *.iso &amp;gt;MD5SUMS&lt;br /&gt;
&lt;br /&gt;
SHA1-файлы работают по аналогичному принципу, но с несколько более высоким уровнем безопасности. Синтаксис тот же, только используется программа&lt;br /&gt;
sha1sum.&lt;br /&gt;
&lt;br /&gt;
===Часто задаваемые вопросы===&lt;br /&gt;
&lt;br /&gt;
'''FISH'''&lt;br /&gt;
&lt;br /&gt;
''Не путайте с языком программирования FISh…''&lt;br /&gt;
&lt;br /&gt;
*'''Тогда что это такое?'''&lt;br /&gt;
&lt;br /&gt;
Это сокращение от FIles (Файлов), передаваемых через протокол (оболочки) SHell.&lt;br /&gt;
&lt;br /&gt;
*'''Стоп, не так заумно. Что он делает?''' Проще говоря, он дает доступ к файлам на удаленной машине только через SSH (или RSH). На удаленной машине не&lt;br /&gt;
нужно никакого специального программного обеспечения, кроме SSH и стандартных команд оболочки. Ваш компьютер должен иметь установленными FISH-программы для доступа к этим файлам.&lt;br /&gt;
&lt;br /&gt;
*'''Где такое ПО можно взять?'''&lt;br /&gt;
&lt;br /&gt;
Скорее всего, оно у вас есть; наберите&lt;br /&gt;
&lt;br /&gt;
 cd /#sh:user@hostname/some/path&lt;br /&gt;
&lt;br /&gt;
в Midnight Commander, и вы получите список содержимого /some/path на удаленной машине. Если вы опустите часть user@, то будет использоваться текущее&lt;br /&gt;
имя пользователя.&lt;br /&gt;
&lt;br /&gt;
*'''Выходит, через FISH кто-то может читать файлы на моем компьютере?'''&lt;br /&gt;
&lt;br /&gt;
Нет, потому что используется SSH. Но, если вы не используете аутентификацию по ключу, необходимо установить пароль на учетную запись. В обоих случаях,&lt;br /&gt;
доступ сможете получить только вы.&lt;br /&gt;
&lt;br /&gt;
*'''Ну, ладно, но Midnight Commander малость устарел, верно? В смысле, это ведь консольная программа, а как насчет GUI?'''&lt;br /&gt;
&lt;br /&gt;
Если у вас KDE, откройте Konqueror (или мини-консоль Alt+F2) и наберите&lt;br /&gt;
&lt;br /&gt;
 fish://user@hostname/some/path&lt;br /&gt;
&lt;br /&gt;
Используя магию kio_slaves, эта команда загрузит удаленную директорию в Konqueror. Благодаря свойству разбиения Konqueror на два окна, легко&lt;br /&gt;
сравнивать или переписывать локальную и удаленную копии директорий.&lt;br /&gt;
&lt;br /&gt;
*'''Итак, я могу использовать это для управления файлами в Konqueror или Midnight Commander?'''&lt;br /&gt;
&lt;br /&gt;
Управление файлами – это еще не все. Любое приложение KDE, работающее с файлами, может получать их через FISH. Хотите отредактировать файл на вашем&lt;br /&gt;
web-сервере на другом конце земного шара? Просто наберите&lt;br /&gt;
&lt;br /&gt;
 kate fish://me@my.server iffypagename.html&lt;br /&gt;
&lt;br /&gt;
для загрузки его в Kate, и при нажатии Save модифицированный файл отправится обратно на сервер. Конечно, web-страницами вы не ограничены: столь же&lt;br /&gt;
удобно использовать это для редактирования файлов конфигурации.&lt;br /&gt;
&lt;br /&gt;
*'''Значит, можно использовать FISH для управления файлами на службах удаленного резервирования, вроде Rsync.net или StrongSpace?'''&lt;br /&gt;
&lt;br /&gt;
К сожалению, нет. FISH предусмотрен только для входа через учетную запись с правами запуска базовых команд оболочки. Эти сервисы не дают установить&lt;br /&gt;
полный вход в оболочку, и FISH не работает, но есть альтернатива. SSHFS (http://fuse.sourceforge.net/sshfs.html) – файловая система FUSE, позволяющая монтировать себя на учетных записях с возможностью только копировать файлы (scp или rsync), но требуется монтировать удаленную файловую систему, даже&lt;br /&gt;
если вам нужно взять всего один файл.&lt;br /&gt;
&lt;br /&gt;
===Вопрос-победитель (английская версия)===&lt;br /&gt;
&lt;br /&gt;
'''Загружаясь с DVD'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я хочу установить DVD с LXF94 на старый ПК в двойную загрузу с Windows 98SE. Это 7-летний Athlon 600 на материнской плате MSI со 128 МБ ОЗУ, двумя жесткими дисками и приводами DVD и CD-RW. Его BIOS не имеет опции загрузки с DVD. Загрузочная последовательность позволяет мне использовать CD-ROM как&lt;br /&gt;
первое устройство, и я спокойно могу ее изменить. На форумах мне советовали установить сперва Windows, если нужна двойная загрузка (а так и есть).&lt;br /&gt;
Я использовал Partition Magic V5 для создания и FAT, и Linux-разделов.&lt;br /&gt;
&lt;br /&gt;
По-моему, Linux использует другой формат файлов по сравнению с FAT, но я пытался использовать загрузочную дискету Windows для «установки» или «инсталляции» с DVD, и неудачно. Будет ли это работать, если диск будет CD-ROM? Дискета Red Hat 6.1 позволила мне запустить CD Red Hat, но она требует именно CD Red Hat и не работает с DVD LXF94. С CD Red Hat CD все получилось, но я прервал установку, потому что предпочитаю (K)ubuntu. Могу ли я сделать загрузочную дискету с DVD-драйверами на ней для установки DVD LXF94?&lt;br /&gt;
&lt;br /&gt;
:Джон Паттерсон [John Patterson]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С точки зрения BIOS, загрузка с CD и DVD – одно и тоже: DVD распознается просто как большой CD-ROM. Старые дистрибутивы Linux использовали загрузочную дискету для быстрого старта установки с CD, поскольку в то время множество компьютеров не поддерживало загрузку с CD. Ваше поколение техники должно&lt;br /&gt;
поддерживать загрузку с оптических дисков – неважно, CD это или DVD. Установив в BIOS загрузку с CD, Вы не должны иметь проблем. Но могут сказываться личные особенности BIOS: некоторые старые BIOS дают сбой, если подключено более одного оптического привода. Если вы установили в BIOS загрузку с CD и&lt;br /&gt;
не можете загрузиться с DVD, попробуйте отсоединить кабель от вашего CD-RW, чтобы остался только один оптический привод.&lt;br /&gt;
&lt;br /&gt;
В наше время использование загрузочной дискеты для установки с CD или DVD – это уже экзотика, но на всякий случай мы поместили одну на DVD. Smart Boot Manager в каталоге Essential/SBM на DVD как раз и есть загрузочная дискета для запуска с оптического или жесткого диска. Запустите RAWWRITE.EXE в Windows, вставьте чистую дискету в дисковод и выберите sbootmgr.dsk как исходный образ. Загрузившись с этой дискеты, вы сможете загрузить ваш DVD.&lt;br /&gt;
&lt;br /&gt;
Различия в файловых системах Windows и Linux в этом случае к делу не относятся, так как все данные поступают с DVD, имеющего другую файловую систему (ту же, что у CD). Использование Windows-инструментов для создания разделов Linux способно порождать трудности. Посредством Partition Magic удалите созданные Linux-разделы, включая swap, и оставьте просто неразмеченное место. Затем велите установщику Ubuntu использовать все свободное место на диске&lt;br /&gt;
(«свободное» в этом случае означает «неразмеченное», а не место внутри размеченных разделов).&lt;br /&gt;
&lt;br /&gt;
Ваш компьютер может «тормозить» также из-за памяти. 128 МБ – очень мало по сегодняшним стандартам: современный рабочий стол, вроде KDE в Kubuntu, будет&lt;br /&gt;
работать очень медленно. Версия Ubuntu на LXFDVD наряду с жадными до ресурсов Gnome и KDE включает нетребовательный рабочий стол Xfce, используемый в Xubuntu.&lt;br /&gt;
&lt;br /&gt;
===Большой вопрос===&lt;br /&gt;
&lt;br /&gt;
'''Администратор через браузер'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас учетная запись web-хостинга, предоставляющего Apache, PHP и MySQL. Мы имеем FTP-доступ для загрузки файлов, но не доступ к командам оболочки, из-за чего настройка базы данных SQL и других вещей затруднительна. Нам нельзя устанавливать на сервер дополнительное ПО. Мы могли бы поискать&lt;br /&gt;
другое место с shell-доступом, но нам нравится та цена, которую мы здесь платим. Есть ли способ получить административный доступ через web-браузер, и что для этого надо сделать?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хотя переход на хостинг, поддерживающий SSH-доступ, добавит гибкости, существуют решения, привлекательные даже в случае отсутствия командной строки.&lt;br /&gt;
Основное из них – phphMyAdmin (www.phpmyadmin.net). Как видно из имени, это программа администрирования MySQL, написанная на PHP; она устанавливается как набор файлов в вашей учетной записи после настройки безопасности и конфигурации. Многие web-хостинги предоставляют доступ к базам данных только с локальных IP, чтобы скрипты запускались на сервере, а не на вашей машине.&lt;br /&gt;
&lt;br /&gt;
Загрузите и распакуйте один из tar-архивов с сайта phpMyAdmin (они различаются только языком и методом сжатия). Традиционный метод конфигурирования phpMyAdmin – создать подходящий файл config.inc.php, взяв за основу включенные примеры, но есть также и скрипт установки, который запускается всего один раз после копирования файлов на сервер. Прежде чем что-то делать, убедитесь, что это безопасно. Любой получивший доступ к директории phpMyAdmin может читать и изменять вашу базу данных, так что обезопасьте себя с помощью файла .htaccess (или другим способом), чтобы подключение было возможно только с защищенной паролем учетной записи. По возможности, включите его на раздел вашего пространства хостинга, доступный через HTTPS, ведь вы передаете пароль при запуске установочного скрипта. Создайте директорию config в директории phpmyadmin и скопируйте всю директорию (включая .htaccess) на сервер хостинга.&lt;br /&gt;
&lt;br /&gt;
Зайдите на https://www.ваш.сайт/phpmyadmindir/setup.php и заполните поля своего подключения к MySQL. Теперь перейдите на https://www.ваш.сайт/phphmyadmindir/ – вы увидите список ваших баз данных. Выбор одной из них покажет входящие в нее таблицы. Отсюда можно просматривать, выполнять запросы и модифицировать ваши SQL-таблицы, как вам нравится. Если у вас PostgreSQL, а не MySQL, то существует аналогичная программа, phpPgAdm, доступная по адресу http://phppgadmin.sourceforge.net.&lt;br /&gt;
&lt;br /&gt;
Не только SQL-базы можно администрировать через web-интерфейс. Webmin позволяет изменять все, что вообще разрешено менять на *nix-машинах, не ограничиваясь серверами. В вашем случае Webmin невыгоден потому, что должен быть установлен и запущен от имени root, поскольку использует собственный встроенный сервер, отличающийся от подобных Apache. Спросите об этом своего хостинг-провайдера: может, он уже установил Webmin или его бедного родственника Usermin. Если нет, то он может захотеть его установить: это будет выгодно всем заказчикам. Он также может установить для вас phpMyAdmin, и у вас не будет нужды тратить на это свою дисковую квоту и трафик.&lt;br /&gt;
&lt;br /&gt;
====Шаг за шагом: соединяемся с phpMyAdmin====&lt;br /&gt;
&lt;br /&gt;
#'''Прячем свой пароль'''&amp;lt;br&amp;gt;Перед копированием файлов phpMyAdmin (pMA) на ваш web-сервер, убедитесь, что они защищены от посторонних взглядов.&lt;br /&gt;
#'''Мастер конфигурации'''&amp;lt;br&amp;gt;Загрузив setup.php в своем браузере, вы сможете легко настроить phpMyAdmin, но подключайтесь через HTTPS, чтобы держать пароль в секрете.&lt;br /&gt;
#'''Ручная конфигурация'''&amp;lt;br&amp;gt;Или же сконфигурируйте pMA перед загрузкой файлов на web-сервер, отредактировав config.sample.inc.php и сохранив его как config.inc.php.&lt;br /&gt;
#'''Вот оно!'''&amp;lt;br&amp;gt;pMA позволяет работать с данными и схемами MySQL одним кликом мышки. Его можно использовать и для создания резервных копий вашей базы.&lt;br /&gt;
#'''А также PostgreSQL'''&amp;lt;br&amp;gt;Пользователям PostgreSQL не придется терять чувство превосходства – для них есть phpPgAdm, эквивалент pMA.&lt;br /&gt;
#'''Глобальная конфигурация'''&amp;lt;br&amp;gt;C Webmin вы можете сконфигурировать на компьютере все что угодно... точнее, все, что позволит владелец компьютера.&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:%D0%9E%D1%82%D0%B2%D0%B5%D1%82%D1%8B</id>
		<title>LXF98:Ответы</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:%D0%9E%D1%82%D0%B2%D0%B5%D1%82%D1%8B"/>
				<updated>2008-04-01T17:39:44Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: /* Шаг за шагом: соединяемся с phpMyAdmin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Ответы==&lt;br /&gt;
&lt;br /&gt;
===BIOS с «тараканами»===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я купил, как мне казалось, самый лучший компьютер по соотношению цена-производительность, и продолжаю считать его таковым. Но кое-что меня беспокоит. При включении компьютера и выборе загрузки Ubuntu из Grub, на экран выводится сообщение об ошибке MP-BIOS 8254 и каком-то неподключенном таймере. Также почти все дистрибутивы с DVD журнала не запускаются без опции noapic в строке загрузки. При загрузке LXFDVD95 выводится текст&lt;br /&gt;
 MP-BIOS bug: 8254 timer not connected to IO_APIC&lt;br /&gt;
 Kernel panic - not syncing: OI_APIC + timer doesn’t work!&lt;br /&gt;
&lt;br /&gt;
Искал и в Google, и в справке Ubuntu, но нашел только скудные заявления, что мой таймер не работает. Думаю, что это как-то связано с моей видеокартой&lt;br /&gt;
NVIDIA 7300LE (известно, что дешевые вещи обходятся дорого), но в чем все-таки причина? Возможно, пригодится другой факт. Все 3D-изображения на моем&lt;br /&gt;
компьютере становятся нестабильными и содержат множество ошибок. Нужно ли мне покупать видеокарту получше?&lt;br /&gt;
&lt;br /&gt;
:Иво Иванов [Ivo Ivanov]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Дело не в видеокарте: причиной ваших проблем с графикой может быть APIC (Advanced Programmable Interrupt Controller [Расширенный программируемый контроллер прерываний, – прим. пер.]), управляющий таймингами и прерываниями для различных компонентов вашей материнской платы, включая контроллер дисков и разъемы видеокарт. Контроллеры ACPI довольно часто отходят от спецификаций: многие изготовители полагают, что если плата «работает в Windows», то стандартам следовать не обязательно. Вы уже обнаружили, что надо добавить noapic в параметры загрузки LiveCD, но необходимо также делать это при загрузке с жесткого диска.&lt;br /&gt;
&lt;br /&gt;
Но сначала проверьте наличие обновлений BIOS на сайте изготовителя: вполне возможно, что ваша проблема была решена в последней версии прошивки.&lt;br /&gt;
Если нет, придется переделать меню загрузки, чтобы всегда использовалась опция noapic. Ubuntu не включает программу для настройки процесса загрузки, и&lt;br /&gt;
Вам придется править файл конфигурации вручную. Нажмите Alt+F2 и наберите&lt;br /&gt;
&lt;br /&gt;
 sudo gedit /boot/grub/menu.lst&lt;br /&gt;
&lt;br /&gt;
Это откроет файл конфигурации меню загрузки в текстовом редакторе. Большинство строк там начинаются с # – это комментарии, и их можно игнорировать. Найдите первую строку, начинающуюся с title; это первый пункт меню загрузки. Вам нужно изменить следующую строчку, начинающуюся с kernel,&lt;br /&gt;
добавив noapic в ее конец, обязательно через пробел после последнего слова в строке. Файл сохраните. После перезагрузки сообщение об ошибке BIOS&lt;br /&gt;
исчезнет, и 3D-графика станет стабильной. Видимо, будут и другие улучшения в работе, потому что «глючная» прошивка APIC способна вызывать разные проблемы, от снижения скорости доступа к дискам до неверного хода часов.&lt;br /&gt;
&lt;br /&gt;
===Беспроводная сеть, ау!===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я уже использовал Linux в 1996–1997 годах для запуска UNIX-приложений на ноутбуке, так как Linux был бесплатным, а Sparcbook стоил 10 000 фунтов. Позже я решил, что было бы неплохо использовать его снова и установить его на моем домашнем DELL XPS m1210. Порывшись в Интернете, я нашел, что для моей машины идеален Slackware 10, благополучно установил его и использовал Lilo для двойной загрузки Windows Vista и Linux.&lt;br /&gt;
&lt;br /&gt;
К сожалению, я не смог заставить работать беспроводную сетевую карту; точнее, я не знаю, как это сделать. Я смотрел в Сети, находил там решения, но все они были на чуждом для меня языке. За прошедшие десять лет я очень многое перезабыл и чувствую себя полным «чайником». Моя беспроводная карта: Intel PRO/Wireless 3945ABG Network Connection.&lt;br /&gt;
&lt;br /&gt;
:Грег [Greg]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существует официальный драйвер от Intel для этой беспроводной карты, найти его можно здесь: http://ipw3945.sourceforge.net, но он требует довольно свежего ядра для работы, как минимум 2.6.13. Slackware 10 старше трех лет и значительно старше этого драйвера, и использует ядро версии 2.4. Для нормальной работы нового аппаратного обеспечения Вам нужен дистрибутив – и в частности, ядро – такой же новый, как оборудование. Если вы хотите держаться Slackware, то установите новейшую версию 12.0: это первый релиз с ядром 2.6, которое необходимо вашей беспроводной карте, по умолчанию. Пакеты для использования вашей карты со Slackware 12 есть на сайте ftp://ftp.slackware.at/slackware-12.0/extra/intel-wlan-ipw3945.&lt;br /&gt;
&lt;br /&gt;
Как альтернативу, можно установить любой другой дистрибутив, в репозитории которого есть пакет ipw3945. Неплохой выбор – Ubuntu c DVDLXF94,&lt;br /&gt;
поскольку драйвер ipw3945 включен в установку по умолчанию и должен «просто работать». В Fedora 7 с DVDLXF95 также имеется ipw3945, но перед его&lt;br /&gt;
установкой требуется добавить репозиторий ATrpms в менеджер пакетов. Как добавить репозиторий, можно прочитать по адресу http://atrpms.net/install.html. Этот сайт содержит отнюдь не одни беспроводные драйверы – там множество самых разнообразных пакетов – и заслуживает добавления в ваш список репозиториев.&lt;br /&gt;
&lt;br /&gt;
===Желание синхронности===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хочу перейти на Linux, но боюсь, что синхронизация Microsoft Outlook на моем PDA не будет работать. Еще у меня на PDA стоит Money for PPC, это важная для меня программа – предоставляет ли GnuCash похожие возможности?&lt;br /&gt;
&lt;br /&gt;
:Герхард Штигер [Gerhard Stieger]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Синхронизацию Linux-приложений с устройствами Windows Pocket PC позволяет производить каркас SyncCE (www.synce.org/index.php/SynCE-Wiki); степень его дружелюбия к пользователю и качество зависят от приложения. Проще всего синхронизируются приложения пакета KDE PIM – KMail, Kontact, KAddressBook и KOrganiser. Чтобы сделать это, необходимо установить пакет synce-kde, присутствующий во многих дистрибутивах, но не во всех устанавливаемый по умолчанию. После установки системы запустите менеджер пакетов и установите synce-kde, если он не помечен как установленный. После этого вы&lt;br /&gt;
сможете синхронизировать свою почту и контакты.&lt;br /&gt;
&lt;br /&gt;
Однако это потребует запуска системы на базе KDE, типа Mandriva, Kubuntu, PCLinuxOS или SUSE. Все они присутствуют на DVD-дисках LinuxFormat, но вы&lt;br /&gt;
также можете найти ссылки на них и на множество других дистрибутивов на www.distrowatch.com.&lt;br /&gt;
&lt;br /&gt;
Синхронизация ваших записей о финансах – это другая тема. GnuCash может импортировать стандартные учетные записи QIF, но не экспортировать&lt;br /&gt;
их. Зато KMyMoney (http://kmymoney2.sourceforge.net) умеет делать и импорт, и экспорт, так что Вы сможете импортировать файлы с вашего PDA и переносить их назад после модификации. Те, кто не разбираются в бухгалтерском учете профессионально или не имеют опыта работы, вероятно, сочтут KMyMoney более легким, чем GnuCash. KMyMoney – тоже KDE-приложение, оно должно присутствовать в любом из перечисленных выше дистрибутивов.&lt;br /&gt;
&lt;br /&gt;
===Перезапись URL===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пишу web-сайт со множеством PNG-изображений – большинство из них использует прозрачность. Он великолепно работает во всех последних версиях браузеров, но (как и ожидалось) не в IE6. Чтобы исправить это, я создал GIF-версии для каждой картинки (а также таблицу стилей), загружаемые вместо PNG, если пользователь использует IE6.&lt;br /&gt;
&lt;br /&gt;
Я хочу сделать это с помощью mod_rewrite и .htaccess, чтобы images/png/image1.png переписывался в images/gif/image1.gif. Вот мой файл .htaccess:&lt;br /&gt;
&lt;br /&gt;
 RewriteEngine On&lt;br /&gt;
 RewriteCond %{HTTP_USER_AGENT} “MSIE 6”&lt;br /&gt;
 RewriteRule /images/png/([A-Za-z0-9])+\.png$&lt;br /&gt;
 /images/gif/$1+\.gif&lt;br /&gt;
 RewriteCond %{HTTP_USER_AGENT} “MSIE 6”&lt;br /&gt;
 RewriteRule css/style.css css/iestyle.css&lt;br /&gt;
&lt;br /&gt;
Перезапись CSS работает четко, но картинки (PNG на GIF) не заменяются. &lt;br /&gt;
&lt;br /&gt;
:OnlyTheTony, с форумов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вы предложили хорошую идею использовать mod_rewrite для смены URL. Сбой происходит потому, что Вы используете + для объединения строк, а mod_rewrite работает с регулярными выражениями, где + означает «одно или более повторений», а не оператор конкатенации.&lt;br /&gt;
&lt;br /&gt;
В регулярных выражениях не нужно соединять строки: чтобы отметить неизменяемые части, используются скобки, а $1, $2... включат их в путь назначения, как у Вас и делается, и все является либо текстом, либо символами регулярных выражений. Так, чтобы заменить последнее вхождение foo в строке на bar,&lt;br /&gt;
потребуется выражение&lt;br /&gt;
&lt;br /&gt;
 /(.*)foo(.*)/$1bar$2/&lt;br /&gt;
&lt;br /&gt;
В вашем случае надо взять нечто, начинающееся с image/png и заканчивающееся на .png, и заменить везде png на gif. Вы можете сделать это, вставив&lt;br /&gt;
одну из следующих строк вместо первого правила RewriteRule:&lt;br /&gt;
&lt;br /&gt;
  RewriteRule /images/png/(.*)\.png$ /images/gif/$1\.gif&lt;br /&gt;
  RewriteRule /(.*)/png/(.*)\.png$ /$1/gif/$2\.gif&lt;br /&gt;
&lt;br /&gt;
Первая строка легче читается, зато вторая также будет работать с изображениями в других директориях.&lt;br /&gt;
&lt;br /&gt;
===Восстановить NTFS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У меня внешний жесткий диск, отформатированный в NTFS. Мне нужно произвести его дефрагментацию, но я не хочу потерять все данные на нем. Можно ли выполнить дефрагментацию NTFS из Linux? Я запускаю Ubuntu Feisty Fawn на старом компьютере PC2800.&lt;br /&gt;
&lt;br /&gt;
:churst1, с форумов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Короткий ответ – нет, нельзя. Во-первых, почему на этом диске NTFS? Если с него загружают Windows, любые попытки выполнить дефрагментацию из-под Linux могут привести к ее незагружаемости. Но если диск уже содержит Windows, то почему бы не провести дефрагментацию из нее – Windows ведь не только для того, чтобы баловаться игрушками. Если же диск используется только для хранения данных, вы можете снизить фрагментацию, скопировав все их с него, отформатировав диск и записав данные обратно. Это действие требует драйвера файловой системы NTFS с полной поддержкой записи, такой, как коммерческая Paragon NTFS for Linux, которую мы рассматривали в прошлом месяце, или NTFS-3G, включенная в репозиторий Ubuntu. Также необходим пакет ntfsprogs, поэтому запустите Synaptic и инсталлируйте оба.&lt;br /&gt;
&lt;br /&gt;
Теперь надо проделать небольшую работу по открытию терминала, выбору директории, достаточно просторной для хранения содержимого NTFS-диска, и&lt;br /&gt;
запуску следующей команды:&lt;br /&gt;
&lt;br /&gt;
 tar cf ntfs.tar /mnt/ntfs &amp;amp;&amp;amp; umount /mnt/ntfs &amp;amp;&amp;amp; mkntfs /dev/sda1 &amp;amp;&amp;amp; mount /dev/sda1/mnt/ntfs -t ntfs-3g &amp;amp;&amp;amp; tar xf ntfs.tar -C /mnt/ntfs&lt;br /&gt;
&lt;br /&gt;
Все это надо записать в одну строку. Мы сцепили вместе две долгоиграющих команды tar и mkntfs – это позволит Вам не быть сиделкой у компьютера, но каж-&lt;br /&gt;
дая следующая команда выполнится, только если предыдущая отработает без ошибок (совершенно незачем переформатировать диск, если произойдет сбой&lt;br /&gt;
в копировании). Данный пример подразумевает, что Ваш диск – /dev/sda1 и смонтирован он в /mnt/NTFS. Перед запуском команды убедитесь, что подставлены&lt;br /&gt;
правильные пути для Вашего компьютера.&lt;br /&gt;
&lt;br /&gt;
Если у Вас мало места для хранения данных, можете создать сжатый архив, но это продлится гораздо дольше, чем простое копирование с диска. Вы можете&lt;br /&gt;
сделать это так:&lt;br /&gt;
&lt;br /&gt;
 tar czf ntfs.tar.gz /mnt/ntfs &amp;amp;&amp;amp; umount /mnt/ntfs &amp;amp;&amp;amp; mkntfs /dev/sda1 &amp;amp;&amp;amp; mount /dev/sda1 /mnt/ntfs -t ntfs-3g &amp;amp;&amp;amp; tar xf ntfs.tar.gz -C /mnt/ntfs&lt;br /&gt;
&lt;br /&gt;
Если Вы используете NTFS только ради чтения из Windows (а зачем она еще нужна?) и только с Вашим компьютером, где стоит Windows, лучшим решением&lt;br /&gt;
будет переформатирование диска в ext2 и установка драйвера ext2 с www.fs-driver.org в Windows. Это снимет проблему фрагментации, и Вы получите луч-&lt;br /&gt;
шее быстродействие в Linux. В вышеприведенных командах для этого надо заменить mkntfs на mke2fs и удалить&lt;br /&gt;
 &lt;br /&gt;
 -t ntfs-3g&lt;br /&gt;
&lt;br /&gt;
из команды mount.&lt;br /&gt;
&lt;br /&gt;
===Нужен легковес===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я присматриваю ОС для AMD K6/200. Думал, что NetBSD – лучший выбор, но максимум, чего я добился в результате установки – это режим командной строки. XFree86 (не XOrg) требует отдельной настройки. Я инвалид, и лишние усилия для меня проблема. Существуют ли «простые» версии, наподобие PC-BSD или Desktop BSD – легких версий FreeBSD?&lt;br /&gt;
&lt;br /&gt;
Пробовал DSL на машине P2/400 – ничего особенного, но я открыл DSL-N. Там даже был настоящий тестовый процессор! Что будет с производительностью, если установить Gnome или KDE на NetBSD или DSL-N? Fedora Core с Gnome работает на P2/400 с жуткими тормозами.&lt;br /&gt;
&lt;br /&gt;
:Гэри Причард [Gary Prichard]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Процессор K6/200 по нынешним меркам очень медленный, поэтому необходим «легкий» дистрибутив для получения терпимой производительности. А в первую очередь нужен нетребовательный оконный менеджер: среды Gnome и KDE к таковым не относятся. Гораздо лучше FluxBox, Xfce или IceWM. С учетом текстового процессора, Xfce был бы лучшим выбором: он использует GTK, как и AbiWord. Раз ресурсы у вас ограничены, выбирайте набор приложений, использующих одни и те же библиотеки, чтобы Ваша система работала более эффективно.&lt;br /&gt;
&lt;br /&gt;
Кстати о ресурсах: один из лучших способов увеличения производительности любой Linux-системы – увеличение объема ОЗУ. Потратив немного фунтов/&lt;br /&gt;
долларов/евро/песо на дополнительную память, вы получите больший прирост скорости, чем при вложении тех же средств в более быстрый процессор.&lt;br /&gt;
&lt;br /&gt;
Есть целый набор дистрибутивов, предназначенных для «слабых» систем: вы уже открыли для себя DSL и DSL-N, но советую также изучить Puppy Linux&lt;br /&gt;
с www.puppylinux.org. DSL ограничен объемом ISO-образа в 50 МБ, а Puppy Linux больше раза в два. Это означает, что он включает гораздо больше программ,&lt;br /&gt;
например, текстовый процессор AbiWord и сопутствующие офисные приложения, SeaMonkey (новое имя Mozilla) для Web и почты и много чего еще. Недостаток&lt;br /&gt;
Puppy в том, что процесс инсталляции на жесткий диск очень запутан, так как он спроектирован как LiveCD-система. Зато вы можете запускать его прямо&lt;br /&gt;
с CD, используя жесткий диск только для хранения данных и настроек.&lt;br /&gt;
&lt;br /&gt;
Другая альтернатива – правда, потяжелее – это Zenwalk (www.zenwalk.org). Если объем Вашего ОЗУ такой, какой обычно использовался на 200 МГц машинах, когда они были в новинку, то его не хватит; но Zenwalk дает больше функций, чем маленькие дистрибутивы.&lt;br /&gt;
&lt;br /&gt;
Запуск любой ОС на K-6/200 – это всегда компромисс между возможностями и производительностью, но он вполне возможен; тем более, если увеличить ОЗУ.&lt;br /&gt;
&lt;br /&gt;
===Работка для Ubuntu===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пытаясь запустить или инсталлировать Ubuntu, я получаю следующее сообщение после появления заставки:&lt;br /&gt;
&lt;br /&gt;
 unable to access tty job control turned off&lt;br /&gt;
&lt;br /&gt;
и возвращаюсь в командную строку. Ubuntu явно пытается обратиться к моему флоппи-дисководу, потому что перед появлением сообщения об ошибке&lt;br /&gt;
он включается.&lt;br /&gt;
&lt;br /&gt;
:Дэвид Лоусон [David Lowson]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Похоже, что ошибка связана с ядром: не найдя загрузочный диск, оно ищет его на всех подряд устройствах, прописанных в BIOS. Потому-то дисковод и начинает работать. Эта проблема не у Вас одного, и существует более чем одно решение.&lt;br /&gt;
&lt;br /&gt;
Первое заключается в загрузке с установочного диска и правке fstab в установленной системе. Если ваш корневой раздел находится на /dev/sda1, нужны&lt;br /&gt;
следующие команды:&lt;br /&gt;
&lt;br /&gt;
 sudo -i&lt;br /&gt;
 mount /dev/sda1 /mnt&lt;br /&gt;
 gedit /mnt/etc/fstab&lt;br /&gt;
&lt;br /&gt;
В fstab вы должны найти строчку, где монтируется корневой раздел, она выглядит примерно так:&lt;br /&gt;
&lt;br /&gt;
 # /dev/sda1&lt;br /&gt;
 UUID=71f72f22-0a14-45b7-9057-f7b0bd9d819c /ext3&lt;br /&gt;
 defaults....&lt;br /&gt;
&lt;br /&gt;
UUID (Universally Unique IDentifier [Универсальный Уникальный Идентификатор]) позволяет Ubuntu находить корневой раздел, даже если сменилась точка&lt;br /&gt;
подключения устройства (например, при добавлении нового диска), но здесь бывают проблемы. Смените UUID=xyz на путь вашего устройства, и система снова начнет загружаться. Fstab в этом случае должен выглядеть так:&lt;br /&gt;
&lt;br /&gt;
 # /dev/sda1&lt;br /&gt;
 /dev/sda1 / ext3 defaults....&lt;br /&gt;
&lt;br /&gt;
Другое решение более экстремальное, так что используйте его только в случае провала трюка с fstab. Вы должны открыть корпус вашего компьютера и&lt;br /&gt;
отключить все лишние дисковые устройства, оставив только загрузочный диск и DVD, с которого выполнялась установка – но не забудьте сперва выключить&lt;br /&gt;
компьютер! Дисковод также отключите – достаточно отсоединить кабели питания от неиспользуемых устройств. После этого ваша система должна загружаться. Затем добавьте модуль piix к образу, который Ubuntu загружает при запуске, с помощью команд&lt;br /&gt;
&lt;br /&gt;
 sudo echo piix &amp;gt;&amp;gt;/etc/initramfs-tools/modules&lt;br /&gt;
 sudo update-initramfs -u&lt;br /&gt;
&lt;br /&gt;
Теперь вам надо выключить компьютер, снова подсоединить все устройства и перезапустить его. Данная ошибка замечена небольшим числом пользователей Ubuntu, у которых подключено много устройств. Сообщалось также, что если проблема во флоппи-дисководе, ее можно обойти, оставив в нем дискету, но мы не смогли этого проверить, и в любом случае, это не метод.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Сервис резервирования===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Откликаясь на Сравнение «Онлайн-резервирование» (LXF94), расскажу о мелкой, но, надеюсь, решаемой проблеме. Я использую iBackup, потому что делаю резервное копирование с моего ПК (Ubuntu) и компьютера жены с Windows. Она справляется с резервным копированием без моей помощи.&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что в процессе резервирования с моего компьютера, запускаемого cron, соединение часто прерывается. Когда это происходит, создаваемый stunnel рушится, уничтожая резервирование, и я получаю частично скопированные данные на iBackup-сервере. Есть ли способ восстановить все при обрыве&lt;br /&gt;
соединения или даже возобновить процесс после восстановления связи без потери данных?&lt;br /&gt;
&lt;br /&gt;
Сервер iBackup не позволяет настраивать время или дату для копируемых файлов, поэтому все файлы имеют дату и время копирования. Из-за этого я копирую сжатые в tar файлы и теряю возможности rsync.&lt;br /&gt;
&lt;br /&gt;
Это хороший повод переключиться на использование Rsync.net, но мне надо копировать файлы также и с компьютера моей жены. С iBackup у нее свое соединение и URL.&lt;br /&gt;
&lt;br /&gt;
:Гуус [Guus]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если Вы используете rsync, рестарт резервирования не должен вызывать проблем, потому что rsync «поднимается» с того места, где произошел сбой. Не исключено, что сервер устанавливает время копирования как время создания файлов, потому что так указано в опциях rsync. Вам нужно вызывать rsync с опцией --times для сохранения времени файлов. Опция --archive – комбинация нескольких опций резервирования, включая --times. Это снимет необходимость копирования tar-архивов на сервер и позволит копировать индивидуальные файлы в том виде, в котором они хранятся на вашей машине, что сильно упрощает перезапуск копирования.&lt;br /&gt;
&lt;br /&gt;
Я попробовал Rsync.net после чтения статьи (раньше у меня был Strongspace) и переключился на него полностью. Резервирование нескольких машин&lt;br /&gt;
выполняется легко, если Вы можете более или менее свободно обращаться с имеющейся памятью – удобно будет создать по директории на резервную копию&lt;br /&gt;
каждой машины. Rsync.net использует SSH для работы rsync, так что в stunnel нужды нет, и вы можете применить Duplicity для шифрования данных.&lt;br /&gt;
&lt;br /&gt;
Альтернативное решение – резервирование данных на локальный диск и синхронизация их с удаленным сервером. Преимущество здесь в том, что Ваш первый шаг резервирования локален: это позволяет быстро восстановить данные, но требует, чтобы компьютер для резервных копий был включен всегда, когда требуется их создать.&lt;br /&gt;
&lt;br /&gt;
===Новый диск хромает===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Найдя, что мне необходим жесткий диск побольше, я подключил новый диск как hdb, разбил его, как надо, скопировал файловые системы со старого диска (hda) и попытался загрузиться с нового диска. К сожалению, ничего не вышло.&lt;br /&gt;
&lt;br /&gt;
Я сделал копии разделов /, /boot, /usr, /home и некоторых других. Я также создал swap-раздел. /boot, первый основной раздел, сделал загрузочным. Я cпи-&lt;br /&gt;
сал MBR, используя lilo -M /dev/hdb. Далее монтировал /boot и / разделы, редактируя новую копию /etc/lilo.conf, (теперь на /mnt/hdb5) и запускал lilo -C /hdb5/etc/lilo.conf -b /dev/hdb1 – на вид вроде работало.&lt;br /&gt;
&lt;br /&gt;
Когда я пытаюсь загрузиться с нового диска, я прохожу через стадию загрузочного окна Lilo и вижу сообщения, заканчивающиеся на&lt;br /&gt;
&lt;br /&gt;
 initrd finished&lt;br /&gt;
 Freeing unused kernel memory&lt;br /&gt;
 Warning: Unable to open an input console&lt;br /&gt;
&lt;br /&gt;
После этого только нажатие на reset выводит компьютер из ступора. У меня стоит “Mandrakelinux release 10.2 (Limited Edition 2005) for i586”.&lt;br /&gt;
&lt;br /&gt;
:Родни М. Бэйтс [Rodney M Bates]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проблема не в загрузчике. Раз уж ядро загрузилось, значит, загрузчик свое дело сделал. Такая ошибка показывает на отсутствие файла в /dev – возможно, в /dev/console. Хотя динамические файловые системы dev, типа udev и ее предшественника devfs, создают записи устройств в /dev автоматически, некоторые из них нужны еще до запуска devfs/udev. Подозреваю, что вы пропустили содержимое /dev, копируя свой корневой раздел – забыли включить его в команду копирования или исключили «прочие» файловые системы при копировании (вы не пояснили, как именно копировали файловые системы, но cp, rsync и tar имеют опции по исключению других файловых систем).&lt;br /&gt;
&lt;br /&gt;
Содержимое вашей исходной директории /dev теперь скрыто, потому что новая, динамическая /dev была примонтирована поверх нее, но, как вы можете&lt;br /&gt;
видеть, все еще доступна.&lt;br /&gt;
&lt;br /&gt;
 mkdir /mnt/tmp&lt;br /&gt;
 mount --bind / /mnt/tmp&lt;br /&gt;
&lt;br /&gt;
позволит обратиться ко всему корневому разделу через /mnt/tmp без других подмонтированных файловых систем. /mnt/tmp/home должен быть пуст, а&lt;br /&gt;
/tmp/mnt/dev должен содержать файлы устройств. Скопируйте их в /dev на Вашем новом разделе, и ошибка при загрузке исчезнет. Самый простой способ&lt;br /&gt;
убедиться, что новый корневой раздел содержит все файлы со старого –&lt;br /&gt;
&lt;br /&gt;
  rsync -a --delete /mnt/tmp/ /mnt/newroot/&lt;br /&gt;
&lt;br /&gt;
===Рота, подъем!===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для Mac OS X и Windows существуют специальные программы, которые позволяют организовать включение компьютера по расписанию. А есть ли что-нибудь подобное в Linux?&lt;br /&gt;
&lt;br /&gt;
:Анатолий Евдокимов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Самый простой способ организовать «подъем по распорядку» – это воспользоваться функцией ACPI WakeUp, которой обладает большинство современных материнских плат. Linux предоставляет к ней два интерфейса.&lt;br /&gt;
&lt;br /&gt;
В ядрах старше 2.6.22 используется файл /proc/acpi/alarm, в который можно записать дату в формате «ГГГГ-ММ-ДД ЧЧ:ММ:СС», например,  echo “2007-10-18 23:30:00” &amp;gt;/proc/acpi/alarm после чего можно выключать компьютер обычным образом. Конечно, следует проследить, чтобы системный блок остался подключенным к электросети и выключатель на его блоке питания находился в положении ON.&lt;br /&gt;
&lt;br /&gt;
Ядра 2.6.22 и выше предоставляют новый интерфейс через файл /sys/class/rtc/rtcX/wakealarm. Для установки «будильника» в него следует записать&lt;br /&gt;
желаемый момент времени в виде числа секунд, прошедших с начала эпохи (1 января 1970 года, 00:00:00) – формате, столь любимом ветеранами Unix.&lt;br /&gt;
Чтобы отменить пробуждение, достаточно записать в файл значение 0. Кроме того, необходимо удостовериться, что аппаратные часы вашего компьютера&lt;br /&gt;
настроены на UTC, иначе пробуждение произойдет не в то время.&lt;br /&gt;
&lt;br /&gt;
Несмотря на свою простоту, данный способ не лишен недостатков. Так, некоторые материнские платы отказываются принимать во внимание значение, установленное программно, и отдают предпочтение времени, указанному непосредственно через BIOS. Исходя из этого, рекомендуется отключить в BIOS данную функцию – обычно она называется как-то вроде Wake from RTC/Alarm. Иногда пробуждение по таймеру автоматически отменяется, если после его установки в аппаратные часы были внесены изменения – а это делают многие дистрибутивы при выключении. Поищите команду hwclock в скриптах /etc/init.d, и если&lt;br /&gt;
она там встречается, обеспечьте, чтобы время пробуждения устанавливалось после нее повторно.&lt;br /&gt;
&lt;br /&gt;
Можно пойти другим путем и воспользоваться программой nvram-wakeup (http://http//sourceforge.net/projects/nvram-wakeup), изменяющей установки&lt;br /&gt;
прямо в энергонезависимой памяти BIOS (отсюда и название). Поскольку формат хранения данных в памяти меняется от производителя к производителю,&lt;br /&gt;
это получится только на поддерживаемых программой материнских платах, зато будет работать, как часы.&lt;br /&gt;
&lt;br /&gt;
===Grub, который загрузит всех===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Надоело каждый раз устанавливать в BIOS загрузку с CD, чтобы попробовать новый дистрибутив. Есть ли способ добавить соответствующую опцию в Grub?&lt;br /&gt;
&lt;br /&gt;
:Иван Пуренко&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Научить Grub запускать загрузчик с CD несложно, но для решения этой задачи придется привлечь два других проекта: MEMDISK &lt;br /&gt;
(http://syslinux.zytor.com/memdisk.php) и Smart Boot Manager (http://btmgr.sourceforge.net/about.html или Главное/SBM на нашем DVD). MEMDISK является частью SYSLINUX и должен быть доступен в вашем дистрибутиве в виде одноименного пакета. Разверните данный пакет и извлеките из него файл memdisk,&lt;br /&gt;
который следует скопировать в каталог /boot. Далее, возьмите из каталога Главное/SBM на первой стороне нашего DVD файл btmgr.floppy.bz2 – это образ загрузочной дискеты Smart Boot Manager. Нам потребуются ее первые 18 КБ: откройте root-терминал и наберите &lt;br /&gt;
&lt;br /&gt;
 dd if=btmgr.floppy of=/boot/sbm.bin bs=1k count=18&lt;br /&gt;
&lt;br /&gt;
Наконец, необходимо создать соответствующую запись в меню Grub:&lt;br /&gt;
&lt;br /&gt;
 title Boot from CD&lt;br /&gt;
              kernel /boot/memdisk&lt;br /&gt;
              initrd /boot/sbm.bin&lt;br /&gt;
&lt;br /&gt;
==Врезки==&lt;br /&gt;
&lt;br /&gt;
===Коротко про…===&lt;br /&gt;
&lt;br /&gt;
'''MD5'''&lt;br /&gt;
&lt;br /&gt;
''Как избежать сравнения больших потоков чисел.''&lt;br /&gt;
&lt;br /&gt;
Если вы загружали ISO-образы различных дистрибутивов, то, безусловно, видели рядом с ISO-файлами файлы с именами типа cooldistro1.0.iso.md5, и, возможно, задавались вопросом: а зачем они? Сумма MD5 – это 128-битный криптографический хэш содержимого файла. Один и тот же файл всегда генерирует&lt;br /&gt;
одну и ту же сумму, но стоит изменить в нем всего один бит, и сумма окажется совершенно иной. MD5 был первоначально разработан для обеспечения безопасности. Проверив сумму MD5, вы можете убедиться, что файл не был подменен.&lt;br /&gt;
&lt;br /&gt;
Ныне MD5 также используется для проверки случайного повреждения во время передачи. При загрузке ISO-образа, скачайте заодно и файл MD5. Прежде чем &lt;br /&gt;
тратить время на запись файла на компакт-диск и попытки с него загрузиться, проверьте, не был ли файл поврежден, командой:&lt;br /&gt;
&lt;br /&gt;
 md5sum cooldistro1.0.iso&lt;br /&gt;
&lt;br /&gt;
Она вернет строку шестнадцатеричных символов, подобную хранящейся в cooldistro1.0.iso.md5. Конечно, ручное сличение 128-битных шестнадцатеричных чисел&lt;br /&gt;
друг с другом, возможно, не самое лучшее времяпрепровождение (спешу добавить – для меня), особенно если вы скачали много файлов, так что предоставим&lt;br /&gt;
программе сделать это за нас: &lt;br /&gt;
&lt;br /&gt;
 md5sum --check cooldistro1.0.iso.md5&lt;br /&gt;
&lt;br /&gt;
Эта команда позволит узнать, соответствует ли контрольная сумма оригиналу или нет. MD5-файл может содержать контрольные суммы нескольких файлов.&lt;br /&gt;
Например, исходные тексты Gnome состоят из множества файлов, а их суммы MD5 содержатся в одном. По договоренности, этот файл часто называется MD5SUMS.&lt;br /&gt;
Можно загрузить все необходимые вам файлы и проверить их за один раз:&lt;br /&gt;
&lt;br /&gt;
 md5sum -c MD5SUMS&lt;br /&gt;
&lt;br /&gt;
Кроме того, можно создать файл MD5SUMS:&lt;br /&gt;
&lt;br /&gt;
 ms5sum *.iso &amp;gt;MD5SUMS&lt;br /&gt;
&lt;br /&gt;
SHA1-файлы работают по аналогичному принципу, но с несколько более высоким уровнем безопасности. Синтаксис тот же, только используется программа&lt;br /&gt;
sha1sum.&lt;br /&gt;
&lt;br /&gt;
===Часто задаваемые вопросы===&lt;br /&gt;
&lt;br /&gt;
'''FISH'''&lt;br /&gt;
&lt;br /&gt;
''Не путайте с языком программирования FISh…''&lt;br /&gt;
&lt;br /&gt;
*'''Тогда что это такое?'''&lt;br /&gt;
&lt;br /&gt;
Это сокращение от FIles (Файлов), передаваемых через протокол (оболочки) SHell.&lt;br /&gt;
&lt;br /&gt;
*'''Стоп, не так заумно. Что он делает?''' Проще говоря, он дает доступ к файлам на удаленной машине только через SSH (или RSH). На удаленной машине не&lt;br /&gt;
нужно никакого специального программного обеспечения, кроме SSH и стандартных команд оболочки. Ваш компьютер должен иметь установленными FISH-программы для доступа к этим файлам.&lt;br /&gt;
&lt;br /&gt;
*'''Где такое ПО можно взять?'''&lt;br /&gt;
&lt;br /&gt;
Скорее всего, оно у вас есть; наберите&lt;br /&gt;
&lt;br /&gt;
 cd /#sh:user@hostname/some/path&lt;br /&gt;
&lt;br /&gt;
в Midnight Commander, и вы получите список содержимого /some/path на удаленной машине. Если вы опустите часть user@, то будет использоваться текущее&lt;br /&gt;
имя пользователя.&lt;br /&gt;
&lt;br /&gt;
*'''Выходит, через FISH кто-то может читать файлы на моем компьютере?'''&lt;br /&gt;
&lt;br /&gt;
Нет, потому что используется SSH. Но, если вы не используете аутентификацию по ключу, необходимо установить пароль на учетную запись. В обоих случаях,&lt;br /&gt;
доступ сможете получить только вы.&lt;br /&gt;
&lt;br /&gt;
*'''Ну, ладно, но Midnight Commander малость устарел, верно? В смысле, это ведь консольная программа, а как насчет GUI?'''&lt;br /&gt;
&lt;br /&gt;
Если у вас KDE, откройте Konqueror (или мини-консоль Alt+F2) и наберите&lt;br /&gt;
&lt;br /&gt;
 fish://user@hostname/some/path&lt;br /&gt;
&lt;br /&gt;
Используя магию kio_slaves, эта команда загрузит удаленную директорию в Konqueror. Благодаря свойству разбиения Konqueror на два окна, легко&lt;br /&gt;
сравнивать или переписывать локальную и удаленную копии директорий.&lt;br /&gt;
&lt;br /&gt;
*'''Итак, я могу использовать это для управления файлами в Konqueror или Midnight Commander?'''&lt;br /&gt;
&lt;br /&gt;
Управление файлами – это еще не все. Любое приложение KDE, работающее с файлами, может получать их через FISH. Хотите отредактировать файл на вашем&lt;br /&gt;
web-сервере на другом конце земного шара? Просто наберите&lt;br /&gt;
&lt;br /&gt;
 kate fish://me@my.server iffypagename.html&lt;br /&gt;
&lt;br /&gt;
для загрузки его в Kate, и при нажатии Save модифицированный файл отправится обратно на сервер. Конечно, web-страницами вы не ограничены: столь же&lt;br /&gt;
удобно использовать это для редактирования файлов конфигурации.&lt;br /&gt;
&lt;br /&gt;
*'''Значит, можно использовать FISH для управления файлами на службах удаленного резервирования, вроде Rsync.net или StrongSpace?'''&lt;br /&gt;
&lt;br /&gt;
К сожалению, нет. FISH предусмотрен только для входа через учетную запись с правами запуска базовых команд оболочки. Эти сервисы не дают установить&lt;br /&gt;
полный вход в оболочку, и FISH не работает, но есть альтернатива. SSHFS (http://fuse.sourceforge.net/sshfs.html) – файловая система FUSE, позволяющая монтировать себя на учетных записях с возможностью только копировать файлы (scp или rsync), но требуется монтировать удаленную файловую систему, даже&lt;br /&gt;
если вам нужно взять всего один файл.&lt;br /&gt;
&lt;br /&gt;
===Вопрос-победитель (английская версия)===&lt;br /&gt;
&lt;br /&gt;
'''Загружаясь с DVD'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я хочу установить DVD с LXF94 на старый ПК в двойную загрузу с Windows 98SE. Это 7-летний Athlon 600 на материнской плате MSI со 128 МБ ОЗУ, двумя жесткими дисками и приводами DVD и CD-RW. Его BIOS не имеет опции загрузки с DVD. Загрузочная последовательность позволяет мне использовать CD-ROM как&lt;br /&gt;
первое устройство, и я спокойно могу ее изменить. На форумах мне советовали установить сперва Windows, если нужна двойная загрузка (а так и есть).&lt;br /&gt;
Я использовал Partition Magic V5 для создания и FAT, и Linux-разделов.&lt;br /&gt;
&lt;br /&gt;
По-моему, Linux использует другой формат файлов по сравнению с FAT, но я пытался использовать загрузочную дискету Windows для «установки» или «инсталляции» с DVD, и неудачно. Будет ли это работать, если диск будет CD-ROM? Дискета Red Hat 6.1 позволила мне запустить CD Red Hat, но она требует именно CD Red Hat и не работает с DVD LXF94. С CD Red Hat CD все получилось, но я прервал установку, потому что предпочитаю (K)ubuntu. Могу ли я сделать загрузочную дискету с DVD-драйверами на ней для установки DVD LXF94?&lt;br /&gt;
&lt;br /&gt;
:Джон Паттерсон [John Patterson]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С точки зрения BIOS, загрузка с CD и DVD – одно и тоже: DVD распознается просто как большой CD-ROM. Старые дистрибутивы Linux использовали загрузочную дискету для быстрого старта установки с CD, поскольку в то время множество компьютеров не поддерживало загрузку с CD. Ваше поколение техники должно&lt;br /&gt;
поддерживать загрузку с оптических дисков – неважно, CD это или DVD. Установив в BIOS загрузку с CD, Вы не должны иметь проблем. Но могут сказываться личные особенности BIOS: некоторые старые BIOS дают сбой, если подключено более одного оптического привода. Если вы установили в BIOS загрузку с CD и&lt;br /&gt;
не можете загрузиться с DVD, попробуйте отсоединить кабель от вашего CD-RW, чтобы остался только один оптический привод.&lt;br /&gt;
&lt;br /&gt;
В наше время использование загрузочной дискеты для установки с CD или DVD – это уже экзотика, но на всякий случай мы поместили одну на DVD. Smart Boot Manager в каталоге Essential/SBM на DVD как раз и есть загрузочная дискета для запуска с оптического или жесткого диска. Запустите RAWWRITE.EXE в Windows, вставьте чистую дискету в дисковод и выберите sbootmgr.dsk как исходный образ. Загрузившись с этой дискеты, вы сможете загрузить ваш DVD.&lt;br /&gt;
&lt;br /&gt;
Различия в файловых системах Windows и Linux в этом случае к делу не относятся, так как все данные поступают с DVD, имеющего другую файловую систему (ту же, что у CD). Использование Windows-инструментов для создания разделов Linux способно порождать трудности. Посредством Partition Magic удалите созданные Linux-разделы, включая swap, и оставьте просто неразмеченное место. Затем велите установщику Ubuntu использовать все свободное место на диске&lt;br /&gt;
(«свободное» в этом случае означает «неразмеченное», а не место внутри размеченных разделов).&lt;br /&gt;
&lt;br /&gt;
Ваш компьютер может «тормозить» также из-за памяти. 128 МБ – очень мало по сегодняшним стандартам: современный рабочий стол, вроде KDE в Kubuntu, будет&lt;br /&gt;
работать очень медленно. Версия Ubuntu на LXFDVD наряду с жадными до ресурсов Gnome и KDE включает нетребовательный рабочий стол Xfce, используемый в Xubuntu.&lt;br /&gt;
&lt;br /&gt;
===Большой вопрос===&lt;br /&gt;
&lt;br /&gt;
'''Администратор через браузер'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас учетная запись web-хостинга, предоставляющего Apache, PHP и MySQL. Мы имеем FTP-доступ для загрузки файлов, но не доступ к командам оболочки, из-за чего настройка базы данных SQL и других вещей затруднительна. Нам нельзя устанавливать на сервер дополнительное ПО. Мы могли бы поискать&lt;br /&gt;
другое место с shell-доступом, но нам нравится та цена, которую мы здесь платим. Есть ли способ получить административный доступ через web-браузер, и что для этого надо сделать?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хотя переход на хостинг, поддерживающий SSH-доступ, добавит гибкости, существуют решения, привлекательные даже в случае отсутствия командной строки.&lt;br /&gt;
Основное из них – phphMyAdmin (www.phpmyadmin.net). Как видно из имени, это программа администрирования MySQL, написанная на PHP; она устанавливается как набор файлов в вашей учетной записи после настройки безопасности и конфигурации. Многие web-хостинги предоставляют доступ к базам данных только с локальных IP, чтобы скрипты запускались на сервере, а не на вашей машине.&lt;br /&gt;
&lt;br /&gt;
Загрузите и распакуйте один из tar-архивов с сайта phpMyAdmin (они различаются только языком и методом сжатия). Традиционный метод конфигурирования phpMyAdmin – создать подходящий файл config.inc.php, взяв за основу включенные примеры, но есть также и скрипт установки, который запускается всего один раз после копирования файлов на сервер. Прежде чем что-то делать, убедитесь, что это безопасно. Любой получивший доступ к директории phpMyAdmin может читать и изменять вашу базу данных, так что обезопасьте себя с помощью файла .htaccess (или другим способом), чтобы подключение было возможно только с защищенной паролем учетной записи. По возможности, включите его на раздел вашего пространства хостинга, доступный через HTTPS, ведь вы передаете пароль при запуске установочного скрипта. Создайте директорию config в директории phpmyadmin и скопируйте всю директорию (включая .htaccess) на сервер хостинга.&lt;br /&gt;
&lt;br /&gt;
Зайдите на https://www.ваш.сайт/phpmyadmindir/setup.php и заполните поля своего подключения к MySQL. Теперь перейдите на https://www.ваш.сайт/phphmyadmindir/ – вы увидите список ваших баз данных. Выбор одной из них покажет входящие в нее таблицы. Отсюда можно просматривать, выполнять запросы и модифицировать ваши SQL-таблицы, как вам нравится. Если у вас PostgreSQL, а не MySQL, то существует аналогичная программа, phpPgAdm, доступная по адресу http://phppgadmin.sourceforge.net.&lt;br /&gt;
&lt;br /&gt;
Не только SQL-базы можно администрировать через web-интерфейс. Webmin позволяет изменять все, что вообще разрешено менять на *nix-машинах, не ограничиваясь серверами. В вашем случае Webmin невыгоден потому, что должен быть установлен и запущен от имени root, поскольку использует собственный встроенный сервер, отличающийся от подобных Apache. Спросите об этом своего хостинг-провайдера: может, он уже установил Webmin или его бедного родственника Usermin. Если нет, то он может захотеть его установить: это будет выгодно всем заказчикам. Он также может установить для вас phpMyAdmin, и у вас не будет нужды тратить на это свою дисковую квоту и трафик.&lt;br /&gt;
&lt;br /&gt;
====Шаг за шагом: соединяемся с phpMyAdmin====&lt;br /&gt;
&lt;br /&gt;
#'''Прячем свой пароль'''&amp;lt;br&amp;gt;Перед копированием файлов phpMyAdmin (pMA) на ваш web-сервер, убедитесь, что они защищены от посторонних взглядов.&lt;br /&gt;
#'''Мастер конфигурации'''&amp;lt;br&amp;gt;Загрузив setup.php в своем браузере, вы сможете легко настроить phpMyAdmin, но подключайтесь через HTTPS, чтобы держать пароль в секрете.&lt;br /&gt;
#'''Ручная конфигурация'''&amp;lt;br&amp;gt;Или же сконфигурируйте pMA перед загрузкой файлов на web-сервер, отредактировав config.sample.inc.php и сохранив его как config.inc.php.&lt;br /&gt;
#'''Вот оно!'''&amp;lt;br&amp;gt;pMA позволяет работать с данными и схемами MySQL одним кликом мышки. Его можно использовать и для создания резервных копий вашей базы.&lt;br /&gt;
#'''А также PostgreSQL'''&amp;lt;br&amp;gt;Пользователям PostgreSQL не придется терять чувство превосходства – для них есть phpPgAdm, эквивалент pMA.&lt;br /&gt;
#'''Глобальная конфигурация'''&amp;lt;br&amp;gt;C Webmin вы можете сконфигурировать на компьютере все что угодно... точнее, все, что позволит владелец компьютера.&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:%D0%9E%D1%82%D0%B2%D0%B5%D1%82%D1%8B</id>
		<title>LXF98:Ответы</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:%D0%9E%D1%82%D0%B2%D0%B5%D1%82%D1%8B"/>
				<updated>2008-04-01T17:39:20Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: /* Шаг за шагом: соединяемся с phpMyAdmin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Ответы==&lt;br /&gt;
&lt;br /&gt;
===BIOS с «тараканами»===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я купил, как мне казалось, самый лучший компьютер по соотношению цена-производительность, и продолжаю считать его таковым. Но кое-что меня беспокоит. При включении компьютера и выборе загрузки Ubuntu из Grub, на экран выводится сообщение об ошибке MP-BIOS 8254 и каком-то неподключенном таймере. Также почти все дистрибутивы с DVD журнала не запускаются без опции noapic в строке загрузки. При загрузке LXFDVD95 выводится текст&lt;br /&gt;
 MP-BIOS bug: 8254 timer not connected to IO_APIC&lt;br /&gt;
 Kernel panic - not syncing: OI_APIC + timer doesn’t work!&lt;br /&gt;
&lt;br /&gt;
Искал и в Google, и в справке Ubuntu, но нашел только скудные заявления, что мой таймер не работает. Думаю, что это как-то связано с моей видеокартой&lt;br /&gt;
NVIDIA 7300LE (известно, что дешевые вещи обходятся дорого), но в чем все-таки причина? Возможно, пригодится другой факт. Все 3D-изображения на моем&lt;br /&gt;
компьютере становятся нестабильными и содержат множество ошибок. Нужно ли мне покупать видеокарту получше?&lt;br /&gt;
&lt;br /&gt;
:Иво Иванов [Ivo Ivanov]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Дело не в видеокарте: причиной ваших проблем с графикой может быть APIC (Advanced Programmable Interrupt Controller [Расширенный программируемый контроллер прерываний, – прим. пер.]), управляющий таймингами и прерываниями для различных компонентов вашей материнской платы, включая контроллер дисков и разъемы видеокарт. Контроллеры ACPI довольно часто отходят от спецификаций: многие изготовители полагают, что если плата «работает в Windows», то стандартам следовать не обязательно. Вы уже обнаружили, что надо добавить noapic в параметры загрузки LiveCD, но необходимо также делать это при загрузке с жесткого диска.&lt;br /&gt;
&lt;br /&gt;
Но сначала проверьте наличие обновлений BIOS на сайте изготовителя: вполне возможно, что ваша проблема была решена в последней версии прошивки.&lt;br /&gt;
Если нет, придется переделать меню загрузки, чтобы всегда использовалась опция noapic. Ubuntu не включает программу для настройки процесса загрузки, и&lt;br /&gt;
Вам придется править файл конфигурации вручную. Нажмите Alt+F2 и наберите&lt;br /&gt;
&lt;br /&gt;
 sudo gedit /boot/grub/menu.lst&lt;br /&gt;
&lt;br /&gt;
Это откроет файл конфигурации меню загрузки в текстовом редакторе. Большинство строк там начинаются с # – это комментарии, и их можно игнорировать. Найдите первую строку, начинающуюся с title; это первый пункт меню загрузки. Вам нужно изменить следующую строчку, начинающуюся с kernel,&lt;br /&gt;
добавив noapic в ее конец, обязательно через пробел после последнего слова в строке. Файл сохраните. После перезагрузки сообщение об ошибке BIOS&lt;br /&gt;
исчезнет, и 3D-графика станет стабильной. Видимо, будут и другие улучшения в работе, потому что «глючная» прошивка APIC способна вызывать разные проблемы, от снижения скорости доступа к дискам до неверного хода часов.&lt;br /&gt;
&lt;br /&gt;
===Беспроводная сеть, ау!===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я уже использовал Linux в 1996–1997 годах для запуска UNIX-приложений на ноутбуке, так как Linux был бесплатным, а Sparcbook стоил 10 000 фунтов. Позже я решил, что было бы неплохо использовать его снова и установить его на моем домашнем DELL XPS m1210. Порывшись в Интернете, я нашел, что для моей машины идеален Slackware 10, благополучно установил его и использовал Lilo для двойной загрузки Windows Vista и Linux.&lt;br /&gt;
&lt;br /&gt;
К сожалению, я не смог заставить работать беспроводную сетевую карту; точнее, я не знаю, как это сделать. Я смотрел в Сети, находил там решения, но все они были на чуждом для меня языке. За прошедшие десять лет я очень многое перезабыл и чувствую себя полным «чайником». Моя беспроводная карта: Intel PRO/Wireless 3945ABG Network Connection.&lt;br /&gt;
&lt;br /&gt;
:Грег [Greg]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существует официальный драйвер от Intel для этой беспроводной карты, найти его можно здесь: http://ipw3945.sourceforge.net, но он требует довольно свежего ядра для работы, как минимум 2.6.13. Slackware 10 старше трех лет и значительно старше этого драйвера, и использует ядро версии 2.4. Для нормальной работы нового аппаратного обеспечения Вам нужен дистрибутив – и в частности, ядро – такой же новый, как оборудование. Если вы хотите держаться Slackware, то установите новейшую версию 12.0: это первый релиз с ядром 2.6, которое необходимо вашей беспроводной карте, по умолчанию. Пакеты для использования вашей карты со Slackware 12 есть на сайте ftp://ftp.slackware.at/slackware-12.0/extra/intel-wlan-ipw3945.&lt;br /&gt;
&lt;br /&gt;
Как альтернативу, можно установить любой другой дистрибутив, в репозитории которого есть пакет ipw3945. Неплохой выбор – Ubuntu c DVDLXF94,&lt;br /&gt;
поскольку драйвер ipw3945 включен в установку по умолчанию и должен «просто работать». В Fedora 7 с DVDLXF95 также имеется ipw3945, но перед его&lt;br /&gt;
установкой требуется добавить репозиторий ATrpms в менеджер пакетов. Как добавить репозиторий, можно прочитать по адресу http://atrpms.net/install.html. Этот сайт содержит отнюдь не одни беспроводные драйверы – там множество самых разнообразных пакетов – и заслуживает добавления в ваш список репозиториев.&lt;br /&gt;
&lt;br /&gt;
===Желание синхронности===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хочу перейти на Linux, но боюсь, что синхронизация Microsoft Outlook на моем PDA не будет работать. Еще у меня на PDA стоит Money for PPC, это важная для меня программа – предоставляет ли GnuCash похожие возможности?&lt;br /&gt;
&lt;br /&gt;
:Герхард Штигер [Gerhard Stieger]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Синхронизацию Linux-приложений с устройствами Windows Pocket PC позволяет производить каркас SyncCE (www.synce.org/index.php/SynCE-Wiki); степень его дружелюбия к пользователю и качество зависят от приложения. Проще всего синхронизируются приложения пакета KDE PIM – KMail, Kontact, KAddressBook и KOrganiser. Чтобы сделать это, необходимо установить пакет synce-kde, присутствующий во многих дистрибутивах, но не во всех устанавливаемый по умолчанию. После установки системы запустите менеджер пакетов и установите synce-kde, если он не помечен как установленный. После этого вы&lt;br /&gt;
сможете синхронизировать свою почту и контакты.&lt;br /&gt;
&lt;br /&gt;
Однако это потребует запуска системы на базе KDE, типа Mandriva, Kubuntu, PCLinuxOS или SUSE. Все они присутствуют на DVD-дисках LinuxFormat, но вы&lt;br /&gt;
также можете найти ссылки на них и на множество других дистрибутивов на www.distrowatch.com.&lt;br /&gt;
&lt;br /&gt;
Синхронизация ваших записей о финансах – это другая тема. GnuCash может импортировать стандартные учетные записи QIF, но не экспортировать&lt;br /&gt;
их. Зато KMyMoney (http://kmymoney2.sourceforge.net) умеет делать и импорт, и экспорт, так что Вы сможете импортировать файлы с вашего PDA и переносить их назад после модификации. Те, кто не разбираются в бухгалтерском учете профессионально или не имеют опыта работы, вероятно, сочтут KMyMoney более легким, чем GnuCash. KMyMoney – тоже KDE-приложение, оно должно присутствовать в любом из перечисленных выше дистрибутивов.&lt;br /&gt;
&lt;br /&gt;
===Перезапись URL===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пишу web-сайт со множеством PNG-изображений – большинство из них использует прозрачность. Он великолепно работает во всех последних версиях браузеров, но (как и ожидалось) не в IE6. Чтобы исправить это, я создал GIF-версии для каждой картинки (а также таблицу стилей), загружаемые вместо PNG, если пользователь использует IE6.&lt;br /&gt;
&lt;br /&gt;
Я хочу сделать это с помощью mod_rewrite и .htaccess, чтобы images/png/image1.png переписывался в images/gif/image1.gif. Вот мой файл .htaccess:&lt;br /&gt;
&lt;br /&gt;
 RewriteEngine On&lt;br /&gt;
 RewriteCond %{HTTP_USER_AGENT} “MSIE 6”&lt;br /&gt;
 RewriteRule /images/png/([A-Za-z0-9])+\.png$&lt;br /&gt;
 /images/gif/$1+\.gif&lt;br /&gt;
 RewriteCond %{HTTP_USER_AGENT} “MSIE 6”&lt;br /&gt;
 RewriteRule css/style.css css/iestyle.css&lt;br /&gt;
&lt;br /&gt;
Перезапись CSS работает четко, но картинки (PNG на GIF) не заменяются. &lt;br /&gt;
&lt;br /&gt;
:OnlyTheTony, с форумов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вы предложили хорошую идею использовать mod_rewrite для смены URL. Сбой происходит потому, что Вы используете + для объединения строк, а mod_rewrite работает с регулярными выражениями, где + означает «одно или более повторений», а не оператор конкатенации.&lt;br /&gt;
&lt;br /&gt;
В регулярных выражениях не нужно соединять строки: чтобы отметить неизменяемые части, используются скобки, а $1, $2... включат их в путь назначения, как у Вас и делается, и все является либо текстом, либо символами регулярных выражений. Так, чтобы заменить последнее вхождение foo в строке на bar,&lt;br /&gt;
потребуется выражение&lt;br /&gt;
&lt;br /&gt;
 /(.*)foo(.*)/$1bar$2/&lt;br /&gt;
&lt;br /&gt;
В вашем случае надо взять нечто, начинающееся с image/png и заканчивающееся на .png, и заменить везде png на gif. Вы можете сделать это, вставив&lt;br /&gt;
одну из следующих строк вместо первого правила RewriteRule:&lt;br /&gt;
&lt;br /&gt;
  RewriteRule /images/png/(.*)\.png$ /images/gif/$1\.gif&lt;br /&gt;
  RewriteRule /(.*)/png/(.*)\.png$ /$1/gif/$2\.gif&lt;br /&gt;
&lt;br /&gt;
Первая строка легче читается, зато вторая также будет работать с изображениями в других директориях.&lt;br /&gt;
&lt;br /&gt;
===Восстановить NTFS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У меня внешний жесткий диск, отформатированный в NTFS. Мне нужно произвести его дефрагментацию, но я не хочу потерять все данные на нем. Можно ли выполнить дефрагментацию NTFS из Linux? Я запускаю Ubuntu Feisty Fawn на старом компьютере PC2800.&lt;br /&gt;
&lt;br /&gt;
:churst1, с форумов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Короткий ответ – нет, нельзя. Во-первых, почему на этом диске NTFS? Если с него загружают Windows, любые попытки выполнить дефрагментацию из-под Linux могут привести к ее незагружаемости. Но если диск уже содержит Windows, то почему бы не провести дефрагментацию из нее – Windows ведь не только для того, чтобы баловаться игрушками. Если же диск используется только для хранения данных, вы можете снизить фрагментацию, скопировав все их с него, отформатировав диск и записав данные обратно. Это действие требует драйвера файловой системы NTFS с полной поддержкой записи, такой, как коммерческая Paragon NTFS for Linux, которую мы рассматривали в прошлом месяце, или NTFS-3G, включенная в репозиторий Ubuntu. Также необходим пакет ntfsprogs, поэтому запустите Synaptic и инсталлируйте оба.&lt;br /&gt;
&lt;br /&gt;
Теперь надо проделать небольшую работу по открытию терминала, выбору директории, достаточно просторной для хранения содержимого NTFS-диска, и&lt;br /&gt;
запуску следующей команды:&lt;br /&gt;
&lt;br /&gt;
 tar cf ntfs.tar /mnt/ntfs &amp;amp;&amp;amp; umount /mnt/ntfs &amp;amp;&amp;amp; mkntfs /dev/sda1 &amp;amp;&amp;amp; mount /dev/sda1/mnt/ntfs -t ntfs-3g &amp;amp;&amp;amp; tar xf ntfs.tar -C /mnt/ntfs&lt;br /&gt;
&lt;br /&gt;
Все это надо записать в одну строку. Мы сцепили вместе две долгоиграющих команды tar и mkntfs – это позволит Вам не быть сиделкой у компьютера, но каж-&lt;br /&gt;
дая следующая команда выполнится, только если предыдущая отработает без ошибок (совершенно незачем переформатировать диск, если произойдет сбой&lt;br /&gt;
в копировании). Данный пример подразумевает, что Ваш диск – /dev/sda1 и смонтирован он в /mnt/NTFS. Перед запуском команды убедитесь, что подставлены&lt;br /&gt;
правильные пути для Вашего компьютера.&lt;br /&gt;
&lt;br /&gt;
Если у Вас мало места для хранения данных, можете создать сжатый архив, но это продлится гораздо дольше, чем простое копирование с диска. Вы можете&lt;br /&gt;
сделать это так:&lt;br /&gt;
&lt;br /&gt;
 tar czf ntfs.tar.gz /mnt/ntfs &amp;amp;&amp;amp; umount /mnt/ntfs &amp;amp;&amp;amp; mkntfs /dev/sda1 &amp;amp;&amp;amp; mount /dev/sda1 /mnt/ntfs -t ntfs-3g &amp;amp;&amp;amp; tar xf ntfs.tar.gz -C /mnt/ntfs&lt;br /&gt;
&lt;br /&gt;
Если Вы используете NTFS только ради чтения из Windows (а зачем она еще нужна?) и только с Вашим компьютером, где стоит Windows, лучшим решением&lt;br /&gt;
будет переформатирование диска в ext2 и установка драйвера ext2 с www.fs-driver.org в Windows. Это снимет проблему фрагментации, и Вы получите луч-&lt;br /&gt;
шее быстродействие в Linux. В вышеприведенных командах для этого надо заменить mkntfs на mke2fs и удалить&lt;br /&gt;
 &lt;br /&gt;
 -t ntfs-3g&lt;br /&gt;
&lt;br /&gt;
из команды mount.&lt;br /&gt;
&lt;br /&gt;
===Нужен легковес===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я присматриваю ОС для AMD K6/200. Думал, что NetBSD – лучший выбор, но максимум, чего я добился в результате установки – это режим командной строки. XFree86 (не XOrg) требует отдельной настройки. Я инвалид, и лишние усилия для меня проблема. Существуют ли «простые» версии, наподобие PC-BSD или Desktop BSD – легких версий FreeBSD?&lt;br /&gt;
&lt;br /&gt;
Пробовал DSL на машине P2/400 – ничего особенного, но я открыл DSL-N. Там даже был настоящий тестовый процессор! Что будет с производительностью, если установить Gnome или KDE на NetBSD или DSL-N? Fedora Core с Gnome работает на P2/400 с жуткими тормозами.&lt;br /&gt;
&lt;br /&gt;
:Гэри Причард [Gary Prichard]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Процессор K6/200 по нынешним меркам очень медленный, поэтому необходим «легкий» дистрибутив для получения терпимой производительности. А в первую очередь нужен нетребовательный оконный менеджер: среды Gnome и KDE к таковым не относятся. Гораздо лучше FluxBox, Xfce или IceWM. С учетом текстового процессора, Xfce был бы лучшим выбором: он использует GTK, как и AbiWord. Раз ресурсы у вас ограничены, выбирайте набор приложений, использующих одни и те же библиотеки, чтобы Ваша система работала более эффективно.&lt;br /&gt;
&lt;br /&gt;
Кстати о ресурсах: один из лучших способов увеличения производительности любой Linux-системы – увеличение объема ОЗУ. Потратив немного фунтов/&lt;br /&gt;
долларов/евро/песо на дополнительную память, вы получите больший прирост скорости, чем при вложении тех же средств в более быстрый процессор.&lt;br /&gt;
&lt;br /&gt;
Есть целый набор дистрибутивов, предназначенных для «слабых» систем: вы уже открыли для себя DSL и DSL-N, но советую также изучить Puppy Linux&lt;br /&gt;
с www.puppylinux.org. DSL ограничен объемом ISO-образа в 50 МБ, а Puppy Linux больше раза в два. Это означает, что он включает гораздо больше программ,&lt;br /&gt;
например, текстовый процессор AbiWord и сопутствующие офисные приложения, SeaMonkey (новое имя Mozilla) для Web и почты и много чего еще. Недостаток&lt;br /&gt;
Puppy в том, что процесс инсталляции на жесткий диск очень запутан, так как он спроектирован как LiveCD-система. Зато вы можете запускать его прямо&lt;br /&gt;
с CD, используя жесткий диск только для хранения данных и настроек.&lt;br /&gt;
&lt;br /&gt;
Другая альтернатива – правда, потяжелее – это Zenwalk (www.zenwalk.org). Если объем Вашего ОЗУ такой, какой обычно использовался на 200 МГц машинах, когда они были в новинку, то его не хватит; но Zenwalk дает больше функций, чем маленькие дистрибутивы.&lt;br /&gt;
&lt;br /&gt;
Запуск любой ОС на K-6/200 – это всегда компромисс между возможностями и производительностью, но он вполне возможен; тем более, если увеличить ОЗУ.&lt;br /&gt;
&lt;br /&gt;
===Работка для Ubuntu===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пытаясь запустить или инсталлировать Ubuntu, я получаю следующее сообщение после появления заставки:&lt;br /&gt;
&lt;br /&gt;
 unable to access tty job control turned off&lt;br /&gt;
&lt;br /&gt;
и возвращаюсь в командную строку. Ubuntu явно пытается обратиться к моему флоппи-дисководу, потому что перед появлением сообщения об ошибке&lt;br /&gt;
он включается.&lt;br /&gt;
&lt;br /&gt;
:Дэвид Лоусон [David Lowson]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Похоже, что ошибка связана с ядром: не найдя загрузочный диск, оно ищет его на всех подряд устройствах, прописанных в BIOS. Потому-то дисковод и начинает работать. Эта проблема не у Вас одного, и существует более чем одно решение.&lt;br /&gt;
&lt;br /&gt;
Первое заключается в загрузке с установочного диска и правке fstab в установленной системе. Если ваш корневой раздел находится на /dev/sda1, нужны&lt;br /&gt;
следующие команды:&lt;br /&gt;
&lt;br /&gt;
 sudo -i&lt;br /&gt;
 mount /dev/sda1 /mnt&lt;br /&gt;
 gedit /mnt/etc/fstab&lt;br /&gt;
&lt;br /&gt;
В fstab вы должны найти строчку, где монтируется корневой раздел, она выглядит примерно так:&lt;br /&gt;
&lt;br /&gt;
 # /dev/sda1&lt;br /&gt;
 UUID=71f72f22-0a14-45b7-9057-f7b0bd9d819c /ext3&lt;br /&gt;
 defaults....&lt;br /&gt;
&lt;br /&gt;
UUID (Universally Unique IDentifier [Универсальный Уникальный Идентификатор]) позволяет Ubuntu находить корневой раздел, даже если сменилась точка&lt;br /&gt;
подключения устройства (например, при добавлении нового диска), но здесь бывают проблемы. Смените UUID=xyz на путь вашего устройства, и система снова начнет загружаться. Fstab в этом случае должен выглядеть так:&lt;br /&gt;
&lt;br /&gt;
 # /dev/sda1&lt;br /&gt;
 /dev/sda1 / ext3 defaults....&lt;br /&gt;
&lt;br /&gt;
Другое решение более экстремальное, так что используйте его только в случае провала трюка с fstab. Вы должны открыть корпус вашего компьютера и&lt;br /&gt;
отключить все лишние дисковые устройства, оставив только загрузочный диск и DVD, с которого выполнялась установка – но не забудьте сперва выключить&lt;br /&gt;
компьютер! Дисковод также отключите – достаточно отсоединить кабели питания от неиспользуемых устройств. После этого ваша система должна загружаться. Затем добавьте модуль piix к образу, который Ubuntu загружает при запуске, с помощью команд&lt;br /&gt;
&lt;br /&gt;
 sudo echo piix &amp;gt;&amp;gt;/etc/initramfs-tools/modules&lt;br /&gt;
 sudo update-initramfs -u&lt;br /&gt;
&lt;br /&gt;
Теперь вам надо выключить компьютер, снова подсоединить все устройства и перезапустить его. Данная ошибка замечена небольшим числом пользователей Ubuntu, у которых подключено много устройств. Сообщалось также, что если проблема во флоппи-дисководе, ее можно обойти, оставив в нем дискету, но мы не смогли этого проверить, и в любом случае, это не метод.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Сервис резервирования===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Откликаясь на Сравнение «Онлайн-резервирование» (LXF94), расскажу о мелкой, но, надеюсь, решаемой проблеме. Я использую iBackup, потому что делаю резервное копирование с моего ПК (Ubuntu) и компьютера жены с Windows. Она справляется с резервным копированием без моей помощи.&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что в процессе резервирования с моего компьютера, запускаемого cron, соединение часто прерывается. Когда это происходит, создаваемый stunnel рушится, уничтожая резервирование, и я получаю частично скопированные данные на iBackup-сервере. Есть ли способ восстановить все при обрыве&lt;br /&gt;
соединения или даже возобновить процесс после восстановления связи без потери данных?&lt;br /&gt;
&lt;br /&gt;
Сервер iBackup не позволяет настраивать время или дату для копируемых файлов, поэтому все файлы имеют дату и время копирования. Из-за этого я копирую сжатые в tar файлы и теряю возможности rsync.&lt;br /&gt;
&lt;br /&gt;
Это хороший повод переключиться на использование Rsync.net, но мне надо копировать файлы также и с компьютера моей жены. С iBackup у нее свое соединение и URL.&lt;br /&gt;
&lt;br /&gt;
:Гуус [Guus]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если Вы используете rsync, рестарт резервирования не должен вызывать проблем, потому что rsync «поднимается» с того места, где произошел сбой. Не исключено, что сервер устанавливает время копирования как время создания файлов, потому что так указано в опциях rsync. Вам нужно вызывать rsync с опцией --times для сохранения времени файлов. Опция --archive – комбинация нескольких опций резервирования, включая --times. Это снимет необходимость копирования tar-архивов на сервер и позволит копировать индивидуальные файлы в том виде, в котором они хранятся на вашей машине, что сильно упрощает перезапуск копирования.&lt;br /&gt;
&lt;br /&gt;
Я попробовал Rsync.net после чтения статьи (раньше у меня был Strongspace) и переключился на него полностью. Резервирование нескольких машин&lt;br /&gt;
выполняется легко, если Вы можете более или менее свободно обращаться с имеющейся памятью – удобно будет создать по директории на резервную копию&lt;br /&gt;
каждой машины. Rsync.net использует SSH для работы rsync, так что в stunnel нужды нет, и вы можете применить Duplicity для шифрования данных.&lt;br /&gt;
&lt;br /&gt;
Альтернативное решение – резервирование данных на локальный диск и синхронизация их с удаленным сервером. Преимущество здесь в том, что Ваш первый шаг резервирования локален: это позволяет быстро восстановить данные, но требует, чтобы компьютер для резервных копий был включен всегда, когда требуется их создать.&lt;br /&gt;
&lt;br /&gt;
===Новый диск хромает===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Найдя, что мне необходим жесткий диск побольше, я подключил новый диск как hdb, разбил его, как надо, скопировал файловые системы со старого диска (hda) и попытался загрузиться с нового диска. К сожалению, ничего не вышло.&lt;br /&gt;
&lt;br /&gt;
Я сделал копии разделов /, /boot, /usr, /home и некоторых других. Я также создал swap-раздел. /boot, первый основной раздел, сделал загрузочным. Я cпи-&lt;br /&gt;
сал MBR, используя lilo -M /dev/hdb. Далее монтировал /boot и / разделы, редактируя новую копию /etc/lilo.conf, (теперь на /mnt/hdb5) и запускал lilo -C /hdb5/etc/lilo.conf -b /dev/hdb1 – на вид вроде работало.&lt;br /&gt;
&lt;br /&gt;
Когда я пытаюсь загрузиться с нового диска, я прохожу через стадию загрузочного окна Lilo и вижу сообщения, заканчивающиеся на&lt;br /&gt;
&lt;br /&gt;
 initrd finished&lt;br /&gt;
 Freeing unused kernel memory&lt;br /&gt;
 Warning: Unable to open an input console&lt;br /&gt;
&lt;br /&gt;
После этого только нажатие на reset выводит компьютер из ступора. У меня стоит “Mandrakelinux release 10.2 (Limited Edition 2005) for i586”.&lt;br /&gt;
&lt;br /&gt;
:Родни М. Бэйтс [Rodney M Bates]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проблема не в загрузчике. Раз уж ядро загрузилось, значит, загрузчик свое дело сделал. Такая ошибка показывает на отсутствие файла в /dev – возможно, в /dev/console. Хотя динамические файловые системы dev, типа udev и ее предшественника devfs, создают записи устройств в /dev автоматически, некоторые из них нужны еще до запуска devfs/udev. Подозреваю, что вы пропустили содержимое /dev, копируя свой корневой раздел – забыли включить его в команду копирования или исключили «прочие» файловые системы при копировании (вы не пояснили, как именно копировали файловые системы, но cp, rsync и tar имеют опции по исключению других файловых систем).&lt;br /&gt;
&lt;br /&gt;
Содержимое вашей исходной директории /dev теперь скрыто, потому что новая, динамическая /dev была примонтирована поверх нее, но, как вы можете&lt;br /&gt;
видеть, все еще доступна.&lt;br /&gt;
&lt;br /&gt;
 mkdir /mnt/tmp&lt;br /&gt;
 mount --bind / /mnt/tmp&lt;br /&gt;
&lt;br /&gt;
позволит обратиться ко всему корневому разделу через /mnt/tmp без других подмонтированных файловых систем. /mnt/tmp/home должен быть пуст, а&lt;br /&gt;
/tmp/mnt/dev должен содержать файлы устройств. Скопируйте их в /dev на Вашем новом разделе, и ошибка при загрузке исчезнет. Самый простой способ&lt;br /&gt;
убедиться, что новый корневой раздел содержит все файлы со старого –&lt;br /&gt;
&lt;br /&gt;
  rsync -a --delete /mnt/tmp/ /mnt/newroot/&lt;br /&gt;
&lt;br /&gt;
===Рота, подъем!===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для Mac OS X и Windows существуют специальные программы, которые позволяют организовать включение компьютера по расписанию. А есть ли что-нибудь подобное в Linux?&lt;br /&gt;
&lt;br /&gt;
:Анатолий Евдокимов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Самый простой способ организовать «подъем по распорядку» – это воспользоваться функцией ACPI WakeUp, которой обладает большинство современных материнских плат. Linux предоставляет к ней два интерфейса.&lt;br /&gt;
&lt;br /&gt;
В ядрах старше 2.6.22 используется файл /proc/acpi/alarm, в который можно записать дату в формате «ГГГГ-ММ-ДД ЧЧ:ММ:СС», например,  echo “2007-10-18 23:30:00” &amp;gt;/proc/acpi/alarm после чего можно выключать компьютер обычным образом. Конечно, следует проследить, чтобы системный блок остался подключенным к электросети и выключатель на его блоке питания находился в положении ON.&lt;br /&gt;
&lt;br /&gt;
Ядра 2.6.22 и выше предоставляют новый интерфейс через файл /sys/class/rtc/rtcX/wakealarm. Для установки «будильника» в него следует записать&lt;br /&gt;
желаемый момент времени в виде числа секунд, прошедших с начала эпохи (1 января 1970 года, 00:00:00) – формате, столь любимом ветеранами Unix.&lt;br /&gt;
Чтобы отменить пробуждение, достаточно записать в файл значение 0. Кроме того, необходимо удостовериться, что аппаратные часы вашего компьютера&lt;br /&gt;
настроены на UTC, иначе пробуждение произойдет не в то время.&lt;br /&gt;
&lt;br /&gt;
Несмотря на свою простоту, данный способ не лишен недостатков. Так, некоторые материнские платы отказываются принимать во внимание значение, установленное программно, и отдают предпочтение времени, указанному непосредственно через BIOS. Исходя из этого, рекомендуется отключить в BIOS данную функцию – обычно она называется как-то вроде Wake from RTC/Alarm. Иногда пробуждение по таймеру автоматически отменяется, если после его установки в аппаратные часы были внесены изменения – а это делают многие дистрибутивы при выключении. Поищите команду hwclock в скриптах /etc/init.d, и если&lt;br /&gt;
она там встречается, обеспечьте, чтобы время пробуждения устанавливалось после нее повторно.&lt;br /&gt;
&lt;br /&gt;
Можно пойти другим путем и воспользоваться программой nvram-wakeup (http://http//sourceforge.net/projects/nvram-wakeup), изменяющей установки&lt;br /&gt;
прямо в энергонезависимой памяти BIOS (отсюда и название). Поскольку формат хранения данных в памяти меняется от производителя к производителю,&lt;br /&gt;
это получится только на поддерживаемых программой материнских платах, зато будет работать, как часы.&lt;br /&gt;
&lt;br /&gt;
===Grub, который загрузит всех===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Надоело каждый раз устанавливать в BIOS загрузку с CD, чтобы попробовать новый дистрибутив. Есть ли способ добавить соответствующую опцию в Grub?&lt;br /&gt;
&lt;br /&gt;
:Иван Пуренко&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Научить Grub запускать загрузчик с CD несложно, но для решения этой задачи придется привлечь два других проекта: MEMDISK &lt;br /&gt;
(http://syslinux.zytor.com/memdisk.php) и Smart Boot Manager (http://btmgr.sourceforge.net/about.html или Главное/SBM на нашем DVD). MEMDISK является частью SYSLINUX и должен быть доступен в вашем дистрибутиве в виде одноименного пакета. Разверните данный пакет и извлеките из него файл memdisk,&lt;br /&gt;
который следует скопировать в каталог /boot. Далее, возьмите из каталога Главное/SBM на первой стороне нашего DVD файл btmgr.floppy.bz2 – это образ загрузочной дискеты Smart Boot Manager. Нам потребуются ее первые 18 КБ: откройте root-терминал и наберите &lt;br /&gt;
&lt;br /&gt;
 dd if=btmgr.floppy of=/boot/sbm.bin bs=1k count=18&lt;br /&gt;
&lt;br /&gt;
Наконец, необходимо создать соответствующую запись в меню Grub:&lt;br /&gt;
&lt;br /&gt;
 title Boot from CD&lt;br /&gt;
              kernel /boot/memdisk&lt;br /&gt;
              initrd /boot/sbm.bin&lt;br /&gt;
&lt;br /&gt;
==Врезки==&lt;br /&gt;
&lt;br /&gt;
===Коротко про…===&lt;br /&gt;
&lt;br /&gt;
'''MD5'''&lt;br /&gt;
&lt;br /&gt;
''Как избежать сравнения больших потоков чисел.''&lt;br /&gt;
&lt;br /&gt;
Если вы загружали ISO-образы различных дистрибутивов, то, безусловно, видели рядом с ISO-файлами файлы с именами типа cooldistro1.0.iso.md5, и, возможно, задавались вопросом: а зачем они? Сумма MD5 – это 128-битный криптографический хэш содержимого файла. Один и тот же файл всегда генерирует&lt;br /&gt;
одну и ту же сумму, но стоит изменить в нем всего один бит, и сумма окажется совершенно иной. MD5 был первоначально разработан для обеспечения безопасности. Проверив сумму MD5, вы можете убедиться, что файл не был подменен.&lt;br /&gt;
&lt;br /&gt;
Ныне MD5 также используется для проверки случайного повреждения во время передачи. При загрузке ISO-образа, скачайте заодно и файл MD5. Прежде чем &lt;br /&gt;
тратить время на запись файла на компакт-диск и попытки с него загрузиться, проверьте, не был ли файл поврежден, командой:&lt;br /&gt;
&lt;br /&gt;
 md5sum cooldistro1.0.iso&lt;br /&gt;
&lt;br /&gt;
Она вернет строку шестнадцатеричных символов, подобную хранящейся в cooldistro1.0.iso.md5. Конечно, ручное сличение 128-битных шестнадцатеричных чисел&lt;br /&gt;
друг с другом, возможно, не самое лучшее времяпрепровождение (спешу добавить – для меня), особенно если вы скачали много файлов, так что предоставим&lt;br /&gt;
программе сделать это за нас: &lt;br /&gt;
&lt;br /&gt;
 md5sum --check cooldistro1.0.iso.md5&lt;br /&gt;
&lt;br /&gt;
Эта команда позволит узнать, соответствует ли контрольная сумма оригиналу или нет. MD5-файл может содержать контрольные суммы нескольких файлов.&lt;br /&gt;
Например, исходные тексты Gnome состоят из множества файлов, а их суммы MD5 содержатся в одном. По договоренности, этот файл часто называется MD5SUMS.&lt;br /&gt;
Можно загрузить все необходимые вам файлы и проверить их за один раз:&lt;br /&gt;
&lt;br /&gt;
 md5sum -c MD5SUMS&lt;br /&gt;
&lt;br /&gt;
Кроме того, можно создать файл MD5SUMS:&lt;br /&gt;
&lt;br /&gt;
 ms5sum *.iso &amp;gt;MD5SUMS&lt;br /&gt;
&lt;br /&gt;
SHA1-файлы работают по аналогичному принципу, но с несколько более высоким уровнем безопасности. Синтаксис тот же, только используется программа&lt;br /&gt;
sha1sum.&lt;br /&gt;
&lt;br /&gt;
===Часто задаваемые вопросы===&lt;br /&gt;
&lt;br /&gt;
'''FISH'''&lt;br /&gt;
&lt;br /&gt;
''Не путайте с языком программирования FISh…''&lt;br /&gt;
&lt;br /&gt;
*'''Тогда что это такое?'''&lt;br /&gt;
&lt;br /&gt;
Это сокращение от FIles (Файлов), передаваемых через протокол (оболочки) SHell.&lt;br /&gt;
&lt;br /&gt;
*'''Стоп, не так заумно. Что он делает?''' Проще говоря, он дает доступ к файлам на удаленной машине только через SSH (или RSH). На удаленной машине не&lt;br /&gt;
нужно никакого специального программного обеспечения, кроме SSH и стандартных команд оболочки. Ваш компьютер должен иметь установленными FISH-программы для доступа к этим файлам.&lt;br /&gt;
&lt;br /&gt;
*'''Где такое ПО можно взять?'''&lt;br /&gt;
&lt;br /&gt;
Скорее всего, оно у вас есть; наберите&lt;br /&gt;
&lt;br /&gt;
 cd /#sh:user@hostname/some/path&lt;br /&gt;
&lt;br /&gt;
в Midnight Commander, и вы получите список содержимого /some/path на удаленной машине. Если вы опустите часть user@, то будет использоваться текущее&lt;br /&gt;
имя пользователя.&lt;br /&gt;
&lt;br /&gt;
*'''Выходит, через FISH кто-то может читать файлы на моем компьютере?'''&lt;br /&gt;
&lt;br /&gt;
Нет, потому что используется SSH. Но, если вы не используете аутентификацию по ключу, необходимо установить пароль на учетную запись. В обоих случаях,&lt;br /&gt;
доступ сможете получить только вы.&lt;br /&gt;
&lt;br /&gt;
*'''Ну, ладно, но Midnight Commander малость устарел, верно? В смысле, это ведь консольная программа, а как насчет GUI?'''&lt;br /&gt;
&lt;br /&gt;
Если у вас KDE, откройте Konqueror (или мини-консоль Alt+F2) и наберите&lt;br /&gt;
&lt;br /&gt;
 fish://user@hostname/some/path&lt;br /&gt;
&lt;br /&gt;
Используя магию kio_slaves, эта команда загрузит удаленную директорию в Konqueror. Благодаря свойству разбиения Konqueror на два окна, легко&lt;br /&gt;
сравнивать или переписывать локальную и удаленную копии директорий.&lt;br /&gt;
&lt;br /&gt;
*'''Итак, я могу использовать это для управления файлами в Konqueror или Midnight Commander?'''&lt;br /&gt;
&lt;br /&gt;
Управление файлами – это еще не все. Любое приложение KDE, работающее с файлами, может получать их через FISH. Хотите отредактировать файл на вашем&lt;br /&gt;
web-сервере на другом конце земного шара? Просто наберите&lt;br /&gt;
&lt;br /&gt;
 kate fish://me@my.server iffypagename.html&lt;br /&gt;
&lt;br /&gt;
для загрузки его в Kate, и при нажатии Save модифицированный файл отправится обратно на сервер. Конечно, web-страницами вы не ограничены: столь же&lt;br /&gt;
удобно использовать это для редактирования файлов конфигурации.&lt;br /&gt;
&lt;br /&gt;
*'''Значит, можно использовать FISH для управления файлами на службах удаленного резервирования, вроде Rsync.net или StrongSpace?'''&lt;br /&gt;
&lt;br /&gt;
К сожалению, нет. FISH предусмотрен только для входа через учетную запись с правами запуска базовых команд оболочки. Эти сервисы не дают установить&lt;br /&gt;
полный вход в оболочку, и FISH не работает, но есть альтернатива. SSHFS (http://fuse.sourceforge.net/sshfs.html) – файловая система FUSE, позволяющая монтировать себя на учетных записях с возможностью только копировать файлы (scp или rsync), но требуется монтировать удаленную файловую систему, даже&lt;br /&gt;
если вам нужно взять всего один файл.&lt;br /&gt;
&lt;br /&gt;
===Вопрос-победитель (английская версия)===&lt;br /&gt;
&lt;br /&gt;
'''Загружаясь с DVD'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я хочу установить DVD с LXF94 на старый ПК в двойную загрузу с Windows 98SE. Это 7-летний Athlon 600 на материнской плате MSI со 128 МБ ОЗУ, двумя жесткими дисками и приводами DVD и CD-RW. Его BIOS не имеет опции загрузки с DVD. Загрузочная последовательность позволяет мне использовать CD-ROM как&lt;br /&gt;
первое устройство, и я спокойно могу ее изменить. На форумах мне советовали установить сперва Windows, если нужна двойная загрузка (а так и есть).&lt;br /&gt;
Я использовал Partition Magic V5 для создания и FAT, и Linux-разделов.&lt;br /&gt;
&lt;br /&gt;
По-моему, Linux использует другой формат файлов по сравнению с FAT, но я пытался использовать загрузочную дискету Windows для «установки» или «инсталляции» с DVD, и неудачно. Будет ли это работать, если диск будет CD-ROM? Дискета Red Hat 6.1 позволила мне запустить CD Red Hat, но она требует именно CD Red Hat и не работает с DVD LXF94. С CD Red Hat CD все получилось, но я прервал установку, потому что предпочитаю (K)ubuntu. Могу ли я сделать загрузочную дискету с DVD-драйверами на ней для установки DVD LXF94?&lt;br /&gt;
&lt;br /&gt;
:Джон Паттерсон [John Patterson]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С точки зрения BIOS, загрузка с CD и DVD – одно и тоже: DVD распознается просто как большой CD-ROM. Старые дистрибутивы Linux использовали загрузочную дискету для быстрого старта установки с CD, поскольку в то время множество компьютеров не поддерживало загрузку с CD. Ваше поколение техники должно&lt;br /&gt;
поддерживать загрузку с оптических дисков – неважно, CD это или DVD. Установив в BIOS загрузку с CD, Вы не должны иметь проблем. Но могут сказываться личные особенности BIOS: некоторые старые BIOS дают сбой, если подключено более одного оптического привода. Если вы установили в BIOS загрузку с CD и&lt;br /&gt;
не можете загрузиться с DVD, попробуйте отсоединить кабель от вашего CD-RW, чтобы остался только один оптический привод.&lt;br /&gt;
&lt;br /&gt;
В наше время использование загрузочной дискеты для установки с CD или DVD – это уже экзотика, но на всякий случай мы поместили одну на DVD. Smart Boot Manager в каталоге Essential/SBM на DVD как раз и есть загрузочная дискета для запуска с оптического или жесткого диска. Запустите RAWWRITE.EXE в Windows, вставьте чистую дискету в дисковод и выберите sbootmgr.dsk как исходный образ. Загрузившись с этой дискеты, вы сможете загрузить ваш DVD.&lt;br /&gt;
&lt;br /&gt;
Различия в файловых системах Windows и Linux в этом случае к делу не относятся, так как все данные поступают с DVD, имеющего другую файловую систему (ту же, что у CD). Использование Windows-инструментов для создания разделов Linux способно порождать трудности. Посредством Partition Magic удалите созданные Linux-разделы, включая swap, и оставьте просто неразмеченное место. Затем велите установщику Ubuntu использовать все свободное место на диске&lt;br /&gt;
(«свободное» в этом случае означает «неразмеченное», а не место внутри размеченных разделов).&lt;br /&gt;
&lt;br /&gt;
Ваш компьютер может «тормозить» также из-за памяти. 128 МБ – очень мало по сегодняшним стандартам: современный рабочий стол, вроде KDE в Kubuntu, будет&lt;br /&gt;
работать очень медленно. Версия Ubuntu на LXFDVD наряду с жадными до ресурсов Gnome и KDE включает нетребовательный рабочий стол Xfce, используемый в Xubuntu.&lt;br /&gt;
&lt;br /&gt;
===Большой вопрос===&lt;br /&gt;
&lt;br /&gt;
'''Администратор через браузер'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас учетная запись web-хостинга, предоставляющего Apache, PHP и MySQL. Мы имеем FTP-доступ для загрузки файлов, но не доступ к командам оболочки, из-за чего настройка базы данных SQL и других вещей затруднительна. Нам нельзя устанавливать на сервер дополнительное ПО. Мы могли бы поискать&lt;br /&gt;
другое место с shell-доступом, но нам нравится та цена, которую мы здесь платим. Есть ли способ получить административный доступ через web-браузер, и что для этого надо сделать?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хотя переход на хостинг, поддерживающий SSH-доступ, добавит гибкости, существуют решения, привлекательные даже в случае отсутствия командной строки.&lt;br /&gt;
Основное из них – phphMyAdmin (www.phpmyadmin.net). Как видно из имени, это программа администрирования MySQL, написанная на PHP; она устанавливается как набор файлов в вашей учетной записи после настройки безопасности и конфигурации. Многие web-хостинги предоставляют доступ к базам данных только с локальных IP, чтобы скрипты запускались на сервере, а не на вашей машине.&lt;br /&gt;
&lt;br /&gt;
Загрузите и распакуйте один из tar-архивов с сайта phpMyAdmin (они различаются только языком и методом сжатия). Традиционный метод конфигурирования phpMyAdmin – создать подходящий файл config.inc.php, взяв за основу включенные примеры, но есть также и скрипт установки, который запускается всего один раз после копирования файлов на сервер. Прежде чем что-то делать, убедитесь, что это безопасно. Любой получивший доступ к директории phpMyAdmin может читать и изменять вашу базу данных, так что обезопасьте себя с помощью файла .htaccess (или другим способом), чтобы подключение было возможно только с защищенной паролем учетной записи. По возможности, включите его на раздел вашего пространства хостинга, доступный через HTTPS, ведь вы передаете пароль при запуске установочного скрипта. Создайте директорию config в директории phpmyadmin и скопируйте всю директорию (включая .htaccess) на сервер хостинга.&lt;br /&gt;
&lt;br /&gt;
Зайдите на https://www.ваш.сайт/phpmyadmindir/setup.php и заполните поля своего подключения к MySQL. Теперь перейдите на https://www.ваш.сайт/phphmyadmindir/ – вы увидите список ваших баз данных. Выбор одной из них покажет входящие в нее таблицы. Отсюда можно просматривать, выполнять запросы и модифицировать ваши SQL-таблицы, как вам нравится. Если у вас PostgreSQL, а не MySQL, то существует аналогичная программа, phpPgAdm, доступная по адресу http://phppgadmin.sourceforge.net.&lt;br /&gt;
&lt;br /&gt;
Не только SQL-базы можно администрировать через web-интерфейс. Webmin позволяет изменять все, что вообще разрешено менять на *nix-машинах, не ограничиваясь серверами. В вашем случае Webmin невыгоден потому, что должен быть установлен и запущен от имени root, поскольку использует собственный встроенный сервер, отличающийся от подобных Apache. Спросите об этом своего хостинг-провайдера: может, он уже установил Webmin или его бедного родственника Usermin. Если нет, то он может захотеть его установить: это будет выгодно всем заказчикам. Он также может установить для вас phpMyAdmin, и у вас не будет нужды тратить на это свою дисковую квоту и трафик.&lt;br /&gt;
&lt;br /&gt;
====Шаг за шагом: соединяемся с phpMyAdmin====&lt;br /&gt;
&lt;br /&gt;
#'''Прячем свой пароль'''&amp;lt;br&amp;gt;Перед копированием файлов phpMyAdmin (pMA) на ваш web-сервер, убедитесь, что они защищены от посторонних взглядов.&lt;br /&gt;
#'''Мастер конфигурации'''&lt;br /&gt;
Загрузив setup.php в своем браузере, вы сможете легко настроить phpMyAdmin, но подключайтесь через HTTPS, чтобы держать пароль в секрете.&lt;br /&gt;
#'''Ручная конфигурация'''&lt;br /&gt;
Или же сконфигурируйте pMA перед загрузкой файлов на web-сервер, отредактировав config.sample.inc.php и сохранив его как config.inc.php.&lt;br /&gt;
#'''Вот оно!'''&lt;br /&gt;
pMA позволяет работать с данными и схемами MySQL одним кликом мышки. Его можно использовать и для создания резервных копий вашей базы.&lt;br /&gt;
#'''А также PostgreSQL'''&lt;br /&gt;
Пользователям PostgreSQL не придется терять чувство превосходства – для них есть phpPgAdm, эквивалент pMA.&lt;br /&gt;
#'''Глобальная конфигурация'''&lt;br /&gt;
C Webmin вы можете сконфигурировать на компьютере все что угодно... точнее, все, что позволит владелец компьютера.&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:%D0%9E%D1%82%D0%B2%D0%B5%D1%82%D1%8B</id>
		<title>LXF98:Ответы</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:%D0%9E%D1%82%D0%B2%D0%B5%D1%82%D1%8B"/>
				<updated>2008-04-01T17:38:40Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Ответы==&lt;br /&gt;
&lt;br /&gt;
===BIOS с «тараканами»===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я купил, как мне казалось, самый лучший компьютер по соотношению цена-производительность, и продолжаю считать его таковым. Но кое-что меня беспокоит. При включении компьютера и выборе загрузки Ubuntu из Grub, на экран выводится сообщение об ошибке MP-BIOS 8254 и каком-то неподключенном таймере. Также почти все дистрибутивы с DVD журнала не запускаются без опции noapic в строке загрузки. При загрузке LXFDVD95 выводится текст&lt;br /&gt;
 MP-BIOS bug: 8254 timer not connected to IO_APIC&lt;br /&gt;
 Kernel panic - not syncing: OI_APIC + timer doesn’t work!&lt;br /&gt;
&lt;br /&gt;
Искал и в Google, и в справке Ubuntu, но нашел только скудные заявления, что мой таймер не работает. Думаю, что это как-то связано с моей видеокартой&lt;br /&gt;
NVIDIA 7300LE (известно, что дешевые вещи обходятся дорого), но в чем все-таки причина? Возможно, пригодится другой факт. Все 3D-изображения на моем&lt;br /&gt;
компьютере становятся нестабильными и содержат множество ошибок. Нужно ли мне покупать видеокарту получше?&lt;br /&gt;
&lt;br /&gt;
:Иво Иванов [Ivo Ivanov]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Дело не в видеокарте: причиной ваших проблем с графикой может быть APIC (Advanced Programmable Interrupt Controller [Расширенный программируемый контроллер прерываний, – прим. пер.]), управляющий таймингами и прерываниями для различных компонентов вашей материнской платы, включая контроллер дисков и разъемы видеокарт. Контроллеры ACPI довольно часто отходят от спецификаций: многие изготовители полагают, что если плата «работает в Windows», то стандартам следовать не обязательно. Вы уже обнаружили, что надо добавить noapic в параметры загрузки LiveCD, но необходимо также делать это при загрузке с жесткого диска.&lt;br /&gt;
&lt;br /&gt;
Но сначала проверьте наличие обновлений BIOS на сайте изготовителя: вполне возможно, что ваша проблема была решена в последней версии прошивки.&lt;br /&gt;
Если нет, придется переделать меню загрузки, чтобы всегда использовалась опция noapic. Ubuntu не включает программу для настройки процесса загрузки, и&lt;br /&gt;
Вам придется править файл конфигурации вручную. Нажмите Alt+F2 и наберите&lt;br /&gt;
&lt;br /&gt;
 sudo gedit /boot/grub/menu.lst&lt;br /&gt;
&lt;br /&gt;
Это откроет файл конфигурации меню загрузки в текстовом редакторе. Большинство строк там начинаются с # – это комментарии, и их можно игнорировать. Найдите первую строку, начинающуюся с title; это первый пункт меню загрузки. Вам нужно изменить следующую строчку, начинающуюся с kernel,&lt;br /&gt;
добавив noapic в ее конец, обязательно через пробел после последнего слова в строке. Файл сохраните. После перезагрузки сообщение об ошибке BIOS&lt;br /&gt;
исчезнет, и 3D-графика станет стабильной. Видимо, будут и другие улучшения в работе, потому что «глючная» прошивка APIC способна вызывать разные проблемы, от снижения скорости доступа к дискам до неверного хода часов.&lt;br /&gt;
&lt;br /&gt;
===Беспроводная сеть, ау!===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я уже использовал Linux в 1996–1997 годах для запуска UNIX-приложений на ноутбуке, так как Linux был бесплатным, а Sparcbook стоил 10 000 фунтов. Позже я решил, что было бы неплохо использовать его снова и установить его на моем домашнем DELL XPS m1210. Порывшись в Интернете, я нашел, что для моей машины идеален Slackware 10, благополучно установил его и использовал Lilo для двойной загрузки Windows Vista и Linux.&lt;br /&gt;
&lt;br /&gt;
К сожалению, я не смог заставить работать беспроводную сетевую карту; точнее, я не знаю, как это сделать. Я смотрел в Сети, находил там решения, но все они были на чуждом для меня языке. За прошедшие десять лет я очень многое перезабыл и чувствую себя полным «чайником». Моя беспроводная карта: Intel PRO/Wireless 3945ABG Network Connection.&lt;br /&gt;
&lt;br /&gt;
:Грег [Greg]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существует официальный драйвер от Intel для этой беспроводной карты, найти его можно здесь: http://ipw3945.sourceforge.net, но он требует довольно свежего ядра для работы, как минимум 2.6.13. Slackware 10 старше трех лет и значительно старше этого драйвера, и использует ядро версии 2.4. Для нормальной работы нового аппаратного обеспечения Вам нужен дистрибутив – и в частности, ядро – такой же новый, как оборудование. Если вы хотите держаться Slackware, то установите новейшую версию 12.0: это первый релиз с ядром 2.6, которое необходимо вашей беспроводной карте, по умолчанию. Пакеты для использования вашей карты со Slackware 12 есть на сайте ftp://ftp.slackware.at/slackware-12.0/extra/intel-wlan-ipw3945.&lt;br /&gt;
&lt;br /&gt;
Как альтернативу, можно установить любой другой дистрибутив, в репозитории которого есть пакет ipw3945. Неплохой выбор – Ubuntu c DVDLXF94,&lt;br /&gt;
поскольку драйвер ipw3945 включен в установку по умолчанию и должен «просто работать». В Fedora 7 с DVDLXF95 также имеется ipw3945, но перед его&lt;br /&gt;
установкой требуется добавить репозиторий ATrpms в менеджер пакетов. Как добавить репозиторий, можно прочитать по адресу http://atrpms.net/install.html. Этот сайт содержит отнюдь не одни беспроводные драйверы – там множество самых разнообразных пакетов – и заслуживает добавления в ваш список репозиториев.&lt;br /&gt;
&lt;br /&gt;
===Желание синхронности===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хочу перейти на Linux, но боюсь, что синхронизация Microsoft Outlook на моем PDA не будет работать. Еще у меня на PDA стоит Money for PPC, это важная для меня программа – предоставляет ли GnuCash похожие возможности?&lt;br /&gt;
&lt;br /&gt;
:Герхард Штигер [Gerhard Stieger]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Синхронизацию Linux-приложений с устройствами Windows Pocket PC позволяет производить каркас SyncCE (www.synce.org/index.php/SynCE-Wiki); степень его дружелюбия к пользователю и качество зависят от приложения. Проще всего синхронизируются приложения пакета KDE PIM – KMail, Kontact, KAddressBook и KOrganiser. Чтобы сделать это, необходимо установить пакет synce-kde, присутствующий во многих дистрибутивах, но не во всех устанавливаемый по умолчанию. После установки системы запустите менеджер пакетов и установите synce-kde, если он не помечен как установленный. После этого вы&lt;br /&gt;
сможете синхронизировать свою почту и контакты.&lt;br /&gt;
&lt;br /&gt;
Однако это потребует запуска системы на базе KDE, типа Mandriva, Kubuntu, PCLinuxOS или SUSE. Все они присутствуют на DVD-дисках LinuxFormat, но вы&lt;br /&gt;
также можете найти ссылки на них и на множество других дистрибутивов на www.distrowatch.com.&lt;br /&gt;
&lt;br /&gt;
Синхронизация ваших записей о финансах – это другая тема. GnuCash может импортировать стандартные учетные записи QIF, но не экспортировать&lt;br /&gt;
их. Зато KMyMoney (http://kmymoney2.sourceforge.net) умеет делать и импорт, и экспорт, так что Вы сможете импортировать файлы с вашего PDA и переносить их назад после модификации. Те, кто не разбираются в бухгалтерском учете профессионально или не имеют опыта работы, вероятно, сочтут KMyMoney более легким, чем GnuCash. KMyMoney – тоже KDE-приложение, оно должно присутствовать в любом из перечисленных выше дистрибутивов.&lt;br /&gt;
&lt;br /&gt;
===Перезапись URL===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пишу web-сайт со множеством PNG-изображений – большинство из них использует прозрачность. Он великолепно работает во всех последних версиях браузеров, но (как и ожидалось) не в IE6. Чтобы исправить это, я создал GIF-версии для каждой картинки (а также таблицу стилей), загружаемые вместо PNG, если пользователь использует IE6.&lt;br /&gt;
&lt;br /&gt;
Я хочу сделать это с помощью mod_rewrite и .htaccess, чтобы images/png/image1.png переписывался в images/gif/image1.gif. Вот мой файл .htaccess:&lt;br /&gt;
&lt;br /&gt;
 RewriteEngine On&lt;br /&gt;
 RewriteCond %{HTTP_USER_AGENT} “MSIE 6”&lt;br /&gt;
 RewriteRule /images/png/([A-Za-z0-9])+\.png$&lt;br /&gt;
 /images/gif/$1+\.gif&lt;br /&gt;
 RewriteCond %{HTTP_USER_AGENT} “MSIE 6”&lt;br /&gt;
 RewriteRule css/style.css css/iestyle.css&lt;br /&gt;
&lt;br /&gt;
Перезапись CSS работает четко, но картинки (PNG на GIF) не заменяются. &lt;br /&gt;
&lt;br /&gt;
:OnlyTheTony, с форумов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вы предложили хорошую идею использовать mod_rewrite для смены URL. Сбой происходит потому, что Вы используете + для объединения строк, а mod_rewrite работает с регулярными выражениями, где + означает «одно или более повторений», а не оператор конкатенации.&lt;br /&gt;
&lt;br /&gt;
В регулярных выражениях не нужно соединять строки: чтобы отметить неизменяемые части, используются скобки, а $1, $2... включат их в путь назначения, как у Вас и делается, и все является либо текстом, либо символами регулярных выражений. Так, чтобы заменить последнее вхождение foo в строке на bar,&lt;br /&gt;
потребуется выражение&lt;br /&gt;
&lt;br /&gt;
 /(.*)foo(.*)/$1bar$2/&lt;br /&gt;
&lt;br /&gt;
В вашем случае надо взять нечто, начинающееся с image/png и заканчивающееся на .png, и заменить везде png на gif. Вы можете сделать это, вставив&lt;br /&gt;
одну из следующих строк вместо первого правила RewriteRule:&lt;br /&gt;
&lt;br /&gt;
  RewriteRule /images/png/(.*)\.png$ /images/gif/$1\.gif&lt;br /&gt;
  RewriteRule /(.*)/png/(.*)\.png$ /$1/gif/$2\.gif&lt;br /&gt;
&lt;br /&gt;
Первая строка легче читается, зато вторая также будет работать с изображениями в других директориях.&lt;br /&gt;
&lt;br /&gt;
===Восстановить NTFS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У меня внешний жесткий диск, отформатированный в NTFS. Мне нужно произвести его дефрагментацию, но я не хочу потерять все данные на нем. Можно ли выполнить дефрагментацию NTFS из Linux? Я запускаю Ubuntu Feisty Fawn на старом компьютере PC2800.&lt;br /&gt;
&lt;br /&gt;
:churst1, с форумов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Короткий ответ – нет, нельзя. Во-первых, почему на этом диске NTFS? Если с него загружают Windows, любые попытки выполнить дефрагментацию из-под Linux могут привести к ее незагружаемости. Но если диск уже содержит Windows, то почему бы не провести дефрагментацию из нее – Windows ведь не только для того, чтобы баловаться игрушками. Если же диск используется только для хранения данных, вы можете снизить фрагментацию, скопировав все их с него, отформатировав диск и записав данные обратно. Это действие требует драйвера файловой системы NTFS с полной поддержкой записи, такой, как коммерческая Paragon NTFS for Linux, которую мы рассматривали в прошлом месяце, или NTFS-3G, включенная в репозиторий Ubuntu. Также необходим пакет ntfsprogs, поэтому запустите Synaptic и инсталлируйте оба.&lt;br /&gt;
&lt;br /&gt;
Теперь надо проделать небольшую работу по открытию терминала, выбору директории, достаточно просторной для хранения содержимого NTFS-диска, и&lt;br /&gt;
запуску следующей команды:&lt;br /&gt;
&lt;br /&gt;
 tar cf ntfs.tar /mnt/ntfs &amp;amp;&amp;amp; umount /mnt/ntfs &amp;amp;&amp;amp; mkntfs /dev/sda1 &amp;amp;&amp;amp; mount /dev/sda1/mnt/ntfs -t ntfs-3g &amp;amp;&amp;amp; tar xf ntfs.tar -C /mnt/ntfs&lt;br /&gt;
&lt;br /&gt;
Все это надо записать в одну строку. Мы сцепили вместе две долгоиграющих команды tar и mkntfs – это позволит Вам не быть сиделкой у компьютера, но каж-&lt;br /&gt;
дая следующая команда выполнится, только если предыдущая отработает без ошибок (совершенно незачем переформатировать диск, если произойдет сбой&lt;br /&gt;
в копировании). Данный пример подразумевает, что Ваш диск – /dev/sda1 и смонтирован он в /mnt/NTFS. Перед запуском команды убедитесь, что подставлены&lt;br /&gt;
правильные пути для Вашего компьютера.&lt;br /&gt;
&lt;br /&gt;
Если у Вас мало места для хранения данных, можете создать сжатый архив, но это продлится гораздо дольше, чем простое копирование с диска. Вы можете&lt;br /&gt;
сделать это так:&lt;br /&gt;
&lt;br /&gt;
 tar czf ntfs.tar.gz /mnt/ntfs &amp;amp;&amp;amp; umount /mnt/ntfs &amp;amp;&amp;amp; mkntfs /dev/sda1 &amp;amp;&amp;amp; mount /dev/sda1 /mnt/ntfs -t ntfs-3g &amp;amp;&amp;amp; tar xf ntfs.tar.gz -C /mnt/ntfs&lt;br /&gt;
&lt;br /&gt;
Если Вы используете NTFS только ради чтения из Windows (а зачем она еще нужна?) и только с Вашим компьютером, где стоит Windows, лучшим решением&lt;br /&gt;
будет переформатирование диска в ext2 и установка драйвера ext2 с www.fs-driver.org в Windows. Это снимет проблему фрагментации, и Вы получите луч-&lt;br /&gt;
шее быстродействие в Linux. В вышеприведенных командах для этого надо заменить mkntfs на mke2fs и удалить&lt;br /&gt;
 &lt;br /&gt;
 -t ntfs-3g&lt;br /&gt;
&lt;br /&gt;
из команды mount.&lt;br /&gt;
&lt;br /&gt;
===Нужен легковес===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я присматриваю ОС для AMD K6/200. Думал, что NetBSD – лучший выбор, но максимум, чего я добился в результате установки – это режим командной строки. XFree86 (не XOrg) требует отдельной настройки. Я инвалид, и лишние усилия для меня проблема. Существуют ли «простые» версии, наподобие PC-BSD или Desktop BSD – легких версий FreeBSD?&lt;br /&gt;
&lt;br /&gt;
Пробовал DSL на машине P2/400 – ничего особенного, но я открыл DSL-N. Там даже был настоящий тестовый процессор! Что будет с производительностью, если установить Gnome или KDE на NetBSD или DSL-N? Fedora Core с Gnome работает на P2/400 с жуткими тормозами.&lt;br /&gt;
&lt;br /&gt;
:Гэри Причард [Gary Prichard]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Процессор K6/200 по нынешним меркам очень медленный, поэтому необходим «легкий» дистрибутив для получения терпимой производительности. А в первую очередь нужен нетребовательный оконный менеджер: среды Gnome и KDE к таковым не относятся. Гораздо лучше FluxBox, Xfce или IceWM. С учетом текстового процессора, Xfce был бы лучшим выбором: он использует GTK, как и AbiWord. Раз ресурсы у вас ограничены, выбирайте набор приложений, использующих одни и те же библиотеки, чтобы Ваша система работала более эффективно.&lt;br /&gt;
&lt;br /&gt;
Кстати о ресурсах: один из лучших способов увеличения производительности любой Linux-системы – увеличение объема ОЗУ. Потратив немного фунтов/&lt;br /&gt;
долларов/евро/песо на дополнительную память, вы получите больший прирост скорости, чем при вложении тех же средств в более быстрый процессор.&lt;br /&gt;
&lt;br /&gt;
Есть целый набор дистрибутивов, предназначенных для «слабых» систем: вы уже открыли для себя DSL и DSL-N, но советую также изучить Puppy Linux&lt;br /&gt;
с www.puppylinux.org. DSL ограничен объемом ISO-образа в 50 МБ, а Puppy Linux больше раза в два. Это означает, что он включает гораздо больше программ,&lt;br /&gt;
например, текстовый процессор AbiWord и сопутствующие офисные приложения, SeaMonkey (новое имя Mozilla) для Web и почты и много чего еще. Недостаток&lt;br /&gt;
Puppy в том, что процесс инсталляции на жесткий диск очень запутан, так как он спроектирован как LiveCD-система. Зато вы можете запускать его прямо&lt;br /&gt;
с CD, используя жесткий диск только для хранения данных и настроек.&lt;br /&gt;
&lt;br /&gt;
Другая альтернатива – правда, потяжелее – это Zenwalk (www.zenwalk.org). Если объем Вашего ОЗУ такой, какой обычно использовался на 200 МГц машинах, когда они были в новинку, то его не хватит; но Zenwalk дает больше функций, чем маленькие дистрибутивы.&lt;br /&gt;
&lt;br /&gt;
Запуск любой ОС на K-6/200 – это всегда компромисс между возможностями и производительностью, но он вполне возможен; тем более, если увеличить ОЗУ.&lt;br /&gt;
&lt;br /&gt;
===Работка для Ubuntu===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пытаясь запустить или инсталлировать Ubuntu, я получаю следующее сообщение после появления заставки:&lt;br /&gt;
&lt;br /&gt;
 unable to access tty job control turned off&lt;br /&gt;
&lt;br /&gt;
и возвращаюсь в командную строку. Ubuntu явно пытается обратиться к моему флоппи-дисководу, потому что перед появлением сообщения об ошибке&lt;br /&gt;
он включается.&lt;br /&gt;
&lt;br /&gt;
:Дэвид Лоусон [David Lowson]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Похоже, что ошибка связана с ядром: не найдя загрузочный диск, оно ищет его на всех подряд устройствах, прописанных в BIOS. Потому-то дисковод и начинает работать. Эта проблема не у Вас одного, и существует более чем одно решение.&lt;br /&gt;
&lt;br /&gt;
Первое заключается в загрузке с установочного диска и правке fstab в установленной системе. Если ваш корневой раздел находится на /dev/sda1, нужны&lt;br /&gt;
следующие команды:&lt;br /&gt;
&lt;br /&gt;
 sudo -i&lt;br /&gt;
 mount /dev/sda1 /mnt&lt;br /&gt;
 gedit /mnt/etc/fstab&lt;br /&gt;
&lt;br /&gt;
В fstab вы должны найти строчку, где монтируется корневой раздел, она выглядит примерно так:&lt;br /&gt;
&lt;br /&gt;
 # /dev/sda1&lt;br /&gt;
 UUID=71f72f22-0a14-45b7-9057-f7b0bd9d819c /ext3&lt;br /&gt;
 defaults....&lt;br /&gt;
&lt;br /&gt;
UUID (Universally Unique IDentifier [Универсальный Уникальный Идентификатор]) позволяет Ubuntu находить корневой раздел, даже если сменилась точка&lt;br /&gt;
подключения устройства (например, при добавлении нового диска), но здесь бывают проблемы. Смените UUID=xyz на путь вашего устройства, и система снова начнет загружаться. Fstab в этом случае должен выглядеть так:&lt;br /&gt;
&lt;br /&gt;
 # /dev/sda1&lt;br /&gt;
 /dev/sda1 / ext3 defaults....&lt;br /&gt;
&lt;br /&gt;
Другое решение более экстремальное, так что используйте его только в случае провала трюка с fstab. Вы должны открыть корпус вашего компьютера и&lt;br /&gt;
отключить все лишние дисковые устройства, оставив только загрузочный диск и DVD, с которого выполнялась установка – но не забудьте сперва выключить&lt;br /&gt;
компьютер! Дисковод также отключите – достаточно отсоединить кабели питания от неиспользуемых устройств. После этого ваша система должна загружаться. Затем добавьте модуль piix к образу, который Ubuntu загружает при запуске, с помощью команд&lt;br /&gt;
&lt;br /&gt;
 sudo echo piix &amp;gt;&amp;gt;/etc/initramfs-tools/modules&lt;br /&gt;
 sudo update-initramfs -u&lt;br /&gt;
&lt;br /&gt;
Теперь вам надо выключить компьютер, снова подсоединить все устройства и перезапустить его. Данная ошибка замечена небольшим числом пользователей Ubuntu, у которых подключено много устройств. Сообщалось также, что если проблема во флоппи-дисководе, ее можно обойти, оставив в нем дискету, но мы не смогли этого проверить, и в любом случае, это не метод.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Сервис резервирования===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Откликаясь на Сравнение «Онлайн-резервирование» (LXF94), расскажу о мелкой, но, надеюсь, решаемой проблеме. Я использую iBackup, потому что делаю резервное копирование с моего ПК (Ubuntu) и компьютера жены с Windows. Она справляется с резервным копированием без моей помощи.&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что в процессе резервирования с моего компьютера, запускаемого cron, соединение часто прерывается. Когда это происходит, создаваемый stunnel рушится, уничтожая резервирование, и я получаю частично скопированные данные на iBackup-сервере. Есть ли способ восстановить все при обрыве&lt;br /&gt;
соединения или даже возобновить процесс после восстановления связи без потери данных?&lt;br /&gt;
&lt;br /&gt;
Сервер iBackup не позволяет настраивать время или дату для копируемых файлов, поэтому все файлы имеют дату и время копирования. Из-за этого я копирую сжатые в tar файлы и теряю возможности rsync.&lt;br /&gt;
&lt;br /&gt;
Это хороший повод переключиться на использование Rsync.net, но мне надо копировать файлы также и с компьютера моей жены. С iBackup у нее свое соединение и URL.&lt;br /&gt;
&lt;br /&gt;
:Гуус [Guus]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если Вы используете rsync, рестарт резервирования не должен вызывать проблем, потому что rsync «поднимается» с того места, где произошел сбой. Не исключено, что сервер устанавливает время копирования как время создания файлов, потому что так указано в опциях rsync. Вам нужно вызывать rsync с опцией --times для сохранения времени файлов. Опция --archive – комбинация нескольких опций резервирования, включая --times. Это снимет необходимость копирования tar-архивов на сервер и позволит копировать индивидуальные файлы в том виде, в котором они хранятся на вашей машине, что сильно упрощает перезапуск копирования.&lt;br /&gt;
&lt;br /&gt;
Я попробовал Rsync.net после чтения статьи (раньше у меня был Strongspace) и переключился на него полностью. Резервирование нескольких машин&lt;br /&gt;
выполняется легко, если Вы можете более или менее свободно обращаться с имеющейся памятью – удобно будет создать по директории на резервную копию&lt;br /&gt;
каждой машины. Rsync.net использует SSH для работы rsync, так что в stunnel нужды нет, и вы можете применить Duplicity для шифрования данных.&lt;br /&gt;
&lt;br /&gt;
Альтернативное решение – резервирование данных на локальный диск и синхронизация их с удаленным сервером. Преимущество здесь в том, что Ваш первый шаг резервирования локален: это позволяет быстро восстановить данные, но требует, чтобы компьютер для резервных копий был включен всегда, когда требуется их создать.&lt;br /&gt;
&lt;br /&gt;
===Новый диск хромает===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Найдя, что мне необходим жесткий диск побольше, я подключил новый диск как hdb, разбил его, как надо, скопировал файловые системы со старого диска (hda) и попытался загрузиться с нового диска. К сожалению, ничего не вышло.&lt;br /&gt;
&lt;br /&gt;
Я сделал копии разделов /, /boot, /usr, /home и некоторых других. Я также создал swap-раздел. /boot, первый основной раздел, сделал загрузочным. Я cпи-&lt;br /&gt;
сал MBR, используя lilo -M /dev/hdb. Далее монтировал /boot и / разделы, редактируя новую копию /etc/lilo.conf, (теперь на /mnt/hdb5) и запускал lilo -C /hdb5/etc/lilo.conf -b /dev/hdb1 – на вид вроде работало.&lt;br /&gt;
&lt;br /&gt;
Когда я пытаюсь загрузиться с нового диска, я прохожу через стадию загрузочного окна Lilo и вижу сообщения, заканчивающиеся на&lt;br /&gt;
&lt;br /&gt;
 initrd finished&lt;br /&gt;
 Freeing unused kernel memory&lt;br /&gt;
 Warning: Unable to open an input console&lt;br /&gt;
&lt;br /&gt;
После этого только нажатие на reset выводит компьютер из ступора. У меня стоит “Mandrakelinux release 10.2 (Limited Edition 2005) for i586”.&lt;br /&gt;
&lt;br /&gt;
:Родни М. Бэйтс [Rodney M Bates]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проблема не в загрузчике. Раз уж ядро загрузилось, значит, загрузчик свое дело сделал. Такая ошибка показывает на отсутствие файла в /dev – возможно, в /dev/console. Хотя динамические файловые системы dev, типа udev и ее предшественника devfs, создают записи устройств в /dev автоматически, некоторые из них нужны еще до запуска devfs/udev. Подозреваю, что вы пропустили содержимое /dev, копируя свой корневой раздел – забыли включить его в команду копирования или исключили «прочие» файловые системы при копировании (вы не пояснили, как именно копировали файловые системы, но cp, rsync и tar имеют опции по исключению других файловых систем).&lt;br /&gt;
&lt;br /&gt;
Содержимое вашей исходной директории /dev теперь скрыто, потому что новая, динамическая /dev была примонтирована поверх нее, но, как вы можете&lt;br /&gt;
видеть, все еще доступна.&lt;br /&gt;
&lt;br /&gt;
 mkdir /mnt/tmp&lt;br /&gt;
 mount --bind / /mnt/tmp&lt;br /&gt;
&lt;br /&gt;
позволит обратиться ко всему корневому разделу через /mnt/tmp без других подмонтированных файловых систем. /mnt/tmp/home должен быть пуст, а&lt;br /&gt;
/tmp/mnt/dev должен содержать файлы устройств. Скопируйте их в /dev на Вашем новом разделе, и ошибка при загрузке исчезнет. Самый простой способ&lt;br /&gt;
убедиться, что новый корневой раздел содержит все файлы со старого –&lt;br /&gt;
&lt;br /&gt;
  rsync -a --delete /mnt/tmp/ /mnt/newroot/&lt;br /&gt;
&lt;br /&gt;
===Рота, подъем!===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для Mac OS X и Windows существуют специальные программы, которые позволяют организовать включение компьютера по расписанию. А есть ли что-нибудь подобное в Linux?&lt;br /&gt;
&lt;br /&gt;
:Анатолий Евдокимов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Самый простой способ организовать «подъем по распорядку» – это воспользоваться функцией ACPI WakeUp, которой обладает большинство современных материнских плат. Linux предоставляет к ней два интерфейса.&lt;br /&gt;
&lt;br /&gt;
В ядрах старше 2.6.22 используется файл /proc/acpi/alarm, в который можно записать дату в формате «ГГГГ-ММ-ДД ЧЧ:ММ:СС», например,  echo “2007-10-18 23:30:00” &amp;gt;/proc/acpi/alarm после чего можно выключать компьютер обычным образом. Конечно, следует проследить, чтобы системный блок остался подключенным к электросети и выключатель на его блоке питания находился в положении ON.&lt;br /&gt;
&lt;br /&gt;
Ядра 2.6.22 и выше предоставляют новый интерфейс через файл /sys/class/rtc/rtcX/wakealarm. Для установки «будильника» в него следует записать&lt;br /&gt;
желаемый момент времени в виде числа секунд, прошедших с начала эпохи (1 января 1970 года, 00:00:00) – формате, столь любимом ветеранами Unix.&lt;br /&gt;
Чтобы отменить пробуждение, достаточно записать в файл значение 0. Кроме того, необходимо удостовериться, что аппаратные часы вашего компьютера&lt;br /&gt;
настроены на UTC, иначе пробуждение произойдет не в то время.&lt;br /&gt;
&lt;br /&gt;
Несмотря на свою простоту, данный способ не лишен недостатков. Так, некоторые материнские платы отказываются принимать во внимание значение, установленное программно, и отдают предпочтение времени, указанному непосредственно через BIOS. Исходя из этого, рекомендуется отключить в BIOS данную функцию – обычно она называется как-то вроде Wake from RTC/Alarm. Иногда пробуждение по таймеру автоматически отменяется, если после его установки в аппаратные часы были внесены изменения – а это делают многие дистрибутивы при выключении. Поищите команду hwclock в скриптах /etc/init.d, и если&lt;br /&gt;
она там встречается, обеспечьте, чтобы время пробуждения устанавливалось после нее повторно.&lt;br /&gt;
&lt;br /&gt;
Можно пойти другим путем и воспользоваться программой nvram-wakeup (http://http//sourceforge.net/projects/nvram-wakeup), изменяющей установки&lt;br /&gt;
прямо в энергонезависимой памяти BIOS (отсюда и название). Поскольку формат хранения данных в памяти меняется от производителя к производителю,&lt;br /&gt;
это получится только на поддерживаемых программой материнских платах, зато будет работать, как часы.&lt;br /&gt;
&lt;br /&gt;
===Grub, который загрузит всех===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Надоело каждый раз устанавливать в BIOS загрузку с CD, чтобы попробовать новый дистрибутив. Есть ли способ добавить соответствующую опцию в Grub?&lt;br /&gt;
&lt;br /&gt;
:Иван Пуренко&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Научить Grub запускать загрузчик с CD несложно, но для решения этой задачи придется привлечь два других проекта: MEMDISK &lt;br /&gt;
(http://syslinux.zytor.com/memdisk.php) и Smart Boot Manager (http://btmgr.sourceforge.net/about.html или Главное/SBM на нашем DVD). MEMDISK является частью SYSLINUX и должен быть доступен в вашем дистрибутиве в виде одноименного пакета. Разверните данный пакет и извлеките из него файл memdisk,&lt;br /&gt;
который следует скопировать в каталог /boot. Далее, возьмите из каталога Главное/SBM на первой стороне нашего DVD файл btmgr.floppy.bz2 – это образ загрузочной дискеты Smart Boot Manager. Нам потребуются ее первые 18 КБ: откройте root-терминал и наберите &lt;br /&gt;
&lt;br /&gt;
 dd if=btmgr.floppy of=/boot/sbm.bin bs=1k count=18&lt;br /&gt;
&lt;br /&gt;
Наконец, необходимо создать соответствующую запись в меню Grub:&lt;br /&gt;
&lt;br /&gt;
 title Boot from CD&lt;br /&gt;
              kernel /boot/memdisk&lt;br /&gt;
              initrd /boot/sbm.bin&lt;br /&gt;
&lt;br /&gt;
==Врезки==&lt;br /&gt;
&lt;br /&gt;
===Коротко про…===&lt;br /&gt;
&lt;br /&gt;
'''MD5'''&lt;br /&gt;
&lt;br /&gt;
''Как избежать сравнения больших потоков чисел.''&lt;br /&gt;
&lt;br /&gt;
Если вы загружали ISO-образы различных дистрибутивов, то, безусловно, видели рядом с ISO-файлами файлы с именами типа cooldistro1.0.iso.md5, и, возможно, задавались вопросом: а зачем они? Сумма MD5 – это 128-битный криптографический хэш содержимого файла. Один и тот же файл всегда генерирует&lt;br /&gt;
одну и ту же сумму, но стоит изменить в нем всего один бит, и сумма окажется совершенно иной. MD5 был первоначально разработан для обеспечения безопасности. Проверив сумму MD5, вы можете убедиться, что файл не был подменен.&lt;br /&gt;
&lt;br /&gt;
Ныне MD5 также используется для проверки случайного повреждения во время передачи. При загрузке ISO-образа, скачайте заодно и файл MD5. Прежде чем &lt;br /&gt;
тратить время на запись файла на компакт-диск и попытки с него загрузиться, проверьте, не был ли файл поврежден, командой:&lt;br /&gt;
&lt;br /&gt;
 md5sum cooldistro1.0.iso&lt;br /&gt;
&lt;br /&gt;
Она вернет строку шестнадцатеричных символов, подобную хранящейся в cooldistro1.0.iso.md5. Конечно, ручное сличение 128-битных шестнадцатеричных чисел&lt;br /&gt;
друг с другом, возможно, не самое лучшее времяпрепровождение (спешу добавить – для меня), особенно если вы скачали много файлов, так что предоставим&lt;br /&gt;
программе сделать это за нас: &lt;br /&gt;
&lt;br /&gt;
 md5sum --check cooldistro1.0.iso.md5&lt;br /&gt;
&lt;br /&gt;
Эта команда позволит узнать, соответствует ли контрольная сумма оригиналу или нет. MD5-файл может содержать контрольные суммы нескольких файлов.&lt;br /&gt;
Например, исходные тексты Gnome состоят из множества файлов, а их суммы MD5 содержатся в одном. По договоренности, этот файл часто называется MD5SUMS.&lt;br /&gt;
Можно загрузить все необходимые вам файлы и проверить их за один раз:&lt;br /&gt;
&lt;br /&gt;
 md5sum -c MD5SUMS&lt;br /&gt;
&lt;br /&gt;
Кроме того, можно создать файл MD5SUMS:&lt;br /&gt;
&lt;br /&gt;
 ms5sum *.iso &amp;gt;MD5SUMS&lt;br /&gt;
&lt;br /&gt;
SHA1-файлы работают по аналогичному принципу, но с несколько более высоким уровнем безопасности. Синтаксис тот же, только используется программа&lt;br /&gt;
sha1sum.&lt;br /&gt;
&lt;br /&gt;
===Часто задаваемые вопросы===&lt;br /&gt;
&lt;br /&gt;
'''FISH'''&lt;br /&gt;
&lt;br /&gt;
''Не путайте с языком программирования FISh…''&lt;br /&gt;
&lt;br /&gt;
*'''Тогда что это такое?'''&lt;br /&gt;
&lt;br /&gt;
Это сокращение от FIles (Файлов), передаваемых через протокол (оболочки) SHell.&lt;br /&gt;
&lt;br /&gt;
*'''Стоп, не так заумно. Что он делает?''' Проще говоря, он дает доступ к файлам на удаленной машине только через SSH (или RSH). На удаленной машине не&lt;br /&gt;
нужно никакого специального программного обеспечения, кроме SSH и стандартных команд оболочки. Ваш компьютер должен иметь установленными FISH-программы для доступа к этим файлам.&lt;br /&gt;
&lt;br /&gt;
*'''Где такое ПО можно взять?'''&lt;br /&gt;
&lt;br /&gt;
Скорее всего, оно у вас есть; наберите&lt;br /&gt;
&lt;br /&gt;
 cd /#sh:user@hostname/some/path&lt;br /&gt;
&lt;br /&gt;
в Midnight Commander, и вы получите список содержимого /some/path на удаленной машине. Если вы опустите часть user@, то будет использоваться текущее&lt;br /&gt;
имя пользователя.&lt;br /&gt;
&lt;br /&gt;
*'''Выходит, через FISH кто-то может читать файлы на моем компьютере?'''&lt;br /&gt;
&lt;br /&gt;
Нет, потому что используется SSH. Но, если вы не используете аутентификацию по ключу, необходимо установить пароль на учетную запись. В обоих случаях,&lt;br /&gt;
доступ сможете получить только вы.&lt;br /&gt;
&lt;br /&gt;
*'''Ну, ладно, но Midnight Commander малость устарел, верно? В смысле, это ведь консольная программа, а как насчет GUI?'''&lt;br /&gt;
&lt;br /&gt;
Если у вас KDE, откройте Konqueror (или мини-консоль Alt+F2) и наберите&lt;br /&gt;
&lt;br /&gt;
 fish://user@hostname/some/path&lt;br /&gt;
&lt;br /&gt;
Используя магию kio_slaves, эта команда загрузит удаленную директорию в Konqueror. Благодаря свойству разбиения Konqueror на два окна, легко&lt;br /&gt;
сравнивать или переписывать локальную и удаленную копии директорий.&lt;br /&gt;
&lt;br /&gt;
*'''Итак, я могу использовать это для управления файлами в Konqueror или Midnight Commander?'''&lt;br /&gt;
&lt;br /&gt;
Управление файлами – это еще не все. Любое приложение KDE, работающее с файлами, может получать их через FISH. Хотите отредактировать файл на вашем&lt;br /&gt;
web-сервере на другом конце земного шара? Просто наберите&lt;br /&gt;
&lt;br /&gt;
 kate fish://me@my.server iffypagename.html&lt;br /&gt;
&lt;br /&gt;
для загрузки его в Kate, и при нажатии Save модифицированный файл отправится обратно на сервер. Конечно, web-страницами вы не ограничены: столь же&lt;br /&gt;
удобно использовать это для редактирования файлов конфигурации.&lt;br /&gt;
&lt;br /&gt;
*'''Значит, можно использовать FISH для управления файлами на службах удаленного резервирования, вроде Rsync.net или StrongSpace?'''&lt;br /&gt;
&lt;br /&gt;
К сожалению, нет. FISH предусмотрен только для входа через учетную запись с правами запуска базовых команд оболочки. Эти сервисы не дают установить&lt;br /&gt;
полный вход в оболочку, и FISH не работает, но есть альтернатива. SSHFS (http://fuse.sourceforge.net/sshfs.html) – файловая система FUSE, позволяющая монтировать себя на учетных записях с возможностью только копировать файлы (scp или rsync), но требуется монтировать удаленную файловую систему, даже&lt;br /&gt;
если вам нужно взять всего один файл.&lt;br /&gt;
&lt;br /&gt;
===Вопрос-победитель (английская версия)===&lt;br /&gt;
&lt;br /&gt;
'''Загружаясь с DVD'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я хочу установить DVD с LXF94 на старый ПК в двойную загрузу с Windows 98SE. Это 7-летний Athlon 600 на материнской плате MSI со 128 МБ ОЗУ, двумя жесткими дисками и приводами DVD и CD-RW. Его BIOS не имеет опции загрузки с DVD. Загрузочная последовательность позволяет мне использовать CD-ROM как&lt;br /&gt;
первое устройство, и я спокойно могу ее изменить. На форумах мне советовали установить сперва Windows, если нужна двойная загрузка (а так и есть).&lt;br /&gt;
Я использовал Partition Magic V5 для создания и FAT, и Linux-разделов.&lt;br /&gt;
&lt;br /&gt;
По-моему, Linux использует другой формат файлов по сравнению с FAT, но я пытался использовать загрузочную дискету Windows для «установки» или «инсталляции» с DVD, и неудачно. Будет ли это работать, если диск будет CD-ROM? Дискета Red Hat 6.1 позволила мне запустить CD Red Hat, но она требует именно CD Red Hat и не работает с DVD LXF94. С CD Red Hat CD все получилось, но я прервал установку, потому что предпочитаю (K)ubuntu. Могу ли я сделать загрузочную дискету с DVD-драйверами на ней для установки DVD LXF94?&lt;br /&gt;
&lt;br /&gt;
:Джон Паттерсон [John Patterson]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С точки зрения BIOS, загрузка с CD и DVD – одно и тоже: DVD распознается просто как большой CD-ROM. Старые дистрибутивы Linux использовали загрузочную дискету для быстрого старта установки с CD, поскольку в то время множество компьютеров не поддерживало загрузку с CD. Ваше поколение техники должно&lt;br /&gt;
поддерживать загрузку с оптических дисков – неважно, CD это или DVD. Установив в BIOS загрузку с CD, Вы не должны иметь проблем. Но могут сказываться личные особенности BIOS: некоторые старые BIOS дают сбой, если подключено более одного оптического привода. Если вы установили в BIOS загрузку с CD и&lt;br /&gt;
не можете загрузиться с DVD, попробуйте отсоединить кабель от вашего CD-RW, чтобы остался только один оптический привод.&lt;br /&gt;
&lt;br /&gt;
В наше время использование загрузочной дискеты для установки с CD или DVD – это уже экзотика, но на всякий случай мы поместили одну на DVD. Smart Boot Manager в каталоге Essential/SBM на DVD как раз и есть загрузочная дискета для запуска с оптического или жесткого диска. Запустите RAWWRITE.EXE в Windows, вставьте чистую дискету в дисковод и выберите sbootmgr.dsk как исходный образ. Загрузившись с этой дискеты, вы сможете загрузить ваш DVD.&lt;br /&gt;
&lt;br /&gt;
Различия в файловых системах Windows и Linux в этом случае к делу не относятся, так как все данные поступают с DVD, имеющего другую файловую систему (ту же, что у CD). Использование Windows-инструментов для создания разделов Linux способно порождать трудности. Посредством Partition Magic удалите созданные Linux-разделы, включая swap, и оставьте просто неразмеченное место. Затем велите установщику Ubuntu использовать все свободное место на диске&lt;br /&gt;
(«свободное» в этом случае означает «неразмеченное», а не место внутри размеченных разделов).&lt;br /&gt;
&lt;br /&gt;
Ваш компьютер может «тормозить» также из-за памяти. 128 МБ – очень мало по сегодняшним стандартам: современный рабочий стол, вроде KDE в Kubuntu, будет&lt;br /&gt;
работать очень медленно. Версия Ubuntu на LXFDVD наряду с жадными до ресурсов Gnome и KDE включает нетребовательный рабочий стол Xfce, используемый в Xubuntu.&lt;br /&gt;
&lt;br /&gt;
===Большой вопрос===&lt;br /&gt;
&lt;br /&gt;
'''Администратор через браузер'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас учетная запись web-хостинга, предоставляющего Apache, PHP и MySQL. Мы имеем FTP-доступ для загрузки файлов, но не доступ к командам оболочки, из-за чего настройка базы данных SQL и других вещей затруднительна. Нам нельзя устанавливать на сервер дополнительное ПО. Мы могли бы поискать&lt;br /&gt;
другое место с shell-доступом, но нам нравится та цена, которую мы здесь платим. Есть ли способ получить административный доступ через web-браузер, и что для этого надо сделать?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хотя переход на хостинг, поддерживающий SSH-доступ, добавит гибкости, существуют решения, привлекательные даже в случае отсутствия командной строки.&lt;br /&gt;
Основное из них – phphMyAdmin (www.phpmyadmin.net). Как видно из имени, это программа администрирования MySQL, написанная на PHP; она устанавливается как набор файлов в вашей учетной записи после настройки безопасности и конфигурации. Многие web-хостинги предоставляют доступ к базам данных только с локальных IP, чтобы скрипты запускались на сервере, а не на вашей машине.&lt;br /&gt;
&lt;br /&gt;
Загрузите и распакуйте один из tar-архивов с сайта phpMyAdmin (они различаются только языком и методом сжатия). Традиционный метод конфигурирования phpMyAdmin – создать подходящий файл config.inc.php, взяв за основу включенные примеры, но есть также и скрипт установки, который запускается всего один раз после копирования файлов на сервер. Прежде чем что-то делать, убедитесь, что это безопасно. Любой получивший доступ к директории phpMyAdmin может читать и изменять вашу базу данных, так что обезопасьте себя с помощью файла .htaccess (или другим способом), чтобы подключение было возможно только с защищенной паролем учетной записи. По возможности, включите его на раздел вашего пространства хостинга, доступный через HTTPS, ведь вы передаете пароль при запуске установочного скрипта. Создайте директорию config в директории phpmyadmin и скопируйте всю директорию (включая .htaccess) на сервер хостинга.&lt;br /&gt;
&lt;br /&gt;
Зайдите на https://www.ваш.сайт/phpmyadmindir/setup.php и заполните поля своего подключения к MySQL. Теперь перейдите на https://www.ваш.сайт/phphmyadmindir/ – вы увидите список ваших баз данных. Выбор одной из них покажет входящие в нее таблицы. Отсюда можно просматривать, выполнять запросы и модифицировать ваши SQL-таблицы, как вам нравится. Если у вас PostgreSQL, а не MySQL, то существует аналогичная программа, phpPgAdm, доступная по адресу http://phppgadmin.sourceforge.net.&lt;br /&gt;
&lt;br /&gt;
Не только SQL-базы можно администрировать через web-интерфейс. Webmin позволяет изменять все, что вообще разрешено менять на *nix-машинах, не ограничиваясь серверами. В вашем случае Webmin невыгоден потому, что должен быть установлен и запущен от имени root, поскольку использует собственный встроенный сервер, отличающийся от подобных Apache. Спросите об этом своего хостинг-провайдера: может, он уже установил Webmin или его бедного родственника Usermin. Если нет, то он может захотеть его установить: это будет выгодно всем заказчикам. Он также может установить для вас phpMyAdmin, и у вас не будет нужды тратить на это свою дисковую квоту и трафик.&lt;br /&gt;
&lt;br /&gt;
====Шаг за шагом: соединяемся с phpMyAdmin====&lt;br /&gt;
&lt;br /&gt;
#'''Прячем свой пароль'''&lt;br /&gt;
Перед копированием файлов phpMyAdmin (pMA) на ваш web-сервер, убедитесь, что они защищены от посторонних взглядов.&lt;br /&gt;
#'''Мастер конфигурации'''&lt;br /&gt;
Загрузив setup.php в своем браузере, вы сможете легко настроить phpMyAdmin, но подключайтесь через HTTPS, чтобы держать пароль в секрете.&lt;br /&gt;
#'''Ручная конфигурация'''&lt;br /&gt;
Или же сконфигурируйте pMA перед загрузкой файлов на web-сервер, отредактировав config.sample.inc.php и сохранив его как config.inc.php.&lt;br /&gt;
#'''Вот оно!'''&lt;br /&gt;
pMA позволяет работать с данными и схемами MySQL одним кликом мышки. Его можно использовать и для создания резервных копий вашей базы.&lt;br /&gt;
#'''А также PostgreSQL'''&lt;br /&gt;
Пользователям PostgreSQL не придется терять чувство превосходства – для них есть phpPgAdm, эквивалент pMA.&lt;br /&gt;
#'''Глобальная конфигурация'''&lt;br /&gt;
C Webmin вы можете сконфигурировать на компьютере все что угодно... точнее, все, что позволит владелец компьютера.&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:%D0%9E%D1%82%D0%B2%D0%B5%D1%82%D1%8B</id>
		<title>LXF98:Ответы</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:%D0%9E%D1%82%D0%B2%D0%B5%D1%82%D1%8B"/>
				<updated>2008-04-01T17:37:47Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: Новая: ==Ответы==  ===BIOS с «тараканами»===  &amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;  Я купил, как мне казалось, самый лучший компь...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Ответы==&lt;br /&gt;
&lt;br /&gt;
===BIOS с «тараканами»===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я купил, как мне казалось, самый лучший компьютер по соотношению цена-производительность, и продолжаю считать его таковым. Но кое-что меня беспокоит. При включении компьютера и выборе загрузки Ubuntu из Grub, на экран выводится сообщение об ошибке MP-BIOS 8254 и каком-то неподключенном таймере. Также почти все дистрибутивы с DVD журнала не запускаются без опции noapic в строке загрузки. При загрузке LXFDVD95 выводится текст&lt;br /&gt;
 MP-BIOS bug: 8254 timer not connected to IO_APIC&lt;br /&gt;
 Kernel panic - not syncing: OI_APIC + timer doesn’t work!&lt;br /&gt;
&lt;br /&gt;
Искал и в Google, и в справке Ubuntu, но нашел только скудные заявления, что мой таймер не работает. Думаю, что это как-то связано с моей видеокартой&lt;br /&gt;
NVIDIA 7300LE (известно, что дешевые вещи обходятся дорого), но в чем все-таки причина? Возможно, пригодится другой факт. Все 3D-изображения на моем&lt;br /&gt;
компьютере становятся нестабильными и содержат множество ошибок. Нужно ли мне покупать видеокарту получше?&lt;br /&gt;
&lt;br /&gt;
:Иво Иванов [Ivo Ivanov]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Дело не в видеокарте: причиной ваших проблем с графикой может быть APIC (Advanced Programmable Interrupt Controller [Расширенный программируемый контроллер прерываний, – прим. пер.]), управляющий таймингами и прерываниями для различных компонентов вашей материнской платы, включая контроллер дисков и разъемы видеокарт. Контроллеры ACPI довольно часто отходят от спецификаций: многие изготовители полагают, что если плата «работает в Windows», то стандартам следовать не обязательно. Вы уже обнаружили, что надо добавить noapic в параметры загрузки LiveCD, но необходимо также делать это при загрузке с жесткого диска.&lt;br /&gt;
&lt;br /&gt;
Но сначала проверьте наличие обновлений BIOS на сайте изготовителя: вполне возможно, что ваша проблема была решена в последней версии прошивки.&lt;br /&gt;
Если нет, придется переделать меню загрузки, чтобы всегда использовалась опция noapic. Ubuntu не включает программу для настройки процесса загрузки, и&lt;br /&gt;
Вам придется править файл конфигурации вручную. Нажмите Alt+F2 и наберите&lt;br /&gt;
&lt;br /&gt;
 sudo gedit /boot/grub/menu.lst&lt;br /&gt;
&lt;br /&gt;
Это откроет файл конфигурации меню загрузки в текстовом редакторе. Большинство строк там начинаются с # – это комментарии, и их можно игнорировать. Найдите первую строку, начинающуюся с title; это первый пункт меню загрузки. Вам нужно изменить следующую строчку, начинающуюся с kernel,&lt;br /&gt;
добавив noapic в ее конец, обязательно через пробел после последнего слова в строке. Файл сохраните. После перезагрузки сообщение об ошибке BIOS&lt;br /&gt;
исчезнет, и 3D-графика станет стабильной. Видимо, будут и другие улучшения в работе, потому что «глючная» прошивка APIC способна вызывать разные проблемы, от снижения скорости доступа к дискам до неверного хода часов.&lt;br /&gt;
&lt;br /&gt;
===Беспроводная сеть, ау!===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я уже использовал Linux в 1996–1997 годах для запуска UNIX-приложений на ноутбуке, так как Linux был бесплатным, а Sparcbook стоил 10 000 фунтов. Позже я решил, что было бы неплохо использовать его снова и установить его на моем домашнем DELL XPS m1210. Порывшись в Интернете, я нашел, что для моей машины идеален Slackware 10, благополучно установил его и использовал Lilo для двойной загрузки Windows Vista и Linux.&lt;br /&gt;
&lt;br /&gt;
К сожалению, я не смог заставить работать беспроводную сетевую карту; точнее, я не знаю, как это сделать. Я смотрел в Сети, находил там решения, но все они были на чуждом для меня языке. За прошедшие десять лет я очень многое перезабыл и чувствую себя полным «чайником». Моя беспроводная карта: Intel PRO/Wireless 3945ABG Network Connection.&lt;br /&gt;
&lt;br /&gt;
:Грег [Greg]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существует официальный драйвер от Intel для этой беспроводной карты, найти его можно здесь: http://ipw3945.sourceforge.net, но он требует довольно свежего ядра для работы, как минимум 2.6.13. Slackware 10 старше трех лет и значительно старше этого драйвера, и использует ядро версии 2.4. Для нормальной работы нового аппаратного обеспечения Вам нужен дистрибутив – и в частности, ядро – такой же новый, как оборудование. Если вы хотите держаться Slackware, то установите новейшую версию 12.0: это первый релиз с ядром 2.6, которое необходимо вашей беспроводной карте, по умолчанию. Пакеты для использования вашей карты со Slackware 12 есть на сайте ftp://ftp.slackware.at/slackware-12.0/extra/intel-wlan-ipw3945.&lt;br /&gt;
&lt;br /&gt;
Как альтернативу, можно установить любой другой дистрибутив, в репозитории которого есть пакет ipw3945. Неплохой выбор – Ubuntu c DVDLXF94,&lt;br /&gt;
поскольку драйвер ipw3945 включен в установку по умолчанию и должен «просто работать». В Fedora 7 с DVDLXF95 также имеется ipw3945, но перед его&lt;br /&gt;
установкой требуется добавить репозиторий ATrpms в менеджер пакетов. Как добавить репозиторий, можно прочитать по адресу http://atrpms.net/install.html. Этот сайт содержит отнюдь не одни беспроводные драйверы – там множество самых разнообразных пакетов – и заслуживает добавления в ваш список репозиториев.&lt;br /&gt;
&lt;br /&gt;
===Желание синхронности===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хочу перейти на Linux, но боюсь, что синхронизация Microsoft Outlook на моем PDA не будет работать. Еще у меня на PDA стоит Money for PPC, это важная для меня программа – предоставляет ли GnuCash похожие возможности?&lt;br /&gt;
&lt;br /&gt;
:Герхард Штигер [Gerhard Stieger]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Синхронизацию Linux-приложений с устройствами Windows Pocket PC позволяет производить каркас SyncCE (www.synce.org/index.php/SynCE-Wiki); степень его дружелюбия к пользователю и качество зависят от приложения. Проще всего синхронизируются приложения пакета KDE PIM – KMail, Kontact, KAddressBook и KOrganiser. Чтобы сделать это, необходимо установить пакет synce-kde, присутствующий во многих дистрибутивах, но не во всех устанавливаемый по умолчанию. После установки системы запустите менеджер пакетов и установите synce-kde, если он не помечен как установленный. После этого вы&lt;br /&gt;
сможете синхронизировать свою почту и контакты.&lt;br /&gt;
&lt;br /&gt;
Однако это потребует запуска системы на базе KDE, типа Mandriva, Kubuntu, PCLinuxOS или SUSE. Все они присутствуют на DVD-дисках LinuxFormat, но вы&lt;br /&gt;
также можете найти ссылки на них и на множество других дистрибутивов на www.distrowatch.com.&lt;br /&gt;
&lt;br /&gt;
Синхронизация ваших записей о финансах – это другая тема. GnuCash может импортировать стандартные учетные записи QIF, но не экспортировать&lt;br /&gt;
их. Зато KMyMoney (http://kmymoney2.sourceforge.net) умеет делать и импорт, и экспорт, так что Вы сможете импортировать файлы с вашего PDA и переносить их назад после модификации. Те, кто не разбираются в бухгалтерском учете профессионально или не имеют опыта работы, вероятно, сочтут KMyMoney более легким, чем GnuCash. KMyMoney – тоже KDE-приложение, оно должно присутствовать в любом из перечисленных выше дистрибутивов.&lt;br /&gt;
&lt;br /&gt;
===Перезапись URL===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пишу web-сайт со множеством PNG-изображений – большинство из них использует прозрачность. Он великолепно работает во всех последних версиях браузеров, но (как и ожидалось) не в IE6. Чтобы исправить это, я создал GIF-версии для каждой картинки (а также таблицу стилей), загружаемые вместо PNG, если пользователь использует IE6.&lt;br /&gt;
&lt;br /&gt;
Я хочу сделать это с помощью mod_rewrite и .htaccess, чтобы images/png/image1.png переписывался в images/gif/image1.gif. Вот мой файл .htaccess:&lt;br /&gt;
&lt;br /&gt;
 RewriteEngine On&lt;br /&gt;
 RewriteCond %{HTTP_USER_AGENT} “MSIE 6”&lt;br /&gt;
 RewriteRule /images/png/([A-Za-z0-9])+\.png$&lt;br /&gt;
 /images/gif/$1+\.gif&lt;br /&gt;
 RewriteCond %{HTTP_USER_AGENT} “MSIE 6”&lt;br /&gt;
 RewriteRule css/style.css css/iestyle.css&lt;br /&gt;
&lt;br /&gt;
Перезапись CSS работает четко, но картинки (PNG на GIF) не заменяются. &lt;br /&gt;
&lt;br /&gt;
:OnlyTheTony, с форумов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вы предложили хорошую идею использовать mod_rewrite для смены URL. Сбой происходит потому, что Вы используете + для объединения строк, а mod_rewrite работает с регулярными выражениями, где + означает «одно или более повторений», а не оператор конкатенации.&lt;br /&gt;
&lt;br /&gt;
В регулярных выражениях не нужно соединять строки: чтобы отметить неизменяемые части, используются скобки, а $1, $2... включат их в путь назначения, как у Вас и делается, и все является либо текстом, либо символами регулярных выражений. Так, чтобы заменить последнее вхождение foo в строке на bar,&lt;br /&gt;
потребуется выражение&lt;br /&gt;
&lt;br /&gt;
 /(.*)foo(.*)/$1bar$2/&lt;br /&gt;
&lt;br /&gt;
В вашем случае надо взять нечто, начинающееся с image/png и заканчивающееся на .png, и заменить везде png на gif. Вы можете сделать это, вставив&lt;br /&gt;
одну из следующих строк вместо первого правила RewriteRule:&lt;br /&gt;
&lt;br /&gt;
  RewriteRule /images/png/(.*)\.png$ /images/gif/$1\.gif&lt;br /&gt;
  RewriteRule /(.*)/png/(.*)\.png$ /$1/gif/$2\.gif&lt;br /&gt;
&lt;br /&gt;
Первая строка легче читается, зато вторая также будет работать с изображениями в других директориях.&lt;br /&gt;
&lt;br /&gt;
===Восстановить NTFS===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У меня внешний жесткий диск, отформатированный в NTFS. Мне нужно произвести его дефрагментацию, но я не хочу потерять все данные на нем. Можно ли выполнить дефрагментацию NTFS из Linux? Я запускаю Ubuntu Feisty Fawn на старом компьютере PC2800.&lt;br /&gt;
&lt;br /&gt;
:churst1, с форумов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Короткий ответ – нет, нельзя. Во-первых, почему на этом диске NTFS? Если с него загружают Windows, любые попытки выполнить дефрагментацию из-под Linux могут привести к ее незагружаемости. Но если диск уже содержит Windows, то почему бы не провести дефрагментацию из нее – Windows ведь не только для того, чтобы баловаться игрушками. Если же диск используется только для хранения данных, вы можете снизить фрагментацию, скопировав все их с него, отформатировав диск и записав данные обратно. Это действие требует драйвера файловой системы NTFS с полной поддержкой записи, такой, как коммерческая Paragon NTFS for Linux, которую мы рассматривали в прошлом месяце, или NTFS-3G, включенная в репозиторий Ubuntu. Также необходим пакет ntfsprogs, поэтому запустите Synaptic и инсталлируйте оба.&lt;br /&gt;
&lt;br /&gt;
Теперь надо проделать небольшую работу по открытию терминала, выбору директории, достаточно просторной для хранения содержимого NTFS-диска, и&lt;br /&gt;
запуску следующей команды:&lt;br /&gt;
&lt;br /&gt;
 tar cf ntfs.tar /mnt/ntfs &amp;amp;&amp;amp; umount /mnt/ntfs &amp;amp;&amp;amp; mkntfs /dev/sda1 &amp;amp;&amp;amp; mount /dev/sda1/mnt/ntfs -t ntfs-3g &amp;amp;&amp;amp; tar xf ntfs.tar -C /mnt/ntfs&lt;br /&gt;
&lt;br /&gt;
Все это надо записать в одну строку. Мы сцепили вместе две долгоиграющих команды tar и mkntfs – это позволит Вам не быть сиделкой у компьютера, но каж-&lt;br /&gt;
дая следующая команда выполнится, только если предыдущая отработает без ошибок (совершенно незачем переформатировать диск, если произойдет сбой&lt;br /&gt;
в копировании). Данный пример подразумевает, что Ваш диск – /dev/sda1 и смонтирован он в /mnt/NTFS. Перед запуском команды убедитесь, что подставлены&lt;br /&gt;
правильные пути для Вашего компьютера.&lt;br /&gt;
&lt;br /&gt;
Если у Вас мало места для хранения данных, можете создать сжатый архив, но это продлится гораздо дольше, чем простое копирование с диска. Вы можете&lt;br /&gt;
сделать это так:&lt;br /&gt;
&lt;br /&gt;
 tar czf ntfs.tar.gz /mnt/ntfs &amp;amp;&amp;amp; umount /mnt/ntfs &amp;amp;&amp;amp; mkntfs /dev/sda1 &amp;amp;&amp;amp; mount /dev/sda1 /mnt/ntfs -t ntfs-3g &amp;amp;&amp;amp; tar xf ntfs.tar.gz -C /mnt/ntfs&lt;br /&gt;
&lt;br /&gt;
Если Вы используете NTFS только ради чтения из Windows (а зачем она еще нужна?) и только с Вашим компьютером, где стоит Windows, лучшим решением&lt;br /&gt;
будет переформатирование диска в ext2 и установка драйвера ext2 с www.fs-driver.org в Windows. Это снимет проблему фрагментации, и Вы получите луч-&lt;br /&gt;
шее быстродействие в Linux. В вышеприведенных командах для этого надо заменить mkntfs на mke2fs и удалить&lt;br /&gt;
 &lt;br /&gt;
 -t ntfs-3g&lt;br /&gt;
&lt;br /&gt;
из команды mount.&lt;br /&gt;
&lt;br /&gt;
===Нужен легковес===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я присматриваю ОС для AMD K6/200. Думал, что NetBSD – лучший выбор, но максимум, чего я добился в результате установки – это режим командной строки. XFree86 (не XOrg) требует отдельной настройки. Я инвалид, и лишние усилия для меня проблема. Существуют ли «простые» версии, наподобие PC-BSD или Desktop BSD – легких версий FreeBSD?&lt;br /&gt;
&lt;br /&gt;
Пробовал DSL на машине P2/400 – ничего особенного, но я открыл DSL-N. Там даже был настоящий тестовый процессор! Что будет с производительностью, если установить Gnome или KDE на NetBSD или DSL-N? Fedora Core с Gnome работает на P2/400 с жуткими тормозами.&lt;br /&gt;
&lt;br /&gt;
:Гэри Причард [Gary Prichard]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Процессор K6/200 по нынешним меркам очень медленный, поэтому необходим «легкий» дистрибутив для получения терпимой производительности. А в первую очередь нужен нетребовательный оконный менеджер: среды Gnome и KDE к таковым не относятся. Гораздо лучше FluxBox, Xfce или IceWM. С учетом текстового процессора, Xfce был бы лучшим выбором: он использует GTK, как и AbiWord. Раз ресурсы у вас ограничены, выбирайте набор приложений, использующих одни и те же библиотеки, чтобы Ваша система работала более эффективно.&lt;br /&gt;
&lt;br /&gt;
Кстати о ресурсах: один из лучших способов увеличения производительности любой Linux-системы – увеличение объема ОЗУ. Потратив немного фунтов/&lt;br /&gt;
долларов/евро/песо на дополнительную память, вы получите больший прирост скорости, чем при вложении тех же средств в более быстрый процессор.&lt;br /&gt;
&lt;br /&gt;
Есть целый набор дистрибутивов, предназначенных для «слабых» систем: вы уже открыли для себя DSL и DSL-N, но советую также изучить Puppy Linux&lt;br /&gt;
с www.puppylinux.org. DSL ограничен объемом ISO-образа в 50 МБ, а Puppy Linux больше раза в два. Это означает, что он включает гораздо больше программ,&lt;br /&gt;
например, текстовый процессор AbiWord и сопутствующие офисные приложения, SeaMonkey (новое имя Mozilla) для Web и почты и много чего еще. Недостаток&lt;br /&gt;
Puppy в том, что процесс инсталляции на жесткий диск очень запутан, так как он спроектирован как LiveCD-система. Зато вы можете запускать его прямо&lt;br /&gt;
с CD, используя жесткий диск только для хранения данных и настроек.&lt;br /&gt;
&lt;br /&gt;
Другая альтернатива – правда, потяжелее – это Zenwalk (www.zenwalk.org). Если объем Вашего ОЗУ такой, какой обычно использовался на 200 МГц машинах, когда они были в новинку, то его не хватит; но Zenwalk дает больше функций, чем маленькие дистрибутивы.&lt;br /&gt;
&lt;br /&gt;
Запуск любой ОС на K-6/200 – это всегда компромисс между возможностями и производительностью, но он вполне возможен; тем более, если увеличить ОЗУ.&lt;br /&gt;
&lt;br /&gt;
===Работка для Ubuntu===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пытаясь запустить или инсталлировать Ubuntu, я получаю следующее сообщение после появления заставки:&lt;br /&gt;
&lt;br /&gt;
 unable to access tty job control turned off&lt;br /&gt;
&lt;br /&gt;
и возвращаюсь в командную строку. Ubuntu явно пытается обратиться к моему флоппи-дисководу, потому что перед появлением сообщения об ошибке&lt;br /&gt;
он включается.&lt;br /&gt;
&lt;br /&gt;
:Дэвид Лоусон [David Lowson]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Похоже, что ошибка связана с ядром: не найдя загрузочный диск, оно ищет его на всех подряд устройствах, прописанных в BIOS. Потому-то дисковод и начинает работать. Эта проблема не у Вас одного, и существует более чем одно решение.&lt;br /&gt;
&lt;br /&gt;
Первое заключается в загрузке с установочного диска и правке fstab в установленной системе. Если ваш корневой раздел находится на /dev/sda1, нужны&lt;br /&gt;
следующие команды:&lt;br /&gt;
&lt;br /&gt;
 sudo -i&lt;br /&gt;
 mount /dev/sda1 /mnt&lt;br /&gt;
 gedit /mnt/etc/fstab&lt;br /&gt;
&lt;br /&gt;
В fstab вы должны найти строчку, где монтируется корневой раздел, она выглядит примерно так:&lt;br /&gt;
&lt;br /&gt;
 # /dev/sda1&lt;br /&gt;
 UUID=71f72f22-0a14-45b7-9057-f7b0bd9d819c /ext3&lt;br /&gt;
 defaults....&lt;br /&gt;
&lt;br /&gt;
UUID (Universally Unique IDentifier [Универсальный Уникальный Идентификатор]) позволяет Ubuntu находить корневой раздел, даже если сменилась точка&lt;br /&gt;
подключения устройства (например, при добавлении нового диска), но здесь бывают проблемы. Смените UUID=xyz на путь вашего устройства, и система снова начнет загружаться. Fstab в этом случае должен выглядеть так:&lt;br /&gt;
&lt;br /&gt;
 # /dev/sda1&lt;br /&gt;
 /dev/sda1 / ext3 defaults....&lt;br /&gt;
&lt;br /&gt;
Другое решение более экстремальное, так что используйте его только в случае провала трюка с fstab. Вы должны открыть корпус вашего компьютера и&lt;br /&gt;
отключить все лишние дисковые устройства, оставив только загрузочный диск и DVD, с которого выполнялась установка – но не забудьте сперва выключить&lt;br /&gt;
компьютер! Дисковод также отключите – достаточно отсоединить кабели питания от неиспользуемых устройств. После этого ваша система должна загружаться. Затем добавьте модуль piix к образу, который Ubuntu загружает при запуске, с помощью команд&lt;br /&gt;
&lt;br /&gt;
 sudo echo piix &amp;gt;&amp;gt;/etc/initramfs-tools/modules&lt;br /&gt;
 sudo update-initramfs -u&lt;br /&gt;
&lt;br /&gt;
Теперь вам надо выключить компьютер, снова подсоединить все устройства и перезапустить его. Данная ошибка замечена небольшим числом пользователей Ubuntu, у которых подключено много устройств. Сообщалось также, что если проблема во флоппи-дисководе, ее можно обойти, оставив в нем дискету, но мы не смогли этого проверить, и в любом случае, это не метод.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Сервис резервирования===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Откликаясь на Сравнение «Онлайн-резервирование» (LXF94), расскажу о мелкой, но, надеюсь, решаемой проблеме. Я использую iBackup, потому что делаю резервное копирование с моего ПК (Ubuntu) и компьютера жены с Windows. Она справляется с резервным копированием без моей помощи.&lt;br /&gt;
&lt;br /&gt;
Проблема в том, что в процессе резервирования с моего компьютера, запускаемого cron, соединение часто прерывается. Когда это происходит, создаваемый stunnel рушится, уничтожая резервирование, и я получаю частично скопированные данные на iBackup-сервере. Есть ли способ восстановить все при обрыве&lt;br /&gt;
соединения или даже возобновить процесс после восстановления связи без потери данных?&lt;br /&gt;
&lt;br /&gt;
Сервер iBackup не позволяет настраивать время или дату для копируемых файлов, поэтому все файлы имеют дату и время копирования. Из-за этого я копирую сжатые в tar файлы и теряю возможности rsync.&lt;br /&gt;
&lt;br /&gt;
Это хороший повод переключиться на использование Rsync.net, но мне надо копировать файлы также и с компьютера моей жены. С iBackup у нее свое соединение и URL.&lt;br /&gt;
&lt;br /&gt;
:Гуус [Guus]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если Вы используете rsync, рестарт резервирования не должен вызывать проблем, потому что rsync «поднимается» с того места, где произошел сбой. Не исключено, что сервер устанавливает время копирования как время создания файлов, потому что так указано в опциях rsync. Вам нужно вызывать rsync с опцией --times для сохранения времени файлов. Опция --archive – комбинация нескольких опций резервирования, включая --times. Это снимет необходимость копирования tar-архивов на сервер и позволит копировать индивидуальные файлы в том виде, в котором они хранятся на вашей машине, что сильно упрощает перезапуск копирования.&lt;br /&gt;
&lt;br /&gt;
Я попробовал Rsync.net после чтения статьи (раньше у меня был Strongspace) и переключился на него полностью. Резервирование нескольких машин&lt;br /&gt;
выполняется легко, если Вы можете более или менее свободно обращаться с имеющейся памятью – удобно будет создать по директории на резервную копию&lt;br /&gt;
каждой машины. Rsync.net использует SSH для работы rsync, так что в stunnel нужды нет, и вы можете применить Duplicity для шифрования данных.&lt;br /&gt;
&lt;br /&gt;
Альтернативное решение – резервирование данных на локальный диск и синхронизация их с удаленным сервером. Преимущество здесь в том, что Ваш первый шаг резервирования локален: это позволяет быстро восстановить данные, но требует, чтобы компьютер для резервных копий был включен всегда, когда требуется их создать.&lt;br /&gt;
&lt;br /&gt;
===Новый диск хромает===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Найдя, что мне необходим жесткий диск побольше, я подключил новый диск как hdb, разбил его, как надо, скопировал файловые системы со старого диска (hda) и попытался загрузиться с нового диска. К сожалению, ничего не вышло.&lt;br /&gt;
&lt;br /&gt;
Я сделал копии разделов /, /boot, /usr, /home и некоторых других. Я также создал swap-раздел. /boot, первый основной раздел, сделал загрузочным. Я cпи-&lt;br /&gt;
сал MBR, используя lilo -M /dev/hdb. Далее монтировал /boot и / разделы, редактируя новую копию /etc/lilo.conf, (теперь на /mnt/hdb5) и запускал lilo -C /hdb5/etc/lilo.conf -b /dev/hdb1 – на вид вроде работало.&lt;br /&gt;
&lt;br /&gt;
Когда я пытаюсь загрузиться с нового диска, я прохожу через стадию загрузочного окна Lilo и вижу сообщения, заканчивающиеся на&lt;br /&gt;
&lt;br /&gt;
 initrd finished&lt;br /&gt;
 Freeing unused kernel memory&lt;br /&gt;
 Warning: Unable to open an input console&lt;br /&gt;
&lt;br /&gt;
После этого только нажатие на reset выводит компьютер из ступора. У меня стоит “Mandrakelinux release 10.2 (Limited Edition 2005) for i586”.&lt;br /&gt;
&lt;br /&gt;
:Родни М. Бэйтс [Rodney M Bates]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проблема не в загрузчике. Раз уж ядро загрузилось, значит, загрузчик свое дело сделал. Такая ошибка показывает на отсутствие файла в /dev – возможно, в /dev/console. Хотя динамические файловые системы dev, типа udev и ее предшественника devfs, создают записи устройств в /dev автоматически, некоторые из них нужны еще до запуска devfs/udev. Подозреваю, что вы пропустили содержимое /dev, копируя свой корневой раздел – забыли включить его в команду копирования или исключили «прочие» файловые системы при копировании (вы не пояснили, как именно копировали файловые системы, но cp, rsync и tar имеют опции по исключению других файловых систем).&lt;br /&gt;
&lt;br /&gt;
Содержимое вашей исходной директории /dev теперь скрыто, потому что новая, динамическая /dev была примонтирована поверх нее, но, как вы можете&lt;br /&gt;
видеть, все еще доступна.&lt;br /&gt;
&lt;br /&gt;
 mkdir /mnt/tmp&lt;br /&gt;
 mount --bind / /mnt/tmp&lt;br /&gt;
&lt;br /&gt;
позволит обратиться ко всему корневому разделу через /mnt/tmp без других подмонтированных файловых систем. /mnt/tmp/home должен быть пуст, а&lt;br /&gt;
/tmp/mnt/dev должен содержать файлы устройств. Скопируйте их в /dev на Вашем новом разделе, и ошибка при загрузке исчезнет. Самый простой способ&lt;br /&gt;
убедиться, что новый корневой раздел содержит все файлы со старого –&lt;br /&gt;
&lt;br /&gt;
  rsync -a --delete /mnt/tmp/ /mnt/newroot/&lt;br /&gt;
&lt;br /&gt;
===Рота, подъем!===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для Mac OS X и Windows существуют специальные программы, которые позволяют организовать включение компьютера по расписанию. А есть ли что-нибудь подобное в Linux?&lt;br /&gt;
&lt;br /&gt;
:Анатолий Евдокимов&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Самый простой способ организовать «подъем по распорядку» – это воспользоваться функцией ACPI WakeUp, которой обладает большинство современных материнских плат. Linux предоставляет к ней два интерфейса.&lt;br /&gt;
&lt;br /&gt;
В ядрах старше 2.6.22 используется файл /proc/acpi/alarm, в который можно записать дату в формате «ГГГГ-ММ-ДД ЧЧ:ММ:СС», например,  echo “2007-10-18 23:30:00” &amp;gt;/proc/acpi/alarm после чего можно выключать компьютер обычным образом. Конечно, следует проследить, чтобы системный блок остался подключенным к электросети и выключатель на его блоке питания находился в положении ON.&lt;br /&gt;
&lt;br /&gt;
Ядра 2.6.22 и выше предоставляют новый интерфейс через файл /sys/class/rtc/rtcX/wakealarm. Для установки «будильника» в него следует записать&lt;br /&gt;
желаемый момент времени в виде числа секунд, прошедших с начала эпохи (1 января 1970 года, 00:00:00) – формате, столь любимом ветеранами Unix.&lt;br /&gt;
Чтобы отменить пробуждение, достаточно записать в файл значение 0. Кроме того, необходимо удостовериться, что аппаратные часы вашего компьютера&lt;br /&gt;
настроены на UTC, иначе пробуждение произойдет не в то время.&lt;br /&gt;
&lt;br /&gt;
Несмотря на свою простоту, данный способ не лишен недостатков. Так, некоторые материнские платы отказываются принимать во внимание значение, установленное программно, и отдают предпочтение времени, указанному непосредственно через BIOS. Исходя из этого, рекомендуется отключить в BIOS данную функцию – обычно она называется как-то вроде Wake from RTC/Alarm. Иногда пробуждение по таймеру автоматически отменяется, если после его установки в аппаратные часы были внесены изменения – а это делают многие дистрибутивы при выключении. Поищите команду hwclock в скриптах /etc/init.d, и если&lt;br /&gt;
она там встречается, обеспечьте, чтобы время пробуждения устанавливалось после нее повторно.&lt;br /&gt;
&lt;br /&gt;
Можно пойти другим путем и воспользоваться программой nvram-wakeup (http://http//sourceforge.net/projects/nvram-wakeup), изменяющей установки&lt;br /&gt;
прямо в энергонезависимой памяти BIOS (отсюда и название). Поскольку формат хранения данных в памяти меняется от производителя к производителю,&lt;br /&gt;
это получится только на поддерживаемых программой материнских платах, зато будет работать, как часы.&lt;br /&gt;
&lt;br /&gt;
===Grub, который загрузит всех===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Надоело каждый раз устанавливать в BIOS загрузку с CD, чтобы попробовать новый дистрибутив. Есть ли способ добавить соответствующую опцию в Grub?&lt;br /&gt;
&lt;br /&gt;
:Иван Пуренко&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Научить Grub запускать загрузчик с CD несложно, но для решения этой задачи придется привлечь два других проекта: MEMDISK &lt;br /&gt;
(http://syslinux.zytor.com/memdisk.php) и Smart Boot Manager (http://btmgr.sourceforge.net/about.html или Главное/SBM на нашем DVD). MEMDISK является частью SYSLINUX и должен быть доступен в вашем дистрибутиве в виде одноименного пакета. Разверните данный пакет и извлеките из него файл memdisk,&lt;br /&gt;
который следует скопировать в каталог /boot. Далее, возьмите из каталога Главное/SBM на первой стороне нашего DVD файл btmgr.floppy.bz2 – это образ загрузочной дискеты Smart Boot Manager. Нам потребуются ее первые 18 КБ: откройте root-терминал и наберите &lt;br /&gt;
&lt;br /&gt;
 dd if=btmgr.floppy of=/boot/sbm.bin bs=1k count=18&lt;br /&gt;
&lt;br /&gt;
Наконец, необходимо создать соответствующую запись в меню Grub:&lt;br /&gt;
&lt;br /&gt;
 title Boot from CD&lt;br /&gt;
              kernel /boot/memdisk&lt;br /&gt;
              initrd /boot/sbm.bin&lt;br /&gt;
&lt;br /&gt;
==Врезки==&lt;br /&gt;
&lt;br /&gt;
===Коротко про…===&lt;br /&gt;
&lt;br /&gt;
'''MD5'''&lt;br /&gt;
&lt;br /&gt;
''Как избежать сравнения больших потоков чисел.''&lt;br /&gt;
&lt;br /&gt;
Если вы загружали ISO-образы различных дистрибутивов, то, безусловно, видели рядом с ISO-файлами файлы с именами типа cooldistro1.0.iso.md5, и, возможно, задавались вопросом: а зачем они? Сумма MD5 – это 128-битный криптографический хэш содержимого файла. Один и тот же файл всегда генерирует&lt;br /&gt;
одну и ту же сумму, но стоит изменить в нем всего один бит, и сумма окажется совершенно иной. MD5 был первоначально разработан для обеспечения безопасности. Проверив сумму MD5, вы можете убедиться, что файл не был подменен.&lt;br /&gt;
&lt;br /&gt;
Ныне MD5 также используется для проверки случайного повреждения во время передачи. При загрузке ISO-образа, скачайте заодно и файл MD5. Прежде чем &lt;br /&gt;
тратить время на запись файла на компакт-диск и попытки с него загрузиться, проверьте, не был ли файл поврежден, командой:&lt;br /&gt;
&lt;br /&gt;
 md5sum cooldistro1.0.iso&lt;br /&gt;
&lt;br /&gt;
Она вернет строку шестнадцатеричных символов, подобную хранящейся в cooldistro1.0.iso.md5. Конечно, ручное сличение 128-битных шестнадцатеричных чисел&lt;br /&gt;
друг с другом, возможно, не самое лучшее времяпрепровождение (спешу добавить – для меня), особенно если вы скачали много файлов, так что предоставим&lt;br /&gt;
программе сделать это за нас: &lt;br /&gt;
&lt;br /&gt;
 md5sum --check cooldistro1.0.iso.md5&lt;br /&gt;
&lt;br /&gt;
Эта команда позволит узнать, соответствует ли контрольная сумма оригиналу или нет. MD5-файл может содержать контрольные суммы нескольких файлов.&lt;br /&gt;
Например, исходные тексты Gnome состоят из множества файлов, а их суммы MD5 содержатся в одном. По договоренности, этот файл часто называется MD5SUMS.&lt;br /&gt;
Можно загрузить все необходимые вам файлы и проверить их за один раз:&lt;br /&gt;
&lt;br /&gt;
 md5sum -c MD5SUMS&lt;br /&gt;
&lt;br /&gt;
Кроме того, можно создать файл MD5SUMS:&lt;br /&gt;
&lt;br /&gt;
 ms5sum *.iso &amp;gt;MD5SUMS&lt;br /&gt;
&lt;br /&gt;
SHA1-файлы работают по аналогичному принципу, но с несколько более высоким уровнем безопасности. Синтаксис тот же, только используется программа&lt;br /&gt;
sha1sum.&lt;br /&gt;
&lt;br /&gt;
===Часто задаваемые вопросы===&lt;br /&gt;
&lt;br /&gt;
'''FISH'''&lt;br /&gt;
&lt;br /&gt;
''Не путайте с языком программирования FISh…''&lt;br /&gt;
&lt;br /&gt;
*'''Тогда что это такое?'''&lt;br /&gt;
&lt;br /&gt;
Это сокращение от FIles (Файлов), передаваемых через протокол (оболочки) SHell.&lt;br /&gt;
&lt;br /&gt;
*'''Стоп, не так заумно. Что он делает?''' Проще говоря, он дает доступ к файлам на удаленной машине только через SSH (или RSH). На удаленной машине не&lt;br /&gt;
нужно никакого специального программного обеспечения, кроме SSH и стандартных команд оболочки. Ваш компьютер должен иметь установленными FISH-программы для доступа к этим файлам.&lt;br /&gt;
&lt;br /&gt;
*'''Где такое ПО можно взять?'''&lt;br /&gt;
&lt;br /&gt;
Скорее всего, оно у вас есть; наберите&lt;br /&gt;
&lt;br /&gt;
 cd /#sh:user@hostname/some/path&lt;br /&gt;
&lt;br /&gt;
в Midnight Commander, и вы получите список содержимого /some/path на удаленной машине. Если вы опустите часть user@, то будет использоваться текущее&lt;br /&gt;
имя пользователя.&lt;br /&gt;
&lt;br /&gt;
*'''Выходит, через FISH кто-то может читать файлы на моем компьютере?'''&lt;br /&gt;
&lt;br /&gt;
Нет, потому что используется SSH. Но, если вы не используете аутентификацию по ключу, необходимо установить пароль на учетную запись. В обоих случаях,&lt;br /&gt;
доступ сможете получить только вы.&lt;br /&gt;
&lt;br /&gt;
*'''Ну, ладно, но Midnight Commander малость устарел, верно? В смысле, это ведь консольная программа, а как насчет GUI?'''&lt;br /&gt;
&lt;br /&gt;
Если у вас KDE, откройте Konqueror (или мини-консоль Alt+F2) и наберите&lt;br /&gt;
&lt;br /&gt;
 fish://user@hostname/some/path&lt;br /&gt;
&lt;br /&gt;
Используя магию kio_slaves, эта команда загрузит удаленную директорию в Konqueror. Благодаря свойству разбиения Konqueror на два окна, легко&lt;br /&gt;
сравнивать или переписывать локальную и удаленную копии директорий.&lt;br /&gt;
&lt;br /&gt;
*'''Итак, я могу использовать это для управления файлами в Konqueror или Midnight Commander?'''&lt;br /&gt;
&lt;br /&gt;
Управление файлами – это еще не все. Любое приложение KDE, работающее с файлами, может получать их через FISH. Хотите отредактировать файл на вашем&lt;br /&gt;
web-сервере на другом конце земного шара? Просто наберите&lt;br /&gt;
&lt;br /&gt;
 kate fish://me@my.server iffypagename.html&lt;br /&gt;
&lt;br /&gt;
для загрузки его в Kate, и при нажатии Save модифицированный файл отправится обратно на сервер. Конечно, web-страницами вы не ограничены: столь же&lt;br /&gt;
удобно использовать это для редактирования файлов конфигурации.&lt;br /&gt;
&lt;br /&gt;
*'''Значит, можно использовать FISH для управления файлами на службах удаленного резервирования, вроде Rsync.net или StrongSpace?'''&lt;br /&gt;
&lt;br /&gt;
К сожалению, нет. FISH предусмотрен только для входа через учетную запись с правами запуска базовых команд оболочки. Эти сервисы не дают установить&lt;br /&gt;
полный вход в оболочку, и FISH не работает, но есть альтернатива. SSHFS (http://fuse.sourceforge.net/sshfs.html) – файловая система FUSE, позволяющая монтировать себя на учетных записях с возможностью только копировать файлы (scp или rsync), но требуется монтировать удаленную файловую систему, даже&lt;br /&gt;
если вам нужно взять всего один файл.&lt;br /&gt;
&lt;br /&gt;
===Вопрос-победитель (английская версия)===&lt;br /&gt;
&lt;br /&gt;
'''Загружаясь с DVD'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Я хочу установить DVD с LXF94 на старый ПК в двойную загрузу с Windows 98SE. Это 7-летний Athlon 600 на материнской плате MSI со 128 МБ ОЗУ, двумя жесткими дисками и приводами DVD и CD-RW. Его BIOS не имеет опции загрузки с DVD. Загрузочная последовательность позволяет мне использовать CD-ROM как&lt;br /&gt;
первое устройство, и я спокойно могу ее изменить. На форумах мне советовали установить сперва Windows, если нужна двойная загрузка (а так и есть).&lt;br /&gt;
Я использовал Partition Magic V5 для создания и FAT, и Linux-разделов.&lt;br /&gt;
&lt;br /&gt;
По-моему, Linux использует другой формат файлов по сравнению с FAT, но я пытался использовать загрузочную дискету Windows для «установки» или «инсталляции» с DVD, и неудачно. Будет ли это работать, если диск будет CD-ROM? Дискета Red Hat 6.1 позволила мне запустить CD Red Hat, но она требует именно CD Red Hat и не работает с DVD LXF94. С CD Red Hat CD все получилось, но я прервал установку, потому что предпочитаю (K)ubuntu. Могу ли я сделать загрузочную дискету с DVD-драйверами на ней для установки DVD LXF94?&lt;br /&gt;
&lt;br /&gt;
:Джон Паттерсон [John Patterson]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С точки зрения BIOS, загрузка с CD и DVD – одно и тоже: DVD распознается просто как большой CD-ROM. Старые дистрибутивы Linux использовали загрузочную дискету для быстрого старта установки с CD, поскольку в то время множество компьютеров не поддерживало загрузку с CD. Ваше поколение техники должно&lt;br /&gt;
поддерживать загрузку с оптических дисков – неважно, CD это или DVD. Установив в BIOS загрузку с CD, Вы не должны иметь проблем. Но могут сказываться личные особенности BIOS: некоторые старые BIOS дают сбой, если подключено более одного оптического привода. Если вы установили в BIOS загрузку с CD и&lt;br /&gt;
не можете загрузиться с DVD, попробуйте отсоединить кабель от вашего CD-RW, чтобы остался только один оптический привод.&lt;br /&gt;
&lt;br /&gt;
В наше время использование загрузочной дискеты для установки с CD или DVD – это уже экзотика, но на всякий случай мы поместили одну на DVD. Smart Boot Manager в каталоге Essential/SBM на DVD как раз и есть загрузочная дискета для запуска с оптического или жесткого диска. Запустите RAWWRITE.EXE в Windows, вставьте чистую дискету в дисковод и выберите sbootmgr.dsk как исходный образ. Загрузившись с этой дискеты, вы сможете загрузить ваш DVD.&lt;br /&gt;
&lt;br /&gt;
Различия в файловых системах Windows и Linux в этом случае к делу не относятся, так как все данные поступают с DVD, имеющего другую файловую систему (ту же, что у CD). Использование Windows-инструментов для создания разделов Linux способно порождать трудности. Посредством Partition Magic удалите созданные Linux-разделы, включая swap, и оставьте просто неразмеченное место. Затем велите установщику Ubuntu использовать все свободное место на диске&lt;br /&gt;
(«свободное» в этом случае означает «неразмеченное», а не место внутри размеченных разделов).&lt;br /&gt;
&lt;br /&gt;
Ваш компьютер может «тормозить» также из-за памяти. 128 МБ – очень мало по сегодняшним стандартам: современный рабочий стол, вроде KDE в Kubuntu, будет&lt;br /&gt;
работать очень медленно. Версия Ubuntu на LXFDVD наряду с жадными до ресурсов Gnome и KDE включает нетребовательный рабочий стол Xfce, используемый в Xubuntu.&lt;br /&gt;
&lt;br /&gt;
===Большой вопрос===&lt;br /&gt;
&lt;br /&gt;
'''Администратор через браузер'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Вопрос'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У нас учетная запись web-хостинга, предоставляющего Apache, PHP и MySQL. Мы имеем FTP-доступ для загрузки файлов, но не доступ к командам оболочки, из-за чего настройка базы данных SQL и других вещей затруднительна. Нам нельзя устанавливать на сервер дополнительное ПО. Мы могли бы поискать&lt;br /&gt;
другое место с shell-доступом, но нам нравится та цена, которую мы здесь платим. Есть ли способ получить административный доступ через web-браузер, и что для этого надо сделать?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;'''Ответ'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Хотя переход на хостинг, поддерживающий SSH-доступ, добавит гибкости, существуют решения, привлекательные даже в случае отсутствия командной строки.&lt;br /&gt;
Основное из них – phphMyAdmin (www.phpmyadmin.net). Как видно из имени, это программа администрирования MySQL, написанная на PHP; она устанавливается как набор файлов в вашей учетной записи после настройки безопасности и конфигурации. Многие web-хостинги предоставляют доступ к базам данных только с локальных IP, чтобы скрипты запускались на сервере, а не на вашей машине.&lt;br /&gt;
&lt;br /&gt;
Загрузите и распакуйте один из tar-архивов с сайта phpMyAdmin (они различаются только языком и методом сжатия). Традиционный метод конфигурирования phpMyAdmin – создать подходящий файл config.inc.php, взяв за основу включенные примеры, но есть также и скрипт установки, который запускается всего один раз после копирования файлов на сервер. Прежде чем что-то делать, убедитесь, что это безопасно. Любой получивший доступ к директории phpMyAdmin может читать и изменять вашу базу данных, так что обезопасьте себя с помощью файла .htaccess (или другим способом), чтобы подключение было возможно только с защищенной паролем учетной записи. По возможности, включите его на раздел вашего пространства хостинга, доступный через HTTPS, ведь вы передаете пароль при запуске установочного скрипта. Создайте директорию config в директории phpmyadmin и скопируйте всю директорию (включая .htaccess) на сервер хостинга.&lt;br /&gt;
&lt;br /&gt;
Зайдите на https://www.ваш.сайт/phpmyadmindir/setup.php и заполните поля своего подключения к MySQL. Теперь перейдите на https://www.ваш.сайт/phphmyadmindir/ – вы увидите список ваших баз данных. Выбор одной из них покажет входящие в нее таблицы. Отсюда можно просматривать, выполнять запросы и модифицировать ваши SQL-таблицы, как вам нравится. Если у вас PostgreSQL, а не MySQL, то существует аналогичная программа, phpPgAdm, доступная по адресу http://phppgadmin.sourceforge.net.&lt;br /&gt;
&lt;br /&gt;
Не только SQL-базы можно администрировать через web-интерфейс. Webmin позволяет изменять все, что вообще разрешено менять на *nix-машинах, не ограничиваясь серверами. В вашем случае Webmin невыгоден потому, что должен быть установлен и запущен от имени root, поскольку использует собственный встроенный сервер, отличающийся от подобных Apache. Спросите об этом своего хостинг-провайдера: может, он уже установил Webmin или его бедного родственника Usermin. Если нет, то он может захотеть его установить: это будет выгодно всем заказчикам. Он также может установить для вас phpMyAdmin, и у вас не будет нужды тратить на это свою дисковую квоту и трафик.&lt;br /&gt;
&lt;br /&gt;
===Шаг за шагом: соединяемся с phpMyAdmin===&lt;br /&gt;
&lt;br /&gt;
#'''Прячем свой пароль'''&lt;br /&gt;
Перед копированием файлов phpMyAdmin (pMA) на ваш web-сервер, убедитесь, что они защищены от посторонних взглядов.&lt;br /&gt;
#'''Мастер конфигурации'''&lt;br /&gt;
Загрузив setup.php в своем браузере, вы сможете легко настроить phpMyAdmin, но подключайтесь через HTTPS, чтобы держать пароль в секрете.&lt;br /&gt;
#'''Ручная конфигурация'''&lt;br /&gt;
Или же сконфигурируйте pMA перед загрузкой файлов на web-сервер, отредактировав config.sample.inc.php и сохранив его как config.inc.php.&lt;br /&gt;
#'''Вот оно!'''&lt;br /&gt;
pMA позволяет работать с данными и схемами MySQL одним кликом мышки. Его можно использовать и для создания резервных копий вашей базы.&lt;br /&gt;
#'''А также PostgreSQL'''&lt;br /&gt;
Пользователям PostgreSQL не придется терять чувство превосходства – для них есть phpPgAdm, эквивалент pMA.&lt;br /&gt;
#'''Глобальная конфигурация'''&lt;br /&gt;
C Webmin вы можете сконфигурировать на компьютере все что угодно... точнее, все, что позволит владелец компьютера.&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:%D0%A7%D0%B8%D1%81%D1%82%D0%BA%D0%B0_DVD_%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE</id>
		<title>LXF98:Чистка DVD видео</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:%D0%A7%D0%B8%D1%81%D1%82%D0%BA%D0%B0_DVD_%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE"/>
				<updated>2008-04-01T16:54:39Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: Новая: ==&amp;lt;font color=darkred&amp;gt;DVD:&amp;lt;/font&amp;gt; Долой посторонние звуки!==  ''Иногда безупречную во всех прочих отношениях любитель...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;font color=darkred&amp;gt;DVD:&amp;lt;/font&amp;gt; Долой посторонние звуки!==&lt;br /&gt;
&lt;br /&gt;
''Иногда безупречную во всех прочих отношениях любительскую запись портит фоновый шум или подобная мелочь, оставленная без внимания при монтаже. К счастью, '''Алексей Маслий''' знает, как подправить DVD, не нарушая его компоновки.''&lt;br /&gt;
&lt;br /&gt;
Недавно у моих родственников был юбилей, который они засняли на цифровую камеру, а потом сделали DVD с меню и видеоклипом по мотивам празднования. И все бы хорошо, но в записи остался фоновой шум, местами очень сильный. И, конечно, с просьбой очистить запись от шума они обратились ко мне. К счастью, Linux позволяет решить эту задачу просто и элегантно – и на следующих нескольких страницах мы разберемся, как именно.&lt;br /&gt;
&lt;br /&gt;
Для начала формализуем задачу. Имеется DVD-диск с записью, с которой нужно произвести некоторые действия: убрать шум, добавить комментарии, наложить субтитры на видеоряд и т.д., причем так, чтобы не испортить имеющееся на диске меню. Можно, конечно, поступить просто – скопировать видео, произвести с ним требуемые преобразования и сделать новый диск, но это проблема уже другого порядка сложности.&lt;br /&gt;
&lt;br /&gt;
Данная задача решается в три этапа. Во-первых, необходимо сохранить звуковую дорожку в отдельный файл в том формате, который понимает ваша программа обработки звука. Во-вторых, нужно произвести необходимые действия со звуковой дорожкой (в нашем случае – убрать фоновый шум) или с видеорядом (но тогда&lt;br /&gt;
длительность ролика не должна изменяться). Наконец, звуковую дорожку следует записать обратно на DVD-диск.&lt;br /&gt;
&lt;br /&gt;
===DVD изнутри===&lt;br /&gt;
&lt;br /&gt;
Чтобы реализовать описанную выше идею, нам понадобятся три основных программы. Это ''Avidemux2'' (http://www.avidemux.org/), ''Audacity'' (http://audacity.sourceforge.net/) и ''QDVDAuthor'' (http://qdvdauthor.sourceforge.net/). Все они входят в состав загружаемого мультимедиа-дистрибутива ''Dynebolic'', одну из версий которого можно найти на диске LXF76, либо установить через менеджер пакетов вашего дистрибутива (я предпочитаю SUSE, а в нем необходимо предварительно подключить репозиторий ''packman'' – http://packman.links2linux.org/).&lt;br /&gt;
&lt;br /&gt;
Прежде чем браться за решение задачи, необходимо разобраться, в чем, собственно, заключается основная проблема. На самом деле этапы один и два я прошел за несколько часов (считая и время, потраченное на получение аудиодорожки и очистку ее от шума). Самая трудная задача – это вернуть очищенный звук на его место на DVD. Чтобы разобраться с ней, необходимо хорошо представлять себе структуру диска DVD Video.&lt;br /&gt;
&lt;br /&gt;
Обычно на диске находятся два каталога: '''AUDIO_TS''' и '''VIDEO_TS'''. Интересующие нас файлы содержатся во втором из них. Все видеофайлы имеют расширение '''.VOB'''. Это обычные ролики в формате MPEG-2, которые могут быть просмотрены с помощью любого проигрывателя. Файлы с расширением '''.IFO''' и '''.BUP''' – служебные, в них содержится информация о меню и временных сдвигах глав (chapter) – отдельных отрывков из видеопотока раздела. Раздел (title), в свою очередь, представляет собой видеопоток со своей собственной временной шкалой. Меню видео-DVD содержится в трех файлах с расширениями '''.IFO''', '''.BUP''' и '''.VOB''', при этом каждый раздел может иметь собственное меню. Схема именования файлов проста: '''VTS_xx_y.VOB''', где '''хx''' – номер главы, '''у''' – порядковый номер файла. '''у=0''' соответствует файлу, содержащему меню главы, а все видеофайлы с одинаковым значением '''х''' и '''у≥1''' имеют общую временную шкалу.&lt;br /&gt;
&lt;br /&gt;
===Добываем звук===&lt;br /&gt;
&lt;br /&gt;
Приступая к первому шагу, необходимо определить, какой именно раздел видео-DVD мы будем обрабатывать. Любительские DVD обычно содержат только один раздел, но если вам попадется материал, содержащий два или более, лучше обрабатывать каждый из них по отдельности. Выбрав необходимый раздел, скопируйте все файлы '''VTS_x_y.VOB''' c '''у&amp;gt;=1''' (в моем случае это '''VTS_01_1.VOB...VTS_01_4.VOB''') на жесткий диск (и лучше в отдельный каталог). Далее запустите программу ''Avidemux2'' (Рис. 1). Откройте файл '''VTS_01_1.VOB'''. Программа задает последовательно два важных вопроса: &amp;lt;font color=darkred&amp;gt;«Выглядит как mpeg. Хотите индексировать?»&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;«Здесь несколько mpeg-файлов, хотите объединить?»&amp;lt;/font&amp;gt;. В обоих случаях следует ответить &amp;lt;font color=darkblue&amp;gt;«Да»&amp;lt;/font&amp;gt;. В результате, спустя некоторое время, затрачиваемое на индексирование и зависящее от скорости вашего компьютера, файл будет открыт, причем не только первая его часть, но и весь временной поток. Теперь мы можем непосредственно заняться решением первой проблемы – сохранить аудиодорожку. Программа ''Audacity'', которая будет использовать-&lt;br /&gt;
ся для очистки звука, работает с файлами формата WAV (возможно, с PCM-сжатием), поэтому следует узнать, в каком формате звук записан&lt;br /&gt;
на DVD &amp;lt;font color=darkblue&amp;gt;[в любом случае, маловероятно, что это будет несжатый WAV, – прим. ред.]&amp;lt;/font&amp;gt;. Для этого можно посмотреть свойства открытого файла, нажав на&lt;br /&gt;
кнопку с изображением буквы «i» на листе бумаги на панели инструментов программы или в меню &amp;lt;font color=darkblue&amp;gt;Файл&amp;lt;/font&amp;gt;. В моем случае аудиопоток кодирован в формате AC3 ('''Рис. 2'''). Для его перекодировки в WAV можно воспользоваться меню &amp;lt;font color=darkblue&amp;gt;Аудио&amp;lt;/font&amp;gt; в левой части окна программы. При запуске программы по умолчанию выбрано &amp;lt;font color=darkblue&amp;gt;Копировать&amp;lt;/font&amp;gt;; нужно изменить это на WAV PCM. Для сохранения аудиодорожки выберите в меню &amp;lt;font color=darkblue&amp;gt;Аудио &amp;gt; Сохранить&amp;lt;/font&amp;gt;. Укажите имя файла и подождите, пока программа запишет дорожку. Задача первого этапа решена, но программу ''Avidemux'' можно не закрывать, поскольку ею мы будем пользоваться для наложения аудиодорожки обратно на видеоряд.&lt;br /&gt;
&lt;br /&gt;
===Чистка===&lt;br /&gt;
&lt;br /&gt;
На втором этапе нам поможет прекрасный звуковой редактор ''Audacity''. К сожалению, у нас нет возможности рассматривать его сколько-нибудь подробно, поэтому мы ограничимся лишь процедурой шумоподавления (см. также LXF79). Для решения этой задачи существует специальный фильтр &amp;lt;font color=darkblue&amp;gt;Удаление шума&amp;lt;/font&amp;gt;, который доступен через меню &amp;lt;font color=darkblue&amp;gt;Эффекты&amp;lt;/font&amp;gt;. Для его применения сначала надо найти в записи участок с образцом шума, то есть не содержащий никаких других звуков. После этого выбрать пункт меню &amp;lt;font color=darkblue&amp;gt;Эффект &amp;gt; Удаление шума&amp;lt;/font&amp;gt;. В появившемся окне ('''Рис. 3''') нажмите кнопку &amp;lt;font color=darkblue&amp;gt;Создать модель шума&amp;lt;/font&amp;gt;, и выделенный участок будет взят за образец. Далее необходимо указать участок записи, который вы хотите очистить. Обычно это вся дорожка, поэтому в меню следует выбрать пункт &amp;lt;font color=darkblue&amp;gt;Правка &amp;gt; Выделить &amp;gt; Все&amp;lt;/font&amp;gt;. Теперь снова вызовите диалог &amp;lt;font color=darkblue&amp;gt;Удаление шума&amp;lt;/font&amp;gt;, а затем укажите при помощи ползунка, насколько глубоким будет это удаление. По собственному опыту, я советую разместить бегунок в районе середины шкалы и, если качество удаления шума вас не удовлетворит, повторить этот процесс еще раз. В противном случае фильтр вырежет всю полосу частот, где замечен шум, и оставшийся звук станет неестественным. Для тестирования качества работы эффекта можно выделить участок, где шум наиболее заметен, и в окне &amp;lt;font color=darkblue&amp;gt;Удаление шума&amp;lt;/font&amp;gt; ('''Рис. 3''') нажать кнопку &amp;lt;font color=darkblue&amp;gt;Прослушать&amp;lt;/font&amp;gt;. Программа воспроизведет небольшой фрагмент записи, к которому уже применен эффект удаления шума с выбранными параметрами. Следует заметить, что если вы собираетесь производить процесс очистки&lt;br /&gt;
несколько раз, то следует заранее побеспокоиться о наличии достаточного места в разделе, где находится каталог '''/tmp''' – туда программа помещает временные файлы – или настроить сохранение временных файлов в разделе, где достаточно места. При полной очистке записи программа создает резервную копию аудиодорожки для возможности совершения отката. Соответственно, резервные копии будут создаваться столько раз, сколько раз будет производиться&lt;br /&gt;
очистка. Приказать программе создавать временные файлы в другом месте можно во вкладке &amp;lt;font color=darkblue&amp;gt;Каталоги&amp;lt;/font&amp;gt; в окне настроек программы (&amp;lt;font color=darkblue&amp;gt;Правка &amp;gt; Параметры Audacity&amp;lt;/font&amp;gt;). После того, как результат очистки вас удовлетворит, можно сохранять очищенную аудиодорожку в файл: &amp;lt;font color=darkblue&amp;gt;Файл &amp;gt; Экспортировать как &amp;gt; WAV&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Сведение===&lt;br /&gt;
&lt;br /&gt;
Настало время возвратиться к ''Avidemux''. Выберите в меню пункт &amp;lt;font color=darkblue&amp;gt;Аудио &amp;gt; Главная дорожка &amp;gt; External PCM(WAV)&amp;lt;/font&amp;gt;. После нажатия кнопки &amp;lt;font color=darkblue&amp;gt;OK&amp;lt;/font&amp;gt; программа предложит выбрать WAV-файл – укажите аудиодорожку, очищенную от шума. Чтобы убедиться, что внешняя аудиодорожка действительно подключена, можно снова посмотреть&lt;br /&gt;
свойства загруженного файла: кодеком для аудио теперь должен быть PCM. Для подготовки видеофайла в формате, понятном DVD-плейеру, необходимо сделать следующие настройки.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;font color=darkblue&amp;gt;Видео&amp;lt;/font&amp;gt;. Оставить &amp;lt;font color=darkblue&amp;gt;Копировать&amp;lt;/font&amp;gt;, если вы не производили никаких операций над видеопотоком, в противном случае выбрать один из форматов DVD.&lt;br /&gt;
*&amp;lt;font color=darkblue&amp;gt;Аудио&amp;lt;/font&amp;gt;. Установить в &amp;lt;font color=darkblue&amp;gt;FFm AC3&amp;lt;/font&amp;gt;, в качестве контейнера выбрать &amp;lt;font color=darkblue&amp;gt;MPEG PS A+V&amp;lt;/font&amp;gt; ('''Рис. 4'''). Обратите внимание, именно этот контейнер необходим для того, чтобы все DVD-плейеры понимали сохраненный вами файл. Теперь нажмите кнопку &amp;lt;font color=darkblue&amp;gt;Сохранить&amp;lt;/font&amp;gt; и введите имя файла.&lt;br /&gt;
&lt;br /&gt;
Задача практически решена – осталось подготовить DVD-диск с новым материалом. Для этого все содержимое оригинального диска, кроме файлов, которые подвергались обработке, необходимо переписать на жесткий диск (лучше всего опять же в отдельный каталог). Файл с очищенным аудиопотоком можно переименовать в '''VTS_01_1.VOB''' и скопировать туда же. Если полученный файл '''VTS_01_1.VOB''' оказался длиннее 2048 МБ, то мы имеем дополнительную проблему (см. врезку), которую легко решить при помощи ''QDVDAuthor''. В противном случае можно сразу переходить к прожигу нового диска. После чего можно вставить DVD в плейер и наслаждаться результатом.&lt;br /&gt;
&lt;br /&gt;
==Врезки==&lt;br /&gt;
&lt;br /&gt;
===Меньше – значит лучше===&lt;br /&gt;
&lt;br /&gt;
На этапе создания DVD-видео вы можете столкнуться еще с одной проблемой: ваш VOB-файл может превысить ограничение в 2048 МБ, накладываемое файловой системой ISO9660. UDF в этом смысле более либеральна, но поддерживается не всеми DVD-плейерами (диапазон возможных проблем варьируется от нечитаемости диска до неработающего ускоренного просмотра). К счастью, ''QDVDAuthor'' умеет делить большой файл на части.&lt;br /&gt;
&lt;br /&gt;
Запустите программу. Как и в ''Avidemux'', рабочее окно здесь разделено на две части: в левой – структура проекта DVD, а в правой визуальное отображение ('''Рис.5'''). Нажмите кнопку &amp;lt;font color=darkblue&amp;gt;Add Movie&amp;lt;/font&amp;gt; – запустится мастер создания нового проекта, который последовательно предлагает выбрать каталог для хранения временных данных (по умолчанию '''/tmp'''), имя проекта и каталог, в котором будет сохраняться сгенерированная структура DVD. После этого предлагается выбрать собственно видеофайл – нам требуется тот, что вы сохранили из ''Avidemux''.&lt;br /&gt;
&lt;br /&gt;
Выберите в меню пункт &amp;lt;font color=darkblue&amp;gt;DVDAuthor &amp;gt; Create DVD&amp;lt;/font&amp;gt; или нажмите большую кнопку с изображением DVD-диска на панели инструментов. Программа дважды спросит,&lt;br /&gt;
хотим ли мы создать DVD без какого-либо меню; следует ответить &amp;lt;font color=darkblue&amp;gt;«Да»&amp;lt;/font&amp;gt;. Затем появится окно, содержащее очередь команд для создания DVD ('''Рис. 6'''), здесь все можно оставить без изменений. Нажмите &amp;lt;font color=darkblue&amp;gt;«ОК»&amp;lt;/font&amp;gt;, и некоторое время спустя в выбранном каталоге появится сгенерированный DVD (программа создает полную структуру, начиная с каталогов '''AUDIO_TS''' и '''VIDEO_TS'''). Здесь нам необходимо только взять файлы '''VTS_01_x.VOB''' и перенести их в свой каталог, который мы создали чуть раньше (при необходимости, если на вашем DVD они находились не в первом разделе, их можно переименовать). Не обращайте внимания на разницу в длине полученных и оригинальных VOB-файлов – это нисколько не влияет на результат, поскольку меню DVD ориентируется на положение кадров во временной шкале, которое не меняется.&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:Perl_%D0%B8_C%2B%2B</id>
		<title>LXF98:Perl и C++</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:Perl_%D0%B8_C%2B%2B"/>
				<updated>2008-03-27T13:35:19Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: Новая: ==&amp;lt;font color=darkred&amp;gt;Как работать&amp;lt;/font&amp;gt; с классами С++ из Perl==  ''Огорчены, что PerlQt застрял на версии 3.008?Не беспокой...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;font color=darkred&amp;gt;Как работать&amp;lt;/font&amp;gt; с классами С++ из Perl==&lt;br /&gt;
&lt;br /&gt;
''Огорчены, что PerlQt застрял на версии 3.008?Не беспокойтесь – '''Вадим Лихота''' расскажет, как решить подобную задачу своими силами. Если, конечно, хватит терпения.''&lt;br /&gt;
&lt;br /&gt;
Описаний того, как импортировать в Perl функции из С, достаточно много, а вот информацию об использовании классов C++ я встречал в виде кратких описаний только в “''XS Cookbook''” &amp;lt;font color=darkblue&amp;gt;[1, 2]&amp;lt;/font&amp;gt; и небольшой статье &amp;lt;font color=darkblue&amp;gt;[4]&amp;lt;/font&amp;gt;. Пример использования класса С++ в Perl’е из “''XS Cookbook''” в сокращенном варианте перекочевал в perlxstut. Кроме того, на CPAN можно найти модули, импортирующие классы С++ и имеющие файлы импорта, которые можно использовать в качестве примера, такие, как Boost-Graph, Lucene, Search-Xapian,Однако они не покрывают многих вариантов подключения классов.&lt;br /&gt;
&lt;br /&gt;
Чтобы не умножать сущности без надобности, т.е. не писать новых классов, которые потом нигде не пригодятся, воспользуемся уже готовой библиотекой ''QtCore'' из состава ''Qt4''. Для удобства я буду приводить части заголовочных файлов этой библиотеки, но все примеры будут работоспособны при подключении реальной библиотеки. Кроме того, использование файла '''perlobject.map''' &amp;lt;font color=darkblue&amp;gt;[3]&amp;lt;/font&amp;gt; позволит не писать заново описание объектов.&lt;br /&gt;
&lt;br /&gt;
===Начальные данные для любого модуля===&lt;br /&gt;
&lt;br /&gt;
Начальные данные для любого модуля можно найти в уже упомянутой статье &amp;lt;font color=darkblue&amp;gt;[4]&amp;lt;/font&amp;gt;, однако они столь ценны и необходимы для раскрытия темы, что заслуживают отдельного рассмотрения. Скелет любого модуля можно написать вручную, но легче и быстрее это делается командой &amp;lt;font color=darkred&amp;gt;h2xs -An имя_модуля&amp;lt;/font&amp;gt;. В результате будет создан каталог для модуля с необходимыми файлами, содержимое которых детально описано в «Программировании на Perl» &amp;lt;font color=darkblue&amp;gt;[5]&amp;lt;/font&amp;gt;. Дав команду &amp;lt;font color=darkred&amp;gt;h2xs -An QtCore&amp;lt;/font&amp;gt;, вы&lt;br /&gt;
получите скелет модуля. В созданный каталог QtCore необходимо скопировать '''perobject.map''' (названия всех файлов приводятся относительно каталога '''QtCore'''). Созданный файл '''Makefile.PL''' надо привести к следующему виду:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 use 5.008;&lt;br /&gt;
 use ExtUtils::MakeMaker;&lt;br /&gt;
 $CC = ‘g++’;&lt;br /&gt;
 WriteMakefile(&lt;br /&gt;
      NAME                 =&amp;gt; ‘QtCore’,&lt;br /&gt;
      VERSION_FROM         =&amp;gt; ‘lib/QtCore.pm’,&lt;br /&gt;
      PREREQ_PM              =&amp;gt; {}, # e.g., Module::Name =&amp;gt; 1.1&lt;br /&gt;
      ($] &amp;gt;= 5.005 ?&lt;br /&gt;
           (ABSTRACT_FROM           =&amp;gt; ‘lib/QtCore.pm’,&lt;br /&gt;
           AUTHOR              =&amp;gt; ‘A. U. Thor &amp;lt;author@localdomain&amp;gt;’) : ()),&lt;br /&gt;
      LIBS                =&amp;gt; [‘’],&lt;br /&gt;
      DEFINE          =&amp;gt; ‘’,&lt;br /&gt;
      CC               =&amp;gt; $CC,&lt;br /&gt;
      LD               =&amp;gt; ‘$(CC)’,&lt;br /&gt;
      INC               =&amp;gt; ‘’,&lt;br /&gt;
      # OBJECT            =&amp;gt; ‘$(O_FILES)’,&lt;br /&gt;
      XSOPT                 =&amp;gt; ‘-C++’,&lt;br /&gt;
      TYPEMAPS             =&amp;gt; [‘perlobject.map’],&lt;br /&gt;
 );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Выделенные жирным строки необходимо добавить именно для того, чтобы Perl заработал с С++.&lt;br /&gt;
&lt;br /&gt;
Кроме того, важно исправить файл '''QtCore.xs''', который будет содержать импортируемые в Perl функции:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 #ifdef __cplusplus&lt;br /&gt;
 extern “C” {&lt;br /&gt;
 #endif&lt;br /&gt;
 #include “EXTERN.h”&lt;br /&gt;
 #include “perl.h”&lt;br /&gt;
 #include “XSUB.h”&lt;br /&gt;
 #ifdef __cplusplus&lt;br /&gt;
 }&lt;br /&gt;
 #endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для наглядного примера создадим в этом файле класс, который будет хранить, допустим, версию программы. Для этого добавим класс после подключенных заголовочных файлов перед строкой &amp;lt;font color=darkred&amp;gt;MODULE = QtCore PACKAGE = QtCore&amp;lt;/font&amp;gt;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 class QtCore {&lt;br /&gt;
 public:&lt;br /&gt;
      QtCore(){ vers = 0.001; };&lt;br /&gt;
      ~QtCore(){};&lt;br /&gt;
      double ver(){ return vers; };&lt;br /&gt;
      void setVer(double v){ vers = v; };&lt;br /&gt;
 private:&lt;br /&gt;
      double vers;&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Работа с обычными функциями, конструктором и деструктором уже предусмотрена в Perl XS, поэтому после объявления модуля и пакета можно использовать краткие объявления функций (также возможны комментарии в perl-стиле):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 MODULE = QtCore           PACKAGE = QtCore&lt;br /&gt;
 =comment&lt;br /&gt;
 явное указание использовать прототипы функций позволяет &lt;br /&gt;
 избежать некоторых ошибок при передаче параметров в функции, но&lt;br /&gt;
 в тоже время не дает упростить использование этих функций.&lt;br /&gt;
 Например, если функция получает два параметра, а ваши данные для&lt;br /&gt;
 нее хранятся в массиве @aa, то ее необходимо вызывать как&lt;br /&gt;
 my_func($aa[0], $aa[1]).&lt;br /&gt;
 Тогда как при указании “PROTOTYPES: DISABLE” можно эту функцию&lt;br /&gt;
 вызвать как my_func(@aa).&lt;br /&gt;
 =cut&lt;br /&gt;
 PROTOTYPES: ENABLE&lt;br /&gt;
 =comment&lt;br /&gt;
 XS распознает только один конструктор -- “new”. Если их будет&lt;br /&gt;
 больше, то каждый нуждается в подробном описании.&lt;br /&gt;
 =cut&lt;br /&gt;
 QtCore *&lt;br /&gt;
 QtCore::new()&lt;br /&gt;
 =comment&lt;br /&gt;
 методы класса&lt;br /&gt;
 =cut&lt;br /&gt;
 double&lt;br /&gt;
 QtCore::ver()&lt;br /&gt;
 void&lt;br /&gt;
 QtCore::setVer(v)&lt;br /&gt;
      double v&lt;br /&gt;
 =comment&lt;br /&gt;
 В подавляющем большинстве случаев такого вызова деструктора&lt;br /&gt;
 хватает.&lt;br /&gt;
 Однако если вы хотите явно освободить память, уничтожить&lt;br /&gt;
 зависимые объекты и т.п., то пример вызова деструктора найдете в&lt;br /&gt;
 XS Cookbook [2, ArrayOfStruct].&lt;br /&gt;
 =cut&lt;br /&gt;
 void&lt;br /&gt;
 QtCore::DESTROY() &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Кроме того, для вызова класса следует указать Perl’у, чем является класс &amp;lt;font color=darkred&amp;gt;QtCore&amp;lt;/font&amp;gt;, т.е. как работать с этим типом данных, для чего создадим файл '''typemap''' со следующим содержимым:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 TYPEMAP&lt;br /&gt;
 QtCore * O_OBJECT&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Описания встроенных типов данных представлены в '''typemap.xs''' &amp;lt;font color=darkblue&amp;gt;[6]&amp;lt;/font&amp;gt;, а описание &amp;lt;font color=darkred&amp;gt;O_OBJECT&amp;lt;/font&amp;gt; находится в файле '''perlobject.map'''. Если не добавлять этот файл, то придется самостоятельно полностью описывать все дополнительные типы данных в файле '''typemap''' (пример подобного описания приводится ниже). После этого остается внести изменения в файл '''lib/QtCore.pm''', который и будет подключаться в конечных скриптах. Поскольку '''QtCore.pm''' будет объектом, и ничего экспортироваться из него не будет, то следует убрать из этого файла все относящееся к модулю &amp;lt;font color=darkred&amp;gt;Exporter&amp;lt;/font&amp;gt;. Для импорта внешних функций можно использовать как &amp;lt;font color=darkred&amp;gt;XSLoader&amp;lt;/font&amp;gt;, так и более старый &amp;lt;font color=darkred&amp;gt;DynaLoader&amp;lt;/font&amp;gt; (я использовал второй, т.к. к нему чаще обращаются).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 package QtCore;&lt;br /&gt;
 use 5.008;&lt;br /&gt;
 use strict;&lt;br /&gt;
 use warnings;&lt;br /&gt;
 require DynaLoader;&lt;br /&gt;
 our @ISA = qw(DynaLoader);&lt;br /&gt;
 our $VERSION = ‘0.01’;&lt;br /&gt;
 bootstrap QtCore $VERSION;&lt;br /&gt;
 1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Чтобы собрать полученный модуль, выполните команды '''perl Makefile.PL &amp;amp;&amp;amp; make'''.&lt;br /&gt;
&lt;br /&gt;
Все сделанное необходимо протестировать. В модуле уже есть каталог '''t/''' для тестовых скриптов, которые, однако, расчитаны только на то, чтоб по команде '''make test''' вывести “'''имя_скрипта.....ok'''”. Этого явно недостаточно, чтобы подробно просмотреть работоспособность написанного модуля. Поэтому создадим каталог '''test/''' со скриптом '''qtcore.pl''' и следующим содержимым:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 #!/usr/bin/perl -w&lt;br /&gt;
 use blib;&lt;br /&gt;
 use QtCore;&lt;br /&gt;
 my $q = new QtCore;&lt;br /&gt;
 $q-&amp;gt;setVer(4.001);&lt;br /&gt;
 print $q-&amp;gt;ver(), “\n”;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате запуска скрипта должна появиться указанная нами версия 4.001.&lt;br /&gt;
&lt;br /&gt;
===Импортирование нескольких классов===&lt;br /&gt;
&lt;br /&gt;
Едва ли можно найти библиотеку, состоящую из одного класса. Когда классов немного, их можно описать в одном '''xs'''-файле, или последовать примеру модуля &amp;lt;font color=darkred&amp;gt;Search-Xapian&amp;lt;/font&amp;gt;, в котором один большой файл разбит на несколько, объединяемых командой&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 INCLUDE: подключаемый_файл.xs&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Однако главным недостатком такого подхода является необходимость подключения всех заголовочных файлов в одном месте, содержимое которых будет находиться в одной области видимости. Третий вариант, особенно удобный для такой большой библиотеки, как ''QtCore'', заключается в том, чтобы сделать каждый '''xs'''-файл относительно независимым и в каждом из них подключать только заголовочный файл, описывающий нужный класс. Это обычно делается двумя способами. Первый состоит в том, чтобы в главном '''xs'''-файле прописать импорт boot-функций всех файлов и выполнять их в boot-функции основного '''xs'''-файла, вызываемого функцией &amp;lt;font color=darkred&amp;gt;bootstrap&amp;lt;/font&amp;gt;. Примеры реализации данного способа можно увидеть в библиотеках ''perl-Glib/Gtk2'', ''Perl-RPM'' (в каждой немного по-своему). Другой способ заключается в том, чтобы все вызовы сделать из главного модуля, но уже на Perl’e. Данный вариант реализован в &amp;lt;font color=darkred&amp;gt;Win32::Gui&amp;lt;/font&amp;gt;. На мой взгляд, он более удобен и обладает большей переносимостью.&lt;br /&gt;
&lt;br /&gt;
Опишем последний вариант подробнее. Прежде всего следует удалить оставшиеся файлы предыдущей сборки, а именно: каталог '''blib''' и файлы '''Makefile''', '''pm_to_blib''', '''QtCore.bs''', '''*.c''', '''*.o'''.&lt;br /&gt;
&lt;br /&gt;
Далее настроим обработку нескольких xs-файлов, для чего в '''Makefile.PL''' раскомментируем строку&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 OBJECT           =&amp;gt; ‘$(O_FILES)’.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Вследствие этого будут отрабатываться все '''xs'''-файлы, найденные в каталоге модуля (во вложенных каталогах поиск не ведется). Подключим библиотеку '''QtCore.so''', для чего в строку&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 LIBS          =&amp;gt; [‘’],&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
пропишем ее:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 LIBS          =&amp;gt; [‘-L/usr/lib -lQtCore ‘],&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Для примера импортирования нескольких классов выберем небольшой класс &amp;lt;font color=darkred&amp;gt;QSize&amp;lt;/font&amp;gt; (если у вас не установлен ''Qt4'', файл '''qsize.h''' можно найти на диске).&lt;br /&gt;
&lt;br /&gt;
Создадим файл '''QSize.xs''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 #ifdef __cplusplus&lt;br /&gt;
 extern “C” {&lt;br /&gt;
 #endif&lt;br /&gt;
 #include “EXTERN.h”&lt;br /&gt;
 #include “perl.h”&lt;br /&gt;
 #include “XSUB.h”&lt;br /&gt;
 #ifdef __cplusplus&lt;br /&gt;
 }&lt;br /&gt;
 #endif&lt;br /&gt;
 #include &amp;lt;QtCore/qsize.h&amp;gt;&lt;br /&gt;
 MODULE = QtCore::QSize       PACKAGE = QtCore::QSize&lt;br /&gt;
 =comment&lt;br /&gt;
 QSize входит в состав QtCore&lt;br /&gt;
 =cut&lt;br /&gt;
 PROTOTYPES: ENABLE&lt;br /&gt;
 QSize *&lt;br /&gt;
 QSize::new()&lt;br /&gt;
 bool&lt;br /&gt;
 QSize::isEmpty()&lt;br /&gt;
 int&lt;br /&gt;
 QSize::width()&lt;br /&gt;
 int&lt;br /&gt;
 QSize::height()&lt;br /&gt;
 void&lt;br /&gt;
 QSize::setWidth(w)&lt;br /&gt;
      int w&lt;br /&gt;
 void&lt;br /&gt;
 QSize::setHeight(h)&lt;br /&gt;
      int h&lt;br /&gt;
 void&lt;br /&gt;
 QSize::DESTROY()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Далее создадим для класса &amp;lt;font color=darkred&amp;gt;QSize&amp;lt;/font&amp;gt; собственный '''pm'''-файл '''lib/QtCore/QSize.pm'''.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 package QtCore::QSize;&lt;br /&gt;
 use 5.008;&lt;br /&gt;
 use strict;&lt;br /&gt;
 use warnings;&lt;br /&gt;
 use QtCore; # необходимо для вызыва bootstarp, находящегося в  файле QtCore&lt;br /&gt;
 QtCore::bootstrap_subpackage ‘QSize’;&lt;br /&gt;
 1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В дальнейшем файлы '''QtCore.xs''' и '''lib/QtCore.pm''' будут нужны только для вызова bootstrap модуля '''QtCore.pm'''. Заметим, что класс в '''QtCore.xs''' можно удалить, но тогда придется добавить хотя бы одну внешнюю функцию, иначе в файле '''QtCore.c''', который создается на основе '''QtCore.xs''', не будет всех нужных объявлений. Вообще все boot-функции и объявления в них можно прописать и вручную, но вряд ли это целесообразно, если компилятор XS делает все сам. Теперь следует добавить в '''lib/QtCore.pm''' функцию, которая будет выполнять роль &amp;lt;font color=darkred&amp;gt;bootstrap&amp;lt;/font&amp;gt; для остальных модулей:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 sub bootstrap_subpackage {&lt;br /&gt;
      my($package) = @_;&lt;br /&gt;
      $package = ‘QtCore::’.$package;&lt;br /&gt;
      my $symbol = $package;&lt;br /&gt;
      $symbol =~ s/\W/_/g;&lt;br /&gt;
      no strict ‘refs’;&lt;br /&gt;
      DynaLoader::dl_install_xsub(&lt;br /&gt;
            “${package}::bootstrap”,&lt;br /&gt;
            DynaLoader::dl_find_symbol_anywhere(“boot_$symbol”)&lt;br /&gt;
      );&lt;br /&gt;
      &amp;amp;{ “${package}::bootstrap” };&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
И последний шаг в нашем примере импортирования нескольких классов. Класс следует описать в файле '''typemap''', добавив в конце&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 QSize *             O_OBJECT&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Вот теперь уже можно запустить '''perl Makefile.PL &amp;amp;&amp;amp; make''' и потестировать то, что получилось. Для проверки можно создать файл '''test/qsize.pl''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 #!/usr/bin/perl -w&lt;br /&gt;
 use blib;&lt;br /&gt;
 use QtCore::QSize;&lt;br /&gt;
 use Carp ‘croak’;&lt;br /&gt;
 my $q = new QtCore::QSize; # создать класс&lt;br /&gt;
 print “q is empty\n” if $q-&amp;gt;isEmpty();&lt;br /&gt;
 $q-&amp;gt;setWidth(2); # присвоить параметр&lt;br /&gt;
 print $q-&amp;gt;width(), “\n”; # проверить&lt;br /&gt;
 $q-&amp;gt;setHeight(3);&lt;br /&gt;
 print “q isn’t empty\n” unless $q-&amp;gt;isEmpty();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Использование нескольких конструкторов===&lt;br /&gt;
&lt;br /&gt;
Класс &amp;lt;font color=darkred&amp;gt;QSize&amp;lt;/font&amp;gt; содержит два конструктора, а компилятор XS знает только про new. Поэтому второй конструктор мы реализуем сами. Чтобы увидеть, что для этого надо, достаточно посмотреть в файл '''QSize.c''', автоматически сгенерированный компилятором XS из файла '''QSize.xs''':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 char *      CLASS = (char *)SvPV_nolen(ST(0));&lt;br /&gt;
 QSize *      RETVAL;&lt;br /&gt;
 RETVAL = new QSize();&lt;br /&gt;
 ST(0) = sv_newmortal();&lt;br /&gt;
 sv_setref_pv( ST(0), CLASS, (void*)RETVAL );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Иными словами, благодаря &amp;lt;font color=darkred&amp;gt;QSize::&amp;lt;/font&amp;gt;, расположенному перед конструктором &amp;lt;font color=darkred&amp;gt;new&amp;lt;/font&amp;gt;, в функцию передается строковый параметр &amp;lt;font color=darkred&amp;gt;CLASS&amp;lt;/font&amp;gt; с названием класса, после чего создается объект и используется &amp;lt;font color=darkred&amp;gt;bless&amp;lt;/font&amp;gt; для полученной ссылки. Для примера импорта конструктора в '''QSize.xs''' создадим конструктор &amp;lt;font color=darkred&amp;gt;new1&amp;lt;/font&amp;gt; с явным указанием компилятору на код и возвращаемый параметр:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 QSize *&lt;br /&gt;
 new1(CLASS)&lt;br /&gt;
      char * CLASS&lt;br /&gt;
      CODE:&lt;br /&gt;
            RETVAL = new QSize();&lt;br /&gt;
      OUTPUT:&lt;br /&gt;
      RETVAL&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Теперь запустим ''make''. Получный в '''QSize.c''' код для &amp;lt;font color=darkred&amp;gt;new1&amp;lt;/font&amp;gt; будет идентичен автоматически созданному коду для конструктора &amp;lt;font color=darkred&amp;gt;new&amp;lt;/font&amp;gt;. Однако появятся две пометки о том, что код взят из '''QSize.xs'''. Аналогично создадим второй конструктор, но уже с параметрами инициализации:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 QSize *&lt;br /&gt;
 new2(CLASS, w, h);&lt;br /&gt;
      int w&lt;br /&gt;
      int h&lt;br /&gt;
      char * CLASS&lt;br /&gt;
      CODE:&lt;br /&gt;
            RETVAL = new QSize(w, h);&lt;br /&gt;
      OUTPUT:&lt;br /&gt;
            RETVAL&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Заметим, что в Perl’е удобнее было бы использовать идентификатор &amp;lt;font color=darkred&amp;gt;new&amp;lt;/font&amp;gt; для вызова любого конструктора, не различая их по номерам.&lt;br /&gt;
Для реализации этой идеи удалим из '''QSize.xs''' вызов &amp;lt;font color=darkred&amp;gt;QSize::new()&amp;lt;/font&amp;gt;, после чего добавим в '''lib/QtCore/QSize.pm''' функцию с таким же названием. В зависимости от содержимого, она сама будет выбирать, что ей вызвать. При неверном количестве параметров функция выведет сообщение об ошибке:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 sub new {&lt;br /&gt;
      return new1($_[0]) if ( scalar(@_) == 1 );&lt;br /&gt;
      return new2($_[0], $_[1], $_[2]) if ( scalar(@_) == 3 );&lt;br /&gt;
      croak(“ожидалось 0 или 2 параметра\n”);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Далее дайте команду ''make'' и проверьте, как все работает, для чего добавьте в '''test/qsize.pl''' строку&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 my $w = QtCore::QSize-&amp;gt;new(5,6);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Сложение классов ( operator+ )===&lt;br /&gt;
&lt;br /&gt;
Если в исходном классе, написанном на С++, содержатся операторы «арифметических» и «логических» действий c классами, то данные&lt;br /&gt;
функции желательно импортировать в Perl.&lt;br /&gt;
&lt;br /&gt;
Сначала рассмотрим, что добавить в '''QSize.xs''' для &lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 QSize &amp;amp;operator+=(const QSize &amp;amp;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Оператор возвращает тот же класс, к которому осуществляется прибавление, поэтому возвратить &amp;lt;font color=darkred&amp;gt;QSize&amp;lt;/font&amp;gt; можно и в функции на Perl’e. Поскольку Perl по своей сути работает только с указателями, то перед передачей функции прибавляемого класса &amp;lt;font color=darkred&amp;gt;otherSize&amp;lt;/font&amp;gt; его (указатель) следует разыменовать:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 void&lt;br /&gt;
 QSize::operator_plus_eq(otherSize)&lt;br /&gt;
       QSize * otherSize&lt;br /&gt;
       CODE:&lt;br /&gt;
              THIS-&amp;gt;operator+= (*otherSize);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Или, например, другой оператор:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 friend inline const QSize operator+(const QSize &amp;amp;, const QSize &amp;amp;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Несмотря на то, что фунция &amp;lt;font color=darkred&amp;gt;operator+&amp;lt;/font&amp;gt; не является внутренней для &amp;lt;font color=darkred&amp;gt;QSize&amp;lt;/font&amp;gt;, это не мешает получить указатель на первый класс указанным выше способом. В то же время &amp;lt;font color=darkred&amp;gt;operator+&amp;lt;/font&amp;gt; возвращает новый объект &amp;lt;font color=darkred&amp;gt;QSize&amp;lt;/font&amp;gt;, который будет жить только в пределах С-функции. Нам же необходимо вернуть указатель на новый объект &amp;lt;font color=darkred&amp;gt;QSize&amp;lt;/font&amp;gt;. Поэтому создадим новый экземпляр класса &amp;lt;font color=darkred&amp;gt;QSize&amp;lt;/font&amp;gt; и присвоим ему результат. Класс &amp;lt;font color=darkred&amp;gt;QSize&amp;lt;/font&amp;gt; простой, поэтому конструктор копий создается компилятором автоматически.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 QSize *&lt;br /&gt;
 QSize::operator_plus(qsize2)&lt;br /&gt;
       QSize * qsize2&lt;br /&gt;
       PREINIT:&lt;br /&gt;
       char * CLASS = “QtCore::QSize”;&lt;br /&gt;
       CODE:&lt;br /&gt;
              RETVAL = new QSize();&lt;br /&gt;
              *RETVAL = (operator+ ( *THIS, *qsize2 ));&lt;br /&gt;
       OUTPUT:&lt;br /&gt;
              RETVAL&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В файле '''lib/QtCore/QSize.pm''' следует сделать оболочку для данных функций, используя &amp;lt;font color=darkred&amp;gt;overload&amp;lt;/font&amp;gt; (подробности использования &amp;lt;font color=darkred&amp;gt;overload&amp;lt;/font&amp;gt; смотрите в '''perldoc''' или «Программировании на Perl» &amp;lt;font color=darkblue&amp;gt;[5, стр. 397]&amp;lt;/font&amp;gt;):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 use overload&lt;br /&gt;
       ‘+’ =&amp;gt; \&amp;amp;_plus,&lt;br /&gt;
       ‘+=’ =&amp;gt; \&amp;amp;_plus_eq,&lt;br /&gt;
       ‘””’ =&amp;gt; sub { $_[0] };&lt;br /&gt;
 sub _plus_eq {&lt;br /&gt;
       unless ( ref($_[1]) ) {&lt;br /&gt;
              croak(“need QSize += QSize\n”);&lt;br /&gt;
              return;&lt;br /&gt;
       }&lt;br /&gt;
       operator_plus_eq($_[0], $_[1]);&lt;br /&gt;
       return $_[0]; # возвращается указатель на тот же экземпляр&lt;br /&gt;
 класса&lt;br /&gt;
 }&lt;br /&gt;
 sub _plus {&lt;br /&gt;
       if ( ref($_[0]) and ref($_[1]) ) {&lt;br /&gt;
              return operator_plus($_[0], $_[1]);&lt;br /&gt;
       }&lt;br /&gt;
       croak(“Need QSize1 = QSize2 + QSize3\n”);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В заключение осталось проверить работоспособность операторов. Добавьте в '''test/qsize.pl''' такие строки:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 $w += $q;&lt;br /&gt;
 print “w (h, w) == “, $w-&amp;gt;height(), “ “, $w-&amp;gt;width(), “\n”;&lt;br /&gt;
 my $e = $w + $q;&lt;br /&gt;
 print “e (h, w) == “, $e-&amp;gt;height(), “ “, $e-&amp;gt;width(), “\n”;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
И, запустив, убедитесь, что это работает.&lt;br /&gt;
&lt;br /&gt;
===Особенности использования enum===&lt;br /&gt;
&lt;br /&gt;
Работа с &amp;lt;font color=darkred&amp;gt;enum&amp;lt;/font&amp;gt; предусмотрена в Perl XS, однако с C++ появляется одна неприятность. В время обработки '''xs'''-файла компилятором XS обращения в другие классы за определенными в них enum, как, например, &amp;lt;font color=darkred&amp;gt;Qt::AspectRatioMode&amp;lt;/font&amp;gt;, в с-файле &amp;lt;font color=darkred&amp;gt;Qt::AspectRatioMode&amp;lt;/font&amp;gt; превращается в &amp;lt;font color=darkred&amp;gt;Qt__AspectRatioMode&amp;lt;/font&amp;gt;, и выдается ошибка компилятора о несуществующем типе. К сожалению, нет никакой возможности избежать этого преобразования, ибо таким способом создаются все функции с целью&lt;br /&gt;
не допустить дублирования названий функций с другими классами. Чтобы компилятор правильно увидел используемый нами enum, переопределим его в исходный облик. В C-части '''xs'''-файла после подключения '''qsize.h''' добавим:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 #define Qt__AspectRatioMode Qt::AspectRatioMode&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Теперь можно описать функцию с этим типом данных:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 void&lt;br /&gt;
 QSize::scale(w, h, mode)&lt;br /&gt;
       int w&lt;br /&gt;
       int h&lt;br /&gt;
       Qt::AspectRatioMode mode&lt;br /&gt;
       CODE:&lt;br /&gt;
             THIS-&amp;gt;scale(w, h, mode);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Не забудьте добавить в '''typemap''' новый тип данных:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Qt::AspectRatioMode              T_ENUM&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Чтобы не запоминать числовые значения всех enum-параметров, добавим модуль '''lib/Qt.pm''' со всеми значениями &amp;lt;font color=darkred&amp;gt;AspectRatioMode&amp;lt;/font&amp;gt;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 package Qt;&lt;br /&gt;
 # enum AspectRatioMode&lt;br /&gt;
 use constant IgnoreAspectRatio =&amp;gt; 0;&lt;br /&gt;
 use constant KeepAspectRatio =&amp;gt; 1;&lt;br /&gt;
 use constant KeepAspectRatioByExpanding =&amp;gt; 2;&lt;br /&gt;
 1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
После добавления или удаления любого файла, следует полностью очистить библиотеку, удалив каталог '''blib''', файлы '''*.c''', '''*.o''' и т.д. После данных манипуляций и выполнения команд '''perl Makefile.PL &amp;amp;&amp;amp; make''' можно тестировать программу. Для этого после &amp;lt;font color=darkred&amp;gt;use blib&amp;lt;/font&amp;gt; в файле '''qsize.pl''' следует добавить&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 use Qt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
а также дописать новую функцию в конце этого файла:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 $e-&amp;gt;scale(20, 20, Qt::IgnoreAspectRatio);&lt;br /&gt;
 print “scale e (h, w) == “, $e-&amp;gt;height(), “ “, $e-&amp;gt;width(), “\n”;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Взаимодействие с STL или ее аналогами===&lt;br /&gt;
&lt;br /&gt;
В Perl’e STL практически не нужна, поскольку большинство возможностей STL уже поддерживаются массивами и хэшами самого языка. Поэтому рассмотрим только передачу данных из шаблона &amp;lt;font color=darkred&amp;gt;list&amp;lt;/font&amp;gt; в массив Perl’a и обратно. Библиотека ''Qt4'' инкапсулирует в себе STL, добавляя некоторые возможности. Мы подробно рассмотрим работу с шаблоном &amp;lt;font color=darkred&amp;gt;QList&amp;lt;/font&amp;gt;, ибо методы некоторых классов возвращают списки классов, используя именно его. Для получения массива обратимся к классу &amp;lt;font color=darkred&amp;gt;QbyteArray&amp;lt;/font&amp;gt;. В нем есть такой конструктор:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 QList&amp;lt;QByteArray&amp;gt; split(char sep) const;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В файле '''QByteArray.xs''' перед использованием шаблонов STL необходимо убрать определения &amp;lt;font color=darkred&amp;gt;do_open&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;do_close&amp;lt;/font&amp;gt;, иначе они начнут конфликтовать с аналогичными из Perl’a.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
 #undef do_open&lt;br /&gt;
 #undef do_close&lt;br /&gt;
 #include &amp;lt;QtCore/qlist.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;QtCore/qbytearray.h&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
 AV *&lt;br /&gt;
 QByteArray::_split(c)&lt;br /&gt;
       char c&lt;br /&gt;
       CODE:&lt;br /&gt;
             RETVAL = newAV();&lt;br /&gt;
             QList&amp;lt;QByteArray&amp;gt; lba = THIS-&amp;gt;split(c);&lt;br /&gt;
             for ( int i = 0 ; i &amp;lt; lba.size() ; ++i ) {&lt;br /&gt;
                   QByteArray * ba = new QByteArray();&lt;br /&gt;
                   *ba = lba.at(i);&lt;br /&gt;
                   SV * rv = newSV(0);&lt;br /&gt;
                   sv_setref_pv( rv, “QtCore::QByteArray”, (void *)ba );&lt;br /&gt;
                   av_push(RETVAL, rv);&lt;br /&gt;
             };&lt;br /&gt;
       OUTPUT:&lt;br /&gt;
             RETVAL&lt;br /&gt;
       CLEANUP:&lt;br /&gt;
             SvREFCNT_dec( RETVAL );&lt;br /&gt;
 ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Иными словами, в описании &amp;lt;font color=darkred&amp;gt;_split&amp;lt;/font&amp;gt; создается анонимный массив,  указатель на который будет передан в программу. Затем вызывается функция &amp;lt;font color=darkred&amp;gt;split&amp;lt;/font&amp;gt; класса на C++, которая возвращает список объектов &amp;lt;font color=darkred&amp;gt;QByteArray&amp;lt;/font&amp;gt;. Этот список обходится в цикле, в котором по одному указателю на объект заносится в массив &amp;lt;font color=darkred&amp;gt;RETVAL&amp;lt;/font&amp;gt;. Поскольку массив принимает только тип данных &amp;lt;font color=darkred&amp;gt;SV*&amp;lt;/font&amp;gt;, то на каждой итерации цикла создается новая переменная. Затем в нее копируется ссылка на объект из списка, приведенная к типу данных Perl функцией &amp;lt;font color=darkred&amp;gt;sv_setref_pv&amp;lt;/font&amp;gt;. Подробно работа с массивами в Perl XS описана в &amp;lt;font color=darkred&amp;gt;perlguts&amp;lt;/font&amp;gt;, а примеры использования массива со строками можно посмотреть в “''XS Cookbook''” &amp;lt;font color=darkblue&amp;gt;[2]&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Следующий шаг состоит в добавлении в '''typemap''' нового класса&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt; &lt;br /&gt;
 QByteArray *                O_OBJECT&lt;br /&gt;
&amp;lt;/sorce&amp;gt;&lt;br /&gt;
и создании для этого класса модуля '''lib/QtCore/QByteArray.pm'''. Функция &amp;lt;font color=darkred&amp;gt;_split&amp;lt;/font&amp;gt; возвращает указатель на массив, однако в программе удобнее пользоваться обычным массивом. С этой целью напишем простейшую оболочку для этой функции. Кроме того, в Perl’e есть своя функция &amp;lt;font color=darkred&amp;gt;split&amp;lt;/font&amp;gt;, поэтому ее надо переопределить в пакете, используя &amp;lt;font color=darkred&amp;gt;use subs&amp;lt;/font&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt; &lt;br /&gt;
 package QtCore::QByteArray;&lt;br /&gt;
  use 5.008;&lt;br /&gt;
  use strict;&lt;br /&gt;
  use warnings;&lt;br /&gt;
  use Carp qw/carp croak/;&lt;br /&gt;
  use QtCore; # bootstraps QtCore.xs&lt;br /&gt;
  QtCore::bootstrap_subpackage ‘QByteArray’;&lt;br /&gt;
  use subs qw(split);&lt;br /&gt;
  sub split {&lt;br /&gt;
        croak(“split: нет разделителя\n”) unless $_[1];&lt;br /&gt;
        return @{ _split($_[0], $_[1]) };&lt;br /&gt;
  }&lt;br /&gt;
 1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Пересоберите пакет и протестируйте его (файл '''test/qbytearray.pl''').&lt;br /&gt;
&lt;br /&gt;
Аналогичным способом массив превращается в шаблон &amp;lt;font color=darkred&amp;gt;QList&amp;lt;/font&amp;gt;. Для примера приведем конструктор класса &amp;lt;font color=darkred&amp;gt;QStringList&amp;lt;/font&amp;gt;, получающий для инициализации массив объектов &amp;lt;font color=darkred&amp;gt;QString&amp;lt;/font&amp;gt;. В файле '''QtCore/qstrinlist.h''' конструктор объявлен как&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 inline QStringList(const QStringList &amp;amp;l) : QList&amp;lt;QString&amp;gt;(l) { }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В '''xs'''-файле для него необходимо создать класс &amp;lt;font color=darkred&amp;gt;QList&amp;lt;QString&amp;gt;&amp;lt;/font&amp;gt; и заполнить его объектами &amp;lt;font color=darkred&amp;gt;QString&amp;lt;/font&amp;gt;, полученными из массива. av является указателем на копию этого массива. Копия используется, поскольку функция &amp;lt;font color=darkred&amp;gt;av_pop()&amp;lt;/font&amp;gt; удаляет из массива считанные элементы.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 QStringList *&lt;br /&gt;
 new3(CLASS, av)&lt;br /&gt;
       char * CLASS&lt;br /&gt;
       AV * av&lt;br /&gt;
       CODE:&lt;br /&gt;
            QList&amp;lt;QString&amp;gt; qls;&lt;br /&gt;
            while ( av_len(av) &amp;gt; -1 ) {&lt;br /&gt;
                 SV * rv = av_pop(av);&lt;br /&gt;
                 QString * str = (QString *)SvIV((SV*)SvRV( rv ));&lt;br /&gt;
                 qls &amp;lt;&amp;lt; *str;&lt;br /&gt;
            }&lt;br /&gt;
            RETVAL = new QStringList(qls);&lt;br /&gt;
       OUTPUT:&lt;br /&gt;
            RETVAL&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Описание типа данных, отсутствующего в typemap.xs и perlobject.map===&lt;br /&gt;
&lt;br /&gt;
В том случае, если нужно добавить новый тип данных, необходимо описать, как компилятору работать с ним, т.е. читать из него данные и записывать. Данная тема описана в документации Perl, но для полноты картины приведем пример, иллюстрирующий работу с отсутствующим в С типом &amp;lt;font color=darkred&amp;gt;string&amp;lt;/font&amp;gt;. Для этого типа в '''typemap''' следует добавить:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
 string           STRING&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ниже в разделах &amp;lt;font color=darkred&amp;gt;INPUT&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;OUTPUT&amp;lt;/font&amp;gt; необходимо описать, как перевести &amp;lt;font color=darkred&amp;gt;string&amp;lt;/font&amp;gt; из внутреннего типа данных Perl’а (переменная &amp;lt;font color=darkred&amp;gt;$arg&amp;lt;/font&amp;gt;) в C++ (переменная &amp;lt;font color=darkred&amp;gt;$var&amp;lt;/font&amp;gt;) и обратно. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;perl&amp;quot;&amp;gt; &lt;br /&gt;
 INPUT&lt;br /&gt;
 STRING&lt;br /&gt;
 {&lt;br /&gt;
       STRLEN len;&lt;br /&gt;
       const char * tmp = SvPV($arg, len);&lt;br /&gt;
       $var.assign(tmp, len);&lt;br /&gt;
       }&lt;br /&gt;
 OUTPUT&lt;br /&gt;
 STRING&lt;br /&gt;
       sv_setpvn((SV*)$arg, (char *) ($var.data()), ($var.size()));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Таким образом, в данной статье были рассмотрены все основные варианты использования C++ и Perl XS. За ее пределами остались только прямое использование шаблонных классов (но, как было указано выше, использовать их нецелесообразно, т. к. STL покрывается возможностями самого Perl’a) и использование lvalue-функций из классов С++ в Perl’e (когда разрабатывался Perl XS для 5-й версии, lvalue изначально не был реализован и в самом Perl5, а более поздних описаний расширений Perl XS на данный момент, по моим сведениям, не существует).&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
&lt;br /&gt;
#Документация Perl (perlxs, perlxstut, perlguts).&lt;br /&gt;
#Dean’s Extension-Building Cookbook in two parts. Part A: http://www.cpan.org/authors/Dean_Roehrich/CookBookA-19960430.tar.gz.&lt;br /&gt;
#Dean’s Extension-Building Cookbook in two parts. Part B: http://www.cpan.org/authors/Dean_Roehrich/CookBookB-19960430.tar.gz.&lt;br /&gt;
#http://www.cpan.org/authors/Dean_Roehrich/perlobject.map-19960302.gz.&lt;br /&gt;
#John Keiser. Gluing C++ And Perl Together. – 2001. – http://www.johnkeiser.com/perl-xs-c++.html.&lt;br /&gt;
#Уолл Л., Кристиансен Т., Орвант Д. Программирование на Perl. – СПб.: Символ-плюс, 2005. – 1152 с.&lt;br /&gt;
#http://search.cpan.org/~nwclark/perl-5.8.8/ext/XS/Typemap/Typemap.xs.&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:wxWidgets</id>
		<title>LXF98:wxWidgets</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:wxWidgets"/>
				<updated>2008-03-27T12:12:55Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: /* Полезные ссылки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==wxWidgets: живая история==&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;font color=darkred&amp;gt;'''ЧАСТЬ 1'''&amp;lt;/font&amp;gt; Что объединяет Audacity, poEdit и FlameRobin? Все они работают на нескольких платформах, используя wxWidgets – и вы тоже так сможете, если прочтете учебник '''Андрея Боровского'''!''&lt;br /&gt;
&lt;br /&gt;
Что такое ''wxWidgets''? Для многих разработчиков это просто набор виджетов, занимающий на платформе Linux почетное третье место после вечных соперников ''Qt'' и ''GTK'', и не все знают, что ''wxWidgets'' – это еще и история открытых графических интерфейсов. Набор визуальных элементов управления ''wxWidget'' появился на свет в 1992 году, тогда же, когда и XFree86. Все началось с того, что сотруднику Университета Эдинбурга Джулиану Смарту [Julian Smart] потребовалась кросс-платформенная библиотека для создания графических интерфейсов на платформах Sun и PC. У университета не нашлось средств на покупку кросс-платформенной библиотеки виджетов (да, были и такие времена), и тогда Смарт поступил так, как и подобает настоящему хакеру – он начал писать собственную библиотеку, которую назвал ''wxWindows''. Проект бесплатной кросс-платформенной библиотеки быстро привлек внимание других программистов в университете, а вскоре – и за его пределами. Первая версия ''wxWindows'' поддерживала ''XView'' (набор виджетов, созданный Sun Microsystems) и MFC&lt;br /&gt;
1.0. В 2003 году представители компании Microsoft обратили внимание на wxWindows и вежливо попросили Дж. Смарта изменить название (слово “Windows” является зарегистрированной торговой маркой Microsoft в Великобритании) &amp;lt;font color=darkblue&amp;gt;[подобные просьбы высказывались и в адрес закрытых проектов, в частности, Windows Commander, – прим. ред.]&amp;lt;/font&amp;gt;. Переговоры продолжались долго; в качестве ответной уступки американская компания предложила материальную компенсацию&lt;br /&gt;
(полученные от Microsoft деньги было решено потратить на развитие проекта), и в августе 2004 года библиотека ''wxWindows'' была официально переименована в ''wxWidgets''.&lt;br /&gt;
&lt;br /&gt;
Почему же ''wxWidgets'' не стала предпочтительным выбором для Linux-программистов? Причина проста: в те далекие времена, когда решалась судьба графических оболочек для Linux, ''wxWidgets'' (тогда еще ''wxWindows'') не поддерживала X11. На платформе Unix/Linux ''wxWidgets'' использовала виджеты Motif/Lesstif, а позднее – ''GTK''. Версия библиотеки, способная работать с X11 без посторонней помощи, появилась только в 2002 году, когда территорию графических оболочек для Linux уже застолбили другие библиотеки.&lt;br /&gt;
&lt;br /&gt;
Библиотека ''wxWidgets'' распространяется на условиях ''wxWindows License'' (которую должна заменить ''wxWidgets License'', отличающаяся от первой только названием). По сути своей, ''wxWindows License'' – это «смягченный вариант» LGPL, позволяющий распространять производные продукты wxWidgets в бинарной форме на ваших собственных условиях без отчислений разработчикам ''wxWidgets''. Фактически, лицензия wxWindows предоставляет разработчику больше возможностей, чем лицензия ''GTK+'', которая обязывает разработчика распространять производные библиотеки на условиях LGPL, и лицензия ''Qt'', которая требует платить за коммерческое использование библиотеки. Приложения, использующие ''wxWidgets'', можно программировать не только на родном для этой библиотеки – C++, но и на других языках программирования (Java, Perl, Python). Существуют также интерфейсы wxWidgets для Microsoft .NET и Mono. На основе ''wxWidgets'' создано немало программ, самой известной из которых является, пожалуй, аудиоредактор Audacity.&lt;br /&gt;
&lt;br /&gt;
Список платформ, поддерживаемых ''wxWidgets'', внушает уважение. Вы можете использовать библиотеку вместе с ''GTK'' (Unix/Linux/MinGW), Lesstif/Motif (Unix/Linux) X11 (Unix/Linux/MinGW), Win32 (Windows, Windows CE), Carbon (Mac OS), Cocoa (Mac OS X, GNUstep), Protein (Palm OS), PM (OS/2), MGL (Unix/DOS). Само это перечисление демонстрирует важную особенность ''wxWidgets'' – «вертикальную» организацию набора виджетов. В отличие от ''Qt'' и ''GTK'', которые ориентированы на платформы, библиотека ''wxWidgets'' ориентирована на интерфейсы. Если какой-либо из поддерживаемых ''wxWidgets'' интерфейсов переносится на новую платформу, перенос ''wxWidgets'' на эту платформу не должен представлять особых проблем. По традиции, версии ''wxWidgets'' для каждой платформы обозначаются добавлением префикса wx к сокращенному названию платформы. Например, ''wxWidgets'' для Windows обозначается как ''wxMSW'', ''wxWidgets'' для ''GTK'' – как ''wxGTK'', ''wxWidgets'' для X11 – как ''wxX11'', и т. д. Еще одна интересная возможность, связанная с многоплатформенностью ''wxWidgets'' – кросскомпиляция. На сайте проекта можно найти инструкции по компиляции ''wxWidgets''-программ для Windows из-под Linux.&lt;br /&gt;
&lt;br /&gt;
Выбирая между ''wxWidgets'' для ''GTK'' и ''wxWidgets'' для X11, следует помнить, что, несмотря на все усилия разработчиков, эти два набора визуальных компонентов все еще неравноценны. На сайтах некоторых проектов, использующих ''wxWidgets'', вы найдете указания, что проект компилируется с ''wxGTK'', но не с ''wxX11''. Объясняется это тем, что набор виджетов ''wxUniversal'', который использует ''wxX11'', все еще не дотягивает по функциональности до набора ''GTK'', на котором основана ''wxGTK''. Разработанный с нуля ''wxUniversal'' представляет собой сравнительно недавнее добавление в ''wxWidgets''. Этот набор виджетов предназначен,&lt;br /&gt;
в перспективе, для тех платформ, у которых собственные наборы виджетов отсутствуют (хотя вряд ли такую можно сейчас найти). Список виджетов и функций, которые присутствуют в ''wxGTK'' и ''wxMSW'', но все еще не реализованы в ''wxX11'', приведен на сайте проекта. В качестве довода в пользу ''wxX11'' можно указать то, что этот набор виджетов не нуждается в «прослойке» ''GTK'' и может работать в системе, где библиотека ''GTK'' не установлена или не настроена должным образом.&lt;br /&gt;
Окончательное решение при выборе между ''wxGTK'' и ''wxX11'' следует принимать, исходя из требований создаваемого приложения (есть ли в ''wxX11'' все необходимые виджеты) и параметров ''GTK'' в целевой системе. При этом, в случае необходимости, базовую платформу можно будет сменить и на ходу (по крайней мере, переход с ''wxX11'' на ''wxGTK'' не вызовет проблем).&lt;br /&gt;
&lt;br /&gt;
Помимо собственно визуальных компонентов, ''wxWidgets'' предоставляет в распоряжение программиста классы для работы с базами данных (поддерживаются интерфейсы ODBC, XBase, SQLite), классы для работы с сокетами и популярными сетевыми протоколами, а также специальные классы для работы с HTML. Есть у ''wxWidgets'' и собственные классы, реализующие распространенные структуры данных (списки, очереди и т. п.), которые были введены в проект еще до появления&lt;br /&gt;
в С++ стандартной библиотеки шаблонов. Поскольку сейчас использование шаблонов стандартной библиотеки представляется более целесообразным, вы можете сконфигурировать ''wxWidgets'' таким образом, чтобы библиотека использовала STL, а не собственные реализации этих структур данных.&lt;br /&gt;
&lt;br /&gt;
В ''wxWidgets'' реализованы сразу два способа определения обработчиков событий. Более старый способ, разработанный под влиянием MFC, основан на статических таблицах событий (event tables). Однако, он не позволяет манипулировать обработчиками событий во время выполнения программы. Второй (более новый) вариант основан на использовании метода &amp;lt;font color=darkred&amp;gt;connect()&amp;lt;/font&amp;gt; и больше похож на динамический способ определения обработчиков событий, используемый в ''Qt''.&lt;br /&gt;
&lt;br /&gt;
===Инструменты разработчика===&lt;br /&gt;
&lt;br /&gt;
Сегодня практически каждый набор виджетов сопровождается средствами визуального программирования и другими вспомогательными инструментами. Библиотека ''wxWidgets'' не является исключением из этого правила. Вспомогательных средств разработки для ''wxWidgets'' существует немало, больше, пожалуй, чем для ''Qt'' и ''GTK'', но при близком знакомстве с этими средствами заядлый линуксоид может испытать разочарование. Мы привыкли к тому, что базовые средства разработки для библиотек виджетов доступны нам на тех же условиях, что и сами библиотеки, однако с ''wxWidgets'' дело обстоит иначе. Наиболее функциональные системы визуального программирования для ''wxWidgets'' либо являются полностью коммерческими продуктами, либо распространяются бесплатно, но без исходных текстов.&lt;br /&gt;
&lt;br /&gt;
Интегрированная среда разработки DialogBlocks, доступная на сайте [http://www.anthemion.co.uk/dialogblocks www.anthemion.co.uk/dialogblocks], претендует на роль официального средства разработки приложений ''wxWidgets'' на C++.&lt;br /&gt;
&lt;br /&gt;
''DialogBlocks'' включает визуальный редактор окон ''wxWidgets'', многооконный текстовый редактор, встроенную справочную систему. Интегрированная среда умеет генерировать Make-файлы для проектов ''wxWidgets'' и пересобирать саму библиотеку. Поддерживается и интерактивная отладка приложений (с использованием внешнего отладчика). Среда ''DialogBlocks'' – коммерческий продукт, который фактически распространяется как shareware. Вы можете работать с программой бесплатно, однако, до тех пор, пока вы не оплатите регистрацию, функциональность ''DialogBlocks'' будет ограничена. Диалоговые окна в незарегистрированной версии могут включать не более 30 визуальных элементов, специальное окно периодически напоминает вам о необходимости регистрации, а многие визуальные элементы оказываются недоступны. При весьма солидных расценках (за новейшую версию разработчик требует $85, «студенческий» вариант обойдется вам на $40 дешевле) ''DialogBlocks'' отнюдь не поражает воображение работы. Редактор исходных текстов лишен тех приятных мелочей (вроде автоматического завершения кода и подсказок для заголовков вызываемых функций), к которым мы давно привыкли в других коммерческих IDE. При первой попытке собрать проект система предлагает указать место расположения компилятора, но ввести путь к файлу gcc в открытом для этого диалоговом окне не удается (окно просто не реагирует на нажатие клавиш). Конечно, пользователя Linux такими мелочами не испугаешь, я тут же полез в окно настроек, где вручную сконфигурировал проект для сборки под ''wxX11''. Далее выяснилось, что для того, чтобы собрать тестовое приложение надо сначала пересобрать ''wxWidgets'', при этом некоторые поддиректории ''wxWidgets'' пришлось переименовывать вручную. После всех этих доработок тестовое приложение скомпилировалось и запустилось. Впрочем, и разочарования на этом не кончились. В текстовом редакторе ''DialogBlocks'' отсутствуют функции быстрого перехода между реализацией функции и ее объявлением, перехода к выбранному заголовочному файлу и им подобные. Фактически встроенный редактор ''DialogBlocks'' не намного лучше, чем ''KWrite''.&lt;br /&gt;
&lt;br /&gt;
Те, кто готов платить за средство разработки для ''wxWidgets'', могут обратить внимание на еще одну коммерческую IDE – ''wxDesigner''.&lt;br /&gt;
&lt;br /&gt;
Среда разработки ''wxDesigner'' – полностью коммерческий продукт (вы можете бесплатно скачать пакет дистрибутива с сайта программы – [http://www.roebling.de www.roebling.de], но незарегистрированная версия не позволит вам сохранять проекты). Работает ''wxDesigner'' не очень стабильно, попытка создать диалоговое окно в режиме визуального программирования несколько раз заканчивалась ошибкой сегментации и аварийным завершением программы. Учитывая, что сам проект ''wxDesigner'' давно не обновлялся, я не рекомендовал бы вам тратить на него свои деньги. В общем и целом следует признать, что по уровню функциональности и удобства коммерческие IDE для ''wxWidgets'' не только не опережают, но даже несколько отстают от открытых IDE, предназначенных для других библиотек. Так, по крайней мере, обстоит дело на платформе Linux. Для тех, кто ведет разработку приложений ''wxWidgets'' на платформе Windows, ситуация складывается более благоприятно. Библиотека ''wxWidgets'' давно уже умеет интегрироваться с Microsoft Visual Studio, а с недавнего времени – и с Borland/CodeGear C++Builder. При этом для «билдера» есть специальный мастер создания форм ''wxWidgets''. Некоторые разработчики нашли выход из положения благодаря кроссплатформенности ''wxWidgets'' – они ведут разработку приложений в одной из Windows IDE, а конечный продукт компилируют в Linux (не рассказывайте об этом фанатам ''Emacs'' и ''Eclipse'', они побьют вас камнями, если узнают).&lt;br /&gt;
&lt;br /&gt;
На платформе Linux частичная (без средств визуального редактирования) поддержка ''wxWidgets'' интегрирована в ''KDevelop'' и ''Anjuta''. Эти интегрированные среды разработки умеют создавать заготовки приложений ''wxWidgets'' а также генерировать скрипты configure и make. Специально для редактирования графических интерфейсов ''wxWidgets'' создается программа ''wxGlade''. Название проекта говорит само за себя – ''wxGlade'' претендует на роль ''Glade'' для ''wxWidgets''. Редактор ''wxGlade'' написан на языке Python и в настоящем своем виде (версия 0.6) подходит больше для тех, кто пишет программы, используя именно этот язык (хотя поддержка C++ и Perl также присутствует).&lt;br /&gt;
&lt;br /&gt;
Собственно говоря, все вышесказанное не должно вселять в вас пессимизм. Если вы можете обойтись без визуального программирования и интерактивных подсказок, для написания приложений ''wxWidgets'' подойдет любой текстовый редактор, хоть тот же ''KWrite''.&lt;br /&gt;
&lt;br /&gt;
===Приступаем к работе===&lt;br /&gt;
&lt;br /&gt;
Хотя в вашем дистрибутиве Linux наверняка есть пакет разработчика для ''wxWidgets'', я рекомендую собрать библиотеку из исходных текстов, доступных на сайте проекта ([http://wxwidgets.org wxwidgets.org] – просто на всякий случай). Скомпилировав ''wxWidgets'', вы не только получаете новейшую версию библиотеки, но и более гибкие средства конфигурирования. Например, для этих статей я решил использовать ''wxX11'', тогда как пакет ''wxWidgets'' из моего дистрибутива (OpenSUSE) сконфигурирован для ''GTK+''. Скрипт '''configure wxwidgets''' позволяет настраивать многие параметры библиотеки с помощью ключей. Например, для того, чтобы скомпилировать ''wxWidgets'' с поддержкой X11, командуем:&lt;br /&gt;
&lt;br /&gt;
 ./configure --with-x11&lt;br /&gt;
&lt;br /&gt;
Ключ &amp;lt;font color=darkred&amp;gt;--enable-stl&amp;lt;/font&amp;gt; указывает, что вместо классов структур данных ''wxWidgets'' следует использовать контейнеры STL. Полное описание ключей &amp;lt;font color=darkred&amp;gt;configure&amp;lt;/font&amp;gt; вы можете получить, как обычно, с помощью ключа &amp;lt;font color=darkred&amp;gt;--help&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Знакомство с программированием в ''wxWidgets'' мы начнем, как всегда, с простейшего приложения (файл '''hwapp.cpp'''):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 #include “wx/wx.h”&lt;br /&gt;
 class HWFrame: public wxFrame&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
       HWFrame() : wxFrame(NULL, wxID_ANY, “First wxWidgets&lt;br /&gt;
 Application”)&lt;br /&gt;
       {&lt;br /&gt;
             label = new wxStaticText(this, wxID_STATIC, “Hello World”);&lt;br /&gt;
       }&lt;br /&gt;
       virtual ~HWFrame()&lt;br /&gt;
       {&lt;br /&gt;
             delete label;&lt;br /&gt;
       }&lt;br /&gt;
 private:&lt;br /&gt;
       wxStaticText * label;&lt;br /&gt;
 };&lt;br /&gt;
 class HWApp: public wxApp&lt;br /&gt;
 {&lt;br /&gt;
       virtual bool OnInit()&lt;br /&gt;
       {&lt;br /&gt;
             HWFrame * myFrame = new HWFrame();&lt;br /&gt;
             myFrame-&amp;gt;Show();&lt;br /&gt;
             return true;&lt;br /&gt;
       }&lt;br /&gt;
 };&lt;br /&gt;
 IMPLEMENT_APP(HWApp);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Эта программа действительно очень проста. Она не обрабатывает события, не содержит сложных элементов интерфейса; все, что она делает – выводит надпись “Hello World” в главном окне. Тем не менее, программа ''hwapp'' демонстрирует важнейшие особенности структуры приложения ''wxWidgets''. Объявления всех классов, функций и макросов библиотеки виджетов становятся доступны нам в результате включения в текст программы одного-единственного заголовочного&lt;br /&gt;
файла – '''wx/wx.h'''. В отличие от ''Qt'' и ''GTKmm'', в ''wxWidgets'', даже при написании простого приложения нам приходится объявлять сразу два собственных класса. Класс &amp;lt;font color=darkred&amp;gt;HWApp&amp;gt;&amp;lt;/font&amp;gt;, который является потомком класса библиотечного &amp;lt;font color=darkred&amp;gt;wxApp&amp;lt;/font&amp;gt;, представляет собой главный класс приложения. Этот класс можно рассматривать как аналог класса &amp;lt;font color=darkred&amp;gt;QApplication&amp;lt;/font&amp;gt; в ''Qt'', с той разницей, что в ''Qt'' нам редко приходится создавать собственный класс, производный от &amp;lt;font color=darkred&amp;gt;QApplication&amp;lt;/font&amp;gt;. Класс &amp;lt;font color=darkred&amp;gt;HWFrame&amp;lt;/font&amp;gt;, который происходит от класса &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt;, реализует главное окно нашей программы. Обратите внимание, что имена всех классов &amp;lt;font color=darkred&amp;gt;wxWidgets&amp;lt;/font&amp;gt; начинаются с префикса &amp;lt;font color=darkred&amp;gt;wx&amp;lt;/font&amp;gt;, а имена методов классов – с заглавной буквы.&lt;br /&gt;
&lt;br /&gt;
В потомке класса &amp;lt;font color=darkred&amp;gt;wxApp&amp;lt;/font&amp;gt; нам требуется переопределить только один базовый метод – &amp;lt;font color=darkred&amp;gt;OnInit()&amp;lt;/font&amp;gt;. Этот виртуальный метод вызывается базовым классом в самом начале работы программы и именно на него возложена задача по созданию и отображению главного окна. Если метод &amp;lt;font color=darkred&amp;gt;OnInit()&amp;lt;/font&amp;gt; возвращает значение &amp;lt;font color=darkred&amp;gt;'''false'''&amp;lt;/font&amp;gt;, выполнение программы сразу же завершается. Если вам необходимо выполнить какие-либо специальные действия в процессе завершения программы (например, высвободить занятые программой ресурсы), вы можете переопределить метод &amp;lt;font color=darkred&amp;gt;OnExit()&amp;lt;/font&amp;gt; класса &amp;lt;font color=darkred&amp;gt;wxApp&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В методе &amp;lt;font color=darkred&amp;gt;OnInit()&amp;lt;/font&amp;gt; мы создаем объект класса-потомка &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt; и вызываем его метод &amp;lt;font color=darkred&amp;gt;Show()&amp;lt;/font&amp;gt;, для того чтобы окно, созданное этим объектом, стало видимым. В классе &amp;lt;font color=darkred&amp;gt;HWFrame&amp;lt;/font&amp;gt; мы переопределяем конструктор и деструктор класса &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt;. Наша задача – добавить в окно &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt; визуальный элемент со статическим текстом (метку) и вывести в нем текст приветствия. Рассмотрим сначала базовый конструктор &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt;. Первый параметр конструктора – указатель на класс родительского окна. Мы передаем в этом параметре значение &amp;lt;font color=darkred&amp;gt;'''NULL'''&amp;lt;/font&amp;gt;, так как главное окно не имеет родителя. Во втором параметре конструктора передается идентификатор окна. Идентификатор представляет собой целое число, которое идентифицирует окно в процессе обработки сообщений. Все окна, использующие один и тот же цикл обработки сообщений (например, главное окно и его дочерние виджеты), должны иметь уникальные идентификаторы (это не относится к некоторым типам окон, не предназначенных для получения «персональных» сообщений). В программе ''hwApp'' мы не обрабатываем сообщения, поэтому нам все равно, какой будет идентификатор у главного окна программы. В конструкторе &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt; мы передаем константу &amp;lt;font color=darkred&amp;gt;wxID_ANY&amp;lt;/font&amp;gt;, которая указывает, что конструктор может сам выбрать идентификатор для создаваемого окна (константой &amp;lt;font color=darkred&amp;gt;wxID_ANY&amp;lt;/font&amp;gt; можно пользоваться всякий раз, когда идентификатор окна вас не интересует). В последнем задействованном нами параметре конструктора передается заголовок создаваемого окна (у конструктора &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt; есть и другие параметры, для которых мы оставляем значения по умолчанию). В самом конструкторе мы создаем объект &amp;lt;font color=darkred&amp;gt;label&amp;lt;/font&amp;gt; класса &amp;lt;font color=darkred&amp;gt;wxStaticText&amp;lt;/font&amp;gt; (метка). Первые два параметра конструктора &amp;lt;font color=darkred&amp;gt;wxStaticText&amp;lt;/font&amp;gt; имеют тот же смысл, что и первые параметры конструктора &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt;. В третьем параметре мы передаем строку текста для отображения. Обратите внимание, что в качестве идентификатора окна визуального элемента «метка» мы воспользовались константой &amp;lt;font color=darkred&amp;gt;wxID_STATIC&amp;lt;/font&amp;gt;. Этот  идентификатор используется при создании статических визуальных элементов, которые не обрабатывают пользовательский ввод.&lt;br /&gt;
&lt;br /&gt;
Вот, собственно, и все. Ах, да, вы, наверное, обратили внимание, что в программе не определена функция &amp;lt;font color=darkred&amp;gt;main()&amp;lt;/font&amp;gt;. Дело в том, что разработчики ''wxWidgets'' избавили нас от хлопот по написанию главной функции программы. Все необходимые определения содержит макрос &amp;lt;font color=darkred&amp;gt;IMPLEMENT_App()&amp;lt;/font&amp;gt;, которому мы передаем имя класса приложения в качестве параметра. Теперь программу можно скомпилировать, воспользовавшись вспомогательной утилитой ''wx-config'':&lt;br /&gt;
&lt;br /&gt;
 g++ hwApp.cpp `wx-config --libs` `wx-config --cxxflags` -o hwApp&lt;br /&gt;
&lt;br /&gt;
Трудно представить себе программу проще той, что мы написали. В продолжении серии мы рассмотрим процесс создания «настоящего» приложения – программы для записи разговоров ''Skype''.&lt;br /&gt;
&lt;br /&gt;
==Врезки==&lt;br /&gt;
&lt;br /&gt;
===Как должны выглядеть ваши программы?===&lt;br /&gt;
&lt;br /&gt;
Разработчиков кроссплатформенных наборов виджетов можно разделить на два лагеря: одни стремятся к тому, чтобы визуальные компоненты выглядели по возможности одинаково на всех платформах (обычно это люди с твердыми убеждениями относительно того, каким должен быть правильный графический интерфейс). Наборы визуальных компонентов этого типа радуют глаз единством фирменного стиля. Разработчики из другого лагеря настаивают на том, чтобы на каждой платформе внешний вид графических элементов управления максимально соответствовал тому, что принято на данной платформе. К достоинствам этого подхода относят то, что единообразие внешнего вида приложений упрощает, якобы, освоение новых программ. Лично я с этим аргументом не согласен. На мой взгляд, кнопки в стиле Aqua нисколько не мешают освоению ''Safari'' для Windows.&lt;br /&gt;
&lt;br /&gt;
Самое сложное в освоении новой программы – согласовать подход разработчиков к решению поставленной задачи со своим собственным видением. Как бы там ни было, ''wxWidgets'' придерживается второго подхода, причем следует ему в гораздо большей степени, чем, скажем, Qt. Визуальные элементы ''wxWidgets'' не только выглядят на каждой платформе «как родные» (фактически, во многих случаях, классы ''wxWidgets'' – это просто обертки вокруг фирменных элементов управления), но и используют специфические возможности каждой платформы. Например, на платформе Win32 ''wxWidgets'' поддерживает метафайлы, которые отсутствуют в GTK. Если вы программируете интерфейсы с помощью ''wxWidgets'', вы должны сами устанавливать баланс использования платформо-специфичных и кроссплатформенных возможностей библиотеки.&lt;br /&gt;
&lt;br /&gt;
===Центральная проблема GUI-программирования===&lt;br /&gt;
&lt;br /&gt;
Проблема обработки сообщений возникает во всех объектно-ориентированных графических библиотеках, написанных на C++. Представьте себе объект, реализующий кнопку (пусть это будет объект класса &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt;). Во время выполнения программы кнопка – объект &amp;lt;font color=darkred&amp;gt;button1&amp;lt;/font&amp;gt; класса &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt; получает информацию о событиях графической системы (например, о щелчке мышью). В ответ на щелчок мышью для объекта &amp;lt;font color=darkred&amp;gt;button1&amp;lt;/font&amp;gt; вызывается метод класса &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt; (назовем его &amp;lt;font color=darkred&amp;gt;OnClick()&amp;lt;/font&amp;gt;), который должен оповестить остальные компоненты программы о внешнем событии.&lt;br /&gt;
&lt;br /&gt;
Как заставить кнопку делать именно то, что нам нужно? Можно создать класс-потомок &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt;, например, &amp;lt;font color=darkred&amp;gt;MyButton&amp;lt;/font&amp;gt;, и переопределить в нем метод &amp;lt;font color=darkred&amp;gt;OnClick()&amp;lt;/font&amp;gt; базового класса. Этот способ прост, но неудобен. В вашей программе наверняка будет несколько кнопок и при таком подходе вам придется создавать собственный класс для каждой из них. Необходимость создавать собственный класс для каждой кнопки не только сделает ваш код громоздким и трудным в управлении (представьте себе, что вы сначала использовали для создания кнопок базовый класс &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt;, а потом захотели воспользоваться другой реализацией&lt;br /&gt;
кнопки), но и, в некотором смысле, противоречит принципам ООП. Ведь кнопка остается кнопкой, независимо от того, как она реагирует на события. Зачем же создавать новый класс для каждой конкретной кнопки?&lt;br /&gt;
&lt;br /&gt;
Разработчики библиотек визуальных элементов отдают предпочтение модели, в которой для задания собственных обработчиков событий&lt;br /&gt;
необходимо переопределить только один класс. Предположим, что в нашем гипотетическом наборе виджетов есть класс &amp;lt;font color=darkred&amp;gt;Window&amp;lt;/font&amp;gt;, который реализует главное окно. Мы определяем класс-потомок класса &amp;lt;font color=darkred&amp;gt;Window&amp;lt;/font&amp;gt; (например, &amp;lt;font color=darkred&amp;gt;MyWindow&amp;lt;/font&amp;gt;) и определяем обработчики всех событий всех дочерних элементов главного окна как методы этого класса. Все кнопки, используемые в окне класса &amp;lt;font color=darkred&amp;gt;MyWindow&amp;lt;/font&amp;gt;, могут быть объектами класса &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt;. Обработчиком события &amp;lt;font color=darkred&amp;gt;OnClick&amp;lt;/font&amp;gt; каждой кнопки будет один из методов &amp;lt;font color=darkred&amp;gt;MyWindow&amp;lt;/font&amp;gt;. Нам остается только сообщить каждому объекту &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt;, какой из методов объекта класса &amp;lt;font color=darkred&amp;gt;MyWindow&amp;lt;/font&amp;gt; является обработчиком его события. Тут-то и возникает проблема. Мы должны «прикрепить» методы &amp;lt;font color=darkred&amp;gt;MyWindow&amp;lt;/font&amp;gt; к объектам &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt; (при этом класс &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt; ничего не знает о классе &amp;lt;font color=darkred&amp;gt;MyWindow&amp;lt;/font&amp;gt;). В некоторых языках программирования (Objective-C, C#) эта проблема была решена на уровне самого языка. В C++ стандартного решения не существует, и разработчики наборов виджетов реализуют механизмы обработки сообщений по своему разумению. Все используемые сегодня решения основаны, так или иначе, на функциях обратного вызова. Фактически, разные библиотеки виджетов различаются только способами оформления этого подхода.&lt;br /&gt;
&lt;br /&gt;
===Полезные ссылки===&lt;br /&gt;
&lt;br /&gt;
*Викифицированный справочник по всем классам, переменным, функциям и макросам библиотеки ''wxWidgets'' можно найти на сайте проекта по адресу: [http://wiki.wxwidgets.org/docbrowse.html wiki.wxwidgets.org/docbrowse.html].&lt;br /&gt;
*Хорошим источником информации о программировании в wxWidgets может служить книга «''Cross-Platform GUI Programming with wxWidgets''», написанная Джулианом Смартом [Julian Smart], Кевином Хоком [Kevin Hock] и Стефаном Шомором [Stefan Csomor]. Книга вышла в 2005 году, но не утратила актуальности до сих пор. Правила серии Bruce Perens Open Source Series, к которой принадлежит это издание, позволяют абсолютно легально загрузить его электронную версию (на английском языке) с сайта [http://www.phptr.com/perens www.phptr.com/perens]. Бумажный вариант можно приобрести на [http://www.amazon.com Amazon.com] по весьма умеренной цене.&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:wxWidgets</id>
		<title>LXF98:wxWidgets</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:wxWidgets"/>
				<updated>2008-03-27T12:12:25Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==wxWidgets: живая история==&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;font color=darkred&amp;gt;'''ЧАСТЬ 1'''&amp;lt;/font&amp;gt; Что объединяет Audacity, poEdit и FlameRobin? Все они работают на нескольких платформах, используя wxWidgets – и вы тоже так сможете, если прочтете учебник '''Андрея Боровского'''!''&lt;br /&gt;
&lt;br /&gt;
Что такое ''wxWidgets''? Для многих разработчиков это просто набор виджетов, занимающий на платформе Linux почетное третье место после вечных соперников ''Qt'' и ''GTK'', и не все знают, что ''wxWidgets'' – это еще и история открытых графических интерфейсов. Набор визуальных элементов управления ''wxWidget'' появился на свет в 1992 году, тогда же, когда и XFree86. Все началось с того, что сотруднику Университета Эдинбурга Джулиану Смарту [Julian Smart] потребовалась кросс-платформенная библиотека для создания графических интерфейсов на платформах Sun и PC. У университета не нашлось средств на покупку кросс-платформенной библиотеки виджетов (да, были и такие времена), и тогда Смарт поступил так, как и подобает настоящему хакеру – он начал писать собственную библиотеку, которую назвал ''wxWindows''. Проект бесплатной кросс-платформенной библиотеки быстро привлек внимание других программистов в университете, а вскоре – и за его пределами. Первая версия ''wxWindows'' поддерживала ''XView'' (набор виджетов, созданный Sun Microsystems) и MFC&lt;br /&gt;
1.0. В 2003 году представители компании Microsoft обратили внимание на wxWindows и вежливо попросили Дж. Смарта изменить название (слово “Windows” является зарегистрированной торговой маркой Microsoft в Великобритании) &amp;lt;font color=darkblue&amp;gt;[подобные просьбы высказывались и в адрес закрытых проектов, в частности, Windows Commander, – прим. ред.]&amp;lt;/font&amp;gt;. Переговоры продолжались долго; в качестве ответной уступки американская компания предложила материальную компенсацию&lt;br /&gt;
(полученные от Microsoft деньги было решено потратить на развитие проекта), и в августе 2004 года библиотека ''wxWindows'' была официально переименована в ''wxWidgets''.&lt;br /&gt;
&lt;br /&gt;
Почему же ''wxWidgets'' не стала предпочтительным выбором для Linux-программистов? Причина проста: в те далекие времена, когда решалась судьба графических оболочек для Linux, ''wxWidgets'' (тогда еще ''wxWindows'') не поддерживала X11. На платформе Unix/Linux ''wxWidgets'' использовала виджеты Motif/Lesstif, а позднее – ''GTK''. Версия библиотеки, способная работать с X11 без посторонней помощи, появилась только в 2002 году, когда территорию графических оболочек для Linux уже застолбили другие библиотеки.&lt;br /&gt;
&lt;br /&gt;
Библиотека ''wxWidgets'' распространяется на условиях ''wxWindows License'' (которую должна заменить ''wxWidgets License'', отличающаяся от первой только названием). По сути своей, ''wxWindows License'' – это «смягченный вариант» LGPL, позволяющий распространять производные продукты wxWidgets в бинарной форме на ваших собственных условиях без отчислений разработчикам ''wxWidgets''. Фактически, лицензия wxWindows предоставляет разработчику больше возможностей, чем лицензия ''GTK+'', которая обязывает разработчика распространять производные библиотеки на условиях LGPL, и лицензия ''Qt'', которая требует платить за коммерческое использование библиотеки. Приложения, использующие ''wxWidgets'', можно программировать не только на родном для этой библиотеки – C++, но и на других языках программирования (Java, Perl, Python). Существуют также интерфейсы wxWidgets для Microsoft .NET и Mono. На основе ''wxWidgets'' создано немало программ, самой известной из которых является, пожалуй, аудиоредактор Audacity.&lt;br /&gt;
&lt;br /&gt;
Список платформ, поддерживаемых ''wxWidgets'', внушает уважение. Вы можете использовать библиотеку вместе с ''GTK'' (Unix/Linux/MinGW), Lesstif/Motif (Unix/Linux) X11 (Unix/Linux/MinGW), Win32 (Windows, Windows CE), Carbon (Mac OS), Cocoa (Mac OS X, GNUstep), Protein (Palm OS), PM (OS/2), MGL (Unix/DOS). Само это перечисление демонстрирует важную особенность ''wxWidgets'' – «вертикальную» организацию набора виджетов. В отличие от ''Qt'' и ''GTK'', которые ориентированы на платформы, библиотека ''wxWidgets'' ориентирована на интерфейсы. Если какой-либо из поддерживаемых ''wxWidgets'' интерфейсов переносится на новую платформу, перенос ''wxWidgets'' на эту платформу не должен представлять особых проблем. По традиции, версии ''wxWidgets'' для каждой платформы обозначаются добавлением префикса wx к сокращенному названию платформы. Например, ''wxWidgets'' для Windows обозначается как ''wxMSW'', ''wxWidgets'' для ''GTK'' – как ''wxGTK'', ''wxWidgets'' для X11 – как ''wxX11'', и т. д. Еще одна интересная возможность, связанная с многоплатформенностью ''wxWidgets'' – кросскомпиляция. На сайте проекта можно найти инструкции по компиляции ''wxWidgets''-программ для Windows из-под Linux.&lt;br /&gt;
&lt;br /&gt;
Выбирая между ''wxWidgets'' для ''GTK'' и ''wxWidgets'' для X11, следует помнить, что, несмотря на все усилия разработчиков, эти два набора визуальных компонентов все еще неравноценны. На сайтах некоторых проектов, использующих ''wxWidgets'', вы найдете указания, что проект компилируется с ''wxGTK'', но не с ''wxX11''. Объясняется это тем, что набор виджетов ''wxUniversal'', который использует ''wxX11'', все еще не дотягивает по функциональности до набора ''GTK'', на котором основана ''wxGTK''. Разработанный с нуля ''wxUniversal'' представляет собой сравнительно недавнее добавление в ''wxWidgets''. Этот набор виджетов предназначен,&lt;br /&gt;
в перспективе, для тех платформ, у которых собственные наборы виджетов отсутствуют (хотя вряд ли такую можно сейчас найти). Список виджетов и функций, которые присутствуют в ''wxGTK'' и ''wxMSW'', но все еще не реализованы в ''wxX11'', приведен на сайте проекта. В качестве довода в пользу ''wxX11'' можно указать то, что этот набор виджетов не нуждается в «прослойке» ''GTK'' и может работать в системе, где библиотека ''GTK'' не установлена или не настроена должным образом.&lt;br /&gt;
Окончательное решение при выборе между ''wxGTK'' и ''wxX11'' следует принимать, исходя из требований создаваемого приложения (есть ли в ''wxX11'' все необходимые виджеты) и параметров ''GTK'' в целевой системе. При этом, в случае необходимости, базовую платформу можно будет сменить и на ходу (по крайней мере, переход с ''wxX11'' на ''wxGTK'' не вызовет проблем).&lt;br /&gt;
&lt;br /&gt;
Помимо собственно визуальных компонентов, ''wxWidgets'' предоставляет в распоряжение программиста классы для работы с базами данных (поддерживаются интерфейсы ODBC, XBase, SQLite), классы для работы с сокетами и популярными сетевыми протоколами, а также специальные классы для работы с HTML. Есть у ''wxWidgets'' и собственные классы, реализующие распространенные структуры данных (списки, очереди и т. п.), которые были введены в проект еще до появления&lt;br /&gt;
в С++ стандартной библиотеки шаблонов. Поскольку сейчас использование шаблонов стандартной библиотеки представляется более целесообразным, вы можете сконфигурировать ''wxWidgets'' таким образом, чтобы библиотека использовала STL, а не собственные реализации этих структур данных.&lt;br /&gt;
&lt;br /&gt;
В ''wxWidgets'' реализованы сразу два способа определения обработчиков событий. Более старый способ, разработанный под влиянием MFC, основан на статических таблицах событий (event tables). Однако, он не позволяет манипулировать обработчиками событий во время выполнения программы. Второй (более новый) вариант основан на использовании метода &amp;lt;font color=darkred&amp;gt;connect()&amp;lt;/font&amp;gt; и больше похож на динамический способ определения обработчиков событий, используемый в ''Qt''.&lt;br /&gt;
&lt;br /&gt;
===Инструменты разработчика===&lt;br /&gt;
&lt;br /&gt;
Сегодня практически каждый набор виджетов сопровождается средствами визуального программирования и другими вспомогательными инструментами. Библиотека ''wxWidgets'' не является исключением из этого правила. Вспомогательных средств разработки для ''wxWidgets'' существует немало, больше, пожалуй, чем для ''Qt'' и ''GTK'', но при близком знакомстве с этими средствами заядлый линуксоид может испытать разочарование. Мы привыкли к тому, что базовые средства разработки для библиотек виджетов доступны нам на тех же условиях, что и сами библиотеки, однако с ''wxWidgets'' дело обстоит иначе. Наиболее функциональные системы визуального программирования для ''wxWidgets'' либо являются полностью коммерческими продуктами, либо распространяются бесплатно, но без исходных текстов.&lt;br /&gt;
&lt;br /&gt;
Интегрированная среда разработки DialogBlocks, доступная на сайте [http://www.anthemion.co.uk/dialogblocks www.anthemion.co.uk/dialogblocks], претендует на роль официального средства разработки приложений ''wxWidgets'' на C++.&lt;br /&gt;
&lt;br /&gt;
''DialogBlocks'' включает визуальный редактор окон ''wxWidgets'', многооконный текстовый редактор, встроенную справочную систему. Интегрированная среда умеет генерировать Make-файлы для проектов ''wxWidgets'' и пересобирать саму библиотеку. Поддерживается и интерактивная отладка приложений (с использованием внешнего отладчика). Среда ''DialogBlocks'' – коммерческий продукт, который фактически распространяется как shareware. Вы можете работать с программой бесплатно, однако, до тех пор, пока вы не оплатите регистрацию, функциональность ''DialogBlocks'' будет ограничена. Диалоговые окна в незарегистрированной версии могут включать не более 30 визуальных элементов, специальное окно периодически напоминает вам о необходимости регистрации, а многие визуальные элементы оказываются недоступны. При весьма солидных расценках (за новейшую версию разработчик требует $85, «студенческий» вариант обойдется вам на $40 дешевле) ''DialogBlocks'' отнюдь не поражает воображение работы. Редактор исходных текстов лишен тех приятных мелочей (вроде автоматического завершения кода и подсказок для заголовков вызываемых функций), к которым мы давно привыкли в других коммерческих IDE. При первой попытке собрать проект система предлагает указать место расположения компилятора, но ввести путь к файлу gcc в открытом для этого диалоговом окне не удается (окно просто не реагирует на нажатие клавиш). Конечно, пользователя Linux такими мелочами не испугаешь, я тут же полез в окно настроек, где вручную сконфигурировал проект для сборки под ''wxX11''. Далее выяснилось, что для того, чтобы собрать тестовое приложение надо сначала пересобрать ''wxWidgets'', при этом некоторые поддиректории ''wxWidgets'' пришлось переименовывать вручную. После всех этих доработок тестовое приложение скомпилировалось и запустилось. Впрочем, и разочарования на этом не кончились. В текстовом редакторе ''DialogBlocks'' отсутствуют функции быстрого перехода между реализацией функции и ее объявлением, перехода к выбранному заголовочному файлу и им подобные. Фактически встроенный редактор ''DialogBlocks'' не намного лучше, чем ''KWrite''.&lt;br /&gt;
&lt;br /&gt;
Те, кто готов платить за средство разработки для ''wxWidgets'', могут обратить внимание на еще одну коммерческую IDE – ''wxDesigner''.&lt;br /&gt;
&lt;br /&gt;
Среда разработки ''wxDesigner'' – полностью коммерческий продукт (вы можете бесплатно скачать пакет дистрибутива с сайта программы – [http://www.roebling.de www.roebling.de], но незарегистрированная версия не позволит вам сохранять проекты). Работает ''wxDesigner'' не очень стабильно, попытка создать диалоговое окно в режиме визуального программирования несколько раз заканчивалась ошибкой сегментации и аварийным завершением программы. Учитывая, что сам проект ''wxDesigner'' давно не обновлялся, я не рекомендовал бы вам тратить на него свои деньги. В общем и целом следует признать, что по уровню функциональности и удобства коммерческие IDE для ''wxWidgets'' не только не опережают, но даже несколько отстают от открытых IDE, предназначенных для других библиотек. Так, по крайней мере, обстоит дело на платформе Linux. Для тех, кто ведет разработку приложений ''wxWidgets'' на платформе Windows, ситуация складывается более благоприятно. Библиотека ''wxWidgets'' давно уже умеет интегрироваться с Microsoft Visual Studio, а с недавнего времени – и с Borland/CodeGear C++Builder. При этом для «билдера» есть специальный мастер создания форм ''wxWidgets''. Некоторые разработчики нашли выход из положения благодаря кроссплатформенности ''wxWidgets'' – они ведут разработку приложений в одной из Windows IDE, а конечный продукт компилируют в Linux (не рассказывайте об этом фанатам ''Emacs'' и ''Eclipse'', они побьют вас камнями, если узнают).&lt;br /&gt;
&lt;br /&gt;
На платформе Linux частичная (без средств визуального редактирования) поддержка ''wxWidgets'' интегрирована в ''KDevelop'' и ''Anjuta''. Эти интегрированные среды разработки умеют создавать заготовки приложений ''wxWidgets'' а также генерировать скрипты configure и make. Специально для редактирования графических интерфейсов ''wxWidgets'' создается программа ''wxGlade''. Название проекта говорит само за себя – ''wxGlade'' претендует на роль ''Glade'' для ''wxWidgets''. Редактор ''wxGlade'' написан на языке Python и в настоящем своем виде (версия 0.6) подходит больше для тех, кто пишет программы, используя именно этот язык (хотя поддержка C++ и Perl также присутствует).&lt;br /&gt;
&lt;br /&gt;
Собственно говоря, все вышесказанное не должно вселять в вас пессимизм. Если вы можете обойтись без визуального программирования и интерактивных подсказок, для написания приложений ''wxWidgets'' подойдет любой текстовый редактор, хоть тот же ''KWrite''.&lt;br /&gt;
&lt;br /&gt;
===Приступаем к работе===&lt;br /&gt;
&lt;br /&gt;
Хотя в вашем дистрибутиве Linux наверняка есть пакет разработчика для ''wxWidgets'', я рекомендую собрать библиотеку из исходных текстов, доступных на сайте проекта ([http://wxwidgets.org wxwidgets.org] – просто на всякий случай). Скомпилировав ''wxWidgets'', вы не только получаете новейшую версию библиотеки, но и более гибкие средства конфигурирования. Например, для этих статей я решил использовать ''wxX11'', тогда как пакет ''wxWidgets'' из моего дистрибутива (OpenSUSE) сконфигурирован для ''GTK+''. Скрипт '''configure wxwidgets''' позволяет настраивать многие параметры библиотеки с помощью ключей. Например, для того, чтобы скомпилировать ''wxWidgets'' с поддержкой X11, командуем:&lt;br /&gt;
&lt;br /&gt;
 ./configure --with-x11&lt;br /&gt;
&lt;br /&gt;
Ключ &amp;lt;font color=darkred&amp;gt;--enable-stl&amp;lt;/font&amp;gt; указывает, что вместо классов структур данных ''wxWidgets'' следует использовать контейнеры STL. Полное описание ключей &amp;lt;font color=darkred&amp;gt;configure&amp;lt;/font&amp;gt; вы можете получить, как обычно, с помощью ключа &amp;lt;font color=darkred&amp;gt;--help&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Знакомство с программированием в ''wxWidgets'' мы начнем, как всегда, с простейшего приложения (файл '''hwapp.cpp'''):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 #include “wx/wx.h”&lt;br /&gt;
 class HWFrame: public wxFrame&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
       HWFrame() : wxFrame(NULL, wxID_ANY, “First wxWidgets&lt;br /&gt;
 Application”)&lt;br /&gt;
       {&lt;br /&gt;
             label = new wxStaticText(this, wxID_STATIC, “Hello World”);&lt;br /&gt;
       }&lt;br /&gt;
       virtual ~HWFrame()&lt;br /&gt;
       {&lt;br /&gt;
             delete label;&lt;br /&gt;
       }&lt;br /&gt;
 private:&lt;br /&gt;
       wxStaticText * label;&lt;br /&gt;
 };&lt;br /&gt;
 class HWApp: public wxApp&lt;br /&gt;
 {&lt;br /&gt;
       virtual bool OnInit()&lt;br /&gt;
       {&lt;br /&gt;
             HWFrame * myFrame = new HWFrame();&lt;br /&gt;
             myFrame-&amp;gt;Show();&lt;br /&gt;
             return true;&lt;br /&gt;
       }&lt;br /&gt;
 };&lt;br /&gt;
 IMPLEMENT_APP(HWApp);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Эта программа действительно очень проста. Она не обрабатывает события, не содержит сложных элементов интерфейса; все, что она делает – выводит надпись “Hello World” в главном окне. Тем не менее, программа ''hwapp'' демонстрирует важнейшие особенности структуры приложения ''wxWidgets''. Объявления всех классов, функций и макросов библиотеки виджетов становятся доступны нам в результате включения в текст программы одного-единственного заголовочного&lt;br /&gt;
файла – '''wx/wx.h'''. В отличие от ''Qt'' и ''GTKmm'', в ''wxWidgets'', даже при написании простого приложения нам приходится объявлять сразу два собственных класса. Класс &amp;lt;font color=darkred&amp;gt;HWApp&amp;gt;&amp;lt;/font&amp;gt;, который является потомком класса библиотечного &amp;lt;font color=darkred&amp;gt;wxApp&amp;lt;/font&amp;gt;, представляет собой главный класс приложения. Этот класс можно рассматривать как аналог класса &amp;lt;font color=darkred&amp;gt;QApplication&amp;lt;/font&amp;gt; в ''Qt'', с той разницей, что в ''Qt'' нам редко приходится создавать собственный класс, производный от &amp;lt;font color=darkred&amp;gt;QApplication&amp;lt;/font&amp;gt;. Класс &amp;lt;font color=darkred&amp;gt;HWFrame&amp;lt;/font&amp;gt;, который происходит от класса &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt;, реализует главное окно нашей программы. Обратите внимание, что имена всех классов &amp;lt;font color=darkred&amp;gt;wxWidgets&amp;lt;/font&amp;gt; начинаются с префикса &amp;lt;font color=darkred&amp;gt;wx&amp;lt;/font&amp;gt;, а имена методов классов – с заглавной буквы.&lt;br /&gt;
&lt;br /&gt;
В потомке класса &amp;lt;font color=darkred&amp;gt;wxApp&amp;lt;/font&amp;gt; нам требуется переопределить только один базовый метод – &amp;lt;font color=darkred&amp;gt;OnInit()&amp;lt;/font&amp;gt;. Этот виртуальный метод вызывается базовым классом в самом начале работы программы и именно на него возложена задача по созданию и отображению главного окна. Если метод &amp;lt;font color=darkred&amp;gt;OnInit()&amp;lt;/font&amp;gt; возвращает значение &amp;lt;font color=darkred&amp;gt;'''false'''&amp;lt;/font&amp;gt;, выполнение программы сразу же завершается. Если вам необходимо выполнить какие-либо специальные действия в процессе завершения программы (например, высвободить занятые программой ресурсы), вы можете переопределить метод &amp;lt;font color=darkred&amp;gt;OnExit()&amp;lt;/font&amp;gt; класса &amp;lt;font color=darkred&amp;gt;wxApp&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В методе &amp;lt;font color=darkred&amp;gt;OnInit()&amp;lt;/font&amp;gt; мы создаем объект класса-потомка &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt; и вызываем его метод &amp;lt;font color=darkred&amp;gt;Show()&amp;lt;/font&amp;gt;, для того чтобы окно, созданное этим объектом, стало видимым. В классе &amp;lt;font color=darkred&amp;gt;HWFrame&amp;lt;/font&amp;gt; мы переопределяем конструктор и деструктор класса &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt;. Наша задача – добавить в окно &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt; визуальный элемент со статическим текстом (метку) и вывести в нем текст приветствия. Рассмотрим сначала базовый конструктор &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt;. Первый параметр конструктора – указатель на класс родительского окна. Мы передаем в этом параметре значение &amp;lt;font color=darkred&amp;gt;'''NULL'''&amp;lt;/font&amp;gt;, так как главное окно не имеет родителя. Во втором параметре конструктора передается идентификатор окна. Идентификатор представляет собой целое число, которое идентифицирует окно в процессе обработки сообщений. Все окна, использующие один и тот же цикл обработки сообщений (например, главное окно и его дочерние виджеты), должны иметь уникальные идентификаторы (это не относится к некоторым типам окон, не предназначенных для получения «персональных» сообщений). В программе ''hwApp'' мы не обрабатываем сообщения, поэтому нам все равно, какой будет идентификатор у главного окна программы. В конструкторе &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt; мы передаем константу &amp;lt;font color=darkred&amp;gt;wxID_ANY&amp;lt;/font&amp;gt;, которая указывает, что конструктор может сам выбрать идентификатор для создаваемого окна (константой &amp;lt;font color=darkred&amp;gt;wxID_ANY&amp;lt;/font&amp;gt; можно пользоваться всякий раз, когда идентификатор окна вас не интересует). В последнем задействованном нами параметре конструктора передается заголовок создаваемого окна (у конструктора &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt; есть и другие параметры, для которых мы оставляем значения по умолчанию). В самом конструкторе мы создаем объект &amp;lt;font color=darkred&amp;gt;label&amp;lt;/font&amp;gt; класса &amp;lt;font color=darkred&amp;gt;wxStaticText&amp;lt;/font&amp;gt; (метка). Первые два параметра конструктора &amp;lt;font color=darkred&amp;gt;wxStaticText&amp;lt;/font&amp;gt; имеют тот же смысл, что и первые параметры конструктора &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt;. В третьем параметре мы передаем строку текста для отображения. Обратите внимание, что в качестве идентификатора окна визуального элемента «метка» мы воспользовались константой &amp;lt;font color=darkred&amp;gt;wxID_STATIC&amp;lt;/font&amp;gt;. Этот  идентификатор используется при создании статических визуальных элементов, которые не обрабатывают пользовательский ввод.&lt;br /&gt;
&lt;br /&gt;
Вот, собственно, и все. Ах, да, вы, наверное, обратили внимание, что в программе не определена функция &amp;lt;font color=darkred&amp;gt;main()&amp;lt;/font&amp;gt;. Дело в том, что разработчики ''wxWidgets'' избавили нас от хлопот по написанию главной функции программы. Все необходимые определения содержит макрос &amp;lt;font color=darkred&amp;gt;IMPLEMENT_App()&amp;lt;/font&amp;gt;, которому мы передаем имя класса приложения в качестве параметра. Теперь программу можно скомпилировать, воспользовавшись вспомогательной утилитой ''wx-config'':&lt;br /&gt;
&lt;br /&gt;
 g++ hwApp.cpp `wx-config --libs` `wx-config --cxxflags` -o hwApp&lt;br /&gt;
&lt;br /&gt;
Трудно представить себе программу проще той, что мы написали. В продолжении серии мы рассмотрим процесс создания «настоящего» приложения – программы для записи разговоров ''Skype''.&lt;br /&gt;
&lt;br /&gt;
==Врезки==&lt;br /&gt;
&lt;br /&gt;
===Как должны выглядеть ваши программы?===&lt;br /&gt;
&lt;br /&gt;
Разработчиков кроссплатформенных наборов виджетов можно разделить на два лагеря: одни стремятся к тому, чтобы визуальные компоненты выглядели по возможности одинаково на всех платформах (обычно это люди с твердыми убеждениями относительно того, каким должен быть правильный графический интерфейс). Наборы визуальных компонентов этого типа радуют глаз единством фирменного стиля. Разработчики из другого лагеря настаивают на том, чтобы на каждой платформе внешний вид графических элементов управления максимально соответствовал тому, что принято на данной платформе. К достоинствам этого подхода относят то, что единообразие внешнего вида приложений упрощает, якобы, освоение новых программ. Лично я с этим аргументом не согласен. На мой взгляд, кнопки в стиле Aqua нисколько не мешают освоению ''Safari'' для Windows.&lt;br /&gt;
&lt;br /&gt;
Самое сложное в освоении новой программы – согласовать подход разработчиков к решению поставленной задачи со своим собственным видением. Как бы там ни было, ''wxWidgets'' придерживается второго подхода, причем следует ему в гораздо большей степени, чем, скажем, Qt. Визуальные элементы ''wxWidgets'' не только выглядят на каждой платформе «как родные» (фактически, во многих случаях, классы ''wxWidgets'' – это просто обертки вокруг фирменных элементов управления), но и используют специфические возможности каждой платформы. Например, на платформе Win32 ''wxWidgets'' поддерживает метафайлы, которые отсутствуют в GTK. Если вы программируете интерфейсы с помощью ''wxWidgets'', вы должны сами устанавливать баланс использования платформо-специфичных и кроссплатформенных возможностей библиотеки.&lt;br /&gt;
&lt;br /&gt;
===Центральная проблема GUI-программирования===&lt;br /&gt;
&lt;br /&gt;
Проблема обработки сообщений возникает во всех объектно-ориентированных графических библиотеках, написанных на C++. Представьте себе объект, реализующий кнопку (пусть это будет объект класса &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt;). Во время выполнения программы кнопка – объект &amp;lt;font color=darkred&amp;gt;button1&amp;lt;/font&amp;gt; класса &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt; получает информацию о событиях графической системы (например, о щелчке мышью). В ответ на щелчок мышью для объекта &amp;lt;font color=darkred&amp;gt;button1&amp;lt;/font&amp;gt; вызывается метод класса &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt; (назовем его &amp;lt;font color=darkred&amp;gt;OnClick()&amp;lt;/font&amp;gt;), который должен оповестить остальные компоненты программы о внешнем событии.&lt;br /&gt;
&lt;br /&gt;
Как заставить кнопку делать именно то, что нам нужно? Можно создать класс-потомок &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt;, например, &amp;lt;font color=darkred&amp;gt;MyButton&amp;lt;/font&amp;gt;, и переопределить в нем метод &amp;lt;font color=darkred&amp;gt;OnClick()&amp;lt;/font&amp;gt; базового класса. Этот способ прост, но неудобен. В вашей программе наверняка будет несколько кнопок и при таком подходе вам придется создавать собственный класс для каждой из них. Необходимость создавать собственный класс для каждой кнопки не только сделает ваш код громоздким и трудным в управлении (представьте себе, что вы сначала использовали для создания кнопок базовый класс &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt;, а потом захотели воспользоваться другой реализацией&lt;br /&gt;
кнопки), но и, в некотором смысле, противоречит принципам ООП. Ведь кнопка остается кнопкой, независимо от того, как она реагирует на события. Зачем же создавать новый класс для каждой конкретной кнопки?&lt;br /&gt;
&lt;br /&gt;
Разработчики библиотек визуальных элементов отдают предпочтение модели, в которой для задания собственных обработчиков событий&lt;br /&gt;
необходимо переопределить только один класс. Предположим, что в нашем гипотетическом наборе виджетов есть класс &amp;lt;font color=darkred&amp;gt;Window&amp;lt;/font&amp;gt;, который реализует главное окно. Мы определяем класс-потомок класса &amp;lt;font color=darkred&amp;gt;Window&amp;lt;/font&amp;gt; (например, &amp;lt;font color=darkred&amp;gt;MyWindow&amp;lt;/font&amp;gt;) и определяем обработчики всех событий всех дочерних элементов главного окна как методы этого класса. Все кнопки, используемые в окне класса &amp;lt;font color=darkred&amp;gt;MyWindow&amp;lt;/font&amp;gt;, могут быть объектами класса &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt;. Обработчиком события &amp;lt;font color=darkred&amp;gt;OnClick&amp;lt;/font&amp;gt; каждой кнопки будет один из методов &amp;lt;font color=darkred&amp;gt;MyWindow&amp;lt;/font&amp;gt;. Нам остается только сообщить каждому объекту &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt;, какой из методов объекта класса &amp;lt;font color=darkred&amp;gt;MyWindow&amp;lt;/font&amp;gt; является обработчиком его события. Тут-то и возникает проблема. Мы должны «прикрепить» методы &amp;lt;font color=darkred&amp;gt;MyWindow&amp;lt;/font&amp;gt; к объектам &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt; (при этом класс &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt; ничего не знает о классе &amp;lt;font color=darkred&amp;gt;MyWindow&amp;lt;/font&amp;gt;). В некоторых языках программирования (Objective-C, C#) эта проблема была решена на уровне самого языка. В C++ стандартного решения не существует, и разработчики наборов виджетов реализуют механизмы обработки сообщений по своему разумению. Все используемые сегодня решения основаны, так или иначе, на функциях обратного вызова. Фактически, разные библиотеки виджетов различаются только способами оформления этого подхода.&lt;br /&gt;
&lt;br /&gt;
===Полезные ссылки===&lt;br /&gt;
&lt;br /&gt;
*Викифицированный справочник по всем классам, переменным, функциям и макросам библиотеки ''wxWidgets'' можно найти на сайте проекта по адресу: [http://wiki.wxwidgets.org/docbrowse.html wiki.wxwidgets.org/docbrowse.html].&lt;br /&gt;
*Хорошим источником информации о программировании в wxWidgets может служить книга «''Cross-Platform GUI Programming with wxWidgets''», написанная Джулианом Смартом [Julian Smart], Кевином Хоком [Kevin Hock] и Стефаном Шомором [Stefan Csomor]. Книга вышла в 2005 году, но не утратила актуальности до сих пор. Правила серии Bruce Perens Open Source Series, к которой принадлежит это издание, позволяют абсолютно легально загрузить его электронную версию (на английском языке) с сайта [http://www.phptr.com/perens www.phptr.com/perens}. Бумажный вариант можно приобрести на [http://www.amazon.com Amazon.com] по весьма умеренной цене.&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:wxWidgets</id>
		<title>LXF98:wxWidgets</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:wxWidgets"/>
				<updated>2008-03-27T12:11:16Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: Новая: ==wxWidgets: живая история==  ''&amp;lt;font color=darkred&amp;gt;'''ЧАСТЬ 1'''&amp;lt;/font&amp;gt; Что объединяет Audacity, poEdit и FlameRobin? Все они работают на ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==wxWidgets: живая история==&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;font color=darkred&amp;gt;'''ЧАСТЬ 1'''&amp;lt;/font&amp;gt; Что объединяет Audacity, poEdit и FlameRobin? Все они работают на нескольких платформах, используя wxWidgets – и вы тоже так сможете, если прочтете учебник '''Андрея Боровского'''!''&lt;br /&gt;
&lt;br /&gt;
Что такое ''wxWidgets''? Для многих разработчиков это просто набор виджетов, занимающий на платформе Linux почетное третье место после вечных соперников ''Qt'' и ''GTK'', и не все знают, что ''wxWidgets'' – это еще и история открытых графических интерфейсов. Набор визуальных элементов управления ''wxWidget'' появился на свет в 1992 году, тогда же, когда и XFree86. Все началось с того, что сотруднику Университета Эдинбурга Джулиану Смарту [Julian Smart] потребовалась кросс-платформенная библиотека для создания графических интерфейсов на платформах Sun и PC. У университета не нашлось средств на покупку кросс-платформенной библиотеки виджетов (да, были и такие времена), и тогда Смарт поступил так, как и подобает настоящему хакеру – он начал писать собственную библиотеку, которую назвал ''wxWindows''. Проект бесплатной кросс-платформенной библиотеки быстро привлек внимание других программистов в университете, а вскоре – и за его пределами. Первая версия ''wxWindows'' поддерживала ''XView'' (набор виджетов, созданный Sun Microsystems) и MFC&lt;br /&gt;
1.0. В 2003 году представители компании Microsoft обратили внимание на wxWindows и вежливо попросили Дж. Смарта изменить название (слово “Windows” является зарегистрированной торговой маркой Microsoft в Великобритании) &amp;lt;font color=darkblue&amp;gt;[подобные просьбы высказывались и в адрес закрытых проектов, в частности, Windows Commander, – прим. ред.]&amp;lt;/font&amp;gt;. Переговоры продолжались долго; в качестве ответной уступки американская компания предложила материальную компенсацию&lt;br /&gt;
(полученные от Microsoft деньги было решено потратить на развитие проекта), и в августе 2004 года библиотека ''wxWindows'' была официально переименована в ''wxWidgets''.&lt;br /&gt;
&lt;br /&gt;
Почему же ''wxWidgets'' не стала предпочтительным выбором для Linux-программистов? Причина проста: в те далекие времена, когда решалась судьба графических оболочек для Linux, ''wxWidgets'' (тогда еще ''wxWindows'') не поддерживала X11. На платформе Unix/Linux ''wxWidgets'' использовала виджеты Motif/Lesstif, а позднее – ''GTK''. Версия библиотеки, способная работать с X11 без посторонней помощи, появилась только в 2002 году, когда территорию графических оболочек для Linux уже застолбили другие библиотеки.&lt;br /&gt;
&lt;br /&gt;
Библиотека ''wxWidgets'' распространяется на условиях ''wxWindows License'' (которую должна заменить ''wxWidgets License'', отличающаяся от первой только названием). По сути своей, ''wxWindows License'' – это «смягченный вариант» LGPL, позволяющий распространять производные продукты wxWidgets в бинарной форме на ваших собственных условиях без отчислений разработчикам ''wxWidgets''. Фактически, лицензия wxWindows предоставляет разработчику больше возможностей, чем лицензия ''GTK+'', которая обязывает разработчика распространять производные библиотеки на условиях LGPL, и лицензия ''Qt'', которая требует платить за коммерческое использование библиотеки. Приложения, использующие ''wxWidgets'', можно программировать не только на родном для этой библиотеки – C++, но и на других языках программирования (Java, Perl, Python). Существуют также интерфейсы wxWidgets для Microsoft .NET и Mono. На основе ''wxWidgets'' создано немало программ, самой известной из которых является, пожалуй, аудиоредактор Audacity.&lt;br /&gt;
&lt;br /&gt;
Список платформ, поддерживаемых ''wxWidgets'', внушает уважение. Вы можете использовать библиотеку вместе с ''GTK'' (Unix/Linux/MinGW), Lesstif/Motif (Unix/Linux) X11 (Unix/Linux/MinGW), Win32 (Windows, Windows CE), Carbon (Mac OS), Cocoa (Mac OS X, GNUstep), Protein (Palm OS), PM (OS/2), MGL (Unix/DOS). Само это перечисление демонстрирует важную особенность ''wxWidgets'' – «вертикальную» организацию набора виджетов. В отличие от ''Qt'' и ''GTK'', которые ориентированы на платформы, библиотека ''wxWidgets'' ориентирована на интерфейсы. Если какой-либо из поддерживаемых ''wxWidgets'' интерфейсов переносится на новую платформу, перенос ''wxWidgets'' на эту платформу не должен представлять особых проблем. По традиции, версии ''wxWidgets'' для каждой платформы обозначаются добавлением префикса wx к сокращенному названию платформы. Например, ''wxWidgets'' для Windows обозначается как ''wxMSW'', ''wxWidgets'' для ''GTK'' – как ''wxGTK'', ''wxWidgets'' для X11 – как ''wxX11'', и т. д. Еще одна интересная возможность, связанная с многоплатформенностью ''wxWidgets'' – кросскомпиляция. На сайте проекта можно найти инструкции по компиляции ''wxWidgets''-программ для Windows из-под Linux.&lt;br /&gt;
&lt;br /&gt;
Выбирая между ''wxWidgets'' для ''GTK'' и ''wxWidgets'' для X11, следует помнить, что, несмотря на все усилия разработчиков, эти два набора визуальных компонентов все еще неравноценны. На сайтах некоторых проектов, использующих ''wxWidgets'', вы найдете указания, что проект компилируется с ''wxGTK'', но не с ''wxX11''. Объясняется это тем, что набор виджетов ''wxUniversal'', который использует ''wxX11'', все еще не дотягивает по функциональности до набора ''GTK'', на котором основана ''wxGTK''. Разработанный с нуля ''wxUniversal'' представляет собой сравнительно недавнее добавление в ''wxWidgets''. Этот набор виджетов предназначен,&lt;br /&gt;
в перспективе, для тех платформ, у которых собственные наборы виджетов отсутствуют (хотя вряд ли такую можно сейчас найти). Список виджетов и функций, которые присутствуют в ''wxGTK'' и ''wxMSW'', но все еще не реализованы в ''wxX11'', приведен на сайте проекта. В качестве довода в пользу ''wxX11'' можно указать то, что этот набор виджетов не нуждается в «прослойке» ''GTK'' и может работать в системе, где библиотека ''GTK'' не установлена или не настроена должным образом.&lt;br /&gt;
Окончательное решение при выборе между ''wxGTK'' и ''wxX11'' следует принимать, исходя из требований создаваемого приложения (есть ли в ''wxX11'' все необходимые виджеты) и параметров ''GTK'' в целевой системе. При этом, в случае необходимости, базовую платформу можно будет сменить и на ходу (по крайней мере, переход с ''wxX11'' на ''wxGTK'' не вызовет проблем).&lt;br /&gt;
&lt;br /&gt;
Помимо собственно визуальных компонентов, ''wxWidgets'' предоставляет в распоряжение программиста классы для работы с базами данных (поддерживаются интерфейсы ODBC, XBase, SQLite), классы для работы с сокетами и популярными сетевыми протоколами, а также специальные классы для работы с HTML. Есть у ''wxWidgets'' и собственные классы, реализующие распространенные структуры данных (списки, очереди и т. п.), которые были введены в проект еще до появления&lt;br /&gt;
в С++ стандартной библиотеки шаблонов. Поскольку сейчас использование шаблонов стандартной библиотеки представляется более целесообразным, вы можете сконфигурировать ''wxWidgets'' таким образом, чтобы библиотека использовала STL, а не собственные реализации этих структур данных.&lt;br /&gt;
&lt;br /&gt;
В ''wxWidgets'' реализованы сразу два способа определения обработчиков событий. Более старый способ, разработанный под влиянием MFC, основан на статических таблицах событий (event tables). Однако, он не позволяет манипулировать обработчиками событий во время выполнения программы. Второй (более новый) вариант основан на использовании метода &amp;lt;font color=darkred&amp;gt;connect()&amp;lt;/font&amp;gt; и больше похож на динамический способ определения обработчиков событий, используемый в ''Qt''.&lt;br /&gt;
&lt;br /&gt;
===Инструменты разработчика===&lt;br /&gt;
&lt;br /&gt;
Сегодня практически каждый набор виджетов сопровождается средствами визуального программирования и другими вспомогательными инструментами. Библиотека ''wxWidgets'' не является исключением из этого правила. Вспомогательных средств разработки для ''wxWidgets'' существует немало, больше, пожалуй, чем для ''Qt'' и ''GTK'', но при близком знакомстве с этими средствами заядлый линуксоид может испытать разочарование. Мы привыкли к тому, что базовые средства разработки для библиотек виджетов доступны нам на тех же условиях, что и сами библиотеки, однако с ''wxWidgets'' дело обстоит иначе. Наиболее функциональные системы визуального программирования для ''wxWidgets'' либо являются полностью коммерческими продуктами, либо распространяются бесплатно, но без исходных текстов.&lt;br /&gt;
&lt;br /&gt;
Интегрированная среда разработки DialogBlocks, доступная на сайте [http://www.anthemion.co.uk/dialogblocks www.anthemion.co.uk/dialogblocks], претендует на роль официального средства разработки приложений ''wxWidgets'' на C++.&lt;br /&gt;
&lt;br /&gt;
''DialogBlocks'' включает визуальный редактор окон ''wxWidgets'', многооконный текстовый редактор, встроенную справочную систему. Интегрированная среда умеет генерировать Make-файлы для проектов ''wxWidgets'' и пересобирать саму библиотеку. Поддерживается и интерактивная отладка приложений (с использованием внешнего отладчика). Среда ''DialogBlocks'' – коммерческий продукт, который фактически распространяется как shareware. Вы можете работать с программой бесплатно, однако, до тех пор, пока вы не оплатите регистрацию, функциональность ''DialogBlocks'' будет ограничена. Диалоговые окна в незарегистрированной версии могут включать не более 30 визуальных элементов, специальное окно периодически напоминает вам о необходимости регистрации, а многие визуальные элементы оказываются недоступны. При весьма солидных расценках (за новейшую версию разработчик требует $85, «студенческий» вариант обойдется вам на $40 дешевле) ''DialogBlocks'' отнюдь не поражает воображение работы. Редактор исходных текстов лишен тех приятных мелочей (вроде автоматического завершения кода и подсказок для заголовков вызываемых функций), к которым мы давно привыкли в других коммерческих IDE. При первой попытке собрать проект система предлагает указать место расположения компилятора, но ввести путь к файлу gcc в открытом для этого диалоговом окне не удается (окно просто не реагирует на нажатие клавиш). Конечно, пользователя Linux такими мелочами не испугаешь, я тут же полез в окно настроек, где вручную сконфигурировал проект для сборки под ''wxX11''. Далее выяснилось, что для того, чтобы собрать тестовое приложение надо сначала пересобрать ''wxWidgets'', при этом некоторые поддиректории ''wxWidgets'' пришлось переименовывать вручную. После всех этих доработок тестовое приложение скомпилировалось и запустилось. Впрочем, и разочарования на этом не кончились. В текстовом редакторе ''DialogBlocks'' отсутствуют функции быстрого перехода между реализацией функции и ее объявлением, перехода к выбранному заголовочному файлу и им подобные. Фактически встроенный редактор ''DialogBlocks'' не намного лучше, чем ''KWrite''.&lt;br /&gt;
&lt;br /&gt;
Те, кто готов платить за средство разработки для ''wxWidgets'', могут обратить внимание на еще одну коммерческую IDE – ''wxDesigner''.&lt;br /&gt;
&lt;br /&gt;
Среда разработки ''wxDesigner'' – полностью коммерческий продукт (вы можете бесплатно скачать пакет дистрибутива с сайта программы – [http://www.roebling.de www.roebling.de], но незарегистрированная версия не позволит вам сохранять проекты). Работает ''wxDesigner'' не очень стабильно, попытка создать диалоговое окно в режиме визуального программирования несколько раз заканчивалась ошибкой сегментации и аварийным завершением программы. Учитывая, что сам проект ''wxDesigner'' давно не обновлялся, я не рекомендовал бы вам тратить на него свои деньги. В общем и целом следует признать, что по уровню функциональности и удобства коммерческие IDE для ''wxWidgets'' не только не опережают, но даже несколько отстают от открытых IDE, предназначенных для других библиотек. Так, по крайней мере, обстоит дело на платформе Linux. Для тех, кто ведет разработку приложений ''wxWidgets'' на платформе Windows, ситуация складывается более благоприятно. Библиотека ''wxWidgets'' давно уже умеет интегрироваться с Microsoft Visual Studio, а с недавнего времени – и с Borland/CodeGear C++Builder. При этом для «билдера» есть специальный мастер создания форм ''wxWidgets''. Некоторые разработчики нашли выход из положения благодаря кроссплатформенности ''wxWidgets'' – они ведут разработку приложений в одной из Windows IDE, а конечный продукт компилируют в Linux (не рассказывайте об этом фанатам ''Emacs'' и ''Eclipse'', они побьют вас камнями, если узнают).&lt;br /&gt;
&lt;br /&gt;
На платформе Linux частичная (без средств визуального редактирования) поддержка ''wxWidgets'' интегрирована в ''KDevelop'' и ''Anjuta''. Эти интегрированные среды разработки умеют создавать заготовки приложений ''wxWidgets'' а также генерировать скрипты configure и make. Специально для редактирования графических интерфейсов ''wxWidgets'' создается программа ''wxGlade''. Название проекта говорит само за себя – ''wxGlade'' претендует на роль ''Glade'' для ''wxWidgets''. Редактор ''wxGlade'' написан на языке Python и в настоящем своем виде (версия 0.6) подходит больше для тех, кто пишет программы, используя именно этот язык (хотя поддержка C++ и Perl также присутствует).&lt;br /&gt;
&lt;br /&gt;
Собственно говоря, все вышесказанное не должно вселять в вас пессимизм. Если вы можете обойтись без визуального программирования и интерактивных подсказок, для написания приложений ''wxWidgets'' подойдет любой текстовый редактор, хоть тот же ''KWrite''.&lt;br /&gt;
&lt;br /&gt;
===Приступаем к работе===&lt;br /&gt;
&lt;br /&gt;
Хотя в вашем дистрибутиве Linux наверняка есть пакет разработчика для ''wxWidgets'', я рекомендую собрать библиотеку из исходных текстов, доступных на сайте проекта ([http://wxwidgets.org wxwidgets.org] – просто на всякий случай). Скомпилировав ''wxWidgets'', вы не только получаете новейшую версию библиотеки, но и более гибкие средства конфигурирования. Например, для этих статей я решил использовать ''wxX11'', тогда как пакет ''wxWidgets'' из моего дистрибутива (OpenSUSE) сконфигурирован для ''GTK+''. Скрипт '''configure wxwidgets''' позволяет настраивать многие параметры библиотеки с помощью ключей. Например, для того, чтобы скомпилировать ''wxWidgets'' с поддержкой X11, командуем:&lt;br /&gt;
&lt;br /&gt;
 ./configure --with-x11&lt;br /&gt;
&lt;br /&gt;
Ключ &amp;lt;font color=darkred&amp;gt;--enable-stl&amp;lt;/font&amp;gt; указывает, что вместо классов структур данных ''wxWidgets'' следует использовать контейнеры STL. Полное описание ключей &amp;lt;font color=darkred&amp;gt;configure&amp;lt;/font&amp;gt; вы можете получить, как обычно, с помощью ключа &amp;lt;font color=darkred&amp;gt;--help&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Знакомство с программированием в ''wxWidgets'' мы начнем, как всегда, с простейшего приложения (файл '''hwapp.cpp'''):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 #include “wx/wx.h”&lt;br /&gt;
 class HWFrame: public wxFrame&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
       HWFrame() : wxFrame(NULL, wxID_ANY, “First wxWidgets&lt;br /&gt;
 Application”)&lt;br /&gt;
       {&lt;br /&gt;
             label = new wxStaticText(this, wxID_STATIC, “Hello World”);&lt;br /&gt;
       }&lt;br /&gt;
       virtual ~HWFrame()&lt;br /&gt;
       {&lt;br /&gt;
             delete label;&lt;br /&gt;
       }&lt;br /&gt;
 private:&lt;br /&gt;
       wxStaticText * label;&lt;br /&gt;
 };&lt;br /&gt;
 class HWApp: public wxApp&lt;br /&gt;
 {&lt;br /&gt;
       virtual bool OnInit()&lt;br /&gt;
       {&lt;br /&gt;
             HWFrame * myFrame = new HWFrame();&lt;br /&gt;
             myFrame-&amp;gt;Show();&lt;br /&gt;
             return true;&lt;br /&gt;
       }&lt;br /&gt;
 };&lt;br /&gt;
 IMPLEMENT_APP(HWApp);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Эта программа действительно очень проста. Она не обрабатывает события, не содержит сложных элементов интерфейса; все, что она делает – выводит надпись “Hello World” в главном окне. Тем не менее, программа ''hwapp'' демонстрирует важнейшие особенности структуры приложения ''wxWidgets''. Объявления всех классов, функций и макросов библиотеки виджетов становятся доступны нам в результате включения в текст программы одного-единственного заголовочного&lt;br /&gt;
файла – '''wx/wx.h'''. В отличие от ''Qt'' и ''GTKmm'', в ''wxWidgets'', даже при написании простого приложения нам приходится объявлять сразу два собственных класса. Класс &amp;lt;font color=darkred&amp;gt;HWApp&amp;gt;&amp;lt;/font&amp;gt;, который является потомком класса библиотечного &amp;lt;font color=darkred&amp;gt;wxApp&amp;lt;/font&amp;gt;, представляет собой главный класс приложения. Этот класс можно рассматривать как аналог класса &amp;lt;font color=darkred&amp;gt;QApplication&amp;lt;/font&amp;gt; в ''Qt'', с той разницей, что в ''Qt'' нам редко приходится создавать собственный класс, производный от &amp;lt;font color=darkred&amp;gt;QApplication&amp;lt;/font&amp;gt;. Класс &amp;lt;font color=darkred&amp;gt;HWFrame&amp;lt;/font&amp;gt;, который происходит от класса &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt;, реализует главное окно нашей программы. Обратите внимание, что имена всех классов &amp;lt;font color=darkred&amp;gt;wxWidgets&amp;lt;/font&amp;gt; начинаются с префикса &amp;lt;font color=darkred&amp;gt;wx&amp;lt;/font&amp;gt;, а имена методов классов – с заглавной буквы.&lt;br /&gt;
&lt;br /&gt;
В потомке класса &amp;lt;font color=darkred&amp;gt;wxApp&amp;lt;/font&amp;gt; нам требуется переопределить только один базовый метод – &amp;lt;font color=darkred&amp;gt;OnInit()&amp;lt;/font&amp;gt;. Этот виртуальный метод вызывается базовым классом в самом начале работы программы и именно на него возложена задача по созданию и отображению главного окна. Если метод &amp;lt;font color=darkred&amp;gt;OnInit()&amp;lt;/font&amp;gt; возвращает значение &amp;lt;font color=darkred&amp;gt;'''false''&amp;lt;/font&amp;gt;, выполнение программы сразу же завершается. Если вам необходимо выполнить какие-либо специальные действия в процессе завершения программы (например, высвободить занятые программой ресурсы), вы можете переопределить метод &amp;lt;font color=darkred&amp;gt;OnExit()&amp;lt;/font&amp;gt; класса &amp;lt;font color=darkred&amp;gt;wxApp&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В методе &amp;lt;font color=darkred&amp;gt;OnInit()&amp;lt;/font&amp;gt; мы создаем объект класса-потомка &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt; и вызываем его метод &amp;lt;font color=darkred&amp;gt;Show()&amp;lt;/font&amp;gt;, для того чтобы окно, созданное этим объектом, стало видимым. В классе &amp;lt;font color=darkred&amp;gt;HWFrame&amp;lt;/font&amp;gt; мы переопределяем конструктор и деструктор класса &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt;. Наша задача – добавить в окно &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt; визуальный элемент со статическим текстом (метку) и вывести в нем текст приветствия. Рассмотрим сначала базовый конструктор &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt;. Первый параметр конструктора – указатель на класс родительского окна. Мы передаем в этом параметре значение &amp;lt;font color=darkred&amp;gt;'''NULL'''&amp;lt;/font&amp;gt;, так как главное окно не имеет родителя. Во втором параметре конструктора передается идентификатор окна. Идентификатор представляет собой целое число, которое идентифицирует окно в процессе обработки сообщений. Все окна, использующие один и тот же цикл обработки сообщений (например, главное окно и его дочерние виджеты), должны иметь уникальные идентификаторы (это не относится к некоторым типам окон, не предназначенных для получения «персональных» сообщений). В программе ''hwApp'' мы не обрабатываем сообщения, поэтому нам все равно, какой будет идентификатор у главного окна программы. В конструкторе &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt; мы передаем константу &amp;lt;font color=darkred&amp;gt;wxID_ANY&amp;lt;/font&amp;gt;, которая указывает, что конструктор может сам выбрать идентификатор для создаваемого окна (константой &amp;lt;font color=darkred&amp;gt;wxID_ANY&amp;lt;/font&amp;gt; можно пользоваться всякий раз, когда идентификатор окна вас не интересует). В последнем задействованном нами параметре конструктора передается заголовок создаваемого окна (у конструктора &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt; есть и другие параметры, для которых мы оставляем значения по умолчанию). В самом конструкторе мы создаем объект &amp;lt;font color=darkred&amp;gt;label&amp;lt;/font&amp;gt; класса &amp;lt;font color=darkred&amp;gt;wxStaticText&amp;lt;/font&amp;gt; (метка). Первые два параметра конструктора &amp;lt;font color=darkred&amp;gt;wxStaticText&amp;lt;/font&amp;gt; имеют тот же смысл, что и первые параметры конструктора &amp;lt;font color=darkred&amp;gt;wxFrame&amp;lt;/font&amp;gt;. В третьем параметре мы передаем строку текста для отображения. Обратите внимание, что в качестве идентификатора окна визуального элемента «метка» мы воспользовались константой &amp;lt;font color=darkred&amp;gt;wxID_STATIC&amp;lt;/font&amp;gt;. Этот  идентификатор используется при создании статических визуальных элементов, которые не обрабатывают пользовательский ввод.&lt;br /&gt;
&lt;br /&gt;
Вот, собственно, и все. Ах, да, вы, наверное, обратили внимание, что в программе не определена функция &amp;lt;font color=darkred&amp;gt;main()&amp;lt;/font&amp;gt;. Дело в том, что разработчики ''wxWidgets'' избавили нас от хлопот по написанию главной функции программы. Все необходимые определения содержит макрос &amp;lt;font color=darkred&amp;gt;IMPLEMENT_App()&amp;lt;/font&amp;gt;, которому мы передаем имя класса приложения в качестве параметра. Теперь программу можно скомпилировать, воспользовавшись вспомогательной утилитой ''wx-config'':&lt;br /&gt;
&lt;br /&gt;
 g++ hwApp.cpp `wx-config --libs` `wx-config --cxxflags` -o hwApp&lt;br /&gt;
&lt;br /&gt;
Трудно представить себе программу проще той, что мы написали. В продолжении серии мы рассмотрим процесс создания «настоящего» приложения – программы для записи разговоров ''Skype''.&lt;br /&gt;
&lt;br /&gt;
==Врезки==&lt;br /&gt;
&lt;br /&gt;
===Как должны выглядеть ваши программы?===&lt;br /&gt;
&lt;br /&gt;
Разработчиков кроссплатформенных наборов виджетов можно разделить на два лагеря: одни стремятся к тому, чтобы визуальные компоненты выглядели по возможности одинаково на всех платформах (обычно это люди с твердыми убеждениями относительно того, каким должен быть правильный графический интерфейс). Наборы визуальных компонентов этого типа радуют глаз единством фирменного стиля. Разработчики из другого лагеря настаивают на том, чтобы на каждой платформе внешний вид графических элементов управления максимально соответствовал тому, что принято на данной платформе. К достоинствам этого подхода относят то, что единообразие внешнего вида приложений упрощает, якобы, освоение новых программ. Лично я с этим аргументом не согласен. На мой взгляд, кнопки в стиле Aqua нисколько не мешают освоению ''Safari'' для Windows.&lt;br /&gt;
&lt;br /&gt;
Самое сложное в освоении новой программы – согласовать подход разработчиков к решению поставленной задачи со своим собственным видением. Как бы там ни было, ''wxWidgets'' придерживается второго подхода, причем следует ему в гораздо большей степени, чем, скажем, Qt. Визуальные элементы ''wxWidgets'' не только выглядят на каждой платформе «как родные» (фактически, во многих случаях, классы ''wxWidgets'' – это просто обертки вокруг фирменных элементов управления), но и используют специфические возможности каждой платформы. Например, на платформе Win32 ''wxWidgets'' поддерживает метафайлы, которые отсутствуют в GTK. Если вы программируете интерфейсы с помощью ''wxWidgets'', вы должны сами устанавливать баланс использования платформо-специфичных и кроссплатформенных возможностей библиотеки.&lt;br /&gt;
&lt;br /&gt;
===Центральная проблема GUI-программирования===&lt;br /&gt;
&lt;br /&gt;
Проблема обработки сообщений возникает во всех объектно-ориентированных графических библиотеках, написанных на C++. Представьте себе объект, реализующий кнопку (пусть это будет объект класса &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt;). Во время выполнения программы кнопка – объект &amp;lt;font color=darkred&amp;gt;button1&amp;lt;/font&amp;gt; класса &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt; получает информацию о событиях графической системы (например, о щелчке мышью). В ответ на щелчок мышью для объекта &amp;lt;font color=darkred&amp;gt;button1&amp;lt;/font&amp;gt; вызывается метод класса &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt; (назовем его &amp;lt;font color=darkred&amp;gt;OnClick()&amp;lt;/font&amp;gt;), который должен оповестить остальные компоненты программы о внешнем событии.&lt;br /&gt;
&lt;br /&gt;
Как заставить кнопку делать именно то, что нам нужно? Можно создать класс-потомок &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt;, например, &amp;lt;font color=darkred&amp;gt;MyButton&amp;lt;/font&amp;gt;, и переопределить в нем метод &amp;lt;font color=darkred&amp;gt;OnClick()&amp;lt;/font&amp;gt; базового класса. Этот способ прост, но неудобен. В вашей программе наверняка будет несколько кнопок и при таком подходе вам придется создавать собственный класс для каждой из них. Необходимость создавать собственный класс для каждой кнопки не только сделает ваш код громоздким и трудным в управлении (представьте себе, что вы сначала использовали для создания кнопок базовый класс &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt;, а потом захотели воспользоваться другой реализацией&lt;br /&gt;
кнопки), но и, в некотором смысле, противоречит принципам ООП. Ведь кнопка остается кнопкой, независимо от того, как она реагирует на события. Зачем же создавать новый класс для каждой конкретной кнопки?&lt;br /&gt;
&lt;br /&gt;
Разработчики библиотек визуальных элементов отдают предпочтение модели, в которой для задания собственных обработчиков событий&lt;br /&gt;
необходимо переопределить только один класс. Предположим, что в нашем гипотетическом наборе виджетов есть класс &amp;lt;font color=darkred&amp;gt;Window&amp;lt;/font&amp;gt;, который реализует главное окно. Мы определяем класс-потомок класса &amp;lt;font color=darkred&amp;gt;Window&amp;lt;/font&amp;gt; (например, &amp;lt;font color=darkred&amp;gt;MyWindow&amp;lt;/font&amp;gt;) и определяем обработчики всех событий всех дочерних элементов главного окна как методы этого класса. Все кнопки, используемые в окне класса &amp;lt;font color=darkred&amp;gt;MyWindow&amp;lt;/font&amp;gt;, могут быть объектами класса &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt;. Обработчиком события &amp;lt;font color=darkred&amp;gt;OnClick&amp;lt;/font&amp;gt; каждой кнопки будет один из методов &amp;lt;font color=darkred&amp;gt;MyWindow&amp;lt;/font&amp;gt;. Нам остается только сообщить каждому объекту &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt;, какой из методов объекта класса &amp;lt;font color=darkred&amp;gt;MyWindow&amp;lt;/font&amp;gt; является обработчиком его события. Тут-то и возникает проблема. Мы должны «прикрепить» методы &amp;lt;font color=darkred&amp;gt;MyWindow&amp;lt;/font&amp;gt; к объектам &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt; (при этом класс &amp;lt;font color=darkred&amp;gt;Button&amp;lt;/font&amp;gt; ничего не знает о классе &amp;lt;font color=darkred&amp;gt;MyWindow&amp;lt;/font&amp;gt;). В некоторых языках программирования (Objective-C, C#) эта проблема была решена на уровне самого языка. В C++ стандартного решения не существует, и разработчики наборов виджетов реализуют механизмы обработки сообщений по своему разумению. Все используемые сегодня решения основаны, так или иначе, на функциях обратного вызова. Фактически, разные библиотеки виджетов различаются только способами оформления этого подхода.&lt;br /&gt;
&lt;br /&gt;
===Полезные ссылки===&lt;br /&gt;
&lt;br /&gt;
*Викифицированный справочник по всем классам, переменным, функциям и макросам библиотеки ''wxWidgets'' можно найти на сайте проекта по адресу: [http://wiki.wxwidgets.org/docbrowse.html wiki.wxwidgets.org/docbrowse.html].&lt;br /&gt;
*Хорошим источником информации о программировании в wxWidgets может служить книга «''Cross-Platform GUI Programming with wxWidgets''», написанная Джулианом Смартом [Julian Smart], Кевином Хоком [Kevin Hock] и Стефаном Шомором [Stefan Csomor]. Книга вышла в 2005 году, но не утратила актуальности до сих пор. Правила серии Bruce Perens Open Source Series, к которой принадлежит это издание, позволяют абсолютно легально загрузить его электронную версию (на английском языке) с сайта [http://www.phptr.com/perens www.phptr.com/perens}. Бумажный вариант можно приобрести на [http://www.amazon.com Amazon.com] по весьма умеренной цене.&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:Java_EE10</id>
		<title>LXF98:Java EE10</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:Java_EE10"/>
				<updated>2008-03-27T11:28:23Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: /* Что включается в Struts? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;font color=darkred&amp;gt;Struts&amp;lt;/font&amp;gt;, великий и ужасный==&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;font color=darkred&amp;gt;'''ЧАСТЬ 10'''&amp;lt;/font&amp;gt; Компьютеры были придуманы, чтобы избавить человечество от рутины – так зачем делать вручную то, что можно сгенерировать автоматически? '''Александр Бабаев''' покажет, как Struts позволяет избежать монотонного кодирования приложений J2EE.''&lt;br /&gt;
&lt;br /&gt;
Вручную делать простые вещи хорошо: быстро, просто, понятно. Но что делать, если нужно так же быстро и просто создать нечто большое? Сайт-портал, например? Не тот портал, который Яндекс, а корпоративный – где интегрирована система хранения документов, информационная система, наша адресная книга?&lt;br /&gt;
&lt;br /&gt;
В PHP в этом случае приходит на помощь ''CMS''. Сладкие слова, которые обещают «в два клика» сделать вам все что угодно. Маркетинг, конечно, страшная сила, но почему так много ''CMS'' на PHP, и нет на ''Java''?&lt;br /&gt;
&lt;br /&gt;
Возможно, просто потому что не нужно. Место ''CMS'' в ''Java'' занимают разнообразные инструментарии разработчика, которые помогают обходить сложные и рутинные работы. В результате можно небольшими силами сделать систему, по сложности намного превосходящую то, что можно сделать «вручную».&lt;br /&gt;
&lt;br /&gt;
===Что включается в Struts?===&lt;br /&gt;
&lt;br /&gt;
''Struts'' не изобретает велосипедов. В его основе лежит шаблон «MODEl-View-Controller», который мы рассматривали в [[LXF92:Java_EE|LXF92]], но с его помощью проще создать грамотное приложение, так как четко определены задачи по его созданию; проще разобраться, что необходимо написать для получения результата.&lt;br /&gt;
&lt;br /&gt;
Итак, ''Struts'' (будем рассматривать более простую, первую версию) содержит:&lt;br /&gt;
&lt;br /&gt;
*''API'' для создания обработчика запросов (менеджер, распределяющий запросы по действиям) и для создания самих действий (&amp;lt;font color=darkred&amp;gt;Actions&amp;lt;/font&amp;gt;).&lt;br /&gt;
*''API'' для создания обработчиков форм.&lt;br /&gt;
*''API'' для работы с проверкой корректности заполнения (валидации) форм.&lt;br /&gt;
*''Tiles''. Расширение для создания модульных страниц (что-то «вроде SSI»).&lt;br /&gt;
*''JSP-taglib'', библиотека ''JPS''-тэгов для упрощения написания JSP-страниц.&lt;br /&gt;
*''XML''-конфигурационные файлы, для простой и быстрой настройки всего вышеперечисленного и связи его друг с другом.&lt;br /&gt;
&lt;br /&gt;
Все это в предыдущих статьях мы делали вручную. Теперь настало время проделать то же самое более «технологично».&lt;br /&gt;
&lt;br /&gt;
===Как этим пользоваться?===&lt;br /&gt;
&lt;br /&gt;
Во-первых, библиотеку нужно скачать. Это можно сделать со странички http://struts.apache.org/download.cgi#struts138. После чего следует распаковать полученный файл и вытащить оттуда все JAR-архивы.&lt;br /&gt;
&lt;br /&gt;
В качестве примера, создадим уже знакомую телефонную книгу. Сперва каталог; в нем, как всегда, организуем подкаталоги для исходных текстов, скомпилированного кода, библиотек и JSP-файлов. Получится что-то такое:&lt;br /&gt;
&lt;br /&gt;
*'''libs'''&lt;br /&gt;
**''antlr-2.7.2.jar''&lt;br /&gt;
**''bsf-2.3.0.jar''&lt;br /&gt;
**''commons-beanutils-1.7.0.jar''&lt;br /&gt;
**''commonschain-1.1.jar''&lt;br /&gt;
**''commons-digester-1.8.jar''&lt;br /&gt;
**''commons-fileipload-1.1.1.jar''&lt;br /&gt;
**''commons-io-1.1.jar''&lt;br /&gt;
**''commons-logging-1.0.4.jar''&lt;br /&gt;
**''commons-validator-1.3.1.jar''&lt;br /&gt;
**''jstl-1.0.2.jar''&lt;br /&gt;
**''oro-2.0.8.jar''&lt;br /&gt;
**''standart-1.0.2.jar''&lt;br /&gt;
**''struts-core-1.3.8.jar''&lt;br /&gt;
**''struts-el-1.3.8.jar''&lt;br /&gt;
**''struts-extras-1.3.8.jar''&lt;br /&gt;
**''struts-faces-1.3.8.jar''&lt;br /&gt;
**''struts-mailreader-dao-1.3.8.jar''&lt;br /&gt;
**''struts-scripting-1.3.8.jar''&lt;br /&gt;
**''struts-taglib-1.3.8.jar''&lt;br /&gt;
**''struts-tiles-1.3.8.jar''&lt;br /&gt;
*'''out'''&lt;br /&gt;
*'''src'''&lt;br /&gt;
**''MessageResources_en.properties''&lt;br /&gt;
**''MessageResources_ru.properties''&lt;br /&gt;
**'''ru'''&lt;br /&gt;
*'''web'''&lt;br /&gt;
**''index.jsp''&lt;br /&gt;
**'''pages'''&lt;br /&gt;
**'''WEB-INF'''&lt;br /&gt;
&lt;br /&gt;
Затем в каталог библиотек нужно положить JAR-файлы ''Struts''. Готово? Тогда можно приступать к кодированию.&lt;br /&gt;
&lt;br /&gt;
Когда запрос приходит в сервлет, он первым делом попадает в ''Struts'', который перенаправляет его в менеджер запросов (&amp;lt;font color=darkred&amp;gt;ActionServet&amp;lt;/font&amp;gt;) и далее в нужное действие (&amp;lt;font color=darkred&amp;gt;Action&amp;lt;/font&amp;gt;). Это происходит примерно так:&lt;br /&gt;
&lt;br /&gt;
Как видно, схема здорово напоминает примененную нами при создании адресной книги. Зачем тогда ''Struts''? А затем, чтобы не писать много-много однотипного кода, который повторяется из проекта в проект.&lt;br /&gt;
&lt;br /&gt;
===Конфигурационные файлы===&lt;br /&gt;
&lt;br /&gt;
Вначале научимся запускать ''Struts''. Для этого нужно перенаправить все запросы сервлету-обработчику и написать файл конфигурации. Вот&lt;br /&gt;
простой дескриптор для простого ''Struts''-приложения:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;?xml version=”1.0” encoding=”UTF-8”?&amp;gt;&lt;br /&gt;
  &amp;lt;web-app&amp;gt;&lt;br /&gt;
    &amp;lt;servlet&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;action&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-class&amp;gt;org.apache.struts.action.ActionServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;init-param&amp;gt;&lt;br /&gt;
           &amp;lt;param-name&amp;gt;config&amp;lt;/param-name&amp;gt;&lt;br /&gt;
           &amp;lt;param-value&amp;gt;/WEB-INF/struts-config.xml&amp;lt;/param-value&amp;gt;&lt;br /&gt;
        &amp;lt;/init-param&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet&amp;gt;&lt;br /&gt;
    &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;action&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;url-pattern&amp;gt;*.do&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
  &amp;lt;/web-app&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Видно, что все запросы &amp;lt;font color=darkred&amp;gt;*.do&amp;lt;/font&amp;gt; передаются сервлету &amp;lt;font color=darkred&amp;gt;action&amp;lt;/font&amp;gt;, обрабатываемому классом &amp;lt;font color=darkred&amp;gt;ActionServlet&amp;lt;/font&amp;gt;. Это стандартный класс Struts, который перенаправляет запросы в действия. Ему передается конфигурационный файл '''struts-config.xml'''. Вот он:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;?xml version=”1.0” encoding=”UTF-8” ?&amp;gt;&lt;br /&gt;
  &amp;lt;struts-config&amp;gt;&lt;br /&gt;
    &amp;lt;form-beans&amp;gt;&lt;br /&gt;
        &amp;lt;form-bean name=”addForm” type=”org.apache.struts.validator.DynaValidatorForm”&amp;gt;&lt;br /&gt;
           &amp;lt;form-property name=”name” type=”java.lang.String” initial=”Name”/&amp;gt;&lt;br /&gt;
           &amp;lt;form-property name=”phone” type=”java.lang.String” initial=”1234567”/&amp;gt;&lt;br /&gt;
          &amp;lt;form-property name=”age” type=”java.lang.Integer” initial=”20”/&amp;gt;&lt;br /&gt;
          &amp;lt;form-property name=”comment” type=”java.lang.String” initial=”NoComment”/&amp;gt;&lt;br /&gt;
       &amp;lt;/form-bean&amp;gt;&lt;br /&gt;
      &amp;lt;action-mappings&amp;gt;&lt;br /&gt;
       &amp;lt;action path=”/add” name=”addForm” validate=”true” type=”ru.linuxformat.actions.Add”&amp;gt;&lt;br /&gt;
          &amp;lt;forward name=”form” path=”/pages/Add.jsp”/&amp;gt;&lt;br /&gt;
          &amp;lt;forward name=”done” path=”/list.do”/&amp;gt;&lt;br /&gt;
       &amp;lt;/action&amp;gt;&lt;br /&gt;
       &amp;lt;action path=”/list” type=”ru.linuxformat.actions.ShowAll”&amp;gt;&lt;br /&gt;
          &amp;lt;forward name=”ok” path=”/pages/List.jsp”/&amp;gt;&lt;br /&gt;
       &amp;lt;/action&amp;gt;&lt;br /&gt;
   &amp;lt;/action-mappings&amp;gt;&lt;br /&gt;
   &amp;lt;message-resources parameter=”MessageResources”/&amp;gt;&lt;br /&gt;
   &amp;lt;plug-in className=”org.apache.struts.validator.ValidatorPlugIn”&amp;gt;&lt;br /&gt;
       &amp;lt;set-property property=”pathnames” value=”/org/apache/struts/validator/validator-rules.xml,/WEB-INF/validation.xml”/&amp;gt;&lt;br /&gt;
   &amp;lt;/plug-in&amp;gt;&lt;br /&gt;
 &amp;lt;/struts-config&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В данном файле описана форма добавления контакта (&amp;lt;font color=darkred&amp;gt;form-bean&amp;lt;/font&amp;gt;), с использованием стандартного класса формы с поддержкой автоматической проверки полей (&amp;lt;font color=darkred&amp;gt;DynaValidatorForm&amp;lt;/font&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
После этого описано, какие запросы в какие классы перенаправляются.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;action path=”/list” type=”ru.linuxformat.actions.ShowAll”&amp;gt;&lt;br /&gt;
   &amp;lt;forward name=”ok” path=”/pages/List.jsp”/&amp;gt;&lt;br /&gt;
 &amp;lt;/action&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В этом примере запрос &amp;lt;font color=darkred&amp;gt;/list.do&amp;lt;/font&amp;gt; пойдет в класс &amp;lt;font color=darkred&amp;gt;ShowAll.Forward&amp;lt;/font&amp;gt; используется внутри действия, чтобы упростить перенаправление вывода. Дальше будет понятно, как.&lt;br /&gt;
&lt;br /&gt;
После описания действий все становится совсем просто.Описывается файл, откуда будут браться локализованные строки, и&lt;br /&gt;
подключается модуль, который обеспечивает простую и мощную валидацию (проверку) форм.&lt;br /&gt;
&lt;br /&gt;
===Действия===&lt;br /&gt;
&lt;br /&gt;
Перейдем к классам. Все они должны быть унаследованы от класса &amp;lt;font color=darkred&amp;gt;org.apache.struts.action.Action&amp;lt;/font&amp;gt;. При этом в простейшем случае нужно переопределить только один метод, &amp;lt;font color=darkred&amp;gt;execute(…)&amp;lt;/font&amp;gt;. Например, вот действие, которое показывает список контактов:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 public class ShowAll extends Action {&lt;br /&gt;
   public ActionForward execute(ActionMapping aActionMapping,&lt;br /&gt;
                        ActionForm aActionForm,&lt;br /&gt;
                        HttpServletRequest aHttpServletRequest,&lt;br /&gt;
                        HttpServletResponse aHttpServletResponse)&lt;br /&gt;
                                            throws Exception {&lt;br /&gt;
      aHttpServletRequest.setAttribute(“contacts”,&lt;br /&gt;
             Contacter.getInstance().getContactsSortedByName());&lt;br /&gt;
      return aActionMapping.findForward(“ok”);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В этом действии в атрибут запроса кладется список всех контактов, после чего вызывается форвард &amp;lt;font color=darkred&amp;gt;“ok”&amp;lt;/font&amp;gt; – именно он был описан чуть выше.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;action path=”/list” type=”ru.linuxformat.actions.ShowAll”&amp;gt;&lt;br /&gt;
   &amp;lt;forward name=”ok” path=”/pages/List.jsp”/&amp;gt;&lt;br /&gt;
 &amp;lt;/action&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Из описания видно, что форвард перенаправляет обработку запроса в '''List.jsp''. Посмотрим, что в нем написано:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;%@ page pageEncoding=”UTF-8” language=”java” contentType=”text/&lt;br /&gt;
 html; utf-8” %&amp;gt;&lt;br /&gt;
 &amp;lt;%@ taglib uri=”http://struts.apache.org/tags-html” prefix=”html” %&amp;gt;&lt;br /&gt;
 &amp;lt;%@ taglib uri=”http://struts.apache.org/tags-bean” prefix=”bean” %&amp;gt;&lt;br /&gt;
 &amp;lt;%@ taglib uri=”http://struts.apache.org/tags-logic” prefix=”logic” %&amp;gt;&lt;br /&gt;
 &amp;lt;html:html&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
      …&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
      …&lt;br /&gt;
   &amp;lt;table border=”1”&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;bean:message key=”AddressBook.list.name”/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;bean:message key=”AddressBook.list.phone”/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;bean:message key=”AddressBook.list.comment”/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;bean:message key=”AddressBook.list.age”/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
   &amp;lt;logic:iterate id=”contact” type=”ru.linuxformat.Contact”&lt;br /&gt;
 name=”contacts” scope=”request”&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%=contact.getName()%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%=contact.getPhone()%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%=contact.getComment()%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%=contact.getAge()%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
   &amp;lt;/logic:iterate&amp;gt;&lt;br /&gt;
   &amp;lt;/table&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;/html:html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
На многоточия заменены неинтересные куски кода, а интересное – в самом начале листинга (&amp;lt;font color=darkred&amp;gt;taglib&amp;lt;/font&amp;gt;). Это так называемые библиотеки тэгов. Примеры можно видеть здесь же. Скажем, &amp;lt;font color=darkred&amp;gt;&amp;lt;bean:messagekey=”AddressBook.list.name”/&amp;gt;&amp;lt;/font&amp;gt; вставляет локализованную строку, соответствующую данному ключу. А &amp;lt;font color=darkred&amp;gt;&amp;lt;logic:iterate&amp;gt;&amp;lt;/font&amp;gt; умеет итерировать по коллекциям (списки, ассоциативные массивы и так далее). В данном случае мы итерируем по атрибуту запроса &amp;lt;font color=darkred&amp;gt;contacts&amp;lt;/font&amp;gt;, который мы положили туда в действии.&lt;br /&gt;
&lt;br /&gt;
===Формы, проверка корректности форм===&lt;br /&gt;
&lt;br /&gt;
Другая интересная часть – формы. Второе действие, добавление контакта, выглядит следующим образом (приведен только код метода &amp;lt;font color=darkred&amp;gt;execute&amp;lt;/font&amp;gt;):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
       if (aHttpServletRequest.getParameter(“name”) == null) {&lt;br /&gt;
           return aActionMapping.findForward(“form”);&lt;br /&gt;
       } else {&lt;br /&gt;
           DynaActionForm form = (DynaActionForm) aActionForm;&lt;br /&gt;
           Contacter.getInstance().addContact(form.getString(“name”), form.&lt;br /&gt;
 getString(“phone”), form.getString(“comment”), (Integer) form.&lt;br /&gt;
 get(“age”));&lt;br /&gt;
           return aActionMapping.findForward(“done”);&lt;br /&gt;
       }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Логика очень похожа на ту, что была в предыдущих статьях. Если форма не заполнена, переходим по форварду &amp;lt;font color=darkred&amp;gt;form&amp;lt;/font&amp;gt;, который показывает форму для ввода. Если она заполнена (и валидирована), то контакт добавляется в список, и мы переходим на форвард &amp;lt;font color=darkred&amp;gt;done&amp;lt;/font&amp;gt;. Вот и сама форма (точнее, ее основная часть):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;html:form action=”/add” method=”post” onsubmit=”return&lt;br /&gt;
 validateAddForm(this);”&amp;gt;&lt;br /&gt;
       &amp;lt;table&amp;gt;&lt;br /&gt;
           &amp;lt;tr&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;bean:message key=”AddressBook.add.name”/&amp;gt;:&amp;lt;/td&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;html:text property=”name”/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
           &amp;lt;/tr&amp;gt;&lt;br /&gt;
          …&lt;br /&gt;
           &amp;lt;tr&amp;gt;&lt;br /&gt;
              &amp;lt;td colspan=”2”&amp;gt;&amp;lt;html:submit titleKey=”AddressBook.add.&lt;br /&gt;
 submit”/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
           &amp;lt;/tr&amp;gt;&lt;br /&gt;
       &amp;lt;/table&amp;gt;&lt;br /&gt;
    &amp;lt;/html:form&amp;gt;&lt;br /&gt;
    &amp;lt;html:javascript formName=”addForm”/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Тут интересны два момента. Во-первых, используются тэги ''Struts'' (&amp;lt;font color=darkred&amp;gt;html:…&amp;lt;/font&amp;gt;), упрощающие создание компонентов формы. Во-вторых, используется скрипт валидации (&amp;lt;font color=darkred&amp;gt;onsubmit=”…”&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;&amp;lt;html:Javascript …&amp;gt;&amp;lt;/font&amp;gt;). Он обеспечивает валидацию прямо в браузере, не отсылая запрос на сервер.&lt;br /&gt;
&lt;br /&gt;
Сами правила валидации задаются в файле '''validation.xml'''. Вот как это выглядит:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;form-validation&amp;gt;&lt;br /&gt;
    &amp;lt;formset&amp;gt;&lt;br /&gt;
       &amp;lt;form name=”addForm”&amp;gt;&lt;br /&gt;
           &amp;lt;field property=”age” depends=”required,integer,intRange”&amp;gt;&lt;br /&gt;
              &amp;lt;arg key=”AddressBook.add.age”/&amp;gt;&lt;br /&gt;
              &amp;lt;arg position=”1” name=”intRange” key=”10”&lt;br /&gt;
 resource=”false”/&amp;gt;&lt;br /&gt;
              &amp;lt;arg position=”2” name=”intRange” key=”20”&lt;br /&gt;
 resource=”false”/&amp;gt;&lt;br /&gt;
              &amp;lt;var&amp;gt;&amp;lt;var-name&amp;gt;min&amp;lt;/var-name&amp;gt;&amp;lt;var-value&amp;gt;10&amp;lt;/var-value&amp;gt;&amp;lt;/&lt;br /&gt;
 var&amp;gt;&lt;br /&gt;
              &amp;lt;var&amp;gt;&amp;lt;var-name&amp;gt;max&amp;lt;/var-name&amp;gt;&amp;lt;var-value&amp;gt;20&amp;lt;/var-value&amp;gt;&amp;lt;/&lt;br /&gt;
 var&amp;gt;&lt;br /&gt;
           &amp;lt;/field&amp;gt;&lt;br /&gt;
       &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;/formset&amp;gt;&lt;br /&gt;
  &amp;lt;/form-validation&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Форму я создал в '''struts-config'''. Называться она должна так же. Для поля &amp;lt;font color=darkred&amp;gt;age&amp;lt;/font&amp;gt; задается три правила валидации: &amp;lt;font color=darkred&amp;gt;required&amp;lt;/font&amp;gt;, &amp;lt;font color=darkred&amp;gt;integer&amp;lt;/font&amp;gt;, &amp;lt;font color=darkred&amp;gt;intRange&amp;lt;/font&amp;gt;. Первое говорит, что поле обязательно, второе – что значение должно быть целочисленным, третье правило сообщает, что значение должно лежать в пределах от 10 до 20. В качестве параметров задаются аргументы сообщений, которые будут выводиться при ошибочном заполнении формы (&amp;lt;font color=darkred&amp;gt;arg&amp;lt;/font&amp;gt;), и параметры для правил валидации (&amp;lt;font color=darkred&amp;gt;var&amp;lt;/font&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===Локализация===&lt;br /&gt;
&lt;br /&gt;
Последняя часть, пока не описанная – локализация. Сообщения хранятся в так называемых properties-файлах, причем если property-файл называется '''MessageResources''', то, например, файл русской локализации должен называться '''MessageResources_ru.properties''', а английской –  '''MessageResources_en.properties'''. Если нужно уточнить – например, английский язык, Америка – то получается так: '''MessageResources_en_US.properties'''.&lt;br /&gt;
&lt;br /&gt;
Структура файлов '''properties''' очень проста. Каждая строка (не пустая и не комментарий) состоит из двух частей, разделенных знаком равенства (&amp;lt;font color=darkred&amp;gt;=&amp;lt;/font&amp;gt;). Слева – ключ, справа – значение этого ключа.&lt;br /&gt;
&lt;br /&gt;
Эти файлы нужно положить в каталог '''src''', и проконтролировать, чтобы они переписались туда же, куда попадают class-файлы. Плюс, для неанглийских&lt;br /&gt;
файлов, их нужно преобразовать в ASCII-формат. Это делается утилитой ''native2ascii'' из поставки JDK. Инструкции по пользованию утилитой можно найти здесь: http://Java.sun.com/Javase/6/docs/technotes/tools/windows/native2ascii.html.&lt;br /&gt;
&lt;br /&gt;
После этого можно использовать в JSP вставки вида &amp;lt;font color=darkred&amp;gt;&amp;lt;bean:message key=”AddressBook.add.name”/&amp;gt;&amp;lt;/font&amp;gt;, вместо которых будет вставлена локализованная строка, соответствующая данному ключу (в примере – &amp;lt;font color=darkred&amp;gt;AddressBook.add.name&amp;lt;/font&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===Что дальше?===&lt;br /&gt;
&lt;br /&gt;
''Struts'' – великолепная библиотека, позволяющая упростить разработку сложных приложений. Особенно хорошо такого рода библиотеки подходят для задач, в которых много монотонной работы: больших форм, большого количества простых действий, необходимость проверки данных, вводимых в форму, локализация.&lt;br /&gt;
&lt;br /&gt;
Также полезно, что используются стандартные средства: ''JSP'', ''Servlets'', да и сам ''Struts'' – самая распространенная библиотека для такого рода работ. В результате при приеме на работу, например, знание именно ''Struts'' позволяет набрать несколько дополнительных баллов.&lt;br /&gt;
&lt;br /&gt;
Правда, еще больше баллов дает знание ''EJB3''. Но об этом мы поговорим в следующей, заключительной статье.&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:Java_EE10</id>
		<title>LXF98:Java EE10</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:Java_EE10"/>
				<updated>2008-03-27T11:24:37Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: /* Как этим пользоваться? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;font color=darkred&amp;gt;Struts&amp;lt;/font&amp;gt;, великий и ужасный==&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;font color=darkred&amp;gt;'''ЧАСТЬ 10'''&amp;lt;/font&amp;gt; Компьютеры были придуманы, чтобы избавить человечество от рутины – так зачем делать вручную то, что можно сгенерировать автоматически? '''Александр Бабаев''' покажет, как Struts позволяет избежать монотонного кодирования приложений J2EE.''&lt;br /&gt;
&lt;br /&gt;
Вручную делать простые вещи хорошо: быстро, просто, понятно. Но что делать, если нужно так же быстро и просто создать нечто большое? Сайт-портал, например? Не тот портал, который Яндекс, а корпоративный – где интегрирована система хранения документов, информационная система, наша адресная книга?&lt;br /&gt;
&lt;br /&gt;
В PHP в этом случае приходит на помощь ''CMS''. Сладкие слова, которые обещают «в два клика» сделать вам все что угодно. Маркетинг, конечно, страшная сила, но почему так много ''CMS'' на PHP, и нет на ''Java''?&lt;br /&gt;
&lt;br /&gt;
Возможно, просто потому что не нужно. Место ''CMS'' в ''Java'' занимают разнообразные инструментарии разработчика, которые помогают обходить сложные и рутинные работы. В результате можно небольшими силами сделать систему, по сложности намного превосходящую то, что можно сделать «вручную».&lt;br /&gt;
&lt;br /&gt;
===Что включается в Struts?===&lt;br /&gt;
&lt;br /&gt;
''Struts'' не изобретает велосипедов. В его основе лежит шаблон «MODEl-View-Controller», который мы рассматривали в LXF92, но с его помощью проще создать грамотное приложение, так как четко определены задачи по его созданию; проще разобраться, что необходимо написать для получения результата.&lt;br /&gt;
&lt;br /&gt;
Итак, ''Struts'' (будем рассматривать более простую, первую версию) содержит:&lt;br /&gt;
&lt;br /&gt;
*''API'' для создания обработчика запросов (менеджер, распределяющий запросы по действиям) и для создания самих действий (&amp;lt;font color=darkred&amp;gt;Actions&amp;lt;/font&amp;gt;).&lt;br /&gt;
*''API'' для создания обработчиков форм.&lt;br /&gt;
*''API'' для работы с проверкой корректности заполнения (валидации) форм.&lt;br /&gt;
*''Tiles''. Расширение для создания модульных страниц (что-то «вроде SSI»).&lt;br /&gt;
*''JSP-taglib'', библиотека ''JPS''-тэгов для упрощения написания JSP-страниц.&lt;br /&gt;
*''XML''-конфигурационные файлы, для простой и быстрой настройки всего вышеперечисленного и связи его друг с другом.&lt;br /&gt;
&lt;br /&gt;
Все это в предыдущих статьях мы делали вручную. Теперь настало время проделать то же самое более «технологично».&lt;br /&gt;
&lt;br /&gt;
===Как этим пользоваться?===&lt;br /&gt;
&lt;br /&gt;
Во-первых, библиотеку нужно скачать. Это можно сделать со странички http://struts.apache.org/download.cgi#struts138. После чего следует распаковать полученный файл и вытащить оттуда все JAR-архивы.&lt;br /&gt;
&lt;br /&gt;
В качестве примера, создадим уже знакомую телефонную книгу. Сперва каталог; в нем, как всегда, организуем подкаталоги для исходных текстов, скомпилированного кода, библиотек и JSP-файлов. Получится что-то такое:&lt;br /&gt;
&lt;br /&gt;
*'''libs'''&lt;br /&gt;
**''antlr-2.7.2.jar''&lt;br /&gt;
**''bsf-2.3.0.jar''&lt;br /&gt;
**''commons-beanutils-1.7.0.jar''&lt;br /&gt;
**''commonschain-1.1.jar''&lt;br /&gt;
**''commons-digester-1.8.jar''&lt;br /&gt;
**''commons-fileipload-1.1.1.jar''&lt;br /&gt;
**''commons-io-1.1.jar''&lt;br /&gt;
**''commons-logging-1.0.4.jar''&lt;br /&gt;
**''commons-validator-1.3.1.jar''&lt;br /&gt;
**''jstl-1.0.2.jar''&lt;br /&gt;
**''oro-2.0.8.jar''&lt;br /&gt;
**''standart-1.0.2.jar''&lt;br /&gt;
**''struts-core-1.3.8.jar''&lt;br /&gt;
**''struts-el-1.3.8.jar''&lt;br /&gt;
**''struts-extras-1.3.8.jar''&lt;br /&gt;
**''struts-faces-1.3.8.jar''&lt;br /&gt;
**''struts-mailreader-dao-1.3.8.jar''&lt;br /&gt;
**''struts-scripting-1.3.8.jar''&lt;br /&gt;
**''struts-taglib-1.3.8.jar''&lt;br /&gt;
**''struts-tiles-1.3.8.jar''&lt;br /&gt;
*'''out'''&lt;br /&gt;
*'''src'''&lt;br /&gt;
**''MessageResources_en.properties''&lt;br /&gt;
**''MessageResources_ru.properties''&lt;br /&gt;
**'''ru'''&lt;br /&gt;
*'''web'''&lt;br /&gt;
**''index.jsp''&lt;br /&gt;
**'''pages'''&lt;br /&gt;
**'''WEB-INF'''&lt;br /&gt;
&lt;br /&gt;
Затем в каталог библиотек нужно положить JAR-файлы ''Struts''. Готово? Тогда можно приступать к кодированию.&lt;br /&gt;
&lt;br /&gt;
Когда запрос приходит в сервлет, он первым делом попадает в ''Struts'', который перенаправляет его в менеджер запросов (&amp;lt;font color=darkred&amp;gt;ActionServet&amp;lt;/font&amp;gt;) и далее в нужное действие (&amp;lt;font color=darkred&amp;gt;Action&amp;lt;/font&amp;gt;). Это происходит примерно так:&lt;br /&gt;
&lt;br /&gt;
Как видно, схема здорово напоминает примененную нами при создании адресной книги. Зачем тогда ''Struts''? А затем, чтобы не писать много-много однотипного кода, который повторяется из проекта в проект.&lt;br /&gt;
&lt;br /&gt;
===Конфигурационные файлы===&lt;br /&gt;
&lt;br /&gt;
Вначале научимся запускать ''Struts''. Для этого нужно перенаправить все запросы сервлету-обработчику и написать файл конфигурации. Вот&lt;br /&gt;
простой дескриптор для простого ''Struts''-приложения:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;?xml version=”1.0” encoding=”UTF-8”?&amp;gt;&lt;br /&gt;
  &amp;lt;web-app&amp;gt;&lt;br /&gt;
    &amp;lt;servlet&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;action&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-class&amp;gt;org.apache.struts.action.ActionServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;init-param&amp;gt;&lt;br /&gt;
           &amp;lt;param-name&amp;gt;config&amp;lt;/param-name&amp;gt;&lt;br /&gt;
           &amp;lt;param-value&amp;gt;/WEB-INF/struts-config.xml&amp;lt;/param-value&amp;gt;&lt;br /&gt;
        &amp;lt;/init-param&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet&amp;gt;&lt;br /&gt;
    &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;action&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;url-pattern&amp;gt;*.do&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
  &amp;lt;/web-app&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Видно, что все запросы &amp;lt;font color=darkred&amp;gt;*.do&amp;lt;/font&amp;gt; передаются сервлету &amp;lt;font color=darkred&amp;gt;action&amp;lt;/font&amp;gt;, обрабатываемому классом &amp;lt;font color=darkred&amp;gt;ActionServlet&amp;lt;/font&amp;gt;. Это стандартный класс Struts, который перенаправляет запросы в действия. Ему передается конфигурационный файл '''struts-config.xml'''. Вот он:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;?xml version=”1.0” encoding=”UTF-8” ?&amp;gt;&lt;br /&gt;
  &amp;lt;struts-config&amp;gt;&lt;br /&gt;
    &amp;lt;form-beans&amp;gt;&lt;br /&gt;
        &amp;lt;form-bean name=”addForm” type=”org.apache.struts.validator.DynaValidatorForm”&amp;gt;&lt;br /&gt;
           &amp;lt;form-property name=”name” type=”java.lang.String” initial=”Name”/&amp;gt;&lt;br /&gt;
           &amp;lt;form-property name=”phone” type=”java.lang.String” initial=”1234567”/&amp;gt;&lt;br /&gt;
          &amp;lt;form-property name=”age” type=”java.lang.Integer” initial=”20”/&amp;gt;&lt;br /&gt;
          &amp;lt;form-property name=”comment” type=”java.lang.String” initial=”NoComment”/&amp;gt;&lt;br /&gt;
       &amp;lt;/form-bean&amp;gt;&lt;br /&gt;
      &amp;lt;action-mappings&amp;gt;&lt;br /&gt;
       &amp;lt;action path=”/add” name=”addForm” validate=”true” type=”ru.linuxformat.actions.Add”&amp;gt;&lt;br /&gt;
          &amp;lt;forward name=”form” path=”/pages/Add.jsp”/&amp;gt;&lt;br /&gt;
          &amp;lt;forward name=”done” path=”/list.do”/&amp;gt;&lt;br /&gt;
       &amp;lt;/action&amp;gt;&lt;br /&gt;
       &amp;lt;action path=”/list” type=”ru.linuxformat.actions.ShowAll”&amp;gt;&lt;br /&gt;
          &amp;lt;forward name=”ok” path=”/pages/List.jsp”/&amp;gt;&lt;br /&gt;
       &amp;lt;/action&amp;gt;&lt;br /&gt;
   &amp;lt;/action-mappings&amp;gt;&lt;br /&gt;
   &amp;lt;message-resources parameter=”MessageResources”/&amp;gt;&lt;br /&gt;
   &amp;lt;plug-in className=”org.apache.struts.validator.ValidatorPlugIn”&amp;gt;&lt;br /&gt;
       &amp;lt;set-property property=”pathnames” value=”/org/apache/struts/validator/validator-rules.xml,/WEB-INF/validation.xml”/&amp;gt;&lt;br /&gt;
   &amp;lt;/plug-in&amp;gt;&lt;br /&gt;
 &amp;lt;/struts-config&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В данном файле описана форма добавления контакта (&amp;lt;font color=darkred&amp;gt;form-bean&amp;lt;/font&amp;gt;), с использованием стандартного класса формы с поддержкой автоматической проверки полей (&amp;lt;font color=darkred&amp;gt;DynaValidatorForm&amp;lt;/font&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
После этого описано, какие запросы в какие классы перенаправляются.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;action path=”/list” type=”ru.linuxformat.actions.ShowAll”&amp;gt;&lt;br /&gt;
   &amp;lt;forward name=”ok” path=”/pages/List.jsp”/&amp;gt;&lt;br /&gt;
 &amp;lt;/action&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В этом примере запрос &amp;lt;font color=darkred&amp;gt;/list.do&amp;lt;/font&amp;gt; пойдет в класс &amp;lt;font color=darkred&amp;gt;ShowAll.Forward&amp;lt;/font&amp;gt; используется внутри действия, чтобы упростить перенаправление вывода. Дальше будет понятно, как.&lt;br /&gt;
&lt;br /&gt;
После описания действий все становится совсем просто.Описывается файл, откуда будут браться локализованные строки, и&lt;br /&gt;
подключается модуль, который обеспечивает простую и мощную валидацию (проверку) форм.&lt;br /&gt;
&lt;br /&gt;
===Действия===&lt;br /&gt;
&lt;br /&gt;
Перейдем к классам. Все они должны быть унаследованы от класса &amp;lt;font color=darkred&amp;gt;org.apache.struts.action.Action&amp;lt;/font&amp;gt;. При этом в простейшем случае нужно переопределить только один метод, &amp;lt;font color=darkred&amp;gt;execute(…)&amp;lt;/font&amp;gt;. Например, вот действие, которое показывает список контактов:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 public class ShowAll extends Action {&lt;br /&gt;
   public ActionForward execute(ActionMapping aActionMapping,&lt;br /&gt;
                        ActionForm aActionForm,&lt;br /&gt;
                        HttpServletRequest aHttpServletRequest,&lt;br /&gt;
                        HttpServletResponse aHttpServletResponse)&lt;br /&gt;
                                            throws Exception {&lt;br /&gt;
      aHttpServletRequest.setAttribute(“contacts”,&lt;br /&gt;
             Contacter.getInstance().getContactsSortedByName());&lt;br /&gt;
      return aActionMapping.findForward(“ok”);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В этом действии в атрибут запроса кладется список всех контактов, после чего вызывается форвард &amp;lt;font color=darkred&amp;gt;“ok”&amp;lt;/font&amp;gt; – именно он был описан чуть выше.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;action path=”/list” type=”ru.linuxformat.actions.ShowAll”&amp;gt;&lt;br /&gt;
   &amp;lt;forward name=”ok” path=”/pages/List.jsp”/&amp;gt;&lt;br /&gt;
 &amp;lt;/action&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Из описания видно, что форвард перенаправляет обработку запроса в '''List.jsp''. Посмотрим, что в нем написано:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;%@ page pageEncoding=”UTF-8” language=”java” contentType=”text/&lt;br /&gt;
 html; utf-8” %&amp;gt;&lt;br /&gt;
 &amp;lt;%@ taglib uri=”http://struts.apache.org/tags-html” prefix=”html” %&amp;gt;&lt;br /&gt;
 &amp;lt;%@ taglib uri=”http://struts.apache.org/tags-bean” prefix=”bean” %&amp;gt;&lt;br /&gt;
 &amp;lt;%@ taglib uri=”http://struts.apache.org/tags-logic” prefix=”logic” %&amp;gt;&lt;br /&gt;
 &amp;lt;html:html&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
      …&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
      …&lt;br /&gt;
   &amp;lt;table border=”1”&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;bean:message key=”AddressBook.list.name”/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;bean:message key=”AddressBook.list.phone”/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;bean:message key=”AddressBook.list.comment”/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;bean:message key=”AddressBook.list.age”/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
   &amp;lt;logic:iterate id=”contact” type=”ru.linuxformat.Contact”&lt;br /&gt;
 name=”contacts” scope=”request”&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%=contact.getName()%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%=contact.getPhone()%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%=contact.getComment()%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%=contact.getAge()%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
   &amp;lt;/logic:iterate&amp;gt;&lt;br /&gt;
   &amp;lt;/table&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;/html:html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
На многоточия заменены неинтересные куски кода, а интересное – в самом начале листинга (&amp;lt;font color=darkred&amp;gt;taglib&amp;lt;/font&amp;gt;). Это так называемые библиотеки тэгов. Примеры можно видеть здесь же. Скажем, &amp;lt;font color=darkred&amp;gt;&amp;lt;bean:messagekey=”AddressBook.list.name”/&amp;gt;&amp;lt;/font&amp;gt; вставляет локализованную строку, соответствующую данному ключу. А &amp;lt;font color=darkred&amp;gt;&amp;lt;logic:iterate&amp;gt;&amp;lt;/font&amp;gt; умеет итерировать по коллекциям (списки, ассоциативные массивы и так далее). В данном случае мы итерируем по атрибуту запроса &amp;lt;font color=darkred&amp;gt;contacts&amp;lt;/font&amp;gt;, который мы положили туда в действии.&lt;br /&gt;
&lt;br /&gt;
===Формы, проверка корректности форм===&lt;br /&gt;
&lt;br /&gt;
Другая интересная часть – формы. Второе действие, добавление контакта, выглядит следующим образом (приведен только код метода &amp;lt;font color=darkred&amp;gt;execute&amp;lt;/font&amp;gt;):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
       if (aHttpServletRequest.getParameter(“name”) == null) {&lt;br /&gt;
           return aActionMapping.findForward(“form”);&lt;br /&gt;
       } else {&lt;br /&gt;
           DynaActionForm form = (DynaActionForm) aActionForm;&lt;br /&gt;
           Contacter.getInstance().addContact(form.getString(“name”), form.&lt;br /&gt;
 getString(“phone”), form.getString(“comment”), (Integer) form.&lt;br /&gt;
 get(“age”));&lt;br /&gt;
           return aActionMapping.findForward(“done”);&lt;br /&gt;
       }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Логика очень похожа на ту, что была в предыдущих статьях. Если форма не заполнена, переходим по форварду &amp;lt;font color=darkred&amp;gt;form&amp;lt;/font&amp;gt;, который показывает форму для ввода. Если она заполнена (и валидирована), то контакт добавляется в список, и мы переходим на форвард &amp;lt;font color=darkred&amp;gt;done&amp;lt;/font&amp;gt;. Вот и сама форма (точнее, ее основная часть):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;html:form action=”/add” method=”post” onsubmit=”return&lt;br /&gt;
 validateAddForm(this);”&amp;gt;&lt;br /&gt;
       &amp;lt;table&amp;gt;&lt;br /&gt;
           &amp;lt;tr&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;bean:message key=”AddressBook.add.name”/&amp;gt;:&amp;lt;/td&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;html:text property=”name”/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
           &amp;lt;/tr&amp;gt;&lt;br /&gt;
          …&lt;br /&gt;
           &amp;lt;tr&amp;gt;&lt;br /&gt;
              &amp;lt;td colspan=”2”&amp;gt;&amp;lt;html:submit titleKey=”AddressBook.add.&lt;br /&gt;
 submit”/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
           &amp;lt;/tr&amp;gt;&lt;br /&gt;
       &amp;lt;/table&amp;gt;&lt;br /&gt;
    &amp;lt;/html:form&amp;gt;&lt;br /&gt;
    &amp;lt;html:javascript formName=”addForm”/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Тут интересны два момента. Во-первых, используются тэги ''Struts'' (&amp;lt;font color=darkred&amp;gt;html:…&amp;lt;/font&amp;gt;), упрощающие создание компонентов формы. Во-вторых, используется скрипт валидации (&amp;lt;font color=darkred&amp;gt;onsubmit=”…”&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;&amp;lt;html:Javascript …&amp;gt;&amp;lt;/font&amp;gt;). Он обеспечивает валидацию прямо в браузере, не отсылая запрос на сервер.&lt;br /&gt;
&lt;br /&gt;
Сами правила валидации задаются в файле '''validation.xml'''. Вот как это выглядит:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;form-validation&amp;gt;&lt;br /&gt;
    &amp;lt;formset&amp;gt;&lt;br /&gt;
       &amp;lt;form name=”addForm”&amp;gt;&lt;br /&gt;
           &amp;lt;field property=”age” depends=”required,integer,intRange”&amp;gt;&lt;br /&gt;
              &amp;lt;arg key=”AddressBook.add.age”/&amp;gt;&lt;br /&gt;
              &amp;lt;arg position=”1” name=”intRange” key=”10”&lt;br /&gt;
 resource=”false”/&amp;gt;&lt;br /&gt;
              &amp;lt;arg position=”2” name=”intRange” key=”20”&lt;br /&gt;
 resource=”false”/&amp;gt;&lt;br /&gt;
              &amp;lt;var&amp;gt;&amp;lt;var-name&amp;gt;min&amp;lt;/var-name&amp;gt;&amp;lt;var-value&amp;gt;10&amp;lt;/var-value&amp;gt;&amp;lt;/&lt;br /&gt;
 var&amp;gt;&lt;br /&gt;
              &amp;lt;var&amp;gt;&amp;lt;var-name&amp;gt;max&amp;lt;/var-name&amp;gt;&amp;lt;var-value&amp;gt;20&amp;lt;/var-value&amp;gt;&amp;lt;/&lt;br /&gt;
 var&amp;gt;&lt;br /&gt;
           &amp;lt;/field&amp;gt;&lt;br /&gt;
       &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;/formset&amp;gt;&lt;br /&gt;
  &amp;lt;/form-validation&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Форму я создал в '''struts-config'''. Называться она должна так же. Для поля &amp;lt;font color=darkred&amp;gt;age&amp;lt;/font&amp;gt; задается три правила валидации: &amp;lt;font color=darkred&amp;gt;required&amp;lt;/font&amp;gt;, &amp;lt;font color=darkred&amp;gt;integer&amp;lt;/font&amp;gt;, &amp;lt;font color=darkred&amp;gt;intRange&amp;lt;/font&amp;gt;. Первое говорит, что поле обязательно, второе – что значение должно быть целочисленным, третье правило сообщает, что значение должно лежать в пределах от 10 до 20. В качестве параметров задаются аргументы сообщений, которые будут выводиться при ошибочном заполнении формы (&amp;lt;font color=darkred&amp;gt;arg&amp;lt;/font&amp;gt;), и параметры для правил валидации (&amp;lt;font color=darkred&amp;gt;var&amp;lt;/font&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===Локализация===&lt;br /&gt;
&lt;br /&gt;
Последняя часть, пока не описанная – локализация. Сообщения хранятся в так называемых properties-файлах, причем если property-файл называется '''MessageResources''', то, например, файл русской локализации должен называться '''MessageResources_ru.properties''', а английской –  '''MessageResources_en.properties'''. Если нужно уточнить – например, английский язык, Америка – то получается так: '''MessageResources_en_US.properties'''.&lt;br /&gt;
&lt;br /&gt;
Структура файлов '''properties''' очень проста. Каждая строка (не пустая и не комментарий) состоит из двух частей, разделенных знаком равенства (&amp;lt;font color=darkred&amp;gt;=&amp;lt;/font&amp;gt;). Слева – ключ, справа – значение этого ключа.&lt;br /&gt;
&lt;br /&gt;
Эти файлы нужно положить в каталог '''src''', и проконтролировать, чтобы они переписались туда же, куда попадают class-файлы. Плюс, для неанглийских&lt;br /&gt;
файлов, их нужно преобразовать в ASCII-формат. Это делается утилитой ''native2ascii'' из поставки JDK. Инструкции по пользованию утилитой можно найти здесь: http://Java.sun.com/Javase/6/docs/technotes/tools/windows/native2ascii.html.&lt;br /&gt;
&lt;br /&gt;
После этого можно использовать в JSP вставки вида &amp;lt;font color=darkred&amp;gt;&amp;lt;bean:message key=”AddressBook.add.name”/&amp;gt;&amp;lt;/font&amp;gt;, вместо которых будет вставлена локализованная строка, соответствующая данному ключу (в примере – &amp;lt;font color=darkred&amp;gt;AddressBook.add.name&amp;lt;/font&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===Что дальше?===&lt;br /&gt;
&lt;br /&gt;
''Struts'' – великолепная библиотека, позволяющая упростить разработку сложных приложений. Особенно хорошо такого рода библиотеки подходят для задач, в которых много монотонной работы: больших форм, большого количества простых действий, необходимость проверки данных, вводимых в форму, локализация.&lt;br /&gt;
&lt;br /&gt;
Также полезно, что используются стандартные средства: ''JSP'', ''Servlets'', да и сам ''Struts'' – самая распространенная библиотека для такого рода работ. В результате при приеме на работу, например, знание именно ''Struts'' позволяет набрать несколько дополнительных баллов.&lt;br /&gt;
&lt;br /&gt;
Правда, еще больше баллов дает знание ''EJB3''. Но об этом мы поговорим в следующей, заключительной статье.&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:Java_EE10</id>
		<title>LXF98:Java EE10</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:Java_EE10"/>
				<updated>2008-03-27T11:23:33Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: /* Как этим пользоваться? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;font color=darkred&amp;gt;Struts&amp;lt;/font&amp;gt;, великий и ужасный==&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;font color=darkred&amp;gt;'''ЧАСТЬ 10'''&amp;lt;/font&amp;gt; Компьютеры были придуманы, чтобы избавить человечество от рутины – так зачем делать вручную то, что можно сгенерировать автоматически? '''Александр Бабаев''' покажет, как Struts позволяет избежать монотонного кодирования приложений J2EE.''&lt;br /&gt;
&lt;br /&gt;
Вручную делать простые вещи хорошо: быстро, просто, понятно. Но что делать, если нужно так же быстро и просто создать нечто большое? Сайт-портал, например? Не тот портал, который Яндекс, а корпоративный – где интегрирована система хранения документов, информационная система, наша адресная книга?&lt;br /&gt;
&lt;br /&gt;
В PHP в этом случае приходит на помощь ''CMS''. Сладкие слова, которые обещают «в два клика» сделать вам все что угодно. Маркетинг, конечно, страшная сила, но почему так много ''CMS'' на PHP, и нет на ''Java''?&lt;br /&gt;
&lt;br /&gt;
Возможно, просто потому что не нужно. Место ''CMS'' в ''Java'' занимают разнообразные инструментарии разработчика, которые помогают обходить сложные и рутинные работы. В результате можно небольшими силами сделать систему, по сложности намного превосходящую то, что можно сделать «вручную».&lt;br /&gt;
&lt;br /&gt;
===Что включается в Struts?===&lt;br /&gt;
&lt;br /&gt;
''Struts'' не изобретает велосипедов. В его основе лежит шаблон «MODEl-View-Controller», который мы рассматривали в LXF92, но с его помощью проще создать грамотное приложение, так как четко определены задачи по его созданию; проще разобраться, что необходимо написать для получения результата.&lt;br /&gt;
&lt;br /&gt;
Итак, ''Struts'' (будем рассматривать более простую, первую версию) содержит:&lt;br /&gt;
&lt;br /&gt;
*''API'' для создания обработчика запросов (менеджер, распределяющий запросы по действиям) и для создания самих действий (&amp;lt;font color=darkred&amp;gt;Actions&amp;lt;/font&amp;gt;).&lt;br /&gt;
*''API'' для создания обработчиков форм.&lt;br /&gt;
*''API'' для работы с проверкой корректности заполнения (валидации) форм.&lt;br /&gt;
*''Tiles''. Расширение для создания модульных страниц (что-то «вроде SSI»).&lt;br /&gt;
*''JSP-taglib'', библиотека ''JPS''-тэгов для упрощения написания JSP-страниц.&lt;br /&gt;
*''XML''-конфигурационные файлы, для простой и быстрой настройки всего вышеперечисленного и связи его друг с другом.&lt;br /&gt;
&lt;br /&gt;
Все это в предыдущих статьях мы делали вручную. Теперь настало время проделать то же самое более «технологично».&lt;br /&gt;
&lt;br /&gt;
===Как этим пользоваться?===&lt;br /&gt;
&lt;br /&gt;
Во-первых, библиотеку нужно скачать. Это можно сделать со странички http://struts.apache.org/download.cgi#struts138. После чего следует распаковать полученный файл и вытащить оттуда все JAR-архивы.&lt;br /&gt;
&lt;br /&gt;
В качестве примера, создадим уже знакомую телефонную книгу. Сперва каталог; в нем, как всегда, организуем подкаталоги для исходных текстов, скомпилированного кода, библиотек и JSP-файлов. Получится что-то такое:&lt;br /&gt;
&lt;br /&gt;
 *'''libs'''&lt;br /&gt;
 **''antlr-2.7.2.jar''&lt;br /&gt;
 **''bsf-2.3.0.jar''&lt;br /&gt;
 **''commons-beanutils-1.7.0.jar''&lt;br /&gt;
 **''commonschain-1.1.jar''&lt;br /&gt;
 **''commons-digester-1.8.jar''&lt;br /&gt;
 **''commons-fileipload-1.1.1.jar''&lt;br /&gt;
 **''commons-io-1.1.jar''&lt;br /&gt;
 **''commons-logging-1.0.4.jar''&lt;br /&gt;
 **''commons-validator-1.3.1.jar''&lt;br /&gt;
 **''jstl-1.0.2.jar''&lt;br /&gt;
 **''oro-2.0.8.jar''&lt;br /&gt;
 **''standart-1.0.2.jar''&lt;br /&gt;
 **''struts-core-1.3.8.jar''&lt;br /&gt;
 **''struts-el-1.3.8.jar''&lt;br /&gt;
 **''struts-extras-1.3.8.jar''&lt;br /&gt;
 **''struts-faces-1.3.8.jar''&lt;br /&gt;
 **''struts-mailreader-dao-1.3.8.jar''&lt;br /&gt;
 **''struts-scripting-1.3.8.jar''&lt;br /&gt;
 **''struts-taglib-1.3.8.jar''&lt;br /&gt;
 **''struts-tiles-1.3.8.jar''&lt;br /&gt;
 *'''out'''&lt;br /&gt;
 *'''src'''&lt;br /&gt;
 **''MessageResources_en.properties''&lt;br /&gt;
 **''MessageResources_ru.properties''&lt;br /&gt;
 **'''ru'''&lt;br /&gt;
 *'''web'''&lt;br /&gt;
 **''index.jsp''&lt;br /&gt;
 **'''pages'''&lt;br /&gt;
 **'''WEB-INF'''&lt;br /&gt;
&lt;br /&gt;
Затем в каталог библиотек нужно положить JAR-файлы ''Struts''. Готово? Тогда можно приступать к кодированию.&lt;br /&gt;
&lt;br /&gt;
Когда запрос приходит в сервлет, он первым делом попадает в ''Struts'', который перенаправляет его в менеджер запросов (&amp;lt;font color=darkred&amp;gt;ActionServet&amp;lt;/font&amp;gt;) и далее в нужное действие (&amp;lt;font color=darkred&amp;gt;Action&amp;lt;/font&amp;gt;). Это происходит примерно так:&lt;br /&gt;
&lt;br /&gt;
Как видно, схема здорово напоминает примененную нами при создании адресной книги. Зачем тогда ''Struts''? А затем, чтобы не писать много-много однотипного кода, который повторяется из проекта в проект.&lt;br /&gt;
&lt;br /&gt;
===Конфигурационные файлы===&lt;br /&gt;
&lt;br /&gt;
Вначале научимся запускать ''Struts''. Для этого нужно перенаправить все запросы сервлету-обработчику и написать файл конфигурации. Вот&lt;br /&gt;
простой дескриптор для простого ''Struts''-приложения:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;?xml version=”1.0” encoding=”UTF-8”?&amp;gt;&lt;br /&gt;
  &amp;lt;web-app&amp;gt;&lt;br /&gt;
    &amp;lt;servlet&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;action&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-class&amp;gt;org.apache.struts.action.ActionServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;init-param&amp;gt;&lt;br /&gt;
           &amp;lt;param-name&amp;gt;config&amp;lt;/param-name&amp;gt;&lt;br /&gt;
           &amp;lt;param-value&amp;gt;/WEB-INF/struts-config.xml&amp;lt;/param-value&amp;gt;&lt;br /&gt;
        &amp;lt;/init-param&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet&amp;gt;&lt;br /&gt;
    &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;action&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;url-pattern&amp;gt;*.do&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
  &amp;lt;/web-app&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Видно, что все запросы &amp;lt;font color=darkred&amp;gt;*.do&amp;lt;/font&amp;gt; передаются сервлету &amp;lt;font color=darkred&amp;gt;action&amp;lt;/font&amp;gt;, обрабатываемому классом &amp;lt;font color=darkred&amp;gt;ActionServlet&amp;lt;/font&amp;gt;. Это стандартный класс Struts, который перенаправляет запросы в действия. Ему передается конфигурационный файл '''struts-config.xml'''. Вот он:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;?xml version=”1.0” encoding=”UTF-8” ?&amp;gt;&lt;br /&gt;
  &amp;lt;struts-config&amp;gt;&lt;br /&gt;
    &amp;lt;form-beans&amp;gt;&lt;br /&gt;
        &amp;lt;form-bean name=”addForm” type=”org.apache.struts.validator.DynaValidatorForm”&amp;gt;&lt;br /&gt;
           &amp;lt;form-property name=”name” type=”java.lang.String” initial=”Name”/&amp;gt;&lt;br /&gt;
           &amp;lt;form-property name=”phone” type=”java.lang.String” initial=”1234567”/&amp;gt;&lt;br /&gt;
          &amp;lt;form-property name=”age” type=”java.lang.Integer” initial=”20”/&amp;gt;&lt;br /&gt;
          &amp;lt;form-property name=”comment” type=”java.lang.String” initial=”NoComment”/&amp;gt;&lt;br /&gt;
       &amp;lt;/form-bean&amp;gt;&lt;br /&gt;
      &amp;lt;action-mappings&amp;gt;&lt;br /&gt;
       &amp;lt;action path=”/add” name=”addForm” validate=”true” type=”ru.linuxformat.actions.Add”&amp;gt;&lt;br /&gt;
          &amp;lt;forward name=”form” path=”/pages/Add.jsp”/&amp;gt;&lt;br /&gt;
          &amp;lt;forward name=”done” path=”/list.do”/&amp;gt;&lt;br /&gt;
       &amp;lt;/action&amp;gt;&lt;br /&gt;
       &amp;lt;action path=”/list” type=”ru.linuxformat.actions.ShowAll”&amp;gt;&lt;br /&gt;
          &amp;lt;forward name=”ok” path=”/pages/List.jsp”/&amp;gt;&lt;br /&gt;
       &amp;lt;/action&amp;gt;&lt;br /&gt;
   &amp;lt;/action-mappings&amp;gt;&lt;br /&gt;
   &amp;lt;message-resources parameter=”MessageResources”/&amp;gt;&lt;br /&gt;
   &amp;lt;plug-in className=”org.apache.struts.validator.ValidatorPlugIn”&amp;gt;&lt;br /&gt;
       &amp;lt;set-property property=”pathnames” value=”/org/apache/struts/validator/validator-rules.xml,/WEB-INF/validation.xml”/&amp;gt;&lt;br /&gt;
   &amp;lt;/plug-in&amp;gt;&lt;br /&gt;
 &amp;lt;/struts-config&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В данном файле описана форма добавления контакта (&amp;lt;font color=darkred&amp;gt;form-bean&amp;lt;/font&amp;gt;), с использованием стандартного класса формы с поддержкой автоматической проверки полей (&amp;lt;font color=darkred&amp;gt;DynaValidatorForm&amp;lt;/font&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
После этого описано, какие запросы в какие классы перенаправляются.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;action path=”/list” type=”ru.linuxformat.actions.ShowAll”&amp;gt;&lt;br /&gt;
   &amp;lt;forward name=”ok” path=”/pages/List.jsp”/&amp;gt;&lt;br /&gt;
 &amp;lt;/action&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В этом примере запрос &amp;lt;font color=darkred&amp;gt;/list.do&amp;lt;/font&amp;gt; пойдет в класс &amp;lt;font color=darkred&amp;gt;ShowAll.Forward&amp;lt;/font&amp;gt; используется внутри действия, чтобы упростить перенаправление вывода. Дальше будет понятно, как.&lt;br /&gt;
&lt;br /&gt;
После описания действий все становится совсем просто.Описывается файл, откуда будут браться локализованные строки, и&lt;br /&gt;
подключается модуль, который обеспечивает простую и мощную валидацию (проверку) форм.&lt;br /&gt;
&lt;br /&gt;
===Действия===&lt;br /&gt;
&lt;br /&gt;
Перейдем к классам. Все они должны быть унаследованы от класса &amp;lt;font color=darkred&amp;gt;org.apache.struts.action.Action&amp;lt;/font&amp;gt;. При этом в простейшем случае нужно переопределить только один метод, &amp;lt;font color=darkred&amp;gt;execute(…)&amp;lt;/font&amp;gt;. Например, вот действие, которое показывает список контактов:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 public class ShowAll extends Action {&lt;br /&gt;
   public ActionForward execute(ActionMapping aActionMapping,&lt;br /&gt;
                        ActionForm aActionForm,&lt;br /&gt;
                        HttpServletRequest aHttpServletRequest,&lt;br /&gt;
                        HttpServletResponse aHttpServletResponse)&lt;br /&gt;
                                            throws Exception {&lt;br /&gt;
      aHttpServletRequest.setAttribute(“contacts”,&lt;br /&gt;
             Contacter.getInstance().getContactsSortedByName());&lt;br /&gt;
      return aActionMapping.findForward(“ok”);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В этом действии в атрибут запроса кладется список всех контактов, после чего вызывается форвард &amp;lt;font color=darkred&amp;gt;“ok”&amp;lt;/font&amp;gt; – именно он был описан чуть выше.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;action path=”/list” type=”ru.linuxformat.actions.ShowAll”&amp;gt;&lt;br /&gt;
   &amp;lt;forward name=”ok” path=”/pages/List.jsp”/&amp;gt;&lt;br /&gt;
 &amp;lt;/action&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Из описания видно, что форвард перенаправляет обработку запроса в '''List.jsp''. Посмотрим, что в нем написано:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;%@ page pageEncoding=”UTF-8” language=”java” contentType=”text/&lt;br /&gt;
 html; utf-8” %&amp;gt;&lt;br /&gt;
 &amp;lt;%@ taglib uri=”http://struts.apache.org/tags-html” prefix=”html” %&amp;gt;&lt;br /&gt;
 &amp;lt;%@ taglib uri=”http://struts.apache.org/tags-bean” prefix=”bean” %&amp;gt;&lt;br /&gt;
 &amp;lt;%@ taglib uri=”http://struts.apache.org/tags-logic” prefix=”logic” %&amp;gt;&lt;br /&gt;
 &amp;lt;html:html&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
      …&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
      …&lt;br /&gt;
   &amp;lt;table border=”1”&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;bean:message key=”AddressBook.list.name”/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;bean:message key=”AddressBook.list.phone”/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;bean:message key=”AddressBook.list.comment”/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;bean:message key=”AddressBook.list.age”/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
   &amp;lt;logic:iterate id=”contact” type=”ru.linuxformat.Contact”&lt;br /&gt;
 name=”contacts” scope=”request”&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%=contact.getName()%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%=contact.getPhone()%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%=contact.getComment()%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%=contact.getAge()%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
   &amp;lt;/logic:iterate&amp;gt;&lt;br /&gt;
   &amp;lt;/table&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;/html:html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
На многоточия заменены неинтересные куски кода, а интересное – в самом начале листинга (&amp;lt;font color=darkred&amp;gt;taglib&amp;lt;/font&amp;gt;). Это так называемые библиотеки тэгов. Примеры можно видеть здесь же. Скажем, &amp;lt;font color=darkred&amp;gt;&amp;lt;bean:messagekey=”AddressBook.list.name”/&amp;gt;&amp;lt;/font&amp;gt; вставляет локализованную строку, соответствующую данному ключу. А &amp;lt;font color=darkred&amp;gt;&amp;lt;logic:iterate&amp;gt;&amp;lt;/font&amp;gt; умеет итерировать по коллекциям (списки, ассоциативные массивы и так далее). В данном случае мы итерируем по атрибуту запроса &amp;lt;font color=darkred&amp;gt;contacts&amp;lt;/font&amp;gt;, который мы положили туда в действии.&lt;br /&gt;
&lt;br /&gt;
===Формы, проверка корректности форм===&lt;br /&gt;
&lt;br /&gt;
Другая интересная часть – формы. Второе действие, добавление контакта, выглядит следующим образом (приведен только код метода &amp;lt;font color=darkred&amp;gt;execute&amp;lt;/font&amp;gt;):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
       if (aHttpServletRequest.getParameter(“name”) == null) {&lt;br /&gt;
           return aActionMapping.findForward(“form”);&lt;br /&gt;
       } else {&lt;br /&gt;
           DynaActionForm form = (DynaActionForm) aActionForm;&lt;br /&gt;
           Contacter.getInstance().addContact(form.getString(“name”), form.&lt;br /&gt;
 getString(“phone”), form.getString(“comment”), (Integer) form.&lt;br /&gt;
 get(“age”));&lt;br /&gt;
           return aActionMapping.findForward(“done”);&lt;br /&gt;
       }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Логика очень похожа на ту, что была в предыдущих статьях. Если форма не заполнена, переходим по форварду &amp;lt;font color=darkred&amp;gt;form&amp;lt;/font&amp;gt;, который показывает форму для ввода. Если она заполнена (и валидирована), то контакт добавляется в список, и мы переходим на форвард &amp;lt;font color=darkred&amp;gt;done&amp;lt;/font&amp;gt;. Вот и сама форма (точнее, ее основная часть):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;html:form action=”/add” method=”post” onsubmit=”return&lt;br /&gt;
 validateAddForm(this);”&amp;gt;&lt;br /&gt;
       &amp;lt;table&amp;gt;&lt;br /&gt;
           &amp;lt;tr&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;bean:message key=”AddressBook.add.name”/&amp;gt;:&amp;lt;/td&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;html:text property=”name”/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
           &amp;lt;/tr&amp;gt;&lt;br /&gt;
          …&lt;br /&gt;
           &amp;lt;tr&amp;gt;&lt;br /&gt;
              &amp;lt;td colspan=”2”&amp;gt;&amp;lt;html:submit titleKey=”AddressBook.add.&lt;br /&gt;
 submit”/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
           &amp;lt;/tr&amp;gt;&lt;br /&gt;
       &amp;lt;/table&amp;gt;&lt;br /&gt;
    &amp;lt;/html:form&amp;gt;&lt;br /&gt;
    &amp;lt;html:javascript formName=”addForm”/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Тут интересны два момента. Во-первых, используются тэги ''Struts'' (&amp;lt;font color=darkred&amp;gt;html:…&amp;lt;/font&amp;gt;), упрощающие создание компонентов формы. Во-вторых, используется скрипт валидации (&amp;lt;font color=darkred&amp;gt;onsubmit=”…”&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;&amp;lt;html:Javascript …&amp;gt;&amp;lt;/font&amp;gt;). Он обеспечивает валидацию прямо в браузере, не отсылая запрос на сервер.&lt;br /&gt;
&lt;br /&gt;
Сами правила валидации задаются в файле '''validation.xml'''. Вот как это выглядит:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;form-validation&amp;gt;&lt;br /&gt;
    &amp;lt;formset&amp;gt;&lt;br /&gt;
       &amp;lt;form name=”addForm”&amp;gt;&lt;br /&gt;
           &amp;lt;field property=”age” depends=”required,integer,intRange”&amp;gt;&lt;br /&gt;
              &amp;lt;arg key=”AddressBook.add.age”/&amp;gt;&lt;br /&gt;
              &amp;lt;arg position=”1” name=”intRange” key=”10”&lt;br /&gt;
 resource=”false”/&amp;gt;&lt;br /&gt;
              &amp;lt;arg position=”2” name=”intRange” key=”20”&lt;br /&gt;
 resource=”false”/&amp;gt;&lt;br /&gt;
              &amp;lt;var&amp;gt;&amp;lt;var-name&amp;gt;min&amp;lt;/var-name&amp;gt;&amp;lt;var-value&amp;gt;10&amp;lt;/var-value&amp;gt;&amp;lt;/&lt;br /&gt;
 var&amp;gt;&lt;br /&gt;
              &amp;lt;var&amp;gt;&amp;lt;var-name&amp;gt;max&amp;lt;/var-name&amp;gt;&amp;lt;var-value&amp;gt;20&amp;lt;/var-value&amp;gt;&amp;lt;/&lt;br /&gt;
 var&amp;gt;&lt;br /&gt;
           &amp;lt;/field&amp;gt;&lt;br /&gt;
       &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;/formset&amp;gt;&lt;br /&gt;
  &amp;lt;/form-validation&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Форму я создал в '''struts-config'''. Называться она должна так же. Для поля &amp;lt;font color=darkred&amp;gt;age&amp;lt;/font&amp;gt; задается три правила валидации: &amp;lt;font color=darkred&amp;gt;required&amp;lt;/font&amp;gt;, &amp;lt;font color=darkred&amp;gt;integer&amp;lt;/font&amp;gt;, &amp;lt;font color=darkred&amp;gt;intRange&amp;lt;/font&amp;gt;. Первое говорит, что поле обязательно, второе – что значение должно быть целочисленным, третье правило сообщает, что значение должно лежать в пределах от 10 до 20. В качестве параметров задаются аргументы сообщений, которые будут выводиться при ошибочном заполнении формы (&amp;lt;font color=darkred&amp;gt;arg&amp;lt;/font&amp;gt;), и параметры для правил валидации (&amp;lt;font color=darkred&amp;gt;var&amp;lt;/font&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===Локализация===&lt;br /&gt;
&lt;br /&gt;
Последняя часть, пока не описанная – локализация. Сообщения хранятся в так называемых properties-файлах, причем если property-файл называется '''MessageResources''', то, например, файл русской локализации должен называться '''MessageResources_ru.properties''', а английской –  '''MessageResources_en.properties'''. Если нужно уточнить – например, английский язык, Америка – то получается так: '''MessageResources_en_US.properties'''.&lt;br /&gt;
&lt;br /&gt;
Структура файлов '''properties''' очень проста. Каждая строка (не пустая и не комментарий) состоит из двух частей, разделенных знаком равенства (&amp;lt;font color=darkred&amp;gt;=&amp;lt;/font&amp;gt;). Слева – ключ, справа – значение этого ключа.&lt;br /&gt;
&lt;br /&gt;
Эти файлы нужно положить в каталог '''src''', и проконтролировать, чтобы они переписались туда же, куда попадают class-файлы. Плюс, для неанглийских&lt;br /&gt;
файлов, их нужно преобразовать в ASCII-формат. Это делается утилитой ''native2ascii'' из поставки JDK. Инструкции по пользованию утилитой можно найти здесь: http://Java.sun.com/Javase/6/docs/technotes/tools/windows/native2ascii.html.&lt;br /&gt;
&lt;br /&gt;
После этого можно использовать в JSP вставки вида &amp;lt;font color=darkred&amp;gt;&amp;lt;bean:message key=”AddressBook.add.name”/&amp;gt;&amp;lt;/font&amp;gt;, вместо которых будет вставлена локализованная строка, соответствующая данному ключу (в примере – &amp;lt;font color=darkred&amp;gt;AddressBook.add.name&amp;lt;/font&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===Что дальше?===&lt;br /&gt;
&lt;br /&gt;
''Struts'' – великолепная библиотека, позволяющая упростить разработку сложных приложений. Особенно хорошо такого рода библиотеки подходят для задач, в которых много монотонной работы: больших форм, большого количества простых действий, необходимость проверки данных, вводимых в форму, локализация.&lt;br /&gt;
&lt;br /&gt;
Также полезно, что используются стандартные средства: ''JSP'', ''Servlets'', да и сам ''Struts'' – самая распространенная библиотека для такого рода работ. В результате при приеме на работу, например, знание именно ''Struts'' позволяет набрать несколько дополнительных баллов.&lt;br /&gt;
&lt;br /&gt;
Правда, еще больше баллов дает знание ''EJB3''. Но об этом мы поговорим в следующей, заключительной статье.&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:Java_EE10</id>
		<title>LXF98:Java EE10</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:Java_EE10"/>
				<updated>2008-03-27T11:22:59Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: Новая: ==&amp;lt;font color=darkred&amp;gt;Struts&amp;lt;/font&amp;gt;, великий и ужасный==  ''&amp;lt;font color=darkred&amp;gt;'''ЧАСТЬ 10'''&amp;lt;/font&amp;gt; Компьютеры были придуманы, чтобы и...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;font color=darkred&amp;gt;Struts&amp;lt;/font&amp;gt;, великий и ужасный==&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;font color=darkred&amp;gt;'''ЧАСТЬ 10'''&amp;lt;/font&amp;gt; Компьютеры были придуманы, чтобы избавить человечество от рутины – так зачем делать вручную то, что можно сгенерировать автоматически? '''Александр Бабаев''' покажет, как Struts позволяет избежать монотонного кодирования приложений J2EE.''&lt;br /&gt;
&lt;br /&gt;
Вручную делать простые вещи хорошо: быстро, просто, понятно. Но что делать, если нужно так же быстро и просто создать нечто большое? Сайт-портал, например? Не тот портал, который Яндекс, а корпоративный – где интегрирована система хранения документов, информационная система, наша адресная книга?&lt;br /&gt;
&lt;br /&gt;
В PHP в этом случае приходит на помощь ''CMS''. Сладкие слова, которые обещают «в два клика» сделать вам все что угодно. Маркетинг, конечно, страшная сила, но почему так много ''CMS'' на PHP, и нет на ''Java''?&lt;br /&gt;
&lt;br /&gt;
Возможно, просто потому что не нужно. Место ''CMS'' в ''Java'' занимают разнообразные инструментарии разработчика, которые помогают обходить сложные и рутинные работы. В результате можно небольшими силами сделать систему, по сложности намного превосходящую то, что можно сделать «вручную».&lt;br /&gt;
&lt;br /&gt;
===Что включается в Struts?===&lt;br /&gt;
&lt;br /&gt;
''Struts'' не изобретает велосипедов. В его основе лежит шаблон «MODEl-View-Controller», который мы рассматривали в LXF92, но с его помощью проще создать грамотное приложение, так как четко определены задачи по его созданию; проще разобраться, что необходимо написать для получения результата.&lt;br /&gt;
&lt;br /&gt;
Итак, ''Struts'' (будем рассматривать более простую, первую версию) содержит:&lt;br /&gt;
&lt;br /&gt;
*''API'' для создания обработчика запросов (менеджер, распределяющий запросы по действиям) и для создания самих действий (&amp;lt;font color=darkred&amp;gt;Actions&amp;lt;/font&amp;gt;).&lt;br /&gt;
*''API'' для создания обработчиков форм.&lt;br /&gt;
*''API'' для работы с проверкой корректности заполнения (валидации) форм.&lt;br /&gt;
*''Tiles''. Расширение для создания модульных страниц (что-то «вроде SSI»).&lt;br /&gt;
*''JSP-taglib'', библиотека ''JPS''-тэгов для упрощения написания JSP-страниц.&lt;br /&gt;
*''XML''-конфигурационные файлы, для простой и быстрой настройки всего вышеперечисленного и связи его друг с другом.&lt;br /&gt;
&lt;br /&gt;
Все это в предыдущих статьях мы делали вручную. Теперь настало время проделать то же самое более «технологично».&lt;br /&gt;
&lt;br /&gt;
===Как этим пользоваться?===&lt;br /&gt;
&lt;br /&gt;
Во-первых, библиотеку нужно скачать. Это можно сделать со странички http://struts.apache.org/download.cgi#struts138. После чего следует распаковать полученный файл и вытащить оттуда все JAR-архивы.&lt;br /&gt;
&lt;br /&gt;
В качестве примера, создадим уже знакомую телефонную книгу. Сперва каталог; в нем, как всегда, организуем подкаталоги для исходных текстов, скомпилированного кода, библиотек и JSP-файлов. Получится что-то такое:&lt;br /&gt;
&lt;br /&gt;
*'''libs'''&lt;br /&gt;
**''antlr-2.7.2.jar''&lt;br /&gt;
**''bsf-2.3.0.jar''&lt;br /&gt;
**''commons-beanutils-1.7.0.jar''&lt;br /&gt;
**''commonschain-1.1.jar''&lt;br /&gt;
**''commons-digester-1.8.jar''&lt;br /&gt;
**''commons-fileipload-1.1.1.jar''&lt;br /&gt;
**''commons-io-1.1.jar''&lt;br /&gt;
**''commons-logging-1.0.4.jar''&lt;br /&gt;
**''commons-validator-1.3.1.jar''&lt;br /&gt;
**''jstl-1.0.2.jar''&lt;br /&gt;
**''oro-2.0.8.jar''&lt;br /&gt;
**''standart-1.0.2.jar''&lt;br /&gt;
**''struts-core-1.3.8.jar''&lt;br /&gt;
**''struts-el-1.3.8.jar''&lt;br /&gt;
**''struts-extras-1.3.8.jar''&lt;br /&gt;
**''struts-faces-1.3.8.jar''&lt;br /&gt;
**''struts-mailreader-dao-1.3.8.jar''&lt;br /&gt;
**''struts-scripting-1.3.8.jar''&lt;br /&gt;
**''struts-taglib-1.3.8.jar''&lt;br /&gt;
**''struts-tiles-1.3.8.jar''&lt;br /&gt;
*'''out'''&lt;br /&gt;
*'''src'''&lt;br /&gt;
**''MessageResources_en.properties''&lt;br /&gt;
**''MessageResources_ru.properties''&lt;br /&gt;
**'''ru'''&lt;br /&gt;
*'''web'''&lt;br /&gt;
**''index.jsp''&lt;br /&gt;
**'''pages'''&lt;br /&gt;
**'''WEB-INF'''&lt;br /&gt;
&lt;br /&gt;
Затем в каталог библиотек нужно положить JAR-файлы ''Struts''. Готово? Тогда можно приступать к кодированию.&lt;br /&gt;
&lt;br /&gt;
Когда запрос приходит в сервлет, он первым делом попадает в ''Struts'', который перенаправляет его в менеджер запросов (&amp;lt;font color=darkred&amp;gt;ActionServet&amp;lt;/font&amp;gt;) и далее в нужное действие (&amp;lt;font color=darkred&amp;gt;Action&amp;lt;/font&amp;gt;). Это происходит примерно так:&lt;br /&gt;
&lt;br /&gt;
Как видно, схема здорово напоминает примененную нами при создании адресной книги. Зачем тогда ''Struts''? А затем, чтобы не писать много-много однотипного кода, который повторяется из проекта в проект.&lt;br /&gt;
&lt;br /&gt;
===Конфигурационные файлы===&lt;br /&gt;
&lt;br /&gt;
Вначале научимся запускать ''Struts''. Для этого нужно перенаправить все запросы сервлету-обработчику и написать файл конфигурации. Вот&lt;br /&gt;
простой дескриптор для простого ''Struts''-приложения:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;?xml version=”1.0” encoding=”UTF-8”?&amp;gt;&lt;br /&gt;
  &amp;lt;web-app&amp;gt;&lt;br /&gt;
    &amp;lt;servlet&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;action&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-class&amp;gt;org.apache.struts.action.ActionServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;
        &amp;lt;init-param&amp;gt;&lt;br /&gt;
           &amp;lt;param-name&amp;gt;config&amp;lt;/param-name&amp;gt;&lt;br /&gt;
           &amp;lt;param-value&amp;gt;/WEB-INF/struts-config.xml&amp;lt;/param-value&amp;gt;&lt;br /&gt;
        &amp;lt;/init-param&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet&amp;gt;&lt;br /&gt;
    &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;
        &amp;lt;servlet-name&amp;gt;action&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;
        &amp;lt;url-pattern&amp;gt;*.do&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;
    &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;
  &amp;lt;/web-app&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Видно, что все запросы &amp;lt;font color=darkred&amp;gt;*.do&amp;lt;/font&amp;gt; передаются сервлету &amp;lt;font color=darkred&amp;gt;action&amp;lt;/font&amp;gt;, обрабатываемому классом &amp;lt;font color=darkred&amp;gt;ActionServlet&amp;lt;/font&amp;gt;. Это стандартный класс Struts, который перенаправляет запросы в действия. Ему передается конфигурационный файл '''struts-config.xml'''. Вот он:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;?xml version=”1.0” encoding=”UTF-8” ?&amp;gt;&lt;br /&gt;
  &amp;lt;struts-config&amp;gt;&lt;br /&gt;
    &amp;lt;form-beans&amp;gt;&lt;br /&gt;
        &amp;lt;form-bean name=”addForm” type=”org.apache.struts.validator.DynaValidatorForm”&amp;gt;&lt;br /&gt;
           &amp;lt;form-property name=”name” type=”java.lang.String” initial=”Name”/&amp;gt;&lt;br /&gt;
           &amp;lt;form-property name=”phone” type=”java.lang.String” initial=”1234567”/&amp;gt;&lt;br /&gt;
          &amp;lt;form-property name=”age” type=”java.lang.Integer” initial=”20”/&amp;gt;&lt;br /&gt;
          &amp;lt;form-property name=”comment” type=”java.lang.String” initial=”NoComment”/&amp;gt;&lt;br /&gt;
       &amp;lt;/form-bean&amp;gt;&lt;br /&gt;
      &amp;lt;action-mappings&amp;gt;&lt;br /&gt;
       &amp;lt;action path=”/add” name=”addForm” validate=”true” type=”ru.linuxformat.actions.Add”&amp;gt;&lt;br /&gt;
          &amp;lt;forward name=”form” path=”/pages/Add.jsp”/&amp;gt;&lt;br /&gt;
          &amp;lt;forward name=”done” path=”/list.do”/&amp;gt;&lt;br /&gt;
       &amp;lt;/action&amp;gt;&lt;br /&gt;
       &amp;lt;action path=”/list” type=”ru.linuxformat.actions.ShowAll”&amp;gt;&lt;br /&gt;
          &amp;lt;forward name=”ok” path=”/pages/List.jsp”/&amp;gt;&lt;br /&gt;
       &amp;lt;/action&amp;gt;&lt;br /&gt;
   &amp;lt;/action-mappings&amp;gt;&lt;br /&gt;
   &amp;lt;message-resources parameter=”MessageResources”/&amp;gt;&lt;br /&gt;
   &amp;lt;plug-in className=”org.apache.struts.validator.ValidatorPlugIn”&amp;gt;&lt;br /&gt;
       &amp;lt;set-property property=”pathnames” value=”/org/apache/struts/validator/validator-rules.xml,/WEB-INF/validation.xml”/&amp;gt;&lt;br /&gt;
   &amp;lt;/plug-in&amp;gt;&lt;br /&gt;
 &amp;lt;/struts-config&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В данном файле описана форма добавления контакта (&amp;lt;font color=darkred&amp;gt;form-bean&amp;lt;/font&amp;gt;), с использованием стандартного класса формы с поддержкой автоматической проверки полей (&amp;lt;font color=darkred&amp;gt;DynaValidatorForm&amp;lt;/font&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
После этого описано, какие запросы в какие классы перенаправляются.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;action path=”/list” type=”ru.linuxformat.actions.ShowAll”&amp;gt;&lt;br /&gt;
   &amp;lt;forward name=”ok” path=”/pages/List.jsp”/&amp;gt;&lt;br /&gt;
 &amp;lt;/action&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В этом примере запрос &amp;lt;font color=darkred&amp;gt;/list.do&amp;lt;/font&amp;gt; пойдет в класс &amp;lt;font color=darkred&amp;gt;ShowAll.Forward&amp;lt;/font&amp;gt; используется внутри действия, чтобы упростить перенаправление вывода. Дальше будет понятно, как.&lt;br /&gt;
&lt;br /&gt;
После описания действий все становится совсем просто.Описывается файл, откуда будут браться локализованные строки, и&lt;br /&gt;
подключается модуль, который обеспечивает простую и мощную валидацию (проверку) форм.&lt;br /&gt;
&lt;br /&gt;
===Действия===&lt;br /&gt;
&lt;br /&gt;
Перейдем к классам. Все они должны быть унаследованы от класса &amp;lt;font color=darkred&amp;gt;org.apache.struts.action.Action&amp;lt;/font&amp;gt;. При этом в простейшем случае нужно переопределить только один метод, &amp;lt;font color=darkred&amp;gt;execute(…)&amp;lt;/font&amp;gt;. Например, вот действие, которое показывает список контактов:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 public class ShowAll extends Action {&lt;br /&gt;
   public ActionForward execute(ActionMapping aActionMapping,&lt;br /&gt;
                        ActionForm aActionForm,&lt;br /&gt;
                        HttpServletRequest aHttpServletRequest,&lt;br /&gt;
                        HttpServletResponse aHttpServletResponse)&lt;br /&gt;
                                            throws Exception {&lt;br /&gt;
      aHttpServletRequest.setAttribute(“contacts”,&lt;br /&gt;
             Contacter.getInstance().getContactsSortedByName());&lt;br /&gt;
      return aActionMapping.findForward(“ok”);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В этом действии в атрибут запроса кладется список всех контактов, после чего вызывается форвард &amp;lt;font color=darkred&amp;gt;“ok”&amp;lt;/font&amp;gt; – именно он был описан чуть выше.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;action path=”/list” type=”ru.linuxformat.actions.ShowAll”&amp;gt;&lt;br /&gt;
   &amp;lt;forward name=”ok” path=”/pages/List.jsp”/&amp;gt;&lt;br /&gt;
 &amp;lt;/action&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Из описания видно, что форвард перенаправляет обработку запроса в '''List.jsp''. Посмотрим, что в нем написано:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;%@ page pageEncoding=”UTF-8” language=”java” contentType=”text/&lt;br /&gt;
 html; utf-8” %&amp;gt;&lt;br /&gt;
 &amp;lt;%@ taglib uri=”http://struts.apache.org/tags-html” prefix=”html” %&amp;gt;&lt;br /&gt;
 &amp;lt;%@ taglib uri=”http://struts.apache.org/tags-bean” prefix=”bean” %&amp;gt;&lt;br /&gt;
 &amp;lt;%@ taglib uri=”http://struts.apache.org/tags-logic” prefix=”logic” %&amp;gt;&lt;br /&gt;
 &amp;lt;html:html&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
      …&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
      …&lt;br /&gt;
   &amp;lt;table border=”1”&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;bean:message key=”AddressBook.list.name”/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;bean:message key=”AddressBook.list.phone”/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;bean:message key=”AddressBook.list.comment”/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;bean:message key=”AddressBook.list.age”/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
   &amp;lt;logic:iterate id=”contact” type=”ru.linuxformat.Contact”&lt;br /&gt;
 name=”contacts” scope=”request”&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%=contact.getName()%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%=contact.getPhone()%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%=contact.getComment()%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%=contact.getAge()%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
   &amp;lt;/logic:iterate&amp;gt;&lt;br /&gt;
   &amp;lt;/table&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;/html:html&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
На многоточия заменены неинтересные куски кода, а интересное – в самом начале листинга (&amp;lt;font color=darkred&amp;gt;taglib&amp;lt;/font&amp;gt;). Это так называемые библиотеки тэгов. Примеры можно видеть здесь же. Скажем, &amp;lt;font color=darkred&amp;gt;&amp;lt;bean:messagekey=”AddressBook.list.name”/&amp;gt;&amp;lt;/font&amp;gt; вставляет локализованную строку, соответствующую данному ключу. А &amp;lt;font color=darkred&amp;gt;&amp;lt;logic:iterate&amp;gt;&amp;lt;/font&amp;gt; умеет итерировать по коллекциям (списки, ассоциативные массивы и так далее). В данном случае мы итерируем по атрибуту запроса &amp;lt;font color=darkred&amp;gt;contacts&amp;lt;/font&amp;gt;, который мы положили туда в действии.&lt;br /&gt;
&lt;br /&gt;
===Формы, проверка корректности форм===&lt;br /&gt;
&lt;br /&gt;
Другая интересная часть – формы. Второе действие, добавление контакта, выглядит следующим образом (приведен только код метода &amp;lt;font color=darkred&amp;gt;execute&amp;lt;/font&amp;gt;):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
       if (aHttpServletRequest.getParameter(“name”) == null) {&lt;br /&gt;
           return aActionMapping.findForward(“form”);&lt;br /&gt;
       } else {&lt;br /&gt;
           DynaActionForm form = (DynaActionForm) aActionForm;&lt;br /&gt;
           Contacter.getInstance().addContact(form.getString(“name”), form.&lt;br /&gt;
 getString(“phone”), form.getString(“comment”), (Integer) form.&lt;br /&gt;
 get(“age”));&lt;br /&gt;
           return aActionMapping.findForward(“done”);&lt;br /&gt;
       }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Логика очень похожа на ту, что была в предыдущих статьях. Если форма не заполнена, переходим по форварду &amp;lt;font color=darkred&amp;gt;form&amp;lt;/font&amp;gt;, который показывает форму для ввода. Если она заполнена (и валидирована), то контакт добавляется в список, и мы переходим на форвард &amp;lt;font color=darkred&amp;gt;done&amp;lt;/font&amp;gt;. Вот и сама форма (точнее, ее основная часть):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;html:form action=”/add” method=”post” onsubmit=”return&lt;br /&gt;
 validateAddForm(this);”&amp;gt;&lt;br /&gt;
       &amp;lt;table&amp;gt;&lt;br /&gt;
           &amp;lt;tr&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;bean:message key=”AddressBook.add.name”/&amp;gt;:&amp;lt;/td&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;html:text property=”name”/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
           &amp;lt;/tr&amp;gt;&lt;br /&gt;
          …&lt;br /&gt;
           &amp;lt;tr&amp;gt;&lt;br /&gt;
              &amp;lt;td colspan=”2”&amp;gt;&amp;lt;html:submit titleKey=”AddressBook.add.&lt;br /&gt;
 submit”/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
           &amp;lt;/tr&amp;gt;&lt;br /&gt;
       &amp;lt;/table&amp;gt;&lt;br /&gt;
    &amp;lt;/html:form&amp;gt;&lt;br /&gt;
    &amp;lt;html:javascript formName=”addForm”/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Тут интересны два момента. Во-первых, используются тэги ''Struts'' (&amp;lt;font color=darkred&amp;gt;html:…&amp;lt;/font&amp;gt;), упрощающие создание компонентов формы. Во-вторых, используется скрипт валидации (&amp;lt;font color=darkred&amp;gt;onsubmit=”…”&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;&amp;lt;html:Javascript …&amp;gt;&amp;lt;/font&amp;gt;). Он обеспечивает валидацию прямо в браузере, не отсылая запрос на сервер.&lt;br /&gt;
&lt;br /&gt;
Сами правила валидации задаются в файле '''validation.xml'''. Вот как это выглядит:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;form-validation&amp;gt;&lt;br /&gt;
    &amp;lt;formset&amp;gt;&lt;br /&gt;
       &amp;lt;form name=”addForm”&amp;gt;&lt;br /&gt;
           &amp;lt;field property=”age” depends=”required,integer,intRange”&amp;gt;&lt;br /&gt;
              &amp;lt;arg key=”AddressBook.add.age”/&amp;gt;&lt;br /&gt;
              &amp;lt;arg position=”1” name=”intRange” key=”10”&lt;br /&gt;
 resource=”false”/&amp;gt;&lt;br /&gt;
              &amp;lt;arg position=”2” name=”intRange” key=”20”&lt;br /&gt;
 resource=”false”/&amp;gt;&lt;br /&gt;
              &amp;lt;var&amp;gt;&amp;lt;var-name&amp;gt;min&amp;lt;/var-name&amp;gt;&amp;lt;var-value&amp;gt;10&amp;lt;/var-value&amp;gt;&amp;lt;/&lt;br /&gt;
 var&amp;gt;&lt;br /&gt;
              &amp;lt;var&amp;gt;&amp;lt;var-name&amp;gt;max&amp;lt;/var-name&amp;gt;&amp;lt;var-value&amp;gt;20&amp;lt;/var-value&amp;gt;&amp;lt;/&lt;br /&gt;
 var&amp;gt;&lt;br /&gt;
           &amp;lt;/field&amp;gt;&lt;br /&gt;
       &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;/formset&amp;gt;&lt;br /&gt;
  &amp;lt;/form-validation&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Форму я создал в '''struts-config'''. Называться она должна так же. Для поля &amp;lt;font color=darkred&amp;gt;age&amp;lt;/font&amp;gt; задается три правила валидации: &amp;lt;font color=darkred&amp;gt;required&amp;lt;/font&amp;gt;, &amp;lt;font color=darkred&amp;gt;integer&amp;lt;/font&amp;gt;, &amp;lt;font color=darkred&amp;gt;intRange&amp;lt;/font&amp;gt;. Первое говорит, что поле обязательно, второе – что значение должно быть целочисленным, третье правило сообщает, что значение должно лежать в пределах от 10 до 20. В качестве параметров задаются аргументы сообщений, которые будут выводиться при ошибочном заполнении формы (&amp;lt;font color=darkred&amp;gt;arg&amp;lt;/font&amp;gt;), и параметры для правил валидации (&amp;lt;font color=darkred&amp;gt;var&amp;lt;/font&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===Локализация===&lt;br /&gt;
&lt;br /&gt;
Последняя часть, пока не описанная – локализация. Сообщения хранятся в так называемых properties-файлах, причем если property-файл называется '''MessageResources''', то, например, файл русской локализации должен называться '''MessageResources_ru.properties''', а английской –  '''MessageResources_en.properties'''. Если нужно уточнить – например, английский язык, Америка – то получается так: '''MessageResources_en_US.properties'''.&lt;br /&gt;
&lt;br /&gt;
Структура файлов '''properties''' очень проста. Каждая строка (не пустая и не комментарий) состоит из двух частей, разделенных знаком равенства (&amp;lt;font color=darkred&amp;gt;=&amp;lt;/font&amp;gt;). Слева – ключ, справа – значение этого ключа.&lt;br /&gt;
&lt;br /&gt;
Эти файлы нужно положить в каталог '''src''', и проконтролировать, чтобы они переписались туда же, куда попадают class-файлы. Плюс, для неанглийских&lt;br /&gt;
файлов, их нужно преобразовать в ASCII-формат. Это делается утилитой ''native2ascii'' из поставки JDK. Инструкции по пользованию утилитой можно найти здесь: http://Java.sun.com/Javase/6/docs/technotes/tools/windows/native2ascii.html.&lt;br /&gt;
&lt;br /&gt;
После этого можно использовать в JSP вставки вида &amp;lt;font color=darkred&amp;gt;&amp;lt;bean:message key=”AddressBook.add.name”/&amp;gt;&amp;lt;/font&amp;gt;, вместо которых будет вставлена локализованная строка, соответствующая данному ключу (в примере – &amp;lt;font color=darkred&amp;gt;AddressBook.add.name&amp;lt;/font&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===Что дальше?===&lt;br /&gt;
&lt;br /&gt;
''Struts'' – великолепная библиотека, позволяющая упростить разработку сложных приложений. Особенно хорошо такого рода библиотеки подходят для задач, в которых много монотонной работы: больших форм, большого количества простых действий, необходимость проверки данных, вводимых в форму, локализация.&lt;br /&gt;
&lt;br /&gt;
Также полезно, что используются стандартные средства: ''JSP'', ''Servlets'', да и сам ''Struts'' – самая распространенная библиотека для такого рода работ. В результате при приеме на работу, например, знание именно ''Struts'' позволяет набрать несколько дополнительных баллов.&lt;br /&gt;
&lt;br /&gt;
Правда, еще больше баллов дает знание ''EJB3''. Но об этом мы поговорим в следующей, заключительной статье.&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:Mono</id>
		<title>LXF98:Mono</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:Mono"/>
				<updated>2008-03-21T15:04:10Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;font color=darkred&amp;gt;Mono:&amp;lt;/font&amp;gt; Назад в Unix==&lt;br /&gt;
&lt;br /&gt;
''Хотя C# и новый, и передовой, Mono стоит на плечах уродливого монстра Posix.&lt;br /&gt;
'''Пол Хадсон''' пробует заставить Unix-натуру Linux сработаться с .NET...''&lt;br /&gt;
&lt;br /&gt;
Имеет ли место садомазохизм в мире компьютеров? Если да, то вот он: я покажу вам, как заставить C# идти бок о бок с Posix и выиграть. Да, Posix – этот дурно задуманный процесс стандартизации, сбивающий с толку программистов, игнорируемый конечными пользователями, и все же подпирающий Linux и другие&lt;br /&gt;
Unix-подобные ОС. Posix – это набор системных вызовов, интерфейсов и сигналов, определяющий, как мы, разработчики, взаимодействуем с операционной системой. Действующий стандарт Posix весьма обширен, но по сути мы должны заботиться только вот о чем: если вы пишете Posix-совместимый код, он должен работать в любой Posix-совместимой ОС.&lt;br /&gt;
&lt;br /&gt;
Как ни странно, список совместимости включает Windows Vista, точнее, большинство основанных на NT версий Windows, коль скоро они имеют установленными службы Services for Unix. Но с нашей точки зрения важно то, что Linux, FreeBSD, OpenBSD и Syllable практически, а AIX, HP-UX, Minix, OS X и Solaris – полностью поддерживают Posix. Короче, использование функциональности Posix может заставить вас рвать на себе волосы, но, по крайней мере, вы в хорошей компании!&lt;br /&gt;
&lt;br /&gt;
===Posix и вы===&lt;br /&gt;
&lt;br /&gt;
Имеется два типа людей, в основном использующих Posix: конечные пользователи и разработчики. Значит, практически все! Рассмотрим каждый тип отдельно, начав с пользователя. Да, я помню свои слова, что конечный пользователь игнорирует Posix, но это не совсем верно – фактически, вы используете преимущества инструментов и интерфейсов Posix при каждом обращении к командной строке. Видите ли, Posix заправляет едва ли не всем, что даруют Unix-подобные операционные системы – как работает ваша командная строка, есть ли инструменты типа awk и компиляторов, как происходит взаимодействие программ через каналы. Пусть даже конечные пользователи ничего не знают и знать не хотят о Posix, они обязательно опираются на его набор функций! Что касается разработчиков, то любой из пишущих код на С должен работать с одним из многих интерфейсов ядра и вызовами стандартной библиотеки С, входящими в Posix, и эти функции – например, &amp;lt;font color=darkred&amp;gt;malloc&amp;lt;/font&amp;gt;, &amp;lt;font color=darkred&amp;gt;system&amp;lt;/font&amp;gt;, &amp;lt;font color=darkred&amp;gt;printf&amp;lt;/font&amp;gt;, &amp;lt;font color=darkred&amp;gt;fopen&amp;lt;/font&amp;gt; и другие – доступны везде, куда ни сунься.&lt;br /&gt;
&lt;br /&gt;
Это ставит нас перед вопросом: «Какой прок в использовании Posix?» Общеизвестно, что все системные вызовы Posix скопированы в стандарте среды .NET, с использованием управляемых эквивалентов: вы можете читать и записывать файлы, работать со строками, открывать сокеты, читать данные файловой системы и так далее, не беспокоясь о распределении памяти, потому что .NET освободит все, когда сработает сборщик мусора. Но использование версий Posix дает некоторые преимущества:&lt;br /&gt;
&lt;br /&gt;
# Унаследованный код очень легко портировать. Вы можете взять код на C и запросто перенести его на C#, затем, при добавлении новых функций, добавить расширенную функциональность, присущую C#.&lt;br /&gt;
# В том же русле: для C-программистов вполне очевидно, что делает код C# Posix, а это облегчает изучение и сопровождение.&lt;br /&gt;
# Вы можете использовать преимущества специфичной для Posix функциональности. Например, чтение данных из файла '''/etc/passwd''' в обычном .NET коде необходимо делать вручную, а с использованием инструментов Posix это раз плюнуть.&lt;br /&gt;
&lt;br /&gt;
Итак, использование Posix не лишено преимуществ, но вдобавок имеется одно большое неудобство: львиная доля Posix работает с указателями.&lt;br /&gt;
&lt;br /&gt;
«Указатели?» Так и слышу, как вы охнули. «Привет! Говорят 1980-е! Они требуют обратно свой безумный, анахроничный, осложненный переполнениями буфера доступ к памяти!» Именно так. Указатели – это программные имена, описывающие конкретный участок памяти. Например, переменная – указатель на строку содержит точный адрес в памяти, где располагается строка текста. Понятно, что это прекрасно для быстродействия, так как между программой и оборудованием нет посредников, но ужасно с точки зрения безопасности, потому что программа имеет полную власть над вашим компьютером: даже крошечная щелочка в безопасности может вылиться в захват системы. Теперь, когда вы знаете все о плюсах и минусах Posix, давайте нырнем в него и посмотрим, что тут можно сделать...&lt;br /&gt;
&lt;br /&gt;
===Базируемся на Stdlib===&lt;br /&gt;
&lt;br /&gt;
Имеется три компонента для поддержки Unix в Mono: &amp;lt;font color=darkred&amp;gt;Mono.Posix&amp;lt;/font&amp;gt;, &amp;lt;font color=darkred&amp;gt;Mono.Unix&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;Mono.Unix.Native&amp;lt;/font&amp;gt;. Два последних отличаются лишь тем, что &amp;lt;font color=darkred&amp;gt;Mono.Unix&amp;lt;/font&amp;gt; – это небольшая обертка для &amp;lt;font color=darkred&amp;gt;Mono.Unix.Native&amp;lt;/font&amp;gt;, но вы можете использовать ту, где вам комфортнее.&lt;br /&gt;
&lt;br /&gt;
Начнем с простого: создадим новое решение под названием &amp;lt;font color=darkred&amp;gt;Monix&amp;lt;/font&amp;gt;, затем изменим его код '''Main.cs''' так:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 using Mono.Posix;&lt;br /&gt;
 using Mono.Unix;&lt;br /&gt;
 using Mono.Unix.Native;&lt;br /&gt;
 using System;&lt;br /&gt;
 using System.Text;&lt;br /&gt;
 namespace monix {&lt;br /&gt;
    class Monix {&lt;br /&gt;
     public static void Main(string[] args) {&lt;br /&gt;
       Stdlib.system(“ls”);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Этот простой код – основа для всех дальнейших: будем изменять только строку &amp;lt;font color=darkred&amp;gt;Stdlib.system()&amp;lt;/font&amp;gt; да добавлять кое-какие кусочки.&lt;br /&gt;
Проверьте наличие Mono.Posix и добавьте ссылку на него в проект. В нашем первом методе мы воспользуемся классом &amp;lt;font color=darkred&amp;gt;Stdlib&amp;lt;/font&amp;gt; для вызова &amp;lt;font color=darkred&amp;gt;system()&amp;lt;/font&amp;gt;. Класс &amp;lt;font color=darkred&amp;gt;Stdlib&amp;lt;/font&amp;gt; содержит, в основном, статические методы, то есть вам не нужно создавать объект &amp;lt;font color=darkred&amp;gt;Stdlib&amp;lt;/font&amp;gt; для вызова этих методов. Метод &amp;lt;font color=darkred&amp;gt;system()&amp;lt;/font&amp;gt; (следите за регистром &amp;lt;font color=darkred&amp;gt;s&amp;lt;/font&amp;gt; – он нижний: сейчас мы в стране С!) исполняет любую команду на локальной машине, словно он был введен в командной строке. Для нашего примера это означает запуск ls, поэтому программа выведет список каталогов, как если бы вы сами запустили «ls».&lt;br /&gt;
&lt;br /&gt;
После ввода &amp;lt;font color=darkred&amp;gt;Stdlib.system()&amp;lt;/font&amp;gt;, MonoDevelop должна вывести информацию о параметрах метода &amp;lt;font color=darkred&amp;gt;system()&amp;lt;/font&amp;gt;, и вы увидите, что он принимает строки C#. В этом месте разработчики Mono адаптировали библиотеку вызовов C для лучшей совместимости с программированием .NET – обычно, в терминах С, &amp;lt;font color=darkred&amp;gt;system()&amp;lt;/font&amp;gt; получает &amp;lt;font color=darkred&amp;gt;const char*&amp;lt;/font&amp;gt;, так что использование строк более изящно!&lt;br /&gt;
&lt;br /&gt;
Этот переход существует лишь в некоторых методах. Например, &amp;lt;font color=darkred&amp;gt;printf()&amp;lt;/font&amp;gt; также дружественен к .NET, поэтому вы можете писать код вроде этого:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Stdlib.printf(“Hello, %s!\n”, “world”);&lt;br /&gt;
 Stdlib.printf(string.Format(“Hello, {0}!\n”, “world”));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
С другой стороны, методы &amp;lt;font color=darkred&amp;gt;fopen()&amp;lt;/font&amp;gt;, &amp;lt;font color=darkred&amp;gt;fwrite()&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;fclose()&amp;lt;/font&amp;gt; для работы с файлами требуют указателей. В C# указатели известны как &amp;lt;font color=darkred&amp;gt;IntPtr&amp;lt;/font&amp;gt;, потому что это представление указателя в целочисленном типе данных. Эти &amp;lt;font color=darkred&amp;gt;IntPtr&amp;lt;/font&amp;gt;’ы могут восприниматься как данные с неизвестной структурой: их нельзя прочесть без использования специфичных для этих данных методов. Например, файлы открываются так:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 IntPtr foo = Stdlib.fopen(“file.txt”, “w”);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Но вы не можете читать или записывать с этого файлового дескриптора без других методов &amp;lt;font color=darkred&amp;gt;Stdlib. foo IntPtr&amp;lt;/font&amp;gt; – всего лишь дескриптор данных, и сам по себе бесполезен. На самом деле, это даже небезопасно: любая память, присвоенная указателю, недоступна сборщику мусора Mono, и необходимо освобождать ее вручную, не то образуется утечка [memory leak]. Вы можете выполнить запись в этот файл, затем закрыть его так:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Stdlib.fwrite(Encoding.ASCII.GetBytes(“Hello, world!”), foo);&lt;br /&gt;
 Stdlib.fclose(foo);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Развернем обертки===&lt;br /&gt;
&lt;br /&gt;
Как указывалось ранее, Mono предоставляет набор упрощенных оберток для базовых структур данных и системных вызовов Unix. Например,&lt;br /&gt;
любую информацию о пользователе можно прочесть, создав объект UnixUserInfo таким образом:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 UnixUserInfo user = new UnixUserInfo(“paul”);&lt;br /&gt;
 Console.WriteLine(user.HomeDirectory);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Класс &amp;lt;font color=darkred&amp;gt;UnixUserInfo&amp;lt;/font&amp;gt; читает информацию из '''/etc/passwd''', и вы можете увидеть имя пользователя, информацию о группах, их командных оболочках и так далее. Подобные структуры существуют и для файловых систем – следующая строка кода выудит информацию о вашем корневом каталоге:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 UnixDriveInfo drive = new UnixDriveInfo(“/”);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Затем вы можете узнать объем свободного пространства на диске, прочитав &amp;lt;font color=darkred&amp;gt;drive.AvailableFreeSpace&amp;lt;/font&amp;gt;. Это число возвращается в байтах, поэтому вы можете пожелать удобства ради преобразовать его в гигабайты:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Console.WriteLine(drive.AvailableFreeSpace / 1024 / 1024 / 1024.0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Последнее &amp;lt;font color=darkred&amp;gt;1024&amp;lt;/font&amp;gt; записано как &amp;lt;font color=darkred&amp;gt;1024.0&amp;lt;/font&amp;gt;, потому что это заставит Mono преобразовать конечный результат в число с плавающей точкой, а не в целое – в противном случае результат не будет точным!&lt;br /&gt;
&lt;br /&gt;
Иногда эти обертки имеют собственные методы, как в случае с &amp;lt;font color=darkred&amp;gt;UnixFileInfo&amp;lt;/font&amp;gt; – она читает информацию о конкретных файлах, предоставляя вам такие методы, как &amp;lt;font color=darkred&amp;gt;CanAccess()&amp;lt;/font&amp;gt;, но, что более важно, позволяет создавать символьные ссылки на файл путем вызова функции &amp;lt;font color=darkred&amp;gt;CreateSymbolicLink()&amp;lt;/font&amp;gt;, примерно так:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 UnixFileInfo file = new UnixFileInfo(“file.txt”);&lt;br /&gt;
 file.CreateSymbolicLink(“filesym.txt”&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
создаст ссылку '''filesym.txt''' на '''file.txt''', как если бы вы выполнили ''ln -s file.txt filesym.txt'' в командной строке.&lt;br /&gt;
&lt;br /&gt;
===Звенит сигнал тревоги===&lt;br /&gt;
&lt;br /&gt;
Последний метод, который я хочу показать – &amp;lt;font color=darkred&amp;gt;signal()&amp;lt;/font&amp;gt;, он просто показывает, насколько хорошо интегрированы Mono и библиотека C: вы можете попросить Linux вызвать метод C# при поступлении любого сигнала. «Сигнал» в стране C – это то, что происходит, когда ОС пытается по каким-то причинам прервать программу. Например, нажатие Ctrl+C посылает программе &amp;lt;font color=darkred&amp;gt;SIGINT&amp;lt;/font&amp;gt;, что обычно приводит к выходу. А если вы не хотите, чтобы программа завершалась? Что ж, тогда потрудитесь сообщить C#, как поступать при получении &amp;lt;font color=darkred&amp;gt;SIGINT&amp;lt;/font&amp;gt;, и это делается при помощи метода &amp;lt;font color=darkred&amp;gt;signal()&amp;lt;/font&amp;gt;. Он принимает два параметра: сигнал, который вы хотите перехватить, и имя функции, вызываемой при получении сигнала.&lt;br /&gt;
&lt;br /&gt;
Говоря о &amp;lt;font color=darkred&amp;gt;SIGINT&amp;lt;/font&amp;gt; – вот код, который необходимо ввести в программе, чтобы она не отвечала на &amp;lt;font color=darkblue&amp;gt;Ctrl+C&amp;lt;/font&amp;gt;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 Stdlib.signal(Mono.Unix.Native.Signum.SIGINT, HandleSigInt);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;HandleSigInt&amp;lt;/font&amp;gt; – новый метод, который необходимо создать за пределами &amp;lt;font color=darkred&amp;gt;Main()&amp;lt;/font&amp;gt;. Вот пример:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 public static void HandleSigInt(int sig) {&lt;br /&gt;
    Console.WriteLine(“А я против!\n”);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Теперь при нажатии &amp;lt;font color=darkblue&amp;gt;Ctrl+C&amp;lt;/font&amp;gt; пользователь получит сообщение-отказ; но это не остановит сигнал &amp;lt;font color=darkred&amp;gt;SIGKILL&amp;lt;/font&amp;gt; (посылаемый, когда кто-то выполняет &amp;lt;font color=darkred&amp;gt;kill -9 &amp;lt;ваш pid&amp;gt;&amp;lt;/font&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Конечно, вы не сможете протестировать обработку вашей программой сигналов прерывания, пока не заставите ее работать бесконечно:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
На этом наш блиц-тур по интеграции Mono и Unix закончен. Пожалуйста, не забывайте о потенциальных проблемах: утечки памяти – особенно в длительно работающих программах – могут вызвать серьезные осложнения, а привычка работы с Mono способствует небрежному обращению с памятью. Применение родных функций Unix делает миграцию с C на C# быстрой и простой, но в долгосрочной перспективе лучше начать вытеснять функции C-эквивалентами, родными для .NET...&lt;br /&gt;
&lt;br /&gt;
==Врезки==&lt;br /&gt;
&lt;br /&gt;
===Скорая помощь===&lt;br /&gt;
&lt;br /&gt;
*Не пытайтесь проигнорировать сигнал &amp;lt;font color=darkred&amp;gt;SIGKILL&amp;lt;/font&amp;gt; – все равно не удастся: в противном случае некоторые программы никогда не завершались бы!&lt;br /&gt;
&lt;br /&gt;
*Используя &amp;lt;font color=darkred&amp;gt;system()&amp;lt;/font&amp;gt; и аргументы, переданные вашей функции, вы можете за минуты сколотить быструю оболочку. Начните с пересылки всего переданного в &amp;lt;font color=darkred&amp;gt;system()&amp;lt;/font&amp;gt; и продвигайтесь далее, обрабатывая аргументы и по желанию добавляя собственную функциональность.&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:%D0%90%D0%BD%D0%B0%D0%BD%D0%B0%D1%81</id>
		<title>LXF98:Ананас</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:%D0%90%D0%BD%D0%B0%D0%BD%D0%B0%D1%81"/>
				<updated>2008-03-21T15:02:02Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: /* Последний штрих */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Создаем CRUD-приложение==&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;font color=darkred&amp;gt;'''ЧАСТЬ 2'''&amp;lt;/font&amp;gt; Вариации «Hello, World!» набили оскомину – и '''Андрей Паскаль''' будет стараться избежать надоевшего приветствия до последнего, а попутно создаст бизнес-приложение, не написав ни строчки кода!''&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=red&amp;gt;'''Важно! Загрузить изображения...'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Из чего состоит приложение Ананаса? Как начать работу над собственной бизнес-схемой?&lt;br /&gt;
&lt;br /&gt;
В стародавние времена хорошим педагогическим приемом считалось дать в начале учебника пример программы, печатающей на экране приветствие «Hello, World!».&lt;br /&gt;
&lt;br /&gt;
Времена меняются, требования растут, и вот уже новая педагогическая мода диктует необходимость демонстрировать в качестве примера первого приложения не просто команду вывода на экран, а целую готовую программу по редактированию таблицы базы данных. Такая программа должна уметь Создавать, Показывать, Изменять и Удалять данные в таблице БД, поэтому ее принято называть CRUD-приложением, по первым буквам английских слов Create, Retrive, Update, Delete.&lt;br /&gt;
&lt;br /&gt;
Так как Ананас – бизнес-платформа, то и наше первое CRUD-приложение будет редактировать данные о бизнес-партнерах, также называемых иногда контрагентами. Итак, сегодня мы разработаем CRUD-приложение «Справочник контрагентов». Интересно заметить, что среда разработки платформы Ананас позволяет создать CRUD-приложение без какого-либо написания кода, так что я даже не стал бы называть такую деятельность программированием. Скорее это проектирование.&lt;br /&gt;
&lt;br /&gt;
Для каждого контрагента в справочнике будет храниться следующий упрощенный для нашего случая состав реквизитов:&lt;br /&gt;
&lt;br /&gt;
*Наименование;&lt;br /&gt;
*Почтовый адрес;&lt;br /&gt;
*Телефон;&lt;br /&gt;
*E-Mail;&lt;br /&gt;
*Банк.&lt;br /&gt;
&lt;br /&gt;
Разработка бизнес-схем ведется в среде разработки &amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; платформы Ананас ('''Рис. 1'''). После успешного запуска командой&lt;br /&gt;
&lt;br /&gt;
 [app@app ~]$ ananas-designer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; предложит выбрать бизнес-схему для работы из списка, точно так же, как предлагает выбрать бизнес-схему при запуске сам Ананас. Однако, в отличие от Ананаса, &amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; предоставляет доступ к настройке и созданию/модификации структур данных, алгоритмов, а также печатных и экранных форм бизнес-схемы.&lt;br /&gt;
&lt;br /&gt;
Для создания новой бизнес-схемы требуется указать (или создать новую) группу в окне диалога выбора бизнес-схем и активировать пункт Новая бизнес-схема меню Действия.&lt;br /&gt;
&lt;br /&gt;
Открывшийся диалог позволяет задать параметры новой бизнес-схемы. Наиболее важными из них являются параметры доступа к базе данных на SQL-сервере и положение файла бизнес-схемы в файловой системе вашего компьютера. Если вы укажете несуществующую базу данных или несуществующий файл бизнес-схемы, они будут созданы Ананасом автоматически.&lt;br /&gt;
&lt;br /&gt;
На '''Рис. 2''' показан пример заполнения параметров настройки бизнес-схемы для случая использования ''MySQL'' в качестве сервера баз данных.&lt;br /&gt;
&lt;br /&gt;
*'''Имя файла''' ресурса содержит ссылку на файл, в котором хранятся значения всех остальных полей этого диалога. Имеется возможность выбора ранее созданного файла ресурса: для этого достаточно вызвать диалог выбора файла щелчком по кнопке, расположенной справа от поля с именем файла ресурса. При открытии файла ресурса значения всех полей диалога будут заменены значениями из этого файла.&lt;br /&gt;
&lt;br /&gt;
*''Заголовок базы данных''' предназначен для пользователя и отображается в списке доступных для выбора баз данных в диалоге &amp;lt;font color=darkblue&amp;gt;Список бизнес-схем&amp;lt;/font&amp;gt;, появляющемся при старте &amp;lt;font color=darkblue&amp;gt;Дизайнера&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*'''Имя базы данных''' содержит имя базы данных, используемое системой при доступе к серверу базы данных.&lt;br /&gt;
&lt;br /&gt;
*'''Тип сервера базы данных''' позволяет выбрать один из поддерживаемых Ананасом серверов баз данных (''MySQL'', ''PostgreSQL'' или ''SQLite''). Разумеется, следует убедиться, что соответствующий выбираемому вами типу сервер установлен и запущен, так как здесь вы указываете лишь драйвер, который не будет работать, если не установлен соответствующий сервер.&lt;br /&gt;
&lt;br /&gt;
*'''Адрес сервера базы данных''' – это адрес компьютера, на котором установлен сервер выбранного выше типа. Разумеется, сервер баз данных может работать как на том же самом компьютере, где вы установили Ананас, так и на любом другом. Если сервер баз данных запущен локально, здесь следует указать значение &amp;lt;font color=darkred&amp;gt;localhost&amp;lt;/font&amp;gt;. В остальных случаях следует узнать адрес сервера у системного администратора. Адрес может быть задан как DNS-именем (например, '''myhost.com'''), так и числовым значением (например, 127.0.0.1).&lt;br /&gt;
&lt;br /&gt;
*'''Порт сервера базы данных''' по умолчанию не содержит никакого значения. Его следует задавать лишь в тех случаях, когда используется нестандартный порт, что случается достаточно редко. По этому вопросу следует консультироваться с системным администратором, выполнявшим установку сервера баз данных. Если вы выполняли установку сервера баз данных самостоятельно и не меняли порт сервера баз данных, то поле &amp;lt;font color=darkblue&amp;gt;Порт сервера базы данных&amp;lt;/font&amp;gt; следует оставить пустым.&lt;br /&gt;
&lt;br /&gt;
Задав таким образом значения полей, следует нажать кнопку &amp;lt;font color=darkblue&amp;gt;OK&amp;lt;/font&amp;gt;, а затем выбрать только что определенную бизнес-схему и снова нажать &amp;lt;font color=darkblue&amp;gt;OK&amp;lt;/font&amp;gt;. После получения подтверждения о локальном сохранении настроек (в каталоге '''~/.ananas''') откроется главное окно &amp;lt;font color=darkblue&amp;gt;Дизайнера&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наше CRUD-приложение предназначено для управления &amp;lt;font color=darkblue&amp;gt;Справочником контрагентов&amp;lt;/font&amp;gt;, поэтому в дереве бизнес-объектов ('''Рис. 3''') нас в первую очередь будет интересовать раздел &amp;lt;font color=darkblue&amp;gt;Справочники&amp;lt;/font&amp;gt;. Определение справочника начинается с присвоения ему имени, которое в дальнейшем будет использовано в программировании бизнес-логики в процедурах на языке Ананас-Скрипт. В главном окне &amp;lt;font color=darkblue&amp;gt;Дизайнера&amp;lt;/font&amp;gt; щелкните правой клавишей мыши по разделу &amp;lt;font color=darkblue&amp;gt;Справочники&amp;lt;/font&amp;gt; и в появившемся меню выберите пункт &amp;lt;font color=darkblue&amp;gt;Новый&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В появившемся экранном диалоге закладка &amp;lt;font color=darkblue&amp;gt;Общий&amp;lt;/font&amp;gt; позволяет задать имя справочника и заполнить поле &amp;lt;font color=darkblue&amp;gt;Описание&amp;lt;/font&amp;gt;. На данном этапе в этом диалоге больше ничего изменять не требуется. Следует закрыть его и перейти к определению реквизитов &amp;lt;font color=darkblue&amp;gt;Справочника контрагентов&amp;lt;/font&amp;gt;. Разумеется, среда разработки Ананас позволяет организовать древовидную структуру справочника. Однако, желающих изучить эту тему я адресую к «Справочному руководству по Дизайнеру» Ананаса, а для нашего простого CRUD-приложения древовидная структура в Справочнике контрагентов нам не нужна.&lt;br /&gt;
&lt;br /&gt;
Как только вы закроете диалог, где было задано имя справочника, в дереве бизнес-схемы появится папка с именем Справочник контрагентов, внутри которой видны папки &amp;lt;font color=darkblue&amp;gt;Элемент&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Группа&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Формы&amp;lt;/font&amp;gt;. Для определения первого реквизита справочника следует щелкнуть правой кнопкой мыши по папке &amp;lt;font color=darkblue&amp;gt;Элемент&amp;lt;/font&amp;gt; и выбрать пункт &amp;lt;font color=darkblue&amp;gt;Новый&amp;lt;/font&amp;gt; появившегося меню. В открывшимся диалоге необходимо задать такие свойства реквизита, как &amp;lt;font color=darkblue&amp;gt;Имя&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Тип&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Ширина&amp;lt;/font&amp;gt; ('''Рис. 4'''). Прочие свойства задавать&lt;br /&gt;
не обязательно, их назначение описано в «Справочном руководстве по Дизайнеру». Закрыв диалог, следует повторить действия снова для определения второго, третьего и т.д. реквизитов справочника.&lt;br /&gt;
&lt;br /&gt;
===Диалог с пользователем===&lt;br /&gt;
&lt;br /&gt;
Задав реквизиты &amp;lt;font color=darkblue&amp;gt;Справочника&amp;lt;/font&amp;gt; контрагентов, мы спроектировали структуру данных и подготовили место для их хранения. Теперь необходимо нарисовать экранный диалог для изменения сведений. Для этого следует щелкнуть правой клавишей мыши по подпапке Формы папки Справочник контрагентов и выбрать пункт Новый появившегося меню. В открывшемся диалоге важно определить ровно одно свойство (Режим формы), присвоив ему значение «Диалог элемента».&lt;br /&gt;
&lt;br /&gt;
Именно это свойство отвечает за то, что форма будет использоваться в качестве редактора реквизитов элемента &amp;lt;font color=darkblue&amp;gt;Справочника&amp;lt;/font&amp;gt; контрагентов всякий раз, когда пользователь будет добавлять нового контрагента или редактировать реквизиты уже имеющегося. Для собственного удобства целесообразно заполнить поле Имя каким-нибудь осмысленным текстом, например, &amp;lt;font color=darkblue&amp;gt;Редактор реквизитов&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для перехода к художественной, если можно так выразиться, части создания нашего приложения – «рисованию» экранного диалога. Запустите &amp;lt;font color=darkblue&amp;gt;Редактор диалогов&amp;lt;/font&amp;gt;, нажав соответствующую кнопку на вкладке &amp;lt;font color=darkblue&amp;gt;Дизайн&amp;lt;/font&amp;gt; – отобразится пустое окно. Слева от него будет расположена палитра доступных диалоговых элементов (виджетов) – окно &amp;lt;font color=darkblue&amp;gt;Toolbox&amp;lt;/font&amp;gt;. Справа – редактор свойств элементов – окно &amp;lt;font color=darkblue&amp;gt;Property Editor&amp;lt;/font&amp;gt;. Для нашего «натюрморта» будет достаточно использовать ровно три элемента палитры:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;font color=darkblue&amp;gt;Text Label&amp;lt;/font&amp;gt; для подписей к полям ввода (Рис. 5).&lt;br /&gt;
*&amp;lt;font color=darkblue&amp;gt;DBField&amp;lt;/font&amp;gt; для полей ввода (Рис. 6)&lt;br /&gt;
*&amp;lt;font color=darkblue&amp;gt;ActionButton&amp;lt;/font&amp;gt; для кнопок &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt; (Рис. 6)&lt;br /&gt;
&lt;br /&gt;
Для перетаскивания элементов требуется два клика: первый по элементу палитры, второй – по окну диалога. Перетащите пять раз &amp;lt;font color=darkblue&amp;gt;TextLabel&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;DBField&amp;lt;/font&amp;gt;, разместив их по своему вкусу или как показано на '''Рис. 7''', отредактируйте тексты надписей (двойной щелчок будет здесь незаменим) и задайте привязку для полей ввода, выбрав для каждого из них соответствующий реквизит &amp;lt;font color=darkblue&amp;gt;Справочника контрагентов&amp;lt;/font&amp;gt; из списка. Список вызывается двойным щелчком по полю ввода, лежащему в окне диалога. Именно связывание данных (Data bindings), ставшее популярным благодаря таким средам разработки, как Borland Delphi и Visual Basic, и с успехом применяемое в среде разработки платформы Ананас, позволяет нам обойтись при создании CRUD-приложения без написания кода.&lt;br /&gt;
&lt;br /&gt;
После проведения несложной процедуры связывания для всех пяти полей ввода,добавьте в окно диалога кнопки &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt;, использовав для этого элемент &amp;lt;font color=darkblue&amp;gt;ActionButton&amp;lt;/font&amp;gt; палитры. Кнопка &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; должна просто закрывать окно. Кнопка &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt; должна дополнительно сохранять содержимое полей ввода в базе данных.&lt;br /&gt;
&lt;br /&gt;
Поведение кнопки задается в диалоге, вызываемым двойным щелчком по ней. Для кнопки &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; следует поставить галочки опциям &amp;lt;font color=darkblue&amp;gt;Простое действие&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Закрыть диалога&amp;lt;/font&amp;gt;. Для кнопки &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt; следует поставить третью галочку – &amp;lt;font color=darkblue&amp;gt;Обновить&amp;lt;/font&amp;gt;. Для смены текста надписи на кнопке в контекстном меню, вызываемом правой клавишей мыши следует выбрать пункт &amp;lt;font color=darkblue&amp;gt;Edit Text&amp;lt;/font&amp;gt;....&lt;br /&gt;
&lt;br /&gt;
===Сделаем красиво===&lt;br /&gt;
&lt;br /&gt;
В принципе, мы уже закончили – наше приложение будет работать. Но, как всякий уважающий себя кулинар и садовник позаботится о внешнем оформлении своего творения, прежде чем показать его публике, так и программист должен позаботиться о привлекательности создаваемого им приложения. Для придания опрятности нашему диалогу воспользуемся возможностями динамического, автоматически масштабируемого размещения элементов. В этом деле нам помогут &amp;lt;font color=darkblue&amp;gt;«пружинки»&amp;lt;/font&amp;gt; и типы размещения &amp;lt;font color=darkblue&amp;gt;«Сетка»&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;«Горизонтальные полоски»&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;«Вертикальные полоски»&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Начнем с полей ввода и надписей к ним. Разместив вертикально две пружинки, как показано на '''Рис. 8''', и выделив их все, последовательно щелкая мышкой и удерживая клавишу &amp;lt;font color=darkblue&amp;gt;Shift&amp;lt;/font&amp;gt; на клавиатуре, применим тип размещения &amp;lt;font color=darkblue&amp;gt;«Сетка»&amp;lt;/font&amp;gt;. Получим первый блок сгруппированных элементов диалога. Проделайте то же самое с кнопками &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt;, только &amp;lt;font color=darkblue&amp;gt;«пружинки»&amp;lt;/font&amp;gt; выберите горизонтальные, а тип размещения – &amp;lt;font color=darkblue&amp;gt;«Вертикальные полоски»&amp;lt;/font&amp;gt;. Последним шагом необходимо снять выделение, ткнув мышкой в пустую область окна диалога, а затем применить тип размещения &amp;lt;font color=darkblue&amp;gt;«Горизонтальные полоски»&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Не стоит печалиться, если требуемый результат не удастся получить с первого раза. Во-первых, всегда есть возможность отменить последнее действие при помощи клавиатурной комбинации &amp;lt;font color=darkblue&amp;gt;Ctrl+Z&amp;lt;/font&amp;gt;, во-вторых, правила динамического масштабирования определяются, помимо прочего, свойством &amp;lt;font color=darkred&amp;gt;sizePolicy&amp;lt;/font&amp;gt;, индивидуально определяемым для каждого элемента диалога в редакторе свойств &amp;lt;font color=darkblue&amp;gt;Property Editor&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такая работа требует некоторой привычки и терпения первое время. Овладев методикой задания динамического масштабирования и расположения элементов, вы будете тратить на нее минимум времени.&lt;br /&gt;
&lt;br /&gt;
Теперь нашу работу необходимо сохранить и, для проверки – запустить Ананас. &amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; закрывать не требуется. При успешном сохранении в соответствующем окне должны появиться сообщения об успешном обновлении структур базы данных, предназначенных для хранения бизнес-объектов. Если появились ошибки, то скорее всего Ананасу не хватило прав для записи в один из каталогов или не работает доступ к базе данных. Помощь по затруднительным ситуациям доступна на форуме проекта.&lt;br /&gt;
&lt;br /&gt;
===Последний штрих===&lt;br /&gt;
&lt;br /&gt;
А теперь – сюрприз: немного кода все-таки потребуется. Дело в том, что среда исполнения приложений Ананаса не знает, какой экранный диалог нашей бизнес-схемы следует запускать сразу после старта, ведь в нашем приложении могло бы быть несколько экранных форм. Нужен какой-нибудь способ известить Ананас о том, что при старте он должен открыть наш &amp;lt;font color=darkblue&amp;gt;Справочник контрагентов&amp;lt;/font&amp;gt;. Для этого предусмотрена предопределенная функция на Ананас-Скрипте с названием &amp;lt;font color=darkred&amp;gt;on_systemstart()&amp;lt;/font&amp;gt;. Если среда исполнения находит такую функцию в глобальном модуле бизнес-схемы при старте, она будет автоматически запущена на выполнение.&lt;br /&gt;
&lt;br /&gt;
Доступ к глобальному модулю осуществляется через двойной щелчок по корню дерева бизнес-объектов в &amp;lt;font color=darkblue&amp;gt;Дизайнере&amp;lt;/font&amp;gt; и выбор вкладки &amp;lt;font color=darkblue&amp;gt;Глобальный модуль&amp;lt;/font&amp;gt; появившегося диалога.&lt;br /&gt;
&lt;br /&gt;
Вот код, который нужно туда записать:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 function on_systemstart()&lt;br /&gt;
 {&lt;br /&gt;
    sys.Message(0,”Привет, Мир! :)”);&lt;br /&gt;
    cat = new CatalogEditor(“Справочник контрагентов”);&lt;br /&gt;
    cat.edit();&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Да, да! Он все-таки напечатает «Привет, Мир!» :) в окне сообщений ('''Рис. 9''').&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;
Среда разработки Ананас оснащена великолепным WYSIWYG-редактором диалогов, позволяющим в наглядной форме разместить визуальные элементы, такие как надписи, кнопки и поля ввода в окне диалога.&lt;br /&gt;
&lt;br /&gt;
Более того! Диалоги Ананаса являются динамически масштабируемыми, что, во-первых, совершенно необходимо для сохранения опрятного вида диалогов в гетерогенной среде, когда шрифты операционной системы Windows могут существенно отличаться в пропорциях от шрифтов среды X Window операционной системы Linux; во-вторых, создает дополнительные удобства в ситуации, когда пользователь желает растянуть окно диалога, чтобы использовать все разрешение своего экрана, улучшив тем самым отображение информации.&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:%D0%90%D0%BD%D0%B0%D0%BD%D0%B0%D1%81</id>
		<title>LXF98:Ананас</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:%D0%90%D0%BD%D0%B0%D0%BD%D0%B0%D1%81"/>
				<updated>2008-03-21T15:01:00Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: /* Последний штрих */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Создаем CRUD-приложение==&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;font color=darkred&amp;gt;'''ЧАСТЬ 2'''&amp;lt;/font&amp;gt; Вариации «Hello, World!» набили оскомину – и '''Андрей Паскаль''' будет стараться избежать надоевшего приветствия до последнего, а попутно создаст бизнес-приложение, не написав ни строчки кода!''&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=red&amp;gt;'''Важно! Загрузить изображения...'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Из чего состоит приложение Ананаса? Как начать работу над собственной бизнес-схемой?&lt;br /&gt;
&lt;br /&gt;
В стародавние времена хорошим педагогическим приемом считалось дать в начале учебника пример программы, печатающей на экране приветствие «Hello, World!».&lt;br /&gt;
&lt;br /&gt;
Времена меняются, требования растут, и вот уже новая педагогическая мода диктует необходимость демонстрировать в качестве примера первого приложения не просто команду вывода на экран, а целую готовую программу по редактированию таблицы базы данных. Такая программа должна уметь Создавать, Показывать, Изменять и Удалять данные в таблице БД, поэтому ее принято называть CRUD-приложением, по первым буквам английских слов Create, Retrive, Update, Delete.&lt;br /&gt;
&lt;br /&gt;
Так как Ананас – бизнес-платформа, то и наше первое CRUD-приложение будет редактировать данные о бизнес-партнерах, также называемых иногда контрагентами. Итак, сегодня мы разработаем CRUD-приложение «Справочник контрагентов». Интересно заметить, что среда разработки платформы Ананас позволяет создать CRUD-приложение без какого-либо написания кода, так что я даже не стал бы называть такую деятельность программированием. Скорее это проектирование.&lt;br /&gt;
&lt;br /&gt;
Для каждого контрагента в справочнике будет храниться следующий упрощенный для нашего случая состав реквизитов:&lt;br /&gt;
&lt;br /&gt;
*Наименование;&lt;br /&gt;
*Почтовый адрес;&lt;br /&gt;
*Телефон;&lt;br /&gt;
*E-Mail;&lt;br /&gt;
*Банк.&lt;br /&gt;
&lt;br /&gt;
Разработка бизнес-схем ведется в среде разработки &amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; платформы Ананас ('''Рис. 1'''). После успешного запуска командой&lt;br /&gt;
&lt;br /&gt;
 [app@app ~]$ ananas-designer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; предложит выбрать бизнес-схему для работы из списка, точно так же, как предлагает выбрать бизнес-схему при запуске сам Ананас. Однако, в отличие от Ананаса, &amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; предоставляет доступ к настройке и созданию/модификации структур данных, алгоритмов, а также печатных и экранных форм бизнес-схемы.&lt;br /&gt;
&lt;br /&gt;
Для создания новой бизнес-схемы требуется указать (или создать новую) группу в окне диалога выбора бизнес-схем и активировать пункт Новая бизнес-схема меню Действия.&lt;br /&gt;
&lt;br /&gt;
Открывшийся диалог позволяет задать параметры новой бизнес-схемы. Наиболее важными из них являются параметры доступа к базе данных на SQL-сервере и положение файла бизнес-схемы в файловой системе вашего компьютера. Если вы укажете несуществующую базу данных или несуществующий файл бизнес-схемы, они будут созданы Ананасом автоматически.&lt;br /&gt;
&lt;br /&gt;
На '''Рис. 2''' показан пример заполнения параметров настройки бизнес-схемы для случая использования ''MySQL'' в качестве сервера баз данных.&lt;br /&gt;
&lt;br /&gt;
*'''Имя файла''' ресурса содержит ссылку на файл, в котором хранятся значения всех остальных полей этого диалога. Имеется возможность выбора ранее созданного файла ресурса: для этого достаточно вызвать диалог выбора файла щелчком по кнопке, расположенной справа от поля с именем файла ресурса. При открытии файла ресурса значения всех полей диалога будут заменены значениями из этого файла.&lt;br /&gt;
&lt;br /&gt;
*''Заголовок базы данных''' предназначен для пользователя и отображается в списке доступных для выбора баз данных в диалоге &amp;lt;font color=darkblue&amp;gt;Список бизнес-схем&amp;lt;/font&amp;gt;, появляющемся при старте &amp;lt;font color=darkblue&amp;gt;Дизайнера&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*'''Имя базы данных''' содержит имя базы данных, используемое системой при доступе к серверу базы данных.&lt;br /&gt;
&lt;br /&gt;
*'''Тип сервера базы данных''' позволяет выбрать один из поддерживаемых Ананасом серверов баз данных (''MySQL'', ''PostgreSQL'' или ''SQLite''). Разумеется, следует убедиться, что соответствующий выбираемому вами типу сервер установлен и запущен, так как здесь вы указываете лишь драйвер, который не будет работать, если не установлен соответствующий сервер.&lt;br /&gt;
&lt;br /&gt;
*'''Адрес сервера базы данных''' – это адрес компьютера, на котором установлен сервер выбранного выше типа. Разумеется, сервер баз данных может работать как на том же самом компьютере, где вы установили Ананас, так и на любом другом. Если сервер баз данных запущен локально, здесь следует указать значение &amp;lt;font color=darkred&amp;gt;localhost&amp;lt;/font&amp;gt;. В остальных случаях следует узнать адрес сервера у системного администратора. Адрес может быть задан как DNS-именем (например, '''myhost.com'''), так и числовым значением (например, 127.0.0.1).&lt;br /&gt;
&lt;br /&gt;
*'''Порт сервера базы данных''' по умолчанию не содержит никакого значения. Его следует задавать лишь в тех случаях, когда используется нестандартный порт, что случается достаточно редко. По этому вопросу следует консультироваться с системным администратором, выполнявшим установку сервера баз данных. Если вы выполняли установку сервера баз данных самостоятельно и не меняли порт сервера баз данных, то поле &amp;lt;font color=darkblue&amp;gt;Порт сервера базы данных&amp;lt;/font&amp;gt; следует оставить пустым.&lt;br /&gt;
&lt;br /&gt;
Задав таким образом значения полей, следует нажать кнопку &amp;lt;font color=darkblue&amp;gt;OK&amp;lt;/font&amp;gt;, а затем выбрать только что определенную бизнес-схему и снова нажать &amp;lt;font color=darkblue&amp;gt;OK&amp;lt;/font&amp;gt;. После получения подтверждения о локальном сохранении настроек (в каталоге '''~/.ananas''') откроется главное окно &amp;lt;font color=darkblue&amp;gt;Дизайнера&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наше CRUD-приложение предназначено для управления &amp;lt;font color=darkblue&amp;gt;Справочником контрагентов&amp;lt;/font&amp;gt;, поэтому в дереве бизнес-объектов ('''Рис. 3''') нас в первую очередь будет интересовать раздел &amp;lt;font color=darkblue&amp;gt;Справочники&amp;lt;/font&amp;gt;. Определение справочника начинается с присвоения ему имени, которое в дальнейшем будет использовано в программировании бизнес-логики в процедурах на языке Ананас-Скрипт. В главном окне &amp;lt;font color=darkblue&amp;gt;Дизайнера&amp;lt;/font&amp;gt; щелкните правой клавишей мыши по разделу &amp;lt;font color=darkblue&amp;gt;Справочники&amp;lt;/font&amp;gt; и в появившемся меню выберите пункт &amp;lt;font color=darkblue&amp;gt;Новый&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В появившемся экранном диалоге закладка &amp;lt;font color=darkblue&amp;gt;Общий&amp;lt;/font&amp;gt; позволяет задать имя справочника и заполнить поле &amp;lt;font color=darkblue&amp;gt;Описание&amp;lt;/font&amp;gt;. На данном этапе в этом диалоге больше ничего изменять не требуется. Следует закрыть его и перейти к определению реквизитов &amp;lt;font color=darkblue&amp;gt;Справочника контрагентов&amp;lt;/font&amp;gt;. Разумеется, среда разработки Ананас позволяет организовать древовидную структуру справочника. Однако, желающих изучить эту тему я адресую к «Справочному руководству по Дизайнеру» Ананаса, а для нашего простого CRUD-приложения древовидная структура в Справочнике контрагентов нам не нужна.&lt;br /&gt;
&lt;br /&gt;
Как только вы закроете диалог, где было задано имя справочника, в дереве бизнес-схемы появится папка с именем Справочник контрагентов, внутри которой видны папки &amp;lt;font color=darkblue&amp;gt;Элемент&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Группа&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Формы&amp;lt;/font&amp;gt;. Для определения первого реквизита справочника следует щелкнуть правой кнопкой мыши по папке &amp;lt;font color=darkblue&amp;gt;Элемент&amp;lt;/font&amp;gt; и выбрать пункт &amp;lt;font color=darkblue&amp;gt;Новый&amp;lt;/font&amp;gt; появившегося меню. В открывшимся диалоге необходимо задать такие свойства реквизита, как &amp;lt;font color=darkblue&amp;gt;Имя&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Тип&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Ширина&amp;lt;/font&amp;gt; ('''Рис. 4'''). Прочие свойства задавать&lt;br /&gt;
не обязательно, их назначение описано в «Справочном руководстве по Дизайнеру». Закрыв диалог, следует повторить действия снова для определения второго, третьего и т.д. реквизитов справочника.&lt;br /&gt;
&lt;br /&gt;
===Диалог с пользователем===&lt;br /&gt;
&lt;br /&gt;
Задав реквизиты &amp;lt;font color=darkblue&amp;gt;Справочника&amp;lt;/font&amp;gt; контрагентов, мы спроектировали структуру данных и подготовили место для их хранения. Теперь необходимо нарисовать экранный диалог для изменения сведений. Для этого следует щелкнуть правой клавишей мыши по подпапке Формы папки Справочник контрагентов и выбрать пункт Новый появившегося меню. В открывшемся диалоге важно определить ровно одно свойство (Режим формы), присвоив ему значение «Диалог элемента».&lt;br /&gt;
&lt;br /&gt;
Именно это свойство отвечает за то, что форма будет использоваться в качестве редактора реквизитов элемента &amp;lt;font color=darkblue&amp;gt;Справочника&amp;lt;/font&amp;gt; контрагентов всякий раз, когда пользователь будет добавлять нового контрагента или редактировать реквизиты уже имеющегося. Для собственного удобства целесообразно заполнить поле Имя каким-нибудь осмысленным текстом, например, &amp;lt;font color=darkblue&amp;gt;Редактор реквизитов&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для перехода к художественной, если можно так выразиться, части создания нашего приложения – «рисованию» экранного диалога. Запустите &amp;lt;font color=darkblue&amp;gt;Редактор диалогов&amp;lt;/font&amp;gt;, нажав соответствующую кнопку на вкладке &amp;lt;font color=darkblue&amp;gt;Дизайн&amp;lt;/font&amp;gt; – отобразится пустое окно. Слева от него будет расположена палитра доступных диалоговых элементов (виджетов) – окно &amp;lt;font color=darkblue&amp;gt;Toolbox&amp;lt;/font&amp;gt;. Справа – редактор свойств элементов – окно &amp;lt;font color=darkblue&amp;gt;Property Editor&amp;lt;/font&amp;gt;. Для нашего «натюрморта» будет достаточно использовать ровно три элемента палитры:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;font color=darkblue&amp;gt;Text Label&amp;lt;/font&amp;gt; для подписей к полям ввода (Рис. 5).&lt;br /&gt;
*&amp;lt;font color=darkblue&amp;gt;DBField&amp;lt;/font&amp;gt; для полей ввода (Рис. 6)&lt;br /&gt;
*&amp;lt;font color=darkblue&amp;gt;ActionButton&amp;lt;/font&amp;gt; для кнопок &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt; (Рис. 6)&lt;br /&gt;
&lt;br /&gt;
Для перетаскивания элементов требуется два клика: первый по элементу палитры, второй – по окну диалога. Перетащите пять раз &amp;lt;font color=darkblue&amp;gt;TextLabel&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;DBField&amp;lt;/font&amp;gt;, разместив их по своему вкусу или как показано на '''Рис. 7''', отредактируйте тексты надписей (двойной щелчок будет здесь незаменим) и задайте привязку для полей ввода, выбрав для каждого из них соответствующий реквизит &amp;lt;font color=darkblue&amp;gt;Справочника контрагентов&amp;lt;/font&amp;gt; из списка. Список вызывается двойным щелчком по полю ввода, лежащему в окне диалога. Именно связывание данных (Data bindings), ставшее популярным благодаря таким средам разработки, как Borland Delphi и Visual Basic, и с успехом применяемое в среде разработки платформы Ананас, позволяет нам обойтись при создании CRUD-приложения без написания кода.&lt;br /&gt;
&lt;br /&gt;
После проведения несложной процедуры связывания для всех пяти полей ввода,добавьте в окно диалога кнопки &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt;, использовав для этого элемент &amp;lt;font color=darkblue&amp;gt;ActionButton&amp;lt;/font&amp;gt; палитры. Кнопка &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; должна просто закрывать окно. Кнопка &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt; должна дополнительно сохранять содержимое полей ввода в базе данных.&lt;br /&gt;
&lt;br /&gt;
Поведение кнопки задается в диалоге, вызываемым двойным щелчком по ней. Для кнопки &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; следует поставить галочки опциям &amp;lt;font color=darkblue&amp;gt;Простое действие&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Закрыть диалога&amp;lt;/font&amp;gt;. Для кнопки &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt; следует поставить третью галочку – &amp;lt;font color=darkblue&amp;gt;Обновить&amp;lt;/font&amp;gt;. Для смены текста надписи на кнопке в контекстном меню, вызываемом правой клавишей мыши следует выбрать пункт &amp;lt;font color=darkblue&amp;gt;Edit Text&amp;lt;/font&amp;gt;....&lt;br /&gt;
&lt;br /&gt;
===Сделаем красиво===&lt;br /&gt;
&lt;br /&gt;
В принципе, мы уже закончили – наше приложение будет работать. Но, как всякий уважающий себя кулинар и садовник позаботится о внешнем оформлении своего творения, прежде чем показать его публике, так и программист должен позаботиться о привлекательности создаваемого им приложения. Для придания опрятности нашему диалогу воспользуемся возможностями динамического, автоматически масштабируемого размещения элементов. В этом деле нам помогут &amp;lt;font color=darkblue&amp;gt;«пружинки»&amp;lt;/font&amp;gt; и типы размещения &amp;lt;font color=darkblue&amp;gt;«Сетка»&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;«Горизонтальные полоски»&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;«Вертикальные полоски»&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Начнем с полей ввода и надписей к ним. Разместив вертикально две пружинки, как показано на '''Рис. 8''', и выделив их все, последовательно щелкая мышкой и удерживая клавишу &amp;lt;font color=darkblue&amp;gt;Shift&amp;lt;/font&amp;gt; на клавиатуре, применим тип размещения &amp;lt;font color=darkblue&amp;gt;«Сетка»&amp;lt;/font&amp;gt;. Получим первый блок сгруппированных элементов диалога. Проделайте то же самое с кнопками &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt;, только &amp;lt;font color=darkblue&amp;gt;«пружинки»&amp;lt;/font&amp;gt; выберите горизонтальные, а тип размещения – &amp;lt;font color=darkblue&amp;gt;«Вертикальные полоски»&amp;lt;/font&amp;gt;. Последним шагом необходимо снять выделение, ткнув мышкой в пустую область окна диалога, а затем применить тип размещения &amp;lt;font color=darkblue&amp;gt;«Горизонтальные полоски»&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Не стоит печалиться, если требуемый результат не удастся получить с первого раза. Во-первых, всегда есть возможность отменить последнее действие при помощи клавиатурной комбинации &amp;lt;font color=darkblue&amp;gt;Ctrl+Z&amp;lt;/font&amp;gt;, во-вторых, правила динамического масштабирования определяются, помимо прочего, свойством &amp;lt;font color=darkred&amp;gt;sizePolicy&amp;lt;/font&amp;gt;, индивидуально определяемым для каждого элемента диалога в редакторе свойств &amp;lt;font color=darkblue&amp;gt;Property Editor&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такая работа требует некоторой привычки и терпения первое время. Овладев методикой задания динамического масштабирования и расположения элементов, вы будете тратить на нее минимум времени.&lt;br /&gt;
&lt;br /&gt;
Теперь нашу работу необходимо сохранить и, для проверки – запустить Ананас. &amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; закрывать не требуется. При успешном сохранении в соответствующем окне должны появиться сообщения об успешном обновлении структур базы данных, предназначенных для хранения бизнес-объектов. Если появились ошибки, то скорее всего Ананасу не хватило прав для записи в один из каталогов или не работает доступ к базе данных. Помощь по затруднительным ситуациям доступна на форуме проекта.&lt;br /&gt;
&lt;br /&gt;
===Последний штрих===&lt;br /&gt;
&lt;br /&gt;
А теперь – сюрприз: немного кода все-таки потребуется. Дело в том, что среда исполнения приложений Ананаса не знает, какой экранный диалог нашей бизнес-схемы следует запускать сразу после старта, ведь в нашем приложении могло бы быть несколько экранных форм. Нужен какой-нибудь способ известить Ананас о том, что при старте он должен открыть наш &amp;lt;font color=darkblue&amp;gt;Справочник контрагентов&amp;lt;/font&amp;gt;. Для этого предусмотрена предопределенная функция на Ананас-Скрипте с названием &amp;lt;font color=darkred&amp;gt;on_systemstart()&amp;lt;/font&amp;gt;. Если среда исполнения находит такую функцию в глобальном модуле бизнес-схемы при старте, она будет автоматически запущена на выполнение.&lt;br /&gt;
&lt;br /&gt;
Доступ к глобальному модулю осуществляется через двойной щелчок по корню дерева бизнес-объектов в &amp;lt;font color=darkblue&amp;gt;Дизайнере&amp;lt;/font&amp;gt; и выбор вкладки &amp;lt;font color=darkblue&amp;gt;Глобальный модуль&amp;lt;/font&amp;gt; появившегося диалога.&lt;br /&gt;
&lt;br /&gt;
Вот код, который нужно туда записать:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
 function on_systemstart()&lt;br /&gt;
 {&lt;br /&gt;
    sys.Message(0,”Привет, Мир! :)”);&lt;br /&gt;
    cat = new CatalogEditor(“Справочник контрагентов”);&lt;br /&gt;
    cat.edit();&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Да, да! Он все-таки напечатает «Привет, Мир!» :) в окне сообщений ('''Рис. 9''').&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;
Среда разработки Ананас оснащена великолепным WYSIWYG-редактором диалогов, позволяющим в наглядной форме разместить визуальные элементы, такие как надписи, кнопки и поля ввода в окне диалога.&lt;br /&gt;
&lt;br /&gt;
Более того! Диалоги Ананаса являются динамически масштабируемыми, что, во-первых, совершенно необходимо для сохранения опрятного вида диалогов в гетерогенной среде, когда шрифты операционной системы Windows могут существенно отличаться в пропорциях от шрифтов среды X Window операционной системы Linux; во-вторых, создает дополнительные удобства в ситуации, когда пользователь желает растянуть окно диалога, чтобы использовать все разрешение своего экрана, улучшив тем самым отображение информации.&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:%D0%90%D0%BD%D0%B0%D0%BD%D0%B0%D1%81</id>
		<title>LXF98:Ананас</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:%D0%90%D0%BD%D0%B0%D0%BD%D0%B0%D1%81"/>
				<updated>2008-03-21T15:00:07Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: /* Последний штрих */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Создаем CRUD-приложение==&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;font color=darkred&amp;gt;'''ЧАСТЬ 2'''&amp;lt;/font&amp;gt; Вариации «Hello, World!» набили оскомину – и '''Андрей Паскаль''' будет стараться избежать надоевшего приветствия до последнего, а попутно создаст бизнес-приложение, не написав ни строчки кода!''&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=red&amp;gt;'''Важно! Загрузить изображения...'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Из чего состоит приложение Ананаса? Как начать работу над собственной бизнес-схемой?&lt;br /&gt;
&lt;br /&gt;
В стародавние времена хорошим педагогическим приемом считалось дать в начале учебника пример программы, печатающей на экране приветствие «Hello, World!».&lt;br /&gt;
&lt;br /&gt;
Времена меняются, требования растут, и вот уже новая педагогическая мода диктует необходимость демонстрировать в качестве примера первого приложения не просто команду вывода на экран, а целую готовую программу по редактированию таблицы базы данных. Такая программа должна уметь Создавать, Показывать, Изменять и Удалять данные в таблице БД, поэтому ее принято называть CRUD-приложением, по первым буквам английских слов Create, Retrive, Update, Delete.&lt;br /&gt;
&lt;br /&gt;
Так как Ананас – бизнес-платформа, то и наше первое CRUD-приложение будет редактировать данные о бизнес-партнерах, также называемых иногда контрагентами. Итак, сегодня мы разработаем CRUD-приложение «Справочник контрагентов». Интересно заметить, что среда разработки платформы Ананас позволяет создать CRUD-приложение без какого-либо написания кода, так что я даже не стал бы называть такую деятельность программированием. Скорее это проектирование.&lt;br /&gt;
&lt;br /&gt;
Для каждого контрагента в справочнике будет храниться следующий упрощенный для нашего случая состав реквизитов:&lt;br /&gt;
&lt;br /&gt;
*Наименование;&lt;br /&gt;
*Почтовый адрес;&lt;br /&gt;
*Телефон;&lt;br /&gt;
*E-Mail;&lt;br /&gt;
*Банк.&lt;br /&gt;
&lt;br /&gt;
Разработка бизнес-схем ведется в среде разработки &amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; платформы Ананас ('''Рис. 1'''). После успешного запуска командой&lt;br /&gt;
&lt;br /&gt;
 [app@app ~]$ ananas-designer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; предложит выбрать бизнес-схему для работы из списка, точно так же, как предлагает выбрать бизнес-схему при запуске сам Ананас. Однако, в отличие от Ананаса, &amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; предоставляет доступ к настройке и созданию/модификации структур данных, алгоритмов, а также печатных и экранных форм бизнес-схемы.&lt;br /&gt;
&lt;br /&gt;
Для создания новой бизнес-схемы требуется указать (или создать новую) группу в окне диалога выбора бизнес-схем и активировать пункт Новая бизнес-схема меню Действия.&lt;br /&gt;
&lt;br /&gt;
Открывшийся диалог позволяет задать параметры новой бизнес-схемы. Наиболее важными из них являются параметры доступа к базе данных на SQL-сервере и положение файла бизнес-схемы в файловой системе вашего компьютера. Если вы укажете несуществующую базу данных или несуществующий файл бизнес-схемы, они будут созданы Ананасом автоматически.&lt;br /&gt;
&lt;br /&gt;
На '''Рис. 2''' показан пример заполнения параметров настройки бизнес-схемы для случая использования ''MySQL'' в качестве сервера баз данных.&lt;br /&gt;
&lt;br /&gt;
*'''Имя файла''' ресурса содержит ссылку на файл, в котором хранятся значения всех остальных полей этого диалога. Имеется возможность выбора ранее созданного файла ресурса: для этого достаточно вызвать диалог выбора файла щелчком по кнопке, расположенной справа от поля с именем файла ресурса. При открытии файла ресурса значения всех полей диалога будут заменены значениями из этого файла.&lt;br /&gt;
&lt;br /&gt;
*''Заголовок базы данных''' предназначен для пользователя и отображается в списке доступных для выбора баз данных в диалоге &amp;lt;font color=darkblue&amp;gt;Список бизнес-схем&amp;lt;/font&amp;gt;, появляющемся при старте &amp;lt;font color=darkblue&amp;gt;Дизайнера&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*'''Имя базы данных''' содержит имя базы данных, используемое системой при доступе к серверу базы данных.&lt;br /&gt;
&lt;br /&gt;
*'''Тип сервера базы данных''' позволяет выбрать один из поддерживаемых Ананасом серверов баз данных (''MySQL'', ''PostgreSQL'' или ''SQLite''). Разумеется, следует убедиться, что соответствующий выбираемому вами типу сервер установлен и запущен, так как здесь вы указываете лишь драйвер, который не будет работать, если не установлен соответствующий сервер.&lt;br /&gt;
&lt;br /&gt;
*'''Адрес сервера базы данных''' – это адрес компьютера, на котором установлен сервер выбранного выше типа. Разумеется, сервер баз данных может работать как на том же самом компьютере, где вы установили Ананас, так и на любом другом. Если сервер баз данных запущен локально, здесь следует указать значение &amp;lt;font color=darkred&amp;gt;localhost&amp;lt;/font&amp;gt;. В остальных случаях следует узнать адрес сервера у системного администратора. Адрес может быть задан как DNS-именем (например, '''myhost.com'''), так и числовым значением (например, 127.0.0.1).&lt;br /&gt;
&lt;br /&gt;
*'''Порт сервера базы данных''' по умолчанию не содержит никакого значения. Его следует задавать лишь в тех случаях, когда используется нестандартный порт, что случается достаточно редко. По этому вопросу следует консультироваться с системным администратором, выполнявшим установку сервера баз данных. Если вы выполняли установку сервера баз данных самостоятельно и не меняли порт сервера баз данных, то поле &amp;lt;font color=darkblue&amp;gt;Порт сервера базы данных&amp;lt;/font&amp;gt; следует оставить пустым.&lt;br /&gt;
&lt;br /&gt;
Задав таким образом значения полей, следует нажать кнопку &amp;lt;font color=darkblue&amp;gt;OK&amp;lt;/font&amp;gt;, а затем выбрать только что определенную бизнес-схему и снова нажать &amp;lt;font color=darkblue&amp;gt;OK&amp;lt;/font&amp;gt;. После получения подтверждения о локальном сохранении настроек (в каталоге '''~/.ananas''') откроется главное окно &amp;lt;font color=darkblue&amp;gt;Дизайнера&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наше CRUD-приложение предназначено для управления &amp;lt;font color=darkblue&amp;gt;Справочником контрагентов&amp;lt;/font&amp;gt;, поэтому в дереве бизнес-объектов ('''Рис. 3''') нас в первую очередь будет интересовать раздел &amp;lt;font color=darkblue&amp;gt;Справочники&amp;lt;/font&amp;gt;. Определение справочника начинается с присвоения ему имени, которое в дальнейшем будет использовано в программировании бизнес-логики в процедурах на языке Ананас-Скрипт. В главном окне &amp;lt;font color=darkblue&amp;gt;Дизайнера&amp;lt;/font&amp;gt; щелкните правой клавишей мыши по разделу &amp;lt;font color=darkblue&amp;gt;Справочники&amp;lt;/font&amp;gt; и в появившемся меню выберите пункт &amp;lt;font color=darkblue&amp;gt;Новый&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В появившемся экранном диалоге закладка &amp;lt;font color=darkblue&amp;gt;Общий&amp;lt;/font&amp;gt; позволяет задать имя справочника и заполнить поле &amp;lt;font color=darkblue&amp;gt;Описание&amp;lt;/font&amp;gt;. На данном этапе в этом диалоге больше ничего изменять не требуется. Следует закрыть его и перейти к определению реквизитов &amp;lt;font color=darkblue&amp;gt;Справочника контрагентов&amp;lt;/font&amp;gt;. Разумеется, среда разработки Ананас позволяет организовать древовидную структуру справочника. Однако, желающих изучить эту тему я адресую к «Справочному руководству по Дизайнеру» Ананаса, а для нашего простого CRUD-приложения древовидная структура в Справочнике контрагентов нам не нужна.&lt;br /&gt;
&lt;br /&gt;
Как только вы закроете диалог, где было задано имя справочника, в дереве бизнес-схемы появится папка с именем Справочник контрагентов, внутри которой видны папки &amp;lt;font color=darkblue&amp;gt;Элемент&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Группа&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Формы&amp;lt;/font&amp;gt;. Для определения первого реквизита справочника следует щелкнуть правой кнопкой мыши по папке &amp;lt;font color=darkblue&amp;gt;Элемент&amp;lt;/font&amp;gt; и выбрать пункт &amp;lt;font color=darkblue&amp;gt;Новый&amp;lt;/font&amp;gt; появившегося меню. В открывшимся диалоге необходимо задать такие свойства реквизита, как &amp;lt;font color=darkblue&amp;gt;Имя&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Тип&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Ширина&amp;lt;/font&amp;gt; ('''Рис. 4'''). Прочие свойства задавать&lt;br /&gt;
не обязательно, их назначение описано в «Справочном руководстве по Дизайнеру». Закрыв диалог, следует повторить действия снова для определения второго, третьего и т.д. реквизитов справочника.&lt;br /&gt;
&lt;br /&gt;
===Диалог с пользователем===&lt;br /&gt;
&lt;br /&gt;
Задав реквизиты &amp;lt;font color=darkblue&amp;gt;Справочника&amp;lt;/font&amp;gt; контрагентов, мы спроектировали структуру данных и подготовили место для их хранения. Теперь необходимо нарисовать экранный диалог для изменения сведений. Для этого следует щелкнуть правой клавишей мыши по подпапке Формы папки Справочник контрагентов и выбрать пункт Новый появившегося меню. В открывшемся диалоге важно определить ровно одно свойство (Режим формы), присвоив ему значение «Диалог элемента».&lt;br /&gt;
&lt;br /&gt;
Именно это свойство отвечает за то, что форма будет использоваться в качестве редактора реквизитов элемента &amp;lt;font color=darkblue&amp;gt;Справочника&amp;lt;/font&amp;gt; контрагентов всякий раз, когда пользователь будет добавлять нового контрагента или редактировать реквизиты уже имеющегося. Для собственного удобства целесообразно заполнить поле Имя каким-нибудь осмысленным текстом, например, &amp;lt;font color=darkblue&amp;gt;Редактор реквизитов&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для перехода к художественной, если можно так выразиться, части создания нашего приложения – «рисованию» экранного диалога. Запустите &amp;lt;font color=darkblue&amp;gt;Редактор диалогов&amp;lt;/font&amp;gt;, нажав соответствующую кнопку на вкладке &amp;lt;font color=darkblue&amp;gt;Дизайн&amp;lt;/font&amp;gt; – отобразится пустое окно. Слева от него будет расположена палитра доступных диалоговых элементов (виджетов) – окно &amp;lt;font color=darkblue&amp;gt;Toolbox&amp;lt;/font&amp;gt;. Справа – редактор свойств элементов – окно &amp;lt;font color=darkblue&amp;gt;Property Editor&amp;lt;/font&amp;gt;. Для нашего «натюрморта» будет достаточно использовать ровно три элемента палитры:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;font color=darkblue&amp;gt;Text Label&amp;lt;/font&amp;gt; для подписей к полям ввода (Рис. 5).&lt;br /&gt;
*&amp;lt;font color=darkblue&amp;gt;DBField&amp;lt;/font&amp;gt; для полей ввода (Рис. 6)&lt;br /&gt;
*&amp;lt;font color=darkblue&amp;gt;ActionButton&amp;lt;/font&amp;gt; для кнопок &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt; (Рис. 6)&lt;br /&gt;
&lt;br /&gt;
Для перетаскивания элементов требуется два клика: первый по элементу палитры, второй – по окну диалога. Перетащите пять раз &amp;lt;font color=darkblue&amp;gt;TextLabel&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;DBField&amp;lt;/font&amp;gt;, разместив их по своему вкусу или как показано на '''Рис. 7''', отредактируйте тексты надписей (двойной щелчок будет здесь незаменим) и задайте привязку для полей ввода, выбрав для каждого из них соответствующий реквизит &amp;lt;font color=darkblue&amp;gt;Справочника контрагентов&amp;lt;/font&amp;gt; из списка. Список вызывается двойным щелчком по полю ввода, лежащему в окне диалога. Именно связывание данных (Data bindings), ставшее популярным благодаря таким средам разработки, как Borland Delphi и Visual Basic, и с успехом применяемое в среде разработки платформы Ананас, позволяет нам обойтись при создании CRUD-приложения без написания кода.&lt;br /&gt;
&lt;br /&gt;
После проведения несложной процедуры связывания для всех пяти полей ввода,добавьте в окно диалога кнопки &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt;, использовав для этого элемент &amp;lt;font color=darkblue&amp;gt;ActionButton&amp;lt;/font&amp;gt; палитры. Кнопка &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; должна просто закрывать окно. Кнопка &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt; должна дополнительно сохранять содержимое полей ввода в базе данных.&lt;br /&gt;
&lt;br /&gt;
Поведение кнопки задается в диалоге, вызываемым двойным щелчком по ней. Для кнопки &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; следует поставить галочки опциям &amp;lt;font color=darkblue&amp;gt;Простое действие&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Закрыть диалога&amp;lt;/font&amp;gt;. Для кнопки &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt; следует поставить третью галочку – &amp;lt;font color=darkblue&amp;gt;Обновить&amp;lt;/font&amp;gt;. Для смены текста надписи на кнопке в контекстном меню, вызываемом правой клавишей мыши следует выбрать пункт &amp;lt;font color=darkblue&amp;gt;Edit Text&amp;lt;/font&amp;gt;....&lt;br /&gt;
&lt;br /&gt;
===Сделаем красиво===&lt;br /&gt;
&lt;br /&gt;
В принципе, мы уже закончили – наше приложение будет работать. Но, как всякий уважающий себя кулинар и садовник позаботится о внешнем оформлении своего творения, прежде чем показать его публике, так и программист должен позаботиться о привлекательности создаваемого им приложения. Для придания опрятности нашему диалогу воспользуемся возможностями динамического, автоматически масштабируемого размещения элементов. В этом деле нам помогут &amp;lt;font color=darkblue&amp;gt;«пружинки»&amp;lt;/font&amp;gt; и типы размещения &amp;lt;font color=darkblue&amp;gt;«Сетка»&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;«Горизонтальные полоски»&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;«Вертикальные полоски»&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Начнем с полей ввода и надписей к ним. Разместив вертикально две пружинки, как показано на '''Рис. 8''', и выделив их все, последовательно щелкая мышкой и удерживая клавишу &amp;lt;font color=darkblue&amp;gt;Shift&amp;lt;/font&amp;gt; на клавиатуре, применим тип размещения &amp;lt;font color=darkblue&amp;gt;«Сетка»&amp;lt;/font&amp;gt;. Получим первый блок сгруппированных элементов диалога. Проделайте то же самое с кнопками &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt;, только &amp;lt;font color=darkblue&amp;gt;«пружинки»&amp;lt;/font&amp;gt; выберите горизонтальные, а тип размещения – &amp;lt;font color=darkblue&amp;gt;«Вертикальные полоски»&amp;lt;/font&amp;gt;. Последним шагом необходимо снять выделение, ткнув мышкой в пустую область окна диалога, а затем применить тип размещения &amp;lt;font color=darkblue&amp;gt;«Горизонтальные полоски»&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Не стоит печалиться, если требуемый результат не удастся получить с первого раза. Во-первых, всегда есть возможность отменить последнее действие при помощи клавиатурной комбинации &amp;lt;font color=darkblue&amp;gt;Ctrl+Z&amp;lt;/font&amp;gt;, во-вторых, правила динамического масштабирования определяются, помимо прочего, свойством &amp;lt;font color=darkred&amp;gt;sizePolicy&amp;lt;/font&amp;gt;, индивидуально определяемым для каждого элемента диалога в редакторе свойств &amp;lt;font color=darkblue&amp;gt;Property Editor&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такая работа требует некоторой привычки и терпения первое время. Овладев методикой задания динамического масштабирования и расположения элементов, вы будете тратить на нее минимум времени.&lt;br /&gt;
&lt;br /&gt;
Теперь нашу работу необходимо сохранить и, для проверки – запустить Ананас. &amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; закрывать не требуется. При успешном сохранении в соответствующем окне должны появиться сообщения об успешном обновлении структур базы данных, предназначенных для хранения бизнес-объектов. Если появились ошибки, то скорее всего Ананасу не хватило прав для записи в один из каталогов или не работает доступ к базе данных. Помощь по затруднительным ситуациям доступна на форуме проекта.&lt;br /&gt;
&lt;br /&gt;
===Последний штрих===&lt;br /&gt;
&lt;br /&gt;
А теперь – сюрприз: немного кода все-таки потребуется. Дело в том, что среда исполнения приложений Ананаса не знает, какой экранный диалог нашей бизнес-схемы следует запускать сразу после старта, ведь в нашем приложении могло бы быть несколько экранных форм. Нужен какой-нибудь способ известить Ананас о том, что при старте он должен открыть наш &amp;lt;font color=darkblue&amp;gt;Справочник контрагентов&amp;lt;/font&amp;gt;. Для этого предусмотрена предопределенная функция на Ананас-Скрипте с названием &amp;lt;font color=darkred&amp;gt;on_systemstart()&amp;lt;/font&amp;gt;. Если среда исполнения находит такую функцию в глобальном модуле бизнес-схемы при старте, она будет автоматически запущена на выполнение.&lt;br /&gt;
&lt;br /&gt;
Доступ к глобальному модулю осуществляется через двойной щелчок по корню дерева бизнес-объектов в &amp;lt;font color=darkblue&amp;gt;Дизайнере&amp;lt;/font&amp;gt; и выбор вкладки &amp;lt;font color=darkblue&amp;gt;Глобальный модуль&amp;lt;/font&amp;gt; появившегося диалога.&lt;br /&gt;
&lt;br /&gt;
Вот код, который нужно туда записать:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 function on_systemstart()&lt;br /&gt;
 {&lt;br /&gt;
    sys.Message(0,”Привет, Мир! :)”);&lt;br /&gt;
    cat = new CatalogEditor(“Справочник контрагентов”);&lt;br /&gt;
    cat.edit();&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Да, да! Он все-таки напечатает «Привет, Мир!» :) в окне сообщений ('''Рис. 9''').&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;
Среда разработки Ананас оснащена великолепным WYSIWYG-редактором диалогов, позволяющим в наглядной форме разместить визуальные элементы, такие как надписи, кнопки и поля ввода в окне диалога.&lt;br /&gt;
&lt;br /&gt;
Более того! Диалоги Ананаса являются динамически масштабируемыми, что, во-первых, совершенно необходимо для сохранения опрятного вида диалогов в гетерогенной среде, когда шрифты операционной системы Windows могут существенно отличаться в пропорциях от шрифтов среды X Window операционной системы Linux; во-вторых, создает дополнительные удобства в ситуации, когда пользователь желает растянуть окно диалога, чтобы использовать все разрешение своего экрана, улучшив тем самым отображение информации.&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:%D0%90%D0%BD%D0%B0%D0%BD%D0%B0%D1%81</id>
		<title>LXF98:Ананас</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:%D0%90%D0%BD%D0%B0%D0%BD%D0%B0%D1%81"/>
				<updated>2008-03-21T14:59:34Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Создаем CRUD-приложение==&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;font color=darkred&amp;gt;'''ЧАСТЬ 2'''&amp;lt;/font&amp;gt; Вариации «Hello, World!» набили оскомину – и '''Андрей Паскаль''' будет стараться избежать надоевшего приветствия до последнего, а попутно создаст бизнес-приложение, не написав ни строчки кода!''&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=red&amp;gt;'''Важно! Загрузить изображения...'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Из чего состоит приложение Ананаса? Как начать работу над собственной бизнес-схемой?&lt;br /&gt;
&lt;br /&gt;
В стародавние времена хорошим педагогическим приемом считалось дать в начале учебника пример программы, печатающей на экране приветствие «Hello, World!».&lt;br /&gt;
&lt;br /&gt;
Времена меняются, требования растут, и вот уже новая педагогическая мода диктует необходимость демонстрировать в качестве примера первого приложения не просто команду вывода на экран, а целую готовую программу по редактированию таблицы базы данных. Такая программа должна уметь Создавать, Показывать, Изменять и Удалять данные в таблице БД, поэтому ее принято называть CRUD-приложением, по первым буквам английских слов Create, Retrive, Update, Delete.&lt;br /&gt;
&lt;br /&gt;
Так как Ананас – бизнес-платформа, то и наше первое CRUD-приложение будет редактировать данные о бизнес-партнерах, также называемых иногда контрагентами. Итак, сегодня мы разработаем CRUD-приложение «Справочник контрагентов». Интересно заметить, что среда разработки платформы Ананас позволяет создать CRUD-приложение без какого-либо написания кода, так что я даже не стал бы называть такую деятельность программированием. Скорее это проектирование.&lt;br /&gt;
&lt;br /&gt;
Для каждого контрагента в справочнике будет храниться следующий упрощенный для нашего случая состав реквизитов:&lt;br /&gt;
&lt;br /&gt;
*Наименование;&lt;br /&gt;
*Почтовый адрес;&lt;br /&gt;
*Телефон;&lt;br /&gt;
*E-Mail;&lt;br /&gt;
*Банк.&lt;br /&gt;
&lt;br /&gt;
Разработка бизнес-схем ведется в среде разработки &amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; платформы Ананас ('''Рис. 1'''). После успешного запуска командой&lt;br /&gt;
&lt;br /&gt;
 [app@app ~]$ ananas-designer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; предложит выбрать бизнес-схему для работы из списка, точно так же, как предлагает выбрать бизнес-схему при запуске сам Ананас. Однако, в отличие от Ананаса, &amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; предоставляет доступ к настройке и созданию/модификации структур данных, алгоритмов, а также печатных и экранных форм бизнес-схемы.&lt;br /&gt;
&lt;br /&gt;
Для создания новой бизнес-схемы требуется указать (или создать новую) группу в окне диалога выбора бизнес-схем и активировать пункт Новая бизнес-схема меню Действия.&lt;br /&gt;
&lt;br /&gt;
Открывшийся диалог позволяет задать параметры новой бизнес-схемы. Наиболее важными из них являются параметры доступа к базе данных на SQL-сервере и положение файла бизнес-схемы в файловой системе вашего компьютера. Если вы укажете несуществующую базу данных или несуществующий файл бизнес-схемы, они будут созданы Ананасом автоматически.&lt;br /&gt;
&lt;br /&gt;
На '''Рис. 2''' показан пример заполнения параметров настройки бизнес-схемы для случая использования ''MySQL'' в качестве сервера баз данных.&lt;br /&gt;
&lt;br /&gt;
*'''Имя файла''' ресурса содержит ссылку на файл, в котором хранятся значения всех остальных полей этого диалога. Имеется возможность выбора ранее созданного файла ресурса: для этого достаточно вызвать диалог выбора файла щелчком по кнопке, расположенной справа от поля с именем файла ресурса. При открытии файла ресурса значения всех полей диалога будут заменены значениями из этого файла.&lt;br /&gt;
&lt;br /&gt;
*''Заголовок базы данных''' предназначен для пользователя и отображается в списке доступных для выбора баз данных в диалоге &amp;lt;font color=darkblue&amp;gt;Список бизнес-схем&amp;lt;/font&amp;gt;, появляющемся при старте &amp;lt;font color=darkblue&amp;gt;Дизайнера&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*'''Имя базы данных''' содержит имя базы данных, используемое системой при доступе к серверу базы данных.&lt;br /&gt;
&lt;br /&gt;
*'''Тип сервера базы данных''' позволяет выбрать один из поддерживаемых Ананасом серверов баз данных (''MySQL'', ''PostgreSQL'' или ''SQLite''). Разумеется, следует убедиться, что соответствующий выбираемому вами типу сервер установлен и запущен, так как здесь вы указываете лишь драйвер, который не будет работать, если не установлен соответствующий сервер.&lt;br /&gt;
&lt;br /&gt;
*'''Адрес сервера базы данных''' – это адрес компьютера, на котором установлен сервер выбранного выше типа. Разумеется, сервер баз данных может работать как на том же самом компьютере, где вы установили Ананас, так и на любом другом. Если сервер баз данных запущен локально, здесь следует указать значение &amp;lt;font color=darkred&amp;gt;localhost&amp;lt;/font&amp;gt;. В остальных случаях следует узнать адрес сервера у системного администратора. Адрес может быть задан как DNS-именем (например, '''myhost.com'''), так и числовым значением (например, 127.0.0.1).&lt;br /&gt;
&lt;br /&gt;
*'''Порт сервера базы данных''' по умолчанию не содержит никакого значения. Его следует задавать лишь в тех случаях, когда используется нестандартный порт, что случается достаточно редко. По этому вопросу следует консультироваться с системным администратором, выполнявшим установку сервера баз данных. Если вы выполняли установку сервера баз данных самостоятельно и не меняли порт сервера баз данных, то поле &amp;lt;font color=darkblue&amp;gt;Порт сервера базы данных&amp;lt;/font&amp;gt; следует оставить пустым.&lt;br /&gt;
&lt;br /&gt;
Задав таким образом значения полей, следует нажать кнопку &amp;lt;font color=darkblue&amp;gt;OK&amp;lt;/font&amp;gt;, а затем выбрать только что определенную бизнес-схему и снова нажать &amp;lt;font color=darkblue&amp;gt;OK&amp;lt;/font&amp;gt;. После получения подтверждения о локальном сохранении настроек (в каталоге '''~/.ananas''') откроется главное окно &amp;lt;font color=darkblue&amp;gt;Дизайнера&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наше CRUD-приложение предназначено для управления &amp;lt;font color=darkblue&amp;gt;Справочником контрагентов&amp;lt;/font&amp;gt;, поэтому в дереве бизнес-объектов ('''Рис. 3''') нас в первую очередь будет интересовать раздел &amp;lt;font color=darkblue&amp;gt;Справочники&amp;lt;/font&amp;gt;. Определение справочника начинается с присвоения ему имени, которое в дальнейшем будет использовано в программировании бизнес-логики в процедурах на языке Ананас-Скрипт. В главном окне &amp;lt;font color=darkblue&amp;gt;Дизайнера&amp;lt;/font&amp;gt; щелкните правой клавишей мыши по разделу &amp;lt;font color=darkblue&amp;gt;Справочники&amp;lt;/font&amp;gt; и в появившемся меню выберите пункт &amp;lt;font color=darkblue&amp;gt;Новый&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В появившемся экранном диалоге закладка &amp;lt;font color=darkblue&amp;gt;Общий&amp;lt;/font&amp;gt; позволяет задать имя справочника и заполнить поле &amp;lt;font color=darkblue&amp;gt;Описание&amp;lt;/font&amp;gt;. На данном этапе в этом диалоге больше ничего изменять не требуется. Следует закрыть его и перейти к определению реквизитов &amp;lt;font color=darkblue&amp;gt;Справочника контрагентов&amp;lt;/font&amp;gt;. Разумеется, среда разработки Ананас позволяет организовать древовидную структуру справочника. Однако, желающих изучить эту тему я адресую к «Справочному руководству по Дизайнеру» Ананаса, а для нашего простого CRUD-приложения древовидная структура в Справочнике контрагентов нам не нужна.&lt;br /&gt;
&lt;br /&gt;
Как только вы закроете диалог, где было задано имя справочника, в дереве бизнес-схемы появится папка с именем Справочник контрагентов, внутри которой видны папки &amp;lt;font color=darkblue&amp;gt;Элемент&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Группа&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Формы&amp;lt;/font&amp;gt;. Для определения первого реквизита справочника следует щелкнуть правой кнопкой мыши по папке &amp;lt;font color=darkblue&amp;gt;Элемент&amp;lt;/font&amp;gt; и выбрать пункт &amp;lt;font color=darkblue&amp;gt;Новый&amp;lt;/font&amp;gt; появившегося меню. В открывшимся диалоге необходимо задать такие свойства реквизита, как &amp;lt;font color=darkblue&amp;gt;Имя&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Тип&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Ширина&amp;lt;/font&amp;gt; ('''Рис. 4'''). Прочие свойства задавать&lt;br /&gt;
не обязательно, их назначение описано в «Справочном руководстве по Дизайнеру». Закрыв диалог, следует повторить действия снова для определения второго, третьего и т.д. реквизитов справочника.&lt;br /&gt;
&lt;br /&gt;
===Диалог с пользователем===&lt;br /&gt;
&lt;br /&gt;
Задав реквизиты &amp;lt;font color=darkblue&amp;gt;Справочника&amp;lt;/font&amp;gt; контрагентов, мы спроектировали структуру данных и подготовили место для их хранения. Теперь необходимо нарисовать экранный диалог для изменения сведений. Для этого следует щелкнуть правой клавишей мыши по подпапке Формы папки Справочник контрагентов и выбрать пункт Новый появившегося меню. В открывшемся диалоге важно определить ровно одно свойство (Режим формы), присвоив ему значение «Диалог элемента».&lt;br /&gt;
&lt;br /&gt;
Именно это свойство отвечает за то, что форма будет использоваться в качестве редактора реквизитов элемента &amp;lt;font color=darkblue&amp;gt;Справочника&amp;lt;/font&amp;gt; контрагентов всякий раз, когда пользователь будет добавлять нового контрагента или редактировать реквизиты уже имеющегося. Для собственного удобства целесообразно заполнить поле Имя каким-нибудь осмысленным текстом, например, &amp;lt;font color=darkblue&amp;gt;Редактор реквизитов&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для перехода к художественной, если можно так выразиться, части создания нашего приложения – «рисованию» экранного диалога. Запустите &amp;lt;font color=darkblue&amp;gt;Редактор диалогов&amp;lt;/font&amp;gt;, нажав соответствующую кнопку на вкладке &amp;lt;font color=darkblue&amp;gt;Дизайн&amp;lt;/font&amp;gt; – отобразится пустое окно. Слева от него будет расположена палитра доступных диалоговых элементов (виджетов) – окно &amp;lt;font color=darkblue&amp;gt;Toolbox&amp;lt;/font&amp;gt;. Справа – редактор свойств элементов – окно &amp;lt;font color=darkblue&amp;gt;Property Editor&amp;lt;/font&amp;gt;. Для нашего «натюрморта» будет достаточно использовать ровно три элемента палитры:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;font color=darkblue&amp;gt;Text Label&amp;lt;/font&amp;gt; для подписей к полям ввода (Рис. 5).&lt;br /&gt;
*&amp;lt;font color=darkblue&amp;gt;DBField&amp;lt;/font&amp;gt; для полей ввода (Рис. 6)&lt;br /&gt;
*&amp;lt;font color=darkblue&amp;gt;ActionButton&amp;lt;/font&amp;gt; для кнопок &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt; (Рис. 6)&lt;br /&gt;
&lt;br /&gt;
Для перетаскивания элементов требуется два клика: первый по элементу палитры, второй – по окну диалога. Перетащите пять раз &amp;lt;font color=darkblue&amp;gt;TextLabel&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;DBField&amp;lt;/font&amp;gt;, разместив их по своему вкусу или как показано на '''Рис. 7''', отредактируйте тексты надписей (двойной щелчок будет здесь незаменим) и задайте привязку для полей ввода, выбрав для каждого из них соответствующий реквизит &amp;lt;font color=darkblue&amp;gt;Справочника контрагентов&amp;lt;/font&amp;gt; из списка. Список вызывается двойным щелчком по полю ввода, лежащему в окне диалога. Именно связывание данных (Data bindings), ставшее популярным благодаря таким средам разработки, как Borland Delphi и Visual Basic, и с успехом применяемое в среде разработки платформы Ананас, позволяет нам обойтись при создании CRUD-приложения без написания кода.&lt;br /&gt;
&lt;br /&gt;
После проведения несложной процедуры связывания для всех пяти полей ввода,добавьте в окно диалога кнопки &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt;, использовав для этого элемент &amp;lt;font color=darkblue&amp;gt;ActionButton&amp;lt;/font&amp;gt; палитры. Кнопка &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; должна просто закрывать окно. Кнопка &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt; должна дополнительно сохранять содержимое полей ввода в базе данных.&lt;br /&gt;
&lt;br /&gt;
Поведение кнопки задается в диалоге, вызываемым двойным щелчком по ней. Для кнопки &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; следует поставить галочки опциям &amp;lt;font color=darkblue&amp;gt;Простое действие&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Закрыть диалога&amp;lt;/font&amp;gt;. Для кнопки &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt; следует поставить третью галочку – &amp;lt;font color=darkblue&amp;gt;Обновить&amp;lt;/font&amp;gt;. Для смены текста надписи на кнопке в контекстном меню, вызываемом правой клавишей мыши следует выбрать пункт &amp;lt;font color=darkblue&amp;gt;Edit Text&amp;lt;/font&amp;gt;....&lt;br /&gt;
&lt;br /&gt;
===Сделаем красиво===&lt;br /&gt;
&lt;br /&gt;
В принципе, мы уже закончили – наше приложение будет работать. Но, как всякий уважающий себя кулинар и садовник позаботится о внешнем оформлении своего творения, прежде чем показать его публике, так и программист должен позаботиться о привлекательности создаваемого им приложения. Для придания опрятности нашему диалогу воспользуемся возможностями динамического, автоматически масштабируемого размещения элементов. В этом деле нам помогут &amp;lt;font color=darkblue&amp;gt;«пружинки»&amp;lt;/font&amp;gt; и типы размещения &amp;lt;font color=darkblue&amp;gt;«Сетка»&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;«Горизонтальные полоски»&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;«Вертикальные полоски»&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Начнем с полей ввода и надписей к ним. Разместив вертикально две пружинки, как показано на '''Рис. 8''', и выделив их все, последовательно щелкая мышкой и удерживая клавишу &amp;lt;font color=darkblue&amp;gt;Shift&amp;lt;/font&amp;gt; на клавиатуре, применим тип размещения &amp;lt;font color=darkblue&amp;gt;«Сетка»&amp;lt;/font&amp;gt;. Получим первый блок сгруппированных элементов диалога. Проделайте то же самое с кнопками &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt;, только &amp;lt;font color=darkblue&amp;gt;«пружинки»&amp;lt;/font&amp;gt; выберите горизонтальные, а тип размещения – &amp;lt;font color=darkblue&amp;gt;«Вертикальные полоски»&amp;lt;/font&amp;gt;. Последним шагом необходимо снять выделение, ткнув мышкой в пустую область окна диалога, а затем применить тип размещения &amp;lt;font color=darkblue&amp;gt;«Горизонтальные полоски»&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Не стоит печалиться, если требуемый результат не удастся получить с первого раза. Во-первых, всегда есть возможность отменить последнее действие при помощи клавиатурной комбинации &amp;lt;font color=darkblue&amp;gt;Ctrl+Z&amp;lt;/font&amp;gt;, во-вторых, правила динамического масштабирования определяются, помимо прочего, свойством &amp;lt;font color=darkred&amp;gt;sizePolicy&amp;lt;/font&amp;gt;, индивидуально определяемым для каждого элемента диалога в редакторе свойств &amp;lt;font color=darkblue&amp;gt;Property Editor&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такая работа требует некоторой привычки и терпения первое время. Овладев методикой задания динамического масштабирования и расположения элементов, вы будете тратить на нее минимум времени.&lt;br /&gt;
&lt;br /&gt;
Теперь нашу работу необходимо сохранить и, для проверки – запустить Ананас. &amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; закрывать не требуется. При успешном сохранении в соответствующем окне должны появиться сообщения об успешном обновлении структур базы данных, предназначенных для хранения бизнес-объектов. Если появились ошибки, то скорее всего Ананасу не хватило прав для записи в один из каталогов или не работает доступ к базе данных. Помощь по затруднительным ситуациям доступна на форуме проекта.&lt;br /&gt;
&lt;br /&gt;
===Последний штрих===&lt;br /&gt;
&lt;br /&gt;
А теперь – сюрприз: немного кода все-таки потребуется. Дело в том, что среда исполнения приложений Ананаса не знает, какой экранный диалог нашей бизнес-схемы следует запускать сразу после старта, ведь в нашем приложении могло бы быть несколько экранных форм. Нужен какой-нибудь способ известить Ананас о том, что при старте он должен открыть наш &amp;lt;font color=darkblue&amp;gt;Справочник контрагентов&amp;lt;/font&amp;gt;. Для этого предусмотрена предопределенная функция на Ананас-Скрипте с названием &amp;lt;font color=darkred&amp;gt;on_systemstart()&amp;lt;/font&amp;gt;. Если среда исполнения находит такую функцию в глобальном модуле бизнес-схемы при старте, она будет автоматически запущена на выполнение.&lt;br /&gt;
&lt;br /&gt;
Доступ к глобальному модулю осуществляется через двойной щелчок по корню дерева бизнес-объектов в &amp;lt;font color=darkblue&amp;gt;Дизайнере&amp;lt;/font&amp;gt; и выбор вкладки &amp;lt;font color=darkblue&amp;gt;Глобальный модуль&amp;lt;/font&amp;gt; появившегося диалога.&lt;br /&gt;
&lt;br /&gt;
Вот код, который нужно туда записать:&lt;br /&gt;
&lt;br /&gt;
 function on_systemstart()&lt;br /&gt;
 {&lt;br /&gt;
    sys.Message(0,”Привет, Мир! :)”);&lt;br /&gt;
    cat = new CatalogEditor(“Справочник контрагентов”);&lt;br /&gt;
    cat.edit();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Да, да! Он все-таки напечатает «Привет, Мир!» :) в окне сообщений ('''Рис. 9''').&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;
Среда разработки Ананас оснащена великолепным WYSIWYG-редактором диалогов, позволяющим в наглядной форме разместить визуальные элементы, такие как надписи, кнопки и поля ввода в окне диалога.&lt;br /&gt;
&lt;br /&gt;
Более того! Диалоги Ананаса являются динамически масштабируемыми, что, во-первых, совершенно необходимо для сохранения опрятного вида диалогов в гетерогенной среде, когда шрифты операционной системы Windows могут существенно отличаться в пропорциях от шрифтов среды X Window операционной системы Linux; во-вторых, создает дополнительные удобства в ситуации, когда пользователь желает растянуть окно диалога, чтобы использовать все разрешение своего экрана, улучшив тем самым отображение информации.&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:%D0%90%D0%BD%D0%B0%D0%BD%D0%B0%D1%81</id>
		<title>LXF98:Ананас</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:%D0%90%D0%BD%D0%B0%D0%BD%D0%B0%D1%81"/>
				<updated>2008-03-21T14:59:09Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Создаем CRUD-приложение==&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;font color=darkred&amp;gt;'''ЧАСТЬ 2'''&amp;lt;/font&amp;gt; Вариации «Hello, World!» набили оскомину – и '''Андрей Паскаль''' будет стараться избежать надоевшего приветствия до последнего, а попутно создаст бизнес-приложение, не написав ни строчки кода!''&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;
В стародавние времена хорошим педагогическим приемом считалось дать в начале учебника пример программы, печатающей на экране приветствие «Hello, World!».&lt;br /&gt;
&lt;br /&gt;
Времена меняются, требования растут, и вот уже новая педагогическая мода диктует необходимость демонстрировать в качестве примера первого приложения не просто команду вывода на экран, а целую готовую программу по редактированию таблицы базы данных. Такая программа должна уметь Создавать, Показывать, Изменять и Удалять данные в таблице БД, поэтому ее принято называть CRUD-приложением, по первым буквам английских слов Create, Retrive, Update, Delete.&lt;br /&gt;
&lt;br /&gt;
Так как Ананас – бизнес-платформа, то и наше первое CRUD-приложение будет редактировать данные о бизнес-партнерах, также называемых иногда контрагентами. Итак, сегодня мы разработаем CRUD-приложение «Справочник контрагентов». Интересно заметить, что среда разработки платформы Ананас позволяет создать CRUD-приложение без какого-либо написания кода, так что я даже не стал бы называть такую деятельность программированием. Скорее это проектирование.&lt;br /&gt;
&lt;br /&gt;
Для каждого контрагента в справочнике будет храниться следующий упрощенный для нашего случая состав реквизитов:&lt;br /&gt;
&lt;br /&gt;
*Наименование;&lt;br /&gt;
*Почтовый адрес;&lt;br /&gt;
*Телефон;&lt;br /&gt;
*E-Mail;&lt;br /&gt;
*Банк.&lt;br /&gt;
&lt;br /&gt;
Разработка бизнес-схем ведется в среде разработки &amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; платформы Ананас ('''Рис. 1'''). После успешного запуска командой&lt;br /&gt;
&lt;br /&gt;
 [app@app ~]$ ananas-designer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; предложит выбрать бизнес-схему для работы из списка, точно так же, как предлагает выбрать бизнес-схему при запуске сам Ананас. Однако, в отличие от Ананаса, &amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; предоставляет доступ к настройке и созданию/модификации структур данных, алгоритмов, а также печатных и экранных форм бизнес-схемы.&lt;br /&gt;
&lt;br /&gt;
Для создания новой бизнес-схемы требуется указать (или создать новую) группу в окне диалога выбора бизнес-схем и активировать пункт Новая бизнес-схема меню Действия.&lt;br /&gt;
&lt;br /&gt;
Открывшийся диалог позволяет задать параметры новой бизнес-схемы. Наиболее важными из них являются параметры доступа к базе данных на SQL-сервере и положение файла бизнес-схемы в файловой системе вашего компьютера. Если вы укажете несуществующую базу данных или несуществующий файл бизнес-схемы, они будут созданы Ананасом автоматически.&lt;br /&gt;
&lt;br /&gt;
На '''Рис. 2''' показан пример заполнения параметров настройки бизнес-схемы для случая использования ''MySQL'' в качестве сервера баз данных.&lt;br /&gt;
&lt;br /&gt;
*'''Имя файла''' ресурса содержит ссылку на файл, в котором хранятся значения всех остальных полей этого диалога. Имеется возможность выбора ранее созданного файла ресурса: для этого достаточно вызвать диалог выбора файла щелчком по кнопке, расположенной справа от поля с именем файла ресурса. При открытии файла ресурса значения всех полей диалога будут заменены значениями из этого файла.&lt;br /&gt;
&lt;br /&gt;
*''Заголовок базы данных''' предназначен для пользователя и отображается в списке доступных для выбора баз данных в диалоге &amp;lt;font color=darkblue&amp;gt;Список бизнес-схем&amp;lt;/font&amp;gt;, появляющемся при старте &amp;lt;font color=darkblue&amp;gt;Дизайнера&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*'''Имя базы данных''' содержит имя базы данных, используемое системой при доступе к серверу базы данных.&lt;br /&gt;
&lt;br /&gt;
*'''Тип сервера базы данных''' позволяет выбрать один из поддерживаемых Ананасом серверов баз данных (''MySQL'', ''PostgreSQL'' или ''SQLite''). Разумеется, следует убедиться, что соответствующий выбираемому вами типу сервер установлен и запущен, так как здесь вы указываете лишь драйвер, который не будет работать, если не установлен соответствующий сервер.&lt;br /&gt;
&lt;br /&gt;
*'''Адрес сервера базы данных''' – это адрес компьютера, на котором установлен сервер выбранного выше типа. Разумеется, сервер баз данных может работать как на том же самом компьютере, где вы установили Ананас, так и на любом другом. Если сервер баз данных запущен локально, здесь следует указать значение &amp;lt;font color=darkred&amp;gt;localhost&amp;lt;/font&amp;gt;. В остальных случаях следует узнать адрес сервера у системного администратора. Адрес может быть задан как DNS-именем (например, '''myhost.com'''), так и числовым значением (например, 127.0.0.1).&lt;br /&gt;
&lt;br /&gt;
*'''Порт сервера базы данных''' по умолчанию не содержит никакого значения. Его следует задавать лишь в тех случаях, когда используется нестандартный порт, что случается достаточно редко. По этому вопросу следует консультироваться с системным администратором, выполнявшим установку сервера баз данных. Если вы выполняли установку сервера баз данных самостоятельно и не меняли порт сервера баз данных, то поле &amp;lt;font color=darkblue&amp;gt;Порт сервера базы данных&amp;lt;/font&amp;gt; следует оставить пустым.&lt;br /&gt;
&lt;br /&gt;
Задав таким образом значения полей, следует нажать кнопку &amp;lt;font color=darkblue&amp;gt;OK&amp;lt;/font&amp;gt;, а затем выбрать только что определенную бизнес-схему и снова нажать &amp;lt;font color=darkblue&amp;gt;OK&amp;lt;/font&amp;gt;. После получения подтверждения о локальном сохранении настроек (в каталоге '''~/.ananas''') откроется главное окно &amp;lt;font color=darkblue&amp;gt;Дизайнера&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наше CRUD-приложение предназначено для управления &amp;lt;font color=darkblue&amp;gt;Справочником контрагентов&amp;lt;/font&amp;gt;, поэтому в дереве бизнес-объектов ('''Рис. 3''') нас в первую очередь будет интересовать раздел &amp;lt;font color=darkblue&amp;gt;Справочники&amp;lt;/font&amp;gt;. Определение справочника начинается с присвоения ему имени, которое в дальнейшем будет использовано в программировании бизнес-логики в процедурах на языке Ананас-Скрипт. В главном окне &amp;lt;font color=darkblue&amp;gt;Дизайнера&amp;lt;/font&amp;gt; щелкните правой клавишей мыши по разделу &amp;lt;font color=darkblue&amp;gt;Справочники&amp;lt;/font&amp;gt; и в появившемся меню выберите пункт &amp;lt;font color=darkblue&amp;gt;Новый&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В появившемся экранном диалоге закладка &amp;lt;font color=darkblue&amp;gt;Общий&amp;lt;/font&amp;gt; позволяет задать имя справочника и заполнить поле &amp;lt;font color=darkblue&amp;gt;Описание&amp;lt;/font&amp;gt;. На данном этапе в этом диалоге больше ничего изменять не требуется. Следует закрыть его и перейти к определению реквизитов &amp;lt;font color=darkblue&amp;gt;Справочника контрагентов&amp;lt;/font&amp;gt;. Разумеется, среда разработки Ананас позволяет организовать древовидную структуру справочника. Однако, желающих изучить эту тему я адресую к «Справочному руководству по Дизайнеру» Ананаса, а для нашего простого CRUD-приложения древовидная структура в Справочнике контрагентов нам не нужна.&lt;br /&gt;
&lt;br /&gt;
Как только вы закроете диалог, где было задано имя справочника, в дереве бизнес-схемы появится папка с именем Справочник контрагентов, внутри которой видны папки &amp;lt;font color=darkblue&amp;gt;Элемент&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Группа&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Формы&amp;lt;/font&amp;gt;. Для определения первого реквизита справочника следует щелкнуть правой кнопкой мыши по папке &amp;lt;font color=darkblue&amp;gt;Элемент&amp;lt;/font&amp;gt; и выбрать пункт &amp;lt;font color=darkblue&amp;gt;Новый&amp;lt;/font&amp;gt; появившегося меню. В открывшимся диалоге необходимо задать такие свойства реквизита, как &amp;lt;font color=darkblue&amp;gt;Имя&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Тип&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Ширина&amp;lt;/font&amp;gt; ('''Рис. 4'''). Прочие свойства задавать&lt;br /&gt;
не обязательно, их назначение описано в «Справочном руководстве по Дизайнеру». Закрыв диалог, следует повторить действия снова для определения второго, третьего и т.д. реквизитов справочника.&lt;br /&gt;
&lt;br /&gt;
===Диалог с пользователем===&lt;br /&gt;
&lt;br /&gt;
Задав реквизиты &amp;lt;font color=darkblue&amp;gt;Справочника&amp;lt;/font&amp;gt; контрагентов, мы спроектировали структуру данных и подготовили место для их хранения. Теперь необходимо нарисовать экранный диалог для изменения сведений. Для этого следует щелкнуть правой клавишей мыши по подпапке Формы папки Справочник контрагентов и выбрать пункт Новый появившегося меню. В открывшемся диалоге важно определить ровно одно свойство (Режим формы), присвоив ему значение «Диалог элемента».&lt;br /&gt;
&lt;br /&gt;
Именно это свойство отвечает за то, что форма будет использоваться в качестве редактора реквизитов элемента &amp;lt;font color=darkblue&amp;gt;Справочника&amp;lt;/font&amp;gt; контрагентов всякий раз, когда пользователь будет добавлять нового контрагента или редактировать реквизиты уже имеющегося. Для собственного удобства целесообразно заполнить поле Имя каким-нибудь осмысленным текстом, например, &amp;lt;font color=darkblue&amp;gt;Редактор реквизитов&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для перехода к художественной, если можно так выразиться, части создания нашего приложения – «рисованию» экранного диалога. Запустите &amp;lt;font color=darkblue&amp;gt;Редактор диалогов&amp;lt;/font&amp;gt;, нажав соответствующую кнопку на вкладке &amp;lt;font color=darkblue&amp;gt;Дизайн&amp;lt;/font&amp;gt; – отобразится пустое окно. Слева от него будет расположена палитра доступных диалоговых элементов (виджетов) – окно &amp;lt;font color=darkblue&amp;gt;Toolbox&amp;lt;/font&amp;gt;. Справа – редактор свойств элементов – окно &amp;lt;font color=darkblue&amp;gt;Property Editor&amp;lt;/font&amp;gt;. Для нашего «натюрморта» будет достаточно использовать ровно три элемента палитры:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;font color=darkblue&amp;gt;Text Label&amp;lt;/font&amp;gt; для подписей к полям ввода (Рис. 5).&lt;br /&gt;
*&amp;lt;font color=darkblue&amp;gt;DBField&amp;lt;/font&amp;gt; для полей ввода (Рис. 6)&lt;br /&gt;
*&amp;lt;font color=darkblue&amp;gt;ActionButton&amp;lt;/font&amp;gt; для кнопок &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt; (Рис. 6)&lt;br /&gt;
&lt;br /&gt;
Для перетаскивания элементов требуется два клика: первый по элементу палитры, второй – по окну диалога. Перетащите пять раз &amp;lt;font color=darkblue&amp;gt;TextLabel&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;DBField&amp;lt;/font&amp;gt;, разместив их по своему вкусу или как показано на '''Рис. 7''', отредактируйте тексты надписей (двойной щелчок будет здесь незаменим) и задайте привязку для полей ввода, выбрав для каждого из них соответствующий реквизит &amp;lt;font color=darkblue&amp;gt;Справочника контрагентов&amp;lt;/font&amp;gt; из списка. Список вызывается двойным щелчком по полю ввода, лежащему в окне диалога. Именно связывание данных (Data bindings), ставшее популярным благодаря таким средам разработки, как Borland Delphi и Visual Basic, и с успехом применяемое в среде разработки платформы Ананас, позволяет нам обойтись при создании CRUD-приложения без написания кода.&lt;br /&gt;
&lt;br /&gt;
После проведения несложной процедуры связывания для всех пяти полей ввода,добавьте в окно диалога кнопки &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt;, использовав для этого элемент &amp;lt;font color=darkblue&amp;gt;ActionButton&amp;lt;/font&amp;gt; палитры. Кнопка &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; должна просто закрывать окно. Кнопка &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt; должна дополнительно сохранять содержимое полей ввода в базе данных.&lt;br /&gt;
&lt;br /&gt;
Поведение кнопки задается в диалоге, вызываемым двойным щелчком по ней. Для кнопки &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; следует поставить галочки опциям &amp;lt;font color=darkblue&amp;gt;Простое действие&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Закрыть диалога&amp;lt;/font&amp;gt;. Для кнопки &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt; следует поставить третью галочку – &amp;lt;font color=darkblue&amp;gt;Обновить&amp;lt;/font&amp;gt;. Для смены текста надписи на кнопке в контекстном меню, вызываемом правой клавишей мыши следует выбрать пункт &amp;lt;font color=darkblue&amp;gt;Edit Text&amp;lt;/font&amp;gt;....&lt;br /&gt;
&lt;br /&gt;
===Сделаем красиво===&lt;br /&gt;
&lt;br /&gt;
В принципе, мы уже закончили – наше приложение будет работать. Но, как всякий уважающий себя кулинар и садовник позаботится о внешнем оформлении своего творения, прежде чем показать его публике, так и программист должен позаботиться о привлекательности создаваемого им приложения. Для придания опрятности нашему диалогу воспользуемся возможностями динамического, автоматически масштабируемого размещения элементов. В этом деле нам помогут &amp;lt;font color=darkblue&amp;gt;«пружинки»&amp;lt;/font&amp;gt; и типы размещения &amp;lt;font color=darkblue&amp;gt;«Сетка»&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;«Горизонтальные полоски»&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;«Вертикальные полоски»&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Начнем с полей ввода и надписей к ним. Разместив вертикально две пружинки, как показано на '''Рис. 8''', и выделив их все, последовательно щелкая мышкой и удерживая клавишу &amp;lt;font color=darkblue&amp;gt;Shift&amp;lt;/font&amp;gt; на клавиатуре, применим тип размещения &amp;lt;font color=darkblue&amp;gt;«Сетка»&amp;lt;/font&amp;gt;. Получим первый блок сгруппированных элементов диалога. Проделайте то же самое с кнопками &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt;, только &amp;lt;font color=darkblue&amp;gt;«пружинки»&amp;lt;/font&amp;gt; выберите горизонтальные, а тип размещения – &amp;lt;font color=darkblue&amp;gt;«Вертикальные полоски»&amp;lt;/font&amp;gt;. Последним шагом необходимо снять выделение, ткнув мышкой в пустую область окна диалога, а затем применить тип размещения &amp;lt;font color=darkblue&amp;gt;«Горизонтальные полоски»&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Не стоит печалиться, если требуемый результат не удастся получить с первого раза. Во-первых, всегда есть возможность отменить последнее действие при помощи клавиатурной комбинации &amp;lt;font color=darkblue&amp;gt;Ctrl+Z&amp;lt;/font&amp;gt;, во-вторых, правила динамического масштабирования определяются, помимо прочего, свойством &amp;lt;font color=darkred&amp;gt;sizePolicy&amp;lt;/font&amp;gt;, индивидуально определяемым для каждого элемента диалога в редакторе свойств &amp;lt;font color=darkblue&amp;gt;Property Editor&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такая работа требует некоторой привычки и терпения первое время. Овладев методикой задания динамического масштабирования и расположения элементов, вы будете тратить на нее минимум времени.&lt;br /&gt;
&lt;br /&gt;
Теперь нашу работу необходимо сохранить и, для проверки – запустить Ананас. &amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; закрывать не требуется. При успешном сохранении в соответствующем окне должны появиться сообщения об успешном обновлении структур базы данных, предназначенных для хранения бизнес-объектов. Если появились ошибки, то скорее всего Ананасу не хватило прав для записи в один из каталогов или не работает доступ к базе данных. Помощь по затруднительным ситуациям доступна на форуме проекта.&lt;br /&gt;
&lt;br /&gt;
===Последний штрих===&lt;br /&gt;
&lt;br /&gt;
А теперь – сюрприз: немного кода все-таки потребуется. Дело в том, что среда исполнения приложений Ананаса не знает, какой экранный диалог нашей бизнес-схемы следует запускать сразу после старта, ведь в нашем приложении могло бы быть несколько экранных форм. Нужен какой-нибудь способ известить Ананас о том, что при старте он должен открыть наш &amp;lt;font color=darkblue&amp;gt;Справочник контрагентов&amp;lt;/font&amp;gt;. Для этого предусмотрена предопределенная функция на Ананас-Скрипте с названием &amp;lt;font color=darkred&amp;gt;on_systemstart()&amp;lt;/font&amp;gt;. Если среда исполнения находит такую функцию в глобальном модуле бизнес-схемы при старте, она будет автоматически запущена на выполнение.&lt;br /&gt;
&lt;br /&gt;
Доступ к глобальному модулю осуществляется через двойной щелчок по корню дерева бизнес-объектов в &amp;lt;font color=darkblue&amp;gt;Дизайнере&amp;lt;/font&amp;gt; и выбор вкладки &amp;lt;font color=darkblue&amp;gt;Глобальный модуль&amp;lt;/font&amp;gt; появившегося диалога.&lt;br /&gt;
&lt;br /&gt;
Вот код, который нужно туда записать:&lt;br /&gt;
&lt;br /&gt;
 function on_systemstart()&lt;br /&gt;
 {&lt;br /&gt;
    sys.Message(0,”Привет, Мир! :)”);&lt;br /&gt;
    cat = new CatalogEditor(“Справочник контрагентов”);&lt;br /&gt;
    cat.edit();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Да, да! Он все-таки напечатает «Привет, Мир!» :) в окне сообщений ('''Рис. 9''').&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;
Среда разработки Ананас оснащена великолепным WYSIWYG-редактором диалогов, позволяющим в наглядной форме разместить визуальные элементы, такие как надписи, кнопки и поля ввода в окне диалога.&lt;br /&gt;
&lt;br /&gt;
Более того! Диалоги Ананаса являются динамически масштабируемыми, что, во-первых, совершенно необходимо для сохранения опрятного вида диалогов в гетерогенной среде, когда шрифты операционной системы Windows могут существенно отличаться в пропорциях от шрифтов среды X Window операционной системы Linux; во-вторых, создает дополнительные удобства в ситуации, когда пользователь желает растянуть окно диалога, чтобы использовать все разрешение своего экрана, улучшив тем самым отображение информации.&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:%D0%90%D0%BD%D0%B0%D0%BD%D0%B0%D1%81</id>
		<title>LXF98:Ананас</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:%D0%90%D0%BD%D0%B0%D0%BD%D0%B0%D1%81"/>
				<updated>2008-03-21T14:58:45Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Создаем CRUD-приложение==&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;font color=darkred&amp;gt;'''ЧАСТЬ 2'''&amp;lt;/font&amp;gt; Вариации «Hello, World!» набили оскомину – и '''Андрей Паскаль''' будет стараться избежать надоевшего приветствия до последнего, а попутно создаст бизнес-приложение, не написав ни строчки кода!''&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;
В стародавние времена хорошим педагогическим приемом считалось дать в начале учебника пример программы, печатающей на экране приветствие «Hello, World!».&lt;br /&gt;
&lt;br /&gt;
Времена меняются, требования растут, и вот уже новая педагогическая мода диктует необходимость демонстрировать в качестве примера первого приложения не просто команду вывода на экран, а целую готовую программу по редактированию таблицы базы данных. Такая программа должна уметь Создавать, Показывать, Изменять и Удалять данные в таблице БД, поэтому ее принято называть CRUD-приложением, по первым буквам английских слов Create, Retrive, Update, Delete.&lt;br /&gt;
&lt;br /&gt;
Так как Ананас – бизнес-платформа, то и наше первое CRUD-приложение будет редактировать данные о бизнес-партнерах, также называемых иногда контрагентами. Итак, сегодня мы разработаем CRUD-приложение «Справочник контрагентов». Интересно заметить, что среда разработки платформы Ананас позволяет создать CRUD-приложение без какого-либо написания кода, так что я даже не стал бы называть такую деятельность программированием. Скорее это проектирование.&lt;br /&gt;
&lt;br /&gt;
Для каждого контрагента в справочнике будет храниться следующий упрощенный для нашего случая состав реквизитов:&lt;br /&gt;
&lt;br /&gt;
*Наименование;&lt;br /&gt;
*Почтовый адрес;&lt;br /&gt;
*Телефон;&lt;br /&gt;
*E-Mail;&lt;br /&gt;
*Банк.&lt;br /&gt;
&lt;br /&gt;
Разработка бизнес-схем ведется в среде разработки &amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; платформы Ананас ('''Рис. 1'''). После успешного запуска командой&lt;br /&gt;
&lt;br /&gt;
 [app@app ~]$ ananas-designer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; предложит выбрать бизнес-схему для работы из списка, точно так же, как предлагает выбрать бизнес-схему при запуске сам Ананас. Однако, в отличие от Ананаса, &amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; предоставляет доступ к настройке и созданию/модификации структур данных, алгоритмов, а также печатных и экранных форм бизнес-схемы.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:Img_89_71_1.jpg|thumb|right|200px|Графический интерфейс на Ncurses скучноват, зато функционален и не требует X.]]&lt;br /&gt;
&lt;br /&gt;
Для создания новой бизнес-схемы требуется указать (или создать новую) группу в окне диалога выбора бизнес-схем и активировать пункт Новая бизнес-схема меню Действия.&lt;br /&gt;
&lt;br /&gt;
Открывшийся диалог позволяет задать параметры новой бизнес-схемы. Наиболее важными из них являются параметры доступа к базе данных на SQL-сервере и положение файла бизнес-схемы в файловой системе вашего компьютера. Если вы укажете несуществующую базу данных или несуществующий файл бизнес-схемы, они будут созданы Ананасом автоматически.&lt;br /&gt;
&lt;br /&gt;
На '''Рис. 2''' показан пример заполнения параметров настройки бизнес-схемы для случая использования ''MySQL'' в качестве сервера баз данных.&lt;br /&gt;
&lt;br /&gt;
*'''Имя файла''' ресурса содержит ссылку на файл, в котором хранятся значения всех остальных полей этого диалога. Имеется возможность выбора ранее созданного файла ресурса: для этого достаточно вызвать диалог выбора файла щелчком по кнопке, расположенной справа от поля с именем файла ресурса. При открытии файла ресурса значения всех полей диалога будут заменены значениями из этого файла.&lt;br /&gt;
&lt;br /&gt;
*''Заголовок базы данных''' предназначен для пользователя и отображается в списке доступных для выбора баз данных в диалоге &amp;lt;font color=darkblue&amp;gt;Список бизнес-схем&amp;lt;/font&amp;gt;, появляющемся при старте &amp;lt;font color=darkblue&amp;gt;Дизайнера&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*'''Имя базы данных''' содержит имя базы данных, используемое системой при доступе к серверу базы данных.&lt;br /&gt;
&lt;br /&gt;
*'''Тип сервера базы данных''' позволяет выбрать один из поддерживаемых Ананасом серверов баз данных (''MySQL'', ''PostgreSQL'' или ''SQLite''). Разумеется, следует убедиться, что соответствующий выбираемому вами типу сервер установлен и запущен, так как здесь вы указываете лишь драйвер, который не будет работать, если не установлен соответствующий сервер.&lt;br /&gt;
&lt;br /&gt;
*'''Адрес сервера базы данных''' – это адрес компьютера, на котором установлен сервер выбранного выше типа. Разумеется, сервер баз данных может работать как на том же самом компьютере, где вы установили Ананас, так и на любом другом. Если сервер баз данных запущен локально, здесь следует указать значение &amp;lt;font color=darkred&amp;gt;localhost&amp;lt;/font&amp;gt;. В остальных случаях следует узнать адрес сервера у системного администратора. Адрес может быть задан как DNS-именем (например, '''myhost.com'''), так и числовым значением (например, 127.0.0.1).&lt;br /&gt;
&lt;br /&gt;
*'''Порт сервера базы данных''' по умолчанию не содержит никакого значения. Его следует задавать лишь в тех случаях, когда используется нестандартный порт, что случается достаточно редко. По этому вопросу следует консультироваться с системным администратором, выполнявшим установку сервера баз данных. Если вы выполняли установку сервера баз данных самостоятельно и не меняли порт сервера баз данных, то поле &amp;lt;font color=darkblue&amp;gt;Порт сервера базы данных&amp;lt;/font&amp;gt; следует оставить пустым.&lt;br /&gt;
&lt;br /&gt;
Задав таким образом значения полей, следует нажать кнопку &amp;lt;font color=darkblue&amp;gt;OK&amp;lt;/font&amp;gt;, а затем выбрать только что определенную бизнес-схему и снова нажать &amp;lt;font color=darkblue&amp;gt;OK&amp;lt;/font&amp;gt;. После получения подтверждения о локальном сохранении настроек (в каталоге '''~/.ananas''') откроется главное окно &amp;lt;font color=darkblue&amp;gt;Дизайнера&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наше CRUD-приложение предназначено для управления &amp;lt;font color=darkblue&amp;gt;Справочником контрагентов&amp;lt;/font&amp;gt;, поэтому в дереве бизнес-объектов ('''Рис. 3''') нас в первую очередь будет интересовать раздел &amp;lt;font color=darkblue&amp;gt;Справочники&amp;lt;/font&amp;gt;. Определение справочника начинается с присвоения ему имени, которое в дальнейшем будет использовано в программировании бизнес-логики в процедурах на языке Ананас-Скрипт. В главном окне &amp;lt;font color=darkblue&amp;gt;Дизайнера&amp;lt;/font&amp;gt; щелкните правой клавишей мыши по разделу &amp;lt;font color=darkblue&amp;gt;Справочники&amp;lt;/font&amp;gt; и в появившемся меню выберите пункт &amp;lt;font color=darkblue&amp;gt;Новый&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В появившемся экранном диалоге закладка &amp;lt;font color=darkblue&amp;gt;Общий&amp;lt;/font&amp;gt; позволяет задать имя справочника и заполнить поле &amp;lt;font color=darkblue&amp;gt;Описание&amp;lt;/font&amp;gt;. На данном этапе в этом диалоге больше ничего изменять не требуется. Следует закрыть его и перейти к определению реквизитов &amp;lt;font color=darkblue&amp;gt;Справочника контрагентов&amp;lt;/font&amp;gt;. Разумеется, среда разработки Ананас позволяет организовать древовидную структуру справочника. Однако, желающих изучить эту тему я адресую к «Справочному руководству по Дизайнеру» Ананаса, а для нашего простого CRUD-приложения древовидная структура в Справочнике контрагентов нам не нужна.&lt;br /&gt;
&lt;br /&gt;
Как только вы закроете диалог, где было задано имя справочника, в дереве бизнес-схемы появится папка с именем Справочник контрагентов, внутри которой видны папки &amp;lt;font color=darkblue&amp;gt;Элемент&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Группа&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Формы&amp;lt;/font&amp;gt;. Для определения первого реквизита справочника следует щелкнуть правой кнопкой мыши по папке &amp;lt;font color=darkblue&amp;gt;Элемент&amp;lt;/font&amp;gt; и выбрать пункт &amp;lt;font color=darkblue&amp;gt;Новый&amp;lt;/font&amp;gt; появившегося меню. В открывшимся диалоге необходимо задать такие свойства реквизита, как &amp;lt;font color=darkblue&amp;gt;Имя&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Тип&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Ширина&amp;lt;/font&amp;gt; ('''Рис. 4'''). Прочие свойства задавать&lt;br /&gt;
не обязательно, их назначение описано в «Справочном руководстве по Дизайнеру». Закрыв диалог, следует повторить действия снова для определения второго, третьего и т.д. реквизитов справочника.&lt;br /&gt;
&lt;br /&gt;
===Диалог с пользователем===&lt;br /&gt;
&lt;br /&gt;
Задав реквизиты &amp;lt;font color=darkblue&amp;gt;Справочника&amp;lt;/font&amp;gt; контрагентов, мы спроектировали структуру данных и подготовили место для их хранения. Теперь необходимо нарисовать экранный диалог для изменения сведений. Для этого следует щелкнуть правой клавишей мыши по подпапке Формы папки Справочник контрагентов и выбрать пункт Новый появившегося меню. В открывшемся диалоге важно определить ровно одно свойство (Режим формы), присвоив ему значение «Диалог элемента».&lt;br /&gt;
&lt;br /&gt;
Именно это свойство отвечает за то, что форма будет использоваться в качестве редактора реквизитов элемента &amp;lt;font color=darkblue&amp;gt;Справочника&amp;lt;/font&amp;gt; контрагентов всякий раз, когда пользователь будет добавлять нового контрагента или редактировать реквизиты уже имеющегося. Для собственного удобства целесообразно заполнить поле Имя каким-нибудь осмысленным текстом, например, &amp;lt;font color=darkblue&amp;gt;Редактор реквизитов&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для перехода к художественной, если можно так выразиться, части создания нашего приложения – «рисованию» экранного диалога. Запустите &amp;lt;font color=darkblue&amp;gt;Редактор диалогов&amp;lt;/font&amp;gt;, нажав соответствующую кнопку на вкладке &amp;lt;font color=darkblue&amp;gt;Дизайн&amp;lt;/font&amp;gt; – отобразится пустое окно. Слева от него будет расположена палитра доступных диалоговых элементов (виджетов) – окно &amp;lt;font color=darkblue&amp;gt;Toolbox&amp;lt;/font&amp;gt;. Справа – редактор свойств элементов – окно &amp;lt;font color=darkblue&amp;gt;Property Editor&amp;lt;/font&amp;gt;. Для нашего «натюрморта» будет достаточно использовать ровно три элемента палитры:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;font color=darkblue&amp;gt;Text Label&amp;lt;/font&amp;gt; для подписей к полям ввода (Рис. 5).&lt;br /&gt;
*&amp;lt;font color=darkblue&amp;gt;DBField&amp;lt;/font&amp;gt; для полей ввода (Рис. 6)&lt;br /&gt;
*&amp;lt;font color=darkblue&amp;gt;ActionButton&amp;lt;/font&amp;gt; для кнопок &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt; (Рис. 6)&lt;br /&gt;
&lt;br /&gt;
Для перетаскивания элементов требуется два клика: первый по элементу палитры, второй – по окну диалога. Перетащите пять раз &amp;lt;font color=darkblue&amp;gt;TextLabel&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;DBField&amp;lt;/font&amp;gt;, разместив их по своему вкусу или как показано на '''Рис. 7''', отредактируйте тексты надписей (двойной щелчок будет здесь незаменим) и задайте привязку для полей ввода, выбрав для каждого из них соответствующий реквизит &amp;lt;font color=darkblue&amp;gt;Справочника контрагентов&amp;lt;/font&amp;gt; из списка. Список вызывается двойным щелчком по полю ввода, лежащему в окне диалога. Именно связывание данных (Data bindings), ставшее популярным благодаря таким средам разработки, как Borland Delphi и Visual Basic, и с успехом применяемое в среде разработки платформы Ананас, позволяет нам обойтись при создании CRUD-приложения без написания кода.&lt;br /&gt;
&lt;br /&gt;
После проведения несложной процедуры связывания для всех пяти полей ввода,добавьте в окно диалога кнопки &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt;, использовав для этого элемент &amp;lt;font color=darkblue&amp;gt;ActionButton&amp;lt;/font&amp;gt; палитры. Кнопка &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; должна просто закрывать окно. Кнопка &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt; должна дополнительно сохранять содержимое полей ввода в базе данных.&lt;br /&gt;
&lt;br /&gt;
Поведение кнопки задается в диалоге, вызываемым двойным щелчком по ней. Для кнопки &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; следует поставить галочки опциям &amp;lt;font color=darkblue&amp;gt;Простое действие&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Закрыть диалога&amp;lt;/font&amp;gt;. Для кнопки &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt; следует поставить третью галочку – &amp;lt;font color=darkblue&amp;gt;Обновить&amp;lt;/font&amp;gt;. Для смены текста надписи на кнопке в контекстном меню, вызываемом правой клавишей мыши следует выбрать пункт &amp;lt;font color=darkblue&amp;gt;Edit Text&amp;lt;/font&amp;gt;....&lt;br /&gt;
&lt;br /&gt;
===Сделаем красиво===&lt;br /&gt;
&lt;br /&gt;
В принципе, мы уже закончили – наше приложение будет работать. Но, как всякий уважающий себя кулинар и садовник позаботится о внешнем оформлении своего творения, прежде чем показать его публике, так и программист должен позаботиться о привлекательности создаваемого им приложения. Для придания опрятности нашему диалогу воспользуемся возможностями динамического, автоматически масштабируемого размещения элементов. В этом деле нам помогут &amp;lt;font color=darkblue&amp;gt;«пружинки»&amp;lt;/font&amp;gt; и типы размещения &amp;lt;font color=darkblue&amp;gt;«Сетка»&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;«Горизонтальные полоски»&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;«Вертикальные полоски»&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Начнем с полей ввода и надписей к ним. Разместив вертикально две пружинки, как показано на '''Рис. 8''', и выделив их все, последовательно щелкая мышкой и удерживая клавишу &amp;lt;font color=darkblue&amp;gt;Shift&amp;lt;/font&amp;gt; на клавиатуре, применим тип размещения &amp;lt;font color=darkblue&amp;gt;«Сетка»&amp;lt;/font&amp;gt;. Получим первый блок сгруппированных элементов диалога. Проделайте то же самое с кнопками &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt;, только &amp;lt;font color=darkblue&amp;gt;«пружинки»&amp;lt;/font&amp;gt; выберите горизонтальные, а тип размещения – &amp;lt;font color=darkblue&amp;gt;«Вертикальные полоски»&amp;lt;/font&amp;gt;. Последним шагом необходимо снять выделение, ткнув мышкой в пустую область окна диалога, а затем применить тип размещения &amp;lt;font color=darkblue&amp;gt;«Горизонтальные полоски»&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Не стоит печалиться, если требуемый результат не удастся получить с первого раза. Во-первых, всегда есть возможность отменить последнее действие при помощи клавиатурной комбинации &amp;lt;font color=darkblue&amp;gt;Ctrl+Z&amp;lt;/font&amp;gt;, во-вторых, правила динамического масштабирования определяются, помимо прочего, свойством &amp;lt;font color=darkred&amp;gt;sizePolicy&amp;lt;/font&amp;gt;, индивидуально определяемым для каждого элемента диалога в редакторе свойств &amp;lt;font color=darkblue&amp;gt;Property Editor&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такая работа требует некоторой привычки и терпения первое время. Овладев методикой задания динамического масштабирования и расположения элементов, вы будете тратить на нее минимум времени.&lt;br /&gt;
&lt;br /&gt;
Теперь нашу работу необходимо сохранить и, для проверки – запустить Ананас. &amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; закрывать не требуется. При успешном сохранении в соответствующем окне должны появиться сообщения об успешном обновлении структур базы данных, предназначенных для хранения бизнес-объектов. Если появились ошибки, то скорее всего Ананасу не хватило прав для записи в один из каталогов или не работает доступ к базе данных. Помощь по затруднительным ситуациям доступна на форуме проекта.&lt;br /&gt;
&lt;br /&gt;
===Последний штрих===&lt;br /&gt;
&lt;br /&gt;
А теперь – сюрприз: немного кода все-таки потребуется. Дело в том, что среда исполнения приложений Ананаса не знает, какой экранный диалог нашей бизнес-схемы следует запускать сразу после старта, ведь в нашем приложении могло бы быть несколько экранных форм. Нужен какой-нибудь способ известить Ананас о том, что при старте он должен открыть наш &amp;lt;font color=darkblue&amp;gt;Справочник контрагентов&amp;lt;/font&amp;gt;. Для этого предусмотрена предопределенная функция на Ананас-Скрипте с названием &amp;lt;font color=darkred&amp;gt;on_systemstart()&amp;lt;/font&amp;gt;. Если среда исполнения находит такую функцию в глобальном модуле бизнес-схемы при старте, она будет автоматически запущена на выполнение.&lt;br /&gt;
&lt;br /&gt;
Доступ к глобальному модулю осуществляется через двойной щелчок по корню дерева бизнес-объектов в &amp;lt;font color=darkblue&amp;gt;Дизайнере&amp;lt;/font&amp;gt; и выбор вкладки &amp;lt;font color=darkblue&amp;gt;Глобальный модуль&amp;lt;/font&amp;gt; появившегося диалога.&lt;br /&gt;
&lt;br /&gt;
Вот код, который нужно туда записать:&lt;br /&gt;
&lt;br /&gt;
 function on_systemstart()&lt;br /&gt;
 {&lt;br /&gt;
    sys.Message(0,”Привет, Мир! :)”);&lt;br /&gt;
    cat = new CatalogEditor(“Справочник контрагентов”);&lt;br /&gt;
    cat.edit();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Да, да! Он все-таки напечатает «Привет, Мир!» :) в окне сообщений ('''Рис. 9''').&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;
Среда разработки Ананас оснащена великолепным WYSIWYG-редактором диалогов, позволяющим в наглядной форме разместить визуальные элементы, такие как надписи, кнопки и поля ввода в окне диалога.&lt;br /&gt;
&lt;br /&gt;
Более того! Диалоги Ананаса являются динамически масштабируемыми, что, во-первых, совершенно необходимо для сохранения опрятного вида диалогов в гетерогенной среде, когда шрифты операционной системы Windows могут существенно отличаться в пропорциях от шрифтов среды X Window операционной системы Linux; во-вторых, создает дополнительные удобства в ситуации, когда пользователь желает растянуть окно диалога, чтобы использовать все разрешение своего экрана, улучшив тем самым отображение информации.&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:%D0%90%D0%BD%D0%B0%D0%BD%D0%B0%D1%81</id>
		<title>LXF98:Ананас</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:%D0%90%D0%BD%D0%B0%D0%BD%D0%B0%D1%81"/>
				<updated>2008-03-21T14:52:59Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Создаем CRUD-приложение==&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;font color=darkred&amp;gt;'''ЧАСТЬ 2'''&amp;lt;/font&amp;gt; Вариации «Hello, World!» набили оскомину – и '''Андрей Паскаль''' будет стараться избежать надоевшего приветствия до последнего, а попутно создаст бизнес-приложение, не написав ни строчки кода!''&lt;br /&gt;
&lt;br /&gt;
Из чего состоит приложение Ананаса? Как начать работу над собственной бизнес-схемой?&lt;br /&gt;
&lt;br /&gt;
В стародавние времена хорошим педагогическим приемом считалось дать в начале учебника пример программы, печатающей на экране приветствие «Hello, World!».&lt;br /&gt;
&lt;br /&gt;
Времена меняются, требования растут, и вот уже новая педагогическая мода диктует необходимость демонстрировать в качестве примера первого приложения не просто команду вывода на экран, а целую готовую программу по редактированию таблицы базы данных. Такая программа должна уметь Создавать, Показывать, Изменять и Удалять данные в таблице БД, поэтому ее принято называть CRUD-приложением, по первым буквам английских слов Create, Retrive, Update, Delete.&lt;br /&gt;
&lt;br /&gt;
Так как Ананас – бизнес-платформа, то и наше первое CRUD-приложение будет редактировать данные о бизнес-партнерах, также называемых иногда контрагентами. Итак, сегодня мы разработаем CRUD-приложение «Справочник контрагентов». Интересно заметить, что среда разработки платформы Ананас позволяет создать CRUD-приложение без какого-либо написания кода, так что я даже не стал бы называть такую деятельность программированием. Скорее это проектирование.&lt;br /&gt;
&lt;br /&gt;
Для каждого контрагента в справочнике будет храниться следующий упрощенный для нашего случая состав реквизитов:&lt;br /&gt;
&lt;br /&gt;
*Наименование;&lt;br /&gt;
*Почтовый адрес;&lt;br /&gt;
*Телефон;&lt;br /&gt;
*E-Mail;&lt;br /&gt;
*Банк.&lt;br /&gt;
&lt;br /&gt;
Разработка бизнес-схем ведется в среде разработки &amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; платформы Ананас ('''Рис. 1'''). После успешного запуска командой&lt;br /&gt;
&lt;br /&gt;
 [app@app ~]$ ananas-designer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; предложит выбрать бизнес-схему для работы из списка, точно так же, как предлагает выбрать бизнес-схему при запуске сам Ананас. Однако, в отличие от Ананаса, &amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; предоставляет доступ к настройке и созданию/модификации структур данных, алгоритмов, а также печатных и экранных форм бизнес-схемы.&lt;br /&gt;
&lt;br /&gt;
Для создания новой бизнес-схемы требуется указать (или создать новую) группу в окне диалога выбора бизнес-схем и активировать пункт Новая бизнес-схема меню Действия.&lt;br /&gt;
&lt;br /&gt;
Открывшийся диалог позволяет задать параметры новой бизнес-схемы. Наиболее важными из них являются параметры доступа к базе данных на SQL-сервере и положение файла бизнес-схемы в файловой системе вашего компьютера. Если вы укажете несуществующую базу данных или несуществующий файл бизнес-схемы, они будут созданы Ананасом автоматически.&lt;br /&gt;
&lt;br /&gt;
На '''Рис. 2''' показан пример заполнения параметров настройки бизнес-схемы для случая использования ''MySQL'' в качестве сервера баз данных.&lt;br /&gt;
&lt;br /&gt;
*'''Имя файла''' ресурса содержит ссылку на файл, в котором хранятся значения всех остальных полей этого диалога. Имеется возможность выбора ранее созданного файла ресурса: для этого достаточно вызвать диалог выбора файла щелчком по кнопке, расположенной справа от поля с именем файла ресурса. При открытии файла ресурса значения всех полей диалога будут заменены значениями из этого файла.&lt;br /&gt;
&lt;br /&gt;
*''Заголовок базы данных''' предназначен для пользователя и отображается в списке доступных для выбора баз данных в диалоге &amp;lt;font color=darkblue&amp;gt;Список бизнес-схем&amp;lt;/font&amp;gt;, появляющемся при старте &amp;lt;font color=darkblue&amp;gt;Дизайнера&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*'''Имя базы данных''' содержит имя базы данных, используемое системой при доступе к серверу базы данных.&lt;br /&gt;
&lt;br /&gt;
*'''Тип сервера базы данных''' позволяет выбрать один из поддерживаемых Ананасом серверов баз данных (''MySQL'', ''PostgreSQL'' или ''SQLite''). Разумеется, следует убедиться, что соответствующий выбираемому вами типу сервер установлен и запущен, так как здесь вы указываете лишь драйвер, который не будет работать, если не установлен соответствующий сервер.&lt;br /&gt;
&lt;br /&gt;
*'''Адрес сервера базы данных''' – это адрес компьютера, на котором установлен сервер выбранного выше типа. Разумеется, сервер баз данных может работать как на том же самом компьютере, где вы установили Ананас, так и на любом другом. Если сервер баз данных запущен локально, здесь следует указать значение &amp;lt;font color=darkred&amp;gt;localhost&amp;lt;/font&amp;gt;. В остальных случаях следует узнать адрес сервера у системного администратора. Адрес может быть задан как DNS-именем (например, '''myhost.com'''), так и числовым значением (например, 127.0.0.1).&lt;br /&gt;
&lt;br /&gt;
*'''Порт сервера базы данных''' по умолчанию не содержит никакого значения. Его следует задавать лишь в тех случаях, когда используется нестандартный порт, что случается достаточно редко. По этому вопросу следует консультироваться с системным администратором, выполнявшим установку сервера баз данных. Если вы выполняли установку сервера баз данных самостоятельно и не меняли порт сервера баз данных, то поле &amp;lt;font color=darkblue&amp;gt;Порт сервера базы данных&amp;lt;/font&amp;gt; следует оставить пустым.&lt;br /&gt;
&lt;br /&gt;
Задав таким образом значения полей, следует нажать кнопку &amp;lt;font color=darkblue&amp;gt;OK&amp;lt;/font&amp;gt;, а затем выбрать только что определенную бизнес-схему и снова нажать &amp;lt;font color=darkblue&amp;gt;OK&amp;lt;/font&amp;gt;. После получения подтверждения о локальном сохранении настроек (в каталоге '''~/.ananas''') откроется главное окно &amp;lt;font color=darkblue&amp;gt;Дизайнера&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наше CRUD-приложение предназначено для управления &amp;lt;font color=darkblue&amp;gt;Справочником контрагентов&amp;lt;/font&amp;gt;, поэтому в дереве бизнес-объектов ('''Рис. 3''') нас в первую очередь будет интересовать раздел &amp;lt;font color=darkblue&amp;gt;Справочники&amp;lt;/font&amp;gt;. Определение справочника начинается с присвоения ему имени, которое в дальнейшем будет использовано в программировании бизнес-логики в процедурах на языке Ананас-Скрипт. В главном окне &amp;lt;font color=darkblue&amp;gt;Дизайнера&amp;lt;/font&amp;gt; щелкните правой клавишей мыши по разделу &amp;lt;font color=darkblue&amp;gt;Справочники&amp;lt;/font&amp;gt; и в появившемся меню выберите пункт &amp;lt;font color=darkblue&amp;gt;Новый&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В появившемся экранном диалоге закладка &amp;lt;font color=darkblue&amp;gt;Общий&amp;lt;/font&amp;gt; позволяет задать имя справочника и заполнить поле &amp;lt;font color=darkblue&amp;gt;Описание&amp;lt;/font&amp;gt;. На данном этапе в этом диалоге больше ничего изменять не требуется. Следует закрыть его и перейти к определению реквизитов &amp;lt;font color=darkblue&amp;gt;Справочника контрагентов&amp;lt;/font&amp;gt;. Разумеется, среда разработки Ананас позволяет организовать древовидную структуру справочника. Однако, желающих изучить эту тему я адресую к «Справочному руководству по Дизайнеру» Ананаса, а для нашего простого CRUD-приложения древовидная структура в Справочнике контрагентов нам не нужна.&lt;br /&gt;
&lt;br /&gt;
Как только вы закроете диалог, где было задано имя справочника, в дереве бизнес-схемы появится папка с именем Справочник контрагентов, внутри которой видны папки &amp;lt;font color=darkblue&amp;gt;Элемент&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Группа&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Формы&amp;lt;/font&amp;gt;. Для определения первого реквизита справочника следует щелкнуть правой кнопкой мыши по папке &amp;lt;font color=darkblue&amp;gt;Элемент&amp;lt;/font&amp;gt; и выбрать пункт &amp;lt;font color=darkblue&amp;gt;Новый&amp;lt;/font&amp;gt; появившегося меню. В открывшимся диалоге необходимо задать такие свойства реквизита, как &amp;lt;font color=darkblue&amp;gt;Имя&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Тип&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Ширина&amp;lt;/font&amp;gt; ('''Рис. 4'''). Прочие свойства задавать&lt;br /&gt;
не обязательно, их назначение описано в «Справочном руководстве по Дизайнеру». Закрыв диалог, следует повторить действия снова для определения второго, третьего и т.д. реквизитов справочника.&lt;br /&gt;
&lt;br /&gt;
===Диалог с пользователем===&lt;br /&gt;
&lt;br /&gt;
Задав реквизиты &amp;lt;font color=darkblue&amp;gt;Справочника&amp;lt;/font&amp;gt; контрагентов, мы спроектировали структуру данных и подготовили место для их хранения. Теперь необходимо нарисовать экранный диалог для изменения сведений. Для этого следует щелкнуть правой клавишей мыши по подпапке Формы папки Справочник контрагентов и выбрать пункт Новый появившегося меню. В открывшемся диалоге важно определить ровно одно свойство (Режим формы), присвоив ему значение «Диалог элемента».&lt;br /&gt;
&lt;br /&gt;
Именно это свойство отвечает за то, что форма будет использоваться в качестве редактора реквизитов элемента &amp;lt;font color=darkblue&amp;gt;Справочника&amp;lt;/font&amp;gt; контрагентов всякий раз, когда пользователь будет добавлять нового контрагента или редактировать реквизиты уже имеющегося. Для собственного удобства целесообразно заполнить поле Имя каким-нибудь осмысленным текстом, например, &amp;lt;font color=darkblue&amp;gt;Редактор реквизитов&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для перехода к художественной, если можно так выразиться, части создания нашего приложения – «рисованию» экранного диалога. Запустите &amp;lt;font color=darkblue&amp;gt;Редактор диалогов&amp;lt;/font&amp;gt;, нажав соответствующую кнопку на вкладке &amp;lt;font color=darkblue&amp;gt;Дизайн&amp;lt;/font&amp;gt; – отобразится пустое окно. Слева от него будет расположена палитра доступных диалоговых элементов (виджетов) – окно &amp;lt;font color=darkblue&amp;gt;Toolbox&amp;lt;/font&amp;gt;. Справа – редактор свойств элементов – окно &amp;lt;font color=darkblue&amp;gt;Property Editor&amp;lt;/font&amp;gt;. Для нашего «натюрморта» будет достаточно использовать ровно три элемента палитры:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;font color=darkblue&amp;gt;Text Label&amp;lt;/font&amp;gt; для подписей к полям ввода (Рис. 5).&lt;br /&gt;
*&amp;lt;font color=darkblue&amp;gt;DBField&amp;lt;/font&amp;gt; для полей ввода (Рис. 6)&lt;br /&gt;
*&amp;lt;font color=darkblue&amp;gt;ActionButton&amp;lt;/font&amp;gt; для кнопок &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt; (Рис. 6)&lt;br /&gt;
&lt;br /&gt;
Для перетаскивания элементов требуется два клика: первый по элементу палитры, второй – по окну диалога. Перетащите пять раз &amp;lt;font color=darkblue&amp;gt;TextLabel&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;DBField&amp;lt;/font&amp;gt;, разместив их по своему вкусу или как показано на '''Рис. 7''', отредактируйте тексты надписей (двойной щелчок будет здесь незаменим) и задайте привязку для полей ввода, выбрав для каждого из них соответствующий реквизит &amp;lt;font color=darkblue&amp;gt;Справочника контрагентов&amp;lt;/font&amp;gt; из списка. Список вызывается двойным щелчком по полю ввода, лежащему в окне диалога. Именно связывание данных (Data bindings), ставшее популярным благодаря таким средам разработки, как Borland Delphi и Visual Basic, и с успехом применяемое в среде разработки платформы Ананас, позволяет нам обойтись при создании CRUD-приложения без написания кода.&lt;br /&gt;
&lt;br /&gt;
После проведения несложной процедуры связывания для всех пяти полей ввода,добавьте в окно диалога кнопки &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt;, использовав для этого элемент &amp;lt;font color=darkblue&amp;gt;ActionButton&amp;lt;/font&amp;gt; палитры. Кнопка &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; должна просто закрывать окно. Кнопка &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt; должна дополнительно сохранять содержимое полей ввода в базе данных.&lt;br /&gt;
&lt;br /&gt;
Поведение кнопки задается в диалоге, вызываемым двойным щелчком по ней. Для кнопки &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; следует поставить галочки опциям &amp;lt;font color=darkblue&amp;gt;Простое действие&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Закрыть диалога&amp;lt;/font&amp;gt;. Для кнопки &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt; следует поставить третью галочку – &amp;lt;font color=darkblue&amp;gt;Обновить&amp;lt;/font&amp;gt;. Для смены текста надписи на кнопке в контекстном меню, вызываемом правой клавишей мыши следует выбрать пункт &amp;lt;font color=darkblue&amp;gt;Edit Text&amp;lt;/font&amp;gt;....&lt;br /&gt;
&lt;br /&gt;
===Сделаем красиво===&lt;br /&gt;
&lt;br /&gt;
В принципе, мы уже закончили – наше приложение будет работать. Но, как всякий уважающий себя кулинар и садовник позаботится о внешнем оформлении своего творения, прежде чем показать его публике, так и программист должен позаботиться о привлекательности создаваемого им приложения. Для придания опрятности нашему диалогу воспользуемся возможностями динамического, автоматически масштабируемого размещения элементов. В этом деле нам помогут &amp;lt;font color=darkblue&amp;gt;«пружинки»&amp;lt;/font&amp;gt; и типы размещения &amp;lt;font color=darkblue&amp;gt;«Сетка»&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;«Горизонтальные полоски»&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;«Вертикальные полоски»&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Начнем с полей ввода и надписей к ним. Разместив вертикально две пружинки, как показано на '''Рис. 8''', и выделив их все, последовательно щелкая мышкой и удерживая клавишу &amp;lt;font color=darkblue&amp;gt;Shift&amp;lt;/font&amp;gt; на клавиатуре, применим тип размещения &amp;lt;font color=darkblue&amp;gt;«Сетка»&amp;lt;/font&amp;gt;. Получим первый блок сгруппированных элементов диалога. Проделайте то же самое с кнопками &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt;, только &amp;lt;font color=darkblue&amp;gt;«пружинки»&amp;lt;/font&amp;gt; выберите горизонтальные, а тип размещения – &amp;lt;font color=darkblue&amp;gt;«Вертикальные полоски»&amp;lt;/font&amp;gt;. Последним шагом необходимо снять выделение, ткнув мышкой в пустую область окна диалога, а затем применить тип размещения &amp;lt;font color=darkblue&amp;gt;«Горизонтальные полоски»&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Не стоит печалиться, если требуемый результат не удастся получить с первого раза. Во-первых, всегда есть возможность отменить последнее действие при помощи клавиатурной комбинации &amp;lt;font color=darkblue&amp;gt;Ctrl+Z&amp;lt;/font&amp;gt;, во-вторых, правила динамического масштабирования определяются, помимо прочего, свойством &amp;lt;font color=darkred&amp;gt;sizePolicy&amp;lt;/font&amp;gt;, индивидуально определяемым для каждого элемента диалога в редакторе свойств &amp;lt;font color=darkblue&amp;gt;Property Editor&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такая работа требует некоторой привычки и терпения первое время. Овладев методикой задания динамического масштабирования и расположения элементов, вы будете тратить на нее минимум времени.&lt;br /&gt;
&lt;br /&gt;
Теперь нашу работу необходимо сохранить и, для проверки – запустить Ананас. &amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; закрывать не требуется. При успешном сохранении в соответствующем окне должны появиться сообщения об успешном обновлении структур базы данных, предназначенных для хранения бизнес-объектов. Если появились ошибки, то скорее всего Ананасу не хватило прав для записи в один из каталогов или не работает доступ к базе данных. Помощь по затруднительным ситуациям доступна на форуме проекта.&lt;br /&gt;
&lt;br /&gt;
===Последний штрих===&lt;br /&gt;
&lt;br /&gt;
А теперь – сюрприз: немного кода все-таки потребуется. Дело в том, что среда исполнения приложений Ананаса не знает, какой экранный диалог нашей бизнес-схемы следует запускать сразу после старта, ведь в нашем приложении могло бы быть несколько экранных форм. Нужен какой-нибудь способ известить Ананас о том, что при старте он должен открыть наш &amp;lt;font color=darkblue&amp;gt;Справочник контрагентов&amp;lt;/font&amp;gt;. Для этого предусмотрена предопределенная функция на Ананас-Скрипте с названием &amp;lt;font color=darkred&amp;gt;on_systemstart()&amp;lt;/font&amp;gt;. Если среда исполнения находит такую функцию в глобальном модуле бизнес-схемы при старте, она будет автоматически запущена на выполнение.&lt;br /&gt;
&lt;br /&gt;
Доступ к глобальному модулю осуществляется через двойной щелчок по корню дерева бизнес-объектов в &amp;lt;font color=darkblue&amp;gt;Дизайнере&amp;lt;/font&amp;gt; и выбор вкладки &amp;lt;font color=darkblue&amp;gt;Глобальный модуль&amp;lt;/font&amp;gt; появившегося диалога.&lt;br /&gt;
&lt;br /&gt;
Вот код, который нужно туда записать:&lt;br /&gt;
&lt;br /&gt;
 function on_systemstart()&lt;br /&gt;
 {&lt;br /&gt;
    sys.Message(0,”Привет, Мир! :)”);&lt;br /&gt;
    cat = new CatalogEditor(“Справочник контрагентов”);&lt;br /&gt;
    cat.edit();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Да, да! Он все-таки напечатает «Привет, Мир!» :) в окне сообщений ('''Рис. 9''').&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;
Среда разработки Ананас оснащена великолепным WYSIWYG-редактором диалогов, позволяющим в наглядной форме разместить визуальные элементы, такие как надписи, кнопки и поля ввода в окне диалога.&lt;br /&gt;
&lt;br /&gt;
Более того! Диалоги Ананаса являются динамически масштабируемыми, что, во-первых, совершенно необходимо для сохранения опрятного вида диалогов в гетерогенной среде, когда шрифты операционной системы Windows могут существенно отличаться в пропорциях от шрифтов среды X Window операционной системы Linux; во-вторых, создает дополнительные удобства в ситуации, когда пользователь желает растянуть окно диалога, чтобы использовать все разрешение своего экрана, улучшив тем самым отображение информации.&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:%D0%90%D0%BD%D0%B0%D0%BD%D0%B0%D1%81</id>
		<title>LXF98:Ананас</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:%D0%90%D0%BD%D0%B0%D0%BD%D0%B0%D1%81"/>
				<updated>2008-03-21T14:50:59Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Создаем CRUD-приложение==&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;font color=darkred&amp;gt;'''ЧАСТЬ 2'''&amp;lt;/font&amp;gt; Вариации «Hello, World!» набили оскомину – и '''Андрей Паскаль''' будет стараться избежать надоевшего приветствия до последнего, а попутно создаст бизнес-приложение, не написав ни строчки кода!''&lt;br /&gt;
&lt;br /&gt;
Из чего состоит приложение Ананаса? Как начать работу над собственной бизнес-схемой?&lt;br /&gt;
&lt;br /&gt;
В стародавние времена хорошим педагогическим приемом считалось дать в начале учебника пример программы, печатающей на экране приветствие «Hello, World!».&lt;br /&gt;
&lt;br /&gt;
Времена меняются, требования растут, и вот уже новая педагогическая мода диктует необходимость демонстрировать в качестве примера первого приложения не просто команду вывода на экран, а целую готовую программу по редактированию таблицы базы данных. Такая программа должна уметь Создавать, Показывать, Изменять и Удалять данные в таблице БД, поэтому ее принято называть CRUD-приложением, по первым буквам английских слов Create, Retrive, Update, Delete.&lt;br /&gt;
&lt;br /&gt;
Так как Ананас – бизнес-платформа, то и наше первое CRUD-приложение будет редактировать данные о бизнес-партнерах, также называемых иногда контрагентами. Итак, сегодня мы разработаем CRUD-приложение «Справочник контрагентов». Интересно заметить, что среда разработки платформы Ананас позволяет создать CRUD-приложение без какого-либо написания кода, так что я даже не стал бы называть такую деятельность программированием. Скорее это проектирование.&lt;br /&gt;
&lt;br /&gt;
Для каждого контрагента в справочнике будет храниться следующий упрощенный для нашего случая состав реквизитов:&lt;br /&gt;
&lt;br /&gt;
*Наименование;&lt;br /&gt;
*Почтовый адрес;&lt;br /&gt;
*Телефон;&lt;br /&gt;
*E-Mail;&lt;br /&gt;
*Банк.&lt;br /&gt;
&lt;br /&gt;
Разработка бизнес-схем ведется в среде разработки &amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; платформы Ананас ('''Рис. 1'''). После успешного запуска командой&lt;br /&gt;
&lt;br /&gt;
 [app@app ~]$ ananas-designer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; предложит выбрать бизнес-схему для работы из списка, точно так же, как предлагает выбрать бизнес-схему при запуске сам Ананас. Однако, в отличие от Ананаса, &amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; предоставляет доступ к настройке и созданию/модификации структур данных, алгоритмов, а также печатных и экранных форм бизнес-схемы.&lt;br /&gt;
&lt;br /&gt;
Для создания новой бизнес-схемы требуется указать (или создать новую) группу в окне диалога выбора бизнес-схем и активировать пункт Новая бизнес-схема меню Действия.&lt;br /&gt;
&lt;br /&gt;
Открывшийся диалог позволяет задать параметры новой бизнес-схемы. Наиболее важными из них являются параметры доступа к базе данных на SQL-сервере и положение файла бизнес-схемы в файловой системе вашего компьютера. Если вы укажете несуществующую базу данных или несуществующий файл бизнес-схемы, они будут созданы Ананасом автоматически.&lt;br /&gt;
&lt;br /&gt;
На '''Рис. 2''' показан пример заполнения параметров настройки бизнес-схемы для случая использования ''MySQL'' в качестве сервера баз данных.&lt;br /&gt;
&lt;br /&gt;
*'''Имя файла''' ресурса содержит ссылку на файл, в котором хранятся значения всех остальных полей этого диалога. Имеется возможность выбора ранее созданного файла ресурса: для этого достаточно вызвать диалог выбора файла щелчком по кнопке, расположенной справа от поля с именем файла ресурса. При открытии файла ресурса значения всех полей диалога будут заменены значениями из этого файла.&lt;br /&gt;
&lt;br /&gt;
*''Заголовок базы данных''' предназначен для пользователя и отображается в списке доступных для выбора баз данных в диалоге &amp;lt;font color=darkblue&amp;gt;Список бизнес-схем&amp;lt;/font&amp;gt;, появляющемся при старте &amp;lt;font color=darkblue&amp;gt;Дизайнера&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*'''Имя базы данных''' содержит имя базы данных, используемое системой при доступе к серверу базы данных.&lt;br /&gt;
&lt;br /&gt;
*'''Тип сервера базы данных''' позволяет выбрать один из поддерживаемых Ананасом серверов баз данных (''MySQL'', ''PostgreSQL'' или ''SQLite''). Разумеется, следует убедиться, что соответствующий выбираемому вами типу сервер установлен и запущен, так как здесь вы указываете лишь драйвер, который не будет работать, если не установлен соответствующий сервер.&lt;br /&gt;
&lt;br /&gt;
*'''Адрес сервера базы данных''' – это адрес компьютера, на котором установлен сервер выбранного выше типа. Разумеется, сервер баз данных может работать как на том же самом компьютере, где вы установили Ананас, так и на любом другом. Если сервер баз данных запущен локально, здесь следует указать значение &amp;lt;font color=darkred&amp;gt;localhost&amp;lt;/font&amp;gt;. В остальных случаях следует узнать адрес сервера у системного администратора. Адрес может быть задан как DNS-именем (например, '''myhost.com'''), так и числовым значением (например, 127.0.0.1).&lt;br /&gt;
&lt;br /&gt;
*'''Порт сервера базы данных''' по умолчанию не содержит никакого значения. Его следует задавать лишь в тех случаях, когда используется нестандартный порт, что случается достаточно редко. По этому вопросу следует консультироваться с системным администратором, выполнявшим установку сервера баз данных. Если вы выполняли установку сервера баз данных самостоятельно и не меняли порт сервера баз данных, то поле &amp;lt;font color=darkblue&amp;gt;Порт сервера базы данных&amp;lt;/font&amp;gt; следует оставить пустым.&lt;br /&gt;
&lt;br /&gt;
Задав таким образом значения полей, следует нажать кнопку &amp;lt;font color=darkblue&amp;gt;OK&amp;lt;/font&amp;gt;, а затем выбрать только что определенную бизнес-схему и снова нажать &amp;lt;font color=darkblue&amp;gt;OK&amp;lt;/font&amp;gt;. После получения подтверждения о локальном сохранении настроек (в каталоге '''~/.ananas''') откроется главное окно &amp;lt;font color=darkblue&amp;gt;Дизайнера&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наше CRUD-приложение предназначено для управления &amp;lt;font color=darkblue&amp;gt;Справочником контрагентов&amp;lt;/font&amp;gt;, поэтому в дереве бизнес-объектов ('''Рис. 3''') нас в первую очередь будет интересовать раздел &amp;lt;font color=darkblue&amp;gt;Справочники&amp;lt;/font&amp;gt;. Определение справочника начинается с присвоения ему имени, которое в дальнейшем будет использовано в программировании бизнес-логики в процедурах на языке Ананас-Скрипт. В главном окне &amp;lt;font color=darkblue&amp;gt;Дизайнера&amp;lt;/font&amp;gt; щелкните правой клавишей мыши по разделу &amp;lt;font color=darkblue&amp;gt;Справочники&amp;lt;/font&amp;gt; и в появившемся меню выберите пункт &amp;lt;font color=darkblue&amp;gt;Новый&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В появившемся экранном диалоге закладка &amp;lt;font color=darkblue&amp;gt;Общий&amp;lt;/font&amp;gt; позволяет задать имя справочника и заполнить поле &amp;lt;font color=darkblue&amp;gt;Описание&amp;lt;/font&amp;gt;. На данном этапе в этом диалоге больше ничего изменять не требуется. Следует закрыть его и перейти к определению реквизитов &amp;lt;font color=darkblue&amp;gt;Справочника контрагентов&amp;lt;/font&amp;gt;. Разумеется, среда разработки Ананас позволяет организовать древовидную структуру справочника. Однако, желающих изучить эту тему я адресую к «Справочному руководству по Дизайнеру» Ананаса, а для нашего простого CRUD-приложения древовидная структура в Справочнике контрагентов нам не нужна.&lt;br /&gt;
&lt;br /&gt;
Как только вы закроете диалог, где было задано имя справочника, в дереве бизнес-схемы появится папка с именем Справочник контрагентов, внутри которой видны папки &amp;lt;font color=darkblue&amp;gt;Элемент&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Группа&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Формы&amp;lt;/font&amp;gt;. Для определения первого реквизита справочника следует щелкнуть правой кнопкой мыши по папке &amp;lt;font color=darkblue&amp;gt;Элемент&amp;lt;/font&amp;gt; и выбрать пункт &amp;lt;font color=darkblue&amp;gt;Новый&amp;lt;/font&amp;gt; появившегося меню. В открывшимся диалоге необходимо задать такие свойства реквизита, как &amp;lt;font color=darkblue&amp;gt;Имя&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Тип&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Ширина&amp;lt;/font&amp;gt; ('''Рис. 4'''). Прочие свойства задавать&lt;br /&gt;
не обязательно, их назначение описано в «Справочном руководстве по Дизайнеру». Закрыв диалог, следует повторить действия снова для определения второго, третьего и т.д. реквизитов справочника.&lt;br /&gt;
&lt;br /&gt;
===Диалог с пользователем===&lt;br /&gt;
&lt;br /&gt;
Задав реквизиты &amp;lt;font color=darkblue&amp;gt;Справочника&amp;lt;/font&amp;gt; контрагентов, мы спроектировали структуру данных и подготовили место для их хранения. Теперь необходимо нарисовать экранный диалог для изменения сведений. Для этого следует щелкнуть правой клавишей мыши по подпапке Формы папки Справочник контрагентов и выбрать пункт Новый появившегося меню. В открывшемся диалоге важно определить ровно одно свойство (Режим формы), присвоив ему значение «Диалог элемента».&lt;br /&gt;
&lt;br /&gt;
Именно это свойство отвечает за то, что форма будет использоваться в качестве редактора реквизитов элемента &amp;lt;font color=darkblue&amp;gt;Справочника&amp;lt;/font&amp;gt; контрагентов всякий раз, когда пользователь будет добавлять нового контрагента или редактировать реквизиты уже имеющегося. Для собственного удобства целесообразно заполнить поле Имя каким-нибудь осмысленным текстом, например, &amp;lt;font color=darkblue&amp;gt;Редактор реквизитов&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь все готово для перехода к художественной, если можно так выразиться, части создания нашего приложения – «рисованию» экранного диалога. Запустите &amp;lt;font color=darkblue&amp;gt;Редактор диалогов&amp;lt;/font&amp;gt;, нажав соответствующую кнопку на вкладке &amp;lt;font color=darkblue&amp;gt;Дизайн&amp;lt;/font&amp;gt; – отобразится пустое окно. Слева от него будет расположена палитра доступных диалоговых элементов (виджетов) – окно &amp;lt;font color=darkblue&amp;gt;Toolbox&amp;lt;/font&amp;gt;. Справа – редактор свойств элементов – окно &amp;lt;font color=darkblue&amp;gt;Property Editor&amp;lt;/font&amp;gt;. Для нашего «натюрморта» будет достаточно использовать ровно три элемента палитры:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;font color=darkblue&amp;gt;Text Label&amp;lt;/font&amp;gt; для подписей к полям ввода (Рис. 5).&lt;br /&gt;
*&amp;lt;font color=darkblue&amp;gt;DBField&amp;lt;/font&amp;gt; для полей ввода (Рис. 6)&lt;br /&gt;
*&amp;lt;font color=darkblue&amp;gt;ActionButton&amp;lt;/font&amp;gt; для кнопок &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt; (Рис. 6)&lt;br /&gt;
&lt;br /&gt;
Для перетаскивания элементов требуется два клика: первый по элементу палитры, второй – по окну диалога. Перетащите пять раз &amp;lt;font color=darkblue&amp;gt;TextLabel&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;DBField&amp;lt;/font&amp;gt;, разместив их по своему вкусу или как показано на '''Рис. 7''', отредактируйте тексты надписей (двойной щелчок будет здесь незаменим) и задайте привязку для полей ввода, выбрав для каждого из них соответствующий реквизит &amp;lt;font color=darkblue&amp;gt;Справочника контрагентов&amp;lt;/font&amp;gt; из списка. Список вызывается двойным щелчком по полю ввода, лежащему в окне диалога. Именно связывание данных (Data bindings), ставшее популярным благодаря таким средам разработки, как Borland Delphi и Visual Basic, и с успехом применяемое в среде разработки платформы Ананас, позволяет нам обойтись при создании CRUD-приложения без написания кода.&lt;br /&gt;
&lt;br /&gt;
После проведения несложной процедуры связывания для всех пяти полей ввода,добавьте в окно диалога кнопки &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt;, использовав для этого элемент &amp;lt;font color=darkblue&amp;gt;ActionButton&amp;lt;/font&amp;gt; палитры. Кнопка &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; должна просто закрывать окно. Кнопка &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt; должна дополнительно сохранять содержимое полей ввода в базе данных.&lt;br /&gt;
&lt;br /&gt;
Поведение кнопки задается в диалоге, вызываемым двойным щелчком по ней. Для кнопки &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; следует поставить галочки опциям &amp;lt;font color=darkblue&amp;gt;Простое действие&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Закрыть диалога&amp;lt;/font&amp;gt;. Для кнопки &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt; следует поставить третью галочку – &amp;lt;font color=darkblue&amp;gt;Обновить&amp;lt;/font&amp;gt;. Для смены текста надписи на кнопке в контекстном меню, вызываемом правой клавишей мыши следует выбрать пункт &amp;lt;font color=darkblue&amp;gt;Edit Text&amp;lt;/font&amp;gt;....&lt;br /&gt;
&lt;br /&gt;
===Сделаем красиво===&lt;br /&gt;
&lt;br /&gt;
В принципе, мы уже закончили – наше приложение будет работать. Но, как всякий уважающий себя кулинар и садовник позаботится о внешнем оформлении своего творения, прежде чем показать его публике, так и программист должен позаботиться о привлекательности создаваемого им приложения. Для придания опрятности нашему диалогу воспользуемся возможностями динамического, автоматически масштабируемого размещения элементов. В этом деле нам помогут &amp;lt;font color=darkblue&amp;gt;«пружинки»&amp;lt;/font&amp;gt; и типы размещения &amp;lt;font color=darkblue&amp;gt;«Сетка»&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;«Горизонтальные полоски»&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;«Вертикальные полоски»&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Начнем с полей ввода и надписей к ним. Разместив вертикально две пружинки, как показано на '''Рис. 8''', и выделив их все, последовательно щелкая мышкой и удерживая клавишу &amp;lt;font color=darkblue&amp;gt;Shift&amp;lt;/font&amp;gt; на клавиатуре, применим тип размещения &amp;lt;font color=darkblue&amp;gt;«Сетка»&amp;lt;/font&amp;gt;. Получим первый блок сгруппированных элементов диалога. Проделайте то же самое с кнопками &amp;lt;font color=darkblue&amp;gt;Отмена&amp;lt;/font&amp;gt; и &amp;lt;font color=darkblue&amp;gt;Принять&amp;lt;/font&amp;gt;, только &amp;lt;font color=darkblue&amp;gt;«пружинки»&amp;lt;/font&amp;gt; выберите горизонтальные, а тип размещения – &amp;lt;font color=darkblue&amp;gt;«Вертикальные полоски»&amp;lt;/font&amp;gt;. Последним шагом необходимо снять выделение, ткнув мышкой в пустую область окна диалога, а затем применить тип размещения &amp;lt;font color=darkblue&amp;gt;«Горизонтальные полоски»&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Не стоит печалиться, если требуемый результат не удастся получить с первого раза. Во-первых, всегда есть возможность отменить последнее действие при помощи клавиатурной комбинации &amp;lt;font color=darkblue&amp;gt;Ctrl+Z&amp;lt;/font&amp;gt;, во-вторых, правила динамического масштабирования определяются, помимо прочего, свойством &amp;lt;font color=darkred&amp;gt;sizePolicy&amp;lt;/font&amp;gt;, индивидуально определяемым для каждого элемента диалога в редакторе свойств &amp;lt;font color=darkblue&amp;gt;Property Editor&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такая работа требует некоторой привычки и терпения первое время. Овладев методикой задания динамического масштабирования и расположения элементов, вы будете тратить на нее минимум времени.&lt;br /&gt;
&lt;br /&gt;
Теперь нашу работу необходимо сохранить и, для проверки – запустить Ананас. &amp;lt;font color=darkblue&amp;gt;Дизайнер&amp;lt;/font&amp;gt; закрывать не требуется. При успешном сохранении в соответствующем окне должны появиться сообщения об успешном обновлении структур базы данных, предназначенных для хранения бизнес-объектов. Если появились ошибки, то скорее всего Ананасу не хватило прав для записи в один из каталогов или не работает доступ к базе данных. Помощь по затруднительным ситуациям доступна на форуме проекта.&lt;br /&gt;
&lt;br /&gt;
===Последний штрих===&lt;br /&gt;
&lt;br /&gt;
А теперь – сюрприз: немного кода все-таки потребуется. Дело в том, что среда исполнения приложений Ананаса не знает, какой экранный диалог нашей бизнес-схемы следует запускать сразу после старта, ведь в нашем приложении могло бы быть несколько экранных форм. Нужен какой-нибудь способ известить Ананас о том, что при старте он должен открыть наш &amp;lt;font color=darkblue&amp;gt;Справочник контрагентов&amp;lt;/font&amp;gt;. Для этого предусмотрена предопределенная функция на Ананас-Скрипте с названием &amp;lt;font color=darkred&amp;gt;on_systemstart()&amp;lt;/font&amp;gt;. Если среда исполнения находит такую функцию в глобальном модуле бизнес-схемы при старте, она будет автоматически запущена на выполнение.&lt;br /&gt;
&lt;br /&gt;
Доступ к глобальному модулю осуществляется через двойной щелчок по корню дерева бизнес-объектов в &amp;lt;font color=darkblue&amp;gt;Дизайнере&amp;lt;/font&amp;gt; и выбор вкладки &amp;lt;font color=darkblue&amp;gt;Глобальный модуль&amp;lt;/font&amp;gt; появившегося диалога.&lt;br /&gt;
&lt;br /&gt;
Вот код, который нужно туда записать:&lt;br /&gt;
&lt;br /&gt;
 function on_systemstart()&lt;br /&gt;
 {&lt;br /&gt;
    sys.Message(0,”Привет, Мир! :)”);&lt;br /&gt;
    cat = new CatalogEditor(“Справочник контрагентов”);&lt;br /&gt;
    cat.edit();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Да, да! Он все-таки напечатает «Привет, Мир!» :) в окне сообщений ('''Рис. 9''').&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:%D0%90%D0%BD%D0%B0%D0%BD%D0%B0%D1%81</id>
		<title>LXF98:Ананас</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:%D0%90%D0%BD%D0%B0%D0%BD%D0%B0%D1%81"/>
				<updated>2008-03-21T14:34:45Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Создаем CRUD-приложение==&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;font color=darkred&amp;gt;'''ЧАСТЬ 2'''&amp;lt;/font&amp;gt; Вариации «Hello, World!» набили оскомину – и '''Андрей Паскаль''' будет стараться избежать надоевшего приветствия до последнего, а попутно создаст бизнес-приложение, не написав ни строчки кода!''&lt;br /&gt;
&lt;br /&gt;
Из чего состоит приложение Ананаса? Как начать работу над собственной бизнес-схемой?&lt;br /&gt;
&lt;br /&gt;
В стародавние времена хорошим педагогическим приемом считалось дать в начале учебника пример программы, печатающей на экране приветствие «Hello, World!».&lt;br /&gt;
&lt;br /&gt;
Времена меняются, требования растут, и вот уже новая педагогическая мода диктует необходимость демонстрировать в качестве примера первого приложения не просто команду вывода на экран, а целую готовую программу по редактированию таблицы базы данных. Такая программа должна уметь Создавать, Показывать, Изменять и Удалять данные в таблице БД, поэтому ее принято называть CRUD-приложением, по первым буквам английских слов Create, Retrive, Update, Delete.&lt;br /&gt;
&lt;br /&gt;
Так как Ананас – бизнес-платформа, то и наше первое CRUD-приложение будет редактировать данные о бизнес-партнерах, также называемых иногда контрагентами. Итак, сегодня мы разработаем CRUD-приложение «Справочник контрагентов». Интересно заметить, что среда разработки платформы Ананас позволяет создать CRUD-приложение без какого-либо написания кода, так что я даже не стал бы называть такую деятельность программированием. Скорее это проектирование.&lt;br /&gt;
&lt;br /&gt;
Для каждого контрагента в справочнике будет храниться следующий упрощенный для нашего случая состав реквизитов:&lt;br /&gt;
&lt;br /&gt;
*Наименование;&lt;br /&gt;
*Почтовый адрес;&lt;br /&gt;
*Телефон;&lt;br /&gt;
*E-Mail;&lt;br /&gt;
*Банк.&lt;br /&gt;
&lt;br /&gt;
Разработка бизнес-схем ведется в среде разработки Дизайнер платформы Ананас. После успешного запуска командой&lt;br /&gt;
&lt;br /&gt;
 [app@app ~]$ ananas-designer&lt;br /&gt;
&lt;br /&gt;
Дизайнер предложит выбрать бизнес-схему для работы из списка, точно так же, как предлагает выбрать бизнес-схему при запуске сам Ананас. Однако, в отличие от Ананаса, Дизайнер предоставляет доступ к настройке и созданию/модификации структур данных, алгоритмов, а также печатных и экранных форм бизнес-схемы.&lt;br /&gt;
&lt;br /&gt;
Для создания новой бизнес-схемы требуется указать (или создать новую) группу в окне диалога выбора бизнес-схем и активировать пункт Новая бизнес-схема меню Действия.&lt;br /&gt;
&lt;br /&gt;
Открывшийся диалог позволяет задать параметры новой бизнес-схемы. Наиболее важными из них являются параметры доступа к базе данных на SQL-сервере и положение файла бизнес-схемы в файловой системе вашего компьютера. Если вы укажете несуществующую базу данных или несуществующий файл бизнес-схемы, они будут созданы Ананасом автоматически.&lt;br /&gt;
&lt;br /&gt;
Имя файла ресурса содержит ссылку на файл, в котором хранятся значения всех остальных полей этого диалога. Имеется возможность выбора ранее созданного файла ресурса: для этого достаточно вызвать диалог выбора файла щелчком по кнопке, расположенной справа от поля с именем файла ресурса. При открытии файла ресурса значения всех полей диалога будут заменены значениями из этого файла.&lt;br /&gt;
&lt;br /&gt;
Заголовок базы данных предназначен для пользователя и отображается в списке доступных для выбора баз данных в диалоге Список бизнес-схем, появляющемся при старте Дизайнера.&lt;br /&gt;
&lt;br /&gt;
Имя базы данных содержит имя базы данных, используемое системой при доступе к серверу базы данных.&lt;br /&gt;
&lt;br /&gt;
Тип сервера базы данных позволяет выбрать один из поддерживаемых Ананасом серверов баз данных (MySQL, PostgreSQL или SQLite). Разумеется, следует убедиться, что соответствующий выбираемому вами типу сервер установлен и запущен, так как здесь вы указываете лишь драйвер, который не будет работать, если не установлен соответствующий сервер.&lt;br /&gt;
&lt;br /&gt;
Адрес сервера базы данных – это адрес компьютера, на котором установлен сервер выбранного выше типа. Разумеется, сервер баз данных может работать как на том же самом компьютере, где вы установили Ананас, так и на любом другом. Если сервер баз данных запущен локально, здесь следует указать значение localhost. В остальных случаях следует узнать адрес сервера у системного администратора. Адрес может быть задан как DNS-именем (например, myhost.com), так и числовым значением (например, 127.0.0.1).&lt;br /&gt;
&lt;br /&gt;
Порт сервера базы данных по умолчанию не содержит никакого значения. Его следует задавать лишь в тех случаях, когда используется нестандартный порт, что случается достаточно редко. По этому вопросу следует консультироваться с системным администратором, выполнявшим установку сервера баз данных. Если вы выполняли установку сервера баз данных самостоятельно и не меняли порт сервера баз данных, то поле Порт сервера базы данных следует оставить пустым.&lt;br /&gt;
&lt;br /&gt;
Задав таким образом значения полей, следует нажать кнопку OK, а затем выбрать только что определенную бизнес-схему и снова нажать OK. После получения подтверждения о локальном сохранении настроек (в каталоге ~/.ananas) откроется главное окно Дизайнера.&lt;br /&gt;
&lt;br /&gt;
Наше CRUD-приложение предназначено для управления Справочником контрагентов, поэтому в дереве бизнес-объектов нас в первую очередь будет интересовать раздел Справочники. Определение справочника начинается с присвоения ему имени, которое в дальнейшем будет использовано в программировании бизнес-логики в процедурах на языке Ананас-Скрипт. В главном окне Дизайнера щелкните правой клавишей мыши по разделу Справочники и в появившемся меню выберите пункт Новый.&lt;br /&gt;
&lt;br /&gt;
В появившемся экранном диалоге закладка Общий позволяет задать имя справочника и заполнить поле Описание. На данном этапе в этом диалоге больше ничего изменять не требуется. Следует закрыть его и перейти к определению реквизитов Справочника контрагентов. Разумеется, среда разработки Ананас позволяет организовать древовидную структуру справочника. Однако, желающих изучить эту тему я адресую к «Справочному руководству по Дизайнеру» Ананаса,&lt;br /&gt;
а для нашего простого CRUD-приложения древовидная структура в Справочнике контрагентов нам не нужна.&lt;br /&gt;
&lt;br /&gt;
Как только вы закроете диалог, где было задано имя справочника, в дереве бизнес-схемы появится папка с именем Справочник контрагентов, внутри которой видны папки Элемент, Группа, Формы. Для определения первого реквизита справочника следует щелкнуть правой кнопкой мыши по папке Элемент и выбрать пункт Новый появившегося меню. В открывшимся диалоге необходимо задать такие свойства реквизита, как Имя, Тип, Ширина (Рис. 4). Прочие свойства задавать&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;
Теперь все готово для перехода к художественной, если можно так выразиться, части создания нашего приложения – «рисованию» экранного диалога. Запустите Редактор диалогов, нажав соответствующую кнопку на вкладке Дизайн – отобразится пустое окно. Слева от него будет расположена палитра доступных диалоговых элементов (виджетов) – окно Toolbox. Справа – редактор свойств элементов – окно Property Editor. Для нашего «натюрморта» будет достаточно&lt;br /&gt;
использовать ровно три элемента палитры:&lt;br /&gt;
&lt;br /&gt;
*Text Label для подписей к полям ввода (Рис. 5).&lt;br /&gt;
*DBField для полей ввода (Рис. 6)&lt;br /&gt;
*ActionButton для кнопок Отмена и Принять (Рис. 6)&lt;br /&gt;
&lt;br /&gt;
Для перетаскивания элементов требуется два клика: первый по элементу палитры, второй – по окну диалога. Перетащите пять раз TextLabel и DBField, разместив их по своему вкусу или как показано на Рис. 7, отредактируйте тексты надписей (двойной щелчок будет здесь незаменим) и задайте привязку для полей ввода, выбрав для каждого из них соответствующий реквизит Справочника контрагентов из списка. Список вызывается двойным щелчком по полю ввода, лежащему в окне диалога. Именно связывание данных (Data bindings), ставшее популярным благодаря таким средам разработки, как Borland Delphi и Visual Basic, и с успехом применяемое в среде разработки платформы Ананас, позволяет нам обойтись при создании CRUD-приложения без написания кода.&lt;br /&gt;
&lt;br /&gt;
После проведения несложной процедуры связывания для всех пяти полей ввода,добавьте в окно диалога кнопки Отмена и Принять, использовав для этого элемент ActionButton палитры. Кнопка Отмена должна просто закрывать окно. Кнопка Принять должна дополнительно сохранять содержимое полей ввода в базе данных.&lt;br /&gt;
&lt;br /&gt;
Поведение кнопки задается в диалоге, вызываемым двойным щелчком по ней. Для кнопки Отмена следует поставить галочки опциям Простое действие и Закрыть диалога. Для кнопки Принять следует поставить третью галочку – Обновить. Для смены текста надписи на кнопке в контекстном меню, вызываемом правой клавишей мыши следует выбрать пункт Edit Text....&lt;br /&gt;
&lt;br /&gt;
===Сделаем красиво===&lt;br /&gt;
&lt;br /&gt;
В принципе, мы уже закончили – наше приложение будет работать. Но, как всякий уважающий себя кулинар и садовник позаботится о внешнем оформлении своего творения, прежде чем показать его публике, так и программист должен позаботиться о привлекательности создаваемого им приложения. Для придания опрятности нашему диалогу воспользуемся возможностями динамического, автоматически масштабируемого размещения элементов. В этом деле нам помогут «пружинки» и типы размещения «Сетка», «Горизонтальные полоски» и «Вертикальные полоски».&lt;br /&gt;
&lt;br /&gt;
Начнем с полей ввода и надписей к ним. Разместив вертикально две пружинки, как показано на Рис. 8, и выделив их все, последовательно щелкая мышкой и удерживая клавишу Shift на клавиатуре, применим тип размещения «Сетка». Получим первый блок сгруппированных элементов диалога. Проделайте то же самое с кнопками Отмена и Принять, только «пружинки» выберите горизонтальные, а тип размещения – «Вертикальные полоски». Последним шагом необходимо снять выделение, ткнув мышкой в пустую область окна диалога, а затем применить тип размещения «Горизонтальные полоски».&lt;br /&gt;
&lt;br /&gt;
Не стоит печалиться, если требуемый результат не удастся получить с первого раза. Во-первых, всегда есть возможность отменить последнее действие при помощи клавиатурной комбинации Ctrl+Z, во-вторых, правила динамического масштабирования определяются, помимо прочего, свойством sizePolicy, индивидуально определяемым для каждого элемента диалога в редакторе свойств Property Editor.&lt;br /&gt;
&lt;br /&gt;
Такая работа требует некоторой привычки и терпения первое время. Овладев методикой задания динамического масштабирования и расположения элементов, вы будете тратить на нее минимум времени.&lt;br /&gt;
&lt;br /&gt;
Теперь нашу работу необходимо сохранить и, для проверки – запустить Ананас. Дизайнер закрывать не требуется. При успешном сохранении в соответствующем окне должны появиться сообщения об успешном обновлении структур базы данных, предназначенных для хранения бизнес-объектов. Если появились ошибки, то скорее всего Ананасу не хватило прав для записи в один из каталогов или не работает доступ к базе данных. Помощь по затруднительным ситуациям доступна на форуме проекта.&lt;br /&gt;
&lt;br /&gt;
===Последний штрих===&lt;br /&gt;
&lt;br /&gt;
А теперь – сюрприз: немного кода все-таки потребуется. Дело в том, что среда исполнения приложений Ананаса не знает, какой экранный диалог нашей бизнес-схемы следует запускать сразу после старта, ведь в нашем приложении могло бы быть несколько экранных форм. Нужен какой-нибудь способ известить Ананас о том, что при старте он должен открыть наш Справочник контрагентов. Для этого предусмотрена предопределенная функция на Ананас-Скрипте с названием on_systemstart(). Если среда исполнения находит такую функцию в глобальном модуле бизнес-схемы при старте, она будет автоматически&lt;br /&gt;
запущена на выполнение.&lt;br /&gt;
&lt;br /&gt;
Доступ к глобальному модулю осуществляется через двойной щелчок по корню дерева бизнес-объектов в Дизайнере и выбор вкладки Глобальный модуль появившегося диалога.&lt;br /&gt;
&lt;br /&gt;
Вот код, который нужно туда записать:&lt;br /&gt;
&lt;br /&gt;
 function on_systemstart()&lt;br /&gt;
 {&lt;br /&gt;
    sys.Message(0,”Привет, Мир! :)”);&lt;br /&gt;
    cat = new CatalogEditor(“Справочник контрагентов”);&lt;br /&gt;
    cat.edit();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Да, да! Он все-таки напечатает «Привет, Мир!» :) в окне сообщений (Рис. 9).&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:%D0%90%D0%BD%D0%B0%D0%BD%D0%B0%D1%81</id>
		<title>LXF98:Ананас</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:%D0%90%D0%BD%D0%B0%D0%BD%D0%B0%D1%81"/>
				<updated>2008-03-21T14:34:16Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Создаем CRUD-приложение==&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;font color=darkred&amp;gt;'''ЧАСТЬ 2'''&amp;lt;/font&amp;gt; Вариации «Hello, World!» набили оскомину – и '''Андрей Паскаль''' будет стараться избежать надоевшего приветствия до последнего, а попутно создаст бизнес-приложение, не написав ни строчки кода!''&lt;br /&gt;
&lt;br /&gt;
Из чего состоит приложение Ананаса? Как начать работу над собственной бизнес-схемой?&lt;br /&gt;
&lt;br /&gt;
В стародавние времена хорошим педагогическим приемом считалось дать в начале учебника пример программы, печатающей на экране приветствие «Hello, World!».&lt;br /&gt;
&lt;br /&gt;
Времена меняются, требования растут, и вот уже новая педагогическая мода диктует необходимость демонстрировать в качестве примера первого приложения не просто команду вывода на экран, а целую готовую программу по редактированию таблицы базы данных. Такая программа должна уметь Создавать, Показывать, Изменять и Удалять данные в таблице БД, поэтому ее принято называть CRUD-приложением, по первым буквам английских слов Create, Retrive, Update, Delete.&lt;br /&gt;
&lt;br /&gt;
Так как Ананас – бизнес-платформа, то и наше первое CRUD-приложение будет редактировать данные о бизнес-партнерах, также называемых иногда контрагентами. Итак, сегодня мы разработаем CRUD-приложение «Справочник контрагентов». Интересно заметить, что среда разработки платформы Ананас позволяет создать CRUD-приложение без какого-либо написания кода, так что я даже не стал бы называть такую деятельность программированием. Скорее это проектирование.&lt;br /&gt;
&lt;br /&gt;
Для каждого контрагента в справочнике будет храниться следующий упрощенный для нашего случая состав реквизитов:&lt;br /&gt;
&lt;br /&gt;
*Наименование;&lt;br /&gt;
*Почтовый адрес;&lt;br /&gt;
*Телефон;&lt;br /&gt;
*E-Mail;&lt;br /&gt;
*Банк.&lt;br /&gt;
&lt;br /&gt;
Разработка бизнес-схем ведется в среде разработки Дизайнер платформы Ананас. После успешного запуска командой&lt;br /&gt;
&lt;br /&gt;
 [app@app ~]$ ananas-designer&lt;br /&gt;
&lt;br /&gt;
Дизайнер предложит выбрать бизнес-схему для работы из списка, точно так же, как предлагает выбрать бизнес-схему при запуске сам Ананас. Однако, в отличие от Ананаса, Дизайнер предоставляет доступ к настройке и созданию/модификации структур данных, алгоритмов, а также печатных и экранных форм бизнес-схемы.&lt;br /&gt;
&lt;br /&gt;
Для создания новой бизнес-схемы требуется указать (или создать новую) группу в окне диалога выбора бизнес-схем и активировать пункт Новая бизнес-схема меню Действия.&lt;br /&gt;
&lt;br /&gt;
Открывшийся диалог позволяет задать параметры новой бизнес-схемы. Наиболее важными из них являются параметры доступа к базе данных на SQL-сервере и положение файла бизнес-схемы в файловой системе вашего компьютера. Если вы укажете несуществующую базу данных или несуществующий файл бизнес-схемы, они будут созданы Ананасом автоматически.&lt;br /&gt;
&lt;br /&gt;
Имя файла ресурса содержит ссылку на файл, в котором хранятся значения всех остальных полей этого диалога. Имеется возможность выбора ранее созданного файла ресурса: для этого достаточно вызвать диалог выбора файла щелчком по кнопке, расположенной справа от поля с именем файла ресурса. При открытии файла ресурса значения всех полей диалога будут заменены значениями из этого файла.&lt;br /&gt;
&lt;br /&gt;
Заголовок базы данных предназначен для пользователя и отображается в списке доступных для выбора баз данных в диалоге Список бизнес-схем, появляющемся при старте Дизайнера.&lt;br /&gt;
&lt;br /&gt;
Имя базы данных содержит имя базы данных, используемое системой при доступе к серверу базы данных.&lt;br /&gt;
&lt;br /&gt;
Тип сервера базы данных позволяет выбрать один из поддерживаемых Ананасом серверов баз данных (MySQL, PostgreSQL или SQLite). Разумеется, следует убедиться, что соответствующий выбираемому вами типу сервер установлен и запущен, так как здесь вы указываете лишь драйвер, который не будет работать, если не установлен соответствующий сервер.&lt;br /&gt;
&lt;br /&gt;
Адрес сервера базы данных – это адрес компьютера, на котором установлен сервер выбранного выше типа. Разумеется, сервер баз данных может работать как на том же самом компьютере, где вы установили Ананас, так и на любом другом. Если сервер баз данных запущен локально, здесь следует указать значение localhost. В остальных случаях следует узнать адрес сервера у системного администратора. Адрес может быть задан как DNS-именем (например, myhost.com), так и числовым значением (например, 127.0.0.1).&lt;br /&gt;
&lt;br /&gt;
Порт сервера базы данных по умолчанию не содержит никакого значения. Его следует задавать лишь в тех случаях, когда используется нестандартный порт, что случается достаточно редко. По этому вопросу следует консультироваться с системным администратором, выполнявшим установку сервера баз данных. Если вы выполняли установку сервера баз данных самостоятельно и не меняли порт сервера баз данных, то поле Порт сервера базы данных следует оставить пустым.&lt;br /&gt;
&lt;br /&gt;
Задав таким образом значения полей, следует нажать кнопку OK, а затем выбрать только что определенную бизнес-схему и снова нажать OK. После получения подтверждения о локальном сохранении настроек (в каталоге ~/.ananas) откроется главное окно Дизайнера.&lt;br /&gt;
&lt;br /&gt;
Наше CRUD-приложение предназначено для управления Справочником контрагентов, поэтому в дереве бизнес-объектов нас в первую очередь будет интересовать раздел Справочники. Определение справочника начинается с присвоения ему имени, которое в дальнейшем будет использовано в программировании бизнес-логики в процедурах на языке Ананас-Скрипт. В главном окне Дизайнера щелкните правой клавишей мыши по разделу Справочники и в появившемся меню выберите пункт Новый.&lt;br /&gt;
&lt;br /&gt;
В появившемся экранном диалоге закладка Общий позволяет задать имя справочника и заполнить поле Описание. На данном этапе в этом диалоге больше ничего изменять не требуется. Следует закрыть его и перейти к определению реквизитов Справочника контрагентов. Разумеется, среда разработки Ананас позволяет организовать древовидную структуру справочника. Однако, желающих изучить эту тему я адресую к «Справочному руководству по Дизайнеру» Ананаса,&lt;br /&gt;
а для нашего простого CRUD-приложения древовидная структура в Справочнике контрагентов нам не нужна.&lt;br /&gt;
&lt;br /&gt;
Как только вы закроете диалог, где было задано имя справочника, в дереве бизнес-схемы появится папка с именем Справочник контрагентов, внутри которой видны папки Элемент, Группа, Формы. Для определения первого реквизита справочника следует щелкнуть правой кнопкой мыши по папке Элемент и выбрать пункт Новый появившегося меню. В открывшимся диалоге необходимо задать такие свойства реквизита, как Имя, Тип, Ширина (Рис. 4). Прочие свойства задавать&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;
Теперь все готово для перехода к художественной, если можно так выразиться, части создания нашего приложения – «рисованию» экранного диалога. Запустите Редактор диалогов, нажав соответствующую кнопку на вкладке Дизайн – отобразится пустое окно. Слева от него будет расположена палитра доступных диалоговых элементов (виджетов) – окно Toolbox. Справа – редактор свойств элементов – окно Property Editor. Для нашего «натюрморта» будет достаточно&lt;br /&gt;
использовать ровно три элемента палитры:&lt;br /&gt;
&lt;br /&gt;
*Text Label для подписей к полям ввода (Рис. 5).&lt;br /&gt;
*DBField для полей ввода (Рис. 6)&lt;br /&gt;
*ActionButton для кнопок Отмена и Принять (Рис. 6)&lt;br /&gt;
&lt;br /&gt;
Для перетаскивания элементов требуется два клика: первый по элементу палитры, второй – по окну диалога. Перетащите пять раз TextLabel и DBField, разместив их по своему вкусу или как показано на Рис. 7, отредактируйте тексты надписей (двойной щелчок будет здесь незаменим) и задайте привязку для полей ввода, выбрав для каждого из них соответствующий реквизит Справочника контрагентов из списка. Список вызывается двойным щелчком по полю ввода, лежащему в окне диалога. Именно связывание данных (Data bindings), ставшее популярным благодаря таким средам разработки, как Borland Delphi и Visual Basic, и с успехом применяемое в среде разработки платформы Ананас, позволяет нам обойтись при создании CRUD-приложения без написания кода.&lt;br /&gt;
&lt;br /&gt;
После проведения несложной процедуры связывания для всех пяти полей ввода,добавьте в окно диалога кнопки Отмена и Принять, использовав для этого элемент ActionButton палитры. Кнопка Отмена должна просто закрывать окно. Кнопка Принять должна дополнительно сохранять содержимое полей ввода в базе данных.&lt;br /&gt;
&lt;br /&gt;
Поведение кнопки задается в диалоге, вызываемым двойным щелчком по ней. Для кнопки Отмена следует поставить галочки опциям Простое действие и Закрыть диалога. Для кнопки Принять следует поставить третью галочку – Обновить. Для смены текста надписи на кнопке в контекстном меню, вызываемом правой клавишей мыши следует выбрать пункт Edit Text....&lt;br /&gt;
&lt;br /&gt;
===Сделаем красиво===&lt;br /&gt;
&lt;br /&gt;
В принципе, мы уже закончили – наше приложение будет работать. Но, как всякий уважающий себя кулинар и садовник позаботится о внешнем оформлении своего творения, прежде чем показать его публике, так и программист должен позаботиться о привлекательности создаваемого им приложения. Для придания опрятности нашему диалогу воспользуемся возможностями динамического, автоматически масштабируемого размещения элементов. В этом деле нам помогут «пружинки» и типы размещения «Сетка», «Горизонтальные полоски» и «Вертикальные полоски».&lt;br /&gt;
&lt;br /&gt;
Начнем с полей ввода и надписей к ним. Разместив вертикально две пружинки, как показано на Рис. 8, и выделив их все, последовательно щелкая мышкой и удерживая клавишу Shift на клавиатуре, применим тип размещения «Сетка». Получим первый блок сгруппированных элементов диалога. Проделайте то же самое с кнопками Отмена и Принять, только «пружинки» выберите горизонтальные, а тип размещения – «Вертикальные полоски». Последним шагом необходимо снять выделение, ткнув мышкой в пустую область окна диалога, а затем применить тип размещения «Горизонтальные полоски».&lt;br /&gt;
&lt;br /&gt;
Не стоит печалиться, если требуемый результат не удастся получить с первого раза. Во-первых, всегда есть возможность отменить последнее действие при помощи клавиатурной комбинации Ctrl+Z, во-вторых, правила динамического масштабирования определяются, помимо прочего, свойством sizePolicy, индивидуально определяемым для каждого элемента диалога в редакторе свойств Property Editor.&lt;br /&gt;
&lt;br /&gt;
Такая работа требует некоторой привычки и терпения первое время. Овладев методикой задания динамического масштабирования и расположения элементов, вы будете тратить на нее минимум времени.&lt;br /&gt;
&lt;br /&gt;
Теперь нашу работу необходимо сохранить и, для проверки – запустить Ананас. Дизайнер закрывать не требуется. При успешном сохранении в соответствующем окне должны появиться сообщения об успешном обновлении структур базы данных, предназначенных для хранения бизнес-объектов. Если появились ошибки, то скорее всего Ананасу не хватило прав для записи в один из каталогов или не работает доступ к базе данных. Помощь по затруднительным ситуациям доступна на форуме проекта.&lt;br /&gt;
&lt;br /&gt;
===Последний штрих===&lt;br /&gt;
&lt;br /&gt;
А теперь – сюрприз: немного кода все-таки потребуется. Дело в том, что среда исполнения приложений Ананаса не знает, какой экранный диалог нашей бизнес-схемы следует запускать сразу после старта, ведь в нашем приложении могло бы быть несколько экранных форм. Нужен какой-нибудь способ известить Ананас о том, что при старте он должен открыть наш Справочник контрагентов. Для этого предусмотрена предопределенная функция на Ананас-Скрипте с названием on_systemstart(). Если среда исполнения находит такую функцию в глобальном модуле бизнес-схемы при старте, она будет автоматически&lt;br /&gt;
запущена на выполнение.&lt;br /&gt;
&lt;br /&gt;
Доступ к глобальному модулю осуществляется через двойной щелчок по корню дерева бизнес-объектов в Дизайнере и выбор вкладки Глобальный модуль появившегося диалога.&lt;br /&gt;
&lt;br /&gt;
Вот код, который нужно туда записать.&lt;br /&gt;
[code]&lt;br /&gt;
function on_systemstart()&lt;br /&gt;
{&lt;br /&gt;
   sys.Message(0,”Привет, Мир! :)”);&lt;br /&gt;
   cat = new CatalogEditor(“Справочник контрагентов”);&lt;br /&gt;
   cat.edit();&lt;br /&gt;
}&lt;br /&gt;
[/code]&lt;br /&gt;
&lt;br /&gt;
Да, да! Он все-таки напечатает «Привет, Мир!» :) в окне сообщений (Рис. 9).&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:%D0%90%D0%BD%D0%B0%D0%BD%D0%B0%D1%81</id>
		<title>LXF98:Ананас</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:%D0%90%D0%BD%D0%B0%D0%BD%D0%B0%D1%81"/>
				<updated>2008-03-21T14:33:52Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: Новая: ==Создаем CRUD-приложение==  ''&amp;lt;font color=darkred&amp;gt;'''ЧАСТЬ 2'''&amp;lt;/font&amp;gt; Вариации «Hello, World!» набили оскомину – и '''Андрей Па...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Создаем CRUD-приложение==&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;font color=darkred&amp;gt;'''ЧАСТЬ 2'''&amp;lt;/font&amp;gt; Вариации «Hello, World!» набили оскомину – и '''Андрей Паскаль''' будет стараться избежать надоевшего приветствия до последнего, а попутно создаст бизнес-приложение, не написав ни строчки кода!''&lt;br /&gt;
&lt;br /&gt;
Из чего состоит приложение Ананаса? Как начать работу над собственной бизнес-схемой?&lt;br /&gt;
&lt;br /&gt;
В стародавние времена хорошим педагогическим приемом считалось дать в начале учебника пример программы, печатающей на экране приветствие «Hello, World!».&lt;br /&gt;
&lt;br /&gt;
Времена меняются, требования растут, и вот уже новая педагогическая мода диктует необходимость демонстрировать в качестве примера первого приложения не просто команду вывода на экран, а целую готовую программу по редактированию таблицы базы данных. Такая программа должна уметь Создавать, Показывать, Изменять и Удалять данные в таблице БД, поэтому ее принято называть CRUD-приложением, по первым буквам английских слов Create, Retrive, Update, Delete.&lt;br /&gt;
&lt;br /&gt;
Так как Ананас – бизнес-платформа, то и наше первое CRUD-приложение будет редактировать данные о бизнес-партнерах, также называемых иногда контрагентами. Итак, сегодня мы разработаем CRUD-приложение «Справочник контрагентов». Интересно заметить, что среда разработки платформы Ананас позволяет создать CRUD-приложение без какого-либо написания кода, так что я даже не стал бы называть такую деятельность программированием. Скорее это проектирование.&lt;br /&gt;
&lt;br /&gt;
Для каждого контрагента в справочнике будет храниться следующий упрощенный для нашего случая состав реквизитов:&lt;br /&gt;
&lt;br /&gt;
*Наименование;&lt;br /&gt;
*Почтовый адрес;&lt;br /&gt;
*Телефон;&lt;br /&gt;
*E-Mail;&lt;br /&gt;
*Банк.&lt;br /&gt;
&lt;br /&gt;
Разработка бизнес-схем ведется в среде разработки Дизайнер платформы Ананас. После успешного запуска командой&lt;br /&gt;
&lt;br /&gt;
 [app@app ~]$ ananas-designer&lt;br /&gt;
&lt;br /&gt;
Дизайнер предложит выбрать бизнес-схему для работы из списка, точно так же, как предлагает выбрать бизнес-схему при запуске сам Ананас. Однако, в отличие от Ананаса, Дизайнер предоставляет доступ к настройке и созданию/модификации структур данных, алгоритмов, а также печатных и экранных форм бизнес-схемы.&lt;br /&gt;
&lt;br /&gt;
Для создания новой бизнес-схемы требуется указать (или создать новую) группу в окне диалога выбора бизнес-схем и активировать пункт Новая бизнес-схема меню Действия.&lt;br /&gt;
&lt;br /&gt;
Открывшийся диалог позволяет задать параметры новой бизнес-схемы. Наиболее важными из них являются параметры доступа к базе данных на SQL-сервере и положение файла бизнес-схемы в файловой системе вашего компьютера. Если вы укажете несуществующую базу данных или несуществующий файл бизнес-схемы, они будут созданы Ананасом автоматически.&lt;br /&gt;
&lt;br /&gt;
Имя файла ресурса содержит ссылку на файл, в котором хранятся значения всех остальных полей этого диалога. Имеется возможность выбора ранее созданного файла ресурса: для этого достаточно вызвать диалог выбора файла щелчком по кнопке, расположенной справа от поля с именем файла ресурса. При открытии файла ресурса значения всех полей диалога будут заменены значениями из этого файла.&lt;br /&gt;
&lt;br /&gt;
Заголовок базы данных предназначен для пользователя и отображается в списке доступных для выбора баз данных в диалоге Список бизнес-схем, появляющемся при старте Дизайнера.&lt;br /&gt;
&lt;br /&gt;
Имя базы данных содержит имя базы данных, используемое системой при доступе к серверу базы данных.&lt;br /&gt;
&lt;br /&gt;
Тип сервера базы данных позволяет выбрать один из поддерживаемых Ананасом серверов баз данных (MySQL, PostgreSQL или SQLite). Разумеется, следует убедиться, что соответствующий выбираемому вами типу сервер установлен и запущен, так как здесь вы указываете лишь драйвер, который не будет работать, если не установлен соответствующий сервер.&lt;br /&gt;
&lt;br /&gt;
Адрес сервера базы данных – это адрес компьютера, на котором установлен сервер выбранного выше типа. Разумеется, сервер баз данных может работать как на том же самом компьютере, где вы установили Ананас, так и на любом другом. Если сервер баз данных запущен локально, здесь следует указать значение localhost. В остальных случаях следует узнать адрес сервера у системного администратора. Адрес может быть задан как DNS-именем (например, myhost.com), так и числовым значением (например, 127.0.0.1).&lt;br /&gt;
&lt;br /&gt;
Порт сервера базы данных по умолчанию не содержит никакого значения. Его следует задавать лишь в тех случаях, когда используется нестандартный порт, что случается достаточно редко. По этому вопросу следует консультироваться с системным администратором, выполнявшим установку сервера баз данных. Если вы выполняли установку сервера баз данных самостоятельно и не меняли порт сервера баз данных, то поле Порт сервера базы данных следует оставить пустым.&lt;br /&gt;
&lt;br /&gt;
Задав таким образом значения полей, следует нажать кнопку OK, а затем выбрать только что определенную бизнес-схему и снова нажать OK. После получения подтверждения о локальном сохранении настроек (в каталоге ~/.ananas) откроется главное окно Дизайнера.&lt;br /&gt;
&lt;br /&gt;
Наше CRUD-приложение предназначено для управления Справочником контрагентов, поэтому в дереве бизнес-объектов нас в первую очередь будет интересовать раздел Справочники. Определение справочника начинается с присвоения ему имени, которое в дальнейшем будет использовано в программировании бизнес-логики в процедурах на языке Ананас-Скрипт. В главном окне Дизайнера щелкните правой клавишей мыши по разделу Справочники и в появившемся меню выберите пункт Новый.&lt;br /&gt;
&lt;br /&gt;
В появившемся экранном диалоге закладка Общий позволяет задать имя справочника и заполнить поле Описание. На данном этапе в этом диалоге больше ничего изменять не требуется. Следует закрыть его и перейти к определению реквизитов Справочника контрагентов. Разумеется, среда разработки Ананас позволяет организовать древовидную структуру справочника. Однако, желающих изучить эту тему я адресую к «Справочному руководству по Дизайнеру» Ананаса,&lt;br /&gt;
а для нашего простого CRUD-приложения древовидная структура в Справочнике контрагентов нам не нужна.&lt;br /&gt;
&lt;br /&gt;
Как только вы закроете диалог, где было задано имя справочника, в дереве бизнес-схемы появится папка с именем Справочник контрагентов, внутри которой видны папки Элемент, Группа, Формы. Для определения первого реквизита справочника следует щелкнуть правой кнопкой мыши по папке Элемент и выбрать пункт Новый появившегося меню. В открывшимся диалоге необходимо задать такие свойства реквизита, как Имя, Тип, Ширина (Рис. 4). Прочие свойства задавать&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;
Теперь все готово для перехода к художественной, если можно так выразиться, части создания нашего приложения – «рисованию» экранного диалога. Запустите Редактор диалогов, нажав соответствующую кнопку на вкладке Дизайн – отобразится пустое окно. Слева от него будет расположена палитра доступных диалоговых элементов (виджетов) – окно Toolbox. Справа – редактор свойств элементов – окно Property Editor. Для нашего «натюрморта» будет достаточно&lt;br /&gt;
использовать ровно три элемента палитры:&lt;br /&gt;
&lt;br /&gt;
*Text Label для подписей к полям ввода (Рис. 5).&lt;br /&gt;
*DBField для полей ввода (Рис. 6)&lt;br /&gt;
*ActionButton для кнопок Отмена и Принять (Рис. 6)&lt;br /&gt;
&lt;br /&gt;
Для перетаскивания элементов требуется два клика: первый по элементу палитры, второй – по окну диалога. Перетащите пять раз TextLabel и DBField, разместив их по своему вкусу или как показано на Рис. 7, отредактируйте тексты надписей (двойной щелчок будет здесь незаменим) и задайте привязку для полей ввода, выбрав для каждого из них соответствующий реквизит Справочника контрагентов из списка. Список вызывается двойным щелчком по полю ввода, лежащему в окне диалога. Именно связывание данных (Data bindings), ставшее популярным благодаря таким средам разработки, как Borland Delphi и Visual Basic, и с успехом применяемое в среде разработки платформы Ананас, позволяет нам обойтись при создании CRUD-приложения без написания кода.&lt;br /&gt;
&lt;br /&gt;
После проведения несложной процедуры связывания для всех пяти полей ввода,добавьте в окно диалога кнопки Отмена и Принять, использовав для этого элемент ActionButton палитры. Кнопка Отмена должна просто закрывать окно. Кнопка Принять должна дополнительно сохранять содержимое полей ввода в базе данных.&lt;br /&gt;
&lt;br /&gt;
Поведение кнопки задается в диалоге, вызываемым двойным щелчком по ней. Для кнопки Отмена следует поставить галочки опциям Простое действие и Закрыть диалога. Для кнопки Принять следует поставить третью галочку – Обновить. Для смены текста надписи на кнопке в контекстном меню, вызываемом правой клавишей мыши следует выбрать пункт Edit Text....&lt;br /&gt;
&lt;br /&gt;
===Сделаем красиво===&lt;br /&gt;
&lt;br /&gt;
В принципе, мы уже закончили – наше приложение будет работать. Но, как всякий уважающий себя кулинар и садовник позаботится о внешнем оформлении своего творения, прежде чем показать его публике, так и программист должен позаботиться о привлекательности создаваемого им приложения. Для придания опрятности нашему диалогу воспользуемся возможностями динамического, автоматически масштабируемого размещения элементов. В этом деле нам помогут «пружинки» и типы размещения «Сетка», «Горизонтальные полоски» и «Вертикальные полоски».&lt;br /&gt;
&lt;br /&gt;
Начнем с полей ввода и надписей к ним. Разместив вертикально две пружинки, как показано на Рис. 8, и выделив их все, последовательно щелкая мышкой и удерживая клавишу Shift на клавиатуре, применим тип размещения «Сетка». Получим первый блок сгруппированных элементов диалога. Проделайте то же самое с кнопками Отмена и Принять, только «пружинки» выберите горизонтальные, а тип размещения – «Вертикальные полоски». Последним шагом необходимо снять выделение, ткнув мышкой в пустую область окна диалога, а затем применить тип размещения «Горизонтальные полоски».&lt;br /&gt;
&lt;br /&gt;
Не стоит печалиться, если требуемый результат не удастся получить с первого раза. Во-первых, всегда есть возможность отменить последнее действие при помощи клавиатурной комбинации Ctrl+Z, во-вторых, правила динамического масштабирования определяются, помимо прочего, свойством sizePolicy, индивидуально определяемым для каждого элемента диалога в редакторе свойств Property Editor.&lt;br /&gt;
&lt;br /&gt;
Такая работа требует некоторой привычки и терпения первое время. Овладев методикой задания динамического масштабирования и расположения элементов, вы будете тратить на нее минимум времени.&lt;br /&gt;
&lt;br /&gt;
Теперь нашу работу необходимо сохранить и, для проверки – запустить Ананас. Дизайнер закрывать не требуется. При успешном сохранении в соответствующем окне должны появиться сообщения об успешном обновлении структур базы данных, предназначенных для хранения бизнес-объектов. Если появились ошибки, то скорее всего Ананасу не хватило прав для записи в один из каталогов или не работает доступ к базе данных. Помощь по затруднительным ситуациям доступна на форуме проекта.&lt;br /&gt;
&lt;br /&gt;
===Последний штрих===&lt;br /&gt;
&lt;br /&gt;
А теперь – сюрприз: немного кода все-таки потребуется. Дело в том, что среда исполнения приложений Ананаса не знает, какой экранный диалог нашей бизнес-схемы следует запускать сразу после старта, ведь в нашем приложении могло бы быть несколько экранных форм. Нужен какой-нибудь способ известить Ананас о том, что при старте он должен открыть наш Справочник контрагентов. Для этого предусмотрена предопределенная функция на Ананас-Скрипте с названием on_systemstart(). Если среда исполнения находит такую функцию в глобальном модуле бизнес-схемы при старте, она будет автоматически&lt;br /&gt;
запущена на выполнение.&lt;br /&gt;
&lt;br /&gt;
Доступ к глобальному модулю осуществляется через двойной щелчок по корню дерева бизнес-объектов в Дизайнере и выбор вкладки Глобальный модуль появившегося диалога.&lt;br /&gt;
&lt;br /&gt;
Вот код, который нужно туда записать.&lt;br /&gt;
[code]&lt;br /&gt;
 function on_systemstart()&lt;br /&gt;
 {&lt;br /&gt;
    sys.Message(0,”Привет, Мир! :)”);&lt;br /&gt;
    cat = new CatalogEditor(“Справочник контрагентов”);&lt;br /&gt;
    cat.edit();&lt;br /&gt;
 }&lt;br /&gt;
[/code]&lt;br /&gt;
&lt;br /&gt;
Да, да! Он все-таки напечатает «Привет, Мир!» :) в окне сообщений (Рис. 9).&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:Hardcore_Linux</id>
		<title>LXF98:Hardcore Linux</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:Hardcore_Linux"/>
				<updated>2008-03-20T19:59:56Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;font color=darkred&amp;gt;VirtualBox:&amp;lt;/font&amp;gt; Windows в Ubuntu==&lt;br /&gt;
&lt;br /&gt;
''Запускайте приложения Microsoft под Linux в Ubuntu Feisty при помощи VirtualBox от Innotek и Windows XP – '''Джек Найт''' здесь на коне….''&lt;br /&gt;
&lt;br /&gt;
Требовалось ли вам когда-нибудь на вашей машине одно или несколько Windows-приложений для решения некоторой задачи? А может, у вас есть клиент, использующий Windows, и вам надо работать с документами ''MS Project'' или запускать непосредственно ''Outlook'' для совместного использования их календарей ''MS Exchange''? Один из выходов – двойная загрузка, другой – запуск Windows XP в качестве гостевой ОС на виртуальной машине (ВМ); но&lt;br /&gt;
есть действительно классное решение – угадайте, какое? Бесплатное, по крайней мере для большинства из нас! ''VirtualBox'' от ''Innotek'' – удивительный продукт, и хотя я на самом деле не проверял его производительность, навскидку кажется, что он значительно превосходит и ''VMWare Workstation'', и ''Server''. Он располагает набором приятных функций и возможностью организовать сетевой мост через беспроводной адаптер ноутбука (нечто прежде немыслимое в ''VMWare'') – чем не продукт-конфетка?&lt;br /&gt;
&lt;br /&gt;
Innotek применяет дуальную схему лицензирования – существуют открытая и закрытая двоичная версии ''VirtualBox'' (последняя бесплатна для ознакомления или персонального использования). Более того, у Innonek весьма разумная политика лицензирования для малого бизнеса – по запросу о покупке коммерческих лицензий на две машины я был любезно извещен, что это относится к категории «бесплатно»! Уже в восторге? Ну, это только начало – а вот и убойный довод: при помощи этой штуки можно запускать отдельные приложения Windows на рабочем столе Linux, и они появятся как обычные окна Gnome, KDE (или другие) на вашем X-столе. Прибавьте сюда ''Beryl/Compiz'', и получите весьма впечатляющий инструмент. Качайте с [http://www.virtualbox.org www.virtualbox.org].&lt;br /&gt;
&lt;br /&gt;
Но как заставить все это работать? Что ж, понадобится кое-какая подгонка и на стороне Linux, и на стороне Windows – но результат стоящий, по крайней мере, по моему скромному мнению. В этой статье я проведу вас через настройку моста через беспроводной адаптер на ноутбуке, а продолжу настройкой двух типичных приложений, зависящих от Windows – ''MS Project'' и ''Outlook'', чтобы под Ubuntu Feisty они выглядели как родные.&lt;br /&gt;
&lt;br /&gt;
===План действий===&lt;br /&gt;
&lt;br /&gt;
Вот что мы проделаем на следующих страницах:&lt;br /&gt;
&lt;br /&gt;
*Кое-что подправим для устранения неприятностей с USB и DVD.&lt;br /&gt;
*Создадим TAP-устройство на сетевом интерфейсе базовой машины (идеально для WLAN-интерфейса ноутбука).&lt;br /&gt;
*Установим персональную/пробную версию ''VirtualBox'' от Innotek.&lt;br /&gt;
*Создадим ВМ для Windows XP и настроим ее на использование сетевого TAP-устройства.&lt;br /&gt;
*Установим Windows XP (самые общие моменты).&lt;br /&gt;
*Настроим Windows XP со всеми тонкостями, для безупречной работы.&lt;br /&gt;
*Настроим ''VirtualBox'' на работу без ручного вмешательства и автоматический старт.&lt;br /&gt;
*Введем пункты меню для наших приложений-примеров.&lt;br /&gt;
&lt;br /&gt;
В детали установки гостевой ОС я вдаваться не буду: если кто не знает, как это сделать, описание найти легко. Зато приведу простой метод установки самого ''VirtualBox''.&lt;br /&gt;
&lt;br /&gt;
Лично я использую на этом уроке Ubuntu 7.04 (Feisty), но эти инструкции должны отлично работать для dapper или edgy, при мелких изменениях (например, замене всех вхождений слова «feisty» по смыслу). Они должны работать и в Kubuntu; правда, я еще не проделывал мои операции в KDE, чтобы разобраться с отличиями. Машину, где запущен VirtualBox, я буду называть HOST [хост], а запущенные в нем системы – GUEST [гость]. Предполагается, что вы можете запускать командную оболочку и использовать редактор для изменения текстовых файлов. Прежде чем продолжить, познакомьтесь со врезкой&lt;br /&gt;
Избавляемся от неприятностей.&lt;br /&gt;
&lt;br /&gt;
===Настраиваем TAP-устройство===&lt;br /&gt;
&lt;br /&gt;
Нам нужно установить пакеты, а именно ''User Mode Linux Utilities'' и ''Proxy Arp Routing Daemon''. Для начала убедитесь, что подключен репозиторий '''universe''': в строке-меню Gnome выберите &amp;lt;font color=darkblue&amp;gt;Система &amp;gt; Администрирование &amp;gt; Источники приложений&amp;lt;/font&amp;gt;, затем установите галочку &amp;lt;font color=darkblue&amp;gt;Свободное ПО, поддерживаемое сообществом&amp;lt;/font&amp;gt; (&amp;lt;font color=darkblue&amp;gt;universe&amp;lt;/font&amp;gt;). Теперь откройте терминал и введите:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install uml-utilities parprouted&lt;br /&gt;
 sudo chgrp vboxusers /dev/net/tun&lt;br /&gt;
&lt;br /&gt;
Теперь надо встроить TAP в сетевой адаптер хост-системы. Это особенно полезно для ноутбуков с беспроводными интерфейсами, поскольку WLAN-адаптер обычно получает IP-адрес через DHCP, но гостевая машина не может делать этого – как правило, несколько IP-адресов нельзя получить для того, что в сущности является клонированным интерфейсом. К тому же если беспроводной интерфейс использует защиту WPA, то появление интерфейса-клона, вероятно, заставит WAP&lt;br /&gt;
(Wireless Access Point – точка беспроводного доступа) заподозрить, что компьютер под атакой. Итак, сделаем вот что: выявим неиспользованные подсети, выберем пару уникальных IP-адресов и присвоим один TAP-устройству, а другой гостевой машине. Неважно, что они фиксированы: адрес хост-машины будет динамическим, и они будут проходить через маскардинг. В итоге гостевая машина будет «просто работать», где бы вы ни получили WLAN-соединение для хоста.&lt;br /&gt;
&lt;br /&gt;
Проще всего создать скрипт для инициализации TAP-устройства и поддержки конфигурации сети. Вот мой вариант:&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 # Имя: tapctrl&lt;br /&gt;
 # Использование: tapctrl start|stop&lt;br /&gt;
 # Обеспечивает: tap для virtualbox во внешней сети, включая беспроводные&lt;br /&gt;
 # Аннотация:&lt;br /&gt;
 # устанавливает tap-устройство для совместного использования  интерфейса wifi с vbox&lt;br /&gt;
 # Описание: создает виртуальный tap-интерфейс, присваивает IP- адрес, настраивает iptables&lt;br /&gt;
 # для маскарадинга через устройство по умолчанию&lt;br /&gt;
 # и настраивает прокси arp с демоном parprouted для корректной маршрутизации&lt;br /&gt;
 # Автор: Jack Knight&lt;br /&gt;
 # - Open Source Migrations Ltd, UK (http://www.osml.co.uk)&lt;br /&gt;
 # Настраиваем переменные здесь:&lt;br /&gt;
 DESC=”Virtualbox IP tap”&lt;br /&gt;
 PATH=/sbin:/bin:/usr/sbin:/usr/bin&lt;br /&gt;
 TUNDEVICE=tap1 # Произвольно, но должно соответствовать устройству, указанному в сетевых настройках VirtualBox.&lt;br /&gt;
 LANDEVICE=eth1 # Исправьте, чтобы соответствовало вашему сетевому устройству – может быть eth0, eth1 ath0, wlan1 и т. д.&lt;br /&gt;
 IPADDR=172.16.254.254 # Произвольно, но убедитесь, что вы взяли нечто из неиспользуемой подсети&lt;br /&gt;
 case “$1” in start|restart|force-reload)&lt;br /&gt;
           echo -n “Starting $DESC: “&lt;br /&gt;
           tunctl -t $TUNDEVICE -u $USER&lt;br /&gt;
           ip link set $TUNDEVICE up&lt;br /&gt;
           ip addr add $IPADDR dev $TUNDEVICE&lt;br /&gt;
              arp -Ds $IPADDR $TUNDEVICE pub&lt;br /&gt;
           iptables -t nat -A POSTROUTING -o $LANDEVICE -j MASQUERADE&lt;br /&gt;
           iptables -t nat -P POSTROUTING ACCEPT # Разрешаем работу других интерфейсов&lt;br /&gt;
              echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
              echo 1 &amp;gt; /proc/sys/net/ipv4/conf/$TUNDEVICE/proxy_ arp&lt;br /&gt;
              parprouted $LANDEVICE $TUNDEVICE&lt;br /&gt;
 stop)&lt;br /&gt;
              echo -n “Stopping $DESC: “&lt;br /&gt;
              iptables --table nat -F&lt;br /&gt;
              killall parprouted&lt;br /&gt;
              ip link set $TUNDEVICE down ;;&lt;br /&gt;
 *)&lt;br /&gt;
           N=/etc/init.d/$NAME&lt;br /&gt;
              echo “Usage: $N start|stop” &amp;gt;&amp;amp;2&lt;br /&gt;
              exit 1&lt;br /&gt;
              ;;&lt;br /&gt;
 esac&lt;br /&gt;
 exit 0&lt;br /&gt;
&lt;br /&gt;
Этот код есть на DVD; если кому-то нужно, у меня также есть более проработанный скрипт, работающий со многими пользователями, виртуальными машинами и устройствами и не опубликованный здесь ради простоты. Не стесняйтесь обращаться за ним ко мне по электронной почте через мой web-сайт.&lt;br /&gt;
&lt;br /&gt;
===Установка VirtualBox===&lt;br /&gt;
&lt;br /&gt;
К сожалению, поскольку на момент написания ''VirtualBox'' еще не попал в основные репозитории Ubuntu, перед установкой пакета придется добавить новый сторонний репозиторий от ''VirtualBox'':&lt;br /&gt;
&lt;br /&gt;
 sudo sh -c ‘echo “# VirtualBox репозиторий для Ubuntu Feisty Fawn&lt;br /&gt;
 deb http://www.virtualbox.org/debian feisty non-free” \&lt;br /&gt;
   &amp;gt; /etc/apt/sources.list.d/feisty-virtualbox.list’&lt;br /&gt;
 wget http://www.virtualbox.org/debian/innotek.asc -O- | sudo apt-key add -&lt;br /&gt;
 sudo apt-get update&lt;br /&gt;
 sudo apt-get -y install virtualbox&lt;br /&gt;
&lt;br /&gt;
===Настройка виртуальной машины===&lt;br /&gt;
&lt;br /&gt;
На хост-ситеме Ubuntu нам понадобится механизм совместного использования файлов мирами Linux и Windows. К счастью, ''VirtualBox'' имеет для этого встроенный механизм , так что Samba на хост-машине или NFS на обеих сторонах можно не устанавливать. Учтите: совместного использования вашего жесткого диска НЕ получится, пока вы не установите ''Vbox GuestAdditions'' в гостевой системе! При создании общих папок гостевая система должна быть выключена.&lt;br /&gt;
&lt;br /&gt;
Общие папки работают только в версии 1.3.8; в версию 1.4.0 вкралась ошибка! Если у вас та самая версия, и вы не хотите возиться с Samba ради совместного доступа, скачайте iso с [http://www.virtualbox.de/download/1.3.8/VBoxGuestAdditions_1.3.8.iso www.virtualbox.de/download/1.3.8/VBoxGuestAdditions_1.3.8.iso].&lt;br /&gt;
&lt;br /&gt;
Выключите ВМ, смените виртуальный '''cdrom''' на этот '''iso''' и перезапустите гостевую систему. Установите ''VirtualBoxGuest Additions'', и все должно заработать. Пока что я не слыхал о неприятностях, связанных с «не той» версией гостевых дополнений. Это должно вас временно выручить, до следующей версии, где Innotek, скорее всего, исправит эту ошибку.&lt;br /&gt;
&lt;br /&gt;
Для настройки на стороне хоста, с выключенной гостевой ОС, просто выберите вашу ВМ в окне ''VirtualBox Manager'' и нажмите &amp;lt;font color=darkblue&amp;gt;Свойства&amp;lt;/font&amp;gt;, а затем &amp;lt;font color=darkblue&amp;gt;Общие папки&amp;lt;/font&amp;gt; у нижнего края, как показано на экранном снимке справа, заполните два поля подходящими значениями и нажмите &amp;lt;font color=darkblue&amp;gt;OK&amp;lt;/font&amp;gt;. Теперь запустите гостевую ОС и, открыв окно DOS, введите:&lt;br /&gt;
&lt;br /&gt;
 net use E: \\vboxsvr\Shared_Folder&lt;br /&gt;
&lt;br /&gt;
и добавьте &amp;lt;font color=darkred&amp;gt;/Persistent:Yes&amp;lt;/font&amp;gt; к этой команде, если хотите сохранить это при перезапуске. Внимание: не ошибитесь в написании &amp;lt;font color=darkred&amp;gt;vboxsvr&amp;lt;/font&amp;gt; – это важно!&lt;br /&gt;
&lt;br /&gt;
Альтернативный метод – открыть окно ''Проводника'' Windows и выбрать &amp;lt;font color=darkblue&amp;gt;Сервис &amp;gt; Подключить сетевой диск&amp;lt;/font&amp;gt;; вы увидите диалоговое окно, похожее на то, что справа. Тем же манером вставьте подходящие значения и нажмите &amp;lt;font color=darkblue&amp;gt;Готово&amp;lt;/font&amp;gt;. Если все в порядке, то появится новое окно ''Проводника'' с содержимым каталога хост-машины.&lt;br /&gt;
&lt;br /&gt;
Далее включим RDP-протокол, чтобы разрешить удаленные сессии. Просто щелкните на флажке &amp;lt;font color=darkblue&amp;gt;Enable VRDP Server&amp;lt;/font&amp;gt;, как показано в этой колонке ниже.&lt;br /&gt;
&lt;br /&gt;
===Настройка Windows XP===&lt;br /&gt;
&lt;br /&gt;
Следующие настройки в принципе могут работать и для других версий Windows, не XP, но я не берусь этого утверждать, поскольку не успел протестировать. Нам нужны такие настройки, чтобы наша установленная Windows выводила на экран только панель задач, но не рабочий стол. Для этого поковыряемся в реестре; но учтите, что в Windows XP SP2 доступ к рассматриваемым настройкам ограничен, и обычный пользователь не вправе изменять эту часть – поэтому сперва мы временно присвоим права администратора пользователю, который будет использовать сессию Windows.&lt;br /&gt;
&lt;br /&gt;
Войдите как «Администратор» (или любой другой пользователь с достаточными правами), затем перейдите в нужное место посредством &amp;lt;font color=darkblue&amp;gt;Пуск &amp;gt; Настройки &amp;gt; Панель управления &amp;gt; Пользователи&amp;lt;/font&amp;gt; и щелкните на записи, которую хотите использовать для запуска Windows-программ. Щелкните на &amp;lt;font color=darkblue&amp;gt;Изменить тип учетной записи&amp;lt;/font&amp;gt; и установите переключатель в &amp;lt;font color=darkblue&amp;gt;Администратор компьютера&amp;lt;/font&amp;gt;, затем обратитесь к кнопке &amp;lt;font color=darkblue&amp;gt;Изменить тип учетной записи&amp;lt;/font&amp;gt;. Теперь выйдите из-под администратора и войдите как ваш пользователь, запустите ''regedit32'' и найдите следующий ключ:&lt;br /&gt;
&lt;br /&gt;
 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer&lt;br /&gt;
&lt;br /&gt;
Нам необходимо создать новое значение &amp;lt;font color=darkred&amp;gt;DWORD&amp;lt;/font&amp;gt; с именем &amp;lt;font color=darkred&amp;gt;NoDesktop&amp;lt;/font&amp;gt; и присвоить ему значение &amp;lt;font color=darkblue&amp;gt;1&amp;lt;/font&amp;gt;, чтобы Windows отображала только приложение, которое мы хотим запустить, а не весь рабочий стол. Для этого выберите &amp;lt;font color=darkblue&amp;gt;Правка&amp;lt;/font&amp;gt; в главном меню, далее &amp;lt;font color=darkblue&amp;gt;Создать и Параметр DWORD&amp;lt;/font&amp;gt; и введите имя &amp;lt;font color=darkred&amp;gt;NoDesktop&amp;lt;/font&amp;gt;, затем нажмите &amp;lt;font color=darkblue&amp;gt;Enter&amp;lt;/font&amp;gt;. Ключ теперь должен быть выделен, поэтому нажмите вновь &amp;lt;font color=darkblue&amp;gt;Enter&amp;lt;/font&amp;gt;, чтобы отредактировать его и установить его значение в &amp;lt;font color=darkred&amp;gt;1&amp;lt;/font&amp;gt;. По завершении все&lt;br /&gt;
должно выглядеть как на экранном снимке в конце этой колонки.&lt;br /&gt;
&lt;br /&gt;
Другой вариант – загрузка файла [http://www.osml.eu/files/nodesktop.reg www.osml.eu/files/nodesktop.reg] с сервера Open Source Migrations Limited (используйте его на собственный страх и риск). Сохраните его на своем рабочем столе, затем просто дважды щелкните на нем, подтвердите действие, и реестр соответствующим образом изменится.&lt;br /&gt;
&lt;br /&gt;
Теперь вы, вероятно, захотите отнять права администратора у учетной записи, повторив предыдущую процедуру в обратном порядке. Работа в Windows с правами администратора столь же небезопасна, как работа в Linux или Unix от имени суперпользователя, и если у вас нет для нее серьезных причин, выйдите из системы и войдите как администратор, превратите пользователя в обычного, и тогда мы сможем завершить наши другие задачи.&lt;br /&gt;
&lt;br /&gt;
====Настройка Windows на автоматический вход.====&lt;br /&gt;
&lt;br /&gt;
*Нажмите кнопку &amp;lt;font color=darkblue&amp;gt;Пуск&amp;lt;/font&amp;gt;, выберите &amp;lt;font color=darkblue&amp;gt;Выполнить&amp;lt;/font&amp;gt;, введите в окне&lt;br /&gt;
 control userpasswords2&lt;br /&gt;
и нажмите &amp;lt;font color=darkblue&amp;gt;OK&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Снимите галочку около &amp;lt;font color=darkblue&amp;gt;Требовать ввод имени и пароля пользователя&amp;lt;/font&amp;gt; и нажмите &amp;lt;font color=darkblue&amp;gt;Применить&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Появится окно с запросом: под каким пользователем и паролем вы хотите осуществить автоматический вход. Просто введите ранее определенные имя и пароль пользователя.&lt;br /&gt;
&lt;br /&gt;
====Установка Гостевых Дополнений VirtualBox.====&lt;br /&gt;
&lt;br /&gt;
*Выберите в главном меню окна вашей ВМ пункт Devices [Устройства], затем щелкните на &amp;lt;font color=darkblue&amp;gt;Install Guest Additions&amp;lt;/font&amp;gt;.&lt;br /&gt;
*Отвечайте на вопросы установщика для завершения установки.&lt;br /&gt;
&lt;br /&gt;
====Настройка фиксированного IP-адреса, используемого Windows.====&lt;br /&gt;
&lt;br /&gt;
*Перейдите к &amp;lt;font color=darkblue&amp;gt;Пуск &amp;gt; Настройка &amp;gt; Панель управления &amp;gt; Сетевые подключения&amp;lt;/font&amp;gt;.&lt;br /&gt;
*Выполните правый щелчок на &amp;lt;font color=darkblue&amp;gt;Подключение к локальной сети&amp;lt;/font&amp;gt; и выберите &amp;lt;font color=darkblue&amp;gt;Свойства&amp;lt;/font&amp;gt;.&lt;br /&gt;
*Введите IP-адрес, соответствующую маску подсети, адрес шлюза по умолчанию и по крайней мере один DNS-сервер. Вы можете найти&lt;br /&gt;
ваш(и) DNS сервер(а), набрав в терминале хост-машины:&lt;br /&gt;
 cat /etc/resolv.conf&lt;br /&gt;
После слов &amp;lt;font color=darkred&amp;gt;nameserver&amp;lt;/font&amp;gt; указаны IP-адреса DNS-серверов. Шлюз по умолчанию должен соответствовать определенному для вашего TAP-интерфейса в '''/etc/tap.conf'''. Учтите: IP-адрес должен отличаться от IP ''Virtual Box'', прописанного в файле '''/etc/tap.conf'''. Я предлагаю устанавливать IP-адреса, отсчитывая от конца диапазона назад в '''tap.conf''' – т. е. от 254 и меньше для каждого TAP-устройства – и от начала диапазона для ваших гостевых машин, например, 172.16.254.1 и больше. Настройте ваш маршрутизатор на выдачу Windows другого IP. У большинства из вас, вероятно, только одно TAP-устройство, так что это не должно быть проблемой.&lt;br /&gt;
&lt;br /&gt;
====Включение RDP-соединений в Windows и установка пароля.====&lt;br /&gt;
&lt;br /&gt;
*Нажмите &amp;lt;font color=darkblue&amp;gt;Пуск &amp;gt; Настройка &amp;gt; Панель управления &amp;gt; Система&amp;lt;/font&amp;gt; и перейдите на вкладку &amp;lt;font color=darkblue&amp;gt;Удаленные сеансы&amp;lt;/font&amp;gt;.&lt;br /&gt;
*Поставьте галочку напротив пункта &amp;lt;font color=darkblue&amp;gt;Разрешить удаленные подключения к этому компьютеру&amp;lt;/font&amp;gt; и нажмите OK.&lt;br /&gt;
*В &amp;lt;font color=darkblue&amp;gt;Панели управления&amp;lt;/font&amp;gt; щелкните на &amp;lt;font color=darkblue&amp;gt;Пользователи&amp;lt;/font&amp;gt;. Выберите пользователя, под которым хотите входить, и нажмите &amp;lt;font color=darkblue&amp;gt;Создать пароль&amp;lt;/font&amp;gt;.&lt;br /&gt;
*Введите ваш пароль в появившейся строке и нажмите кнопку Создать пароль. Учтите: этот пароль надо установить обязательно, иначе нормальной работы не будет.&lt;br /&gt;
*Далее, загрузите файл: [http://www.cendio.se/files/thinlinc/seamlessrdp/seamlessrdp.zip www.cendio.se/files/thinlinc/seamlessrdp/seamlessrdp.zip] и распакуйте его в '''C:\seamlessrdp'''.&lt;br /&gt;
*Теперь подготовим Windows XP Pro для разрешения удаленного доступа с глубиной цвета 256 бит.&lt;br /&gt;
*Нажмите &amp;lt;font color=darkblue&amp;gt;Пуск&amp;lt;/font&amp;gt;, &amp;lt;font color=darkblue&amp;gt;Выполнить&amp;lt;/font&amp;gt;, введите в поле &amp;lt;font color=darkred&amp;gt;''regedit''&amp;lt;/font&amp;gt; и нажмите &amp;lt;font color=darkblue&amp;gt;OK&amp;lt;/font&amp;gt;.&lt;br /&gt;
*В редакторе реестра перейдите к ключу: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp&lt;br /&gt;
*В панели справа выделите ключ ColorDepth и щелкните на нем правой кнопкой мыши. Выберите Изменить и измените поле Значение на 4.&lt;br /&gt;
*Или, для удобства, просто загрузите файл: [http://www.osml.eu/files/rdpcolourdepth.reg www.osml.eu/files/rdpcolourdepth.reg] с сервера Open Source Migrations Limited (используйте на свой страх и риск). Сохраните его на рабочем столе, затем дважды щелкните на нем, подтвердите действие – и реестр будет изменен. На этом завершается настройка на стороне Windows.&lt;br /&gt;
&lt;br /&gt;
===Настройка: VirtualBox===&lt;br /&gt;
&lt;br /&gt;
Теперь можно настроить ''VirtualBox'' на автозапуск при загрузке. Вопервых, мы собираемся запустить вашу машину из командной строки,&lt;br /&gt;
поэтому в терминале введите:&lt;br /&gt;
&lt;br /&gt;
 VBoxManage startvm “WinXPPro” -type vrdp&lt;br /&gt;
&lt;br /&gt;
Замените здесь &amp;lt;font color=darkred&amp;gt;WinXPPro&amp;lt;/font&amp;gt; на имя вашей ВМ. Чтобы Windows всякий раз запускалась без проблем, выполните &amp;lt;font color=darkblue&amp;gt;Система &amp;gt; Параметры &amp;gt; Сеансы&amp;lt;/font&amp;gt; и выберите вкладку &amp;lt;font color=darkblue&amp;gt;Запускаемые при старте программы&amp;lt;/font&amp;gt;. Щелкните на кнопке &amp;lt;font color=darkblue&amp;gt;Создать&amp;lt;/font&amp;gt;, затем скопируйте и вставьте указанную выше команду в текстовое поле и нажмите &amp;lt;font color=darkblue&amp;gt;OK&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перед запуском новой ВМ необходимо убедиться, что наша нижняя панель сворачивается, иначе в Windows будут не видны кнопка &amp;lt;font color=darkblue&amp;gt;Пуск&amp;lt;/font&amp;gt; и системный лоток, и нам это необходимо по крайней мере один раз (а может, и больше): если мы далее в Windows наткнемся на проблемы или для установки новых приложений. Просто щелкните правой кнопкой мыши в пустом месте нижней панели и выберите &amp;lt;font color=darkblue&amp;gt;Свойства&amp;lt;/font&amp;gt;, установите флажок &amp;lt;font color=darkblue&amp;gt;Показывать/скрывать кнопки&amp;lt;/font&amp;gt; и нажмите &amp;lt;font color=darkblue&amp;gt;OK&amp;lt;/font&amp;gt;. Теперь слева и справа на вашей панели есть кнопки с изображением стрелки, позволяющие при нажатии ее спрятать.&lt;br /&gt;
&lt;br /&gt;
Теперь впервые запустим нашу ВМ Windows. В терминале наберите:&lt;br /&gt;
&lt;br /&gt;
 rdesktop -rsound -A -s “c:\seamlessrdp\seamlessrdpshell.exe C:\Windows\explorer.exe” &amp;lt;IP-адрес Windows XP&amp;gt;:3389 -u “&amp;lt;Имя пользователя Windows&amp;gt;” -p &amp;lt;Ваш пароль Windows&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вам нужно будет соответственно изменить переменные. Практически все, но будет виден полный рабочий стол, поскольку Windows необходимо перезагрузить, чтобы все новые возможности заработали. Это немного путано, но сделать так придется, потому что XP не будет воспринимать удаленные подключения, пока вы хоть раз не войдете. Короче, нажмите комбинацию клавиш &amp;lt;font color=darkblue&amp;gt;Ctrl+Esc&amp;lt;/font&amp;gt; и выберите &amp;lt;font color=darkblue&amp;gt;Завершить сеанс&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выполните предыдущую команду снова, и у вас, после небольшой задержки на вход пользователя, должно появиться отдельное окно ''Проводника''.&lt;br /&gt;
&lt;br /&gt;
Вы должны видеть просто запущенное окно ''Проводника'', а при нажатии одной из вышеупомянутых стрелок на нижней панели Gnome появится кнопка &amp;lt;font color=darkblue&amp;gt;Пуск&amp;lt;/font&amp;gt; и т.д.&lt;br /&gt;
&lt;br /&gt;
Теперь мы можем войти в верхнее меню Ubuntu, &amp;lt;font color=darkblue&amp;gt;Система &amp;gt; Параметры &amp;gt; Главное меню&amp;lt;/font&amp;gt; и определить важные приложения, без которых вам не жить. Например, для установки ''Outlook'' (подразумевается, из ''Office 2003'') вам следует поместить в строку следующую команду:&lt;br /&gt;
&lt;br /&gt;
 /usr/bin/rdesktop -rsound -A -s “c:\seamlessrdp\seamlessrdpshell.exe C:\&lt;br /&gt;
 Program Files\Microsoft Office\OFFICE11\OUTLOOK.EXE” &amp;lt;IP-адрес&lt;br /&gt;
 Windows XP&amp;gt;:3389 -u “&amp;lt;Имя пользователя Windows &amp;gt;” -p &amp;lt;Ваш пароль&lt;br /&gt;
 Windows &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Наконец, выключить ВМ можно так:&lt;br /&gt;
&lt;br /&gt;
 VBoxManage controlvm “Windows-XP-Pro” savestate&lt;br /&gt;
&lt;br /&gt;
или так:&lt;br /&gt;
&lt;br /&gt;
 VBoxManage controlvm “Windows-XP-Pro” acpipowerbutton&lt;br /&gt;
&lt;br /&gt;
для сохранения текущего состояния машины; или имитировать отключение питания. Пора звать к своему монитору друзей – пусть подивятся на ваши подвиги!&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:Hardcore_Linux</id>
		<title>LXF98:Hardcore Linux</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:Hardcore_Linux"/>
				<updated>2008-03-20T19:46:17Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;font color=darkred&amp;gt;VirtualBox:&amp;lt;/font&amp;gt; Windows в Ubuntu==&lt;br /&gt;
&lt;br /&gt;
''Запускайте приложения Microsoft под Linux в Ubuntu Feisty при помощи VirtualBox от Innotek и Windows XP – '''Джек Найт''' здесь на коне….''&lt;br /&gt;
&lt;br /&gt;
Требовалось ли вам когда-нибудь на вашей машине одно или несколько Windows-приложений для решения некоторой задачи? А может, у вас есть клиент, использующий Windows, и вам надо работать с документами ''MS Project'' или запускать непосредственно ''Outlook'' для совместного использования их календарей ''MS Exchange''? Один из выходов – двойная загрузка, другой – запуск Windows XP в качестве гостевой ОС на виртуальной машине (ВМ); но&lt;br /&gt;
есть действительно классное решение – угадайте, какое? Бесплатное, по крайней мере для большинства из нас! ''VirtualBox'' от ''Innotek'' – удивительный продукт, и хотя я на самом деле не проверял его производительность, навскидку кажется, что он значительно превосходит и ''VMWare Workstation'', и ''Server''. Он располагает набором приятных функций и возможностью организовать сетевой мост через беспроводной адаптер ноутбука (нечто прежде немыслимое в ''VMWare'') – чем не продукт-конфетка?&lt;br /&gt;
&lt;br /&gt;
Innotek применяет дуальную схему лицензирования – существуют открытая и закрытая двоичная версии ''VirtualBox'' (последняя бесплатна для ознакомления или персонального использования). Более того, у Innonek весьма разумная политика лицензирования для малого бизнеса – по запросу о покупке коммерческих лицензий на две машины я был любезно извещен, что это относится к категории «бесплатно»! Уже в восторге? Ну, это только начало – а вот и убойный довод: при помощи этой штуки можно запускать отдельные приложения Windows на рабочем столе Linux, и они появятся как обычные окна Gnome, KDE (или другие) на вашем X-столе. Прибавьте сюда ''Beryl/Compiz'', и получите весьма впечатляющий инструмент. Качайте с [http://www.virtualbox.org www.virtualbox.org].&lt;br /&gt;
&lt;br /&gt;
Но как заставить все это работать? Что ж, понадобится кое-какая подгонка и на стороне Linux, и на стороне Windows – но результат стоящий, по крайней мере, по моему скромному мнению. В этой статье я проведу вас через настройку моста через беспроводной адаптер на ноутбуке, а продолжу настройкой двух типичных приложений, зависящих от Windows – ''MS Project'' и ''Outlook'', чтобы под Ubuntu Feisty они выглядели как родные.&lt;br /&gt;
&lt;br /&gt;
===План действий===&lt;br /&gt;
&lt;br /&gt;
Вот что мы проделаем на следующих страницах:&lt;br /&gt;
&lt;br /&gt;
*Кое-что подправим для устранения неприятностей с USB и DVD.&lt;br /&gt;
*Создадим TAP-устройство на сетевом интерфейсе базовой машины (идеально для WLAN-интерфейса ноутбука).&lt;br /&gt;
*Установим персональную/пробную версию ''VirtualBox'' от Innotek.&lt;br /&gt;
*Создадим ВМ для Windows XP и настроим ее на использование сетевого TAP-устройства.&lt;br /&gt;
*Установим Windows XP (самые общие моменты).&lt;br /&gt;
*Настроим Windows XP со всеми тонкостями, для безупречной работы.&lt;br /&gt;
*Настроим ''VirtualBox'' на работу без ручного вмешательства и автоматический старт.&lt;br /&gt;
*Введем пункты меню для наших приложений-примеров.&lt;br /&gt;
&lt;br /&gt;
В детали установки гостевой ОС я вдаваться не буду: если кто не знает, как это сделать, описание найти легко. Зато приведу простой метод установки самого ''VirtualBox''.&lt;br /&gt;
&lt;br /&gt;
Лично я использую на этом уроке Ubuntu 7.04 (Feisty), но эти инструкции должны отлично работать для dapper или edgy, при мелких изменениях (например, замене всех вхождений слова «feisty» по смыслу). Они должны работать и в Kubuntu; правда, я еще не проделывал мои операции в KDE, чтобы разобраться с отличиями. Машину, где запущен VirtualBox, я буду называть HOST [хост], а запущенные в нем системы – GUEST [гость]. Предполагается, что вы можете запускать командную оболочку и использовать редактор для изменения текстовых файлов. Прежде чем продолжить, познакомьтесь со врезкой&lt;br /&gt;
Избавляемся от неприятностей.&lt;br /&gt;
&lt;br /&gt;
===Настраиваем TAP-устройство===&lt;br /&gt;
&lt;br /&gt;
Нам нужно установить пакеты, а именно ''User Mode Linux Utilities'' и ''Proxy Arp Routing Daemon''. Для начала убедитесь, что подключен репозиторий '''universe''': в строке-меню Gnome выберите Система &amp;gt; Администрирование &amp;gt; Источники приложений, затем установите галочку Свободное ПО, поддерживаемое сообществом (universe). Теперь откройте терминал и введите:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install uml-utilities parprouted&lt;br /&gt;
 sudo chgrp vboxusers /dev/net/tun&lt;br /&gt;
&lt;br /&gt;
Теперь надо встроить TAP в сетевой адаптер хост-системы. Это особенно полезно для ноутбуков с беспроводными интерфейсами, поскольку WLAN-адаптер обычно получает IP-адрес через DHCP, но гостевая машина не может делать этого – как правило, несколько IP-адресов нельзя получить для того, что в сущности является клонированным интерфейсом. К тому же если беспроводной интерфейс использует защиту WPA, то появление интерфейса-клона, вероятно, заставит WAP&lt;br /&gt;
(Wireless Access Point – точка беспроводного доступа) заподозрить, что компьютер под атакой. Итак, сделаем вот что: выявим неиспользованные подсети, выберем пару уникальных IP-адресов и присвоим один TAP-устройству, а другой гостевой машине. Неважно, что они фиксированы: адрес хост-машины будет динамическим, и они будут проходить через маскардинг. В итоге гостевая машина будет «просто работать», где бы вы ни получили WLAN-соединение для хоста.&lt;br /&gt;
&lt;br /&gt;
Проще всего создать скрипт для инициализации TAP-устройства и поддержки конфигурации сети. Вот мой вариант:&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 # Имя: tapctrl&lt;br /&gt;
 # Использование: tapctrl start|stop&lt;br /&gt;
 # Обеспечивает: tap для virtualbox во внешней сети, включая беспроводные&lt;br /&gt;
 # Аннотация:&lt;br /&gt;
 # устанавливает tap-устройство для совместного использования  интерфейса wifi с vbox&lt;br /&gt;
 # Описание: создает виртуальный tap-интерфейс, присваивает IP- адрес, настраивает iptables&lt;br /&gt;
 # для маскарадинга через устройство по умолчанию&lt;br /&gt;
 # и настраивает прокси arp с демоном parprouted для корректной маршрутизации&lt;br /&gt;
 # Автор: Jack Knight&lt;br /&gt;
 # - Open Source Migrations Ltd, UK (http://www.osml.co.uk)&lt;br /&gt;
 # Настраиваем переменные здесь:&lt;br /&gt;
 DESC=”Virtualbox IP tap”&lt;br /&gt;
 PATH=/sbin:/bin:/usr/sbin:/usr/bin&lt;br /&gt;
 TUNDEVICE=tap1 # Произвольно, но должно соответствовать устройству, указанному в сетевых настройках VirtualBox.&lt;br /&gt;
 LANDEVICE=eth1 # Исправьте, чтобы соответствовало вашему сетевому устройству – может быть eth0, eth1 ath0, wlan1 и т. д.&lt;br /&gt;
 IPADDR=172.16.254.254 # Произвольно, но убедитесь, что вы взяли нечто из неиспользуемой подсети&lt;br /&gt;
 case “$1” in start|restart|force-reload)&lt;br /&gt;
           echo -n “Starting $DESC: “&lt;br /&gt;
           tunctl -t $TUNDEVICE -u $USER&lt;br /&gt;
           ip link set $TUNDEVICE up&lt;br /&gt;
           ip addr add $IPADDR dev $TUNDEVICE&lt;br /&gt;
              arp -Ds $IPADDR $TUNDEVICE pub&lt;br /&gt;
           iptables -t nat -A POSTROUTING -o $LANDEVICE -j MASQUERADE&lt;br /&gt;
           iptables -t nat -P POSTROUTING ACCEPT # Разрешаем работу других интерфейсов&lt;br /&gt;
              echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
              echo 1 &amp;gt; /proc/sys/net/ipv4/conf/$TUNDEVICE/proxy_ arp&lt;br /&gt;
              parprouted $LANDEVICE $TUNDEVICE&lt;br /&gt;
 stop)&lt;br /&gt;
              echo -n “Stopping $DESC: “&lt;br /&gt;
              iptables --table nat -F&lt;br /&gt;
              killall parprouted&lt;br /&gt;
              ip link set $TUNDEVICE down ;;&lt;br /&gt;
 *)&lt;br /&gt;
           N=/etc/init.d/$NAME&lt;br /&gt;
              echo “Usage: $N start|stop” &amp;gt;&amp;amp;2&lt;br /&gt;
              exit 1&lt;br /&gt;
              ;;&lt;br /&gt;
 esac&lt;br /&gt;
 exit 0&lt;br /&gt;
&lt;br /&gt;
Этот код есть на DVD; если кому-то нужно, у меня также есть более проработанный скрипт, работающий со многими пользователями, виртуальными машинами и устройствами и не опубликованный здесь ради простоты. Не стесняйтесь обращаться за ним ко мне по электронной почте через мой web-сайт.&lt;br /&gt;
&lt;br /&gt;
===Установка VirtualBox===&lt;br /&gt;
&lt;br /&gt;
К сожалению, поскольку на момент написания ''VirtualBox'' еще не попал в основные репозитории Ubuntu, перед установкой пакета придется добавить новый сторонний репозиторий от ''VirtualBox'':&lt;br /&gt;
&lt;br /&gt;
 sudo sh -c ‘echo “# VirtualBox репозиторий для Ubuntu Feisty Fawn&lt;br /&gt;
 deb http://www.virtualbox.org/debian feisty non-free” \&lt;br /&gt;
   &amp;gt; /etc/apt/sources.list.d/feisty-virtualbox.list’&lt;br /&gt;
 wget http://www.virtualbox.org/debian/innotek.asc -O- | sudo apt-key add -&lt;br /&gt;
 sudo apt-get update&lt;br /&gt;
 sudo apt-get -y install virtualbox&lt;br /&gt;
&lt;br /&gt;
===Настройка виртуальной машины===&lt;br /&gt;
&lt;br /&gt;
На хост-ситеме Ubuntu нам понадобится механизм совместного использования файлов мирами Linux и Windows. К счастью, ''VirtualBox'' имеет для этого встроенный механизм , так что Samba на хост-машине или NFS на обеих сторонах можно не устанавливать. Учтите: совместного использования вашего жесткого диска НЕ получится, пока вы не установите ''Vbox GuestAdditions'' в гостевой системе! При создании общих папок гостевая система должна быть выключена.&lt;br /&gt;
&lt;br /&gt;
Общие папки работают только в версии 1.3.8; в версию 1.4.0 вкралась ошибка! Если у вас та самая версия, и вы не хотите возиться с Samba ради совместного доступа, скачайте iso с www.virtualbox.de/download/1.3.8/VBoxGuestAdditions_1.3.8.iso.&lt;br /&gt;
&lt;br /&gt;
Выключите ВМ, смените виртуальный '''cdrom''' на этот '''iso''' и перезапустите гостевую систему. Установите ''VirtualBoxGuest Additions'', и все должно заработать. Пока что я не слыхал о неприятностях, связанных с «не той» версией гостевых дополнений. Это должно вас временно выручить, до следующей версии, где Innotek, скорее всего, исправит эту ошибку.&lt;br /&gt;
&lt;br /&gt;
Для настройки на стороне хоста, с выключенной гостевой ОС, просто выберите вашу ВМ в окне ''VirtualBox Manager'' и нажмите Свойства, а затем Общие папки у нижнего края, как показано на экранном снимке справа, заполните два поля подходящими значениями и нажмите OK. Теперь запустите гостевую ОС и, открыв окно DOS, введите:&lt;br /&gt;
&lt;br /&gt;
 net use E: \\vboxsvr\Shared_Folder&lt;br /&gt;
&lt;br /&gt;
и добавьте /Persistent:Yes к этой команде, если хотите сохранить это при перезапуске. Внимание: не ошибитесь в написании vboxsvr – это&lt;br /&gt;
важно!&lt;br /&gt;
&lt;br /&gt;
Альтернативный метод – открыть окно ''Проводника'' Windows и выбрать Сервис &amp;gt; Подключить сетевой диск; вы увидите диалоговое окно, похожее на то, что справа. Тем же манером вставьте подходящие значения и нажмите Готово. Если все в порядке, то появится новое окно ''Проводника'' с содержимым каталога хост-машины.&lt;br /&gt;
&lt;br /&gt;
Далее включим RDP-протокол, чтобы разрешить удаленные сессии. Просто щелкните на флажке Enable VRDP Server, как показано в этой колонке ниже.&lt;br /&gt;
&lt;br /&gt;
===Настройка Windows XP===&lt;br /&gt;
&lt;br /&gt;
Следующие настройки в принципе могут работать и для других версий Windows, не XP, но я не берусь этого утверждать, поскольку не успел протестировать. Нам нужны такие настройки, чтобы наша установленная Windows выводила на экран только панель задач, но не рабочий стол. Для этого поковыряемся в реестре; но учтите, что в Windows XP SP2 доступ к рассматриваемым настройкам ограничен, и обычный пользователь не вправе изменять эту часть – поэтому сперва мы временно присвоим права администратора пользователю, который будет использовать сессию Windows.&lt;br /&gt;
&lt;br /&gt;
Войдите как «Администратор» (или любой другой пользователь с достаточными правами), затем перейдите в нужное место посредством Пуск &amp;gt; Настройки &amp;gt; Панель управления &amp;gt; Пользователи и щелкните на записи, которую хотите использовать для запуска Windows-программ. Щелкните на Изменить тип учетной записи и установите переключатель в Администратор компьютера, затем обратитесь к кнопке Изменить тип учетной записи. Теперь выйдите из-под администратора и войдите как ваш пользователь, запустите ''regedit32'' и найдите следующий ключ:&lt;br /&gt;
&lt;br /&gt;
 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer&lt;br /&gt;
&lt;br /&gt;
Нам необходимо создать новое значение DWORD с именем NoDesktop и присвоить ему значение 1, чтобы Windows отображала только приложение, которое мы хотим запустить, а не весь рабочий стол. Для этого выберите Правка в главном меню, далее Создать и Параметр DWORD и введите имя NoDesktop, затем нажмите Enter. Ключ теперь должен быть выделен, поэтому нажмите вновь Enter, чтобы отредактировать его и установить его значение в 1. По завершении все&lt;br /&gt;
должно выглядеть как на экранном снимке в конце этой колонки.&lt;br /&gt;
&lt;br /&gt;
Другой вариант – загрузка файла www.osml.eu/files/nodesktop.reg с сервера Open Source Migrations Limited (используйте его на собственный страх и риск). Сохраните его на своем рабочем столе, затем просто дважды щелкните на нем, подтвердите действие, и реестр соответствующим образом изменится.&lt;br /&gt;
&lt;br /&gt;
Теперь вы, вероятно, захотите отнять права администратора у учетной записи, повторив предыдущую процедуру в обратном порядке. Работа в Windows с правами администратора столь же небезопасна, как работа в Linux или Unix от имени суперпользователя, и если у вас нет для нее серьезных причин, выйдите из системы и войдите как администратор, превратите пользователя в обычного, и тогда мы сможем завершить наши другие задачи.&lt;br /&gt;
&lt;br /&gt;
====Настройка Windows на автоматический вход.====&lt;br /&gt;
&lt;br /&gt;
*Нажмите кнопку Пуск, выберите Выполнить, введите в окне&lt;br /&gt;
 control userpasswords2&lt;br /&gt;
и нажмите OK.&lt;br /&gt;
&lt;br /&gt;
*Снимите галочку около Требовать ввод имени и пароля пользователя и нажмите Применить.&lt;br /&gt;
&lt;br /&gt;
*Появится окно с запросом: под каким пользователем и паролем вы хотите осуществить автоматический вход. Просто введите ранее определенные имя и пароль пользователя.&lt;br /&gt;
&lt;br /&gt;
====Установка Гостевых Дополнений VirtualBox.====&lt;br /&gt;
&lt;br /&gt;
*Выберите в главном меню окна вашей ВМ пункт Devices [Устройства], затем щелкните на Install Guest Additions.&lt;br /&gt;
*Отвечайте на вопросы установщика для завершения установки.&lt;br /&gt;
&lt;br /&gt;
====Настройка фиксированного IP-адреса, используемого Windows.====&lt;br /&gt;
&lt;br /&gt;
*Перейдите к Пуск &amp;gt; Настройка &amp;gt; Панель управления &amp;gt; Сетевые подключения.&lt;br /&gt;
*Выполните правый щелчок на Подключение к локальной сети и выберите Свойства.&lt;br /&gt;
*Введите IP-адрес, соответствующую маску подсети, адрес шлюза по умолчанию и по крайней мере один DNS-сервер. Вы можете найти&lt;br /&gt;
ваш(и) DNS сервер(а), набрав в терминале хост-машины:&lt;br /&gt;
 cat /etc/resolv.conf&lt;br /&gt;
После слов nameserver указаны IP-адреса DNS-серверов. Шлюз по умолчанию должен соответствовать определенному для вашего TAP-интерфейса в '''/etc/tap.conf'''. Учтите: IP-адрес должен отличаться от IP ''Virtual Box'', прописанного в файле '''/etc/tap.conf'''. Я предлагаю устанавливать IP-адреса, отсчитывая от конца диапазона назад в '''tap.conf''' – т. е. от 254 и меньше для каждого TAP-устройства – и от начала диапазона для ваших гостевых машин, например, 172.16.254.1 и больше. Настройте ваш маршрутизатор на выдачу Windows другого IP. У большинства из вас, вероятно, только одно TAP-устройство, так что это не должно быть проблемой.&lt;br /&gt;
&lt;br /&gt;
====Включение RDP-соединений в Windows и установка пароля.====&lt;br /&gt;
&lt;br /&gt;
*Нажмите Пуск &amp;gt; Настройка &amp;gt; Панель управления &amp;gt; Система и перейдите на вкладку Удаленные сеансы.&lt;br /&gt;
*Поставьте галочку напротив пункта Разрешить удаленные подключения к этому компьютеру и нажмите OK.&lt;br /&gt;
*В Панели управления щелкните на Пользователи. Выберите пользователя, под которым хотите входить, и нажмите Создать пароль.&lt;br /&gt;
*Введите ваш пароль в появившейся строке и нажмите кнопку Создать пароль. Учтите: этот пароль надо установить обязательно, иначе нормальной работы не будет.&lt;br /&gt;
*Далее, загрузите файл: www.cendio.se/files/thinlinc/seamlessrdp/seamlessrdp.zip и распакуйте его в C:\seamlessrdp.&lt;br /&gt;
*Теперь подготовим Windows XP Pro для разрешения удаленного доступа с глубиной цвета 256 бит.&lt;br /&gt;
*Нажмите Пуск, Выполнить, введите в поле &amp;lt;font color=darkred&amp;gt;''regedit''&amp;lt;/font&amp;gt; и нажмите OK.&lt;br /&gt;
*В редакторе реестра перейдите к ключу: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp&lt;br /&gt;
*В панели справа выделите ключ ColorDepth и щелкните на нем правой кнопкой мыши. Выберите Изменить и измените поле Значение на 4.&lt;br /&gt;
*Или, для удобства, просто загрузите файл: www.osml.eu/files/rdpcolourdepth.reg с сервера Open Source Migrations Limited (используйте на свой страх и риск). Сохраните его на рабочем столе, затем дважды щелкните на нем, подтвердите действие – и реестр будет изменен. На этом завершается настройка на стороне Windows.&lt;br /&gt;
&lt;br /&gt;
===Настройка: VirtualBox===&lt;br /&gt;
&lt;br /&gt;
Теперь можно настроить ''VirtualBox'' на автозапуск при загрузке. Вопервых, мы собираемся запустить вашу машину из командной строки,&lt;br /&gt;
поэтому в терминале введите:&lt;br /&gt;
&lt;br /&gt;
 VBoxManage startvm “WinXPPro” -type vrdp&lt;br /&gt;
&lt;br /&gt;
Замените здесь WinXPPro на имя вашей ВМ. Чтобы Windows всякий раз запускалась без проблем, выполните Система &amp;gt; Параметры &amp;gt; Сеансы и выберите вкладку Запускаемые при старте программы.&lt;br /&gt;
&lt;br /&gt;
Щелкните на кнопке Создать, затем скопируйте и вставьте указанную выше команду в текстовое поле и нажмите OK.&lt;br /&gt;
&lt;br /&gt;
Перед запуском новой ВМ необходимо убедиться, что наша нижняя панель сворачивается, иначе в Windows будут не видны кнопка Пуск и системный лоток, и нам это необходимо по крайней мере один раз (а может, и больше): если мы далее в Windows наткнемся на проблемы или для установки новых приложений. Просто щелкните правой кнопкой мыши в пустом месте нижней панели и выберите Свойства, установите флажок Показывать/скрывать кнопки и нажмите OK. Теперь слева&lt;br /&gt;
и справа на вашей панели есть кнопки с изображением стрелки, позволяющие при нажатии ее спрятать.&lt;br /&gt;
&lt;br /&gt;
Теперь впервые запустим нашу ВМ Windows. В терминале наберите:&lt;br /&gt;
&lt;br /&gt;
 rdesktop -rsound -A -s “c:\seamlessrdp\seamlessrdpshell.exe C:\Windows\explorer.exe” &amp;lt;IP-адрес Windows XP&amp;gt;:3389 -u “&amp;lt;Имя пользователя Windows&amp;gt;” -p &amp;lt;Ваш пароль Windows&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вам нужно будет соответственно изменить переменные. Практически все, но будет виден полный рабочий стол, поскольку Windows необходимо перезагрузить, чтобы все новые возможности заработали. Это немного путано, но сделать так придется, потому что XP не будет воспринимать удаленные подключения, пока вы хоть раз не войдете. Короче, нажмите комбинацию клавиш Ctrl+Esc и выберите Завершить сеанс.&lt;br /&gt;
&lt;br /&gt;
Выполните предыдущую команду снова, и у вас, после небольшой задержки на вход пользователя, должно появиться отдельное окно ''Проводника''.&lt;br /&gt;
&lt;br /&gt;
Вы должны видеть просто запущенное окно ''Проводника'', а при нажатии одной из вышеупомянутых стрелок на нижней панели Gnome появится кнопка Пуск и т.д.&lt;br /&gt;
&lt;br /&gt;
Теперь мы можем войти в верхнее меню Ubuntu, Система &amp;gt; Параметры &amp;gt; Главное меню и определить важные приложения, без которых вам не жить. Например, для установки ''Outlook'' (подразумевается, из ''Office 2003'') вам следует поместить в строку следующую команду:&lt;br /&gt;
&lt;br /&gt;
 /usr/bin/rdesktop -rsound -A -s “c:\seamlessrdp\seamlessrdpshell.exe C:\&lt;br /&gt;
 Program Files\Microsoft Office\OFFICE11\OUTLOOK.EXE” &amp;lt;IP-адрес&lt;br /&gt;
 Windows XP&amp;gt;:3389 -u “&amp;lt;Имя пользователя Windows &amp;gt;” -p &amp;lt;Ваш пароль&lt;br /&gt;
 Windows &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Наконец, выключить ВМ можно так:&lt;br /&gt;
&lt;br /&gt;
 VBoxManage controlvm “Windows-XP-Pro” savestate&lt;br /&gt;
&lt;br /&gt;
или так:&lt;br /&gt;
&lt;br /&gt;
 VBoxManage controlvm “Windows-XP-Pro” acpipowerbutton&lt;br /&gt;
&lt;br /&gt;
для сохранения текущего состояния машины; или имитировать отключение питания. Пора звать к своему монитору друзей – пусть подивятся на ваши подвиги!&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:Hardcore_Linux</id>
		<title>LXF98:Hardcore Linux</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:Hardcore_Linux"/>
				<updated>2008-03-20T19:32:57Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;font color=darkred&amp;gt;VirtualBox:&amp;lt;/font&amp;gt; Windows в Ubuntu==&lt;br /&gt;
&lt;br /&gt;
''Запускайте приложения Microsoft под Linux в Ubuntu Feisty при помощи VirtualBox от Innotek и Windows XP – '''Джек Найт''' здесь на коне….''&lt;br /&gt;
&lt;br /&gt;
Требовалось ли вам когда-нибудь на вашей машине одно или несколько Windows-приложений для решения некоторой задачи? А может, у вас есть клиент, использующий Windows, и вам надо работать с документами MS Project или запускать непосредственно Outlook для совместного использования их календарей&lt;br /&gt;
MS Exchange? Один из выходов – двойная загрузка, другой – запуск Windows XP в качестве гостевой ОС на виртуальной машине (ВМ); но&lt;br /&gt;
есть действительно классное решение – угадайте, какое? Бесплатное, по крайней мере для большинства из нас! VirtualBox от Innotek – удивительный продукт, и хотя я на самом деле не проверял его производительность, навскидку кажется, что он значительно превосходит и VMWare Workstation, и Server. Он располагает набором приятных функций и возможностью организовать сетевой мост через беспроводной адаптер ноутбука (нечто прежде немыслимое в VMWare) – чем не продукт-конфетка?&lt;br /&gt;
&lt;br /&gt;
Innotek применяет дуальную схему лицензирования – существуют открытая и закрытая двоичная версии VirtualBox (последняя бесплатна для ознакомления или персонального использования). Более того, у Innonek весьма разумная политика лицензирования для малого бизнеса – по запросу о покупке коммерческих лицензий на две машины я был любезно извещен, что это относится к категории «бесплатно»! Уже в восторге? Ну, это только начало – а вот и убойный довод: при помощи этой штуки можно запускать отдельные приложения Windows на рабочем столе Linux, и они появятся как обычные окна Gnome, KDE (или другие) на вашем X-столе. Прибавьте сюда Beryl/Compiz, и получите весьма впечатляющий инструмент. Качайте с www.virtualbox.org.&lt;br /&gt;
&lt;br /&gt;
Но как заставить все это работать? Что ж, понадобится кое-какая подгонка и на стороне Linux, и на стороне Windows – но результат стоящий, по крайней мере, по моему скромному мнению. В этой статье я проведу вас через настройку моста через беспроводной адаптер на ноутбуке, а продолжу настройкой двух типичных приложений, зависящих от Windows – MS Project и Outlook, чтобы под Ubuntu Feisty они выглядели как родные.&lt;br /&gt;
&lt;br /&gt;
===План действий===&lt;br /&gt;
&lt;br /&gt;
Вот что мы проделаем на следующих страницах:&lt;br /&gt;
&lt;br /&gt;
*Кое-что подправим для устранения неприятностей с USB и DVD.&lt;br /&gt;
*Создадим TAP-устройство на сетевом интерфейсе базовой машины (идеально для WLAN-интерфейса ноутбука).&lt;br /&gt;
*Установим персональную/пробную версию VirtualBox от Innotek.&lt;br /&gt;
*Создадим ВМ для Windows XP и настроим ее на использование сетевого TAP-устройства.&lt;br /&gt;
*Установим Windows XP (самые общие моменты).&lt;br /&gt;
*Настроим Windows XP со всеми тонкостями, для безупречной работы.&lt;br /&gt;
*Настроим VirtualBox на работу без ручного вмешательства и автоматический старт.&lt;br /&gt;
*Введем пункты меню для наших приложений-примеров.&lt;br /&gt;
&lt;br /&gt;
В детали установки гостевой ОС я вдаваться не буду: если кто не знает, как это сделать, описание найти легко. Зато приведу простой метод установки самого VirtualBox.&lt;br /&gt;
&lt;br /&gt;
Лично я использую на этом уроке Ubuntu 7.04 (Feisty), но эти инструкции должны отлично работать для dapper или edgy, при мелких изменениях (например, замене всех вхождений слова «feisty» по смыслу). Они должны работать и в Kubuntu; правда, я еще не проделывал мои операции в KDE, чтобы разобраться с отличиями. Машину, где запущен VirtualBox, я буду называть HOST [хост], а запущенные в нем системы – GUEST [гость]. Предполагается, что вы можете запускать командную оболочку и использовать редактор для изменения текстовых файлов. Прежде чем продолжить, познакомьтесь со врезкой&lt;br /&gt;
Избавляемся от неприятностей.&lt;br /&gt;
&lt;br /&gt;
===Настраиваем TAP-устройство===&lt;br /&gt;
&lt;br /&gt;
Нам нужно установить пакеты, а именно User Mode Linux Utilities и Proxy Arp Routing Daemon. Для начала убедитесь, что подключен репозиторий universe: в строке-меню Gnome выберите Система &amp;gt; Администрирование &amp;gt; Источники приложений, затем установите галочку Свободное ПО, поддерживаемое сообществом (universe). Теперь откройте терминал и введите:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install uml-utilities parprouted&lt;br /&gt;
 sudo chgrp vboxusers /dev/net/tun&lt;br /&gt;
&lt;br /&gt;
Теперь надо встроить TAP в сетевой адаптер хост-системы. Это особенно полезно для ноутбуков с беспроводными интерфейсами, поскольку WLAN-адаптер обычно получает IP-адрес через DHCP, но гостевая машина не может делать этого – как правило, несколько IP-адресов нельзя получить для того, что в сущности является клонированным интерфейсом. К тому же если беспроводной интерфейс использует защиту WPA, то появление интерфейса-клона, вероятно, заставит WAP&lt;br /&gt;
(Wireless Access Point – точка беспроводного доступа) заподозрить, что компьютер под атакой. Итак, сделаем вот что: выявим неиспользованные подсети, выберем пару уникальных IP-адресов и присвоим один TAP-устройству, а другой гостевой машине. Неважно, что они фиксированы: адрес хост-машины будет динамическим, и они будут проходить через маскардинг. В итоге гостевая машина будет «просто работать», где бы вы ни получили WLAN-соединение для хоста.&lt;br /&gt;
&lt;br /&gt;
Проще всего создать скрипт для инициализации TAP-устройства и поддержки конфигурации сети. Вот мой вариант:&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 # Имя: tapctrl&lt;br /&gt;
 # Использование: tapctrl start|stop&lt;br /&gt;
 # Обеспечивает: tap для virtualbox во внешней сети, включая беспроводные&lt;br /&gt;
 # Аннотация:&lt;br /&gt;
 # устанавливает tap-устройство для совместного использования  интерфейса wifi с vbox&lt;br /&gt;
 # Описание: создает виртуальный tap-интерфейс, присваивает IP- адрес, настраивает iptables&lt;br /&gt;
 # для маскарадинга через устройство по умолчанию&lt;br /&gt;
 # и настраивает прокси arp с демоном parprouted для корректной маршрутизации&lt;br /&gt;
 # Автор: Jack Knight&lt;br /&gt;
 # - Open Source Migrations Ltd, UK (http://www.osml.co.uk)&lt;br /&gt;
 # Настраиваем переменные здесь:&lt;br /&gt;
 DESC=”Virtualbox IP tap”&lt;br /&gt;
 PATH=/sbin:/bin:/usr/sbin:/usr/bin&lt;br /&gt;
 TUNDEVICE=tap1 # Произвольно, но должно соответствовать устройству, указанному в сетевых настройках VirtualBox.&lt;br /&gt;
 LANDEVICE=eth1 # Исправьте, чтобы соответствовало вашему сетевому устройству – может быть eth0, eth1 ath0, wlan1 и т. д.&lt;br /&gt;
 IPADDR=172.16.254.254 # Произвольно, но убедитесь, что вы взяли нечто из неиспользуемой подсети&lt;br /&gt;
 case “$1” in start|restart|force-reload)&lt;br /&gt;
           echo -n “Starting $DESC: “&lt;br /&gt;
           tunctl -t $TUNDEVICE -u $USER&lt;br /&gt;
           ip link set $TUNDEVICE up&lt;br /&gt;
           ip addr add $IPADDR dev $TUNDEVICE&lt;br /&gt;
              arp -Ds $IPADDR $TUNDEVICE pub&lt;br /&gt;
           iptables -t nat -A POSTROUTING -o $LANDEVICE -j MASQUERADE&lt;br /&gt;
           iptables -t nat -P POSTROUTING ACCEPT # Разрешаем работу других интерфейсов&lt;br /&gt;
              echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
              echo 1 &amp;gt; /proc/sys/net/ipv4/conf/$TUNDEVICE/proxy_ arp&lt;br /&gt;
              parprouted $LANDEVICE $TUNDEVICE&lt;br /&gt;
 stop)&lt;br /&gt;
              echo -n “Stopping $DESC: “&lt;br /&gt;
              iptables --table nat -F&lt;br /&gt;
              killall parprouted&lt;br /&gt;
              ip link set $TUNDEVICE down ;;&lt;br /&gt;
 *)&lt;br /&gt;
           N=/etc/init.d/$NAME&lt;br /&gt;
              echo “Usage: $N start|stop” &amp;gt;&amp;amp;2&lt;br /&gt;
              exit 1&lt;br /&gt;
              ;;&lt;br /&gt;
 esac&lt;br /&gt;
 exit 0&lt;br /&gt;
&lt;br /&gt;
Этот код есть на DVD; если кому-то нужно, у меня также есть более проработанный скрипт, работающий со многими пользователями, виртуальными машинами и устройствами и не опубликованный здесь ради простоты. Не стесняйтесь обращаться за ним ко мне по электронной почте через мой web-сайт.&lt;br /&gt;
&lt;br /&gt;
===Установка VirtualBox===&lt;br /&gt;
&lt;br /&gt;
К сожалению, поскольку на момент написания VirtualBox еще не попал в основные репозитории Ubuntu, перед установкой пакета придется добавить новый сторонний репозиторий от VirtualBox:&lt;br /&gt;
&lt;br /&gt;
 sudo sh -c ‘echo “# VirtualBox репозиторий для Ubuntu Feisty Fawn&lt;br /&gt;
 deb http://www.virtualbox.org/debian feisty non-free” \&lt;br /&gt;
   &amp;gt; /etc/apt/sources.list.d/feisty-virtualbox.list’&lt;br /&gt;
 wget http://www.virtualbox.org/debian/innotek.asc -O- | sudo apt-key add -&lt;br /&gt;
 sudo apt-get update&lt;br /&gt;
 sudo apt-get -y install virtualbox&lt;br /&gt;
&lt;br /&gt;
===Настройка виртуальной машины===&lt;br /&gt;
&lt;br /&gt;
На хост-ситеме Ubuntu нам понадобится механизм совместного использования файлов мирами Linux и Windows. К счастью, VirtualBox имеет для этого встроенный механизм , так что Samba на хост-машине или NFS на обеих сторонах можно не устанавливать. Учтите: совместного использования вашего жесткого диска НЕ получится, пока вы не установите Vbox GuestAdditions в гостевой системе! При создании общих папок гостевая система должна быть выключена.&lt;br /&gt;
&lt;br /&gt;
Общие папки работают только в версии 1.3.8; в версию 1.4.0 вкралась ошибка! Если у вас та самая версия, и вы не хотите возиться с Samba ради совместного доступа, скачайте iso с www.virtualbox.de/download/1.3.8/VBoxGuestAdditions_1.3.8.iso.&lt;br /&gt;
&lt;br /&gt;
Выключите ВМ, смените виртуальный cdrom на этот iso и перезапустите гостевую систему. Установите VirtualBoxGuest Additions, и все должно заработать. Пока что я не слыхал о неприятностях, связанных с «не той» версией гостевых дополнений. Это должно вас временно выручить, до следующей версии, где Innotek, скорее всего, исправит эту ошибку.&lt;br /&gt;
&lt;br /&gt;
Для настройки на стороне хоста, с выключенной гостевой ОС, просто выберите вашу ВМ в окне VirtualBox Manager и нажмите Свойства, а затем Общие папки у нижнего края, как показано на экранном снимке справа, заполните два поля подходящими значениями и нажмите OK. Теперь запустите гостевую ОС и, открыв окно DOS, введите:&lt;br /&gt;
&lt;br /&gt;
 net use E: \\vboxsvr\Shared_Folder&lt;br /&gt;
&lt;br /&gt;
и добавьте /Persistent:Yes к этой команде, если хотите сохранить это при перезапуске. Внимание: не ошибитесь в написании vboxsvr – это&lt;br /&gt;
важно!&lt;br /&gt;
&lt;br /&gt;
Альтернативный метод – открыть окно Проводника Windows и выбрать Сервис &amp;gt; Подключить сетевой диск; вы увидите диалоговое окно, похожее на то, что справа. Тем же манером вставьте подходящие значения и нажмите Готово. Если все в порядке, то появится новое окно Проводника с содержимым каталога хост-машины.&lt;br /&gt;
&lt;br /&gt;
Далее включим RDP-протокол, чтобы разрешить удаленные сессии. Просто щелкните на флажке Enable VRDP Server, как показано в этой колонке ниже.&lt;br /&gt;
&lt;br /&gt;
===Настройка Windows XP===&lt;br /&gt;
&lt;br /&gt;
Следующие настройки в принципе могут работать и для других версий Windows, не XP, но я не берусь этого утверждать, поскольку не успел протестировать. Нам нужны такие настройки, чтобы наша установленная Windows выводила на экран только панель задач, но не рабочий стол. Для этого поковыряемся в реестре; но учтите, что в Windows XP SP2 доступ к рассматриваемым настройкам ограничен, и обычный пользователь не вправе изменять эту часть – поэтому сперва мы временно присвоим права администратора пользователю, который будет использовать сессию Windows.&lt;br /&gt;
&lt;br /&gt;
Войдите как «Администратор» (или любой другой пользователь с достаточными правами), затем перейдите в нужное место посредством Пуск &amp;gt; Настройки &amp;gt; Панель управления &amp;gt; Пользователи и щелкните на записи, которую хотите использовать для запуска Windows-программ. Щелкните на Изменить тип учетной записи и установите переключатель в Администратор компьютера, затем обратитесь к кнопке Изменить тип учетной записи. Теперь выйдите из-под администратора и войдите как ваш пользователь, запустите regedit32 и найдите следующий ключ:&lt;br /&gt;
&lt;br /&gt;
 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer&lt;br /&gt;
&lt;br /&gt;
Нам необходимо создать новое значение DWORD с именем NoDesktop и присвоить ему значение 1, чтобы Windows отображала только приложение, которое мы хотим запустить, а не весь рабочий стол. Для этого выберите Правка в главном меню, далее Создать и Параметр DWORD и введите имя NoDesktop, затем нажмите Enter. Ключ теперь должен быть выделен, поэтому нажмите вновь Enter, чтобы отредактировать его и установить его значение в 1. По завершении все&lt;br /&gt;
должно выглядеть как на экранном снимке в конце этой колонки.&lt;br /&gt;
&lt;br /&gt;
Другой вариант – загрузка файла www.osml.eu/files/nodesktop.reg с сервера Open Source Migrations Limited (используйте его на собственный страх и риск). Сохраните его на своем рабочем столе, затем просто дважды щелкните на нем, подтвердите действие, и реестр соответствующим образом изменится.&lt;br /&gt;
&lt;br /&gt;
Теперь вы, вероятно, захотите отнять права администратора у учетной записи, повторив предыдущую процедуру в обратном порядке. Работа в Windows с правами администратора столь же небезопасна, как работа в Linux или Unix от имени суперпользователя, и если у вас нет для нее серьезных причин, выйдите из системы и войдите как администратор, превратите пользователя в обычного, и тогда мы сможем завершить наши другие задачи.&lt;br /&gt;
&lt;br /&gt;
====Настройка Windows на автоматический вход.====&lt;br /&gt;
&lt;br /&gt;
*Нажмите кнопку Пуск, выберите Выполнить, введите в окне&lt;br /&gt;
 control userpasswords2&lt;br /&gt;
и нажмите OK.&lt;br /&gt;
&lt;br /&gt;
*Снимите галочку около Требовать ввод имени и пароля пользователя и нажмите Применить.&lt;br /&gt;
&lt;br /&gt;
*Появится окно с запросом: под каким пользователем и паролем вы хотите осуществить автоматический вход. Просто введите ранее определенные имя и пароль пользователя.&lt;br /&gt;
&lt;br /&gt;
====Установка Гостевых Дополнений VirtualBox.====&lt;br /&gt;
&lt;br /&gt;
*Выберите в главном меню окна вашей ВМ пункт Devices [Устройства], затем щелкните на Install Guest Additions.&lt;br /&gt;
*Отвечайте на вопросы установщика для завершения установки.&lt;br /&gt;
&lt;br /&gt;
====Настройка фиксированного IP-адреса, используемого Windows.====&lt;br /&gt;
&lt;br /&gt;
*Перейдите к Пуск &amp;gt; Настройка &amp;gt; Панель управления &amp;gt; Сетевые подключения.&lt;br /&gt;
*Выполните правый щелчок на Подключение к локальной сети и выберите Свойства.&lt;br /&gt;
*Введите IP-адрес, соответствующую маску подсети, адрес шлюза по умолчанию и по крайней мере один DNS-сервер. Вы можете найти&lt;br /&gt;
ваш(и) DNS сервер(а), набрав в терминале хост-машины:&lt;br /&gt;
 cat /etc/resolv.conf&lt;br /&gt;
После слов nameserver указаны IP-адреса DNS-серверов. Шлюз по умолчанию должен соответствовать определенному для вашего TAP-интерфейса в /etc/tap.conf. Учтите: IP-адрес должен отличаться от IP Virtual Box, прописанного в файле /etc/tap.conf. Я предлагаю устанавливать IP-адреса, отсчитывая от конца диапазона назад в tap.conf – т. е. от 254 и меньше для каждого TAP-устройства – и от начала диапазона для ваших гостевых машин, например, 172.16.254.1 и больше. Настройте ваш маршрутизатор на выдачу Windows другого IP. У большинства из вас, вероятно, только одно TAP-устройство, так что это не должно быть проблемой.&lt;br /&gt;
&lt;br /&gt;
====Включение RDP-соединений в Windows и установка пароля.====&lt;br /&gt;
&lt;br /&gt;
*Нажмите Пуск &amp;gt; Настройка &amp;gt; Панель управления &amp;gt; Система и перейдите на вкладку Удаленные сеансы.&lt;br /&gt;
*Поставьте галочку напротив пункта Разрешить удаленные подключения к этому компьютеру и нажмите OK.&lt;br /&gt;
*В Панели управления щелкните на Пользователи. Выберите пользователя, под которым хотите входить, и нажмите Создать пароль.&lt;br /&gt;
*Введите ваш пароль в появившейся строке и нажмите кнопку Создать пароль. Учтите: этот пароль надо установить обязательно, иначе нормальной работы не будет.&lt;br /&gt;
*Далее, загрузите файл: www.cendio.se/files/thinlinc/seamlessrdp/seamlessrdp.zip и распакуйте его в C:\seamlessrdp.&lt;br /&gt;
*Теперь подготовим Windows XP Pro для разрешения удаленного доступа с глубиной цвета 256 бит.&lt;br /&gt;
*Нажмите Пуск, Выполнить, введите в поле regedit и нажмите OK.&lt;br /&gt;
*В редакторе реестра перейдите к ключу: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp&lt;br /&gt;
*В панели справа выделите ключ ColorDepth и щелкните на нем правой кнопкой мыши. Выберите Изменить и измените поле Значение на 4.&lt;br /&gt;
*Или, для удобства, просто загрузите файл: www.osml.eu/files/rdpcolourdepth.reg с сервера Open Source Migrations Limited (используйте на свой страх и риск). Сохраните его на рабочем столе, затем дважды щелкните на нем, подтвердите действие – и реестр будет изменен. На этом завершается настройка на стороне Windows.&lt;br /&gt;
&lt;br /&gt;
===Настройка: VirtualBox===&lt;br /&gt;
&lt;br /&gt;
Теперь можно настроить VirtualBox на автозапуск при загрузке. Вопервых, мы собираемся запустить вашу машину из командной строки,&lt;br /&gt;
поэтому в терминале введите:&lt;br /&gt;
&lt;br /&gt;
 VBoxManage startvm “WinXPPro” -type vrdp&lt;br /&gt;
&lt;br /&gt;
Замените здесь WinXPPro на имя вашей ВМ. Чтобы Windows всякий раз запускалась без проблем, выполните Система &amp;gt; Параметры &amp;gt; Сеансы и выберите вкладку Запускаемые при старте программы.&lt;br /&gt;
&lt;br /&gt;
Щелкните на кнопке Создать, затем скопируйте и вставьте указанную выше команду в текстовое поле и нажмите OK.&lt;br /&gt;
&lt;br /&gt;
Перед запуском новой ВМ необходимо убедиться, что наша нижняя панель сворачивается, иначе в Windows будут не видны кнопка Пуск и системный лоток, и нам это необходимо по крайней мере один раз (а может, и больше): если мы далее в Windows наткнемся на проблемы или для установки новых приложений. Просто щелкните правой кнопкой мыши в пустом месте нижней панели и выберите Свойства, установите флажок Показывать/скрывать кнопки и нажмите OK. Теперь слева&lt;br /&gt;
и справа на вашей панели есть кнопки с изображением стрелки, позволяющие при нажатии ее спрятать.&lt;br /&gt;
&lt;br /&gt;
Теперь впервые запустим нашу ВМ Windows. В терминале наберите:&lt;br /&gt;
&lt;br /&gt;
 rdesktop -rsound -A -s “c:\seamlessrdp\seamlessrdpshell.exe C:\Windows\explorer.exe” &amp;lt;IP-адрес Windows XP&amp;gt;:3389 -u “&amp;lt;Имя пользователя Windows&amp;gt;” -p &amp;lt;Ваш пароль Windows&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вам нужно будет соответственно изменить переменные. Практически все, но будет виден полный рабочий стол, поскольку Windows необходимо перезагрузить, чтобы все новые возможности заработали. Это немного путано, но сделать так придется, потому что XP не будет воспринимать удаленные подключения, пока вы хоть раз не войдете. Короче, нажмите комбинацию клавиш Ctrl+Esc и выберите Завершить сеанс.&lt;br /&gt;
&lt;br /&gt;
Выполните предыдущую команду снова, и у вас, после небольшой задержки на вход пользователя, должно появиться отдельное окно Проводника.&lt;br /&gt;
&lt;br /&gt;
Вы должны видеть просто запущенное окно Проводника, а при нажатии одной из вышеупомянутых стрелок на нижней панели Gnome появится кнопка Пуск и т.д.&lt;br /&gt;
&lt;br /&gt;
Теперь мы можем войти в верхнее меню Ubuntu, Система &amp;gt; Параметры &amp;gt; Главное меню и определить важные приложения, без которых вам не жить. Например, для установки Outlook (подразумевается, из Office 2003) вам следует поместить в строку следующую команду:&lt;br /&gt;
&lt;br /&gt;
 /usr/bin/rdesktop -rsound -A -s “c:\seamlessrdp\seamlessrdpshell.exe C:\&lt;br /&gt;
 Program Files\Microsoft Office\OFFICE11\OUTLOOK.EXE” &amp;lt;IP-адрес&lt;br /&gt;
 Windows XP&amp;gt;:3389 -u “&amp;lt;Имя пользователя Windows &amp;gt;” -p &amp;lt;Ваш пароль&lt;br /&gt;
 Windows &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Наконец, выключить ВМ можно так:&lt;br /&gt;
&lt;br /&gt;
 VBoxManage controlvm “Windows-XP-Pro” savestate&lt;br /&gt;
&lt;br /&gt;
или так:&lt;br /&gt;
&lt;br /&gt;
 VBoxManage controlvm “Windows-XP-Pro” acpipowerbutton&lt;br /&gt;
&lt;br /&gt;
для сохранения текущего состояния машины; или имитировать отключение питания. Пора звать к своему монитору друзей – пусть подивятся на ваши подвиги!&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:Hardcore_Linux</id>
		<title>LXF98:Hardcore Linux</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:Hardcore_Linux"/>
				<updated>2008-03-20T19:32:10Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: Новая: ==&amp;lt;font color=darkred&amp;gt;VirtualBox:&amp;lt;/font&amp;gt; Windows в Ubuntu==  ''Запускайте приложения Microsoft под Linux в Ubuntu Feisty при помощи VirtualBox от Inno...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;font color=darkred&amp;gt;VirtualBox:&amp;lt;/font&amp;gt; Windows в Ubuntu==&lt;br /&gt;
&lt;br /&gt;
''Запускайте приложения Microsoft под Linux в Ubuntu Feisty при помощи VirtualBox от Innotek и Windows XP – '''Джек Найт''' здесь на коне….''&lt;br /&gt;
&lt;br /&gt;
Требовалось ли вам когда-нибудь на вашей машине одно или несколько Windows-приложений для решения некоторой задачи? А может, у вас есть клиент, использующий Windows, и вам надо работать с документами MS Project или запускать непосредственно Outlook для совместного использования их календарей&lt;br /&gt;
MS Exchange? Один из выходов – двойная загрузка, другой – запуск Windows XP в качестве гостевой ОС на виртуальной машине (ВМ); но&lt;br /&gt;
есть действительно классное решение – угадайте, какое? Бесплатное, по крайней мере для большинства из нас! VirtualBox от Innotek – удивительный продукт, и хотя я на самом деле не проверял его производительность, навскидку кажется, что он значительно превосходит и VMWare Workstation, и Server. Он располагает набором приятных функций и возможностью организовать сетевой мост через беспроводной адаптер ноутбука (нечто прежде немыслимое в VMWare) – чем не продукт-конфетка?&lt;br /&gt;
&lt;br /&gt;
Innotek применяет дуальную схему лицензирования – существуют открытая и закрытая двоичная версии VirtualBox (последняя бесплатна для ознакомления или персонального использования). Более того, у Innonek весьма разумная политика лицензирования для малого бизнеса – по запросу о покупке коммерческих лицензий на две машины я был любезно извещен, что это относится к категории «бесплатно»! Уже в восторге? Ну, это только начало – а вот и убойный довод: при помощи этой штуки можно запускать отдельные приложения Windows на рабочем столе Linux, и они появятся как обычные окна Gnome, KDE (или другие) на вашем X-столе. Прибавьте сюда Beryl/Compiz, и получите весьма впечатляющий инструмент. Качайте с www.virtualbox.org.&lt;br /&gt;
&lt;br /&gt;
Но как заставить все это работать? Что ж, понадобится кое-какая подгонка и на стороне Linux, и на стороне Windows – но результат стоящий, по крайней мере, по моему скромному мнению. В этой статье я проведу вас через настройку моста через беспроводной адаптер на ноутбуке, а продолжу настройкой двух типичных приложений, зависящих от Windows – MS Project и Outlook, чтобы под Ubuntu Feisty они выглядели как родные.&lt;br /&gt;
&lt;br /&gt;
===План действий===&lt;br /&gt;
&lt;br /&gt;
Вот что мы проделаем на следующих страницах:&lt;br /&gt;
&lt;br /&gt;
*Кое-что подправим для устранения неприятностей с USB и DVD.&lt;br /&gt;
*Создадим TAP-устройство на сетевом интерфейсе базовой машины (идеально для WLAN-интерфейса ноутбука).&lt;br /&gt;
*Установим персональную/пробную версию VirtualBox от Innotek.&lt;br /&gt;
*Создадим ВМ для Windows XP и настроим ее на использование сетевого TAP-устройства.&lt;br /&gt;
*Установим Windows XP (самые общие моменты).&lt;br /&gt;
*Настроим Windows XP со всеми тонкостями, для безупречной работы.&lt;br /&gt;
*Настроим VirtualBox на работу без ручного вмешательства и автоматический старт.&lt;br /&gt;
*Введем пункты меню для наших приложений-примеров.&lt;br /&gt;
&lt;br /&gt;
В детали установки гостевой ОС я вдаваться не буду: если кто не знает, как это сделать, описание найти легко. Зато приведу простой метод установки самого VirtualBox.&lt;br /&gt;
&lt;br /&gt;
Лично я использую на этом уроке Ubuntu 7.04 (Feisty), но эти инструкции должны отлично работать для dapper или edgy, при мелких изменениях (например, замене всех вхождений слова «feisty» по смыслу). Они должны работать и в Kubuntu; правда, я еще не проделывал мои операции в KDE, чтобы разобраться с отличиями. Машину, где запущен VirtualBox, я буду называть HOST [хост], а запущенные в нем системы – GUEST [гость]. Предполагается, что вы можете запускать командную оболочку и использовать редактор для изменения текстовых файлов. Прежде чем продолжить, познакомьтесь со врезкой&lt;br /&gt;
Избавляемся от неприятностей.&lt;br /&gt;
&lt;br /&gt;
===Настраиваем TAP-устройство===&lt;br /&gt;
&lt;br /&gt;
Нам нужно установить пакеты, а именно User Mode Linux Utilities и Proxy Arp Routing Daemon. Для начала убедитесь, что подключен репозиторий universe: в строке-меню Gnome выберите Система &amp;gt; Администрирование &amp;gt; Источники приложений, затем установите галочку Свободное ПО, поддерживаемое сообществом (universe). Теперь откройте терминал и введите:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install uml-utilities parprouted&lt;br /&gt;
 sudo chgrp vboxusers /dev/net/tun&lt;br /&gt;
&lt;br /&gt;
Теперь надо встроить TAP в сетевой адаптер хост-системы. Это особенно полезно для ноутбуков с беспроводными интерфейсами, поскольку WLAN-адаптер обычно получает IP-адрес через DHCP, но гостевая машина не может делать этого – как правило, несколько IP-адресов нельзя получить для того, что в сущности является клонированным интерфейсом. К тому же если беспроводной интерфейс использует защиту WPA, то появление интерфейса-клона, вероятно, заставит WAP&lt;br /&gt;
(Wireless Access Point – точка беспроводного доступа) заподозрить, что компьютер под атакой. Итак, сделаем вот что: выявим неиспользованные подсети, выберем пару уникальных IP-адресов и присвоим один TAP-устройству, а другой гостевой машине. Неважно, что они фиксированы: адрес хост-машины будет динамическим, и они будут проходить через маскардинг. В итоге гостевая машина будет «просто работать», где бы вы ни получили WLAN-соединение для хоста.&lt;br /&gt;
&lt;br /&gt;
Проще всего создать скрипт для инициализации TAP-устройства и поддержки конфигурации сети. Вот мой вариант:&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 # Имя: tapctrl&lt;br /&gt;
 # Использование: tapctrl start|stop&lt;br /&gt;
 # Обеспечивает: tap для virtualbox во внешней сети, включая беспроводные&lt;br /&gt;
 # Аннотация:&lt;br /&gt;
 # устанавливает tap-устройство для совместного использования  интерфейса wifi с vbox&lt;br /&gt;
 # Описание: создает виртуальный tap-интерфейс, присваивает IP- адрес, настраивает iptables&lt;br /&gt;
 # для маскарадинга через устройство по умолчанию&lt;br /&gt;
 # и настраивает прокси arp с демоном parprouted для корректной маршрутизации&lt;br /&gt;
 # Автор: Jack Knight&lt;br /&gt;
 # - Open Source Migrations Ltd, UK (http://www.osml.co.uk)&lt;br /&gt;
 # Настраиваем переменные здесь:&lt;br /&gt;
 DESC=”Virtualbox IP tap”&lt;br /&gt;
 PATH=/sbin:/bin:/usr/sbin:/usr/bin&lt;br /&gt;
 TUNDEVICE=tap1 # Произвольно, но должно соответствовать устройству, указанному в сетевых настройках VirtualBox.&lt;br /&gt;
 LANDEVICE=eth1 # Исправьте, чтобы соответствовало вашему сетевому устройству – может быть eth0, eth1 ath0, wlan1 и т. д.&lt;br /&gt;
 IPADDR=172.16.254.254 # Произвольно, но убедитесь, что вы взяли нечто из неиспользуемой подсети&lt;br /&gt;
 case “$1” in start|restart|force-reload)&lt;br /&gt;
           echo -n “Starting $DESC: “&lt;br /&gt;
           tunctl -t $TUNDEVICE -u $USER&lt;br /&gt;
           ip link set $TUNDEVICE up&lt;br /&gt;
           ip addr add $IPADDR dev $TUNDEVICE&lt;br /&gt;
              arp -Ds $IPADDR $TUNDEVICE pub&lt;br /&gt;
           iptables -t nat -A POSTROUTING -o $LANDEVICE -j MASQUERADE&lt;br /&gt;
           iptables -t nat -P POSTROUTING ACCEPT # Разрешаем работу других интерфейсов&lt;br /&gt;
              echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
              echo 1 &amp;gt; /proc/sys/net/ipv4/conf/$TUNDEVICE/proxy_ arp&lt;br /&gt;
              parprouted $LANDEVICE $TUNDEVICE&lt;br /&gt;
 stop)&lt;br /&gt;
              echo -n “Stopping $DESC: “&lt;br /&gt;
              iptables --table nat -F&lt;br /&gt;
              killall parprouted&lt;br /&gt;
              ip link set $TUNDEVICE down ;;&lt;br /&gt;
 *)&lt;br /&gt;
           N=/etc/init.d/$NAME&lt;br /&gt;
              echo “Usage: $N start|stop” &amp;gt;&amp;amp;2&lt;br /&gt;
              exit 1&lt;br /&gt;
              ;;&lt;br /&gt;
 esac&lt;br /&gt;
 exit 0&lt;br /&gt;
&lt;br /&gt;
Этот код есть на DVD; если кому-то нужно, у меня также есть более проработанный скрипт, работающий со многими пользователями, виртуальными машинами и устройствами и не опубликованный здесь ради простоты. Не стесняйтесь обращаться за ним ко мне по электронной почте через мой web-сайт.&lt;br /&gt;
&lt;br /&gt;
===Установка VirtualBox===&lt;br /&gt;
&lt;br /&gt;
К сожалению, поскольку на момент написания VirtualBox еще не попал в основные репозитории Ubuntu, перед установкой пакета придется добавить новый сторонний репозиторий от VirtualBox:&lt;br /&gt;
&lt;br /&gt;
 sudo sh -c ‘echo “# VirtualBox репозиторий для Ubuntu Feisty Fawn&lt;br /&gt;
 deb http://www.virtualbox.org/debian feisty non-free” \&lt;br /&gt;
   &amp;gt; /etc/apt/sources.list.d/feisty-virtualbox.list’&lt;br /&gt;
 wget http://www.virtualbox.org/debian/innotek.asc -O- | sudo apt-key add -&lt;br /&gt;
 sudo apt-get update&lt;br /&gt;
 sudo apt-get -y install virtualbox&lt;br /&gt;
&lt;br /&gt;
===Настройка виртуальной машины===&lt;br /&gt;
&lt;br /&gt;
На хост-ситеме Ubuntu нам понадобится механизм совместного использования файлов мирами Linux и Windows. К счастью, VirtualBox имеет для этого встроенный механизм , так что Samba на хост-машине или NFS на обеих сторонах можно не устанавливать. Учтите: совместного использования вашего жесткого диска НЕ получится, пока вы не установите Vbox GuestAdditions в гостевой системе! При создании общих папок гостевая система должна быть выключена.&lt;br /&gt;
&lt;br /&gt;
Общие папки работают только в версии 1.3.8; в версию 1.4.0 вкралась ошибка! Если у вас та самая версия, и вы не хотите возиться с Samba ради совместного доступа, скачайте iso с www.virtualbox.de/download/1.3.8/VBoxGuestAdditions_1.3.8.iso.&lt;br /&gt;
&lt;br /&gt;
Выключите ВМ, смените виртуальный cdrom на этот iso и перезапустите гостевую систему. Установите VirtualBoxGuest Additions, и все должно заработать. Пока что я не слыхал о неприятностях, связанных с «не той» версией гостевых дополнений. Это должно вас временно выручить, до следующей версии, где Innotek, скорее всего, исправит эту ошибку.&lt;br /&gt;
&lt;br /&gt;
Для настройки на стороне хоста, с выключенной гостевой ОС, просто выберите вашу ВМ в окне VirtualBox Manager и нажмите Свойства, а затем Общие папки у нижнего края, как показано на экранном снимке справа, заполните два поля подходящими значениями и нажмите OK. Теперь запустите гостевую ОС и, открыв окно DOS, введите:&lt;br /&gt;
&lt;br /&gt;
 net use E: \\vboxsvr\Shared_Folder&lt;br /&gt;
&lt;br /&gt;
и добавьте /Persistent:Yes к этой команде, если хотите сохранить это при перезапуске. Внимание: не ошибитесь в написании vboxsvr – это&lt;br /&gt;
важно!&lt;br /&gt;
&lt;br /&gt;
Альтернативный метод – открыть окно Проводника Windows и выбрать Сервис &amp;gt; Подключить сетевой диск; вы увидите диалоговое окно, похожее на то, что справа. Тем же манером вставьте подходящие значения и нажмите Готово. Если все в порядке, то появится новое окно Проводника с содержимым каталога хост-машины.&lt;br /&gt;
&lt;br /&gt;
Далее включим RDP-протокол, чтобы разрешить удаленные сессии. Просто щелкните на флажке Enable VRDP Server, как показано в этой колонке ниже.&lt;br /&gt;
&lt;br /&gt;
===Настройка Windows XP===&lt;br /&gt;
&lt;br /&gt;
Следующие настройки в принципе могут работать и для других версий Windows, не XP, но я не берусь этого утверждать, поскольку не успел протестировать. Нам нужны такие настройки, чтобы наша установленная Windows выводила на экран только панель задач, но не рабочий стол. Для этого поковыряемся в реестре; но учтите, что в Windows XP SP2 доступ к рассматриваемым настройкам ограничен, и обычный пользователь не вправе изменять эту часть – поэтому сперва мы временно присвоим права администратора пользователю, который будет использовать сессию Windows.&lt;br /&gt;
&lt;br /&gt;
Войдите как «Администратор» (или любой другой пользователь с достаточными правами), затем перейдите в нужное место посредством Пуск &amp;gt; Настройки &amp;gt; Панель управления &amp;gt; Пользователи и щелкните на записи, которую хотите использовать для запуска Windows-программ. Щелкните на Изменить тип учетной записи и установите переключатель в Администратор компьютера, затем обратитесь к кнопке Изменить тип учетной записи. Теперь выйдите из-под администратора и войдите как ваш пользователь, запустите regedit32 и найдите следующий ключ:&lt;br /&gt;
&lt;br /&gt;
 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer&lt;br /&gt;
&lt;br /&gt;
Нам необходимо создать новое значение DWORD с именем NoDesktop и присвоить ему значение 1, чтобы Windows отображала только приложение, которое мы хотим запустить, а не весь рабочий стол. Для этого выберите Правка в главном меню, далее Создать и Параметр DWORD и введите имя NoDesktop, затем нажмите Enter. Ключ теперь должен быть выделен, поэтому нажмите вновь Enter, чтобы отредактировать его и установить его значение в 1. По завершении все&lt;br /&gt;
должно выглядеть как на экранном снимке в конце этой колонки.&lt;br /&gt;
&lt;br /&gt;
Другой вариант – загрузка файла www.osml.eu/files/nodesktop.reg с сервера Open Source Migrations Limited (используйте его на собственный страх и риск). Сохраните его на своем рабочем столе, затем просто дважды щелкните на нем, подтвердите действие, и реестр соответствующим образом изменится.&lt;br /&gt;
&lt;br /&gt;
Теперь вы, вероятно, захотите отнять права администратора у учетной записи, повторив предыдущую процедуру в обратном порядке. Работа в Windows с правами администратора столь же небезопасна, как работа в Linux или Unix от имени суперпользователя, и если у вас нет для нее серьезных причин, выйдите из системы и войдите как администратор, превратите пользователя в обычного, и тогда мы сможем завершить наши другие задачи.&lt;br /&gt;
&lt;br /&gt;
====Настройка Windows на автоматический вход.====&lt;br /&gt;
&lt;br /&gt;
*Нажмите кнопку Пуск, выберите Выполнить, введите в окне&lt;br /&gt;
 control userpasswords2&lt;br /&gt;
и нажмите OK.&lt;br /&gt;
&lt;br /&gt;
*Снимите галочку около Требовать ввод имени и пароля пользователя и нажмите Применить.&lt;br /&gt;
&lt;br /&gt;
*Появится окно с запросом: под каким пользователем и паролем вы хотите осуществить автоматический вход. Просто введите ранее определенные имя и пароль пользователя.&lt;br /&gt;
&lt;br /&gt;
====Установка Гостевых Дополнений VirtualBox.====&lt;br /&gt;
&lt;br /&gt;
*Выберите в главном меню окна вашей ВМ пункт Devices [Устройства], затем щелкните на Install Guest Additions.&lt;br /&gt;
*Отвечайте на вопросы установщика для завершения установки.&lt;br /&gt;
&lt;br /&gt;
====Настройка фиксированного IP-адреса, используемого Windows.====&lt;br /&gt;
&lt;br /&gt;
*Перейдите к Пуск &amp;gt; Настройка &amp;gt; Панель управления &amp;gt; Сетевые подключения.&lt;br /&gt;
*Выполните правый щелчок на Подключение к локальной сети и выберите Свойства.&lt;br /&gt;
*Введите IP-адрес, соответствующую маску подсети, адрес шлюза по умолчанию и по крайней мере один DNS-сервер. Вы можете найти&lt;br /&gt;
ваш(и) DNS сервер(а), набрав в терминале хост-машины:&lt;br /&gt;
 cat /etc/resolv.conf&lt;br /&gt;
После слов nameserver указаны IP-адреса DNS-серверов. Шлюз по умолчанию должен соответствовать определенному для вашего TAP-интерфейса в /etc/tap.conf. Учтите: IP-адрес должен отличаться от IP Virtual Box, прописанного в файле /etc/tap.conf. Я предлагаю устанавливать IP-адреса, отсчитывая от конца диапазона назад в tap.conf – т. е. от 254 и меньше для каждого TAP-устройства – и от начала диапазона для ваших гостевых машин, например, 172.16.254.1 и больше. Настройте ваш маршрутизатор на выдачу Windows другого IP. У большинства из вас, вероятно, только одно TAP-устройство, так что это не должно быть проблемой.&lt;br /&gt;
&lt;br /&gt;
====Включение RDP-соединений в Windows и установка пароля.====&lt;br /&gt;
&lt;br /&gt;
*Нажмите Пуск &amp;gt; Настройка &amp;gt; Панель управления &amp;gt; Система и перейдите на вкладку Удаленные сеансы.&lt;br /&gt;
*Поставьте галочку напротив пункта Разрешить удаленные подключения к этому компьютеру и нажмите OK.&lt;br /&gt;
*В Панели управления щелкните на Пользователи. Выберите пользователя, под которым хотите входить, и нажмите Создать пароль.&lt;br /&gt;
*Введите ваш пароль в появившейся строке и нажмите кнопку Создать пароль. Учтите: этот пароль надо установить обязательно, иначе нормальной работы не будет.&lt;br /&gt;
*Далее, загрузите файл: www.cendio.se/files/thinlinc/seamlessrdp/seamlessrdp.zip и распакуйте его в C:\seamlessrdp.&lt;br /&gt;
*Теперь подготовим Windows XP Pro для разрешения удаленного доступа с глубиной цвета 256 бит.&lt;br /&gt;
*Нажмите Пуск, Выполнить, введите в поле regedit и нажмите OK.&lt;br /&gt;
*В редакторе реестра перейдите к ключу: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp&lt;br /&gt;
*В панели справа выделите ключ ColorDepth и щелкните на нем правой кнопкой мыши. Выберите Изменить и измените поле Значение на 4.&lt;br /&gt;
*Или, для удобства, просто загрузите файл: www.osml.eu/files/rdpcolourdepth.reg с сервера Open Source Migrations Limited (используйте на свой страх и риск). Сохраните его на рабочем столе, затем дважды щелкните на нем, подтвердите действие – и реестр будет изменен. На этом завершается настройка на стороне Windows.&lt;br /&gt;
&lt;br /&gt;
===Настройка: VirtualBox===&lt;br /&gt;
&lt;br /&gt;
Теперь можно настроить VirtualBox на автозапуск при загрузке. Вопервых, мы собираемся запустить вашу машину из командной строки,&lt;br /&gt;
поэтому в терминале введите:&lt;br /&gt;
&lt;br /&gt;
 VBoxManage startvm “WinXPPro” -type vrdp&lt;br /&gt;
&lt;br /&gt;
Замените здесь WinXPPro на имя вашей ВМ. Чтобы Windows всякий раз запускалась без проблем, выполните Система &amp;gt; Параметры &amp;gt; Сеансы и выберите вкладку Запускаемые при старте программы.&lt;br /&gt;
&lt;br /&gt;
Щелкните на кнопке Создать, затем скопируйте и вставьте указанную выше команду в текстовое поле и нажмите OK.&lt;br /&gt;
&lt;br /&gt;
Перед запуском новой ВМ необходимо убедиться, что наша нижняя панель сворачивается, иначе в Windows будут не видны кнопка Пуск и системный лоток, и нам это необходимо по крайней мере один раз (а может, и больше): если мы далее в Windows наткнемся на проблемы или для установки новых приложений. Просто щелкните правой кнопкой мыши в пустом месте нижней панели и выберите Свойства, установите флажок Показывать/скрывать кнопки и нажмите OK. Теперь слева&lt;br /&gt;
и справа на вашей панели есть кнопки с изображением стрелки, позволяющие при нажатии ее спрятать.&lt;br /&gt;
&lt;br /&gt;
Теперь впервые запустим нашу ВМ Windows. В терминале наберите:&lt;br /&gt;
&lt;br /&gt;
 rdesktop -rsound -A -s “c:\seamlessrdp\seamlessrdpshell.exe C:\Windows\explorer.exe” &amp;lt;IP-адрес Windows XP&amp;gt;:3389 -u “&amp;lt;Имя пользователя Windows&amp;gt;” -p &amp;lt;Ваш пароль Windows&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вам нужно будет соответственно изменить переменные. Практически все, но будет виден полный рабочий стол, поскольку Windows необходимо перезагрузить, чтобы все новые возможности заработали. Это немного путано, но сделать так придется, потому что XP не будет воспринимать удаленные подключения, пока вы хоть раз не войдете. Короче, нажмите комбинацию клавиш Ctrl+Esc и выберите Завершить сеанс.&lt;br /&gt;
&lt;br /&gt;
Выполните предыдущую команду снова, и у вас, после небольшой задержки на вход пользователя, должно появиться отдельное окно Проводника.&lt;br /&gt;
&lt;br /&gt;
Вы должны видеть просто запущенное окно Проводника, а при нажатии одной из вышеупомянутых стрелок на нижней панели Gnome появится кнопка Пуск и т.д.&lt;br /&gt;
&lt;br /&gt;
Теперь мы можем войти в верхнее меню Ubuntu, Система &amp;gt; Параметры &amp;gt; Главное меню и определить важные приложения, без которых вам не жить. Например, для установки Outlook (подразумевается, из Office 2003) вам следует поместить в строку следующую команду:&lt;br /&gt;
&lt;br /&gt;
 /usr/bin/rdesktop -rsound -A -s “c:\seamlessrdp\seamlessrdpshell.exe&lt;br /&gt;
   C:\Program Files\Microsoft Office\OFFICE11\OUTLOOK.EXE” &amp;lt;IP-адрес Windows XP&amp;gt;:3389 -u&lt;br /&gt;
     “&amp;lt;Имя пользователя Windows &amp;gt;” -p &amp;lt;Ваш пароль Windows &amp;gt;&lt;br /&gt;
&lt;br /&gt;
Наконец, выключить ВМ можно так:&lt;br /&gt;
&lt;br /&gt;
 VBoxManage controlvm “Windows-XP-Pro” savestate&lt;br /&gt;
&lt;br /&gt;
или так:&lt;br /&gt;
&lt;br /&gt;
 VBoxManage controlvm “Windows-XP-Pro” acpipowerbutton&lt;br /&gt;
&lt;br /&gt;
для сохранения текущего состояния машины; или имитировать отключение питания. Пора звать к своему монитору друзей – пусть подивятся на ваши подвиги!&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:KDE</id>
		<title>LXF98:KDE</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:KDE"/>
				<updated>2008-03-20T19:11:47Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: /* &amp;lt;font color=darkred&amp;gt;KDE:&amp;lt;/font&amp;gt; Галерея на рабочем столе */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;font color=darkred&amp;gt;KDE:&amp;lt;/font&amp;gt; Галерея на рабочем столе==&lt;br /&gt;
&lt;br /&gt;
''Маэстро '''Дэвид Фили''' покажет, как легко превратить ваш рабочий стол в картинную галерею с помощью DCOP, Perl и шаманства с командной строкой.''&lt;br /&gt;
&lt;br /&gt;
Одно из величайших достижений Linux – даруемая им свобода: в частности, это свобода что-то переопределить, подправить и настроить «как хочется», а не довольствоваться тем, «что дают». К примеру, я сейчас интересуюсь искусством, и хотел бы поместить коллекцию картин старых мастеров на обои моего рабочего стола. Беда в том, что мне все быстро надоедает, поэтому нужен также простой способ чередовать эти изображения; да и память у меня прескверная, а надо как-то отличать моего Караваджо от моего Констебля.&lt;br /&gt;
&lt;br /&gt;
Желаю иметь возможность вводить и просматривать примечания ко всем картинам, чтобы над ними всплывали сообщения с подсказками про имя художника, год написания и музей, где она находится, и, может быть, парой кратких заметок, благодаря которым я смогу притвориться, будто знаю, на что это я тут глазею, если меня вдруг станут расспрашивать.&lt;br /&gt;
&lt;br /&gt;
В Linux и KDE такое вполне достижимо, если связать вместе различные инструменты командной строки и скрипты: классическая концепция Unix/Linux по объединению нескольких инструментов общего назначения в полезное приложение. Целью данной статьи является подготовка скрипта, управляющего нашей псевдоКартинной Галереей на фоне рабочего стола. Определим также несколько горячих клавиш, нажатия на которые обеспечат следующие действия:&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;
 $ mkdir ~/BackgroundArt&lt;br /&gt;
&lt;br /&gt;
и скопируем туда какие-нибудь картинки (какие попались под руку). Выберите из них пригодные для обоев рабочего стола. Это будет наш запасник. Построив основную инфраструктуру, вы сможете более придирчиво отобрать экспозицию вашей галереи.&lt;br /&gt;
&lt;br /&gt;
В KDE можно воспользоваться вызовами DCOP для извлечения текущего фонового изображения (см. учебник в LXF79 для введения в DCOP). Но сперва определим, на каком рабочем столе мы находимся. Вот вызов DCOP для этого:&lt;br /&gt;
&lt;br /&gt;
 $ dcop kwin KWinInterface currentDesktop&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
Вывод гласит, что в данный момент я на &amp;lt;font color=darkblue&amp;gt;Рабочем столе&amp;lt;/font&amp;gt; 2. Вот и чудненько: наличие нескольких рабочих столов прибавит нам разнообразия в отображении обоев! Давайте теперь узнаем, какие обои установлены на активном рабочем столе:&lt;br /&gt;
&lt;br /&gt;
 $ dcop kdesktop KBackgroundIface currentWallpaper 2&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg&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;
 $ ls ~/BackgroundArt/* &amp;gt; ~/BackgroundArt/.index.txt&lt;br /&gt;
&lt;br /&gt;
Текстовому файлу дано имя, начинающееся с точки, чтобы он не отображал сам себя в выводе команды &amp;lt;font color=darkred&amp;gt;ls&amp;lt;/font&amp;gt; в процессе обновления при добавке новых изображений. Для примера, вот мой собственный список:&lt;br /&gt;
&lt;br /&gt;
 $ more ~/BackgroundArt/.index.txt&lt;br /&gt;
 /home/dave/BackgroundArt/Botticelli-Venus.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-David_goliath.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Decapitation_of_john_the_ baptist.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Judith_Beheading_Holofernes. jpg&lt;br /&gt;
 /home/dave/BackgroundArt/caravaggio-st_thomas.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Tizian-Urbino_Venus.jpg&lt;br /&gt;
&lt;br /&gt;
Чтобы выяснить позицию текущего файла в этом списке, можно использовать команду &amp;lt;font color=darkred&amp;gt;grep&amp;lt;/font&amp;gt;. Применение флажка &amp;lt;font color=darkred&amp;gt;-n &amp;lt;/font&amp;gt;добавит номер строки в вывод, показывающий позицию текущего изображения в файле.&lt;br /&gt;
&lt;br /&gt;
 grep -n /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg ~/BackgroundArt/.index.txt&lt;br /&gt;
 4:/home/dave/BackgroundArt/Caravaggio-Emmaus.jpg&lt;br /&gt;
&lt;br /&gt;
Стало быть, текущее изображение находится в четвертой строке нашего индексного файла. Давайте направим вывод в команду &amp;lt;font color=darkred&amp;gt;cut&amp;lt;/font&amp;gt;, чтобы возвращать только номер строки: остальное нам неинтересно. Символ перенаправления – &amp;lt;font color=darkred&amp;gt;|&amp;lt;/font&amp;gt;, обычно он находится в верхнем регистре (т.е. получается при нажатом &amp;lt;font color=darkblue&amp;gt;Shift&amp;lt;/font&amp;gt;) над клавишей &amp;lt;font color=darkblue&amp;gt;Enter&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 $ grep -n /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg ~/BackgroundArt/.index.txt | cut -d’:’ -f1&lt;br /&gt;
 4&lt;br /&gt;
&lt;br /&gt;
Теперь надо найти следующее (или предыдущее) изображение в списке. Что ж, в зависимости от того, куда собираемся двигаться, вперед или назад, мы можем просто увеличить или уменьшить текущий номер, а затем вытащить требуемую строку из файла с помощью хитроумной комбинации команд &amp;lt;font color=darkred&amp;gt;head&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;tail&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 $ head -5 ~/BackgroundArt/.index.txt | tail -1&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Judith_Beheading_Holofernes.jpg&lt;br /&gt;
&lt;br /&gt;
Когда мы примемся за скрипт, вы заметите, что не мешает предотвратить чрезмерное продвижение вперед или назад, чтобы не заскочить за конец или до начала файла. В подобных случаях следует переходить на начало или конец файла – тогда нам нужно знать, сколько изображений в списке. Мы можем получить это число при помощи команды &amp;lt;font color=darkred&amp;gt;wc&amp;lt;/font&amp;gt;; перенаправив ее в &amp;lt;font color=darkred&amp;gt;cut&amp;lt;/font&amp;gt;, выделим необходимую информацию (число строк).&lt;br /&gt;
&lt;br /&gt;
 $ wc -l ~/BackgroundArt/.index.txt | cut -d ’ ‘ -f 1&lt;br /&gt;
 9&lt;br /&gt;
&lt;br /&gt;
Определив, какое изображение показывать следующим, установим его в качестве новых обоев с помощью вызова &amp;lt;font color=darkred&amp;gt;dcop&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 $ dcop kdesktop KBackgroundIface setWallpaper 2 /home/dave/BackgroundArt/Caravaggio-Judith_Beheading_Holofernes.jpg 4&lt;br /&gt;
&lt;br /&gt;
Последний параметр – номер режима, описывающего, как поступить с изображением: уложить черепицей, растянуть и т.д. Здесь есть насколько вариантов. По-моему, четвертый – поместить по центру с масштабированием – больше всего подходит для картин: размеры изображения при выводе на экран получаются максимально возможными с сохранением исходных пропорций. Ваши требования могут быть иными, так что экспериментируйте с этими вариантами, чтобы&lt;br /&gt;
получить результат, оптимальный для ваших изображений.&lt;br /&gt;
&lt;br /&gt;
===Вспомнить то время...===&lt;br /&gt;
&lt;br /&gt;
Итак, мы обзавелись механизмом, позволяющим перемещаться по списку изображений; но не забывайте, что нужен еще способ вспомнить что-то, связанное с каждой картиной, которую мы видим. Давайте добавим эту функцию. Во-первых, потребуется подкаталог для хранения заметок к каждому изображению. Допустим, у нас есть файл '''MonaLisa.jpg'''; давайте хранить заметки по его поводу в файле '''MonaLisa.jpg.txt''', и держать все файлы в одном месте, разместив их в подкаталоге '''info''' каталога '''BackgroundArt'''. Префикс «точка» опять-таки позволит '''.info''' не попадать в список изображений по команде &amp;lt;font color=darkred&amp;gt;ls&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 $ mkdir ~/BackgroundArt/.info&lt;br /&gt;
 $ echo “Artist: Caravaggio, blah blah” &amp;gt; /home/dave/BackgroundArt/.info/Caravaggio-Emmaus.jpg.txt&lt;br /&gt;
&lt;br /&gt;
Для показа всплывающих сообщений над фоновыми картинками используем утилиту ''kdialog'', имеющую пару приятных и полезных возможностей – в частности, всплывающий «пузырь», который можно употребить для показа нашей заметки.&lt;br /&gt;
&lt;br /&gt;
 $ kdialog --passivepopup “Немного интересной информации” 60&lt;br /&gt;
&lt;br /&gt;
Вы задаете параметры отображаемого текста, а также продолжительность его показа в секундах. Всплывающее сообщение будет исчезать само, когда истечет время показа или когда пользователь нажмет на него, поэтому задайте побольше времени, чтобы успеть его прочитать, скажем, секунд 60. Информацию в '''info'''-файлах, которую мы хотим отобразить, раздобудет наш скрипт. Экранный снимок на предыдущей странице показывает всплывающее окно в действии.&lt;br /&gt;
&lt;br /&gt;
Но позвольте, откуда возьмутся заметки для всех наших картин – ведь придется создавать множество текстовых файлов, сохранять их в требуемом месте, да еще бдительно следить, чтобы не перепутать их имена? Вовсе нет – еще немного скриптинга, и мы сможем ввести примечания к картине через другое всплывающее окно, снова призвав на помощь ''kdialog'':&lt;br /&gt;
&lt;br /&gt;
 $ kdialog --textinputbox “Это заголовок” “Немного интересных фактов для ввода” &lt;br /&gt;
&lt;br /&gt;
Мы можем отобразить диалоговое окно ввода. Если для данного изображения уже существуют какие-нибудь записи, их-то мы и покажем в окне, а скрипт позаботится о поиске этих записей и передаче их в ''kdialog''.&lt;br /&gt;
&lt;br /&gt;
Возвращаемое ''kdialog'' значение будет содержать (свежеотредактированный) текст. Если не было изменений в поле редактирования, значит, возвращаемые данные будут те же, что и исходный текст. Наш скрипт следит за записью этих данных обратно в файл примечаний к изображению.&lt;br /&gt;
&lt;br /&gt;
===А теперь все вместе===&lt;br /&gt;
&lt;br /&gt;
Мы вчерне описали работу отдельных команд. Давайте сведем команды в скрипт &amp;lt;font color=darkred&amp;gt;wallpaper&amp;lt;/font&amp;gt;. Все выполняемые действия мы будем делать с помощью одного скрипта, передавая в него флажки, контролирующие выбор действия. Мне кажется уместным сперва определить перечень этих действий и соответствующих флажков.&lt;br /&gt;
&lt;br /&gt;
Скрипт будет вызываться следующим образом:&lt;br /&gt;
&lt;br /&gt;
 wallpaper &amp;lt; флажки опций &amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вызов его без параметров по умолчанию обеспечивает переход на следующее изображение в галерее. &amp;lt;font color=darkred&amp;gt;&amp;lt;флажок опции&amp;gt;&amp;lt;/font&amp;gt; может быть таким:&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;font color=darkred&amp;gt;-p&amp;lt;/font&amp;gt; перейти к предыдущему изображению.&lt;br /&gt;
#&amp;lt;font color=darkred&amp;gt;-i&amp;lt;/font&amp;gt; показать всплывающее окно с информацией о текущем изображении.&lt;br /&gt;
#&amp;lt;font color=darkred&amp;gt;-e&amp;lt;/font&amp;gt; отобразить окно Редактировать для текущего изображения.&lt;br /&gt;
#&amp;lt;font color=darkred&amp;gt;-h&amp;lt;/font&amp;gt; показать справку.&lt;br /&gt;
&lt;br /&gt;
Скрипт целиком можно взять на DVD. Большая его часть соответствует нашему описанию. В основном мы использовали вызовы внешних программ, захват вывода и стыковку частей, с небольшими вкраплениями логики там и сям. Чтобы избежать дублирования отдельных кусков кода и придать скрипту подобие структуры, используются подпрограммы.&lt;br /&gt;
&lt;br /&gt;
Применим полезный модуль &amp;lt;font color=darkred&amp;gt;Perl Getopt::Std&amp;lt;/font&amp;gt; для обработки параметров, передаваемых в скрипт. В строке&lt;br /&gt;
 &lt;br /&gt;
 getopts(‘pieh’, \my %opts);&lt;br /&gt;
&lt;br /&gt;
мы перечисляем разрешенные флажки и сохраняем их значения в переменной &amp;lt;font color=darkred&amp;gt;%opts&amp;lt;/font&amp;gt; для дальнейшего использования.&lt;br /&gt;
&lt;br /&gt;
Установив некоторые первоначальные значения для текущего рабочего стола, текущую фоновую картину и т.д., приступим к непосредственно к выполнению действий, в зависимости от установленного флажка. Действия &amp;lt;font color=darkred&amp;gt;Info()&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;Edit()&amp;lt;/font&amp;gt; аналогичны – в обоих случаях скрипт получает имя файла, содержащего информацию о текущем изображении:&lt;br /&gt;
&lt;br /&gt;
 my $infofile = getInfoFile($currentImage);&lt;br /&gt;
&lt;br /&gt;
Подпрограмма &amp;lt;font color=darkred&amp;gt;getInfoFile&amp;lt;/font&amp;gt; использует регулярное выражение для манипулирования именем/расположением файла, чтобы найти местоположение для соответствующего файла с информацией. Например, для файла изображения&lt;br /&gt;
&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg&lt;br /&gt;
&lt;br /&gt;
процедура вернет следующий путь к ассоциированному информационному файлу:&lt;br /&gt;
&lt;br /&gt;
 /home/dave/BackgroundArt/.info/Caravaggio-Emmaus.jpg.txt&lt;br /&gt;
&lt;br /&gt;
Процедура &amp;lt;font color=darkred&amp;gt;getInfoFile&amp;lt;/font&amp;gt; делает это с помощью регулярного выражения&lt;br /&gt;
&lt;br /&gt;
 $infofile =~ s#^(.*)/(.*)#$1/.info/$2.txt#;&lt;br /&gt;
&lt;br /&gt;
Определив имя &amp;lt;font color=darkred&amp;gt;infofile&amp;lt;/font&amp;gt;, процедуры &amp;lt;font color=darkred&amp;gt;readFile&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;writeFile&amp;lt;/font&amp;gt; позаботятся о чтении/записи содержимого по мере надобности. Регулярные выражения являются мощными инструментами для выполнения поиска вхождений строк в тексте и их замены. (Не берите в голову заботу о доскональном понимании синтаксиса, если это для вас в новинку – введение в регулярные выражения требует отдельной статьи! Если у вас есть журнал LXF70, то там такая статья опубликована).&lt;br /&gt;
&lt;br /&gt;
===Горячие клавиши===&lt;br /&gt;
&lt;br /&gt;
Теперь скрипт у нас есть, но он не совсем удобен: приходится вводить команду (с параметрами) для каждого изменения обоев или просмотра всплывающих сообщений. Лучше вместо этого использовать возможности KDE по привязке действий по вводу к горячим клавишам. Лично мне нравится использовать многоклавишные комбинации, чтобы группировать похожие действия. Поэтому &amp;lt;font color=darkblue&amp;gt;Alt+B&amp;lt;/font&amp;gt; для меня будет означать группу операций над обоями, а &amp;lt;font color=darkblue&amp;gt;Alt+B&amp;lt;/font&amp;gt; в сочетании с еще одной клавишей уже выполнят конкретное действие: например, &amp;lt;font color=darkblue&amp;gt;Alt+B,N&amp;lt;/font&amp;gt; выведет следующее изображение, а &amp;lt;font color=darkblue&amp;gt;Alt+B,P&amp;lt;/font&amp;gt; вернет нас к предыдущему.&lt;br /&gt;
&lt;br /&gt;
В порядке иллюстрации создадим одну такую комбинацию. В &amp;lt;font color=darkblue&amp;gt;Input Actions [Ввод]&amp;lt;/font&amp;gt; KDE (обычно расположенном в меню &amp;lt;font color=darkblue&amp;gt;Regional and Accessibilty [Региональные настройки и специальные возможности]&amp;lt;/font&amp;gt; в &amp;lt;font color=darkblue&amp;gt;KDE Control Center [Центр управления KDE]&amp;lt;/font&amp;gt;), создайте новую группу &amp;lt;font color=darkblue&amp;gt;‘Wallpaper Actions’&amp;lt;/font&amp;gt;. Нажмите на группу и создайте новое действие. Назовите его &amp;lt;font color=darkblue&amp;gt;WallpaperNext&amp;lt;/font&amp;gt;, установите тип действия &amp;lt;font color=darkblue&amp;gt;Action &amp;gt; Command(url)&amp;lt;/font&amp;gt; [&amp;lt;font color=darkblue&amp;gt;Комбинация клавиш -&amp;gt; команда/URL&amp;lt;/font&amp;gt;]. Установите комбинацию клавиш (многоклавишный режим) &amp;lt;font color=darkblue&amp;gt;Alt+B,N&amp;lt;/font&amp;gt;, и параметры команды &amp;lt;font color=darkblue&amp;gt;/home/dave/bin/wallpaper&amp;lt;/font&amp;gt; (или путь, где вы сохранили свой скрипт). Нажмите &amp;lt;font color=darkblue&amp;gt;ОК&amp;lt;/font&amp;gt;, и пробуйте. Нажатие &amp;lt;font color=darkblue&amp;gt;Alt+B,N&amp;lt;/font&amp;gt; должно привести к замене текущих обоев следующим изображением вашей галереи. Если это действие работает нормально, двигаемся дальше и добавляем остальные комбинации клавиш.&lt;br /&gt;
&lt;br /&gt;
===Примочки===&lt;br /&gt;
&lt;br /&gt;
Итак, основная часть готова. Как еще улучшить наш скрипт? Ну, можно автоматизировать создание индексного файла, чтобы добавлять/удалять изображения в каталоге и не думать о его ручном обновлении. Добавим задание ''cron'', чтобы это происходило раз в день:&lt;br /&gt;
&lt;br /&gt;
 crontab -e&lt;br /&gt;
 05 12 * * * ls /home/dave/BackgroundArt/* &amp;gt; /home/dave/BackgroundArt/.index.txt&lt;br /&gt;
&lt;br /&gt;
Что еще? Мне нравится идея использования в качестве обоев праздничных фотографий. Или плакатов фильмов, или снимков с телескопа Хаббла. Но надо ли все это помещать в единый список? Наоборот, лучше создать отдельные категории и переключаться между ними. Этого можно добиться, приложив еще немного труда. Мы создадим отдельный каталог для каждой категории изображения. Сложность только в определении, к какой категории принадлежит текущее изображение. Для простоты, будем тупо просматривать наш индексный файл, и если соответствия не найдется, то разместим изображение в категории по умолчанию, допустим, &amp;lt;font color=darkblue&amp;gt;Art&amp;lt;/font&amp;gt;. На DVD вы найдете расширенную версию скрипта, с поддержкой категорий. Я добавил еще горячих клавиш для переключения между категориями.&lt;br /&gt;
&lt;br /&gt;
Другим дополнением может быть предложение пользователю диалога, в котором он мог бы выбрать изображение из списка. Иначе в большой галерее надо будет много раз прокручивать изображения назад и вперед в поисках того или иного образа. (Подсказка: посмотрите опцию &amp;lt;font color=darkred&amp;gt;–combobox&amp;lt;/font&amp;gt; утилиты ''kdialog''). Также&lt;br /&gt;
можно случайным образом выбирать картину из галереи. Это можно автоматизировать через ''cron'' и изменять фон ежедневно.&lt;br /&gt;
&lt;br /&gt;
==Врезки==&lt;br /&gt;
&lt;br /&gt;
===Горячие клавиши===&lt;br /&gt;
&lt;br /&gt;
====Смена изображений====&lt;br /&gt;
&lt;br /&gt;
{| align=center border=1&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Горячие клавиши&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Действие&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Команда&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, N&amp;lt;/center&amp;gt;&lt;br /&gt;
|Перейти к следующему изображению&lt;br /&gt;
|wallpaper&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, P&amp;lt;/center&amp;gt;&lt;br /&gt;
|Перейти к предыдущему изображению&lt;br /&gt;
|walpaper -p&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, I&amp;lt;/center&amp;gt;&lt;br /&gt;
|Отобразить информацию о текущем изображении&lt;br /&gt;
|wallpaper -e&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, E&amp;lt;/center&amp;gt;&lt;br /&gt;
|Изменить информацию о текущем изображении&lt;br /&gt;
|wallpaper -e&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Навигация====&lt;br /&gt;
&lt;br /&gt;
{| align=center border=1&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Горячие клавиши&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Действие&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Команда&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, A&amp;lt;/center&amp;gt;&lt;br /&gt;
|Переход к категории Art&lt;br /&gt;
|wallpaper -c Art&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, H&amp;lt;/center&amp;gt;&lt;br /&gt;
|Переход к категории Holiday&lt;br /&gt;
|walpaper -c Holiday&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, M&amp;lt;/center&amp;gt;&lt;br /&gt;
|Переход к категории Movie&lt;br /&gt;
|wallpaper -c Movie&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:KDE</id>
		<title>LXF98:KDE</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:KDE"/>
				<updated>2008-03-20T19:11:18Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;font color=darkred&amp;gt;KDE:&amp;lt;/font&amp;gt; Галерея на рабочем столе==&lt;br /&gt;
&lt;br /&gt;
''Маэстро '''Дэвид Фили''' покажет, как легко превратить ваш рабочий стол в картинную галерею с помощью DCOP, Perl и шаманства с командной строкой.''&lt;br /&gt;
&lt;br /&gt;
Одно из величайших достижений Linux – даруемая им свобода: в частности, это свобода что-то переопределить, подправить и настроить «как хочется», а не довольствоваться тем, «что дают». К примеру, я сейчас интересуюсь искусством, и хотел бы поместить коллекцию картин старых мастеров на обои моего рабочего стола. Беда в том, что мне все быстро надоедает, поэтому нужен также простой способ чередовать эти изображения; да и память у меня прескверная, а надо как-то отличать моего Караваджо от моего Констебля.&lt;br /&gt;
&lt;br /&gt;
Желаю иметь возможность вводить и просматривать примечания ко всем картинам, чтобы над ними всплывали сообщения с подсказками про имя художника, год написания и музей, где она находится, и, может быть, парой кратких заметок, благодаря которым я смогу притвориться, будто знаю, на что это я тут глазею, если меня вдруг станут расспрашивать.&lt;br /&gt;
&lt;br /&gt;
В Linux и KDE такое вполне достижимо, если связать вместе различные инструменты командной строки и скрипты: классическая концепция Unix/Linux по объединению нескольких инструментов общего назначения в полезное приложение. Целью данной статьи является подготовка скрипта, управляющего нашей псевдоКартинной Галереей на фоне рабочего стола. Определим также несколько горячих клавиш, нажатия на которые обеспечат следующие действия:&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;
 $ mkdir ~/BackgroundArt&lt;br /&gt;
&lt;br /&gt;
и скопируем туда какие-нибудь картинки (какие попались под руку). Выберите из них пригодные для обоев рабочего стола. Это будет наш запасник. Построив основную инфраструктуру, вы сможете более придирчиво отобрать экспозицию вашей галереи.&lt;br /&gt;
&lt;br /&gt;
В KDE можно воспользоваться вызовами DCOP для извлечения текущего фонового изображения (см. учебник в LXF79 для введения в DCOP). Но сперва определим, на каком рабочем столе мы находимся. Вот вызов DCOP для этого:&lt;br /&gt;
&lt;br /&gt;
 $ dcop kwin KWinInterface currentDesktop&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
Вывод гласит, что в данный момент я на &amp;lt;font color=darkblue&amp;gt;Рабочем столе&amp;lt;/font&amp;gt; 2. Вот и чудненько: наличие нескольких рабочих столов прибавит нам разнообразия в отображении обоев! Давайте теперь узнаем, какие обои установлены на активном рабочем столе:&lt;br /&gt;
&lt;br /&gt;
 $ dcop kdesktop KBackgroundIface currentWallpaper 2&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg&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;
 $ ls ~/BackgroundArt/* &amp;gt; ~/BackgroundArt/.index.txt&lt;br /&gt;
&lt;br /&gt;
Текстовому файлу дано имя, начинающееся с точки, чтобы он не отображал сам себя в выводе команды &amp;lt;font color=darkred&amp;gt;ls&amp;lt;/font&amp;gt; в процессе обновления при добавке новых изображений. Для примера, вот мой собственный список:&lt;br /&gt;
&lt;br /&gt;
 $ more ~/BackgroundArt/.index.txt&lt;br /&gt;
 /home/dave/BackgroundArt/Botticelli-Venus.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-David_goliath.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Decapitation_of_john_the_ baptist.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Judith_Beheading_Holofernes. jpg&lt;br /&gt;
 /home/dave/BackgroundArt/caravaggio-st_thomas.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Tizian-Urbino_Venus.jpg&lt;br /&gt;
&lt;br /&gt;
Чтобы выяснить позицию текущего файла в этом списке, можно использовать команду &amp;lt;font color=darkred&amp;gt;grep&amp;lt;/font&amp;gt;. Применение флажка &amp;lt;font color=darkred&amp;gt;-n &amp;lt;/font&amp;gt;добавит номер строки в вывод, показывающий позицию текущего изображения в файле.&lt;br /&gt;
&lt;br /&gt;
 grep -n /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg ~/BackgroundArt/.index.txt&lt;br /&gt;
 4:/home/dave/BackgroundArt/Caravaggio-Emmaus.jpg&lt;br /&gt;
&lt;br /&gt;
Стало быть, текущее изображение находится в четвертой строке нашего индексного файла. Давайте направим вывод в команду &amp;lt;font color=darkred&amp;gt;cut&amp;lt;/font&amp;gt;, чтобы возвращать только номер строки: остальное нам неинтересно. Символ перенаправления – &amp;lt;font color=darkred&amp;gt;|&amp;lt;/font&amp;gt;, обычно он находится в верхнем регистре (т.е. получается при нажатом &amp;lt;font color=darkblue&amp;gt;Shift&amp;lt;/font&amp;gt;) над клавишей &amp;lt;font color=darkblue&amp;gt;Enter&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 $ grep -n /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg ~/BackgroundArt/.index.txt | cut -d’:’ -f1&lt;br /&gt;
 4&lt;br /&gt;
&lt;br /&gt;
Теперь надо найти следующее (или предыдущее) изображение в списке. Что ж, в зависимости от того, куда собираемся двигаться, вперед или назад, мы можем просто увеличить или уменьшить текущий номер, а затем вытащить требуемую строку из файла с помощью хитроумной комбинации команд &amp;lt;font color=darkred&amp;gt;head&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;tail&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 $ head -5 ~/BackgroundArt/.index.txt | tail -1&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Judith_Beheading_Holofernes.jpg&lt;br /&gt;
&lt;br /&gt;
Когда мы примемся за скрипт, вы заметите, что не мешает предотвратить чрезмерное продвижение вперед или назад, чтобы не заскочить за конец или до начала файла. В подобных случаях следует переходить на начало или конец файла – тогда нам нужно знать, сколько изображений в списке. Мы можем получить это число при помощи команды &amp;lt;font color=darkred&amp;gt;wc&amp;lt;/font&amp;gt;; перенаправив ее в &amp;lt;font color=darkred&amp;gt;cut&amp;lt;/font&amp;gt;, выделим необходимую информацию (число строк).&lt;br /&gt;
&lt;br /&gt;
 $ wc -l ~/BackgroundArt/.index.txt | cut -d ’ ‘ -f 1&lt;br /&gt;
 9&lt;br /&gt;
&lt;br /&gt;
Определив, какое изображение показывать следующим, установим его в качестве новых обоев с помощью вызова &amp;lt;font color=darkred&amp;gt;dcop&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 $ dcop kdesktop KBackgroundIface setWallpaper 2 /home/dave/BackgroundArt/Caravaggio-Judith_Beheading_Holofernes.jpg 4&lt;br /&gt;
&lt;br /&gt;
Последний параметр – номер режима, описывающего, как поступить с изображением: уложить черепицей, растянуть и т.д. Здесь есть насколько вариантов. По-моему, четвертый – поместить по центру с масштабированием – больше всего подходит для картин: размеры изображения при выводе на экран получаются максимально возможными с сохранением исходных пропорций. Ваши требования могут быть иными, так что экспериментируйте с этими вариантами, чтобы&lt;br /&gt;
получить результат, оптимальный для ваших изображений.&lt;br /&gt;
&lt;br /&gt;
===Вспомнить то время...===&lt;br /&gt;
&lt;br /&gt;
Итак, мы обзавелись механизмом, позволяющим перемещаться по списку изображений; но не забывайте, что нужен еще способ вспомнить что-то, связанное с каждой картиной, которую мы видим. Давайте добавим эту функцию. Во-первых, потребуется подкаталог для хранения заметок к каждому изображению. Допустим, у нас есть файл '''MonaLisa.jpg'''; давайте хранить заметки по его поводу в файле '''MonaLisa.jpg.txt''', и держать все файлы в одном месте, разместив их в подкаталоге '''info''' каталога '''BackgroundArt'''. Префикс «точка» опять-таки позволит '''.info''' не попадать в список изображений по команде &amp;lt;font color=darkred&amp;gt;ls&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 $ mkdir ~/BackgroundArt/.info&lt;br /&gt;
 $ echo “Artist: Caravaggio, blah blah” &amp;gt; /home/dave/BackgroundArt/.info/Caravaggio-Emmaus.jpg.txt&lt;br /&gt;
&lt;br /&gt;
Для показа всплывающих сообщений над фоновыми картинками используем утилиту ''kdialog'', имеющую пару приятных и полезных возможностей – в частности, всплывающий «пузырь», который можно употребить для показа нашей заметки.&lt;br /&gt;
&lt;br /&gt;
 $ kdialog --passivepopup “Немного интересной информации” 60&lt;br /&gt;
&lt;br /&gt;
Вы задаете параметры отображаемого текста, а также продолжительность его показа в секундах. Всплывающее сообщение будет исчезать само, когда истечет время показа или когда пользователь нажмет на него, поэтому задайте побольше времени, чтобы успеть его прочитать, скажем, секунд 60. Информацию в '''info'''-файлах, которую мы хотим отобразить, раздобудет наш скрипт. Экранный снимок на предыдущей странице показывает всплывающее окно в действии.&lt;br /&gt;
&lt;br /&gt;
Но позвольте, откуда возьмутся заметки для всех наших картин – ведь придется создавать множество текстовых файлов, сохранять их в требуемом месте, да еще бдительно следить, чтобы не перепутать их имена? Вовсе нет – еще немного скриптинга, и мы сможем ввести примечания к картине через другое всплывающее окно, снова призвав на помощь ''kdialog'':&lt;br /&gt;
&lt;br /&gt;
 $ kdialog --textinputbox “Это заголовок” “Немного интересных фактов для ввода” &lt;br /&gt;
&lt;br /&gt;
Мы можем отобразить диалоговое окно ввода. Если для данного изображения уже существуют какие-нибудь записи, их-то мы и покажем в окне, а скрипт позаботится о поиске этих записей и передаче их в ''kdialog''.&lt;br /&gt;
&lt;br /&gt;
Возвращаемое ''kdialog'' значение будет содержать (свежеотредактированный) текст. Если не было изменений в поле редактирования, значит, возвращаемые данные будут те же, что и исходный текст. Наш скрипт следит за записью этих данных обратно в файл примечаний к изображению.&lt;br /&gt;
&lt;br /&gt;
===А теперь все вместе===&lt;br /&gt;
&lt;br /&gt;
Мы вчерне описали работу отдельных команд. Давайте сведем команды в скрипт &amp;lt;font color=darkred&amp;gt;wallpaper&amp;lt;/font&amp;gt;. Все выполняемые действия мы будем делать с помощью одного скрипта, передавая в него флажки, контролирующие выбор действия. Мне кажется уместным сперва определить перечень этих действий и соответствующих флажков.&lt;br /&gt;
&lt;br /&gt;
Скрипт будет вызываться следующим образом:&lt;br /&gt;
&lt;br /&gt;
 wallpaper &amp;lt; флажки опций &amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вызов его без параметров по умолчанию обеспечивает переход на следующее изображение в галерее. &amp;lt;font color=darkred&amp;gt;&amp;lt;флажок опции&amp;gt;&amp;lt;/font&amp;gt; может быть таким:&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;font color=darkred&amp;gt;-p&amp;lt;/font&amp;gt; перейти к предыдущему изображению.&lt;br /&gt;
#&amp;lt;font color=darkred&amp;gt;-i&amp;lt;/font&amp;gt; показать всплывающее окно с информацией о текущем изображении.&lt;br /&gt;
#&amp;lt;font color=darkred&amp;gt;-e&amp;lt;/font&amp;gt; отобразить окно Редактировать для текущего изображения.&lt;br /&gt;
#&amp;lt;font color=darkred&amp;gt;-h&amp;lt;/font&amp;gt; показать справку.&lt;br /&gt;
&lt;br /&gt;
Скрипт целиком можно взять на DVD. Большая его часть соответствует нашему описанию. В основном мы использовали вызовы внешних программ, захват вывода и стыковку частей, с небольшими вкраплениями логики там и сям. Чтобы избежать дублирования отдельных кусков кода и придать скрипту подобие структуры, используются подпрограммы.&lt;br /&gt;
&lt;br /&gt;
Применим полезный модуль &amp;lt;font color=darkred&amp;gt;Perl Getopt::Std&amp;lt;/font&amp;gt; для обработки параметров, передаваемых в скрипт. В строке&lt;br /&gt;
 &lt;br /&gt;
 getopts(‘pieh’, \my %opts);&lt;br /&gt;
&lt;br /&gt;
мы перечисляем разрешенные флажки и сохраняем их значения в переменной &amp;lt;font color=darkred&amp;gt;%opts&amp;lt;/font&amp;gt; для дальнейшего использования.&lt;br /&gt;
&lt;br /&gt;
Установив некоторые первоначальные значения для текущего рабочего стола, текущую фоновую картину и т.д., приступим к непосредственно к выполнению действий, в зависимости от установленного флажка. Действия &amp;lt;font color=darkred&amp;gt;Info()&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;Edit()&amp;lt;/font&amp;gt; аналогичны – в обоих случаях скрипт получает имя файла, содержащего информацию о текущем изображении:&lt;br /&gt;
&lt;br /&gt;
 my $infofile = getInfoFile($currentImage);&lt;br /&gt;
&lt;br /&gt;
Подпрограмма &amp;lt;font color=darkred&amp;gt;getInfoFile&amp;lt;/font&amp;gt; использует регулярное выражение для манипулирования именем/расположением файла, чтобы найти местоположение для соответствующего файла с информацией. Например, для файла изображения&lt;br /&gt;
&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg&lt;br /&gt;
&lt;br /&gt;
процедура вернет следующий путь к ассоциированному информационному файлу:&lt;br /&gt;
&lt;br /&gt;
 /home/dave/BackgroundArt/.info/Caravaggio-Emmaus.jpg.txt&lt;br /&gt;
&lt;br /&gt;
Процедура &amp;lt;font color=darkred&amp;gt;getInfoFile&amp;lt;/font&amp;gt; делает это с помощью регулярного выражения&lt;br /&gt;
&lt;br /&gt;
 $infofile =~ s#^(.*)/(.*)#$1/.info/$2.txt#;&lt;br /&gt;
&lt;br /&gt;
Определив имя &amp;lt;font color=darkred&amp;gt;infofile&amp;lt;/font&amp;gt;, процедуры &amp;lt;font color=darkred&amp;gt;readFile&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;writeFile&amp;lt;/font&amp;gt; позаботятся о чтении/записи содержимого по мере надобности. Регулярные выражения являются мощными инструментами для выполнения поиска вхождений строк в тексте и их замены. (Не берите в голову заботу о доскональном понимании синтаксиса, если это для вас в новинку – введение в регулярные выражения требует отдельной статьи! Если у вас есть журнал LXF70, то там такая статья опубликована).&lt;br /&gt;
&lt;br /&gt;
===Горячие клавиши===&lt;br /&gt;
&lt;br /&gt;
Теперь скрипт у нас есть, но он не совсем удобен: приходится вводить команду (с параметрами) для каждого изменения обоев или просмотра всплывающих сообщений. Лучше вместо этого использовать возможности KDE по привязке действий по вводу к горячим клавишам. Лично мне нравится использовать многоклавишные комбинации, чтобы группировать похожие действия. Поэтому &amp;lt;font color=darkblue&amp;gt;Alt+B&amp;lt;/font&amp;gt; для меня будет означать группу операций над обоями, а &amp;lt;font color=darkblue&amp;gt;Alt+B&amp;lt;/font&amp;gt; в сочетании с еще одной клавишей уже выполнят конкретное действие: например, &amp;lt;font color=darkblue&amp;gt;Alt+B,N&amp;lt;/font&amp;gt; выведет следующее изображение, а &amp;lt;font color=darkblue&amp;gt;Alt+B,P&amp;lt;/font&amp;gt; вернет нас к предыдущему.&lt;br /&gt;
&lt;br /&gt;
В порядке иллюстрации создадим одну такую комбинацию. В &amp;lt;font color=darkblue&amp;gt;Input Actions [Ввод]&amp;lt;/font&amp;gt; KDE (обычно расположенном в меню &amp;lt;font color=darkblue&amp;gt;Regional and Accessibilty [Региональные настройки и специальные возможности]&amp;lt;/font&amp;gt; в &amp;lt;font color=darkblue&amp;gt;KDE Control Center [Центр управления KDE]&amp;lt;/font&amp;gt;), создайте новую группу &amp;lt;font color=darkblue&amp;gt;‘Wallpaper Actions’&amp;lt;/font&amp;gt;. Нажмите на группу и создайте новое действие. Назовите его &amp;lt;font color=darkblue&amp;gt;WallpaperNext&amp;lt;/font&amp;gt;, установите тип действия &amp;lt;font color=darkblue&amp;gt;Action &amp;gt; Command(url)&amp;lt;/font&amp;gt; [&amp;lt;font color=darkblue&amp;gt;Комбинация клавиш -&amp;gt; команда/URL&amp;lt;/font&amp;gt;]. Установите комбинацию клавиш (многоклавишный режим) &amp;lt;font color=darkblue&amp;gt;Alt+B,N&amp;lt;/font&amp;gt;, и параметры команды &amp;lt;font color=darkblue&amp;gt;/home/dave/bin/wallpaper&amp;lt;/font&amp;gt; (или путь, где вы сохранили свой скрипт). Нажмите &amp;lt;font color=darkblue&amp;gt;ОК&amp;lt;/font&amp;gt;, и пробуйте. Нажатие &amp;lt;font color=darkblue&amp;gt;Alt+B,N&amp;lt;/font&amp;gt; должно привести к замене текущих обоев следующим изображением вашей галереи. Если это действие работает нормально, двигаемся дальше и добавляем остальные комбинации клавиш.&lt;br /&gt;
&lt;br /&gt;
===Примочки===&lt;br /&gt;
&lt;br /&gt;
Итак, основная часть готова. Как еще улучшить наш скрипт? Ну, можно автоматизировать создание индексного файла, чтобы добавлять/удалять изображения в каталоге и не думать о его ручном обновлении. Добавим задание ''cron'', чтобы это происходило раз в день:&lt;br /&gt;
&lt;br /&gt;
 crontab -e&lt;br /&gt;
 05 12 * * * ls /home/dave/BackgroundArt/* &amp;gt; /home/dave/BackgroundArt/.index.txt&lt;br /&gt;
&lt;br /&gt;
Что еще? Мне нравится идея использования в качестве обоев праздничных фотографий. Или плакатов фильмов, или снимков с телескопа Хаббла. Но надо ли все это помещать в единый список? Наоборот, лучше создать отдельные категории и переключаться между ними. Этого можно добиться, приложив еще немного труда. Мы создадим отдельный каталог для каждой категории изображения. Сложность только в определении, к какой категории принадлежит текущее изображение. Для простоты, будем тупо просматривать наш индексный файл, и если соответствия не найдется, то разместим изображение в категории по умолчанию, допустим, &amp;lt;font color=darkblue&amp;gt;Art&amp;lt;/font&amp;gt;. На DVD вы найдете расширенную версию скрипта, с поддержкой категорий. Я добавил еще горячих клавиш для переключения между категориями.&lt;br /&gt;
&lt;br /&gt;
Другим дополнением может быть предложение пользователю диалога, в котором он мог бы выбрать изображение из списка. Иначе в большой галерее надо будет много раз прокручивать изображения назад и вперед в поисках того или иного образа. (Подсказка: посмотрите опцию &amp;lt;font color=darkred&amp;gt;–combobox&amp;lt;/font&amp;gt; утилиты ''kdialog''). Также&lt;br /&gt;
можно случайным образом выбирать картину из галереи. Это можно автоматизировать через ''cron'' и изменять фон ежедневно.&lt;br /&gt;
&lt;br /&gt;
==Врезки==&lt;br /&gt;
&lt;br /&gt;
===Горячие клавиши===&lt;br /&gt;
&lt;br /&gt;
====Смена изображений====&lt;br /&gt;
&lt;br /&gt;
{| align=center border=1&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Горячие клавиши&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Действие&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Команда&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, N&amp;lt;/center&amp;gt;&lt;br /&gt;
|Перейти к следующему изображению&lt;br /&gt;
|wallpaper&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, P&amp;lt;/center&amp;gt;&lt;br /&gt;
|Перейти к предыдущему изображению&lt;br /&gt;
|walpaper -p&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, I&amp;lt;/center&amp;gt;&lt;br /&gt;
|Отобразить информацию о текущем изображении&lt;br /&gt;
|wallpaper -e&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, E&amp;lt;/center&amp;gt;&lt;br /&gt;
|Изменить информацию о текущем изображении&lt;br /&gt;
|wallpaper -e&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Навигация====&lt;br /&gt;
&lt;br /&gt;
{| align=center border=1&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Горячие клавиши&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Действие&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Команда&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, A&amp;lt;/center&amp;gt;&lt;br /&gt;
|Переход к категории Art&lt;br /&gt;
|wallpaper -c Art&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, H&amp;lt;/center&amp;gt;&lt;br /&gt;
|Переход к категории Holiday&lt;br /&gt;
|walpaper -c Holiday&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, M&amp;lt;/center&amp;gt;&lt;br /&gt;
|Переход к категории Movie&lt;br /&gt;
|wallpaper -c Movie&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:Mono</id>
		<title>LXF98:Mono</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:Mono"/>
				<updated>2008-03-20T19:08:23Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;font color=darkred&amp;gt;Mono:&amp;lt;/font&amp;gt; Назад в Unix==&lt;br /&gt;
&lt;br /&gt;
''Хотя C# и новый, и передовой, Mono стоит на плечах уродливого монстра Posix.&lt;br /&gt;
'''Пол Хадсон''' пробует заставить Unix-натуру Linux сработаться с .NET...''&lt;br /&gt;
&lt;br /&gt;
Имеет ли место садомазохизм в мире компьютеров? Если да, то вот он: я покажу вам, как заставить C# идти бок о бок с Posix и выиграть. Да, Posix – этот дурно задуманный процесс стандартизации, сбивающий с толку программистов, игнорируемый конечными пользователями, и все же подпирающий Linux и другие&lt;br /&gt;
Unix-подобные ОС. Posix – это набор системных вызовов, интерфейсов и сигналов, определяющий, как мы, разработчики, взаимодействуем с операционной системой. Действующий стандарт Posix весьма обширен, но по сути мы должны заботиться только вот о чем: если вы пишете Posix-совместимый код, он должен работать в любой Posix-совместимой ОС.&lt;br /&gt;
&lt;br /&gt;
Как ни странно, список совместимости включает Windows Vista, точнее, большинство основанных на NT версий Windows, коль скоро они имеют установленными службы Services for Unix. Но с нашей точки зрения важно то, что Linux, FreeBSD, OpenBSD и Syllable практически, а AIX, HP-UX, Minix, OS X и Solaris – полностью поддерживают Posix. Короче, использование функциональности Posix может заставить вас рвать на себе волосы, но, по крайней мере, вы в хорошей компании!&lt;br /&gt;
&lt;br /&gt;
===Posix и вы===&lt;br /&gt;
&lt;br /&gt;
Имеется два типа людей, в основном использующих Posix: конечные пользователи и разработчики. Значит, практически все! Рассмотрим каждый тип отдельно, начав с пользователя. Да, я помню свои слова, что конечный пользователь игнорирует Posix, но это не совсем верно – фактически, вы используете преимущества инструментов и интерфейсов Posix при каждом обращении к командной строке. Видите ли, Posix заправляет едва ли не всем, что даруют Unix-подобные операционные системы – как работает ваша командная строка, есть ли инструменты типа awk и компиляторов, как происходит взаимодействие программ через каналы. Пусть даже конечные пользователи ничего не знают и знать не хотят о Posix, они обязательно опираются на его набор функций! Что касается разработчиков, то любой из пишущих код на С должен работать с одним из многих интерфейсов ядра и вызовами стандартной библиотеки С, входящими в Posix, и эти функции – например, &amp;lt;font color=darkred&amp;gt;malloc&amp;lt;/font&amp;gt;, &amp;lt;font color=darkred&amp;gt;system&amp;lt;/font&amp;gt;, &amp;lt;font color=darkred&amp;gt;printf&amp;lt;/font&amp;gt;, &amp;lt;font color=darkred&amp;gt;fopen&amp;lt;/font&amp;gt; и другие – доступны везде, куда ни сунься.&lt;br /&gt;
&lt;br /&gt;
Это ставит нас перед вопросом: «Какой прок в использовании Posix?» Общеизвестно, что все системные вызовы Posix скопированы в стандарте среды .NET, с использованием управляемых эквивалентов: вы можете читать и записывать файлы, работать со строками, открывать сокеты, читать данные файловой системы и так далее, не беспокоясь о распределении памяти, потому что .NET освободит все, когда сработает сборщик мусора. Но использование версий Posix дает некоторые преимущества:&lt;br /&gt;
&lt;br /&gt;
# Унаследованный код очень легко портировать. Вы можете взять код на C и запросто перенести его на C#, затем, при добавлении новых функций, добавить расширенную функциональность, присущую C#.&lt;br /&gt;
# В том же русле: для C-программистов вполне очевидно, что делает код C# Posix, а это облегчает изучение и сопровождение.&lt;br /&gt;
# Вы можете использовать преимущества специфичной для Posix функциональности. Например, чтение данных из файла '''/etc/passwd''' в обычном .NET коде необходимо делать вручную, а с использованием инструментов Posix это раз плюнуть.&lt;br /&gt;
&lt;br /&gt;
Итак, использование Posix не лишено преимуществ, но вдобавок имеется одно большое неудобство: львиная доля Posix работает с указателями.&lt;br /&gt;
&lt;br /&gt;
«Указатели?» Так и слышу, как вы охнули. «Привет! Говорят 1980-е! Они требуют обратно свой безумный, анахроничный, осложненный переполнениями буфера доступ к памяти!» Именно так. Указатели – это программные имена, описывающие конкретный участок памяти. Например, переменная – указатель на строку содержит точный адрес в памяти, где располагается строка текста. Понятно, что это прекрасно для быстродействия, так как между программой и оборудованием нет посредников, но ужасно с точки зрения безопасности, потому что программа имеет полную власть над вашим компьютером: даже крошечная щелочка в безопасности может вылиться в захват системы. Теперь, когда вы знаете все о плюсах и минусах Posix, давайте нырнем в него и посмотрим, что тут можно сделать...&lt;br /&gt;
&lt;br /&gt;
===Базируемся на Stdlib===&lt;br /&gt;
&lt;br /&gt;
Имеется три компонента для поддержки Unix в Mono: &amp;lt;font color=darkred&amp;gt;Mono.Posix&amp;lt;/font&amp;gt;, &amp;lt;font color=darkred&amp;gt;Mono.Unix&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;Mono.Unix.Native&amp;lt;/font&amp;gt;. Два последних отличаются лишь тем, что &amp;lt;font color=darkred&amp;gt;Mono.Unix&amp;lt;/font&amp;gt; – это небольшая обертка для &amp;lt;font color=darkred&amp;gt;Mono.Unix.Native&amp;lt;/font&amp;gt;, но вы можете использовать ту, где вам комфортнее.&lt;br /&gt;
&lt;br /&gt;
Начнем с простого: создадим новое решение под названием &amp;lt;font color=darkred&amp;gt;Monix&amp;lt;/font&amp;gt;, затем изменим его код '''Main.cs''' так:&lt;br /&gt;
&lt;br /&gt;
 using Mono.Posix;&lt;br /&gt;
 using Mono.Unix;&lt;br /&gt;
 using Mono.Unix.Native;&lt;br /&gt;
 using System;&lt;br /&gt;
 using System.Text;&lt;br /&gt;
 namespace monix {&lt;br /&gt;
    class Monix {&lt;br /&gt;
     public static void Main(string[] args) {&lt;br /&gt;
       Stdlib.system(“ls”);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Этот простой код – основа для всех дальнейших: будем изменять только строку &amp;lt;font color=darkred&amp;gt;Stdlib.system()&amp;lt;/font&amp;gt; да добавлять кое-какие кусочки.&lt;br /&gt;
Проверьте наличие Mono.Posix и добавьте ссылку на него в проект. В нашем первом методе мы воспользуемся классом &amp;lt;font color=darkred&amp;gt;Stdlib&amp;lt;/font&amp;gt; для вызова &amp;lt;font color=darkred&amp;gt;system()&amp;lt;/font&amp;gt;. Класс &amp;lt;font color=darkred&amp;gt;Stdlib&amp;lt;/font&amp;gt; содержит, в основном, статические методы, то есть вам не нужно создавать объект &amp;lt;font color=darkred&amp;gt;Stdlib&amp;lt;/font&amp;gt; для вызова этих методов. Метод &amp;lt;font color=darkred&amp;gt;system()&amp;lt;/font&amp;gt; (следите за регистром &amp;lt;font color=darkred&amp;gt;s&amp;lt;/font&amp;gt; – он нижний: сейчас мы в стране С!) исполняет любую команду на локальной машине, словно он был введен в командной строке. Для нашего примера это означает запуск ls, поэтому программа выведет список каталогов, как если бы вы сами запустили «ls».&lt;br /&gt;
&lt;br /&gt;
После ввода &amp;lt;font color=darkred&amp;gt;Stdlib.system()&amp;lt;/font&amp;gt;, MonoDevelop должна вывести информацию о параметрах метода &amp;lt;font color=darkred&amp;gt;system()&amp;lt;/font&amp;gt;, и вы увидите, что он принимает строки C#. В этом месте разработчики Mono адаптировали библиотеку вызовов C для лучшей совместимости с программированием .NET – обычно, в терминах С, &amp;lt;font color=darkred&amp;gt;system()&amp;lt;/font&amp;gt; получает &amp;lt;font color=darkred&amp;gt;const char*&amp;lt;/font&amp;gt;, так что использование строк более изящно!&lt;br /&gt;
&lt;br /&gt;
Этот переход существует лишь в некоторых методах. Например, &amp;lt;font color=darkred&amp;gt;printf()&amp;lt;/font&amp;gt; также дружественен к .NET, поэтому вы можете писать код вроде этого:&lt;br /&gt;
&lt;br /&gt;
 Stdlib.printf(“Hello, %s!\n”, “world”);&lt;br /&gt;
 Stdlib.printf(string.Format(“Hello, {0}!\n”, “world”));&lt;br /&gt;
&lt;br /&gt;
С другой стороны, методы &amp;lt;font color=darkred&amp;gt;fopen()&amp;lt;/font&amp;gt;, &amp;lt;font color=darkred&amp;gt;fwrite()&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;fclose()&amp;lt;/font&amp;gt; для работы с файлами требуют указателей. В C# указатели известны как &amp;lt;font color=darkred&amp;gt;IntPtr&amp;lt;/font&amp;gt;, потому что это представление указателя в целочисленном типе данных. Эти &amp;lt;font color=darkred&amp;gt;IntPtr&amp;lt;/font&amp;gt;’ы могут восприниматься как данные с неизвестной структурой: их нельзя прочесть без использования специфичных для этих данных методов. Например, файлы открываются так:&lt;br /&gt;
&lt;br /&gt;
 IntPtr foo = Stdlib.fopen(“file.txt”, “w”);&lt;br /&gt;
&lt;br /&gt;
Но вы не можете читать или записывать с этого файлового дескриптора без других методов &amp;lt;font color=darkred&amp;gt;Stdlib. foo IntPtr&amp;lt;/font&amp;gt; – всего лишь дескриптор данных, и сам по себе бесполезен. На самом деле, это даже небезопасно: любая память, присвоенная указателю, недоступна сборщику мусора Mono, и необходимо освобождать ее вручную, не то образуется утечка [memory leak]. Вы можете выполнить запись в этот файл, затем закрыть его так:&lt;br /&gt;
&lt;br /&gt;
 Stdlib.fwrite(Encoding.ASCII.GetBytes(“Hello, world!”), foo);&lt;br /&gt;
 Stdlib.fclose(foo);&lt;br /&gt;
&lt;br /&gt;
===Развернем обертки===&lt;br /&gt;
&lt;br /&gt;
Как указывалось ранее, Mono предоставляет набор упрощенных оберток для базовых структур данных и системных вызовов Unix. Например,&lt;br /&gt;
любую информацию о пользователе можно прочесть, создав объект UnixUserInfo таким образом:&lt;br /&gt;
&lt;br /&gt;
 UnixUserInfo user = new UnixUserInfo(“paul”);&lt;br /&gt;
 Console.WriteLine(user.HomeDirectory);&lt;br /&gt;
&lt;br /&gt;
Класс &amp;lt;font color=darkred&amp;gt;UnixUserInfo&amp;lt;/font&amp;gt; читает информацию из '''/etc/passwd''', и вы можете увидеть имя пользователя, информацию о группах, их командных оболочках и так далее. Подобные структуры существуют и для файловых систем – следующая строка кода выудит информацию о вашем корневом каталоге:&lt;br /&gt;
&lt;br /&gt;
 UnixDriveInfo drive = new UnixDriveInfo(“/”);&lt;br /&gt;
&lt;br /&gt;
Затем вы можете узнать объем свободного пространства на диске, прочитав &amp;lt;font color=darkred&amp;gt;drive.AvailableFreeSpace&amp;lt;/font&amp;gt;. Это число возвращается в байтах, поэтому вы можете пожелать удобства ради преобразовать его в гигабайты:&lt;br /&gt;
&lt;br /&gt;
 Console.WriteLine(drive.AvailableFreeSpace / 1024 / 1024 / 1024.0);&lt;br /&gt;
&lt;br /&gt;
Последнее &amp;lt;font color=darkred&amp;gt;1024&amp;lt;/font&amp;gt; записано как &amp;lt;font color=darkred&amp;gt;1024.0&amp;lt;/font&amp;gt;, потому что это заставит Mono преобразовать конечный результат в число с плавающей точкой, а не в целое – в противном случае результат не будет точным!&lt;br /&gt;
&lt;br /&gt;
Иногда эти обертки имеют собственные методы, как в случае с &amp;lt;font color=darkred&amp;gt;UnixFileInfo&amp;lt;/font&amp;gt; – она читает информацию о конкретных файлах, предоставляя вам такие методы, как &amp;lt;font color=darkred&amp;gt;CanAccess()&amp;lt;/font&amp;gt;, но, что более важно, позволяет создавать символьные ссылки на файл путем вызова функции &amp;lt;font color=darkred&amp;gt;CreateSymbolicLink()&amp;lt;/font&amp;gt;, примерно так:&lt;br /&gt;
 &lt;br /&gt;
 UnixFileInfo file = new UnixFileInfo(“file.txt”);&lt;br /&gt;
 file.CreateSymbolicLink(“filesym.txt”&lt;br /&gt;
&lt;br /&gt;
создаст ссылку '''filesym.txt''' на '''file.txt''', как если бы вы выполнили ''ln -s file.txt filesym.txt'' в командной строке.&lt;br /&gt;
&lt;br /&gt;
===Звенит сигнал тревоги===&lt;br /&gt;
&lt;br /&gt;
Последний метод, который я хочу показать – &amp;lt;font color=darkred&amp;gt;signal()&amp;lt;/font&amp;gt;, он просто показывает, насколько хорошо интегрированы Mono и библиотека C: вы можете попросить Linux вызвать метод C# при поступлении любого сигнала. «Сигнал» в стране C – это то, что происходит, когда ОС пытается по каким-то причинам прервать программу. Например, нажатие Ctrl+C посылает программе &amp;lt;font color=darkred&amp;gt;SIGINT&amp;lt;/font&amp;gt;, что обычно приводит к выходу. А если вы не хотите, чтобы программа завершалась? Что ж, тогда потрудитесь сообщить C#, как поступать при получении &amp;lt;font color=darkred&amp;gt;SIGINT&amp;lt;/font&amp;gt;, и это делается при помощи метода &amp;lt;font color=darkred&amp;gt;signal()&amp;lt;/font&amp;gt;. Он принимает два параметра: сигнал, который вы хотите перехватить, и имя функции, вызываемой при получении сигнала.&lt;br /&gt;
&lt;br /&gt;
Говоря о &amp;lt;font color=darkred&amp;gt;SIGINT&amp;lt;/font&amp;gt; – вот код, который необходимо ввести в программе, чтобы она не отвечала на &amp;lt;font color=darkblue&amp;gt;Ctrl+C&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 Stdlib.signal(Mono.Unix.Native.Signum.SIGINT, HandleSigInt);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=darkred&amp;gt;HandleSigInt&amp;lt;/font&amp;gt; – новый метод, который необходимо создать за пределами &amp;lt;font color=darkred&amp;gt;Main()&amp;lt;/font&amp;gt;. Вот пример:&lt;br /&gt;
&lt;br /&gt;
 public static void HandleSigInt(int sig) {&lt;br /&gt;
    Console.WriteLine(“А я против!\n”);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Теперь при нажатии &amp;lt;font color=darkblue&amp;gt;Ctrl+C&amp;lt;/font&amp;gt; пользователь получит сообщение-отказ; но это не остановит сигнал &amp;lt;font color=darkred&amp;gt;SIGKILL&amp;lt;/font&amp;gt; (посылаемый, когда кто-то выполняет &amp;lt;font color=darkred&amp;gt;kill -9 &amp;lt;ваш pid&amp;gt;&amp;lt;/font&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Конечно, вы не сможете протестировать обработку вашей программой сигналов прерывания, пока не заставите ее работать бесконечно:&lt;br /&gt;
&lt;br /&gt;
 System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);&lt;br /&gt;
&lt;br /&gt;
На этом наш блиц-тур по интеграции Mono и Unix закончен. Пожалуйста, не забывайте о потенциальных проблемах: утечки памяти – особенно в длительно работающих программах – могут вызвать серьезные осложнения, а привычка работы с Mono способствует небрежному обращению с памятью. Применение родных функций Unix делает миграцию с C на C# быстрой и простой, но в долгосрочной перспективе лучше начать вытеснять функции C-эквивалентами, родными для .NET...&lt;br /&gt;
&lt;br /&gt;
==Врезки==&lt;br /&gt;
&lt;br /&gt;
===Скорая помощь===&lt;br /&gt;
&lt;br /&gt;
*Не пытайтесь проигнорировать сигнал &amp;lt;font color=darkred&amp;gt;SIGKILL&amp;lt;/font&amp;gt; – все равно не удастся: в противном случае некоторые программы никогда не завершались бы!&lt;br /&gt;
&lt;br /&gt;
*Используя &amp;lt;font color=darkred&amp;gt;system()&amp;lt;/font&amp;gt; и аргументы, переданные вашей функции, вы можете за минуты сколотить быструю оболочку. Начните с пересылки всего переданного в &amp;lt;font color=darkred&amp;gt;system()&amp;lt;/font&amp;gt; и продвигайтесь далее, обрабатывая аргументы и по желанию добавляя собственную функциональность.&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%9D%D0%B5%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%B8%D0%B5_%D0%B0%D0%B2%D0%B8%D0%B0%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B</id>
		<title>Недорогие авиабилеты</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%9D%D0%B5%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%B8%D0%B5_%D0%B0%D0%B2%D0%B8%D0%B0%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B"/>
				<updated>2008-03-20T19:04:02Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Диагностика: проблемы с сетью==&lt;br /&gt;
&lt;br /&gt;
''Если сеть у вас захворала, зовите Доктора! Правда, домашних визитов к читателям '''д-р Крис Браун''' не делает, но готов поделиться диагнозом…''&lt;br /&gt;
&lt;br /&gt;
За годы жизни я помог многим друзьям и знакомым освоиться&lt;br /&gt;
с компьютером, и в подходящих случаях обучал их Linux. При этом, естественно, возникает нечто вроде родительской ответственности за развитие и взросление своих питомцев. Последний случай был типичным. Друг позвонил мне со словами: «У меня не работает сеть». Такое сообщение об ошибке не уступает классической фразе с борта Аполлона-13 «Хьюстон, у нас проблема», хотя и менее опасно для жизни. К счастью, в Linux много сетевых утилит, которые помогают выяснить, что именно не работает. (Чтобы не томить вас ожиданием развязки, сразу скажу, что моего друга просто отключил провайдер,&lt;br /&gt;
потому что он забыл продлить контракт.)&lt;br /&gt;
&lt;br /&gt;
Итак, следуйте за мной: рассмотрим некоторые средства диагностики сетевых неисправностей в Linux и посмотрим, как с их помощью&lt;br /&gt;
получить ответ на вопрос «Что не так в моей сети?»&lt;br /&gt;
&lt;br /&gt;
При любом поиске неисправностей прежде всего нужно понять и представить, в чем выражается правильная работа. Есть ли у компьютера статический IP-адрес, и если да, то какой? Пользуетесь ли вы DHCP, и если да, то каков адрес DHCP-сервера и выделяемый диапазон IP-адресов? Подключен ли широкополосный модем непосредственно к вашему компьютеру или у вас широкополосный маршрутизатор через Ethernet или беспроводную сеть?&lt;br /&gt;
&lt;br /&gt;
На данном уроке мы будем использовать методику «снизу вверх»: начнем с самых низких уровней и постепенно переедем на более высокие. Это хороший систематический подход для случая, если сеть не работала никогда. С другой стороны, если вчера сеть работала отлично, чаще будет быстрее начать сверху и двигаться вниз.&lt;br /&gt;
&lt;br /&gt;
===Находит ли Linux сетевую карту?===&lt;br /&gt;
&lt;br /&gt;
Первый вопрос на этом этапе – видит ли Linux сетевые интерфейсы?&lt;br /&gt;
Вы сможете ответить на него, просмотрев системные сообщения ядра,&lt;br /&gt;
которые выдавались во время загрузки. Для этого используется команда &amp;lt;fotn color=darkred&amp;gt;dmesg&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # dmesg | grep eth&lt;br /&gt;
 e1000: eth0: e1000_probe: Intel(R) PRO/1000 Network Connection&lt;br /&gt;
 e1000: eth1: e1000_probe: Intel(R) PRO/1000 Network Connection&lt;br /&gt;
 e1000: eth0: e1000_watchdog: NIC Link is Up 10 Mbps Half Duplex&lt;br /&gt;
&lt;br /&gt;
В качестве альтернативы попробуйте вывести список устройств на шине с помощью команды &amp;lt;fotn color=darkred&amp;gt;lspci&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # lspci | grep Ethernet&lt;br /&gt;
 01:01.0 Ethernet controller: Intel Corporation 82547EI&lt;br /&gt;
 02:01.0 Ethernet controller: Intel Corporation 82540EM&lt;br /&gt;
&lt;br /&gt;
Сообщения об ошибках на этой стадии говорят о неисправном или несовместимом оборудовании.&lt;br /&gt;
&lt;br /&gt;
===Задан ли IP-адрес?===&lt;br /&gt;
&lt;br /&gt;
Если сетевая карта на месте, то следующий вопрос – задан ли IP-адрес? Простейшая команда для этого случая – &amp;lt;fotn color=darkred&amp;gt;ifconfig&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # ifconfig eth0&lt;br /&gt;
 eth0 Link encap:Ethernet HWaddr 00:0C:F1:96:A3:F7&lt;br /&gt;
 inet addr:192.168.0.3 Bcast:192.168.0.255 Mask:255.255.255.0&lt;br /&gt;
 inet6 addr: fe80::20c:f1ff:fe96:a3f7/64 Scope:Link&lt;br /&gt;
 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1&lt;br /&gt;
 RX packets:306 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
 TX packets:261 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
 collisions:8 txqueuelen:10&lt;br /&gt;
 RX bytes:43074 (42.0 KiB) TX bytes:34480 (33.6 KiB)&lt;br /&gt;
 Base address:0xac00 Memory:ff7e0000-ff800000&lt;br /&gt;
&lt;br /&gt;
Здесь важна вторая строка, в которой можно увидеть IP-адрес: &amp;lt;fotn color=darkred&amp;gt;192.168.0.3&amp;lt;/font&amp;gt;. Если такой строки нет, то IP-адрес не задан. А если все же задан, подумайте, действителен ли он в вашей сети.&lt;br /&gt;
&lt;br /&gt;
На практике я несколько раз сталкивался с ситуацией, когда сеть переставала работать после того, как в нее ввели компьютер, случайно&lt;br /&gt;
оказавшийся DHCP-сервером, настроенным на диапазон адресов, не соответствующих этой сети. При перезагрузке компьютер с шансами&lt;br /&gt;
50/50 получал или действительный IP-адрес от «настоящего» DHCP-сервера, или ложный адрес от самозванца.&lt;br /&gt;
&lt;br /&gt;
Если в сетевом интерфейсе не задан IP-адрес, то проверьте, настроен ли автоматический запуск этого интерфейса при загрузке системы. Если да, то использует ли он DHCP или статический IP-адрес? Конкретные имена файлов, которые нужно просмотреть, зависят от дистрибутива. В Fedora и Red Hat это '''/etc/sysconfig/network-scripts/ifcfg-eth*''', в SUSE – '''/etc/sysconfig/network/ifcfg-eth*''', а в Ubuntu – '''/etc/network/interfaces'''. (Стандарты – отличная штука: ну не прелестны ли эти ничем не объяснимые расхождения?) Конечно, в каждом из дистрибутивов есть графические утилиты, с помощью которых можно посмотреть и отредактировать настройки.&lt;br /&gt;
&lt;br /&gt;
Обычно инициализация интерфейса упрятана глубоко в загрузочные скрипты, и взаимодействие с сервером DHCP разглядеть трудно; но его можно увидеть, непосредственно запустив скрипт ifup или dhclient. Эта программа поддерживает диалог с DHCP-сервером и позволяет задать параметры сети:&lt;br /&gt;
&lt;br /&gt;
 # dhclient&lt;br /&gt;
 Internet Systems Consortium DHCP Client V3.0.5-RedHatо&lt;br /&gt;
 Copyright 2004-2006 Internet Systems Consortium.&lt;br /&gt;
 All rights reserved.&lt;br /&gt;
 For info, please visit http://www.isc.org/sw/dhcp/&lt;br /&gt;
 Listening on LPF/eth1/00:0e:0c:01:d3:a0&lt;br /&gt;
 Sending on LPF/eth1/00:0e:0c:01:d3:a0&lt;br /&gt;
 Listening on LPF/eth0/00:0c:f1:96:a3:f7&lt;br /&gt;
 Sending on LPF/eth0/00:0c:f1:96:a3:f7&lt;br /&gt;
 Sending on Socket/fallback&lt;br /&gt;
 DHCPDISCOVER on eth1 to 255.255.255.255 port 67 interval 7&lt;br /&gt;
 DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 4&lt;br /&gt;
 DHCPOFFER from 192.168.0.1&lt;br /&gt;
 DHCPREQUEST on eth0 to 255.255.255.255 port 67&lt;br /&gt;
 DHCPACK from 192.168.0.1&lt;br /&gt;
 bound to 192.168.0.3 -- renewal in 125868 seconds.&lt;br /&gt;
&lt;br /&gt;
В данной системе два интерфейса, '''eth0''' и '''eth1'''. Мы видим, что IP-адрес интерфейса '''eth0''' получен от DHCP-сервера 192.168.0.1. Интерфейс '''eth1''' пытался сделать то же самое (он передал команду &amp;lt;fotn color=darkred&amp;gt;DHCPDISCOVER&amp;lt;/font&amp;gt;), но не получил ответа. И неудивительно: этот интерфейс не был ни к чему подключен.&lt;br /&gt;
&lt;br /&gt;
===Пингуется ли маршрутизатор?===&lt;br /&gt;
&lt;br /&gt;
Если IP-адрес задан корректно, пропингуйте (&amp;lt;fotn color=darkred&amp;gt;ping&amp;lt;/font&amp;gt;) другой компьютер в сети. В случае удачи результат будет примерно таким:&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 192.168.0.6&lt;br /&gt;
 PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 192.168.0.6: icmp_seq=1 ttl=64 time=0.468 ms&lt;br /&gt;
 --- 192.168.0.6 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 0.468/0.468/0.468/0.000 ms&lt;br /&gt;
&lt;br /&gt;
а неудачи – таким:&lt;br /&gt;
&lt;br /&gt;
 # ping -c 1 192.168.0.2&lt;br /&gt;
 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.&lt;br /&gt;
 From 192.168.0.3 icmp_seq=1 Destination Host Unreachable&lt;br /&gt;
 --- 192.168.0.2 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms&lt;br /&gt;
&lt;br /&gt;
Сообщение &amp;lt;fotn color=darkred&amp;gt;«Узел недоступен»&amp;lt;/font&amp;gt; (&amp;lt;fotn color=darkred&amp;gt;Destination Host Unreachable&amp;lt;/font&amp;gt;) обычно значит, что целевой компьютер (здесь – 192.168.0.2) не подключен к сети или не работает и поэтому не может ответить на ARP-запрос MAC-адреса с моего компьютера. Это также может означать, что ваш компьютер не находит маршрут доступа к локальной сети; чаще всего это бывает, когда ваш IP-адрес не входит в данную сеть. Возможны и более сложные проблемы с маршрутизацией – впрочем, в домашней сети, где маршрут (по умолчанию) только один, это маловероятно. Если в вашей сети нет других компьютеров, можно попробовать пропинговать маршрутизатор (Вы ведь знаете адрес своего маршрутизатора?).&lt;br /&gt;
&lt;br /&gt;
Если не получилось, то проблема носит местный характер. Если сеть проводная, проверьте кабели. Зеленые светодиоды на сетевых карточках должны гореть &amp;lt;fotn color=darkblue&amp;gt;[некоторые сетевые карты имеют другой способ индикации подключения. В случае необходимости изучите инструкцию, – ''прим.ред.'']&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Не блокирован ли трафик брандмауэром?===&lt;br /&gt;
&lt;br /&gt;
На некотором этапе нашего диагностирования полезно проверить, не чересчур ли «закручивает гайки» ваш брандмауэр. Самый быстрый&lt;br /&gt;
и грубый способ это узнать – и его предпочитают многие системные администраторы, если надо торопиться – удалить все правила брандмауэра командой&lt;br /&gt;
&lt;br /&gt;
 # iptables -F&lt;br /&gt;
&lt;br /&gt;
и посмотреть, изменится ли что-нибудь к лучшему. Если проблема исчезнет, то по крайней мере ясно, что ее причиной был брандмауэр.&lt;br /&gt;
Далее вам нужно перезагрузить компьютер (чтобы брандмауэр вновь заработал) и думать дальше. Не соблазняйтесь идеей оставить брандмауэр в отключке: это Плохая Идея!&lt;br /&gt;
&lt;br /&gt;
===5 Установлено ли ADSL-соединение ?===&lt;br /&gt;
&lt;br /&gt;
Если с самим маршрутизатором все в порядке, пора расширить охват. На маршрутизаторе должно быть еще несколько зеленых светодиодов (а если найти инструкцию к нему, то можно даже понять, что они означают), и по ним можно определить, подключен ли ADSL-модем маршрутизатора к провайдеру. У некоторых маршрутизаторов также есть возможность задать настройки и определить статус соединения с помощью web-приложения. Нас интересуют статус соединения (Connection Status) и IP-адрес, который провайдер назначил внешнему соединению. (Что это за адрес, не столь важно; главное, чтоб он был!) Разорвите соединение и заново установите его вручную, и попробуйте понять, на каком этапе возникает ошибка. Если соединения не добиться, нужно проверить провод, соединяющий маршрутизатор с телефонной линией (полезно подключить телефонную трубку, чтобы убедиться в наличии зуммера). Если провод в порядке, остается позвонить в службу поддержки провайдера. Приготовьте себе чашку кофе и вооружитесь интересной книжкой – ждать своей очереди на линии можно очень долго!&lt;br /&gt;
&lt;br /&gt;
===Пингуется ли удаленный сервер?===&lt;br /&gt;
&lt;br /&gt;
Если соединение с провайдером хорошее, тестированию пора подняться на уровень выше. Попробуйте пропинговать внешний компьютер с известным IP-адресом. Например, web-сервер Linux Format UK имеет адрес 89.167.142.11. (Конечно, он вполне может измениться, когда вы будете это читать, но пока для примера сгодится.)&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 89.167.142.11&lt;br /&gt;
 PING 89.167.142.11 (89.167.142.11) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 89.167.142.11: icmp_seq=1 ttl=56 time=24.3 ms&lt;br /&gt;
 --- 89.167.142.11 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 24.367/24.367/24.367/0.000 ms&lt;br /&gt;
&lt;br /&gt;
Если это работает, ваше сетевое соединение в порядке. В качестве последнего теста попробуйте добраться до удаленного компьютера по&lt;br /&gt;
его имени:&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 www.linuxformat.com&lt;br /&gt;
 PING www.linuxformat.com (89.167.142.11) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from kryten.future.net.uk (89.167.142.11): icmp_seq=1&lt;br /&gt;
 ttl=56 time=24.2 ms&lt;br /&gt;
 --- www.linuxformat.com ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 24.249/24.249/24.249/0.000 ms&lt;br /&gt;
&lt;br /&gt;
С помощью этого теста ошибки DNS сразу же выявляются, например:&lt;br /&gt;
&lt;br /&gt;
 $ ping www.prophylactic.gov&lt;br /&gt;
 ping: unknown host www.prophylactic.gov&lt;br /&gt;
&lt;br /&gt;
Если удаленный компьютер пингуется только по IP-адресу, но не по имени, пора изучать настройки вашего сервера DNS (LXF97). Для этого лучше всего подходит утилита ''dig''. Вот пример ее запуска (успешного). Не пугайтесь обилием подробностей; нужно лишь обратить внимание на запись &amp;lt;fotn color=darkred&amp;gt;A&amp;lt;/font&amp;gt; в разделе &amp;lt;fotn color=darkred&amp;gt;ANSWER&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # dig www.linuxformat.com&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.linuxformat.com&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 23236&lt;br /&gt;
 ;; flags: qr rd ra; QUERY:1, ANSWER:2, AUTHORITY:2,&lt;br /&gt;
 ADDITIONAL:2&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;www.linuxformat.com. IN A&lt;br /&gt;
 ;; ANSWER SECTION:&lt;br /&gt;
 www.linuxformat.com. 300 IN CNAME redirect1.future.net.uk.&lt;br /&gt;
 redirect1.future.net.uk. 300 IN A 89.167.142.11&lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 future.net.uk. 245 IN NS ns0.future.net.uk.&lt;br /&gt;
 future.net.uk. 245 IN NS ns1.future.net.uk.&lt;br /&gt;
 ;; ADDITIONAL SECTION:&lt;br /&gt;
 ns0.future.net.uk. 33231 IN A 89.167.142.1&lt;br /&gt;
 ns1.future.net.uk. 33231 IN A 89.167.143.1&lt;br /&gt;
 ;; Query time: 41 msec&lt;br /&gt;
 ;; SERVER: 192.168.0.1#53(192.168.0.1)&lt;br /&gt;
 ;; WHEN: Fri Jul 6 15:21:44 2007&lt;br /&gt;
 ;; MSG SIZE rcvd: 158&lt;br /&gt;
&lt;br /&gt;
Если DNS не работает, вариантов может быть несколько.&lt;br /&gt;
&lt;br /&gt;
В первом случае сервер DNS не может найти компьютер, к которому вы обращаетесь. Вот пример обращения к серверу, которого просто&lt;br /&gt;
не существует:&lt;br /&gt;
&lt;br /&gt;
 # dig prophylactic.gov&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; prophylactic.gov&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NXDOMAIN, id: 13168&lt;br /&gt;
 ;; flags: qr rd ra; QUERY:1, ANSWER:0, AUTHORITY:1,&lt;br /&gt;
 ADDITIONAL:0&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;prophylactic.gov. IN A&lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 gov. 2560 IN SOA a.gov.zoneedit.com. govcontact.&lt;br /&gt;
 zoneedit.com. 1183644065 3600 900 1814400 86400&lt;br /&gt;
&lt;br /&gt;
Обратите внимание на статус запроса &amp;lt;fotn color=darkred&amp;gt;NXDOMAIN&amp;lt;/font&amp;gt; и отсутствие раздела &amp;lt;fotn color=darkred&amp;gt;ANSWER&amp;lt;/font&amp;gt;, который мы видели в результатах предыдущего запроса. Если вы ввели корректное имя компьютера, то такая ошибка – следствие чьих-то чужих проблем.&lt;br /&gt;
&lt;br /&gt;
===Можете ли вы найти свой DNS-сервер?===&lt;br /&gt;
&lt;br /&gt;
Вторая причина отказа DNS – ваш компьютер не может найти DNS-сервер. Тогда источник проблемы, вероятно, ближе к дому.&lt;br /&gt;
&lt;br /&gt;
 # dig www.linuxformat.co.uk&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.linuxformat.co.uk&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; connection timed out; no servers could be reached&lt;br /&gt;
&lt;br /&gt;
Если это произошло, загляните в файл '''/etc/resolv.conf'''. В нем Linux хранит сведения о местонахождении DNS-серверов. Если вы пользуетесь DHCP, IP-адреса DNS-серверов предоставляются сервером DHCP. Если IP-адрес статический, вы, наверно, использовали графическую утилиту настройки для определения параметров серверов DNS (например, ''system-config-network'' в Fedora). В любом случае результаты записываются в этот файл. Есть ли в нем корректный адрес сервера имен? Можете ли вы пинговать его?&lt;br /&gt;
&lt;br /&gt;
Если ничто не помогает, попробуйте просмотреть сетевой трафик с помощью ''wireshark'', утилиты отслеживания пакетов, ранее известной как ethereal. Как средство диагностики ''wireshark'', на мой взгляд, «последняя надежда». Дело не в недоработке этой программы: программа-то отличная, но чтобы искать неполадки в сети путем изучения трафика на уровне пакетов, нужно очень хорошо знать TCP/IP и прикладные протоколы верхних уровней. Вам также может потребоваться дополнительный компьютер в сети для наблюдения за трафиком.&lt;br /&gt;
&lt;br /&gt;
Выполните команду&lt;br /&gt;
&lt;br /&gt;
 # ping 192.168.0.42&lt;br /&gt;
&lt;br /&gt;
на компьютере с IP-адресом 192.168.0.3. Посмотрите на верхнюю из трех панелей wireshark; в ней каждому перехваченному пакету соответствует одна строка. Средняя и нижняя панели позволяют разобраться в содержимом отдельных пакетов, но сейчас они нам не нужны.&lt;br /&gt;
Сообщение простое и ясное: компьютер с адресом 192.168.0.3 пытается использовать ARP для получения MAC-адреса компьютера, до которого хочет достучаться. Он пытался сделать это три раза с интервалом в одну секунду, но не получил ответа.&lt;br /&gt;
&lt;br /&gt;
Итак, мы можем сделать вывод, что с компьютером, адрес которого 192.168.0.3, все в порядке – он может получать пакеты от компьютеров сети с корректными IP-адресами, но компьютера с адресом 192.168.0.42 там просто нет.&lt;br /&gt;
&lt;br /&gt;
==Смотрим дальше==&lt;br /&gt;
&lt;br /&gt;
Вот другой пример. На клиентском компьютере установлен SUSE Linux 10.1. Проблема была в том, что каждый раз, когда браузер ''Konqueror''&lt;br /&gt;
пытался соединиться с внешним сайтом (т.е. производил поиск DNS-сервера), перед установкой соединения возникала 15-секундная задержка. Пакет 1 реализует стандартный запрос DNS для адреса [http://www.linuxformat.co.uk www.linuxformat.co.uk], а пакет 3 – ответ на этот запрос, который приходит через 0.04 с от сервера DNS, встроенного в мой маршрутизатор (192.168.0.1) с требуемым IP-адресом. Чудесно. Проблема в том, что ''Konqueror'' также решил запросить IPv6-адрес для этого сайта (запрос записи &amp;lt;font color=darkred&amp;gt;AAAA&amp;lt;/font&amp;gt; в пакете 2). Слава богу, маршрутизатор игнорирует этот запрос, и через пять секунд ''Konqueror'' перенаправляет этот запрос к маршрутизатору (пакет 7) и ко внешнему серверу DNS (пакет 6). Маршрутизатор все еще не отвечает, зато отвечает внешний DNS-сервер (пакет 8): сообщает, что не может найти записи &amp;lt;font color=darkred&amp;gt;AAAA&amp;lt;/font&amp;gt; для сайта [http://linux.format.co.uk linux.format.co.uk]. Ну, теперь помаленьку проясняется...&lt;br /&gt;
&lt;br /&gt;
DNS-ресолвер приписывает доменное имя по умолчанию &amp;lt;font color=blue&amp;gt;example.com&amp;lt;/font&amp;gt; к адресу, который он пытается преобразовать (в результате получаем бессмыслицу [http://www.linuxformat.co.uk.example.com www.linuxformat.co.uk.example.com]) и начинает поиск записей &amp;lt;font color=darkred&amp;gt;AAAA&amp;lt;/font&amp;gt; для этого адреса. Он тратит еще пять секунд, надеясь получить ответ от маршрутизатора, после чего еще раз пытается обратиться к внешнему серверу DNS (пакет 10). В конце концов занавес над этой печальной историей опускается, и через пятнадцать секунд после начала ''Konqueror'' создает соединение TCP/IP (пакеты с 17-го и далее), используя старый добрый адрес IPv4, с которого и начал.&lt;br /&gt;
&lt;br /&gt;
Оказалось, что это известная проблема, как свидетельствуют и результаты поиска Google по фразе ''“Konqueror IPv6”''. Решение простое: отключите стек протоколов IPv6 в ядре, отредактировав файл '''/etc/modprobe.conf''', и перезагрузите систему. Это хороший пример использования отслеживания пакетов для отладки, потому что другим способом решить эту проблему трудно. Не нужно проводить детальный анализ перехваченных пакетов, достаточно просто понять, что компьютер пытается разрешить имя в IPv6.&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;
его? Или они до сих пор “&amp;lt;font color=darkred&amp;gt;admin&amp;lt;/font&amp;gt;” и “&amp;lt;font color=darkred&amp;gt;admin&amp;lt;/font&amp;gt;”? Если так, то знайте, что многие атаки основаны на знании реквизитов, используемых по умолчанию. Не пожалейте пары минут и задайте более сильный пароль… &amp;lt;font color=darkred&amp;gt;'''ПРЯМО СЕЙЧАС!'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*При выполнении диагностических тестов многое можно понять по времени отклика. Если его приходится ждать 15 секунд и более, то скорее всего вы&lt;br /&gt;
пытаетесь соединиться с компьютером, которого там просто нет. Если сообщение об ошибке появляется в течение пяти секунд, то есть вероятность, что&lt;br /&gt;
вы подключились к серверу, который по тем или иным причинам отклонил ваш запрос.&lt;br /&gt;
&lt;br /&gt;
*Помните, что системы периодически выходят из строя или временно отключаются для технического обслуживания. Если вы считаете, что проблема находится за&lt;br /&gt;
рамками вашей системы, может быть, стоит переждать час-другой и попробовать еще раз.&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%9D%D0%B5%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%B8%D0%B5_%D0%B0%D0%B2%D0%B8%D0%B0%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B</id>
		<title>Недорогие авиабилеты</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%9D%D0%B5%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%B8%D0%B5_%D0%B0%D0%B2%D0%B8%D0%B0%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B"/>
				<updated>2008-03-20T19:00:17Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: /* Смотрим дальше */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Диагностика: проблемы с сетью==&lt;br /&gt;
&lt;br /&gt;
''Если сеть у вас захворала, зовите Доктора! Правда, домашних визитов к читателям '''д-р Крис Браун''' не делает, но готов поделиться диагнозом…''&lt;br /&gt;
&lt;br /&gt;
За годы жизни я помог многим друзьям и знакомым освоиться&lt;br /&gt;
с компьютером, и в подходящих случаях обучал их Linux. При этом, естественно, возникает нечто вроде родительской ответственности за развитие и взросление своих питомцев. Последний случай был типичным. Друг позвонил мне со словами: «У меня не работает сеть». Такое сообщение об ошибке не уступает классической фразе с борта Аполлона-13 «Хьюстон, у нас проблема», хотя и менее опасно для жизни. К счастью, в Linux много сетевых утилит, которые помогают выяснить, что именно не работает. (Чтобы не томить вас ожиданием развязки, сразу скажу, что моего друга просто отключил провайдер,&lt;br /&gt;
потому что он забыл продлить контракт.)&lt;br /&gt;
&lt;br /&gt;
Итак, следуйте за мной: рассмотрим некоторые средства диагностики сетевых неисправностей в Linux и посмотрим, как с их помощью&lt;br /&gt;
получить ответ на вопрос «Что не так в моей сети?»&lt;br /&gt;
&lt;br /&gt;
При любом поиске неисправностей прежде всего нужно понять и представить, в чем выражается правильная работа. Есть ли у компьютера статический IP-адрес, и если да, то какой? Пользуетесь ли вы DHCP, и если да, то каков адрес DHCP-сервера и выделяемый диапазон IP-адресов? Подключен ли широкополосный модем непосредственно к вашему компьютеру или у вас широкополосный маршрутизатор через Ethernet или беспроводную сеть?&lt;br /&gt;
&lt;br /&gt;
На данном уроке мы будем использовать методику «снизу вверх»: начнем с самых низких уровней и постепенно переедем на более высокие. Это хороший систематический подход для случая, если сеть не работала никогда. С другой стороны, если вчера сеть работала отлично, чаще будет быстрее начать сверху и двигаться вниз.&lt;br /&gt;
&lt;br /&gt;
===Находит ли Linux сетевую карту?===&lt;br /&gt;
&lt;br /&gt;
Первый вопрос на этом этапе – видит ли Linux сетевые интерфейсы?&lt;br /&gt;
Вы сможете ответить на него, просмотрев системные сообщения ядра,&lt;br /&gt;
которые выдавались во время загрузки. Для этого используется команда &amp;lt;fotn color=darkred&amp;gt;dmesg&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # dmesg | grep eth&lt;br /&gt;
 e1000: eth0: e1000_probe: Intel(R) PRO/1000 Network Connection&lt;br /&gt;
 e1000: eth1: e1000_probe: Intel(R) PRO/1000 Network Connection&lt;br /&gt;
 e1000: eth0: e1000_watchdog: NIC Link is Up 10 Mbps Half Duplex&lt;br /&gt;
&lt;br /&gt;
В качестве альтернативы попробуйте вывести список устройств на шине с помощью команды &amp;lt;fotn color=darkred&amp;gt;lspci&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # lspci | grep Ethernet&lt;br /&gt;
 01:01.0 Ethernet controller: Intel Corporation 82547EI&lt;br /&gt;
 02:01.0 Ethernet controller: Intel Corporation 82540EM&lt;br /&gt;
&lt;br /&gt;
Сообщения об ошибках на этой стадии говорят о неисправном или несовместимом оборудовании.&lt;br /&gt;
&lt;br /&gt;
===Задан ли IP-адрес?===&lt;br /&gt;
&lt;br /&gt;
Если сетевая карта на месте, то следующий вопрос – задан ли IP-адрес? Простейшая команда для этого случая – &amp;lt;fotn color=darkred&amp;gt;ifconfig&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # ifconfig eth0&lt;br /&gt;
 eth0 Link encap:Ethernet HWaddr 00:0C:F1:96:A3:F7&lt;br /&gt;
 inet addr:192.168.0.3 Bcast:192.168.0.255 Mask:255.255.255.0&lt;br /&gt;
 inet6 addr: fe80::20c:f1ff:fe96:a3f7/64 Scope:Link&lt;br /&gt;
 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1&lt;br /&gt;
 RX packets:306 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
 TX packets:261 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
 collisions:8 txqueuelen:10&lt;br /&gt;
 RX bytes:43074 (42.0 KiB) TX bytes:34480 (33.6 KiB)&lt;br /&gt;
 Base address:0xac00 Memory:ff7e0000-ff800000&lt;br /&gt;
&lt;br /&gt;
Здесь важна вторая строка, в которой можно увидеть IP-адрес: &amp;lt;fotn color=darkred&amp;gt;192.168.0.3&amp;lt;/font&amp;gt;. Если такой строки нет, то IP-адрес не задан. А если все же задан, подумайте, действителен ли он в вашей сети.&lt;br /&gt;
&lt;br /&gt;
На практике я несколько раз сталкивался с ситуацией, когда сеть переставала работать после того, как в нее ввели компьютер, случайно&lt;br /&gt;
оказавшийся DHCP-сервером, настроенным на диапазон адресов, не соответствующих этой сети. При перезагрузке компьютер с шансами&lt;br /&gt;
50/50 получал или действительный IP-адрес от «настоящего» DHCP-сервера, или ложный адрес от самозванца.&lt;br /&gt;
&lt;br /&gt;
Если в сетевом интерфейсе не задан IP-адрес, то проверьте, настроен ли автоматический запуск этого интерфейса при загрузке системы. Если да, то использует ли он DHCP или статический IP-адрес? Конкретные имена файлов, которые нужно просмотреть, зависят от дистрибутива. В Fedora и Red Hat это '''/etc/sysconfig/network-scripts/ifcfg-eth*''', в SUSE – '''/etc/sysconfig/network/ifcfg-eth*''', а в Ubuntu – '''/etc/network/interfaces'''. (Стандарты – отличная штука: ну не прелестны ли эти ничем не объяснимые расхождения?) Конечно, в каждом из дистрибутивов есть графические утилиты, с помощью которых можно посмотреть и отредактировать настройки.&lt;br /&gt;
&lt;br /&gt;
Обычно инициализация интерфейса упрятана глубоко в загрузочные скрипты, и взаимодействие с сервером DHCP разглядеть трудно; но его можно увидеть, непосредственно запустив скрипт ifup или dhclient. Эта программа поддерживает диалог с DHCP-сервером и позволяет задать параметры сети:&lt;br /&gt;
&lt;br /&gt;
 # dhclient&lt;br /&gt;
 Internet Systems Consortium DHCP Client V3.0.5-RedHatо&lt;br /&gt;
 Copyright 2004-2006 Internet Systems Consortium.&lt;br /&gt;
 All rights reserved.&lt;br /&gt;
 For info, please visit http://www.isc.org/sw/dhcp/&lt;br /&gt;
 Listening on LPF/eth1/00:0e:0c:01:d3:a0&lt;br /&gt;
 Sending on LPF/eth1/00:0e:0c:01:d3:a0&lt;br /&gt;
 Listening on LPF/eth0/00:0c:f1:96:a3:f7&lt;br /&gt;
 Sending on LPF/eth0/00:0c:f1:96:a3:f7&lt;br /&gt;
 Sending on Socket/fallback&lt;br /&gt;
 DHCPDISCOVER on eth1 to 255.255.255.255 port 67 interval 7&lt;br /&gt;
 DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 4&lt;br /&gt;
 DHCPOFFER from 192.168.0.1&lt;br /&gt;
 DHCPREQUEST on eth0 to 255.255.255.255 port 67&lt;br /&gt;
 DHCPACK from 192.168.0.1&lt;br /&gt;
 bound to 192.168.0.3 -- renewal in 125868 seconds.&lt;br /&gt;
&lt;br /&gt;
В данной системе два интерфейса, '''eth0''' и '''eth1'''. Мы видим, что IP-адрес интерфейса '''eth0''' получен от DHCP-сервера 192.168.0.1. Интерфейс '''eth1''' пытался сделать то же самое (он передал команду &amp;lt;fotn color=darkred&amp;gt;DHCPDISCOVER&amp;lt;/font&amp;gt;), но не получил ответа. И неудивительно: этот интерфейс не был ни к чему подключен.&lt;br /&gt;
&lt;br /&gt;
===Пингуется ли маршрутизатор?===&lt;br /&gt;
&lt;br /&gt;
Если IP-адрес задан корректно, пропингуйте (&amp;lt;fotn color=darkred&amp;gt;ping&amp;lt;/font&amp;gt;) другой компьютер в сети. В случае удачи результат будет примерно таким:&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 192.168.0.6&lt;br /&gt;
 PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 192.168.0.6: icmp_seq=1 ttl=64 time=0.468 ms&lt;br /&gt;
 --- 192.168.0.6 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 0.468/0.468/0.468/0.000 ms&lt;br /&gt;
&lt;br /&gt;
а неудачи – таким:&lt;br /&gt;
&lt;br /&gt;
 # ping -c 1 192.168.0.2&lt;br /&gt;
 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.&lt;br /&gt;
 From 192.168.0.3 icmp_seq=1 Destination Host Unreachable&lt;br /&gt;
 --- 192.168.0.2 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms&lt;br /&gt;
&lt;br /&gt;
Сообщение &amp;lt;fotn color=darkred&amp;gt;«Узел недоступен»&amp;lt;/font&amp;gt; (&amp;lt;fotn color=darkred&amp;gt;Destination Host Unreachable&amp;lt;/font&amp;gt;) обычно значит, что целевой компьютер (здесь – 192.168.0.2) не подключен к сети или не работает и поэтому не может ответить на ARP-запрос MAC-адреса с моего компьютера. Это также может означать, что ваш компьютер не находит маршрут доступа к локальной сети; чаще всего это бывает, когда ваш IP-адрес не входит в данную сеть. Возможны и более сложные проблемы с маршрутизацией – впрочем, в домашней сети, где маршрут (по умолчанию) только один, это маловероятно. Если в вашей сети нет других компьютеров, можно попробовать пропинговать маршрутизатор (Вы ведь знаете адрес своего маршрутизатора?).&lt;br /&gt;
&lt;br /&gt;
Если не получилось, то проблема носит местный характер. Если сеть проводная, проверьте кабели. Зеленые светодиоды на сетевых карточках должны гореть &amp;lt;fotn color=darkblue&amp;gt;[некоторые сетевые карты имеют другой способ индикации подключения. В случае необходимости изучите инструкцию, – ''прим.ред.'']&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Не блокирован ли трафик брандмауэром?===&lt;br /&gt;
&lt;br /&gt;
На некотором этапе нашего диагностирования полезно проверить, не чересчур ли «закручивает гайки» ваш брандмауэр. Самый быстрый&lt;br /&gt;
и грубый способ это узнать – и его предпочитают многие системные администраторы, если надо торопиться – удалить все правила брандмауэра командой&lt;br /&gt;
&lt;br /&gt;
 # iptables -F&lt;br /&gt;
&lt;br /&gt;
и посмотреть, изменится ли что-нибудь к лучшему. Если проблема исчезнет, то по крайней мере ясно, что ее причиной был брандмауэр.&lt;br /&gt;
Далее вам нужно перезагрузить компьютер (чтобы брандмауэр вновь заработал) и думать дальше. Не соблазняйтесь идеей оставить брандмауэр в отключке: это Плохая Идея!&lt;br /&gt;
&lt;br /&gt;
===5 Установлено ли ADSL-соединение ?===&lt;br /&gt;
&lt;br /&gt;
Если с самим маршрутизатором все в порядке, пора расширить охват. На маршрутизаторе должно быть еще несколько зеленых светодиодов (а если найти инструкцию к нему, то можно даже понять, что они означают), и по ним можно определить, подключен ли ADSL-модем маршрутизатора к провайдеру. У некоторых маршрутизаторов также есть возможность задать настройки и определить статус соединения с помощью web-приложения. Нас интересуют статус соединения (Connection Status) и IP-адрес, который провайдер назначил внешнему соединению. (Что это за адрес, не столь важно; главное, чтоб он был!) Разорвите соединение и заново установите его вручную, и попробуйте понять, на каком этапе возникает ошибка. Если соединения не добиться, нужно проверить провод, соединяющий маршрутизатор с телефонной линией (полезно подключить телефонную трубку, чтобы убедиться в наличии зуммера). Если провод в порядке, остается позвонить в службу поддержки провайдера. Приготовьте себе чашку кофе и вооружитесь интересной книжкой – ждать своей очереди на линии можно очень долго!&lt;br /&gt;
&lt;br /&gt;
===Пингуется ли удаленный сервер?===&lt;br /&gt;
&lt;br /&gt;
Если соединение с провайдером хорошее, тестированию пора подняться на уровень выше. Попробуйте пропинговать внешний компьютер с известным IP-адресом. Например, web-сервер Linux Format UK имеет адрес 89.167.142.11. (Конечно, он вполне может измениться, когда вы будете это читать, но пока для примера сгодится.)&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 89.167.142.11&lt;br /&gt;
 PING 89.167.142.11 (89.167.142.11) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 89.167.142.11: icmp_seq=1 ttl=56 time=24.3 ms&lt;br /&gt;
 --- 89.167.142.11 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 24.367/24.367/24.367/0.000 ms&lt;br /&gt;
&lt;br /&gt;
Если это работает, ваше сетевое соединение в порядке. В качестве последнего теста попробуйте добраться до удаленного компьютера по&lt;br /&gt;
его имени:&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 www.linuxformat.com&lt;br /&gt;
 PING www.linuxformat.com (89.167.142.11) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from kryten.future.net.uk (89.167.142.11): icmp_seq=1&lt;br /&gt;
 ttl=56 time=24.2 ms&lt;br /&gt;
 --- www.linuxformat.com ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 24.249/24.249/24.249/0.000 ms&lt;br /&gt;
&lt;br /&gt;
С помощью этого теста ошибки DNS сразу же выявляются, например:&lt;br /&gt;
&lt;br /&gt;
 $ ping www.prophylactic.gov&lt;br /&gt;
 ping: unknown host www.prophylactic.gov&lt;br /&gt;
&lt;br /&gt;
Если удаленный компьютер пингуется только по IP-адресу, но не по имени, пора изучать настройки вашего сервера DNS (LXF97). Для этого лучше всего подходит утилита ''dig''. Вот пример ее запуска (успешного). Не пугайтесь обилием подробностей; нужно лишь обратить внимание на запись &amp;lt;fotn color=darkred&amp;gt;A&amp;lt;/font&amp;gt; в разделе &amp;lt;fotn color=darkred&amp;gt;ANSWER&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # dig www.linuxformat.com&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.linuxformat.com&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 23236&lt;br /&gt;
 ;; flags: qr rd ra; QUERY:1, ANSWER:2, AUTHORITY:2,&lt;br /&gt;
 ADDITIONAL:2&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;www.linuxformat.com. IN A&lt;br /&gt;
 ;; ANSWER SECTION:&lt;br /&gt;
 www.linuxformat.com. 300 IN CNAME redirect1.future.net.uk.&lt;br /&gt;
 redirect1.future.net.uk. 300 IN A 89.167.142.11&lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 future.net.uk. 245 IN NS ns0.future.net.uk.&lt;br /&gt;
 future.net.uk. 245 IN NS ns1.future.net.uk.&lt;br /&gt;
 ;; ADDITIONAL SECTION:&lt;br /&gt;
 ns0.future.net.uk. 33231 IN A 89.167.142.1&lt;br /&gt;
 ns1.future.net.uk. 33231 IN A 89.167.143.1&lt;br /&gt;
 ;; Query time: 41 msec&lt;br /&gt;
 ;; SERVER: 192.168.0.1#53(192.168.0.1)&lt;br /&gt;
 ;; WHEN: Fri Jul 6 15:21:44 2007&lt;br /&gt;
 ;; MSG SIZE rcvd: 158&lt;br /&gt;
&lt;br /&gt;
Если DNS не работает, вариантов может быть несколько.&lt;br /&gt;
&lt;br /&gt;
В первом случае сервер DNS не может найти компьютер, к которому вы обращаетесь. Вот пример обращения к серверу, которого просто&lt;br /&gt;
не существует:&lt;br /&gt;
&lt;br /&gt;
 # dig prophylactic.gov&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; prophylactic.gov&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NXDOMAIN, id: 13168&lt;br /&gt;
 ;; flags: qr rd ra; QUERY:1, ANSWER:0, AUTHORITY:1,&lt;br /&gt;
 ADDITIONAL:0&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;prophylactic.gov. IN A&lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 gov. 2560 IN SOA a.gov.zoneedit.com. govcontact.&lt;br /&gt;
 zoneedit.com. 1183644065 3600 900 1814400 86400&lt;br /&gt;
&lt;br /&gt;
Обратите внимание на статус запроса &amp;lt;fotn color=darkred&amp;gt;NXDOMAIN&amp;lt;/font&amp;gt; и отсутствие раздела &amp;lt;fotn color=darkred&amp;gt;ANSWER&amp;lt;/font&amp;gt;, который мы видели в результатах предыдущего запроса. Если вы ввели корректное имя компьютера, то такая ошибка – следствие чьих-то чужих проблем.&lt;br /&gt;
&lt;br /&gt;
===Можете ли вы найти свой DNS-сервер?===&lt;br /&gt;
&lt;br /&gt;
Вторая причина отказа DNS – ваш компьютер не может найти DNS-сервер. Тогда источник проблемы, вероятно, ближе к дому.&lt;br /&gt;
&lt;br /&gt;
 # dig www.linuxformat.co.uk&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.linuxformat.co.uk&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; connection timed out; no servers could be reached&lt;br /&gt;
&lt;br /&gt;
Если это произошло, загляните в файл '''/etc/resolv.conf'''. В нем Linux хранит сведения о местонахождении DNS-серверов. Если вы пользуетесь DHCP, IP-адреса DNS-серверов предоставляются сервером DHCP. Если IP-адрес статический, вы, наверно, использовали графическую утилиту настройки для определения параметров серверов DNS (например, ''system-config-network'' в Fedora). В любом случае результаты записываются в этот файл. Есть ли в нем корректный адрес сервера имен? Можете ли вы пинговать его?&lt;br /&gt;
&lt;br /&gt;
Если ничто не помогает, попробуйте просмотреть сетевой трафик с помощью ''wireshark'', утилиты отслеживания пакетов, ранее известной как ethereal. Как средство диагностики ''wireshark'', на мой взгляд, «последняя надежда». Дело не в недоработке этой программы: программа-то отличная, но чтобы искать неполадки в сети путем изучения трафика на уровне пакетов, нужно очень хорошо знать TCP/IP и прикладные протоколы верхних уровней. Вам также может потребоваться дополнительный компьютер в сети для наблюдения за трафиком.&lt;br /&gt;
&lt;br /&gt;
Выполните команду&lt;br /&gt;
&lt;br /&gt;
 # ping 192.168.0.42&lt;br /&gt;
&lt;br /&gt;
на компьютере с IP-адресом 192.168.0.3. Посмотрите на верхнюю из трех панелей wireshark; в ней каждому перехваченному пакету соответствует одна строка. Средняя и нижняя панели позволяют разобраться в содержимом отдельных пакетов, но сейчас они нам не нужны.&lt;br /&gt;
Сообщение простое и ясное: компьютер с адресом 192.168.0.3 пытается использовать ARP для получения MAC-адреса компьютера, до которого хочет достучаться. Он пытался сделать это три раза с интервалом в одну секунду, но не получил ответа.&lt;br /&gt;
&lt;br /&gt;
Итак, мы можем сделать вывод, что с компьютером, адрес которого 192.168.0.3, все в порядке – он может получать пакеты от компьютеров сети с корректными IP-адресами, но компьютера с адресом 192.168.0.42 там просто нет.&lt;br /&gt;
&lt;br /&gt;
==Смотрим дальше==&lt;br /&gt;
&lt;br /&gt;
Вот другой пример. На клиентском компьютере установлен SUSE Linux 10.1. Проблема была в том, что каждый раз, когда браузер ''Konqueror''&lt;br /&gt;
пытался соединиться с внешним сайтом (т.е. производил поиск DNS-сервера), перед установкой соединения возникала 15-секундная задержка. Пакет 1 реализует стандартный запрос DNS для адреса [http://www.linuxformat.co.uk www.linuxformat.co.uk], а пакет 3 – ответ на этот запрос, который приходит через 0.04 с от сервера DNS, встроенного в мой маршрутизатор (192.168.0.1) с требуемым IP-адресом. Чудесно. Проблема в том, что ''Konqueror'' также решил запросить IPv6-адрес для этого сайта (запрос записи &amp;lt;font color=darkred&amp;gt;AAAA&amp;lt;/font&amp;gt; в пакете 2). Слава богу, маршрутизатор игнорирует этот запрос, и через пять секунд ''Konqueror'' перенаправляет этот запрос к маршрутизатору (пакет 7) и ко внешнему серверу DNS (пакет 6). Маршрутизатор все еще не отвечает, зато отвечает внешний DNS-сервер (пакет 8): сообщает, что не может найти записи &amp;lt;font color=darkred&amp;gt;AAAA&amp;lt;/font&amp;gt; для сайта [http://linux.format.co.uk linux.format.co.uk]. Ну, теперь помаленьку проясняется...&lt;br /&gt;
&lt;br /&gt;
DNS-ресолвер приписывает доменное имя по умолчанию &amp;lt;font color=blue&amp;gt;example.com&amp;lt;/font&amp;gt; к адресу, который он пытается преобразовать (в результате получаем бессмыслицу [http://www.linuxformat.co.uk.example.com www.linuxformat.co.uk.example.com]) и начинает поиск записей &amp;lt;font color=darkred&amp;gt;AAAA&amp;lt;/font&amp;gt; для этого адреса. Он тратит еще пять секунд, надеясь получить ответ от маршрутизатора, после чего еще раз пытается обратиться к внешнему серверу DNS (пакет 10). В конце концов занавес над этой печальной историей опускается, и через пятнадцать секунд после начала ''Konqueror'' создает соединение TCP/IP (пакеты с 17-го и далее), используя старый добрый адрес IPv4, с которого и начал.&lt;br /&gt;
&lt;br /&gt;
Оказалось, что это известная проблема, как свидетельствуют и результаты поиска Google по фразе ''“Konqueror IPv6”''. Решение простое: отключите стек протоколов IPv6 в ядре, отредактировав файл '''/etc/modprobe.conf''', и перезагрузите систему. Это хороший пример использования отслеживания пакетов для отладки, потому что другим способом решить эту проблему трудно. Не нужно проводить детальный анализ перехваченных пакетов, достаточно просто понять, что компьютер пытается разрешить имя в IPv6.&lt;br /&gt;
&lt;br /&gt;
Поиск неисправностей редко укладывается в обычные схемы диагностики. Ошибки имеют привычку просачиваться в щели между сложившейся литературой, и я уверен, что некоторые читатели (паратройка читателей у нас еще осталась, не правда ли?) столкнутся с ситуациями, в которых мои советы не помогут. Если у вас есть собственная история сетевых войн, которой вы хотели бы поделиться с нашими читателями, то отправьте нам ее на обычный адрес!&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%9D%D0%B5%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%B8%D0%B5_%D0%B0%D0%B2%D0%B8%D0%B0%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B</id>
		<title>Недорогие авиабилеты</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%9D%D0%B5%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%B8%D0%B5_%D0%B0%D0%B2%D0%B8%D0%B0%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B"/>
				<updated>2008-03-20T18:59:29Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Диагностика: проблемы с сетью==&lt;br /&gt;
&lt;br /&gt;
''Если сеть у вас захворала, зовите Доктора! Правда, домашних визитов к читателям '''д-р Крис Браун''' не делает, но готов поделиться диагнозом…''&lt;br /&gt;
&lt;br /&gt;
За годы жизни я помог многим друзьям и знакомым освоиться&lt;br /&gt;
с компьютером, и в подходящих случаях обучал их Linux. При этом, естественно, возникает нечто вроде родительской ответственности за развитие и взросление своих питомцев. Последний случай был типичным. Друг позвонил мне со словами: «У меня не работает сеть». Такое сообщение об ошибке не уступает классической фразе с борта Аполлона-13 «Хьюстон, у нас проблема», хотя и менее опасно для жизни. К счастью, в Linux много сетевых утилит, которые помогают выяснить, что именно не работает. (Чтобы не томить вас ожиданием развязки, сразу скажу, что моего друга просто отключил провайдер,&lt;br /&gt;
потому что он забыл продлить контракт.)&lt;br /&gt;
&lt;br /&gt;
Итак, следуйте за мной: рассмотрим некоторые средства диагностики сетевых неисправностей в Linux и посмотрим, как с их помощью&lt;br /&gt;
получить ответ на вопрос «Что не так в моей сети?»&lt;br /&gt;
&lt;br /&gt;
При любом поиске неисправностей прежде всего нужно понять и представить, в чем выражается правильная работа. Есть ли у компьютера статический IP-адрес, и если да, то какой? Пользуетесь ли вы DHCP, и если да, то каков адрес DHCP-сервера и выделяемый диапазон IP-адресов? Подключен ли широкополосный модем непосредственно к вашему компьютеру или у вас широкополосный маршрутизатор через Ethernet или беспроводную сеть?&lt;br /&gt;
&lt;br /&gt;
На данном уроке мы будем использовать методику «снизу вверх»: начнем с самых низких уровней и постепенно переедем на более высокие. Это хороший систематический подход для случая, если сеть не работала никогда. С другой стороны, если вчера сеть работала отлично, чаще будет быстрее начать сверху и двигаться вниз.&lt;br /&gt;
&lt;br /&gt;
===Находит ли Linux сетевую карту?===&lt;br /&gt;
&lt;br /&gt;
Первый вопрос на этом этапе – видит ли Linux сетевые интерфейсы?&lt;br /&gt;
Вы сможете ответить на него, просмотрев системные сообщения ядра,&lt;br /&gt;
которые выдавались во время загрузки. Для этого используется команда &amp;lt;fotn color=darkred&amp;gt;dmesg&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # dmesg | grep eth&lt;br /&gt;
 e1000: eth0: e1000_probe: Intel(R) PRO/1000 Network Connection&lt;br /&gt;
 e1000: eth1: e1000_probe: Intel(R) PRO/1000 Network Connection&lt;br /&gt;
 e1000: eth0: e1000_watchdog: NIC Link is Up 10 Mbps Half Duplex&lt;br /&gt;
&lt;br /&gt;
В качестве альтернативы попробуйте вывести список устройств на шине с помощью команды &amp;lt;fotn color=darkred&amp;gt;lspci&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # lspci | grep Ethernet&lt;br /&gt;
 01:01.0 Ethernet controller: Intel Corporation 82547EI&lt;br /&gt;
 02:01.0 Ethernet controller: Intel Corporation 82540EM&lt;br /&gt;
&lt;br /&gt;
Сообщения об ошибках на этой стадии говорят о неисправном или несовместимом оборудовании.&lt;br /&gt;
&lt;br /&gt;
===Задан ли IP-адрес?===&lt;br /&gt;
&lt;br /&gt;
Если сетевая карта на месте, то следующий вопрос – задан ли IP-адрес? Простейшая команда для этого случая – &amp;lt;fotn color=darkred&amp;gt;ifconfig&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # ifconfig eth0&lt;br /&gt;
 eth0 Link encap:Ethernet HWaddr 00:0C:F1:96:A3:F7&lt;br /&gt;
 inet addr:192.168.0.3 Bcast:192.168.0.255 Mask:255.255.255.0&lt;br /&gt;
 inet6 addr: fe80::20c:f1ff:fe96:a3f7/64 Scope:Link&lt;br /&gt;
 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1&lt;br /&gt;
 RX packets:306 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
 TX packets:261 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
 collisions:8 txqueuelen:10&lt;br /&gt;
 RX bytes:43074 (42.0 KiB) TX bytes:34480 (33.6 KiB)&lt;br /&gt;
 Base address:0xac00 Memory:ff7e0000-ff800000&lt;br /&gt;
&lt;br /&gt;
Здесь важна вторая строка, в которой можно увидеть IP-адрес: &amp;lt;fotn color=darkred&amp;gt;192.168.0.3&amp;lt;/font&amp;gt;. Если такой строки нет, то IP-адрес не задан. А если все же задан, подумайте, действителен ли он в вашей сети.&lt;br /&gt;
&lt;br /&gt;
На практике я несколько раз сталкивался с ситуацией, когда сеть переставала работать после того, как в нее ввели компьютер, случайно&lt;br /&gt;
оказавшийся DHCP-сервером, настроенным на диапазон адресов, не соответствующих этой сети. При перезагрузке компьютер с шансами&lt;br /&gt;
50/50 получал или действительный IP-адрес от «настоящего» DHCP-сервера, или ложный адрес от самозванца.&lt;br /&gt;
&lt;br /&gt;
Если в сетевом интерфейсе не задан IP-адрес, то проверьте, настроен ли автоматический запуск этого интерфейса при загрузке системы. Если да, то использует ли он DHCP или статический IP-адрес? Конкретные имена файлов, которые нужно просмотреть, зависят от дистрибутива. В Fedora и Red Hat это '''/etc/sysconfig/network-scripts/ifcfg-eth*''', в SUSE – '''/etc/sysconfig/network/ifcfg-eth*''', а в Ubuntu – '''/etc/network/interfaces'''. (Стандарты – отличная штука: ну не прелестны ли эти ничем не объяснимые расхождения?) Конечно, в каждом из дистрибутивов есть графические утилиты, с помощью которых можно посмотреть и отредактировать настройки.&lt;br /&gt;
&lt;br /&gt;
Обычно инициализация интерфейса упрятана глубоко в загрузочные скрипты, и взаимодействие с сервером DHCP разглядеть трудно; но его можно увидеть, непосредственно запустив скрипт ifup или dhclient. Эта программа поддерживает диалог с DHCP-сервером и позволяет задать параметры сети:&lt;br /&gt;
&lt;br /&gt;
 # dhclient&lt;br /&gt;
 Internet Systems Consortium DHCP Client V3.0.5-RedHatо&lt;br /&gt;
 Copyright 2004-2006 Internet Systems Consortium.&lt;br /&gt;
 All rights reserved.&lt;br /&gt;
 For info, please visit http://www.isc.org/sw/dhcp/&lt;br /&gt;
 Listening on LPF/eth1/00:0e:0c:01:d3:a0&lt;br /&gt;
 Sending on LPF/eth1/00:0e:0c:01:d3:a0&lt;br /&gt;
 Listening on LPF/eth0/00:0c:f1:96:a3:f7&lt;br /&gt;
 Sending on LPF/eth0/00:0c:f1:96:a3:f7&lt;br /&gt;
 Sending on Socket/fallback&lt;br /&gt;
 DHCPDISCOVER on eth1 to 255.255.255.255 port 67 interval 7&lt;br /&gt;
 DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 4&lt;br /&gt;
 DHCPOFFER from 192.168.0.1&lt;br /&gt;
 DHCPREQUEST on eth0 to 255.255.255.255 port 67&lt;br /&gt;
 DHCPACK from 192.168.0.1&lt;br /&gt;
 bound to 192.168.0.3 -- renewal in 125868 seconds.&lt;br /&gt;
&lt;br /&gt;
В данной системе два интерфейса, '''eth0''' и '''eth1'''. Мы видим, что IP-адрес интерфейса '''eth0''' получен от DHCP-сервера 192.168.0.1. Интерфейс '''eth1''' пытался сделать то же самое (он передал команду &amp;lt;fotn color=darkred&amp;gt;DHCPDISCOVER&amp;lt;/font&amp;gt;), но не получил ответа. И неудивительно: этот интерфейс не был ни к чему подключен.&lt;br /&gt;
&lt;br /&gt;
===Пингуется ли маршрутизатор?===&lt;br /&gt;
&lt;br /&gt;
Если IP-адрес задан корректно, пропингуйте (&amp;lt;fotn color=darkred&amp;gt;ping&amp;lt;/font&amp;gt;) другой компьютер в сети. В случае удачи результат будет примерно таким:&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 192.168.0.6&lt;br /&gt;
 PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 192.168.0.6: icmp_seq=1 ttl=64 time=0.468 ms&lt;br /&gt;
 --- 192.168.0.6 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 0.468/0.468/0.468/0.000 ms&lt;br /&gt;
&lt;br /&gt;
а неудачи – таким:&lt;br /&gt;
&lt;br /&gt;
 # ping -c 1 192.168.0.2&lt;br /&gt;
 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.&lt;br /&gt;
 From 192.168.0.3 icmp_seq=1 Destination Host Unreachable&lt;br /&gt;
 --- 192.168.0.2 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms&lt;br /&gt;
&lt;br /&gt;
Сообщение &amp;lt;fotn color=darkred&amp;gt;«Узел недоступен»&amp;lt;/font&amp;gt; (&amp;lt;fotn color=darkred&amp;gt;Destination Host Unreachable&amp;lt;/font&amp;gt;) обычно значит, что целевой компьютер (здесь – 192.168.0.2) не подключен к сети или не работает и поэтому не может ответить на ARP-запрос MAC-адреса с моего компьютера. Это также может означать, что ваш компьютер не находит маршрут доступа к локальной сети; чаще всего это бывает, когда ваш IP-адрес не входит в данную сеть. Возможны и более сложные проблемы с маршрутизацией – впрочем, в домашней сети, где маршрут (по умолчанию) только один, это маловероятно. Если в вашей сети нет других компьютеров, можно попробовать пропинговать маршрутизатор (Вы ведь знаете адрес своего маршрутизатора?).&lt;br /&gt;
&lt;br /&gt;
Если не получилось, то проблема носит местный характер. Если сеть проводная, проверьте кабели. Зеленые светодиоды на сетевых карточках должны гореть &amp;lt;fotn color=darkblue&amp;gt;[некоторые сетевые карты имеют другой способ индикации подключения. В случае необходимости изучите инструкцию, – ''прим.ред.'']&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Не блокирован ли трафик брандмауэром?===&lt;br /&gt;
&lt;br /&gt;
На некотором этапе нашего диагностирования полезно проверить, не чересчур ли «закручивает гайки» ваш брандмауэр. Самый быстрый&lt;br /&gt;
и грубый способ это узнать – и его предпочитают многие системные администраторы, если надо торопиться – удалить все правила брандмауэра командой&lt;br /&gt;
&lt;br /&gt;
 # iptables -F&lt;br /&gt;
&lt;br /&gt;
и посмотреть, изменится ли что-нибудь к лучшему. Если проблема исчезнет, то по крайней мере ясно, что ее причиной был брандмауэр.&lt;br /&gt;
Далее вам нужно перезагрузить компьютер (чтобы брандмауэр вновь заработал) и думать дальше. Не соблазняйтесь идеей оставить брандмауэр в отключке: это Плохая Идея!&lt;br /&gt;
&lt;br /&gt;
===5 Установлено ли ADSL-соединение ?===&lt;br /&gt;
&lt;br /&gt;
Если с самим маршрутизатором все в порядке, пора расширить охват. На маршрутизаторе должно быть еще несколько зеленых светодиодов (а если найти инструкцию к нему, то можно даже понять, что они означают), и по ним можно определить, подключен ли ADSL-модем маршрутизатора к провайдеру. У некоторых маршрутизаторов также есть возможность задать настройки и определить статус соединения с помощью web-приложения. Нас интересуют статус соединения (Connection Status) и IP-адрес, который провайдер назначил внешнему соединению. (Что это за адрес, не столь важно; главное, чтоб он был!) Разорвите соединение и заново установите его вручную, и попробуйте понять, на каком этапе возникает ошибка. Если соединения не добиться, нужно проверить провод, соединяющий маршрутизатор с телефонной линией (полезно подключить телефонную трубку, чтобы убедиться в наличии зуммера). Если провод в порядке, остается позвонить в службу поддержки провайдера. Приготовьте себе чашку кофе и вооружитесь интересной книжкой – ждать своей очереди на линии можно очень долго!&lt;br /&gt;
&lt;br /&gt;
===Пингуется ли удаленный сервер?===&lt;br /&gt;
&lt;br /&gt;
Если соединение с провайдером хорошее, тестированию пора подняться на уровень выше. Попробуйте пропинговать внешний компьютер с известным IP-адресом. Например, web-сервер Linux Format UK имеет адрес 89.167.142.11. (Конечно, он вполне может измениться, когда вы будете это читать, но пока для примера сгодится.)&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 89.167.142.11&lt;br /&gt;
 PING 89.167.142.11 (89.167.142.11) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 89.167.142.11: icmp_seq=1 ttl=56 time=24.3 ms&lt;br /&gt;
 --- 89.167.142.11 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 24.367/24.367/24.367/0.000 ms&lt;br /&gt;
&lt;br /&gt;
Если это работает, ваше сетевое соединение в порядке. В качестве последнего теста попробуйте добраться до удаленного компьютера по&lt;br /&gt;
его имени:&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 www.linuxformat.com&lt;br /&gt;
 PING www.linuxformat.com (89.167.142.11) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from kryten.future.net.uk (89.167.142.11): icmp_seq=1&lt;br /&gt;
 ttl=56 time=24.2 ms&lt;br /&gt;
 --- www.linuxformat.com ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 24.249/24.249/24.249/0.000 ms&lt;br /&gt;
&lt;br /&gt;
С помощью этого теста ошибки DNS сразу же выявляются, например:&lt;br /&gt;
&lt;br /&gt;
 $ ping www.prophylactic.gov&lt;br /&gt;
 ping: unknown host www.prophylactic.gov&lt;br /&gt;
&lt;br /&gt;
Если удаленный компьютер пингуется только по IP-адресу, но не по имени, пора изучать настройки вашего сервера DNS (LXF97). Для этого лучше всего подходит утилита ''dig''. Вот пример ее запуска (успешного). Не пугайтесь обилием подробностей; нужно лишь обратить внимание на запись &amp;lt;fotn color=darkred&amp;gt;A&amp;lt;/font&amp;gt; в разделе &amp;lt;fotn color=darkred&amp;gt;ANSWER&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # dig www.linuxformat.com&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.linuxformat.com&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 23236&lt;br /&gt;
 ;; flags: qr rd ra; QUERY:1, ANSWER:2, AUTHORITY:2,&lt;br /&gt;
 ADDITIONAL:2&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;www.linuxformat.com. IN A&lt;br /&gt;
 ;; ANSWER SECTION:&lt;br /&gt;
 www.linuxformat.com. 300 IN CNAME redirect1.future.net.uk.&lt;br /&gt;
 redirect1.future.net.uk. 300 IN A 89.167.142.11&lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 future.net.uk. 245 IN NS ns0.future.net.uk.&lt;br /&gt;
 future.net.uk. 245 IN NS ns1.future.net.uk.&lt;br /&gt;
 ;; ADDITIONAL SECTION:&lt;br /&gt;
 ns0.future.net.uk. 33231 IN A 89.167.142.1&lt;br /&gt;
 ns1.future.net.uk. 33231 IN A 89.167.143.1&lt;br /&gt;
 ;; Query time: 41 msec&lt;br /&gt;
 ;; SERVER: 192.168.0.1#53(192.168.0.1)&lt;br /&gt;
 ;; WHEN: Fri Jul 6 15:21:44 2007&lt;br /&gt;
 ;; MSG SIZE rcvd: 158&lt;br /&gt;
&lt;br /&gt;
Если DNS не работает, вариантов может быть несколько.&lt;br /&gt;
&lt;br /&gt;
В первом случае сервер DNS не может найти компьютер, к которому вы обращаетесь. Вот пример обращения к серверу, которого просто&lt;br /&gt;
не существует:&lt;br /&gt;
&lt;br /&gt;
 # dig prophylactic.gov&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; prophylactic.gov&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NXDOMAIN, id: 13168&lt;br /&gt;
 ;; flags: qr rd ra; QUERY:1, ANSWER:0, AUTHORITY:1,&lt;br /&gt;
 ADDITIONAL:0&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;prophylactic.gov. IN A&lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 gov. 2560 IN SOA a.gov.zoneedit.com. govcontact.&lt;br /&gt;
 zoneedit.com. 1183644065 3600 900 1814400 86400&lt;br /&gt;
&lt;br /&gt;
Обратите внимание на статус запроса &amp;lt;fotn color=darkred&amp;gt;NXDOMAIN&amp;lt;/font&amp;gt; и отсутствие раздела &amp;lt;fotn color=darkred&amp;gt;ANSWER&amp;lt;/font&amp;gt;, который мы видели в результатах предыдущего запроса. Если вы ввели корректное имя компьютера, то такая ошибка – следствие чьих-то чужих проблем.&lt;br /&gt;
&lt;br /&gt;
===Можете ли вы найти свой DNS-сервер?===&lt;br /&gt;
&lt;br /&gt;
Вторая причина отказа DNS – ваш компьютер не может найти DNS-сервер. Тогда источник проблемы, вероятно, ближе к дому.&lt;br /&gt;
&lt;br /&gt;
 # dig www.linuxformat.co.uk&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.linuxformat.co.uk&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; connection timed out; no servers could be reached&lt;br /&gt;
&lt;br /&gt;
Если это произошло, загляните в файл '''/etc/resolv.conf'''. В нем Linux хранит сведения о местонахождении DNS-серверов. Если вы пользуетесь DHCP, IP-адреса DNS-серверов предоставляются сервером DHCP. Если IP-адрес статический, вы, наверно, использовали графическую утилиту настройки для определения параметров серверов DNS (например, ''system-config-network'' в Fedora). В любом случае результаты записываются в этот файл. Есть ли в нем корректный адрес сервера имен? Можете ли вы пинговать его?&lt;br /&gt;
&lt;br /&gt;
Если ничто не помогает, попробуйте просмотреть сетевой трафик с помощью ''wireshark'', утилиты отслеживания пакетов, ранее известной как ethereal. Как средство диагностики ''wireshark'', на мой взгляд, «последняя надежда». Дело не в недоработке этой программы: программа-то отличная, но чтобы искать неполадки в сети путем изучения трафика на уровне пакетов, нужно очень хорошо знать TCP/IP и прикладные протоколы верхних уровней. Вам также может потребоваться дополнительный компьютер в сети для наблюдения за трафиком.&lt;br /&gt;
&lt;br /&gt;
Выполните команду&lt;br /&gt;
&lt;br /&gt;
 # ping 192.168.0.42&lt;br /&gt;
&lt;br /&gt;
на компьютере с IP-адресом 192.168.0.3. Посмотрите на верхнюю из трех панелей wireshark; в ней каждому перехваченному пакету соответствует одна строка. Средняя и нижняя панели позволяют разобраться в содержимом отдельных пакетов, но сейчас они нам не нужны.&lt;br /&gt;
Сообщение простое и ясное: компьютер с адресом 192.168.0.3 пытается использовать ARP для получения MAC-адреса компьютера, до которого хочет достучаться. Он пытался сделать это три раза с интервалом в одну секунду, но не получил ответа.&lt;br /&gt;
&lt;br /&gt;
Итак, мы можем сделать вывод, что с компьютером, адрес которого 192.168.0.3, все в порядке – он может получать пакеты от компьютеров сети с корректными IP-адресами, но компьютера с адресом 192.168.0.42 там просто нет.&lt;br /&gt;
&lt;br /&gt;
==Смотрим дальше==&lt;br /&gt;
&lt;br /&gt;
Вот другой пример. На клиентском компьютере установлен SUSE Linux 10.1. Проблема была в том, что каждый раз, когда браузер ''Konqueror''&lt;br /&gt;
пытался соединиться с внешним сайтом (т.е. производил поиск DNS-сервера), перед установкой соединения возникала 15-секундная задержка. Пакет 1 реализует стандартный запрос DNS для адреса [http://www.linuxformat.co.uk www.linuxformat.co.uk], а пакет 3 – ответ на этот запрос, который приходит через 0.04 с от сервера DNS, встроенного в мой маршрутизатор (192.168.0.1) с требуемым IP-адресом. Чудесно. Проблема в том, что ''Konqueror'' также решил запросить IPv6-адрес для этого сайта (запрос записи &amp;lt;fotn color=darkred&amp;gt;AAAA&amp;lt;/font&amp;gt; в пакете 2). Слава богу, маршрутизатор игнорирует этот запрос, и через пять секунд ''Konqueror'' перенаправляет этот запрос к маршрутизатору (пакет 7) и ко внешнему серверу DNS (пакет 6). Маршрутизатор все еще не отвечает, зато отвечает внешний DNS-сервер (пакет 8): сообщает, что не может найти записи &amp;lt;fotn color=darkred&amp;gt;AAAA&amp;lt;/font&amp;gt; для сайта [http://linux.format.co.uk linux.format.co.uk]. Ну, теперь помаленьку проясняется...&lt;br /&gt;
&lt;br /&gt;
DNS-ресолвер приписывает доменное имя по умолчанию &amp;lt;font color=blue&amp;gt;example.com&amp;lt;/font&amp;gt; к адресу, который он пытается преобразовать (в результате получаем бессмыслицу [http://www.linuxformat.co.uk.example.com www.linuxformat.co.uk.example.com]) и начинает поиск записей &amp;lt;font color=darkred&amp;gt;AAAA&amp;lt;/font&amp;gt; для этого адреса. Он тратит еще пять секунд, надеясь получить ответ от маршрутизатора, после чего еще раз пытается обратиться к внешнему серверу DNS (пакет 10). В конце концов занавес над этой печальной историей опускается, и через пятнадцать секунд после начала ''Konqueror'' создает соединение TCP/IP (пакеты с 17-го и далее), используя старый добрый адрес IPv4, с которого и начал.&lt;br /&gt;
&lt;br /&gt;
Оказалось, что это известная проблема, как свидетельствуют и результаты поиска Google по фразе ''“Konqueror IPv6”''. Решение простое: отключите стек протоколов IPv6 в ядре, отредактировав файл '''/etc/modprobe.conf''', и перезагрузите систему. Это хороший пример использования отслеживания пакетов для отладки, потому что другим способом решить эту проблему трудно. Не нужно проводить детальный анализ перехваченных пакетов, достаточно просто понять, что компьютер пытается разрешить имя в IPv6.&lt;br /&gt;
&lt;br /&gt;
Поиск неисправностей редко укладывается в обычные схемы диагностики. Ошибки имеют привычку просачиваться в щели между сложившейся литературой, и я уверен, что некоторые читатели (паратройка читателей у нас еще осталась, не правда ли?) столкнутся с ситуациями, в которых мои советы не помогут. Если у вас есть собственная история сетевых войн, которой вы хотели бы поделиться с нашими читателями, то отправьте нам ее на обычный адрес!&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%9D%D0%B5%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%B8%D0%B5_%D0%B0%D0%B2%D0%B8%D0%B0%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B</id>
		<title>Недорогие авиабилеты</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%9D%D0%B5%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%B8%D0%B5_%D0%B0%D0%B2%D0%B8%D0%B0%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B"/>
				<updated>2008-03-20T18:58:28Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Диагностика: проблемы с сетью==&lt;br /&gt;
&lt;br /&gt;
''Если сеть у вас захворала, зовите Доктора! Правда, домашних визитов к читателям '''д-р Крис Браун''' не делает, но готов поделиться диагнозом…''&lt;br /&gt;
&lt;br /&gt;
За годы жизни я помог многим друзьям и знакомым освоиться&lt;br /&gt;
с компьютером, и в подходящих случаях обучал их Linux. При этом, естественно, возникает нечто вроде родительской ответственности за развитие и взросление своих питомцев. Последний случай был типичным. Друг позвонил мне со словами: «У меня не работает сеть». Такое сообщение об ошибке не уступает классической фразе с борта Аполлона-13 «Хьюстон, у нас проблема», хотя и менее опасно для жизни. К счастью, в Linux много сетевых утилит, которые помогают выяснить, что именно не работает. (Чтобы не томить вас ожиданием развязки, сразу скажу, что моего друга просто отключил провайдер,&lt;br /&gt;
потому что он забыл продлить контракт.)&lt;br /&gt;
&lt;br /&gt;
Итак, следуйте за мной: рассмотрим некоторые средства диагностики сетевых неисправностей в Linux и посмотрим, как с их помощью&lt;br /&gt;
получить ответ на вопрос «Что не так в моей сети?»&lt;br /&gt;
&lt;br /&gt;
При любом поиске неисправностей прежде всего нужно понять и представить, в чем выражается правильная работа. Есть ли у компьютера статический IP-адрес, и если да, то какой? Пользуетесь ли вы DHCP, и если да, то каков адрес DHCP-сервера и выделяемый диапазон IP-адресов? Подключен ли широкополосный модем непосредственно к вашему компьютеру или у вас широкополосный маршрутизатор через Ethernet или беспроводную сеть?&lt;br /&gt;
&lt;br /&gt;
На данном уроке мы будем использовать методику «снизу вверх»: начнем с самых низких уровней и постепенно переедем на более высокие. Это хороший систематический подход для случая, если сеть не работала никогда. С другой стороны, если вчера сеть работала отлично, чаще будет быстрее начать сверху и двигаться вниз.&lt;br /&gt;
&lt;br /&gt;
==='''Находит ли Linux сетевую карту?'''===&lt;br /&gt;
&lt;br /&gt;
Первый вопрос на этом этапе – видит ли Linux сетевые интерфейсы?&lt;br /&gt;
Вы сможете ответить на него, просмотрев системные сообщения ядра,&lt;br /&gt;
которые выдавались во время загрузки. Для этого используется команда &amp;lt;fotn color=darkred&amp;gt;dmesg&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # dmesg | grep eth&lt;br /&gt;
 e1000: eth0: e1000_probe: Intel(R) PRO/1000 Network Connection&lt;br /&gt;
 e1000: eth1: e1000_probe: Intel(R) PRO/1000 Network Connection&lt;br /&gt;
 e1000: eth0: e1000_watchdog: NIC Link is Up 10 Mbps Half Duplex&lt;br /&gt;
&lt;br /&gt;
В качестве альтернативы попробуйте вывести список устройств на шине с помощью команды &amp;lt;fotn color=darkred&amp;gt;lspci&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # lspci | grep Ethernet&lt;br /&gt;
 01:01.0 Ethernet controller: Intel Corporation 82547EI&lt;br /&gt;
 02:01.0 Ethernet controller: Intel Corporation 82540EM&lt;br /&gt;
&lt;br /&gt;
Сообщения об ошибках на этой стадии говорят о неисправном или несовместимом оборудовании.&lt;br /&gt;
&lt;br /&gt;
==='''Задан ли IP-адрес?'''===&lt;br /&gt;
&lt;br /&gt;
Если сетевая карта на месте, то следующий вопрос – задан ли IP-адрес? Простейшая команда для этого случая – &amp;lt;fotn color=darkred&amp;gt;ifconfig&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # ifconfig eth0&lt;br /&gt;
 eth0 Link encap:Ethernet HWaddr 00:0C:F1:96:A3:F7&lt;br /&gt;
 inet addr:192.168.0.3 Bcast:192.168.0.255 Mask:255.255.255.0&lt;br /&gt;
 inet6 addr: fe80::20c:f1ff:fe96:a3f7/64 Scope:Link&lt;br /&gt;
 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1&lt;br /&gt;
 RX packets:306 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
 TX packets:261 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
 collisions:8 txqueuelen:10&lt;br /&gt;
 RX bytes:43074 (42.0 KiB) TX bytes:34480 (33.6 KiB)&lt;br /&gt;
 Base address:0xac00 Memory:ff7e0000-ff800000&lt;br /&gt;
&lt;br /&gt;
Здесь важна вторая строка, в которой можно увидеть IP-адрес: &amp;lt;fotn color=darkred&amp;gt;192.168.0.3&amp;lt;/font&amp;gt;. Если такой строки нет, то IP-адрес не задан. А если все же задан, подумайте, действителен ли он в вашей сети.&lt;br /&gt;
&lt;br /&gt;
На практике я несколько раз сталкивался с ситуацией, когда сеть переставала работать после того, как в нее ввели компьютер, случайно&lt;br /&gt;
оказавшийся DHCP-сервером, настроенным на диапазон адресов, не соответствующих этой сети. При перезагрузке компьютер с шансами&lt;br /&gt;
50/50 получал или действительный IP-адрес от «настоящего» DHCP-сервера, или ложный адрес от самозванца.&lt;br /&gt;
&lt;br /&gt;
Если в сетевом интерфейсе не задан IP-адрес, то проверьте, настроен ли автоматический запуск этого интерфейса при загрузке системы. Если да, то использует ли он DHCP или статический IP-адрес? Конкретные имена файлов, которые нужно просмотреть, зависят от дистрибутива. В Fedora и Red Hat это '''/etc/sysconfig/network-scripts/ifcfg-eth*''', в SUSE – '''/etc/sysconfig/network/ifcfg-eth*''', а в Ubuntu – '''/etc/network/interfaces'''. (Стандарты – отличная штука: ну не прелестны ли эти ничем не объяснимые расхождения?) Конечно, в каждом из дистрибутивов есть графические утилиты, с помощью которых можно посмотреть и отредактировать настройки.&lt;br /&gt;
&lt;br /&gt;
Обычно инициализация интерфейса упрятана глубоко в загрузочные скрипты, и взаимодействие с сервером DHCP разглядеть трудно; но его можно увидеть, непосредственно запустив скрипт ifup или dhclient. Эта программа поддерживает диалог с DHCP-сервером и позволяет задать параметры сети:&lt;br /&gt;
&lt;br /&gt;
 # dhclient&lt;br /&gt;
 Internet Systems Consortium DHCP Client V3.0.5-RedHatо&lt;br /&gt;
 Copyright 2004-2006 Internet Systems Consortium.&lt;br /&gt;
 All rights reserved.&lt;br /&gt;
 For info, please visit http://www.isc.org/sw/dhcp/&lt;br /&gt;
 Listening on LPF/eth1/00:0e:0c:01:d3:a0&lt;br /&gt;
 Sending on LPF/eth1/00:0e:0c:01:d3:a0&lt;br /&gt;
 Listening on LPF/eth0/00:0c:f1:96:a3:f7&lt;br /&gt;
 Sending on LPF/eth0/00:0c:f1:96:a3:f7&lt;br /&gt;
 Sending on Socket/fallback&lt;br /&gt;
 DHCPDISCOVER on eth1 to 255.255.255.255 port 67 interval 7&lt;br /&gt;
 DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 4&lt;br /&gt;
 DHCPOFFER from 192.168.0.1&lt;br /&gt;
 DHCPREQUEST on eth0 to 255.255.255.255 port 67&lt;br /&gt;
 DHCPACK from 192.168.0.1&lt;br /&gt;
 bound to 192.168.0.3 -- renewal in 125868 seconds.&lt;br /&gt;
&lt;br /&gt;
В данной системе два интерфейса, '''eth0''' и '''eth1'''. Мы видим, что IP-адрес интерфейса '''eth0''' получен от DHCP-сервера 192.168.0.1. Интерфейс '''eth1''' пытался сделать то же самое (он передал команду &amp;lt;fotn color=darkred&amp;gt;DHCPDISCOVER&amp;lt;/font&amp;gt;), но не получил ответа. И неудивительно: этот интерфейс не был ни к чему подключен.&lt;br /&gt;
&lt;br /&gt;
==='''Пингуется ли маршрутизатор?'''===&lt;br /&gt;
&lt;br /&gt;
Если IP-адрес задан корректно, пропингуйте (&amp;lt;fotn color=darkred&amp;gt;ping&amp;lt;/font&amp;gt;) другой компьютер в сети. В случае удачи результат будет примерно таким:&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 192.168.0.6&lt;br /&gt;
 PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 192.168.0.6: icmp_seq=1 ttl=64 time=0.468 ms&lt;br /&gt;
 --- 192.168.0.6 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 0.468/0.468/0.468/0.000 ms&lt;br /&gt;
&lt;br /&gt;
а неудачи – таким:&lt;br /&gt;
&lt;br /&gt;
 # ping -c 1 192.168.0.2&lt;br /&gt;
 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.&lt;br /&gt;
 From 192.168.0.3 icmp_seq=1 Destination Host Unreachable&lt;br /&gt;
 --- 192.168.0.2 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms&lt;br /&gt;
&lt;br /&gt;
Сообщение &amp;lt;fotn color=darkred&amp;gt;«Узел недоступен»&amp;lt;/font&amp;gt; (&amp;lt;fotn color=darkred&amp;gt;Destination Host Unreachable&amp;lt;/font&amp;gt;) обычно значит, что целевой компьютер (здесь – 192.168.0.2) не подключен к сети или не работает и поэтому не может ответить на ARP-запрос MAC-адреса с моего компьютера. Это также может означать, что ваш компьютер не находит маршрут доступа к локальной сети; чаще всего это бывает, когда ваш IP-адрес не входит в данную сеть. Возможны и более сложные проблемы с маршрутизацией – впрочем, в домашней сети, где маршрут (по умолчанию) только один, это маловероятно. Если в вашей сети нет других компьютеров, можно попробовать пропинговать маршрутизатор (Вы ведь знаете адрес своего маршрутизатора?).&lt;br /&gt;
&lt;br /&gt;
Если не получилось, то проблема носит местный характер. Если сеть проводная, проверьте кабели. Зеленые светодиоды на сетевых карточках должны гореть &amp;lt;fotn color=darkblue&amp;gt;[некоторые сетевые карты имеют другой способ индикации подключения. В случае необходимости изучите инструкцию, – ''прим.ред.'']&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==='''Не блокирован ли трафик брандмауэром?'''===&lt;br /&gt;
&lt;br /&gt;
На некотором этапе нашего диагностирования полезно проверить, не чересчур ли «закручивает гайки» ваш брандмауэр. Самый быстрый&lt;br /&gt;
и грубый способ это узнать – и его предпочитают многие системные администраторы, если надо торопиться – удалить все правила брандмауэра командой&lt;br /&gt;
&lt;br /&gt;
 # iptables -F&lt;br /&gt;
&lt;br /&gt;
и посмотреть, изменится ли что-нибудь к лучшему. Если проблема исчезнет, то по крайней мере ясно, что ее причиной был брандмауэр.&lt;br /&gt;
Далее вам нужно перезагрузить компьютер (чтобы брандмауэр вновь заработал) и думать дальше. Не соблазняйтесь идеей оставить брандмауэр в отключке: это Плохая Идея!&lt;br /&gt;
&lt;br /&gt;
==='''5 Установлено ли ADSL-соединение ?'''===&lt;br /&gt;
&lt;br /&gt;
Если с самим маршрутизатором все в порядке, пора расширить охват. На маршрутизаторе должно быть еще несколько зеленых светодиодов (а если найти инструкцию к нему, то можно даже понять, что они означают), и по ним можно определить, подключен ли ADSL-модем маршрутизатора к провайдеру. У некоторых маршрутизаторов также есть возможность задать настройки и определить статус соединения с помощью web-приложения. Нас интересуют статус соединения (Connection Status) и IP-адрес, который провайдер назначил внешнему соединению. (Что это за адрес, не столь важно; главное, чтоб он был!) Разорвите соединение и заново установите его вручную, и попробуйте понять, на каком этапе возникает ошибка. Если соединения не добиться, нужно проверить провод, соединяющий маршрутизатор с телефонной линией (полезно подключить телефонную трубку, чтобы убедиться в наличии зуммера). Если провод в порядке, остается позвонить в службу поддержки провайдера. Приготовьте себе чашку кофе и вооружитесь интересной книжкой – ждать своей очереди на линии можно очень долго!&lt;br /&gt;
&lt;br /&gt;
==='''Пингуется ли удаленный сервер?'''===&lt;br /&gt;
&lt;br /&gt;
Если соединение с провайдером хорошее, тестированию пора подняться на уровень выше. Попробуйте пропинговать внешний компьютер с известным IP-адресом. Например, web-сервер Linux Format UK имеет адрес 89.167.142.11. (Конечно, он вполне может измениться, когда вы будете это читать, но пока для примера сгодится.)&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 89.167.142.11&lt;br /&gt;
 PING 89.167.142.11 (89.167.142.11) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 89.167.142.11: icmp_seq=1 ttl=56 time=24.3 ms&lt;br /&gt;
 --- 89.167.142.11 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 24.367/24.367/24.367/0.000 ms&lt;br /&gt;
&lt;br /&gt;
Если это работает, ваше сетевое соединение в порядке. В качестве последнего теста попробуйте добраться до удаленного компьютера по&lt;br /&gt;
его имени:&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 www.linuxformat.com&lt;br /&gt;
 PING www.linuxformat.com (89.167.142.11) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from kryten.future.net.uk (89.167.142.11): icmp_seq=1&lt;br /&gt;
 ttl=56 time=24.2 ms&lt;br /&gt;
 --- www.linuxformat.com ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 24.249/24.249/24.249/0.000 ms&lt;br /&gt;
&lt;br /&gt;
С помощью этого теста ошибки DNS сразу же выявляются, например:&lt;br /&gt;
&lt;br /&gt;
 $ ping www.prophylactic.gov&lt;br /&gt;
 ping: unknown host www.prophylactic.gov&lt;br /&gt;
&lt;br /&gt;
Если удаленный компьютер пингуется только по IP-адресу, но не по имени, пора изучать настройки вашего сервера DNS (LXF97). Для этого лучше всего подходит утилита ''dig''. Вот пример ее запуска (успешного). Не пугайтесь обилием подробностей; нужно лишь обратить внимание на запись &amp;lt;fotn color=darkred&amp;gt;A&amp;lt;/font&amp;gt; в разделе &amp;lt;fotn color=darkred&amp;gt;ANSWER&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # dig www.linuxformat.com&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.linuxformat.com&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 23236&lt;br /&gt;
 ;; flags: qr rd ra; QUERY:1, ANSWER:2, AUTHORITY:2,&lt;br /&gt;
 ADDITIONAL:2&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;www.linuxformat.com. IN A&lt;br /&gt;
 ;; ANSWER SECTION:&lt;br /&gt;
 www.linuxformat.com. 300 IN CNAME redirect1.future.net.uk.&lt;br /&gt;
 redirect1.future.net.uk. 300 IN A 89.167.142.11&lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 future.net.uk. 245 IN NS ns0.future.net.uk.&lt;br /&gt;
 future.net.uk. 245 IN NS ns1.future.net.uk.&lt;br /&gt;
 ;; ADDITIONAL SECTION:&lt;br /&gt;
 ns0.future.net.uk. 33231 IN A 89.167.142.1&lt;br /&gt;
 ns1.future.net.uk. 33231 IN A 89.167.143.1&lt;br /&gt;
 ;; Query time: 41 msec&lt;br /&gt;
 ;; SERVER: 192.168.0.1#53(192.168.0.1)&lt;br /&gt;
 ;; WHEN: Fri Jul 6 15:21:44 2007&lt;br /&gt;
 ;; MSG SIZE rcvd: 158&lt;br /&gt;
&lt;br /&gt;
Если DNS не работает, вариантов может быть несколько.&lt;br /&gt;
&lt;br /&gt;
В первом случае сервер DNS не может найти компьютер, к которому вы обращаетесь. Вот пример обращения к серверу, которого просто&lt;br /&gt;
не существует:&lt;br /&gt;
&lt;br /&gt;
 # dig prophylactic.gov&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; prophylactic.gov&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NXDOMAIN, id: 13168&lt;br /&gt;
 ;; flags: qr rd ra; QUERY:1, ANSWER:0, AUTHORITY:1,&lt;br /&gt;
 ADDITIONAL:0&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;prophylactic.gov. IN A&lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 gov. 2560 IN SOA a.gov.zoneedit.com. govcontact.&lt;br /&gt;
 zoneedit.com. 1183644065 3600 900 1814400 86400&lt;br /&gt;
&lt;br /&gt;
Обратите внимание на статус запроса &amp;lt;fotn color=darkred&amp;gt;NXDOMAIN&amp;lt;/font&amp;gt; и отсутствие раздела &amp;lt;fotn color=darkred&amp;gt;ANSWER&amp;lt;/font&amp;gt;, который мы видели в результатах предыдущего запроса. Если вы ввели корректное имя компьютера, то такая ошибка – следствие чьих-то чужих проблем.&lt;br /&gt;
&lt;br /&gt;
==='''Можете ли вы найти свой DNS-сервер?'''===&lt;br /&gt;
&lt;br /&gt;
Вторая причина отказа DNS – ваш компьютер не может найти DNS-сервер. Тогда источник проблемы, вероятно, ближе к дому.&lt;br /&gt;
&lt;br /&gt;
 # dig www.linuxformat.co.uk&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.linuxformat.co.uk&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; connection timed out; no servers could be reached&lt;br /&gt;
&lt;br /&gt;
Если это произошло, загляните в файл '''/etc/resolv.conf'''. В нем Linux хранит сведения о местонахождении DNS-серверов. Если вы пользуетесь DHCP, IP-адреса DNS-серверов предоставляются сервером DHCP. Если IP-адрес статический, вы, наверно, использовали графическую утилиту настройки для определения параметров серверов DNS (например, ''system-config-network'' в Fedora). В любом случае результаты записываются в этот файл. Есть ли в нем корректный адрес сервера имен? Можете ли вы пинговать его?&lt;br /&gt;
&lt;br /&gt;
Если ничто не помогает, попробуйте просмотреть сетевой трафик с помощью ''wireshark'', утилиты отслеживания пакетов, ранее известной как ethereal. Как средство диагностики ''wireshark'', на мой взгляд, «последняя надежда». Дело не в недоработке этой программы: программа-то отличная, но чтобы искать неполадки в сети путем изучения трафика на уровне пакетов, нужно очень хорошо знать TCP/IP и прикладные протоколы верхних уровней. Вам также может потребоваться дополнительный компьютер в сети для наблюдения за трафиком.&lt;br /&gt;
&lt;br /&gt;
Выполните команду&lt;br /&gt;
&lt;br /&gt;
 # ping 192.168.0.42&lt;br /&gt;
&lt;br /&gt;
на компьютере с IP-адресом 192.168.0.3. Посмотрите на верхнюю из трех панелей wireshark; в ней каждому перехваченному пакету соответствует одна строка. Средняя и нижняя панели позволяют разобраться в содержимом отдельных пакетов, но сейчас они нам не нужны.&lt;br /&gt;
Сообщение простое и ясное: компьютер с адресом 192.168.0.3 пытается использовать ARP для получения MAC-адреса компьютера, до которого хочет достучаться. Он пытался сделать это три раза с интервалом в одну секунду, но не получил ответа.&lt;br /&gt;
&lt;br /&gt;
Итак, мы можем сделать вывод, что с компьютером, адрес которого 192.168.0.3, все в порядке – он может получать пакеты от компьютеров сети с корректными IP-адресами, но компьютера с адресом 192.168.0.42 там просто нет.&lt;br /&gt;
&lt;br /&gt;
==Смотрим дальше==&lt;br /&gt;
&lt;br /&gt;
Вот другой пример. На клиентском компьютере установлен SUSE Linux 10.1. Проблема была в том, что каждый раз, когда браузер ''Konqueror''&lt;br /&gt;
пытался соединиться с внешним сайтом (т.е. производил поиск DNS-сервера), перед установкой соединения возникала 15-секундная задержка. Пакет 1 реализует стандартный запрос DNS для адреса [http://www.linuxformat.co.uk www.linuxformat.co.uk], а пакет 3 – ответ на этот запрос, который приходит через 0.04 с от сервера DNS, встроенного в мой маршрутизатор (192.168.0.1) с требуемым IP-адресом. Чудесно. Проблема в том, что ''Konqueror'' также решил запросить IPv6-адрес для этого сайта (запрос записи &amp;lt;fotn color=darkred&amp;gt;AAAA&amp;lt;/font&amp;gt; в пакете 2). Слава богу, маршрутизатор игнорирует этот запрос, и через пять секунд ''Konqueror'' перенаправляет этот запрос к маршрутизатору (пакет 7) и ко внешнему серверу DNS (пакет 6). Маршрутизатор все еще не отвечает, зато отвечает внешний DNS-сервер (пакет 8): сообщает, что не может найти записи &amp;lt;fotn color=darkred&amp;gt;AAAA&amp;lt;/font&amp;gt; для сайта [http://linux.format.co.uk linux.format.co.uk]. Ну, теперь помаленьку проясняется...&lt;br /&gt;
&lt;br /&gt;
DNS-ресолвер приписывает доменное имя по умолчанию &amp;lt;font color=blue&amp;gt;example.com&amp;lt;/font&amp;gt; к адресу, который он пытается преобразовать (в результате получаем бессмыслицу [http://www.linuxformat.co.uk.example.com www.linuxformat.co.uk.example.com]) и начинает поиск записей &amp;lt;font color=darkred&amp;gt;AAAA&amp;lt;/font&amp;gt; для этого адреса. Он тратит еще пять секунд, надеясь получить ответ от маршрутизатора, после чего еще раз пытается обратиться к внешнему серверу DNS (пакет 10). В конце концов занавес над этой печальной историей опускается, и через пятнадцать секунд после начала ''Konqueror'' создает соединение TCP/IP (пакеты с 17-го и далее), используя старый добрый адрес IPv4, с которого и начал.&lt;br /&gt;
&lt;br /&gt;
Оказалось, что это известная проблема, как свидетельствуют и результаты поиска Google по фразе ''“Konqueror IPv6”''. Решение простое: отключите стек протоколов IPv6 в ядре, отредактировав файл '''/etc/modprobe.conf''', и перезагрузите систему. Это хороший пример использования отслеживания пакетов для отладки, потому что другим способом решить эту проблему трудно. Не нужно проводить детальный анализ перехваченных пакетов, достаточно просто понять, что компьютер пытается разрешить имя в IPv6.&lt;br /&gt;
&lt;br /&gt;
Поиск неисправностей редко укладывается в обычные схемы диагностики. Ошибки имеют привычку просачиваться в щели между сложившейся литературой, и я уверен, что некоторые читатели (паратройка читателей у нас еще осталась, не правда ли?) столкнутся с ситуациями, в которых мои советы не помогут. Если у вас есть собственная история сетевых войн, которой вы хотели бы поделиться с нашими читателями, то отправьте нам ее на обычный адрес!&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%9D%D0%B5%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%B8%D0%B5_%D0%B0%D0%B2%D0%B8%D0%B0%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B</id>
		<title>Недорогие авиабилеты</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%9D%D0%B5%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%B8%D0%B5_%D0%B0%D0%B2%D0%B8%D0%B0%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B"/>
				<updated>2008-03-20T18:56:55Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Диагностика: проблемы с сетью==&lt;br /&gt;
&lt;br /&gt;
''Если сеть у вас захворала, зовите Доктора! Правда, домашних визитов к читателям '''д-р Крис Браун''' не делает, но готов поделиться диагнозом…''&lt;br /&gt;
&lt;br /&gt;
За годы жизни я помог многим друзьям и знакомым освоиться&lt;br /&gt;
с компьютером, и в подходящих случаях обучал их Linux. При этом, естественно, возникает нечто вроде родительской ответственности за развитие и взросление своих питомцев. Последний случай был типичным. Друг позвонил мне со словами: «У меня не работает сеть». Такое сообщение об ошибке не уступает классической фразе с борта Аполлона-13 «Хьюстон, у нас проблема», хотя и менее опасно для жизни. К счастью, в Linux много сетевых утилит, которые помогают выяснить, что именно не работает. (Чтобы не томить вас ожиданием развязки, сразу скажу, что моего друга просто отключил провайдер,&lt;br /&gt;
потому что он забыл продлить контракт.)&lt;br /&gt;
&lt;br /&gt;
Итак, следуйте за мной: рассмотрим некоторые средства диагностики сетевых неисправностей в Linux и посмотрим, как с их помощью&lt;br /&gt;
получить ответ на вопрос «Что не так в моей сети?»&lt;br /&gt;
&lt;br /&gt;
При любом поиске неисправностей прежде всего нужно понять и представить, в чем выражается правильная работа. Есть ли у компьютера статический IP-адрес, и если да, то какой? Пользуетесь ли вы DHCP, и если да, то каков адрес DHCP-сервера и выделяемый диапазон IP-адресов? Подключен ли широкополосный модем непосредственно к вашему компьютеру или у вас широкополосный маршрутизатор через Ethernet или беспроводную сеть?&lt;br /&gt;
&lt;br /&gt;
На данном уроке мы будем использовать методику «снизу вверх»: начнем с самых низких уровней и постепенно переедем на более высокие. Примерная последовательность тестов, которые мы выполним, показана на '''рис. 1'' в начале этой статьи слева. Это хороший систематический подход для случая, если сеть не работала никогда. С другой стороны, если вчера сеть работала отлично, чаще будет быстрее начать сверху и двигаться вниз.&lt;br /&gt;
&lt;br /&gt;
==='''Находит ли Linux сетевую карту?'''===&lt;br /&gt;
&lt;br /&gt;
Первый вопрос на этом этапе – видит ли Linux сетевые интерфейсы?&lt;br /&gt;
Вы сможете ответить на него, просмотрев системные сообщения ядра,&lt;br /&gt;
которые выдавались во время загрузки. Для этого используется команда &amp;lt;fotn color=darkred&amp;gt;dmesg&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # dmesg | grep eth&lt;br /&gt;
 e1000: eth0: e1000_probe: Intel(R) PRO/1000 Network Connection&lt;br /&gt;
 e1000: eth1: e1000_probe: Intel(R) PRO/1000 Network Connection&lt;br /&gt;
 e1000: eth0: e1000_watchdog: NIC Link is Up 10 Mbps Half Duplex&lt;br /&gt;
&lt;br /&gt;
В качестве альтернативы попробуйте вывести список устройств на шине с помощью команды &amp;lt;fotn color=darkred&amp;gt;lspci&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # lspci | grep Ethernet&lt;br /&gt;
 01:01.0 Ethernet controller: Intel Corporation 82547EI&lt;br /&gt;
 02:01.0 Ethernet controller: Intel Corporation 82540EM&lt;br /&gt;
&lt;br /&gt;
Сообщения об ошибках на этой стадии говорят о неисправном или несовместимом оборудовании.&lt;br /&gt;
&lt;br /&gt;
==='''Задан ли IP-адрес?'''===&lt;br /&gt;
&lt;br /&gt;
Если сетевая карта на месте, то следующий вопрос – задан ли IP-адрес? Простейшая команда для этого случая – &amp;lt;fotn color=darkred&amp;gt;ifconfig&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # ifconfig eth0&lt;br /&gt;
 eth0 Link encap:Ethernet HWaddr 00:0C:F1:96:A3:F7&lt;br /&gt;
 inet addr:192.168.0.3 Bcast:192.168.0.255 Mask:255.255.255.0&lt;br /&gt;
 inet6 addr: fe80::20c:f1ff:fe96:a3f7/64 Scope:Link&lt;br /&gt;
 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1&lt;br /&gt;
 RX packets:306 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
 TX packets:261 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
 collisions:8 txqueuelen:10&lt;br /&gt;
 RX bytes:43074 (42.0 KiB) TX bytes:34480 (33.6 KiB)&lt;br /&gt;
 Base address:0xac00 Memory:ff7e0000-ff800000&lt;br /&gt;
&lt;br /&gt;
Здесь важна вторая строка, в которой можно увидеть IP-адрес: &amp;lt;fotn color=darkred&amp;gt;192.168.0.3&amp;lt;/font&amp;gt;. Если такой строки нет, то IP-адрес не задан. А если все же задан, подумайте, действителен ли он в вашей сети.&lt;br /&gt;
&lt;br /&gt;
На практике я несколько раз сталкивался с ситуацией, когда сеть переставала работать после того, как в нее ввели компьютер, случайно&lt;br /&gt;
оказавшийся DHCP-сервером, настроенным на диапазон адресов, не соответствующих этой сети. При перезагрузке компьютер с шансами&lt;br /&gt;
50/50 получал или действительный IP-адрес от «настоящего» DHCP-сервера, или ложный адрес от самозванца.&lt;br /&gt;
&lt;br /&gt;
Если в сетевом интерфейсе не задан IP-адрес, то проверьте, настроен ли автоматический запуск этого интерфейса при загрузке системы. Если да, то использует ли он DHCP или статический IP-адрес? Конкретные имена файлов, которые нужно просмотреть, зависят от дистрибутива. В Fedora и Red Hat это '''/etc/sysconfig/network-scripts/ifcfg-eth*''', в SUSE – '''/etc/sysconfig/network/ifcfg-eth*''', а в Ubuntu – '''/etc/network/interfaces'''. (Стандарты – отличная штука: ну не прелестны ли эти ничем не объяснимые расхождения?) Конечно, в каждом из дистрибутивов есть графические утилиты, с помощью которых можно посмотреть и отредактировать настройки.&lt;br /&gt;
&lt;br /&gt;
Обычно инициализация интерфейса упрятана глубоко в загрузочные скрипты, и взаимодействие с сервером DHCP разглядеть трудно; но его можно увидеть, непосредственно запустив скрипт ifup или dhclient. Эта программа поддерживает диалог с DHCP-сервером и позволяет задать параметры сети:&lt;br /&gt;
&lt;br /&gt;
 # dhclient&lt;br /&gt;
 Internet Systems Consortium DHCP Client V3.0.5-RedHatо&lt;br /&gt;
 Copyright 2004-2006 Internet Systems Consortium.&lt;br /&gt;
 All rights reserved.&lt;br /&gt;
 For info, please visit http://www.isc.org/sw/dhcp/&lt;br /&gt;
 Listening on LPF/eth1/00:0e:0c:01:d3:a0&lt;br /&gt;
 Sending on LPF/eth1/00:0e:0c:01:d3:a0&lt;br /&gt;
 Listening on LPF/eth0/00:0c:f1:96:a3:f7&lt;br /&gt;
 Sending on LPF/eth0/00:0c:f1:96:a3:f7&lt;br /&gt;
 Sending on Socket/fallback&lt;br /&gt;
 DHCPDISCOVER on eth1 to 255.255.255.255 port 67 interval 7&lt;br /&gt;
 DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 4&lt;br /&gt;
 DHCPOFFER from 192.168.0.1&lt;br /&gt;
 DHCPREQUEST on eth0 to 255.255.255.255 port 67&lt;br /&gt;
 DHCPACK from 192.168.0.1&lt;br /&gt;
 bound to 192.168.0.3 -- renewal in 125868 seconds.&lt;br /&gt;
&lt;br /&gt;
В данной системе два интерфейса, '''eth0''' и '''eth1'''. Мы видим, что IP-адрес интерфейса '''eth0''' получен от DHCP-сервера 192.168.0.1. Интерфейс '''eth1''' пытался сделать то же самое (он передал команду &amp;lt;fotn color=darkred&amp;gt;DHCPDISCOVER&amp;lt;/font&amp;gt;), но не получил ответа. И неудивительно: этот интерфейс не был ни к чему подключен.&lt;br /&gt;
&lt;br /&gt;
==='''Пингуется ли маршрутизатор?'''===&lt;br /&gt;
&lt;br /&gt;
Если IP-адрес задан корректно, пропингуйте (&amp;lt;fotn color=darkred&amp;gt;ping&amp;lt;/font&amp;gt;) другой компьютер в сети. В случае удачи результат будет примерно таким:&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 192.168.0.6&lt;br /&gt;
 PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 192.168.0.6: icmp_seq=1 ttl=64 time=0.468 ms&lt;br /&gt;
 --- 192.168.0.6 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 0.468/0.468/0.468/0.000 ms&lt;br /&gt;
&lt;br /&gt;
а неудачи – таким:&lt;br /&gt;
&lt;br /&gt;
 # ping -c 1 192.168.0.2&lt;br /&gt;
 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.&lt;br /&gt;
 From 192.168.0.3 icmp_seq=1 Destination Host Unreachable&lt;br /&gt;
 --- 192.168.0.2 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms&lt;br /&gt;
&lt;br /&gt;
Сообщение &amp;lt;fotn color=darkred&amp;gt;«Узел недоступен»&amp;lt;/font&amp;gt; (&amp;lt;fotn color=darkred&amp;gt;Destination Host Unreachable&amp;lt;/font&amp;gt;) обычно значит, что целевой компьютер (здесь – 192.168.0.2) не подключен к сети или не работает и поэтому не может ответить на ARP-запрос MAC-адреса с моего компьютера. Это также может означать, что ваш компьютер не находит маршрут доступа к локальной сети; чаще всего это бывает, когда ваш IP-адрес не входит в данную сеть. Возможны и более сложные проблемы с маршрутизацией – впрочем, в домашней сети, где маршрут (по умолчанию) только один, это маловероятно. Если в вашей сети нет других компьютеров, можно попробовать пропинговать маршрутизатор (Вы ведь знаете адрес своего маршрутизатора?).&lt;br /&gt;
&lt;br /&gt;
Если не получилось, то проблема носит местный характер. Если сеть проводная, проверьте кабели. Зеленые светодиоды на сетевых карточках должны гореть &amp;lt;fotn color=darkblue&amp;gt;[некоторые сетевые карты имеют другой способ индикации подключения. В случае необходимости изучите инструкцию, – ''прим.ред.'']&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==='''Не блокирован ли трафик брандмауэром?'''===&lt;br /&gt;
&lt;br /&gt;
На некотором этапе нашего диагностирования полезно проверить, не чересчур ли «закручивает гайки» ваш брандмауэр. Самый быстрый&lt;br /&gt;
и грубый способ это узнать – и его предпочитают многие системные администраторы, если надо торопиться – удалить все правила брандмауэра командой&lt;br /&gt;
&lt;br /&gt;
 # iptables -F&lt;br /&gt;
&lt;br /&gt;
и посмотреть, изменится ли что-нибудь к лучшему. Если проблема исчезнет, то по крайней мере ясно, что ее причиной был брандмауэр.&lt;br /&gt;
Далее вам нужно перезагрузить компьютер (чтобы брандмауэр вновь заработал) и думать дальше. Не соблазняйтесь идеей оставить брандмауэр в отключке: это Плохая Идея!&lt;br /&gt;
&lt;br /&gt;
==='''5 Установлено ли ADSL-соединение ?'''===&lt;br /&gt;
&lt;br /&gt;
Если с самим маршрутизатором все в порядке, пора расширить охват. На маршрутизаторе должно быть еще несколько зеленых светодиодов (а если найти инструкцию к нему, то можно даже понять, что они означают), и по ним можно определить, подключен ли ADSL-модем маршрутизатора к провайдеру. У некоторых маршрутизаторов также есть возможность задать настройки и определить статус соединения с помощью web-приложения. Нас интересуют статус соединения (Connection Status) и IP-адрес, который провайдер назначил внешнему соединению. (Что это за адрес, не столь важно; главное, чтоб он был!) Разорвите соединение и заново установите его вручную, и попробуйте понять, на каком этапе возникает ошибка. Если соединения не добиться, нужно проверить провод, соединяющий маршрутизатор с телефонной линией (полезно подключить телефонную трубку, чтобы убедиться в наличии зуммера). Если провод в порядке, остается позвонить в службу поддержки провайдера. Приготовьте себе чашку кофе и вооружитесь интересной книжкой – ждать своей очереди на линии можно очень долго!&lt;br /&gt;
&lt;br /&gt;
==='''Пингуется ли удаленный сервер?'''===&lt;br /&gt;
&lt;br /&gt;
Если соединение с провайдером хорошее, тестированию пора подняться на уровень выше. Попробуйте пропинговать внешний компьютер с известным IP-адресом. Например, web-сервер Linux Format UK имеет адрес 89.167.142.11. (Конечно, он вполне может измениться, когда вы будете это читать, но пока для примера сгодится.)&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 89.167.142.11&lt;br /&gt;
 PING 89.167.142.11 (89.167.142.11) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 89.167.142.11: icmp_seq=1 ttl=56 time=24.3 ms&lt;br /&gt;
 --- 89.167.142.11 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 24.367/24.367/24.367/0.000 ms&lt;br /&gt;
&lt;br /&gt;
Если это работает, ваше сетевое соединение в порядке. В качестве последнего теста попробуйте добраться до удаленного компьютера по&lt;br /&gt;
его имени:&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 www.linuxformat.com&lt;br /&gt;
 PING www.linuxformat.com (89.167.142.11) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from kryten.future.net.uk (89.167.142.11): icmp_seq=1&lt;br /&gt;
 ttl=56 time=24.2 ms&lt;br /&gt;
 --- www.linuxformat.com ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 24.249/24.249/24.249/0.000 ms&lt;br /&gt;
&lt;br /&gt;
С помощью этого теста ошибки DNS сразу же выявляются, например:&lt;br /&gt;
&lt;br /&gt;
 $ ping www.prophylactic.gov&lt;br /&gt;
 ping: unknown host www.prophylactic.gov&lt;br /&gt;
&lt;br /&gt;
Если удаленный компьютер пингуется только по IP-адресу, но не по имени, пора изучать настройки вашего сервера DNS (LXF97). Для этого лучше всего подходит утилита ''dig''. Вот пример ее запуска (успешного). Не пугайтесь обилием подробностей; нужно лишь обратить внимание на запись &amp;lt;fotn color=darkred&amp;gt;A&amp;lt;/font&amp;gt; в разделе &amp;lt;fotn color=darkred&amp;gt;ANSWER&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # dig www.linuxformat.com&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.linuxformat.com&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 23236&lt;br /&gt;
 ;; flags: qr rd ra; QUERY:1, ANSWER:2, AUTHORITY:2,&lt;br /&gt;
 ADDITIONAL:2&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;www.linuxformat.com. IN A&lt;br /&gt;
 ;; ANSWER SECTION:&lt;br /&gt;
 www.linuxformat.com. 300 IN CNAME redirect1.future.net.uk.&lt;br /&gt;
 redirect1.future.net.uk. 300 IN A 89.167.142.11&lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 future.net.uk. 245 IN NS ns0.future.net.uk.&lt;br /&gt;
 future.net.uk. 245 IN NS ns1.future.net.uk.&lt;br /&gt;
 ;; ADDITIONAL SECTION:&lt;br /&gt;
 ns0.future.net.uk. 33231 IN A 89.167.142.1&lt;br /&gt;
 ns1.future.net.uk. 33231 IN A 89.167.143.1&lt;br /&gt;
 ;; Query time: 41 msec&lt;br /&gt;
 ;; SERVER: 192.168.0.1#53(192.168.0.1)&lt;br /&gt;
 ;; WHEN: Fri Jul 6 15:21:44 2007&lt;br /&gt;
 ;; MSG SIZE rcvd: 158&lt;br /&gt;
&lt;br /&gt;
Если DNS не работает, вариантов может быть несколько.&lt;br /&gt;
&lt;br /&gt;
В первом случае сервер DNS не может найти компьютер, к которому вы обращаетесь. Вот пример обращения к серверу, которого просто&lt;br /&gt;
не существует:&lt;br /&gt;
&lt;br /&gt;
 # dig prophylactic.gov&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; prophylactic.gov&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NXDOMAIN, id: 13168&lt;br /&gt;
 ;; flags: qr rd ra; QUERY:1, ANSWER:0, AUTHORITY:1,&lt;br /&gt;
 ADDITIONAL:0&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;prophylactic.gov. IN A&lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 gov. 2560 IN SOA a.gov.zoneedit.com. govcontact.&lt;br /&gt;
 zoneedit.com. 1183644065 3600 900 1814400 86400&lt;br /&gt;
&lt;br /&gt;
Обратите внимание на статус запроса &amp;lt;fotn color=darkred&amp;gt;NXDOMAIN&amp;lt;/font&amp;gt; и отсутствие раздела &amp;lt;fotn color=darkred&amp;gt;ANSWER&amp;lt;/font&amp;gt;, который мы видели в результатах предыдущего запроса. Если вы ввели корректное имя компьютера, то такая ошибка – следствие чьих-то чужих проблем.&lt;br /&gt;
&lt;br /&gt;
==='''Можете ли вы найти свой DNS-сервер?'''===&lt;br /&gt;
&lt;br /&gt;
Вторая причина отказа DNS – ваш компьютер не может найти DNS-сервер. Тогда источник проблемы, вероятно, ближе к дому.&lt;br /&gt;
&lt;br /&gt;
 # dig www.linuxformat.co.uk&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.linuxformat.co.uk&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; connection timed out; no servers could be reached&lt;br /&gt;
&lt;br /&gt;
Если это произошло, загляните в файл '''/etc/resolv.conf'''. В нем Linux хранит сведения о местонахождении DNS-серверов. Если вы пользуетесь DHCP, IP-адреса DNS-серверов предоставляются сервером DHCP. Если IP-адрес статический, вы, наверно, использовали графическую утилиту настройки для определения параметров серверов DNS (например, ''system-config-network'' в Fedora). В любом случае результаты записываются в этот файл. Есть ли в нем корректный адрес сервера имен? Можете ли вы пинговать его?&lt;br /&gt;
&lt;br /&gt;
Если ничто не помогает, попробуйте просмотреть сетевой трафик с помощью ''wireshark'', утилиты отслеживания пакетов, ранее известной как ethereal. Как средство диагностики ''wireshark'', на мой взгляд, «последняя надежда». Дело не в недоработке этой программы: программа-то отличная, но чтобы искать неполадки в сети путем изучения трафика на уровне пакетов, нужно очень хорошо знать TCP/IP и прикладные протоколы верхних уровней. Вам также может потребоваться дополнительный компьютер в сети для наблюдения за трафиком.&lt;br /&gt;
&lt;br /&gt;
Выполните команду&lt;br /&gt;
&lt;br /&gt;
 # ping 192.168.0.42&lt;br /&gt;
&lt;br /&gt;
на компьютере с IP-адресом 192.168.0.3. Посмотрите на верхнюю из трех панелей wireshark; в ней каждому перехваченному пакету соответствует одна строка. Средняя и нижняя панели позволяют разобраться в содержимом отдельных пакетов, но сейчас они нам не нужны.&lt;br /&gt;
Сообщение простое и ясное: компьютер с адресом 192.168.0.3 пытается использовать ARP для получения MAC-адреса компьютера, до которого хочет достучаться. Он пытался сделать это три раза с интервалом в одну секунду, но не получил ответа.&lt;br /&gt;
&lt;br /&gt;
Итак, мы можем сделать вывод, что с компьютером, адрес которого 192.168.0.3, все в порядке – он может получать пакеты от компьютеров сети с корректными IP-адресами, но компьютера с адресом 192.168.0.42 там просто нет.&lt;br /&gt;
&lt;br /&gt;
==Смотрим дальше==&lt;br /&gt;
&lt;br /&gt;
Вот другой пример. На клиентском компьютере установлен SUSE Linux 10.1. Проблема была в том, что каждый раз, когда браузер ''Konqueror''&lt;br /&gt;
пытался соединиться с внешним сайтом (т.е. производил поиск DNS-сервера), перед установкой соединения возникала 15-секундная задержка. Пакет 1 реализует стандартный запрос DNS для адреса [http://www.linuxformat.co.uk www.linuxformat.co.uk], а пакет 3 – ответ на этот запрос, который приходит через 0.04 с от сервера DNS, встроенного в мой маршрутизатор (192.168.0.1) с требуемым IP-адресом. Чудесно. Проблема в том, что ''Konqueror'' также решил запросить IPv6-адрес для этого сайта (запрос записи &amp;lt;fotn color=darkred&amp;gt;AAAA&amp;lt;/font&amp;gt; в пакете 2). Слава богу, маршрутизатор игнорирует этот запрос, и через пять секунд ''Konqueror'' перенаправляет этот запрос к маршрутизатору (пакет 7) и ко внешнему серверу DNS (пакет 6). Маршрутизатор все еще не отвечает, зато отвечает внешний DNS-сервер (пакет 8): сообщает, что не может найти записи &amp;lt;fotn color=darkred&amp;gt;AAAA&amp;lt;/font&amp;gt; для сайта [http://linux.format.co.uk linux.format.co.uk]. Ну, теперь помаленьку проясняется...&lt;br /&gt;
&lt;br /&gt;
DNS-ресолвер приписывает доменное имя по умолчанию &amp;lt;font color=blue&amp;gt;example.com&amp;lt;/font&amp;gt; к адресу, который он пытается преобразовать (в результате получаем бессмыслицу [http://www.linuxformat.co.uk.example.com www.linuxformat.co.uk.example.com]) и начинает поиск записей &amp;lt;font color=darkred&amp;gt;AAAA&amp;lt;/font&amp;gt; для этого адреса. Он тратит еще пять секунд, надеясь получить ответ от маршрутизатора, после чего еще раз пытается обратиться к внешнему серверу DNS (пакет 10). В конце концов занавес над этой печальной историей опускается, и через пятнадцать секунд после начала ''Konqueror'' создает соединение TCP/IP (пакеты с 17-го и далее), используя старый добрый адрес IPv4, с которого и начал.&lt;br /&gt;
&lt;br /&gt;
Оказалось, что это известная проблема, как свидетельствуют и результаты поиска Google по фразе ''“Konqueror IPv6”''. Решение простое: отключите стек протоколов IPv6 в ядре, отредактировав файл '''/etc/modprobe.conf''', и перезагрузите систему. Это хороший пример использования отслеживания пакетов для отладки, потому что другим способом решить эту проблему трудно. Не нужно проводить детальный анализ перехваченных пакетов, достаточно просто понять, что компьютер пытается разрешить имя в IPv6.&lt;br /&gt;
&lt;br /&gt;
Поиск неисправностей редко укладывается в обычные схемы диагностики. Ошибки имеют привычку просачиваться в щели между сложившейся литературой, и я уверен, что некоторые читатели (паратройка читателей у нас еще осталась, не правда ли?) столкнутся с ситуациями, в которых мои советы не помогут. Если у вас есть собственная история сетевых войн, которой вы хотели бы поделиться с нашими читателями, то отправьте нам ее на обычный адрес!&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%9D%D0%B5%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%B8%D0%B5_%D0%B0%D0%B2%D0%B8%D0%B0%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B</id>
		<title>Недорогие авиабилеты</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%9D%D0%B5%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%B8%D0%B5_%D0%B0%D0%B2%D0%B8%D0%B0%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B"/>
				<updated>2008-03-20T18:56:25Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Диагностика: проблемы с сетью==&lt;br /&gt;
&lt;br /&gt;
''Если сеть у вас захворала, зовите Доктора! Правда, домашних визитов к читателям '''д-р Крис Браун''' не делает, но готов поделиться диагнозом…''&lt;br /&gt;
&lt;br /&gt;
За годы жизни я помог многим друзьям и знакомым освоиться&lt;br /&gt;
с компьютером, и в подходящих случаях обучал их Linux. При этом, естественно, возникает нечто вроде родительской ответственности за развитие и взросление своих питомцев. Последний случай был типичным. Друг позвонил мне со словами: «У меня не работает сеть». Такое сообщение об ошибке не уступает классической фразе с борта Аполлона-13 «Хьюстон, у нас проблема», хотя и менее опасно для жизни. К счастью, в Linux много сетевых утилит, которые помогают выяснить, что именно не работает. (Чтобы не томить вас ожиданием развязки, сразу скажу, что моего друга просто отключил провайдер,&lt;br /&gt;
потому что он забыл продлить контракт.)&lt;br /&gt;
&lt;br /&gt;
Итак, следуйте за мной: рассмотрим некоторые средства диагностики сетевых неисправностей в Linux и посмотрим, как с их помощью&lt;br /&gt;
получить ответ на вопрос «Что не так в моей сети?»&lt;br /&gt;
&lt;br /&gt;
При любом поиске неисправностей прежде всего нужно понять и представить, в чем выражается правильная работа. Есть ли у компьютера статический IP-адрес, и если да, то какой? Пользуетесь ли вы DHCP, и если да, то каков адрес DHCP-сервера и выделяемый диапазон IP-адресов? Подключен ли широкополосный модем непосредственно к вашему компьютеру или у вас широкополосный маршрутизатор через Ethernet или беспроводную сеть?&lt;br /&gt;
&lt;br /&gt;
На данном уроке мы будем использовать методику «снизу вверх»: начнем с самых низких уровней и постепенно переедем на более высокие. Примерная последовательность тестов, которые мы выполним, показана на '''рис. 1'' в начале этой статьи слева. Это хороший систематический подход для случая, если сеть не работала никогда. С другой стороны, если вчера сеть работала отлично, чаще будет быстрее начать сверху и двигаться вниз.&lt;br /&gt;
&lt;br /&gt;
==='''Находит ли Linux сетевую карту?'''===&lt;br /&gt;
&lt;br /&gt;
Первый вопрос на этом этапе – видит ли Linux сетевые интерфейсы?&lt;br /&gt;
Вы сможете ответить на него, просмотрев системные сообщения ядра,&lt;br /&gt;
которые выдавались во время загрузки. Для этого используется команда &amp;lt;fotn color=darkred&amp;gt;dmesg&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # dmesg | grep eth&lt;br /&gt;
 e1000: eth0: e1000_probe: Intel(R) PRO/1000 Network Connection&lt;br /&gt;
 e1000: eth1: e1000_probe: Intel(R) PRO/1000 Network Connection&lt;br /&gt;
 e1000: eth0: e1000_watchdog: NIC Link is Up 10 Mbps Half Duplex&lt;br /&gt;
&lt;br /&gt;
В качестве альтернативы попробуйте вывести список устройств на шине с помощью команды &amp;lt;fotn color=darkred&amp;gt;lspci&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # lspci | grep Ethernet&lt;br /&gt;
 01:01.0 Ethernet controller: Intel Corporation 82547EI&lt;br /&gt;
 02:01.0 Ethernet controller: Intel Corporation 82540EM&lt;br /&gt;
&lt;br /&gt;
Сообщения об ошибках на этой стадии говорят о неисправном или несовместимом оборудовании.&lt;br /&gt;
&lt;br /&gt;
==='''Задан ли IP-адрес?'''===&lt;br /&gt;
&lt;br /&gt;
Если сетевая карта на месте, то следующий вопрос – задан ли IP-адрес? Простейшая команда для этого случая – &amp;lt;fotn color=darkred&amp;gt;ifconfig&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # ifconfig eth0&lt;br /&gt;
 eth0 Link encap:Ethernet HWaddr 00:0C:F1:96:A3:F7&lt;br /&gt;
 inet addr:192.168.0.3 Bcast:192.168.0.255 Mask:255.255.255.0&lt;br /&gt;
 inet6 addr: fe80::20c:f1ff:fe96:a3f7/64 Scope:Link&lt;br /&gt;
 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1&lt;br /&gt;
 RX packets:306 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
 TX packets:261 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
 collisions:8 txqueuelen:10&lt;br /&gt;
 RX bytes:43074 (42.0 KiB) TX bytes:34480 (33.6 KiB)&lt;br /&gt;
 Base address:0xac00 Memory:ff7e0000-ff800000&lt;br /&gt;
&lt;br /&gt;
Здесь важна вторая строка, в которой можно увидеть IP-адрес: &amp;lt;fotn color=darkred&amp;gt;192.168.0.3&amp;lt;/font&amp;gt;. Если такой строки нет, то IP-адрес не задан. А если все же задан, подумайте, действителен ли он в вашей сети.&lt;br /&gt;
&lt;br /&gt;
На практике я несколько раз сталкивался с ситуацией, когда сеть переставала работать после того, как в нее ввели компьютер, случайно&lt;br /&gt;
оказавшийся DHCP-сервером, настроенным на диапазон адресов, не соответствующих этой сети. При перезагрузке компьютер с шансами&lt;br /&gt;
50/50 получал или действительный IP-адрес от «настоящего» DHCP-сервера, или ложный адрес от самозванца.&lt;br /&gt;
&lt;br /&gt;
Если в сетевом интерфейсе не задан IP-адрес, то проверьте, настроен ли автоматический запуск этого интерфейса при загрузке системы. Если да, то использует ли он DHCP или статический IP-адрес? Конкретные имена файлов, которые нужно просмотреть, зависят от дистрибутива. В Fedora и Red Hat это '''/etc/sysconfig/network-scripts/ifcfg-eth*''', в SUSE – '''/etc/sysconfig/network/ifcfg-eth*''', а в Ubuntu – '''/etc/network/interfaces'''. (Стандарты – отличная штука: ну не прелестны ли эти ничем не объяснимые расхождения?) Конечно, в каждом из дистрибутивов есть графические утилиты, с помощью которых можно посмотреть и отредактировать настройки.&lt;br /&gt;
&lt;br /&gt;
Обычно инициализация интерфейса упрятана глубоко в загрузочные скрипты, и взаимодействие с сервером DHCP разглядеть трудно; но его можно увидеть, непосредственно запустив скрипт ifup или dhclient. Эта программа поддерживает диалог с DHCP-сервером и позволяет задать параметры сети:&lt;br /&gt;
&lt;br /&gt;
 # dhclient&lt;br /&gt;
 Internet Systems Consortium DHCP Client V3.0.5-RedHatо&lt;br /&gt;
 Copyright 2004-2006 Internet Systems Consortium.&lt;br /&gt;
 All rights reserved.&lt;br /&gt;
 For info, please visit http://www.isc.org/sw/dhcp/&lt;br /&gt;
 Listening on LPF/eth1/00:0e:0c:01:d3:a0&lt;br /&gt;
 Sending on LPF/eth1/00:0e:0c:01:d3:a0&lt;br /&gt;
 Listening on LPF/eth0/00:0c:f1:96:a3:f7&lt;br /&gt;
 Sending on LPF/eth0/00:0c:f1:96:a3:f7&lt;br /&gt;
 Sending on Socket/fallback&lt;br /&gt;
 DHCPDISCOVER on eth1 to 255.255.255.255 port 67 interval 7&lt;br /&gt;
 DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 4&lt;br /&gt;
 DHCPOFFER from 192.168.0.1&lt;br /&gt;
 DHCPREQUEST on eth0 to 255.255.255.255 port 67&lt;br /&gt;
 DHCPACK from 192.168.0.1&lt;br /&gt;
 bound to 192.168.0.3 -- renewal in 125868 seconds.&lt;br /&gt;
&lt;br /&gt;
В данной системе два интерфейса, '''eth0''' и '''eth1'''. Мы видим, что IP-адрес интерфейса '''eth0''' получен от DHCP-сервера 192.168.0.1. Интерфейс '''eth1''' пытался сделать то же самое (он передал команду &amp;lt;fotn color=darkred&amp;gt;DHCPDISCOVER&amp;lt;/font&amp;gt;), но не получил ответа. И неудивительно: этот интерфейс не был ни к чему подключен.&lt;br /&gt;
&lt;br /&gt;
==='''Пингуется ли маршрутизатор?'''===&lt;br /&gt;
&lt;br /&gt;
Если IP-адрес задан корректно, пропингуйте (&amp;lt;fotn color=darkred&amp;gt;ping&amp;lt;/font&amp;gt;) другой компьютер в сети. В случае удачи результат будет примерно таким:&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 192.168.0.6&lt;br /&gt;
 PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 192.168.0.6: icmp_seq=1 ttl=64 time=0.468 ms&lt;br /&gt;
 --- 192.168.0.6 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 0.468/0.468/0.468/0.000 ms&lt;br /&gt;
&lt;br /&gt;
а неудачи – таким:&lt;br /&gt;
&lt;br /&gt;
 # ping -c 1 192.168.0.2&lt;br /&gt;
 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.&lt;br /&gt;
 From 192.168.0.3 icmp_seq=1 Destination Host Unreachable&lt;br /&gt;
 --- 192.168.0.2 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms&lt;br /&gt;
&lt;br /&gt;
Сообщение &amp;lt;fotn color=darkred&amp;gt;«Узел недоступен»&amp;lt;/font&amp;gt; (&amp;lt;fotn color=darkred&amp;gt;Destination Host Unreachable&amp;lt;/font&amp;gt;) обычно значит, что целевой компьютер (здесь – 192.168.0.2) не подключен к сети или не работает и поэтому не может ответить на ARP-запрос MAC-адреса с моего компьютера. Это также может означать, что ваш компьютер не находит маршрут доступа к локальной сети; чаще всего это бывает, когда ваш IP-адрес не входит в данную сеть. Возможны и более сложные проблемы с маршрутизацией – впрочем, в домашней сети, где маршрут (по умолчанию) только один, это маловероятно. Если в вашей сети нет других компьютеров, можно попробовать пропинговать маршрутизатор (Вы ведь знаете адрес своего маршрутизатора?).&lt;br /&gt;
&lt;br /&gt;
Если не получилось, то проблема носит местный характер. Если сеть проводная, проверьте кабели. Зеленые светодиоды на сетевых карточках должны гореть &amp;lt;fotn color=darkblue&amp;gt;[некоторые сетевые карты имеют другой способ индикации подключения. В случае необходимости изучите инструкцию, – ''прим.ред.'']&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==='''Не блокирован ли трафик брандмауэром?'''===&lt;br /&gt;
&lt;br /&gt;
На некотором этапе нашего диагностирования полезно проверить, не чересчур ли «закручивает гайки» ваш брандмауэр. Самый быстрый&lt;br /&gt;
и грубый способ это узнать – и его предпочитают многие системные администраторы, если надо торопиться – удалить все правила брандмауэра командой&lt;br /&gt;
&lt;br /&gt;
 # iptables -F&lt;br /&gt;
&lt;br /&gt;
и посмотреть, изменится ли что-нибудь к лучшему. Если проблема исчезнет, то по крайней мере ясно, что ее причиной был брандмауэр.&lt;br /&gt;
Далее вам нужно перезагрузить компьютер (чтобы брандмауэр вновь заработал) и думать дальше. Не соблазняйтесь идеей оставить брандмауэр в отключке: это Плохая Идея!&lt;br /&gt;
&lt;br /&gt;
==='''5 Установлено ли ADSL-соединение ?'''===&lt;br /&gt;
&lt;br /&gt;
Если с самим маршрутизатором все в порядке, пора расширить охват. На маршрутизаторе должно быть еще несколько зеленых светодиодов (а если найти инструкцию к нему, то можно даже понять, что они означают), и по ним можно определить, подключен ли ADSL-модем маршрутизатора к провайдеру. У некоторых маршрутизаторов также есть возможность задать настройки и определить статус соединения с помощью web-приложения. Нас интересуют статус соединения (Connection Status) и IP-адрес, который провайдер назначил внешнему соединению. (Что это за адрес, не столь важно; главное, чтоб он был!) Разорвите соединение и заново установите его вручную, и попробуйте понять, на каком этапе возникает ошибка. Если соединения не добиться, нужно проверить провод, соединяющий маршрутизатор с телефонной линией (полезно подключить телефонную трубку, чтобы убедиться в наличии зуммера). Если провод в порядке, остается позвонить в службу поддержки провайдера. Приготовьте себе чашку кофе и вооружитесь интересной книжкой – ждать своей очереди на линии можно очень долго!&lt;br /&gt;
&lt;br /&gt;
==='''Пингуется ли удаленный сервер?'''===&lt;br /&gt;
&lt;br /&gt;
Если соединение с провайдером хорошее, тестированию пора подняться на уровень выше. Попробуйте пропинговать внешний компьютер с известным IP-адресом. Например, web-сервер Linux Format UK имеет адрес 89.167.142.11. (Конечно, он вполне может измениться, когда вы будете это читать, но пока для примера сгодится.)&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 89.167.142.11&lt;br /&gt;
 PING 89.167.142.11 (89.167.142.11) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 89.167.142.11: icmp_seq=1 ttl=56 time=24.3 ms&lt;br /&gt;
 --- 89.167.142.11 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 24.367/24.367/24.367/0.000 ms&lt;br /&gt;
&lt;br /&gt;
Если это работает, ваше сетевое соединение в порядке. В качестве последнего теста попробуйте добраться до удаленного компьютера по&lt;br /&gt;
его имени:&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 www.linuxformat.com&lt;br /&gt;
 PING www.linuxformat.com (89.167.142.11) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from kryten.future.net.uk (89.167.142.11): icmp_seq=1&lt;br /&gt;
 ttl=56 time=24.2 ms&lt;br /&gt;
 --- www.linuxformat.com ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 24.249/24.249/24.249/0.000 ms&lt;br /&gt;
&lt;br /&gt;
С помощью этого теста ошибки DNS сразу же выявляются, например:&lt;br /&gt;
&lt;br /&gt;
 $ ping www.prophylactic.gov&lt;br /&gt;
 ping: unknown host www.prophylactic.gov&lt;br /&gt;
&lt;br /&gt;
Если удаленный компьютер пингуется только по IP-адресу, но не по имени, пора изучать настройки вашего сервера DNS (LXF97). Для этого лучше всего подходит утилита ''dig''. Вот пример ее запуска (успешного). Не пугайтесь обилием подробностей; нужно лишь обратить внимание на запись &amp;lt;fotn color=darkred&amp;gt;A&amp;lt;/font&amp;gt; в разделе &amp;lt;fotn color=darkred&amp;gt;ANSWER&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # dig www.linuxformat.com&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.linuxformat.com&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 23236&lt;br /&gt;
 ;; flags: qr rd ra; QUERY:1, ANSWER:2, AUTHORITY:2,&lt;br /&gt;
 ADDITIONAL:2&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;www.linuxformat.com. IN A&lt;br /&gt;
 ;; ANSWER SECTION:&lt;br /&gt;
 www.linuxformat.com. 300 IN CNAME redirect1.future.net.uk.&lt;br /&gt;
 redirect1.future.net.uk. 300 IN A 89.167.142.11&lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 future.net.uk. 245 IN NS ns0.future.net.uk.&lt;br /&gt;
 future.net.uk. 245 IN NS ns1.future.net.uk.&lt;br /&gt;
 ;; ADDITIONAL SECTION:&lt;br /&gt;
 ns0.future.net.uk. 33231 IN A 89.167.142.1&lt;br /&gt;
 ns1.future.net.uk. 33231 IN A 89.167.143.1&lt;br /&gt;
 ;; Query time: 41 msec&lt;br /&gt;
 ;; SERVER: 192.168.0.1#53(192.168.0.1)&lt;br /&gt;
 ;; WHEN: Fri Jul 6 15:21:44 2007&lt;br /&gt;
 ;; MSG SIZE rcvd: 158&lt;br /&gt;
&lt;br /&gt;
Если DNS не работает, вариантов может быть несколько.&lt;br /&gt;
&lt;br /&gt;
В первом случае сервер DNS не может найти компьютер, к которому вы обращаетесь. Вот пример обращения к серверу, которого просто&lt;br /&gt;
не существует:&lt;br /&gt;
&lt;br /&gt;
 # dig prophylactic.gov&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; prophylactic.gov&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NXDOMAIN, id: 13168&lt;br /&gt;
 ;; flags: qr rd ra; QUERY:1, ANSWER:0, AUTHORITY:1,&lt;br /&gt;
 ADDITIONAL:0&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;prophylactic.gov. IN A&lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 gov. 2560 IN SOA a.gov.zoneedit.com. govcontact.&lt;br /&gt;
 zoneedit.com. 1183644065 3600 900 1814400 86400&lt;br /&gt;
&lt;br /&gt;
Обратите внимание на статус запроса &amp;lt;fotn color=darkred&amp;gt;NXDOMAIN&amp;lt;/font&amp;gt; и отсутствие раздела &amp;lt;fotn color=darkred&amp;gt;ANSWER&amp;lt;/font&amp;gt;, который мы видели в результатах предыдущего запроса. Если вы ввели корректное имя компьютера, то такая ошибка – следствие чьих-то чужих проблем.&lt;br /&gt;
&lt;br /&gt;
==='''Можете ли вы найти свой DNS-сервер?'''===&lt;br /&gt;
&lt;br /&gt;
Вторая причина отказа DNS – ваш компьютер не может найти DNS-сервер. Тогда источник проблемы, вероятно, ближе к дому.&lt;br /&gt;
&lt;br /&gt;
 # dig www.linuxformat.co.uk&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.linuxformat.co.uk&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; connection timed out; no servers could be reached&lt;br /&gt;
&lt;br /&gt;
Если это произошло, загляните в файл '''/etc/resolv.conf'''. В нем Linux хранит сведения о местонахождении DNS-серверов. Если вы пользуетесь DHCP, IP-адреса DNS-серверов предоставляются сервером DHCP. Если IP-адрес статический, вы, наверно, использовали графическую утилиту настройки для определения параметров серверов DNS (например, ''system-config-network'' в Fedora). В любом случае результаты записываются в этот файл. Есть ли в нем корректный адрес сервера имен? Можете ли вы пинговать его?&lt;br /&gt;
&lt;br /&gt;
Если ничто не помогает, попробуйте просмотреть сетевой трафик с помощью ''wireshark'', утилиты отслеживания пакетов, ранее известной как ethereal. Как средство диагностики ''wireshark'', на мой взгляд, «последняя надежда». Дело не в недоработке этой программы: программа-то отличная, но чтобы искать неполадки в сети путем изучения трафика на уровне пакетов, нужно очень хорошо знать TCP/IP и прикладные протоколы верхних уровней. Вам также может потребоваться дополнительный компьютер в сети для наблюдения за трафиком.&lt;br /&gt;
&lt;br /&gt;
Выполните команду&lt;br /&gt;
&lt;br /&gt;
 # ping 192.168.0.42&lt;br /&gt;
&lt;br /&gt;
на компьютере с IP-адресом 192.168.0.3. Посмотрите на верхнюю из трех панелей wireshark; в ней каждому перехваченному пакету соответствует одна строка. Средняя и нижняя панели позволяют разобраться в содержимом отдельных пакетов, но сейчас они нам не нужны.&lt;br /&gt;
Сообщение простое и ясное: компьютер с адресом 192.168.0.3 пытается использовать ARP для получения MAC-адреса компьютера, до которого хочет достучаться. Он пытался сделать это три раза с интервалом в одну секунду, но не получил ответа.&lt;br /&gt;
&lt;br /&gt;
Итак, мы можем сделать вывод, что с компьютером, адрес которого 192.168.0.3, все в порядке – он может получать пакеты от компьютеров сети с корректными IP-адресами, но компьютера с адресом 192.168.0.42 там просто нет.&lt;br /&gt;
&lt;br /&gt;
===Смотрим дальше===&lt;br /&gt;
&lt;br /&gt;
Вот другой пример. На клиентском компьютере установлен SUSE Linux 10.1. Проблема была в том, что каждый раз, когда браузер ''Konqueror''&lt;br /&gt;
пытался соединиться с внешним сайтом (т.е. производил поиск DNS-сервера), перед установкой соединения возникала 15-секундная задержка. Пакет 1 реализует стандартный запрос DNS для адреса [http://www.linuxformat.co.uk www.linuxformat.co.uk], а пакет 3 – ответ на этот запрос, который приходит через 0.04 с от сервера DNS, встроенного в мой маршрутизатор (192.168.0.1) с требуемым IP-адресом. Чудесно. Проблема в том, что ''Konqueror'' также решил запросить IPv6-адрес для этого сайта (запрос записи &amp;lt;fotn color=darkred&amp;gt;AAAA&amp;lt;/font&amp;gt; в пакете 2). Слава богу, маршрутизатор игнорирует этот запрос, и через пять секунд ''Konqueror'' перенаправляет этот запрос к маршрутизатору (пакет 7) и ко внешнему серверу DNS (пакет 6). Маршрутизатор все еще не отвечает, зато отвечает внешний DNS-сервер (пакет 8): сообщает, что не может найти записи &amp;lt;fotn color=darkred&amp;gt;AAAA&amp;lt;/font&amp;gt; для сайта [http://linux.format.co.uk linux.format.co.uk]. Ну, теперь помаленьку проясняется...&lt;br /&gt;
&lt;br /&gt;
DNS-ресолвер приписывает доменное имя по умолчанию &amp;lt;font color=blue&amp;gt;example.com&amp;lt;/font&amp;gt; к адресу, который он пытается преобразовать (в результате получаем бессмыслицу [http://www.linuxformat.co.uk.example.com www.linuxformat.co.uk.example.com]) и начинает поиск записей &amp;lt;font color=darkred&amp;gt;AAAA&amp;lt;/font&amp;gt; для этого адреса. Он тратит еще пять секунд, надеясь получить ответ от маршрутизатора, после чего еще раз пытается обратиться к внешнему серверу DNS (пакет 10). В конце концов занавес над этой печальной историей опускается, и через пятнадцать секунд после начала ''Konqueror'' создает соединение TCP/IP (пакеты с 17-го и далее), используя старый добрый адрес IPv4, с которого и начал.&lt;br /&gt;
&lt;br /&gt;
Оказалось, что это известная проблема, как свидетельствуют и результаты поиска Google по фразе ''“Konqueror IPv6”''. Решение простое: отключите стек протоколов IPv6 в ядре, отредактировав файл '''/etc/modprobe.conf''', и перезагрузите систему. Это хороший пример использования отслеживания пакетов для отладки, потому что другим способом решить эту проблему трудно. Не нужно проводить детальный анализ перехваченных пакетов, достаточно просто понять, что компьютер пытается разрешить имя в IPv6.&lt;br /&gt;
&lt;br /&gt;
Поиск неисправностей редко укладывается в обычные схемы диагностики. Ошибки имеют привычку просачиваться в щели между сложившейся литературой, и я уверен, что некоторые читатели (паратройка читателей у нас еще осталась, не правда ли?) столкнутся с ситуациями, в которых мои советы не помогут. Если у вас есть собственная история сетевых войн, которой вы хотели бы поделиться с нашими читателями, то отправьте нам ее на обычный адрес!&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%9D%D0%B5%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%B8%D0%B5_%D0%B0%D0%B2%D0%B8%D0%B0%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B</id>
		<title>Недорогие авиабилеты</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%9D%D0%B5%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%B8%D0%B5_%D0%B0%D0%B2%D0%B8%D0%B0%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B"/>
				<updated>2008-03-20T18:55:38Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Диагностика: проблемы с сетью==&lt;br /&gt;
&lt;br /&gt;
''Если сеть у вас захворала, зовите Доктора! Правда, домашних визитов к читателям '''д-р Крис Браун''' не делает, но готов поделиться диагнозом…''&lt;br /&gt;
&lt;br /&gt;
За годы жизни я помог многим друзьям и знакомым освоиться&lt;br /&gt;
с компьютером, и в подходящих случаях обучал их Linux. При этом, естественно, возникает нечто вроде родительской ответственности за развитие и взросление своих питомцев. Последний случай был типичным. Друг позвонил мне со словами: «У меня не работает сеть». Такое сообщение об ошибке не уступает классической фразе с борта Аполлона-13 «Хьюстон, у нас проблема», хотя и менее опасно для жизни. К счастью, в Linux много сетевых утилит, которые помогают выяснить, что именно не работает. (Чтобы не томить вас ожиданием развязки, сразу скажу, что моего друга просто отключил провайдер,&lt;br /&gt;
потому что он забыл продлить контракт.)&lt;br /&gt;
&lt;br /&gt;
Итак, следуйте за мной: рассмотрим некоторые средства диагностики сетевых неисправностей в Linux и посмотрим, как с их помощью&lt;br /&gt;
получить ответ на вопрос «Что не так в моей сети?»&lt;br /&gt;
&lt;br /&gt;
При любом поиске неисправностей прежде всего нужно понять и представить, в чем выражается правильная работа. Есть ли у компьютера статический IP-адрес, и если да, то какой? Пользуетесь ли вы DHCP, и если да, то каков адрес DHCP-сервера и выделяемый диапазон IP-адресов? Подключен ли широкополосный модем непосредственно к вашему компьютеру или у вас широкополосный маршрутизатор через Ethernet или беспроводную сеть?&lt;br /&gt;
&lt;br /&gt;
На данном уроке мы будем использовать методику «снизу вверх»: начнем с самых низких уровней и постепенно переедем на более высокие. Примерная последовательность тестов, которые мы выполним, показана на '''рис. 1'' в начале этой статьи слева. Это хороший систематический подход для случая, если сеть не работала никогда. С другой стороны, если вчера сеть работала отлично, чаще будет быстрее начать сверху и двигаться вниз.&lt;br /&gt;
&lt;br /&gt;
==='''1 Находит ли Linux сетевую карту?'''===&lt;br /&gt;
&lt;br /&gt;
Первый вопрос на этом этапе – видит ли Linux сетевые интерфейсы?&lt;br /&gt;
Вы сможете ответить на него, просмотрев системные сообщения ядра,&lt;br /&gt;
которые выдавались во время загрузки. Для этого используется команда &amp;lt;fotn color=darkred&amp;gt;dmesg&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # dmesg | grep eth&lt;br /&gt;
 e1000: eth0: e1000_probe: Intel(R) PRO/1000 Network Connection&lt;br /&gt;
 e1000: eth1: e1000_probe: Intel(R) PRO/1000 Network Connection&lt;br /&gt;
 e1000: eth0: e1000_watchdog: NIC Link is Up 10 Mbps Half Duplex&lt;br /&gt;
&lt;br /&gt;
В качестве альтернативы попробуйте вывести список устройств на шине с помощью команды &amp;lt;fotn color=darkred&amp;gt;lspci&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # lspci | grep Ethernet&lt;br /&gt;
 01:01.0 Ethernet controller: Intel Corporation 82547EI&lt;br /&gt;
 02:01.0 Ethernet controller: Intel Corporation 82540EM&lt;br /&gt;
&lt;br /&gt;
Сообщения об ошибках на этой стадии говорят о неисправном или несовместимом оборудовании.&lt;br /&gt;
&lt;br /&gt;
==='''2 Задан ли IP-адрес?'''===&lt;br /&gt;
&lt;br /&gt;
Если сетевая карта на месте, то следующий вопрос – задан ли IP-адрес? Простейшая команда для этого случая – &amp;lt;fotn color=darkred&amp;gt;ifconfig&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # ifconfig eth0&lt;br /&gt;
 eth0 Link encap:Ethernet HWaddr 00:0C:F1:96:A3:F7&lt;br /&gt;
 inet addr:192.168.0.3 Bcast:192.168.0.255 Mask:255.255.255.0&lt;br /&gt;
 inet6 addr: fe80::20c:f1ff:fe96:a3f7/64 Scope:Link&lt;br /&gt;
 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1&lt;br /&gt;
 RX packets:306 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
 TX packets:261 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
 collisions:8 txqueuelen:10&lt;br /&gt;
 RX bytes:43074 (42.0 KiB) TX bytes:34480 (33.6 KiB)&lt;br /&gt;
 Base address:0xac00 Memory:ff7e0000-ff800000&lt;br /&gt;
&lt;br /&gt;
Здесь важна вторая строка, в которой можно увидеть IP-адрес: &amp;lt;fotn color=darkred&amp;gt;192.168.0.3&amp;lt;/font&amp;gt;. Если такой строки нет, то IP-адрес не задан. А если все же задан, подумайте, действителен ли он в вашей сети.&lt;br /&gt;
&lt;br /&gt;
На практике я несколько раз сталкивался с ситуацией, когда сеть переставала работать после того, как в нее ввели компьютер, случайно&lt;br /&gt;
оказавшийся DHCP-сервером, настроенным на диапазон адресов, не соответствующих этой сети. При перезагрузке компьютер с шансами&lt;br /&gt;
50/50 получал или действительный IP-адрес от «настоящего» DHCP-сервера, или ложный адрес от самозванца.&lt;br /&gt;
&lt;br /&gt;
Если в сетевом интерфейсе не задан IP-адрес, то проверьте, настроен ли автоматический запуск этого интерфейса при загрузке системы. Если да, то использует ли он DHCP или статический IP-адрес? Конкретные имена файлов, которые нужно просмотреть, зависят от дистрибутива. В Fedora и Red Hat это '''/etc/sysconfig/network-scripts/ifcfg-eth*''', в SUSE – '''/etc/sysconfig/network/ifcfg-eth*''', а в Ubuntu – '''/etc/network/interfaces'''. (Стандарты – отличная штука: ну не прелестны ли эти ничем не объяснимые расхождения?) Конечно, в каждом из дистрибутивов есть графические утилиты, с помощью которых можно посмотреть и отредактировать настройки.&lt;br /&gt;
&lt;br /&gt;
Обычно инициализация интерфейса упрятана глубоко в загрузочные скрипты, и взаимодействие с сервером DHCP разглядеть трудно; но его можно увидеть, непосредственно запустив скрипт ifup или dhclient. Эта программа поддерживает диалог с DHCP-сервером и позволяет задать параметры сети:&lt;br /&gt;
&lt;br /&gt;
 # dhclient&lt;br /&gt;
 Internet Systems Consortium DHCP Client V3.0.5-RedHatо&lt;br /&gt;
 Copyright 2004-2006 Internet Systems Consortium.&lt;br /&gt;
 All rights reserved.&lt;br /&gt;
 For info, please visit http://www.isc.org/sw/dhcp/&lt;br /&gt;
 Listening on LPF/eth1/00:0e:0c:01:d3:a0&lt;br /&gt;
 Sending on LPF/eth1/00:0e:0c:01:d3:a0&lt;br /&gt;
 Listening on LPF/eth0/00:0c:f1:96:a3:f7&lt;br /&gt;
 Sending on LPF/eth0/00:0c:f1:96:a3:f7&lt;br /&gt;
 Sending on Socket/fallback&lt;br /&gt;
 DHCPDISCOVER on eth1 to 255.255.255.255 port 67 interval 7&lt;br /&gt;
 DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 4&lt;br /&gt;
 DHCPOFFER from 192.168.0.1&lt;br /&gt;
 DHCPREQUEST on eth0 to 255.255.255.255 port 67&lt;br /&gt;
 DHCPACK from 192.168.0.1&lt;br /&gt;
 bound to 192.168.0.3 -- renewal in 125868 seconds.&lt;br /&gt;
&lt;br /&gt;
В данной системе два интерфейса, '''eth0''' и '''eth1'''. Мы видим, что IP-адрес интерфейса '''eth0''' получен от DHCP-сервера 192.168.0.1. Интерфейс '''eth1''' пытался сделать то же самое (он передал команду &amp;lt;fotn color=darkred&amp;gt;DHCPDISCOVER&amp;lt;/font&amp;gt;), но не получил ответа. И неудивительно: этот интерфейс не был ни к чему подключен.&lt;br /&gt;
&lt;br /&gt;
==='''3 Пингуется ли маршрутизатор?'''===&lt;br /&gt;
&lt;br /&gt;
Если IP-адрес задан корректно, пропингуйте (&amp;lt;fotn color=darkred&amp;gt;ping&amp;lt;/font&amp;gt;) другой компьютер в сети. В случае удачи результат будет примерно таким:&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 192.168.0.6&lt;br /&gt;
 PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 192.168.0.6: icmp_seq=1 ttl=64 time=0.468 ms&lt;br /&gt;
 --- 192.168.0.6 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 0.468/0.468/0.468/0.000 ms&lt;br /&gt;
&lt;br /&gt;
а неудачи – таким:&lt;br /&gt;
&lt;br /&gt;
 # ping -c 1 192.168.0.2&lt;br /&gt;
 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.&lt;br /&gt;
 From 192.168.0.3 icmp_seq=1 Destination Host Unreachable&lt;br /&gt;
 --- 192.168.0.2 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms&lt;br /&gt;
&lt;br /&gt;
Сообщение &amp;lt;fotn color=darkred&amp;gt;«Узел недоступен»&amp;lt;/font&amp;gt; (&amp;lt;fotn color=darkred&amp;gt;Destination Host Unreachable&amp;lt;/font&amp;gt;) обычно значит, что целевой компьютер (здесь – 192.168.0.2) не подключен к сети или не работает и поэтому не может ответить на ARP-запрос MAC-адреса с моего компьютера. Это также может означать, что ваш компьютер не находит маршрут доступа к локальной сети; чаще всего это бывает, когда ваш IP-адрес не входит в данную сеть. Возможны и более сложные проблемы с маршрутизацией – впрочем, в домашней сети, где маршрут (по умолчанию) только один, это маловероятно. Если в вашей сети нет других компьютеров, можно попробовать пропинговать маршрутизатор (Вы ведь знаете адрес своего маршрутизатора?).&lt;br /&gt;
&lt;br /&gt;
Если не получилось, то проблема носит местный характер. Если сеть проводная, проверьте кабели. Зеленые светодиоды на сетевых карточках должны гореть &amp;lt;fotn color=darkblue&amp;gt;[некоторые сетевые карты имеют другой способ индикации подключения. В случае необходимости изучите инструкцию, – ''прим.ред.'']&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==='''4 Не блокирован ли трафик брандмауэром?'''===&lt;br /&gt;
&lt;br /&gt;
На некотором этапе нашего диагностирования полезно проверить, не чересчур ли «закручивает гайки» ваш брандмауэр. Самый быстрый&lt;br /&gt;
и грубый способ это узнать – и его предпочитают многие системные администраторы, если надо торопиться – удалить все правила брандмауэра командой&lt;br /&gt;
&lt;br /&gt;
 # iptables -F&lt;br /&gt;
&lt;br /&gt;
и посмотреть, изменится ли что-нибудь к лучшему. Если проблема исчезнет, то по крайней мере ясно, что ее причиной был брандмауэр.&lt;br /&gt;
Далее вам нужно перезагрузить компьютер (чтобы брандмауэр вновь заработал) и думать дальше. Не соблазняйтесь идеей оставить брандмауэр в отключке: это Плохая Идея!&lt;br /&gt;
&lt;br /&gt;
==='''5 Установлено ли ADSL-соединение ?'''===&lt;br /&gt;
&lt;br /&gt;
Если с самим маршрутизатором все в порядке, пора расширить охват. На маршрутизаторе должно быть еще несколько зеленых светодиодов (а если найти инструкцию к нему, то можно даже понять, что они означают), и по ним можно определить, подключен ли ADSL-модем маршрутизатора к провайдеру. У некоторых маршрутизаторов также есть возможность задать настройки и определить статус соединения с помощью web-приложения. Нас интересуют статус соединения (Connection Status) и IP-адрес, который провайдер назначил внешнему соединению. (Что это за адрес, не столь важно; главное, чтоб он был!) Разорвите соединение и заново установите его вручную, и попробуйте понять, на каком этапе возникает ошибка. Если соединения не добиться, нужно проверить провод, соединяющий маршрутизатор с телефонной линией (полезно подключить телефонную трубку, чтобы убедиться в наличии зуммера). Если провод в порядке, остается позвонить в службу поддержки провайдера. Приготовьте себе чашку кофе и вооружитесь интересной книжкой – ждать своей очереди на линии можно очень долго!&lt;br /&gt;
&lt;br /&gt;
==='''6 Пингуется ли удаленный сервер?'''===&lt;br /&gt;
&lt;br /&gt;
Если соединение с провайдером хорошее, тестированию пора подняться на уровень выше. Попробуйте пропинговать внешний компьютер с известным IP-адресом. Например, web-сервер Linux Format UK имеет адрес 89.167.142.11. (Конечно, он вполне может измениться, когда вы будете это читать, но пока для примера сгодится.)&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 89.167.142.11&lt;br /&gt;
 PING 89.167.142.11 (89.167.142.11) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 89.167.142.11: icmp_seq=1 ttl=56 time=24.3 ms&lt;br /&gt;
 --- 89.167.142.11 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 24.367/24.367/24.367/0.000 ms&lt;br /&gt;
&lt;br /&gt;
Если это работает, ваше сетевое соединение в порядке. В качестве последнего теста попробуйте добраться до удаленного компьютера по&lt;br /&gt;
его имени:&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 www.linuxformat.com&lt;br /&gt;
 PING www.linuxformat.com (89.167.142.11) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from kryten.future.net.uk (89.167.142.11): icmp_seq=1&lt;br /&gt;
 ttl=56 time=24.2 ms&lt;br /&gt;
 --- www.linuxformat.com ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 24.249/24.249/24.249/0.000 ms&lt;br /&gt;
&lt;br /&gt;
С помощью этого теста ошибки DNS сразу же выявляются, например:&lt;br /&gt;
&lt;br /&gt;
 $ ping www.prophylactic.gov&lt;br /&gt;
 ping: unknown host www.prophylactic.gov&lt;br /&gt;
&lt;br /&gt;
Если удаленный компьютер пингуется только по IP-адресу, но не по имени, пора изучать настройки вашего сервера DNS (LXF97). Для этого лучше всего подходит утилита ''dig''. Вот пример ее запуска (успешного). Не пугайтесь обилием подробностей; нужно лишь обратить внимание на запись &amp;lt;fotn color=darkred&amp;gt;A&amp;lt;/font&amp;gt; в разделе &amp;lt;fotn color=darkred&amp;gt;ANSWER&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # dig www.linuxformat.com&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.linuxformat.com&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 23236&lt;br /&gt;
 ;; flags: qr rd ra; QUERY:1, ANSWER:2, AUTHORITY:2,&lt;br /&gt;
 ADDITIONAL:2&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;www.linuxformat.com. IN A&lt;br /&gt;
 ;; ANSWER SECTION:&lt;br /&gt;
 www.linuxformat.com. 300 IN CNAME redirect1.future.net.uk.&lt;br /&gt;
 redirect1.future.net.uk. 300 IN A 89.167.142.11&lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 future.net.uk. 245 IN NS ns0.future.net.uk.&lt;br /&gt;
 future.net.uk. 245 IN NS ns1.future.net.uk.&lt;br /&gt;
 ;; ADDITIONAL SECTION:&lt;br /&gt;
 ns0.future.net.uk. 33231 IN A 89.167.142.1&lt;br /&gt;
 ns1.future.net.uk. 33231 IN A 89.167.143.1&lt;br /&gt;
 ;; Query time: 41 msec&lt;br /&gt;
 ;; SERVER: 192.168.0.1#53(192.168.0.1)&lt;br /&gt;
 ;; WHEN: Fri Jul 6 15:21:44 2007&lt;br /&gt;
 ;; MSG SIZE rcvd: 158&lt;br /&gt;
&lt;br /&gt;
Если DNS не работает, вариантов может быть несколько.&lt;br /&gt;
&lt;br /&gt;
В первом случае сервер DNS не может найти компьютер, к которому вы обращаетесь. Вот пример обращения к серверу, которого просто&lt;br /&gt;
не существует:&lt;br /&gt;
&lt;br /&gt;
 # dig prophylactic.gov&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; prophylactic.gov&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NXDOMAIN, id: 13168&lt;br /&gt;
 ;; flags: qr rd ra; QUERY:1, ANSWER:0, AUTHORITY:1,&lt;br /&gt;
 ADDITIONAL:0&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;prophylactic.gov. IN A&lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 gov. 2560 IN SOA a.gov.zoneedit.com. govcontact.&lt;br /&gt;
 zoneedit.com. 1183644065 3600 900 1814400 86400&lt;br /&gt;
&lt;br /&gt;
Обратите внимание на статус запроса &amp;lt;fotn color=darkred&amp;gt;NXDOMAIN&amp;lt;/font&amp;gt; и отсутствие раздела &amp;lt;fotn color=darkred&amp;gt;ANSWER&amp;lt;/font&amp;gt;, который мы видели в результатах предыдущего запроса. Если вы ввели корректное имя компьютера, то такая ошибка – следствие чьих-то чужих проблем.&lt;br /&gt;
&lt;br /&gt;
==='''7 Можете ли вы найти свой DNS-сервер?'''===&lt;br /&gt;
&lt;br /&gt;
Вторая причина отказа DNS – ваш компьютер не может найти DNS-сервер. Тогда источник проблемы, вероятно, ближе к дому.&lt;br /&gt;
&lt;br /&gt;
 # dig www.linuxformat.co.uk&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.linuxformat.co.uk&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; connection timed out; no servers could be reached&lt;br /&gt;
&lt;br /&gt;
Если это произошло, загляните в файл '''/etc/resolv.conf'''. В нем Linux хранит сведения о местонахождении DNS-серверов. Если вы пользуетесь DHCP, IP-адреса DNS-серверов предоставляются сервером DHCP. Если IP-адрес статический, вы, наверно, использовали графическую утилиту настройки для определения параметров серверов DNS (например, ''system-config-network'' в Fedora). В любом случае результаты записываются в этот файл. Есть ли в нем корректный адрес сервера имен? Можете ли вы пинговать его?&lt;br /&gt;
&lt;br /&gt;
Если ничто не помогает, попробуйте просмотреть сетевой трафик с помощью ''wireshark'', утилиты отслеживания пакетов, ранее известной как ethereal. Как средство диагностики ''wireshark'', на мой взгляд, «последняя надежда». Дело не в недоработке этой программы: программа-то отличная, но чтобы искать неполадки в сети путем изучения трафика на уровне пакетов, нужно очень хорошо знать TCP/IP и прикладные протоколы верхних уровней. Вам также может потребоваться дополнительный компьютер в сети для наблюдения за трафиком.&lt;br /&gt;
&lt;br /&gt;
Выполните команду&lt;br /&gt;
&lt;br /&gt;
 # ping 192.168.0.42&lt;br /&gt;
&lt;br /&gt;
на компьютере с IP-адресом 192.168.0.3. Посмотрите на верхнюю из трех панелей wireshark; в ней каждому перехваченному пакету соответствует одна строка. Средняя и нижняя панели позволяют разобраться в содержимом отдельных пакетов, но сейчас они нам не нужны.&lt;br /&gt;
Сообщение простое и ясное: компьютер с адресом 192.168.0.3 пытается использовать ARP для получения MAC-адреса компьютера, до которого хочет достучаться. Он пытался сделать это три раза с интервалом в одну секунду, но не получил ответа.&lt;br /&gt;
&lt;br /&gt;
Итак, мы можем сделать вывод, что с компьютером, адрес которого 192.168.0.3, все в порядке – он может получать пакеты от компьютеров сети с корректными IP-адресами, но компьютера с адресом 192.168.0.42 там просто нет.&lt;br /&gt;
&lt;br /&gt;
===Смотрим дальше===&lt;br /&gt;
&lt;br /&gt;
Вот другой пример. На клиентском компьютере установлен SUSE Linux 10.1. Проблема была в том, что каждый раз, когда браузер ''Konqueror''&lt;br /&gt;
пытался соединиться с внешним сайтом (т.е. производил поиск DNS-сервера), перед установкой соединения возникала 15-секундная задержка. Пакет 1 реализует стандартный запрос DNS для адреса [http://www.linuxformat.co.uk www.linuxformat.co.uk], а пакет 3 – ответ на этот запрос, который приходит через 0.04 с от сервера DNS, встроенного в мой маршрутизатор (192.168.0.1) с требуемым IP-адресом. Чудесно. Проблема в том, что ''Konqueror'' также решил запросить IPv6-адрес для этого сайта (запрос записи &amp;lt;fotn color=darkred&amp;gt;AAAA&amp;lt;/font&amp;gt; в пакете 2). Слава богу, маршрутизатор игнорирует этот запрос, и через пять секунд ''Konqueror'' перенаправляет этот запрос к маршрутизатору (пакет 7) и ко внешнему серверу DNS (пакет 6). Маршрутизатор все еще не отвечает, зато отвечает внешний DNS-сервер (пакет 8): сообщает, что не может найти записи &amp;lt;fotn color=darkred&amp;gt;AAAA&amp;lt;/font&amp;gt; для сайта [http://linux.format.co.uk linux.format.co.uk]. Ну, теперь помаленьку проясняется...&lt;br /&gt;
&lt;br /&gt;
DNS-ресолвер приписывает доменное имя по умолчанию &amp;lt;font color=blue&amp;gt;example.com&amp;lt;/font&amp;gt; к адресу, который он пытается преобразовать (в результате получаем бессмыслицу [http://www.linuxformat.co.uk.example.com www.linuxformat.co.uk.example.com]) и начинает поиск записей &amp;lt;font color=darkred&amp;gt;AAAA&amp;lt;/font&amp;gt; для этого адреса. Он тратит еще пять секунд, надеясь получить ответ от маршрутизатора, после чего еще раз пытается обратиться к внешнему серверу DNS (пакет 10). В конце концов занавес над этой печальной историей опускается, и через пятнадцать секунд после начала ''Konqueror'' создает соединение TCP/IP (пакеты с 17-го и далее), используя старый добрый адрес IPv4, с которого и начал.&lt;br /&gt;
&lt;br /&gt;
Оказалось, что это известная проблема, как свидетельствуют и результаты поиска Google по фразе ''“Konqueror IPv6”''. Решение простое: отключите стек протоколов IPv6 в ядре, отредактировав файл '''/etc/modprobe.conf''', и перезагрузите систему. Это хороший пример использования отслеживания пакетов для отладки, потому что другим способом решить эту проблему трудно. Не нужно проводить детальный анализ перехваченных пакетов, достаточно просто понять, что компьютер пытается разрешить имя в IPv6.&lt;br /&gt;
&lt;br /&gt;
Поиск неисправностей редко укладывается в обычные схемы диагностики. Ошибки имеют привычку просачиваться в щели между сложившейся литературой, и я уверен, что некоторые читатели (паратройка читателей у нас еще осталась, не правда ли?) столкнутся с ситуациями, в которых мои советы не помогут. Если у вас есть собственная история сетевых войн, которой вы хотели бы поделиться с нашими читателями, то отправьте нам ее на обычный адрес!&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%9D%D0%B5%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%B8%D0%B5_%D0%B0%D0%B2%D0%B8%D0%B0%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B</id>
		<title>Недорогие авиабилеты</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%9D%D0%B5%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%B8%D0%B5_%D0%B0%D0%B2%D0%B8%D0%B0%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B"/>
				<updated>2008-03-20T18:54:30Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Диагностика: проблемы с сетью==&lt;br /&gt;
&lt;br /&gt;
''Если сеть у вас захворала, зовите Доктора! Правда, домашних визитов к читателям '''д-р Крис Браун''' не делает, но готов поделиться диагнозом…''&lt;br /&gt;
&lt;br /&gt;
За годы жизни я помог многим друзьям и знакомым освоиться&lt;br /&gt;
с компьютером, и в подходящих случаях обучал их Linux. При этом, естественно, возникает нечто вроде родительской ответственности за развитие и взросление своих питомцев. Последний случай был типичным. Друг позвонил мне со словами: «У меня не работает сеть». Такое сообщение об ошибке не уступает классической фразе с борта Аполлона-13 «Хьюстон, у нас проблема», хотя и менее опасно для жизни. К счастью, в Linux много сетевых утилит, которые помогают выяснить, что именно не работает. (Чтобы не томить вас ожиданием развязки, сразу скажу, что моего друга просто отключил провайдер,&lt;br /&gt;
потому что он забыл продлить контракт.)&lt;br /&gt;
&lt;br /&gt;
Итак, следуйте за мной: рассмотрим некоторые средства диагностики сетевых неисправностей в Linux и посмотрим, как с их помощью&lt;br /&gt;
получить ответ на вопрос «Что не так в моей сети?»&lt;br /&gt;
&lt;br /&gt;
При любом поиске неисправностей прежде всего нужно понять и представить, в чем выражается правильная работа. Есть ли у компьютера статический IP-адрес, и если да, то какой? Пользуетесь ли вы DHCP, и если да, то каков адрес DHCP-сервера и выделяемый диапазон IP-адресов? Подключен ли широкополосный модем непосредственно к вашему компьютеру или у вас широкополосный маршрутизатор через Ethernet или беспроводную сеть?&lt;br /&gt;
&lt;br /&gt;
На данном уроке мы будем использовать методику «снизу вверх»: начнем с самых низких уровней и постепенно переедем на более высокие. Примерная последовательность тестов, которые мы выполним, показана на '''рис. 1'' в начале этой статьи слева. Это хороший систематический подход для случая, если сеть не работала никогда. С другой стороны, если вчера сеть работала отлично, чаще будет быстрее начать сверху и двигаться вниз.&lt;br /&gt;
&lt;br /&gt;
'''1 Находит ли Linux сетевую карту?'''&lt;br /&gt;
&lt;br /&gt;
Первый вопрос на этом этапе – видит ли Linux сетевые интерфейсы?&lt;br /&gt;
Вы сможете ответить на него, просмотрев системные сообщения ядра,&lt;br /&gt;
которые выдавались во время загрузки. Для этого используется команда &amp;lt;fotn color=darkred&amp;gt;dmesg&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # dmesg | grep eth&lt;br /&gt;
 e1000: eth0: e1000_probe: Intel(R) PRO/1000 Network Connection&lt;br /&gt;
 e1000: eth1: e1000_probe: Intel(R) PRO/1000 Network Connection&lt;br /&gt;
 e1000: eth0: e1000_watchdog: NIC Link is Up 10 Mbps Half Duplex&lt;br /&gt;
&lt;br /&gt;
В качестве альтернативы попробуйте вывести список устройств на шине с помощью команды &amp;lt;fotn color=darkred&amp;gt;lspci&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # lspci | grep Ethernet&lt;br /&gt;
 01:01.0 Ethernet controller: Intel Corporation 82547EI&lt;br /&gt;
 02:01.0 Ethernet controller: Intel Corporation 82540EM&lt;br /&gt;
&lt;br /&gt;
Сообщения об ошибках на этой стадии говорят о неисправном или несовместимом оборудовании.&lt;br /&gt;
&lt;br /&gt;
'''2 Задан ли IP-адрес?'''&lt;br /&gt;
&lt;br /&gt;
Если сетевая карта на месте, то следующий вопрос – задан ли IP-адрес? Простейшая команда для этого случая – &amp;lt;fotn color=darkred&amp;gt;ifconfig&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # ifconfig eth0&lt;br /&gt;
 eth0 Link encap:Ethernet HWaddr 00:0C:F1:96:A3:F7&lt;br /&gt;
 inet addr:192.168.0.3 Bcast:192.168.0.255 Mask:255.255.255.0&lt;br /&gt;
 inet6 addr: fe80::20c:f1ff:fe96:a3f7/64 Scope:Link&lt;br /&gt;
 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1&lt;br /&gt;
 RX packets:306 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
 TX packets:261 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
 collisions:8 txqueuelen:10&lt;br /&gt;
 RX bytes:43074 (42.0 KiB) TX bytes:34480 (33.6 KiB)&lt;br /&gt;
 Base address:0xac00 Memory:ff7e0000-ff800000&lt;br /&gt;
&lt;br /&gt;
Здесь важна вторая строка, в которой можно увидеть IP-адрес: &amp;lt;fotn color=darkred&amp;gt;192.168.0.3&amp;lt;/font&amp;gt;. Если такой строки нет, то IP-адрес не задан. А если все же задан, подумайте, действителен ли он в вашей сети.&lt;br /&gt;
&lt;br /&gt;
На практике я несколько раз сталкивался с ситуацией, когда сеть переставала работать после того, как в нее ввели компьютер, случайно&lt;br /&gt;
оказавшийся DHCP-сервером, настроенным на диапазон адресов, не соответствующих этой сети. При перезагрузке компьютер с шансами&lt;br /&gt;
50/50 получал или действительный IP-адрес от «настоящего» DHCP-сервера, или ложный адрес от самозванца.&lt;br /&gt;
&lt;br /&gt;
Если в сетевом интерфейсе не задан IP-адрес, то проверьте, настроен ли автоматический запуск этого интерфейса при загрузке системы. Если да, то использует ли он DHCP или статический IP-адрес? Конкретные имена файлов, которые нужно просмотреть, зависят от дистрибутива. В Fedora и Red Hat это '''/etc/sysconfig/network-scripts/ifcfg-eth*''', в SUSE – '''/etc/sysconfig/network/ifcfg-eth*''', а в Ubuntu – '''/etc/network/interfaces'''. (Стандарты – отличная штука: ну не прелестны ли эти ничем не объяснимые расхождения?) Конечно, в каждом из дистрибутивов есть графические утилиты, с помощью которых можно посмотреть и отредактировать настройки.&lt;br /&gt;
&lt;br /&gt;
Обычно инициализация интерфейса упрятана глубоко в загрузочные скрипты, и взаимодействие с сервером DHCP разглядеть трудно; но его можно увидеть, непосредственно запустив скрипт ifup или dhclient. Эта программа поддерживает диалог с DHCP-сервером и позволяет задать параметры сети:&lt;br /&gt;
&lt;br /&gt;
 # dhclient&lt;br /&gt;
 Internet Systems Consortium DHCP Client V3.0.5-RedHatо&lt;br /&gt;
 Copyright 2004-2006 Internet Systems Consortium.&lt;br /&gt;
 All rights reserved.&lt;br /&gt;
 For info, please visit http://www.isc.org/sw/dhcp/&lt;br /&gt;
 Listening on LPF/eth1/00:0e:0c:01:d3:a0&lt;br /&gt;
 Sending on LPF/eth1/00:0e:0c:01:d3:a0&lt;br /&gt;
 Listening on LPF/eth0/00:0c:f1:96:a3:f7&lt;br /&gt;
 Sending on LPF/eth0/00:0c:f1:96:a3:f7&lt;br /&gt;
 Sending on Socket/fallback&lt;br /&gt;
 DHCPDISCOVER on eth1 to 255.255.255.255 port 67 interval 7&lt;br /&gt;
 DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 4&lt;br /&gt;
 DHCPOFFER from 192.168.0.1&lt;br /&gt;
 DHCPREQUEST on eth0 to 255.255.255.255 port 67&lt;br /&gt;
 DHCPACK from 192.168.0.1&lt;br /&gt;
 bound to 192.168.0.3 -- renewal in 125868 seconds.&lt;br /&gt;
&lt;br /&gt;
В данной системе два интерфейса, '''eth0''' и '''eth1'''. Мы видим, что IP-адрес интерфейса '''eth0''' получен от DHCP-сервера 192.168.0.1. Интерфейс '''eth1''' пытался сделать то же самое (он передал команду &amp;lt;fotn color=darkred&amp;gt;DHCPDISCOVER&amp;lt;/font&amp;gt;), но не получил ответа. И неудивительно: этот интерфейс не был ни к чему подключен.&lt;br /&gt;
&lt;br /&gt;
'''3 Пингуется ли маршрутизатор?'''&lt;br /&gt;
&lt;br /&gt;
Если IP-адрес задан корректно, пропингуйте (&amp;lt;fotn color=darkred&amp;gt;ping&amp;lt;/font&amp;gt;) другой компьютер в сети. В случае удачи результат будет примерно таким:&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 192.168.0.6&lt;br /&gt;
 PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 192.168.0.6: icmp_seq=1 ttl=64 time=0.468 ms&lt;br /&gt;
 --- 192.168.0.6 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 0.468/0.468/0.468/0.000 ms&lt;br /&gt;
&lt;br /&gt;
а неудачи – таким:&lt;br /&gt;
&lt;br /&gt;
 # ping -c 1 192.168.0.2&lt;br /&gt;
 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.&lt;br /&gt;
 From 192.168.0.3 icmp_seq=1 Destination Host Unreachable&lt;br /&gt;
 --- 192.168.0.2 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms&lt;br /&gt;
&lt;br /&gt;
Сообщение &amp;lt;fotn color=darkred&amp;gt;«Узел недоступен»&amp;lt;/font&amp;gt; (&amp;lt;fotn color=darkred&amp;gt;Destination Host Unreachable&amp;lt;/font&amp;gt;) обычно значит, что целевой компьютер (здесь – 192.168.0.2) не подключен к сети или не работает и поэтому не может ответить на ARP-запрос MAC-адреса с моего компьютера. Это также может означать, что ваш компьютер не находит маршрут доступа к локальной сети; чаще всего это бывает, когда ваш IP-адрес не входит в данную сеть. Возможны и более сложные проблемы с маршрутизацией – впрочем, в домашней сети, где маршрут (по умолчанию) только один, это маловероятно. Если в вашей сети нет других компьютеров, можно попробовать пропинговать маршрутизатор (Вы ведь знаете адрес своего маршрутизатора?).&lt;br /&gt;
&lt;br /&gt;
Если не получилось, то проблема носит местный характер. Если сеть проводная, проверьте кабели. Зеленые светодиоды на сетевых карточках должны гореть &amp;lt;fotn color=darkblue&amp;gt;[некоторые сетевые карты имеют другой способ индикации подключения. В случае необходимости изучите инструкцию, – ''прим.ред.'']&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''4 Не блокирован ли трафик брандмауэром?'''&lt;br /&gt;
&lt;br /&gt;
На некотором этапе нашего диагностирования полезно проверить, не чересчур ли «закручивает гайки» ваш брандмауэр. Самый быстрый&lt;br /&gt;
и грубый способ это узнать – и его предпочитают многие системные администраторы, если надо торопиться – удалить все правила брандмауэра командой&lt;br /&gt;
&lt;br /&gt;
 # iptables -F&lt;br /&gt;
&lt;br /&gt;
и посмотреть, изменится ли что-нибудь к лучшему. Если проблема исчезнет, то по крайней мере ясно, что ее причиной был брандмауэр.&lt;br /&gt;
Далее вам нужно перезагрузить компьютер (чтобы брандмауэр вновь заработал) и думать дальше. Не соблазняйтесь идеей оставить брандмауэр в отключке: это Плохая Идея!&lt;br /&gt;
&lt;br /&gt;
'''5 Установлено ли ADSL-соединение ?'''&lt;br /&gt;
&lt;br /&gt;
Если с самим маршрутизатором все в порядке, пора расширить охват. На маршрутизаторе должно быть еще несколько зеленых светодиодов (а если найти инструкцию к нему, то можно даже понять, что они означают), и по ним можно определить, подключен ли ADSL-модем маршрутизатора к провайдеру. У некоторых маршрутизаторов также есть возможность задать настройки и определить статус соединения с помощью web-приложения. Нас интересуют статус соединения (Connection Status) и IP-адрес, который провайдер назначил внешнему соединению. (Что это за адрес, не столь важно; главное, чтоб он был!) Разорвите соединение и заново установите его вручную, и попробуйте понять, на каком этапе возникает ошибка. Если соединения не добиться, нужно проверить провод, соединяющий маршрутизатор с телефонной линией (полезно подключить телефонную трубку, чтобы убедиться в наличии зуммера). Если провод в порядке, остается позвонить в службу поддержки провайдера. Приготовьте себе чашку кофе и вооружитесь интересной книжкой – ждать своей очереди на линии можно очень долго!&lt;br /&gt;
&lt;br /&gt;
'''6 Пингуется ли удаленный сервер?'''&lt;br /&gt;
&lt;br /&gt;
Если соединение с провайдером хорошее, тестированию пора подняться на уровень выше. Попробуйте пропинговать внешний компьютер с известным IP-адресом. Например, web-сервер Linux Format UK имеет адрес 89.167.142.11. (Конечно, он вполне может измениться, когда вы будете это читать, но пока для примера сгодится.)&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 89.167.142.11&lt;br /&gt;
 PING 89.167.142.11 (89.167.142.11) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 89.167.142.11: icmp_seq=1 ttl=56 time=24.3 ms&lt;br /&gt;
 --- 89.167.142.11 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 24.367/24.367/24.367/0.000 ms&lt;br /&gt;
&lt;br /&gt;
Если это работает, ваше сетевое соединение в порядке. В качестве последнего теста попробуйте добраться до удаленного компьютера по&lt;br /&gt;
его имени:&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 www.linuxformat.com&lt;br /&gt;
 PING www.linuxformat.com (89.167.142.11) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from kryten.future.net.uk (89.167.142.11): icmp_seq=1&lt;br /&gt;
 ttl=56 time=24.2 ms&lt;br /&gt;
 --- www.linuxformat.com ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 24.249/24.249/24.249/0.000 ms&lt;br /&gt;
&lt;br /&gt;
С помощью этого теста ошибки DNS сразу же выявляются, например:&lt;br /&gt;
&lt;br /&gt;
 $ ping www.prophylactic.gov&lt;br /&gt;
 ping: unknown host www.prophylactic.gov&lt;br /&gt;
&lt;br /&gt;
Если удаленный компьютер пингуется только по IP-адресу, но не по имени, пора изучать настройки вашего сервера DNS (LXF97). Для этого лучше всего подходит утилита ''dig''. Вот пример ее запуска (успешного). Не пугайтесь обилием подробностей; нужно лишь обратить внимание на запись &amp;lt;fotn color=darkred&amp;gt;A&amp;lt;/font&amp;gt; в разделе &amp;lt;fotn color=darkred&amp;gt;ANSWER&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # dig www.linuxformat.com&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.linuxformat.com&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 23236&lt;br /&gt;
 ;; flags: qr rd ra; QUERY:1, ANSWER:2, AUTHORITY:2,&lt;br /&gt;
 ADDITIONAL:2&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;www.linuxformat.com. IN A&lt;br /&gt;
 ;; ANSWER SECTION:&lt;br /&gt;
 www.linuxformat.com. 300 IN CNAME redirect1.future.net.uk.&lt;br /&gt;
 redirect1.future.net.uk. 300 IN A 89.167.142.11&lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 future.net.uk. 245 IN NS ns0.future.net.uk.&lt;br /&gt;
 future.net.uk. 245 IN NS ns1.future.net.uk.&lt;br /&gt;
 ;; ADDITIONAL SECTION:&lt;br /&gt;
 ns0.future.net.uk. 33231 IN A 89.167.142.1&lt;br /&gt;
 ns1.future.net.uk. 33231 IN A 89.167.143.1&lt;br /&gt;
 ;; Query time: 41 msec&lt;br /&gt;
 ;; SERVER: 192.168.0.1#53(192.168.0.1)&lt;br /&gt;
 ;; WHEN: Fri Jul 6 15:21:44 2007&lt;br /&gt;
 ;; MSG SIZE rcvd: 158&lt;br /&gt;
&lt;br /&gt;
Если DNS не работает, вариантов может быть несколько.&lt;br /&gt;
&lt;br /&gt;
В первом случае сервер DNS не может найти компьютер, к которому вы обращаетесь. Вот пример обращения к серверу, которого просто&lt;br /&gt;
не существует:&lt;br /&gt;
&lt;br /&gt;
 # dig prophylactic.gov&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; prophylactic.gov&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NXDOMAIN, id: 13168&lt;br /&gt;
 ;; flags: qr rd ra; QUERY:1, ANSWER:0, AUTHORITY:1,&lt;br /&gt;
 ADDITIONAL:0&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;prophylactic.gov. IN A&lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 gov. 2560 IN SOA a.gov.zoneedit.com. govcontact.&lt;br /&gt;
 zoneedit.com. 1183644065 3600 900 1814400 86400&lt;br /&gt;
&lt;br /&gt;
Обратите внимание на статус запроса &amp;lt;fotn color=darkred&amp;gt;NXDOMAIN&amp;lt;/font&amp;gt; и отсутствие раздела &amp;lt;fotn color=darkred&amp;gt;ANSWER&amp;lt;/font&amp;gt;, который мы видели в результатах предыдущего запроса. Если вы ввели корректное имя компьютера, то такая ошибка – следствие чьих-то чужих проблем.&lt;br /&gt;
&lt;br /&gt;
'''7 Можете ли вы найти свой DNS-сервер?&lt;br /&gt;
&lt;br /&gt;
Вторая причина отказа DNS – ваш компьютер не может найти DNS-сервер. Тогда источник проблемы, вероятно, ближе к дому.&lt;br /&gt;
&lt;br /&gt;
 # dig www.linuxformat.co.uk&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.linuxformat.co.uk&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; connection timed out; no servers could be reached&lt;br /&gt;
&lt;br /&gt;
Если это произошло, загляните в файл '''/etc/resolv.conf'''. В нем Linux хранит сведения о местонахождении DNS-серверов. Если вы пользуетесь DHCP, IP-адреса DNS-серверов предоставляются сервером DHCP. Если IP-адрес статический, вы, наверно, использовали графическую утилиту настройки для определения параметров серверов DNS (например, ''system-config-network'' в Fedora). В любом случае результаты записываются в этот файл. Есть ли в нем корректный адрес сервера имен? Можете ли вы пинговать его?&lt;br /&gt;
&lt;br /&gt;
Если ничто не помогает, попробуйте просмотреть сетевой трафик с помощью ''wireshark'', утилиты отслеживания пакетов, ранее известной как ethereal. Как средство диагностики ''wireshark'', на мой взгляд, «последняя надежда». Дело не в недоработке этой программы: программа-то отличная, но чтобы искать неполадки в сети путем изучения трафика на уровне пакетов, нужно очень хорошо знать TCP/IP и прикладные протоколы верхних уровней. Вам также может потребоваться дополнительный компьютер в сети для наблюдения за трафиком.&lt;br /&gt;
&lt;br /&gt;
Выполните команду&lt;br /&gt;
&lt;br /&gt;
 # ping 192.168.0.42&lt;br /&gt;
&lt;br /&gt;
на компьютере с IP-адресом 192.168.0.3. Посмотрите на верхнюю из трех панелей wireshark; в ней каждому перехваченному пакету соответствует одна строка. Средняя и нижняя панели позволяют разобраться в содержимом отдельных пакетов, но сейчас они нам не нужны.&lt;br /&gt;
Сообщение простое и ясное: компьютер с адресом 192.168.0.3 пытается использовать ARP для получения MAC-адреса компьютера, до которого хочет достучаться. Он пытался сделать это три раза с интервалом в одну секунду, но не получил ответа.&lt;br /&gt;
&lt;br /&gt;
Итак, мы можем сделать вывод, что с компьютером, адрес которого 192.168.0.3, все в порядке – он может получать пакеты от компьютеров сети с корректными IP-адресами, но компьютера с адресом 192.168.0.42 там просто нет.&lt;br /&gt;
&lt;br /&gt;
===Смотрим дальше===&lt;br /&gt;
&lt;br /&gt;
Вот другой пример. На клиентском компьютере установлен SUSE Linux 10.1. Проблема была в том, что каждый раз, когда браузер ''Konqueror''&lt;br /&gt;
пытался соединиться с внешним сайтом (т.е. производил поиск DNS-сервера), перед установкой соединения возникала 15-секундная задержка. Пакет 1 реализует стандартный запрос DNS для адреса [http://www.linuxformat.co.uk www.linuxformat.co.uk], а пакет 3 – ответ на этот запрос, который приходит через 0.04 с от сервера DNS, встроенного в мой маршрутизатор (192.168.0.1) с требуемым IP-адресом. Чудесно. Проблема в том, что ''Konqueror'' также решил запросить IPv6-адрес для этого сайта (запрос записи &amp;lt;fotn color=darkred&amp;gt;AAAA&amp;lt;/font&amp;gt; в пакете 2). Слава богу, маршрутизатор игнорирует этот запрос, и через пять секунд ''Konqueror'' перенаправляет этот запрос к маршрутизатору (пакет 7) и ко внешнему серверу DNS (пакет 6). Маршрутизатор все еще не отвечает, зато отвечает внешний DNS-сервер (пакет 8): сообщает, что не может найти записи &amp;lt;fotn color=darkred&amp;gt;AAAA&amp;lt;/font&amp;gt; для сайта [http://linux.format.co.uk linux.format.co.uk]. Ну, теперь помаленьку проясняется...&lt;br /&gt;
&lt;br /&gt;
DNS-ресолвер приписывает доменное имя по умолчанию &amp;lt;font color=blue&amp;gt;example.com&amp;lt;/font&amp;gt; к адресу, который он пытается преобразовать (в результате получаем бессмыслицу [http://www.linuxformat.co.uk.example.com www.linuxformat.co.uk.example.com]) и начинает поиск записей &amp;lt;font color=darkred&amp;gt;AAAA&amp;lt;/font&amp;gt; для этого адреса. Он тратит еще пять секунд, надеясь получить ответ от маршрутизатора, после чего еще раз пытается обратиться к внешнему серверу DNS (пакет 10). В конце концов занавес над этой печальной историей опускается, и через пятнадцать секунд после начала ''Konqueror'' создает соединение TCP/IP (пакеты с 17-го и далее), используя старый добрый адрес IPv4, с которого и начал.&lt;br /&gt;
&lt;br /&gt;
Оказалось, что это известная проблема, как свидетельствуют и результаты поиска Google по фразе ''“Konqueror IPv6”''. Решение простое: отключите стек протоколов IPv6 в ядре, отредактировав файл '''/etc/modprobe.conf''', и перезагрузите систему. Это хороший пример использования отслеживания пакетов для отладки, потому что другим способом решить эту проблему трудно. Не нужно проводить детальный анализ перехваченных пакетов, достаточно просто понять, что компьютер пытается разрешить имя в IPv6.&lt;br /&gt;
&lt;br /&gt;
Поиск неисправностей редко укладывается в обычные схемы диагностики. Ошибки имеют привычку просачиваться в щели между сложившейся литературой, и я уверен, что некоторые читатели (паратройка читателей у нас еще осталась, не правда ли?) столкнутся с ситуациями, в которых мои советы не помогут. Если у вас есть собственная история сетевых войн, которой вы хотели бы поделиться с нашими читателями, то отправьте нам ее на обычный адрес!&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%9D%D0%B5%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%B8%D0%B5_%D0%B0%D0%B2%D0%B8%D0%B0%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B</id>
		<title>Недорогие авиабилеты</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%9D%D0%B5%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%B8%D0%B5_%D0%B0%D0%B2%D0%B8%D0%B0%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B"/>
				<updated>2008-03-20T18:43:32Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Диагностика: проблемы с сетью==&lt;br /&gt;
&lt;br /&gt;
''Если сеть у вас захворала, зовите Доктора! Правда, домашних визитов к читателям '''д-р Крис Браун''' не делает, но готов поделиться диагнозом…''&lt;br /&gt;
&lt;br /&gt;
За годы жизни я помог многим друзьям и знакомым освоиться&lt;br /&gt;
с компьютером, и в подходящих случаях обучал их Linux. При этом, естественно, возникает нечто вроде родительской ответственности за развитие и взросление своих питомцев. Последний случай был типичным. Друг позвонил мне со словами: «У меня не работает сеть». Такое сообщение об ошибке не уступает классической фразе с борта Аполлона-13 «Хьюстон, у нас проблема», хотя и менее опасно для жизни. К счастью, в Linux много сетевых утилит, которые помогают выяснить, что именно не работает. (Чтобы не томить вас ожиданием развязки, сразу скажу, что моего друга просто отключил провайдер,&lt;br /&gt;
потому что он забыл продлить контракт.)&lt;br /&gt;
&lt;br /&gt;
Итак, следуйте за мной: рассмотрим некоторые средства диагностики сетевых неисправностей в Linux и посмотрим, как с их помощью&lt;br /&gt;
получить ответ на вопрос «Что не так в моей сети?»&lt;br /&gt;
&lt;br /&gt;
При любом поиске неисправностей прежде всего нужно понять и представить, в чем выражается правильная работа. Есть ли у компьютера статический IP-адрес, и если да, то какой? Пользуетесь ли вы DHCP, и если да, то каков адрес DHCP-сервера и выделяемый диапазон IP-адресов? Подключен ли широкополосный модем непосредственно к вашему компьютеру или у вас широкополосный маршрутизатор через Ethernet или беспроводную сеть?&lt;br /&gt;
&lt;br /&gt;
На данном уроке мы будем использовать методику «снизу вверх»: начнем с самых низких уровней и постепенно переедем на более высокие. Примерная последовательность тестов, которые мы выполним, показана на рис. 1 в начале этой статьи слева. Это хороший систематический подход для случая, если сеть не работала никогда. С другой стороны, если вчера сеть работала отлично, чаще будет быстрее начать сверху и двигаться вниз.&lt;br /&gt;
&lt;br /&gt;
'''1 Находит ли Linux сетевую карту?'''&lt;br /&gt;
&lt;br /&gt;
Первый вопрос на этом этапе – видит ли Linux сетевые интерфейсы?&lt;br /&gt;
Вы сможете ответить на него, просмотрев системные сообщения ядра,&lt;br /&gt;
которые выдавались во время загрузки. Для этого используется команда dmesg:&lt;br /&gt;
&lt;br /&gt;
 # dmesg | grep eth&lt;br /&gt;
 e1000: eth0: e1000_probe: Intel(R) PRO/1000 Network Connection&lt;br /&gt;
 e1000: eth1: e1000_probe: Intel(R) PRO/1000 Network Connection&lt;br /&gt;
 e1000: eth0: e1000_watchdog: NIC Link is Up 10 Mbps Half Duplex&lt;br /&gt;
&lt;br /&gt;
В качестве альтернативы попробуйте вывести список устройств на шине с помощью команды lspci:&lt;br /&gt;
&lt;br /&gt;
 # lspci | grep Ethernet&lt;br /&gt;
 01:01.0 Ethernet controller: Intel Corporation 82547EI&lt;br /&gt;
 02:01.0 Ethernet controller: Intel Corporation 82540EM&lt;br /&gt;
&lt;br /&gt;
Сообщения об ошибках на этой стадии говорят о неисправном или несовместимом оборудовании.&lt;br /&gt;
&lt;br /&gt;
'''2 Задан ли IP-адрес?'''&lt;br /&gt;
&lt;br /&gt;
Если сетевая карта на месте, то следующий вопрос – задан ли IP-адрес? Простейшая команда для этого случая – ifconfig:&lt;br /&gt;
&lt;br /&gt;
 # ifconfig eth0&lt;br /&gt;
 eth0 Link encap:Ethernet HWaddr 00:0C:F1:96:A3:F7&lt;br /&gt;
 inet addr:192.168.0.3 Bcast:192.168.0.255 Mask:255.255.255.0&lt;br /&gt;
 inet6 addr: fe80::20c:f1ff:fe96:a3f7/64 Scope:Link&lt;br /&gt;
 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1&lt;br /&gt;
 RX packets:306 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
 TX packets:261 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
 collisions:8 txqueuelen:10&lt;br /&gt;
 RX bytes:43074 (42.0 KiB) TX bytes:34480 (33.6 KiB)&lt;br /&gt;
 Base address:0xac00 Memory:ff7e0000-ff800000&lt;br /&gt;
&lt;br /&gt;
Здесь важна вторая строка, в которой можно увидеть IP-адрес: 192.168.0.3. Если такой строки нет, то IP-адрес не задан. А если все же&lt;br /&gt;
задан, подумайте, действителен ли он в вашей сети.&lt;br /&gt;
&lt;br /&gt;
На практике я несколько раз сталкивался с ситуацией, когда сеть переставала работать после того, как в нее ввели компьютер, случайно&lt;br /&gt;
оказавшийся DHCP-сервером, настроенным на диапазон адресов, не соответствующих этой сети. При перезагрузке компьютер с шансами&lt;br /&gt;
50/50 получал или действительный IP-адрес от «настоящего» DHCP-сервера, или ложный адрес от самозванца.&lt;br /&gt;
&lt;br /&gt;
Если в сетевом интерфейсе не задан IP-адрес, то проверьте, настроен ли автоматический запуск этого интерфейса при загрузке системы. Если да, то использует ли он DHCP или статический IP-адрес? Конкретные имена файлов, которые нужно просмотреть, зависят от дистрибутива. В Fedora и Red Hat это /etc/sysconfig/network-scripts/ifcfg-eth*, в SUSE –/etc/sysconfig/network/ifcfg-eth*, а в Ubuntu – /etc/network/interfaces. (Стандарты – отличная штука: ну не прелестны ли эти ничем не объяснимые расхождения?) Конечно, в каждом из дистрибутивов есть графические утилиты, с помощью которых можно&lt;br /&gt;
посмотреть и отредактировать настройки.&lt;br /&gt;
&lt;br /&gt;
Обычно инициализация интерфейса упрятана глубоко в загрузочные скрипты, и взаимодействие с сервером DHCP разглядеть трудно; но его можно увидеть, непосредственно запустив скрипт ifup или dhclient. Эта программа поддерживает диалог с DHCP-сервером и позволяет задатьпараметры сети:&lt;br /&gt;
&lt;br /&gt;
 # dhclient&lt;br /&gt;
 Internet Systems Consortium DHCP Client V3.0.5-RedHatо&lt;br /&gt;
 Copyright 2004-2006 Internet Systems Consortium.&lt;br /&gt;
 All rights reserved.&lt;br /&gt;
 For info, please visit http://www.isc.org/sw/dhcp/&lt;br /&gt;
 Listening on LPF/eth1/00:0e:0c:01:d3:a0&lt;br /&gt;
 Sending on LPF/eth1/00:0e:0c:01:d3:a0&lt;br /&gt;
 Listening on LPF/eth0/00:0c:f1:96:a3:f7&lt;br /&gt;
 Sending on LPF/eth0/00:0c:f1:96:a3:f7&lt;br /&gt;
 Sending on Socket/fallback&lt;br /&gt;
 DHCPDISCOVER on eth1 to 255.255.255.255 port 67 interval 7&lt;br /&gt;
 DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 4&lt;br /&gt;
 DHCPOFFER from 192.168.0.1&lt;br /&gt;
 DHCPREQUEST on eth0 to 255.255.255.255 port 67&lt;br /&gt;
 DHCPACK from 192.168.0.1&lt;br /&gt;
 bound to 192.168.0.3 -- renewal in 125868 seconds.&lt;br /&gt;
&lt;br /&gt;
В данной системе два интерфейса, eth0 и eth1. Мы видим, что IP-адрес интерфейса eth0 получен от DHCP-сервера 192.168.0.1. Интерфейс eth1 пытался сделать то же самое (он передал команду DHCPDISCOVER), но не получил ответа. И неудивительно: этот интерфейс не был ни к чему подключен.&lt;br /&gt;
&lt;br /&gt;
'''3 Пингуется ли маршрутизатор?'''&lt;br /&gt;
&lt;br /&gt;
Если IP-адрес задан корректно, пропингуйте (ping) другой компьютер в сети. В случае удачи результат будет примерно таким:&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 192.168.0.6&lt;br /&gt;
 PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 192.168.0.6: icmp_seq=1 ttl=64 time=0.468 ms&lt;br /&gt;
 --- 192.168.0.6 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 0.468/0.468/0.468/0.000 ms&lt;br /&gt;
&lt;br /&gt;
а неудачи – таким:&lt;br /&gt;
&lt;br /&gt;
 # ping -c 1 192.168.0.2&lt;br /&gt;
 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.&lt;br /&gt;
 From 192.168.0.3 icmp_seq=1 Destination Host Unreachable&lt;br /&gt;
 --- 192.168.0.2 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms&lt;br /&gt;
&lt;br /&gt;
Сообщение «Узел недоступен» (Destination Host Unreachable) обычно значит, что целевой компьютер (здесь – 192.168.0.2) не подключен к&lt;br /&gt;
сети или не работает и поэтому не может ответить на ARP-запрос MAC-адреса с моего компьютера. Это также может означать, что ваш компьютер не находит маршрут доступа к локальной сети; чаще всего это бывает, когда ваш IP-адрес не входит в данную сеть. Возможны и более сложные проблемы с маршрутизацией – впрочем, в домашней сети, где маршрут (по умолчанию) только один, это маловероятно. Если в вашей сети нет других компьютеров, можно попробовать пропинговать маршрутизатор (Вы ведь знаете адрес своего маршрутизатора?).&lt;br /&gt;
&lt;br /&gt;
Если не получилось, то проблема носит местный характер. Если сеть проводная, проверьте кабели. Зеленые светодиоды на сетевых карточках должны гореть [некоторые сетевые карты имеют другой способ индикации подключения. В случае необходимости изучите инструкцию, – прим.ред.].&lt;br /&gt;
&lt;br /&gt;
'''4 Не блокирован ли трафик брандмауэром?'''&lt;br /&gt;
&lt;br /&gt;
На некотором этапе нашего диагностирования полезно проверить, не чересчур ли «закручивает гайки» ваш брандмауэр. Самый быстрый&lt;br /&gt;
и грубый способ это узнать – и его предпочитают многие системные администраторы, если надо торопиться – удалить все правила брандмауэра командой&lt;br /&gt;
&lt;br /&gt;
 # iptables -F&lt;br /&gt;
&lt;br /&gt;
и посмотреть, изменится ли что-нибудь к лучшему. Если проблема исчезнет, то по крайней мере ясно, что ее причиной был брандмауэр.&lt;br /&gt;
Далее вам нужно перезагрузить компьютер (чтобы брандмауэр вновь заработал) и думать дальше. Не соблазняйтесь идеей оставить брандмауэр в отключке: это Плохая Идея!&lt;br /&gt;
&lt;br /&gt;
'''5 Установлено ли ADSL-соединение ?'''&lt;br /&gt;
&lt;br /&gt;
Если с самим маршрутизатором все в порядке, пора расширить охват. На маршрутизаторе должно быть еще несколько зеленых светодиодов (а если найти инструкцию к нему, то можно даже понять, что они означают), и по ним можно определить, подключен ли ADSL-модем маршрутизатора к провайдеру. У некоторых маршрутизаторов также есть возможность задать настройки и определить статус соединения с помощью web-приложения. На рис. 3 показан пример такого приложения. Нас интересуют статус соединения (Connection Status) и IP-адрес, который провайдер назначил внешнему соединению. (Что это за адрес,&lt;br /&gt;
не столь важно; главное, чтоб он был!) Разорвите соединение и заново установите его вручную, и попробуйте понять, на каком этапе возникает ошибка. Если соединения не добиться, нужно проверить провод, соединяющий маршрутизатор с телефонной линией (полезно подключить телефонную трубку, чтобы убедиться в наличии зуммера). Если провод в порядке, остается позвонить в службу поддержки провайдера. Приготовьте себе чашку кофе и вооружитесь интересной книжкой – ждать своей очереди на линии можно очень долго!&lt;br /&gt;
&lt;br /&gt;
'''6 Пингуется ли удаленный сервер?'''&lt;br /&gt;
&lt;br /&gt;
Если соединение с провайдером хорошее, тестированию пора подняться на уровень выше. Попробуйте пропинговать внешний компьютер с известным IP-адресом. Например, web-сервер Linux Format UK имеет адрес 89.167.142.11. (Конечно, он вполне может измениться, когда вы будете это читать, но пока для примера сгодится.)&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 89.167.142.11&lt;br /&gt;
 PING 89.167.142.11 (89.167.142.11) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 89.167.142.11: icmp_seq=1 ttl=56 time=24.3 ms&lt;br /&gt;
 --- 89.167.142.11 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 24.367/24.367/24.367/0.000 ms&lt;br /&gt;
&lt;br /&gt;
Если это работает, ваше сетевое соединение в порядке. В качестве последнего теста попробуйте добраться до удаленного компьютера по&lt;br /&gt;
его имени:&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 www.linuxformat.com&lt;br /&gt;
 PING www.linuxformat.com (89.167.142.11) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from kryten.future.net.uk (89.167.142.11): icmp_seq=1&lt;br /&gt;
 ttl=56 time=24.2 ms&lt;br /&gt;
 --- www.linuxformat.com ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 24.249/24.249/24.249/0.000 ms&lt;br /&gt;
&lt;br /&gt;
С помощью этого теста ошибки DNS сразу же выявляются, например:&lt;br /&gt;
&lt;br /&gt;
 $ ping www.prophylactic.gov&lt;br /&gt;
 ping: unknown host www.prophylactic.gov&lt;br /&gt;
&lt;br /&gt;
Если удаленный компьютер пингуется только по IP-адресу, но не по имени, пора изучать настройки вашего сервера DNS (LXF97). Для этого лучше всего подходит утилита dig. Вот пример ее запуска (успешного). Не пугайтесь обилием подробностей; нужно лишь обратить внимание на запись A в разделе ANSWER:&lt;br /&gt;
&lt;br /&gt;
 # dig www.linuxformat.com&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.linuxformat.com&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 23236&lt;br /&gt;
 ;; flags: qr rd ra; QUERY:1, ANSWER:2, AUTHORITY:2,&lt;br /&gt;
 ADDITIONAL:2&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;www.linuxformat.com. IN A&lt;br /&gt;
 ;; ANSWER SECTION:&lt;br /&gt;
 www.linuxformat.com. 300 IN CNAME redirect1.future.net.uk.&lt;br /&gt;
 redirect1.future.net.uk. 300 IN A 89.167.142.11&lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 future.net.uk. 245 IN NS ns0.future.net.uk.&lt;br /&gt;
 future.net.uk. 245 IN NS ns1.future.net.uk.&lt;br /&gt;
 ;; ADDITIONAL SECTION:&lt;br /&gt;
 ns0.future.net.uk. 33231 IN A 89.167.142.1&lt;br /&gt;
 ns1.future.net.uk. 33231 IN A 89.167.143.1&lt;br /&gt;
 ;; Query time: 41 msec&lt;br /&gt;
 ;; SERVER: 192.168.0.1#53(192.168.0.1)&lt;br /&gt;
 ;; WHEN: Fri Jul 6 15:21:44 2007&lt;br /&gt;
 ;; MSG SIZE rcvd: 158&lt;br /&gt;
&lt;br /&gt;
Если DNS не работает, вариантов может быть несколько.&lt;br /&gt;
&lt;br /&gt;
В первом случае сервер DNS не может найти компьютер, к которому вы обращаетесь. Вот пример обращения к серверу, которого просто&lt;br /&gt;
не существует:&lt;br /&gt;
&lt;br /&gt;
 # dig prophylactic.gov&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; prophylactic.gov&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NXDOMAIN, id: 13168&lt;br /&gt;
 ;; flags: qr rd ra; QUERY:1, ANSWER:0, AUTHORITY:1,&lt;br /&gt;
 ADDITIONAL:0&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;prophylactic.gov. IN A&lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 gov. 2560 IN SOA a.gov.zoneedit.com. govcontact.&lt;br /&gt;
 zoneedit.com. 1183644065 3600 900 1814400 86400&lt;br /&gt;
&lt;br /&gt;
Обратите внимание на статус запроса NXDOMAIN и отсутствие раздела ANSWER, который мы видели в результатах предыдущего запроса.&lt;br /&gt;
Если вы ввели корректное имя компьютера, то такая ошибка – следствие чьих-то чужих проблем.&lt;br /&gt;
&lt;br /&gt;
'''7 Можете ли вы найти свой DNS-сервер?&lt;br /&gt;
&lt;br /&gt;
Вторая причина отказа DNS – ваш компьютер не может найти DNS-сервер. Тогда источник проблемы, вероятно, ближе к дому.&lt;br /&gt;
&lt;br /&gt;
 # dig www.linuxformat.co.uk&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.linuxformat.co.uk&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; connection timed out; no servers could be reached&lt;br /&gt;
&lt;br /&gt;
Если это произошло, загляните в файл /etc/resolv.conf. В нем Linux хранит сведения о местонахождении DNS-серверов. Если вы пользуетесь DHCP, IP-адреса DNS-серверов предоставляются сервером DHCP. Если IP-адрес статический, вы, наверно, использовали графическую утилиту настройки для определения параметров серверов DNS (например, system-config-network в Fedora). В любом случае результаты записываются в этот файл. Есть ли в нем корректный адрес сервера имен? Можете ли вы пинговать его?&lt;br /&gt;
&lt;br /&gt;
Если ничто не помогает, попробуйте просмотреть сетевой трафик с помощью wireshark, утилиты отслеживания пакетов, ранее известной как ethereal. Как средство диагностики wireshark, на мой взгляд, «последняя надежда». Дело не в недоработке этой программы: программа-то отличная, но чтобы искать неполадки в сети путем изучения трафика на уровне пакетов, нужно очень хорошо знать TCP/IP и прикладные протоколы верхних уровней. Вам также может потребоваться дополнительный компьютер в сети для наблюдения за трафиком.&lt;br /&gt;
&lt;br /&gt;
Выполните команду&lt;br /&gt;
&lt;br /&gt;
 # ping 192.168.0.42&lt;br /&gt;
&lt;br /&gt;
на компьютере с IP-адресом 192.168.0.3. Посмотрите на верхнюю из трех панелей wireshark; в ней каждому перехваченному пакету соответствует одна строка. Средняя и нижняя панели позволяют разобраться в содержимом отдельных пакетов, но сейчас они нам не нужны.&lt;br /&gt;
Сообщение простое и ясное: компьютер с адресом 192.168.0.3 пытается использовать ARP для получения MAC-адреса компьютера, до которого хочет достучаться. Он пытался сделать это три раза с интервалом в одну секунду, но не получил ответа.&lt;br /&gt;
&lt;br /&gt;
Итак, мы можем сделать вывод, что с компьютером, адрес которого 192.168.0.3, все в порядке – он может получать пакеты от компьютеров сети с корректными IP-адресами, но компьютера с адресом 192.168.0.42 там просто нет.&lt;br /&gt;
&lt;br /&gt;
===Смотрим дальше===&lt;br /&gt;
&lt;br /&gt;
Вот другой пример. На клиентском компьютере установлен SUSE Linux 10.1. Проблема была в том, что каждый раз, когда браузер Konqueror&lt;br /&gt;
пытался соединиться с внешним сайтом (т.е. производил поиск DNS-сервера), перед установкой соединения возникала 15-секундная задержка. На рис. 5 в нижней части этой колонки показан результат перехвата пакетов трафика Konqueror. Пакет 1 реализует стандартный запрос DNS для адреса www.linuxformat.co.uk, а пакет 3 – ответ на этот запрос, который приходит через 0.04 с от сервера DNS, встроенного в мой маршрутизатор (192.168.0.1) с требуемым IP-адресом. Чудесно. Проблема в том, что Konqueror также решил запросить IPv6-адрес для этого сайта (запрос записи AAAA в пакете 2). Слава богу, маршрутизатор игнорирует этот запрос, и через пять секунд Konqueror перенаправляет этот запрос к маршрутизатору (пакет 7) и ко внешнему серверу&lt;br /&gt;
DNS (пакет 6). Маршрутизатор все еще не отвечает, зато отвечает внешний DNS-сервер (пакет 8): сообщает, что не может найти записи AAAA для сайта linux.format.co.uk. Ну, теперь помаленьку проясняется...&lt;br /&gt;
&lt;br /&gt;
DNS-ресолвер приписывает доменное имя по умолчанию .example.com к адресу, который он пытается преобразовать (в результате получаем бессмыслицу www.linuxformat.co.uk.example.com) и начинает поиск записей AAAA для этого адреса. Он тратит еще пять секунд, надеясь получить ответ от маршрутизатора, после чего еще раз пытается обратиться к внешнему серверу DNS (пакет 10). В конце концов занавес над этой печальной историей опускается, и через пятнадцать секунд после начала Konqueror создает соединение TCP/IP (пакеты с 17-го и далее), используя старый добрый адрес IPv4, с которого и начал.&lt;br /&gt;
Оказалось, что это известная проблема, как свидетельствуют и результаты поиска Google по фразе “Konqueror IPv6”. Решение простое: отключите стек протоколов IPv6 в ядре, отредактировав файл /etc/modprobe.conf, и перезагрузите систему. Это хороший пример использования отслеживания пакетов для отладки, потому что другим способом решить эту проблему трудно. Не нужно проводить детальный анализ перехваченных пакетов, достаточно просто понять, что компьютер пытается разрешить имя в IPv6.&lt;br /&gt;
&lt;br /&gt;
Поиск неисправностей редко укладывается в обычные схемы диагностики. Ошибки имеют привычку просачиваться в щели между сложившейся литературой, и я уверен, что некоторые читатели (паратройка читателей у нас еще осталась, не правда ли?) столкнутся с ситуациями, в которых мои советы не помогут. Если у вас есть собственная история сетевых войн, которой вы хотели бы поделиться с нашими читателями, то отправьте нам ее на обычный адрес!&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%9D%D0%B5%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%B8%D0%B5_%D0%B0%D0%B2%D0%B8%D0%B0%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B</id>
		<title>Недорогие авиабилеты</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%9D%D0%B5%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%B8%D0%B5_%D0%B0%D0%B2%D0%B8%D0%B0%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B"/>
				<updated>2008-03-20T18:42:22Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Диагностика: проблемы с сетью==&lt;br /&gt;
&lt;br /&gt;
''Если сеть у вас захворала, зовите Доктора! Правда, домашних визитов к читателям '''д-р Крис Браун''' не делает, но готов поделиться диагнозом…''&lt;br /&gt;
&lt;br /&gt;
За годы жизни я помог многим друзьям и знакомым освоиться&lt;br /&gt;
с компьютером, и в подходящих случаях обучал их Linux. При этом, естественно, возникает нечто вроде родительской ответственности за развитие и взросление своих питомцев. Последний случай был типичным. Друг позвонил мне со словами: «У меня не работает сеть». Такое сообщение об ошибке не уступает классической фразе с борта Аполлона-13 «Хьюстон, у нас проблема», хотя и менее опасно для жизни. К счастью, в Linux много сетевых утилит, которые помогают выяснить, что именно не работает. (Чтобы не томить вас ожиданием развязки, сразу скажу, что моего друга просто отключил провайдер,&lt;br /&gt;
потому что он забыл продлить контракт.)&lt;br /&gt;
&lt;br /&gt;
Итак, следуйте за мной: рассмотрим некоторые средства диагностики сетевых неисправностей в Linux и посмотрим, как с их помощью&lt;br /&gt;
получить ответ на вопрос «Что не так в моей сети?»&lt;br /&gt;
&lt;br /&gt;
При любом поиске неисправностей прежде всего нужно понять и представить, в чем выражается правильная работа. Есть ли у компьютера статический IP-адрес, и если да, то какой? Пользуетесь ли вы DHCP, и если да, то каков адрес DHCP-сервера и выделяемый диапазон IP-адресов? Подключен ли широкополосный модем непосредственно к вашему компьютеру или у вас широкополосный маршрутизатор через Ethernet или беспроводную сеть?&lt;br /&gt;
&lt;br /&gt;
На данном уроке мы будем использовать методику «снизу вверх»: начнем с самых низких уровней и постепенно переедем на более высокие. Примерная последовательность тестов, которые мы выполним, показана на рис. 1 в начале этой статьи слева. Это хороший систематический подход для случая, если сеть не работала никогда. С другой стороны, если вчера сеть работала отлично, чаще будет быстрее начать сверху и двигаться вниз.&lt;br /&gt;
&lt;br /&gt;
#'''Находит ли Linux сетевую карту?'''&lt;br /&gt;
&lt;br /&gt;
Первый вопрос на этом этапе – видит ли Linux сетевые интерфейсы?&lt;br /&gt;
Вы сможете ответить на него, просмотрев системные сообщения ядра,&lt;br /&gt;
которые выдавались во время загрузки. Для этого используется команда dmesg:&lt;br /&gt;
&lt;br /&gt;
 # dmesg | grep eth&lt;br /&gt;
 e1000: eth0: e1000_probe: Intel(R) PRO/1000 Network Connection&lt;br /&gt;
 e1000: eth1: e1000_probe: Intel(R) PRO/1000 Network Connection&lt;br /&gt;
 e1000: eth0: e1000_watchdog: NIC Link is Up 10 Mbps Half Duplex&lt;br /&gt;
&lt;br /&gt;
В качестве альтернативы попробуйте вывести список устройств на шине с помощью команды lspci:&lt;br /&gt;
&lt;br /&gt;
 # lspci | grep Ethernet&lt;br /&gt;
 01:01.0 Ethernet controller: Intel Corporation 82547EI&lt;br /&gt;
 02:01.0 Ethernet controller: Intel Corporation 82540EM&lt;br /&gt;
&lt;br /&gt;
Сообщения об ошибках на этой стадии говорят о неисправном или несовместимом оборудовании.&lt;br /&gt;
&lt;br /&gt;
#'''Задан ли IP-адрес?'''&lt;br /&gt;
&lt;br /&gt;
Если сетевая карта на месте, то следующий вопрос – задан ли IP-адрес? Простейшая команда для этого случая – ifconfig:&lt;br /&gt;
&lt;br /&gt;
 # ifconfig eth0&lt;br /&gt;
 eth0 Link encap:Ethernet HWaddr 00:0C:F1:96:A3:F7&lt;br /&gt;
 inet addr:192.168.0.3 Bcast:192.168.0.255 Mask:255.255.255.0&lt;br /&gt;
 inet6 addr: fe80::20c:f1ff:fe96:a3f7/64 Scope:Link&lt;br /&gt;
 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1&lt;br /&gt;
 RX packets:306 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
 TX packets:261 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
 collisions:8 txqueuelen:10&lt;br /&gt;
 RX bytes:43074 (42.0 KiB) TX bytes:34480 (33.6 KiB)&lt;br /&gt;
 Base address:0xac00 Memory:ff7e0000-ff800000&lt;br /&gt;
&lt;br /&gt;
Здесь важна вторая строка, в которой можно увидеть IP-адрес: 192.168.0.3. Если такой строки нет, то IP-адрес не задан. А если все же&lt;br /&gt;
задан, подумайте, действителен ли он в вашей сети.&lt;br /&gt;
&lt;br /&gt;
На практике я несколько раз сталкивался с ситуацией, когда сеть переставала работать после того, как в нее ввели компьютер, случайно&lt;br /&gt;
оказавшийся DHCP-сервером, настроенным на диапазон адресов, не соответствующих этой сети. При перезагрузке компьютер с шансами&lt;br /&gt;
50/50 получал или действительный IP-адрес от «настоящего» DHCP-сервера, или ложный адрес от самозванца.&lt;br /&gt;
&lt;br /&gt;
Если в сетевом интерфейсе не задан IP-адрес, то проверьте, настроен ли автоматический запуск этого интерфейса при загрузке системы. Если да, то использует ли он DHCP или статический IP-адрес? Конкретные имена файлов, которые нужно просмотреть, зависят от дистрибутива. В Fedora и Red Hat это /etc/sysconfig/network-scripts/ifcfg-eth*, в SUSE –/etc/sysconfig/network/ifcfg-eth*, а в Ubuntu – /etc/network/interfaces. (Стандарты – отличная штука: ну не прелестны ли эти ничем не объяснимые расхождения?) Конечно, в каждом из дистрибутивов есть графические утилиты, с помощью которых можно&lt;br /&gt;
посмотреть и отредактировать настройки.&lt;br /&gt;
&lt;br /&gt;
Обычно инициализация интерфейса упрятана глубоко в загрузочные скрипты, и взаимодействие с сервером DHCP разглядеть трудно; но его можно увидеть, непосредственно запустив скрипт ifup или dhclient. Эта программа поддерживает диалог с DHCP-сервером и позволяет задатьпараметры сети:&lt;br /&gt;
&lt;br /&gt;
 # dhclient&lt;br /&gt;
 Internet Systems Consortium DHCP Client V3.0.5-RedHatо&lt;br /&gt;
 Copyright 2004-2006 Internet Systems Consortium.&lt;br /&gt;
 All rights reserved.&lt;br /&gt;
 For info, please visit http://www.isc.org/sw/dhcp/&lt;br /&gt;
 Listening on LPF/eth1/00:0e:0c:01:d3:a0&lt;br /&gt;
 Sending on LPF/eth1/00:0e:0c:01:d3:a0&lt;br /&gt;
 Listening on LPF/eth0/00:0c:f1:96:a3:f7&lt;br /&gt;
 Sending on LPF/eth0/00:0c:f1:96:a3:f7&lt;br /&gt;
 Sending on Socket/fallback&lt;br /&gt;
 DHCPDISCOVER on eth1 to 255.255.255.255 port 67 interval 7&lt;br /&gt;
 DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 4&lt;br /&gt;
 DHCPOFFER from 192.168.0.1&lt;br /&gt;
 DHCPREQUEST on eth0 to 255.255.255.255 port 67&lt;br /&gt;
 DHCPACK from 192.168.0.1&lt;br /&gt;
 bound to 192.168.0.3 -- renewal in 125868 seconds.&lt;br /&gt;
&lt;br /&gt;
В данной системе два интерфейса, eth0 и eth1. Мы видим, что IP-адрес интерфейса eth0 получен от DHCP-сервера 192.168.0.1. Интерфейс eth1 пытался сделать то же самое (он передал команду DHCPDISCOVER), но не получил ответа. И неудивительно: этот интерфейс не был ни к чему подключен.&lt;br /&gt;
&lt;br /&gt;
#'''Пингуется ли маршрутизатор?'''&lt;br /&gt;
&lt;br /&gt;
Если IP-адрес задан корректно, пропингуйте (ping) другой компьютер в сети. В случае удачи результат будет примерно таким:&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 192.168.0.6&lt;br /&gt;
 PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 192.168.0.6: icmp_seq=1 ttl=64 time=0.468 ms&lt;br /&gt;
 --- 192.168.0.6 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 0.468/0.468/0.468/0.000 ms&lt;br /&gt;
&lt;br /&gt;
а неудачи – таким:&lt;br /&gt;
&lt;br /&gt;
 # ping -c 1 192.168.0.2&lt;br /&gt;
 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.&lt;br /&gt;
 From 192.168.0.3 icmp_seq=1 Destination Host Unreachable&lt;br /&gt;
 --- 192.168.0.2 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms&lt;br /&gt;
&lt;br /&gt;
Сообщение «Узел недоступен» (Destination Host Unreachable) обычно значит, что целевой компьютер (здесь – 192.168.0.2) не подключен к&lt;br /&gt;
сети или не работает и поэтому не может ответить на ARP-запрос MAC-адреса с моего компьютера. Это также может означать, что ваш компьютер не находит маршрут доступа к локальной сети; чаще всего это бывает, когда ваш IP-адрес не входит в данную сеть. Возможны и более сложные проблемы с маршрутизацией – впрочем, в домашней сети, где маршрут (по умолчанию) только один, это маловероятно. Если в вашей сети нет других компьютеров, можно попробовать пропинговать маршрутизатор (Вы ведь знаете адрес своего маршрутизатора?).&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;
 # iptables -F&lt;br /&gt;
&lt;br /&gt;
и посмотреть, изменится ли что-нибудь к лучшему. Если проблема исчезнет, то по крайней мере ясно, что ее причиной был брандмауэр.&lt;br /&gt;
Далее вам нужно перезагрузить компьютер (чтобы брандмауэр вновь заработал) и думать дальше. Не соблазняйтесь идеей оставить брандмауэр в отключке: это Плохая Идея!&lt;br /&gt;
&lt;br /&gt;
# Установлено ли ADSL-соединение ?&lt;br /&gt;
&lt;br /&gt;
Если с самим маршрутизатором все в порядке, пора расширить охват. На маршрутизаторе должно быть еще несколько зеленых светодиодов (а если найти инструкцию к нему, то можно даже понять, что они означают), и по ним можно определить, подключен ли ADSL-модем маршрутизатора к провайдеру. У некоторых маршрутизаторов также есть возможность задать настройки и определить статус соединения с помощью web-приложения. На рис. 3 показан пример такого приложения. Нас интересуют статус соединения (Connection Status) и IP-адрес, который провайдер назначил внешнему соединению. (Что это за адрес,&lt;br /&gt;
не столь важно; главное, чтоб он был!) Разорвите соединение и заново установите его вручную, и попробуйте понять, на каком этапе возникает ошибка. Если соединения не добиться, нужно проверить провод, соединяющий маршрутизатор с телефонной линией (полезно подключить телефонную трубку, чтобы убедиться в наличии зуммера). Если провод в порядке, остается позвонить в службу поддержки провайдера. Приготовьте себе чашку кофе и вооружитесь интересной книжкой – ждать своей очереди на линии можно очень долго!&lt;br /&gt;
&lt;br /&gt;
# '''Пингуется ли удаленный сервер?'''&lt;br /&gt;
&lt;br /&gt;
Если соединение с провайдером хорошее, тестированию пора подняться на уровень выше. Попробуйте пропинговать внешний компьютер с известным IP-адресом. Например, web-сервер Linux Format UK имеет адрес 89.167.142.11. (Конечно, он вполне может измениться, когда вы будете это читать, но пока для примера сгодится.)&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 89.167.142.11&lt;br /&gt;
 PING 89.167.142.11 (89.167.142.11) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 89.167.142.11: icmp_seq=1 ttl=56 time=24.3 ms&lt;br /&gt;
 --- 89.167.142.11 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 24.367/24.367/24.367/0.000 ms&lt;br /&gt;
&lt;br /&gt;
Если это работает, ваше сетевое соединение в порядке. В качестве последнего теста попробуйте добраться до удаленного компьютера по&lt;br /&gt;
его имени:&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 www.linuxformat.com&lt;br /&gt;
 PING www.linuxformat.com (89.167.142.11) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from kryten.future.net.uk (89.167.142.11): icmp_seq=1&lt;br /&gt;
 ttl=56 time=24.2 ms&lt;br /&gt;
 --- www.linuxformat.com ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 24.249/24.249/24.249/0.000 ms&lt;br /&gt;
&lt;br /&gt;
С помощью этого теста ошибки DNS сразу же выявляются, например:&lt;br /&gt;
&lt;br /&gt;
 $ ping www.prophylactic.gov&lt;br /&gt;
 ping: unknown host www.prophylactic.gov&lt;br /&gt;
&lt;br /&gt;
Если удаленный компьютер пингуется только по IP-адресу, но не по имени, пора изучать настройки вашего сервера DNS (LXF97). Для этого лучше всего подходит утилита dig. Вот пример ее запуска (успешного). Не пугайтесь обилием подробностей; нужно лишь обратить внимание на запись A в разделе ANSWER:&lt;br /&gt;
&lt;br /&gt;
 # dig www.linuxformat.com&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.linuxformat.com&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 23236&lt;br /&gt;
 ;; flags: qr rd ra; QUERY:1, ANSWER:2, AUTHORITY:2,&lt;br /&gt;
 ADDITIONAL:2&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;www.linuxformat.com. IN A&lt;br /&gt;
 ;; ANSWER SECTION:&lt;br /&gt;
 www.linuxformat.com. 300 IN CNAME redirect1.future.net.uk.&lt;br /&gt;
 redirect1.future.net.uk. 300 IN A 89.167.142.11&lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 future.net.uk. 245 IN NS ns0.future.net.uk.&lt;br /&gt;
 future.net.uk. 245 IN NS ns1.future.net.uk.&lt;br /&gt;
 ;; ADDITIONAL SECTION:&lt;br /&gt;
 ns0.future.net.uk. 33231 IN A 89.167.142.1&lt;br /&gt;
 ns1.future.net.uk. 33231 IN A 89.167.143.1&lt;br /&gt;
 ;; Query time: 41 msec&lt;br /&gt;
 ;; SERVER: 192.168.0.1#53(192.168.0.1)&lt;br /&gt;
 ;; WHEN: Fri Jul 6 15:21:44 2007&lt;br /&gt;
 ;; MSG SIZE rcvd: 158&lt;br /&gt;
&lt;br /&gt;
Если DNS не работает, вариантов может быть несколько.&lt;br /&gt;
&lt;br /&gt;
В первом случае сервер DNS не может найти компьютер, к которому вы обращаетесь. Вот пример обращения к серверу, которого просто&lt;br /&gt;
не существует:&lt;br /&gt;
&lt;br /&gt;
 # dig prophylactic.gov&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; prophylactic.gov&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NXDOMAIN, id: 13168&lt;br /&gt;
 ;; flags: qr rd ra; QUERY:1, ANSWER:0, AUTHORITY:1,&lt;br /&gt;
 ADDITIONAL:0&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;prophylactic.gov. IN A&lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 gov. 2560 IN SOA a.gov.zoneedit.com. govcontact.&lt;br /&gt;
 zoneedit.com. 1183644065 3600 900 1814400 86400&lt;br /&gt;
&lt;br /&gt;
Обратите внимание на статус запроса NXDOMAIN и отсутствие раздела ANSWER, который мы видели в результатах предыдущего запроса.&lt;br /&gt;
Если вы ввели корректное имя компьютера, то такая ошибка – следствие чьих-то чужих проблем.&lt;br /&gt;
&lt;br /&gt;
# Можете ли вы найти свой DNS-сервер?&lt;br /&gt;
&lt;br /&gt;
Вторая причина отказа DNS – ваш компьютер не может найти DNS-сервер. Тогда источник проблемы, вероятно, ближе к дому.&lt;br /&gt;
&lt;br /&gt;
 # dig www.linuxformat.co.uk&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.linuxformat.co.uk&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; connection timed out; no servers could be reached&lt;br /&gt;
&lt;br /&gt;
Если это произошло, загляните в файл /etc/resolv.conf. В нем Linux хранит сведения о местонахождении DNS-серверов. Если вы пользуетесь DHCP, IP-адреса DNS-серверов предоставляются сервером DHCP. Если IP-адрес статический, вы, наверно, использовали графическую утилиту настройки для определения параметров серверов DNS (например, system-config-network в Fedora). В любом случае результаты записываются в этот файл. Есть ли в нем корректный адрес сервера имен? Можете ли вы пинговать его?&lt;br /&gt;
&lt;br /&gt;
Если ничто не помогает, попробуйте просмотреть сетевой трафик с помощью wireshark, утилиты отслеживания пакетов, ранее известной как ethereal. Как средство диагностики wireshark, на мой взгляд, «последняя надежда». Дело не в недоработке этой программы: программа-то отличная, но чтобы искать неполадки в сети путем изучения трафика на уровне пакетов, нужно очень хорошо знать TCP/IP и прикладные протоколы верхних уровней. Вам также может потребоваться дополнительный компьютер в сети для наблюдения за трафиком.&lt;br /&gt;
&lt;br /&gt;
Выполните команду&lt;br /&gt;
&lt;br /&gt;
 # ping 192.168.0.42&lt;br /&gt;
&lt;br /&gt;
на компьютере с IP-адресом 192.168.0.3. Посмотрите на верхнюю из трех панелей wireshark; в ней каждому перехваченному пакету соответствует одна строка. Средняя и нижняя панели позволяют разобраться в содержимом отдельных пакетов, но сейчас они нам не нужны.&lt;br /&gt;
Сообщение простое и ясное: компьютер с адресом 192.168.0.3 пытается использовать ARP для получения MAC-адреса компьютера, до которого хочет достучаться. Он пытался сделать это три раза с интервалом в одну секунду, но не получил ответа.&lt;br /&gt;
&lt;br /&gt;
Итак, мы можем сделать вывод, что с компьютером, адрес которого 192.168.0.3, все в порядке – он может получать пакеты от компьютеров сети с корректными IP-адресами, но компьютера с адресом 192.168.0.42 там просто нет.&lt;br /&gt;
&lt;br /&gt;
===Смотрим дальше===&lt;br /&gt;
&lt;br /&gt;
Вот другой пример. На клиентском компьютере установлен SUSE Linux 10.1. Проблема была в том, что каждый раз, когда браузер Konqueror&lt;br /&gt;
пытался соединиться с внешним сайтом (т.е. производил поиск DNS-сервера), перед установкой соединения возникала 15-секундная задержка. На рис. 5 в нижней части этой колонки показан результат перехвата пакетов трафика Konqueror. Пакет 1 реализует стандартный запрос DNS для адреса www.linuxformat.co.uk, а пакет 3 – ответ на этот запрос, который приходит через 0.04 с от сервера DNS, встроенного в мой маршрутизатор (192.168.0.1) с требуемым IP-адресом. Чудесно. Проблема в том, что Konqueror также решил запросить IPv6-адрес для этого сайта (запрос записи AAAA в пакете 2). Слава богу, маршрутизатор игнорирует этот запрос, и через пять секунд Konqueror перенаправляет этот запрос к маршрутизатору (пакет 7) и ко внешнему серверу&lt;br /&gt;
DNS (пакет 6). Маршрутизатор все еще не отвечает, зато отвечает внешний DNS-сервер (пакет 8): сообщает, что не может найти записи AAAA для сайта linux.format.co.uk. Ну, теперь помаленьку проясняется...&lt;br /&gt;
&lt;br /&gt;
DNS-ресолвер приписывает доменное имя по умолчанию .example.com к адресу, который он пытается преобразовать (в результате получаем бессмыслицу www.linuxformat.co.uk.example.com) и начинает поиск записей AAAA для этого адреса. Он тратит еще пять секунд, надеясь получить ответ от маршрутизатора, после чего еще раз пытается обратиться к внешнему серверу DNS (пакет 10). В конце концов занавес над этой печальной историей опускается, и через пятнадцать секунд после начала Konqueror создает соединение TCP/IP (пакеты с 17-го и далее), используя старый добрый адрес IPv4, с которого и начал.&lt;br /&gt;
Оказалось, что это известная проблема, как свидетельствуют и результаты поиска Google по фразе “Konqueror IPv6”. Решение простое: отключите стек протоколов IPv6 в ядре, отредактировав файл /etc/modprobe.conf, и перезагрузите систему. Это хороший пример использования отслеживания пакетов для отладки, потому что другим способом решить эту проблему трудно. Не нужно проводить детальный анализ перехваченных пакетов, достаточно просто понять, что компьютер пытается разрешить имя в IPv6.&lt;br /&gt;
&lt;br /&gt;
Поиск неисправностей редко укладывается в обычные схемы диагностики. Ошибки имеют привычку просачиваться в щели между сложившейся литературой, и я уверен, что некоторые читатели (паратройка читателей у нас еще осталась, не правда ли?) столкнутся с ситуациями, в которых мои советы не помогут. Если у вас есть собственная история сетевых войн, которой вы хотели бы поделиться с нашими читателями, то отправьте нам ее на обычный адрес!&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%9D%D0%B5%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%B8%D0%B5_%D0%B0%D0%B2%D0%B8%D0%B0%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B</id>
		<title>Недорогие авиабилеты</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%9D%D0%B5%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%B8%D0%B5_%D0%B0%D0%B2%D0%B8%D0%B0%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B"/>
				<updated>2008-03-20T18:41:34Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Диагностика: проблемы с сетью==&lt;br /&gt;
&lt;br /&gt;
''Если сеть у вас захворала, зовите Доктора! Правда, домашних визитов к читателям '''д-р Крис Браун''' не делает, но готов поделиться диагнозом…''&lt;br /&gt;
&lt;br /&gt;
За годы жизни я помог многим друзьям и знакомым освоиться&lt;br /&gt;
с компьютером, и в подходящих случаях обучал их Linux. При этом, естественно, возникает нечто вроде родительской ответственности за развитие и взросление своих питомцев. Последний случай был типичным. Друг позвонил мне со словами: «У меня не работает сеть». Такое сообщение об ошибке не уступает классической фразе с борта Аполлона-13 «Хьюстон, у нас проблема», хотя и менее опасно для жизни. К счастью, в Linux много сетевых утилит, которые помогают выяснить, что именно не работает. (Чтобы не томить вас ожиданием развязки, сразу скажу, что моего друга просто отключил провайдер,&lt;br /&gt;
потому что он забыл продлить контракт.)&lt;br /&gt;
&lt;br /&gt;
Итак, следуйте за мной: рассмотрим некоторые средства диагностики сетевых неисправностей в Linux и посмотрим, как с их помощью&lt;br /&gt;
получить ответ на вопрос «Что не так в моей сети?»&lt;br /&gt;
&lt;br /&gt;
При любом поиске неисправностей прежде всего нужно понять и представить, в чем выражается правильная работа. Есть ли у компьютера статический IP-адрес, и если да, то какой? Пользуетесь ли вы DHCP, и если да, то каков адрес DHCP-сервера и выделяемый диапазон IP-адресов? Подключен ли широкополосный модем непосредственно к вашему компьютеру или у вас широкополосный маршрутизатор через Ethernet или беспроводную сеть?&lt;br /&gt;
&lt;br /&gt;
На данном уроке мы будем использовать методику «снизу вверх»: начнем с самых низких уровней и постепенно переедем на более высокие. Примерная последовательность тестов, которые мы выполним, показана на рис. 1 в начале этой статьи слева. Это хороший систематический подход для случая, если сеть не работала никогда. С другой стороны, если вчера сеть работала отлично, чаще будет быстрее начать сверху и двигаться вниз.&lt;br /&gt;
&lt;br /&gt;
# '''Находит ли Linux сетевую карту?'''&lt;br /&gt;
&lt;br /&gt;
Первый вопрос на этом этапе – видит ли Linux сетевые интерфейсы?&lt;br /&gt;
Вы сможете ответить на него, просмотрев системные сообщения ядра,&lt;br /&gt;
которые выдавались во время загрузки. Для этого используется команда dmesg:&lt;br /&gt;
&lt;br /&gt;
 # dmesg | grep eth&lt;br /&gt;
 e1000: eth0: e1000_probe: Intel(R) PRO/1000 Network Connection&lt;br /&gt;
 e1000: eth1: e1000_probe: Intel(R) PRO/1000 Network Connection&lt;br /&gt;
 e1000: eth0: e1000_watchdog: NIC Link is Up 10 Mbps Half Duplex&lt;br /&gt;
&lt;br /&gt;
В качестве альтернативы попробуйте вывести список устройств на шине с помощью команды lspci:&lt;br /&gt;
&lt;br /&gt;
 # lspci | grep Ethernet&lt;br /&gt;
 01:01.0 Ethernet controller: Intel Corporation 82547EI&lt;br /&gt;
 02:01.0 Ethernet controller: Intel Corporation 82540EM&lt;br /&gt;
&lt;br /&gt;
Сообщения об ошибках на этой стадии говорят о неисправном или несовместимом оборудовании.&lt;br /&gt;
&lt;br /&gt;
# '''Задан ли IP-адрес?'''&lt;br /&gt;
&lt;br /&gt;
Если сетевая карта на месте, то следующий вопрос – задан ли IP-адрес? Простейшая команда для этого случая – ifconfig:&lt;br /&gt;
&lt;br /&gt;
 # ifconfig eth0&lt;br /&gt;
 eth0 Link encap:Ethernet HWaddr 00:0C:F1:96:A3:F7&lt;br /&gt;
 inet addr:192.168.0.3 Bcast:192.168.0.255 Mask:255.255.255.0&lt;br /&gt;
 inet6 addr: fe80::20c:f1ff:fe96:a3f7/64 Scope:Link&lt;br /&gt;
 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1&lt;br /&gt;
 RX packets:306 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
 TX packets:261 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
 collisions:8 txqueuelen:10&lt;br /&gt;
 RX bytes:43074 (42.0 KiB) TX bytes:34480 (33.6 KiB)&lt;br /&gt;
 Base address:0xac00 Memory:ff7e0000-ff800000&lt;br /&gt;
&lt;br /&gt;
Здесь важна вторая строка, в которой можно увидеть IP-адрес: 192.168.0.3. Если такой строки нет, то IP-адрес не задан. А если все же&lt;br /&gt;
задан, подумайте, действителен ли он в вашей сети.&lt;br /&gt;
&lt;br /&gt;
На практике я несколько раз сталкивался с ситуацией, когда сеть переставала работать после того, как в нее ввели компьютер, случайно&lt;br /&gt;
оказавшийся DHCP-сервером, настроенным на диапазон адресов, не соответствующих этой сети. При перезагрузке компьютер с шансами&lt;br /&gt;
50/50 получал или действительный IP-адрес от «настоящего» DHCP-сервера, или ложный адрес от самозванца.&lt;br /&gt;
&lt;br /&gt;
Если в сетевом интерфейсе не задан IP-адрес, то проверьте, настроен ли автоматический запуск этого интерфейса при загрузке системы. Если да, то использует ли он DHCP или статический IP-адрес? Конкретные имена файлов, которые нужно просмотреть, зависят от дистрибутива. В Fedora и Red Hat это /etc/sysconfig/network-scripts/ifcfg-eth*, в SUSE –/etc/sysconfig/network/ifcfg-eth*, а в Ubuntu – /etc/network/interfaces. (Стандарты – отличная штука: ну не прелестны ли эти ничем не объяснимые расхождения?) Конечно, в каждом из дистрибутивов есть графические утилиты, с помощью которых можно&lt;br /&gt;
посмотреть и отредактировать настройки.&lt;br /&gt;
&lt;br /&gt;
Обычно инициализация интерфейса упрятана глубоко в загрузочные скрипты, и взаимодействие с сервером DHCP разглядеть трудно; но его можно увидеть, непосредственно запустив скрипт ifup или dhclient. Эта программа поддерживает диалог с DHCP-сервером и позволяет задатьпараметры сети:&lt;br /&gt;
&lt;br /&gt;
 # dhclient&lt;br /&gt;
 Internet Systems Consortium DHCP Client V3.0.5-RedHatо&lt;br /&gt;
 Copyright 2004-2006 Internet Systems Consortium.&lt;br /&gt;
 All rights reserved.&lt;br /&gt;
 For info, please visit http://www.isc.org/sw/dhcp/&lt;br /&gt;
 Listening on LPF/eth1/00:0e:0c:01:d3:a0&lt;br /&gt;
 Sending on LPF/eth1/00:0e:0c:01:d3:a0&lt;br /&gt;
 Listening on LPF/eth0/00:0c:f1:96:a3:f7&lt;br /&gt;
 Sending on LPF/eth0/00:0c:f1:96:a3:f7&lt;br /&gt;
 Sending on Socket/fallback&lt;br /&gt;
 DHCPDISCOVER on eth1 to 255.255.255.255 port 67 interval 7&lt;br /&gt;
 DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 4&lt;br /&gt;
 DHCPOFFER from 192.168.0.1&lt;br /&gt;
 DHCPREQUEST on eth0 to 255.255.255.255 port 67&lt;br /&gt;
 DHCPACK from 192.168.0.1&lt;br /&gt;
 bound to 192.168.0.3 -- renewal in 125868 seconds.&lt;br /&gt;
&lt;br /&gt;
В данной системе два интерфейса, eth0 и eth1. Мы видим, что IP-адрес интерфейса eth0 получен от DHCP-сервера 192.168.0.1. Интерфейс eth1 пытался сделать то же самое (он передал команду DHCPDISCOVER), но не получил ответа. И неудивительно: этот интерфейс не был ни к чему подключен.&lt;br /&gt;
&lt;br /&gt;
# '''Пингуется ли маршрутизатор?'''&lt;br /&gt;
&lt;br /&gt;
Если IP-адрес задан корректно, пропингуйте (ping) другой компьютер в сети. В случае удачи результат будет примерно таким:&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 192.168.0.6&lt;br /&gt;
 PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 192.168.0.6: icmp_seq=1 ttl=64 time=0.468 ms&lt;br /&gt;
 --- 192.168.0.6 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 0.468/0.468/0.468/0.000 ms&lt;br /&gt;
&lt;br /&gt;
а неудачи – таким:&lt;br /&gt;
&lt;br /&gt;
 # ping -c 1 192.168.0.2&lt;br /&gt;
 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.&lt;br /&gt;
 From 192.168.0.3 icmp_seq=1 Destination Host Unreachable&lt;br /&gt;
 --- 192.168.0.2 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms&lt;br /&gt;
&lt;br /&gt;
Сообщение «Узел недоступен» (Destination Host Unreachable) обычно значит, что целевой компьютер (здесь – 192.168.0.2) не подключен к&lt;br /&gt;
сети или не работает и поэтому не может ответить на ARP-запрос MAC-адреса с моего компьютера. Это также может означать, что ваш компьютер не находит маршрут доступа к локальной сети; чаще всего это бывает, когда ваш IP-адрес не входит в данную сеть. Возможны и более сложные проблемы с маршрутизацией – впрочем, в домашней сети, где маршрут (по умолчанию) только один, это маловероятно. Если в вашей сети нет других компьютеров, можно попробовать пропинговать маршрутизатор (Вы ведь знаете адрес своего маршрутизатора?).&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;
 # iptables -F&lt;br /&gt;
&lt;br /&gt;
и посмотреть, изменится ли что-нибудь к лучшему. Если проблема исчезнет, то по крайней мере ясно, что ее причиной был брандмауэр.&lt;br /&gt;
Далее вам нужно перезагрузить компьютер (чтобы брандмауэр вновь заработал) и думать дальше. Не соблазняйтесь идеей оставить брандмауэр в отключке: это Плохая Идея!&lt;br /&gt;
&lt;br /&gt;
# Установлено ли ADSL-соединение ?&lt;br /&gt;
&lt;br /&gt;
Если с самим маршрутизатором все в порядке, пора расширить охват. На маршрутизаторе должно быть еще несколько зеленых светодиодов (а если найти инструкцию к нему, то можно даже понять, что они означают), и по ним можно определить, подключен ли ADSL-модем маршрутизатора к провайдеру. У некоторых маршрутизаторов также есть возможность задать настройки и определить статус соединения с помощью web-приложения. На рис. 3 показан пример такого приложения. Нас интересуют статус соединения (Connection Status) и IP-адрес, который провайдер назначил внешнему соединению. (Что это за адрес,&lt;br /&gt;
не столь важно; главное, чтоб он был!) Разорвите соединение и заново установите его вручную, и попробуйте понять, на каком этапе возникает ошибка. Если соединения не добиться, нужно проверить провод, соединяющий маршрутизатор с телефонной линией (полезно подключить телефонную трубку, чтобы убедиться в наличии зуммера). Если провод в порядке, остается позвонить в службу поддержки провайдера. Приготовьте себе чашку кофе и вооружитесь интересной книжкой – ждать своей очереди на линии можно очень долго!&lt;br /&gt;
&lt;br /&gt;
# '''Пингуется ли удаленный сервер?'''&lt;br /&gt;
&lt;br /&gt;
Если соединение с провайдером хорошее, тестированию пора подняться на уровень выше. Попробуйте пропинговать внешний компьютер с известным IP-адресом. Например, web-сервер Linux Format UK имеет адрес 89.167.142.11. (Конечно, он вполне может измениться, когда вы будете это читать, но пока для примера сгодится.)&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 89.167.142.11&lt;br /&gt;
 PING 89.167.142.11 (89.167.142.11) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 89.167.142.11: icmp_seq=1 ttl=56 time=24.3 ms&lt;br /&gt;
 --- 89.167.142.11 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 24.367/24.367/24.367/0.000 ms&lt;br /&gt;
&lt;br /&gt;
Если это работает, ваше сетевое соединение в порядке. В качестве последнего теста попробуйте добраться до удаленного компьютера по&lt;br /&gt;
его имени:&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 www.linuxformat.com&lt;br /&gt;
 PING www.linuxformat.com (89.167.142.11) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from kryten.future.net.uk (89.167.142.11): icmp_seq=1&lt;br /&gt;
 ttl=56 time=24.2 ms&lt;br /&gt;
 --- www.linuxformat.com ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 24.249/24.249/24.249/0.000 ms&lt;br /&gt;
&lt;br /&gt;
С помощью этого теста ошибки DNS сразу же выявляются, например:&lt;br /&gt;
&lt;br /&gt;
 $ ping www.prophylactic.gov&lt;br /&gt;
 ping: unknown host www.prophylactic.gov&lt;br /&gt;
&lt;br /&gt;
Если удаленный компьютер пингуется только по IP-адресу, но не по имени, пора изучать настройки вашего сервера DNS (LXF97). Для этого лучше всего подходит утилита dig. Вот пример ее запуска (успешного). Не пугайтесь обилием подробностей; нужно лишь обратить внимание на запись A в разделе ANSWER:&lt;br /&gt;
&lt;br /&gt;
 # dig www.linuxformat.com&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.linuxformat.com&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 23236&lt;br /&gt;
 ;; flags: qr rd ra; QUERY:1, ANSWER:2, AUTHORITY:2,&lt;br /&gt;
 ADDITIONAL:2&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;www.linuxformat.com. IN A&lt;br /&gt;
 ;; ANSWER SECTION:&lt;br /&gt;
 www.linuxformat.com. 300 IN CNAME redirect1.future.net.uk.&lt;br /&gt;
 redirect1.future.net.uk. 300 IN A 89.167.142.11&lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 future.net.uk. 245 IN NS ns0.future.net.uk.&lt;br /&gt;
 future.net.uk. 245 IN NS ns1.future.net.uk.&lt;br /&gt;
 ;; ADDITIONAL SECTION:&lt;br /&gt;
 ns0.future.net.uk. 33231 IN A 89.167.142.1&lt;br /&gt;
 ns1.future.net.uk. 33231 IN A 89.167.143.1&lt;br /&gt;
 ;; Query time: 41 msec&lt;br /&gt;
 ;; SERVER: 192.168.0.1#53(192.168.0.1)&lt;br /&gt;
 ;; WHEN: Fri Jul 6 15:21:44 2007&lt;br /&gt;
 ;; MSG SIZE rcvd: 158&lt;br /&gt;
&lt;br /&gt;
Если DNS не работает, вариантов может быть несколько.&lt;br /&gt;
&lt;br /&gt;
В первом случае сервер DNS не может найти компьютер, к которому вы обращаетесь. Вот пример обращения к серверу, которого просто&lt;br /&gt;
не существует:&lt;br /&gt;
&lt;br /&gt;
 # dig prophylactic.gov&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; prophylactic.gov&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NXDOMAIN, id: 13168&lt;br /&gt;
 ;; flags: qr rd ra; QUERY:1, ANSWER:0, AUTHORITY:1,&lt;br /&gt;
 ADDITIONAL:0&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;prophylactic.gov. IN A&lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 gov. 2560 IN SOA a.gov.zoneedit.com. govcontact.&lt;br /&gt;
 zoneedit.com. 1183644065 3600 900 1814400 86400&lt;br /&gt;
&lt;br /&gt;
Обратите внимание на статус запроса NXDOMAIN и отсутствие раздела ANSWER, который мы видели в результатах предыдущего запроса.&lt;br /&gt;
Если вы ввели корректное имя компьютера, то такая ошибка – следствие чьих-то чужих проблем.&lt;br /&gt;
&lt;br /&gt;
# Можете ли вы найти свой DNS-сервер?&lt;br /&gt;
&lt;br /&gt;
Вторая причина отказа DNS – ваш компьютер не может найти DNS-сервер. Тогда источник проблемы, вероятно, ближе к дому.&lt;br /&gt;
&lt;br /&gt;
 # dig www.linuxformat.co.uk&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.linuxformat.co.uk&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; connection timed out; no servers could be reached&lt;br /&gt;
&lt;br /&gt;
Если это произошло, загляните в файл /etc/resolv.conf. В нем Linux хранит сведения о местонахождении DNS-серверов. Если вы пользуетесь DHCP, IP-адреса DNS-серверов предоставляются сервером DHCP. Если IP-адрес статический, вы, наверно, использовали графическую утилиту настройки для определения параметров серверов DNS (например, system-config-network в Fedora). В любом случае результаты записываются в этот файл. Есть ли в нем корректный адрес сервера имен? Можете ли вы пинговать его?&lt;br /&gt;
&lt;br /&gt;
Если ничто не помогает, попробуйте просмотреть сетевой трафик с помощью wireshark, утилиты отслеживания пакетов, ранее известной как ethereal. Как средство диагностики wireshark, на мой взгляд, «последняя надежда». Дело не в недоработке этой программы: программа-то отличная, но чтобы искать неполадки в сети путем изучения трафика на уровне пакетов, нужно очень хорошо знать TCP/IP и прикладные протоколы верхних уровней. Вам также может потребоваться дополнительный компьютер в сети для наблюдения за трафиком.&lt;br /&gt;
&lt;br /&gt;
Выполните команду&lt;br /&gt;
&lt;br /&gt;
 # ping 192.168.0.42&lt;br /&gt;
&lt;br /&gt;
на компьютере с IP-адресом 192.168.0.3. Посмотрите на верхнюю из трех панелей wireshark; в ней каждому перехваченному пакету соответствует одна строка. Средняя и нижняя панели позволяют разобраться в содержимом отдельных пакетов, но сейчас они нам не нужны.&lt;br /&gt;
Сообщение простое и ясное: компьютер с адресом 192.168.0.3 пытается использовать ARP для получения MAC-адреса компьютера, до которого хочет достучаться. Он пытался сделать это три раза с интервалом в одну секунду, но не получил ответа.&lt;br /&gt;
&lt;br /&gt;
Итак, мы можем сделать вывод, что с компьютером, адрес которого 192.168.0.3, все в порядке – он может получать пакеты от компьютеров сети с корректными IP-адресами, но компьютера с адресом 192.168.0.42 там просто нет.&lt;br /&gt;
&lt;br /&gt;
===Смотрим дальше===&lt;br /&gt;
&lt;br /&gt;
Вот другой пример. На клиентском компьютере установлен SUSE Linux 10.1. Проблема была в том, что каждый раз, когда браузер Konqueror&lt;br /&gt;
пытался соединиться с внешним сайтом (т.е. производил поиск DNS-сервера), перед установкой соединения возникала 15-секундная задержка. На рис. 5 в нижней части этой колонки показан результат перехвата пакетов трафика Konqueror. Пакет 1 реализует стандартный запрос DNS для адреса www.linuxformat.co.uk, а пакет 3 – ответ на этот запрос, который приходит через 0.04 с от сервера DNS, встроенного в мой маршрутизатор (192.168.0.1) с требуемым IP-адресом. Чудесно. Проблема в том, что Konqueror также решил запросить IPv6-адрес для этого сайта (запрос записи AAAA в пакете 2). Слава богу, маршрутизатор игнорирует этот запрос, и через пять секунд Konqueror перенаправляет этот запрос к маршрутизатору (пакет 7) и ко внешнему серверу&lt;br /&gt;
DNS (пакет 6). Маршрутизатор все еще не отвечает, зато отвечает внешний DNS-сервер (пакет 8): сообщает, что не может найти записи AAAA для сайта linux.format.co.uk. Ну, теперь помаленьку проясняется...&lt;br /&gt;
&lt;br /&gt;
DNS-ресолвер приписывает доменное имя по умолчанию .example.com к адресу, который он пытается преобразовать (в результате получаем бессмыслицу www.linuxformat.co.uk.example.com) и начинает поиск записей AAAA для этого адреса. Он тратит еще пять секунд, надеясь получить ответ от маршрутизатора, после чего еще раз пытается обратиться к внешнему серверу DNS (пакет 10). В конце концов занавес над этой печальной историей опускается, и через пятнадцать секунд после начала Konqueror создает соединение TCP/IP (пакеты с 17-го и далее), используя старый добрый адрес IPv4, с которого и начал.&lt;br /&gt;
Оказалось, что это известная проблема, как свидетельствуют и результаты поиска Google по фразе “Konqueror IPv6”. Решение простое: отключите стек протоколов IPv6 в ядре, отредактировав файл /etc/modprobe.conf, и перезагрузите систему. Это хороший пример использования отслеживания пакетов для отладки, потому что другим способом решить эту проблему трудно. Не нужно проводить детальный анализ перехваченных пакетов, достаточно просто понять, что компьютер пытается разрешить имя в IPv6.&lt;br /&gt;
&lt;br /&gt;
Поиск неисправностей редко укладывается в обычные схемы диагностики. Ошибки имеют привычку просачиваться в щели между сложившейся литературой, и я уверен, что некоторые читатели (паратройка читателей у нас еще осталась, не правда ли?) столкнутся с ситуациями, в которых мои советы не помогут. Если у вас есть собственная история сетевых войн, которой вы хотели бы поделиться с нашими читателями, то отправьте нам ее на обычный адрес!&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/%D0%9D%D0%B5%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%B8%D0%B5_%D0%B0%D0%B2%D0%B8%D0%B0%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B</id>
		<title>Недорогие авиабилеты</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/%D0%9D%D0%B5%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%B8%D0%B5_%D0%B0%D0%B2%D0%B8%D0%B0%D0%B1%D0%B8%D0%BB%D0%B5%D1%82%D1%8B"/>
				<updated>2008-03-20T18:40:12Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: Новая: ==Диагностика: проблемы с сетью==  ''Если сеть у вас захворала, зовите Доктора! Правда, домашних визитов ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Диагностика: проблемы с сетью==&lt;br /&gt;
&lt;br /&gt;
''Если сеть у вас захворала, зовите Доктора! Правда, домашних визитов к читателям '''д-р Крис Браун''' не делает, но готов поделиться диагнозом…''&lt;br /&gt;
&lt;br /&gt;
За годы жизни я помог многим друзьям и знакомым освоиться&lt;br /&gt;
с компьютером, и в подходящих случаях обучал их Linux. При этом, естественно, возникает нечто вроде родительской ответственности за развитие и взросление своих питомцев. Последний случай был типичным. Друг позвонил мне со словами: «У меня не работает сеть». Такое сообщение об ошибке не уступает классической фразе с борта Аполлона-13 «Хьюстон, у нас проблема», хотя и менее опасно для жизни. К счастью, в Linux много сетевых утилит, которые помогают выяснить, что именно не работает. (Чтобы не томить вас ожиданием развязки, сразу скажу, что моего друга просто отключил провайдер,&lt;br /&gt;
потому что он забыл продлить контракт.)&lt;br /&gt;
&lt;br /&gt;
Итак, следуйте за мной: рассмотрим некоторые средства диагностики сетевых неисправностей в Linux и посмотрим, как с их помощью&lt;br /&gt;
получить ответ на вопрос «Что не так в моей сети?»&lt;br /&gt;
&lt;br /&gt;
При любом поиске неисправностей прежде всего нужно понять и представить, в чем выражается правильная работа. Есть ли у компьютера статический IP-адрес, и если да, то какой? Пользуетесь ли вы DHCP, и если да, то каков адрес DHCP-сервера и выделяемый диапазон IP-адресов? Подключен ли широкополосный модем непосредственно к вашему компьютеру или у вас широкополосный маршрутизатор через Ethernet или беспроводную сеть?&lt;br /&gt;
&lt;br /&gt;
На данном уроке мы будем использовать методику «снизу вверх»: начнем с самых низких уровней и постепенно переедем на более высокие. Примерная последовательность тестов, которые мы выполним, показана на рис. 1 в начале этой статьи слева. Это хороший систематический подход для случая, если сеть не работала никогда. С другой стороны, если вчера сеть работала отлично, чаще будет быстрее начать сверху и двигаться вниз.&lt;br /&gt;
&lt;br /&gt;
#1 '''Находит ли Linux сетевую карту?'''&lt;br /&gt;
&lt;br /&gt;
Первый вопрос на этом этапе – видит ли Linux сетевые интерфейсы?&lt;br /&gt;
Вы сможете ответить на него, просмотрев системные сообщения ядра,&lt;br /&gt;
которые выдавались во время загрузки. Для этого используется команда dmesg:&lt;br /&gt;
&lt;br /&gt;
 # dmesg | grep eth&lt;br /&gt;
 e1000: eth0: e1000_probe: Intel(R) PRO/1000 Network Connection&lt;br /&gt;
 e1000: eth1: e1000_probe: Intel(R) PRO/1000 Network Connection&lt;br /&gt;
 e1000: eth0: e1000_watchdog: NIC Link is Up 10 Mbps Half Duplex&lt;br /&gt;
&lt;br /&gt;
В качестве альтернативы попробуйте вывести список устройств на шине с помощью команды lspci:&lt;br /&gt;
&lt;br /&gt;
 # lspci | grep Ethernet&lt;br /&gt;
 01:01.0 Ethernet controller: Intel Corporation 82547EI&lt;br /&gt;
 02:01.0 Ethernet controller: Intel Corporation 82540EM&lt;br /&gt;
&lt;br /&gt;
Сообщения об ошибках на этой стадии говорят о неисправном или несовместимом оборудовании.&lt;br /&gt;
&lt;br /&gt;
#2 '''Задан ли IP-адрес?'''&lt;br /&gt;
&lt;br /&gt;
Если сетевая карта на месте, то следующий вопрос – задан ли IP-адрес? Простейшая команда для этого случая – ifconfig:&lt;br /&gt;
&lt;br /&gt;
 # ifconfig eth0&lt;br /&gt;
 eth0 Link encap:Ethernet HWaddr 00:0C:F1:96:A3:F7&lt;br /&gt;
 inet addr:192.168.0.3 Bcast:192.168.0.255 Mask:255.255.255.0&lt;br /&gt;
 inet6 addr: fe80::20c:f1ff:fe96:a3f7/64 Scope:Link&lt;br /&gt;
 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1&lt;br /&gt;
 RX packets:306 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
 TX packets:261 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
 collisions:8 txqueuelen:10&lt;br /&gt;
 RX bytes:43074 (42.0 KiB) TX bytes:34480 (33.6 KiB)&lt;br /&gt;
 Base address:0xac00 Memory:ff7e0000-ff800000&lt;br /&gt;
&lt;br /&gt;
Здесь важна вторая строка, в которой можно увидеть IP-адрес: 192.168.0.3. Если такой строки нет, то IP-адрес не задан. А если все же&lt;br /&gt;
задан, подумайте, действителен ли он в вашей сети.&lt;br /&gt;
&lt;br /&gt;
На практике я несколько раз сталкивался с ситуацией, когда сеть переставала работать после того, как в нее ввели компьютер, случайно&lt;br /&gt;
оказавшийся DHCP-сервером, настроенным на диапазон адресов, не соответствующих этой сети. При перезагрузке компьютер с шансами&lt;br /&gt;
50/50 получал или действительный IP-адрес от «настоящего» DHCP-сервера, или ложный адрес от самозванца.&lt;br /&gt;
&lt;br /&gt;
Если в сетевом интерфейсе не задан IP-адрес, то проверьте, настроен ли автоматический запуск этого интерфейса при загрузке системы. Если да, то использует ли он DHCP или статический IP-адрес? Конкретные имена файлов, которые нужно просмотреть, зависят от дистрибутива. В Fedora и Red Hat это /etc/sysconfig/network-scripts/ifcfg-eth*, в SUSE –/etc/sysconfig/network/ifcfg-eth*, а в Ubuntu – /etc/network/interfaces. (Стандарты – отличная штука: ну не прелестны ли эти ничем не объяснимые расхождения?) Конечно, в каждом из дистрибутивов есть графические утилиты, с помощью которых можно&lt;br /&gt;
посмотреть и отредактировать настройки.&lt;br /&gt;
&lt;br /&gt;
Обычно инициализация интерфейса упрятана глубоко в загрузочные скрипты, и взаимодействие с сервером DHCP разглядеть трудно; но его можно увидеть, непосредственно запустив скрипт ifup или dhclient. Эта программа поддерживает диалог с DHCP-сервером и позволяет задатьпараметры сети:&lt;br /&gt;
&lt;br /&gt;
 # dhclient&lt;br /&gt;
 Internet Systems Consortium DHCP Client V3.0.5-RedHatо&lt;br /&gt;
 Copyright 2004-2006 Internet Systems Consortium.&lt;br /&gt;
 All rights reserved.&lt;br /&gt;
 For info, please visit http://www.isc.org/sw/dhcp/&lt;br /&gt;
 Listening on LPF/eth1/00:0e:0c:01:d3:a0&lt;br /&gt;
 Sending on LPF/eth1/00:0e:0c:01:d3:a0&lt;br /&gt;
 Listening on LPF/eth0/00:0c:f1:96:a3:f7&lt;br /&gt;
 Sending on LPF/eth0/00:0c:f1:96:a3:f7&lt;br /&gt;
 Sending on Socket/fallback&lt;br /&gt;
 DHCPDISCOVER on eth1 to 255.255.255.255 port 67 interval 7&lt;br /&gt;
 DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 4&lt;br /&gt;
 DHCPOFFER from 192.168.0.1&lt;br /&gt;
 DHCPREQUEST on eth0 to 255.255.255.255 port 67&lt;br /&gt;
 DHCPACK from 192.168.0.1&lt;br /&gt;
 bound to 192.168.0.3 -- renewal in 125868 seconds.&lt;br /&gt;
&lt;br /&gt;
В данной системе два интерфейса, eth0 и eth1. Мы видим, что IP-адрес интерфейса eth0 получен от DHCP-сервера 192.168.0.1. Интерфейс eth1 пытался сделать то же самое (он передал команду DHCPDISCOVER), но не получил ответа. И неудивительно: этот интерфейс не был ни к чему подключен.&lt;br /&gt;
&lt;br /&gt;
#3 '''Пингуется ли маршрутизатор?'''&lt;br /&gt;
&lt;br /&gt;
Если IP-адрес задан корректно, пропингуйте (ping) другой компьютер в сети. В случае удачи результат будет примерно таким:&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 192.168.0.6&lt;br /&gt;
 PING 192.168.0.6 (192.168.0.6) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 192.168.0.6: icmp_seq=1 ttl=64 time=0.468 ms&lt;br /&gt;
 --- 192.168.0.6 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 0.468/0.468/0.468/0.000 ms&lt;br /&gt;
&lt;br /&gt;
а неудачи – таким:&lt;br /&gt;
&lt;br /&gt;
 # ping -c 1 192.168.0.2&lt;br /&gt;
 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.&lt;br /&gt;
 From 192.168.0.3 icmp_seq=1 Destination Host Unreachable&lt;br /&gt;
 --- 192.168.0.2 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms&lt;br /&gt;
&lt;br /&gt;
Сообщение «Узел недоступен» (Destination Host Unreachable) обычно значит, что целевой компьютер (здесь – 192.168.0.2) не подключен к&lt;br /&gt;
сети или не работает и поэтому не может ответить на ARP-запрос MAC-адреса с моего компьютера. Это также может означать, что ваш компьютер не находит маршрут доступа к локальной сети; чаще всего это бывает, когда ваш IP-адрес не входит в данную сеть. Возможны и более сложные проблемы с маршрутизацией – впрочем, в домашней сети, где маршрут (по умолчанию) только один, это маловероятно. Если в вашей сети нет других компьютеров, можно попробовать пропинговать маршрутизатор (Вы ведь знаете адрес своего маршрутизатора?).&lt;br /&gt;
&lt;br /&gt;
Если не получилось, то проблема носит местный характер. Если сеть проводная, проверьте кабели. Зеленые светодиоды на сетевых карточках должны гореть [некоторые сетевые карты имеют другой способ индикации подключения. В случае необходимости изучите инструкцию, – прим.ред.].&lt;br /&gt;
&lt;br /&gt;
#4 Не блокирован ли трафик брандмауэром?&lt;br /&gt;
&lt;br /&gt;
На некотором этапе нашего диагностирования полезно проверить, не чересчур ли «закручивает гайки» ваш брандмауэр. Самый быстрый&lt;br /&gt;
и грубый способ это узнать – и его предпочитают многие системные администраторы, если надо торопиться – удалить все правила брандмауэра командой&lt;br /&gt;
&lt;br /&gt;
 # iptables -F&lt;br /&gt;
&lt;br /&gt;
и посмотреть, изменится ли что-нибудь к лучшему. Если проблема исчезнет, то по крайней мере ясно, что ее причиной был брандмауэр.&lt;br /&gt;
Далее вам нужно перезагрузить компьютер (чтобы брандмауэр вновь заработал) и думать дальше. Не соблазняйтесь идеей оставить брандмауэр в отключке: это Плохая Идея!&lt;br /&gt;
&lt;br /&gt;
#5 Установлено ли ADSL-соединение ?&lt;br /&gt;
&lt;br /&gt;
Если с самим маршрутизатором все в порядке, пора расширить охват. На маршрутизаторе должно быть еще несколько зеленых светодиодов (а если найти инструкцию к нему, то можно даже понять, что они означают), и по ним можно определить, подключен ли ADSL-модем маршрутизатора к провайдеру. У некоторых маршрутизаторов также есть возможность задать настройки и определить статус соединения с помощью web-приложения. На рис. 3 показан пример такого приложения. Нас интересуют статус соединения (Connection Status) и IP-адрес, который провайдер назначил внешнему соединению. (Что это за адрес,&lt;br /&gt;
не столь важно; главное, чтоб он был!) Разорвите соединение и заново установите его вручную, и попробуйте понять, на каком этапе возникает ошибка. Если соединения не добиться, нужно проверить провод, соединяющий маршрутизатор с телефонной линией (полезно подключить телефонную трубку, чтобы убедиться в наличии зуммера). Если провод в порядке, остается позвонить в службу поддержки провайдера. Приготовьте себе чашку кофе и вооружитесь интересной книжкой – ждать своей очереди на линии можно очень долго!&lt;br /&gt;
&lt;br /&gt;
#6 '''Пингуется ли удаленный сервер?'''&lt;br /&gt;
&lt;br /&gt;
Если соединение с провайдером хорошее, тестированию пора подняться на уровень выше. Попробуйте пропинговать внешний компьютер с известным IP-адресом. Например, web-сервер Linux Format UK имеет адрес 89.167.142.11. (Конечно, он вполне может измениться, когда вы будете это читать, но пока для примера сгодится.)&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 89.167.142.11&lt;br /&gt;
 PING 89.167.142.11 (89.167.142.11) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from 89.167.142.11: icmp_seq=1 ttl=56 time=24.3 ms&lt;br /&gt;
 --- 89.167.142.11 ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 24.367/24.367/24.367/0.000 ms&lt;br /&gt;
&lt;br /&gt;
Если это работает, ваше сетевое соединение в порядке. В качестве последнего теста попробуйте добраться до удаленного компьютера по&lt;br /&gt;
его имени:&lt;br /&gt;
&lt;br /&gt;
 # ping -c1 www.linuxformat.com&lt;br /&gt;
 PING www.linuxformat.com (89.167.142.11) 56(84) bytes of data.&lt;br /&gt;
 64 bytes from kryten.future.net.uk (89.167.142.11): icmp_seq=1&lt;br /&gt;
 ttl=56 time=24.2 ms&lt;br /&gt;
 --- www.linuxformat.com ping statistics ---&lt;br /&gt;
 1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;
 rtt min/avg/max/mdev = 24.249/24.249/24.249/0.000 ms&lt;br /&gt;
&lt;br /&gt;
С помощью этого теста ошибки DNS сразу же выявляются, например:&lt;br /&gt;
&lt;br /&gt;
 $ ping www.prophylactic.gov&lt;br /&gt;
 ping: unknown host www.prophylactic.gov&lt;br /&gt;
&lt;br /&gt;
Если удаленный компьютер пингуется только по IP-адресу, но не по имени, пора изучать настройки вашего сервера DNS (LXF97). Для этого лучше всего подходит утилита dig. Вот пример ее запуска (успешного). Не пугайтесь обилием подробностей; нужно лишь обратить внимание на запись A в разделе ANSWER:&lt;br /&gt;
&lt;br /&gt;
 # dig www.linuxformat.com&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.linuxformat.com&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 23236&lt;br /&gt;
 ;; flags: qr rd ra; QUERY:1, ANSWER:2, AUTHORITY:2,&lt;br /&gt;
 ADDITIONAL:2&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;www.linuxformat.com. IN A&lt;br /&gt;
 ;; ANSWER SECTION:&lt;br /&gt;
 www.linuxformat.com. 300 IN CNAME redirect1.future.net.uk.&lt;br /&gt;
 redirect1.future.net.uk. 300 IN A 89.167.142.11&lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 future.net.uk. 245 IN NS ns0.future.net.uk.&lt;br /&gt;
 future.net.uk. 245 IN NS ns1.future.net.uk.&lt;br /&gt;
 ;; ADDITIONAL SECTION:&lt;br /&gt;
 ns0.future.net.uk. 33231 IN A 89.167.142.1&lt;br /&gt;
 ns1.future.net.uk. 33231 IN A 89.167.143.1&lt;br /&gt;
 ;; Query time: 41 msec&lt;br /&gt;
 ;; SERVER: 192.168.0.1#53(192.168.0.1)&lt;br /&gt;
 ;; WHEN: Fri Jul 6 15:21:44 2007&lt;br /&gt;
 ;; MSG SIZE rcvd: 158&lt;br /&gt;
&lt;br /&gt;
Если DNS не работает, вариантов может быть несколько.&lt;br /&gt;
&lt;br /&gt;
В первом случае сервер DNS не может найти компьютер, к которому вы обращаетесь. Вот пример обращения к серверу, которого просто&lt;br /&gt;
не существует:&lt;br /&gt;
&lt;br /&gt;
 # dig prophylactic.gov&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; prophylactic.gov&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; Got answer:&lt;br /&gt;
 ;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NXDOMAIN, id: 13168&lt;br /&gt;
 ;; flags: qr rd ra; QUERY:1, ANSWER:0, AUTHORITY:1,&lt;br /&gt;
 ADDITIONAL:0&lt;br /&gt;
 ;; QUESTION SECTION:&lt;br /&gt;
 ;prophylactic.gov. IN A&lt;br /&gt;
 ;; AUTHORITY SECTION:&lt;br /&gt;
 gov. 2560 IN SOA a.gov.zoneedit.com. govcontact.&lt;br /&gt;
 zoneedit.com. 1183644065 3600 900 1814400 86400&lt;br /&gt;
&lt;br /&gt;
Обратите внимание на статус запроса NXDOMAIN и отсутствие раздела ANSWER, который мы видели в результатах предыдущего запроса.&lt;br /&gt;
Если вы ввели корректное имя компьютера, то такая ошибка – следствие чьих-то чужих проблем.&lt;br /&gt;
&lt;br /&gt;
#7 Можете ли вы найти свой DNS-сервер?&lt;br /&gt;
&lt;br /&gt;
Вторая причина отказа DNS – ваш компьютер не может найти DNS-сервер. Тогда источник проблемы, вероятно, ближе к дому.&lt;br /&gt;
&lt;br /&gt;
 # dig www.linuxformat.co.uk&lt;br /&gt;
 ; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.4.0 &amp;lt;&amp;lt;&amp;gt;&amp;gt; www.linuxformat.co.uk&lt;br /&gt;
 ;; global options: printcmd&lt;br /&gt;
 ;; connection timed out; no servers could be reached&lt;br /&gt;
&lt;br /&gt;
Если это произошло, загляните в файл /etc/resolv.conf. В нем Linux хранит сведения о местонахождении DNS-серверов. Если вы пользуетесь DHCP, IP-адреса DNS-серверов предоставляются сервером DHCP. Если IP-адрес статический, вы, наверно, использовали графическую утилиту настройки для определения параметров серверов DNS (например, system-config-network в Fedora). В любом случае результаты записываются в этот файл. Есть ли в нем корректный адрес сервера имен? Можете ли вы пинговать его?&lt;br /&gt;
&lt;br /&gt;
Если ничто не помогает, попробуйте просмотреть сетевой трафик с помощью wireshark, утилиты отслеживания пакетов, ранее известной как ethereal. Как средство диагностики wireshark, на мой взгляд, «последняя надежда». Дело не в недоработке этой программы: программа-то отличная, но чтобы искать неполадки в сети путем изучения трафика на уровне пакетов, нужно очень хорошо знать TCP/IP и прикладные протоколы верхних уровней. Вам также может потребоваться дополнительный компьютер в сети для наблюдения за трафиком.&lt;br /&gt;
&lt;br /&gt;
Выполните команду&lt;br /&gt;
&lt;br /&gt;
 # ping 192.168.0.42&lt;br /&gt;
&lt;br /&gt;
на компьютере с IP-адресом 192.168.0.3. Посмотрите на верхнюю из трех панелей wireshark; в ней каждому перехваченному пакету соответствует одна строка. Средняя и нижняя панели позволяют разобраться в содержимом отдельных пакетов, но сейчас они нам не нужны.&lt;br /&gt;
Сообщение простое и ясное: компьютер с адресом 192.168.0.3 пытается использовать ARP для получения MAC-адреса компьютера, до которого хочет достучаться. Он пытался сделать это три раза с интервалом в одну секунду, но не получил ответа.&lt;br /&gt;
&lt;br /&gt;
Итак, мы можем сделать вывод, что с компьютером, адрес которого 192.168.0.3, все в порядке – он может получать пакеты от компьютеров сети с корректными IP-адресами, но компьютера с адресом 192.168.0.42 там просто нет.&lt;br /&gt;
&lt;br /&gt;
===Смотрим дальше===&lt;br /&gt;
&lt;br /&gt;
Вот другой пример. На клиентском компьютере установлен SUSE Linux 10.1. Проблема была в том, что каждый раз, когда браузер Konqueror&lt;br /&gt;
пытался соединиться с внешним сайтом (т.е. производил поиск DNS-сервера), перед установкой соединения возникала 15-секундная задержка. На рис. 5 в нижней части этой колонки показан результат перехвата пакетов трафика Konqueror. Пакет 1 реализует стандартный запрос DNS для адреса www.linuxformat.co.uk, а пакет 3 – ответ на этот запрос, который приходит через 0.04 с от сервера DNS, встроенного в мой маршрутизатор (192.168.0.1) с требуемым IP-адресом. Чудесно. Проблема в том, что Konqueror также решил запросить IPv6-адрес для этого сайта (запрос записи AAAA в пакете 2). Слава богу, маршрутизатор игнорирует этот запрос, и через пять секунд Konqueror перенаправляет этот запрос к маршрутизатору (пакет 7) и ко внешнему серверу&lt;br /&gt;
DNS (пакет 6). Маршрутизатор все еще не отвечает, зато отвечает внешний DNS-сервер (пакет 8): сообщает, что не может найти записи AAAA для сайта linux.format.co.uk. Ну, теперь помаленьку проясняется...&lt;br /&gt;
&lt;br /&gt;
DNS-ресолвер приписывает доменное имя по умолчанию .example.com к адресу, который он пытается преобразовать (в результате получаем бессмыслицу www.linuxformat.co.uk.example.com) и начинает поиск записей AAAA для этого адреса. Он тратит еще пять секунд, надеясь получить ответ от маршрутизатора, после чего еще раз пытается обратиться к внешнему серверу DNS (пакет 10). В конце концов занавес над этой печальной историей опускается, и через пятнадцать секунд после начала Konqueror создает соединение TCP/IP (пакеты с 17-го и далее), используя старый добрый адрес IPv4, с которого и начал.&lt;br /&gt;
Оказалось, что это известная проблема, как свидетельствуют и результаты поиска Google по фразе “Konqueror IPv6”. Решение простое: отключите стек протоколов IPv6 в ядре, отредактировав файл /etc/modprobe.conf, и перезагрузите систему. Это хороший пример использования отслеживания пакетов для отладки, потому что другим способом решить эту проблему трудно. Не нужно проводить детальный анализ перехваченных пакетов, достаточно просто понять, что компьютер пытается разрешить имя в IPv6.&lt;br /&gt;
&lt;br /&gt;
Поиск неисправностей редко укладывается в обычные схемы диагностики. Ошибки имеют привычку просачиваться в щели между сложившейся литературой, и я уверен, что некоторые читатели (паратройка читателей у нас еще осталась, не правда ли?) столкнутся с ситуациями, в которых мои советы не помогут. Если у вас есть собственная история сетевых войн, которой вы хотели бы поделиться с нашими читателями, то отправьте нам ее на обычный адрес!&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:KDE</id>
		<title>LXF98:KDE</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:KDE"/>
				<updated>2008-03-20T17:56:44Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: /* Горячие клавиши */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;font color=darkred&amp;gt;KDE:&amp;lt;/font&amp;gt; Галерея на рабочем столе==&lt;br /&gt;
&lt;br /&gt;
''Маэстро '''Дэвид Фили''' покажет, как легко превратить ваш рабочий стол в картинную галерею с помощью DCOP, Perl и шаманства с командной строкой.''&lt;br /&gt;
&lt;br /&gt;
Одно из величайших достижений Linux – даруемая им свобода: в частности, это свобода что-то переопределить, подправить и настроить «как хочется», а не довольствоваться тем, «что дают». К примеру, я сейчас интересуюсь искусством, и хотел бы поместить коллекцию картин старых мастеров на обои моего рабочего стола. Беда в том, что мне все быстро надоедает, поэтому нужен также простой способ чередовать эти изображения; да и память у меня прескверная, а надо как-то отличать моего Караваджо от моего Констебля.&lt;br /&gt;
&lt;br /&gt;
Желаю иметь возможность вводить и просматривать примечания ко всем картинам, чтобы над ними всплывали сообщения с подсказками про имя художника, год написания и музей, где она находится, и, может быть, парой кратких заметок, благодаря которым я смогу притвориться, будто знаю, на что это я тут глазею, если меня вдруг станут расспрашивать.&lt;br /&gt;
&lt;br /&gt;
В Linux и KDE такое вполне достижимо, если связать вместе различные инструменты командной строки и скрипты: классическая концепция Unix/Linux по объединению нескольких инструментов общего назначения в полезное приложение. Целью данной статьи является подготовка скрипта, управляющего нашей псевдоКартинной Галереей на фоне рабочего стола. Определим также несколько горячих клавиш, нажатия на которые обеспечат следующие действия:&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;
 $ mkdir ~/BackgroundArt&lt;br /&gt;
&lt;br /&gt;
и скопируем туда какие-нибудь картинки (какие попались под руку). Выберите из них пригодные для обоев рабочего стола. Это будет наш запасник. Построив основную инфраструктуру, вы сможете более придирчиво отобрать экспозицию вашей галереи.&lt;br /&gt;
&lt;br /&gt;
В KDE можно воспользоваться вызовами DCOP для извлечения текущего фонового изображения (см. учебник в LXF79 для введения в DCOP). Но сперва определим, на каком рабочем столе мы находимся. Вот вызов DCOP для этого:&lt;br /&gt;
&lt;br /&gt;
 $ dcop kwin KWinInterface currentDesktop&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
Вывод гласит, что в данный момент я на &amp;lt;font color=darkblue&amp;gt;Рабочем столе&amp;lt;/font&amp;gt; 2. Вот и чудненько: наличие нескольких рабочих столов прибавит нам разнообразия в отображении обоев! Давайте теперь узнаем, какие обои установлены на активном рабочем столе:&lt;br /&gt;
&lt;br /&gt;
 $ dcop kdesktop KBackgroundIface currentWallpaper 2&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg&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;
 $ ls ~/BackgroundArt/* &amp;gt; ~/BackgroundArt/.index.txt&lt;br /&gt;
&lt;br /&gt;
Текстовому файлу дано имя, начинающееся с точки, чтобы он не отображал сам себя в выводе команды &amp;lt;font color=darkred&amp;gt;ls&amp;lt;/font&amp;gt; в процессе обновления при добавке новых изображений. Для примера, вот мой собственный список:&lt;br /&gt;
&lt;br /&gt;
 $ more ~/BackgroundArt/.index.txt&lt;br /&gt;
 /home/dave/BackgroundArt/Botticelli-Venus.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-David_goliath.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Decapitation_of_john_the_ baptist.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Judith_Beheading_Holofernes. jpg&lt;br /&gt;
 /home/dave/BackgroundArt/caravaggio-st_thomas.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Tizian-Urbino_Venus.jpg&lt;br /&gt;
&lt;br /&gt;
Чтобы выяснить позицию текущего файла в этом списке, можно использовать команду &amp;lt;font color=darkred&amp;gt;grep&amp;lt;/font&amp;gt;. Применение флажка &amp;lt;font color=darkred&amp;gt;-n &amp;lt;/font&amp;gt;добавит номер строки в вывод, показывающий позицию текущего изображения в файле.&lt;br /&gt;
&lt;br /&gt;
 grep -n /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg ~/BackgroundArt/.index.txt&lt;br /&gt;
 4:/home/dave/BackgroundArt/Caravaggio-Emmaus.jpg&lt;br /&gt;
&lt;br /&gt;
Стало быть, текущее изображение находится в четвертой строке нашего индексного файла. Давайте направим вывод в команду &amp;lt;font color=darkred&amp;gt;cut&amp;lt;/font&amp;gt;, чтобы возвращать только номер строки: остальное нам неинтересно. Символ перенаправления – &amp;lt;font color=darkred&amp;gt;|&amp;lt;/font&amp;gt;, обычно он находится в верхнем регистре (т.е. получается при нажатом &amp;lt;font color=darkblue&amp;gt;Shift&amp;lt;/font&amp;gt;) над клавишей &amp;lt;font color=darkblue&amp;gt;Enter&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 $ grep -n /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg ~/BackgroundArt/.index.txt | cut -d’:’ -f1&lt;br /&gt;
 4&lt;br /&gt;
&lt;br /&gt;
Теперь надо найти следующее (или предыдущее) изображение в списке. Что ж, в зависимости от того, куда собираемся двигаться, вперед или назад, мы можем просто увеличить или уменьшить текущий номер, а затем вытащить требуемую строку из файла с помощью хитроумной комбинации команд &amp;lt;font color=darkred&amp;gt;head&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;tail&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 $ head -5 ~/BackgroundArt/.index.txt | tail -1&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Judith_Beheading_Holofernes.jpg&lt;br /&gt;
&lt;br /&gt;
Когда мы примемся за скрипт, вы заметите, что не мешает предотвратить чрезмерное продвижение вперед или назад, чтобы не заскочить за конец или до начала файла. В подобных случаях следует переходить на начало или конец файла – тогда нам нужно знать, сколько изображений в списке. Мы можем получить это число при помощи команды &amp;lt;font color=darkred&amp;gt;wc&amp;lt;/font&amp;gt;; перенаправив ее в &amp;lt;font color=darkred&amp;gt;cut&amp;lt;/font&amp;gt;, выделим необходимую информацию (число строк).&lt;br /&gt;
&lt;br /&gt;
 $ wc -l ~/BackgroundArt/.index.txt | cut -d ’ ‘ -f 1&lt;br /&gt;
 9&lt;br /&gt;
&lt;br /&gt;
Определив, какое изображение показывать следующим, установим его в качестве новых обоев с помощью вызова &amp;lt;font color=darkred&amp;gt;dcop&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 $ dcop kdesktop KBackgroundIface setWallpaper 2 /home/dave/BackgroundArt/Caravaggio-Judith_Beheading_Holofernes.jpg 4&lt;br /&gt;
&lt;br /&gt;
Последний параметр – номер режима, описывающего, как поступить с изображением: уложить черепицей, растянуть и т.д. Здесь есть насколько вариантов. По-моему, четвертый – поместить по центру с масштабированием – больше всего подходит для картин: размеры изображения при выводе на экран получаются максимально возможными с сохранением исходных пропорций. Ваши требования могут быть иными, так что экспериментируйте с этими вариантами, чтобы&lt;br /&gt;
получить результат, оптимальный для ваших изображений.&lt;br /&gt;
&lt;br /&gt;
===Вспомнить то время...===&lt;br /&gt;
&lt;br /&gt;
Итак, мы обзавелись механизмом, позволяющим перемещаться по списку изображений; но не забывайте, что нужен еще способ вспомнить что-то, связанное с каждой картиной, которую мы видим. Давайте добавим эту функцию. Во-первых, потребуется подкаталог для хранения заметок к каждому изображению. Допустим, у нас есть файл '''MonaLisa.jpg'''; давайте хранить заметки по его поводу в файле '''MonaLisa.jpg.txt''', и держать все файлы в одном месте, разместив их в подкаталоге '''info''' каталога '''BackgroundArt'''. Префикс «точка» опять-таки позволит '''.info''' не попадать в список изображений по команде &amp;lt;font color=darkred&amp;gt;ls&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 $ mkdir ~/BackgroundArt/.info&lt;br /&gt;
 $ echo “Artist: Caravaggio, blah blah” &amp;gt; /home/dave/BackgroundArt/.info/Caravaggio-Emmaus.jpg.txt&lt;br /&gt;
&lt;br /&gt;
Для показа всплывающих сообщений над фоновыми картинками используем утилиту ''kdialog'', имеющую пару приятных и полезных возможностей – в частности, всплывающий «пузырь», который можно употребить для показа нашей заметки.&lt;br /&gt;
&lt;br /&gt;
 $ kdialog --passivepopup “Немного интересной информации” 60&lt;br /&gt;
&lt;br /&gt;
Вы задаете параметры отображаемого текста, а также продолжительность его показа в секундах. Всплывающее сообщение будет исчезать само, когда истечет время показа или когда пользователь нажмет на него, поэтому задайте побольше времени, чтобы успеть его прочитать, скажем, секунд 60. Информацию в '''info'''-файлах, которую мы хотим отобразить, раздобудет наш скрипт. Экранный снимок на предыдущей странице показывает всплывающее окно в действии.&lt;br /&gt;
&lt;br /&gt;
Но позвольте, откуда возьмутся заметки для всех наших картин – ведь придется создавать множество текстовых файлов, сохранять их в требуемом месте, да еще бдительно следить, чтобы не перепутать их имена? Вовсе нет – еще немного скриптинга, и мы сможем ввести примечания к картине через другое всплывающее окно, снова призвав на помощь ''kdialog'':&lt;br /&gt;
&lt;br /&gt;
 $ kdialog --textinputbox “Это заголовок” “Немного интересных фактов для ввода” &lt;br /&gt;
&lt;br /&gt;
Мы можем отобразить диалоговое окно ввода. Если для данного изображения уже существуют какие-нибудь записи, их-то мы и покажем в окне, а скрипт позаботится о поиске этих записей и передаче их в ''kdialog''.&lt;br /&gt;
&lt;br /&gt;
Возвращаемое ''kdialog'' значение будет содержать (свежеотредактированный) текст. Если не было изменений в поле редактирования, значит, возвращаемые данные будут те же, что и исходный текст. Наш скрипт следит за записью этих данных обратно в файл примечаний к изображению.&lt;br /&gt;
&lt;br /&gt;
===А теперь все вместе===&lt;br /&gt;
&lt;br /&gt;
Мы вчерне описали работу отдельных команд. Давайте сведем команды в скрипт &amp;lt;font color=darkred&amp;gt;wallpaper&amp;lt;/font&amp;gt;. Все выполняемые действия мы будем делать с помощью одного скрипта, передавая в него флажки, контролирующие выбор действия. Мне кажется уместным сперва определить перечень этих действий и соответствующих флажков.&lt;br /&gt;
&lt;br /&gt;
Скрипт будет вызываться следующим образом:&lt;br /&gt;
&lt;br /&gt;
 wallpaper &amp;lt; флажки опций &amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вызов его без параметров по умолчанию обеспечивает переход на следующее изображение в галерее. &amp;lt;font color=darkred&amp;gt;&amp;lt;флажок опции&amp;gt;&amp;lt;/font&amp;gt; может быть таким:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;font color=darkred&amp;gt;-p&amp;lt;/font&amp;gt; перейти к предыдущему изображению.&lt;br /&gt;
*&amp;lt;font color=darkred&amp;gt;-i&amp;lt;/font&amp;gt; показать всплывающее окно с информацией о текущем изображении.&lt;br /&gt;
*&amp;lt;font color=darkred&amp;gt;-e&amp;lt;/font&amp;gt; отобразить окно Редактировать для текущего изображения.&lt;br /&gt;
*&amp;lt;font color=darkred&amp;gt;-h&amp;lt;/font&amp;gt; показать справку.&lt;br /&gt;
&lt;br /&gt;
Скрипт целиком можно взять на DVD. Большая его часть соответствует нашему описанию. В основном мы использовали вызовы внешних программ, захват вывода и стыковку частей, с небольшими вкраплениями логики там и сям. Чтобы избежать дублирования отдельных кусков кода и придать скрипту подобие структуры, используются подпрограммы.&lt;br /&gt;
&lt;br /&gt;
Применим полезный модуль &amp;lt;font color=darkred&amp;gt;Perl Getopt::Std&amp;lt;/font&amp;gt; для обработки параметров, передаваемых в скрипт. В строке&lt;br /&gt;
 &lt;br /&gt;
 getopts(‘pieh’, \my %opts);&lt;br /&gt;
&lt;br /&gt;
мы перечисляем разрешенные флажки и сохраняем их значения в переменной &amp;lt;font color=darkred&amp;gt;%opts&amp;lt;/font&amp;gt; для дальнейшего использования.&lt;br /&gt;
&lt;br /&gt;
Установив некоторые первоначальные значения для текущего рабочего стола, текущую фоновую картину и т.д., приступим к непосредственно к выполнению действий, в зависимости от установленного флажка. Действия &amp;lt;font color=darkred&amp;gt;Info()&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;Edit()&amp;lt;/font&amp;gt; аналогичны – в обоих случаях скрипт получает имя файла, содержащего информацию о текущем изображении:&lt;br /&gt;
&lt;br /&gt;
 my $infofile = getInfoFile($currentImage);&lt;br /&gt;
&lt;br /&gt;
Подпрограмма &amp;lt;font color=darkred&amp;gt;getInfoFile&amp;lt;/font&amp;gt; использует регулярное выражение для манипулирования именем/расположением файла, чтобы найти местоположение для соответствующего файла с информацией. Например, для файла изображения&lt;br /&gt;
&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg&lt;br /&gt;
&lt;br /&gt;
процедура вернет следующий путь к ассоциированному информационному файлу:&lt;br /&gt;
&lt;br /&gt;
 /home/dave/BackgroundArt/.info/Caravaggio-Emmaus.jpg.txt&lt;br /&gt;
&lt;br /&gt;
Процедура &amp;lt;font color=darkred&amp;gt;getInfoFile&amp;lt;/font&amp;gt; делает это с помощью регулярного выражения&lt;br /&gt;
&lt;br /&gt;
 $infofile =~ s#^(.*)/(.*)#$1/.info/$2.txt#;&lt;br /&gt;
&lt;br /&gt;
Определив имя &amp;lt;font color=darkred&amp;gt;infofile&amp;lt;/font&amp;gt;, процедуры &amp;lt;font color=darkred&amp;gt;readFile&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;writeFile&amp;lt;/font&amp;gt; позаботятся о чтении/записи содержимого по мере надобности. Регулярные выражения являются мощными инструментами для выполнения поиска вхождений строк в тексте и их замены. (Не берите в голову заботу о доскональном понимании синтаксиса, если это для вас в новинку – введение в регулярные выражения требует отдельной статьи! Если у вас есть журнал LXF70, то там такая статья опубликована).&lt;br /&gt;
&lt;br /&gt;
===Горячие клавиши===&lt;br /&gt;
&lt;br /&gt;
Теперь скрипт у нас есть, но он не совсем удобен: приходится вводить команду (с параметрами) для каждого изменения обоев или просмотра всплывающих сообщений. Лучше вместо этого использовать возможности KDE по привязке действий по вводу к горячим клавишам. Лично мне нравится использовать многоклавишные комбинации, чтобы группировать похожие действия. Поэтому &amp;lt;font color=darkblue&amp;gt;Alt+B&amp;lt;/font&amp;gt; для меня будет означать группу операций над обоями, а &amp;lt;font color=darkblue&amp;gt;Alt+B&amp;lt;/font&amp;gt; в сочетании с еще одной клавишей уже выполнят конкретное действие: например, &amp;lt;font color=darkblue&amp;gt;Alt+B,N&amp;lt;/font&amp;gt; выведет следующее изображение, а &amp;lt;font color=darkblue&amp;gt;Alt+B,P&amp;lt;/font&amp;gt; вернет нас к предыдущему.&lt;br /&gt;
&lt;br /&gt;
В порядке иллюстрации создадим одну такую комбинацию. В &amp;lt;font color=darkblue&amp;gt;Input Actions [Ввод]&amp;lt;/font&amp;gt; KDE (обычно расположенном в меню &amp;lt;font color=darkblue&amp;gt;Regional and Accessibilty [Региональные настройки и специальные возможности]&amp;lt;/font&amp;gt; в &amp;lt;font color=darkblue&amp;gt;KDE Control Center [Центр управления KDE]&amp;lt;/font&amp;gt;), создайте новую группу &amp;lt;font color=darkblue&amp;gt;‘Wallpaper Actions’&amp;lt;/font&amp;gt;. Нажмите на группу и создайте новое действие. Назовите его &amp;lt;font color=darkblue&amp;gt;WallpaperNext&amp;lt;/font&amp;gt;, установите тип действия &amp;lt;font color=darkblue&amp;gt;Action &amp;gt; Command(url)&amp;lt;/font&amp;gt; [&amp;lt;font color=darkblue&amp;gt;Комбинация клавиш -&amp;gt; команда/URL&amp;lt;/font&amp;gt;]. Установите комбинацию клавиш (многоклавишный режим) &amp;lt;font color=darkblue&amp;gt;Alt+B,N&amp;lt;/font&amp;gt;, и параметры команды &amp;lt;font color=darkblue&amp;gt;/home/dave/bin/wallpaper&amp;lt;/font&amp;gt; (или путь, где вы сохранили свой скрипт). Нажмите &amp;lt;font color=darkblue&amp;gt;ОК&amp;lt;/font&amp;gt;, и пробуйте. Нажатие &amp;lt;font color=darkblue&amp;gt;Alt+B,N&amp;lt;/font&amp;gt; должно привести к замене текущих обоев следующим изображением вашей галереи. Если это действие работает нормально, двигаемся дальше и добавляем остальные комбинации клавиш.&lt;br /&gt;
&lt;br /&gt;
===Примочки===&lt;br /&gt;
&lt;br /&gt;
Итак, основная часть готова. Как еще улучшить наш скрипт? Ну, можно автоматизировать создание индексного файла, чтобы добавлять/удалять изображения в каталоге и не думать о его ручном обновлении. Добавим задание ''cron'', чтобы это происходило раз в день:&lt;br /&gt;
&lt;br /&gt;
 crontab -e&lt;br /&gt;
 05 12 * * * ls /home/dave/BackgroundArt/* &amp;gt; /home/dave/BackgroundArt/.index.txt&lt;br /&gt;
&lt;br /&gt;
Что еще? Мне нравится идея использования в качестве обоев праздничных фотографий. Или плакатов фильмов, или снимков с телескопа Хаббла. Но надо ли все это помещать в единый список? Наоборот, лучше создать отдельные категории и переключаться между ними. Этого можно добиться, приложив еще немного труда. Мы создадим отдельный каталог для каждой категории изображения. Сложность только в определении, к какой категории принадлежит текущее изображение. Для простоты, будем тупо просматривать наш индексный файл, и если соответствия не найдется, то разместим изображение в категории по умолчанию, допустим, &amp;lt;font color=darkblue&amp;gt;Art&amp;lt;/font&amp;gt;. На DVD вы найдете расширенную версию скрипта, с поддержкой категорий. Я добавил еще горячих клавиш для переключения между категориями.&lt;br /&gt;
&lt;br /&gt;
Другим дополнением может быть предложение пользователю диалога, в котором он мог бы выбрать изображение из списка. Иначе в большой галерее надо будет много раз прокручивать изображения назад и вперед в поисках того или иного образа. (Подсказка: посмотрите опцию &amp;lt;font color=darkred&amp;gt;–combobox&amp;lt;/font&amp;gt; утилиты ''kdialog''). Также&lt;br /&gt;
можно случайным образом выбирать картину из галереи. Это можно автоматизировать через ''cron'' и изменять фон ежедневно.&lt;br /&gt;
&lt;br /&gt;
==Врезки==&lt;br /&gt;
&lt;br /&gt;
===Горячие клавиши===&lt;br /&gt;
&lt;br /&gt;
====Смена изображений====&lt;br /&gt;
&lt;br /&gt;
{| align=center border=1&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Горячие клавиши&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Действие&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Команда&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, N&amp;lt;/center&amp;gt;&lt;br /&gt;
|Перейти к следующему изображению&lt;br /&gt;
|wallpaper&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, P&amp;lt;/center&amp;gt;&lt;br /&gt;
|Перейти к предыдущему изображению&lt;br /&gt;
|walpaper -p&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, I&amp;lt;/center&amp;gt;&lt;br /&gt;
|Отобразить информацию о текущем изображении&lt;br /&gt;
|wallpaper -e&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, E&amp;lt;/center&amp;gt;&lt;br /&gt;
|Изменить информацию о текущем изображении&lt;br /&gt;
|wallpaper -e&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Навигация====&lt;br /&gt;
&lt;br /&gt;
{| align=center border=1&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Горячие клавиши&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Действие&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Команда&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, A&amp;lt;/center&amp;gt;&lt;br /&gt;
|Переход к категории Art&lt;br /&gt;
|wallpaper -c Art&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, H&amp;lt;/center&amp;gt;&lt;br /&gt;
|Переход к категории Holiday&lt;br /&gt;
|walpaper -c Holiday&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, M&amp;lt;/center&amp;gt;&lt;br /&gt;
|Переход к категории Movie&lt;br /&gt;
|wallpaper -c Movie&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:KDE</id>
		<title>LXF98:KDE</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:KDE"/>
				<updated>2008-03-20T17:56:12Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: /* Горячие клавиши */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;font color=darkred&amp;gt;KDE:&amp;lt;/font&amp;gt; Галерея на рабочем столе==&lt;br /&gt;
&lt;br /&gt;
''Маэстро '''Дэвид Фили''' покажет, как легко превратить ваш рабочий стол в картинную галерею с помощью DCOP, Perl и шаманства с командной строкой.''&lt;br /&gt;
&lt;br /&gt;
Одно из величайших достижений Linux – даруемая им свобода: в частности, это свобода что-то переопределить, подправить и настроить «как хочется», а не довольствоваться тем, «что дают». К примеру, я сейчас интересуюсь искусством, и хотел бы поместить коллекцию картин старых мастеров на обои моего рабочего стола. Беда в том, что мне все быстро надоедает, поэтому нужен также простой способ чередовать эти изображения; да и память у меня прескверная, а надо как-то отличать моего Караваджо от моего Констебля.&lt;br /&gt;
&lt;br /&gt;
Желаю иметь возможность вводить и просматривать примечания ко всем картинам, чтобы над ними всплывали сообщения с подсказками про имя художника, год написания и музей, где она находится, и, может быть, парой кратких заметок, благодаря которым я смогу притвориться, будто знаю, на что это я тут глазею, если меня вдруг станут расспрашивать.&lt;br /&gt;
&lt;br /&gt;
В Linux и KDE такое вполне достижимо, если связать вместе различные инструменты командной строки и скрипты: классическая концепция Unix/Linux по объединению нескольких инструментов общего назначения в полезное приложение. Целью данной статьи является подготовка скрипта, управляющего нашей псевдоКартинной Галереей на фоне рабочего стола. Определим также несколько горячих клавиш, нажатия на которые обеспечат следующие действия:&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;
 $ mkdir ~/BackgroundArt&lt;br /&gt;
&lt;br /&gt;
и скопируем туда какие-нибудь картинки (какие попались под руку). Выберите из них пригодные для обоев рабочего стола. Это будет наш запасник. Построив основную инфраструктуру, вы сможете более придирчиво отобрать экспозицию вашей галереи.&lt;br /&gt;
&lt;br /&gt;
В KDE можно воспользоваться вызовами DCOP для извлечения текущего фонового изображения (см. учебник в LXF79 для введения в DCOP). Но сперва определим, на каком рабочем столе мы находимся. Вот вызов DCOP для этого:&lt;br /&gt;
&lt;br /&gt;
 $ dcop kwin KWinInterface currentDesktop&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
Вывод гласит, что в данный момент я на &amp;lt;font color=darkblue&amp;gt;Рабочем столе&amp;lt;/font&amp;gt; 2. Вот и чудненько: наличие нескольких рабочих столов прибавит нам разнообразия в отображении обоев! Давайте теперь узнаем, какие обои установлены на активном рабочем столе:&lt;br /&gt;
&lt;br /&gt;
 $ dcop kdesktop KBackgroundIface currentWallpaper 2&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg&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;
 $ ls ~/BackgroundArt/* &amp;gt; ~/BackgroundArt/.index.txt&lt;br /&gt;
&lt;br /&gt;
Текстовому файлу дано имя, начинающееся с точки, чтобы он не отображал сам себя в выводе команды &amp;lt;font color=darkred&amp;gt;ls&amp;lt;/font&amp;gt; в процессе обновления при добавке новых изображений. Для примера, вот мой собственный список:&lt;br /&gt;
&lt;br /&gt;
 $ more ~/BackgroundArt/.index.txt&lt;br /&gt;
 /home/dave/BackgroundArt/Botticelli-Venus.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-David_goliath.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Decapitation_of_john_the_ baptist.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Judith_Beheading_Holofernes. jpg&lt;br /&gt;
 /home/dave/BackgroundArt/caravaggio-st_thomas.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Tizian-Urbino_Venus.jpg&lt;br /&gt;
&lt;br /&gt;
Чтобы выяснить позицию текущего файла в этом списке, можно использовать команду &amp;lt;font color=darkred&amp;gt;grep&amp;lt;/font&amp;gt;. Применение флажка &amp;lt;font color=darkred&amp;gt;-n &amp;lt;/font&amp;gt;добавит номер строки в вывод, показывающий позицию текущего изображения в файле.&lt;br /&gt;
&lt;br /&gt;
 grep -n /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg ~/BackgroundArt/.index.txt&lt;br /&gt;
 4:/home/dave/BackgroundArt/Caravaggio-Emmaus.jpg&lt;br /&gt;
&lt;br /&gt;
Стало быть, текущее изображение находится в четвертой строке нашего индексного файла. Давайте направим вывод в команду &amp;lt;font color=darkred&amp;gt;cut&amp;lt;/font&amp;gt;, чтобы возвращать только номер строки: остальное нам неинтересно. Символ перенаправления – &amp;lt;font color=darkred&amp;gt;|&amp;lt;/font&amp;gt;, обычно он находится в верхнем регистре (т.е. получается при нажатом &amp;lt;font color=darkblue&amp;gt;Shift&amp;lt;/font&amp;gt;) над клавишей &amp;lt;font color=darkblue&amp;gt;Enter&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 $ grep -n /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg ~/BackgroundArt/.index.txt | cut -d’:’ -f1&lt;br /&gt;
 4&lt;br /&gt;
&lt;br /&gt;
Теперь надо найти следующее (или предыдущее) изображение в списке. Что ж, в зависимости от того, куда собираемся двигаться, вперед или назад, мы можем просто увеличить или уменьшить текущий номер, а затем вытащить требуемую строку из файла с помощью хитроумной комбинации команд &amp;lt;font color=darkred&amp;gt;head&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;tail&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 $ head -5 ~/BackgroundArt/.index.txt | tail -1&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Judith_Beheading_Holofernes.jpg&lt;br /&gt;
&lt;br /&gt;
Когда мы примемся за скрипт, вы заметите, что не мешает предотвратить чрезмерное продвижение вперед или назад, чтобы не заскочить за конец или до начала файла. В подобных случаях следует переходить на начало или конец файла – тогда нам нужно знать, сколько изображений в списке. Мы можем получить это число при помощи команды &amp;lt;font color=darkred&amp;gt;wc&amp;lt;/font&amp;gt;; перенаправив ее в &amp;lt;font color=darkred&amp;gt;cut&amp;lt;/font&amp;gt;, выделим необходимую информацию (число строк).&lt;br /&gt;
&lt;br /&gt;
 $ wc -l ~/BackgroundArt/.index.txt | cut -d ’ ‘ -f 1&lt;br /&gt;
 9&lt;br /&gt;
&lt;br /&gt;
Определив, какое изображение показывать следующим, установим его в качестве новых обоев с помощью вызова &amp;lt;font color=darkred&amp;gt;dcop&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 $ dcop kdesktop KBackgroundIface setWallpaper 2 /home/dave/BackgroundArt/Caravaggio-Judith_Beheading_Holofernes.jpg 4&lt;br /&gt;
&lt;br /&gt;
Последний параметр – номер режима, описывающего, как поступить с изображением: уложить черепицей, растянуть и т.д. Здесь есть насколько вариантов. По-моему, четвертый – поместить по центру с масштабированием – больше всего подходит для картин: размеры изображения при выводе на экран получаются максимально возможными с сохранением исходных пропорций. Ваши требования могут быть иными, так что экспериментируйте с этими вариантами, чтобы&lt;br /&gt;
получить результат, оптимальный для ваших изображений.&lt;br /&gt;
&lt;br /&gt;
===Вспомнить то время...===&lt;br /&gt;
&lt;br /&gt;
Итак, мы обзавелись механизмом, позволяющим перемещаться по списку изображений; но не забывайте, что нужен еще способ вспомнить что-то, связанное с каждой картиной, которую мы видим. Давайте добавим эту функцию. Во-первых, потребуется подкаталог для хранения заметок к каждому изображению. Допустим, у нас есть файл '''MonaLisa.jpg'''; давайте хранить заметки по его поводу в файле '''MonaLisa.jpg.txt''', и держать все файлы в одном месте, разместив их в подкаталоге '''info''' каталога '''BackgroundArt'''. Префикс «точка» опять-таки позволит '''.info''' не попадать в список изображений по команде &amp;lt;font color=darkred&amp;gt;ls&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 $ mkdir ~/BackgroundArt/.info&lt;br /&gt;
 $ echo “Artist: Caravaggio, blah blah” &amp;gt; /home/dave/BackgroundArt/.info/Caravaggio-Emmaus.jpg.txt&lt;br /&gt;
&lt;br /&gt;
Для показа всплывающих сообщений над фоновыми картинками используем утилиту ''kdialog'', имеющую пару приятных и полезных возможностей – в частности, всплывающий «пузырь», который можно употребить для показа нашей заметки.&lt;br /&gt;
&lt;br /&gt;
 $ kdialog --passivepopup “Немного интересной информации” 60&lt;br /&gt;
&lt;br /&gt;
Вы задаете параметры отображаемого текста, а также продолжительность его показа в секундах. Всплывающее сообщение будет исчезать само, когда истечет время показа или когда пользователь нажмет на него, поэтому задайте побольше времени, чтобы успеть его прочитать, скажем, секунд 60. Информацию в '''info'''-файлах, которую мы хотим отобразить, раздобудет наш скрипт. Экранный снимок на предыдущей странице показывает всплывающее окно в действии.&lt;br /&gt;
&lt;br /&gt;
Но позвольте, откуда возьмутся заметки для всех наших картин – ведь придется создавать множество текстовых файлов, сохранять их в требуемом месте, да еще бдительно следить, чтобы не перепутать их имена? Вовсе нет – еще немного скриптинга, и мы сможем ввести примечания к картине через другое всплывающее окно, снова призвав на помощь ''kdialog'':&lt;br /&gt;
&lt;br /&gt;
 $ kdialog --textinputbox “Это заголовок” “Немного интересных фактов для ввода” &lt;br /&gt;
&lt;br /&gt;
Мы можем отобразить диалоговое окно ввода. Если для данного изображения уже существуют какие-нибудь записи, их-то мы и покажем в окне, а скрипт позаботится о поиске этих записей и передаче их в ''kdialog''.&lt;br /&gt;
&lt;br /&gt;
Возвращаемое ''kdialog'' значение будет содержать (свежеотредактированный) текст. Если не было изменений в поле редактирования, значит, возвращаемые данные будут те же, что и исходный текст. Наш скрипт следит за записью этих данных обратно в файл примечаний к изображению.&lt;br /&gt;
&lt;br /&gt;
===А теперь все вместе===&lt;br /&gt;
&lt;br /&gt;
Мы вчерне описали работу отдельных команд. Давайте сведем команды в скрипт &amp;lt;font color=darkred&amp;gt;wallpaper&amp;lt;/font&amp;gt;. Все выполняемые действия мы будем делать с помощью одного скрипта, передавая в него флажки, контролирующие выбор действия. Мне кажется уместным сперва определить перечень этих действий и соответствующих флажков.&lt;br /&gt;
&lt;br /&gt;
Скрипт будет вызываться следующим образом:&lt;br /&gt;
&lt;br /&gt;
 wallpaper &amp;lt; флажки опций &amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вызов его без параметров по умолчанию обеспечивает переход на следующее изображение в галерее. &amp;lt;font color=darkred&amp;gt;&amp;lt;флажок опции&amp;gt;&amp;lt;/font&amp;gt; может быть таким:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;font color=darkred&amp;gt;-p&amp;lt;/font&amp;gt; перейти к предыдущему изображению.&lt;br /&gt;
*&amp;lt;font color=darkred&amp;gt;-i&amp;lt;/font&amp;gt; показать всплывающее окно с информацией о текущем изображении.&lt;br /&gt;
*&amp;lt;font color=darkred&amp;gt;-e&amp;lt;/font&amp;gt; отобразить окно Редактировать для текущего изображения.&lt;br /&gt;
*&amp;lt;font color=darkred&amp;gt;-h&amp;lt;/font&amp;gt; показать справку.&lt;br /&gt;
&lt;br /&gt;
Скрипт целиком можно взять на DVD. Большая его часть соответствует нашему описанию. В основном мы использовали вызовы внешних программ, захват вывода и стыковку частей, с небольшими вкраплениями логики там и сям. Чтобы избежать дублирования отдельных кусков кода и придать скрипту подобие структуры, используются подпрограммы.&lt;br /&gt;
&lt;br /&gt;
Применим полезный модуль &amp;lt;font color=darkred&amp;gt;Perl Getopt::Std&amp;lt;/font&amp;gt; для обработки параметров, передаваемых в скрипт. В строке&lt;br /&gt;
 &lt;br /&gt;
 getopts(‘pieh’, \my %opts);&lt;br /&gt;
&lt;br /&gt;
мы перечисляем разрешенные флажки и сохраняем их значения в переменной &amp;lt;font color=darkred&amp;gt;%opts&amp;lt;/font&amp;gt; для дальнейшего использования.&lt;br /&gt;
&lt;br /&gt;
Установив некоторые первоначальные значения для текущего рабочего стола, текущую фоновую картину и т.д., приступим к непосредственно к выполнению действий, в зависимости от установленного флажка. Действия &amp;lt;font color=darkred&amp;gt;Info()&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;Edit()&amp;lt;/font&amp;gt; аналогичны – в обоих случаях скрипт получает имя файла, содержащего информацию о текущем изображении:&lt;br /&gt;
&lt;br /&gt;
 my $infofile = getInfoFile($currentImage);&lt;br /&gt;
&lt;br /&gt;
Подпрограмма &amp;lt;font color=darkred&amp;gt;getInfoFile&amp;lt;/font&amp;gt; использует регулярное выражение для манипулирования именем/расположением файла, чтобы найти местоположение для соответствующего файла с информацией. Например, для файла изображения&lt;br /&gt;
&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg&lt;br /&gt;
&lt;br /&gt;
процедура вернет следующий путь к ассоциированному информационному файлу:&lt;br /&gt;
&lt;br /&gt;
 /home/dave/BackgroundArt/.info/Caravaggio-Emmaus.jpg.txt&lt;br /&gt;
&lt;br /&gt;
Процедура &amp;lt;font color=darkred&amp;gt;getInfoFile&amp;lt;/font&amp;gt; делает это с помощью регулярного выражения&lt;br /&gt;
&lt;br /&gt;
 $infofile =~ s#^(.*)/(.*)#$1/.info/$2.txt#;&lt;br /&gt;
&lt;br /&gt;
Определив имя &amp;lt;font color=darkred&amp;gt;infofile&amp;lt;/font&amp;gt;, процедуры &amp;lt;font color=darkred&amp;gt;readFile&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;writeFile&amp;lt;/font&amp;gt; позаботятся о чтении/записи содержимого по мере надобности. Регулярные выражения являются мощными инструментами для выполнения поиска вхождений строк в тексте и их замены. (Не берите в голову заботу о доскональном понимании синтаксиса, если это для вас в новинку – введение в регулярные выражения требует отдельной статьи! Если у вас есть журнал LXF70, то там такая статья опубликована).&lt;br /&gt;
&lt;br /&gt;
===Горячие клавиши===&lt;br /&gt;
&lt;br /&gt;
Теперь скрипт у нас есть, но он не совсем удобен: приходится вводить команду (с параметрами) для каждого изменения обоев или просмотра всплывающих сообщений. Лучше вместо этого использовать возможности KDE по привязке действий по вводу к горячим клавишам. Лично мне нравится использовать многоклавишные комбинации, чтобы группировать похожие действия. Поэтому &amp;lt;font color=darkblue&amp;gt;Alt+B&amp;lt;/font&amp;gt; для меня будет означать группу операций над обоями, а &amp;lt;font color=darkblue&amp;gt;Alt+B&amp;lt;/font&amp;gt; в сочетании с еще одной клавишей уже выполнят конкретное действие: например, &amp;lt;font color=darkblue&amp;gt;Alt+B,N&amp;lt;/font&amp;gt; выведет следующее изображение, а &amp;lt;font color=darkblue&amp;gt;Alt+B,P&amp;lt;/font&amp;gt; вернет нас к предыдущему.&lt;br /&gt;
&lt;br /&gt;
В порядке иллюстрации создадим одну такую комбинацию. В &amp;lt;font color=darkblue&amp;gt;Input Actions [Ввод]&amp;lt;/font&amp;gt; KDE (обычно расположенном в меню &amp;lt;font color=darkblue&amp;gt;Regional and Accessibilty [Региональные настройки и специальные возможности]&amp;lt;/font&amp;gt; в &amp;lt;font color=darkblue&amp;gt;KDE Control Center [Центр управления KDE]&amp;lt;/font&amp;gt;), создайте новую группу &amp;lt;font color=darkblue&amp;gt;‘Wallpaper Actions’&amp;lt;/font&amp;gt;. Нажмите на группу и создайте новое действие. Назовите его &amp;lt;font color=darkblue&amp;gt;WallpaperNext&amp;lt;/font&amp;gt;, установите тип действия &amp;lt;font color=darkblue&amp;gt;Action &amp;gt; Command(url)&amp;lt;/font&amp;gt; [&amp;lt;font color=darkblue&amp;gt;Комбинация клавиш -&amp;gt; команда/URL&amp;lt;/font&amp;gt;]. Установите комбинацию клавиш (многоклавишный режим) &amp;lt;font color=darkblue&amp;gt;Alt+B,N&amp;lt;/font&amp;gt;, и параметры команды &amp;lt;font color=darkblue&amp;gt;/home/dave/bin/wallpaper&amp;lt;/font&amp;gt; (или путь, где вы сохранили свой скрипт). Нажмите &amp;lt;font color=darkblue&amp;gt;ОК&amp;lt;/font&amp;gt;, и пробуйте. Нажатие &amp;lt;font color=darkblue&amp;gt;Alt+B,N&amp;lt;/font&amp;gt; должно привести к замене текущих обоев следующим изображением вашей галереи. Если это действие работает нормально, двигаемся дальше и добавляем остальные комбинации клавиш.&lt;br /&gt;
&lt;br /&gt;
===Примочки===&lt;br /&gt;
&lt;br /&gt;
Итак, основная часть готова. Как еще улучшить наш скрипт? Ну, можно автоматизировать создание индексного файла, чтобы добавлять/удалять изображения в каталоге и не думать о его ручном обновлении. Добавим задание ''cron'', чтобы это происходило раз в день:&lt;br /&gt;
&lt;br /&gt;
 crontab -e&lt;br /&gt;
 05 12 * * * ls /home/dave/BackgroundArt/* &amp;gt; /home/dave/BackgroundArt/.index.txt&lt;br /&gt;
&lt;br /&gt;
Что еще? Мне нравится идея использования в качестве обоев праздничных фотографий. Или плакатов фильмов, или снимков с телескопа Хаббла. Но надо ли все это помещать в единый список? Наоборот, лучше создать отдельные категории и переключаться между ними. Этого можно добиться, приложив еще немного труда. Мы создадим отдельный каталог для каждой категории изображения. Сложность только в определении, к какой категории принадлежит текущее изображение. Для простоты, будем тупо просматривать наш индексный файл, и если соответствия не найдется, то разместим изображение в категории по умолчанию, допустим, &amp;lt;font color=darkblue&amp;gt;Art&amp;lt;/font&amp;gt;. На DVD вы найдете расширенную версию скрипта, с поддержкой категорий. Я добавил еще горячих клавиш для переключения между категориями.&lt;br /&gt;
&lt;br /&gt;
Другим дополнением может быть предложение пользователю диалога, в котором он мог бы выбрать изображение из списка. Иначе в большой галерее надо будет много раз прокручивать изображения назад и вперед в поисках того или иного образа. (Подсказка: посмотрите опцию &amp;lt;font color=darkred&amp;gt;–combobox&amp;lt;/font&amp;gt; утилиты ''kdialog''). Также&lt;br /&gt;
можно случайным образом выбирать картину из галереи. Это можно автоматизировать через ''cron'' и изменять фон ежедневно.&lt;br /&gt;
&lt;br /&gt;
==Врезки==&lt;br /&gt;
&lt;br /&gt;
===Горячие клавиши===&lt;br /&gt;
&lt;br /&gt;
====Смена изображений====&lt;br /&gt;
&lt;br /&gt;
{| align=center border=1&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Горячие клавиши&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Действие&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Команда&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, N&amp;lt;/center&amp;gt;&lt;br /&gt;
|Перейти к следующему изображению&lt;br /&gt;
|wallpaper&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, P&amp;lt;/center&amp;gt;&lt;br /&gt;
|Перейти к предыдущему изображению&lt;br /&gt;
|walpaper -p&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, I&amp;lt;/center&amp;gt;&lt;br /&gt;
|Отобразить информацию о текущем изображении&lt;br /&gt;
|wallpaper -e&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, E&amp;lt;/center&amp;gt;&lt;br /&gt;
|Изменить информацию о текущем изображении&lt;br /&gt;
|wallpaper -e&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
====Навигация====&lt;br /&gt;
&lt;br /&gt;
{| align=center border=1&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Горячие клавиши&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Действие&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Команда&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, A&amp;lt;/center&amp;gt;&lt;br /&gt;
|Переход к категории Art&lt;br /&gt;
|wallpaper -c Art&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, H&amp;lt;/center&amp;gt;&lt;br /&gt;
|Переход к категории Holiday&lt;br /&gt;
|walpaper -c Holiday&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, M&amp;lt;/center&amp;gt;&lt;br /&gt;
|Переход к категории Movie&lt;br /&gt;
|wallpaper -c Movie&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:KDE</id>
		<title>LXF98:KDE</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:KDE"/>
				<updated>2008-03-20T17:55:28Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;font color=darkred&amp;gt;KDE:&amp;lt;/font&amp;gt; Галерея на рабочем столе==&lt;br /&gt;
&lt;br /&gt;
''Маэстро '''Дэвид Фили''' покажет, как легко превратить ваш рабочий стол в картинную галерею с помощью DCOP, Perl и шаманства с командной строкой.''&lt;br /&gt;
&lt;br /&gt;
Одно из величайших достижений Linux – даруемая им свобода: в частности, это свобода что-то переопределить, подправить и настроить «как хочется», а не довольствоваться тем, «что дают». К примеру, я сейчас интересуюсь искусством, и хотел бы поместить коллекцию картин старых мастеров на обои моего рабочего стола. Беда в том, что мне все быстро надоедает, поэтому нужен также простой способ чередовать эти изображения; да и память у меня прескверная, а надо как-то отличать моего Караваджо от моего Констебля.&lt;br /&gt;
&lt;br /&gt;
Желаю иметь возможность вводить и просматривать примечания ко всем картинам, чтобы над ними всплывали сообщения с подсказками про имя художника, год написания и музей, где она находится, и, может быть, парой кратких заметок, благодаря которым я смогу притвориться, будто знаю, на что это я тут глазею, если меня вдруг станут расспрашивать.&lt;br /&gt;
&lt;br /&gt;
В Linux и KDE такое вполне достижимо, если связать вместе различные инструменты командной строки и скрипты: классическая концепция Unix/Linux по объединению нескольких инструментов общего назначения в полезное приложение. Целью данной статьи является подготовка скрипта, управляющего нашей псевдоКартинной Галереей на фоне рабочего стола. Определим также несколько горячих клавиш, нажатия на которые обеспечат следующие действия:&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;
 $ mkdir ~/BackgroundArt&lt;br /&gt;
&lt;br /&gt;
и скопируем туда какие-нибудь картинки (какие попались под руку). Выберите из них пригодные для обоев рабочего стола. Это будет наш запасник. Построив основную инфраструктуру, вы сможете более придирчиво отобрать экспозицию вашей галереи.&lt;br /&gt;
&lt;br /&gt;
В KDE можно воспользоваться вызовами DCOP для извлечения текущего фонового изображения (см. учебник в LXF79 для введения в DCOP). Но сперва определим, на каком рабочем столе мы находимся. Вот вызов DCOP для этого:&lt;br /&gt;
&lt;br /&gt;
 $ dcop kwin KWinInterface currentDesktop&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
Вывод гласит, что в данный момент я на &amp;lt;font color=darkblue&amp;gt;Рабочем столе&amp;lt;/font&amp;gt; 2. Вот и чудненько: наличие нескольких рабочих столов прибавит нам разнообразия в отображении обоев! Давайте теперь узнаем, какие обои установлены на активном рабочем столе:&lt;br /&gt;
&lt;br /&gt;
 $ dcop kdesktop KBackgroundIface currentWallpaper 2&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg&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;
 $ ls ~/BackgroundArt/* &amp;gt; ~/BackgroundArt/.index.txt&lt;br /&gt;
&lt;br /&gt;
Текстовому файлу дано имя, начинающееся с точки, чтобы он не отображал сам себя в выводе команды &amp;lt;font color=darkred&amp;gt;ls&amp;lt;/font&amp;gt; в процессе обновления при добавке новых изображений. Для примера, вот мой собственный список:&lt;br /&gt;
&lt;br /&gt;
 $ more ~/BackgroundArt/.index.txt&lt;br /&gt;
 /home/dave/BackgroundArt/Botticelli-Venus.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-David_goliath.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Decapitation_of_john_the_ baptist.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Judith_Beheading_Holofernes. jpg&lt;br /&gt;
 /home/dave/BackgroundArt/caravaggio-st_thomas.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Tizian-Urbino_Venus.jpg&lt;br /&gt;
&lt;br /&gt;
Чтобы выяснить позицию текущего файла в этом списке, можно использовать команду &amp;lt;font color=darkred&amp;gt;grep&amp;lt;/font&amp;gt;. Применение флажка &amp;lt;font color=darkred&amp;gt;-n &amp;lt;/font&amp;gt;добавит номер строки в вывод, показывающий позицию текущего изображения в файле.&lt;br /&gt;
&lt;br /&gt;
 grep -n /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg ~/BackgroundArt/.index.txt&lt;br /&gt;
 4:/home/dave/BackgroundArt/Caravaggio-Emmaus.jpg&lt;br /&gt;
&lt;br /&gt;
Стало быть, текущее изображение находится в четвертой строке нашего индексного файла. Давайте направим вывод в команду &amp;lt;font color=darkred&amp;gt;cut&amp;lt;/font&amp;gt;, чтобы возвращать только номер строки: остальное нам неинтересно. Символ перенаправления – &amp;lt;font color=darkred&amp;gt;|&amp;lt;/font&amp;gt;, обычно он находится в верхнем регистре (т.е. получается при нажатом &amp;lt;font color=darkblue&amp;gt;Shift&amp;lt;/font&amp;gt;) над клавишей &amp;lt;font color=darkblue&amp;gt;Enter&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 $ grep -n /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg ~/BackgroundArt/.index.txt | cut -d’:’ -f1&lt;br /&gt;
 4&lt;br /&gt;
&lt;br /&gt;
Теперь надо найти следующее (или предыдущее) изображение в списке. Что ж, в зависимости от того, куда собираемся двигаться, вперед или назад, мы можем просто увеличить или уменьшить текущий номер, а затем вытащить требуемую строку из файла с помощью хитроумной комбинации команд &amp;lt;font color=darkred&amp;gt;head&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;tail&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 $ head -5 ~/BackgroundArt/.index.txt | tail -1&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Judith_Beheading_Holofernes.jpg&lt;br /&gt;
&lt;br /&gt;
Когда мы примемся за скрипт, вы заметите, что не мешает предотвратить чрезмерное продвижение вперед или назад, чтобы не заскочить за конец или до начала файла. В подобных случаях следует переходить на начало или конец файла – тогда нам нужно знать, сколько изображений в списке. Мы можем получить это число при помощи команды &amp;lt;font color=darkred&amp;gt;wc&amp;lt;/font&amp;gt;; перенаправив ее в &amp;lt;font color=darkred&amp;gt;cut&amp;lt;/font&amp;gt;, выделим необходимую информацию (число строк).&lt;br /&gt;
&lt;br /&gt;
 $ wc -l ~/BackgroundArt/.index.txt | cut -d ’ ‘ -f 1&lt;br /&gt;
 9&lt;br /&gt;
&lt;br /&gt;
Определив, какое изображение показывать следующим, установим его в качестве новых обоев с помощью вызова &amp;lt;font color=darkred&amp;gt;dcop&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 $ dcop kdesktop KBackgroundIface setWallpaper 2 /home/dave/BackgroundArt/Caravaggio-Judith_Beheading_Holofernes.jpg 4&lt;br /&gt;
&lt;br /&gt;
Последний параметр – номер режима, описывающего, как поступить с изображением: уложить черепицей, растянуть и т.д. Здесь есть насколько вариантов. По-моему, четвертый – поместить по центру с масштабированием – больше всего подходит для картин: размеры изображения при выводе на экран получаются максимально возможными с сохранением исходных пропорций. Ваши требования могут быть иными, так что экспериментируйте с этими вариантами, чтобы&lt;br /&gt;
получить результат, оптимальный для ваших изображений.&lt;br /&gt;
&lt;br /&gt;
===Вспомнить то время...===&lt;br /&gt;
&lt;br /&gt;
Итак, мы обзавелись механизмом, позволяющим перемещаться по списку изображений; но не забывайте, что нужен еще способ вспомнить что-то, связанное с каждой картиной, которую мы видим. Давайте добавим эту функцию. Во-первых, потребуется подкаталог для хранения заметок к каждому изображению. Допустим, у нас есть файл '''MonaLisa.jpg'''; давайте хранить заметки по его поводу в файле '''MonaLisa.jpg.txt''', и держать все файлы в одном месте, разместив их в подкаталоге '''info''' каталога '''BackgroundArt'''. Префикс «точка» опять-таки позволит '''.info''' не попадать в список изображений по команде &amp;lt;font color=darkred&amp;gt;ls&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 $ mkdir ~/BackgroundArt/.info&lt;br /&gt;
 $ echo “Artist: Caravaggio, blah blah” &amp;gt; /home/dave/BackgroundArt/.info/Caravaggio-Emmaus.jpg.txt&lt;br /&gt;
&lt;br /&gt;
Для показа всплывающих сообщений над фоновыми картинками используем утилиту ''kdialog'', имеющую пару приятных и полезных возможностей – в частности, всплывающий «пузырь», который можно употребить для показа нашей заметки.&lt;br /&gt;
&lt;br /&gt;
 $ kdialog --passivepopup “Немного интересной информации” 60&lt;br /&gt;
&lt;br /&gt;
Вы задаете параметры отображаемого текста, а также продолжительность его показа в секундах. Всплывающее сообщение будет исчезать само, когда истечет время показа или когда пользователь нажмет на него, поэтому задайте побольше времени, чтобы успеть его прочитать, скажем, секунд 60. Информацию в '''info'''-файлах, которую мы хотим отобразить, раздобудет наш скрипт. Экранный снимок на предыдущей странице показывает всплывающее окно в действии.&lt;br /&gt;
&lt;br /&gt;
Но позвольте, откуда возьмутся заметки для всех наших картин – ведь придется создавать множество текстовых файлов, сохранять их в требуемом месте, да еще бдительно следить, чтобы не перепутать их имена? Вовсе нет – еще немного скриптинга, и мы сможем ввести примечания к картине через другое всплывающее окно, снова призвав на помощь ''kdialog'':&lt;br /&gt;
&lt;br /&gt;
 $ kdialog --textinputbox “Это заголовок” “Немного интересных фактов для ввода” &lt;br /&gt;
&lt;br /&gt;
Мы можем отобразить диалоговое окно ввода. Если для данного изображения уже существуют какие-нибудь записи, их-то мы и покажем в окне, а скрипт позаботится о поиске этих записей и передаче их в ''kdialog''.&lt;br /&gt;
&lt;br /&gt;
Возвращаемое ''kdialog'' значение будет содержать (свежеотредактированный) текст. Если не было изменений в поле редактирования, значит, возвращаемые данные будут те же, что и исходный текст. Наш скрипт следит за записью этих данных обратно в файл примечаний к изображению.&lt;br /&gt;
&lt;br /&gt;
===А теперь все вместе===&lt;br /&gt;
&lt;br /&gt;
Мы вчерне описали работу отдельных команд. Давайте сведем команды в скрипт &amp;lt;font color=darkred&amp;gt;wallpaper&amp;lt;/font&amp;gt;. Все выполняемые действия мы будем делать с помощью одного скрипта, передавая в него флажки, контролирующие выбор действия. Мне кажется уместным сперва определить перечень этих действий и соответствующих флажков.&lt;br /&gt;
&lt;br /&gt;
Скрипт будет вызываться следующим образом:&lt;br /&gt;
&lt;br /&gt;
 wallpaper &amp;lt; флажки опций &amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вызов его без параметров по умолчанию обеспечивает переход на следующее изображение в галерее. &amp;lt;font color=darkred&amp;gt;&amp;lt;флажок опции&amp;gt;&amp;lt;/font&amp;gt; может быть таким:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;font color=darkred&amp;gt;-p&amp;lt;/font&amp;gt; перейти к предыдущему изображению.&lt;br /&gt;
*&amp;lt;font color=darkred&amp;gt;-i&amp;lt;/font&amp;gt; показать всплывающее окно с информацией о текущем изображении.&lt;br /&gt;
*&amp;lt;font color=darkred&amp;gt;-e&amp;lt;/font&amp;gt; отобразить окно Редактировать для текущего изображения.&lt;br /&gt;
*&amp;lt;font color=darkred&amp;gt;-h&amp;lt;/font&amp;gt; показать справку.&lt;br /&gt;
&lt;br /&gt;
Скрипт целиком можно взять на DVD. Большая его часть соответствует нашему описанию. В основном мы использовали вызовы внешних программ, захват вывода и стыковку частей, с небольшими вкраплениями логики там и сям. Чтобы избежать дублирования отдельных кусков кода и придать скрипту подобие структуры, используются подпрограммы.&lt;br /&gt;
&lt;br /&gt;
Применим полезный модуль &amp;lt;font color=darkred&amp;gt;Perl Getopt::Std&amp;lt;/font&amp;gt; для обработки параметров, передаваемых в скрипт. В строке&lt;br /&gt;
 &lt;br /&gt;
 getopts(‘pieh’, \my %opts);&lt;br /&gt;
&lt;br /&gt;
мы перечисляем разрешенные флажки и сохраняем их значения в переменной &amp;lt;font color=darkred&amp;gt;%opts&amp;lt;/font&amp;gt; для дальнейшего использования.&lt;br /&gt;
&lt;br /&gt;
Установив некоторые первоначальные значения для текущего рабочего стола, текущую фоновую картину и т.д., приступим к непосредственно к выполнению действий, в зависимости от установленного флажка. Действия &amp;lt;font color=darkred&amp;gt;Info()&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;Edit()&amp;lt;/font&amp;gt; аналогичны – в обоих случаях скрипт получает имя файла, содержащего информацию о текущем изображении:&lt;br /&gt;
&lt;br /&gt;
 my $infofile = getInfoFile($currentImage);&lt;br /&gt;
&lt;br /&gt;
Подпрограмма &amp;lt;font color=darkred&amp;gt;getInfoFile&amp;lt;/font&amp;gt; использует регулярное выражение для манипулирования именем/расположением файла, чтобы найти местоположение для соответствующего файла с информацией. Например, для файла изображения&lt;br /&gt;
&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg&lt;br /&gt;
&lt;br /&gt;
процедура вернет следующий путь к ассоциированному информационному файлу:&lt;br /&gt;
&lt;br /&gt;
 /home/dave/BackgroundArt/.info/Caravaggio-Emmaus.jpg.txt&lt;br /&gt;
&lt;br /&gt;
Процедура &amp;lt;font color=darkred&amp;gt;getInfoFile&amp;lt;/font&amp;gt; делает это с помощью регулярного выражения&lt;br /&gt;
&lt;br /&gt;
 $infofile =~ s#^(.*)/(.*)#$1/.info/$2.txt#;&lt;br /&gt;
&lt;br /&gt;
Определив имя &amp;lt;font color=darkred&amp;gt;infofile&amp;lt;/font&amp;gt;, процедуры &amp;lt;font color=darkred&amp;gt;readFile&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;writeFile&amp;lt;/font&amp;gt; позаботятся о чтении/записи содержимого по мере надобности. Регулярные выражения являются мощными инструментами для выполнения поиска вхождений строк в тексте и их замены. (Не берите в голову заботу о доскональном понимании синтаксиса, если это для вас в новинку – введение в регулярные выражения требует отдельной статьи! Если у вас есть журнал LXF70, то там такая статья опубликована).&lt;br /&gt;
&lt;br /&gt;
===Горячие клавиши===&lt;br /&gt;
&lt;br /&gt;
Теперь скрипт у нас есть, но он не совсем удобен: приходится вводить команду (с параметрами) для каждого изменения обоев или просмотра всплывающих сообщений. Лучше вместо этого использовать возможности KDE по привязке действий по вводу к горячим клавишам. Лично мне нравится использовать многоклавишные комбинации, чтобы группировать похожие действия. Поэтому &amp;lt;font color=darkblue&amp;gt;Alt+B&amp;lt;/font&amp;gt; для меня будет означать группу операций над обоями, а &amp;lt;font color=darkblue&amp;gt;Alt+B&amp;lt;/font&amp;gt; в сочетании с еще одной клавишей уже выполнят конкретное действие: например, &amp;lt;font color=darkblue&amp;gt;Alt+B,N&amp;lt;/font&amp;gt; выведет следующее изображение, а &amp;lt;font color=darkblue&amp;gt;Alt+B,P&amp;lt;/font&amp;gt; вернет нас к предыдущему.&lt;br /&gt;
&lt;br /&gt;
В порядке иллюстрации создадим одну такую комбинацию. В &amp;lt;font color=darkblue&amp;gt;Input Actions [Ввод]&amp;lt;/font&amp;gt; KDE (обычно расположенном в меню &amp;lt;font color=darkblue&amp;gt;Regional and Accessibilty [Региональные настройки и специальные возможности]&amp;lt;/font&amp;gt; в &amp;lt;font color=darkblue&amp;gt;KDE Control Center [Центр управления KDE]&amp;lt;/font&amp;gt;), создайте новую группу &amp;lt;font color=darkblue&amp;gt;‘Wallpaper Actions’&amp;lt;/font&amp;gt;. Нажмите на группу и создайте новое действие. Назовите его &amp;lt;font color=darkblue&amp;gt;WallpaperNext&amp;lt;/font&amp;gt;, установите тип действия &amp;lt;font color=darkblue&amp;gt;Action &amp;gt; Command(url)&amp;lt;/font&amp;gt; [&amp;lt;font color=darkblue&amp;gt;Комбинация клавиш -&amp;gt; команда/URL&amp;lt;/font&amp;gt;]. Установите комбинацию клавиш (многоклавишный режим) &amp;lt;font color=darkblue&amp;gt;Alt+B,N&amp;lt;/font&amp;gt;, и параметры команды &amp;lt;font color=darkblue&amp;gt;/home/dave/bin/wallpaper&amp;lt;/font&amp;gt; (или путь, где вы сохранили свой скрипт). Нажмите &amp;lt;font color=darkblue&amp;gt;ОК&amp;lt;/font&amp;gt;, и пробуйте. Нажатие &amp;lt;font color=darkblue&amp;gt;Alt+B,N&amp;lt;/font&amp;gt; должно привести к замене текущих обоев следующим изображением вашей галереи. Если это действие работает нормально, двигаемся дальше и добавляем остальные комбинации клавиш.&lt;br /&gt;
&lt;br /&gt;
===Примочки===&lt;br /&gt;
&lt;br /&gt;
Итак, основная часть готова. Как еще улучшить наш скрипт? Ну, можно автоматизировать создание индексного файла, чтобы добавлять/удалять изображения в каталоге и не думать о его ручном обновлении. Добавим задание ''cron'', чтобы это происходило раз в день:&lt;br /&gt;
&lt;br /&gt;
 crontab -e&lt;br /&gt;
 05 12 * * * ls /home/dave/BackgroundArt/* &amp;gt; /home/dave/BackgroundArt/.index.txt&lt;br /&gt;
&lt;br /&gt;
Что еще? Мне нравится идея использования в качестве обоев праздничных фотографий. Или плакатов фильмов, или снимков с телескопа Хаббла. Но надо ли все это помещать в единый список? Наоборот, лучше создать отдельные категории и переключаться между ними. Этого можно добиться, приложив еще немного труда. Мы создадим отдельный каталог для каждой категории изображения. Сложность только в определении, к какой категории принадлежит текущее изображение. Для простоты, будем тупо просматривать наш индексный файл, и если соответствия не найдется, то разместим изображение в категории по умолчанию, допустим, &amp;lt;font color=darkblue&amp;gt;Art&amp;lt;/font&amp;gt;. На DVD вы найдете расширенную версию скрипта, с поддержкой категорий. Я добавил еще горячих клавиш для переключения между категориями.&lt;br /&gt;
&lt;br /&gt;
Другим дополнением может быть предложение пользователю диалога, в котором он мог бы выбрать изображение из списка. Иначе в большой галерее надо будет много раз прокручивать изображения назад и вперед в поисках того или иного образа. (Подсказка: посмотрите опцию &amp;lt;font color=darkred&amp;gt;–combobox&amp;lt;/font&amp;gt; утилиты ''kdialog''). Также&lt;br /&gt;
можно случайным образом выбирать картину из галереи. Это можно автоматизировать через ''cron'' и изменять фон ежедневно.&lt;br /&gt;
&lt;br /&gt;
==Врезки==&lt;br /&gt;
&lt;br /&gt;
===Горячие клавиши===&lt;br /&gt;
&lt;br /&gt;
====Смена изображений====&lt;br /&gt;
&lt;br /&gt;
{| align=center border=1&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Горячие клавиши&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Действие&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Команда&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, N&amp;lt;/center&amp;gt;&lt;br /&gt;
|Перейти к следующему изображению&lt;br /&gt;
|wallpaper&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, P&amp;lt;/center&amp;gt;&lt;br /&gt;
|Перейти к предыдущему изображению&lt;br /&gt;
|walpaper -p&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, I&amp;lt;/center&amp;gt;&lt;br /&gt;
|Отобразить информацию о текущем изображении&lt;br /&gt;
|wallpaper -e&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, E&amp;lt;/center&amp;gt;&lt;br /&gt;
|Изменить информацию о текущем изображении&lt;br /&gt;
|wallpaper -e&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Навигация====&lt;br /&gt;
&lt;br /&gt;
{| align=center border=1&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Горячие клавиши&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Действие&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Команда&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, A&amp;lt;/center&amp;gt;&lt;br /&gt;
|Переход к категории Art&lt;br /&gt;
|wallpaper -c Art&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, H&amp;lt;/center&amp;gt;&lt;br /&gt;
|Переход к категории Holiday&lt;br /&gt;
|walpaper -c Holiday&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, M&amp;lt;/center&amp;gt;&lt;br /&gt;
|Переход к категории Movie&lt;br /&gt;
|wallpaper -c Movie&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/LXF98:KDE</id>
		<title>LXF98:KDE</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/LXF98:KDE"/>
				<updated>2008-03-20T17:53:20Z</updated>
		
		<summary type="html">&lt;p&gt;Belogorie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;font color=darkred&amp;gt;KDE:&amp;lt;/font&amp;gt; Галерея на рабочем столе==&lt;br /&gt;
&lt;br /&gt;
''Маэстро '''Дэвид Фили''' покажет, как легко превратить ваш рабочий стол в картинную галерею с помощью DCOP, Perl и шаманства с командной строкой.''&lt;br /&gt;
&lt;br /&gt;
Одно из величайших достижений Linux – даруемая им свобода: в частности, это свобода что-то переопределить, подправить и настроить «как хочется», а не довольствоваться тем, «что дают». К примеру, я сейчас интересуюсь искусством, и хотел бы поместить коллекцию картин старых мастеров на обои моего рабочего стола. Беда в том, что мне все быстро надоедает, поэтому нужен также простой способ чередовать эти изображения; да и память у меня прескверная, а надо как-то отличать моего Караваджо от моего Констебля.&lt;br /&gt;
&lt;br /&gt;
Желаю иметь возможность вводить и просматривать примечания ко всем картинам, чтобы над ними всплывали сообщения с подсказками про имя художника, год написания и музей, где она находится, и, может быть, парой кратких заметок, благодаря которым я смогу притвориться, будто знаю, на что это я тут глазею, если меня вдруг станут расспрашивать.&lt;br /&gt;
&lt;br /&gt;
В Linux и KDE такое вполне достижимо, если связать вместе различные инструменты командной строки и скрипты: классическая концепция Unix/Linux по объединению нескольких инструментов общего назначения в полезное приложение. Целью данной статьи является подготовка скрипта, управляющего нашей псевдоКартинной Галереей на фоне рабочего стола. Определим также несколько горячих клавиш, нажатия на которые обеспечат следующие действия:&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;
 $ mkdir ~/BackgroundArt&lt;br /&gt;
&lt;br /&gt;
и скопируем туда какие-нибудь картинки (какие попались под руку). Выберите из них пригодные для обоев рабочего стола. Это будет наш запасник. Построив основную инфраструктуру, вы сможете более придирчиво отобрать экспозицию вашей галереи.&lt;br /&gt;
&lt;br /&gt;
В KDE можно воспользоваться вызовами DCOP для извлечения текущего фонового изображения (см. учебник в LXF79 для введения в DCOP). Но сперва определим, на каком рабочем столе мы находимся. Вот вызов DCOP для этого:&lt;br /&gt;
&lt;br /&gt;
 $ dcop kwin KWinInterface currentDesktop&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
Вывод гласит, что в данный момент я на &amp;lt;font color=darkblue&amp;gt;Рабочем столе&amp;lt;/font&amp;gt; 2. Вот и чудненько: наличие нескольких рабочих столов прибавит нам разнообразия в отображении обоев! Давайте теперь узнаем, какие обои установлены на активном рабочем столе:&lt;br /&gt;
&lt;br /&gt;
 $ dcop kdesktop KBackgroundIface currentWallpaper 2&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg&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;
 $ ls ~/BackgroundArt/* &amp;gt; ~/BackgroundArt/.index.txt&lt;br /&gt;
&lt;br /&gt;
Текстовому файлу дано имя, начинающееся с точки, чтобы он не отображал сам себя в выводе команды &amp;lt;font color=darkred&amp;gt;ls&amp;lt;/font&amp;gt; в процессе обновления при добавке новых изображений. Для примера, вот мой собственный список:&lt;br /&gt;
&lt;br /&gt;
 $ more ~/BackgroundArt/.index.txt&lt;br /&gt;
 /home/dave/BackgroundArt/Botticelli-Venus.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-David_goliath.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Decapitation_of_john_the_ baptist.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Judith_Beheading_Holofernes. jpg&lt;br /&gt;
 /home/dave/BackgroundArt/caravaggio-st_thomas.jpg&lt;br /&gt;
 /home/dave/BackgroundArt/Tizian-Urbino_Venus.jpg&lt;br /&gt;
&lt;br /&gt;
Чтобы выяснить позицию текущего файла в этом списке, можно использовать команду &amp;lt;font color=darkred&amp;gt;grep&amp;lt;/font&amp;gt;. Применение флажка &amp;lt;font color=darkred&amp;gt;-n &amp;lt;/font&amp;gt;добавит номер строки в вывод, показывающий позицию текущего изображения в файле.&lt;br /&gt;
&lt;br /&gt;
 grep -n /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg ~/BackgroundArt/.index.txt&lt;br /&gt;
 4:/home/dave/BackgroundArt/Caravaggio-Emmaus.jpg&lt;br /&gt;
&lt;br /&gt;
Стало быть, текущее изображение находится в четвертой строке нашего индексного файла. Давайте направим вывод в команду &amp;lt;font color=darkred&amp;gt;cut&amp;lt;/font&amp;gt;, чтобы возвращать только номер строки: остальное нам неинтересно. Символ перенаправления – &amp;lt;font color=darkred&amp;gt;|&amp;lt;/font&amp;gt;, обычно он находится в верхнем регистре (т.е. получается при нажатом &amp;lt;font color=darkblue&amp;gt;Shift&amp;lt;/font&amp;gt;) над клавишей &amp;lt;font color=darkblue&amp;gt;Enter&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 $ grep -n /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg ~/BackgroundArt/.index.txt | cut -d’:’ -f1&lt;br /&gt;
 4&lt;br /&gt;
&lt;br /&gt;
Теперь надо найти следующее (или предыдущее) изображение в списке. Что ж, в зависимости от того, куда собираемся двигаться, вперед или назад, мы можем просто увеличить или уменьшить текущий номер, а затем вытащить требуемую строку из файла с помощью хитроумной комбинации команд &amp;lt;font color=darkred&amp;gt;head&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;tail&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 $ head -5 ~/BackgroundArt/.index.txt | tail -1&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Judith_Beheading_Holofernes.jpg&lt;br /&gt;
&lt;br /&gt;
Когда мы примемся за скрипт, вы заметите, что не мешает предотвратить чрезмерное продвижение вперед или назад, чтобы не заскочить за конец или до начала файла. В подобных случаях следует переходить на начало или конец файла – тогда нам нужно знать, сколько изображений в списке. Мы можем получить это число при помощи команды &amp;lt;font color=darkred&amp;gt;wc&amp;lt;/font&amp;gt;; перенаправив ее в &amp;lt;font color=darkred&amp;gt;cut&amp;lt;/font&amp;gt;, выделим необходимую информацию (число строк).&lt;br /&gt;
&lt;br /&gt;
 $ wc -l ~/BackgroundArt/.index.txt | cut -d ’ ‘ -f 1&lt;br /&gt;
 9&lt;br /&gt;
&lt;br /&gt;
Определив, какое изображение показывать следующим, установим его в качестве новых обоев с помощью вызова &amp;lt;font color=darkred&amp;gt;dcop&amp;lt;/font&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 $ dcop kdesktop KBackgroundIface setWallpaper 2 /home/dave/BackgroundArt/Caravaggio-Judith_Beheading_Holofernes.jpg 4&lt;br /&gt;
&lt;br /&gt;
Последний параметр – номер режима, описывающего, как поступить с изображением: уложить черепицей, растянуть и т.д. Здесь есть насколько вариантов. По-моему, четвертый – поместить по центру с масштабированием – больше всего подходит для картин: размеры изображения при выводе на экран получаются максимально возможными с сохранением исходных пропорций. Ваши требования могут быть иными, так что экспериментируйте с этими вариантами, чтобы&lt;br /&gt;
получить результат, оптимальный для ваших изображений.&lt;br /&gt;
&lt;br /&gt;
===Вспомнить то время...===&lt;br /&gt;
&lt;br /&gt;
Итак, мы обзавелись механизмом, позволяющим перемещаться по списку изображений; но не забывайте, что нужен еще способ вспомнить что-то, связанное с каждой картиной, которую мы видим. Давайте добавим эту функцию. Во-первых, потребуется подкаталог для хранения заметок к каждому изображению. Допустим, у нас есть файл '''MonaLisa.jpg'''; давайте хранить заметки по его поводу в файле '''MonaLisa.jpg.txt''', и держать все файлы в одном месте, разместив их в подкаталоге '''info''' каталога '''BackgroundArt'''. Префикс «точка» опять-таки позволит '''.info''' не попадать в список изображений по команде &amp;lt;font color=darkred&amp;gt;ls&amp;lt;/font&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 $ mkdir ~/BackgroundArt/.info&lt;br /&gt;
 $ echo “Artist: Caravaggio, blah blah” &amp;gt; /home/dave/BackgroundArt/.info/Caravaggio-Emmaus.jpg.txt&lt;br /&gt;
&lt;br /&gt;
Для показа всплывающих сообщений над фоновыми картинками используем утилиту ''kdialog'', имеющую пару приятных и полезных возможностей – в частности, всплывающий «пузырь», который можно употребить для показа нашей заметки.&lt;br /&gt;
&lt;br /&gt;
 $ kdialog --passivepopup “Немного интересной информации” 60&lt;br /&gt;
&lt;br /&gt;
Вы задаете параметры отображаемого текста, а также продолжительность его показа в секундах. Всплывающее сообщение будет исчезать само, когда истечет время показа или когда пользователь нажмет на него, поэтому задайте побольше времени, чтобы успеть его прочитать, скажем, секунд 60. Информацию в '''info'''-файлах, которую мы хотим отобразить, раздобудет наш скрипт. Экранный снимок на предыдущей странице показывает всплывающее окно в действии.&lt;br /&gt;
&lt;br /&gt;
Но позвольте, откуда возьмутся заметки для всех наших картин – ведь придется создавать множество текстовых файлов, сохранять их в требуемом месте, да еще бдительно следить, чтобы не перепутать их имена? Вовсе нет – еще немного скриптинга, и мы сможем ввести примечания к картине через другое всплывающее окно, снова призвав на помощь ''kdialog'':&lt;br /&gt;
&lt;br /&gt;
 $ kdialog --textinputbox “Это заголовок” “Немного интересных фактов для ввода” &lt;br /&gt;
&lt;br /&gt;
Мы можем отобразить диалоговое окно ввода. Если для данного изображения уже существуют какие-нибудь записи, их-то мы и покажем в окне, а скрипт позаботится о поиске этих записей и передаче их в ''kdialog''.&lt;br /&gt;
&lt;br /&gt;
Возвращаемое ''kdialog'' значение будет содержать (свежеотредактированный) текст. Если не было изменений в поле редактирования, значит, возвращаемые данные будут те же, что и исходный текст. Наш скрипт следит за записью этих данных обратно в файл примечаний к изображению.&lt;br /&gt;
&lt;br /&gt;
===А теперь все вместе===&lt;br /&gt;
&lt;br /&gt;
Мы вчерне описали работу отдельных команд. Давайте сведем команды в скрипт &amp;lt;font color=darkred&amp;gt;wallpaper&amp;lt;/font&amp;gt;. Все выполняемые действия мы будем делать с помощью одного скрипта, передавая в него флажки, контролирующие выбор действия. Мне кажется уместным сперва определить перечень этих действий и соответствующих флажков.&lt;br /&gt;
&lt;br /&gt;
Скрипт будет вызываться следующим образом:&lt;br /&gt;
&lt;br /&gt;
 wallpaper &amp;lt; флажки опций &amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вызов его без параметров по умолчанию обеспечивает переход на следующее изображение в галерее. &amp;lt;font color=darkred&amp;gt;&amp;lt;флажок опции&amp;gt;&amp;lt;/font&amp;gt; может быть таким:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;font color=darkred&amp;gt;-p&amp;lt;/font&amp;gt; перейти к предыдущему изображению.&lt;br /&gt;
*&amp;lt;font color=darkred&amp;gt;-i&amp;lt;/font&amp;gt; показать всплывающее окно с информацией о текущем изображении.&lt;br /&gt;
*&amp;lt;font color=darkred&amp;gt;-e&amp;lt;/font&amp;gt; отобразить окно Редактировать для текущего изображения.&lt;br /&gt;
*&amp;lt;font color=darkred&amp;gt;-h&amp;lt;/font&amp;gt; показать справку.&lt;br /&gt;
&lt;br /&gt;
Скрипт целиком можно взять на DVD. Большая его часть соответствует нашему описанию. В основном мы использовали вызовы внешних программ, захват вывода и стыковку частей, с небольшими вкраплениями логики там и сям. Чтобы избежать дублирования отдельных кусков кода и придать скрипту подобие структуры, используются подпрограммы.&lt;br /&gt;
&lt;br /&gt;
Применим полезный модуль &amp;lt;font color=darkred&amp;gt;Perl Getopt::Std&amp;lt;/font&amp;gt; для обработки параметров, передаваемых в скрипт. В строке&lt;br /&gt;
 &lt;br /&gt;
 getopts(‘pieh’, \my %opts);&lt;br /&gt;
&lt;br /&gt;
мы перечисляем разрешенные флажки и сохраняем их значения в переменной &amp;lt;font color=darkred&amp;gt;%opts&amp;lt;/font&amp;gt; для дальнейшего использования.&lt;br /&gt;
&lt;br /&gt;
Установив некоторые первоначальные значения для текущего рабочего стола, текущую фоновую картину и т.д., приступим к непосредственно к выполнению действий, в зависимости от установленного флажка. Действия &amp;lt;font color=darkred&amp;gt;Info()&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;Edit()&amp;lt;/font&amp;gt; аналогичны – в обоих случаях скрипт получает имя файла, содержащего информацию о текущем изображении:&lt;br /&gt;
&lt;br /&gt;
 my $infofile = getInfoFile($currentImage);&lt;br /&gt;
&lt;br /&gt;
Подпрограмма &amp;lt;font color=darkred&amp;gt;getInfoFile&amp;lt;/font&amp;gt; использует регулярное выражение для манипулирования именем/расположением файла, чтобы найти местоположение для соответствующего файла с информацией. Например, для файла изображения&lt;br /&gt;
&lt;br /&gt;
 /home/dave/BackgroundArt/Caravaggio-Emmaus.jpg&lt;br /&gt;
&lt;br /&gt;
процедура вернет следующий путь к ассоциированному информационному файлу:&lt;br /&gt;
&lt;br /&gt;
 /home/dave/BackgroundArt/.info/Caravaggio-Emmaus.jpg.txt&lt;br /&gt;
&lt;br /&gt;
Процедура &amp;lt;font color=darkred&amp;gt;getInfoFile&amp;lt;/font&amp;gt; делает это с помощью регулярного выражения&lt;br /&gt;
&lt;br /&gt;
 $infofile =~ s#^(.*)/(.*)#$1/.info/$2.txt#;&lt;br /&gt;
&lt;br /&gt;
Определив имя &amp;lt;font color=darkred&amp;gt;infofile&amp;lt;/font&amp;gt;, процедуры &amp;lt;font color=darkred&amp;gt;readFile&amp;lt;/font&amp;gt; и &amp;lt;font color=darkred&amp;gt;writeFile&amp;lt;/font&amp;gt; позаботятся о чтении/записи содержимого по мере надобности. Регулярные выражения являются мощными инструментами для выполнения поиска вхождений строк в тексте и их замены. (Не берите в голову заботу о доскональном понимании синтаксиса, если это для вас в новинку – введение в регулярные выражения требует отдельной статьи! Если у вас есть журнал LXF70, то там такая статья опубликована).&lt;br /&gt;
&lt;br /&gt;
===Горячие клавиши===&lt;br /&gt;
&lt;br /&gt;
Теперь скрипт у нас есть, но он не совсем удобен: приходится вводить команду (с параметрами) для каждого изменения обоев или просмотра всплывающих сообщений. Лучше вместо этого использовать возможности KDE по привязке действий по вводу к горячим клавишам. Лично мне нравится использовать многоклавишные комбинации, чтобы группировать похожие действия. Поэтому &amp;lt;font color=darkblue&amp;gt;Alt+B&amp;lt;/font&amp;gt; для меня будет означать группу операций над обоями, а &amp;lt;font color=darkblue&amp;gt;Alt+B&amp;lt;/font&amp;gt; в сочетании с еще одной клавишей уже выполнят конкретное действие: например, &amp;lt;font color=darkblue&amp;gt;Alt+B,N&amp;lt;/font&amp;gt; выведет следующее изображение, а &amp;lt;font color=darkblue&amp;gt;Alt+B,P&amp;lt;/font&amp;gt; вернет нас к предыдущему.&lt;br /&gt;
&lt;br /&gt;
В порядке иллюстрации создадим одну такую комбинацию. В &amp;lt;font color=darkblue&amp;gt;Input Actions [Ввод]&amp;lt;/font&amp;gt; KDE (обычно расположенном в меню &amp;lt;font color=darkblue&amp;gt;Regional and Accessibilty [Региональные настройки и специальные возможности]&amp;lt;/font&amp;gt; в &amp;lt;font color=darkblue&amp;gt;KDE Control Center [Центр управления KDE]&amp;lt;/font&amp;gt;), создайте новую группу &amp;lt;font color=darkblue&amp;gt;‘Wallpaper Actions’&amp;lt;/font&amp;gt;. Нажмите на группу и создайте новое действие. Назовите его &amp;lt;font color=darkblue&amp;gt;WallpaperNext&amp;lt;/font&amp;gt;, установите тип действия &amp;lt;font color=darkblue&amp;gt;Action &amp;gt; Command(url)&amp;lt;/font&amp;gt; [&amp;lt;font color=darkblue&amp;gt;Комбинация клавиш -&amp;gt; команда/URL&amp;lt;/font&amp;gt;]. Установите комбинацию клавиш (многоклавишный режим) &amp;lt;font color=darkblue&amp;gt;Alt+B,N&amp;lt;/font&amp;gt;, и параметры команды &amp;lt;font color=darkblue&amp;gt;/home/dave/bin/wallpaper&amp;lt;/font&amp;gt; (или путь, где вы сохранили свой скрипт). Нажмите &amp;lt;font color=darkblue&amp;gt;ОК&amp;lt;/font&amp;gt;, и пробуйте. Нажатие &amp;lt;font color=darkblue&amp;gt;Alt+B,N&amp;lt;/font&amp;gt; должно привести к замене текущих обоев следующим изображением вашей галереи. Если это действие работает нормально, двигаемся дальше и добавляем остальные комбинации клавиш.&lt;br /&gt;
&lt;br /&gt;
===Примочки===&lt;br /&gt;
&lt;br /&gt;
Итак, основная часть готова. Как еще улучшить наш скрипт? Ну, можно автоматизировать создание индексного файла, чтобы добавлять/удалять изображения в каталоге и не думать о его ручном обновлении. Добавим задание ''cron'', чтобы это происходило раз в день:&lt;br /&gt;
&lt;br /&gt;
 crontab -e&lt;br /&gt;
 05 12 * * * ls /home/dave/BackgroundArt/* &amp;gt; /home/dave/BackgroundArt/.index.txt&lt;br /&gt;
&lt;br /&gt;
Что еще? Мне нравится идея использования в качестве обоев праздничных фотографий. Или плакатов фильмов, или снимков с телескопа Хаббла. Но надо ли все это помещать в единый список? Наоборот, лучше создать отдельные категории и переключаться между ними. Этого можно добиться, приложив еще немного труда. Мы создадим отдельный каталог для каждой категории изображения. Сложность только в определении, к какой категории принадлежит текущее изображение. Для простоты, будем тупо просматривать наш индексный файл, и если соответствия не найдется, то разместим изображение в категории по умолчанию, допустим, &amp;lt;font color=darkblue&amp;gt;Art&amp;lt;/font&amp;gt;. На DVD вы найдете расширенную версию скрипта, с поддержкой категорий. Я добавил еще горячих клавиш для переключения между категориями.&lt;br /&gt;
&lt;br /&gt;
Другим дополнением может быть предложение пользователю диалога, в котором он мог бы выбрать изображение из списка. Иначе в большой галерее надо будет много раз прокручивать изображения назад и вперед в поисках того или иного образа. (Подсказка: посмотрите опцию &amp;lt;font color=darkred&amp;gt;–combobox&amp;lt;/font&amp;gt; утилиты ''kdialog''). Также&lt;br /&gt;
можно случайным образом выбирать картину из галереи. Это можно автоматизировать через ''cron'' и изменять фон ежедневно.&lt;br /&gt;
&lt;br /&gt;
==Врезки==&lt;br /&gt;
&lt;br /&gt;
===Горячие клавиши===&lt;br /&gt;
&lt;br /&gt;
====Смена изображений====&lt;br /&gt;
&lt;br /&gt;
{| align=center border=1&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Горячие клавиши&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Действие&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|&amp;lt;center&amp;gt;&amp;lt;font color=darkred&amp;gt;Команда&amp;lt;/font&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, N&amp;lt;/center&amp;gt;&lt;br /&gt;
|Перейти к следующему изображению&lt;br /&gt;
|wallpaper&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, P&amp;lt;/center&amp;gt;&lt;br /&gt;
|Перейти к предыдущему изображению&lt;br /&gt;
|walpaper -p&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, I&amp;lt;/center&amp;gt;&lt;br /&gt;
|Отобразить информацию о текущем изображении&lt;br /&gt;
|wallpaper -e&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;center&amp;gt;ALT-B, E&amp;lt;/center&amp;gt;&lt;br /&gt;
|Изменить информацию о текущем изображении&lt;br /&gt;
|wallpaper -e&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Навигация====&lt;/div&gt;</summary>
		<author><name>Belogorie</name></author>	</entry>

	</feed>