<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" gd:etag="W/&quot;CkIBRn89eSp7ImA9WhVTE00.&quot;"><id>tag:blogger.com,1999:blog-1408129172220183524</id><updated>2012-02-26T15:55:57.161-08:00</updated><category term="ruby" /><category term="gnuplot" /><category term="dd" /><category term="иксовое окружение" /><category term="apt-get" /><category term="acpi" /><category term="pidgin" /><category term="rebol" /><category term="wine" /><category term="tty" /><category term="xterm" /><category term="отладка" /><category term="gnome" /><category term="скриптинг" /><category term="C++" /><category term="firefox" /><category term="Заметки" /><category term="awk" /><category term="just for fun" /><category term="tcsh" /><category term="io language" /><category term="webkit" /><category term="globalmenu" /><category term="python" /><category term="linux kernel" /><category term="windows" /><category term="vim" /><category term="mc" /><category term="сеть" /><category term="lxpanel" /><category term="opera" /><category term="DC" /><category term="metacity" /><category term="OOC" /><category term="администрирование" /><category term="colinux" /><category term="wallpapers" /><category term="Статьи" /><category term="arch" /><category term="разработка" /><category term="gtk" /><category term="grc" /><category term="openbox" /><category term="bash" /><category term="мониторинг" /><category term="работа в консоли" /><category term="gnome-terminal" /><category term="gedit" /><category term="Советы" /><category term="lxde" /><category term="gnome-panel" /><category term="Ъ-ссылки" /><category term="Идеи и патчи" /><category term="аппаратура" /><category term="zsh" /><category term="LXPanelX" /><category term="archlinux" /><category term="chromium" /><category term="gcc" /><category term="хоткеи" /><category term="xneur" /><category term="настройка" /><category term="ftp" /><category term="nautilus" /><title>MakeLinux — сделаем Linux лучше</title><subtitle type="html">$ ./configure --enable-all-good-things --without-glitches &amp;amp;&amp;amp; make linux</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://make-linux.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://make-linux.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>geekless</name><uri>http://www.blogger.com/profile/06009713622902465243</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/-CdzHefJdI2I/TigQ4umBRhI/AAAAAAAAAWI/uofyt-6PYA0/s220/51830--919357393.png" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>121</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/Makelinux" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="makelinux" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;C0cMSXc6cSp7ImA9WhRbGEs.&quot;"><id>tag:blogger.com,1999:blog-1408129172220183524.post-5996523777361590956</id><published>2012-02-10T00:04:00.000-08:00</published><updated>2012-02-10T00:04:48.919-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-10T00:04:48.919-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="webkit" /><category scheme="http://www.blogger.com/atom/ns#" term="chromium" /><category scheme="http://www.blogger.com/atom/ns#" term="Заметки" /><title>Наблюдение о скорости прокрутки страниц в различных браузерах</title><content type="html">Случайно сегодня обнаружил, что в Midori содержимое страницы моргает, если при прокрутке над его окном расположено какое-либо другое окно. Выражается это в том, что те фрагменты страницы, которые, будучи закрыты другим окном, при прокрутке «выплывают на свет», сначала заливаются белым фоном, а уже затем с небольшой задержкой там появляется реальное содержимое. После этого я решил посмотреть, как обстоят дела с прокруткой в разных браузерах. И вот что выяснил:&lt;br /&gt;
&lt;br /&gt;
Midori 0.4.3, xxxterm 1.10.0, luakit 2011.07.22. Все эти браузеры используют движок webkit, и во всех наблюдаются описанные выше артефакты. При этом, в Midori и xxxterm прокрутка (перетаскиванием ползунка на полосе прокрутки) ощутимо подтормаживает. (В luakit полоса прокрутки отсутствует, так что проверить не удалось.)&lt;br /&gt;
&lt;br /&gt;
Opera 11.61. Тут наблюдается другой артефакт: страница обновляется по частям (соответствующим разбивке на прямоугольники от перекрытия другим окном), поэтому если прокручивать быстро, можно заметить моменты, когда в одной части страницы содержимое уже перерисовалось, в а другой — еще нет. Прокрутка, тем не менее, не тормозит.&lt;br /&gt;
&lt;br /&gt;
Firefox 9.0.1, Chromium 16.0.912.77. В этих браузерах никаких артефактов нет, ничего при прокрутке не тормозит.&lt;br /&gt;
&lt;br /&gt;
Dillo (r2362). Это минималистичный браузер, использующий собственный нетребовательный к ресурсам движок для рендеринга и тулкит FLTK для интерфейса. Выше я сказал, что в Firefox и Chromium тормозов нет. Так вот, только запустив данный браузер понимаешь: вот тут-то &lt;b&gt;на самом деле&lt;/b&gt; нет никаких тормозов. В Firefox и Chromium же есть некая привычная и практически незаметная при использовании задержка в прокрутке страницы, которую начинаешь замечать только при наглядном сравнении с данным браузером.&lt;br /&gt;
&lt;br /&gt;
Вопрос, который остаётся без ответа: почему же разработчики Chromium смогли задействовать webkit так, что перерисовка страницы в Chromium выполняется без тормозов, а разработчики Midori, xxxterm и luakit — не смогли?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1408129172220183524-5996523777361590956?l=make-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://make-linux.blogspot.com/feeds/5996523777361590956/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://make-linux.blogspot.com/2012/02/blog-post.html#comment-form" title="Комментарии: 1" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/5996523777361590956?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/5996523777361590956?v=2" /><link rel="alternate" type="text/html" href="http://make-linux.blogspot.com/2012/02/blog-post.html" title="Наблюдение о скорости прокрутки страниц в различных браузерах" /><author><name>geekless</name><uri>http://www.blogger.com/profile/06009713622902465243</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/-CdzHefJdI2I/TigQ4umBRhI/AAAAAAAAAWI/uofyt-6PYA0/s220/51830--919357393.png" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DUENSXg_fip7ImA9WhRbF0o.&quot;"><id>tag:blogger.com,1999:blog-1408129172220183524.post-3572259258647116486</id><published>2012-02-08T23:52:00.000-08:00</published><updated>2012-02-09T00:54:58.646-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-09T00:54:58.646-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OOC" /><category scheme="http://www.blogger.com/atom/ns#" term="разработка" /><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><category scheme="http://www.blogger.com/atom/ns#" term="Заметки" /><title>Про костыли, C++ и OOC</title><content type="html">Тут недавно &lt;a href='http://users.livejournal.com/_winnie/335669.html'&gt;_winnie упоминал о неприспособленности C++&lt;/a&gt; к решению простых высокоуровневых задач типа «разбить строку в список, отсортировать и отбросить повторяющиеся значения». По указанной ссылке мы видим некий несложный алгоритм, который должен выполняться максимально быстро, и потому написан на голом Си (то, что файл имеет суффикс cpp пусть не вводит нас в заблуждение). Плюс к этому, в программе имеется функция для парсинга аргументов, в которой возникла задача вида «разбить и отсортировать» — и вот тут-то автору и понадобился C++. Функция написана на страшной смеси Си и Си++ (кстати, а что, в STL не предусмотрен алгоритм split для строк? что за каменный век?) и занимает добрую экранную страницу, при том, что на Питоне аналогичный код, как правильно заметил _winnie, занимает одну строку.&lt;br /&gt;
&lt;br /&gt;
То есть вся проблема заключается в совмещении низкоуровневого кода с высокоуровневым. Си++ тут, понятно, выступает совершенно лишней сущностью, т.к. по меркам по меркам 21-го века «Си с классами и шаблонами» на высоуровневый язык не тянет. Глядя на приведенную задачу, мы можем сформулировать какой же высокоуровневый инструмент нам нужен. Это должен быть язык, который:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Позволяет писать высокоуровневый код, по ёмкости не слишком отличающийся от Питона.&lt;/li&gt;
&lt;li&gt;Статически типизирован.&lt;/li&gt;
&lt;li&gt;Имеет грамотную стандартную библиотеку с контейнерами, строками, обобщенными алгоритмами и т.п. Оная библиоткета должна быть еще и по возможности компактной, чтобы не превращать одностраничный алгоритм в 2 мегабайта лапши после компиляции.&lt;/li&gt;
&lt;li&gt;Из предыдущих 3-х пунктов очевидно, что необходима система автоматического вывода типов и генерики.&lt;/li&gt;
&lt;li&gt;Позволяет с минимум костылей сочетать свой код с кодом на Си. Можно даже компилировать язык напрямую в Си и собирать далее на обычном gcc.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Какой язык соответствует этим требованиям? Всем сразу — вроде бы никакой. Во всяком случае, мне таковой не припоминается.&lt;br /&gt;
&lt;br /&gt;
И теперь мы приходим к тому, о чем я, собственно, и хотел написать. Есть такой &lt;a href='http://ooc-lang.org/'&gt;языс OOC&lt;/a&gt;, который разрабатывается уже года 3 и выглядит очень многообещающе. Сформулировав указанные выше требования, я вспомнил именно об этом языке, потому что он, потенциально, практически идеален по всем критериям (включая и компиляцию в Си). Я решил посмотреть, как обстоят дела у проекта, и насколько он способен прямо сейчас решить нашу задачу.&lt;br /&gt;
&lt;br /&gt;
Давайте посмотрим, как потенциально мог бы выглядеть наш код на этом языке. Пусть у нас есть отдельный файл *.c, с основным алгоритмом программы, а процедуру парсинга мы организуем на OOC. Итак:&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;import&lt;/span&gt; structs&lt;span style='color:#808030; '&gt;/&lt;/span&gt;ArrayList
&lt;span style='color:#800000; font-weight:bold; '&gt;import&lt;/span&gt; text&lt;span style='color:#808030; '&gt;/&lt;/span&gt;StringTokenizer

&lt;span style='color:#e34adc; '&gt;cut_fields_fast:&lt;/span&gt; proto &lt;span style='color:#800000; font-weight:bold; '&gt;extern&lt;/span&gt; func&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#603000; '&gt;Pointer&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; Int&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#808030; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; Int

&lt;span style='color:#400000; '&gt;main&lt;/span&gt; &lt;span style='color:#800080; '&gt;:&lt;/span&gt; func&lt;span style='color:#808030; '&gt;(&lt;/span&gt;args&lt;span style='color:#800080; '&gt;:&lt;/span&gt; ArrayList&lt;span style='color:#808030; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#603000; '&gt;String&lt;/span&gt;&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;
    &lt;span style='color:#800000; font-weight:bold; '&gt;if&lt;/span&gt; &lt;span style='color:#808030; '&gt;(&lt;/span&gt;args size&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#808030; '&gt;!&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt; &lt;span style='color:#008c00; '&gt;2&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;
        &lt;span style='color:#603000; '&gt;stderr&lt;/span&gt; write&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#800000; '&gt;"&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;usage: cut field1,...,fieldN&lt;/span&gt;&lt;span style='color:#0f69ff; '&gt;\n&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;fields indices are sorted and uniqued.&lt;/span&gt;&lt;span style='color:#0f69ff; '&gt;\n&lt;/span&gt;&lt;span style='color:#800000; '&gt;"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;
        &lt;span style='color:#603000; '&gt;exit&lt;/span&gt;&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#008c00; '&gt;1&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;
    &lt;span style='color:#800080; '&gt;}&lt;/span&gt;

    columns &lt;span style='color:#800080; '&gt;:&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt; args&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#008c00; '&gt;1&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt; split&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;','&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; as Iterable&lt;span style='color:#808030; '&gt;&amp;lt;&lt;/span&gt;Int&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; toArrayList&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; sort&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; uniq&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;

    raw_array &lt;span style='color:#800080; '&gt;:&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt; columns toArray&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;
    &lt;span style='color:#800000; font-weight:bold; '&gt;return&lt;/span&gt; cut_fields_fast&lt;span style='color:#808030; '&gt;(&lt;/span&gt;raw_array&lt;span style='color:#808030; '&gt;,&lt;/span&gt; columns size&lt;span style='color:#808030; '&gt;)&lt;/span&gt;
&lt;span style='color:#800080; '&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;
Одна строчка кода, как и было запланировано. :-) Также обратите внимание на хорошую читаемость (читабельность?) кода и привычный всем нам, изнеженным Питонами и Руби, высокий уровень абстракций.&lt;br /&gt;
&lt;br /&gt;
Но это — в теории. На практике же на данном этапе разработки дела обстоят не очень хорошо. Мы упираемся как в недоделанности компилятора, так и в отсутствие фич стандартной библиотеки. Прежде всего, для приведения Iterable&amp;lt;String&amp;gt; в Iterable&amp;lt;Int&amp;gt;, нам нужна хорошая, годная поддержка вывода типов. Написать кастующий итератор — не проблема:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#e34adc; '&gt;IteratorCast:&lt;/span&gt; class&lt;span style='color:#808030; '&gt;&amp;lt;&lt;/span&gt;T1&lt;span style='color:#808030; '&gt;,&lt;/span&gt;T2&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; extends Iterator&lt;span style='color:#808030; '&gt;&amp;lt;&lt;/span&gt;T2&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;
&lt;span style='color:#e34adc; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;real_iterator:&lt;/span&gt; Iterator&lt;span style='color:#808030; '&gt;&amp;lt;&lt;/span&gt;T1&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt;
&lt;span style='color:#e34adc; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;caster:&lt;/span&gt; Func&lt;span style='color:#808030; '&gt;(&lt;/span&gt;T1&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#808030; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; T2

&lt;span style='color:#e34adc; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;init:&lt;/span&gt; func &lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt;real_iterato&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#808030; '&gt;=&lt;/span&gt;caster&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;

&lt;span style='color:#e34adc; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;hasNext:&lt;/span&gt; func &lt;span style='color:#808030; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; Bool &lt;span style='color:#800080; '&gt;{&lt;/span&gt; real_iterator hasNext&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;}&lt;/span&gt;
&lt;span style='color:#e34adc; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;next:&lt;/span&gt; func &lt;span style='color:#808030; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; T2      &lt;span style='color:#800080; '&gt;{&lt;/span&gt; caster&lt;span style='color:#808030; '&gt;(&lt;/span&gt;real_iterator next&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;
&lt;span style='color:#e34adc; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span style='color:#603000; '&gt;remove&lt;/span&gt;&lt;span style='color:#e34adc; '&gt;:&lt;/span&gt; func &lt;span style='color:#808030; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; Bool  &lt;span style='color:#800080; '&gt;{&lt;/span&gt; real_iterator &lt;span style='color:#603000; '&gt;remove&lt;/span&gt;&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;}&lt;/span&gt;
&lt;span style='color:#800080; '&gt;}&lt;/span&gt;

&lt;span style='color:#e34adc; '&gt;IterableCast:&lt;/span&gt; class&lt;span style='color:#808030; '&gt;&amp;lt;&lt;/span&gt;T1&lt;span style='color:#808030; '&gt;,&lt;/span&gt;T2&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; extends Iterable&lt;span style='color:#808030; '&gt;&amp;lt;&lt;/span&gt;T2&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;
&lt;span style='color:#e34adc; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;real_iterable:&lt;/span&gt; Iterable&lt;span style='color:#808030; '&gt;&amp;lt;&lt;/span&gt;T1&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt;
&lt;span style='color:#e34adc; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;caster:&lt;/span&gt; Func&lt;span style='color:#808030; '&gt;(&lt;/span&gt;T1&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#808030; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; T2

&lt;span style='color:#e34adc; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;init:&lt;/span&gt; func &lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt;real_iterable&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#808030; '&gt;=&lt;/span&gt;caster&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;&lt;span style='color:#800080; '&gt;}&lt;/span&gt;

&lt;span style='color:#e34adc; '&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;iterator:&lt;/span&gt; func &lt;span style='color:#808030; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; Iterable&lt;span style='color:#808030; '&gt;&amp;lt;&lt;/span&gt;T2&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt; IteratorCast&lt;span style='color:#808030; '&gt;&amp;lt;&lt;/span&gt;T1&lt;span style='color:#808030; '&gt;,&lt;/span&gt;T2&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; new&lt;span style='color:#808030; '&gt;(&lt;/span&gt;real_iterable iterator&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; caster&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;}&lt;/span&gt;
&lt;span style='color:#800080; '&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;
Но при попытке завернуть работу с итератором в обобщенную операцию приведения типа для контейнеров — вот такую:&lt;br /&gt;
&lt;blockquote&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;operator as&lt;span style='color:#800080; '&gt;:&lt;/span&gt; func&lt;span style='color:#808030; '&gt;&amp;lt;&lt;/span&gt;T1&lt;span style='color:#808030; '&gt;,&lt;/span&gt;T2&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#808030; '&gt;(&lt;/span&gt;a&lt;span style='color:#800080; '&gt;:&lt;/span&gt; Iterable&lt;span style='color:#808030; '&gt;&amp;lt;&lt;/span&gt;T1&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#808030; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; Iterable&lt;span style='color:#808030; '&gt;&amp;lt;&lt;/span&gt;T2&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;
    &lt;span style='color:#696969; '&gt;// ...&lt;/span&gt;
&lt;span style='color:#800080; '&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/blockquote&gt;Так вот, при попытке задействовать обобщенную операцию приведения типа, к нам прилетает розовая птица обломинго. Компилятор нас не понял.&lt;br /&gt;
&lt;br /&gt;
С sort() и uniq() нам тоже не повезло. В стандартной библиотеке их (еще) нет. Что печальнее, reduce() там нет тоже. Я попытался написать обобщенный reduce(), чтобы с его помощью сделать примитивные реализации sort() и uniq(), но наткнулся на те же ограничения в системе вывода типов. Увы-увы.&lt;br /&gt;
&lt;br /&gt;
Итак, решив вообще не мучаться с сортировкой, а преобразование String в Int, сделав, так уж и быть, циклом, получаем следующее:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;import&lt;/span&gt; structs&lt;span style='color:#808030; '&gt;/&lt;/span&gt;ArrayList
&lt;span style='color:#800000; font-weight:bold; '&gt;import&lt;/span&gt; text&lt;span style='color:#808030; '&gt;/&lt;/span&gt;StringTokenizer

&lt;span style='color:#e34adc; '&gt;cut_fields_fast:&lt;/span&gt; proto &lt;span style='color:#800000; font-weight:bold; '&gt;extern&lt;/span&gt; func&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#603000; '&gt;Pointer&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; Int&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#808030; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; Int

