<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
    <title>adf.xyz</title>
    <link rel="self" type="application/atom+xml" href="https://adf.xyz/ru/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://adf.xyz"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2019-01-10T00:43:00+00:00</updated>
    <id>https://adf.xyz/ru/atom.xml</id>
    <entry xml:lang="ru">
        <title>ADF Plays</title>
        <published>2019-01-10T00:43:00+00:00</published>
        <updated>2019-01-10T00:43:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/adf-plays/"/>
        <id>https://adf.xyz/ru/blog/adf-plays/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/adf-plays/">&lt;p&gt;Чуть больше года назад я начал выкладывать на YouTube прохождения старых досовских игр. Это те игры, в которые я играл
в детстве, но не прошол до конца, а также те, в которые и сегодня просто приятно поиграть. Для этого я завел специальный
канал, он называется &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;channel&#x2F;UC0Da0WQfXsw1Pj5HWhxYhyg&quot;&gt;ADF Plays&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Сначала я проходил игры в формате стримов и просто публиковал запись, которую делал YouTube. Из-за этого качество
некоторых видео получилось так себе. Еще мне потребовалось какое-то время, чтобы разобраться, как правильно
настроить звук: выставить уровни, задавить шум и т.п. Я даже микрофон специально для этого прикупил:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;adf-plays&#x2F;blue-yeti.jpg&quot; alt=&quot;Микрофон Blue Yeti&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;Микрофон Blue Yeti — автор фотографии &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.flickr.com&#x2F;photos&#x2F;156466858@N02&#x2F;&quot;&gt;Gavin Whitner&lt;&#x2F;a&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Сейчас я перестал делать стримы в прямом эфире и сначала записываю геймплей, а потом уже выкладываю. Поэтому
картинка стала получше и смотреть не так больно.&lt;&#x2F;p&gt;
&lt;p&gt;В идеале под эти видео должно быть хорошо засыпать.&lt;&#x2F;p&gt;
&lt;p&gt;Сейчас готовы к просмотру следующих игр:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;playlist?list=PLvIPOGcBUH-T5-qq_Ll7ZNbVZhltRK-cP&quot;&gt;Lands of Lore: The Throne of Chaos (1993)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;playlist?list=PLvIPOGcBUH-Rt51d4hancBYI96Txx3REP&quot;&gt;Pizza Tycoon (1994)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;playlist?list=PLvIPOGcBUH-RJZM6QimXKA0UizkR4255i&quot;&gt;DreamWeb (1994)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;playlist?list=PLvIPOGcBUH-SnSd9GtwNxtZKfXJHMzA6o&quot;&gt;Master of Magic (1994)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;playlist?list=PLvIPOGcBUH-SvFcrYzbnR1BqcKrov6dxI&quot;&gt;Flashback: The Quest for Identity  (1993)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;В данный момент прохожу Strife Veteran Edition, переиздание игры 1996 года в HD. Выложил
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;playlist?list=PLvIPOGcBUH-SvFcrYzbnR1BqcKrov6dxI&quot;&gt;два эпизода&lt;&#x2F;a&gt;, остальные на подходе.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>О пермишенах в Django</title>
        <published>2018-03-17T14:08:00+00:00</published>
        <updated>2018-03-17T14:08:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/django-rules/"/>
        <id>https://adf.xyz/ru/blog/django-rules/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/django-rules/">&lt;p&gt;Дисклеймер: этот пост не про встроенную в Django систему пермишенов (модель &lt;code&gt;auth.Permission&lt;&#x2F;code&gt;), она ущербная и предназначена только для управления админкой.&lt;&#x2F;p&gt;
&lt;p&gt;Один из вопросов, которые я всегда задаю на собеседовании, посвящён управлению пермишенами в Django. Я не спрашиваю об этом напрямую, а даю задачу, в которой надо использовать пермишены, и смотрю, как человек справляется. Вот эта задача:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Сделать движок для коллективного ведения блога. Залогиненный пользователь может добавлять записи в блог. Редактировать или удалить запись может её автор или суперюзер.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Решение кандидата, обычно, выглядит примерно так:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;class&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; AddPostView&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;...&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;    def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; dispatch&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function&quot;&gt;self&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function&quot;&gt; request&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; *&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function&quot;&gt;args&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; **&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function&quot;&gt;kwargs&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; not&lt;&#x2F;span&gt;&lt;span&gt; request&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;is_authenticated&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;            return&lt;&#x2F;span&gt;&lt;span&gt; django&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;http&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;HttpResponseForbidden&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span class=&quot;z-support&quot;&gt; super&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;...&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;class&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; EditPostView&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;...&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;    def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; dispatch&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function&quot;&gt;self&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function&quot;&gt; request&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; *&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function&quot;&gt;args&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; **&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function&quot;&gt;kwargs&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant&quot;&gt;        ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; not&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            request&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;user&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;is_authenticated&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; or&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            request&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;user&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;is_superuser&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; or&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            request&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;user&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language&quot;&gt; self&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;object&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;author&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        )&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;            return&lt;&#x2F;span&gt;&lt;span&gt; django&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;http&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;HttpResponseForbidden&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span class=&quot;z-support&quot;&gt; super&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;...&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Возможны также варианты с использованием &lt;code&gt;LoginRequiredMixin&lt;&#x2F;code&gt; или декоратора &lt;code&gt;login_required&lt;&#x2F;code&gt;, но сути дела это не меняет.&lt;&#x2F;p&gt;
&lt;p&gt;Ещё надо проверить пермишены в шаблоне, чтобы определить, надо ли показывать кнопку для редактирования записи:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{% if request.user.is_authenticated or request.user.is_superuser or request.user == post.author %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;a href=&amp;quot;...&amp;quot;&amp;gt;Edit&amp;lt;&#x2F;a&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{% endif %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Допустим, что мы захотели добавить новую фичу: в первый день каждого месяца дать возможность всем пользователям (даже анонимным) редактировать любую запись в блоге. Для этого надо просто добавить одну строку во вьюху, так?&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;if&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; not&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    datetime&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;date&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;today&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;day&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; or&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    request&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;user&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;is_authenticated&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; or&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    request&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;user&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;is_superuser&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; or&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    request&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;user&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language&quot;&gt; self&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;object&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;author&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant&quot;&gt;    ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Добавили, всё классно. А потом приходит багрепорт, что кнопка редактирования не отображается в первый день месяца как положено, потому что мы забыли обновить шаблон.&lt;&#x2F;p&gt;
&lt;p&gt;Этот пример показывает существенный изъян такого подхода: у нас есть один и тот же набор правил, который надо поддерживать актуальным как минимум в двух местах. А если эти правила будут более сложными, то реализовать их в шаблонах может быть просто невозможно.&lt;&#x2F;p&gt;
&lt;p&gt;Решение у этой проблемы очень простое: проверка пермишенов должна быть выделена в отдельный компонент, к которому другие компоненты будут обращаться по мере необходимости.&lt;&#x2F;p&gt;
&lt;p&gt;Специально для этого есть отличная библиотека &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dfunckt&#x2F;django-rules&quot;&gt;rules&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Перепишем наш пример с использованием этой библиотеки. Сначала надо задекларировать наш набор правил:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; apps&#x2F;blog&#x2F;rules.py&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;from&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-variable&quot;&gt; __future__&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; import&lt;&#x2F;span&gt;&lt;span&gt; absolute_import&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;import&lt;&#x2F;span&gt;&lt;span&gt; rules&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;import&lt;&#x2F;span&gt;&lt;span&gt; datetime&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;@&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;rules&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;predicate&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; is_first_day_in_month&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span&gt; datetime&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;date&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;today&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;day&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;@&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;rules&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;predicate&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; is_author&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function&quot;&gt;user&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function&quot;&gt; obj&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span&gt; obj&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;author&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span&gt; user&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;rules&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;add_perm&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;blog.add_post&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; rules&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;is_authenticated&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;rules&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;add_perm&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;blog.edit_post&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; is_first_day_in_month&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; |&lt;&#x2F;span&gt;&lt;span&gt; rules&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;is_superuser&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; |&lt;&#x2F;span&gt;&lt;span&gt; is_author&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;потом подправить вьюхи:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; apps&#x2F;blog&#x2F;views.py&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; rules&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;contrib&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;views&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; import&lt;&#x2F;span&gt;&lt;span&gt; PermissionRequiredMixin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;class&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; AddPostView&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;PermissionRequiredMixin&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; ...&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    permission_required&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;blog.add_post&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;class&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; AddPostView&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;PermissionRequiredMixin&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; ...&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    permission_required&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;blog.edit_post&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;и шаблон:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{% load rules %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{% has_perm &amp;quot;blog.edit_post&amp;quot; request.user post as can_edit %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{% if can_edit %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;a href=&amp;quot;...&amp;quot;&amp;gt;Edit&amp;lt;&#x2F;a&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{% endif %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Чтобы всё это заработало, надо добавить &lt;code&gt;rules&lt;&#x2F;code&gt; в &lt;code&gt;INSTALLED_APPS&lt;&#x2F;code&gt; и &lt;code&gt;rules.permissions.ObjectPermissionBackend&lt;&#x2F;code&gt; в &lt;code&gt;AUTHENTICATION_BACKENDS&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;В заключение хочу добавить, что в моём текущем проекте мы не используем именованные пермишены типа &lt;code&gt;blog.edit_post&lt;&#x2F;code&gt;. Вместо этого мы определяем ещё один предикат:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;can_edit_post&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; is_first_day_in_month&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; |&lt;&#x2F;span&gt;&lt;span&gt; rules&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;is_superuser&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; |&lt;&#x2F;span&gt;&lt;span&gt; is_author&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;и напрямую вызываем его там, где надо проверить пермишен:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt; can_edit_post&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;user&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; post&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant&quot;&gt;    ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Как «очистить» память на Маке </title>
        <published>2011-12-29T11:34:00+00:00</published>
        <updated>2011-12-29T11:34:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/kak-ochistit-pamyat-na-make/"/>
        <id>https://adf.xyz/ru/blog/kak-ochistit-pamyat-na-make/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/kak-ochistit-pamyat-na-make/">&lt;p&gt;«Очистить» память на Маке очень просто. Надо открыть терминал, набрать команду &lt;code&gt;purge&lt;&#x2F;code&gt; и нажать Enter. Всё. Никакие дополнительные программы за $0.99 из App Store для этого не нужны.&lt;&#x2F;p&gt;
&lt;p&gt;Для любопытных поясню, как это работает и для чего это нужно. Если вы откроете программу «Мониторинг системы», то увидите такую картину:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;kak-ochistit-pamyat-na-make&#x2F;sysmon.png&quot; alt=&quot;sysmon&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Обратите внимание на пункт «Неактивная память» (выделен синим цветом). Эта память, которая была занята каким-то ранее запущенным приложением. Если вы запустите это приложение снова, то, теоретически, оно запустится быстрее, если связанная с ним неактивная память не была занята другими программами. В реальной жизни я не вижу в этом особых преимуществ.&lt;&#x2F;p&gt;
&lt;p&gt;Напротив, если у вас не хватает свободной памяти и при этом есть куча неактивной, то система начинает активно использовать своп, а это приводит к конкретным тормозам. Поэтому я регулярно очищаю память упомянутой выше командой.&lt;&#x2F;p&gt;
&lt;p&gt;Чтобы не запускать каждый раз терминал, я сделал &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;cl.ly&#x2F;3i0c363F0Y0z121T3g3x&quot;&gt;расширение&lt;&#x2F;a&gt; для &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.alfredapp.com&#x2F;&quot;&gt;Alfred&lt;&#x2F;a&gt;, которое делает всё за меня.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Обновлено:&lt;&#x2F;strong&gt; Судя по всему, для использования утилиты &lt;code&gt;purge&lt;&#x2F;code&gt; у вас должен быть установлен Xcode. В качестве альтернативы в интернетах предлагают установить &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.titanium-software.fr&#x2F;en&#x2F;onyx.html&quot;&gt;OnyX&lt;&#x2F;a&gt;, но этот способ я не проверял.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Как поменять значения кнопок на клавиатуре (на Маке)</title>
        <published>2011-12-24T08:54:00+00:00</published>
        <updated>2011-12-24T08:54:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/kak-pomenyat-znacheniya-knopok-na-klaviatura-na-ma/"/>
        <id>https://adf.xyz/ru/blog/kak-pomenyat-znacheniya-knopok-na-klaviatura-na-ma/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/kak-pomenyat-znacheniya-knopok-na-klaviatura-na-ma/">&lt;p&gt;Когда у меня была писишная клавиатура, я активно пользовался цифровым блоком, который расположен справа. Но не для набора цифр, а для перемещения по тексту туда-сюда с помощью стрелок и кнопок Home&#x2F;End и PgUp&#x2F;PgDown. Ещё там были кнопки Enter и Del, так что можно было выполнять кучу разных действий, вообще не перемещая руку .&lt;&#x2F;p&gt;
&lt;p&gt;Для мака я специально купил полноразмерную клавиатуру с цифровым блоком, но обнаружил, что там есть только цифры. Никаких стрелок и всего остального.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;kak-pomenyat-znacheniya-knopok-na-klaviatura-na-ma&#x2F;Apple20Aluminium20ISO20International20English.png&quot; alt=&quot;Apple20Aluminium20ISO20International20English&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Целый год я бился, чтобы найти способ поменять значения этих кнопок и, наконец-то, нашёл его.&lt;&#x2F;p&gt;
&lt;p&gt;Способ этот называется &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20110728184125&#x2F;http:&#x2F;&#x2F;pqrs.org&#x2F;macosx&#x2F;keyremap4macbook&#x2F;index.html&quot;&gt;KeyRemap4MacBook&lt;&#x2F;a&gt; (пусть название вас не смущает, эта программа работает со всеми маками, а не только с макбуками). Сайт программы выглядит очень красноглазо – как раз то, что мне надо!&lt;&#x2F;p&gt;
&lt;p&gt;Так выглядят окно настроек этой программки:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;kak-pomenyat-znacheniya-knopok-na-klaviatura-na-ma&#x2F;keyremap.png&quot; alt=&quot;keyremap&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Кнопка «Reload XML», упоминания Emacs и X11 сразу выдают в ней продукт, написанный программистом для программистов, а значит для меня. На скриншоте видна куча предустановок, которые можно включать и выключать галочками. Кроме этого, можно создавать свои собственные настройки, которые описываются в специальном файле &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20120505032702&#x2F;http:&#x2F;&#x2F;pqrs.org&#x2F;macosx&#x2F;keyremap4macbook&#x2F;xml.html&quot;&gt;private.xml&lt;&#x2F;a&gt;. С помощью этого файла можно переназначить вообще все кнопки.&lt;&#x2F;p&gt;
&lt;p&gt;Формат этого файла достаточно простой. Значения кнопок в нём обозначаются специальными &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;pqrs-org&#x2F;Karabiner-archived&#x2F;blob&#x2F;master&#x2F;src&#x2F;bridge&#x2F;generator&#x2F;keycode&#x2F;data&#x2F;KeyCode.data&quot;&gt;ключевыми словами&lt;&#x2F;a&gt;, либо цифровыми кодами. Для того, чтобы узнать цифровой код конкретной кнопки, в составе программы есть утилита EventViewer (вызывается через значок программы в панели меню). Эта утилита отображает код кнопки, которую вы нажимаете в данный момент. Причём код отображается в шестнадцатеричном виде, который вам придётся самостоятельно перевести в десятичный. Ну разве не прелесть?&lt;&#x2F;p&gt;
&lt;p&gt;Ниже приведён мой файл &lt;code&gt;private.xml&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;?&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;xml&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; version&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;1.0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;?&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;root&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;item&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;Fix Numpad&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;identifier&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;fixnumpad&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;identifier&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;      &amp;lt;!--&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Стрелки и кнопки Home,End,PgUp,PgDown &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;--&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;--KeyToKey-- KeyCode::KEYPAD_1, KeyCode::END&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;--KeyToKey-- KeyCode::KEYPAD_2, KeyCode::CURSOR_DOWN&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;--KeyToKey-- KeyCode::KEYPAD_3, KeyCode::PAGEDOWN&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;--KeyToKey-- KeyCode::KEYPAD_4, KeyCode::CURSOR_LEFT&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;--KeyToKey-- KeyCode::KEYPAD_6, KeyCode::CURSOR_RIGHT&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;--KeyToKey-- KeyCode::KEYPAD_7, KeyCode::HOME&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;--KeyToKey-- KeyCode::KEYPAD_8, KeyCode::CURSOR_UP&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;--KeyToKey-- KeyCode::KEYPAD_9, KeyCode::PAGEUP&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;      &amp;lt;!--&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Точка на цифровом блоке работает как Del &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;--&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;--KeyToKey-- KeyCode::KEYPAD_DOT, KeyCode::FORWARD_DELETE&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;      &amp;lt;!--&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Сочетание Shift+0 на цифровом блоке работает как Command+V &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;--&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;--KeyToKey-- KeyCode::KEYPAD_0, ModifierFlag::SHIFT_L,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                            KeyCode::V, ModifierFlag::COMMAND_L&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;autogen&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;item&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;root&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Как видите, различные модификаторы типа &lt;code&gt;Shift&lt;&#x2F;code&gt;, &lt;code&gt;Control&lt;&#x2F;code&gt; или &lt;code&gt;Command&lt;&#x2F;code&gt; тоже поддерживаются.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Об освобождении Навального</title>
        <published>2011-12-20T22:56:51+00:00</published>
        <updated>2011-12-20T22:56:51+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/ob-osvobozhdenii-navalnogo/"/>
        <id>https://adf.xyz/ru/blog/ob-osvobozhdenii-navalnogo/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/ob-osvobozhdenii-navalnogo/">&lt;p&gt;Высказывания на политические темы я обычно делаю в &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;#!&#x2F;a_fedoseev&quot;&gt;Твиттере&lt;&#x2F;a&gt;, но тут вопрос серьёзный и в 140 символов не влезет.&lt;&#x2F;p&gt;
&lt;p&gt;Сегодня ночью освободили Алексея Навального. Мне из Челябинска плохо видно, что там на самом деле происходит, но, судя по &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;devo4ka-e.livejournal.com&#x2F;8805.html&quot;&gt;этому посту&lt;&#x2F;a&gt;, чуть раньше в этот же день освободили и других людей, задержанных вместе с ним.&lt;&#x2F;p&gt;
&lt;p&gt;Я не знаю имён этих людей. Никто их не знает. Но они являются такими же политзаключёнными, как и Алексей. То, что у них нет ста тысяч фолловеров, не делает их задержание и освобождение менее значимым, чем освобождение Алексея.&lt;&#x2F;p&gt;
&lt;p&gt;Однако, я не вижу всеобщего ликования по поводу их освобождения. А по поводу Навального вижу. Вот, например, Леонид Волков &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;twitter.com&#x2F;leonidvolkov&#x2F;status&#x2F;149254026544951296&quot;&gt;пишет&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Доброе утро! На Урале - пятый час утра, мчусь в героически встречающую Навального столицу.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;И &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;twitter.com&#x2F;leonidvolkov&#x2F;status&#x2F;149280471115759616&quot;&gt;ещё&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Радуюсь беспричинно, как будто меня откуда-нибудь выпустили.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Мне кажется (во всяком случае, я на это надеюсь), что Алексей был бы рад, если бы вот так встречали не его, а тех самых простых людей. Если бы такие же простые, незнакомые им люди пришли, и встретили их так, как встретили Навального. Это и есть гражданское общество, в котором главной ценностью являются не лидеры, а обычные люди, помогающие друг другу.&lt;&#x2F;p&gt;
&lt;p&gt;У нас уже есть культ одной личности. Скоро он закончится. Не хочется, чтобы ему смену пришёл культ другой личности, даже если эта личность – Навальный.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Afro Celt Sound System</title>
        <published>2011-10-18T06:04:00+00:00</published>
        <updated>2011-10-18T06:04:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/afro-celt-sound-system/"/>
        <id>https://adf.xyz/ru/blog/afro-celt-sound-system/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/afro-celt-sound-system/">&lt;p&gt;С группой Afro Celt Sound System я «знакомился» несколько раз. Первый раз их композицию я услышал кажется в конце 90-х в эфире радио «Маяк». Из той же передачи я узнал и название группы. Собственно, кроме необычного названия, я ничего про них не запомнил.&lt;&#x2F;p&gt;
&lt;p&gt;При этом я, сам того не зная, каждый день слушал их музыку. Тут нужно пояснить. В 1998 году вышла игра &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ru.wikipedia.org&#x2F;wiki&#x2F;Magic_and_Mayhem&quot;&gt;Magic and Mayhem&lt;&#x2F;a&gt;. Я достаточно много в неё рубился и мне очень нравился саундтрек. Я думаю, что именно тогда у меня зародилась тяга к так называемой «world music». И только лет пять-шесть спустя я узнал, что саундтрек к этой игре написали те самые афрокельты.&lt;&#x2F;p&gt;
&lt;p&gt;Обстоятельно познакомиться с их творчеством мне удалось в 2005 или 2006 году. Одна из их песен оказалась на каком-то сборнике кельтской музыки, который давно лежал у меня в закромах. Вспомнив передачу на «Маяке», я выкачал все их альбомы и не пожалел.&lt;&#x2F;p&gt;
&lt;p&gt;Я не слушаю их помногу, чтобы не приедались. Сейчас наступил один из тех моментов, когда я снова про них вспомнил, ну и решил рассказать вам.&lt;&#x2F;p&gt;
&lt;p&gt;Послушать Afro Celt Sound System можно на &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;music.yandex.ru&#x2F;#!&#x2F;artist&#x2F;90902&quot;&gt;Яндекс.Музыке&lt;&#x2F;a&gt;. Одна из моих любимых композиций — &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;music.yandex.ru&#x2F;#!&#x2F;track&#x2F;452090&#x2F;album&#x2F;46841&quot;&gt;Sure-As-Not&#x2F;Sure-As-Knot&lt;&#x2F;a&gt; (особенно ближе к концу).&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Обновлено:&lt;&#x2F;strong&gt; Нашёл &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;rutracker.org&#x2F;forum&#x2F;viewtopic.php?t=2067212&quot;&gt;саундтрек к Magic &amp;amp; Mayhem&lt;&#x2F;a&gt;. Некоторые композиции взяты из альбома 1996 года, а некоторые вошли в альбом 1999 года, который вышел после выпуска самой игры.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Фотки из Гоа, 2009 год</title>
        <published>2011-10-14T12:39:54+00:00</published>
        <updated>2011-10-14T12:39:54+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/fotki-iz-goa-2009-goa/"/>
        <id>https://adf.xyz/ru/blog/fotki-iz-goa-2009-goa/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/fotki-iz-goa-2009-goa/">&lt;p&gt;Выкладываю фотки из Гоа, где я был в 2009 году. Выкладываю просто так, чтобы было. &lt;del&gt;Ну и чтобы потестить &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20111007022710&#x2F;http:&#x2F;&#x2F;fotoramajs.com&#x2F;&quot;&gt;Фотораму&lt;&#x2F;a&gt;.&lt;&#x2F;del&gt; Заменил Фотораму на PhotoSwipe.&lt;&#x2F;p&gt;
&lt;p&gt;Хронологический порядок может быть нарушен. Подписей нет. Может быть потом появятся.&lt;&#x2F;p&gt;
&lt;div class=&quot;pswp-gallery&quot;&gt;

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image0-2.28982ae1dc37e8a6.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image0-2.65c8166caed35ada.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image10.34410e37bf1abef3.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image10.6c33c5afde2f51f1.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image11-2.fee5123577f8b44c.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image11-2.5214074a1caaf5ec.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image1 (1).c31579ffae1cb665.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image1 (1).4b4c3d2e6c135d41.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image1-2.53d5e600a73ea6eb.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1424&quot;
     data-pswp-height=&quot;2136&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image1-2.6a9a5a995dcbfd17.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image13 (1).8941186d06588e58.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image13 (1).b91357647de1b07d.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image17-3.823fd346feb08063.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image17-3.372a40705150074e.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image18-2.fc8bdd8ef5904f1b.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image18-2.774b0bcba1d8821f.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image20-2.f2e437b865beba25.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image20-2.6758f6ea85403a97.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image21.a3b5c6f80cdc6bdc.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image21.e47cd67f314d635e.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image2-2.5527f18e5ecd872a.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image2-2.ef7ef880e4a61a9e.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image24 (1).a9379d499a7c6d94.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image24 (1).410c5483f00a0dd4.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image27 (1).c91ee7d6fdd3fbcf.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image27 (1).fe360e33f8341585.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image28 (1).5348c414865c6b8e.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image28 (1).27a2b5c035901b80.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image29 (1).d0a5585488428c92.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image29 (1).4c7378c1f7c4f1b4.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image29.33b247a58e91c802.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image29.fe8c8077a4a7164a.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image30.6ea4fc721bbc463f.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image30.c025abdd957867f2.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image31 (1).f407157cb21bec8e.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image31 (1).be35d32350b33d9d.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image31.37c9bbc52fb3207f.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image31.2f1d6562bb71b865.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image33-2.2ef39e2541e947d0.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image33-2.ce0e7b93b30404f0.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image34-2.78890389a1e7bde1.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image34-2.acb16d9e4611de4e.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image36-2.db0211990906c9ff.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image36-2.12c46c4e7f2b0da3.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image41.9f3d576275843166.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1424&quot;
     data-pswp-height=&quot;2136&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image41.65af4749d5ac9b22.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image42-2.f319e1ee41a1e38a.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1424&quot;
     data-pswp-height=&quot;2136&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image42-2.4ddee7786c02f805.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image43-2.ae0b6fe14c24cf82.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image43-2.a76e44ca400f19a3.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image4-3.b7e6b16022133601.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image4-3.5ffff1a2453388d6.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image45-2.5a62b55fb3d76cdd.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image45-2.f353f7e695b10d82.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image46-2.a69272732ecfc445.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image46-2.acafce4ce21274a1.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image57-2.e2eac9b516ab72cb.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image57-2.bfd75d8da87c2e07.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 579.4c686e9dbb5325f5.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 579.2ccec33a9908f5ec.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image58-2.a30f6113646a9236.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image58-2.8217bb0c73e3ca87.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 587.c4fe0d62c0e93827.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 587.c8b086857e0ea236.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 591.b77e584d6718ee3e.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 591.0d4fdbb2b772b1f6.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 595.6ab4293bdddac287.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 595.50f21250b136d83e.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 596.6f4d145a19fb7a26.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 596.07d9795bbb68cc48.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 597.21c4272a7e7aaa78.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 597.b66b182c40a61d06.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 598.1f298a935e52c9b6.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 598.8644a0d95cef5a1a.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 599.7e1f295f0d009fcb.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 599.4c79e5ebaf94ea05.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 600.8ade42bbe43b6170.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 600.87425f023dfd8a8b.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 608.79e9acf99ce07172.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1381&quot;
     data-pswp-height=&quot;2074&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 608.34780330257d55ad.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 609.85fb8b558d024b4a.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 609.82c68c20169765f0.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 612.ae9e769ca1108769.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 612.0f5b30c39a25255d.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 616.241bdaa9c224c357.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1424&quot;
     data-pswp-height=&quot;2136&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 616.a09d464d21f6f0ea.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 618.7b3570b79a46a94c.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 618.82c3b1bee3c58c16.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 621.c5bd16e1149af78a.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 621.9ac037431bffe39d.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 623.22bc3d415c81aa8c.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image 623.d07400efe5037c23.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image63-2.3b4512f0c98d65c8.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image63-2.81ed839a01155f64.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image67-2.66d16c83f25e9f1f.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image67-2.11b861173212f4f9.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image69-2.7e0483908b52f064.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image69-2.c7bf0c8f6c5c3e74.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image70-2.e78bf69e6ed6d9fb.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image70-2.8efd7d3fff4cd204.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image71-2.c1ae2741ade0d5f6.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image71-2.76a076323a425f20.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image7-2.743d1e28d95e3d0e.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image7-2.a609efb98a139494.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image8 (1).bf1738712e689836.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image8 (1).7d4b4d8383f9b178.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image8-2.a313ee64b5655ba4.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image8-2.8fb88dd07c496a8e.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image9.4e2e508b7439ffd1.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1600&quot;
     data-pswp-height=&quot;1066&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;image9.a7e6f2a7964c3e90.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

&lt;&#x2F;div&gt;</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Сниппеты #1</title>
        <published>2011-09-23T08:45:00+00:00</published>
        <updated>2011-09-23T08:45:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/snippets-1/"/>
        <id>https://adf.xyz/ru/blog/snippets-1/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/snippets-1/">&lt;p&gt;Время от времени буду выкладывать небольшие кусочки кода собственного сочинения. Буду рад, если кому-то они пригодятся. И ещё больше рад, если кто-то придумает, как их улучшить. Сегодня таких кусочков будет два.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Номер раз&lt;&#x2F;strong&gt;. Дано: Django и модель с несколькими текстовыми полями. Надо сделать простейший поиск по этим полям. При этом достаточно, чтобы искомый текст содержался хотя бы в одном поле.
И самое интересное — список полей для поиска заранее не определён, он может варьироваться.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; django&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;db&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; import&lt;&#x2F;span&gt;&lt;span&gt; models&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;class&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; MyModel&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;models&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;Model&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    field_1&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; models&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;CharField&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;max_length&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;100&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    field_2&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; models&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;CharField&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;max_length&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;100&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    field_3&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; models&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;CharField&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;max_length&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;100&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Поиск по одному полю сделать просто:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;MyModel&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;objects&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;filter&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;field_1__icontains&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;search_term&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;В случае с несколькими полями их нужно соединить оператором &lt;code&gt;OR&lt;&#x2F;code&gt;. В Django это делается так:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;MyModel&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;objects&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;filter&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    models&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;Q&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;field_1__icontains&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;search_term&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; |&lt;&#x2F;span&gt;&lt;span&gt; models&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;Q&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;field_2__icontains&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;search_term&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;А что делать, если полей много и они заранее не известны? Например, названия полей хранятся в списке:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fields_to_search&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;field_1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;field_2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;field_3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Я сделал вот так:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; operators&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; import&lt;&#x2F;span&gt;&lt;span&gt; or_&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;MyModel&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;objects&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;filter&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable&quot;&gt;    reduce&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;or_&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-support&quot;&gt; map&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        lambda&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function&quot;&gt; f&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; models&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;Q&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;**&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span&gt;f&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;__icontains&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt;search&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        fields_to_search&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    )&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Номер два&lt;&#x2F;strong&gt;. Надо узнать дату первого дня текущей недели. Например, сегодня пятница, 23 сентября 2011 года. В этом случае, какое число было в понедельник?&lt;&#x2F;p&gt;
&lt;p&gt;Я сделал вот так:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;import&lt;&#x2F;span&gt;&lt;span&gt; datetime&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;import&lt;&#x2F;span&gt;&lt;span&gt; calendar&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;today&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; datetime&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;date&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;today&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;cal&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; calendar&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;Calendar&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Или, если неделя начинатеся с воскресенья&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; cal = calendar.Calendar(6)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;week_start_date&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; None&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;  #&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Сюда мы сохраним искомую дату&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;for&lt;&#x2F;span&gt;&lt;span&gt; week&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; in&lt;&#x2F;span&gt;&lt;span&gt; cal&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;monthdatescalendar&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;today&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;year&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; today&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;month&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; today&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; in&lt;&#x2F;span&gt;&lt;span&gt; week&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        week_start_date&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; week&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        break&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Про технику безопасности</title>
        <published>2011-09-12T11:06:32+00:00</published>
        <updated>2011-09-12T11:06:32+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/pro-tehniku-bezopasnosti/"/>
        <id>https://adf.xyz/ru/blog/pro-tehniku-bezopasnosti/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/pro-tehniku-bezopasnosti/">&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;pro-tehniku-bezopasnosti&#x2F;transport-9.jpg&quot; alt=&quot;Люди едут прицепившись к поезду&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Давно у меня зрел пост на эту тему, в частности, про ремни безопасности. И пока он зрел, uncle_chelya уже всё &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20120321010140&#x2F;http:&#x2F;&#x2F;uncle-chelya.livejournal.com&#x2F;355317.html&quot;&gt;написал за меня&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;К этому и добавить-то вроде нечего, но я добавлю.&lt;&#x2F;p&gt;
&lt;p&gt;Менталитет снижения расходов свойственен, как мне кажется, не только русским. В самом желании снизить расходы нет ничего плохого, оно вполне естественно и присуще всем. А клин надо клином вышибать. Штраф за перевозку пассажиров стоя должен быть ощутимо больше выручки за их провоз. Гаишник, выписывающий штраф, должен быть уверен, что за взятку его посадят. Ну и так далее. Главное, чтобы наказание было неотвратимым.&lt;&#x2F;p&gt;
&lt;p&gt;Где-то такая система более-менее работает (уверен, что идеально она не работает нигде). У нас она работает плохо. Но есть места. где всё гораздо хуже, см. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.google.ru&#x2F;search?q=%D0%B8%D0%BD%D0%B4%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B9+%D0%BF%D0%BE%D0%B5%D0%B7%D0%B4&amp;amp;tbm=isch&quot;&gt;КДПВ&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Python: поиск элемента в списке и множестве</title>
        <published>2011-09-02T03:12:14+00:00</published>
        <updated>2011-09-02T03:12:14+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/in-list-vs-set/"/>
        <id>https://adf.xyz/ru/blog/in-list-vs-set/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/in-list-vs-set/">&lt;p&gt;А вы знали, что в Питоне операция &lt;code&gt;in&lt;&#x2F;code&gt; для множеств (&lt;code&gt;set&lt;&#x2F;code&gt;) работает намного быстрее, чем для списков (&lt;code&gt;list&lt;&#x2F;code&gt;)? &lt;em&gt;Да, я слоупок.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Julian Andres Klode приводит &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20120213004245&#x2F;http:&#x2F;&#x2F;juliank.wordpress.com&#x2F;2008&#x2F;04&#x2F;29&#x2F;python-speed-x-in-list-vs-x-in-set&#x2F;&quot;&gt;пример&lt;&#x2F;a&gt; у себя в блоге:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;In [1]: a = range(10**6)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;In [2]: b = set(a)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;In [3]: %timeit 10**6 in a&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;10 loops, best of 3: 31.8 ms per loop&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;In [4]: %timeit 10**6 in b&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;10000000 loops, best of 3: 98.6 ns per loop&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;В случае со списком операция выполняется за 31,8 миллисекунды, а для множества результат составляет 98,6 наносекунд. Нанотехнологии в действии!&lt;&#x2F;p&gt;
&lt;p&gt;От себя добавлю, что в реальной жизни скорее всего придётся конвертировать список в множество, а на это тоже требуется время:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;In [5]: %timeit b = set(a)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;10 loops, best of 3: 60.2 ms per loop&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;В данном случае на преобразование требуется 60,2 мс. Это значит, что использование множества здесь имеет смысл, только если нужно произвести поиск не менее двух раз.&lt;&#x2F;p&gt;
&lt;p&gt;Скорость поиска в списке также зависит от того, какой именно элемент нужно найти. В своём примере Julian рассматривает элемент, который расположен в самом конце.&lt;&#x2F;p&gt;
&lt;p&gt;А что если он расположен в начале?&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;In [6]: %timeit 1 in a&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;10000000 loops, best of 3: 107 ns per loop&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Не сильно отличается от множества.&lt;&#x2F;p&gt;
&lt;p&gt;Но, тем не менее, я всё-таки рекомендую использовать множества, если требуется многократно производить поиск по произвольному списку.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Как контролировать расходы</title>
        <published>2011-08-10T08:55:00+00:00</published>
        <updated>2011-08-10T08:55:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/kak-kontrolirovat-rashodyi/"/>
        <id>https://adf.xyz/ru/blog/kak-kontrolirovat-rashodyi/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/kak-kontrolirovat-rashodyi/">&lt;p&gt;Решил я подкопить деньжат. А чтобы деньги лучше копились, надо меньше их тратить. С этим у меня всегда была проблема — очень часто я импульсивно покупаю всякую фигню, тем более, что финансы позволяют.&lt;&#x2F;p&gt;
&lt;p&gt;Попытки себя ограничивать результата не давали. Поэтому я решил пойти на самообман. А точнее договориться сам с собой. Смысл договора заключается в том, чтобы установить ежемесячный лимит трат и не превышать его. Это позволяет иногда всё-таки покупать фигню, но делать это более разумно.&lt;&#x2F;p&gt;
&lt;p&gt;Важно то, что сумма, оставшаяся с предыдущего месяца переходит на следующий. Таким образом можно копить деньги на дорогую фигню. А ещё есть шанс, что в процессе накопления вообще расхочется её покупать.&lt;&#x2F;p&gt;
&lt;p&gt;Чтобы мониторить расходы есть куча разных программ. Я уже пробовал использовать многие из них и остановился на никакой. Тем более что мне не надо планировать семейный бюджет с учётом выплат по ипотеке, надо просто считать расходы на фигню. Для этого подойдёт обычная таблица.&lt;&#x2F;p&gt;
&lt;p&gt;Вот такая таблица получилась у меня:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;kak-kontrolirovat-rashodyi&#x2F;%D0%A0%D0%B0%D1%81%D1%85%D0%BE%D0%B4%D1%8B_%D0%BD%D0%B0_%D1%84%D0%B8%D0%B3%D0%BD%D1%8E.png&quot; alt=&quot;Расходы на фигню&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Напротив каждого месяца надо вписывать величину установленного лимита, например, 5 000 р. Внизу показана сумма, которую можно потратить прямо сейчас (вычисляется автоматически как сумма всех чисел в колонке). Ну и, соответственно, надо вписывать расходы.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Про мысли, деревья и малограмотных людей</title>
        <published>2011-08-06T10:31:46+00:00</published>
        <updated>2011-08-06T10:31:46+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/pro-myisli-derevya-i-malogramotnyih-lyudej/"/>
        <id>https://adf.xyz/ru/blog/pro-myisli-derevya-i-malogramotnyih-lyudej/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/pro-myisli-derevya-i-malogramotnyih-lyudej/">&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;pro-myisli-derevya-i-malogramotnyih-lyudej&#x2F;thoughts-and-trees.png&quot; alt=&quot;thoughts-and-trees&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Меня разражает, когда кто-нибудь говорит «растекаться мыслью по древу». Я уверен, что человек, произнесший эту фразу, не сможет объяснить её смысл. И я могу его понять, ведь в этой фразе нет никакого смысла.&lt;&#x2F;p&gt;
&lt;p&gt;Откуда же она взялась? Взялась она из школьной программы, а конкретно — из «Слова о полку Игореве».&lt;&#x2F;p&gt;
&lt;p&gt;Вот что говорит по этому поводу &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;ru.wikipedia.org&#x2F;wiki&#x2F;%D0%A1%D0%BB%D0%BE%D0%B2%D0%BE_%D0%BE_%D0%BF%D0%BE%D0%BB%D0%BA%D1%83_%D0%98%D0%B3%D0%BE%D1%80%D0%B5%D0%B2%D0%B5&quot;&gt;Википедия&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Выражение «растѣкашется мыслію по древу, сѣрымъ вълкомъ по земли, шизымъ орломъ подъ облакы» смущало многих исследователей, так как было непонятно, как мысль может двигаться по дереву. В 1833 году Н. А. Полевой предположил, что под «мыслію» имеется в виду какой-нибудь зверь или птица, так как в тексте имеется явная постепенность сравнений: облака, земля, дерево — орёл, волк, мысль. Ряд переводчиков, согласились с ним и заменяли слово «мысль» на «соловей» (Н. Павлов, А. Скульский), «рысь» (Корш) или «бусый горностай» (Андриевский), однако данные замены, по сути, являлись произвольными. В 1854 году Н. П. Корелкин предположил, что фраза «растѣкашеся мыслію по древу» является опиской, в тексте, по его гипотезе, имеется в виду не «мысль», а «мысь». Мысью же, по словам Н. П. Корелкина, в Опочецком уезде Псковской губернии называют белку, или векшу. Соответственно, метафора становится логичной — волк как символ земли, орёл как символ неба, а белка как символ деревьев, связывающих небо с землёю. Большинство исследователей «Слова о полку Игореве» согласились с Корелкиным и в дальнейшем обсуждали лишь какая именно белка имеется в виду и не может ли слово «мысь» означать также, например, «мышь».&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Теперь стало понятнее? Люди аж в 1854 году поняли, что речь тут идёт про белку. Ну или на худой конец про мышь. А в 21 веке выпускники средних школ, многие из которых имеют высшее образование, продолжают нести бред про мысли на деревьях.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Наш народ любит говно?</title>
        <published>2011-08-01T23:02:00+00:00</published>
        <updated>2011-08-01T23:02:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/nash-narod-lyubit-govno/"/>
        <id>https://adf.xyz/ru/blog/nash-narod-lyubit-govno/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/nash-narod-lyubit-govno/">&lt;p&gt;Попался мне сегодня на глаза вот такой ролик:&lt;&#x2F;p&gt;
&lt;iframe
  src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;oWfxNUp7M6o&quot;
  width=&quot;560&quot;
  height=&quot;315&quot;
  title=&quot;YouTube video player&quot;
  frameborder=&quot;0&quot;
  allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
  allowfullscreen&gt;&lt;&#x2F;iframe&gt;
&lt;p&gt;Трио Капитанов Очевидности поёт о том, что наш народ любит всякое говно.&lt;&#x2F;p&gt;
&lt;p&gt;Я считаю, что это утверждение весьма спорно. Ниже я рассмотрю две составляющих этого тезиса: «любит» и «наш».&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Любит&lt;&#x2F;strong&gt;. Любит ли? Любовь, в моём понимании, означает некий осознанный выбор. А есть ли этот выбор у этого самого народа? Вот был я в Геленджике. Там есть набережная, по которой толпы отдыхающих ходят туда-сюда. Вдоль всей набережной стоят ресторанчики и их каждого фигачит какой-то блатняк. А Чайковский или Pink Floyd не фигачит (вру, Pink Floyd был в одном месте). Так есть ли тут выбор? Продажа говна — это srs bzns, поэтому у Радио Шансон нынче есть свой собственный ТВ-канал!&lt;&#x2F;p&gt;
&lt;p&gt;С одной стороны людям насаждают «всякое говно», а другой стороны просто нет. Те же самые ребята из видяшки могли бы заняться просвещением народных масс, но это для них слишком &lt;s&gt;малоприбыльно&lt;&#x2F;s&gt; сложно. Гораздо проще опускать «тупой» народ и производить такое же говно, но подавать его под остросоциальным соусом, тем самым имея профит с «думающих» граждан и относительно чистую совесть.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Наш&lt;&#x2F;strong&gt;. Только &lt;em&gt;наш&lt;&#x2F;em&gt; народ любит говно? А американский не любит? А что насчёт реслинга, фильма «Аватар» и хип-хопа? Я привожу в качестве примера Америку, потому что их массовая культура и образ жизни широко известны. Но я уверен, что и другие народы «любят» то, что им скармливают. А скармливают по большей части именно говно, просто в каждой стране есть свой национальный колорит.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Отдельно нужно сказать про Васю Обломова. Если у Шнура и Noize MC в творческих архивах есть хоть какое-то разнообразие, то у этого персонажа лейтмотивом творчества, судя по всему, является исключительно изобличение любви к говну на Руси. Этот парень хоть чем-то другим отличился?&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Отдельная база данных в Django для каждой ветки git</title>
        <published>2011-07-28T11:27:00+00:00</published>
        <updated>2011-07-28T11:27:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/otdelnaya-baza-dannyih-django-dlya-kazhdoj-vetki-g/"/>
        <id>https://adf.xyz/ru/blog/otdelnaya-baza-dannyih-django-dlya-kazhdoj-vetki-g/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/otdelnaya-baza-dannyih-django-dlya-kazhdoj-vetki-g/">&lt;p&gt;В работе с Django я часто сталкиваюсь с такой ситуацией: создаю ветку, в которой хочу поменять структуру базы, добавить или удалить модели. При этом существует вероятность, что в процессе работы над этой веткой мне понадобится переключиться на другую ветку, которая завязана на другую структуру данных.&lt;&#x2F;p&gt;
&lt;p&gt;Было бы хорошо, чтобы для определённых веток создавались отдельные копии базы и чтобы всё это работало автоматически.&lt;&#x2F;p&gt;
&lt;p&gt;Я написал небольшой сниппет, который позволяет использовать отдельную базу данных для определённых веток git.&lt;&#x2F;p&gt;
&lt;p&gt;Он работает только с PostgreSQL. При этом можно указать ветки, для которых нужно создавать копии. Для всех остальных веток используется дефолтная база. Базы создаются автоматически на основе текущего состояния дефолтной базы.&lt;&#x2F;p&gt;
&lt;p&gt;Всё, что нужно, это добавить следующий код в ваш файл с настройками Django (&lt;code&gt;settings.py&lt;&#x2F;code&gt;):&lt;&#x2F;p&gt;
&lt;script src=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;1111802.js?file=local_settings.py&quot;&gt;&lt;&#x2F;script&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Про Яндекс, megafail и секс-шоп</title>
        <published>2011-07-25T15:54:00+00:00</published>
        <updated>2011-07-25T15:54:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/yandex-megafail-sex-shop/"/>
        <id>https://adf.xyz/ru/blog/yandex-megafail-sex-shop/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/yandex-megafail-sex-shop/">&lt;p&gt;Все уже слышали про &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;lenta.ru&#x2F;news&#x2F;2011&#x2F;07&#x2F;18&#x2F;megafail&#x2F;&quot;&gt;megafail&lt;&#x2F;a&gt;. А теперь вот случился &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;internet.cnews.ru&#x2F;news&#x2F;top&#x2F;yandeks_raskryl_pokupatelej_seksshopov&quot;&gt;секс-шоп-фейл&lt;&#x2F;a&gt;. Это вообще жесть, там даже домашние адреса указаны.&lt;&#x2F;p&gt;
&lt;p&gt;Конечно, создатели сайта, а точнее движка электронного магазина — идиоты. Об этом свидетельствует хотя бы URL, начинающийся с index.php.&lt;&#x2F;p&gt;
&lt;p&gt;Но я считаю, что вина Яндекса тут тоже есть. Яндекс говорит, что мол надо было указывать нужные правила в файле robots.txt. А что такое robots.txt? Это просто некая договорённость. И соблюдать её никто не обязан.&lt;&#x2F;p&gt;
&lt;p&gt;Вот, например, делаю я сайт. Или даже не я, а какой-то ПХПшник. И он не знает про файл robots.txt. А может быть он ночью под одеялом разрабатывает свой альтернативный «стандарт» bots.txt и не использует robots.txt из вредности. Но сути это не меняет. А суть в том, что создавать этот файл он не обязан.&lt;&#x2F;p&gt;
&lt;p&gt;Допустим, что этот ПХПшник решил реализовать некую функцию, которая связана с отображением конфиденциальной информации, но при этом он не хочет делать принудительную авторизацию пользователей (думает об удобстве, ок). На помощь приходят «секретные» ссылки. Эти ссылки содержат в себе некий ключ, который по сути является паролем. Соответственно, доступ к странице может получить только тот, у кого есть эта ссылка. Кстати, «секретные» ссылки используют не только ПХПшники, но даже Гугль! При этом можно сказать, что сама ссылка тоже является конфиденциальной информацией. И поскольку эта информация конфиденциальна, то ПХПшник нигде на сайте её не показывает.&lt;&#x2F;p&gt;
&lt;p&gt;Вернёмся к поиску Яндекса. Яндекс ходит по интернету, загружает страницы, индексирует их и показывает в результатах поиска. Вопрос: откуда он узнаёт адреса страниц? Теоретически он, как и любой другой добросовестный пользовать интернета, должен искать ссылки на уже просмотренных страницах. Об этом, кстати, говорится в «&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;yandex.ru&#x2F;legal&#x2F;termsofuse&#x2F;ru&#x2F;&quot;&gt;Лицензии на использование поисковой системы Яндекса&lt;&#x2F;a&gt;»:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;4.2. Яндекс индексирует открытую часть интернета — те страницы, которые &lt;em&gt;доступны при переходе по ссылке&lt;&#x2F;em&gt;, без ввода логина и пароля, и индексирование которых не запрещено в robots.txt соответствующего сайта.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Размещал ли ПХПшник конфиденциальные ссылки на своём сайте? Может быть он и идиот, но не настолько. Откуда же Яндекс их взял. Говорят, что собрал через скрипт Яндекс.Метрики. Вот, что написано в «Пользовательском соглашение Яндекс.Метрики»:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Яндекс […] не осуществляет никаких целенаправленных действий по сбору, получению, обработке и распространению чьих-либо персональных данных в результате использования Сервиса Пользователем.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Ок, но если URL сам по себе является персональными данными? Я готов смириться с тем, что они их собирают. Но они же их и распространяют, таким образом нарушая собственное соглашение. Буквоеды могут заткнуться насчёт того, что «конфиденциальные» и «персональные» это не одно и то же. В данном случае мне плевать.&lt;&#x2F;p&gt;
&lt;p&gt;Получается, что Яндекс под прикрытием невинного счётчика, распространяет вредоносное ПО, которое собирает и потом распространяет конфиденциальные данные! Я, конечно, утрирую. Я уверен, что Яндекс не осуществлял «никаких целенаправленных действий по сбору, получению, обработке и распространению». Это были нецеленаправленные действия. Короче говоря, оно само.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;small&gt;P.S. Я, в целом, хорошо отношусь к деятельности Яндекса. Но тут они, по-моему, в какашку наступили.&lt;&#x2F;small&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Обновлено&lt;&#x2F;strong&gt;: Вот тут &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20111204001939&#x2F;http:&#x2F;&#x2F;webmaster.ya.ru&#x2F;replies.xml?item_no=10941&quot;&gt;Яндекс&lt;&#x2F;a&gt; рассказывает, что адреса «секретных» ссылок могут быть известны интернет-провайдерам, сотрудникам спецслужб, плагинам браузера.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;[…] теперь можно сказать, что почти весь мировой интернет знает про существование этой ссылки.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;А значит и Яндексу можно их знать и публиковать!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Чего мне не хватает в Google+</title>
        <published>2011-07-11T12:39:00+00:00</published>
        <updated>2011-07-11T12:39:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/chego-mne-ne-hvataet-v-google/"/>
        <id>https://adf.xyz/ru/blog/chego-mne-ne-hvataet-v-google/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/chego-mne-ne-hvataet-v-google/">&lt;p&gt;Вот вам мои пять копеек.&lt;&#x2F;p&gt;
&lt;p&gt;Первое. Нужна возможность указывать своё имя на разных языках. И чтобы поиск по именам искал среди всех доступных вариантов имён. Сейчас в профиле можно указать альтернативное имя, например, девичью фамилию, но, кажется, это ни на что не влияет. Кстати, на Фейсбуке эту фишку недавно реализовали.&lt;&#x2F;p&gt;
&lt;p&gt;Второе. Хочу, чтобы можно было указывать языки, на которых я предпочиатю читать контент. В моём случае это русский и английский. У моих англоязычных фолловеров это будет только английский. Это позволит оградить их от моих записей на русском, а значит они не будут меня игнорить. А может и я начну читать каких-нибудь японцев, которые время от времени пишут на английском. Гугль достаточно умён, чтобы определять, на каком языке написан пост, но на всякий случай можно добавить соответствующий селектор при добавлении новой записи.&lt;&#x2F;p&gt;
&lt;p&gt;Можно сделать и альтернативную реализацию второго пункта. Но для этого нужно ввести возможность ограничения доступа к записи для пересечения кругов. Например, открыть доступ тем, кто находится в круге &lt;em&gt;Заказчики&lt;&#x2F;em&gt; и одновременно в круге &lt;em&gt;English Speakers&lt;&#x2F;em&gt;. Этот способ открывает и другие возможности, но он сильно сложнее для понимания.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Обновлено:&lt;&#x2F;strong&gt; Похоже, что языковые предпочтения уже как-то учитываются, см. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;plus.google.com&#x2F;102062962160740605096&#x2F;posts&#x2F;Gig56dLUBeb&quot;&gt;https:&#x2F;&#x2F;plus.google.com&#x2F;102062962160740605096&#x2F;posts&#x2F;Gig56dLUBeb&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Третье. Во вкладке «Кого ещё добавить» мне показывают список из 125 человек. Кто все эти люди? Кого-то из них я, разумеется, знаю и осознанно не добавляю. А. Лебедева, например. Но про большинство из них мне ничего не известно. На Фейсбуке тоже показывают подобный список, но там сразу видно общих друзей. Надо сделать так же: показывать общих друзей, но ещё добавить общие интересы и всякие другие общие штуки.&lt;&#x2F;p&gt;
&lt;p&gt;Пока всё.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Пара слов про Google+</title>
        <published>2011-07-09T00:18:00+00:00</published>
        <updated>2011-07-09T00:18:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/google-plus/"/>
        <id>https://adf.xyz/ru/blog/google-plus/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/google-plus/">&lt;p&gt;Это круто!&lt;&#x2F;p&gt;
&lt;p&gt;P.S. Я могу отправить вам инвайт на Google+. Для этого оставьте любой комментарий под этой записью. Обязательно укажите свой адрес электронной почты в соответствующем поле. Кроме меня его никто не увидит.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Обновлено&lt;&#x2F;strong&gt;: В данный момент отправление инвайтов отключено. Как только включат обратно — сразу отправлю всем, кто отметился в комментах.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Канатная дорога</title>
        <published>2011-07-03T14:26:00+00:00</published>
        <updated>2011-07-03T14:26:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/kanatnaya-doroga/"/>
        <id>https://adf.xyz/ru/blog/kanatnaya-doroga/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/kanatnaya-doroga/">&lt;p&gt;В Геленджике есть канатная дорога. Даже две. На одной из них я сегодня побывал.&lt;&#x2F;p&gt;

&lt;figure class=&quot;photo&quot;&gt;
  &lt;img src=&quot;5897968908_4283913e08_b.jpg&quot; alt=&quot;Подъём на канатную дорогу&quot;&gt;
  &lt;figcaption&gt;Подъём на канатную дорогу&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;На горе установлена огромная реклама Мегафона. Её видно почти из любой точки города. По ночам она светится и в тумане выглядит очень зловеще.&lt;&#x2F;p&gt;

&lt;figure class=&quot;photo&quot;&gt;
  &lt;img src=&quot;5897969762_a7caf6588f_b.jpg&quot; alt=&quot;Реклама Мегафона на горе&quot;&gt;
  &lt;figcaption&gt;Реклама Мегафона на горе&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;В самом конце подъёма вас принудительно фотографируют и потом предлагают эту фотографию купить.&lt;&#x2F;p&gt;

&lt;figure class=&quot;photo&quot;&gt;
  &lt;img src=&quot;5897405249_d1e92eb102_b.jpg&quot; alt=&quot;Принудительное фотографирование&quot;&gt;
  &lt;figcaption&gt;Принудительное фотографирование&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;На вершине горы есть смотровая площадка с видом на город. Больше всего она запомнилась тем, что там живут кузнечики-каннибалы, гигантский паук и ужасная ядовитая сороконожка. Кузнечики сидят и ждут, когда кого-нибудь из них раздавит посетитель площадки. После этого они накидиваются на труп и сжирают его.&lt;&#x2F;p&gt;

&lt;figure class=&quot;photo&quot;&gt;
  &lt;img src=&quot;5897405919_4cee3bb3f1_b.jpg&quot; alt=&quot;Кузнечики-каннибалы&quot;&gt;
  &lt;figcaption&gt;Кузнечики-каннибалы&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;

&lt;figure class=&quot;photo&quot;&gt;
  &lt;img src=&quot;5897972032_de2d1479b8_b.jpg&quot; alt=&quot;Вид на Геленджик с вершины горы&quot;&gt;
  &lt;figcaption&gt;Вид на Геленджик с вершины горы&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Помимо смотровой площадки отдыхающим предлагают и другие разлечения. В их число входят: квадроциклинг (катание на квадроциклах), конинг (катание на лошадях) и негринг (фотографирование с неграми в папуасских костюмах).&lt;&#x2F;p&gt;

&lt;figure class=&quot;photo&quot;&gt;
  &lt;img src=&quot;5897407479_3f47c5c043_b.jpg&quot; alt=&quot;Квадроциклинг&quot;&gt;
  &lt;figcaption&gt;Квадроциклинг&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Кроме того, на самом краю вершины имеется парк аттракционов: колесо обозрения и две карусели. Однако, большинству посетителей хватает острых ощущений в процессе подъёма на гору, поэтому аттракционы пустуют.&lt;&#x2F;p&gt;

&lt;figure class=&quot;photo&quot;&gt;
  &lt;img src=&quot;5897974424_b468313050_b.jpg&quot; alt=&quot;Колесо обозрения на горе&quot;&gt;
  &lt;figcaption&gt;Колесо обозрения на горе&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;

&lt;figure class=&quot;photo&quot;&gt;
  &lt;img src=&quot;5897409833_9cbd746893_b.jpg&quot; alt=&quot;Блевательная карусель&quot;&gt;
  &lt;figcaption&gt;Блевательная карусель&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;С обратной стороны горы расположена долина, а за ней, соответственно, другая гора.&lt;&#x2F;p&gt;

&lt;figure class=&quot;photo&quot;&gt;
  &lt;img src=&quot;5897973476_53a75abe0c_b.jpg&quot; alt=&quot;Соседняя гора&quot;&gt;
  &lt;figcaption&gt;Соседняя гора&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Спускаться по канатной дороге оказалось не так страшно, как подниматься.&lt;&#x2F;p&gt;

&lt;figure class=&quot;photo&quot;&gt;
  &lt;img src=&quot;5897421193_b909ed093c_b.jpg&quot; alt=&quot;Спуск&quot;&gt;
  &lt;figcaption&gt;Спуск&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Пример использования History.js</title>
        <published>2011-07-01T08:04:00+00:00</published>
        <updated>2011-07-01T08:04:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/history-js/"/>
        <id>https://adf.xyz/ru/blog/history-js/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/history-js/">&lt;p&gt;В процессе переписывания движка блога я решил, что переход по ссылкам «Следующая &#x2F; Предыдущая страница» должен происходить без перезагрузки страницы. Проще говоря, с помощью AJAX.&lt;&#x2F;p&gt;
&lt;p&gt;В принципе, при знании матчасти, сделать это проще простого: ловим onclick на ссылке, отправляем AJAX-запрос, получаем HTML с содержимым следующей страницы и вставляем его в соответствующий контейнер в нашем документе.&lt;&#x2F;p&gt;
&lt;p&gt;Однако, в этом решении есть один существенный недостаток. URL страницы при этом не меняется. Это значит, что не работает кнопка «Назад» в браузере,  нельзя обновить страницу и получить тот же результат, нельзя сохранить текущую страницу в закладках или отправить её кому-нибудь по почте.&lt;&#x2F;p&gt;
&lt;p&gt;Некоторые извращенцы (Google) предлагают в качестве решения так называемый HashBang (#!), когда информация о текущем состоянии страницы сохранятеся в идентификаторе фрагмента. По такому принципу работает новый интерфейс Твиттера и некоторые другие популярные сайты.&lt;&#x2F;p&gt;
&lt;p&gt;Этот способ мне кажется ужасным костылём. Во-первых, это некрасиво :-) Во-вторых, &lt;code&gt;wget &#x27;http:&#x2F;&#x2F;twitter.com&#x2F;#!&#x2F;a_fedoseev&#x27;&lt;&#x2F;code&gt; скачает главную страницу Твиттера, а не мои твиты. Более развёрнуто HashBang ругают на Хабре, см. &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;habrahabr.ru&#x2F;blogs&#x2F;webdev&#x2F;113842&#x2F;&quot;&gt;Ломаем web c &#x27;#!&#x27; (hash-bang)&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Хорошая новость заключается в том, что можно получить желаемый результат очень элегантным и простым способом — с помощью &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;balupton&#x2F;History.js&quot;&gt;History.js&lt;&#x2F;a&gt;. Это скрипт, который позволяет управлять состоянием страницы, используя &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.whatwg.org&#x2F;specs&#x2F;web-apps&#x2F;current-work&#x2F;multipage&#x2F;history.html&quot;&gt;HTML5 History API&lt;&#x2F;a&gt; (в тех браузерах, которые его поддерживают). При этом состояние страницы сохраняетя в виде нормального URL и всё работает так, будто вы на самом деле переходите с одной страницы на другую.&lt;&#x2F;p&gt;
&lt;p&gt;В старых браузерах и IE оно тоже может работать, но при этом используюся хаки с хешем в URL. Меня старые браузеры не волнуют, поэтому для них я просто отключаю History.js.&lt;&#x2F;p&gt;
&lt;p&gt;Теперь перейдём к делу. Я покажу и расскажу, каким образом реализовано перелистывание страниц у меня в блоге.&lt;&#x2F;p&gt;
&lt;p&gt;Упрощённая структуры страницы блога у меня выглядит так:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;html&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;head&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;title&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;Страница 2&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;title&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;head&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;body&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;div&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; class&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;page&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;div&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; class&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;entries&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;article&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;h1&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;...&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;h1&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;article&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;div&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;div&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; class&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;page-links&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; href&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&#x2F;blog&#x2F;page&#x2F;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; class&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;prev&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;Предыдущая страница&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;a&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; href&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;&#x2F;blog&#x2F;page&#x2F;3&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; class&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;next&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;Следующая страица&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;a&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;div&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;div&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;body&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;html&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Думаю, что тут всё очевидно. При переходе по ссылке «Слудующая страница» попадаем на следующую страницу с URL &lt;code&gt;&#x2F;blog&#x2F;page&#x2F;3&lt;&#x2F;code&gt;. Ссылка «Предыдущая страница» работает аналогично.&lt;&#x2F;p&gt;
&lt;p&gt;Вот как выглядит упрощённый Javascript код для переворачивания страницы, если использовать jQuery.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;$&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;function&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;    &#x2F;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;  Проверяем, поддерживается ли History.js браузером.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt;    Если нет, то ничего не делаем, пусть всё работает&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt;    по-старинке. &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;!&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;History&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;enabled&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;    &#x2F;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;  Инициализируем контейнер для записей &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;    var&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt; $entries&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; $&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;div.entries&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;    &#x2F;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Вешаем обработчики onlick на ссылки &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;    var&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt; $page_links&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; $&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;div.page-links&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;        $prev_link&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt; $page_links&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;find&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;a.prev&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;        $next_link&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt; $page_links&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;find&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;a.next&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;    $page_links&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;delegate&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;a&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;click&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; function&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;e&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;        e&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;preventDefault&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        var&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt; url&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; $&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language&quot;&gt;this&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;attr&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;href&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;        &#x2F;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;  Удаляем текущие записи из контейнера &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;        $entries&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;empty&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;        &#x2F;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;  Показываем индикатор загрузки &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;        $entries&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;addClass&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;loading&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;        &#x2F;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;  И сообщаем History.js об изменении состояния страницы&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt;        В качестве первого агрумента можно передать произвольный объект&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt;        с дополнительными данными, которые можно извлечь в обработчике&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt;        изменения состояния, описанном ниже.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt;        В нашем случае это будет пустой объект. &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;        History&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;pushState&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; null&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt; url&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;    &#x2F;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;  Готовим обработчик изменения состояния страницы &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;    History&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;Adapter&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;bind&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;window&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;statechange&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; function&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;        &#x2F;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;  Получаем информацию о состоянии страницы &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        var&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt; state&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt; History&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;getState&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;        &#x2F;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; Получаем URL нового состояния. Это URL, который мы передали&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt;        в .pushState() &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;        var&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt; url&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt; state&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;url&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;        &#x2F;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;  Тут можно извлечь дополнительные данные, о которых шла речь выше.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt;        Например, так: var data = state.data; &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;        &#x2F;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;  Отправляем AJAX-запрос на сервер.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt;        В качестве ответа мы ожидаем JSON-объект следующего формата:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt;        {entries: &amp;quot;&amp;lt;article&amp;gt;&amp;lt;h1&amp;gt;...&amp;lt;&#x2F;h1&amp;gt;...&amp;lt;&#x2F;article&amp;gt; &amp;lt;article&amp;gt;...&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt;            title: &amp;quot;Страница 3&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt;            next_url: &amp;quot;&#x2F;blog&#x2F;page&#x2F;4&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt;            prev_url: &amp;quot;&#x2F;blog&#x2F;page&#x2F;2&amp;quot; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-comment&quot;&gt;        Каким образом будет сформирован этот ответ, зависит только от вас. &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;        $&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;getJSON&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;url&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type&quot;&gt; function&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;response&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;            &#x2F;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;  Обновляем заголовок страницы &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;            $&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;title&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;text&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;response&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;title&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;            &#x2F;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;  Обновляем ссылки на предыдущую и следующую страницы &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;            $prev_link&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;attr&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;href&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt; response&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;prev_url&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;            $next_link&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;attr&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;href&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt; response&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;next_url&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;            &#x2F;*&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt;  И, наконец, показываем новый блок записей &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;            $entries&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;removeClass&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;loading&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;html&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;response&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;entries&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Приведённый пример далёк от совершенства. Прежде всего, надо правильно обрабатывать случаи, когда дошли до самой последней или, наоборот, самой первой страницы. В этом случае нужно скрывать ссылки на следующую или предыдущую страницу соответственно. Ещё можно добавить какой-нибудь прикольный эффект при перелистывании, как это сделано у меня.&lt;&#x2F;p&gt;
&lt;p&gt;Самое приятное, что это решение полностью совместимо со старыми браузерами и не содержит никаких костылей.
Кроме того, его очень легко прикрутить к уже существующим сайтам. Надо только научить сервер отдавать описанный выше JSON-объект.&lt;&#x2F;p&gt;
&lt;p&gt;В &lt;code&gt;&amp;lt;div class=&quot;page-links&quot;&amp;gt;&amp;lt;&#x2F;div&amp;gt;&lt;&#x2F;code&gt; можно добавить ссылки с номерами страниц, для перехода на конкретную страницу. При этом модифицировать Javascript-код вообще не нужно.&lt;&#x2F;p&gt;
&lt;p&gt;Ну разве не красота?&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Про кнопку «Назад» в телефонах с Android</title>
        <published>2011-07-01T01:36:15+00:00</published>
        <updated>2011-07-01T01:36:15+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/pro-knopku-nazad-v-android-telefonah/"/>
        <id>https://adf.xyz/ru/blog/pro-knopku-nazad-v-android-telefonah/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/pro-knopku-nazad-v-android-telefonah/">&lt;p&gt;Я считаю, что отсутствие кнопки &lt;em&gt;Назад&lt;&#x2F;em&gt; в iPhone&#x2F;iPad лучше, чем её наличие в устройствах с Android. Проблема в том, что я не могу заранее знать, куда она меня перенесёт.&lt;&#x2F;p&gt;
&lt;p&gt;Рассмотрим два юзкейса:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Я открываю &lt;em&gt;Контакты&lt;&#x2F;em&gt;, потом через переключение запущенных приложений открываю &lt;em&gt;Сообщения&lt;&#x2F;em&gt; (допустим, они уже были запущены) и жму &lt;em&gt;Назад&lt;&#x2F;em&gt;. Попадаю обратно в &lt;em&gt;Контакты&lt;&#x2F;em&gt;. Вроде логично.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Открываю &lt;em&gt;Контакты&lt;&#x2F;em&gt;, потом так же через удержание &lt;em&gt;Home&lt;&#x2F;em&gt; переключаюсь на &lt;em&gt;Gmail&lt;&#x2F;em&gt;, в котором было открыто письмо. Куда я попаду, если нажму &lt;em&gt;Назад&lt;&#x2F;em&gt;? В &lt;em&gt;Контакты&lt;&#x2F;em&gt;? Нифига, я попаду в список писем в &lt;em&gt;Gmail&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Это выносит мне мозг!&lt;&#x2F;p&gt;
&lt;p&gt;Казалось бы, можно просто не пользоваться кнопкой &lt;em&gt;Назад&lt;&#x2F;em&gt;, так же, как и ненужной кнопкой &lt;em&gt;Поиск&lt;&#x2F;em&gt;. Я бы так и делал, если бы куча приложений не использовали её для переключения между экранами. Тот же &lt;em&gt;Gmail&lt;&#x2F;em&gt; при переходе от открытого письма назад к списку писем.&lt;&#x2F;p&gt;
&lt;p&gt;Тем не менее, я всё-таки решил задержаться на Android после того, как прошил CyanogenMod, в котором нет уродского HTC Sense.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Продам программу Kaleidoscope, б&#x2F;у</title>
        <published>2011-06-30T07:33:39+00:00</published>
        <updated>2011-06-30T07:33:39+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/kaleidoscope/"/>
        <id>https://adf.xyz/ru/blog/kaleidoscope/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/kaleidoscope/">&lt;p&gt;Ранее я уже &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;pro-trialnyie-versii-programm&#x2F;&quot;&gt;писал&lt;&#x2F;a&gt; про то, что не могу запустить триальную версию программы Kaleidoscope. Поэтому сегодня я её купил (сдуру). Оказалось, что в ней нет функции File Merge, которая для меня является необходимой.&lt;&#x2F;p&gt;
&lt;p&gt;Но в остальном это отличная программа для просмотра различий между текстовыми и графическими (в т.ч. PSD) файлами. Полный список её фич вы можете увидеть на &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;kaleidoscope.app&#x2F;&quot;&gt;официальном сайте Kaleidoscope&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Там же вы увидите, что её цена составляет €29. Я же предлагаю вам купить её у меня всего за &lt;strong&gt;500 рублей&lt;&#x2F;strong&gt;. Я считаю, что это отличная цена за практически новую программу в идеальном состоянии (запускалась всего один раз!)&lt;&#x2F;p&gt;
&lt;p&gt;Разумеется, я продаю не копию программы, а лицензионный ключ от неё. При этом я даю гарантию (честное слово), что никому другому этот ключ не достанется и сам я его использовать не буду.&lt;&#x2F;p&gt;
&lt;p&gt;Если вам интересно это предложение, отпишитесь в комментариях (указав адрес электронной почты) и я с вами свяжусь.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>На круче</title>
        <published>2011-06-27T13:43:00+00:00</published>
        <updated>2011-06-27T13:43:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/na-kruche/"/>
        <id>https://adf.xyz/ru/blog/na-kruche/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/na-kruche/">&lt;p&gt;Это лето я провожу в Геленджике. Сегодня тут здорово штормит.&lt;&#x2F;p&gt;
&lt;p&gt;Мы отправились в место под названием «на круче», чтобы узреть красоту геленджикской природы. Оттуда открывается мощный вид на море. Вот он:&lt;&#x2F;p&gt;

&lt;figure class=&quot;photo&quot;&gt;
  &lt;img src=&quot;IMG_9108.jpg&quot; alt=&quot;На круче&quot;&gt;
  &lt;figcaption&gt;На круче&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Редактор с предварительным просмотром на jQuery</title>
        <published>2011-06-27T01:27:21+00:00</published>
        <updated>2011-06-27T01:27:21+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/jquery-textareapreview/"/>
        <id>https://adf.xyz/ru/blog/jquery-textareapreview/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/jquery-textareapreview/">&lt;p&gt;Я написал небольшой плагин для jQuery, который добавляет к текстовому полю панель для предварительного просмотра. Его можно использовать для создания простейшего редактора. Я его использую в форме для добавления комментариев в этом блоге.&lt;&#x2F;p&gt;
&lt;p&gt;Плагин сделан под впечатлением от редактора на StackOverflow. Вот что он умеет:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Показывает превьюшку почти в реальном времени&lt;&#x2F;li&gt;
&lt;li&gt;Может показывать результат для языков, отличных от HTML, например, Markdown. Для этого нужно подключить соответствующий конвертер.&lt;&#x2F;li&gt;
&lt;li&gt;При необходимости можно отключать предпросмотр и включать его обратно&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;andreyfedoseev&#x2F;jquery-textareaPreview&quot;&gt;Страница проекта на GitHub&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;andreyfedoseev&#x2F;jquery-textareaPreview&#x2F;blob&#x2F;master&#x2F;README.markdown&quot;&gt;Документация&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Скачать &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;andreyfedoseev&#x2F;jquery-textareaPreview&#x2F;raw&#x2F;master&#x2F;jquery.textareaPreview.js&quot;&gt;jquery.textareaPreview.js&lt;&#x2F;a&gt;
(&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;andreyfedoseev&#x2F;jquery-textareaPreview&#x2F;raw&#x2F;master&#x2F;jquery.textareaPreview.min.js&quot;&gt;сжатая версия&lt;&#x2F;a&gt;)&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>django-less</title>
        <published>2011-06-16T13:06:09+00:00</published>
        <updated>2011-06-16T13:06:09+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/django-less/"/>
        <id>https://adf.xyz/ru/blog/django-less/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/django-less/">&lt;p&gt;А вот и &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;pypi.python.org&#x2F;pypi&#x2F;django-less&#x2F;&quot;&gt;django-less&lt;&#x2F;a&gt; подоспел.&lt;&#x2F;p&gt;
&lt;p&gt;Он делает то же самое, что и &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;pypi.python.org&#x2F;pypi&#x2F;django-coffeescript&#x2F;&quot;&gt;django-coffeescript&lt;&#x2F;a&gt;, только для &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;lesscss.org&#x2F;&quot;&gt;LESS&lt;&#x2F;a&gt; и, соответствено, CSS.&lt;&#x2F;p&gt;
&lt;p&gt;Практически весь код взят из django-coffeescript, логика использования абсолютно такая же.&lt;&#x2F;p&gt;
&lt;p&gt;Давайте тестируйте уже.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>django-coffeescript</title>
        <published>2011-06-15T11:08:33+00:00</published>
        <updated>2011-06-15T11:08:33+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/django-coffeescript/"/>
        <id>https://adf.xyz/ru/blog/django-coffeescript/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/django-coffeescript/">&lt;p&gt;Решил побаловаться с &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20110218055001&#x2F;http:&#x2F;&#x2F;jashkenas.github.com&#x2F;coffee-script&#x2F;&quot;&gt;CoffeeScript&lt;&#x2F;a&gt;, в частности использовать его вместо JavaScript у себя в бложике.&lt;&#x2F;p&gt;
&lt;p&gt;А чтобы баловаться было приятнее, сделал модуль с Django-тегами, которые на лету транслируют CoffeeScript.&lt;&#x2F;p&gt;
&lt;p&gt;Прошу любить и жаловать — &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pypi.org&#x2F;project&#x2F;django-coffeescript&#x2F;&quot;&gt;django-coffeescript&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;PS. На очереди django-less. Сами догадайтесь, что он будет делать.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Про iTunes in da Cloud и iTunes Match</title>
        <published>2011-06-12T02:29:00+00:00</published>
        <updated>2011-06-12T02:29:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/pro-itunes-in-da-cloud-i-itunes-match/"/>
        <id>https://adf.xyz/ru/blog/pro-itunes-in-da-cloud-i-itunes-match/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/pro-itunes-in-da-cloud-i-itunes-match/">&lt;p&gt;&lt;small&gt;Если вы не знаете, о чём речь, то почитайте &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.apple.com&#x2F;icloud&#x2F;features&#x2F;&quot;&gt;описание возможностей iCloud&lt;&#x2F;a&gt; на сайте Apple.&lt;&#x2F;small&gt;&lt;&#x2F;p&gt;
&lt;p&gt;У меня (как и у всех вас) накопилась куча музыки сомнительного происхождения. А теперь Apple предлагает нам индульгенцию всего за $25 в год. Я считаю, что это гуд дил. К тому же можно освободить 100 гигов на жёстком диске, вывалив музыку в клауд (см. SSD).&lt;&#x2F;p&gt;
&lt;p&gt;Однако, меня терзают смутные сомнения, будет ли оно работать так, как мы мечтаем. А именно, каким образом iTunes Match будет находить совпадающие песни? По тегам? Но в этом случае, кто мешает мне взять одну песню, продублировать её миллион раз с разными тегами и таким образом получить к себе в коллекцию всё содержимое iTunes Store?&lt;&#x2F;p&gt;
&lt;p&gt;Может быть по содержимому файла? Но ведь песни могут быть закодированы с разным битрейтом, а значит файлы будут различаться. Да и теги у всех могут быть прописаны по-разному, в этом случае даже файлы с абсолютно идентичным музыкальным содержимым не будут совпадать.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;small&gt;Кстати, примерно год назад у меня была идея сервиса для хранения музыки в облаке. Я тогда тоже думал, как реализовать поиск одинаковых песен. На тот момент лучшее, что я придумал, это отрезать теги из песен и сравнивать то, что осталось. От разного битрейта это не спасает, но уже лучше, чем ничего.&lt;&#x2F;small&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Можно использовать комбинированный вариант, например, смотреть теги + длину трека + сравнивать BPM. Я думаю, что как-то так оно и будет реализовано. Но насколько точно будет работать такой метод?&lt;&#x2F;p&gt;
&lt;p&gt;Какие у вас есть идеи на этот счёт?&lt;&#x2F;p&gt;
&lt;p&gt;И самое главное, будет ли оно работать в странах, где нет iTunes Store?&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Про триальные версии программ</title>
        <published>2011-06-10T01:58:00+00:00</published>
        <updated>2011-06-10T01:58:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/pro-trialnyie-versii-programm/"/>
        <id>https://adf.xyz/ru/blog/pro-trialnyie-versii-programm/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/pro-trialnyie-versii-programm/">&lt;p&gt;Мне очень нравится идея пробных версий платных приложений, которыми можно пользоваться в течение, например, 30 дней. При этом функциональность программы не должна быть ограничена. Это даёт возможность понять, насколько это приложение крутое и жизненно необходимое. Необходимое настолько, что и денег за него не жалко заплатить. Ну или наоборот.&lt;&#x2F;p&gt;
&lt;p&gt;Но большая часть реализаций этой идеи работают не идеально. Вот, например, приложение &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.kaleidoscopeapp.com&#x2F;&quot;&gt;Kaleidoscope&lt;&#x2F;a&gt;. Я — потенциальный покупатель, держу в зубах пачку денег. Захожу к ним на сайт, вижу кнопку «Скачать 30-дневную пробную версию». Качаю, запускаю и вижу: «Пробный период закончился. Давай уже покупай меня».&lt;&#x2F;p&gt;
&lt;p&gt;Всё дело в том, что где-то полгода назад я уже качал эту программку. Я тогда открыл её пару раз и удалил за ненадобностью. А сейчас есть большая вероятность, что она мне всё-таки пригодится. Но и деньги выбрасывать просто так нехочется. Поэтому приходится идти искать таблетку, чтобы всё-таки её запустить, поковырять и потом купить (чувствуя себя при этом идиотом). Так работают большинство пробных версий.&lt;&#x2F;p&gt;
&lt;p&gt;Однако, есть разработчики, которые более повёрнуты лицом к покупателю. Например, &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.jetbrains.com&#x2F;pycharm&#x2F;&quot;&gt;PyCharm&lt;&#x2F;a&gt;. С этим приложением у меня произошла точно такая же история, как и с Kaleidoscope. Но, после сообщения об истекшем пробном периоде приложение всё-таки запустилось. Хотя в таком режиме оно работает час или около того, а потом закрывается, и надо его перезапускать. Но даже этого часа мне хватило, чтобы понять, насколько текущая версия отличается от версии полугодичной давности, и без сожалений расстаться с деньгами.&lt;&#x2F;p&gt;
&lt;p&gt;Вывод я сделаю такой: товарищи, нас дурят. Пробные версии программ не работают 30 дней. Они перестают работать через 30 дней. И, судя по моему опыту, разработчики сами себе вставляют палки в колёса, когда ставят подобные ограничения. Пусть пробная версия будет работать 3 дня. Но это будут полноценные 3 дня: сегодня, на следующей неделе, через полгода — не имеет значения.&lt;&#x2F;p&gt;
&lt;p&gt;Отсутствие пробной версии — это отдельная песня. Если приложение стоит $0,99 или даже $9,99, тогда я могу заплатить за него «не глядя». Но если речь идёт о более крупных суммах, то тут полнофункциональная пробная версия для меня просто необходима. Хотя так считают не все (см. Mac App Store).&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Фотки из промзоны</title>
        <published>2010-04-18T08:59:07+00:00</published>
        <updated>2010-04-18T08:59:07+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/fotki-iz-promzonyi/"/>
        <id>https://adf.xyz/ru/blog/fotki-iz-promzonyi/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/fotki-iz-promzonyi/">&lt;p&gt;Друзья организовали фотосессию в одной из местной промзон и пригласили меня пофоткать. Разрушенные заводы, ЧБ, девушки, оружие, классика жанра в общем. Вот, что из этого получилось.&lt;&#x2F;p&gt;

&lt;figure class=&quot;photo&quot;&gt;
  &lt;img src=&quot;IMG_8142.jpg&quot; alt=&quot;Девочка на заводе&quot;&gt;
  &lt;figcaption&gt;Девочка на заводе&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;

&lt;figure class=&quot;photo&quot;&gt;
  &lt;img src=&quot;IMG_8066.jpg&quot; alt=&quot;Феминизм&quot;&gt;
  &lt;figcaption&gt;Феминизм&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;

&lt;figure class=&quot;photo&quot;&gt;
  &lt;img src=&quot;IMG_8086.jpg&quot; alt=&quot;Дыра&quot;&gt;
  &lt;figcaption&gt;Дыра&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Dino MC - 29 марта 2010 года</title>
        <published>2010-04-01T04:32:14+00:00</published>
        <updated>2010-04-01T04:32:14+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/dino-mc-29-marta-2010-goda/"/>
        <id>https://adf.xyz/ru/blog/dino-mc-29-marta-2010-goda/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/dino-mc-29-marta-2010-goda/">&lt;p&gt;Некто Dino MC оперативно записал трек &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ru.wikipedia.org&#x2F;wiki&#x2F;%D0%92%D0%B7%D1%80%D1%8B%D0%B2%D1%8B_%D0%B2_%D0%BC%D0%BE%D1%81%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%BC_%D0%BC%D0%B5%D1%82%D1%80%D0%BE_(2010)&quot;&gt;по теме&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;audio src=&quot;&#x2F;media&#x2F;upload&#x2F;audio&#x2F;Dino%20MC.ogg&quot; controls=&quot;controls&quot;&gt;&lt;&#x2F;audio&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;media&#x2F;upload&#x2F;audio&#x2F;Dino%20MC.ogg&quot;&gt;Прямая ссылка&lt;&#x2F;a&gt; на аудио, если плееер не отображается.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>U96 - Das Boot</title>
        <published>2010-03-05T02:57:00+00:00</published>
        <updated>2010-03-05T02:57:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/u96-das-boot/"/>
        <id>https://adf.xyz/ru/blog/u96-das-boot/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/u96-das-boot/">&lt;p&gt;Вспомнилось...&lt;&#x2F;p&gt;
&lt;iframe
  src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;YVxXbTk-zsQ&quot;
  width=&quot;560&quot;
  height=&quot;315&quot;
  title=&quot;YouTube video player&quot;
  frameborder=&quot;0&quot;
  allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
  allowfullscreen&gt;&lt;&#x2F;iframe&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>&lt;object&gt;, &lt;embed&gt; и валидный код</title>
        <published>2010-03-05T02:00:00+00:00</published>
        <updated>2010-03-05T02:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/object-ili-embed/"/>
        <id>https://adf.xyz/ru/blog/object-ili-embed/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/object-ili-embed/">&lt;p&gt;В детстве нас всех учили, что для встраивания флэша на страницу нужно пользоваться тегами &lt;code&gt;object&lt;&#x2F;code&gt; и &lt;code&gt;embed&lt;&#x2F;code&gt;. Объясняли это тем, что &lt;code&gt;object&lt;&#x2F;code&gt; используется Internet Explorer&#x27;ом на винде, а браузеры, основанные на Netscape понимают только &lt;code&gt;embed&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Казалось бы, вставляй оба тега и будет счастье. Только вот счастья нет, потому что &lt;code&gt;embed&lt;&#x2F;code&gt; — это нестандартный тег, которого нет в спецификации HTML4.01 &#x2F; XHTML1.0. (однако, он включён в черновик HTML5).&lt;&#x2F;p&gt;
&lt;p&gt;Но это ещё не вся &lt;em&gt;шокирующая правда&lt;&#x2F;em&gt;. Дело в том, что все более-менее современные браузеры поддерживают стандартный тег &lt;code&gt;object&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;В своём блоге я часто использую флэш, чтобы показывать видяшки и вставлять музыку. При этом я просто копирую под плеера с сайта и вставляю его в запись, либо использую &lt;code&gt;oembed&lt;&#x2F;code&gt; (о котором я скоро напишу заметку). В большинстве случаев этот кусок кода содержит оба тега, а иногда и вовсе только &lt;code&gt;embed&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Все знают, что валидный HTML код — это &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;pro-validnost-koda&#x2F;&quot;&gt;мой пунктик&lt;&#x2F;a&gt;. Поэтому я не стал терпеть этих невалидных корявок в своём собственном блоге и решил разобраться. Погуглив, я нашёл &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.alistapart.com&#x2F;articles&#x2F;flashsatay&#x2F;&quot;&gt;рецепт&lt;&#x2F;a&gt; (написанный аж в 2002 году), описывающий, как вставлять объекты на страницу, используя при этом только валидный код. Вкратце суть его такова:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Для тега &lt;code&gt;object&lt;&#x2F;code&gt; нужно указать атрибут &lt;code&gt;type&lt;&#x2F;code&gt;, например &lt;code&gt;type=&quot;application&#x2F;x-shockwave-flash&quot;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Также для &lt;code&gt;object&lt;&#x2F;code&gt; нужно указать атрибут &lt;code&gt;data&lt;&#x2F;code&gt;. В нём указывается URL  объекта, который вы хотите вставить&lt;&#x2F;li&gt;
&lt;li&gt;После этого нужно удалить тег &lt;code&gt;embed&lt;&#x2F;code&gt; нафиг&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Чтобы не заниматься такой чисткой вручную, я написал простенькую функцию, которая автоматически исправляет HTML код перед отображением на странице. Вот она:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; BeautifulSoup&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; import&lt;&#x2F;span&gt;&lt;span&gt; BeautifulSoup&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; Tag&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; fix_embeds&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function&quot;&gt;value&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    soup&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; BeautifulSoup&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;value&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span class=&quot;z-support&quot;&gt; object&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; in&lt;&#x2F;span&gt;&lt;span&gt; soup&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;findAll&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;object&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        movie&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; None&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        for&lt;&#x2F;span&gt;&lt;span&gt; param&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-support&quot;&gt; object&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;findAll&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;param&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;            if&lt;&#x2F;span&gt;&lt;span&gt; param&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;movie&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                movie&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; param&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;value&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        embeds&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-support&quot;&gt; object&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;findAll&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;embed&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; embeds&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            embed&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; embeds&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        else&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            embed&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; None&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        data&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-support&quot;&gt; object&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;get&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;data&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; not&lt;&#x2F;span&gt;&lt;span&gt; data&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;            if&lt;&#x2F;span&gt;&lt;span&gt; movie&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                object&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;data&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; movie&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;            elif&lt;&#x2F;span&gt;&lt;span&gt; embed&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; and&lt;&#x2F;span&gt;&lt;span&gt; embed&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;get&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;src&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                object&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;data&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; embed&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;src&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;            else&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;                continue&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; not&lt;&#x2F;span&gt;&lt;span class=&quot;z-support&quot;&gt; object&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;get&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;type&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; and&lt;&#x2F;span&gt;&lt;span&gt; embed&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;get&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;type&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            object&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;type&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; embed&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;type&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        del&lt;&#x2F;span&gt;&lt;span&gt; object&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;classid&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        for&lt;&#x2F;span&gt;&lt;span&gt; embed&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-support&quot;&gt; object&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;findAll&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;embed&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            embed&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;extract&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span&gt; embed&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; in&lt;&#x2F;span&gt;&lt;span&gt; soup&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;findAll&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;embed&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        src&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; embed&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;get&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;src&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support&quot;&gt;        type&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; embed&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;get&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;type&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; not&lt;&#x2F;span&gt;&lt;span&gt; src&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; or&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; not&lt;&#x2F;span&gt;&lt;span class=&quot;z-support&quot;&gt; type&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;            continue&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        width&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; embed&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;get&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;width&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        height&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; embed&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;get&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;height&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support&quot;&gt;        object&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; Tag&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;soup&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;object&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        object&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;data&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; src&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        object&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;type&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-support&quot;&gt; type&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; width&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            object&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;width&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; width&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; height&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            object&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;height&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; height&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        embed&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;replaceWith&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-support&quot;&gt;object&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; unicode&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;soup&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;На её основе можно, например, сделать фильтр для шаблонов Django.&lt;&#x2F;p&gt;
&lt;p&gt;Обратите внимание, что я принудительно удаляю атрибут &lt;code&gt;classid&lt;&#x2F;code&gt; из тегов &lt;code&gt;object&lt;&#x2F;code&gt;. Его назначение остаётся для меня загадкой, однако если он присутствует, то не отображается музыкальный проигрыватель с Jamendo.&lt;&#x2F;p&gt;
&lt;p&gt;Пользуйтесь на здоровье. Если обнаружите какие-то косяки — пишите.&lt;&#x2F;p&gt;
&lt;p&gt;P.S. Теперь у меня полностью &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;validator.w3.org&#x2F;nu&#x2F;?doc=http:&#x2F;&#x2F;adf.xyz&#x2F;&quot;&gt;валидный бложек&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Подстветка синтаксиса в Django</title>
        <published>2010-03-04T07:54:00+00:00</published>
        <updated>2010-03-04T07:54:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/podstvetka-sintaksisa-v-django/"/>
        <id>https://adf.xyz/ru/blog/podstvetka-sintaksisa-v-django/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/podstvetka-sintaksisa-v-django/">&lt;p&gt;Приделал к бложику подсветку синтаксиса. Для этого изобрел специальный template-тег для Django. В отличие от большинства существующих решений, подсветка делается не на стороне клиента, а на сервере. Ниже представлен исходный код, который вы можете свободно использовать.&lt;&#x2F;p&gt;
&lt;p&gt;Для работы этого тега требуется установленная утилита &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.andre-simon.de&#x2F;doku&#x2F;highlight&#x2F;en&#x2F;highlight.html&quot;&gt;highlight&lt;&#x2F;a&gt;. В Убунте она имеется, и, я думаю, что в других дистрибутивах тоже.&lt;&#x2F;p&gt;
&lt;p&gt;Код тега прост до безобразия:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; django&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; import&lt;&#x2F;span&gt;&lt;span&gt; template&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;import&lt;&#x2F;span&gt;&lt;span&gt; subprocess&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; shlex&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;register&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; template&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;Library&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;class&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; HightlightNode&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;template&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;Node&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;    def&lt;&#x2F;span&gt;&lt;span class=&quot;z-support&quot;&gt; __init__&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function&quot;&gt;self&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function&quot;&gt; nodelist&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function&quot;&gt; format&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language&quot;&gt;        self&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;nodelist&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; nodelist&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-language&quot;&gt;        self&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;format&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-support&quot;&gt; format&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;    def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; render&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function&quot;&gt;self&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function&quot;&gt; context&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        output&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language&quot;&gt; self&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;nodelist&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;render&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;context&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        args&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; shlex&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;split&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;highlight -S &lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;%s&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -f&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; %&lt;&#x2F;span&gt;&lt;span class=&quot;z-support&quot;&gt; str&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language&quot;&gt;self&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;format&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        try&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            p&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; subprocess&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;Popen&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;args&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; stdin&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;subprocess&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;PIPE&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt; stdout&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;subprocess&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;PIPE&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            out&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; errors&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; p&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;communicate&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;output&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;encode&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;utf-8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;            if&lt;&#x2F;span&gt;&lt;span&gt; out&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                output&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; out&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;decode&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;utf-8&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        except&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;            pass&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span&gt; output&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;@&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;register&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;tag&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable&quot;&gt;name&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;highlight&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage z-type&quot;&gt;def&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; do_highlight&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function&quot;&gt;parser&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function&quot;&gt; token&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    parts&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; token&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;split_contents&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    tag_name&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; parts&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    args&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; parts&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span class=&quot;z-support&quot;&gt; len&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;args&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;        raise&lt;&#x2F;span&gt;&lt;span&gt; template&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;TemplateSyntaxError&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;%r&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; tag requires exactly one argument&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; %&lt;&#x2F;span&gt;&lt;span&gt; tag_name&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    nodelist&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; parser&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;parse&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;endhighlight&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    parser&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;delete_first_token&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span&gt; HightlightNode&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;nodelist&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; args&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;В шаблон это хозяйство вставляется следующим образом:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{% highlight py %}SOME PYTHON CODE{% endhighlight %}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Параметр тега — это формат исходного кода. В данном случае это &lt;code&gt;py&lt;&#x2F;code&gt;, то есть Питон.&lt;&#x2F;p&gt;
&lt;p&gt;Кроме того, понадобится таблица стилей, чтобы полученный код заиграл новыми красками. Я, например, использую такую:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;css&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;hl&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;num&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support&quot;&gt;  color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; #&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;2928ff&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;hl&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;esc&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support&quot;&gt;  color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; #&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;ff00ff&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;hl&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;str&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support&quot;&gt;  color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; #&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;ff0000&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;hl&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;dstr&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support&quot;&gt;  color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; #&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;818100&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;hl&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;slc&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support&quot;&gt;  color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; #&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;838183&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support&quot;&gt;  font-style&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-constant&quot;&gt; italic&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;hl&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;com&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support&quot;&gt;  color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; #&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;838183&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support&quot;&gt;  font-style&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-constant&quot;&gt; italic&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;hl&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;dir&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support&quot;&gt;  color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; #&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;008200&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;hl&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;sym&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support&quot;&gt;  color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; #&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;000000&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;hl&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;line&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support&quot;&gt;  color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; #&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;555555&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;hl&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;mark&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support&quot;&gt;  background-color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; #&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;ffffbb&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;hl&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;kwa&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support&quot;&gt;  color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; #&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;000000&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support&quot;&gt;  font-weight&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-constant&quot;&gt; bold&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;hl&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;kwb&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support&quot;&gt;  color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; #&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;830000&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;hl&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;kwc&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support&quot;&gt;  color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; #&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;000000&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support&quot;&gt;  font-weight&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-constant&quot;&gt; bold&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;hl&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt;kwd&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-support&quot;&gt;  color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; #&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;010181&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Пользуйтесь на здоровье.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Oursvince</title>
        <published>2010-03-03T09:18:55+00:00</published>
        <updated>2010-03-03T09:18:55+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/oursvince/"/>
        <id>https://adf.xyz/ru/blog/oursvince/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/oursvince/">&lt;p&gt;Спешу сообщить о замечательном французском музыканте &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20100106065517&#x2F;http:&#x2F;&#x2F;www.oursvince.com&#x2F;&quot;&gt;Oursvince&lt;&#x2F;a&gt; (Vincent Bernay). Он пишет прекрасную электронную музыку с вкраплениями средневеково-фолково-кельтских тем.&lt;&#x2F;p&gt;
&lt;p&gt;Именно его трек сопровождает строительство &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=-d2-PtK4F6Y&quot;&gt;Pixel City&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Предлагаю ознакомится с его альбомом &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.jamendo.com&#x2F;album&#x2F;8726&#x2F;around&quot;&gt;Around&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>johnny-cache — кэширование SQL-запросов в Django</title>
        <published>2010-03-01T15:04:00+00:00</published>
        <updated>2010-03-01T15:04:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/johnny-cache-keshirovanie-sql-zaprosov-v-django/"/>
        <id>https://adf.xyz/ru/blog/johnny-cache-keshirovanie-sql-zaprosov-v-django/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/johnny-cache-keshirovanie-sql-zaprosov-v-django/">&lt;p&gt;Оказывается, Джонни Кэш — это не только имя &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;johnny-cash-gods-gonna-cut-you-down&#x2F;&quot;&gt;легендарного кантри-певца&lt;&#x2F;a&gt;. Такое же название носит модуль для кэширования SQL-запросов в Django.&lt;&#x2F;p&gt;
&lt;p&gt;Суть его действия заключается в том, что он кэширует результат выполнения &lt;em&gt;всех&lt;&#x2F;em&gt; &lt;code&gt;SELECT&lt;&#x2F;code&gt;&#x27;ов в memcached. Кэш сбрасывается при выполнении &lt;code&gt;INSERT&lt;&#x2F;code&gt;, &lt;code&gt;UPDATE&lt;&#x2F;code&gt; или &lt;code&gt;DELETE&lt;&#x2F;code&gt; для соответствующей таблицы. Если &lt;code&gt;SELECT&lt;&#x2F;code&gt; выбирает данные из нескольких таблиц, то кэш для этого запроса сбросится, если будет выполнена запись в любую из них.&lt;&#x2F;p&gt;
&lt;p&gt;Подключить такое кэширование предательственно просто. КО рекомендует начать с установки пакета &lt;code&gt;johnny—cache&lt;&#x2F;code&gt;, который можно &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pypi.python.org&#x2F;pypi&#x2F;johnny-cache&#x2F;&quot;&gt;скачать с PyPI&lt;&#x2F;a&gt; или вытянуть из &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;dev.jmoiron.net&#x2F;johnny&#x2F;&quot;&gt;mercurial-репозитория&lt;&#x2F;a&gt;. Затем нужно внести следующие изменения в &lt;code&gt;settings.py&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Добавить &lt;code&gt;jhonny&lt;&#x2F;code&gt; в список установленных приложений&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant&quot;&gt;INSTALLED_APPS&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;    #&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;    &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;johnny&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Это делать не обязательно, будет работать и так. Чисто декоративный момент.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Подключить middleware&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant&quot;&gt;MIDDLEWARE_CLASSES&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;    &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;johnny.middleware.LocalStoreClearMiddleware&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;    &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;johnny.middleware.QueryCacheMiddleware&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;    #&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;А вот это нужно сделать обязательно, иначе ничего не получится.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;И, наконец, настроить кэширующий бэкенд&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant&quot;&gt;CACHE_BACKEND&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;johnny.backends.memcached:&#x2F;&#x2F;localhost:11211&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-constant&quot;&gt;JOHNNY_MIDDLEWARE_KEY_PREFIX&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;jc_myproj&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;В &lt;code&gt;CACHE_BACKEND&lt;&#x2F;code&gt; указывается хост&#x2F;порт memcached. В данном случае это &lt;code&gt;localhost:11211&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;JOHNNY_MIDDLEWARE_KEY_PREFIX&lt;&#x2F;code&gt; — это префикс для ключей memcached. Он нужен, чтобы избежать конфликтов с другими проектами, которые используют тот же кэш. Соответственно, он должен быть уникальным для каждого проекта.&lt;&#x2F;p&gt;
&lt;p&gt;После этих нехитрых манипуляций перезагрузите люблю страницу вашего сайта и наслаждайтесь заветным нулём во вкладке &quot;SQL&quot; в &lt;code&gt;debug-toolbar&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Однако, я советую хорошенько подумать над тем, насколько это подойдёт для вашего конкретного приложения. Дело в том, что при таком подходе кэшироваться будут только SQL-запросы. Если приложение пишет в базу достаточно часто, то эффективность такого кэширования ощутимо понизится. К тому же, узким местом являются не только запросы к базе. Кэшировать нужно и другие &quot;дорогие&quot; операции. А ведь память не резиновая, на всех может и не хватить.&lt;&#x2F;p&gt;
&lt;p&gt;С другой стороны, &lt;em&gt;johnny-cache&lt;&#x2F;em&gt; позволяет повысить производительность с минимальным количеством телодвижений. В частности, скорость генерации главной страницы моего бложика повысилась на 30% (при испытании в тепличных условиях). При этом, использовать дополнительное кэширование помимо &lt;em&gt;johnny-cache&lt;&#x2F;em&gt; мне лениво, да и нет необходимости. Так что для меня этот вариант вполне подходит.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pythonhosted.org&#x2F;johnny-cache&#x2F;&quot;&gt;Сайт проекта johnny-cache&lt;&#x2F;a&gt; с более-менее подробной документацией.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Death Proof - Drive Like Lightning, Crash Like Thunder</title>
        <published>2010-03-01T04:00:00+00:00</published>
        <updated>2010-03-01T04:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/death-proof-drive-like-lightning-crash-like-thunde/"/>
        <id>https://adf.xyz/ru/blog/death-proof-drive-like-lightning-crash-like-thunde/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/death-proof-drive-like-lightning-crash-like-thunde/">&lt;p&gt;А вот крутая нарезка из крутого фильма с крутыми машинками и крутой музыкой.&lt;&#x2F;p&gt;
&lt;iframe
  src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;Tj6Qhw09A9E&quot;
  width=&quot;560&quot;
  height=&quot;315&quot;
  title=&quot;YouTube video player&quot;
  frameborder=&quot;0&quot;
  allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
  allowfullscreen&gt;&lt;&#x2F;iframe&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Приделал комментарии</title>
        <published>2010-03-01T02:56:00+00:00</published>
        <updated>2010-03-01T02:56:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/pridelal-kommentarii/"/>
        <id>https://adf.xyz/ru/blog/pridelal-kommentarii/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/pridelal-kommentarii/">&lt;p&gt;Теперь у &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;izobryol-velosiped&#x2F;&quot;&gt;велосипеда&lt;&#x2F;a&gt; есть второе колесо — на выходных добавил возможность комментирования записей.&lt;&#x2F;p&gt;
&lt;p&gt;Сделал удобный sexy интерфейс (в моём понимании): комментарии добавляются без перезагрузки страницы, а также свистят и пердят из всех сил.&lt;&#x2F;p&gt;
&lt;p&gt;Приглашаю всех опробовать это чудо инженерной мысли, оставив любой, пусть даже бессмысленный и беспощадный, комментарий прямо в этой записи.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Если будете тестить, обновите страницу с перезагрузкой кэша, а то мало ли что.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Mercedes S666</title>
        <published>2010-02-27T00:14:00+00:00</published>
        <updated>2010-02-27T00:14:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/mercedes-s666/"/>
        <id>https://adf.xyz/ru/blog/mercedes-s666/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/mercedes-s666/">&lt;p&gt;Noize MC оперативно выпустил трек &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;lenta.ru&#x2F;articles&#x2F;2010&#x2F;02&#x2F;26&#x2F;snark&#x2F;&quot;&gt;по теме&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;object width=&#x27;350&#x27; height=&#x27;50&#x27;&gt;&lt;param name=&#x27;movie&#x27; value=&#x27;http:&#x2F;&#x2F;www.filehoster.ru&#x2F;player&#x2F;&#x27;&#x2F;&gt;&lt;param name=&#x27;wmode&#x27; value=&#x27;transparent&#x27;&#x2F;&gt;&lt;param name=&#x27;FlashVars&#x27; value=&#x27;dataurl=er7857&#x27;&#x2F;&gt;&lt;embed src=&#x27;http:&#x2F;&#x2F;www.filehoster.ru&#x2F;player&#x2F;&#x27; type=&#x27;application&#x2F;x-shockwave-flash&#x27; width=&#x27;350&#x27; height=&#x27;50&#x27; wmode=&#x27;transparent&#x27; flashvars=&#x27;dataurl=er7857&#x27;&#x2F;&gt;&lt;&#x2F;object&gt;&lt;&#x2F;p&gt;
&lt;p&gt;via &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;barskaya.livejournal.com&#x2F;242935.html&quot;&gt;barskaya&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Приделал архив записей</title>
        <published>2010-02-26T13:25:14+00:00</published>
        <updated>2010-02-26T13:25:14+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/pridelal-arhiv-zapisej/"/>
        <id>https://adf.xyz/ru/blog/pridelal-arhiv-zapisej/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/pridelal-arhiv-zapisej/">&lt;p&gt;В пятницу вечером каждый развлекается как умеет. Я, например, ковыряю свой бложек.&lt;&#x2F;p&gt;
&lt;p&gt;Прикрутил архив по датам и по типу записи (текстовая запись, видео и т.п.). Предлагаю заценить и высказать критику. Комментарии я ещё не сделал, поэтому фидбэк можно отправлять через &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20100926093959&#x2F;http:&#x2F;&#x2F;www.google.com&#x2F;profiles&#x2F;andrey.fedoseev#buzz#buzz&quot;&gt;Google Buzz&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Больше всего времени потратил на перевод новых строк на русский язык. Джанговская система i18n-ции явно рассчитана не на средние умы. Конечно, можно было не париться и писать все строки по-русски прямо в коде, но это моветон imho.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Бразильский транс</title>
        <published>2010-02-25T15:22:00+00:00</published>
        <updated>2010-02-25T15:22:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/brazilskij-trans/"/>
        <id>https://adf.xyz/ru/blog/brazilskij-trans/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/brazilskij-trans/">&lt;p&gt;Пробую вставлять в бложек всякую интересную музыку. Например, вот такой прикольный бразильский транс, который я нашёл на &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.jamendo.com&#x2F;&quot;&gt;Jamendo&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Этого альбома уже нет на Jamendo :-(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Слишком длинный пароль</title>
        <published>2010-02-25T15:02:51+00:00</published>
        <updated>2010-02-25T15:02:51+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/slishkom-dlinnyij-parol/"/>
        <id>https://adf.xyz/ru/blog/slishkom-dlinnyij-parol/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/slishkom-dlinnyij-parol/">&lt;p&gt;Linode порадовал.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;slishkom-dlinnyij-parol&#x2F;password-is-too-long.png&quot; alt=&quot;Длинный пароль&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Изобрёл велосипед</title>
        <published>2010-02-25T13:45:54+00:00</published>
        <updated>2010-02-25T13:45:54+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/izobryol-velosiped/"/>
        <id>https://adf.xyz/ru/blog/izobryol-velosiped/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/izobryol-velosiped/">&lt;p&gt;Больше месяца ничего не писал, потому что был занят изобретением велосипеда переводом блога на новый движок. Tumblr — прикольный сервис, но возможностей у него маловато, хочется большего. Поэтому сделал свой движок на Django.&lt;&#x2F;p&gt;
&lt;p&gt;Скоро приделаю комментарии и теги. Можно будет подписаться на записи с определёнными тегами или исключить ненужные теги из RSS.&lt;&#x2F;p&gt;
&lt;p&gt;Прошу прощения за то, что сегодня в RSS попали старые записи.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Явная неправда</title>
        <published>2010-02-25T00:00:00+00:00</published>
        <updated>2010-02-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/yavnaya-nepravda/"/>
        <id>https://adf.xyz/ru/blog/yavnaya-nepravda/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/yavnaya-nepravda/">&lt;p&gt;В блог надо писать регулярно, да.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;yavnaya-nepravda&#x2F;%D1%81%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA3.png&quot; alt=&quot;Снимок экрана&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Форма для добавления комментария</title>
        <published>2010-01-14T17:32:00+00:00</published>
        <updated>2010-01-14T17:32:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/forma-dlya-dobavleniya-kommentariya/"/>
        <id>https://adf.xyz/ru/blog/forma-dlya-dobavleniya-kommentariya/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/forma-dlya-dobavleniya-kommentariya/">&lt;p&gt;В ходе бокса по переписке с Ильёй у меня появилась идея насчёт формы для добавления комментариев. Я просто процитирую с небольшими правками то, что я написал Илье:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Но вот допустим я захотел написать комментарий. Это будет просто
гениальный комментарий, я уже придумал для него пару остроумных
формулировок. И вот я готов набирать текст...но вместо этого мне
предлагают указать имя и email. Какого чёрта? Я хочу просто написать
комментарий. Да пошло оно всё, не буду писать.&lt;&#x2F;p&gt;
&lt;p&gt;Кстати, я кажется придумал решение, которое устроит нас обоих. Нужно
разместить поля с именем и email под полем для ввода текста. Тогда я
приду и спокойно наберу текст. И даже если мне не нравится указывать
своё имя, то я всё равно это сделаю. Я ведь уже написал гениальный
текст, не пропадать же ему зря.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;P.S. Да, я знаю, что у меня в блоге форма для комментирования выглядит не так. И вообще она ужасна. Я работаю над этим.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Про валидность кода</title>
        <published>2010-01-14T04:12:00+00:00</published>
        <updated>2010-01-14T04:12:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/pro-validnost-koda/"/>
        <id>https://adf.xyz/ru/blog/pro-validnost-koda/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/pro-validnost-koda/">&lt;p&gt;На stackoverflow.com недавно был такой вопрос &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;1967191&#x2F;why-would-google-use-a-font-tag&quot;&gt;«Why would Google use a font tag?»&lt;&#x2F;a&gt;. И на него был дан такой ответ:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Saving a few bytes on the Google homepage likely saves them terabytes of transfer bandwidth.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Это выглядит вполне логичным. В исключительных случаях «плохой» код может быть оправдан. Главная страница Гугля уменьшилась на несколько байт, и, учитывая их масштабы, они тем самым экономят кучу трафика и, соответственно, денег. Это разумно.&lt;&#x2F;p&gt;
&lt;p&gt;А теперь представим, что внезапно все страницы в интернете стали написаны хорошо структурированным, понятным кодом, который робот Гугля может без труда парсить с минимумом затрат процессорного времени, электроэнергии и человеческих ресурсов. Разве в этом случае экономия не будет существенно больше?&lt;&#x2F;p&gt;
&lt;p&gt;Конечно, это всё мои фантазии, но я уверен, что именно к этому надо стремиться.&lt;&#x2F;p&gt;
&lt;p&gt;Поэтому я считаю, что на валидность кода нельзя забивать никогда. Вот такой я буквоед.&lt;&#x2F;p&gt;
&lt;p&gt;P.S. По телеку показывают похороны Гугля в Китае. В буквальном смысле. Всем очень грустно, все несут цветы и ставят свечки.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>&lt;small&gt; меня убивает</title>
        <published>2010-01-14T03:10:00+00:00</published>
        <updated>2010-01-14T03:10:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/small-menya-ubivaet/"/>
        <id>https://adf.xyz/ru/blog/small-menya-ubivaet/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/small-menya-ubivaet/">&lt;p&gt;Меня каждый раз передёргивает, когда и использую тег &amp;lt;small&amp;gt;. Мне срочно нужен логический тег для выделения малозначимого текста. W3C, ау?&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Обновлено.&lt;&#x2F;strong&gt; Всё отменяется. Оказывается &amp;lt;small&amp;gt; — это вполне &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;html.spec.whatwg.org&#x2F;multipage&#x2F;text-level-semantics.html#the-small-element&quot;&gt;логический тег&lt;&#x2F;a&gt;. Мы с &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20091016063630&#x2F;https:&#x2F;&#x2F;www.ozon.ru&#x2F;context&#x2F;detail&#x2F;id&#x2F;3881084&#x2F;&quot;&gt;Чаком Муссиано и Биллом Кеннеди&lt;&#x2F;a&gt; были не правы. Спасибо &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ilyabirman.ru&#x2F;&quot;&gt;Илье&lt;&#x2F;a&gt;!&lt;&#x2F;p&gt;
&lt;p&gt;Вывод: читай первоисточник!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Вдогонку про Twitter</title>
        <published>2010-01-14T03:02:00+00:00</published>
        <updated>2010-01-14T03:02:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/vdogonku-pro-twitter/"/>
        <id>https://adf.xyz/ru/blog/vdogonku-pro-twitter/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/vdogonku-pro-twitter/">&lt;p&gt;Только что меня зафолловил &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;x.com&#x2F;Butrimenko&quot;&gt;некто&lt;&#x2F;a&gt;. Я разумеется зашёл почитать, что он пишет. И, должен вам признаться, это прекрасно (читать снизу вверх, this is Twitter!):&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;@[вырезано] Ок! Спасибо! То есть сначала, нужно в друзья надобавлять&lt;&#x2F;em&gt;
about 5 hours ago from web in reply to [вырезано]&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;@[вырезано] А как это в качестве рекламы использовать? Тупо всех в друзья добавлять?&lt;&#x2F;em&gt;
about 5 hours ago from web in reply to [вырезано]&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;блин! как это работает?&lt;&#x2F;em&gt;
about 5 hours ago from web&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;[вырезано название организации]! Челябинск ул. [вырезано] Тел: +7 (351) [вырезано] [вырезано]@[вырезано].com www.[вырезано].com&lt;&#x2F;em&gt;
about 5 hours ago from web&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Имена твиттер-аккаунтов, а также физический адрес, телефон, электронная почта и адрес сайта поциента выпилены моей внутренней цензурой.&lt;&#x2F;p&gt;
&lt;p&gt;Это какбэ служит прекрасной иллюстрацией того, куда, по моему мнению, катится Twitter.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Twitter sucks?</title>
        <published>2010-01-14T02:11:00+00:00</published>
        <updated>2010-01-14T02:11:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/twitter-sucks/"/>
        <id>https://adf.xyz/ru/blog/twitter-sucks/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/twitter-sucks/">&lt;p&gt;Это только мне кажется, что функция &lt;em&gt;reply&lt;&#x2F;em&gt; в Твиттере это отстой? Точнее сама идея ответов не отстой, но вот её реализация... Мне кажется странным, что мой ответ на чей-то твит отображается не у того, к кому этот ответ адресован, а у &lt;em&gt;меня&lt;&#x2F;em&gt; в ленте. Получается, что твиты, начинающиеся на @, выпадают из контекста. Непонятно, к чему они вообще относятся.&lt;&#x2F;p&gt;
&lt;p&gt;А ведь есть граждане, у которых ленты почти @полностью @состоят @из @ответов, и их совершенно невозможно читать. Поэтому я их и не читаю.&lt;&#x2F;p&gt;
&lt;p&gt;Кстати, если в боковой панели нажать на ссылку под названием @[ваш_tweed_id], то появится заголовок «Tweets mentioning @[ваш_tweed_id]», что в вольном переводе означает «Твиты, в которых вы упоминаетесь». Не «Ответы на ваши твиты». &lt;em&gt;Упоминания&lt;&#x2F;em&gt;. Вот такое использование функции @ выглядит вполне логичным.&lt;&#x2F;p&gt;
&lt;p&gt;А ещё у меня появляется ощущение, что я использую Твиттер по той же причине, что и Вконтактик. Все туда и я туда. Только вот из Вконтактика я в скором времени удалюсь, Facebook в сто раз удобнее и богаче по функционалу.&lt;&#x2F;p&gt;
&lt;p&gt;Мдя.&lt;&#x2F;p&gt;
&lt;p&gt;Может быть я чего-то не понимаю?&lt;&#x2F;p&gt;
&lt;p&gt;P.S. Зато в Твиттер удобно автоматически постить линки на моей бложег и тем  самым его пиарить.&lt;&#x2F;p&gt;
&lt;p&gt;P.P.S. А вы заметили, что в этой записи я использовал кавычки-ёлочки (привет &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ilyabirman.ru&#x2F;&quot;&gt;Илье Бирману&lt;&#x2F;a&gt;)? Это я так повышаю своё ЧСВ. А ещё оказалось, что &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;kde.ru&#x2F;xforum&#x2F;index.php?topic=43.msg271#msg271&quot;&gt;набирать их очень просто&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Шрифт для всех национальных алфавитов РФ</title>
        <published>2010-01-13T17:48:00+00:00</published>
        <updated>2010-01-13T17:48:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/shrift-dlya-vseh-natsionalnyih-alfavitov-rf/"/>
        <id>https://adf.xyz/ru/blog/shrift-dlya-vseh-natsionalnyih-alfavitov-rf/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/shrift-dlya-vseh-natsionalnyih-alfavitov-rf/">&lt;p&gt;Сделали &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20120112040213&#x2F;http:&#x2F;&#x2F;www.fonts.ru&#x2F;public&#x2F;&quot;&gt;шрифт с поддержкой всех национальных алфавитов РФ&lt;&#x2F;a&gt;. Скачать и использовать могут все желающие, лицензия на него открытая.&lt;&#x2F;p&gt;
&lt;p&gt;Мне пока не ясно, что с ним делать, но всё равно радостно.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Дэн Пинк об удивительной науке мотивации</title>
        <published>2010-01-13T11:27:00+00:00</published>
        <updated>2010-01-13T11:27:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/den-pink-ob-udivitelnoj-nauke-motivatsii/"/>
        <id>https://adf.xyz/ru/blog/den-pink-ob-udivitelnoj-nauke-motivatsii/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/den-pink-ob-udivitelnoj-nauke-motivatsii/">&lt;iframe
  src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;rrkrvAUbU9Y&quot;
  width=&quot;560&quot;
  height=&quot;315&quot;
  title=&quot;YouTube video player&quot;
  frameborder=&quot;0&quot;
  allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
  allowfullscreen&gt;&lt;&#x2F;iframe&gt;
&lt;p&gt;via &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;xenru.livejournal.com&#x2F;174391.html&quot;&gt;xenru&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Блог закрыт</title>
        <published>2010-01-13T00:00:00+00:00</published>
        <updated>2010-01-13T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/blog-zakryt/"/>
        <id>https://adf.xyz/ru/blog/blog-zakryt/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/blog-zakryt/">&lt;p&gt;Привет всем, кто меня читал. Вы наверное не заметили, но я уже давно ничего сюда не писал. С сегодняшнего дня этот блог можно считать официально закрытым.&lt;&#x2F;p&gt;
&lt;p&gt;Но одновременно сегодня появился на свет новый блог &lt;code&gt;https:&#x2F;&#x2F;andreyfedoseev.ru&lt;&#x2F;code&gt;. Его тематика будет отличаться. Не будет (ну или будет очень мало) заметок про всякие линуксы-юниксы. Зато будет всякая фигня. В общем это место публикации всяких мыслей и идей, которые не помещаются в &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20090114085732&#x2F;https:&#x2F;&#x2F;twitter.com&#x2F;a_fedoseev&quot;&gt;мой Twitter&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Всем удачи, можете отписываться.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&lt;em&gt;На этом месте я закончил вести свой блог по адресу &lt;code&gt;https:&#x2F;&#x2F;cornelius.net.ru&lt;&#x2F;code&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Call-центры и IVR</title>
        <published>2010-01-12T23:00:00+00:00</published>
        <updated>2010-01-12T23:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/call-tsentryi-i-ivr/"/>
        <id>https://adf.xyz/ru/blog/call-tsentryi-i-ivr/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/call-tsentryi-i-ivr/">&lt;p&gt;Многим, наверное, приходилось звонить в различные службы технической поддержки, абонентские отделы и прочие структуры, работающие с обеспокоенными гражданами. И всегда получается так, что именно в тот момент, когда тебе нужна их помощь и поддержка, все операторы оказываются заняты. Приходится слушать какую-нибудь ободряющую мелодию, которая время от времени прерывается сообщениями типа &quot;Ваш звонок тридцать пятый по счёту. Пожалуйста, дождитесь ответа оператора.&quot;. Это &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20100110202525&#x2F;http:&#x2F;&#x2F;lurkmore.ru&#x2F;%D0%92%D0%B7%D1%8F%D1%82%D1%8C_%D0%B8_%D1%83%D0%B5%D0%B1%D0%B0%D1%82%D1%8C&quot;&gt;жутко бесит&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Так вот решается эта проблема очень просто. Если выясняется, что свободных операторов нет, то система &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ru.wikipedia.org&#x2F;wiki&#x2F;IVR&quot;&gt;IVR&lt;&#x2F;a&gt;, также известная как голосовое меню, предлагает такой вариант: &quot;Нажмите N и мы перезвоним вам, как только оператор выйдет из отпуска освободится&quot;. Всё, что для этого нужно это определитель номера в call-центре.&lt;&#x2F;p&gt;
&lt;p&gt;А в результате мы имеем:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Экономия времени клиента&lt;&#x2F;li&gt;
&lt;li&gt;Экономия денег клиента (не нужно платить оператору за прослушивание музыки)&lt;&#x2F;li&gt;
&lt;li&gt;Довольный клиент&lt;&#x2F;li&gt;
&lt;li&gt;PROFIT!&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Сюда ещё нужно добавить пункт про снижение нагрузки на каналы связи, но кроме меня это никого не волнует.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Партийцы</title>
        <published>2010-01-12T18:56:00+00:00</published>
        <updated>2010-01-12T18:56:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/partijtsyi/"/>
        <id>https://adf.xyz/ru/blog/partijtsyi/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/partijtsyi/">&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;image not found&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Автор мне не известен. Нашёл на &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;d3.ru&#x2F;mozhet-byt-zagolovok-265777&#x2F;&quot;&gt;dirty.ru&lt;&#x2F;a&gt;. Там в комментах есть отличная фотожабка.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Хедшот дня — двойная транслитерация</title>
        <published>2010-01-12T14:08:00+00:00</published>
        <updated>2010-01-12T14:08:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/hedshot-dnya-dvojnaya-transliteratsiya/"/>
        <id>https://adf.xyz/ru/blog/hedshot-dnya-dvojnaya-transliteratsiya/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/hedshot-dnya-dvojnaya-transliteratsiya/">&lt;p&gt;Naming → Нейминг → &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.brand-b.ru&#x2F;neiming&#x2F;&quot;&gt;Neiming&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Content precedes design</title>
        <published>2010-01-12T12:18:00+00:00</published>
        <updated>2010-01-12T12:18:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/content-precedes-design/"/>
        <id>https://adf.xyz/ru/blog/content-precedes-design/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/content-precedes-design/">&lt;blockquote&gt;
&lt;p&gt;Content precedes design. Design in the absence of content is not design, it&#x27;s decoration.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;x.com&#x2F;zeldman&#x2F;status&#x2F;804159148&quot;&gt;Jeffrey Zeldman&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Johnny Cash - God&#x27;s Gonna Cut You Down</title>
        <published>2010-01-11T09:41:00+00:00</published>
        <updated>2010-01-11T09:41:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/johnny-cash-gods-gonna-cut-you-down/"/>
        <id>https://adf.xyz/ru/blog/johnny-cash-gods-gonna-cut-you-down/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/johnny-cash-gods-gonna-cut-you-down/">&lt;iframe
  src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;eJlN9jdQFSc&quot;
  width=&quot;560&quot;
  height=&quot;315&quot;
  title=&quot;YouTube video player&quot;
  frameborder=&quot;0&quot;
  allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot;
  allowfullscreen&gt;&lt;&#x2F;iframe&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Правильное и неправильное автодополнение</title>
        <published>2010-01-10T05:15:00+00:00</published>
        <updated>2010-01-10T05:15:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/pravilnoe-i-nepravilnoe-avtodopolnenie/"/>
        <id>https://adf.xyz/ru/blog/pravilnoe-i-nepravilnoe-avtodopolnenie/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/pravilnoe-i-nepravilnoe-avtodopolnenie/">&lt;p&gt;Размышлял об автодополнении. Это когда вводишь в тестовое поле буковки, а умный сервис предлагает тебе варианты, которые этим буковкам соответствуют.&lt;&#x2F;p&gt;
&lt;p&gt;Мне такая штука будет нужна в одном проЭкте, поэтому я пошёл искать готовые решения. Нашёл вот такую &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20100203103317&#x2F;http:&#x2F;&#x2F;code.drewwilson.com&#x2F;entry&#x2F;autosuggest-jquery-plugin&quot;&gt;реализацию автодополнения на jQuery&lt;&#x2F;a&gt;. Выглядит красиво, но работает немного странно. Если например набрать буковку &lt;em&gt;m&lt;&#x2F;em&gt;, то выдаст все варианты, в которых встречается эта буковка. Вот картинка:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;pravilnoe-i-nepravilnoe-avtodopolnenie&#x2F;tumblr_kw15qfGNJn1qaz1ms.png&quot; alt=&quot;Неправильно работающее автодополнение&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Логично? Нифига не логично. Кому в голову придёт вводить слово &lt;em&gt;Jimmy&lt;&#x2F;em&gt;, начиная с буквы &lt;em&gt;m&lt;&#x2F;em&gt;? У людей есть интересная особенность — они пишут слова с начала, а не с середины.&lt;&#x2F;p&gt;
&lt;p&gt;Это был пример неправильного автодополнения.&lt;&#x2F;p&gt;
&lt;p&gt;В моём представлении правильное автодополнение должно работать так: сначала выводятся те варианты, в которых хотя бы одно из слов начинается с заданных букв. Если таких нет, то выводятся варианты просто содержащие заданные буквы (хотя мне это кажется излишним).&lt;&#x2F;p&gt;
&lt;p&gt;Как выяснилось, именно так делает Google Reader при добавлении тэгов. Ввожу &lt;em&gt;w&lt;&#x2F;em&gt; — получаю &lt;em&gt;Web Design&lt;&#x2F;em&gt;. Ввожу &lt;em&gt;d&lt;&#x2F;em&gt; — получаю опять &lt;em&gt;Web Design&lt;&#x2F;em&gt;. Если ввожу &lt;em&gt;eb&lt;&#x2F;em&gt; (sic!) — снова получаю &lt;em&gt;Web Design&lt;&#x2F;em&gt;. Радостно!&lt;&#x2F;p&gt;
&lt;p&gt;А вот если у меня будет тэг, начинающийся с &lt;em&gt;eb&lt;&#x2F;em&gt;, то &lt;em&gt;Web Design&lt;&#x2F;em&gt; выскакивать уже не будет (проверено).&lt;&#x2F;p&gt;
&lt;p&gt;Кстати, в Google Reader заметил интересную особенность. Рассказывать не буду, просто покажу картинки, а вы ищите сами.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;pravilnoe-i-nepravilnoe-avtodopolnenie&#x2F;1.png&quot; alt=&quot;Автодополнение в Google Reader #1&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;pravilnoe-i-nepravilnoe-avtodopolnenie&#x2F;2.png&quot; alt=&quot;Автодополнение в Google Reader #2&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;pravilnoe-i-nepravilnoe-avtodopolnenie&#x2F;3.png&quot; alt=&quot;Автодополнение в Google Reader #3&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>FaviconizeTab – расширение для Firefox</title>
        <published>2009-03-25T00:00:00+00:00</published>
        <updated>2009-03-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/faviconize-tab/"/>
        <id>https://adf.xyz/ru/blog/faviconize-tab/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/faviconize-tab/">&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;faviconize-tab&#x2F;faviconize-tab.png&quot; alt=&quot;FaviconizeTab&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ktakayama&#x2F;faviconizetab&quot;&gt;FaviconizeTab&lt;&#x2F;a&gt; – расширение для Firefox, которым я пользуюсь давно и с удовольствием. Оно позволяет сэкономить кучу места на панели вкладок. Каждую вкладку можно &quot;свернуть&quot; до размера пиктограммы (favicon). Это особенно полезно, если вы, так же как и я, постоянно держите открытым один и тот же набор вкладок (см. картинку). Если вы сохраняете сессии при выходе из Firefox, то при следующем запуске браузера вкладки сразу будут свёрнуты.&lt;&#x2F;p&gt;
&lt;p&gt;Установить FaviconizeTab можно на &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20090706155434&#x2F;https:&#x2F;&#x2F;addons.mozilla.org&#x2F;&#x2F;en-US&#x2F;&#x2F;firefox&#x2F;&#x2F;addon&#x2F;&#x2F;3780&quot;&gt;странице расширения&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Skype и Facebook Chat в Pidgin</title>
        <published>2008-07-01T00:00:00+00:00</published>
        <updated>2008-07-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/skype-and-facebook-chat-i-pidgin/"/>
        <id>https://adf.xyz/ru/blog/skype-and-facebook-chat-i-pidgin/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/skype-and-facebook-chat-i-pidgin/">&lt;p&gt;На днях обнаружил два занятных плагина для &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pidgin.im&#x2F;&quot;&gt;Pidgin&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;skype4pidgin&quot;&gt;Skype4pidgin&lt;a class=&quot;zola-anchor&quot; href=&quot;#skype4pidgin&quot; aria-label=&quot;Anchor link for: skype4pidgin&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;Этот плагин позволяет обмениваться мгновенными сообщениями с участниками сети &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080701045909&#x2F;www.skype.com&#x2F;&quot;&gt;Skype&lt;&#x2F;a&gt;, используя Pidgin. Кроме того, можно инициировать звонки Skype прямо из Pidgin.&lt;&#x2F;p&gt;
&lt;p&gt;Важной особенностью этого плагина является то, что для его работы у вас должен быть установлен и запущен Skype. При этом плагин может запускать Skype автоматически, а также синхронизировать статусы Pidgin и Skype.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080701111151&#x2F;http:&#x2F;&#x2F;code.google.com&#x2F;p&#x2F;skype4pidgin&#x2F;&quot;&gt;Домашняя страница skype4pidgin&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080601205925&#x2F;http:&#x2F;&#x2F;myjobspace.co.nz&#x2F;images&#x2F;pidgin&#x2F;&quot;&gt;Страница загрузки&lt;&#x2F;a&gt; (имеются .deb пакеты).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;facebook-chat-dlia-pidgin&quot;&gt;Facebook Chat для Pidgin&lt;a class=&quot;zola-anchor&quot; href=&quot;#facebook-chat-dlia-pidgin&quot; aria-label=&quot;Anchor link for: facebook-chat-dlia-pidgin&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;Этот плагин интегрирует чат социальной сети &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.facebook.com&#x2F;&quot;&gt;Facebook&lt;&#x2F;a&gt; в Pidgin. Ваши френды будут отображаться в списке контактов и вы сможете обмениваться с ними сообщениями, которые они будут получать через онлайн-чат Facebook. Также с помощью этого плагина можно отслеживать, кто из ваших френдов в данный момент находится на сайте и устанавливать статус в Facebook в соответствии со статусом в Pidgin.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080701101509&#x2F;http:&#x2F;&#x2F;code.google.com&#x2F;p&#x2F;pidgin-facebookchat&#x2F;&quot;&gt;Домашняя страница Facebook Chat for Pidgin&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080701135536&#x2F;http:&#x2F;&#x2F;code.google.com&#x2F;p&#x2F;pidgin-facebookchat&#x2F;downloads&#x2F;list&quot;&gt;Страница загрузки&lt;&#x2F;a&gt; (имеются .deb пакеты).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;А вот и скриншоты:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;skype-and-facebook-chat-i-pidgin&#x2F;skype-pidgin.png&quot; alt=&quot;Настройка Skype в Pidgin&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;skype-and-facebook-chat-i-pidgin&#x2F;fb-pidgin.png&quot; alt=&quot;Настройка Facebook Chat в Pidgin&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Привезли Wii Fit</title>
        <published>2008-05-13T00:00:00+00:00</published>
        <updated>2008-05-13T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/wii-fit-arrived/"/>
        <id>https://adf.xyz/ru/blog/wii-fit-arrived/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/wii-fit-arrived/">&lt;p&gt;Сегодня получил долгожданную посылку от Озона с новой игрушкой для приставки Wii Fit.&lt;&#x2F;p&gt;
&lt;p&gt;Комплект состоит из умной степ-платформы, умеющей определять ваш центр тяжести и вес, а также диска с софтом для занятий физкультурой с помощью этой платформы.&lt;&#x2F;p&gt;
&lt;p&gt;Чуть позже напишу подробный обзор возможностей этой штуки, а пока фотки:&lt;&#x2F;p&gt;
&lt;div class=&quot;pswp-gallery&quot;&gt;

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;DSC01247.f9795577c4878c6d.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1536&quot;
     data-pswp-height=&quot;1024&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;DSC01247.c29cb2bc265c74ac.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;DSC01251.590a6e4a7c2e12bd.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1024&quot;
     data-pswp-height=&quot;1536&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;DSC01251.e4dc5c6439dea299.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

  
  
  
  
  
  
  
  
  
  &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;DSC01255.3690515ea5d57ee6.jpg&quot;
     target=&quot;_blank&quot;
     rel=&quot;noopener&quot;
     data-pswp-width=&quot;1536&quot;
     data-pswp-height=&quot;1024&quot;&gt;
    &lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;processed_images&#x2F;DSC01255.784d3f6798bc8aaa.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;
  &lt;&#x2F;a&gt;
  

&lt;&#x2F;div&gt;</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>GmountISO – графическая утилита для монтирования ISO-образов</title>
        <published>2008-05-03T02:49:00+00:00</published>
        <updated>2008-05-03T02:49:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/gmountiso/"/>
        <id>https://adf.xyz/ru/blog/gmountiso/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/gmountiso/">&lt;p&gt;Монтировать ISO-образы мне приходится часто, а набирать каждый раз команду&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo mount myiso.iso &#x2F;mnt -t iso9660 -o ro,loop=&#x2F;dev&#x2F;loop0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;— лениво. Поэтому я решил поискать какой-нибудь двухкликовый способ монтирования ISO. При мне хотелось, чтобы эта утилита была интегрирована в Nautilus.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.google.ru&#x2F;search?q=nautilus+mount+iso&quot;&gt;Искать&lt;&#x2F;a&gt; я решил Гуглем, но Гугль меня подвёл. На большинстве сайтов предлагали воспользоваться набором из двух скриптов для Nautilus, но эти скрипты у меня почему-то не заработали.&lt;&#x2F;p&gt;
&lt;p&gt;Но через некоторое время я набрёл на замечательную программку: &lt;strong&gt;GmountISO&lt;&#x2F;strong&gt;. Программка позволяет монтировать ISO образы в произвольную папку, а также отмонтировать уже подключённые образы.&lt;&#x2F;p&gt;
&lt;p&gt;Интерфейс программы прост до безобраня и в пояснениях не нуждается.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;gmountiso&#x2F;gmount-iso.png&quot; alt=&quot;GmountISO&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;GmountISO входит в состав Ubuntu, поэтому устанавливается она проще простого:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; aptitude&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; gmountiso&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Лекарство от розовых теней в Compiz</title>
        <published>2008-05-03T00:00:00+00:00</published>
        <updated>2008-05-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/compiz-pink-shadows/"/>
        <id>https://adf.xyz/ru/blog/compiz-pink-shadows/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/compiz-pink-shadows/">&lt;p&gt;Суть бага состоит в следующем: при использовании драйверов Nvidia, установленных из репозитория Debian или Ubuntu, тени в Compiz приобритают противоестественный цвет (чаще всего розовый, но я видел и зелёный, и даже белый) либо не отображаются вовсе.&lt;&#x2F;p&gt;
&lt;p&gt;Этот баг преследует меня уже давно, но решения я найти не мог. Теперь же, с выходом Hardy, эту проблему обнаружило гораздо большее число людей. Народ возбудился и коллективный разум выдал временное решение. Надо всего лишь выполнить следующую команду:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ln&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;sf&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;usr&#x2F;lib&#x2F;nvidia&#x2F;libwfb.so.xserver-xorg-core&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;usr&#x2F;lib&#x2F;xorg&#x2F;modules&#x2F;libwfb.so&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;и перезапустить сеанс.&lt;&#x2F;p&gt;
&lt;p&gt;Решение нашёл в блоге &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tombuntu.com&#x2F;index.php&#x2F;2008&#x2F;04&#x2F;28&#x2F;workaround-for-pink-shadows-with-compiz&#x2F;&quot;&gt;tombuntu.com&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE&lt;&#x2F;strong&gt;: В Ubuntu эта ошибка исправлена в пакете &lt;em&gt;linux-restricted-modules&lt;&#x2F;em&gt; начиная с версии &lt;code&gt;2.6.24.12-17.36&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Про так называемые «Георгиевские ленточки»</title>
        <published>2008-05-03T00:00:00+00:00</published>
        <updated>2008-05-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/georgy-ribbon/"/>
        <id>https://adf.xyz/ru/blog/georgy-ribbon/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/georgy-ribbon/">&lt;p&gt;Хотел было написать заметку про своё недоброе отношение к так называемым «Георгиевским ленточкам», но оказалось, что автор блога &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080703211549&#x2F;http:&#x2F;&#x2F;shto-delat.livejournal.com&#x2F;&quot;&gt;«Записки сумасшедшего»&lt;&#x2F;a&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080703211549&#x2F;http:&#x2F;&#x2F;shto-delat.livejournal.com&#x2F;17652.html&quot;&gt;уже написал&lt;&#x2F;a&gt; её за меня. Готов подписаться под каждым его словом.&lt;&#x2F;p&gt;
&lt;p&gt;А вы привязали к себе такую ленточку?&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Изменения в блоге</title>
        <published>2008-04-28T00:00:00+00:00</published>
        <updated>2008-04-28T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/blog-update/"/>
        <id>https://adf.xyz/ru/blog/blog-update/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/blog-update/">&lt;p&gt;Приветствую всех моих читателей. На днях мой блог претерпел ряд изменений. Вот они:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Теперь блог работает на Wordpress&lt;&#x2F;li&gt;
&lt;li&gt;Достаточно много старых и неактуальных постов было удалено&lt;&#x2F;li&gt;
&lt;li&gt;Все комментарии были удалены. Ничего особо ценного в них к счастью (или к сожалению) не было&lt;&#x2F;li&gt;
&lt;li&gt;С этого дня тематика блога будет расширена — я буду больше писать про то, что происходит в моей реальной жизни, а также высказывать свою субъективную точку зрения на то, что происходит вокруг меня&lt;&#x2F;li&gt;
&lt;li&gt;В дополнение к тэгам вводится разбиение записей на категории и подкатегории. Преимущество категорий в том, что на каждую из них вы можете подписаться отдельно. Существует две основные категории: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080703211957&#x2F;http:&#x2F;&#x2F;cornelius.net.ru&#x2F;category&#x2F;it&quot;&gt;«про IT»&lt;&#x2F;a&gt; и &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080703211957&#x2F;http:&#x2F;&#x2F;cornelius.net.ru&#x2F;category&#x2F;real-life&quot;&gt;«про жизнь»&lt;&#x2F;a&gt;. Думаю, что большинство моих нынешних читателей будет интересовать категория &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080703211957&#x2F;http:&#x2F;&#x2F;cornelius.net.ru&#x2F;category&#x2F;it&quot;&gt;«про IT»&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Итак, если вы хотите читать &lt;em&gt;все&lt;&#x2F;em&gt; мои посты, то для вас ничего не меняется. Вы просто продолжаете читать мой &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080703211957&#x2F;http:&#x2F;&#x2F;feeds.feedburner.com&#x2F;cornelius&quot;&gt;основной фид&lt;&#x2F;a&gt;. Если вас интересует только IT-тематика, то я рекомендую &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080703211957&#x2F;http:&#x2F;&#x2F;cornelius.net.ru&#x2F;category&#x2F;it&#x2F;feed&quot;&gt;подписаться&lt;&#x2F;a&gt; на категорию &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080703211957&#x2F;http:&#x2F;&#x2F;cornelius.net.ru&#x2F;category&#x2F;it&quot;&gt;«про IT»&lt;&#x2F;a&gt;. А тем, кому тема IT не близка, рекомендую категорию &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080703211957&#x2F;http:&#x2F;&#x2F;cornelius.net.ru&#x2F;category&#x2F;real-life&quot;&gt;«про жизнь»&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Поменял шкуру сайта</title>
        <published>2008-02-29T15:54:02.928872+00:00</published>
        <updated>2008-02-29T15:54:02.928872+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/new-skin-2008/"/>
        <id>https://adf.xyz/ru/blog/new-skin-2008/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/new-skin-2008/">&lt;p&gt;Поменял внешний вид сайта на нечто более радикальное (аж самому страшно). Приглашаю высказать ваше мнение на тему нравится&#x2F;не нравится, стало лучше&#x2F;хуже.&lt;&#x2F;p&gt;
&lt;p&gt;PS. Вот, что было раньше - &lt;code&gt;картинка утрачена&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;!-- http:&#x2F;&#x2F;cornelius.net.ru&#x2F;blog&#x2F;new-skin&#x2F;old-style.png --&gt;
&lt;p&gt;PPS. Смена шкуры отчасти приурочена к предстоящим 2-го марта выборам президента РФ :)&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Ускорение запуска программ с помощью Preload</title>
        <published>2008-02-26T00:00:00+00:00</published>
        <updated>2008-02-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/preload/"/>
        <id>https://adf.xyz/ru/blog/preload/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/preload/">&lt;p&gt;Вчера нашёл интересную заметку через &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080228155355&#x2F;digg.com&#x2F;linux_unix&#x2F;Drastically_Speed_up_your_Linux_System_with_Preload&quot;&gt;Digg&lt;&#x2F;a&gt;. В ней &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080228083933&#x2F;http:&#x2F;&#x2F;www.techthrob.com&#x2F;tech&#x2F;preload.php&quot;&gt;описывается утилита preload&lt;&#x2F;a&gt;, позволяющая ускорить запуск наиболее часто используемых программ.&lt;&#x2F;p&gt;
&lt;p&gt;Данная утилита присутствует во всех репозиториях Debian и устанавливается командой:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; aptitude&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; preload&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Файл с настройками находится в &lt;code&gt;&#x2F;etc&#x2F;preload.conf&lt;&#x2F;code&gt;, но необходимости что-то в нём менять в общем нет – стандартные настройки должны работать нормально.&lt;&#x2F;p&gt;
&lt;p&gt;Существует большая &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080723140630&#x2F;http:&#x2F;&#x2F;www.techthrob.com&#x2F;tech&#x2F;preload_files&#x2F;preload.pdf&quot;&gt;статья, описывающая принцип работы preload&lt;&#x2F;a&gt; с математическим обоснованием. Принцип работы preload я понимаю следующим образом: из всего множества работающих в системе процессов с помощью специального алгоритма выделяются т.н. &lt;em&gt;приложения&lt;&#x2F;em&gt; (applications) – программы, которые пользователь непосредственно использует для работы (браузер, текстовый процессор и т.п.). Например, сервер Apache к приложениям (в этом смысле) не относится. Для каждого приложения определяются файлы, которые оно использует: исполняемые файлы, библиотеки, файлы со шрифтами, значками и т.д. Эти файлы кэшируются в оперативной памяти таким образом, что при очередном запуске приложения нет необходимости читать эти файлы с диска. Результатом является значительное (до двух раз) уменьшение времени запуска приложений.&lt;&#x2F;p&gt;
&lt;p&gt;Напоследок:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Журнал работы preload находится в &lt;code&gt;&#x2F;var&#x2F;log&#x2F;preload.log&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Файл, описывающий текущее состояние preload (со списком кэшируемых файлов) расположен в &lt;code&gt;&#x2F;var&#x2F;lib&#x2F;preload&#x2F;preload-state&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;sourceforge.net&#x2F;projects&#x2F;preload&#x2F;&quot;&gt;Сайт проекта Preload&lt;&#x2F;a&gt; (в данный момент ничего интересного кроме исходников там нет)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Firefox 3 beta 3</title>
        <published>2008-02-13T05:19:00+00:00</published>
        <updated>2008-02-13T05:19:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/firefox-3-beta-3/"/>
        <id>https://adf.xyz/ru/blog/firefox-3-beta-3/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/firefox-3-beta-3/">&lt;p&gt;Очередной бета-релиз Firefox 3 принёс нам следующие изменения:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Киллер-фича: при вводе текста в адресной строке теперь производится поиск не только по истории посещений, но и по вашим закладкам&lt;&#x2F;li&gt;
&lt;li&gt;Улучшена поддержка родных иконок в Linux версии (куда уж лучше?)&lt;&#x2F;li&gt;
&lt;li&gt;В Linux-версии теперь используются родные диалоги открытия файла и печати&lt;&#x2F;li&gt;
&lt;li&gt;При нажатии на иконку сайта открывается окно с информацией о странице. Там же можно настроить разрешения на загрузку картинок, куки и т.п. для данного сайта&lt;&#x2F;li&gt;
&lt;li&gt;Улучшен диалог загрузки файлов: теперь можно ставить загрузку на паузу и она не пропадёт, если закрыть Firefox. В статусной строке отображается время, оставшееся до конца загрузки.&lt;&#x2F;li&gt;
&lt;li&gt;Улучшен диалог управления расширениями. Теперь можно просматривать список доступных расширений прямо в этом диалоге.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080214114635&#x2F;http:&#x2F;&#x2F;mozillalinks.org&#x2F;wp&#x2F;2008&#x2F;02&#x2F;a-deep-look-to-firefox-3-beta-3&#x2F;&quot;&gt;Обзор изменений на английском языке&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;releases.mozilla.org&#x2F;pub&#x2F;firefox&#x2F;releases&#x2F;3.0b3&#x2F;linux-i686&#x2F;ru&#x2F;&quot;&gt;Скачать Firefox 3 beta 3 для Linux (русская версия)&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;PS. Четвертая бета ожидается в конце февраля&lt;&#x2F;p&gt;
&lt;p&gt;PPS. Половина моих расширений отключилась после обновления до третьей беты :( Но мне не привыкать.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Установка Compiz Fusion (Debian + Xfce)</title>
        <published>2008-02-11T01:27:00+00:00</published>
        <updated>2008-02-11T01:27:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/compiz-fusion-debian-xfce-2/"/>
        <id>https://adf.xyz/ru/blog/compiz-fusion-debian-xfce-2/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/compiz-fusion-debian-xfce-2/">&lt;p&gt;В этой заметке я опишу процесс установки и базовой настройки оконного менеджера Compiz Fusion в Debian с рабочим окружением Xfce. &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;compiz-fusion-debian-xfce&#x2F;&quot;&gt;Ранее я писал об этом&lt;&#x2F;a&gt;, но время не стоит на месте, и те инструкции уже устарели.&lt;&#x2F;p&gt;
&lt;p&gt;В данный момент Compiz Fusion вошёл в состав Debian Lenny (testing), поэтому подключать дополнительные репозитории вам не придётся (если только вы не хотите использовать оконный декоратор Emerald, о чём ниже).&lt;&#x2F;p&gt;
&lt;p&gt;Итак, приступим…&lt;&#x2F;p&gt;
&lt;p&gt;Прежде всего установите необходимые пакеты:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; aptitude&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; compiz-core&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; compiz-plugins&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; compizconfig-settings-manager&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; compiz-fusion-plugins-main&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Затем вам следует определиться с выбором оконного декоратора. &lt;em&gt;Оконный декоратор&lt;&#x2F;em&gt; – это программа, которая рисует рамки окон и кнопки типа &quot;Закрыть окно&quot;. Существует три оконных декоратора:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;gtk-window-decorator (GWD)&lt;&#x2F;li&gt;
&lt;li&gt;kde-window-decorator&lt;&#x2F;li&gt;
&lt;li&gt;emerald&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;em&gt;kde-window-decorator&lt;&#x2F;em&gt; мы рассматривать не будем, так как к Xfce он не имеет никакого отношения. А вот &lt;em&gt;GWD&lt;&#x2F;em&gt; и &lt;em&gt;emerald&lt;&#x2F;em&gt; рассмотрим поподробнее.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;gtw-window-decorator&quot;&gt;gtw-window-decorator&lt;a class=&quot;zola-anchor&quot; href=&quot;#gtw-window-decorator&quot; aria-label=&quot;Anchor link for: gtw-window-decorator&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Этот оконный декоратор основан на Metacity (оконный менеджер Gnome) со всеми вытекающими последствиями: он зависит от &lt;em&gt;libmetacity&lt;&#x2F;em&gt; и &lt;em&gt;gconf&lt;&#x2F;em&gt;. Настройки GWD хранятся в gconf, в качестве темы оформления окна используются темы Metacity.&lt;&#x2F;p&gt;
&lt;p&gt;Для установки GWD выполните следующую команду:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; aptitude&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; compiz-gtk&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Для изменения настроек GWD, а также для выбора темы Metacity можно воспользоваться командой:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;gconf-editor&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;compiz-fusion-debian-xfce-2&#x2F;gconf-gwd.png&quot; alt=&quot;GConf Editor - GTK Window Decorator&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;compiz-fusion-debian-xfce-2&#x2F;gconf-metacity.png&quot; alt=&quot;GConf Editor - Metacity&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;emerald&quot;&gt;Emerald&lt;a class=&quot;zola-anchor&quot; href=&quot;#emerald&quot; aria-label=&quot;Anchor link for: emerald&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Этот оконный декоратор не зависит от библиотек Gnome, имеет собственную программу для настройки и выбора темы. Но у него есть существенный &quot;недостаток&quot; – в составе Debian Lenny его нет. Однако существует сторонний репозиторий, которым вы можете воспользоваться для установки Emerald. Для этого добавьте в файл &#x2F;etc&#x2F;apt&#x2F;sources.list следующую строку:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;deb&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; http:&#x2F;&#x2F;download.tuxfamily.org&#x2F;shames&#x2F;debian-sid&#x2F;desktopfx&#x2F;unstable&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; .&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Установите GPG ключ для этого репозитория:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;wget&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; http:&#x2F;&#x2F;download.tuxfamily.org&#x2F;shames&#x2F;A42A6CF5.gpg&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;O-&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; sudo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; apt-key&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; add&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;и обновите списки пакетов:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; aptitude&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; update&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;ВНИМАНИЕ! Этот репозиторий не является официальным репозиторием Debian – используйте его на свой страх и риск.&lt;&#x2F;p&gt;
&lt;p&gt;Для установки Emerald выполните:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; aptitude&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; emerald&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; emerald-themes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Теперь нужно настроить compiz для использования того или иного оконного декоратора. Для этого запустите программу настройки compiz:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;ccsm&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;Откройте&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; раздел&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Оформление окна&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; (в&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; секции&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; Effects&lt;&#x2F;span&gt;&lt;span&gt;). В строке &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;Команда&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; введите&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;`&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;`&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;`&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;shell&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;gtk-window-decorator&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;-replace&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;если вы хотите использовать GWD, или&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;emerald&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;-replace&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;если вы хотите использовать Emerald.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;compiz-fusion-debian-xfce-2&#x2F;compizconfig-decoration.png&quot; alt=&quot;Compiz Settings - Window Decoration&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Теперь соответствующий оконный декоратор будет запускаться вместе с compiz.&lt;&#x2F;p&gt;
&lt;p&gt;Настало время протестировать, работает ли compiz. Запустите команду:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;compiz&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;-replace&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Если всё в порядке, то вы должны увидеть, как изменились рамки у окон. Если рамки окон просто исчезли, то не работает либо compiz, либо оконный декоратор. В этом случае вам надо обратится к &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080000000000*&#x2F;http:&#x2F;&#x2F;wiki.compiz-fusion.org&#x2F;FAQ&quot;&gt;списку наиболее распространённых проблем&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Если же всё прошло успешно, то остаётся сделать так, чтобы в начале сеанса Xfce запускался не стандартный оконный менеджер &lt;em&gt;xfwm4&lt;&#x2F;em&gt;, а &lt;em&gt;compiz&lt;&#x2F;em&gt;. Для этого создайте файл &lt;code&gt;~&#x2F;.config&#x2F;autostart&#x2F;compiz.desktop&lt;&#x2F;code&gt; со следующим содержимым:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[Desktop Entry]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Encoding=UTF-8&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Version=0.9.4&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Type=Application&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Name=compiz&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Comment=&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Exec=compiz --replace&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;StartupNotify=false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Terminal=false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Hidden=false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Это файл автозапуска compiz.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Обновлено:&lt;&#x2F;strong&gt; Также Compiz можно запускать с помощью утилиты &lt;strong&gt;fusion-icon&lt;&#x2F;strong&gt; из одноимённого пакета. В этом случае вместо команды &lt;code&gt;compiz --replace&lt;&#x2F;code&gt; надо запускать &lt;code&gt;fusion-icon&lt;&#x2F;code&gt;. Эта утилита висит в трее и позволяет выбирать и автоматически запускать оконный менеджер&#x2F;декоратор. Пакет fusion-icon совсем недавно появился в Debian sid и должны скоро мигрировать в testing.&lt;&#x2F;p&gt;
&lt;p&gt;Затем выполните команду&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;killall&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; xfwm4&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;и завершите сеанс с сохранением сессии. Теперь при начале нового сеанса xfwm4 запускаться не будет.&lt;&#x2F;p&gt;
&lt;p&gt;Для установки дополнительных плагинов &lt;em&gt;compiz fusion&lt;&#x2F;em&gt; выполните:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; aptitude&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; compiz-fusion-plugins-extra&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Напоследок несколько ссылок на тему Compiz Fusion:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.compiz-fusion.org&#x2F;&quot;&gt;Сайт Compiz Fusion&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.compiz-fusion.org&#x2F;wiki_subdomain&#x2F;index.html&quot;&gt;Wiki Compiz Fusion&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20160513055313&#x2F;http:&#x2F;&#x2F;compiz-themes.org&#x2F;index.php?xcontentmode=101&quot;&gt;Темы для Metacity&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080818133220&#x2F;http:&#x2F;&#x2F;compiz-themes.org&#x2F;index.php?xcontentmode=103&quot;&gt;Темы для Emerald&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Посетил сайт Vesti.ru</title>
        <published>2008-02-08T00:00:00+00:00</published>
        <updated>2008-02-08T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/vesti-channel/"/>
        <id>https://adf.xyz/ru/blog/vesti-channel/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/vesti-channel/">&lt;p&gt;Крутил каналы по телевизору и попал на канал &quot;Вести 24&quot;. Показывали заседание Госдумы, Кудрин зачитывал доклад. Среди прочего упоминался уровень инфляции в 2007 г. Следом за ним выступал Степашин, а за ним господин по фамилии Шуба. Шуба тоже говорил про инфляцию. Слушал я не очень внимательно, но мне показалось, что по словам Кудрина уровень инфляции в 2007 г. составил 10.9%, а по словам Шубы – 11.9%.&lt;&#x2F;p&gt;
&lt;p&gt;У телеканала &quot;Вести 24&quot; есть сайт в Интернете – &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080209163546&#x2F;http:&#x2F;&#x2F;www.vesti.ru&#x2F;&quot;&gt;vesti.ru&lt;&#x2F;a&gt;. Там они выкладывают разные видео и кажется даже транслируют прямой эфир. Я решил поискать там запись выступления Кудрина пятнадцатиминутной давности, чтобы понять, кто из нас троих дурак: Кудрин, Шуба или я. Запись его выступления я не нашёл, зато сделал несколько &quot;весёлых&quot; скриншотов.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;vesti-channel&#x2F;vesti1.png&quot;&gt;Первый скриншот&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;vesti-channel&#x2F;vesti2.png&quot;&gt;Второй скриншот&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;vesti-channel&#x2F;vesti3.png&quot;&gt;Третий скриншот&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;vesti-channel&#x2F;vesti4.png&quot;&gt;Последний скриншот&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;PS. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080205021850&#x2F;http:&#x2F;&#x2F;www.bbc.co.uk&#x2F;&quot;&gt;Сайт БиБиСи&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Вышел Firefox 3 beta2</title>
        <published>2007-12-19T07:03:00+00:00</published>
        <updated>2007-12-19T07:03:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/firefox3-beta2/"/>
        <id>https://adf.xyz/ru/blog/firefox3-beta2/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/firefox3-beta2/">&lt;p&gt;Собственно из заголовка всё должно быть понятно. Я лишь добавлю, что скачать вторую бету можно &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;releases.mozilla.org&#x2F;pub&#x2F;mozilla.org&#x2F;firefox&#x2F;releases&#x2F;3.0b2&#x2F;&quot;&gt;отсюда&lt;&#x2F;a&gt;, либо воспользовавшись встроенной системой обновлений (если у вас стоит beta1). Со списком изменений можно ознакомиться &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;website-archive.mozilla.org&#x2F;www.mozilla.org&#x2F;firefox_releasenotes&#x2F;en-us&#x2F;firefox&#x2F;3.0b2&#x2F;releasenotes&#x2F;&quot;&gt;здесь&lt;&#x2F;a&gt;. Отмечу изменения, наиболее значимые для меня, а значит и для всех вас ©.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Исправлен эпический баг с неработающими горячими клавишами при включенной русской раскладке в Linux&lt;&#x2F;li&gt;
&lt;li&gt;Для отрисовки элементов пользовательского интерфейса теперь используются родные GTK элементы. Речь идёт не о элементах форм на странице (это было ещё в первой бете), а о строке меню, вкладках и т.п. Это же касается и иконок, они теперь берутся из системной темы.&lt;&#x2F;li&gt;
&lt;li&gt;При вводе произвольного текста в адресной строке производится поиск по журналу посещений. При этом можно вводить несколько слов. Результаты теперь отображаются в две строки: в первой - заголовок страницы, во второй - адрес. Удобно.&lt;&#x2F;li&gt;
&lt;li&gt;Окно со списком расширений больше не тормозит при прокрутке (тормоза появились в первой бете). Возможно, это касается и других подобных окон.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Боты-переводчики в GTalk</title>
        <published>2007-12-19T00:00:00+00:00</published>
        <updated>2007-12-19T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/gtalk-translation-bots/"/>
        <id>https://adf.xyz/ru/blog/gtalk-translation-bots/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/gtalk-translation-bots/">&lt;p&gt;В GTalk появились боты-переводчики. Подробнее об этом можно узнать из этого &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20071229030031&#x2F;http:&#x2F;&#x2F;habrahabr.ru&#x2F;blog&#x2F;google&#x2F;32734.html&quot;&gt;хабратопика&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Пример общения с ботами приведён ниже:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[22:22:16] ADF: привет&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[22:22:16] RU2EN: hello&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[22:22:26] ADF: как дела?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[22:22:26] RU2EN: how are you?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[22:23:08] ADF: hello&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[22:23:09] EN2RU: привет&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[22:23:14] ADF: how are you?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[22:23:14] EN2RU: Ты кто?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Смеялсо…&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Firefox 3 Beta1 и Tab Mix Plus</title>
        <published>2007-11-20T14:24:19.481567+00:00</published>
        <updated>2007-11-20T14:24:19.481567+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/firefox3-beta1-and-tab-mix-plus/"/>
        <id>https://adf.xyz/ru/blog/firefox3-beta1-and-tab-mix-plus/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/firefox3-beta1-and-tab-mix-plus/">&lt;p&gt;Тихой сапой вышла теперь уже настоящая первая бета &lt;strong&gt;Firefox 3&lt;&#x2F;strong&gt;. (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.opennet.ru&#x2F;opennews&#x2F;art.shtml?num=12846&quot;&gt;читать по-русски&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20071120124402&#x2F;http:&#x2F;&#x2F;developer.mozilla.org&#x2F;devnews&#x2F;index.php&#x2F;2007&#x2F;11&#x2F;19&#x2F;firefox-3-beta-1-now-available-for-download&#x2F;&quot;&gt;читать по-английски&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080505052643&#x2F;http:&#x2F;&#x2F;www.mozilla.com&#x2F;en-US&#x2F;firefox&#x2F;all-beta.html&quot;&gt;качать отсюда&lt;&#x2F;a&gt;). И снова, засучив рукава и сделав бэкап профиля, я стал её мучить с целью приспособить для ежедневного использования. А для этого мне необходимо во что бы то ни стало запустить расширение &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070428005625&#x2F;https:&#x2F;&#x2F;addons.mozilla.org&#x2F;en-US&#x2F;firefox&#x2F;addon&#x2F;1122&quot;&gt;Tab Mix Plus&lt;&#x2F;a&gt;, стабильная версия которого с FF3 несовместима. Если вы тоже используете TMP и хотите попробовать FF3b1, то читайте дальше.&lt;&#x2F;p&gt;
&lt;p&gt;Во-первых, сделайте бэкап своего профиля! Вдруг что-нибудь сломается. У меня пока не сломалось&lt;&#x2F;p&gt;
&lt;p&gt;Во-вторых, скачайте последнюю (на момент написания этого текста) девелоперскую версию Tab Mix Plus - &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20071125080050&#x2F;http:&#x2F;&#x2F;tmp.garyr.net&#x2F;dev-builds&#x2F;tab_mix_plus-0.3.6.0.071030.xpi&quot;&gt;http:&#x2F;&#x2F;tmp.garyr.net&#x2F;dev-builds&#x2F;tab_mix_plus-0.3.6.0.071030.xpi&lt;&#x2F;a&gt;. ВНИМАНИЕ! Надо именно скачать файл и сохранить его на диск, а не устанавливать. Если попробуете установить, всё равно ничего не получится.&lt;&#x2F;p&gt;
&lt;p&gt;В-третьих, откройте скачанный файл с расширением (это фактически обычный zip-архив), в нём есть файл &lt;code&gt;install.rdf&lt;&#x2F;code&gt;. В этом файле надо удалить строку&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;em&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;updateURL&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;http:&#x2F;&#x2F;tmp.garyr.net&#x2F;updates-dev.rdf&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;em&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;updateURL&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Вместо удаления можно её закомментировать, заключив в &lt;code&gt;&amp;lt;!-- --&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;После этого откройте модифицированный файл с расширением в Firefox. Запустится обычный диалог установки расширения.&lt;&#x2F;p&gt;
&lt;p&gt;Вот и всё. У меня работает.&lt;&#x2F;p&gt;
&lt;p&gt;Чуть не забыл. Удаляя указанную выше строку из файла &lt;code&gt;install.rdf&lt;&#x2F;code&gt;, вы тем самым отключаете автоматическое обновление этого расширения. Поэтому вам придётся следить за выходом новых версий самостоятельно.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Как правильно писать комментарии</title>
        <published>2007-11-19T11:13:00+00:00</published>
        <updated>2007-11-19T11:13:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/smart-comments/"/>
        <id>https://adf.xyz/ru/blog/smart-comments/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/smart-comments/">&lt;!-- TODO: fix links to comments  --&gt;
&lt;p&gt;Каждый день в Сети появляются миллионы новых комментариев к записям с блогах, контенту различных сайтов и социальных сетей. При этом большинство из них являются откровенным мусором, который засоряет индексы поисковых машин, повышает нагрузку на каналы связи (пусть и не значительно, но всё же) и просто не стоит времени, потраченного на его написание и чтение. Лично меня такая ситуация совершенно не устраивает, поэтому я и написал эту заметку.&lt;&#x2F;p&gt;
&lt;p&gt;Источником вдохновения для меня служит классическая статья Эрика Рэймонда &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070812171822&#x2F;http:&#x2F;&#x2F;www.catb.org&#x2F;~esr&#x2F;faqs&#x2F;smart-questions.html&quot;&gt;&quot;Как правильно задавать вопросы&quot;&lt;&#x2F;a&gt;. Однако я не пытаюсь составить такое же подробное руководство. Я лишь формулирую несколько тезисов, призванных улучшить качество ваших комментариев (а значит и качество сетевого контента в целом) и, по возможности, иллюстрирую их примерами.&lt;&#x2F;p&gt;
&lt;p&gt;Итак, вот несколько принципов и правил, о которых следует помнить при написании комментариев.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Не пишите комментарии.&lt;&#x2F;strong&gt; Всё очень просто — если предположить, что число действительно хороших комментариев составляет 5% от их общего числа (мне кажется, что это весьма оптимистическое предположение), то ваш комментарий будет плохим с вероятностью 0.95. В таком случае стоит ли его писать? Если вы всё-таки уверены, что стоит, то помните:&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Комментарий должен быть содержательным.&lt;&#x2F;strong&gt; Иными словами, в нём должен присутствовать некоторый объём полезной информации. Очевидный пример несодержательного комментария — легендарный +1. В идеале, несодержательные комментарии должны незамедлительно удаляться автором комментируемого материала (или другим модератором) — чтобы не увеличивать информационную энтропию Сети.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Комментарии — это не средство для личной переписки.&lt;&#x2F;strong&gt; Пример:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Оля пишет в своём блоге: &lt;em&gt;Сходила сегодня в кино на &quot;Берегись автомобиля&quot;. Смоктуновский бесподобен. Пожалуй надо будет пересмотреть — очень понравилось.&lt;&#x2F;em&gt;
Витя комментирует: &lt;em&gt;А мы завтра собираемся на него сходить. Пойдёшь с нами?&lt;&#x2F;em&gt;
Оля: &lt;em&gt;С удовольствием :)&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Хотя эти комментарии формально и являются содержательными, но они абсолютно бесполезны для всех пользователей Сети, кроме Оли и Вити. Да и для них эта информация станет бесполезной уже на следующий день. А ведь существует множество специально предназначенных для подобного общения средств: электронная почта, мгновенные сообщения, мобильная связь и SMS в конце концов. Почему бы не воспользоваться этими средствами?&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Комментарии — это не способ показать всем, какой вы умный.&lt;&#x2F;strong&gt; Пример:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Петя пишет: &lt;em&gt;В новой Убунте обещают сделать новый графический менеджер пакетов [далее идёт описание возможностей нового менеджера].&lt;&#x2F;em&gt;
Вася комментирует: &lt;em&gt;GUI отстой, apt-get рулит!&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Во-первых, комментарий Васи является офтопиком. Во-вторых, Вася написал данный комментарий, чтобы продемонстрировать своё знание команды &lt;em&gt;apt-get&lt;&#x2F;em&gt; и презрение к графическим интерфейсам. Однако это не интересует никого, кроме самого Васи. А если Вася действительно хотел провести сравнительный анализ графических и консольных средств управления пакетами, то ему следовало бы сделать это в его собственном блоге. Как, у Васи нет блога? Да у каждой семиклассницы уже есть &quot;днявка на лирушечке&quot;. Если Вася хочет демонстрировать всем остроту своего ума, ему определённо стоит завести блог.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Комментарии — это не место для дискуссии.&lt;&#x2F;strong&gt; Продолжим предыдущий пример.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Миша отвечает на комментарий Васи: &lt;em&gt;Командной строкой только красноглазики пользуются!&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Миша в данном случае провоцирует Васю (и других поклонников командной строки) на дискуссию (а точнее на бессмысленные препирательства). Скорее всего эта дискуссия будет протекать в направлении, перпендикулярном тематике изначального материала. И закончится она скорее всего переходом на личности или упоминанием Гитлера. Никого, кроме участников дискуссии (число которых как правило не больше двух-трёх), данные дебаты обычно не интересуют.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Комментарии — это не способ указать автору на его ошибки.&lt;&#x2F;strong&gt; Если вы нашли ошибку в статье — необходимо сообщить об этом автору. Но не стоит делать этого в комментариях. Представьте ситуацию: вы находитесь в комнате, которая полна народу. И замечаете, что у молодого человека в противоположном конце комнаты расстёгнута ширинка. Вы хотите обратить его внимание на этот факт и как вы это делаете? Большими буквами пишете рядом с ним на стене: &quot;У этого парня расстёгнута ширинка&quot; и рисуете стрелку, указывающую на него. Глупо, не так ли? Так же и с ошибками в статье — вам следует связаться с автором лично (например, по электронной почте). Разумеется, для этого автор должен предоставить читателям какую-нибудь контактную информацию (в моём случае эта информация находится &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080703212229&#x2F;http:&#x2F;&#x2F;cornelius.net.ru&#x2F;contacts&#x2F;&quot;&gt;здесь&lt;&#x2F;a&gt;). Сообщайте об ошибке через комментарий только если вы всё обыскали, но так и не нашли способа связаться с автором напрямую. Кстати, это относится не только к ошибкам в статье, но и к пожеланиям по её улучшению.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Не используйте комментарии, чтобы хвалить&#x2F;ругать автора&#x2F;статью.&lt;&#x2F;strong&gt; Я имею в виду комментарии типа &quot;Спасибо, хорошая статья&quot; &#x2F; &quot;Плохая статья, ничего интересного&quot;. Если вас переполняет чувство благодарности к автору — поблагодарите его лично (по электронной почте или другим способом, см. выше), а лучше всего — опубликуйте ссылку на его статью у себя в блоге. Если хотите поругать — помните, что это вряд ли улучшит качество материала. Возможно, вы просто хотите поделится с другими читателями своим субъективным мнением. Но ведь комментарии расположены к конце статьи. Когда человек до них доберётся, у него уже будет своё собственное субъективное мнение. А ваше его вряд ли заинтересует. Вообще, высказывать субъективное мнение лучше в своём субъективном блоге.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Комментарии — это не справочная служба.&lt;&#x2F;strong&gt; Пример:&lt;&#x2F;p&gt;
&lt;p&gt;Вася написал статью о настройке mod_rewrite в apache2. Петя комментирует:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Слушай, помоги разобраться с настройкой mod_cache. [далее идёт серия вопросов про mod_cache].&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Вполне вероятно, что Вася знает ответы на эти вопросы. Но с какой стати он должен на них отвечать? И какое отношение эти вопросы имеют к mod_rewrite?&lt;&#x2F;p&gt;
&lt;p&gt;Также не следует задавать вопросы, если вы не уверены, что они интересны кому-то кроме вас — пусть даже эти вопросы относятся к тематике статьи.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Как видите, существует множество разновидностей плохих комментариев. Что же представляют из себя хорошие комментарии? А вот что:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Комментарий, дополняющий комментируемый материал полезной информацией&lt;&#x2F;strong&gt;, или ссылающийся на источник такой информации. Если используется ссылка, она должна содержать соответствующее пояснение. &lt;a href=&quot;&#x2F;ru&#x2F;blog&#x2F;ssh-tricks&#x2F;#comment892856083&quot;&gt;Пример&lt;&#x2F;a&gt; &lt;a href=&quot;&#x2F;ru&#x2F;blog&#x2F;ssh-tricks&#x2F;#comment330396719&quot;&gt;хорошего&lt;&#x2F;a&gt; &lt;a href=&quot;&#x2F;ru&#x2F;blog&#x2F;ssh-tricks&#x2F;#comment684390526&quot;&gt;комментария&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Правильно заданный вопрос по теме статьи.&lt;&#x2F;strong&gt; Ответ на такой вопрос может оказаться полезным для других читателей. &lt;a href=&quot;&#x2F;ru&#x2F;blog&#x2F;ssh-tricks&#x2F;#comment2107192238&quot;&gt;Пример&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Трэкбэк через комментарий.&lt;&#x2F;strong&gt; Если под впечатлением прочитанного материала вы сами что-то написали (пусть даже это заметка с критикой), но отправить трэкбэк нет возможности — оставьте ссылку на вашу заметку в комментарии. Но не забудьте сопроводить ссылку поясняющим текстом.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;И помните — &lt;strong&gt;комментарии остаются в сети НАВСЕГДА.&lt;&#x2F;strong&gt; Именно так. &lt;strong&gt;НАВСЕГДА&lt;&#x2F;strong&gt;. Это значит, что при благоприятном развитии человеческой истории, ваш комментарий смогут прочитать не только ваши внуки, но и вы сами в старости. Понравятся ли вам ваши комментарии, если вы увидите их лет через 20 (или хотя бы через месяц)?&lt;&#x2F;p&gt;
&lt;p&gt;На этом всё. Жду ваших комментариев — но только в соответствии с приведёнными выше рекомендациями :)&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Android: android.util.Log - замена для System.out.println()</title>
        <published>2007-11-18T12:38:05.938418+00:00</published>
        <updated>2007-11-18T12:38:05.938418+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/android-logging/"/>
        <id>https://adf.xyz/ru/blog/android-logging/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/android-logging/">&lt;p&gt;Начинаю цикл заметок про разработку приложений для Android. Сегодня расскажу об одной полезной штуке — &lt;code&gt;android.util.Log&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Одной из устоявшихся конструкций в Java является &lt;code&gt;System.out.println(&quot;Some String&quot;);&lt;&#x2F;code&gt; — эта функция выводит переданную в качестве параметра строку на стандартный вывод. Это может быть весьма полезно при отладке приложения. Однако эта функция бесполезна при запуске Android-приложения в эмуляторе, так как доступа к стандартному выводу у нас нет. И тут на помощь приходит класс &lt;code&gt;android.util.Log&lt;&#x2F;code&gt;. Кстати, я рекомендую всегда использовать логи вместо стандартного вывода — это относится не только к Android, но и вообще к любым платформам. Потому что логи — это тру.&lt;&#x2F;p&gt;
&lt;p&gt;Использовать &lt;code&gt;android.util.Log&lt;&#x2F;code&gt; очень просто:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;java&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-keyword&quot;&gt;import&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-import&quot;&gt; android&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-import&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-import&quot;&gt;util&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-import&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-import&quot;&gt;Log&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-variable z-other&quot;&gt;Log&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;i&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;TAG&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;My cool message&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Существует пять уровней сообщений: &lt;code&gt;ERROR&lt;&#x2F;code&gt;, &lt;code&gt;WARN&lt;&#x2F;code&gt;, &lt;code&gt;INFO&lt;&#x2F;code&gt;, &lt;code&gt;DEBUG&lt;&#x2F;code&gt;, &lt;code&gt;VERBOSE&lt;&#x2F;code&gt;. В приведённом выше примере создаётся информационное сообщение (уровень &lt;code&gt;INFO&lt;&#x2F;code&gt;) — для этого используется метод &lt;code&gt;i()&lt;&#x2F;code&gt;. Для вывода сообщений других уровней используются методы &lt;code&gt;e()&lt;&#x2F;code&gt;, &lt;code&gt;w()&lt;&#x2F;code&gt;, &lt;code&gt;d()&lt;&#x2F;code&gt; и &lt;code&gt;v()&lt;&#x2F;code&gt;. Надеюсь, что определить, какому уровню соответствует каждый из этих методов, не составит труда. Для вывода отладочной информации рекомендуется использовать уровень &lt;code&gt;DEBUG&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;TAG&lt;&#x2F;code&gt; — это строка, предназначенная для идентификации источника сообщения. Это может быть, например, имя класса, в котором создаётся сообщение. В этом случае &lt;code&gt;TAG&lt;&#x2F;code&gt; лучше сделать константой:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;java&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-storage&quot;&gt;private&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage&quot;&gt; static&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage&quot;&gt; final&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-type z-java&quot;&gt; String&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other&quot;&gt; TAG&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; =&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;MyCoolClass&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Чтобы просматривать логи в &lt;code&gt;Eclipse&lt;&#x2F;code&gt;, нужно включить соответсвующий View: &lt;em&gt;Window → Show View → Other...&lt;&#x2F;em&gt; В открывшемся окне выбрать &lt;em&gt;Android → Log Cat&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;android-logging&#x2F;android-showloccatview.png&quot; alt=&quot;android-loccat-view&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;В этом View можно просматривать все уровни логов и фильтровать сообщения по тэгам и другим параметрам.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;android-logging&#x2F;android-logcatview.png&quot; alt=&quot;android-logcat-view&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20071115005607&#x2F;http:&#x2F;&#x2F;code.google.com&#x2F;android&#x2F;reference&#x2F;android&#x2F;util&#x2F;Log.html&quot;&gt;Документация для класса android.util.Log&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Это всё, что я знаю про логи. Следующая заметка будет про различные типы ресурсов и файл &lt;code&gt;R.java&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Второй взгляд на Android</title>
        <published>2007-11-17T08:31:00+00:00</published>
        <updated>2007-11-17T08:31:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/second-glance-at-android/"/>
        <id>https://adf.xyz/ru/blog/second-glance-at-android/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/second-glance-at-android/">&lt;p&gt;Во-первых, вышло минорное обновление для SDK Android — &lt;code&gt;m3-rc22a&lt;&#x2F;code&gt; (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20071117063602&#x2F;http:&#x2F;&#x2F;code.google.com&#x2F;android&#x2F;download.html&quot;&gt;качать отсюда&lt;&#x2F;a&gt;) и плагина для Eclipse — &lt;code&gt;ADT 0.3.1*&lt;&#x2F;code&gt;(обновляется стандартными средствами). Список исправлений &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20071117012352&#x2F;http:&#x2F;&#x2F;code.google.com&#x2F;android&#x2F;RELEASENOTES.html&quot;&gt;тут&lt;&#x2F;a&gt; — для меня ничего интересного нет, так что качать не стал.&lt;&#x2F;p&gt;
&lt;p&gt;Во-вторых, я начал писать программку для Android. Настоящую рабочую программку, которой мне не хватает на моём нынешнем телефоне. Когда-то &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;grisbi&#x2F;&quot;&gt;я писал о Grisbi&lt;&#x2F;a&gt;, приложении для ведения бюджета. Моя программка будет по сути максимально облегчённой версией такого приложения. С её помощью можно будет фиксировать траты, когда вы долгое время не имеете доступа к компьютеру. Моя цель — сделать максимально простой и удобный интерфейс, чтобы программой можно было пользоваться постоянно и не напрягаясь.&lt;&#x2F;p&gt;
&lt;p&gt;Сначала было сложно перейти от учебных примеров к написанию чего-то своего, но теперь многие основные вещи стали понятны и процесс пошёл. Исходники в ближайшее время публиковать не собираюсь, но когда будет готова более менее рабочая версия — выложу бинарник.&lt;&#x2F;p&gt;
&lt;p&gt;Ещё в планах программка для создания списка покупок. Есть пара интересных идей на эту тему. Получится своеобразный Shopping Suite.&lt;&#x2F;p&gt;
&lt;p&gt;Планирую и дальше писать об Android, в том числе о разработке приложений.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Android (aka gphone) - первый взгляд</title>
        <published>2007-11-13T07:47:00+00:00</published>
        <updated>2007-11-13T07:47:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/first-glance-at-andriod/"/>
        <id>https://adf.xyz/ru/blog/first-glance-at-andriod/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/first-glance-at-andriod/">&lt;p&gt;Любопытства ради (а не &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20071113135638&#x2F;http:&#x2F;&#x2F;code.google.com&#x2F;android&#x2F;adc.html&quot;&gt;ради денег&lt;&#x2F;a&gt;) поставил SDK &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20071114032023&#x2F;http:&#x2F;&#x2F;code.google.com&#x2F;android&#x2F;index.html&quot;&gt;Android&lt;&#x2F;a&gt; — новой мобильной платформы от Google (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20071114114446&#x2F;http:&#x2F;&#x2F;code.google.com&#x2F;android&#x2F;intro&#x2F;installing.html&quot;&gt;инструкции по установке&lt;&#x2F;a&gt;). SDK доступен под Linux, OS X и Windows, также имеется плагин для Eclipse. «Hello World» пока не написал, зато сделал пару скриншотов и скринкаст. Рассказывать ничего не буду — смотрите сами.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;first-glance-at-andriod&#x2F;android-sdk-1.jpg&quot; alt=&quot;android-sdk-1&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;first-glance-at-andriod&#x2F;android-sdk-2.jpg&quot; alt=&quot;android-sdk-2&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Самое интересное, разумеется, на видео:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Видео утеряно&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;!-- &lt;p class=&quot;center&quot;&gt;&lt;OBJECT width=&quot;400&quot; height=&quot;353&quot;&gt;&lt;PARAM name=&quot;movie&quot; value=&quot;http:&#x2F;&#x2F;video.rutube.ru&#x2F;247e5763977141f06198bf5c98a97ba4&quot; &#x2F;&gt;&lt;PARAM name=&quot;wmode&quot; value=&quot;window&quot; &#x2F;&gt;&lt;PARAM name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;&#x2F;PARAM&gt;&lt;EMBED src=&quot;http:&#x2F;&#x2F;video.rutube.ru&#x2F;247e5763977141f06198bf5c98a97ba4&quot; type=&quot;application&#x2F;x-shockwave-flash&quot; wmode=&quot;window&quot; width=&quot;400&quot; height=&quot;353&quot; allowFullScreen=&quot;true&quot; &#x2F;&gt;&lt;&#x2F;OBJECT&gt;&lt;&#x2F;p&gt;

Этот же ролик в нормальном разрешении и качестве вы можете скачать [отсюда](http:&#x2F;&#x2F;files.grove.org.ru&#x2F;cornelius&#x2F;video&#x2F;android-sdk.mpeg) (~16M). --&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Включил комментарии обратно</title>
        <published>2007-11-12T15:56:21.703586+00:00</published>
        <updated>2007-11-12T15:56:21.703586+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/comments-are-back/"/>
        <id>https://adf.xyz/ru/blog/comments-are-back/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/comments-are-back/">&lt;p&gt;Сабж. Защиту от спама реализовал через &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20071114233923&#x2F;http:&#x2F;&#x2F;akismet.com&#x2F;&quot;&gt;Akismet&lt;&#x2F;a&gt;, используя &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20071018033058&#x2F;http:&#x2F;&#x2F;www.voidspace.org.uk&#x2F;python&#x2F;akismet_python.html&quot;&gt;эту библиотеку&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Желающие могут протестировать антиспам фильтр в комментариях к этой записи. Если возникнут проблемы с комментированием, пожалуйста &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080703212229&#x2F;http:&#x2F;&#x2F;cornelius.net.ru&#x2F;contacts&#x2F;&quot;&gt;сообщите мне&lt;&#x2F;a&gt; об этом.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Попробовал Firefox 3 pre-beta 1</title>
        <published>2007-11-08T17:30:52.802029+00:00</published>
        <updated>2007-11-08T17:30:52.802029+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/firefox-3-prebeta1/"/>
        <id>https://adf.xyz/ru/blog/firefox-3-prebeta1/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/firefox-3-prebeta1/">&lt;p&gt;Много шума было из-за выхода якобы первой беты &lt;strong&gt;Firefox 3&lt;&#x2F;strong&gt;, которая на самом деле оказалась &lt;strong&gt;release candidate для беты&lt;&#x2F;strong&gt; (оказывается, бывает и такое). Ранее я уже пробовал ставить одну из альфа-версий, но жизненно важные для меня расширения отказались с ней работать, поэтому я решил дождаться хотя бы беты и тогда уже изучить данный продукт поподробнее. Теперь, когда бета уже практически готова, я решил повторить попытку. Вкратце изложу свои впечатления.&lt;&#x2F;p&gt;
&lt;p&gt;Во-первых, большинство установленных у меня расширений с третьей версией так и не работают. Но в некоторых случаях это поправимо - бывает, что разработчики расширения выкладывают совместимую версию где-то в закромах своего сайта. Это в частности относится в Firebug, который для меня наиболее важен (нужен для работы).&lt;&#x2F;p&gt;
&lt;p&gt;Во-вторых, для отрисовки элементов форм (поля ввода, выпадающие списки, кнопки и т.д.) теперь используются родные GTK-виджеты. То есть все кнопки и прочие инпуты выглядят так, как в остальных ваших приложениях, а не как безликие серые прямоугольники. Это очень приятное изменение.&lt;&#x2F;p&gt;
&lt;p&gt;В-третьих, улучшена работа с закладками. На них теперь можно навешивать тэги (не вижу в этом особого смысла, но кому-то наверное пригодится). А ещё теперь ведётся статистика посещений разных сайтов - вот это уже интереснее. На панели закладок появилась кнопка &lt;strong&gt;Places&lt;&#x2F;strong&gt;, которая открывает доступ к наиболее часто посещающимся сайтам, страницам и т.п. Короче - быстрый доступ к различным спискам закладок.&lt;&#x2F;p&gt;
&lt;p&gt;В-четвёртых, улучшены некоторые диалоги, например, при установке расширения с &quot;левого&quot; сайта сверху вылезает панель с одной кнопкой - &quot;Разрешить&quot;. Надо на неё нажать и расширение установится без лишних вопросов. Во втором Firefox тоже вылезает панель, но там надо сначала добавить сайт в список разрешённых, а потом заново запросить установку - неудобно. Ещё пример: окошко &quot;Запомнить пароль для сайта&quot; превратилось в выползающую сверху панель.&lt;&#x2F;p&gt;
&lt;p&gt;В-пятых, в настройках появился новый раздел для выбора приложения для обработки того или иного типа файлов. Например для документов варианты такие: &lt;em&gt;Каждый раз спрашивать&lt;&#x2F;em&gt;, &lt;em&gt;Загружать,&lt;&#x2F;em&gt; &lt;em&gt;Открывать с помощью OpenOffice&lt;&#x2F;em&gt;. Я слышал, что в третьем Firefox можно будет не загружать документы, а сразу открывать их в Google Docs. В данный момент этого делать нельзя, но видимо движение идёт именно в эту сторону.&lt;&#x2F;p&gt;
&lt;p&gt;В-шестых, в разделе &lt;em&gt;Дополнения&lt;&#x2F;em&gt; к &lt;em&gt;Расширениям&lt;&#x2F;em&gt; и &lt;em&gt;Темам&lt;&#x2F;em&gt; добавился раздел &lt;em&gt;Плагины&lt;&#x2F;em&gt;. Я подумал, что это всякие штуки типа Flash и Java, но оказалось, что это не так. В данный момент в этом списке присутствует плагин для обработки различных типов файлов, который и реализует функциональность, описанную выше. Видимо плагины это что-то типа расширений, но они более тесно интегрируются с браузером и являются платформозависимыми.&lt;&#x2F;p&gt;
&lt;p&gt;В-седьмых, кажется увеличилась скорость отрисовки страниц, в частности при использовании кнопки &lt;em&gt;Назад&lt;&#x2F;em&gt;. Но не сильно. Говорю &quot;кажется&quot;, потому что это субъективное наблюдение, замеров я не производил.&lt;&#x2F;p&gt;
&lt;p&gt;А ещё он у меня упал. Просто при открытии страницы. Я добросовестно отправил отчёт об ошибке разработчиком и вернулся обратно на &lt;em&gt;Iceweasel 2.0.0.8&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Как изменить значения кнопок на клавиатуре и мыши (Linux)</title>
        <published>2007-11-07T03:02:00+00:00</published>
        <updated>2007-11-07T03:02:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/xmodmap/"/>
        <id>https://adf.xyz/ru/blog/xmodmap/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/xmodmap/">&lt;p&gt;В &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;new-keyboard&#x2F;&quot;&gt;прошлом посте&lt;&#x2F;a&gt; я рассказал о покупке новой клавиатуры и возникших в связи с этим проблемах. Одной из таких проблем было непривычное для меня расположение кнопок в блоке Home&#x2F;End&#x2F;Del&#x2F;Ins&#x2F;PgUp&#x2F;PgDown. Поэтому мне пришлось переключиться на использование цифровой клавиатуры, на которой имеются аналогичные клавиши. Однако оказалось, что эти клавиши не работают как следует в некоторых приложениях.&lt;&#x2F;p&gt;
&lt;p&gt;Причина кроется в том, что при нажатии, например, обычного Delete генерируется сигнал &lt;code&gt;Delete&lt;&#x2F;code&gt; (что вполне логично), а при нажатии Delete на цифровом блоке генерируется сингал &lt;code&gt;KP_Delete&lt;&#x2F;code&gt; (что тоже в общем не лишено логики). Видимо именно этот префикс &lt;code&gt;KP_&lt;&#x2F;code&gt; и вызывает неприятности, например у меня не всегда срабатывало сочетание &lt;code&gt;Shift+KP_Insert&lt;&#x2F;code&gt; (сами догадаетесь, что оно должно делать).&lt;&#x2F;p&gt;
&lt;p&gt;Помогла мне замечательная утилита &lt;code&gt;xmodmap&lt;&#x2F;code&gt;, с помощью которой можно переопределить значения клавиш (например, чтобы &lt;code&gt;KP_Delete&lt;&#x2F;code&gt; работал как простой &lt;code&gt;Delete&lt;&#x2F;code&gt;)&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;xmodmap&lt;&#x2F;code&gt; запускается от имени пользователя и действует в текущем сеансе X. Детальное описание её работы можно прочитать в &lt;code&gt;man xmodmap&lt;&#x2F;code&gt;, я лишь вкратце изложу те её возможности, которыми я воспользовался.&lt;&#x2F;p&gt;
&lt;p&gt;Для начала надо определить, какие сигналы вызываются при нажатии той или иной клавиши, а также разобраться с кодами клавиш. В этом поможет утилита &lt;code&gt;xev&lt;&#x2F;code&gt;. Она позволяет отслеживать все события, генерируемые клавиатурой и мышью (нажатия клавиш, нажатия кнопок мыши и даже её движение). Запускать её надо из консоли, потому что именно там будет отображаться информация о производимых вами действиях. Вот пример её вывода:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;KeyPress event, serial 31, synthetic NO, window 0x6600001,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    root 0x13b, subw 0x0, time 211379992, (-35,-32), root:(716,420),&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    state 0x0, keycode 91 (keysym 0xff9f, KP_Delete), same_screen YES,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    XLookupString gives 0 bytes:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    XmbLookupString gives 0 bytes:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    XFilterEvent returns: False&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Обратите внимание на &lt;code&gt;keycode&lt;&#x2F;code&gt; – цифровой идентификатор клавиши и &lt;code&gt;KP_Delete&lt;&#x2F;code&gt; – как эта клавиша интерпретируется.&lt;&#x2F;p&gt;
&lt;p&gt;Итак, первое, что я сделал – заставил работать кнопки на цифровом блоке. Для этого мне нужно, чтобы кнопка с &lt;code&gt;keycode 91&lt;&#x2F;code&gt; срабатывала не как &lt;code&gt;KP_Delete&lt;&#x2F;code&gt;, а как простой &lt;code&gt;Delete&lt;&#x2F;code&gt;. Для этого я воспользовался следующей командой:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;xmodmap&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;e&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;keycode 91 = Delete&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Думаю, что дополнительных пояснений тут не требуется. Аналогичную операцию я провёл и для остальных клавиш цифрового блока (Ins, Home, End, PgUp, PgDown, курсоры и Enter).&lt;&#x2F;p&gt;
&lt;p&gt;Так как я никогда не использовал цифровую клавиатуру для набора цифр, я решил полностью отключить &lt;em&gt;NumLock&lt;&#x2F;em&gt; (а заодно и &lt;em&gt;CapsLock&lt;&#x2F;em&gt;). Вот, что я для этого сделал:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;xmodmap&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;e&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;remove lock = Caps_Lock&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;xmodmap&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;e&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;remove mod2 = Num_Lock&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Теперь при нажатии NumLock сигнал &lt;code&gt;Num_Lock&lt;&#x2F;code&gt; вызывается, но модификатор при этом не включается.&lt;&#x2F;p&gt;
&lt;p&gt;Кстати, посмотреть текущую таблицу модификаторов можно запустив &lt;code&gt;xmodmap&lt;&#x2F;code&gt; без параметров.&lt;&#x2F;p&gt;
&lt;p&gt;Кроме проблем с клавиатурой я упомянул и о проблеме с мышкой – очень туго нажимается средняя кнопка (колёсико). При этом непосредственно под колёсиком расположены две &quot;бесполезные&quot; кнопки, которые нажимаются безо всяких проблем. Почему бы не приспособить одну из них под среднюю кнопку? Здесь мне опять помог &lt;code&gt;xmodmap&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Для начала надо определить номера кнопок – придётся снова обратится к &lt;code&gt;xev&lt;&#x2F;code&gt;. Имеем: средняя кнопка – номер 2, &quot;бесполезные&quot; кнопки – номера 8 и 9. Затем выполняем следующую команду:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;xmodmap&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;e&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;pointer = 1 8 3 4 5 6 7 2 9&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Обратите внимание – я поменял местами цифры 2 и 8. Это значит, что восьмая кнопка будет выполнять роль второй (средней), и наоборот.&lt;&#x2F;p&gt;
&lt;p&gt;Кстати, вот так&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;xmodmap&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;e&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;pointer = 3 2 1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;текущем сеансе X. Для удобства я вынес все указанные выше директивы в файл &lt;code&gt;~&#x2F;.xmodmaprc&lt;&#x2F;code&gt; и в начале сеанса запускаю &lt;code&gt;xmodmap&lt;&#x2F;code&gt;, передав ему имя файла в качестве параметра:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;xmodmap&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;home&#x2F;andrey&#x2F;.xmodmaprc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Настоятельно рекомендую к прочтению &lt;code&gt;man xmodmap&lt;&#x2F;code&gt;, возможно вы найдёте своё применение для этой утилиты.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Беда с новой клавиатурой</title>
        <published>2007-11-06T09:50:51.192146+00:00</published>
        <updated>2007-11-06T09:50:51.192146+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/new-keyboard/"/>
        <id>https://adf.xyz/ru/blog/new-keyboard/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/new-keyboard/">&lt;p&gt;В воскресенье вечером мой старый добрый &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070714190210&#x2F;http:&#x2F;&#x2F;www.genius.ru&#x2F;Product.aspx?ProductID=8952&quot;&gt;Genius Slim Star&lt;&#x2F;a&gt; отдал богу душу, в частности его левый Alt. Верой и правдой он прослужил мне года два или даже три, но ничто не вечно. Немного поразмыслив, я решил взять ему на замену беспроводной комплект клава+мышь. Утром в понедельник, вооружившись деньгами, я бодро побежал в магазин.&lt;&#x2F;p&gt;
&lt;p&gt;Выбор беспроводных комплектов оказался достаточно велик, но я сразу обратил внимание на &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20081207155945&#x2F;http:&#x2F;&#x2F;www.logitech.com&#x2F;index.cfm&#x2F;keyboards&#x2F;keyboard_mice_combos&#x2F;devices&#x2F;147&amp;amp;cl=ru,ru&quot;&gt;Logitech Cordless Desktop LX710&lt;&#x2F;a&gt;. Мне понравился внешний вид - приятное исключение из кучи этих уродцев с выпирающими со всех сторон подставками для рук и мультимедийными клавишами. И хотя у LX710 тоже есть подставка для рук и куча кнопок, смотрится всё это очень опрятно. Однако было одно &quot;но&quot; - &quot;толстые&quot; клавиши от которых я полностью отвык за годы использования Slim Star. Но, решив, что новые ощущения это полезно, я всё-таки остановил свой выбор на LX710.&lt;&#x2F;p&gt;
&lt;p&gt;Вот как оно выглядит:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;new-keyboard&#x2F;keyboard.jpg&quot; alt=&quot;Новая клавиатура&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;new-keyboard&#x2F;mouse.jpg&quot; alt=&quot;Новая мышь&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;С подключением устройства никаких трудностей не возникло - воткнул адаптер в USB, законнектил и поехали. Но с первых же минут использования обнаружился ряд проблем:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Дикое расположение кнопок. Я очень часто использую кнопки из блока &lt;code&gt;Home&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;End&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;PgUp&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;PgDown&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;Ins&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;Delete&lt;&#x2F;code&gt;, расположенного между основной и цифровой клавиатурой. На LX710 с этим блоком кнопок поступили жестоко (см. картинку). Если на картинке видно плохо, то я поясню - выкинули Ins, а остальные кнопки перемешали. Позже обнаружилось, что &lt;code&gt;Ins&lt;&#x2F;code&gt; находится на месте &lt;code&gt;ScrollLock&lt;&#x2F;code&gt;, а &lt;code&gt;ScrollLock&lt;&#x2F;code&gt; отсутствует в принципе.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;На мышке невероятно туго нажимается средняя кнопка (колёсико), а при нажатии отсутствует щелчок. Видимо в качестве компенсации имеется возможность наклонять колёсико вправо-влево, изображая горизонтальный скроллинг.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Вы хотели новых ощущений? Получите! Печатать на &quot;толстых&quot; клавишах оказалось очень непривычно. Не думал, что будет так тяжело.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Отсутствуют индикаторы &lt;code&gt;Num&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;Caps&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;ScrollLock&lt;&#x2F;code&gt;. Как класс. Правда в текущей версии X.org эти индикаторы не работают, так что я от них уже отвык. Но тем не менее.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Не работают мультимедийные клавиши. На самом деле это не было неожиданностью - я знал, что так и будет (я использую Xfce, в котором поддержка мультимедийных клавиш &quot;из коробки&quot; отсутствует).&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Но всё не так плохо. Для решения проблем 1 и 2 я нашёл обходной путь, для проблемы 3 решение кажется нашёл, но ещё не опробовал, проблема 4 меня не сильно волнует, а проблема 5 решена полностью. Найденные решения могут оказаться полезными для кого-то, поэтому я подробно их опишу в следующих постах.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Хитрости SSH (перевод статьи &quot;SSH Tricks&quot;)</title>
        <published>2007-09-27T02:35:00+00:00</published>
        <updated>2007-09-27T02:35:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/ssh-tricks/"/>
        <id>https://adf.xyz/ru/blog/ssh-tricks/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/ssh-tricks/">&lt;p&gt;Ниже представлен мой перевод замечательной статьи SSH Tricks, оригинал которой расположен по адресу: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20071007092229&#x2F;http:&#x2F;&#x2F;polishlinux.org&#x2F;apps&#x2F;ssh-tricks&#x2F;&quot;&gt;http:&#x2F;&#x2F;polishlinux.org&#x2F;apps&#x2F;ssh-tricks&#x2F;&lt;&#x2F;a&gt;. Публикуется с согласия автора оригинальной статьи.&lt;&#x2F;p&gt;
&lt;p&gt;SSH (secure shell) – это программа, позволяющая получить защищённый доступ к удалённым файловым системам &lt;em&gt;[в &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ru.wikipedia.org&#x2F;wiki&#x2F;SSH&quot;&gt;Wikipedia&lt;&#x2F;a&gt; дано более точное определение, прим.пер.]&lt;&#x2F;em&gt;. Не все знают, что SSH обладает рядом дополнительных мощных возможностей, таких как вход без запроса пароля, автоматическое выполнение команд в удалённой системе и даже монтирование удалённых папок. В этой статье мы рассмотрим эти, а также некоторые другие возможности SSH.&lt;&#x2F;p&gt;
&lt;p&gt;SSH работает по принципу клиент-сервер. Это значит, что на сервере, к которому мы хотим подключиться, должен быть запущен демон SSH. В современных дистрибутивах Linux сервер SSH, как правило, установлен по умолчанию. Сервер запускается командой типа &lt;code&gt;&#x2F;etc&#x2F;init.d&#x2F;ssh start&lt;&#x2F;code&gt;. По умолчанию он ожидает соединений на порту 22, так что если вы используете фаервол, убедитесь, что этот порт открыт. После установки и запуска SSH сервера мы можем удалённо подключиться к нему. Чтобы войти пользователем &lt;code&gt;user1&lt;&#x2F;code&gt; на сервер &lt;code&gt;remote_server&lt;&#x2F;code&gt; (который указывается через доменное имя или IP адрес) нужно воспользоваться следующей простой командой:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;ssh&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; user1@remote_server&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;После ввода пароля для доступа к удалённой машине, появится изменённое приглашение для ввода команд, которое выглядит следующим образом:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;user1@remote_server:~$&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Это означает что мы успешно произвели вход и сейчас работаем в окружении удалённого сервера. Теперь каждая команда будет выполняться на удалённом сервере, с привилегиями того пользователя, под которым мы вошли (в данном случае &lt;em&gt;user1&lt;&#x2F;em&gt;).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;scp-zashchishchionnoe-kopirovanie-failov&quot;&gt;SCP – защищённое копирование файлов&lt;a class=&quot;zola-anchor&quot; href=&quot;#scp-zashchishchionnoe-kopirovanie-failov&quot; aria-label=&quot;Anchor link for: scp-zashchishchionnoe-kopirovanie-failov&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;SCP является составной частью пакета OpenSSH. Эта команда позволяет копировать файлы или папки с удалённого сервера (или на него), используя для этого протокол SSH. Благодаря использованию SSH, SCP является отличной заменой для небезопасного протокола FTP, которой широко используется в Интернете. Не все знают, что в FTP пароли передаются по сети в виде открытого текста, а это значит, что злоумышленники могут с лёгкостью перехватить их. Так что SCP это намного более надёжная альтернатива. Простейший пример использования SCP выглядит так:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;scp&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; file.txt&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; user1@remote_server:~&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;При этом локальный файл &lt;code&gt;file.txt&lt;&#x2F;code&gt; будет скопирован на удалённый сервер и помещён в домашний каталог пользователя &lt;code&gt;user1&lt;&#x2F;code&gt;. Вместо &lt;code&gt;~&#x2F;&lt;&#x2F;code&gt; можно использовать другой путь, например &lt;code&gt;&#x2F;tmp&lt;&#x2F;code&gt;, &lt;code&gt;&#x2F;home&#x2F;public&lt;&#x2F;code&gt; или любую другую папку, в которой пользователь &lt;code&gt;user1&lt;&#x2F;code&gt; имеет права на запись.&lt;&#x2F;p&gt;
&lt;p&gt;Чтобы скопировать файл с удалённого сервера на локальный компьютер, используется другой синтаксис SCP:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;scp&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; user1@remote_server:~&#x2F;file.txt&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; .&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;При этом файл &lt;code&gt;file.txt&lt;&#x2F;code&gt;, расположенный в домашнем каталоге пользователя &lt;code&gt;user1&lt;&#x2F;code&gt; в удалённой системе, будет скопирован в локальную папку (в которой мы сейчас находимся).&lt;&#x2F;p&gt;
&lt;p&gt;Стоит обратить внимание на следующие параметры SCP:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;-r&lt;&#x2F;strong&gt; – рекурсивное копирование папок (включая подкаталоги)&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;-P port&lt;&#x2F;strong&gt; – использовать нестандартный порт (по умолчанию 22) – этот параметр следует использовать если сервер ожидает соединений на нестандартном порту. Этот параметр может быть полезен при соединении из сети, защищённой фаерволом. Запуск SSH сервера на порту 443 (используемом для защищённых HTTP соединений) это лучший способ обойти ограничения, установленные сетевым администратором.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;graficheskie-interfeisy-dlia-scp&quot;&gt;Графические интерфейсы для SCP&lt;a class=&quot;zola-anchor&quot; href=&quot;#graficheskie-interfeisy-dlia-scp&quot; aria-label=&quot;Anchor link for: graficheskie-interfeisy-dlia-scp&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Если вам не нравится работать с консолью, то вы можете использовать графический (или псевдографический) клиент SCP. &lt;strong&gt;Midnight Commander&lt;&#x2F;strong&gt; — одна из программ, обладающей функциями SCP клиента (Меню → Правая панель&#x2F;Левая панель → Shell-соединение). &lt;strong&gt;Nautilus&lt;&#x2F;strong&gt; и &lt;strong&gt;Konqueror&lt;&#x2F;strong&gt; также поддерживают SCP. Для подключения к удалённой системе в адресной строке надо ввести &lt;code&gt;ssh:&#x2F;&#x2F;user1@remote_server:~&#x2F;&lt;&#x2F;code&gt;. При этом файлы могут копироваться как если бы они были расположены локально. В среде MS Windows есть отличное приложение &lt;strong&gt;WinSCP&lt;&#x2F;strong&gt;. Его интерфейс очень похож на Total Commander. Кстати, существует плагин для &lt;strong&gt;Total Commander&lt;&#x2F;strong&gt;, позволяющий выполнять SCP подключения.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ssh-bez-parolei-generatsiia-kliuchei&quot;&gt;SSH без паролей – генерация ключей&lt;a class=&quot;zola-anchor&quot; href=&quot;#ssh-bez-parolei-generatsiia-kliuchei&quot; aria-label=&quot;Anchor link for: ssh-bez-parolei-generatsiia-kliuchei&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Необходимость ввода пароля при каждом SSH соединении может сильно раздражать. С другой стороны, незащищённое удалённое соединение это огромный риск с точки зрения безопасности. Решением этой проблемы является авторизация с помощью пары из открытого (public) и секретного (private) ключей.&lt;&#x2F;p&gt;
&lt;p&gt;Пара ключей обычно генерируется с помощью команды &lt;strong&gt;ssh-keygen&lt;&#x2F;strong&gt;. Ниже показан результат выполнения такой команды. Возможно использование ключей RSA или DSA.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ssh-keygen&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;t&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; rsa&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;Generating&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; public&#x2F;private&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; rsa&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; key&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; pair.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;Enter&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; file&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; in&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; which&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; to&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; save&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; the&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; key&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;&#x2F;home&#x2F;user1&#x2F;.ssh&#x2F;id_rsa&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-support&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;Enter&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; passphrase&lt;&#x2F;span&gt;&lt;span&gt; (empty&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; for&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; no&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; passphrase&lt;&#x2F;span&gt;&lt;span&gt;):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;Enter&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; same&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; passphrase&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; again:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;Your&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; identification&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; has&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; been&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; saved&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; in&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;&#x2F;home&#x2F;user1&#x2F;.ssh&#x2F;id_rsa.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;Your&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; public&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; key&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; has&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; been&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; saved&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; in&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;&#x2F;home&#x2F;user1&#x2F;.ssh&#x2F;id_rsa.pub.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;The&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; key&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; fingerprint&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; is:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Когда программа просит указать пароль для ключа, нужно просто нажать ENTER. При этом будет создан ключ без пароля. Имейте в виду, что это представляет угрозу безопасности, так как это понижает безопасность удалённой системы до уровня безопасности вашей локальной системы &lt;em&gt;[злоумышленник, получивший доступ к секретному ключу, хранящемуся в вашей локальной системе, может воспользоваться им для доступа к удалённой системе - прим. пер.]&lt;&#x2F;em&gt;. Поэтому делайте это на свой страх и риск. Когда &lt;code&gt;ssh-keygen&lt;&#x2F;code&gt; закончит свою работу, вы увидите, что были сгенерированы два ключа. Секретный ключ находится в &lt;code&gt;&#x2F;home&#x2F;user1&#x2F;.ssh&#x2F;id_rsa&lt;&#x2F;code&gt;. Его нельзя делать общедоступным ни при каких обстоятельствах. Второй ключ (открытый) находится в &lt;code&gt;&#x2F;home&#x2F;user1&#x2F;.ssh&#x2F;id_rsa.pub&lt;&#x2F;code&gt;, к нему можно предоставить публичный доступ.&lt;&#x2F;p&gt;
&lt;p&gt;Теперь, если мы хотим получить доступ к удалённой системе с нашего локального компьютера без запроса пароля (используя только эти два ключа), мы должны добавить информацию о нашем открытом ключе в файл &lt;code&gt;authorized_keys&lt;&#x2F;code&gt;, расположенный в папке &lt;code&gt;~&#x2F;.ssh&lt;&#x2F;code&gt; в удалённой системе. Для этого можно воспользоваться следующими командами:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; scp&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;home&#x2F;user1&#x2F;.ssh&#x2F;id_rsa.pub&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;user1@remote_server:~&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ssh&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; user1@remote_server&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; cat&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ~&#x2F;id_rsa.pub&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; &amp;gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ~&#x2F;.ssh&#x2F;authorized_keys&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Обратите внимание, что третья команда выполняется на удалённом сервере. После этой процедуры все действия, выполняемые на удалённом сервере через SSH не будут требовать ввода пароля. Это позволит существенно упростить нашу работу с удалённым сервером.&lt;&#x2F;p&gt;
&lt;p&gt;Если вам нужен беспарольный доступ с удалённого сервера на локальный, аналогичная процедура должна быть проведена с удалённого сервера. Авторизация с использованием ключей это односторонний процесс. Секретный ключ может авторизовать публичный, но не наоборот.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Обновлено&lt;&#x2F;strong&gt;: если вы столкнулись с проблемами при использовании доступа по ключу, то вам может помочь статья &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20071005032433&#x2F;http:&#x2F;&#x2F;blog.codefront.net&#x2F;2007&#x2F;02&#x2F;28&#x2F;debugging-ssh-public-key-authentication-problems&#x2F;&quot;&gt;Debugging SSH public key authentication problems&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;vypolnenie-komand-v-udalionnoi-sisteme&quot;&gt;Выполнение команд в удалённой системе&lt;a class=&quot;zola-anchor&quot; href=&quot;#vypolnenie-komand-v-udalionnoi-sisteme&quot; aria-label=&quot;Anchor link for: vypolnenie-komand-v-udalionnoi-sisteme&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Теперь, когда мы можем войти в удалённую системы без пароля, почему бы не выполнить несколько удалённых команд? В некоторых случаях это может быть полезно, например, когда нам нужно выполнять некоторую команду ежедневно. Раньше мы не могли автоматизировать этот процесс, так как требовался ручной ввод пароля (или указание его в виде простого текста, что является небезопасным).&lt;&#x2F;p&gt;
&lt;p&gt;Один из интересных способов применения беспарольного входа это «удалённое оповещение». Допустим, что на удалённом сервере работает очень важный процесс, например веб-сервер Apache. Мы хотим получить уведомление, когда система начинает испытывать нехватку ресурсов (жёсткий диск переполнен или нагрузка на систему слишком высока). В этом случае мы можем отправить уведомление по электронной почте. Но помимо этого, мы можем выполнить удалённую команду, которая воспроизведёт звуковой сигнал в нашей локальной системе. Для этого можно воспользоваться, например, такой командой:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;ssh&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; user1@local_server&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;play \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-string&quot;&gt;&#x2F;usr&#x2F;share&#x2F;sounds&#x2F;gaim&#x2F;arrive.wav&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Эта команда, выполненная скриптом на удалённом сервере, произведёт беспарольный вход пользователем &lt;code&gt;user1&lt;&#x2F;code&gt; на &lt;code&gt;local_server&lt;&#x2F;code&gt; (на котором мы обычно работаем) и воспроизведёт файл с помощью команды &lt;code&gt;play&lt;&#x2F;code&gt; (которая обычна доступна в Linux).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;perenapravlenie-seansa-x11-x-forwarding-udalionnyi-zapusk-graficheskikh-prilozhenii&quot;&gt;Перенаправление сеанса X11 (X forwarding) – удалённый запуск графических приложений&lt;a class=&quot;zola-anchor&quot; href=&quot;#perenapravlenie-seansa-x11-x-forwarding-udalionnyi-zapusk-graficheskikh-prilozhenii&quot; aria-label=&quot;Anchor link for: perenapravlenie-seansa-x11-x-forwarding-udalionnyi-zapusk-graficheskikh-prilozhenii&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Одной из наименее известных функций SSH является перенаправление протокола X. Это позволяет запускать практически любое X приложение удалённо! Для этого всего лишь нужно добавить параметр &lt;strong&gt;-X&lt;&#x2F;strong&gt; при соединении с удалённым сервером:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;ssh&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;X&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; user1@remote_server&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;После этого изображения всех запущенных X приложений будут перенаправлены на ваш локальный X сервер. В файле &lt;code&gt;&#x2F;etc&#x2F;ssh&#x2F;ssh_config&lt;&#x2F;code&gt; можно включить постоянное использование перенаправления X11 (указав &lt;code&gt;ForwardX11 yes&lt;&#x2F;code&gt;). Разумеется, чтобы этот параметр сработал, удалённый SSH сервер должен также поддерживать перенаправление X11. Настроить это можно отредактировав файл &lt;code&gt;&#x2F;etc&#x2F;ssh&#x2F;sshd_config&lt;&#x2F;code&gt;. Однако в большинстве дистрибутивов Linux необходимые настройки уже выполнены по умолчанию.&lt;&#x2F;p&gt;
&lt;p&gt;Следующий пример показывает запуск одиночной команды с X перенаправлением:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;ssh&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;X&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; user1@remote_server&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;psi&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;При этом на удалённом сервере будет запущена программа PSI, а её изображение будет направлено на локальный экран.&lt;&#x2F;p&gt;
&lt;p&gt;Разумеется, скорость приложений, выполняемых удалённо, будет зависеть в первую очередь от скорости сетевого соединения. В локальной сети они будут работать практически без задержек (даже такие вещи как Totem, воспроизводящий фильм DivX). В случае интернет соединения, DSL линии будет достаточно, чтобы приложения типа Skype или Thunderbird работали без особых проблем.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;sshfs-montirovanie-udalionnoi-papki&quot;&gt;SSHFS – монтирование удалённой папки&lt;a class=&quot;zola-anchor&quot; href=&quot;#sshfs-montirovanie-udalionnoi-papki&quot; aria-label=&quot;Anchor link for: sshfs-montirovanie-udalionnoi-papki&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Работать с файлами, расположенными на удалённом сервере, через SSH может быть неудобно, особенно если приходится часто копировать различные файлы в обоих направлениях. Использование протокола &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070303091751&#x2F;http:&#x2F;&#x2F;www.linux.org&#x2F;lessons&#x2F;short&#x2F;fish&#x2F;x55.html&quot;&gt;fish:&#x2F;&#x2F;&lt;&#x2F;a&gt; в Midnight Commander или Konqueror является частичным решением, но &lt;code&gt;fish&lt;&#x2F;code&gt; работает медленнее SSH и часто тормозит при копировании файлов. Идеальным решением было бы смонтировать удалённый ресурс, и работать с ним через SSH. И такая возможность есть, благодаря &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libfuse&#x2F;sshfs&quot;&gt;sshfs&lt;&#x2F;a&gt; и проекту &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;libfuse&#x2F;libfuse&quot;&gt;fuse&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Fuse&lt;&#x2F;strong&gt; это модуль ядра (недавно он был принят в официальную ветку 2.6), позволяющий непривилегированным пользователям монтировать различные файловые системы. &lt;strong&gt;SSHFS&lt;&#x2F;strong&gt; это программа, созданная самим автором &lt;code&gt;fuse&lt;&#x2F;code&gt;, которая позволяет монтировать удалённые папки или файловые системы, используя SSH. Суть проста – удалённая папка монтируются в папку локальной файловой системы. После этого все операции над этой папкой производятся как если бы это была обычная локальная папка, с той только разницей, что файлы перемещаются через SSH в фоновом режиме.&lt;&#x2F;p&gt;
&lt;p&gt;Установить &lt;strong&gt;fuse&lt;&#x2F;strong&gt; и &lt;strong&gt;sshfs&lt;&#x2F;strong&gt; в Ubuntu &lt;em&gt;[и Debian - прим. пер.]&lt;&#x2F;em&gt; очень просто:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;apt-get&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; sshfs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;После этого остаётся только добавить пользователя, которому мы хотим предоставить право на монтирование файловых систем через SSH, в группу &lt;code&gt;fuse&lt;&#x2F;code&gt; (используя команду &lt;code&gt;usermod -G -a fuse user1&lt;&#x2F;code&gt; &lt;em&gt;[или adduser user1 fuse, что проще - прим. пер.]&lt;&#x2F;em&gt; или вручную отредактировав файл &lt;em&gt;&#x2F;etc&#x2F;group&lt;&#x2F;em&gt;). Также необходимо, чтобы был загружен модуль &lt;em&gt;fuse&lt;&#x2F;em&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;modprobe&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; fuse&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;После этого, мы можем смонтировать удалённую папку с помощью &lt;em&gt;sshfs&lt;&#x2F;em&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;mkdir&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ~&#x2F;remote_folder&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;sshfs&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; user1@remote_server:&#x2F;tmp&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ~&#x2F;remote_folder&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Указанная выше команда смонтирует папку &lt;code&gt;&#x2F;tmp&lt;&#x2F;code&gt;, расположенную на удалённом сервере, в папку &lt;code&gt;~&#x2F;remote_folder&lt;&#x2F;code&gt; на локальной машине. Копирование любых файлов в эту папку будет производится по сети с использованием SCP. Редактирование, создание и удаление файлов будет производится таким же образом.&lt;&#x2F;p&gt;
&lt;p&gt;По окончании работы с удалённой системы мы можем отмонтировать её:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;fusermount&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;u&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; ~&#x2F;remote_folder&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Если мы постоянно работаем с этой папкой, то можно добавить её в таблицу &lt;code&gt;&#x2F;etc&#x2F;fstab&lt;&#x2F;code&gt;. При этом она будет автоматически монтироваться при загрузки системы, либо можно будет монтировать её вручную (при использовании параметра &lt;em&gt;noauto&lt;&#x2F;em&gt;) без необходимости каждый раз указывать адрес удалённой папки. Пример записи в &lt;em&gt;&#x2F;etc&#x2F;fstab&lt;&#x2F;em&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;sshfs#user1@remote_server:&#x2F;tmp&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&#x2F;home&#x2F;user1&#x2F;remote_folder&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; fuse&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;    defaults,auto&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;    0&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Если мы планируем использовать &lt;code&gt;fuse&lt;&#x2F;code&gt; и &lt;code&gt;sshfs&lt;&#x2F;code&gt; регулярно, то нужно добавить &lt;code&gt;fuse&lt;&#x2F;code&gt; в файл &lt;code&gt;&#x2F;etc&#x2F;modules&lt;&#x2F;code&gt;. Иначе придётся каждый раз загружать модуль &lt;code&gt;fuse&lt;&#x2F;code&gt; вручную.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;zakliuchenie&quot;&gt;Заключение&lt;a class=&quot;zola-anchor&quot; href=&quot;#zakliuchenie&quot; aria-label=&quot;Anchor link for: zakliuchenie&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Как видите, SSH это мощный инструмент для удалённого доступа. Если вам приходится часто работать с удалёнными UNIX системами, то вам стоит освоить его функции и использовать их на практике. Умение работать с SSH помогает сделать ежедневную работу более эффективной и приятной.&lt;&#x2F;p&gt;
&lt;p&gt;Автор данной статьи попросил меня сделать следующую пометку:&lt;&#x2F;p&gt;
&lt;p&gt;This text is a translation of article &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20071007092229&#x2F;http:&#x2F;&#x2F;polishlinux.org&#x2F;apps&#x2F;ssh-tricks&#x2F;&quot;&gt;SSH Tricks&lt;&#x2F;a&gt; by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;borys.musielak.eu&#x2F;&quot;&gt;Borys Musielak&lt;&#x2F;a&gt; published on GNU&#x2F;Linux vortal &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;polishlinux.org&quot;&gt;PolishLinux.org&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Ночь, Firefox, CSS, Squid, Apache, OS X, индус</title>
        <published>2007-09-12T10:02:00+00:00</published>
        <updated>2007-09-12T10:02:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/sleepless-night/"/>
        <id>https://adf.xyz/ru/blog/sleepless-night/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/sleepless-night/">&lt;p&gt;Сегодня лёг спать в четыре часа утра, надо было в срочном порядке обеспечить работоспособность одного приложения. Подробности под катом, но если вам не близка тема настройки Squid&#x2F;Apache и общения с индусами - не читайте.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[13:53:26] A.F.: вчера до 4 утра с американским сервером бодался&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[13:53:31] A.F.: только сейчас встал&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[13:53:39] A.F.: там интересный глюк был&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[13:53:48] Д.Ф.: на тектониксе?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[13:53:53] A.F.: нет, по работе&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[13:54:18] A.F.: firefox сайт отображал без таблиц стилей, хотя они при этом&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;нормально загружались&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[13:54:29] A.F.: остальные браузеры работали нормально&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[13:55:24] A.F.: проблема была в том, что какая-то сволочь в процессе публикации&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;заменяла Content-Type у CSS на text&#x2F;plain&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[13:55:37] A.F.: сволочей там две: Apache и Squid&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[13:55:51] A.F.: оказался модуль mod_mime_magic в Apache&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[13:56:26] A.F.: всё осложнялось дурацкой настройкой всяческих rewrite и redirect&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[13:56:37] A.F.: и ещё тем, что это всё работает на OS X&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[13:56:58] A.F.: и ещё наличием местного админа-индуса&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[13:57:02] Д.Ф.: кто ж там так нашалил-то?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[13:57:09] A.F.: вот и затянулось до 4 утра&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[13:57:22] A.F.: а никто особо не шалил, само так получилось&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[13:57:39] A.F.: этот mime_magic по дефолту там включен&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[13:58:03] A.F.: в этой OS X апач 1.3 стоит&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[13:58:28] A.F.: сквид там висит на 80 порту, он и работает как прокси в основном&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[13:58:38] A.F.: апач используется только для https&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[13:58:46] Д.Ф.: ну, включен и включен, не могли же апачевцы CSS на text переписать&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[13:59:24] A.F.: я сильно сомневаюсь, что туда кто-то из местных руками лазил&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[13:59:51] A.F.: индус предпочитает отсидется, чтобы кто-нибудь за него всё сделал&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:00:23] Д.Ф.: понятно&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:00:57] A.F.: сквид перенаправляет запросы для определённого адреса на порт 81,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;где висит апач&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:01:06] A.F.: апач делает редирект на порт 443&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:01:31] A.F.: на порту 443 висит тот же самый апач, и работает там по стандартной&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;схеме с zope&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:01:41] A.F.: вот так&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:02:03] A.F.: при этом там есть два сайта: старый и новый&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;оба работают вот таким макаром&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:02:08] Д.Ф.: зато враги не догадаются :))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:02:14] A.F.: в общем запутаться немудрено&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:02:40] A.F.: индус меня порадовал&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:02:52] A.F.: я его попросил отключить старый сайт временно&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:03:08] A.F.: он сказал &amp;quot;без проблем, щас сделаю&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:03:16] A.F.: прошло пять минут&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:03:27] A.F.: он пишет &amp;quot;не могу, там удалять надо&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:03:52] A.F.: настройки сайтов там хранятся в &#x2F;etc&#x2F;httpd&#x2F;sites&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:04:10] A.F.: т.е. файл надо физически убрать из папки, чтобы он в конфигурацию не&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;включался&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:04:10] Д.Ф.: уже понял :))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:04:28] A.F.: я ему говорю, чтобы он куда-нибудь переместил, а потом обратно&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;восстановит&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:04:39] A.F.: он сказал &amp;quot;точно!&amp;quot; и переместил&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:05:15] A.F.: потом не без гордости сказал, что &amp;quot;если что, у него там делаются&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;полные бэкапы всего диска&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:05:25] A.F.: видимо они не раз его спасали&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:05:57] Д.Ф.: ну... можешь наш диалог на блог выложить :)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:06:15] A.F.: угу, я тоже про это думаю&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:11:01] A.F.: индус всё делает через webmin, я его спросил, как апача через&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;командную строку перезагрузить?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:11:17] A.F.: он сказал &#x2F;opt&#x2F;apache2&#x2F;bin&#x2F;apachectl restart&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:11:23] A.F.: я поверил&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:11:32] A.F.: вижу, что-то не работает&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:11:50] A.F.: лезу в webmin, там написано Apache 1.3 :&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[14:15:58] Д.Ф.: ну, вебмин - самое оно для индусов. сперва вроде все правильно&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;делает, но рано или поздно что-то приходится и прямо в конфиги&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;писать. а там вебмин все комменты вычистил :&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Купил новый MP3 плеер: Samsung YP-T9</title>
        <published>2007-09-03T06:38:00+00:00</published>
        <updated>2007-09-03T06:38:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/new-audio-player-samsung-yp-t9/"/>
        <id>https://adf.xyz/ru/blog/new-audio-player-samsung-yp-t9/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/new-audio-player-samsung-yp-t9/">&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;new-audio-player-samsung-yp-t9&#x2F;samsung-yp-t9.jpg&quot; alt=&quot;Samsung YP-T9&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;На днях умер мой старый плеер Samsung YP-F1 (правда потом он реанимировался), поэтому было решено купить новый. Я уже давно положил глаз на YP-T9, прежде всего из-за поддержки Bluetooth. К тому же в нём присутствует т.н. аудио-библиотека, наподобие той, что есть в Quodlibet. То есть все песни в нём индексируются и их можно просматривать по жанрам, исполнителям или альбомам.&lt;&#x2F;p&gt;
&lt;p&gt;Плеер оказался действительно достойным по качеству звука и удобству использования, однако при попытках подружить его с Linux обнаружился ряд проблем&lt;&#x2F;p&gt;
&lt;p&gt;Для начала надо сказать об общеизвестных проблемах этого плеера, которые часто упоминаются в Интернете:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Плеер не распознаётся как USB Mass Storage.&lt;&#x2F;strong&gt; Проще говоря, он не подключается как обычный флэш-накопитель. Эта проблема упоминается только на англоязычных сайтах, так как в США этот плеер продаётся с какой-то дурацкой прошивкой, не поддерживающей UMS. Решается это поиском нормальной прошивки и перепрошивкой. Для России это неактуально, у нас всё работает из коробки.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Аудио-библиотека работает только при закачивании песен с помощью специальной программы Samsung Media Studio.&lt;&#x2F;strong&gt; Об этом в частности пишет в своём &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.mobile-review.com&#x2F;mp3&#x2F;review&#x2F;samsung-yp-t9.shtml&quot;&gt;обзоре&lt;&#x2F;a&gt; сайт mobile-review.com. К счастью эта проблема также решается использованием более свежей прошивки. При этом в меню системных настроек плеера появляется пункт &quot;Обновление библиотеки&quot;. Обновление надо производить после закачки новых песен или удаления старых. В моём плеере этот пункт был сразу.&lt;&#x2F;p&gt;
&lt;p&gt;Теперь о проблемах, с которыми столкнулся лично я и о способах их решения:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;QuodLibet не распознаёт плеер как Media Device.&lt;&#x2F;strong&gt; Это значит, что нужно вручную копировать файлы на плеер, при этом неизбежно будут возникать проблемы с Windows-несовместимыми символами в именах файлов (если копировать через QuodLibet, то он об этом позаботится). После недолгого изучения исходников QuodLibet я обнаружил следующее:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Список медиа-устройств QuodLibet получает из HAL (hardware abstraction layer)&lt;&#x2F;li&gt;
&lt;li&gt;Устройство должно предоставлять функцию &lt;code&gt;portable_audio_player&lt;&#x2F;code&gt; (предоставляемые функции называются capabilities в терминологии HAL).&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Открыв &lt;code&gt;hal-device-manager&lt;&#x2F;code&gt; я обнаружил, что мой плеер предоставляет только функцию &lt;code&gt;storage&lt;&#x2F;code&gt;, то есть распознаётся как простая флэшка. Подключив свой старый плеер (который неожиданно ожил) я убедился, что он функцию &lt;code&gt;portable_audio_player&lt;&#x2F;code&gt; предоставляет. Настала очередь ковырять HAL. И вот что я наковырял:&lt;&#x2F;p&gt;
&lt;p&gt;В HAL имеется специальная база устройств. В ней перечислены устройства различных производителей, указаны их возможности и т.п. Именно на эту базу HAL опирается при определении capabilities. База эта до недавнего времени входила в состав пакета hal, теперь она вынесена в отдельный модуль &lt;code&gt;hal-info&lt;&#x2F;code&gt;. Описания MP3-плееров находятся в файле &lt;code&gt;&#x2F;usr&#x2F;share&#x2F;hal&#x2F;fdi&#x2F;information&#x2F;10freedesktop&#x2F;10-usb-music-players.fdi&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Оказалось, что хранится там всё в достаточно простом формате. Чтобы добавить свой плеер в базу я просто скопировал запись, соответствующую моему старому плееру и поменял в ней product_id (его я узнал через hal-device-manager):&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;&amp;lt;!--&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment&quot;&gt; YP-T9 &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-comment&quot;&gt;--&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;match&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; key&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;@storage.originating_device:usb.product_id&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; int&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;0x5055&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;merge&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; key&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;portable_audio_player.type&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; type&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;generic&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;merge&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;merge&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; key&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;portable_audio_player.access_method&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;type&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;storage&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;merge&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;append&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; key&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;portable_audio_player.output_formats&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;type&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;strlist&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;audio&#x2F;x-ms-wma&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;append&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;append&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; key&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;portable_audio_player.output_formats&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;type&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;strlist&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;application&#x2F;ogg&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;append&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;append&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity&quot;&gt; key&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;portable_audio_player.input_formats&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity&quot;&gt;type&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;strlist&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;audio&#x2F;mpeg&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;append&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag&quot;&gt;match&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;(соответствующий патч я отправил в список рассылки HAL)&lt;&#x2F;p&gt;
&lt;p&gt;После этого оставалось только перезапустить hal и переподключить мой плеер к компьютеру. Теперь Quodlibet распознаёт его как полноценный плеер. Проблема решена. Но это ещё не конец.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;При копировании файлов и обновлении библиотеки, плеер отказывается показывать список исполнителей, альбомов и т.п.&lt;&#x2F;strong&gt; Потратив очень много времени на выяснение причины, я пришёл к выводу, что он либо не поддерживает тэги IDv2, либо не поддерживает в них кодировку UTF-8. Так или иначе, если в файле присутствуют &lt;strong&gt;только&lt;&#x2F;strong&gt; тэги IDv1, то всё работает нормально. В моей музыкальной коллекции используются только тэги IDv2 в кодировке UTF-8. Кстати, на сегодняшний день это единственно правильный способ хранить тэги в mp3 файлах.&lt;&#x2F;p&gt;
&lt;p&gt;Так как переписывать тэги для всей моей коллекции мне совершенного не хотелось, я написал скрипт, который нужно применять к файлам, уже записанным на плеер. Этот скрипт ищет mp3 файлы, и если в них есть тэги IDv2, то создаёт IDv1 тэги в кодировке cp1251, а тэги IDv2 удаляет. Сприпт этот можно взять &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;files.grove.org.ru&#x2F;cornelius&#x2F;scripts&#x2F;IDv2toIDv1.py&quot;&gt;тут&lt;&#x2F;a&gt;. В нём я использую библиотеку python-mutagen, она же используется в Quodlibet. При этом пришлось изменять одну из функций mutagen, чтобы записывать тэги в cp1251 (мне стыдно за это).&lt;&#x2F;p&gt;
&lt;p&gt;Скрипт запускается так: &lt;code&gt;python IDv2toIDv1.py &#x2F;path&#x2F;to&#x2F;player&#x2F;mountpoint&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Если вы собираетесь воспользоваться этим скриптом, имейте в виду - этот скрипт очень плохой. То есть работает-то он нормально. Но то, что он делает - очень плохо. Вы не должны использовать тэги IDv1 - вместо этого вы должны влиять на производителей плееров, чтобы они сделали нормальную поддержку тэгов IDv2 в UTF-8.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Linux2.ru - &quot;социальные&quot; новости про Linux</title>
        <published>2007-08-26T07:09:00+00:00</published>
        <updated>2007-08-26T07:09:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/linux2-ru/"/>
        <id>https://adf.xyz/ru/blog/linux2-ru/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/linux2-ru/">&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080113042328&#x2F;http:&#x2F;&#x2F;www.linux2.ru&#x2F;&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;linux2-ru&#x2F;linux2-ru-logo.jpg&quot; alt=&quot;Linux2.ru&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Эх, не люблю я слово &quot;социальный&quot; в контексте Интернета, но приходится использовать, т.к. другого слова не придумали.&lt;&#x2F;p&gt;
&lt;p&gt;Теперь по теме - на днях открылся сайт &quot;социальных&quot; новостей, посвящённый Linux (и вообще Open Source) - &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080113042328&#x2F;http:&#x2F;&#x2F;www.linux2.ru&#x2F;&quot;&gt;Linux2.ru&lt;&#x2F;a&gt;. Социальный - это значит, что пользователи сами добавляют новости, а также оценивают значимость опубликованных материалов путём голосования.&lt;&#x2F;p&gt;
&lt;p&gt;При достаточном количестве пользователей этот ресурс может стать отличным источником новостей про Linux, да и просто хорошим местом для общения. Поэтому не теряйте времени - регистрируйтесь и начинайте голосовать, комментировать, и, разумеется, добавлять новости.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Battle Tanks — аркада старой школы</title>
        <published>2007-08-24T00:00:00+00:00</published>
        <updated>2007-08-24T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/btanks/"/>
        <id>https://adf.xyz/ru/blog/btanks/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/btanks/">&lt;p&gt;Благодаря &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20071011184537&#x2F;http:&#x2F;&#x2F;www.miriamruiz.es&#x2F;weblog&#x2F;?page_id=2&quot;&gt;Miriam Ruiz&lt;&#x2F;a&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20071011180239&#x2F;http:&#x2F;&#x2F;www.miriamruiz.es&#x2F;weblog&#x2F;?p=100&quot;&gt;узнал об отличной игре&lt;&#x2F;a&gt; — &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;sourceforge.net&#x2F;projects&#x2F;btanks&#x2F;&quot;&gt;Battle Tanks&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Это аркада в стиле старой школы — с характерной музыкой и драйвом. Имея в своём распоряжении танк, шилку или ракетную установку надо крушить врагов, используя разнообразное оружие, разбросанное по карте.&lt;&#x2F;p&gt;
&lt;p&gt;Игра поддерживает сетевой режим, собственно он и является основным. Однако можно играть в одиночку или с ботами. Также можно играть вдвоём за одним компьютером в режиме Split Screen.&lt;&#x2F;p&gt;
&lt;p&gt;Вот пару скриншотов:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;btanks&#x2F;btanks-full.png&quot; alt=&quot;Battle Tanks Screenshot 1&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;btanks&#x2F;btanks2-full.png&quot; alt=&quot;Battle Tanks Screenshot 2&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Имеется версия как под Linux, так и под Windows. Скоро игра должна войти в репозитории Debian &lt;strong&gt;[UPDATE: в данный момент игра уже есть в репозитории]&lt;&#x2F;strong&gt;, а пока вы можете взять пакеты &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20071024145917&#x2F;http:&#x2F;&#x2F;users.alioth.debian.org&#x2F;~baby-guest&#x2F;games&#x2F;&quot;&gt;отсюда&lt;&#x2F;a&gt;. Там два пакета, &lt;em&gt;btanks&lt;&#x2F;em&gt; и &lt;em&gt;btanks-data&lt;&#x2F;em&gt; (графика и музыка). &lt;em&gt;btanks-data&lt;&#x2F;em&gt; весит 45 мегабайт, так что осторожнее с трафиком. Хотя оно того стоит 🙂&lt;&#x2F;p&gt;
&lt;p&gt;Особо нужно отметить то, игра создана нашими российскими разработчиками! Большой респект им за этот отличный продукт.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Обновил движок блога</title>
        <published>2007-08-23T08:49:00+00:00</published>
        <updated>2007-08-23T08:49:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/blog-engine-update/"/>
        <id>https://adf.xyz/ru/blog/blog-engine-update/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/blog-engine-update/">&lt;p&gt;Список видимых изменений:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Поддержка тэгов для записей&lt;&#x2F;li&gt;
&lt;li&gt;Облако тэгов&lt;&#x2F;li&gt;
&lt;li&gt;Просмотр по тэгам&lt;&#x2F;li&gt;
&lt;li&gt;Аватары в комментариях (gravatar)&lt;&#x2F;li&gt;
&lt;li&gt;Запоминание имени и другой информации о комментаторе через cookie (по желанию)&lt;&#x2F;li&gt;
&lt;li&gt;Уведомления об ответах на комментарии по электронной почте (по желанию)&lt;&#x2F;li&gt;
&lt;li&gt;Если запись длинная, то в общем списке и в RSS может отображаться только вводная часть со ссылкой &quot;Читать дальше&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Список невидимых изменений:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Тэги &lt;code&gt;&amp;lt;meta name=&quot;keywords&quot; &#x2F;&amp;gt;&lt;&#x2F;code&gt; и &lt;code&gt;&amp;lt;meta name=&quot;description&quot; &#x2F;&amp;gt;&lt;&#x2F;code&gt; для записей&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Уведомление автора о комментариях&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Апгрейд админского интерфейса для поддержки всего вышеперечисленного&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Более менее работающее кэширование (в браузере и в Apache), вот результат:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# ab -n 10000 -c 20 http:&#x2F;&#x2F;cornelius.net.ru&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Concurrency Level:      20&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Time taken for tests:   2.28373 seconds&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Complete requests:      10000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Failed requests:        0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Write errors:           0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Total transferred:      336744668 bytes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;HTML transferred:       332191938 bytes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Requests per second:    4930.06 [#&#x2F;sec] (mean)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Time per request:       4.057 [ms] (mean)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Time per request:       0.203 [ms] (mean, across all concurrent requests)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Transfer rate:          162126.00 [Kbytes&#x2F;sec] received&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Очищающая клизма для Debian</title>
        <published>2007-08-23T00:00:00+00:00</published>
        <updated>2007-08-23T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/debian-cleanup/"/>
        <id>https://adf.xyz/ru/blog/debian-cleanup/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/debian-cleanup/">&lt;p&gt;Debian – это хоть и не венда, но при интенсивном использовании apt-get мусора в системе можно накопить достаточно много. Причём такого мусора, который руками вычистить не так уж просто. Вот несколько простых советов, как держать ваш Debian в чистоте:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Классика:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; apt-get&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; autoclean&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Очищает локальный кэш пакетов. Удаляются пакеты, которых нет в текущих списках пакетов.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;deborphan&lt;&#x2F;code&gt; – выявляет пакеты из разделов &lt;code&gt;lib&lt;&#x2F;code&gt; и &lt;code&gt;oldlib&lt;&#x2F;code&gt;, &quot;от которых никто не зависит&quot;. С вероятностью 99% эти пакеты вам не нужны, поэтому можно смело их удалять.&lt;&#x2F;p&gt;
&lt;p&gt;Я предпочитаю использовать графическую версию этой программы – &lt;code&gt;gtkorphan&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;debian-cleanup&#x2F;gtkorphan.png&quot; alt=&quot;GtkOrphan&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Вы читаете man&#x27;ы по китайски? Я – нет. Поэтому я пользуюсь утилитой &lt;code&gt;localepurge&lt;&#x2F;code&gt;. Она удаляет все файлы, связанные с локализацией и не относящиеся к вашей локали. Причём делает она это автоматически – сразу после установки пакетов через &lt;code&gt;apt&lt;&#x2F;code&gt;. Локали, которые должны остаться в неприкосновенности вы можете указать при настройке пакета &lt;code&gt;localepurge&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Пример вывода &lt;code&gt;localepurge&lt;&#x2F;code&gt; после установки пакета:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Распаковывается пакет synaptic (из файла ...&#x2F;synaptic_0.60_i386.deb)...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Настраивается пакет synaptic (0.60) ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;localepurge: Disk space freed in &#x2F;usr&#x2F;share&#x2F;locale: 2076K&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;localepurge: Disk space freed in &#x2F;usr&#x2F;share&#x2F;man: 16K&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Total disk space freed by localepurge: 2092K&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;И ещё периодически просматривайте домашний каталог с включенным отображением скрытых файлов. Наверняка многие из них можно удалить.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Случается и такое в Интернете...</title>
        <published>2007-08-17T19:56:00+00:00</published>
        <updated>2007-08-17T19:56:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/one-more-internet-scum/"/>
        <id>https://adf.xyz/ru/blog/one-more-internet-scum/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/one-more-internet-scum/">&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Subject: Перепечатка моей статьи на вашем сайте&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;From: ADF &amp;lt;...@gmail.com&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;To: articles@pcworld.org.ua&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Date: Wed, 15 Aug 2007 19:37:07 +0600&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;X-Mailer: Evolution 2.10.2 &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Добрый день, pcworld.org.ua&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Опубликованная на вашем сайте статья &amp;quot;Сравнение графических новшеств&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Vista и Beryl!&amp;quot; (http:&#x2F;&#x2F;www.pcworld.org.ua&#x2F;content&#x2F;view&#x2F;56&#x2F;50&#x2F;) явялется&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;перепечаткой моей статьи &amp;quot;Что такого есть в Vista, чего нет в&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Beryl?!&amp;quot; (http:&#x2F;&#x2F;www.grove.org.ru&#x2F;people&#x2F;cornelius&#x2F;blog&#x2F;vista-and-beryl)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(новый адрес статьи - http:&#x2F;&#x2F;cornelius.net.ru&#x2F;blog&#x2F;vista-and-beryl).&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Я считаю, что перепечатка созданных мной материалов без моего согласия&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;является неправомерной и поэтому требую либо полностью удалить данную&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;статью с вашего сайта, либо удалить весь текст начинающийся с заголовка&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;quot;Введение&amp;quot; (включая иллюстрации) и вместо него указать ссылку на&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;оригинальную статью (http:&#x2F;&#x2F;cornelius.net.ru&#x2F;blog&#x2F;vista-and-beryl) с&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;указанием имени автора (ADF).&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;В случае если вы не свяжетесь со мной в течение ближайших трёх дней я&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;оставляю за собой право предать этот инцидент публичной огласке.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Письмо отправлено 15 августа 2007 г.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-- &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Regards!&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ADF &amp;lt;...@gmail.com&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Date: Thu, 16 Aug 2007 23:29:26 +0300&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;From: Articles &amp;lt;articles@pcworld.org.ua&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;X-Mailer: The Bat! (v3.85.03) Professional&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;To: ADF &amp;lt;...@gmail.com&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Subject: Re: Перепечатка моей статьи на вашем сайте&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Здравствуйте, ADF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Знаете, прывыкайте... таков интернет. Кацманить мне нравится и я думаю&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;не мне одному, готовтесь.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;А публичную огласку... да пожалуйста, лишний пиар нашего сайта не&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;помешает :) Спасибо.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Благодарен, ваш pcworld.org.ua&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;зы: для таких требований защитите права на статью и добейтесь вашего&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;через суд, доказав что материал действительно ваш... а то я так&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;старался изменять слова :)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Compiz Fusion + Debian + Xfce [устаревшая заметка]</title>
        <published>2007-08-14T00:00:00+00:00</published>
        <updated>2007-08-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/compiz-fusion-debian-xfce/"/>
        <id>https://adf.xyz/ru/blog/compiz-fusion-debian-xfce/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/compiz-fusion-debian-xfce/">&lt;p&gt;&lt;strong&gt;ВНИМАНИЕ! Эта заметка устарела! Воспользуйтесь более актуальными &lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;compiz-fusion-debian-xfce-2&#x2F;&quot;&gt;инструкциями по установке Compiz Fusion в Debian с рабочим окружением Xfce&lt;&#x2F;a&gt;.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;compiz-fusion-debian-xfce&#x2F;compiz-fusion-with-screenlets.png&quot; alt=&quot;Compiz Fusion With Screenlets&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Я использую &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070809031618&#x2F;http:&#x2F;&#x2F;beryl-project.org&#x2F;&quot;&gt;Beryl&lt;&#x2F;a&gt; уже достаточно долгое время и уже с трудом представляю свою жизнь за компьютером без него. Учитывая то, что как самостоятельный проект Beryl своё существование прекратил, вопрос о переходе на Compiz Fusion, который пришёл ему на замену, для меня был решён сразу. Оставалось только решить, когда же совершить этот переход.&lt;&#x2F;p&gt;
&lt;p&gt;Вчера &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;smspillaz.wordpress.com&#x2F;&quot;&gt;официальный блог Compiz Fusion&lt;&#x2F;a&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;smspillaz.wordpress.com&#x2F;2007&#x2F;08&#x2F;13&#x2F;compiz-fusion-our-first-release-052&#x2F;&quot;&gt;сообщил о выпуске первого официального релиза&lt;&#x2F;a&gt; этого продукта, имеющего номер версии 0.5.2 — отличный повод пощупать его за жабры.&lt;&#x2F;p&gt;
&lt;p&gt;Надо сказать, что я уже пробовал ставить Compiz Fusion примерно месяц назад. Но опыт этот был скорее неудачный. Основной проблемой тогда для меня стала не установка, а запуск Compiz, а точнее — его запуск в начале каждого сеанса. Пришлось перебрать множество вариантов запуска, долго ковырять &lt;code&gt;.xinitrc&lt;&#x2F;code&gt; (файл инициализации сеанса Xfce). В итоге он с горем пополам заработал, но настроение подпортил основательно. А когда выяснилось, что настройки Beryl идут лесом и надо настраивать все плагины заново — тут уж я совсем огорчился, снёс его к чёрту и поставил обратно любимый Beryl.&lt;&#x2F;p&gt;
&lt;p&gt;А теперь вернёмся в сегодняшний день и перейдём непосредственно к установке Compiz Fusion 0.5.2 на систему Debian Lenny&#x2F;Sid с рабочим окружением Xfce.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Нужно избавиться от существующего оконного менеджера. Если у вас установлен Beryl — удаляйте без сожалений (и не забудьте удалить Emerald). Если вы пользуетесь xfwm4, то сделайте &lt;code&gt;killall xfwm4&lt;&#x2F;code&gt;, а затем завершите сеанс с сохранением сессии.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Добавляем следующую строку в &lt;code&gt;&#x2F;etc&#x2F;apt&#x2F;sources.list&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;deb http:&#x2F;&#x2F;download.tuxfamily.org&#x2F;shames&#x2F;debian-sid&#x2F;desktopfx&#x2F;unstable&#x2F; .&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;ВНИМАНИЕ!&lt;&#x2F;strong&gt; Этот репозиторий не только не является официальным репозиторием Debian, но также не является официальным репозиторием Compiz Fusion. Короче говоря, он полностью неофициальный — используйте его на свой страх и риск.&lt;&#x2F;p&gt;
&lt;p&gt;Ключ GPG для этого репозитория:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;wget&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; http:&#x2F;&#x2F;download.tuxfamily.org&#x2F;shames&#x2F;A42A6CF5.gpg&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;O-&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; |&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name&quot;&gt; sudo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; apt-key&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; add&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; -&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;UPDATE:&lt;&#x2F;strong&gt; Также имеются неофициальные репозитории для Lenny и Etch. Полный список репозиториев вы можете найти на &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;shame.tuxfamily.org&#x2F;repo&#x2F;?cat=11&quot;&gt;этой странице&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Обновляем списки пакетов и устанавливаем следующие пакеты:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fusion-icon&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;emerald&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;emerald-themes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;compiz-fusion-extras (по желанию)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;compiz-fusion-plugins-* (по желанию)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Ставьте все пакеты сразу, через aptitude. Всё остальное должно подтянуться через зависимости. Надеюсь, что этот набор пакетов сработает для вас, так как я ставил пакеты в другой последовательности и потом пришлось удалить кое-что лишнее, а именно компоненты, связанные с gnome.&lt;&#x2F;p&gt;
&lt;p&gt;Учитывая опыт предыдущей установки Compiz Fusion, я засучил рукава и приготовился ковыряться с &lt;code&gt;.xinitrc&lt;&#x2F;code&gt;, чтобы запускать compiz в начале сеанса. Но тут мне на глаза попался значок программы Compiz Fusion Icon и рукава пришлось рассучить. Потому что:&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Для запуска и управления Compiz Fusion существует замечательная утилита &lt;strong&gt;Compuz Fusion Icon&lt;&#x2F;strong&gt; (&lt;em&gt;Меню → Система → Compiz Fusion Icon&lt;&#x2F;em&gt;), которая представляет собой аналог, а точнее клон Beryl Manager. Эта программка висит в трее и обеспечивает быстрый доступ к настройкам Compiz и Emerald. Запустите эту программу, затем правой кнопкой на иконку в трее. Выберите оконный менеджер Compiz и оконный декоратор Emerald. Если всё в порядке, то можете добавить эту программу в автозапуск: &lt;em&gt;Меню → Настройка → Автозапуск&lt;&#x2F;em&gt;. Команда для запуска — &lt;code&gt;fusion-icon&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;На всякий случай перезапустите сеанс. Если начале сеанса запускается Compiz + Emerald — можете начинать изучение его обширных настроек. Если что-то не получилось — добро пожаловать в комменты.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Переехал с Blogmarks.net на del.icio.us</title>
        <published>2007-08-12T22:45:00+00:00</published>
        <updated>2007-08-12T22:45:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/blogmarks2delicious/"/>
        <id>https://adf.xyz/ru/blog/blogmarks2delicious/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/blogmarks2delicious/">&lt;p&gt;Стукнуло мне в голову, что надо перенести мои закладки, хранящиеся на &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070813121900&#x2F;http:&#x2F;&#x2F;blogmarks.net&#x2F;&quot;&gt;blogmarks.net&lt;&#x2F;a&gt;, в &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070814183638&#x2F;http:&#x2F;&#x2F;del.icio.us&#x2F;&quot;&gt;del.icio.us&lt;&#x2F;a&gt;. Blogmarks меня в общем-то устраивает, но не хватает в нём какой-то социальности что-ли. Да и развиваться он кажется перестал. В общем стагнирует помаленьку.&lt;&#x2F;p&gt;
&lt;p&gt;Blogmarks позволяет экспортировать закладки в формате atom, но эта функция глючит — возвращается битый файл, либо в формате del.icio.us. Но этот формат для импорта не подходит, а называется он &quot;формат del.icio.us&quot;, только потому, что del.icio.us отдаёт закладки через API именно в таком формате. В общем выбора у меня особого не было, пришлось экспортировать в &quot;формате del.icio.us&quot; и писать скрипт для его обработки и последующего импорта.&lt;&#x2F;p&gt;
&lt;p&gt;Скрипт был написан без особых проблем и после успешного тестирования выложен &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;files.grove.org.ru&#x2F;cornelius&#x2F;scripts&#x2F;blogmarks2delicious.py&quot;&gt;здесь&lt;&#x2F;a&gt;. Так что если перед вами будет стоять аналогичная задача — берите и пользуйтесь на здоровье. Я успешно перенёс все 95 закладок вместе с тэгами, датой создания и описаниями.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Вернулся из отпуска</title>
        <published>2007-08-08T19:01:00+00:00</published>
        <updated>2007-08-08T19:01:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/back-from-vacation/"/>
        <id>https://adf.xyz/ru/blog/back-from-vacation/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/back-from-vacation/">&lt;p&gt;Вот я и дома после двух замечательных недель, проведённых в Адлере. Впечатления исключительно положительные. Город чистый и аккуратный, видимо после проведения кампании &lt;em&gt;Sochi 2014&lt;&#x2F;em&gt;. Отличный галечный пляж и чистое море. В общем рекомендую всем съездить, пока там всё не разворотили в ходе подготовки к олимпиаде.&lt;&#x2F;p&gt;
&lt;p&gt;PS. Выложил &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.flickr.com&#x2F;photos&#x2F;86353793@N00&#x2F;sets&#x2F;72157601299147203&#x2F;&quot;&gt;несколько фоток на Flickr&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;!-- TODO: fix flick link with a new gallery? --&gt;</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Уезжаю в отпуск</title>
        <published>2007-07-24T15:06:00+00:00</published>
        <updated>2007-07-24T15:06:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/vacation/"/>
        <id>https://adf.xyz/ru/blog/vacation/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/vacation/">&lt;p&gt;Собственно сабж. Еду в Адлер. Вернусь 8 августа. Кстати, 7 августа днём я буду в Москве (где-то с часу дня до девяти вечера). Это просто на всякий случай.&lt;&#x2F;p&gt;
&lt;p&gt;Если что, электронную почту я планирую проверять каждый день, время от времени буду появляться в джаббере.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>vnstat – программа для подсчёта трафика</title>
        <published>2007-07-24T00:00:00+00:00</published>
        <updated>2007-07-24T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/vnstat/"/>
        <id>https://adf.xyz/ru/blog/vnstat/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/vnstat/">&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;s.arboreus.com&#x2F;&quot;&gt;jetxee&lt;&#x2F;a&gt; &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;s.arboreus.com&#x2F;2007&#x2F;08&#x2F;vnstat.html&quot;&gt;рассказал&lt;&#x2F;a&gt; о замечательной и очень простой в использовании утилите для подсчёта трафика – &lt;code&gt;vnstat&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Мой интернет тариф хоть и называется безлимитным, но имеет ограничение в 7 гигабайт входящего трафика в месяц. А пароль от страницы статистики моего провайдера я забыл 🙂 Так что теперь буду считать трафик самостоятельно, чтобы знать, когда мне грозит отключение.&lt;&#x2F;p&gt;
&lt;p&gt;Когда сам считаешь, оно как-то надёжней 🙂&lt;&#x2F;p&gt;
&lt;p&gt;А ещё данные вывода &lt;code&gt;vnstat&lt;&#x2F;code&gt; можно отображать в &lt;code&gt;conky&lt;&#x2F;code&gt;. Для этого в &lt;code&gt;.conkyrc&lt;&#x2F;code&gt; надо добавить:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;${execi 120 vnstat -i eth2}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;, где 120 – интервал обновления в секундах, eth2 – название интересующего интерфейса.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;vnstat&#x2F;conky-vnstat.png&quot; alt=&quot;conky-vnstat&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Мой велик</title>
        <published>2007-07-16T00:00:00+00:00</published>
        <updated>2007-07-16T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/my-bike/"/>
        <id>https://adf.xyz/ru/blog/my-bike/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/my-bike/">&lt;p&gt;Велик я вообще-то купил ещё весной, но вот теперь решил его немного пропиарить 🙂&lt;&#x2F;p&gt;
&lt;p&gt;Итак, вот он во всей красе, Wheeler Buddy Zero&#x27;3 Street&lt;&#x2F;p&gt;

&lt;figure class=&quot;photo&quot;&gt;
  &lt;img src=&quot;dsc00352.jpg&quot; alt=&quot;Wheeler Buddy Zero3 Street&quot;&gt;
  &lt;figcaption&gt;Wheeler Buddy Zero3 Street&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;А вот и я на нём, пытаясь выполнить фигуру под названием вилли (wheelie).&lt;&#x2F;p&gt;

&lt;figure class=&quot;photo&quot;&gt;
  &lt;img src=&quot;dsc00356.jpg&quot; alt=&quot;Попытка сделать Wheelie&quot;&gt;
  &lt;figcaption&gt;Попытка сделать Wheelie&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Попытка, кстати, была не очень удачная – через доли секунды я буду стоять на земле (хорошо, что не лежать) держа в руках руль, при этом велика подо мной не будет, он будет передо мной.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Клавиша Compose</title>
        <published>2007-07-15T00:00:00+00:00</published>
        <updated>2007-07-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/compose-key/"/>
        <id>https://adf.xyz/ru/blog/compose-key/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/compose-key/">&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;s.arboreus.com&#x2F;2007&#x2F;07&#x2F;linux.html&quot;&gt;Прочитал сегодня&lt;&#x2F;a&gt; про т.н. клавишу Compose. С помощью этой кнопки можно вводить разные символы, которых нет в выбранной раскладке клавиатуры например, ©.&lt;&#x2F;p&gt;
&lt;p&gt;Настроить эту клавишу можно в файле &lt;code&gt;&#x2F;etc&#x2F;X11&#x2F;xorg.conf&lt;&#x2F;code&gt; следующим образом:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Найти секцию, относящуюся к клавиатуре (&lt;em&gt;Section &quot;InputDevice&quot; &#x2F; Driver &quot;kbd&quot;&lt;&#x2F;em&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;Добавить к параметру &lt;code&gt;XkbOptions&lt;&#x2F;code&gt; значение &lt;code&gt;compose:KEY&lt;&#x2F;code&gt;, где KEY – клавиша, которую вы хотите использовать в качестве Compose Key (список клавиш можно найти &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;bapoumba.free.fr&#x2F;?p=172&quot;&gt;тут&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;Перезапустить X-сервер (CTRL+ALT+BACKSPACE)&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;В моём случае файл &lt;code&gt;&#x2F;etc&#x2F;X11&#x2F;xorg.conf&lt;&#x2F;code&gt; выглядит так:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Section &amp;quot;InputDevice&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Identifier     &amp;quot;Generic Keyboard&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Driver         &amp;quot;kbd&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Option         &amp;quot;CoreKeyboard&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Option         &amp;quot;XkbRules&amp;quot; &amp;quot;xorg&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Option         &amp;quot;XkbModel&amp;quot; &amp;quot;pc105&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Option         &amp;quot;XkbLayout&amp;quot; &amp;quot;us,ru(winkeys)&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Option         &amp;quot;XkbOptions&amp;quot; &amp;quot;grp:alt_shift_toggle,grp_led:scroll,compose:rwin&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;EndSection&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Подробнее о Compose Key можно &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Compose_key&quot;&gt;прочитать в Википедии&lt;&#x2F;a&gt;. Там же можно найти перечень возможных комбинаций клавиш.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Увеличил быстродействие системы (кажется)</title>
        <published>2007-07-14T00:00:00+00:00</published>
        <updated>2007-07-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/made-some-performance-tweaks/"/>
        <id>https://adf.xyz/ru/blog/made-some-performance-tweaks/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/made-some-performance-tweaks/">&lt;p&gt;На &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;digg.com&quot;&gt;digg.com&lt;&#x2F;a&gt; сегодня проплывала &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070717030919&#x2F;https:&#x2F;&#x2F;digg.com&#x2F;linux_unix&#x2F;A_Three_Pronged_Attack_to_Increase_Linux_Performance&quot;&gt;заметка&lt;&#x2F;a&gt; на тему улучшения быстродействия Linux системы (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070825022025&#x2F;www.linux.com&#x2F;feature&#x2F;116693&quot;&gt;оригинал статьи&lt;&#x2F;a&gt;). Решил попробовать.&lt;&#x2F;p&gt;
&lt;p&gt;Оптимизация состоит из трёх шагов:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Изменение параметров работы жёсткого диска с помощью &lt;code&gt;hdparm&lt;&#x2F;code&gt;. Для меня это не актуально, т.к. у меня жёсткий диск SATA и к нему предлагаемые в статье методы неприменимы. Поэтому этот шаг я пропустил.&lt;&#x2F;li&gt;
&lt;li&gt;Монтирование файловых систем с опцией &lt;code&gt;noatime&lt;&#x2F;code&gt;. При этом не сохраняются данные о времени последнего доступа к файлам (Access Time). Тут всё просто — добавляем параметр &lt;code&gt;noatime&lt;&#x2F;code&gt; к списку опций в &lt;code&gt;&#x2F;etc&#x2F;fstab&lt;&#x2F;code&gt; и перемонтируем файловую систему.&lt;&#x2F;li&gt;
&lt;li&gt;Уменьшение времени запуска программ с помощью предварительной линковки (prelink). Про это &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;strannick.blogspot.com&#x2F;2006&#x2F;07&#x2F;blog-post_115405327467901793.html&quot;&gt;писал StraNNick&lt;&#x2F;a&gt;, и я тогда включал у себя предварительную линковку по его рецепту, но после этого система была переустановлена, поэтому на текущий момент &lt;code&gt;prelink&lt;&#x2F;code&gt; у меня не использовался. На этот раз я решил не делать &lt;code&gt;prelink&lt;&#x2F;code&gt; для всех приложений, а сделал его только для тех, которые часто приходится запускать, например &lt;code&gt;sudo prelink &#x2F;usr&#x2F;bin&#x2F;thunar&lt;&#x2F;code&gt; и т.д.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;В общем советы эти большой оригинальностью и новизной не отличаются, но тем не менее два из трёх для меня подошли. Насколько после этого увеличилось быстродействие сказать не могу, мерить было лениво. Большую надежду возлагаю на монтирование с &lt;code&gt;noatime&lt;&#x2F;code&gt;, т.к. мне часто приходится производить полнотекстовый поиск по большому количеству мелких файлов.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Как читать списки рассылки через RSS</title>
        <published>2007-07-14T00:00:00+00:00</published>
        <updated>2007-07-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/mailing-list-to-rss/"/>
        <id>https://adf.xyz/ru/blog/mailing-list-to-rss/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/mailing-list-to-rss/">&lt;p&gt;Предыстория: на своей машине я использую гремучую смесь из Debian Stable&#x2F;Testing&#x2F;Unstable. Использование Testing на desktop машине сейчас в общем-то является нормой, а вот Unstable всё-таки связан с некоторыми рисками. Тем не менее, некоторые пакеты я беру из Unstable, потому что хочу иметь самую свежую версию тех программ, которые я интенсивно использую каждый день.&lt;&#x2F;p&gt;
&lt;p&gt;О новых релизах я узнаю, как правило, с сайта &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070703095141&#x2F;https:&#x2F;&#x2F;gnomefiles.org&#x2F;&quot;&gt;http:&#x2F;&#x2F;gnomefiles.org&lt;&#x2F;a&gt;, но между официальным релизом и вхождением пакета в Unstable проходит некоторое время, иногда достаточно большое. Вот, например, Quodlibet — версия 1.0 появилась в Unstable приблизительно через месяц после релиза.&lt;&#x2F;p&gt;
&lt;p&gt;В течение этого месяца я мог бы каждый день делать &lt;code&gt;sudo aptitude update&lt;&#x2F;code&gt; и просматривать список обновляемых пакетов в поисках Quodlibet. Но существует и другой способ получения информации о появлении определённого пакета в Unstable (более удобный IMHO). Это список рассылки &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;lists.debian.org&#x2F;debian-devel-changes&#x2F;&quot;&gt;debian-devel-changes&lt;&#x2F;a&gt; (существует аналогичный список рассылки для Testing — &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;lists.debian.org&#x2F;debian-testing-changes&#x2F;&quot;&gt;debian-testing-changes&lt;&#x2F;a&gt;, они различаются тем, что в первом на каждый пакет высылается отдельное письмо, а во втором — сводка по изменениям за прошедший день).&lt;&#x2F;p&gt;
&lt;p&gt;В определённый момент я заметил, что было бы намного удобнее получать эти уведомления не по почте, а через RSS. Оказалось, что сделать из списка рассылки RSS-ленту очень просто. Существует сайт &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070713153754&#x2F;http:&#x2F;&#x2F;gmane.org&#x2F;&quot;&gt;http:&#x2F;&#x2F;gmane.org&lt;&#x2F;a&gt;, который предназначен для преобразования списков рассылки в &quot;ньюсгруппы&quot; Usenet. Также он выполняет роль архива.&lt;&#x2F;p&gt;
&lt;p&gt;Если интересующий вас список рассылки связан с Open Source Software, то скорее всего он уже зарегистрирован в Gmane. Если же его там нет, то можно &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070704052441&#x2F;http:&#x2F;&#x2F;gmane.org&#x2F;add.php&quot;&gt;отправить запрос&lt;&#x2F;a&gt; на его добавление.&lt;&#x2F;p&gt;
&lt;p&gt;В моем случае, нужный список рассылки уже был зарегистрирован, мне оставалось только &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;dir.gmane.org&#x2F;search.php&quot;&gt;найти его&lt;&#x2F;a&gt;. На &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20080930172011&#x2F;http:&#x2F;&#x2F;dir.gmane.org&#x2F;gmane.linux.debian.devel.changes.unstable&quot;&gt;странице списка рассылки&lt;&#x2F;a&gt; как раз и находятся необходимые нам ссылки на RSS-ленты. Задача решена, садись — 5!&lt;&#x2F;p&gt;
&lt;p&gt;PS. Google на запрос &quot;mailing list to rss&quot; ничего внятного не выдаёт (по крайней мере на первой странице). Странно, учитывая, что задача вроде бы типовая.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Добавил возможность комментирования</title>
        <published>2007-07-13T05:00:00+00:00</published>
        <updated>2007-07-13T05:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/comments-support/"/>
        <id>https://adf.xyz/ru/blog/comments-support/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/comments-support/">&lt;p&gt;Немного поковырялся и добавил базовую поддержку комментариев. Работает пока не так, как хотелось бы, но для начала потянет.&lt;&#x2F;p&gt;
&lt;p&gt;Что работает:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;комментарии добавляются 🙂&lt;&#x2F;li&gt;
&lt;li&gt;можно писать ответ на комментарий (треды)&lt;&#x2F;li&gt;
&lt;li&gt;можно указать своё имя, URL и Email (пока не используется)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Что не работает (но обязательно будет работать потом):&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;del&gt;уведомление о комментариях и ответах на них&lt;&#x2F;del&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;del&gt;защита от спама (капча или что-нибудь другое)&lt;&#x2F;del&gt; (реализовано с использованием &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070701015200&#x2F;http:&#x2F;&#x2F;akismet.com&#x2F;&quot;&gt;Akismet&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;del&gt;удаление комментариев&lt;&#x2F;del&gt; (сделано)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;del&gt;фильтрация содержимого комментария, сейчас можно впихнуть в комментарий любой HTML и он отобразится как есть&lt;&#x2F;del&gt; (сделано)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;del&gt;форматирование текста комментариев, если в них явно не используется HTML (например, вставка &lt;code&gt;&amp;lt;br &#x2F;&amp;gt;&lt;&#x2F;code&gt; вместо &quot;\n&quot;)&lt;&#x2F;del&gt; (реализовано через поддержку bbcode)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;del&gt;запоминание посетителей&lt;&#x2F;del&gt; (сделано)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;del&gt;поддержка Gravatar&lt;&#x2F;del&gt; (сделано)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Протестировать добавление комментариев можно прямо тут, комментарии типа &quot;Just testing&quot; в данном посте не возбраняются.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>И опять я переехал</title>
        <published>2007-07-11T14:10:00+00:00</published>
        <updated>2007-07-11T14:10:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/moving-againg/"/>
        <id>https://adf.xyz/ru/blog/moving-againg/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/moving-againg/">&lt;p&gt;Переехал на самом деле не я, а мой блог. Теперь он доступен по адресу &lt;code&gt;http:&#x2F;&#x2F;cornelius.net.ru&lt;&#x2F;code&gt;. Если у вас где-то установлена ссылка на &lt;code&gt;http:&#x2F;&#x2F;www.grove.org.ru&lt;&#x2F;code&gt;, пожалуйста, замените её на &lt;code&gt;http:&#x2F;&#x2F;cornelius.net.ru&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Были удалены некоторые старые записи, потерявшие свою актуальность.&lt;&#x2F;p&gt;
&lt;p&gt;SVN (&lt;code&gt;http:&#x2F;&#x2F;svn.grove.org.ru&lt;&#x2F;code&gt;) и Trac (&lt;code&gt;http:&#x2F;&#x2F;trac.grove.org.ru&lt;&#x2F;code&gt;) доступны по старым адресам.&lt;&#x2F;p&gt;
&lt;p&gt;Адрес фида также остался прежним — &lt;code&gt;http:&#x2F;&#x2F;feeds.feedburner.com&#x2F;cornelius&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Вместе с переездом изменились дизайн и движок блога. Теперь блог работает на самодельном движке (с использованием Zope3), который пока умеет не много, но будет развиваться. Если дело пойдёт, опубликую исходники.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Управление рабочим столом с помощью Wii Remote</title>
        <published>2007-03-01T00:00:00+00:00</published>
        <updated>2007-03-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/control-desktop-with-wii-remote/"/>
        <id>https://adf.xyz/ru/blog/control-desktop-with-wii-remote/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/control-desktop-with-wii-remote/">&lt;p&gt;Вчера я стал счастливым обладателем игровой видеоприставки &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ru.wikipedia.org&#x2F;wiki&#x2F;Wii&quot;&gt;Nintendo Wii&lt;&#x2F;a&gt;. Так как при этом я являюсь счастливым обладателем компьютера с Debian GNU&#x2F;Linux, то мне конечно же захотелось сделать так же, как на &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=ALqduQfm09c&quot;&gt;этом видео-ролике&lt;&#x2F;a&gt; 🙂&lt;&#x2F;p&gt;
&lt;p&gt;Вот что для этого необходимо:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Wii Remote (сама приставка не нужна!)&lt;&#x2F;li&gt;
&lt;li&gt;Debian GNU&#x2F;Linux 4.0 (другой дистрибутив тоже подойдёт, но инструкции я привожу именно для Debian)&lt;&#x2F;li&gt;
&lt;li&gt;Две свечки (это такие штуки из воска, которые создают романтическую атмосферу). Они нужны в качестве источника IR излучения.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Нужно установить некоторые пакеты:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; aptitude&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; bluez-utils&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; python-bluez&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; python-xlib&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Скачать &quot;драйвер&quot; для Wii Remote &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070304121800&#x2F;https:&#x2F;&#x2F;forthewiin.org&#x2F;&quot;&gt;отсюда&lt;&#x2F;a&gt; (есть SVN-репозитарий – &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070703010422&#x2F;https:&#x2F;&#x2F;svn.forthewiin.org&#x2F;wmd&#x2F;trunk&#x2F;&quot;&gt;https:&#x2F;&#x2F;svn.forthewiin.org&#x2F;wmd&#x2F;trunk&lt;&#x2F;a&gt;). На самом деле это никакой не драйвер, т.к. с ядром он не взаимодействует. Это просто Python скрипт для обработки сигналов с Wii Remote&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&quot;Пропатчить&quot; файл &lt;code&gt;&#x2F;usr&#x2F;share&#x2F;python-support&#x2F;python-xlib&#x2F;Xlib&#x2F;protocol&#x2F;display.py&lt;&#x2F;code&gt; (из пакета &lt;code&gt;python-xlib&lt;&#x2F;code&gt;). В нём нужно заменить:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;recv = self.socket.recv(4096)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;на&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;recv = self.socket.recv(2048)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Возможно, этот шаг можно пропустить. Я не знаю точно, для чего это нужно 🙂&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Выполнить команды:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; modprobe&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; uinput&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; chmod&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; a+rwx&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;dev&#x2F;input&#x2F;uinput&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Без этого кнопки на Wiimote не работали.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Теперь нужно определить адрес вашего Wiimote. Нажимаем одновременно кнопки 1 и 2 на Wiimote, при этом он на 30 секунд переходит в режим discovery. Выполняем команду:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;andrey@cornelius:~$ hcitool scan&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Scanning ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        00:19:1D:73:30:69    Nintendo RVL-CNT-01&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Среди найденных устройств должен появится и Wiimote. В моём случае его адрес &lt;code&gt;00:19:1D:73:30:69&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Прописываем этот адрес в &lt;code&gt;wmd&#x2F;Config.py&lt;&#x2F;code&gt; (параметр &lt;code&gt;MY_WIIMOTE_ADDR&lt;&#x2F;code&gt;)&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;В том же файле отключаем ненужные модули:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;#39;DISABLE_PYLAB&amp;#39;: 1,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;#39;DISABLE_PYGAME&amp;#39;: 1,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;#39;DISABLE_PYOSD&amp;#39;: 1,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Зажигаем свечки 🙂 и ставим их перед монитором на расстоянии 20-25 см. друг от друга&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Нажимаем одновременно кнопки 1 и 2 и запускаем WMD.py&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Если повезёт так же как мне, то будет работать 🙂&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Хвастаемся перед друзьями&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Удачи!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Для пользователей ICQ…</title>
        <published>2007-02-21T00:00:00+00:00</published>
        <updated>2007-02-21T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/icq-acceptable-use-policy/"/>
        <id>https://adf.xyz/ru/blog/icq-acceptable-use-policy/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/icq-acceptable-use-policy/">&lt;p&gt;ICQ является самым распространенным средством для обмена мгновенными сообщениями в России (хотя в целом она занимает очень &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Instant_messaging#Current_user_base&quot;&gt;скромное место&lt;&#x2F;a&gt; среди остальных сетей). При этом я уверен, что подавляющее большинство пользователей ICQ не читали &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070129055002&#x2F;http:&#x2F;&#x2F;www.icq.com&#x2F;legal&#x2F;policy.html&quot;&gt;Пользовательского соглашения&lt;&#x2F;a&gt;. А ведь там написаны очень интересные вещи. Например:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;You agree that by posting any material or information anywhere on the ICQ Services and Information you surrender your copyright and any other proprietary right in the posted material or information. You further agree that ICQ Inc. is entitled to use at its own discretion any of the posted material or information in any manner it deems fit, including, but not limited to, publishing the material or distributing it.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;В моём переводе это звучит так:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Вы соглашаетесь, что отправляя любые материалы или информацию в любую из служб &lt;em&gt;ICQ Services and Information&lt;&#x2F;em&gt;, вы отдаёте свое право на копирование, а также другие права собственности на эти материалы или информацию. Также вы соглашаетесь с тем, что &lt;em&gt;ICQ Inc.&lt;&#x2F;em&gt; имеет право использовать эти материалы или информацию по своему усмотрению, в том числе публиковать эти материалы или распространять их.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Полный текст (английский) лежит &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070129055002&#x2F;http:&#x2F;&#x2F;www.icq.com&#x2F;legal&#x2F;policy.html&quot;&gt;здесь&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Благодарю &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070129065837&#x2F;http:&#x2F;&#x2F;www.inittab.de&#x2F;&quot;&gt;Norbert Tretkowski&lt;&#x2F;a&gt; за &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070226193706&#x2F;http:&#x2F;&#x2F;www.inittab.de&#x2F;blog&#x2F;tech&#x2F;20070220_icq-policy.html&quot;&gt;наводку&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Играем в приставочные игры под Linux</title>
        <published>2007-01-20T00:00:00+00:00</published>
        <updated>2007-01-20T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/running-video-console-games-on-linux/"/>
        <id>https://adf.xyz/ru/blog/running-video-console-games-on-linux/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/running-video-console-games-on-linux/">&lt;p&gt;Лет десять назад (а может и больше), я с друзьями почти каждый день ходил к одному нашему однокласснику, у которого была игровая приставка &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Super_Nintendo&quot;&gt;Super Nintendo&lt;&#x2F;a&gt;. Мы проводили часы пытаясь освоить многочисственные варианты combo-ударов в лучшем файтинге всех времён (по версии Cornelius Magazine) – &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Killer_Instinct&quot;&gt;Killer Instinct&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Оказывается, ощутить &quot;инстинкт убийцы&quot; можно и без помощи игровой консоли. Для этого нужно воспользоваться одной из приведённых ниже команд:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo ps -eo pid h | xargs kill -kill&lt;&#x2F;code&gt; &lt;strong&gt;(не рекомендуется)&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;sudo aptitude install snes9x-x&lt;&#x2F;code&gt; &lt;strong&gt;(рекомендуется)&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Я воспользовался вторым вариантом и получил в своё распоряжение эмулятор игровой консоли Super Nintendo. Осталось только найти образ нужной игрушки (ROM). Для этого можно погуглить словом &quot;rom&quot;+название_игры. В случае с Killer Instinct нужный образ нашёлся очень быстро. Это оказался файл с расширением .smc размером ~4Mb.&lt;&#x2F;p&gt;
&lt;p&gt;Запускается игра так:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;snes9x&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;path&#x2F;to&#x2F;rom&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;running-video-console-games-on-linux&#x2F;gamepad.jpg&quot; alt=&quot;Gamepad&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Чтобы полностью погрузиться в приставочную атмосферу и я решил воспользовался USB Gamepad&#x27;ом фирмы Genius. Чтобы заставить его работать, я установил следущие пакеты:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; aptitude&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; joystick&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; xserver-xorg-input-joystick&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Теперь при подключении геймпада должно появиться устройство &lt;code&gt;&#x2F;dev&#x2F;input&#x2F;js0&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Тут у меня возникла проблема: работали только кнопки, перемещение не работало. Поэтому я сделал следующее:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;jscal&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;dev&#x2F;input&#x2F;js0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Эта программа попросила переместить джойстик в определённые положения по осям X&#x2F;Y и таким образом откалибровала его (где при этом сохраняются настройки, я не понял). После этого перемещение заработало.&lt;&#x2F;p&gt;
&lt;p&gt;Чтобы играть с джойстиком, запускать игру нужно так:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;snes9x&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;joydev1&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;dev&#x2F;input&#x2F;js0&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;path&#x2F;to&#x2F;rom&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Второй джойстик можно подцепить через опцию -joydev2&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;running-video-console-games-on-linux&#x2F;killer-instinct-screenshot.jpg&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;running-video-console-games-on-linux&#x2F;killer-instinct-screenshot.thumbnail.jpg&quot; alt=&quot;Скриншот Killer Instinct&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;А вот и скриншот&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Что такого есть в Vista, чего нет в Beryl?!</title>
        <published>2006-12-18T00:00:00+00:00</published>
        <updated>2006-12-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/vista-and-beryl/"/>
        <id>https://adf.xyz/ru/blog/vista-and-beryl/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/vista-and-beryl/">&lt;p&gt;Под впечатлением статьи &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20071029185444&#x2F;http:&#x2F;&#x2F;www.thevista.ru&#x2F;page.php?id=7391&quot;&gt;Что есть в Vista, чего нет в XP?&lt;&#x2F;a&gt; решил сравнить возможности интерфейса новой версии Windows и оконного менеджера Beryl&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;, который я в данный момент использую. Если вы уже знакомы с Beryl, то дальше можете не читать, всё это вам давно известно. Всё нижеследующее рассчитано на &quot;виндузятников&quot;. Сразу предупреждаю, я не видел Vista вживую, поэтому в своих суждениях буду опираться на указанную выше статью. Итак…&lt;&#x2F;p&gt;
&lt;h2 id=&quot;effekt-prozrachnosti&quot;&gt;Эффект прозрачности&lt;a class=&quot;zola-anchor&quot; href=&quot;#effekt-prozrachnosti&quot; aria-label=&quot;Anchor link for: effekt-prozrachnosti&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Прозрачность в Vista&lt;&#x2F;th&gt;&lt;th&gt;Прозрачность в Beryl&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;vista-and-beryl&#x2F;vista-transparency.jpg&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;vista-and-beryl&#x2F;vista-transparency.thumbnail.jpg&quot; alt=&quot;Прозрачность в Vista&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;vista-and-beryl&#x2F;beryl-transparency.jpg&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;vista-and-beryl&#x2F;beryl-transparency.thumbnail.jpg&quot; alt=&quot;Прозрачность в Beryl&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Как видно на скриншотах, особой разницы нет. И в Vista, и в Beryl прозрачность присутствует. Кроме прозрачности, Beryl позволяет управлять такими параметрами, как &quot;яркость&quot; (Bright) и &quot;насыщенность цвета&quot; (Saturation). Причем, задавать их можно как для отдельного окна, так и для определённого типа окон. Умеет ли это Vista?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;triokhmernye-effekty&quot;&gt;Трёхмерные эффекты&lt;a class=&quot;zola-anchor&quot; href=&quot;#triokhmernye-effekty&quot; aria-label=&quot;Anchor link for: triokhmernye-effekty&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Трёхмерные эффекты в Vista&lt;&#x2F;th&gt;&lt;th&gt;Трёхмерные эффекты в Beryl&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;vista-and-beryl&#x2F;vista-3d.jpg&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;vista-and-beryl&#x2F;vista-3d.thumbnail.jpg&quot; alt=&quot;Трёхмерные эффекты в Vista&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;vista-and-beryl&#x2F;beryl-3d.jpg&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;vista-and-beryl&#x2F;beryl-3d.thumbnail.jpg&quot; alt=&quot;Трёхмерные эффекты в Beryl&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Vista позволяет просматривать окна открытых приложений в 3D. Чем ответит Beryl? Beryl позволяет разделить рабочее пространство на несколько рабочих столов (хотя этим давно уже никого не удивишь), расположенных на гранях куба. На самом деле, практической пользы от этого куба немного, но как визуальный эффект смотрится весьма впечатляюще. А вот разделение на несколько рабочих мест – штука очень удобная. Именно поэтому она уже давно реализована во многих (всех?) оконных менеджерах. Но не в Windows 🙂&lt;&#x2F;p&gt;
&lt;h2 id=&quot;perekliuchatel-prilozhenii&quot;&gt;Переключатель приложений&lt;a class=&quot;zola-anchor&quot; href=&quot;#perekliuchatel-prilozhenii&quot; aria-label=&quot;Anchor link for: perekliuchatel-prilozhenii&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Переключатель приложений в Vista&lt;&#x2F;th&gt;&lt;th&gt;Переключатель приложений в Beryl&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;vista-and-beryl&#x2F;vista-app-switcher.jpg&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;vista-and-beryl&#x2F;vista-app-switcher.thumbnail.jpg&quot; alt=&quot;Переключатель приложений в Vista&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;vista-and-beryl&#x2F;beryl-app-switcher.jpg&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;vista-and-beryl&#x2F;beryl-app-switcher.thumbnail.jpg&quot; alt=&quot;Переключатель приложений в Beryl&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Переключатели приложений просто братья-близнецы. Могу только сказать, что в переключателе приложений Beryl миниатюрные копии окон остаются &quot;живыми&quot;, как и сами окна. То есть видео в них продолжает двигаться и т.п.&lt;&#x2F;p&gt;
&lt;p&gt;Отдельно рассмотрю такую функцию Beryl, как &quot;Масштабирование окон&quot; (Scale). Чтобы понять как она работает, лучше взять на скриншот.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;vista-and-beryl&#x2F;beryl-scale.jpg&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;vista-and-beryl&#x2F;beryl-scale.thumbnail.jpg&quot; alt=&quot;Переключатель приложений в Beryl&quot; &#x2F;&gt;&lt;&#x2F;a&gt;
&lt;em&gt;Режим масштабирования в Beryl&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;При нажатии горячей клавиши (которую можно настроить, как и всё в Beryl), окна уменьшаются в размере так, чтобы всем им могло было одновременно уместиться на экране. После этого вы можете выбрать окно, нажав на него. При этом оно будет вынесено на передний план, а режим масштабирования будет выключен. Но главная фишка в том, что вы можете продолжать работать непрямую с уменьшенными копиями окон! Например смотреть кино и одновременно болтать в чате (как я обычно и делаю).&lt;&#x2F;p&gt;
&lt;p&gt;О том, чтобы такая (или подобная) функция была в Vista, в указанной выше статье не упоминается.&lt;&#x2F;p&gt;
&lt;p&gt;Ну и напоследок…&lt;&#x2F;p&gt;
&lt;h2 id=&quot;instrument-dlia-skrinshotov&quot;&gt;Инструмент для скриншотов&lt;a class=&quot;zola-anchor&quot; href=&quot;#instrument-dlia-skrinshotov&quot; aria-label=&quot;Anchor link for: instrument-dlia-skrinshotov&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Инструмент для скриншотов в Beryl&lt;&#x2F;th&gt;&lt;th&gt;Инструмент для скриншотов в Vista&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;vista-and-beryl&#x2F;beryl-screenshot.jpg&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;vista-and-beryl&#x2F;beryl-screenshot.thumbnail.jpg&quot; alt=&quot;Прозрачность в Beryl&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;a href=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;vista-and-beryl&#x2F;vista-screenshot.jpg&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;adf.xyz&#x2F;ru&#x2F;blog&#x2F;vista-and-beryl&#x2F;vista-screenshot.thumbnail.jpg&quot; alt=&quot;Инструмент для скриншотов в Vista&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;В Vista этот инструмент представлен в виде отдельной программы. Среди прочего, он позволяет сделать снимок только выделенной области экрана. Но то же самое позволяет делать и плагин к Beryl с незатейливым названием &quot;Screenshot&quot;. Нажав заветную комбинацию клавиш (в моём случае Ctrl+Alt), вы начинаете выделять некоторую область экрана (пример такого выделения показан на скриншоте). После этого снимок выделенной области будет сохранён на рабочем столе (или в любой другой папке – в зависимости от того, как настроите).&lt;&#x2F;p&gt;
&lt;p&gt;Таким образом, мы видим, что &quot;новшества&quot; в пользовательском интерфейсе, представленные в Vista являются новшествами только для операционных систем семейства Windows. Vista просто пытается идти в ногу со временем (хотя мне кажется, что слегка отстаёт).&lt;&#x2F;p&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;1&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;1&lt;&#x2F;sup&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20061222173250&#x2F;http:&#x2F;&#x2F;beryl-project.org&#x2F;&quot;&gt;Beryl&lt;&#x2F;a&gt; – оконный менеджер с открытым исходным кодом. Используется в*NIX операционных системах, хотя, возможно, будет работать и в Windows.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Yandex sucks</title>
        <published>2006-11-18T00:00:00+00:00</published>
        <updated>2006-11-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/yandex-sucks/"/>
        <id>https://adf.xyz/ru/blog/yandex-sucks/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/yandex-sucks/">&lt;p&gt;У меня на сайте стоит Google Analytics, который, среди прочего, позволяет отслеживать, по каким поисковым запросам посетители попадают на мой сайт. Вот уже неделю (или больше) я наблюдаю, как в среднем два человека в день заходят на мой сайт, введя в Яндексе волшебное слово &lt;code&gt;картинка утрачена&lt;&#x2F;code&gt;(специально вставляю картинкой, чтобы Яндекс не проиндексировал).&lt;&#x2F;p&gt;
&lt;p&gt;Я решил проверить как это происходит. Дело в том, что когда-то во время тестирования я добавил на сайт объект с заголовком &lt;code&gt;картинка утрачена&lt;&#x2F;code&gt;, и Яндекс умудрился его проиндексировать. Этого объекта уже давно нет, но он до сих пор находится на шестом (!) месте в результатах поиска по этому волшебному запросу. При попытке открыть страницу естественно вываливается 404. Вот вам и раскрутка сайтов. Бред какой-то.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;&#x2F;strong&gt; Прошло ещё шесть дней и теперь страница, которая возвращает 404, находится на четвёртом месте в результатах поиска. Может быть стоит написать об этом в саппорт Яндыкса?...&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Blogroll Portlet</title>
        <published>2006-11-11T00:00:00+00:00</published>
        <updated>2006-11-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/blogroll-portlet/"/>
        <id>https://adf.xyz/ru/blog/blogroll-portlet/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/blogroll-portlet/">&lt;p&gt;Сделал blogroll для Plone. Берёт OMPL с определённого URL-а и показывает его содержимое в виде портлета.&lt;&#x2F;p&gt;
&lt;p&gt;Код брать &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.grove.org.ru&#x2F;code&#x2F;BlogrollPortlet.tar.gz&#x2F;view&quot;&gt;тут&lt;&#x2F;a&gt; (в svn залить пока не могу, т.к. сломалась аутентификация Apache против LDAP).&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Фишка!&lt;&#x2F;strong&gt; Показывает иконки для сайтов, у которых эти иконки есть.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Оконный менеджер Beryl</title>
        <published>2006-11-09T06:00:00+00:00</published>
        <updated>2006-11-09T06:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/okonnnyi-menedzher-beryl/"/>
        <id>https://adf.xyz/ru/blog/okonnnyi-menedzher-beryl/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/okonnnyi-menedzher-beryl/">&lt;p&gt;Блуждая по &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.xfce-look.org&#x2F;browse&#x2F;&quot;&gt;www.xfce-look.org&lt;&#x2F;a&gt; в поисках новой темы для рабочего стола, обратил внимание на новую категорию тем: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.xfce-look.org&#x2F;index.php?xcontentmode=103&quot;&gt;темы для Beryl&lt;&#x2F;a&gt;. Решил выяснить, что это за зверь. Оказалось, что это форк оконного менеджера &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Compiz&quot;&gt;compiz&lt;&#x2F;a&gt;. Домашняя страница &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20061105234759&#x2F;http:&#x2F;&#x2F;www.beryl-project.org&#x2F;&quot;&gt;тут&lt;&#x2F;a&gt;. Дело было вечером, делать было нечего — решил опробовать.&lt;&#x2F;p&gt;
&lt;p&gt;С исходников ставить не стал, предпочёл дебианские пакеты (не потому, что легче ставить, а потому, что легче удалять 😉). Установка для Debian описана &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20061105053132&#x2F;http:&#x2F;&#x2F;wiki.beryl-project.org&#x2F;index.php&#x2F;Install&#x2F;Debian&quot;&gt;здесь&lt;&#x2F;a&gt;. Сначала ставятся необходимые дебианские пакеты, потом собственно пакеты Beryl (взять их можно... копаюсь в хистори... &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20061116212910&#x2F;http:&#x2F;&#x2F;vally8.free.fr&#x2F;coinprog&#x2F;beryl&#x2F;index.php&quot;&gt;тут&lt;&#x2F;a&gt;)&lt;&#x2F;p&gt;
&lt;p&gt;Ещё понадобятся &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20061107151145&#x2F;http:&#x2F;&#x2F;www.nzone.com&#x2F;object&#x2F;nzone_downloads_linux_display_x86_1.0-9625.html&quot;&gt;бета драйвера NVIDIA&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Теперь о том, как запускать под Xfce (под Gnome и KDE не пробовал, т.к. ими не пользуюсь).&lt;&#x2F;p&gt;
&lt;p&gt;Сначала убиваем xfwm4:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;killall&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; xfwm4&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Потом пробуем запустить:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;beryl-manager&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Если всё нормально, то экран перерисуется, а в трее появится значок Beryl. Можно радоваться.&lt;&#x2F;p&gt;
&lt;p&gt;У меня при первом запуске отсутствовали рамки окон. Если запустить &lt;code&gt;emerald&lt;&#x2F;code&gt;, то рамки должны появится. При последующих запусках &lt;code&gt;beryl-manager&lt;&#x2F;code&gt; всё сразу работало нормально.&lt;&#x2F;p&gt;
&lt;p&gt;Если вы решили отказаться от xfwm4 в пользу Beryl, то:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;killall xfwm4&lt;&#x2F;code&gt; (если он запущен)&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Завершить сеанс с сохранением сессии (чтобы &lt;code&gt;xfwm4&lt;&#x2F;code&gt; не запускался при следующем запуске)&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Найти файл &lt;code&gt;xinitrc&lt;&#x2F;code&gt; (у меня был в &lt;code&gt;&#x2F;usr&#x2F;local&#x2F;etc&#x2F;xdg&#x2F;xfce4&lt;&#x2F;code&gt;) и скопировать его в &lt;code&gt;~&#x2F;.config&#x2F;xfce4&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Найти в этом файле строку:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# Run xfce4-session if installed&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;и добавить перед ней&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;beryl-manager&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;При этом beryl будет запускаться до запуска приложений, сохранённых в сессии (то есть до &lt;code&gt;xfdesktop&lt;&#x2F;code&gt;, &lt;code&gt;xfce4-panel&lt;&#x2F;code&gt; и т.д.)&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Очень долго и вдумчиво заниматься настройкой используя &lt;code&gt;beryl-settings&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;known-issues&quot;&gt;Known Issues&lt;a class=&quot;zola-anchor&quot; href=&quot;#known-issues&quot; aria-label=&quot;Anchor link for: known-issues&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Переключатель рабочих мест (апплет для панели Xfce) глючит с Beryl. Пришлось от него отказаться.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;xfwm4&lt;&#x2F;code&gt; позволяет ограничить рабочую область (то есть окна развёртываются не на весь экран, а только до границ рабочей области) — Beryl такого не умеет.&lt;&#x2F;li&gt;
&lt;li&gt;Отсутствует документация по настройкам (может быть плохо искал), при этом настроек очень много. Пришлось разбираться методом тыка.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Темы оформления GTK</title>
        <published>2006-11-05T00:00:00+00:00</published>
        <updated>2006-11-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/temy-oformleniya-gtk-1/"/>
        <id>https://adf.xyz/ru/blog/temy-oformleniya-gtk-1/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/temy-oformleniya-gtk-1/">&lt;p&gt;На днях решил в очередной раз поменять тему оформления GTK на своём рабочем столе. Для этого отправился на &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gnome-look.org&#x2F;browse&#x2F;&quot;&gt;www.gnome-look.org&lt;&#x2F;a&gt; и &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.xfce-look.org&#x2F;browse&#x2F;&quot;&gt;www.xfce-look.org&lt;&#x2F;a&gt;. Но там не нашёл ничего подходящего и решил попробовать сваять что-нибудь самостоятельно, используя одну из готовых тем. Ну и заодно разобраться более подробно, как вообще работает механизм тем оформления GTK, о чём сейчас вкратце расскажу.&lt;&#x2F;p&gt;
&lt;p&gt;В файле &lt;code&gt;gtkrc&lt;&#x2F;code&gt; (&lt;code&gt;~&#x2F;.themes&#x2F;yourtheme&#x2F;gtk-2.0&#x2F;gtkrc&lt;&#x2F;code&gt;) определяются стили, которые будут использоваться для отображения того или иного элемента. Описание стиля выглядит так:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;style &amp;quot;name-of-style&amp;quot; [= &amp;quot;name-of-parent-style] {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    PROPERTY1 = VAL1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    PROPERTY2 = VAL2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    engine &amp;quot;name-of-engine&amp;quot; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     ENGINE_PROPERTY1 = VAL3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     ENGINE_PROPERTY2 = VAL4&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Каждый стиль имеет имя (&lt;code&gt;&quot;name-of-style&quot;&lt;&#x2F;code&gt;) и набор свойств (&lt;code&gt;PROPERTY1&lt;&#x2F;code&gt;, &lt;code&gt;PROPERTY2&lt;&#x2F;code&gt;). Свойства включают в себя определения цветов (напр. &lt;code&gt;bg[SELECTED] = &quot;#a3b8cc&quot;&lt;&#x2F;code&gt;) и параметры элементов интерфейса (напр. &lt;code&gt;GtkScrollbar::min_slider_length = 30&lt;&#x2F;code&gt;). Также нужно, обратить внимание на свойства &lt;code&gt;xthickness&lt;&#x2F;code&gt; и &lt;code&gt;ythickness&lt;&#x2F;code&gt;, которые, если я правильно понимаю, аналогичны свойству &lt;code&gt;padding&lt;&#x2F;code&gt; в HTML.&lt;&#x2F;p&gt;
&lt;p&gt;Стиль может наследовать свойства другого стиля (&lt;code&gt;&quot;name-of-parent-style&quot;&lt;&#x2F;code&gt;). Кроме того, можно задать, какой движок GTK (см. ниже) нужно использован для этого стиля (&lt;code&gt;engine &quot;name-of-engine&quot;&lt;&#x2F;code&gt;) и определить параметры этого движка (&lt;code&gt;ENGINE_PROPERTY1&lt;&#x2F;code&gt;, &lt;code&gt;ENGINE_PROPERTY2&lt;&#x2F;code&gt;)&lt;&#x2F;p&gt;
&lt;p&gt;Как правило, сначала описывается стиль &lt;code&gt;&quot;theme-default&quot;&lt;&#x2F;code&gt;, в котором определяются все основные параметры и движок, а оставшиеся стили наследуются от него.&lt;&#x2F;p&gt;
&lt;p&gt;Также необходимо указать к какому элементу какой стиль надо применить:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;class &amp;quot;GtkWidget&amp;quot;      style &amp;quot;theme-default&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;class &amp;quot;GtkButton&amp;quot;      style &amp;quot;theme-button&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;class &amp;quot;GtkScale&amp;quot;       style &amp;quot;theme-range&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Движок темы&lt;&#x2F;strong&gt; (engine) определяет внешний вид элементов интерфейса (widget), таких как кнопки, скроллбары, тулбары и т.д. Например в Ubuntu по умолчанию используется движок Ubuntulooks, а раньше использовался Clearlooks. Я использую движок под названием &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20061118110110&#x2F;https:&#x2F;&#x2F;cimi.netsons.org&#x2F;pages&#x2F;murrine.php&quot;&gt;Murrine&lt;&#x2F;a&gt;. Для этого движка существует утилита-конфигуратор под названием (угадайте с одного раза) &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20061118105829&#x2F;http:&#x2F;&#x2F;cimi.netsons.org&#x2F;pages&#x2F;murrine&#x2F;configurator.php&quot;&gt;Murrine Configurator&lt;&#x2F;a&gt;. Это программка позволяет менять параметры движка в уже установленных темах (основанных на Murrine).&lt;&#x2F;p&gt;
&lt;p&gt;При создании темы очень полезна будет программка &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20061117215317&#x2F;https:&#x2F;&#x2F;www.stellingwerff.com&#x2F;?page_id=10&quot;&gt;The Widget Factory&lt;&#x2F;a&gt; – она представляет из себя окно, в котором собраны все (или почти все) GTK виджеты, и позволяет менять тему оформления только внутри этого окна (то есть не затрагивая остальные программы).&lt;&#x2F;p&gt;
&lt;p&gt;Исчерпывающую информацию по созданию тем GTK можно найти &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20061115155228&#x2F;http:&#x2F;&#x2F;live.gnome.org&#x2F;GnomeArt&#x2F;Tutorials&#x2F;GtkThemes&quot;&gt;здесь&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Напоследок маленькая плюшка для тех, кто использует Xfce. Добавьте в файл &lt;code&gt;gtkrc&lt;&#x2F;code&gt; следующий текст:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;style &amp;quot;xfdesktop-icon-view&amp;quot; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    XfdesktopIconView::label-alpha = 25&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    base[NORMAL] = &amp;quot;#000000&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    base[SELECTED] = &amp;quot;#ffffff&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    base[ACTIVE] = &amp;quot;#ffffff&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    fg[NORMAL] = &amp;quot;#ffffff&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    fg[SELECTED] = &amp;quot;#ffffff&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    fg[ACTIVE] = &amp;quot;#ffffff&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;widget_class &amp;quot;*XfdesktopIconView*&amp;quot; style &amp;quot;xfdesktop-icon-view&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;и вы сможете управлять внешним видом подписей к значкам на рабочем столе.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Графический установщик Debian</title>
        <published>2006-09-15T00:00:00+00:00</published>
        <updated>2006-09-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/graficheskii-ustanovschik-debian/"/>
        <id>https://adf.xyz/ru/blog/graficheskii-ustanovschik-debian/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/graficheskii-ustanovschik-debian/">&lt;p&gt;Сегодня получил свежие диски с Debian Etch, укомплектованные новой версией установщика. Инсталлер теперь поддерживает графический режим, хотя по умолчанию используется классическая установка. Первое, что я сделал, это воткнул диски в виртуальную машину и попробовал произвести установку. Результат меня порадовал - графический режим действительно присутствует и, самое главное, работает 🙂 Система поставилась без проблем. Принципиальных отличий от консольного режима нет - последовательность установки точно такая же. По ходу установки сделал несколько скриншотов - смотреть &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070623064900&#x2F;http:&#x2F;&#x2F;www.flickr.com&#x2F;photos&#x2F;86353793@N00&#x2F;sets&#x2F;72157594285165869&#x2F;detail&#x2F;&quot;&gt;здесь&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Oblivion через Cedega</title>
        <published>2006-09-08T05:00:00+00:00</published>
        <updated>2006-09-08T05:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/oblivion-cherez-cedega/"/>
        <id>https://adf.xyz/ru/blog/oblivion-cherez-cedega/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/oblivion-cherez-cedega/">&lt;p&gt;Уже неделю играюсь в Oblivion под &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.cedega.com&#x2F;&quot;&gt;Cedega&lt;&#x2F;a&gt;. Запустить удалось не сразу, пришлось немного пошаманить. Во-первых, Cedega не поддерживает (пока) Pixel Shaders 2.0, поэтому запускать игру нужно через специальную программу, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060902050238&#x2F;http:&#x2F;&#x2F;www.oldblivion.com&#x2F;&quot;&gt;Oldblivion&lt;&#x2F;a&gt;, которая обеспечивает совместимость со старыми видеокартами (в данном случае — совместимость с Cedega). Во-вторых, Oldblivion не запускается на Cedega 5.2.5 (последняя версия), нужно использовать более старый движок — 5.2.4&lt;&#x2F;p&gt;
&lt;p&gt;Все трудности были в итоге преодолены и теперь я наслаждаюсь этой отличной игрой, чего и вам желаю.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;картинка была утеряна&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;!-- [![Oblivion on Cedega](http:&#x2F;&#x2F;static.flickr.com&#x2F;85&#x2F;237746522_e1cc0c5d4c.jpg)](http:&#x2F;&#x2F;static.flickr.com&#x2F;85&#x2F;237746522_e1cc0c5d4c_o.png) --&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Plone + Jabber (next step)</title>
        <published>2006-09-08T05:00:00+00:00</published>
        <updated>2006-09-08T05:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/plone-jabber-next-step/"/>
        <id>https://adf.xyz/ru/blog/plone-jabber-next-step/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/plone-jabber-next-step/">&lt;p&gt;Разработка JabberAuthPlugin&#x27;а продвигается успешно. Теперь это уже полностью рабочий продукт, позволяющий проводить аутентификацию через сервер jabber, а также обеспечивающий авторизацию (авторизацию на самом деле обеспечивает Zope, но плагин теперь даёт возможность сопоставлять имена пользователей с ролями). Продукт укомплектован инсталлером, так что установить и настроить его очень просто.&lt;&#x2F;p&gt;
&lt;p&gt;Пришлось переключиться с &lt;code&gt;python-xmpp&lt;&#x2F;code&gt; на &lt;code&gt;python-pyxmpp&lt;&#x2F;code&gt;. Первый оказался уж больно замудрёным, так и не смог понять, как с его помощью отправлять и принимать iq.&lt;&#x2F;p&gt;
&lt;p&gt;Инструкции по установке &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;trac.grove.org&#x2F;plone&#x2F;wiki&#x2F;JabberAuthPlugin&quot;&gt;здесь&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Исходный код &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;svn.grove.org.ru&#x2F;plone&#x2F;JabberAuthPlugin&#x2F;trunk&#x2F;&quot;&gt;здесь&lt;&#x2F;a&gt; (svn)&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Plone + Jabber</title>
        <published>2006-08-24T05:00:00+00:00</published>
        <updated>2006-08-24T05:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/plone-jabber/"/>
        <id>https://adf.xyz/ru/blog/plone-jabber/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/plone-jabber/">&lt;p&gt;Начал работу над интеграцией Plone и Jabber. Использую для этого PluggableAuthService. Это даст возможность пользователям входить на сайт используя их учётную запись с какого-либо сервера Jabber.&lt;&#x2F;p&gt;
&lt;p&gt;Аутентификация уже работает (пользователь может &quot;войти&quot;), теперь нужно приделать авторизацию, то есть привязку учётной записи пользователя к определённым ролям.&lt;&#x2F;p&gt;
&lt;p&gt;На исходники можно посмотреть &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060111091811&#x2F;http:&#x2F;&#x2F;www.grove.org.ru&#x2F;trac&#x2F;&quot;&gt;здесь&lt;&#x2F;a&gt;. Также есть тестовый сайт, на котором это механизм уже работает, но ссылку я пока публиковать не буду :) Потом опубликую, если дело выгорит.&lt;&#x2F;p&gt;
&lt;!-- Оригинальная ссылка: http:&#x2F;&#x2F;grove.org.ru&#x2F;trac&#x2F;plone&#x2F;browser&#x2F;JabberAuthPlugin&#x2F;trunk --&gt;</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Первый commit в collective</title>
        <published>2006-08-21T00:00:00+00:00</published>
        <updated>2006-08-21T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/pervyi-commit-v-collective/"/>
        <id>https://adf.xyz/ru/blog/pervyi-commit-v-collective/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/pervyi-commit-v-collective/">&lt;p&gt;Мой &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070107180045mp_&#x2F;http:&#x2F;&#x2F;dev.plone.org&#x2F;collective&#x2F;changeset&#x2F;29098&quot;&gt;первый commit&lt;&#x2F;a&gt; в &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;svn.plone.org&#x2F;svn&#x2F;collective&#x2F;&quot;&gt;http:&#x2F;&#x2F;svn.plone.org&#x2F;svn&#x2F;collective&#x2F;&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
Мелочь, а приятно 🙂&lt;&#x2F;p&gt;
&lt;p&gt;BTW, благодаря этому commit&#x27;у я могу использовать &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070107180045mp_&#x2F;http:&#x2F;&#x2F;performancing.com&#x2F;&quot;&gt;Performancing&lt;&#x2F;a&gt; в своём блоге. Собственно это первая запись, сделанная с помощью Performancing&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Установка Zope&#x2F;Plone в Debian (Etch)</title>
        <published>2006-08-15T17:49:00+00:00</published>
        <updated>2006-08-15T17:49:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/ustanovka-zope-plone-v-debian-etch/"/>
        <id>https://adf.xyz/ru/blog/ustanovka-zope-plone-v-debian-etch/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/ustanovka-zope-plone-v-debian-etch/">&lt;p&gt;Прежде всего нужно установить необходимые пакеты:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;apt-get&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; zope2.8&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;apt-get&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; install&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; plone&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;При этом будут установлены все необходимые недостающие пакеты, среди которых различные компоненты, являющиеся частью Plone (CMF, Archetypes и др.), а также пакет &lt;code&gt;zope-common&lt;&#x2F;code&gt;, который содержит различные утилиты для управления Zope.&lt;&#x2F;p&gt;
&lt;p&gt;Следующий шаг - создание &lt;em&gt;экземпляра&lt;&#x2F;em&gt; Zope (Zope instance). Каждый экземпляр запускается &lt;em&gt;отдельным процессом&lt;&#x2F;em&gt;, имеет собственные &lt;em&gt;настройки&lt;&#x2F;em&gt;, собственное &lt;em&gt;хранилище данных&lt;&#x2F;em&gt; (объектная база ZODB) и собственный набор доступных &lt;em&gt;продуктов&lt;&#x2F;em&gt;. В общем можно создать сколько угодно экземпляров Zope, но нам сейчас хватит и одного.&lt;&#x2F;p&gt;
&lt;p&gt;Для управления экземплярами Zope служит утилита &lt;code&gt;dzhandle&lt;&#x2F;code&gt; (из пакета &lt;code&gt;zope-common&lt;&#x2F;code&gt;). Чтобы создать экземпляр, достаточно выполнить команду:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;dzhandle&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;z&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; 2.8&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; make-instance&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;instance_nam&lt;&#x2F;span&gt;&lt;span&gt;e&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt; -&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant&quot;&gt;m&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; all&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;От вас потребуется ввести имя и пароль для учетной записи пользователя, который будет являться первоначальным администратором этого экземпляра (этот пользователь существует только внутри данного экземпляра и не имеет отношения к пользователям операционной системы). Обычно в качестве имени используется &lt;code&gt;admin&lt;&#x2F;code&gt;, а пароль выберите самостоятельно.&lt;&#x2F;p&gt;
&lt;p&gt;В результате выполнения команды будет создан каталог &lt;code&gt;&#x2F;var&#x2F;lib&#x2F;zope2.8&#x2F;instance&#x2F;instance_name&lt;&#x2F;code&gt;, содержащий файлы, относящиеся к данному экземпляру. Рассмотрим повнимательнее содержимое этого каталога:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;ls&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;var&#x2F;lib&#x2F;zope2.8&#x2F;instance&#x2F;instance_name&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name&quot;&gt;bin&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;  etc@&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;  Extensions&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;  import&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;  inituser&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;  log@&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;  Products&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;  README.txt&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt;  var&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;bin&#x2F;&lt;&#x2F;strong&gt; — Этот каталог содержит исполняемый файл &lt;code&gt;runzope&lt;&#x2F;code&gt;, который служит для запуска экземпляра &quot;вручную&quot;. Такой способ запуска не является предпочтительным, но может быть использован, например, при тестировании новых продуктов, так как при таком запуске будет выведена достаточно много отладочной информации.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;etc@&lt;&#x2F;strong&gt; — Это ссылка на каталог &lt;code&gt;&#x2F;etc&#x2F;zope2.8&#x2F;instance_name&lt;&#x2F;code&gt;, к котором содержатся настройки данного экземпляра. Настройки сервера находятся в файле &lt;code&gt;zope.conf&lt;&#x2F;code&gt;. Описание настроек находится в самом файле в виде комментариев. Следует обратить особое внимание на переменную &lt;code&gt;HTTPPORT&lt;&#x2F;code&gt;, она определяет порт, на котором сервер будет принимать HTTP запросы. Если указанный порт занят другим процессом, сервер просто не запустится. Кроме того в этом каталоге имеется файл &lt;code&gt;debian_policy&lt;&#x2F;code&gt;. В нем определяется политика установки продуктов в этот экземпляр и политика его перезапуска. Эти параметры вы определяли при создании экземпляра командой &lt;code&gt;dzhandle&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Extensions&#x2F;&lt;&#x2F;strong&gt; — В этот каталог помещаются скрипты Python, которые нужно вызывать в качестве внешних методов (external method).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;import&#x2F;&lt;&#x2F;strong&gt; — В этот каталог помещаются zexp-файлы, которые вы хотите импортировать в ZODB. Импорт производится через ZMI.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;log@&lt;&#x2F;strong&gt; — Ссылка на каталог &lt;code&gt;&#x2F;var&#x2F;log&#x2F;zope2.8&#x2F;instance_name&lt;&#x2F;code&gt;. Здесь хранятся логи экземпляра.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Products&#x2F;&lt;&#x2F;strong&gt; — Каталог, содержащий продукты, установленные в данный экземпляр. В зависимости от политики установки продуктов, здесь могут находится либо непосредственно папки, содержащие тот или иной продукт, либо ссылки на них (сами продукты при этом размещаются либо в &lt;code&gt;&#x2F;usr&#x2F;share&#x2F;zope&#x2F;Products&lt;&#x2F;code&gt; при установке их из Debian, либо в &lt;code&gt;&#x2F;usr&#x2F;local&#x2F;share&#x2F;zope&#x2F;Products&lt;&#x2F;code&gt; при установке локально).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;var&#x2F;&lt;&#x2F;strong&gt; — Здесь находится файл с базой ZODB - &lt;code&gt;Data.fs&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Запуск экземпляра производится командой &lt;code&gt;invoke-rc.d zope2.8 start&lt;&#x2F;code&gt;. Останов производится командой &lt;code&gt;invoke-rc.d zope2.8 stop&lt;&#x2F;code&gt;. Обратите внимание, что эти команды управляют &lt;em&gt;всеми&lt;&#x2F;em&gt; имеющимися экземплярами. Для управления отдельным экземпляром используйте команду &lt;code&gt;dzhandle zopectl instance_name [start|stop]&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;После того, как экземпляр запущен, вы можете зайти попасть в интерфейс управления Zope (ZMI), набрав в браузере адрес &lt;code&gt;http:&#x2F;&#x2F;localhost:8080&#x2F;manage&lt;&#x2F;code&gt; (подразумевается, что сервер принимает HTTP запросы на порту 8080). Указав логин и пароль администратора вы попадете в ZMI. Для установки Plone выберите Plone Site из выпадающего списка и нажмите Add. Объект Plone Site будет создан в корневой папке вашего экземпляра (речь идет об объектной структуре внутри ZODB, а не о реальной файловой системе).&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Размер шрифта</title>
        <published>2006-08-15T17:31:00+00:00</published>
        <updated>2006-08-15T17:31:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/font-size/"/>
        <id>https://adf.xyz/ru/blog/font-size/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/font-size/">&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Текст заметки утрачен&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Считаем деньги</title>
        <published>2006-08-15T00:00:00+00:00</published>
        <updated>2006-08-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/grisbi/"/>
        <id>https://adf.xyz/ru/blog/grisbi/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/grisbi/">&lt;p&gt;Евгения Власова &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060919071739&#x2F;http:&#x2F;&#x2F;blog.eugeniavlasova.com&#x2F;archives&#x2F;zhizn_v_linukse&#x2F;kmymoney_vs_ms_money.html&quot;&gt;пишет в своем блоге&lt;&#x2F;a&gt; о программе для ведения бюджета, которая называется KMyMoney.&lt;&#x2F;p&gt;
&lt;p&gt;Где-то год назад у меня была идея посчитать свои деньги, тогда это закончилось ничем. Сейчас я решил попробовать снова, тем более, что перед глазами есть, так скачать, живой пример.&lt;&#x2F;p&gt;
&lt;p&gt;Так как я предпочитаю программы, названия которых начинаются на &lt;strong&gt;G&lt;&#x2F;strong&gt;, а не на &lt;strong&gt;K&lt;&#x2F;strong&gt;, я отправился на &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060907020826&#x2F;https:&#x2F;&#x2F;www.gnomefiles.org&#x2F;subcategory.php?sub_cat_id=121&quot;&gt;gnomefiles.org&lt;&#x2F;a&gt; в поисках подходящей софтины. Посмотрев несколько программ, я остановился на &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.grisbi.org&#x2F;&quot;&gt;Grisbi&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;картинка утеряна&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;!-- ![Grisbi Screenshot](http:&#x2F;&#x2F;static.flickr.com&#x2F;48&#x2F;126777436_a78b443be6.jpg) --&gt;
&lt;p&gt;Принцип работы с этой программой такой: сначала нужно создать так называемые &quot;счета&quot; (accounts). Это могут быть, например, ваши счета в Швейцарском банке, либо просто ваша наличность. В моем случае я создал три счета: Наличные, Связьбанк (туда капает моя зарплата) и WMZ (мой кошелек WebMoney). По умолчанию созданный счет ведется в Евро, но это легко можно поправить в настройках.&lt;&#x2F;p&gt;
&lt;p&gt;Затем надо определиться с категориями расходов и доходов. По умолчанию предлагается достаточно большой список категорий, подходящий практически под все случаи жизни, но мне пришлось все-таки поковырять его в ручную.&lt;&#x2F;p&gt;
&lt;p&gt;Все. Теперь можно начинать записывать свои транзакции. На то, чтобы зафиксировать все свои траты за один день, у меня ушло около 15 минут, но при этом мне пришлось постоянно отвлекаться на создание новой категории и т.п. Так что 5-10 минут в день и все будет учтено и посчитано.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Xfce 4.4-beta1</title>
        <published>2006-08-15T00:00:00+00:00</published>
        <updated>2006-08-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/xfce4-4-beta1/"/>
        <id>https://adf.xyz/ru/blog/xfce4-4-beta1/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/xfce4-4-beta1/">&lt;p&gt;Вчера состоялся релиз первой беты &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070209004553&#x2F;http:&#x2F;&#x2F;www.xfce.org&#x2F;index.php?page=download&amp;amp;lang=ru#source&quot;&gt;Xfce 4.4&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;!-- http:&#x2F;&#x2F;static.flickr.com&#x2F;55&#x2F;130849612_8d27c316f5.jpg --&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;картинка утрачена&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Главные изменения:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Новый файловый менеджер - &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070209004553&#x2F;http:&#x2F;&#x2F;thunar.xfce.org&#x2F;&quot;&gt;Thunar&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Полностью переработанные панели, которые теперь стали похожи на панели в Gnome.&lt;&#x2F;li&gt;
&lt;li&gt;Добавлена возможность размещать объекты на рабочем столе.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Краткое описание внесенных изменений вы можете прочитать в &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070209004553&#x2F;http:&#x2F;&#x2F;xfce-diary.blogspot.com&#x2F;2006&#x2F;04&#x2F;major-changes-in-xfce-44beta1.html&quot;&gt;блоге одного из разработчиков&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Для меня этот релиз знаменателен тем, что я принимал непосредственное участие в его переводе на русский язык. Где-то полтора месяца назад я заметил, что перевод Xfce на русский не прогрессирует. Поэтому я взял инициативу в свои руки и вот &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070209004553&#x2F;http:&#x2F;&#x2F;grove.org.ru&#x2F;trac&#x2F;translations&#x2F;translations&quot;&gt;результат&lt;&#x2F;a&gt;. На данный момент нельзя сказать, что перевод готов на 100%. Но основная часть сделана (это не только моя заслуга, предыдущие переводчики проделали большую работу, ну и разумеется мне помог sir_sigurd).&lt;&#x2F;p&gt;
&lt;p&gt;Основная задача сейчас - это проверка переводов. Поэтому пока разработчики призывают искать баги в самом Xfce, я призываю искать баги в переводе. Если найдете, пишите &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20070209004553&#x2F;http:&#x2F;&#x2F;grove.org.ru&#x2F;trac&#x2F;translations&#x2F;newticket&quot;&gt;сюда&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Пара ссылок на тему Debian</title>
        <published>2006-04-08T00:00:00+00:00</published>
        <updated>2006-04-08T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/two-debian-related-links/"/>
        <id>https://adf.xyz/ru/blog/two-debian-related-links/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/two-debian-related-links/">&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060614174030&#x2F;http:&#x2F;&#x2F;www.0d.be&#x2F;debian&#x2F;debian-gnome-2.14-status.html&quot;&gt;Status of GNOME 2.14 in Debian&lt;&#x2F;a&gt; — Я думаю многих интересует, когда же Gnome 2.14 появится в Debian Etch. На этой странице вы можете узнать о текущем состоянии пакетов, входящих в Gnome 2.14.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060614174030&#x2F;http:&#x2F;&#x2F;bjorn.haxx.se&#x2F;debian&#x2F;&quot;&gt;Why is package X not in testing yet?&lt;&#x2F;a&gt; — Здесь вы можете получить детальную информацию о том, почему определенный пакет еще не вошел в testing.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Поменял внешний вид</title>
        <published>2006-04-05T15:01:00+00:00</published>
        <updated>2006-04-05T15:01:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/new-skin-2006/"/>
        <id>https://adf.xyz/ru/blog/new-skin-2006/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/new-skin-2006/">&lt;p&gt;Изменил внешний вид &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060614173856&#x2F;http:&#x2F;&#x2F;www.grove.org.ru&#x2F;&quot;&gt;http:&#x2F;&#x2F;www.grove.org.ru&lt;&#x2F;a&gt;. Было серым, стало синим. Несколько часов работы и вот результат, почему-то напоминающий мне &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060614173856&#x2F;http:&#x2F;&#x2F;forum.mozilla.ru&#x2F;&quot;&gt;forum.mozilla.ru&lt;&#x2F;a&gt; 🙂&lt;&#x2F;p&gt;
&lt;p&gt;Теперь я решил почти не вмешиваться в дефолтные таблицы стилей Plone. В общем ничего особенного, минимум графики, но надеюсь, что смотреть на все это стало приятней. XHTML валидный, CSS не проверял. Корректно работает в Firefox 1.5 и Opera 8.5. В IE проверить не могу, так как у меня его нету. Если кто-то хочет поделиться мнением, милости прошу в комменты или &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060614173856&#x2F;http:&#x2F;&#x2F;grove.org.ru&#x2F;trac&#x2F;groveskin&#x2F;wiki&quot;&gt;сюда&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Торвальдс в Debian</title>
        <published>2006-04-01T13:34:00+00:00</published>
        <updated>2006-04-01T13:34:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/linus-at-debian/"/>
        <id>https://adf.xyz/ru/blog/linus-at-debian/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/linus-at-debian/">&lt;p&gt;Линус Торвальдс &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060614173940&#x2F;http:&#x2F;&#x2F;linustorvalds.typepad.com&#x2F;the_kernel_blog&#x2F;2006&#x2F;04&#x2F;account_created.html&quot;&gt;вошел&lt;&#x2F;a&gt; в число разработчиков Debian.&lt;&#x2F;p&gt;
&lt;p&gt;Теперь можно будет назвать Debian (и Ubuntu) &quot;официальным&quot; дистрибутивом Linux.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>IE7 must live?</title>
        <published>2006-02-11T06:19:00+00:00</published>
        <updated>2006-02-11T06:19:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/ie7-must-live/"/>
        <id>https://adf.xyz/ru/blog/ie7-must-live/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/ie7-must-live/">&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060614173920&#x2F;http:&#x2F;&#x2F;lenta.ru&#x2F;&quot;&gt;Лента.ру&lt;&#x2F;a&gt; в &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060614173920&#x2F;http:&#x2F;&#x2F;lenta.ru&#x2F;articles&#x2F;2006&#x2F;02&#x2F;10&#x2F;ie7&#x2F;&quot;&gt;обзоре&lt;&#x2F;a&gt; второй беты IE7 пишет:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;...не все потоки читаются. Вероятнее всего, дело здесь в том, что поток должен точно соответствовать утвержденным стандартам. Надо сказать, что большинство ошибок и отклонений от стандарта при создании потоков давно известно, и некоторые популярные программы для чтения RSS умеют их обходить или исправлять в автоматическом режиме. Так, например, RSS-поток &quot;Ленты.ру&quot; отлично читается браузером Firefox, но отказывается показываться в Internet Explorer 7.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Читать это нужно видимо так: &quot;Ленивые и недалекие разработчики из Microsoft не удосужились исправить ошибки, которые мы сделали в нашей RSS-ленте.&quot; Не думал, что когда-нибудь буду поддерживать IE, но если он и в дальнейшем будет так ревностно относится к стандартам, то я стану его ярым сторонником (хотя вряд ли буду когда-нибудь его использовать). Интересно, а как будут отображаться в IE7 сайты, &quot;заточенные&quot; под IE v. &amp;lt;=6 ?&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Ploneboard fundraising</title>
        <published>2006-02-10T09:51:00+00:00</published>
        <updated>2006-02-10T09:51:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/ploneboard-fundraising/"/>
        <id>https://adf.xyz/ru/blog/ploneboard-fundraising/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/ploneboard-fundraising/">&lt;p&gt;&lt;em&gt;Скажите, — спросил Кислярский жалобно,—
а двести рублей не могут спасти гиганта мысли?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060306162718&#x2F;http:&#x2F;&#x2F;www.theploneblog.org&#x2F;archive&#x2F;2006&#x2F;02&#x2F;09&#x2F;community-funding-initiative-for-ploneboard-announced&quot;&gt;Вот эта запись&lt;&#x2F;a&gt; в &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060306162718&#x2F;http:&#x2F;&#x2F;www.theploneblog.org&#x2F;&quot;&gt;The Plone Blog&lt;&#x2F;a&gt; весьма меня заинтересовала. Если вам лениво читать, то вкратце перескажу суть. Долгое время единственным широко используемым форумом для Plone был CMFBoard. Но сейчас этот продукт устарел и не ясно, будет ли он поддерживаться в будущем. Разговоры о том, что нужен новый продукт-форум для Plone, ведутся уже давно. Несколько месяцев назад &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060306162718&#x2F;http:&#x2F;&#x2F;www.plonesolutions.com&#x2F;&quot;&gt;Plone Solutions&lt;&#x2F;a&gt; выпустила &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060306162718&#x2F;http:&#x2F;&#x2F;plone.org&#x2F;products&#x2F;ploneboard&quot;&gt;Plone Board&lt;&#x2F;a&gt; - продукт, который должен стать тем самым форумом нового поколения, который всем так необходим. Однако он до сих пор пребывает в состоянии 0.1beta1 и движения вперед не видно. Поэтому группа энтузиастов, использующих CMFBoard на своих сайтах и разочаровавшихся в нем, решила форсировать процесс разработки Plone Board. Они начали с того, что сформулировали требования к продукту, основываясь на опыте работы с CMFBoard и другими движками для форумов. Но оставалась одна маааленькая проблема - кто же будет заниматься разработкой? Plone Solutions выпускает продукты, которые востребованы их клиентами (форум к числу таковых не относится).&lt;&#x2F;p&gt;
&lt;p&gt;Тем не менее форум нужен очень многим. Но несмотря на это, не нашлось человека или организации, способной в одиночку профинансировать разработку, как не нашлось и энтузиаста, который смог бы в свободное время сделать продукт достаточно высокого качества. Поэтому было решено организовать &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060306162718&#x2F;https:&#x2F;&#x2F;www.fundable.org&#x2F;groupactions&#x2F;ploneboard&quot;&gt;сбор средств&lt;&#x2F;a&gt;, из которых будет финансироваться разработка. Для сбора средств в частности будет использоваться сайт &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060306162718&#x2F;http:&#x2F;&#x2F;www.fundable.org&#x2F;&quot;&gt;fundable.org&lt;&#x2F;a&gt;. На этом сайте каждый может организовать сбор денег для достижения каких-либо благих целей, начиная от покупки подарка и заканчивая обновлением серверного железа. Для перечислений используется система PayPal, либо кредитная карточка. Для каждого проекта устанавливается сумма, которую необходимо собрать и дата, после которой сбор прекращается. Отличительной особенностью является то, что деньги фактически перечисляются с вашего счета только после того, как будет набрана заявленная сумма, в противном случае проект считается невыполненным и деньги никуда не уходят. Такой механизм является более эффективным, чем обычная система пожертвований (donations), так как определена конкретная цель для применения собранных средств и есть гарантия, что деньги будут потрачены на нее либо не будут потрачены вообще. Если же собранные деньги направляются на разработку ПО, то такую модель разработки можно назвать &lt;em&gt;social source&lt;&#x2F;em&gt; (последнее время меня начинает подташнивать от слова social, но кому-то оно все еще нравится) и в сочетании с &lt;em&gt;open source&lt;&#x2F;em&gt; она может увеличить в разы скорость и качество разработки.&lt;&#x2F;p&gt;
&lt;p&gt;Еще несколько примеров успешного fundraising&#x27;а вы можете найти в статье &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060306162718&#x2F;http:&#x2F;&#x2F;www.cignex.com&#x2F;images&#x2F;eosjgoldegg&quot;&gt;The Prince and the Golden Egg&lt;&#x2F;a&gt; (внимание, там PDF).&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Переводы</title>
        <published>2006-02-07T10:51:00+00:00</published>
        <updated>2006-02-07T10:51:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/translations/"/>
        <id>https://adf.xyz/ru/blog/translations/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/translations/">&lt;p&gt;Strannick, в &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060306162658&#x2F;http:&#x2F;&#x2F;strannick.blogspot.com&#x2F;2006&#x2F;02&#x2F;ubuntu-debian.html&quot;&gt;разговоре об Ubuntu&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060306162658&#x2F;http:&#x2F;&#x2F;http&#x2F;&#x2F;strannick.blogspot.com&#x2F;2006&#x2F;02&#x2F;ubuntu-debian.html#comment-113930387971534132&quot;&gt;пишет&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Также радует довольно грамотно сделаный механизм локализации (прямо на сайте)...&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Я сторонник другого подхода к локализации. Я считаю, что поддержкой локализации должен заниматься не отдельный дистрибутив, а сам разработчик. В идеале - человек&#x2F;команда, целенаправленно занимающиеся переводом программ на свой язык. Хорошим примером может служить &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060306162658&#x2F;http:&#x2F;&#x2F;fsa-bg.org&#x2F;project&#x2F;gtp&#x2F;wiki&quot;&gt;болгарский проект по локализации Gnome&lt;&#x2F;a&gt;. Так как я и sir_sigurd уже некоторое время занимаемся переводами, было решено организовать &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060306162658&#x2F;http:&#x2F;&#x2F;grove.org.ru&#x2F;trac&#x2F;translations&quot;&gt;нечто подобное&lt;&#x2F;a&gt;. Я решил, что наиболее эффективным способом организовать переводы будет хранение их в SVN-репозитарии. Кроме того может оказаться очень полезным наличие wiki. Что объединяет SVN и wiki? Конечно же система управления проектами Trac (болгарские коллеги тоже используют Trac, кстати).&lt;&#x2F;p&gt;
&lt;p&gt;Сейчас я делаю плагин для Trac, который позволит управлять переводами, собирать статистику по ним и, если у меня хватит терпения, делать переводы TTW, то есть так, как это сделано на &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060306162658&#x2F;https:&#x2F;&#x2F;launchpad.net&#x2F;rosetta&quot;&gt;Launchpad.net&lt;&#x2F;a&gt; (при этом я постараюсь сделать более удобный интерфейс, чем у Rosetta. &lt;em&gt;Tip: Ajax rocks!&lt;&#x2F;em&gt;). К сожалению я не могу уделять много времени этой разработке, но некоторые &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060306162658&#x2F;http:&#x2F;&#x2F;grove.org.ru&#x2F;trac&#x2F;translations&#x2F;translate&quot;&gt;результаты&lt;&#x2F;a&gt; уже имеются.&lt;&#x2F;p&gt;
&lt;p&gt;PS. Если вдруг вы занимаетесь локализацией свободного ПО - милости просим!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Почему Python?</title>
        <published>2006-01-10T08:11:00+00:00</published>
        <updated>2006-01-10T08:11:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/why-python/"/>
        <id>https://adf.xyz/ru/blog/why-python/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/why-python/">&lt;p&gt;Перевод статьи Эрика Рэймонда &quot;Why Python?&quot; (перевод не закончен).&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060211043704&#x2F;http:&#x2F;&#x2F;linuxjournal.com&#x2F;article&#x2F;3882&quot;&gt;Оригинал статьи&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Мой первый взгляд на Python был случайным, и тогда мне не очень-то понравилось то, что я увидел. Это было в начале 1997, и книжка Марка Лутца &quot;Программирование на Python&quot; от O&#x27;Reilly &amp;amp; Associates только что вышла. Книжки O&#x27;Reilly время от времени оказываются у меня на пороге, выбранные среди новых изданий каким-то таинственным добродетелем, находящимся внутри организации, по случайному принципу, который я уже отчаялся понять.&lt;&#x2F;p&gt;
&lt;p&gt;Одной из них оказалась &quot;Программирование на Python&quot;. Это заинтересовало меня, так как я коллекционирую компьютерные языки. Я знаю две с лишним дюжины языков общего назначения, пишу компиляторы и интерпретаторы ради забавы; также я самостоятельно разработал несколько языков специального назначения и правил разметки. Мой последний завершенный проект на момент написания этой статьи — это язык специального назначения под названием SNG для операций с PNG (Portable Network Graphics) изображениями. Интересующиеся читатели могут зайти на страничку SNG по адресу &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060211043704&#x2F;http:&#x2F;&#x2F;www.catb.org&#x2F;%7Eesr&#x2F;sng&#x2F;&quot;&gt;http:&#x2F;&#x2F;www.catb.org&#x2F;~esr&#x2F;sng&#x2F;&lt;&#x2F;a&gt;. Я также написал несколько реализаций необычных языков общего назначения на моей страничке Retrocomputing Museum, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060211043704&#x2F;http:&#x2F;&#x2F;www.catb.org&#x2F;retro&#x2F;&quot;&gt;http:&#x2F;&#x2F;www.catb.org&#x2F;retro&#x2F;&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;На тот момент я уже достаточно слышал о Python, чтобы знать, что это, как сейчас говорят, &quot;скриптовый язык&quot; - интерпретируемый язык со встроенным управлением памятью и хорошими возможностями для вызовов и работы с другими программами. Так что я &quot;нырнул в Python&quot;, задавая себе единственный вопрос: что в нем есть такого, чего нет в Perl?&lt;&#x2F;p&gt;
&lt;p&gt;Perl это восьмисотфунтовая горилла среди современных скриптовых языков. Он во многом заменил шелл в качестве скриптового языка для многих системных администраторов благодаря его всеобъемлющему набору UNIX библиотек и системных вызовов, а также огромной коллекции модулей, созданных очень активным сообществом Perl. Он также часто рассматривается как CGI язык, стоящий за более чем 85% &quot;живого&quot; Интернета. Larry Wall, его создатель, по праву считается одним из важнейших лидеров сообщества Open Source и часто ставится на третье место (после Линуса Торвальдса и Ричарда Столлмана) в пантеоне хакерских полубогов.&lt;&#x2F;p&gt;
&lt;p&gt;В то время я использовал Perl для нескольких небольших проектов. Я считал его достаточно мощным, хотя синтаксис и некоторые другие аспекты казались нерегламентированными и &quot;способными укусить&quot;, если использовать их неаккуратно. Мне казалось, что Python будет просто &quot;еще одним холмом, на который предстоит взойти&quot; при изучении скриптовых языков, так что во время чтения я, прежде всего, искал отличия от Perl.&lt;&#x2F;p&gt;
&lt;p&gt;Я сразу же споткнулся на этой странной особенности Python, которую все замечают: отступы имеют значение в синтаксисе языка. В языке отсутствует аналог конструкций со скобками, как в C или Perl; вместо этого группы выражений разделяются путем смены величины отступа. И, как и большинство хакеров, впервые столкнувшихся с этим, я отреагировал неприязнью.&lt;&#x2F;p&gt;
&lt;p&gt;Я достаточно стар, чтобы успеть попрограммировать на FORTRAN в 1970. Большинство хакеров не застали эти времена, но каким-то образом в нас живет память о том, какими ужасными были эти старые языки с фиксированными полями. Действительно, термин &quot;свободный формат&quot;, который использовался для описания нового стиля синтаксиса в Pascal и C, уже почти забыт; на протяжении десятилетий все языки разрабатываются именно так. Ну или почти все. Нельзя осуждать человека за то, что его реакция на эту особенность Python похожа на ту, которая бывает, если случайно наступить в огромную дымящуюся динозавровую какашку.&lt;&#x2F;p&gt;
&lt;p&gt;Именно это я и ощутил. Я прошелся по остальному описанию языка без особого интереса. Я не мог сказать ничего хорошего о Python, кроме, пожалуй, того, что синтаксис выглядел чище чем в Perl, и были неплохие возможности для создания базовых GUI-элементов, таких как кнопки и меню.&lt;&#x2F;p&gt;
&lt;p&gt;Я поставил книжку на полку, отметив для себя, что надо будет когда-нибудь сделать GUI-приложение на Python, просто чтобы убедится, что я действительно понял язык. Но я не верил в то, что увиденное мною может эффективно сравниться с Perl.&lt;&#x2F;p&gt;
&lt;p&gt;Оставшаяся часть 1997 года была насыщенной событиями; среди прочего это был год, когда я написал и опубликовал первоначальную версию &quot;The Cathedral and the Bazaar&quot;. Но я нашел время, чтобы написать несколько программ на Perl, две из которых имели значительный размер и были достаточно сложными. Одна из них, keeper, это помощник, который до сих пор используется для регистрации поступлений в архив программного обеспечения Metalab. Он генерирует веб-страницу, которую вы можете увидеть по адресу &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060211043704&#x2F;http:&#x2F;&#x2F;metalab.unc.edu&#x2F;pub&#x2F;Linux&#x2F;%21INDEX.html&quot;&gt;http:&#x2F;&#x2F;metalab.unc.edu&#x2F;pub&#x2F;Linux&#x2F;!INDEX.html&lt;&#x2F;a&gt;. Другая, anthologize, использовалась для автоматической генерации PostScript для шестого издания Linux из архива HOWTO проекта документации Linux. Обе программы доступны на Metalab.&lt;&#x2F;p&gt;
&lt;p&gt;Создание этих программ делало меня все менее удовлетворенным Perl. Большой размер проекта преумножал недостатки Perl, делая их серьезной проблемой. Синтаксис, который выглядел слегка странноватым в пару сотен строк, начинал казаться непроходимой стеной колючек на тысяче строк. &quot;Несколько способов сделать одно и то же&quot; придавало выразительность при малых масштабах, но значительно усложняло поддержку единого стиля в большом проекте.&lt;&#x2F;p&gt;
&lt;p&gt;Вместе эти проблемы значительно усложняли чтение и понимание кода на Perl уже через несколько дней после его написания. Оказалось, что я трачу больше времени на борьбу с артефактами языка, чем на решение проблем, непосредственно связянных с приложением. Но самое плохое было в том, что получившийся код выглядел уродливым, а это имеет значение! Уродливые программы — как уродливые подвесные мосты. Кажется, что они более склонны к тому, чтобы рухнуть, чем симпатичные, потому что люди (особенно инженеры) считают красоту тесно связанной с нашей способностью понимать и оперировать чем-то сложным. Язык, который усложняет написание красивого кода, усложняет написание хорошего кода.&lt;&#x2F;p&gt;
&lt;p&gt;В середине 1997 года я начал поиски более элегантного скриптового языка.&lt;&#x2F;p&gt;
&lt;p&gt;Разумеется, я и не думал о возвращении к C. Давно прошли те времена, когда имела значение возможность самостоятельно управлять памятью, если не считать те немногие узкоспециализированные области, такие как разработка ядра, научные вычисления и трехмерная графика, где абсолютно необходимо получить максимальную скорость и полный контроль над использованием памяти, потому что необходимо выжать максимум из аппаратного обеспечения.&lt;&#x2F;p&gt;
&lt;p&gt;Для большинства ситуаций глупо было бы смиряться с утомительной отладкой при переполнении буфера, проблемах с псевдонимами указателей, утечках памяти malloc&#x2F;free и другими подобными неприятностями, учитывая возможности современных машин. Лучше отдать несколько циклов и несколько килобайт памяти в распоряжение менеджера памяти скриптового языка и сэкономить намного более ценное человеческое время. Действительно, преимущества такой стратегии и послужили причиной огромного распространения Perl с середины девяностых.&lt;&#x2F;p&gt;
&lt;p&gt;Я баловался с Tcl, но только лишь для того, чтобы обнаружить, что он масштабируется еще хуже, чем Perl. Будучи старым LISP&#x27;ером, я также рассматривал современные диалекты LISP и Scheme, но, как это обычно было с LISP, большая часть умного дизайна становилась почти бесполезной из-за скудной или вообще отсутствующей документации, неполного доступа к возможностям POSIX&#x2F;UNIX, и маленького и при этом очень разрозненного сообщества разработчиков. Популярность Perl не была случайностью: большинство его конкурентов либо были еще менее пригодны для больших проектов, либо не были настолько полезными, насколько их должен был сделать теоретически превосходный дизайн.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Quod Libet rocks!</title>
        <published>2006-01-06T10:50:00+00:00</published>
        <updated>2006-01-06T10:50:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/quodlibet-rocks/"/>
        <id>https://adf.xyz/ru/blog/quodlibet-rocks/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/quodlibet-rocks/">&lt;p&gt;Снова убеждаюсь, что &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060211043725&#x2F;http:&#x2F;&#x2F;sacredchao.net&#x2F;quodlibet&quot;&gt;Quod Libet&lt;&#x2F;a&gt; - самый лучший плеер, который я видел! Он хорош сам по себе, но плагины делают его просто убийственной медиа-машиной. Вот несколько плагинов, которые оказались весьма полезными для меня:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060211043725&#x2F;http:&#x2F;&#x2F;sacredchao.net&#x2F;quodlibet&#x2F;wiki&#x2F;Plugins&#x2F;PortableCopy&quot;&gt;PortableCopy&lt;&#x2F;a&gt; Буквально перед новым годом я приобрел себе &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060211043725&#x2F;http:&#x2F;&#x2F;mp3.samsung.ru&#x2F;products&#x2F;flash&#x2F;yp-f1z&#x2F;&quot;&gt;MP3-плеер&lt;&#x2F;a&gt;. Это устройство имеет только один недостаток -  в упор не видит файлы, которые я копирую в него под Linux (не видит даже те файлы, в названиях которых только латинские символы, о русских можно вообще не говорить). Плагин PortableCopy позволяет копировать выбранные песни на переносное устройство, при этом конвертируя имена файлов а-ля Windows, так что мой плеер их прекрасно понимает. Я благодарен автору плагина за то, что он избавил меня от необходимости писать аналогичную утилиту самому.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060211043725&#x2F;http:&#x2F;&#x2F;sacredchao.net&#x2F;quodlibet&#x2F;browser&#x2F;trunk&#x2F;plugins&#x2F;albumart.py?rev=HEAD&quot;&gt;Album art&lt;&#x2F;a&gt; Когда-то я задался целью раздобыть обложки альбомов для всей музыки, которая есть у меня в фонотеке. Потратил на это два дня, при этом обработал около десяти процентов всего объема. После этого мой энтузиазм пошел на убыль и я бросил это занятие. Расширение Album art помогло мне довести начатое дело до конца. Оно позволяет скачивать обложку альбома для выбранной песни, обращаясь при этом к базе Amazon.com. Отличная вещь для тех, кто хочет, чтобы его музыкальная коллекция не только хорошо звучала, но и, так сказать, хорошо выглядела.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060211043725&#x2F;http:&#x2F;&#x2F;sacredchao.net&#x2F;quodlibet&#x2F;wiki&#x2F;Plugins&#x2F;GajimStatus&quot;&gt;GajimStatus&lt;&#x2F;a&gt; Расширение, написанное sir_sigurd. Если вы используете Gajim, то эта вещь для вас. Позволяет отображать в статусном сообщении название композиции, которая проигрывается в данный момент.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
        
    </entry>
    <entry xml:lang="ru">
        <title>Очередной переезд блога</title>
        <published>2006-01-02T12:23:00+00:00</published>
        <updated>2006-01-02T12:23:00+00:00</updated>
        
        <author>
          <name>
            
              ADF
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://adf.xyz/ru/blog/another-blog-removal/"/>
        <id>https://adf.xyz/ru/blog/another-blog-removal/</id>
        
        <content type="html" xml:base="https://adf.xyz/ru/blog/another-blog-removal/">&lt;p&gt;Прошу прощения, что давно не писал. Был занят подготовкой к Новому Году (поздравляю всех, кстати 🙂 ), а также созданием сайта &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060211043805&#x2F;http:&#x2F;&#x2F;grove.org.ru&#x2F;&quot;&gt;grove.org.ru&lt;&#x2F;a&gt;. Собственно на этот сайт мой блог и переехал. Теперь он находится по адресу &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060211043805&#x2F;http:&#x2F;&#x2F;grove.org.ru&#x2F;people&#x2F;cornelius&#x2F;blog&quot;&gt;http:&#x2F;&#x2F;grove.org.ru&#x2F;people&#x2F;cornelius&#x2F;blog&lt;&#x2F;a&gt;. Адрес фида остался прежним: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20060211043805&#x2F;http:&#x2F;&#x2F;feeds.feedburner.com&#x2F;cornelius&quot;&gt;http:&#x2F;&#x2F;feeds.feedburner.com&#x2F;cornelius&lt;&#x2F;a&gt; (God Save Feedburner!).&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