&lt;span style='color:#400000; '&gt;main&lt;/span&gt; &lt;span style='color:#800080; '&gt;:&lt;/span&gt; func&lt;span style='color:#808030; '&gt;(&lt;/span&gt;args&lt;span style='color:#800080; '&gt;:&lt;/span&gt; ArrayList&lt;span style='color:#808030; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#603000; '&gt;String&lt;/span&gt;&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;
    &lt;span style='color:#800000; font-weight:bold; '&gt;if&lt;/span&gt; &lt;span style='color:#808030; '&gt;(&lt;/span&gt;args size&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#808030; '&gt;!&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt; &lt;span style='color:#008c00; '&gt;2&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;
        &lt;span style='color:#603000; '&gt;stderr&lt;/span&gt; write&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#800000; '&gt;"&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;usage: cut field1,...,fieldN&lt;/span&gt;&lt;span style='color:#0f69ff; '&gt;\n&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;fields indices are sorted and uniqued.&lt;/span&gt;&lt;span style='color:#0f69ff; '&gt;\n&lt;/span&gt;&lt;span style='color:#800000; '&gt;"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;
        &lt;span style='color:#603000; '&gt;exit&lt;/span&gt;&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#008c00; '&gt;1&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;
    &lt;span style='color:#800080; '&gt;}&lt;/span&gt;

    columns &lt;span style='color:#800080; '&gt;:&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt; ArrayList&lt;span style='color:#808030; '&gt;&amp;lt;&lt;/span&gt;Int&lt;span style='color:#808030; '&gt;&gt;&lt;/span&gt; new&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;
    &lt;span style='color:#800000; font-weight:bold; '&gt;for&lt;/span&gt; &lt;span style='color:#808030; '&gt;(&lt;/span&gt;i in args&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#008c00; '&gt;1&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt; split&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;','&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;
        columns add&lt;span style='color:#808030; '&gt;(&lt;/span&gt;i toInt&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;
    &lt;span style='color:#800080; '&gt;}&lt;/span&gt;

    raw_array &lt;span style='color:#800080; '&gt;:&lt;/span&gt;&lt;span style='color:#808030; '&gt;=&lt;/span&gt; columns toArray&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;
    &lt;span style='color:#800000; font-weight:bold; '&gt;return&lt;/span&gt; cut_fields_fast&lt;span style='color:#808030; '&gt;(&lt;/span&gt;raw_array&lt;span style='color:#808030; '&gt;,&lt;/span&gt; columns size&lt;span style='color:#808030; '&gt;)&lt;/span&gt;
&lt;span style='color:#800080; '&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;
Ну тоже неплохо.&lt;br /&gt;
&lt;br /&gt;
Также следует заметить, что в языке используется сборка мусора, основанная на анализе достижимости объектов. Конкретнее: библиотека Boehm GC. Но мы можем немного оптимизировать нашу программу, если откажемся от сборки мусора вообще. Я сейчас страшную для некоторых программистов вещь скажу, но это правда: &lt;i&gt;в некоторых программах память можно не освобождать вообще&lt;/i&gt;. Ибо придёт неизбежный exit() и сам всё прибёрет. Вот наша программа как раз из этой категории. Так что можно просто заменить все обращения к Boehm GC на вызов malloc(). Язык позволяет делать такие выкрутасы — в теории. На практике же придётся вручную отредактировать один из файлов стандартной библиотеки, потому что соответствующий местный аналог ifdef там зачем-то закомментирован.&lt;br /&gt;
&lt;br /&gt;
Всё это я тестировал на «релизной» версии, которая уже достаточно давно вышла. В версии из транка работа с типами (судя по документации) значительно улучшена. Мне просто лень её устанавливать, чтобы узнать подробности. В любом случае, язык к реальному использованию пока еще не готов, но выглядит очень многообещающе. На мой взгляд, это как раз тот язык, каким мог бы быть C++, если бы проектировался с умом. Собственно, цель поста заключалась в том, чтобы рассказать вам о существовании этого языка. Теперь вы в курсе.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1408129172220183524-3572259258647116486?l=make-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://make-linux.blogspot.com/feeds/3572259258647116486/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://make-linux.blogspot.com/2012/02/c-ooc.html#comment-form" title="Комментарии: 1" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/3572259258647116486?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/3572259258647116486?v=2" /><link rel="alternate" type="text/html" href="http://make-linux.blogspot.com/2012/02/c-ooc.html" title="Про костыли, C++ и OOC" /><author><name>geekless</name><uri>http://www.blogger.com/profile/06009713622902465243</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/-CdzHefJdI2I/TigQ4umBRhI/AAAAAAAAAWI/uofyt-6PYA0/s220/51830--919357393.png" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DUENSXg_cCp7ImA9WhRbF0o.&quot;"><id>tag:blogger.com,1999:blog-1408129172220183524.post-4724257457273444133</id><published>2012-02-06T01:10:00.000-08:00</published><updated>2012-02-09T00:54:58.648-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-09T00:54:58.648-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="rebol" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="Заметки" /><category scheme="http://www.blogger.com/atom/ns#" term="io language" /><title>PKGBUILD для io language, а также несколько слов о производительности Ruby, Python, Rebol</title><content type="html">Добавил в AUR &lt;a href="https://aur.archlinux.org/packages.php?ID=56440"&gt;PKGBUILD для языка Io&lt;/a&gt;. Возможно, кому-нибудь пригодится. (Если первый раз слышите про такой язык, то &lt;a href="http://habrahabr.ru/blogs/crazydev/50873/"&gt;вам сюда&lt;/a&gt;.)&lt;br /&gt;
&lt;br /&gt;
В составе исходных кодов пакета лежат скрипты для тестирования производительности базовых операций интепретатора (обращение к переменной, вызов метода, создание нового объекта и т.п.) для нескольких языков: Io, Ruby, Python и Rebol. Я решил ими воспользоваться, и вот что намерил:&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h4&gt;Python 2, CPython&lt;/h4&gt;&lt;blockquote&gt;&lt;pre&gt;~/git/io$ python2 samples/speed/speed.py

Python localAccesses       := 33.54
Python localSets           := 29.58

Python slotAccesses        := 8.45
Python slotSets            := 7.29

Python blockActivations    := 2.99
Python instantiations      := 2.34
Python version := "2.7.2 final 0"

// values in millions per second
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;h4&gt;Python 3, CPython&lt;/h4&gt;&lt;blockquote&gt;&lt;pre&gt;~/git/io$ python samples/speed/speed.py

Python localAccesses       := 38.50
Python localSets           := 31.03

Python slotAccesses        := 7.78
Python slotSets            := 7.46

Python blockActivations    := 2.80
Python instantiations      := 3.41
Python version := "3.2.2 final 0"

// values in millions per second
&lt;/pre&gt;&lt;/blockquote&gt;Т.е. производительность 2-й и 3-й версии примерно одинакова. Повторный запуск тестов показывает устойчивый прирост скорости только на доступе к локальным переменным, остальные же значения примерно равны.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Ruby 1.8, MRI&lt;/h4&gt;Ну это известный тормоз, чему обычно очень рады питонисты, участвующие в форумных войнах Python vs Ruby. Измеряем:&lt;br /&gt;
&lt;blockquote&gt;&lt;pre&gt;~/git/io$ ruby-1.8 samples/speed/speed.rb

Ruby localAccesses       := 10.70
Ruby localSets           := 8.12

Ruby slotAccesses        := 5.85
Ruby slotSets            := 5.54

Ruby blockActivations    := 2.33
Ruby instantiations      := 1.83
Ruby version := "1.8.7"
// values in millions per second
&lt;/pre&gt;&lt;/blockquote&gt;Да, в самом деле тормоз. (Однако, см. примечание в конце поста.)&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Ruby 1.9, MRI&lt;/h4&gt;А вот это уже интереснее.&lt;br /&gt;
&lt;blockquote&gt;&lt;pre&gt;~/git/io$ ruby samples/speed/speed.rb

Ruby localAccesses       := 63.57
Ruby localSets           := 38.74

Ruby slotAccesses        := 13.44
Ruby slotSets            := 27.92

Ruby blockActivations    := 8.63
Ruby instantiations      := 2.67
Ruby version := "1.9.3"
// values in millions per second
&lt;/pre&gt;&lt;/blockquote&gt;Итак, новая версия MRI наконец-то перестала быть тормозом и порвала CPython. Рубисты могут ликовать. Не долго, впрочем, ликовать, поскольку у Питона есть еще кое-что в запасе:&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Python 2, pypy&lt;/h4&gt;&lt;blockquote&gt;&lt;pre&gt;~/git/io$ pypy samples/speed/speed.py

Python localAccesses       := 394.16
Python localSets           := 398.40

Python slotAccesses        := 150.94
Python slotSets            := 142.25

Python blockActivations    := 39.87
Python instantiations      := 119.99
Python version := "2.7.1 final 42"

// values in millions per second
&lt;/pre&gt;&lt;/blockquote&gt;Без комментариев. :-)&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Rebol&lt;/h4&gt;&lt;blockquote&gt;&lt;pre&gt;Rebol localAccesses      := 31.1458560438534
Rebol localSets          := 15.208200261581


Rebol slotAccesses       := 31.6525812680024
Rebol slotSets           := 15.2397208083148


Rebol blockActivations   := 7.28682396490666
Rebol instantiations     := 0.0432321515089772


Rebol version := 2.7.8.4.2
// values in millions per second
&lt;/pre&gt;&lt;/blockquote&gt;Надо сказать, я об этом языке совершенно ничего не знаю, никогда на нём не писал ни строчки кода. Но раз уж лежит тест для него, установил интерпретатор и запустил. Довольно необычный результат: создание новых объектов невероятно медленное, остальные же показатели не хуже СPython.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Io&lt;/h4&gt;Ну и наконец виновник торжества, самый медленый:&lt;br /&gt;
&lt;blockquote&gt;&lt;pre&gt;~/git/io$ io samples/speed/speed.io 

Io localAccesses      := 6.23
Io localSets          := 2.86

Io slotAccesses       := 3.01
Io slotSets           := 1.43

Io blockActivations   := 0.16
Io instantiations     := 0.30
Io cfuncActivations   := 5.12
Io version := 20110905
// values in millions per second
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;
Возможно, я его собрал как-то неправильно, но странно, почему он такой медленный. В принципе, сам по себе результат был бы не удивителен, т.к. над интерпретаторами Питона и Руби работает приличное количество людей, а Io, фактически, — проект одного человека. Однако в дереве иходников лежат старые результаты тестов, и если им верить, когда-то Io превосходил по скорости CPython, не говоря уж MRI:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;pre&gt;Io localAccesses      := 26.73
Io localSets          := 10.32

Io slotAccesses       := 11.19
Io slotSets           := 4.89

Io blockActivations   := 3.66
Io instantiations     := 2.15
Io cfuncActivations   := 24.40
Io version := 20050615
// values in millions per second

Python localAccesses       := 23.23
Python localSets           := 23.25

Python slotAccesses        := 6.09
Python slotSets            := 5.89

Python blockActivations    := 1.59
Python instantiations      := 1.38
Python version := "2.3.0 final 0"

// values in millions per second


Ruby localAccesses       := 8.12
Ruby localSets           := 5.75

Ruby slotAccesses        := 3.36
Ruby slotSets            := 4.41

Ruby blockActivations    := 2.26
Ruby instantiations      := 1.44
Ruby version := "1.6.8"
// values in millions per second
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;
Кроме того, по этим результатам, Io превосходит сам себя (т.е. мой тест) где в 6 раз, а где и вовсе в 22. Я полагаю, такую разницу невозможно объяснить различем производительности процессоров. Тесты я проводил в ОС Archlinux (32 бита) на системе с таким процессором:&lt;br /&gt;
&lt;blockquote&gt;&lt;pre&gt;model name : AMD Athlon(tm) 64 X2 Dual Core Processor 5000+
stepping : 2
cpu MHz  : 2612.191
cache size : 512 KB
&lt;/pre&gt;&lt;/blockquote&gt;У меня нет разумного объяснения, какое железо может дать тут прирост скорости однопоточной программы  в 22 раза. Можно было бы списать на кэш-промахи, но крайне сомнительно, что тест blockActivations не уместился бы в кэш. Так что вопрос производительности Io требует дальнейшего изучения. Если найду время на это, постараюсь разобраться и отпишу о результатах.&lt;br /&gt;
&lt;br /&gt;
Надо заметить, что из-за этого также и результаты тестов Ruby 1.8 под вопросом. Я собирал интерпретатор на своей системе, а не устанавливал готовый пакет.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1408129172220183524-4724257457273444133?l=make-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://make-linux.blogspot.com/feeds/4724257457273444133/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://make-linux.blogspot.com/2012/02/pkgbuild-io-language-ruby-python-rebol.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/4724257457273444133?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/4724257457273444133?v=2" /><link rel="alternate" type="text/html" href="http://make-linux.blogspot.com/2012/02/pkgbuild-io-language-ruby-python-rebol.html" title="PKGBUILD для io language, а также несколько слов о производительности Ruby, Python, Rebol" /><author><name>geekless</name><uri>http://www.blogger.com/profile/06009713622902465243</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/-CdzHefJdI2I/TigQ4umBRhI/AAAAAAAAAWI/uofyt-6PYA0/s220/51830--919357393.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUENSXg_cSp7ImA9WhRbF0o.&quot;"><id>tag:blogger.com,1999:blog-1408129172220183524.post-2402937150144558823</id><published>2012-02-02T03:06:00.000-08:00</published><updated>2012-02-09T00:54:58.649-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-09T00:54:58.649-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Заметки" /><title>Послесловие к посту о идеях из Windows</title><content type="html">На этот раз поговорим не о программном обеспечении, а о его несчастных пользователях. Я, разумеется, знал на что шел, публикуя &lt;a href='http://make-linux.blogspot.com/2012/01/n-windows-98-de.html'&gt;подобный обзор&lt;/a&gt;. Но кто на citkit.ru и linux.org.ru бывал, тот флуда и троллей не боится.&lt;br /&gt;
&lt;br /&gt;
К сожалению, 14 оставленных к посту комментариев не дают возможности провести развернутый анализ, однако кое-какие выводы сделать можно. Из 14-ти комментариев, только 2 относятся непосредственно к предмету статьи и вполне раскрывают мысль комментатора (а не просто «крикнул и убежал»). Еще несколько — ответы другим комментаторам. Прочие же представляю собой довольно любопытное явление. Т.к. всё равно цитирую их тут, то за одно и отвечу скопом на все. Итак:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;Ты похоже просто никогда не видел KDE&lt;/blockquote&gt;Да разумеется не видел, вчера только с дерева слез, когда б я успел.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;Он похоже просто никогда не вылазил из дефолтных ДЕ. Типичный мышкодав.&lt;/blockquote&gt;Если кто-то способен дешифровать это послание с планеты Шелезяка, черканите в комменты, что же он пытался сказать.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;контрл ненужен ибо в кедах есть группы&lt;/blockquote&gt;А апельсины не нужны, потому что есть яблоки.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;еще было бы круче назвать тему "M идей из Win 3.11, о которых..."&lt;/blockquote&gt;Если в Windows 3.11 есть хоть одна полезная идея, актуальная для современных DE, то об этом тоже стоит написать. Сарказм не удался.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;у автора нет опыта работы на линуксе, или этот опыт болтается около нуля.&lt;/blockquote&gt;Опытная команда телепатов поставит любой диагноз через интернет.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;в интернете достаточно много статей в таком ракурсе, не отличающихся особой компетенцией и, соответсвенно, не отличающихся даже попыткой объективно сравнить.&lt;/blockquote&gt;Я ничуть не сомневаюсь, что в интернете достаточно много статей, не отличающихся не то что бы особой компетенцией, но вообще лишенных признаков оной. Однако этот комментарий показывает лишь неумение комментатора читать и ничего более. Поскольку если бы комментатор осилил прочитать статью, он бы выяснил, что &lt;b&gt;попытки «объективно сравнить» не ставилось&lt;/b&gt;. А ставилась попытка &lt;b&gt;найти те аспекты графической среды Windows, в которых она проработана лучше, чем DE для линукса&lt;/b&gt; (а для этого не требуется петь дифирамбы линуксу, и рассказывать, как здесь всё хорошо). Что и было сделано.&lt;br /&gt;
&lt;br /&gt;
Ну и наконец, комментарий из категории «читать и плакать».&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;Крапают сейчас всякие статеек, типа ЭТОЙ, сравнилки, Windows восхвалялки и тут же усиленно Linux гнобилки... По на вытаскивают из подвалов истории несколько сомнительных достоинств имевшихся в Windows, раздуют их до уровня фишек первоочередной необходимости и начинают обвинять Linux"а в их отсутствии. &lt;br /&gt;
Заняться что ли нечем? Сколько бы недостатков не имели Linux системы, у них достоинств намного больше чем у Windows! Как бы не напрягались и не тужились, Windows безнадёжно отстал во всём! И не догонит уже, как бы дика не пиарили его и не вливались в него финансово. Катится оно пока по инерции... И дальше будет катится, как телега с горы! Не надо его всюду нахаливать, сами ехайте на ней, или скучно ехать? &lt;br /&gt;
Как бы мне не было в Linux"е, на Windows телегу я уже не пересяду! Хватит, накатался! Больше мне не хочется этой езды...&lt;/blockquote&gt;&lt;br /&gt;
Что я могу сказать... Слова здесь бессильны, поможет только химия: корвалол, валерьянка, что там еще можно дать переволновавшемуся человеку.&lt;br /&gt;
&lt;br /&gt;
В целом в этом комментарии проступают те же черты, которые имеются и в процитированных ранее, но тут они видны гораздо более чётко и рельефно. Давайте же посмотрим на них:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Неспособность понимать прочитанный материал.&lt;/b&gt; Очевидно, что комментатор либо совсем не читал текст статьи, либо читал, но ничерта не понял. Невозможно представить, чтобы человек, не имеющий проблем с пониманием, нашел бы в моей статье «восхвалялки Windows», «гнобилки Linux», «раздувание сомнительных достоинств» и прочие плоды воображения автора комментария.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Неспособность аргументировать свою точку зрения.&lt;/b&gt; Как видно, никто даже и не пытался.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Стремление во всем видеть угрозу, а в людях — ­врагов.&lt;/b&gt; Вероятно, перед мысленным взором комментатора, когда он писал ко мне в блог, представала ужасная картина, как тёмные силы ловят его, удаляют с компьютера любимый линукс и заставляют пользоваться ненавистным Windows, угрожая в случае неподчинения страшными карами. Просто мания преследования какая-то.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Истеричность.&lt;/b&gt; И надо заметить, эта черта ничуть не удивительна на фоне предыдущей. Впрочем, сложно сказать: то ли истеричность порождает манию преследования, то ли мания преследования порождает истеричность.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Выяснение отношений вместо обсуждения по существу.&lt;/b&gt; Ну и наконец, закономерный итог: после того, как читатель неверно понял текст, не смог найти обоснований своего мнения, увидел для себя угрозу и начал истерику, остаётся наиболее простой выход: обвинить автора во всех грехах, назвать дураком или ламером, попытаться убедить себя, что перед нами на самом деле нечто недостойное внимания. Защитная реакция.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Обсуждения, касающиеся Линукса, здесь ничем не уникальны: всё то же самое вы найдёте в спорах о языках программирования, об автомобилях, о музыке, о сексе, о политике... — везде. Однако когда дело касается линукса, все эти черты приобретают столь острый характер, что можно говорить о форме религиозной фанатичности у большинства участников таких дискуссии. Чем еще, кроме как религиозной фанатичностью, можно объяснить то, что вполне невинная заметка на тему «а есть ли что хорошего в Windows, что можно было бы оттуда спереть» превратилась в глазах комментатора в воплощение зла, в страшную «Windows восхвалялку и Linux гнобилку», в «вытаскивание из подвалов истории сомнительных достоинств» и «обвинение Linux"а в их отсутствии», переходящее затем во «всюду нахаливание» и попытки «пересадить» читателя «на Windows телегу».&lt;br /&gt;
Чувак, ты просто задумайся: а с тобой всё в порядке? Помощь профильного специалиста не требуется?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1408129172220183524-2402937150144558823?l=make-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://make-linux.blogspot.com/feeds/2402937150144558823/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://make-linux.blogspot.com/2012/02/windows.html#comment-form" title="Комментарии: 16" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/2402937150144558823?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/2402937150144558823?v=2" /><link rel="alternate" type="text/html" href="http://make-linux.blogspot.com/2012/02/windows.html" title="Послесловие к посту о идеях из Windows" /><author><name>geekless</name><uri>http://www.blogger.com/profile/06009713622902465243</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/-CdzHefJdI2I/TigQ4umBRhI/AAAAAAAAAWI/uofyt-6PYA0/s220/51830--919357393.png" /></author><thr:total>16</thr:total></entry><entry gd:etag="W/&quot;D0IBSHYycCp7ImA9WhRUFUQ.&quot;"><id>tag:blogger.com,1999:blog-1408129172220183524.post-5766825046942212786</id><published>2012-01-26T08:32:00.000-08:00</published><updated>2012-01-26T08:32:39.898-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-26T08:32:39.898-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Статьи" /><title>N идей из Windows 98, о которых стоило бы знать разработчикам современных DE.</title><content type="html">Среди пользователей линукс довольно распространена такая точка зрения, что вот в Windows всё плохо, а вот в графических средах для линукс всё хорошо. Между тем, всегда всё плохо быть не практически может, это надо сильно постараться, чтобы добиться такого результата. Поэтому в этой статье я постараюсь осветить те вещи, которые в Windows проработаны лучше, чем в мейнстримовых DE линукса. Возможно, кого-нибудь это вдохновит накодить что-то полезное.&lt;br /&gt;
&lt;br /&gt;
Припомнив народную мудрость, что всё новое — это плотно забытое старое, в качестве &lt;s&gt;жертвы вивисектора&lt;/s&gt; подопытной системы я установил Windows 98. Посмотрим, какие же идеи 14-ти летней давности актуальны для линукса и сейчас. Взяв быка за рога, переходим к первой и довольно неожиданной:&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Тайлинг окон из контекстного меню панели задач.&lt;/h4&gt;&lt;br /&gt;
Ух... да, вы всё прочитали правильно. В Windows 98 имеется поддержка тайлинга. Даже если вы об этом знали, то, готов спорить, уже наверняка забыли. Правда настоящим тайлингом это трудно назвать: панель задач умеет по команде из контекстного меню тайлить окна вертикально и горизонтально. Это всё.&lt;br /&gt;
&lt;br /&gt;
&lt;img src='http://s018.radikal.ru/i526/1201/fb/9c5786abf2ab.png'/&gt;&lt;br /&gt;
&lt;br /&gt;
Вы скажете: «Ну что за ерунда, тайлингом должен заниматься менеджер окон и делать это полноценно. WM в Windows этого не умеет.» Ну я на это скажу, что мой &lt;b&gt;openbox&lt;/b&gt; тайлинга тоже не умеет, и в 99,9% процентах случаев мне этого и не нужно. Но если мне потребуется, раз в месяц, расположить несколько окон так, чтобы они не перекрывали друг друга, мне придётся сделать это вручную, а затем установить &lt;b&gt;pytyle&lt;/b&gt; на случай, если это снова понадобится. Так что готовая команда, доступная в два клика, — это не лишне.&lt;br /&gt;
&lt;br /&gt;
Кроме тайлинга таже доступно расположение окон каскадом, но я затрудняюсь придумать, для чего оно может быть полезно. &lt;br /&gt;
&lt;br /&gt;
Что интересно, после выполнения действий Tile или Cascade, в меню появляется пункт для отмены этой операции, чтобы можно было «вернуть всё как было».&lt;br /&gt;
&lt;br /&gt;
&lt;img src='http://s018.radikal.ru/i525/1201/31/496d09efec44.png'/&gt;&lt;br /&gt;
&lt;br /&gt;
Однако сама по себе возможность затайлить все окна довольно бесполезна: обычно окон открыто много (особенно учитывая, что из коробки Windows не имеет поддержки переключения рабочих столов), и если ко всем применить тайлинг, на экране возникнет месиво из окон. И тут мы переходим к следующей особенности панели задач Windows:&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Применение операций сразу к нескольким окнам панели задач.&lt;/h4&gt;&lt;br /&gt;
Удерживая Ctrl, вы можете выделить несколько окон и затем из контекстного меню применить к ним действие:&lt;br /&gt;
&lt;br /&gt;
&lt;img src='http://s017.radikal.ru/i436/1201/d4/302e073612e2.png'/&gt;&lt;br /&gt;
&lt;br /&gt;
Закрыть, свернуть, развернуть, затайлить, расположить каскадом — полный набор. Это достаточно очевидная и не трудная в реализации возможность, тем не менее, в распространёных панелях задач для линукса вы её вряд ли встретите. &lt;b&gt;lxpanel&lt;/b&gt; так не умеет. &lt;b&gt;xfce-panel&lt;/b&gt; так не умеет. &lt;b&gt;gnome-panel&lt;/b&gt; из Gnome 2, скорее всего, тоже не умеет (сейчас мне не в чем проверить), т.к. работает на том же виджете, что и &lt;b&gt;xfce-panel&lt;/b&gt;. Про всякие &lt;b&gt;bmpanel&lt;/b&gt; и &lt;b&gt;tint&lt;/b&gt; и вовсе говорить нечего.&lt;br /&gt;
&lt;br /&gt;
В остальном панель задач Windows 98 банальна и никаких отровений не содержит. Однако стоит обратить внимание на такую возможность, не имеющую отношения к управлению окнами, как&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;toolbar-ы на панели задач.&lt;/h4&gt;&lt;br /&gt;
&lt;img src='http://s017.radikal.ru/i414/1201/48/a0c1f85623d6.png'/&gt;&lt;br /&gt;
&lt;br /&gt;
Toolbar устроен удивительно юниксвейно: он просто отображает иконки файлов из заданного каталога. Помещение элементов в тулбар производится копированием файлов или созданием ярлыков в соответствующем каталоге. Щелчок по иконке выполняет умолчательное действие для файла: запуск бинарника, открытие документа и т.п.&lt;br /&gt;
&lt;br /&gt;
Не поместившиеся на тулбар иконки отображаются в выпадающем меню, и с этим связана одна то ли багофича, то ли так-и-было-задумано фича: если иконка подкаталога поместилась на тулбар, то щелчок по ней приводит к запуску файлового менеджера; если же подкаталог попал в выпадающее меню, то он становится подменю с собственным содержимым (и так далее, рекурсивно по всем подкаталогам). Эта особенность позволяет, выставив размер тулбара на минимум, использовать его для быстрой навигации по файловой системе.&lt;br /&gt;
&lt;br /&gt;
У панелей для линукса мне встречались реализации виджетов навигации по структуре каталогов. Например, lxpanel имеет такой виджет. А вот виджет, отображающий содержимое каталога непосредственно на панели, — сходу не припомню, есть ли такие и для каких панелей.&lt;br /&gt;
&lt;br /&gt;
Также нельзя не отметить, что такой тулбар мало чем (кроме внешнего вида) отличается от основного поля файлового менеджера: аналогичнм образом работает перетаскивание, в контекстном меню иконок доступно точно такое же меню файлов, как и в Проводнике. И это следующая полезная идея:&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Универсальное меню файлов.&lt;/h4&gt;&lt;br /&gt;
Файл — это ключевая абстракция в современном компьютере. Всё, что делает пользователь, крутится вокруг файлов. В файлах лежат данные пользователя. В файлах лежат программы. Всё есть файл. В начале было Слово, и Слово это было ф... так, постойте, нет, это уже из другой истории.&lt;br /&gt;
&lt;br /&gt;
Ну так вот. Взаимодействие с компьютером при помощи командной строки подразумевает модель «действие — объект». (Т.е. «команда — файлы».) Работа в графическом окружении, наоборот, подразумевает модель «объект — действие». Сначала пользователь выбирает при помощи графического интерфейса объекты, затем выбирает действия, производимые с ними. Действия выбираются из меню. А это значит, что везде, где доступны некоторые объекты, должны, из соображений регулярности и предсказуемости пользовательского интерфейса, быть доступны и действия над ними. Везде — значит везде.&lt;br /&gt;
&lt;br /&gt;
На уже упомянутом тулбаре:&lt;br /&gt;
&lt;br /&gt;
&lt;img src='http://s018.radikal.ru/i521/1201/73/804757158d4a.png'/&gt;&lt;br /&gt;
&lt;br /&gt;
В меню Пуск:&lt;br /&gt;
&lt;br /&gt;
&lt;img src='http://s018.radikal.ru/i518/1201/96/6d4138bf09eb.png'/&gt;&lt;br /&gt;
&lt;br /&gt;
В утилите поиска файлов:&lt;br /&gt;
&lt;br /&gt;
&lt;img src='http://s018.radikal.ru/i503/1201/70/fad514ef1b1f.png'/&gt;&lt;br /&gt;
&lt;br /&gt;
В стандартном диалоге открытия/сохранения. (Скриншот забыл сделать, так что верим мне на слово. :} )&lt;br /&gt;
&lt;br /&gt;
Эта особенность Windows является одной из флудоносных тем на форумах, посвященных линуксу. Ведь в линуксовых DE, как вы знаете, нет ни универсального файлового меню, ни даже попыток его создать. (Ну если не знаете, то вот теперь узнали.) Вне зависимости от того, сколько раз форумные бойцы повторят «не нужно», «нефиг тащить дурные привычки» и «проводник — говно», с точки зрения принципов проектирования пользовательского интерфейса это по-прежнему крутая и нужная фича, повышающая предсказуемость UI и снижающая число лишних переключений фокуса внимания во многих use cases. &lt;br /&gt;
&lt;br /&gt;
Я даже наберусь наглости сказать, что данный подход к меню файлов по духу (но не по букве: реализация там говно) более юниксвеен, чем тот разброд, что по этому вопросу царит в графических средах для линукса.&lt;br /&gt;
&lt;br /&gt;
Ну и раз уж мы открыли утилиту поиска, то рассмотрим и её. Есть тут какие-нибудь полезные идеи?&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Утилита поиска?&lt;/h4&gt;&lt;br /&gt;
Ну на первый взгляд ничего особенного:&lt;br /&gt;
&lt;br /&gt;
&lt;img src='http://s008.radikal.ru/i305/1201/ed/c22fd91c98c2.png'/&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img src='http://s018.radikal.ru/i509/1201/c0/132150b770fc.png'/&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img src='http://s018.radikal.ru/i500/1201/83/a200271ceebd.png'/&gt;&lt;br /&gt;
&lt;br /&gt;
Критериев поиска не много, но и не мало. С универсальным языком запросов у &lt;b&gt;find (1)&lt;/b&gt; это не сравнится, но для большинства типичных случаев вполне пригодно.&lt;br /&gt;
&lt;br /&gt;
Кстати, а какие графические средства поиска (не являющиеся фронтэндами к демонам-индексаторам) вообще есть для линукс? Сразу вспоминается утилита &lt;b&gt;gnome-search-tool&lt;/b&gt;. В принципе, она умеет и все те же критерии поиска, что виндовая утилита, и даже намного больше. Также есть &lt;b&gt;catfish&lt;/b&gt;, который убог. Есть утилита в составе проекта EDE (который де факто мертв, поэтому она не считается). Наверняка есть и в KDE, но мне лень устанавливать что-либо KDE-шное, чтобы проверить.&lt;br /&gt;
&lt;br /&gt;
У Xfce и LXDE подобных утилит нет. Так что для этих проектов наличие утилиты поиска файлов само по себе может являться идеей-которую-стоит-взять-на-вооружение. В самом деле, что же это за окружение графическое рабочего стола, если в нём нет штатного средства, чтобы ответить на вопрос «какие *.html файлы в каталоге проекта изменял Вася Пупкин вчера и позавчера»?&lt;br /&gt;
&lt;br /&gt;
Но настоящее сокровище откроется нашим взглядам, когда мы перестанем разглядывать виджеты критериев поиска и обратим взор внутрь меню Файл. Вот оно:&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Сохранение условий и результатов поиска.&lt;/h4&gt;&lt;br /&gt;
&lt;img src='http://s018.radikal.ru/i519/1201/5d/d13fcb2a1192.png'/&gt;&lt;br /&gt;
&lt;br /&gt;
Итак, что делает действие Save Search. Оно сохраняет условия и результаты поиска (либо только условия, зависит от настроек программы) в файл на рабочем столе. Двойной щелчок по этому файлу откроет утилиту поиска точно в том виде, в каком она была в момент сохранения: с тем же текстом в полях ввода, с теми же строками в таблице результатов.&lt;br /&gt;
&lt;br /&gt;
Выбора, куда сохранять, нет. Всегда сохраняет на рабочий стол. (В самом деле, вам вряд ли понадобится тусовать эти файлы-сейвы по каталогам.) Имя файла выбирается автоматически на основе условий поиска. (В самом деле, вы вряд ли захотите дать результатам иное имя, чем «Поиск по txt», если вы искали по *.txt.)&lt;br /&gt;
&lt;br /&gt;
Я считаю это невероятно крутой вещью. Как по задумке (сама идея сохранять условия и результат), так и по реализации (два клика на сохранение, два клика на восстановление; ничего лишнего).&lt;br /&gt;
&lt;br /&gt;
Следующая идея:&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Справка на что угодно через контекстное меню.&lt;/h4&gt;&lt;br /&gt;
Ну как бы всё очевидно — нажал правой кнопкой на практически любой элемент, получил краткую справку:&lt;br /&gt;
&lt;br /&gt;
&lt;img src='http://s57.radikal.ru/i155/1201/1e/f14d6d798342.png'/&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img src='http://s44.radikal.ru/i105/1201/f4/8fb6e29bf46e.png'/&gt;&lt;br /&gt;
&lt;br /&gt;
К сожалению, «что угодно» на самом деле совсем не что угодно. Во многих случаях контекстной справки нет, либо она довольно бестолкова. Тем не менее, на фоне тотального бардака в справочной системе наших DE, это просто сокровище. Ну я думаю, вы знаете: кто видел справку на приложения KDE, тот над шуткой «в Windows плохая справочная система» больше не смеётся. Фееричные руководства вида «А вот это меню Правка, а вот и список его пунктов» (скопипасченный прямо из исходников, вполне вероятно), которые писались не вполне трезвым Капитаном Очевидность. (Дабы поддержать баланс добра и зла, добавлю, что в Gnome ситуация со справочной системой принципиально не отличается.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ну а теперь вещь, ради проверки которой я и установилполез в Windows (еще до того, как мне пришла в голову идея этой статьи):&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Непротиворечивое использовани мыши и клавиатуры в виджетах TreeView и ListView.&lt;/h4&gt;&lt;br /&gt;
В приложениях, написанных на Gtk, с этими виджетами просто беда какая-то.&lt;br /&gt;
&lt;br /&gt;
Вот возьмём типичное использование этих виджетов: отображение содержимого директорий. Тут имеют смысл два типа пометок обьектов: текущий и выделенный. Выделенные обьекты — это те, с которыми будут производиться любые операции. Текущий — это тот, который имеет пометку «вот тут находится клавиатурный курсор». В обычных условиях выделенный == текущий. Однако удерживая Ctrl или Shift, можно выделить произвольное число файлов (а курсор при этом может стоять на невыделенном файле).&lt;br /&gt;
&lt;br /&gt;
Так вот. Если мы берём идею «операции производятся с выделенными объектами», то давайте &lt;b&gt;следовать&lt;/b&gt; этой идее! В Gtk-шных же приложениях всё перепуталось. Если выделение находится одном файле, а курсор на другом, то Shift+F10 открывает меню для выделенного файла — верно. А вот enter выполняет действие над файлом под курсором, а не над выделенным — неверно! (Воспроизводится в: &lt;b&gt;pcmanfm&lt;/b&gt;, &lt;b&gt;thunar&lt;/b&gt;)&lt;br /&gt;
&lt;br /&gt;
С мышью еще интереснее. Либо мы принимаем идею «левый клик выделяет, правый клик открывает меню для выделенных файлов» (так сделано, например, в &lt;b&gt;PathFinder&lt;/b&gt;). Либо мы принимаем идею «выделять можно и левым, и правым кликом, но правый еще и открывает контекстное меню» (так сделано, например, в &lt;b&gt;Проводнике&lt;/b&gt;). В pcmanfm решили сделать и не так, и не эдак. Левый клик выделяет объект. Если кликнуть по пустому пространству, выделение сбрасывается. Всё верно. Правый клик выделяет объект и открывает контекстное меню. Если сделать правый клик по пустому пространству, выделение не сбрасывается, и контекстное меню открывается не для вмещающего каталога, а для выделенных объектов. А вот это уже неверно!&lt;br /&gt;
&lt;br /&gt;
В &lt;b&gt;thunar&lt;/b&gt;, к слову, это работает правильно. В &lt;b&gt;Проводнике&lt;/b&gt; — тоже:&lt;br /&gt;
&lt;br /&gt;
&lt;img src='http://s018.radikal.ru/i503/1201/28/13eb8ebda9c9.png'/&gt;&lt;br /&gt;
&lt;br /&gt;
Еще один вкусный баг: пункты боковой панели в файловых менеджерах. Этим пунктам приходится работать в трёх ипостасях: и как кнопка, по нажатию открывающая соответствующий каталог, и как объект, имеющий собственное меню и собственный набор действий, и как индикатор «сейчас открыт такой-то каталог». Всё бы ничего, но состояний у них всего два: выделен, либо не выделен. И поэтому фейлится либо роль обьекта с собственным меню (use case: щелкаем правой кнопкой, чтобы открыть меню; вместе с этим происходит активация кнопки, происходит переход в соответствующий каталог — fail). Либо роль индикатора (use case: щелкаем правой кнопкой, чтобы открыть меню; объект выделяется (это нужно, чтобы было видно, к какому обьекту открыто меню), но перехода в каталог не происходит — fail). Второй фейл, тем не менее, предпочтительнее первого, так что в thunar и pcmanfm реализован именно он.&lt;br /&gt;
&lt;br /&gt;
Теперь, вместо отдельных пунктов, рассмотрим дерево каталогов в боковой панели. Суть та же, выделение означает 2 взаимоисключающие вещи: 1) этот каталог открыт; 2) к этому каталогу открыто контекстное меню. &lt;b&gt;pcmanfm&lt;/b&gt; гордо не имеет поддержки контексного меню в дереве каталогов (то ли не планируется. то ли еще не реализовали), и этим решает проблему на корню. А вот &lt;b&gt;thunar&lt;/b&gt; опять фейлится по тому же сценарию.&lt;br /&gt;
&lt;br /&gt;
Но как же выйти из затруднения? Дерево каталогов Проводника подсказывает нам решение: следует использовать &lt;i&gt;две разных метки&lt;/i&gt;. Конкретно в случае Проводника, метка изменением цвета фона означает «к этому каталогу открыто контекстное меню», а метка пунктирным контуром — «этот файл открыт на основной панели». Если контекстное меню не открыть, обе метки стоят на одном и том же каталоге. Если щелчком правой кнопкой мыши открывается меню для какого-либо узла, первая метка смещается на этот узел, а вторая остаётся на своём месте. После закрытия меню, первая метка возвращается к первой.&lt;br /&gt;
&lt;br /&gt;
&lt;img src='http://s018.radikal.ru/i522/1201/a3/af9c378c04bf.png'/&gt;&lt;br /&gt;
&lt;br /&gt;
Вы можете подумать, что я зря потратил время, так подробно описывая эти небольшие (и не сказывающиеся на функциях программ) баги в интерфейсе. Однако пара этих багов — лишь частные случаи общей проблемы: &lt;b&gt;графический интерфейс программ под линукс непредсказуем&lt;/b&gt;. Взаимодействовать с таким интерфейсом — всё равно что пользоваться отверткой с ручкой, которая впивается в руку, или носить неудобную обувь. Каждый раз, открывая даже стандартный с виду интерфейс, пользователь вынужден задать себе вопрос: &lt;i&gt;что ожидать от него?&lt;/i&gt; Что делает левый клик, а что — правый? У каких объектов есть контекстное меню? Работает ли прокрутка как ожидается? Как программа реагирует на «стандартные» (даже в пределах тулкита) хоткеи? С какими вещами fd.o программа совместима? И так далее. Всё это делает работу с графическими приложениями в линукс несколько неприятной. GUI и так «не подарок», и для многих задач эффективнее использовать интерфейс командной оболочки. Однако есть задачи, которые всё же эффективно можно решить только в GUI. И вот тогда приходится сталкиваться со всеми этими проблемами.&lt;br /&gt;
&lt;br /&gt;
Впрочем я уже далеко отклонился от изначальной темы статьи, и потому пора закругляться. Переходим к выводам:&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Что делать?&lt;/h4&gt;&lt;br /&gt;
Вы можете задаться вполне закономерным вопросом: ну написал автор всё это, и что дальше? Зачем он это писал? Кому это надо?&lt;br /&gt;
&lt;br /&gt;
Лично я извлёк из экскурсии в прошлое «вражеской» системы несколько дельных идей.&lt;br /&gt;
&lt;br /&gt;
Во-первых, &lt;b&gt;панель задач&lt;/b&gt;. Возможность выделить несколько окон при помощи Ctrl+щелчок я занесу в TODO-список для &lt;a href="http://make-linux.blogspot.com/2012/01/lxpanelx.html"&gt;LXPanelX&lt;/a&gt;. Команды для тайлинга также могут быть полезны. Поскольку возможность добавлять в меню окон «внешние» команды запланирована на один из будущих релизов, то тайлинг вполне может выполняться внешней утилитой, а в самой панели достаточно только добавить команды в меню. Так что непосредственно панель задач никаким тайлингом заниматься не будет, но возможность для пользователя сделать такую вещь — будет.&lt;br /&gt;
&lt;br /&gt;
Во-вторых, &lt;b&gt;тулбары из каталогов&lt;/b&gt;. Такой апплет также запланирован для LXPanelX. (Вероятно, можно доработать апплет dirmenu для этого.)&lt;br /&gt;
&lt;br /&gt;
В-третьих, &lt;b&gt;графический фронтэнд для различных поисковых утилит и движков&lt;/b&gt;. Да, мы работаем над этим. :-D Анонс проекта сделаю позже, когда код перейдёт из категории «не тянет даже на препреальфу» в категорию «более-менее работает». Кто из вас бывает на LOR-е, возможно уже видели в одном из моих тредов в ссылку на репозиторий проекта.&lt;br /&gt;
&lt;br /&gt;
Что касается проблемы контекстного меню файлов, то эта задача слишком всеобъемлюща, чтобы быть под силу одному скромному блоггеру. Но мы думаем над этим, так же как и вы, дорогой читатель. И кто-нибудь из нас до чего-нибудь додумается и когда-нибудь напишет код.&lt;br /&gt;
&lt;br /&gt;
На этом всё. Археологическую экспедицию можно считать оконченной.&lt;br /&gt;
&lt;br /&gt;
P.S.&lt;br /&gt;
На прошлой неделе я обещал несколько статей о принципах устройства различных подсистем Linux. Я не забыл об этом, скоро первая будет опубликована.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1408129172220183524-5766825046942212786?l=make-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://make-linux.blogspot.com/feeds/5766825046942212786/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://make-linux.blogspot.com/2012/01/n-windows-98-de.html#comment-form" title="Комментарии: 23" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/5766825046942212786?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/5766825046942212786?v=2" /><link rel="alternate" type="text/html" href="http://make-linux.blogspot.com/2012/01/n-windows-98-de.html" title="N идей из Windows 98, о которых стоило бы знать разработчикам современных DE." /><author><name>geekless</name><uri>http://www.blogger.com/profile/06009713622902465243</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/-CdzHefJdI2I/TigQ4umBRhI/AAAAAAAAAWI/uofyt-6PYA0/s220/51830--919357393.png" /></author><thr:total>23</thr:total></entry><entry gd:etag="W/&quot;DUIERXw-fyp7ImA9WhRbF0o.&quot;"><id>tag:blogger.com,1999:blog-1408129172220183524.post-4068653997488499540</id><published>2012-01-25T11:24:00.000-08:00</published><updated>2012-02-09T00:51:44.257-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-09T00:51:44.257-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Идеи и патчи" /><title>Идеи и патчи</title><content type="html">В этом посте я буду собирать свои идеи по улучшению различного ПО и информацию о статусе этих идей: не реализовано, реализовано, патч принят в апстрим, патч отклонён и т.п.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Просмотрщики изображений + удаление в корзину&lt;/h4&gt;&lt;br /&gt;
Я проверил 3 просмотрщика изображений (gpicview, viewnior, mirage) и обнаружил, что ни один из них не умеет удалять файлы в корзину.&lt;br /&gt;
Фактически, всё верно: незачем помещать в просмотрщик изображений функцию, которая относится к файловому менеджеру. Тем не менее, &lt;b&gt;мимо&lt;/b&gt; корзины (unlink) удалять все они умеют. И раз уж на то пошло, есть замечательная юниксвейная утилита trash-put для помещения файлов в корзину. Осталось добавить юниксвейнойсти самим просмотрщикам.&lt;br /&gt;
&lt;br /&gt;
Итак. Идея: добавить в просмотрщики изображений опцию вызова внешней команды для удаления изображений. Команду задавать в настройках. Либо можно просто использовать функции удаления в корзину из glib (вероятно, для разных просмотрщиков подойдут разные способы).&lt;br /&gt;
&lt;br /&gt;
Статус: патчи отсутствуют, не приступал к реализации.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1408129172220183524-4068653997488499540?l=make-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://make-linux.blogspot.com/feeds/4068653997488499540/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://make-linux.blogspot.com/2012/01/blog-post_25.html#comment-form" title="Комментарии: 3" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/4068653997488499540?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/4068653997488499540?v=2" /><link rel="alternate" type="text/html" href="http://make-linux.blogspot.com/2012/01/blog-post_25.html" title="Идеи и патчи" /><author><name>geekless</name><uri>http://www.blogger.com/profile/06009713622902465243</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/-CdzHefJdI2I/TigQ4umBRhI/AAAAAAAAAWI/uofyt-6PYA0/s220/51830--919357393.png" /></author><thr:total>3</thr:total></entry><entry gd:etag="W/&quot;Ak4ASHozfip7ImA9WhRUFUQ.&quot;"><id>tag:blogger.com,1999:blog-1408129172220183524.post-3908475051053762742</id><published>2012-01-25T09:34:00.000-08:00</published><updated>2012-01-26T09:29:09.486-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-26T09:29:09.486-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="LXPanelX" /><title>LXPanelX</title><content type="html">&lt;b&gt;LXPanelX&lt;/b&gt; — универсальная NETWM-совместимая панель рабочего стола, не привязанная к конкретной графической среде (такой как Gnome или KDE), и написанная с использованием тулкита Gtk. LXPanelX является форком панели LXPanel, входящей в состав проекта &lt;a href=http://lxde.org/&gt;LXDE&lt;/a&gt;. LXPanel, в свою очередь, ведет происхождение от fbpanel.&lt;br /&gt;
&lt;br /&gt;
&lt;img src='http://i015.radikal.ru/1201/52/bf358d3416ca.png'/&gt;&lt;br /&gt;
&lt;br /&gt;
Основные характеристики LXPanelX:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Использование только библиотек, не завязанных на конкретное DE. LXPanelX зависит только от glib и gtk. Прочие зависимости опциональны:  libmenucache (для меню приложений), asound (для регулятора звука).&lt;/li&gt;
&lt;li&gt;Мощная и гибкая в настройке панель задач. Апплет панели задач является приоритетным направлением в разработке LXPanelX. В отличие от некоторых других панелей, таких как xfce-panel, панель задач LXPanelX не использует готовый виджет из библиотеки libwnck, а реализует все соответствующие функции (поддержку NETWM, отображение панели задач, управление окнами) самостоятельно. Это позволяет разработчику легко добавлять новые возможности, не дожидаясь их появления в сторонней библиотеке.&lt;/li&gt;
&lt;li&gt;Возможность настройки без правки конфигурационных файлов текстовым редактором. Все настройки панели и апплетов (за несколькими исключениями, которые описаны в документации) доступны через настроечные диалоги.&lt;/li&gt;
&lt;li&gt;Поддержка режима киоска (блокировка возможности изменения настроек) для использования на публично доступных компьютерах, в школах и т.п.&lt;/li&gt;
&lt;li&gt;Легковесность aka нетребовательность к системным ресурсам. Нельзя сказать, что LXPanelX прямо таки совсем нетребовательна, однако она показывает хорошие результаты по сравнению с панелями из Gnome или KDE.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h4&gt;Релизы&lt;/h4&gt;В настоящее время ни одного стабильного релиза еще не выпущено. Следующий релиз будет иметь версию 0.6 (продолжает нумерацию релизов lxpanel, которая на момент форка имела версию 0.5.x). В настоящее время основные задачи для релиза выполнены, сейчас идёт доработка последних оставшихся задач и чистка багов. Следите за новостями.&lt;br /&gt;
&lt;br /&gt;
Хотя со времени начала работ над проектом прошло более полугода, на сегодняшний день мы всё еще не готовы к релизу. Осознав порочность подхода "ползучего фичуризма", в дальшейшем мы будем следовать принципу release often.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Пакеты&lt;/h4&gt;Пакеты и установочные скрипты для различных дистрибутивов:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Archlinux&lt;/b&gt;&lt;br /&gt;
&lt;a href='http://aur.archlinux.org/packages.php?ID=49680'&gt;lxpanelx-svn в AUR.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Gentoo&lt;/b&gt;&lt;br /&gt;
&lt;a href='https://github.com/megabaks/stuff/'&gt;lxpanelx-9999.ebuild в оверлее Megabaks-а.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Debian&lt;/b&gt;&lt;br /&gt;
Скрипты для сборки deb-пакета находятся в репозитории LXPanelX.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Agilia&lt;/b&gt;&lt;br /&gt;
Пакет lxpanelx входит в официальный репозиторий userland.&lt;br /&gt;
&lt;br /&gt;
Если вам известно о других источниках пакетов LXPanelX, пожалуйста сообщите мне.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Дорожная карта&lt;/h4&gt;&lt;h5&gt;0.6&lt;/h5&gt;Основные задачи, запланированные на данный релиз:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Ключевые идеи к реализации в апплете панели задач: режим "одно окно", группировка по критериям, свободная группировка, сортировка, перетаскивание, настраиваемые привязки действий к кнопкам мыши.&lt;/li&gt;
&lt;li&gt;Разработка апплета Button, имеющего возможность управления им из дочерного процесса.&lt;/li&gt;
&lt;li&gt;Диалоги конфигурации апплетов: поддержка вкладок, поддержка табличного выравнивания виджетов&lt;/li&gt;
&lt;li&gt;Множество других функций и улучшений, которые было бы слишком долго описывать постфактум.&lt;/li&gt;
&lt;/ul&gt;&lt;h5&gt;0.7&lt;/h5&gt;Основные задачи, запланированные на данный релиз:&lt;br /&gt;
Ядро панели:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Реализация единого механизма для посылки апплетам произвольных команд извне.&lt;/li&gt;
&lt;li&gt;Реализация автоскрытия панелей переносом реального окна панели за пределы экрана и использованием второго окна для "хвоста" скрытой панели. Эта реализация избавляет от ряда подводных камней, которые при "честном" скрытии виджета обойти проблематично либо невозможно.&lt;/li&gt;
&lt;li&gt;Реализация показа/скрытия панели по команде.&lt;/li&gt;
&lt;/ul&gt;Апплеты:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Taskbar Plugin: кустомизация меню пользователем.&lt;/li&gt;
&lt;li&gt;Taskbar Plugin: поддержка дополнительных команд, получаемых из конфига или свойств окна.&lt;/li&gt;
&lt;li&gt;Taskbar Plugin: поддержка ICEWM_TRAY&lt;/li&gt;
&lt;/ul&gt;&lt;h5&gt;0.8&lt;/h5&gt;Основные задачи, запланированные на данный релиз:&lt;br /&gt;
Ядро панели:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Разделение кода Taskbar Plugin на model/view и перенос model в ядро.&lt;/li&gt;
&lt;li&gt;Разделение кода Tray Plugin на model/view и перенос model в ядро.&lt;/li&gt;
&lt;/ul&gt;Апплеты:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Tray Plugin: фильтрация иконок. После переноса основной логики в ядро, трей становится простым контейнером. Это даёт возможность размещать несколько апплетов трея и использовать фильтрацию иконок.&lt;/li&gt;
&lt;li&gt;Реализация нового апплета Expander, обеспечивающего скрытие/показ соседних апплетов по клику мыши.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h4&gt;Скриншоты&lt;/h4&gt;[TODO: здесь будут размещены скриншоты]&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Документация&lt;/h4&gt;[TODO: здесь будет размещена документация]&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Ссылки&lt;/h4&gt;&lt;a href='http://code.google.com/p/lxpanelx/'&gt;Репозиторий проекта на Google Code.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1408129172220183524-3908475051053762742?l=make-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://make-linux.blogspot.com/feeds/3908475051053762742/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://make-linux.blogspot.com/2012/01/lxpanelx.html#comment-form" title="Комментарии: 12" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/3908475051053762742?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/3908475051053762742?v=2" /><link rel="alternate" type="text/html" href="http://make-linux.blogspot.com/2012/01/lxpanelx.html" title="LXPanelX" /><author><name>geekless</name><uri>http://www.blogger.com/profile/06009713622902465243</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/-CdzHefJdI2I/TigQ4umBRhI/AAAAAAAAAWI/uofyt-6PYA0/s220/51830--919357393.png" /></author><thr:total>12</thr:total></entry><entry gd:etag="W/&quot;DUENSXg-eSp7ImA9WhRbF0o.&quot;"><id>tag:blogger.com,1999:blog-1408129172220183524.post-2910140620356080075</id><published>2012-01-14T22:58:00.000-08:00</published><updated>2012-02-09T00:54:58.651-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-09T00:54:58.651-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Заметки" /><title>Анонс грядущих изменений на сайте</title><content type="html">&lt;p&gt;Здравствуйте, дорогие читатели. Что-то подзабросил я блог, но вот решил вернуться.&lt;/p&gt;

&lt;p&gt;Вместо обычного блога, имеющего формат вот-общая-куча-статей-а-для-навигации-используйте-ярлыки, теперь здесь будет несколько более упорядоченный сайт. Я буду публиковать здесь:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Статьи, посвященные какой-либо теме и претендующие на оной темы достаточно полное освещение.&lt;/li&gt;
&lt;li&gt;Краткие заметки по настройке различного ПО, решению проблем, неочевидным возможностям и т.п.&lt;/li&gt;
&lt;li&gt;Ссылки на разные интересности.&lt;/li&gt;
&lt;li&gt;Информацию о своих СПО проектах: анонсы, планы на будущее, документацию.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Соответственно, все существующие посты блога сейчас я разделил на 3 категории: статьи, советы и ъ-ссылки. (За исключеним постов, посвященных lxpanelx, и еще нескольких заметок, которые не понятно, как классифицировать). Что касается проектов, то таковых сейчас у меня три: lxpanelx и два других, которые я анонсирую в скором времени. Т.к. навигация посредством ярлыков для проектов неудобна, для каждого будет создана отдельная страница-оглавление и страницы-подразделы.&lt;/p&gt;

&lt;p&gt;Для повышения удобства, я добавил на блог оглавление — &lt;a href="http://make-linux.blogspot.com/p/blog-page.html"&gt;карту сайта&lt;/a&gt;. Карта генерируется при помощи JavaScript на основе ATOM-ленты блога. Если вы на странице карты ничего не видите, пишите мне об этом — буду чинить баги.&lt;/p&gt;

&lt;p&gt;В обозримом будущем я планирую дописать и опубликовать несколько статей, посвященных устройству различных подсистем GNU/Linux. Я давно собирался заняться написанием этих материалов, но всё откладывал. Однако в последнее время я всё больше убеждаюсь, что идеологически GNU/Linux для современного пользователя представляет собой этакий «бесплатный Windows». Я имею ввиду не архитектуру, баги или методы работы с системой, а то восприятие операционной системы и её компонент, которое находится в голове пользователя. Отдельные подсистемы (да и вся система в целом) стали черными ящиками, в которые никто не заглядывает, и никто уже не помнит, что там внутри. Настройка системы и решение проблем производится магическим путём: «примени вот это заклинание с форума, а если не поможет, то поищи более мощное». Такое положение вещей меня в определенной мере печалит и сподвигло взяться за перо^Wклавиатуру. Не претендуя на попытки переделать людей, я рассчитываю лишь, что публикация моих материалов окажется полезной тем, кто желает понять, «как оно устроено на самом деле».&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1408129172220183524-2910140620356080075?l=make-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://make-linux.blogspot.com/feeds/2910140620356080075/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://make-linux.blogspot.com/2012/01/blog-post.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/2910140620356080075?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/2910140620356080075?v=2" /><link rel="alternate" type="text/html" href="http://make-linux.blogspot.com/2012/01/blog-post.html" title="Анонс грядущих изменений на сайте" /><author><name>geekless</name><uri>http://www.blogger.com/profile/06009713622902465243</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/-CdzHefJdI2I/TigQ4umBRhI/AAAAAAAAAWI/uofyt-6PYA0/s220/51830--919357393.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUQESXc8eip7ImA9WhRVFk0.&quot;"><id>tag:blogger.com,1999:blog-1408129172220183524.post-1055999420683197103</id><published>2011-09-10T03:19:00.000-07:00</published><updated>2012-01-14T22:01:48.972-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-14T22:01:48.972-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Советы" /><category scheme="http://www.blogger.com/atom/ns#" term="xneur" /><category scheme="http://www.blogger.com/atom/ns#" term="работа в консоли" /><category scheme="http://www.blogger.com/atom/ns#" term="настройка" /><category scheme="http://www.blogger.com/atom/ns#" term="xterm" /><title>Как заставить xterm работать с xneur. Опция allowSendEvents.</title><content type="html">&lt;a href="http://make-linux.blogspot.com/2011/02/xterm-xneur.html"&gt;Как я упоминал ранее&lt;/a&gt;, при запущенном &lt;code&gt;xneur&lt;/code&gt;, &lt;code&gt;xterm&lt;/code&gt; совершенно не реагирует на ввод. Из-за этого приходилось добавлять его в список исключений. Но, как оказалось, &lt;code&gt;xterm&lt;/code&gt; можно легко починить. Для этого необходимо включить в нём опцию &lt;code&gt;allowSendEvents&lt;/code&gt;.&lt;br /&gt;
&lt;br /&gt;
В уже запущенном xneur это можно сделать так: зажав &lt;code&gt;Ctrl&lt;/code&gt; и нажав левую кнопку мыши, вызвать меню настроек и выбрать там пункт &lt;i&gt;Allow SendEvents&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Чтобы &lt;code&gt;xterm&lt;/code&gt; всегда запускался с данной опцией, нужно добавить её в файл ресурсов &lt;code&gt;~/.Xresources&lt;/code&gt;:&lt;br /&gt;
&lt;blockquote class='code'&gt;XTerm*VT100.allowSendEvents: true&lt;/blockquote&gt;(Файл ресурсов считывается только при логине в графический сеанс. Чтобы обновить ресурсы без релогина, выполните команду &lt;code&gt;xrdb ~/.Xresources&lt;/code&gt;)&lt;br /&gt;
&lt;br /&gt;
Недостатком использования от этой опции является то, что в xterm «по соображениям безопасности» принудительно отключится множество полезных управляющих последовательностей для терминала. В частности, невозможно станет из запущенной в терминале программы поменять заголовок окна.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1408129172220183524-1055999420683197103?l=make-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://make-linux.blogspot.com/feeds/1055999420683197103/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://make-linux.blogspot.com/2011/09/xterm-xneur-allowsendevents.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/1055999420683197103?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/1055999420683197103?v=2" /><link rel="alternate" type="text/html" href="http://make-linux.blogspot.com/2011/09/xterm-xneur-allowsendevents.html" title="Как заставить xterm работать с xneur. Опция allowSendEvents." /><author><name>geekless</name><uri>http://www.blogger.com/profile/06009713622902465243</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/-CdzHefJdI2I/TigQ4umBRhI/AAAAAAAAAWI/uofyt-6PYA0/s220/51830--919357393.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CUIHQH49fCp7ImA9WhdWFE0.&quot;"><id>tag:blogger.com,1999:blog-1408129172220183524.post-1897417286942030449</id><published>2011-09-07T06:52:00.000-07:00</published><updated>2011-09-07T06:52:11.064-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-07T06:52:11.064-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="bash" /><category scheme="http://www.blogger.com/atom/ns#" term="хоткеи" /><category scheme="http://www.blogger.com/atom/ns#" term="скриптинг" /><title>exec_first_of — скрипт для запуска первой найденной программы из списка</title><content type="html">Если вы используете один домашний каталог для работы на нескольких компьютерах и/или операционых системах, то довольно часто возникает потребность в различных системах использовать разный набор «умолчательных» программ. Например, при работе на машине A в качестве текстового редактора вы предпочитаете emacs, а при работе на машине B используете gedit, т.к. emacs там вовсе не установлен. Аналогично для эмуляторов терминала, браузеров, файловых менеджеров, просмотрщиков графики и т.п. Команды запуска этих программ могут фигурировать в самых различных конфигах и настройках. Как добиться того, чтобы без правки всех этих конфигов на разных операционных системах и компьютерах всегда выбиралась нужная программа?&lt;br /&gt;
&lt;br /&gt;
В первую очередь, на ум приходят два очевидных решения данной проблемы: использовать переменные окружения или же использовать скрипты-обёртки, запускающие нужную программу. В случае с переменными окружения, мы столкнёмся с тем, что отнюдь не всегда их использование удобно или даже вообще возможно. В случае со скриптами-обёртками, придётся писать по отдельному скрипту на каждый набор команд, при чем, скрипты будут по большей части идентичны. Поэтому логичным шагом выглядит создание универсального скрипта-обёртки, который будет пригоден для любых наборов команды.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class='code'&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#696969; '&gt;#!/bin/bash&lt;/span&gt;

COMMAND&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;$1&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;
&lt;span style='color:#bb7977; font-weight:bold; '&gt;shift&lt;/span&gt;

&lt;span style='color:#800000; font-weight:bold; '&gt;if&lt;/span&gt; &lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;[ "$COMMAND" = "&lt;/span&gt;&lt;span style='color:#808030; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; '&gt;-&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;help" || "$COMMAND" = "&lt;/span&gt;&lt;span style='color:#808030; '&gt;-&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;h" &lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;] &lt;span style='color:#800080; '&gt;;&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;then&lt;/span&gt;
    &lt;span style='color:#bb7977; font-weight:bold; '&gt;echo&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;"exec_first_of searches first existing command in the PATH and runs it with the specified arguments."&lt;/span&gt;
    &lt;span style='color:#bb7977; font-weight:bold; '&gt;echo&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;"Usage:"&lt;/span&gt;
    &lt;span style='color:#bb7977; font-weight:bold; '&gt;echo&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;"       exec_first_of [options] commandlist [args...]"&lt;/span&gt;
    &lt;span style='color:#bb7977; font-weight:bold; '&gt;echo&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;"       or"&lt;/span&gt;
    &lt;span style='color:#bb7977; font-weight:bold; '&gt;echo&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;"       exec_first_of [options] -e varname [args...]"&lt;/span&gt;
    &lt;span style='color:#bb7977; font-weight:bold; '&gt;echo&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;"where"&lt;/span&gt;
    &lt;span style='color:#bb7977; font-weight:bold; '&gt;echo&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;"  commandlist    comma sepatared list of the commands"&lt;/span&gt;
    &lt;span style='color:#bb7977; font-weight:bold; '&gt;echo&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;"  varname        name of the environment variable containing command list"&lt;/span&gt;
    &lt;span style='color:#bb7977; font-weight:bold; '&gt;echo&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;"  args           arguments passed to the selected command"&lt;/span&gt;
    &lt;span style='color:#bb7977; font-weight:bold; '&gt;echo&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;"options"&lt;/span&gt;
    &lt;span style='color:#bb7977; font-weight:bold; '&gt;echo&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;"  -p             just print selected command, do not run"&lt;/span&gt;
    &lt;span style='color:#bb7977; font-weight:bold; '&gt;exit&lt;/span&gt; &lt;span style='color:#008c00; '&gt;0&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;
&lt;span style='color:#800000; font-weight:bold; '&gt;fi&lt;/span&gt;

PRINT&lt;span style='color:#808030; '&gt;=&lt;/span&gt;
&lt;span style='color:#800000; font-weight:bold; '&gt;if&lt;/span&gt; &lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;[ "$COMMAND" = "&lt;/span&gt;&lt;span style='color:#808030; '&gt;-&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;p" || "$COMMAND" = "&lt;/span&gt;&lt;span style='color:#808030; '&gt;-&lt;/span&gt;&lt;span style='color:#808030; '&gt;-&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;print" &lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;] &lt;span style='color:#800080; '&gt;;&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;then&lt;/span&gt;
    PRINT&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#008c00; '&gt;1&lt;/span&gt;
    COMMAND&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;$1&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;
    &lt;span style='color:#bb7977; font-weight:bold; '&gt;shift&lt;/span&gt;
&lt;span style='color:#800000; font-weight:bold; '&gt;fi&lt;/span&gt;

&lt;span style='color:#800000; font-weight:bold; '&gt;if&lt;/span&gt; &lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;[ "$COMMAND" = "&lt;/span&gt;&lt;span style='color:#808030; '&gt;-&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;e" &lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;] &lt;span style='color:#800080; '&gt;;&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;then&lt;/span&gt;
    e&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;'echo ${'&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;$1&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;'}'&lt;/span&gt;
    COMMAND&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;`&lt;/span&gt;&lt;span style='color:#bb7977; background:#ffffe8; font-weight:bold; '&gt;eval&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;$e&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;`&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;
    &lt;span style='color:#bb7977; font-weight:bold; '&gt;shift&lt;/span&gt;
&lt;span style='color:#800000; font-weight:bold; '&gt;fi&lt;/span&gt;

IFS&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;':'&lt;/span&gt; &lt;span style='color:#bb7977; font-weight:bold; '&gt;read&lt;/span&gt; &lt;span style='color:#44aadd; '&gt;-a&lt;/span&gt; COMMANDS &lt;span style='color:#e34adc; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#e34adc; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#e34adc; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;$COMMAND&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;

&lt;span style='color:#800000; font-weight:bold; '&gt;for&lt;/span&gt; c &lt;span style='color:#800000; font-weight:bold; '&gt;in&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;"${COMMANDS[@]}"&lt;/span&gt; &lt;span style='color:#800080; '&gt;;&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;do&lt;/span&gt;
    &lt;span style='color:#bb7977; font-weight:bold; '&gt;read&lt;/span&gt; &lt;span style='color:#44aadd; '&gt;-a&lt;/span&gt; c &lt;span style='color:#e34adc; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#e34adc; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#e34adc; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;$c&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;
    &lt;span style='color:#800000; font-weight:bold; '&gt;if&lt;/span&gt; which &lt;span style='color:#0000e6; '&gt;"${c[0]}"&lt;/span&gt; &amp;amp;&lt;span style='color:#e34adc; '&gt;&gt;&lt;/span&gt; &lt;span style='color:#40015a; '&gt;/dev/null&lt;/span&gt; &lt;span style='color:#800080; '&gt;;&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;then&lt;/span&gt;
        &lt;span style='color:#800000; font-weight:bold; '&gt;if&lt;/span&gt; &lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;[ &lt;/span&gt;&lt;span style='color:#808030; '&gt;-&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;z "$PRINT" &lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;] &lt;span style='color:#800080; '&gt;;&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;then&lt;/span&gt;
            &lt;span style='color:#bb7977; font-weight:bold; '&gt;exec&lt;/span&gt; &lt;span style='color:#44aadd; '&gt;-a&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;"${c[0]}"&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;"${c[@]}"&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;"$@"&lt;/span&gt;
        &lt;span style='color:#800000; font-weight:bold; '&gt;else&lt;/span&gt;
            c&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#800080; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"${c[@]}"&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;"$@"&lt;/span&gt;&lt;span style='color:#800080; '&gt;)&lt;/span&gt;
            &lt;span style='color:#800000; font-weight:bold; '&gt;for&lt;/span&gt; p &lt;span style='color:#800000; font-weight:bold; '&gt;in&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;"${c[@]}"&lt;/span&gt; &lt;span style='color:#800080; '&gt;;&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;do&lt;/span&gt;
                &lt;span style='color:#bb7977; font-weight:bold; '&gt;printf&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;'%q '&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;$p&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;
            &lt;span style='color:#800000; font-weight:bold; '&gt;done&lt;/span&gt;
            &lt;span style='color:#bb7977; font-weight:bold; '&gt;printf&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;'\n'&lt;/span&gt;
            &lt;span style='color:#bb7977; font-weight:bold; '&gt;exit&lt;/span&gt; &lt;span style='color:#008c00; '&gt;0&lt;/span&gt;
        &lt;span style='color:#800000; font-weight:bold; '&gt;fi&lt;/span&gt;
    &lt;span style='color:#800000; font-weight:bold; '&gt;fi&lt;/span&gt;
&lt;span style='color:#800000; font-weight:bold; '&gt;done&lt;/span&gt;

&lt;span style='color:#bb7977; font-weight:bold; '&gt;echo&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;$0&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;: no command found: ${COMMANDS[@]}"&lt;/span&gt; &lt;span style='color:#e34adc; '&gt;&gt;&lt;/span&gt; &lt;span style='color:#40015a; '&gt;/dev/stderr&lt;/span&gt;
&lt;span style='color:#bb7977; font-weight:bold; '&gt;exit&lt;/span&gt; &lt;span style='color:#008c00; '&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;
Скрипт выбирает из списка первую имеющуюся в системе команду и запускает её с указанными параметрами.&lt;br /&gt;
&lt;br /&gt;
Первым аргументом скрипту указывается разделенный двоеточием список команд, среди которых будет осуществляться поиск:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class='code'&gt;exec_first_of medit:gedit # запускает medit, либо gedit&lt;br /&gt;
exec_first_of medit:gedit ~/somefile.txt # открывает в редакторе указанный файл&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
В списке команд можно указывать дополнительные аргументы запуска. Следующая команда выполнит &lt;code&gt;lxterminal --geometry=150x55 -e mc&lt;/code&gt;, если в системе установлен &lt;code&gt;lxterminal&lt;/code&gt;, либо &lt;code&gt;xterm -fullscreen mc&lt;/code&gt;, если установлен &lt;code&gt;xterm&lt;/code&gt;:&lt;br /&gt;
&lt;blockquote class='code'&gt;exec_first_of 'lxterminal --geometry=150x55 -e:xterm -fullscreen' mc&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
Если задана опция &lt;code&gt;-e&lt;/code&gt;, &lt;code&gt;exec_first_of&lt;/code&gt; будет читать список команд из указанной переменной окружения:&lt;br /&gt;
&lt;blockquote class='code'&gt;export GUI_TERMINAL='lxterminal --geometry=150x55 -e:xterm -fullscreen'&lt;br /&gt;
export GUI_EDITORS='adie:medit:gedit'&lt;br /&gt;
&lt;br /&gt;
exec_first_of -e GUI_EDITORS ~/somefile.txt&lt;br /&gt;
exec_first_of -e GUI_TERMINAL mc&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
Помещаем файл со скриптом в один из каталогов, перечисленных в &lt;code&gt;PATH&lt;/code&gt; (я использую &lt;code&gt;~/bin/&lt;/code&gt; для самописных вспомогательных скриптов), назначаем ему права на исполнение. В &lt;code&gt;~/.profile&lt;/code&gt; вписываем переменные окружения с нужными нам списками команд. Например:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class='code'&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#bb7977; font-weight:bold; '&gt;export&lt;/span&gt; GUI_TERMINALS&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;'lxterminal -e:terminal:gnome-terminal:terminator:urxvt:xterm -fullscreen'&lt;/span&gt;
&lt;span style='color:#bb7977; font-weight:bold; '&gt;export&lt;/span&gt; GUI_EDITORS&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;'medit:adie:gedit:kate:scite'&lt;/span&gt;
&lt;span style='color:#bb7977; font-weight:bold; '&gt;export&lt;/span&gt; GUI_FILEMANAGERS&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;'pcmanfm:thunar:PathFinder:nautilus:worker'&lt;/span&gt;
&lt;span style='color:#bb7977; font-weight:bold; '&gt;export&lt;/span&gt; GUI_CALCULATORS&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;'galculator:calculator'&lt;/span&gt;
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;
Теперь везде, где требуется в конфиге указать, допустим, имя редактора, можно вместо имени конкретной программы указывать команду &lt;code&gt;exec_first_of -e GUI_EDITORS&lt;/code&gt;, и она будет запускать первый доступный редактор из списка.&lt;br /&gt;
&lt;br /&gt;
Например, в конфиге для xbindkeys:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class='code'&gt;&lt;pre&gt;"exec_first_of -e GUI_TERMINALS"
  Mod4 + q

"exec_first_of -e GUI_EDITORS"
  Mod4 + w

"exec_first_of -e GUI_FILEMANAGERS"
  Mod4 + e

"exec_first_of -e GUI_CALCULATORS"
  Mod4 + y
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;
Также в &lt;code&gt;~/.bashrc&lt;/code&gt; можно назначить алиасы для оболочки:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class='code'&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#bb7977; font-weight:bold; '&gt;alias&lt;/span&gt; _fm&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;'exec_first_of -e GUI_FILEMANAGERS'&lt;/span&gt;
&lt;span style='color:#bb7977; font-weight:bold; '&gt;alias&lt;/span&gt; _ed&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;'exec_first_of -e GUI_EDITORS'&lt;/span&gt;
&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1408129172220183524-1897417286942030449?l=make-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://make-linux.blogspot.com/feeds/1897417286942030449/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://make-linux.blogspot.com/2011/09/execfirstof.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/1897417286942030449?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/1897417286942030449?v=2" /><link rel="alternate" type="text/html" href="http://make-linux.blogspot.com/2011/09/execfirstof.html" title="exec_first_of — скрипт для запуска первой найденной программы из списка" /><author><name>geekless</name><uri>http://www.blogger.com/profile/06009713622902465243</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/-CdzHefJdI2I/TigQ4umBRhI/AAAAAAAAAWI/uofyt-6PYA0/s220/51830--919357393.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUENSXg-eyp7ImA9WhRbF0o.&quot;"><id>tag:blogger.com,1999:blog-1408129172220183524.post-8034851493191243702</id><published>2011-07-22T13:30:00.000-07:00</published><updated>2012-02-09T00:54:58.653-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-09T00:54:58.653-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="firefox" /><category scheme="http://www.blogger.com/atom/ns#" term="Заметки" /><title>Открытие URL в определённом профиле firefox</title><content type="html">Профили в Firefox — хорошая штука, но некоторые недоработки, связанные с ними, сильно мешают использовать их на полную катушку, а порой, откровенно бесят.&lt;br /&gt;
&lt;br /&gt;
Например, опция командной строки &lt;code&gt;-p&lt;/code&gt; используется, чтобы указать, какой профиль следует открыть — но работает эта опция только если ни одна копия Firefox еще не запущена. Если Firefox уже запущен, то эта опция игнорируется, и вместо открытия нового профиля, будет открыта вкладка в ужезапущенной копии. В итоге самое очевидное использование этой опции — открытие внешних ссылок в указанном профиле — оказывается неработоспособным.&lt;br /&gt;
&lt;br /&gt;
Из-за невозможности запустить обычным способом параллельно два профиля, широко применяется опция &lt;code&gt;-no-remote&lt;/code&gt;, которая заставляет Firefox не искать уже запущенные копии, а принудительно открывать указанный профиль. Отлично, запустить несколько профилей теперь удастся. Однако, эта опция бесполезна, если вы хотите открыть ссылку в уже запущенном профиле — т.к. запустить две копии программы с одним профилем невозможно.&lt;br /&gt;
&lt;br /&gt;
Наконец, есть опция &lt;code&gt;-remote&lt;/code&gt;, которая позволяет передать команду в уже запущенную копии приложения. Если вы используете вместе с ней опцию &lt;code&gt;-p&lt;/code&gt; для указания профиля, то Firefox будет искать не первую попавшуюся запущенную копию, а копию, запущенную с заданным профилем. Казалось бы — вон оно, решение. Но и тут облом — если запущенный в этом режиме Firefox &lt;b&gt;не находит ранее запущенной копии, он просто завершает работу&lt;/b&gt;. Так что и эта опция не поможет нормально работать с профилями.&lt;br /&gt;
&lt;br /&gt;
Не знаю, как вам, а мне кажется, что всё это — редкостный идиотизм. Перерыв гугл на предмет "как запустить несколько профилей firefox", "firefox открыть ссылку в указанном профиле" и кучи других вариаций этого запроса на русском и английском, я нашел только множество обсуждений на форумах и ни одного ответа по существу. Реально куча народу каждый день наступает на эти грабли, и никто не может им помочь. В конечном итоге, мне это надоело, и я полез в исходники.&lt;br /&gt;
&lt;br /&gt;
В общем, не буду долго тянуть кота за хвост: решение оказалось тривиальным. Настолько тривиальным, что я не понимаю, почему эту проблему не решили уже давно сами разработчики или кто-нибудь из пользователей не прислал патч. Firefox отлично умеет искать свои запущенные экземпляры, в том числе, и фильтруя их по нужному профилю, и умеет пересылать команды другому экземпляру. Весь код уже написан и работает. Давно написан. Прекрасно работает. Отсутствует же в нем самое тривиальное — при вызове программы как &lt;code&gt;firefox -p profilename&lt;/code&gt; имя профиля не подставляется в параметры поиска запущенной копии.&lt;br /&gt;
Пять строчек кода. Пять чертовых строчек кода в файле toolkit/xre/nsAppRunner.cpp — именно столько надо дописать, чтобы исправить один из самых нелепых факапов в юзабилити файрфокса.&lt;br /&gt;
&lt;br /&gt;
Вот этот элементарнейший патч:&lt;br /&gt;
&lt;blockquote class="code"&gt;&lt;pre style="background: #ffffff; color: black;"&gt;&lt;span style="color: #004a43;"&gt;diff -r 89b5fccb0514 toolkit/xre/nsAppRunner.cpp&lt;/span&gt;
&lt;span style="color: #007997;"&gt;--- a/toolkit/xre/nsAppRunner.cpp    Thu Jul 14 12:20:34 2011 -0400&lt;/span&gt;
&lt;span style="color: #007997;"&gt;+++ b/toolkit/xre/nsAppRunner.cpp    Sat Jul 23 03:14:32 2011 +0700&lt;/span&gt;
&lt;span style="color: #e34adc;"&gt;@@ -461,6 +461,8 @@&lt;/span&gt;
       if (strimatch(aArg, arg)) {
         if (aRemArg)
           RemoveArg(curarg);
&lt;span style="color: #0000e6;"&gt;+        else&lt;/span&gt;
&lt;span style="color: #0000e6;"&gt;+          ++curarg;&lt;/span&gt;
         if (!aParam) {
           ar = ARG_FOUND;
           break;
&lt;span style="color: #e34adc;"&gt;@@ -1408,10 +1410,17 @@&lt;/span&gt;
   nsresult rv;
   ArgResult ar;
 
&lt;span style="color: #0000e6;"&gt;+  const char *profile = 0;&lt;/span&gt;
   nsCAutoString program(gAppData-&amp;gt;name);
   ToLowerCase(program);
   const char *username = getenv("LOGNAME");
 
&lt;span style="color: #0000e6;"&gt;+  ar = CheckArg("p", PR_FALSE, &amp;amp;profile, PR_FALSE);&lt;/span&gt;
&lt;span style="color: #0000e6;"&gt;+  if (ar == ARG_BAD) {&lt;/span&gt;
&lt;span style="color: #0000e6;"&gt;+    PR_fprintf(PR_STDERR, "Error: argument -p requires a profile name\n");&lt;/span&gt;
&lt;span style="color: #0000e6;"&gt;+    return REMOTE_ARG_BAD;&lt;/span&gt;
&lt;span style="color: #0000e6;"&gt;+  }&lt;/span&gt;
&lt;span style="color: #0000e6;"&gt;+&lt;/span&gt;
   const char *temp = nsnull;
   ar = CheckArg("a", PR_TRUE, &amp;amp;temp);
   if (ar == ARG_BAD) {
&lt;span style="color: #e34adc;"&gt;@@ -1434,7 +1443,7 @@&lt;/span&gt;
  
   nsXPIDLCString response;
   PRBool success = PR_FALSE;
&lt;span style="color: #0f69ff;"&gt;-  rv = client.SendCommandLine(program.get(), username, nsnull,&lt;/span&gt;
&lt;span style="color: #0000e6;"&gt;+  rv = client.SendCommandLine(program.get(), username, profile,&lt;/span&gt;
                               gArgc, gArgv, aDesktopStartupID,
                               getter_Copies(response), &amp;amp;success);
   // did the command fail?
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;
Если кому-нибудь это нужно, оформите в апстриме багрепорт с этим патчем. Просто у меня сейчас реально нет времени писать туда.&lt;br /&gt;
&lt;br /&gt;
Картинко пропатченного файрфокса:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-d5XeyTMkDw0/TindlFpwHmI/AAAAAAAAAWk/dj8hFA3y-Cs/s1600/2011-07-23-034317_1280x1024_scrot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-d5XeyTMkDw0/TindlFpwHmI/AAAAAAAAAWk/dj8hFA3y-Cs/s400/2011-07-23-034317_1280x1024_scrot.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
На скриншоте видно, как командами вида &lt;code&gt;firefox -p porfilename&lt;/code&gt; запущены 2 профиля. Команды вида &lt;code&gt;firefox -p porfilename http://somesite&lt;/code&gt; открывают ссылку http://somesite в уже запущенном профиле, и не путают профили между собой.&lt;br /&gt;
&lt;br /&gt;
Очередная победа здравого смысла над разработчиками FF.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1408129172220183524-8034851493191243702?l=make-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://make-linux.blogspot.com/feeds/8034851493191243702/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://make-linux.blogspot.com/2011/07/url-firefox.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/8034851493191243702?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/8034851493191243702?v=2" /><link rel="alternate" type="text/html" href="http://make-linux.blogspot.com/2011/07/url-firefox.html" title="Открытие URL в определённом профиле firefox" /><author><name>geekless</name><uri>http://www.blogger.com/profile/06009713622902465243</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/-CdzHefJdI2I/TigQ4umBRhI/AAAAAAAAAWI/uofyt-6PYA0/s220/51830--919357393.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-d5XeyTMkDw0/TindlFpwHmI/AAAAAAAAAWk/dj8hFA3y-Cs/s72-c/2011-07-23-034317_1280x1024_scrot.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C0EDQHk_fSp7ImA9WhRUFUw.&quot;"><id>tag:blogger.com,1999:blog-1408129172220183524.post-8080951248709038076</id><published>2011-07-15T13:48:00.000-07:00</published><updated>2012-01-25T09:14:31.745-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-25T09:14:31.745-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="archlinux" /><category scheme="http://www.blogger.com/atom/ns#" term="globalmenu" /><category scheme="http://www.blogger.com/atom/ns#" term="LXPanelX" /><category scheme="http://www.blogger.com/atom/ns#" term="lxpanel" /><title>PKGBUILD для lxpanel globalmenu plugin</title><content type="html">Продолжаем танцы с бубнами. Сделал &lt;b&gt;PKGBUILD&lt;/b&gt;-ы для библиотеки &lt;code&gt;globalmenu&lt;/code&gt; (без лишних зависимостей от &lt;b&gt;Gnome&lt;/b&gt;) и для плагина &lt;b&gt;GlobalMenu&lt;/b&gt; для &lt;b&gt;LXPanel&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;PKGBUILD&lt;/b&gt; для библиотеки:
&lt;br /&gt;
&lt;blockquote class="code"&gt;
&lt;pre style="background: #ffffff; color: black;"&gt;pkgname&lt;span style="color: #808030;"&gt;=&lt;/span&gt;globalmenu-core
_pkgname&lt;span style="color: #808030;"&gt;=&lt;/span&gt;gnome-globalmenu
pkgver&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: #008c00;"&gt;0&lt;/span&gt;&lt;span style="color: maroon; font-weight: bold;"&gt;.&lt;/span&gt;&lt;span style="color: #008c00;"&gt;7&lt;/span&gt;&lt;span style="color: maroon; font-weight: bold;"&gt;.&lt;/span&gt;&lt;span style="color: #008c00;"&gt;10&lt;/span&gt;
pkgrel&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: #008c00;"&gt;1&lt;/span&gt;
pkgdesc&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;"GlobalMenu GTK plugin and server module"&lt;/span&gt;
url&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;"http:&lt;/span&gt;&lt;span style="color: #40015a;"&gt;/&lt;/span&gt;&lt;span style="color: #40015a;"&gt;/code&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;.google.&lt;/span&gt;&lt;span style="color: #40015a;"&gt;com/p/gnome2&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;-globalmenu&lt;/span&gt;&lt;span style="color: #40015a;"&gt;/&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;"&lt;/span&gt;
arch&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: purple;"&gt;(&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;'i686'&lt;/span&gt; &lt;span style="color: #0000e6;"&gt;'x86_64'&lt;/span&gt;&lt;span style="color: purple;"&gt;)&lt;/span&gt;
license&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: purple;"&gt;(&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;'GPL2'&lt;/span&gt; &lt;span style="color: #0000e6;"&gt;'GPL3'&lt;/span&gt;&lt;span style="color: purple;"&gt;)&lt;/span&gt;
depends&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: purple;"&gt;(&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;'gtk2'&lt;/span&gt;&lt;span style="color: purple;"&gt;)&lt;/span&gt;
makedepends&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: purple;"&gt;(&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;'vala&amp;gt;=0.6'&lt;/span&gt; &lt;span style="color: #0000e6;"&gt;'libtool'&lt;/span&gt; &lt;span style="color: #0000e6;"&gt;'pkgconfig'&lt;/span&gt; &lt;span style="color: #0000e6;"&gt;'intltool'&lt;/span&gt; &lt;span style="color: purple;"&gt;)&lt;/span&gt;
optdepends&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: purple;"&gt;(&lt;/span&gt;&lt;span style="color: purple;"&gt;)&lt;/span&gt;
options&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: purple;"&gt;(&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;'!libtool'&lt;/span&gt;&lt;span style="color: purple;"&gt;)&lt;/span&gt;
conflicts&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: purple;"&gt;(&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;'gtk2-aqd'&lt;/span&gt; &lt;span style="color: #0000e6;"&gt;'gtk2-globalmenu'&lt;/span&gt; &lt;span style="color: #0000e6;"&gt;'gnome-globalmenu-svn'&lt;/span&gt; &lt;span style="color: #0000e6;"&gt;'gnome-globalmenu'&lt;/span&gt;&lt;span style="color: purple;"&gt;)&lt;/span&gt;
source&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: purple;"&gt;(&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;"http:&lt;/span&gt;&lt;span style="color: #40015a;"&gt;/&lt;/span&gt;&lt;span style="color: #40015a;"&gt;/gnome2&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;-globalmenu.googlecode.&lt;/span&gt;&lt;span style="color: #40015a;"&gt;com/files&lt;/span&gt;&lt;span style="color: #40015a;"&gt;/&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;${_pkgname}&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;-&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;${pkgver}&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;.tar.bz2"&lt;/span&gt;&lt;span style="color: purple;"&gt;)&lt;/span&gt;
md5sums&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: purple;"&gt;(&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;'62d0ec181c7d7821f753591626b64d2f'&lt;/span&gt;&lt;span style="color: purple;"&gt;)&lt;/span&gt;

build&lt;span style="color: #808030;"&gt;()&lt;/span&gt; &lt;span style="color: purple;"&gt;{&lt;/span&gt;
    &lt;span style="color: #bb7977; font-weight: bold;"&gt;cd&lt;/span&gt; ${srcdir}&lt;span style="color: #40015a;"&gt;/&lt;/span&gt;${_pkgname}-${pkgver}
    &lt;span style="color: #bb7977; font-weight: bold;"&gt;export&lt;/span&gt; LDFLAGS&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;""&lt;/span&gt;
    &lt;span style="color: #bb7977; font-weight: bold;"&gt;export&lt;/span&gt; GMENU_CFLAGS&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;" "&lt;/span&gt;
    &lt;span style="color: #bb7977; font-weight: bold;"&gt;export&lt;/span&gt; GMENU_LIBS&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;" "&lt;/span&gt;
    &lt;span style="color: maroon; font-weight: bold;"&gt;.&lt;/span&gt;&lt;span style="color: #40015a;"&gt;/configure&lt;/span&gt; --prefix&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: #40015a;"&gt;/usr&lt;/span&gt; --disable-tests --without-gnome-panel --without-xfce4-panel --disable-schemas-install &lt;span style="color: #0f69ff;"&gt;\&lt;/span&gt;
       --sysconfdir&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: #40015a;"&gt;/etc&lt;/span&gt; --libexecdir&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: #40015a;"&gt;/usr/lib&lt;/span&gt;
    make &lt;span style="color: purple;"&gt;||&lt;/span&gt; &lt;span style="color: #bb7977; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #008c00;"&gt;1&lt;/span&gt;
&lt;span style="color: purple;"&gt;}&lt;/span&gt;

package&lt;span style="color: #808030;"&gt;()&lt;/span&gt;&lt;span style="color: purple;"&gt;{&lt;/span&gt;
    &lt;span style="color: #bb7977; font-weight: bold;"&gt;cd&lt;/span&gt; ${srcdir}&lt;span style="color: #40015a;"&gt;/&lt;/span&gt;${_pkgname}-${pkgver}
    make DESTDIR&lt;span style="color: #808030;"&gt;=&lt;/span&gt;${pkgdir} GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: #008c00;"&gt;1&lt;/span&gt; install &lt;span style="color: purple;"&gt;||&lt;/span&gt; &lt;span style="color: #bb7977; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #008c00;"&gt;1&lt;/span&gt;
    &lt;span style="color: #bb7977; font-weight: bold;"&gt;sed&lt;/span&gt; -i ${pkgdir}&lt;span style="color: #40015a;"&gt;/usr/lib/pkgconfig/globalmenu&lt;/span&gt;-server&lt;span style="color: maroon; font-weight: bold;"&gt;.&lt;/span&gt;pc &lt;span style="color: #44aadd;"&gt;-e&lt;/span&gt; &lt;span style="color: #0000e6;"&gt;'&lt;/span&gt;&lt;span style="color: maroon; font-weight: bold;"&gt;s&lt;/span&gt;&lt;span style="color: maroon;"&gt;/&lt;/span&gt;&lt;span style="color: #0000e6;"&gt; -lserver&lt;/span&gt;&lt;span style="color: maroon;"&gt;/&lt;/span&gt;&lt;span style="color: #0000e6;"&gt; -lglobalmenu-server&lt;/span&gt;&lt;span style="color: maroon;"&gt;/&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;'&lt;/span&gt;
&lt;span style="color: purple;"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/blockquote&gt;
Каждая строчка тут наполнена глубоким философским смыслом:&lt;br /&gt;
&lt;blockquote class="code"&gt;
&lt;pre&gt;# Убеждаем ./configure, что вшитая намертво зависимость от libgnome-menu
# нам совсем-сосем не нужна.
export GMENU_CFLAGS=" "
export GMENU_LIBS=" "&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote class="code"&gt;
&lt;pre&gt;# --without-gnome-panel — не ставить апплет для gnome-panel,
# --without-xfce4-panel — не ставить апплет для xfce-panel,
# --disable-schemas-install — не ставить апплет для gnome-panel, я сказал!
./configure --prefix=/usr --disable-tests \
   --without-gnome-panel --without-xfce4-panel --disable-schemas-install \
   --sysconfdir=/etc --libexecdir=/usr/lib&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote class="code"&gt;
&lt;pre&gt;# И в третий раз повторяем: не ставить никакие куски gnome-panel.
# Впрочем, я без понятия зачем на самом деле это,
# но в исходном PKGBUILD оно было.
GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL=1&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote class="code"&gt;
&lt;pre&gt;# Исправляем нелепую опечатку в pkgconfig.
# Без этого ничего не выйдет, всё пропало, шеф!
sed -i ${pkgdir}/usr/lib/pkgconfig/globalmenu-server.pc -e 's/ -lserver/ -lglobalmenu-server/'&lt;/pre&gt;
&lt;/blockquote&gt;
Не смотря на тройную просьбу не ставить чертов апплет для &lt;code&gt;gnome-panel&lt;/code&gt;, в пакете всё равно окажутся &lt;code&gt;/etc/gconf/schemas/gnome-globalmenu.schemas&lt;/code&gt; и &lt;code&gt;/usr/lib/gtk-2.0/modules/libglobalmenu-gnome-panel.so&lt;/code&gt;. При чём, зачем нужен второй файл, я даже приблизительно не представляю. Впрочем, они ничему не мешают.&lt;br /&gt;
&lt;br /&gt;
Надо сказать, несмотря на концептуальную правильность архитектуры, организационно исходники &lt;code&gt;globalmenu&lt;/code&gt; представляют собой ад и Израиль: есть клиентский модуль для GTK, есть серверный модуль, есть обертки для отображения серверного виджета на различных панелях... — вроде всё верно, но! Но какого черта всё это собирается общим лапшеобразным сборочным скриптом! &lt;s&gt;Убейте их кто-нибудь.&lt;/s&gt; Сделайте и отправьте им патч кто-нибудь, вам это обязательно зачтётся в карму.
&lt;br /&gt;
&lt;br /&gt;
Одновременно заюзать эту сборку &lt;code&gt;globalmenu&lt;/code&gt; и  дефолтную сборку из AUR-а для gnome-panel — не выйдет. Впрочем, ну кто ж сейчас пользуется &lt;code&gt;gnome-panel&lt;/code&gt;, когда есть &lt;a href="http://make-linux.blogspot.com/2011/06/lxpanel-globalmenu.html"&gt;это&lt;/a&gt;? ;)
&lt;br /&gt;
&lt;br /&gt;
И да — я изменил название пакета, убрав из него приставку «gnome-». Потому что к &lt;b&gt;Gnome&lt;/b&gt; теперь он имеет такое же отношение, как апельсины — к свиньям.
&lt;br /&gt;
&lt;br /&gt;
Второй &lt;b&gt;PKGBUILD&lt;/b&gt; на плагин для панели &lt;b&gt;LXPanel&lt;/b&gt;, после предыдущего шокирующего ужаса, здесь всё просто:&lt;br /&gt;
&lt;blockquote class="code"&gt;
&lt;pre style="background: #ffffff; color: black;"&gt;pkgname&lt;span style="color: #808030;"&gt;=&lt;/span&gt;globalmenu-lxpanel-plugin
pkgver&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: #008c00;"&gt;0&lt;/span&gt;&lt;span style="color: maroon; font-weight: bold;"&gt;.&lt;/span&gt;&lt;span style="color: #008c00;"&gt;0&lt;/span&gt;&lt;span style="color: maroon; font-weight: bold;"&gt;.&lt;/span&gt;&lt;span style="color: #008c00;"&gt;1&lt;/span&gt;
pkgrel&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: #008c00;"&gt;1&lt;/span&gt;
pkgdesc&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;"GlobalMenu GTK plugin and server module"&lt;/span&gt;
url&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;"http:&lt;/span&gt;&lt;span style="color: #40015a;"&gt;/&lt;/span&gt;&lt;span style="color: #40015a;"&gt;/make&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;-linux.blogspot.com&lt;/span&gt;&lt;span style="color: #40015a;"&gt;/&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;"&lt;/span&gt;
arch&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: purple;"&gt;(&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;'i686'&lt;/span&gt; &lt;span style="color: #0000e6;"&gt;'x86_64'&lt;/span&gt;&lt;span style="color: purple;"&gt;)&lt;/span&gt;
license&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: purple;"&gt;(&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;'GPL2'&lt;/span&gt; &lt;span style="color: #0000e6;"&gt;'GPL3'&lt;/span&gt;&lt;span style="color: purple;"&gt;)&lt;/span&gt;
depends&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: purple;"&gt;(&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;'gtk2'&lt;/span&gt; &lt;span style="color: #0000e6;"&gt;'lxpanel'&lt;/span&gt; &lt;span style="color: #0000e6;"&gt;'globalmenu-core'&lt;/span&gt;&lt;span style="color: purple;"&gt;)&lt;/span&gt;
makedepends&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: purple;"&gt;(&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;'gtk2'&lt;/span&gt; &lt;span style="color: #0000e6;"&gt;'lxpanel'&lt;/span&gt; &lt;span style="color: #0000e6;"&gt;'globalmenu-core'&lt;/span&gt; &lt;span style="color: #0000e6;"&gt;'libtool'&lt;/span&gt; &lt;span style="color: #0000e6;"&gt;'pkgconfig'&lt;/span&gt; &lt;span style="color: #0000e6;"&gt;'intltool'&lt;/span&gt;&lt;span style="color: purple;"&gt;)&lt;/span&gt;
optdepends&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: purple;"&gt;(&lt;/span&gt;&lt;span style="color: purple;"&gt;)&lt;/span&gt;
source&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: purple;"&gt;(&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;"http:&lt;/span&gt;&lt;span style="color: #40015a;"&gt;/&lt;/span&gt;&lt;span style="color: #40015a;"&gt;/home&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;.student.utwente.&lt;/span&gt;&lt;span style="color: #40015a;"&gt;nl/j&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;.&lt;/span&gt;&lt;span style="color: #40015a;"&gt;vanderhoff/downloads/lxglobalmenu&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;.tar.gz"&lt;/span&gt;&lt;span style="color: purple;"&gt;)&lt;/span&gt;
md5sums&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: purple;"&gt;(&lt;/span&gt;&lt;span style="color: #0000e6;"&gt;'a002c9eb5f7aece0a2677dde56a2acdd'&lt;/span&gt;&lt;span style="color: purple;"&gt;)&lt;/span&gt;

build&lt;span style="color: #808030;"&gt;()&lt;/span&gt; &lt;span style="color: purple;"&gt;{&lt;/span&gt;
    &lt;span style="color: #bb7977; font-weight: bold;"&gt;cd&lt;/span&gt; globalmenu
    &lt;span style="color: maroon; font-weight: bold;"&gt;.&lt;/span&gt;&lt;span style="color: #40015a;"&gt;/autogen&lt;/span&gt;&lt;span style="color: maroon; font-weight: bold;"&gt;.&lt;/span&gt;sh
    &lt;span style="color: maroon; font-weight: bold;"&gt;.&lt;/span&gt;&lt;span style="color: #40015a;"&gt;/configure&lt;/span&gt; --prefix&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: #40015a;"&gt;/usr&lt;/span&gt; --sysconfdir&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: #40015a;"&gt;/etc&lt;/span&gt; --libexecdir&lt;span style="color: #808030;"&gt;=&lt;/span&gt;&lt;span style="color: #40015a;"&gt;/usr/lib&lt;/span&gt;
    make &lt;span style="color: purple;"&gt;||&lt;/span&gt; &lt;span style="color: #bb7977; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #008c00;"&gt;1&lt;/span&gt;
&lt;span style="color: purple;"&gt;}&lt;/span&gt;

package&lt;span style="color: #808030;"&gt;()&lt;/span&gt;&lt;span style="color: purple;"&gt;{&lt;/span&gt;
    &lt;span style="color: #bb7977; font-weight: bold;"&gt;cd&lt;/span&gt; globalmenu
    make DESTDIR&lt;span style="color: #808030;"&gt;=&lt;/span&gt;${pkgdir} install &lt;span style="color: purple;"&gt;||&lt;/span&gt; &lt;span style="color: #bb7977; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #008c00;"&gt;1&lt;/span&gt;
&lt;span style="color: purple;"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/blockquote&gt;
Собирается плагин прямого из того самого архива, что валяется невозбранно на просторах интернета, и который никто не спешит доводить до ума. (В том числе, и я. Хотя собирался.) Так что когда полезут баги, помните, что я вас предупредил. На моей машине, тем не менее, оно работает.&lt;br /&gt;
&lt;br /&gt;
Чтобы клиентская сторона &lt;code&gt;globalmenu&lt;/code&gt; работала, не забудьте выставить переменную окружения для подключения модуля:
&lt;br /&gt;
&lt;blockquote class="code"&gt;
export GTK_MODULES=globalmenu-plugin
&lt;/blockquote&gt;
Чтобы отключить показ локального меню в окне, используте следующую команду:
&lt;br /&gt;
&lt;blockquote class="code"&gt;
globalmenu-settings show-local-menu false
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;
Сборку этих билдов проверял в chroot-е со свежеустановленным Арчем — всё собирается и работает, значит, вроде ничего в зависимостях не забыл. И ничего лишнего тоже не тянет в систему, только мимально необходимое для сборки.
&lt;br /&gt;
&lt;br /&gt;
На этом на сегодня всё, товарищи арчеводы. Собирайте пакеты, тестируйте, используте и имейте хороший день.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1408129172220183524-8080951248709038076?l=make-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://make-linux.blogspot.com/feeds/8080951248709038076/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://make-linux.blogspot.com/2011/07/pkgbuild-lxpanel-globalmenu-plugin.html#comment-form" title="Комментарии: 3" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/8080951248709038076?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/8080951248709038076?v=2" /><link rel="alternate" type="text/html" href="http://make-linux.blogspot.com/2011/07/pkgbuild-lxpanel-globalmenu-plugin.html" title="PKGBUILD для lxpanel globalmenu plugin" /><author><name>geekless</name><uri>http://www.blogger.com/profile/06009713622902465243</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/-CdzHefJdI2I/TigQ4umBRhI/AAAAAAAAAWI/uofyt-6PYA0/s220/51830--919357393.png" /></author><thr:total>3</thr:total></entry><entry gd:etag="W/&quot;C0EDQHk_fip7ImA9WhRUFUw.&quot;"><id>tag:blogger.com,1999:blog-1408129172220183524.post-4643185616747189240</id><published>2011-06-08T05:28:00.000-07:00</published><updated>2012-01-25T09:14:31.746-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-25T09:14:31.746-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="lxde" /><category scheme="http://www.blogger.com/atom/ns#" term="иксовое окружение" /><category scheme="http://www.blogger.com/atom/ns#" term="LXPanelX" /><category scheme="http://www.blogger.com/atom/ns#" term="lxpanel" /><title>Модифицированная lxpanel (+ апплет globalmenu)</title><content type="html">Представляю вниманию посетителей блога форк панели LXPanel (которая входит в состав проекта LXDE). Форк носит условное название LXPanelX и разрабатывается вашим покорным слугой. Собственно суть проекта — доработка панели задач, входящей в состав LXPanel, до состояния, близкого к идеалу, каким я его вижу.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Список изменений:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Новые режимы.&lt;/b&gt;&lt;br /&gt;
Оригинальная LXPanel Taskbar имеет два режима отображения окон: классический и группировка окон одного приложения одну кнопку с выпадающим списком. Данный форк добавляет еще два: группировка окон одного приложения рядом на панели, но без слияния в одну кнопку, и режим отображения только кнопки для активного окна.
В режиме отображения активного окна обычное поведение левой кнопки мыши (свернуть/восстановить) теряет смысл, поэтому щелчок левой кнопкой мыши открывает теперь контекстное меню окна (аналогично правому).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Улучшение режима группировки.&lt;/b&gt;&lt;br /&gt;
В режиме группировки, окна, относящиеся к одному приложению, группируются, только когда таких окон несколько. Если приложение имеет единственное окно, оно остаётся на панели "как есть", без группы. Такое поведение может вызывать неудобства в работе, т.к. не позволяет выработать автоматизм при взаимодействии с панелью: часть объектов панели при щелчке левой кнопкой мыши показывает выпадающее меню, а часть — выполняет переключение на другое окно. Чтобы улучшить ситуацию, была добавлена опция создания групп и для одиночных окон тоже: теперь любой объект панели задач ведет себя одинаковым, предсказуемым образом.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Возможность отключить отображение иконок окон.&lt;/b&gt;&lt;br /&gt;
В LXPanel Taskbar присутствовала возможность отображать иконки с заголовками или только иконки. Этот патч добавляет возможность отображать только заголовки, без иконок.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Закрытие окон в один клик.&lt;/b&gt;&lt;br /&gt;
Добавлена возможность отображать на панели кнопки закрытия окон. Это может быть удобно, например, если ваш оконный менеджер настроен не отображать заголовки окон.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Доступ к контекстному меню настройки LXPanel.&lt;/b&gt;&lt;br /&gt;
Поскольку панель задач перехватывает щелчок ПКМ, вызывать её настройки было раньше достаточно неудобно: необходимо щелкнуть по любому другому апплету, который отображает контекстное меню панели по ПКМ, открыть общие настройки панели, а затем оттуда открыть настройки апплета панели задач. Сейчас контекстное меню LXPanel отображается при щелчке ПКМ по панели задач, если при этом удерживать клавишу CTRL.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Внутренние доработки в "ядре" панели.&lt;/b&gt;&lt;br /&gt;
В диалогах конфигурации апплетов добавлена возможность использовать выпадающие списки.&lt;br /&gt;
В API icon-grid добавлена функция для позиционирования одного элемента после другого.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Эти изменения можно считать нацеленными на повышение удобства работы на устройствах с малым разрешением экрана и/или на устройствах без мыши (с тачпадом или сенсорным экраном):&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;В режиме показа только активного окна контекстное меню окна доступно через щелчок ЛКМ по любому месту панели.&lt;/li&gt;
&lt;li&gt;Также этот режим полезен, для экономии места на экране - панель задач можно использовать в качестве заголовка окна, а "настоящие" заголовки окон отключить в оконном менеджере.&lt;/li&gt;
&lt;li&gt;Возможность отключения показа иконок тоже будет полезна для экономии экранного места.&lt;/li&gt;
&lt;li&gt;Отображение кнопок закрытия позволяет закрыть любое окно в одно касание, даже если это окно перекрыто другими окнами, не имеет заголовка и т.п.&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Сборка.&lt;/b&gt;&lt;br /&gt;
Исходники можно &lt;a href="http://code.google.com/p/lxpanelx/source/checkout"&gt;взять здесь&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
PKGBUILD-ов и ebuild-ов, а также готовых пакетов пока нет. Вы можете взять *build для lxpanel из вашего дистрибутива и собрать при помощи него LXPanelX. (Используйте *build для версии 0.5.6 оригинальной панели.) Набор зависимостей и опции сборки полностью идентичны. Или можете пойти по пути наименьшего сопротивления, воспользовавшись ./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make install ;)&lt;br /&gt;
&lt;br /&gt;
Для реализации некоторых изменений потребовалось внести правки в "ядро" панели и API плагинов, так что если вы попробуете скомпилировать апплет из файла taskbar.c с оригинальной панелью, у вас ничего не выйдет. Апплеты же для оригинальной LXPanel, наоборот, полностью совместимы с LXPanelX. (Правда таких апплетов, оформленных в виде отдельных от LXDE проектов, фактически, нет. Так что и терять совместимость на самом деле не с чем.)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Изменения в конфигах.&lt;/b&gt;&lt;br /&gt;
На уровне конфигов старый и новый вариант панели задач частично несовместимы, но работать будут (выдавая в stderr предупреждения о неизвестных опциях). В LXPanelX у панели задач удалены следующие опции: IconsOnly, GroupedTasks. А следующие добавлены:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Mode — число от 0 до 3, указывающее режим: classic, group side by side, group into button, single window.&lt;/li&gt;
&lt;li&gt;ShowIconsTitles — число от 0 до 2, указывающее, что отображать на панели: иконки, заголовки, иконки вместе с заголовками.&lt;/li&gt;
&lt;li&gt;ShowCloseButtons — булево значение, указывающее, отображать ли кнопки закрытия.&lt;/li&gt;
&lt;li&gt;SelfGroupSingleWindow — булево значение, указывающее, создавать ли группы для одиночных окон. &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Почему форк, а не патч в апстрим.&lt;/b&gt;&lt;br /&gt;
Согласен, что на полноценный форк это пока не тянет. Просто в один прекрасный момент у меня появилось целостное видение того, в каком направлении я хочу доработать панель задач, чтобы получить годный для себя вариант. Я сел за компьютер, реализовал идеи в коде и получил результат, который здесь и представлен. Если кто-то захочет послать патч в апстрим - хорошо. Если патч там примут - еще лучше. Но самому мне лень предпринимать какие-либо действия в этом направлении.&lt;br /&gt;
Я планирую дорабатывать панель и в дальнейшем, и, вполне вероятно, видение идеальной панели у меня и у разработчиков LXDE существенно расходится. К тому же, заниматься дурью типа миграции на GTK3 (а потом на GTK3.x, GTK3.y, GTK3.z...) мне не интересно, мне интересно получить работающий результат. Так что пока это условный форк, а потом видно будет.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Известные проблемы.&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Не выполнена русификация новых строк в диалоге конфигурации панели задач.&lt;/li&gt;
&lt;li&gt;В режиме показа только активного окна панель задач пригодна к использованию только с выставленным флагом "растягивать" (т.е. подгонять ширину), иначе она вылезает далеко за пределы экрана. (Т.к. панель в этом режиме сама не может знать, какой размер ей для себя выставить, я прописал в коде ширину 9999. Не думаю, что кому-нибудь потребуется использовать панель в этом режиме при выключенном флаге растягивания.)&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Использование совместно с gnome-globalmenu.&lt;/b&gt;&lt;br /&gt;
Некоторое время назад в списке рассылки LXDE промелькнула &lt;a href="http://sourceforge.net/mailarchive/message.php?msg_id=27152380"&gt;реализация апплета gnome-globalmenu для LXPanel&lt;/a&gt;.&lt;br /&gt;
Совместно с новыми возможностями панели задач, этот апплет будет особенно полезен для экономии места на экране.&lt;br /&gt;
&lt;br /&gt;
Исходник, который можно скачать по ссылке, довольно сырой и, вероятно, глючный. Однако, он нормально компилируется и работает без серьёзных багов - во всяком случае, на моей машине. Поскольку гугление не обнаруживает на просторах интернета ничего, что пролило бы свет на дальнейшую судьбу этого проекта, поддержку этих исходников я беру на себя. Компилируйте, используйте, присылайте багрепорты. (Пока что в комментариях к этому сообщению, т.к. багтрекера сейчас нет.)&lt;br /&gt;
&lt;br /&gt;
Для сборки апплета необходимо установить LXPanelX (или оригинальную панель) и gnome-globalmenu. Если при сборке у вас появится ошибка отсутствия библиотеки server, создайте следующий симлинк: &lt;code&gt;ln -s -T libglobalmenu-server.so /usr/lib/libserver.so&lt;/code&gt; — это баг в pkgconfig в gnome-globalmenu.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Скриншоты.&lt;/b&gt;&lt;br /&gt;
Панель задач в режиме группировки окон одного приложения рядом друг с другом:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-copGXNL52js/Te9mMoQbtgI/AAAAAAAAAVo/nBouGSP9WcA/s1600/2011-06-08-181454_1280x1024_scrot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="6" src="http://1.bp.blogspot.com/-copGXNL52js/Te9mMoQbtgI/AAAAAAAAAVo/nBouGSP9WcA/s400/2011-06-08-181454_1280x1024_scrot.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Панель задач с отключенными иконками и включенными кнопками закрытия окон:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-ZGiNXLpN25Q/Te9mNJOi8TI/AAAAAAAAAVs/djpcFTItkfY/s1600/2011-06-08-181601_1280x1024_scrot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="7" src="http://3.bp.blogspot.com/-ZGiNXLpN25Q/Te9mNJOi8TI/AAAAAAAAAVs/djpcFTItkfY/s400/2011-06-08-181601_1280x1024_scrot.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Две панели задач рядом. Одна в режиме показа активного окна играет роль псевдозаголовка окон, отображая иконку, заголовок и кнопку закрытия окон. Другая используется для переключения между окнами, показывая окна, сгруппированные по приложениям. На скриншоте видно выпадающее меню со списком открытых эмуляторов терминала.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-s_Rc5RsIDm0/Te9mObzZtwI/AAAAAAAAAVw/DWruREG4bE0/s1600/2011-06-08-181742_1280x1024_scrot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="41" src="http://1.bp.blogspot.com/-s_Rc5RsIDm0/Te9mObzZtwI/AAAAAAAAAVw/DWruREG4bE0/s400/2011-06-08-181742_1280x1024_scrot.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Ну и собственно, моя текущая настройка панели:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;кнопка доступа в список установленных приложений,&lt;/li&gt;
&lt;li&gt;панель задач для переключения между окнами, отображающая сгруппированные окна со всех рабочих столов,&lt;/li&gt;
&lt;li&gt;апплет globalmenu, отображающий главное меню активного окна,&lt;/li&gt;
&lt;li&gt;панель задач, играющая роль заголовка активного окна,&lt;/li&gt;
&lt;li&gt;часы,&lt;/li&gt;
&lt;li&gt;трей.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-hCXMQh3DeG4/Te9mLzef3HI/AAAAAAAAAVk/_P6c51MMZQ4/s1600/2011-06-08-160611_1280x1024_scrot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-hCXMQh3DeG4/Te9mLzef3HI/AAAAAAAAAVk/_P6c51MMZQ4/s400/2011-06-08-160611_1280x1024_scrot.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1408129172220183524-4643185616747189240?l=make-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://make-linux.blogspot.com/feeds/4643185616747189240/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://make-linux.blogspot.com/2011/06/lxpanel-globalmenu.html#comment-form" title="Комментарии: 17" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/4643185616747189240?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/4643185616747189240?v=2" /><link rel="alternate" type="text/html" href="http://make-linux.blogspot.com/2011/06/lxpanel-globalmenu.html" title="Модифицированная lxpanel (+ апплет globalmenu)" /><author><name>geekless</name><uri>http://www.blogger.com/profile/06009713622902465243</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/-CdzHefJdI2I/TigQ4umBRhI/AAAAAAAAAWI/uofyt-6PYA0/s220/51830--919357393.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-copGXNL52js/Te9mMoQbtgI/AAAAAAAAAVo/nBouGSP9WcA/s72-c/2011-06-08-181454_1280x1024_scrot.png" height="72" width="72" /><thr:total>17</thr:total></entry><entry gd:etag="W/&quot;A0IEQXw_eip7ImA9WhZVE0Q.&quot;"><id>tag:blogger.com,1999:blog-1408129172220183524.post-976156660066506355</id><published>2011-05-26T01:45:00.000-07:00</published><updated>2011-05-26T01:45:00.242-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-26T01:45:00.242-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ъ-ссылки" /><title>IRIX</title><content type="html">&lt;a href="http://www.linux.org.ru/gallery/screenshots/5494345"&gt;Тёплый ламповый IRIX.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1408129172220183524-976156660066506355?l=make-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://make-linux.blogspot.com/feeds/976156660066506355/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://make-linux.blogspot.com/2011/05/irix.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/976156660066506355?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/976156660066506355?v=2" /><link rel="alternate" type="text/html" href="http://make-linux.blogspot.com/2011/05/irix.html" title="IRIX" /><author><name>geekless</name><uri>http://www.blogger.com/profile/06009713622902465243</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/-CdzHefJdI2I/TigQ4umBRhI/AAAAAAAAAWI/uofyt-6PYA0/s220/51830--919357393.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUQESXc8eyp7ImA9WhRVFk0.&quot;"><id>tag:blogger.com,1999:blog-1408129172220183524.post-8651246011049494252</id><published>2011-05-14T02:38:00.000-07:00</published><updated>2012-01-14T22:01:48.973-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-14T22:01:48.973-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Советы" /><category scheme="http://www.blogger.com/atom/ns#" term="bash" /><category scheme="http://www.blogger.com/atom/ns#" term="работа в консоли" /><title>Редактирование команд bash во внешнем редакторе</title><content type="html">В &lt;code&gt;bash&lt;/code&gt; достаточно нажать (по умолчанию) &lt;code&gt;Ctrl+X Ctrl+E&lt;/code&gt;, и текст из текущего буфера ввода будет открыт (через промежуточный временный файл) в редакторе, установленном в переменной окружения &lt;code&gt;EDITOR&lt;/code&gt;. После выхода из редактора, текст из временного файла будет исполнен как команда оболочки.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1408129172220183524-8651246011049494252?l=make-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://make-linux.blogspot.com/feeds/8651246011049494252/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://make-linux.blogspot.com/2011/05/bash.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/8651246011049494252?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/8651246011049494252?v=2" /><link rel="alternate" type="text/html" href="http://make-linux.blogspot.com/2011/05/bash.html" title="Редактирование команд bash во внешнем редакторе" /><author><name>geekless</name><uri>http://www.blogger.com/profile/06009713622902465243</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/-CdzHefJdI2I/TigQ4umBRhI/AAAAAAAAAWI/uofyt-6PYA0/s220/51830--919357393.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkcAQX4zeyp7ImA9WhZWEE8.&quot;"><id>tag:blogger.com,1999:blog-1408129172220183524.post-8201294776073237529</id><published>2011-05-10T02:34:00.000-07:00</published><updated>2011-05-10T02:34:00.083-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-10T02:34:00.083-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ъ-ссылки" /><category scheme="http://www.blogger.com/atom/ns#" term="bash" /><category scheme="http://www.blogger.com/atom/ns#" term="работа в консоли" /><title>Сводная таблица по bash из Advanced Bash-Scripting Guide</title><content type="html">&lt;a href="http://tldp.org/LDP/abs/html/refcards.html"&gt;Краткая, но информативная справка по bash из Advanced Bash-Scripting Guide.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1408129172220183524-8201294776073237529?l=make-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://make-linux.blogspot.com/feeds/8201294776073237529/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://make-linux.blogspot.com/2011/05/bash-advanced-bash-scripting-guide.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/8201294776073237529?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/8201294776073237529?v=2" /><link rel="alternate" type="text/html" href="http://make-linux.blogspot.com/2011/05/bash-advanced-bash-scripting-guide.html" title="Сводная таблица по bash из Advanced Bash-Scripting Guide" /><author><name>geekless</name><uri>http://www.blogger.com/profile/06009713622902465243</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/-CdzHefJdI2I/TigQ4umBRhI/AAAAAAAAAWI/uofyt-6PYA0/s220/51830--919357393.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUIMRHg8eip7ImA9WhRVFk0.&quot;"><id>tag:blogger.com,1999:blog-1408129172220183524.post-3835703960335886724</id><published>2011-05-06T00:49:00.000-07:00</published><updated>2012-01-14T22:06:25.672-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-14T22:06:25.672-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Статьи" /><title>Обзор графических просмотрщиков для GNU/Linux</title><content type="html">&lt;h4&gt;viewnior&lt;/h4&gt;&lt;br /&gt;
Простой просмотрщик, отображающий указанные файлы или все файлы из каталога.&lt;br /&gt;
Реализован на библиотеке GtkImageView.&lt;br /&gt;
&lt;br /&gt;
Возможности:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Просмотр свойств изображения.&lt;/li&gt;
&lt;li&gt;Автоматическая ориентация по метаданным.&lt;/li&gt;
&lt;li&gt;Поддержка анимации.&lt;/li&gt;
&lt;li&gt;Просмотр на полный экран.&lt;/li&gt;
&lt;li&gt;Слайдшоу.&lt;/li&gt;
&lt;li&gt;Подгонка размера окна под размеры изображения.&lt;/li&gt;
&lt;li&gt;Правка изображения: вращение, обрезка, отражение. Удаление файлов.&lt;/li&gt;
&lt;li&gt;Drag'n'Drop файлов на просмотрщик и из него.&lt;/li&gt;
&lt;li&gt;Установка изображения фоном рабочего стола (только для Gnome).&lt;/li&gt;
&lt;li&gt;Меню «Открыть с помощью» для открытия файла в другом приложении. (На основе общесистемной привязки mime типов.)&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;eog (Eye of Gnome)&lt;/h4&gt;&lt;br /&gt;
Простой просмотрщик, отображающий указанные файлы или все файлы из каталога. Умеет на панели в нижней части окна отображать миниатюры текущего набора файлов. От viewnior интерфейсно отличается лишь возможностью включить панель миниатюр, строку состояния и боковую панель для плагинов.&lt;br /&gt;
&lt;br /&gt;
Входит в состав Gnome. Реализован на библиотеке GdkPixbuf.&lt;br /&gt;
&lt;br /&gt;
Возможности:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Просмотр свойств изображения.&lt;/li&gt;
&lt;li&gt;Автоматическая ориентация по метаданным.&lt;/li&gt;
&lt;li&gt;Поддержка анимации.&lt;/li&gt;
&lt;li&gt;Просмотр на полный экран.&lt;/li&gt;
&lt;li&gt;Слайдшоу.&lt;/li&gt;
&lt;li&gt;Правка изображения: вращение, отражение. Удаление файлов в корзину.&lt;/li&gt;
&lt;li&gt;Drag'n'Drop файлов.&lt;/li&gt;
&lt;li&gt;Установка изображения фоном рабочего стола (для Gnome).&lt;/li&gt;
&lt;li&gt;Меню «Открыть с помощью». (На основе общесистемной привязки mime типов.)&lt;/li&gt;
&lt;li&gt;Есть возможность переиспользовать уже открытое окно приложения вместо запуска второй копии.&lt;/li&gt;
&lt;li&gt;Поддержка плагинов.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h4&gt;GPicView&lt;/h4&gt;&lt;br /&gt;
Просмотрщик из проекта LXDE. Как пишут на официальном сайте, extremely lightweight and fast with low memory usage. Интерфейсно очень минималистичен: область просмотра и панель с кнопками под ней. Контекстное меню есть, но бесполезно, т.к. просто дублирует кнопки.&lt;br /&gt;
&lt;br /&gt;
На роль «просто просмотщик без избыточной функциональности» годится лучше, чем viewnior и eog в силу двух вещей: &lt;br /&gt;
Во-первых, им удобнее управлять с клавиатуры, т.к. большинство действий по умолчанию привязаны к клавишам алфавитно-цифрового блока, а не сочетаниями модификатор+клавиша. Во-вторых, перетаскивание картинки при помощи левой кнопки мыши работает как прокрутка (в viewnior и eog это включает Drag'n'Drop).&lt;br /&gt;
&lt;br /&gt;
Однако, есть и недостатки. Не умеет показывать набор файлов, переданных в аргументах вызова — показывает только первый файл списка, а навигация вперед-назад листает файлы из того же каталога. При передаче в программу имени каталога ругается на неизвестный тип файла.&lt;br /&gt;
&lt;br /&gt;
Не привязан ни к какой DE. Зависит только от GTK.&lt;br /&gt;
&lt;br /&gt;
Возможности:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Автоматическая ориентация по метаданным.&lt;/li&gt;
&lt;li&gt;Поддержка анимации.&lt;/li&gt;
&lt;li&gt;Просмотр на полный экран.&lt;/li&gt;
&lt;li&gt;Правка изображения: вращение, отражение. Удаление файлов.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Ristretto&lt;/h4&gt;&lt;br /&gt;
Просмотрщик из проекта XFCE. Позиционируется как быстрый и легковесный. Интерфейсно похож на eog, только зачем-то кнопки разнесли на два тулбара, вместо одного. Есть панель миниатюр. Возможность сортировки файлов по имени и дате. Средств правки изображения нет. &lt;br /&gt;
&lt;br /&gt;
Пока еще крайне сырой. При попытке включить панель миниатюр, завис со 100% загрузкой CPU и при перезапусках развисать отказался.&lt;br /&gt;
&lt;br /&gt;
Возможности:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Автоматическая ориентация по метаданным.&lt;/li&gt;
&lt;li&gt;Поддержка анимации.&lt;/li&gt;
&lt;li&gt;Просмотр на полный экран.&lt;/li&gt;
&lt;li&gt;Слайдшоу.&lt;/li&gt;
&lt;li&gt;Удаление файлов.&lt;/li&gt;
&lt;li&gt;Меню «Открыть с помощью». (На основе общесистемной привязки mime типов.)&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h4&gt;Mirage&lt;/h4&gt;&lt;br /&gt;
Написан на питоне, использует GTK. (Соответственно, зависит от PyGTK.) Еще один «fast and simple» просмотрщик. Все они как один быстрые и простые, ага. На практике же запускается с ощутимой задержкой, а также чуть больше подлагивает на просмотре больших файлов, чем предыдущие просмотрщики.&lt;br /&gt;
&lt;br /&gt;
Есть боковая панель с миниатюрами. В аргументах принимает как имена файлов, так и имена каталогов. Сначала я столкнулся со странным поведением: если передать два имени файла из разных каталогов, показывает список файлов из обоих каталогов и при листании, соответственно, пролистывает сначала все изображения из одного каталога, а затем из другого. Оказалось, чтобы просмотривать изображения точно по переданному в аргументах списку, надо выключить в настройках пункт Load all images in current directory — имейте ввиду, если будете пользоваться. Надо бы послать FR разработчику, чтобы эту настроку можно было указывать в прямо аргументах вызова, но мне лень.&lt;br /&gt;
&lt;br /&gt;
Возможности:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Просмотр свойств изображения.&lt;/li&gt;
&lt;li&gt;Поддержка анимации.&lt;/li&gt;
&lt;li&gt;Просмотр на полный экран.&lt;/li&gt;
&lt;li&gt;Слайдшоу.&lt;/li&gt;
&lt;li&gt;Правка изображения: вращение, обрезка, отражение, изменение размера, изменение насыщенности. Удаление файлов. Переименование файлов.&lt;/li&gt;
&lt;li&gt;Drag'n'Drop файлов отсутствует, вместо него перетаскивание мышью работает как прокрутка.&lt;/li&gt;
&lt;li&gt;Можно задать свои наборы действий над файлами и назначить им горячие клавиши. В команду действия можно подставлять имя файла, полный путь и полный список файлов. В конце команды можно вписать флаги [PREV] или [NEXT] для навигации назад/вперёд после выполнения команды.&lt;/li&gt;
&lt;li&gt;Можно сделать и сохранить скриншот.&lt;/li&gt;
&lt;li&gt;Есть настройки качества масштабирования.&lt;/li&gt;
&lt;li&gt;Можно рекурсивно загрузить в список все изобраежния в подкаталогах.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
В целом, программа не произвела особого впечатления. Как быстрый и легкий просмотрщик он не годится из-за использования питона. Возможностей скриптования нет, хотя они прямо таки просят себя добавить, раз уж программа на питоне. Набор функций странен: тут и снятие скриншотов, и изменение насыщенности (зачем это просмотрщику?), но нет сортировки файлов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Comix&lt;/h4&gt;&lt;br /&gt;
Эта программа предназначена для удобного просмотра комиксов и манги, но, вместе с тем, получился и просто хороший просмотрщик картинок. Боковая панель с миниатюрами. Удобные биндинги хоткеев. Написан на питоне.&lt;br /&gt;
&lt;br /&gt;
Возможности:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Просмотр свойств изображения.&lt;/li&gt;
&lt;li&gt;Просмотр на полный экран.&lt;/li&gt;
&lt;li&gt;Слайдшоу.&lt;/li&gt;
&lt;li&gt;Правка изображения: вращение, отражение.&lt;/li&gt;
&lt;li&gt;Поддержка библиотек/коллекций.&lt;/li&gt;
&lt;li&gt;Лупа. (Увеличенный фрагмент под указателем мыши.)&lt;/li&gt;
&lt;li&gt;Перетаскивание картинки используется для прокрутки.&lt;/li&gt;
&lt;li&gt;Возможность динамически подстраивать цвет фона на основании цветов по краям изображения.&lt;/li&gt;
&lt;li&gt;Двухстраничный режим.&lt;/li&gt;
&lt;li&gt;Отображение комментариев к изображению из текстовых файлов.&lt;/li&gt;
&lt;li&gt;Подстройка яркости, контрастности, насыщенности, резкости при показе изображений. В том числе, автоподстройка контрастности.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Не поддерживает анимированные изображения.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;feh&lt;/h4&gt;&lt;br /&gt;
Это полностью юниксвейный просмотрщик изображений. Пользовательский интерфейс, фактически, отсутствует. Всё управление настройками и режимами работы осуществляется через аргументы командной строки. Идеален для использования из shell, для встраивания в различные скрипты и т.п.&lt;br /&gt;
&lt;br /&gt;
Использует библиотеку Imlib2.&lt;br /&gt;
&lt;br /&gt;
feh может работать в следующих режимах:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Slideshow.&lt;/i&gt; Просмотр указанного списка изображений. Изображения могут быть удалены (либо только из списка, либо с диска). Измененный список можно сохранить в файл.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Multiwindow.&lt;/i&gt; Показывает каждое изображение указанного списка в отдельном окне.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Montage.&lt;/i&gt; Склеивает несколько изображений вместе и показывает результат. Можно сохранить результат в файл.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Collage.&lt;/i&gt; Аналогично montage, но размещает изображения случайным образом.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Index.&lt;/i&gt; Формирует итоговое изображение, состоящее из миниатюр исходных изображений и подписей (имя файла, размер). Можно задать используемый шрифт, а также ограничения на ширину и/или высоту итоговой картинки.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Thumbnail.&lt;/i&gt; Показывает окно, аналогичное режиму index, но на миниатюрах можно кликнуть мышкой, что откроет просмотр изображения в новом окне.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;List.&lt;/i&gt; Не показывает изображений, а просто выводит на stdout таблицу с параметрами изображений, подобно ls -l для файлов.&lt;br /&gt;
&lt;br /&gt;
Некоторые возможности:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Большинство хоткеев по умолчанию удобно расположены в алфавитно-цифровом блоке клавиатуры. Впрочем, всё это легко настраивается в конфиге.&lt;/li&gt;
&lt;li&gt;В файле конфигурации можно задать именованные наборы ключей командной строки и затем вызывать feh, указывая только имя набора.&lt;/li&gt;
&lt;li&gt;Может использоваться для установки фона рабочего стола.&lt;/li&gt;
&lt;li&gt;Можно задать до 10-ти команд, которые срабатывают при нажатии на Enter и клавиши 1..9.&lt;/li&gt;
&lt;li&gt;При просмотре файлов по списку, есть возможность указать файл, с которого начинать просмотр.&lt;/li&gt;
&lt;li&gt;Можно сортировать по: name, filename, width, height, pixels, size, format, а также просматривать в случайном порядке.&lt;/li&gt;
&lt;li&gt;Рекурсивный поиск изображений в каталогах.&lt;/li&gt;
&lt;li&gt;Умеет отображать не только файлы локальной ФС, но по URL. (через библиотеку libcurl)&lt;/li&gt;
&lt;li&gt;При получении сигналов SIGUSR1 и SIGUSR2 переходит на следующее/предыдущее изображение. К сожалению, других возможностей удаленного управления просмотрщиком не предусмотрено, а они были бы очень кстати для встраивания его в файловый менеджер, например.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;gqview&lt;/h4&gt;&lt;br /&gt;
Это уже не минималистичный просмотрщик, а довольно мощный менеджер (органайзер) изображений. При этом, достаточно легковесный. Имеет довольно гибко настраиваемый интерфейс и удобные биндинги клавиш.&lt;br /&gt;
&lt;br /&gt;
При попытке использовать его как просмотрщик заданного извне списка файлов, можно увидеть неожиданное поведение: прокрутка колесом мыши будет нормально листать переданные в аргументах вызова изображения, но на его панелях всё время будет отображаться только каталог от самого первого изображения. Чтобы это побороть, надо запускать с ключем -t (скрыть панели). Если хочется при этом видеть еще и миниатюры файлов, то добавить ключ -l (создать и показать коллекцию из переданного списка файлов), но в этом случае при закрытии программы, она будет жаловаться, что вы не сохранили коллекцию. В общем, на такую роль он годится слабо. Зато годится для много чего другого:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Просмотр свойств изображения.&lt;/li&gt;
&lt;li&gt;Автоматическая ориентация по метаданным.&lt;/li&gt;
&lt;li&gt;Автоматически обновляет картинку при изменении файла.&lt;/li&gt;
&lt;li&gt;Просмотр на полный экран.&lt;/li&gt;
&lt;li&gt;Слайдшоу.&lt;/li&gt;
&lt;li&gt;Подгонка размера окна под размеры изображения.&lt;/li&gt;
&lt;li&gt;Правка изображения: вращение, отражение. Удаление файлов.&lt;/li&gt;
&lt;li&gt;Действия «Копировать в», «Переместить в». Переименование файлов. Создание каталогов.&lt;/li&gt;
&lt;li&gt;Drag'n'Drop файлов.&lt;/li&gt;
&lt;li&gt;Установка изображения фоном рабочего стола.&lt;/li&gt;
&lt;li&gt;Вместо автоматического меню «Открыть с помощью», в gqview предусмотрена возможность в настройках добавить в меню нужные команды (например, запуск gimp), при чем сразу же и с хоткеями.&lt;/li&gt;
&lt;li&gt;Панель навигации со строкой адреса, деревом каталогов и списком изображений в текущем каталоге.&lt;/li&gt;
&lt;li&gt;Различные режимы сортировки списка.&lt;/li&gt;
&lt;li&gt;Возможность отображать миниатюры в списке изображений.&lt;/li&gt;
&lt;li&gt;Кэш миниатюр.&lt;/li&gt;
&lt;li&gt;Назначение ключевых слов изображениям.&lt;/li&gt;
&lt;li&gt;Коллекции (произвольные списки файлов).&lt;/li&gt;
&lt;li&gt;Панель для просмотра данных EXIF.&lt;/li&gt;
&lt;li&gt;Панель «менеджер сортировки» для удобного копирования/перемещения файлов в выбранный набор каталогов или коллекций.&lt;/li&gt;
&lt;li&gt;Поиск изображений: по имени файла, размеру, дате модификации, размеру изображения, похожести на образец и ключевым словам.&lt;/li&gt;
&lt;li&gt;Поиск дубликатов.&lt;/li&gt;
&lt;li&gt;Множество тонких настроек интерфейса, возможность запоминания позиции окна и другие мелкие удобства.&lt;/li&gt;
&lt;li&gt;Возможность печати изображения.&lt;/li&gt;
&lt;li&gt;Возможность управления уже запущенной копией программы из командной строки.&lt;/li&gt;
&lt;li&gt;Настройки качества масштабирования изображений.&lt;/li&gt;
&lt;li&gt;Программа не теряет управляемость на загрузке файлов, загрузка может быть прервана.&lt;/li&gt;
&lt;/ul&gt;Зависит только от GTK.  Из недостатков: нет поддержки анимированных изображений.  &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;h4&gt;Geeqie&lt;/h4&gt;Geeqie — это форк gqview, после того, как разработка последнего остановилась в 2006-м. Развивается с 2008-го года. Сохраняя все достоинства оригинала, приобрел много новых возможностей. Некоторые из них: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Просмотр бок о бок двух или четырех изображений.&lt;/li&gt;
&lt;li&gt;Автоматически заполняемое меню «Открыть с помощью».&lt;/li&gt;
&lt;li&gt;Построение гистограмм цвета.&lt;/li&gt;
&lt;li&gt;«Расширенный вид» рекурсивно ищет по каталогам. Имеет режимы просмотра «Временная шкала», «Календарь», «Каталоги».&lt;/li&gt;
&lt;li&gt;Возможность группировки файлов по имени, игнорируя показ файлов отличающихся только расширением (одинаковые изображения в разных форматах).&lt;/li&gt;
&lt;li&gt;Возможность определения внешних обработчиков операций копирования, перемещения и удаления.&lt;/li&gt;
&lt;/ul&gt;Выжимку change log-а проекта можно &lt;a href="http://sourceforge.net/apps/trac/geeqie/wiki/new_features"&gt;посмотреть вот здесь&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;hr/&gt;Версии программ, использовавшиеся при написании этого обзора:  &lt;br /&gt;
&lt;blockquote class="code"&gt;&lt;pre&gt;$ pacman -Q viewnior eog gpicview ristretto mirage comix feh gqview geeqie 
viewnior 1.1-1
eog 2.32.1-1
gpicview 0.2.1-3
ristretto 0.0.93-1
mirage 0.9.5.2-1
comix 4.0.4-5
feh 1.13-1
gqview 2.0.4-3
geeqie 1.0-5
&lt;/pre&gt;&lt;/blockquote&gt;Зависимости и размеры пакетов: &lt;br /&gt;
&lt;blockquote class="code"&gt;&lt;pre&gt;$ env LANG=C pacman -Qi viewnior eog gpicview ristretto mirage comix feh gqview geeqie | egrep 'Name|Depends|Installed Size'
Name           : viewnior
Depends On     : gtk2&amp;gt;=2.12
Installed Size : 724.00 K
Name           : eog
Depends On     : gnome-desktop&amp;gt;=2.32.0  libexif&amp;gt;=0.6.19  lcms&amp;gt;=1.19  desktop-file-utils  gnome-icon-theme&amp;gt;=2.31.0  exempi&amp;gt;=2.1.1  python2&amp;gt;=2.7
Installed Size : 8052.00 K
Name           : gpicview
Depends On     : gtk2
Installed Size : 712.00 K
Name           : ristretto
Depends On     : libxfce4ui  libexif  desktop-file-utils  hicolor-icon-theme
Installed Size : 441.00 K
Name           : mirage
Depends On     : pygtk  desktop-file-utils
Installed Size : 664.00 K
Name           : comix
Depends On     : pygtk  pil  unrar  xdg-utils
Installed Size : 1564.00 K
Name           : feh
Depends On     : giblib  curl  libxinerama
Installed Size : 480.00 K
Name           : gqview
Depends On     : gtk2
Installed Size : 2796.00 K
Name           : geeqie
Depends On     : exiv2  gtk2  lcms  desktop-file-utils
Installed Size : 5204.00 K
&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1408129172220183524-3835703960335886724?l=make-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://make-linux.blogspot.com/feeds/3835703960335886724/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://make-linux.blogspot.com/2011/05/gnulinux.html#comment-form" title="Комментарии: 9" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/3835703960335886724?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/3835703960335886724?v=2" /><link rel="alternate" type="text/html" href="http://make-linux.blogspot.com/2011/05/gnulinux.html" title="Обзор графических просмотрщиков для GNU/Linux" /><author><name>geekless</name><uri>http://www.blogger.com/profile/06009713622902465243</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/-CdzHefJdI2I/TigQ4umBRhI/AAAAAAAAAWI/uofyt-6PYA0/s220/51830--919357393.png" /></author><thr:total>9</thr:total></entry><entry gd:etag="W/&quot;DUQESXc8fCp7ImA9WhRVFk0.&quot;"><id>tag:blogger.com,1999:blog-1408129172220183524.post-1907042093688503846</id><published>2011-04-26T09:23:00.001-07:00</published><updated>2012-01-14T22:01:48.974-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-14T22:01:48.974-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Советы" /><category scheme="http://www.blogger.com/atom/ns#" term="dd" /><category scheme="http://www.blogger.com/atom/ns#" term="bash" /><category scheme="http://www.blogger.com/atom/ns#" term="работа в консоли" /><category scheme="http://www.blogger.com/atom/ns#" term="скриптинг" /><title>dd с интерактивным показом хода копирования</title><content type="html">Утилита &lt;code&gt;dd&lt;/code&gt; при получении сигнала &lt;code&gt;USR1&lt;/code&gt; выводит на stderr статистику хода копирования. Это позволяет написать скрипт, реализующий «интерактивный» аналог &lt;code&gt;dd&lt;/code&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#696969; '&gt;#!/bin/bash&lt;/span&gt;

&lt;span style='color:#696969; '&gt;# PID реального процесса dd&lt;/span&gt;
DD_PID&lt;span style='color:#808030; '&gt;=&lt;/span&gt;

&lt;span style='color:#696969; '&gt;# Обработчик события выхода из программы&lt;/span&gt;
exittrap&lt;span style='color:#808030; '&gt;()&lt;/span&gt;
&lt;span style='color:#800080; '&gt;{&lt;/span&gt;
    &lt;span style='color:#696969; '&gt;# Убиваем dd, если он запущен и еще не завершился&lt;/span&gt;
    &lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;[ $DD_PID != '' &lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt;] &lt;span style='color:#800080; '&gt;&amp;amp;&amp;amp;&lt;/span&gt; ps $DD_PID &lt;span style='color:#e34adc; '&gt;&gt;&lt;/span&gt; &lt;span style='color:#40015a; '&gt;/dev/null&lt;/span&gt; &lt;span style='color:#800080; '&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style='color:#bb7977; font-weight:bold; '&gt;kill&lt;/span&gt; $DD_PID
&lt;span style='color:#800080; '&gt;}&lt;/span&gt;

&lt;span style='color:#bb7977; font-weight:bold; '&gt;trap&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;"exittrap"&lt;/span&gt; EXIT

&lt;span style='color:#696969; '&gt;# Функция формирует интерактивный вывод&lt;/span&gt;
format_output&lt;span style='color:#808030; '&gt;()&lt;/span&gt;
&lt;span style='color:#800080; '&gt;{&lt;/span&gt;
    &lt;span style='color:#696969; '&gt;# unbuffer необходим для отключения буферизации потока, без него мы ничего&lt;/span&gt;
    &lt;span style='color:#696969; '&gt;# не увидим, либо увидим с большооооой задержкой.&lt;/span&gt;

    &lt;span style='color:#696969; '&gt;# Фильтруем строки с информаций о ходе работы dd&lt;/span&gt;
    &lt;span style='color:#696969; '&gt;# и пишем их поверх друг друга без перевода строк.&lt;/span&gt;
    unbuffer &lt;span style='color:#44aadd; '&gt;-p&lt;/span&gt; &lt;span style='color:#bb7977; font-weight:bold; '&gt;grep&lt;/span&gt;&lt;span style='color:#0000e6; '&gt; &lt;/span&gt;&lt;span style='color:#800000; '&gt;'&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;copied&lt;/span&gt;&lt;span style='color:#800000; '&gt;'&lt;/span&gt; --color&lt;span style='color:#808030; '&gt;=&lt;/span&gt;never &lt;span style='color:#e34adc; '&gt;|&lt;/span&gt; &lt;span style='color:#800080; '&gt;(&lt;/span&gt;
        spaces&lt;span style='color:#808030; '&gt;=&lt;/span&gt;
        &lt;span style='color:#800000; font-weight:bold; '&gt;while&lt;/span&gt; &lt;span style='color:#bb7977; font-weight:bold; '&gt;read&lt;/span&gt; line &lt;span style='color:#800080; '&gt;;&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;do&lt;/span&gt;
            &lt;span style='color:#bb7977; font-weight:bold; '&gt;echo&lt;/span&gt; &lt;span style='color:#44aadd; '&gt;-ne&lt;/span&gt; &lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;&lt;span style='color:#0f69ff; '&gt;\r&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;$spaces&lt;/span&gt;&lt;span style='color:#0f69ff; '&gt;\r&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;$line&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"&lt;/span&gt;
            spaces&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;`&lt;/span&gt;&lt;span style='color:#bb7977; background:#ffffe8; font-weight:bold; '&gt;echo&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#44aadd; background:#ffffe8; '&gt;-n&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;"&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;$line&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;"&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#e34adc; background:#ffffe8; '&gt;|&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#bb7977; background:#ffffe8; font-weight:bold; '&gt;sed&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;s&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; '&gt;/&lt;/span&gt;&lt;span style='color:#808030; background:#ffffe8; '&gt;.&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; '&gt;/&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt; &lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; '&gt;/&lt;/span&gt;&lt;span style='color:#800000; background:#ffffe8; font-weight:bold; '&gt;g&lt;/span&gt;&lt;span style='color:#0000e6; background:#ffffe8; '&gt;'&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;`&lt;/span&gt;
        &lt;span style='color:#800000; font-weight:bold; '&gt;done&lt;/span&gt;
    &lt;span style='color:#800080; '&gt;)&lt;/span&gt;
    &lt;span style='color:#bb7977; font-weight:bold; '&gt;echo&lt;/span&gt;
&lt;span style='color:#800080; '&gt;}&lt;/span&gt;

&lt;span style='color:#696969; '&gt;# Терминал, куда показываем интерактивный вывод.&lt;/span&gt;
&lt;span style='color:#696969; '&gt;# Внутри оператора &gt;() команда tty не работает, поэтому запоминаем его здесь&lt;/span&gt;
TTY&lt;span style='color:#808030; '&gt;=&lt;/span&gt;&lt;span style='color:#000000; background:#ffffe8; '&gt;`tty`&lt;/span&gt;

&lt;span style='color:#696969; '&gt;# Вызываем реальный dd, перенаправляем его stderr в наш обработчик&lt;/span&gt;
env LANG&lt;span style='color:#808030; '&gt;=&lt;/span&gt;C dd &lt;span style='color:#0000e6; '&gt;"$@"&lt;/span&gt; &lt;span style='color:#008c00; '&gt;2&lt;/span&gt;&lt;span style='color:#e34adc; '&gt;&gt;&lt;/span&gt; &lt;span style='color:#e34adc; '&gt;&gt;&lt;/span&gt;&lt;span style='color:#800080; '&gt;(&lt;/span&gt;
    format_output &lt;span style='color:#e34adc; '&gt;&gt;&lt;/span&gt; $TTY
&lt;span style='color:#800080; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;&amp;amp;&lt;/span&gt;

DD_PID&lt;span style='color:#808030; '&gt;=&lt;/span&gt;$!

&lt;span style='color:#696969; '&gt;# Пока процесс dd жив, каждую секунду посылаем ему SIGUSR1,&lt;/span&gt;
&lt;span style='color:#696969; '&gt;# заставляя выдать статистику на stderr&lt;/span&gt;
&lt;span style='color:#800000; font-weight:bold; '&gt;while&lt;/span&gt; ps $DD_PID &lt;span style='color:#e34adc; '&gt;&gt;&lt;/span&gt; &lt;span style='color:#40015a; '&gt;/dev/null&lt;/span&gt; &lt;span style='color:#800080; '&gt;;&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;do&lt;/span&gt;
    &lt;span style='color:#bb7977; font-weight:bold; '&gt;kill&lt;/span&gt; -SIGUSR1 $DD_PID &lt;span style='color:#800080; '&gt;&amp;amp;&amp;amp;&lt;/span&gt; sleep &lt;span style='color:#008c00; '&gt;1&lt;/span&gt;
&lt;span style='color:#800000; font-weight:bold; '&gt;done&lt;/span&gt;
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;
Для работы скрипта необходима утилита &lt;code&gt;unbuffer&lt;/code&gt; из пакета &lt;code&gt;expect&lt;/code&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1408129172220183524-1907042093688503846?l=make-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://make-linux.blogspot.com/feeds/1907042093688503846/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://make-linux.blogspot.com/2011/04/dd.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/1907042093688503846?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/1907042093688503846?v=2" /><link rel="alternate" type="text/html" href="http://make-linux.blogspot.com/2011/04/dd.html" title="dd с интерактивным показом хода копирования" /><author><name>geekless</name><uri>http://www.blogger.com/profile/06009713622902465243</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/-CdzHefJdI2I/TigQ4umBRhI/AAAAAAAAAWI/uofyt-6PYA0/s220/51830--919357393.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUQESXc8fSp7ImA9WhRVFk0.&quot;"><id>tag:blogger.com,1999:blog-1408129172220183524.post-2326238225161027473</id><published>2011-04-24T09:21:00.000-07:00</published><updated>2012-01-14T22:01:48.975-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-14T22:01:48.975-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="администрирование" /><category scheme="http://www.blogger.com/atom/ns#" term="Советы" /><title>tail /dev/zero — заполнить всю доступную память</title><content type="html">При настройке параметров виртуальной памяти или лимитов процессов бывает необходимо, чтобы какой-нибудь процесс занял всю доступную память. Обычно первое решение, которое приходит на ум — выделение памяти в бесконечном цикле. Но проще всего это сделать командой &lt;code&gt;tail /dev/zero&lt;/code&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1408129172220183524-2326238225161027473?l=make-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://make-linux.blogspot.com/feeds/2326238225161027473/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://make-linux.blogspot.com/2011/04/tail-devzero.html#comment-form" title="Комментарии: 2" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/2326238225161027473?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/2326238225161027473?v=2" /><link rel="alternate" type="text/html" href="http://make-linux.blogspot.com/2011/04/tail-devzero.html" title="tail /dev/zero — заполнить всю доступную память" /><author><name>geekless</name><uri>http://www.blogger.com/profile/06009713622902465243</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/-CdzHefJdI2I/TigQ4umBRhI/AAAAAAAAAWI/uofyt-6PYA0/s220/51830--919357393.png" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;C0YCQXwzfip7ImA9WhZQFEU.&quot;"><id>tag:blogger.com,1999:blog-1408129172220183524.post-3116839320106990500</id><published>2011-04-22T07:06:00.000-07:00</published><updated>2011-04-22T07:06:00.286-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-22T07:06:00.286-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ъ-ссылки" /><title>Unix Toolbox</title><content type="html">&lt;a href="http://cb.vu/unixtoolbox.xhtml"&gt;Справочник/коллекция консольных команд GNU/Linux и FreeBSD «на все случаи жизни».&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1408129172220183524-3116839320106990500?l=make-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://make-linux.blogspot.com/feeds/3116839320106990500/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://make-linux.blogspot.com/2011/04/unix-toolbox.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/3116839320106990500?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/3116839320106990500?v=2" /><link rel="alternate" type="text/html" href="http://make-linux.blogspot.com/2011/04/unix-toolbox.html" title="Unix Toolbox" /><author><name>geekless</name><uri>http://www.blogger.com/profile/06009713622902465243</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/-CdzHefJdI2I/TigQ4umBRhI/AAAAAAAAAWI/uofyt-6PYA0/s220/51830--919357393.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUQESXc8fip7ImA9WhRVFk0.&quot;"><id>tag:blogger.com,1999:blog-1408129172220183524.post-2003093285372271375</id><published>2011-04-17T09:30:00.000-07:00</published><updated>2012-01-14T22:01:48.976-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-14T22:01:48.976-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="gedit" /><category scheme="http://www.blogger.com/atom/ns#" term="Советы" /><category scheme="http://www.blogger.com/atom/ns#" term="gnome" /><category scheme="http://www.blogger.com/atom/ns#" term="настройка" /><title>Тюнинг стилей gedit: делаем цвет подсветки скобок более адекватным</title><content type="html">Из пяти вариантов цветовых стилей, которые идут с &lt;code&gt;gedit&lt;/code&gt; по умолчанию, сами приятными, на мой взгляд, являются Cobalt и Oblivion. К сожалению у этих стилей имеется мелкий, но достаточно неприятный недостаток: цвет подсветки парной скобки практически совпадает с цветом выделения текста. Когда курсор стоит на скобке, кажется, что выделение находится на соответствующей парной скобке, а когда выделен текст внутри скобок, кажется, что выделен текст + еще одна скобка.&lt;br /&gt;
&lt;br /&gt;
Исправим это недоразумение. Копируем стиль cobalt из общесистемного в домашний каталог:&lt;br /&gt;
&lt;blockquote class='code'&gt;cp /usr/share/gtksourceview-2.0/styles/cobalt.xml ~/.local/share/gtksourceview-2.0/styles/cobalt1.xml&lt;/blockquote&gt;Открываем в текстовом редакторе и правим цвет фона для элемента bracket-match. Также изменим название и идентификатор стиля, чтобы не смешивать с оригинальным.&lt;br /&gt;
&lt;br /&gt;
У себя я внёс такие изменения:&lt;br /&gt;
&lt;blockquote class='code'&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;$ diff -u /usr/share/gtksourceview-&lt;span style='color:#008c00; '&gt;2&lt;/span&gt;.&lt;span style='color:#008c00; '&gt;0&lt;/span&gt;/styles/cobalt.xml ~/.local/share/gtksourceview-&lt;span style='color:#008c00; '&gt;2&lt;/span&gt;.&lt;span style='color:#008c00; '&gt;0&lt;/span&gt;/styles/cobalt&lt;span style='color:#008c00; '&gt;1&lt;/span&gt;.xml
&lt;span style='color:#007997; '&gt;--- /usr/share/gtksourceview-2.0/styles/cobalt.xml    2010-09-29 00:53:06.000000000 +0800&lt;/span&gt;
&lt;span style='color:#007997; '&gt;+++ /media/work/home/vadim/.local/share/gtksourceview-2.0/styles/cobalt1.xml    2011-04-05 00:43:20.000000000 +0800&lt;/span&gt;
&lt;span style='color:#e34adc; '&gt;@@ -22,7 +22,7 @@&lt;/span&gt;
  Theme based on the style of the same name from pastie.caboo.se
 --&gt;
 
&lt;span style='color:#0f69ff; '&gt;-&amp;lt;style-scheme id="cobalt" _name="Cobalt" version="1.0"&gt;&lt;/span&gt;
&lt;span style='color:#0000e6; '&gt;+&amp;lt;style-scheme id="cobalt1" _name="Cobalt1" version="1.0"&gt;&lt;/span&gt;
   &amp;lt;author&gt;Will Farrington&amp;lt;/author&gt;
   &amp;lt;_description&gt;Blue based color scheme&amp;lt;/_description&gt;
 
&lt;span style='color:#e34adc; '&gt;@@ -47,6 +47,7 @@&lt;/span&gt;
   &amp;lt;color name="dark_red"                    value="#&lt;span style='color:#008c00; '&gt;990000&lt;/span&gt;"/&gt;
   &amp;lt;color name="bluish_grey"                 value="#&lt;span style='color:#008c00; '&gt;777777&lt;/span&gt;"/&gt;
   &amp;lt;color name="steelblue&lt;span style='color:#008c00; '&gt;3&lt;/span&gt;"                  value="#&lt;span style='color:#008c00; '&gt;4&lt;/span&gt;f&lt;span style='color:#008c00; '&gt;94&lt;/span&gt;cd"/&gt;
&lt;span style='color:#0000e6; '&gt;+  &amp;lt;color name="gr4"                         value="#444444"/&gt;&lt;/span&gt;
 
   &amp;lt;!-- Global Settings --&gt;
 
&lt;span style='color:#e34adc; '&gt;@@ -58,7 +59,7 @@&lt;/span&gt;
   &amp;lt;style name="draw-spaces"                 foreground="bluish_grey"/&gt;
   
   &amp;lt;!-- Bracket Matching --&gt;
&lt;span style='color:#0f69ff; '&gt;-  &amp;lt;style name="bracket-match"               background="steelblue3"/&gt;&lt;/span&gt;
&lt;span style='color:#0000e6; '&gt;+  &amp;lt;style name="bracket-match"               background="gr4"/&gt;&lt;/span&gt;
   &amp;lt;style name="bracket-mismatch"            background="dark_red" bold="true"/&gt;
   
   &amp;lt;!-- Search Matching --&gt;
&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;
Для стиля Oblivion поступаем аналогично.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1408129172220183524-2003093285372271375?l=make-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://make-linux.blogspot.com/feeds/2003093285372271375/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://make-linux.blogspot.com/2011/04/gedit_17.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/2003093285372271375?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/2003093285372271375?v=2" /><link rel="alternate" type="text/html" href="http://make-linux.blogspot.com/2011/04/gedit_17.html" title="Тюнинг стилей gedit: делаем цвет подсветки скобок более адекватным" /><author><name>geekless</name><uri>http://www.blogger.com/profile/06009713622902465243</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/-CdzHefJdI2I/TigQ4umBRhI/AAAAAAAAAWI/uofyt-6PYA0/s220/51830--919357393.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUQESXc8fyp7ImA9WhRVFk0.&quot;"><id>tag:blogger.com,1999:blog-1408129172220183524.post-6633762259490245712</id><published>2011-04-14T09:00:00.000-07:00</published><updated>2012-01-14T22:01:48.977-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-14T22:01:48.977-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="zsh" /><category scheme="http://www.blogger.com/atom/ns#" term="Советы" /><category scheme="http://www.blogger.com/atom/ns#" term="bash" /><category scheme="http://www.blogger.com/atom/ns#" term="работа в консоли" /><category scheme="http://www.blogger.com/atom/ns#" term="настройка" /><category scheme="http://www.blogger.com/atom/ns#" term="tcsh" /><title>Отключить писк системного динамика</title><content type="html">По умолчанию мерзкий писк динамика с системном блоке сопровождает каждое «неверное движение» в bash и некоторых других приложениях. Отключить звуки системного динамика можно несколькими способами:&lt;br /&gt;
&lt;br /&gt;
Установить длительность сигнала равной нулю:&lt;br /&gt;
&lt;blockquote class='code'&gt;setterm -blength 0&lt;/blockquote&gt;Отключить «писк» в файле конфигурации библиотеки &lt;code&gt;Readline&lt;/code&gt;:&lt;br /&gt;
&lt;blockquote class='code'&gt;echo 'set bell-style none' &amp;gt;&amp;gt; ~/.inputrc&lt;/blockquote&gt;Отключить писк в утилите GNU &lt;code&gt;screen&lt;/code&gt;:&lt;br /&gt;
&lt;blockquote class='code'&gt;echo vbell on &amp;gt;&amp;gt; ~/.screenrc&lt;/blockquote&gt;В &lt;code&gt;zsh&lt;/code&gt; настройки писка задаются переменной окружения &lt;code&gt;ZBEEP&lt;/code&gt; и опциями &lt;code&gt;BEEP&lt;/code&gt;, &lt;code&gt;HIST_BEEP&lt;/code&gt; и &lt;code&gt;LIST_BEEP&lt;/code&gt;.&lt;br /&gt;
&lt;br /&gt;
В &lt;code&gt;tcsh&lt;/code&gt;:&lt;br /&gt;
&lt;blockquote class='code'&gt;set nobeep&lt;br /&gt;
set visiblebell&lt;/blockquote&gt;Отключить звуковую индикацию в Иксах:&lt;br /&gt;
&lt;blockquote class='code'&gt;xset b off&lt;/blockquote&gt;Выгрузить драйвер ядра, отвечающий за вывод звука на системный динамик и занести его в черный список:&lt;br /&gt;
&lt;blockquote class='code'&gt;modprobe -r pcspkr&lt;br /&gt;
echo "blacklist pcspkr" &amp;gt;&amp;gt; /etc/modprobe.d/blacklist&lt;/blockquote&gt;&lt;br /&gt;
Также можно просто задать другую тональность и длительность звучания, менее противную, чем по умолчанию. Например так:&lt;br /&gt;
&lt;blockquote class='code'&gt;/bin/echo -e "\33[10;25]\33[11;10]"&lt;/blockquote&gt;Или так:&lt;br /&gt;
&lt;blockquote class='code'&gt;xset b 10 100 50&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1408129172220183524-6633762259490245712?l=make-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://make-linux.blogspot.com/feeds/6633762259490245712/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://make-linux.blogspot.com/2011/04/blog-post_14.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/6633762259490245712?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/6633762259490245712?v=2" /><link rel="alternate" type="text/html" href="http://make-linux.blogspot.com/2011/04/blog-post_14.html" title="Отключить писк системного динамика" /><author><name>geekless</name><uri>http://www.blogger.com/profile/06009713622902465243</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/-CdzHefJdI2I/TigQ4umBRhI/AAAAAAAAAWI/uofyt-6PYA0/s220/51830--919357393.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUQESXc8cCp7ImA9WhRVFk0.&quot;"><id>tag:blogger.com,1999:blog-1408129172220183524.post-8835267156668265959</id><published>2011-04-14T04:55:00.000-07:00</published><updated>2012-01-14T22:01:48.978-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-14T22:01:48.978-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="gedit" /><category scheme="http://www.blogger.com/atom/ns#" term="Советы" /><category scheme="http://www.blogger.com/atom/ns#" term="хоткеи" /><category scheme="http://www.blogger.com/atom/ns#" term="gnome" /><category scheme="http://www.blogger.com/atom/ns#" term="настройка" /><title>Настраиваем в gedit хоткеи для переключения вкладок (да и вообще любые хоткеи)</title><content type="html">Приложений, в которых мне постоянно приходится пользоваться вкладками, ровно три: эмулятор терминала, текстовый редактор (&lt;code&gt;gedit&lt;/code&gt;) и браузер. В эмуляторе терминала переключение между вкладками у меня настроено на сочетания Alt-F1...Alt-F12 и на Alt-Влево, Alt-Вправо — т.е. так же, как привычно всем, кто работал с виртуальными консолями. &lt;code&gt;Gedit&lt;/code&gt; же по умолчанию переключает вкладки через Alt-1...Alt-0 и пальцеломающее сочетание Ctrl-Alt-PgUp и Ctrl-Alt-PgDown — что приводило к тому, что я между этими вариантами путался.&lt;br /&gt;
&lt;br /&gt;
Штатной возможности переназначить хоткеи у &lt;code&gt;gedit&lt;/code&gt; нет, поэтому долгое время мне было лень его настраивать. Но сегодня здравый смысл взял вверх, и погуглив, я нашел плагин &lt;a href="http://empty.23inch.de/pmwiki.php/Main/EditShortcuts"&gt;EditShortcuts&lt;/a&gt;, решающий именно эту задачу.&lt;br /&gt;
&lt;br /&gt;
Плагин представляет собой простой скрипт на Питоне, не требущий сборки и установки. Просто распаковываем &lt;code&gt;editshortcut/&lt;/code&gt; и &lt;code&gt;editshortcut.gedit-plugin&lt;/code&gt; из архива в &lt;code&gt;~/.gnome2/gedit/plugins&lt;/code&gt; и активируем плагин в списке подключаемых модулей редактора, после чего в меню Сервис появится пункт для вызова диалога настроек горячих клавиш.&lt;br /&gt;
&lt;br /&gt;
Чтобы назначить хоткеи на конкретные вкладки, откройте нужное число вкладок (иначе нужные пункты для хоткеев не появятся), затем в диалоге &lt;code&gt;Edit Sortcuts&lt;/code&gt; в раскрывающемся списке &lt;code&gt;DocumentsListActions&lt;/code&gt; назначьте нужные хоткеи пунктам &lt;code&gt;Tab_0&lt;/code&gt;, &lt;code&gt;Tab_1&lt;/code&gt; и так далее. (Даблклик по пункту, чтобы перейти к вводу хоткея.)&lt;br /&gt;
&lt;br /&gt;
Хоткеи на листание вкладок вперед/назад аналогично назначаются пунктам &lt;code&gt;DocumentsNextDocument&lt;/code&gt; и &lt;code&gt;DocumentsPreviousDocument&lt;/code&gt; в списке &lt;code&gt;GeditWindowActions&lt;/code&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-oNX0cDqAh5U/TabffNGbYVI/AAAAAAAAAVc/d42PtIT3kqY/s1600/gedit-tab-shortcuts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="256" src="http://2.bp.blogspot.com/-oNX0cDqAh5U/TabffNGbYVI/AAAAAAAAAVc/d42PtIT3kqY/s320/gedit-tab-shortcuts.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-KJFUNKrTd0k/TabgM6qO06I/AAAAAAAAAVg/gX6pD2onpkI/s1600/gedit-hotkeys.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="256" src="http://1.bp.blogspot.com/-KJFUNKrTd0k/TabgM6qO06I/AAAAAAAAAVg/gX6pD2onpkI/s320/gedit-hotkeys.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1408129172220183524-8835267156668265959?l=make-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://make-linux.blogspot.com/feeds/8835267156668265959/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://make-linux.blogspot.com/2011/04/gedit.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/8835267156668265959?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/8835267156668265959?v=2" /><link rel="alternate" type="text/html" href="http://make-linux.blogspot.com/2011/04/gedit.html" title="Настраиваем в gedit хоткеи для переключения вкладок (да и вообще любые хоткеи)" /><author><name>geekless</name><uri>http://www.blogger.com/profile/06009713622902465243</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/-CdzHefJdI2I/TigQ4umBRhI/AAAAAAAAAWI/uofyt-6PYA0/s220/51830--919357393.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-oNX0cDqAh5U/TabffNGbYVI/AAAAAAAAAVc/d42PtIT3kqY/s72-c/gedit-tab-shortcuts.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUQESXc8cSp7ImA9WhRVFk0.&quot;"><id>tag:blogger.com,1999:blog-1408129172220183524.post-334770428760136842</id><published>2011-04-09T23:32:00.000-07:00</published><updated>2012-01-14T22:01:48.979-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-14T22:01:48.979-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Советы" /><category scheme="http://www.blogger.com/atom/ns#" term="bash" /><category scheme="http://www.blogger.com/atom/ns#" term="работа в консоли" /><category scheme="http://www.blogger.com/atom/ns#" term="скриптинг" /><title>Маска для dot-файлов.</title><content type="html">Правильная маска для захвата всех .*-файлов, кроме . и ..&lt;br /&gt;
&lt;blockquote class='code'&gt;$ echo .[^.]*&lt;/blockquote&gt;Для захвата только .*-каталогов:&lt;br /&gt;
&lt;blockquote class='code'&gt;$ echo .[^.]*/&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1408129172220183524-334770428760136842?l=make-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://make-linux.blogspot.com/feeds/334770428760136842/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://make-linux.blogspot.com/2011/04/dot.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/334770428760136842?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/334770428760136842?v=2" /><link rel="alternate" type="text/html" href="http://make-linux.blogspot.com/2011/04/dot.html" title="Маска для dot-файлов." /><author><name>geekless</name><uri>http://www.blogger.com/profile/06009713622902465243</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/-CdzHefJdI2I/TigQ4umBRhI/AAAAAAAAAWI/uofyt-6PYA0/s220/51830--919357393.png" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0cEQX8yeSp7ImA9WhZREko.&quot;"><id>tag:blogger.com,1999:blog-1408129172220183524.post-464287002073365492</id><published>2011-04-08T09:10:00.000-07:00</published><updated>2011-04-08T09:10:00.191-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-08T09:10:00.191-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ъ-ссылки" /><title>«Читай код»</title><content type="html">&lt;a href="http://gaperton.livejournal.com/32772.html"&gt;[...] Каких-либо иллюзий на свой счет, меж тем, к тому моменту у меня уже не осталось – я понял, что цена всем моим знаниям, университетскому образованию, и опыту – ломаный грош. Меня поражал простой факт – я был объективно образован в Computer Science гораздо лучше Тола, и _знал_ больше. При этом, и, после некоторого опыта работы, я был в этом абсолютно уверен – я бы не смог спроектировать и реализовать такую систему за год, как это десять лет назад с одним помощником сделал Тол. Сложность системы явно превосходила мои возможности - я бы по ходу работы закопался в деталях. И уж тем более, у меня не получилось сделать систему так гибко, чтобы она прожила 10 лет, и была до сих пор адекватна ситуации.&lt;br /&gt;
&lt;br /&gt;
То есть, до меня начало доходить, что есть нечто очень важное, что совершенно перпендикулярно университетскому образованию, чего нас просто не учили даже замечать. Оно перпендикулярно «дизайн-паттернам» и книгам по ОО проектированию. И оно, это нечто, у Тола есть, а у меня – нет. Если мои знания не могут мне помочь сделать такую систему – то много ли они стоят? Понимание и знание требуется для действия, ни для чего другого – это не китайская декоративная ваза.&lt;br /&gt;
&lt;br /&gt;
С этого момента я начал внимательно наблюдать за Толом, изучать его решения и подход, и твердо решил разобраться, что же это такое за неуловимая штука, которой я не понимаю. То есть, я «записался в ученики», и Тол с удовольствием взял роль наставника. И за несколько лет Тол сделал меня инженером, показав мне на практике, что это такое, и за что я ему буду всегда благодарен. [...] &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1408129172220183524-464287002073365492?l=make-linux.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://make-linux.blogspot.com/feeds/464287002073365492/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://make-linux.blogspot.com/2011/04/blog-post.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/464287002073365492?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1408129172220183524/posts/default/464287002073365492?v=2" /><link rel="alternate" type="text/html" href="http://make-linux.blogspot.com/2011/04/blog-post.html" title="«Читай код»" /><author><name>geekless</name><uri>http://www.blogger.com/profile/06009713622902465243</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/-CdzHefJdI2I/TigQ4umBRhI/AAAAAAAAAWI/uofyt-6PYA0/s220/51830--919357393.png" /></author><thr:total>0</thr:total></entry></feed>

