<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ars Longa, Vita Brevis &#187; Linux</title>
	<atom:link href="http://blog.sjinks.pro/tag/linux/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.sjinks.pro</link>
	<description>Quod scripsi, scripsi</description>
	<lastBuildDate>Mon, 06 Feb 2012 17:56:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Исправление проблемы обхода хранителя экрана в X11</title>
		<link>http://blog.sjinks.pro/security/960-fix-bypass-screensaver-locker/</link>
		<comments>http://blog.sjinks.pro/security/960-fix-bypass-screensaver-locker/#comments</comments>
		<pubDate>Thu, 19 Jan 2012 12:18:51 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Безопасность]]></category>
		<category><![CDATA[безопасность]]></category>
		<category><![CDATA[уязвимость]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=960</guid>
		<description><![CDATA[Программистов всё больше, а профессионалов всё меньше В X.Org Server 1.11 обнаружена уязвимость, позволяющая через манипуляции с клавиатурой обойти режим блокировки экрана и получить доступ к заблокированному рабочему окружению пользователя. Подробности либо по ссылке выше, либо на OpenNet. Исправление: в файле /usr/share/X11/xkb/compat/xfree86 закомментировать следующие строки: interpret XF86_Ungrab { action = Private(type=0x86, data=&#34;Ungrab&#34;); }; interpret XF86_ClearGrab [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/960-fix-bypass-screensaver-locker/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Программистов всё больше, а профессионалов всё меньше</em></h2>
<p>В X.Org Server 1.11 <a href="http://gu1.aeroxteam.fr/2012/01/19/bypass-screensaver-locker-program-xorg-111-and-up/">обнаружена уязвимость</a>, позволяющая через манипуляции с клавиатурой обойти режим блокировки экрана и получить доступ к заблокированному рабочему окружению пользователя.</p>
<p>Подробности либо по ссылке выше, либо на <a href="http://www.opennet.ru/opennews/art.shtml?num=32844">OpenNet</a>.<span id="more-960"></span></p>
<p>Исправление: в файле <code>/usr/share/X11/xkb/compat/xfree86</code> закомментировать следующие строки:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p9602">
        <div class="code text" id="p960code2">
&nbsp; &nbsp; interpret XF86_Ungrab {<br />
&nbsp; &nbsp; &nbsp; &nbsp; action = Private(type=0x86, data=&quot;Ungrab&quot;);<br />
&nbsp; &nbsp; };<br />
&nbsp; &nbsp; interpret XF86_ClearGrab {<br />
&nbsp; &nbsp; &nbsp; &nbsp; action = Private(type=0x86, data=&quot;ClsGrb&quot;);<br />
&nbsp; &nbsp; };
        </div>
    </div>
</div>

<p>После чего перезапустить X Server.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/960-fix-bypass-screensaver-locker/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/security/960-fix-bypass-screensaver-locker/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Linux, консоль и деванагари</title>
		<link>http://blog.sjinks.pro/uncategorized/941-linux-console-devanagari/</link>
		<comments>http://blog.sjinks.pro/uncategorized/941-linux-console-devanagari/#comments</comments>
		<pubDate>Mon, 05 Sep 2011 15:51:08 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Всё подряд]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Unicode]]></category>
		<category><![CDATA[ошибка]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=941</guid>
		<description><![CDATA[В то время, когда наши корабли бороздят просторы Вселенной… Недавно отлаживал небольшой скрипт, транслитерирующий текст, записанный в системе IAST или ITRANS, на деванагари. Так как на домашней машине стоит Linux, то логично, что скрипт отлаживался в Linux — в терминале. И тут меня ожидал огромный сюрприз… В качестве теста брался отрывок из Брихадараньяка-упанишады, выглядящий следующим образом (в [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/uncategorized/941-linux-console-devanagari/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>В то время, когда наши корабли бороздят просторы Вселенной…</em></h2>
<p>Недавно отлаживал небольшой скрипт, транслитерирующий текст, записанный в системе <abbr title="International Alphabet of Sanskrit Transliteration">IAST</abbr> или ITRANS, на деванагари. Так как на домашней машине стоит <a href="http://blog.sjinks.pro/tag/linux/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Linux">Linux</a>, то логично, что скрипт отлаживался в <a href="http://blog.sjinks.pro/tag/linux/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Linux">Linux</a> — в терминале.</p>
<p>И тут меня ожидал огромный сюрприз…<span id="more-941"></span></p>
<p>В качестве теста брался отрывок из <a href="http://ru.wikipedia.org/wiki/%D0%91%D1%80%D0%B8%D1%85%D0%B0%D0%B4%D0%B0%D1%80%D0%B0%D0%BD%D1%8C%D1%8F%D0%BA%D0%B0-%D1%83%D0%BF%D0%B0%D0%BD%D0%B8%D1%88%D0%B0%D0%B4%D0%B0">Брихадараньяка-упанишады</a>, выглядящий следующим образом (в IAST):</p>
<pre style="font-size: 15px">
pūrṇamadaḥ pūrṇamidam pūrṇāt pūrṇamudacyate
pūrṇasya pūrṇamādāya pūrṇamevāvaśiṣyate
</pre>
<p>По-русски это примерно так:</p>
<blockquote>
    То — бесконечность, и это — бесконечность. Бесконечность исходит из бесконечности,<br />
    Обретая бесконечность бесконечного, она остается лишь бесконечностью.<br />
</blockquote>
<p>На деванагари результат должен выглядеть так:</p>
<pre style="font-size: 15px">
पूर्णमदः पूर्णमिदम् पूर्णात् पूर्णमुदच्यते
पूर्णस्य पूर्णमादाय पूर्णमेवावशिष्यते
</pre>
<p>Как оказалось, если взять результат, сохранить в файл, а потом вывести на экран (например, командой <code>cat</code>), то получится полный бред:</p>
<pre style="font-size: 15px">
परणमदः परणमिदम परणात परणमदचयत
परणसय परणमादाय परणमवावशिषयत
</pre>
<p>В IAST это будет</p>
<pre style="font-size: 15px">
paraṇamadaḥ paraṇamidama paraṇāta paraṇamadacayata
paraṇasaya paraṇamādāya paraṇamavāvaśiṣayata
</pre>
<p>Что в корне отличается от того, что было в оригинале.</p>
<p>Тут нужно сделать парочку лирических отступлений: </p>
<ol>
<li>В деванагари есть такая особенность, что символы согласных звуков «по умолчанию» содержат гласный <code>a</code>. То есть <code>क</code> — это <code>ka</code>, а не <code>k</code>. Отсутствие этого <code>a</code> обозначается специальным подстрочным символом (символ <dfn>вирама</dfn> или <dfn>халант</dfn>). Например, комбинация, соответствующая звуку <code>k</code> будет записываться как <code>क्</code>.</li>
<li>Вторая особенность — гласные звуки имеют два варианта написания: гласный после гласной (или сам по себе) и после согласной записываются по-разному (во втором случае обычно используются диакритические знаки). Например, u — ku: उ — कु. </li>
</ol>
<p>Возвращаясь к примеру: если сравнить первое слово того, что должно быть и того, что получилось:</p>
<pre style="font-size: 15px">
पूर्णमदः — पू र् ण म दः — pū r ṇa ma daḥ
परणमदः — प र ण म दः — pa ra ṇa ma daḥ
</pre>
<p>Можно заметить одну особенность: терминал «обрезает» надстрочные и подстрочные символы (причём обрезает наглухо — при копировании копируется не исходный вариант, а обрезанный). Например, в पू подстрочный символ обозначает гласный ū (лирическое отступление №2), если подстрочный символ «обрезать», то останется просто प, который в соответствии с лирическим отступлением №1 будет pa.</p>
<pre style="font-size: 15px">
क	ka	=&gt;	क	ka
का	kā	=&gt;	का	kā
कि	ki	=&gt;	कि	ki
की	kī	=&gt;	की	kī
कु	ku	=&gt;	क	ka
कू	kū	=&gt;	क	ka
कृ	kṛ	=&gt;	क	ka
कॄ	kṝ	=&gt;	क	ka
कॢ	kḷ	=&gt;	क	ka
कॣ	kḹ	=&gt;	क	ka
के	ke	=&gt;	क	ka
कै	kai	=&gt;	क	ka
को	ko	=&gt;	को	ko
कौ	kau	=&gt;	कौ	kau
कँ	kam̐	=&gt;	क	ka
कं	kaṁ	=&gt;	क	ka
कः	kaḥ	=&gt;	कः	kaḥ
क्	k	=&gt;	क	ka
</pre>
<p>Видим, что в терминале очень не везёт гласным u, ū, ṛ, ṝ, ḷ, ḹ, e и дифтонгу ai — они тихо превращаются в <code>a</code>. Вирама также погибает смертью храбрых, в результате чего к согласным добавляется звук <code>a</code>. Анусвара (ṃ) и чандрабинду (m̐) обрезаются.</p>
<p>Какой можно сделать вывод? Индийские тексты в терминале нечитаемы. Вообще. И это в век повсеместного <a href="http://blog.sjinks.pro/tag/unicode/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Unicode">Unicode</a> и UTF-8! Честно говоря, в Linux достаточно проблем с <a href="http://blog.sjinks.pro/tag/unicode/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Unicode">Unicode</a>: <a href="https://bugs.launchpad.net/ubuntu/+source/apport/+bug/349081">apport не воспринимает русские символы</a>, <a href="https://bugs.launchpad.net/command-not-found/+bug/841914">command-not-found вылетает с ошибкой на не английских символах</a>, <a href="https://bugs.launchpad.net/inkscape/+bug/421199">Inkscape некорректно отображает деванагари</a>, те же проблемы в <a href="https://bugs.launchpad.net/ubuntu/+source/libreoffice/+bug/806211">LibreOffice</a>… Грустно…</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/uncategorized/941-linux-console-devanagari/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/uncategorized/941-linux-console-devanagari/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Установка Skype на Ubuntu Oneiric Ocelot AMD64</title>
		<link>http://blog.sjinks.pro/linux/940-skype-ubuntu-oneiric-ocelot-amd64/</link>
		<comments>http://blog.sjinks.pro/linux/940-skype-ubuntu-oneiric-ocelot-amd64/#comments</comments>
		<pubDate>Fri, 26 Aug 2011 01:48:21 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[64 bit]]></category>
		<category><![CDATA[Oneiric Ocelot]]></category>
		<category><![CDATA[Skype]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=940</guid>
		<description><![CDATA[И так идут за годом год… Прошло два года… Единственное изменение — в текущей бете Oneiric Ocelot в репозитории partner Skype нет. Вообще. Skype из Natty Narwhal не прижился: проблема с зависимостями: ia32-libs зависит от lib32v4l-0, который зависит от libv4l-0 версии 0.8.3-2, при том, что в репозитории есть только 0.8.5-3ubuntu1. Понятно, что проблему с зависимостями в конце концов исправят, [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/linux/940-skype-ubuntu-oneiric-ocelot-amd64/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>И так идут за годом год…</em></h2>
<p><a href="http://blog.sjinks.pro/linux/614-bringing-skype-back-in-ubuntu-karmic-koala-64-bit/">Прошло два года</a>… Единственное изменение — в текущей бете <a href="http://blog.sjinks.pro/tag/oneiric-ocelot/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Oneiric Ocelot">Oneiric Ocelot</a> в репозитории partner <a href="http://blog.sjinks.pro/tag/skype/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Skype">Skype</a> нет. Вообще.</p>
<p>Skype из <a href="http://blog.sjinks.pro/tag/natty-narwhal/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Natty Narwhal">Natty Narwhal</a> не прижился: проблема с зависимостями: <code>ia32-libs</code> зависит от <code>lib32v4l-0</code>, который зависит от <code>libv4l-0</code> версии 0.8.3-2, при том, что в репозитории есть только 0.8.5-3<a href="http://blog.sjinks.pro/tag/ubuntu/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Ubuntu">ubuntu</a>1. Понятно, что проблему с зависимостями в конце концов исправят, но без Skype плохо.<span id="more-940"></span></p>
<p>Решение пока такое:</p>
<ol>
<li>Если <a href="https://lists.ubuntu.com/archives/ubuntu-devel-announce/2011-August/000886.html">поддержка multiarch</a> не включена, включить:
          
<div class="codebox">
    <div class="the_code" style="" id="p9408">
        <div class="code bash" id="p940code8">
<span class="kw3">echo</span> foreign-architecture i386 <span class="sy0">&gt;</span> <span class="sy0">/</span>etc<span class="sy0">/</span>dpkg<span class="sy0">/</span>dpkg.cfg.d<span class="sy0">/</span>multiarch<br />
<span class="kw2">apt-get</span> update
        </div>
    </div>
</div>

</li>
<li>Установить статическую сборку Skype (<a href="http://www.skype.com/intl/ru/get-skype/on-your-computer/linux/downloading.static">отсюда</a>) — .deb-пакет всё равно не установится из-за проблем с зависимостями.</li>
<li>Доставить недостающие 32-битные пакеты:
          
<div class="codebox">
    <div class="the_code" style="" id="p9409">
        <div class="code bash" id="p940code9">
<span class="kw2">apt-get</span> <span class="kw2">install</span> libxv1:i386 libxss1:i386
        </div>
    </div>
</div>

</li>
<li>Возможно потребуются дополнительные пакеты. Узнать просто: нужно запустить Skype из консоли. Если чего-то не хватает, система пожалуется:
<p><strong>skype: error while loading shared libraries: libXv.so.1: cannot open shared object file: No such file or directory</strong></p>
<p>Нужно найти, какому пакету принадлежит библиотека:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p94010">
        <div class="code bash" id="p940code10">
$ <span class="kw2">dpkg</span> <span class="re5">-S</span> libXv.so<br />
libxv1: <span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>x86_64-linux-gnu<span class="sy0">/</span>libXv.so.1.0.0
        </div>
    </div>
</div>

<p>И устаносить 32-битную версию этого пакета:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p94011">
        <div class="code bash" id="p940code11">
<span class="kw2">apt-get</span> <span class="kw2">install</span> libxv1:i386
        </div>
    </div>
</div>

</li>
</ol>
<p>После этого Skype должен заработать.</p>
<p><strong>UPDATE 2011-12-20:</strong> рекомендованный ныне способ:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p94012">
        <div class="code bash" id="p940code12">
<span class="kw3">echo</span> foreign-architecture i386 <span class="sy0">&gt;</span> <span class="sy0">/</span>etc<span class="sy0">/</span>dpkg<span class="sy0">/</span>dpkg.cfg.d<span class="sy0">/</span>multiarch<br />
<span class="kw2">aptitude</span> update<br />
<span class="kw2">aptitude</span> <span class="kw2">install</span> skype:i386 <span class="re5">--without-recommends</span>
        </div>
    </div>
</div>

<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/linux/940-skype-ubuntu-oneiric-ocelot-amd64/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/linux/940-skype-ubuntu-oneiric-ocelot-amd64/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>nspluginwrapper: no appropriate viewer found for /usr/lib/flashplugin-installer/libflashplayer.so</title>
		<link>http://blog.sjinks.pro/linux/939-nspluginwrapper-no-appropriate-viewer-found/</link>
		<comments>http://blog.sjinks.pro/linux/939-nspluginwrapper-no-appropriate-viewer-found/#comments</comments>
		<pubDate>Mon, 22 Aug 2011 23:34:06 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[64 bit]]></category>
		<category><![CDATA[Natty Narwhal]]></category>
		<category><![CDATA[Oneiric Ocelot]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[ошибка]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=939</guid>
		<description><![CDATA[Исправление ошибки установки Flash Player в Ubuntu 11.10/AMD64 При обновлении Ubuntu Natty Narwhal до текущей альфы Oneiric Ocelot на архитектуре AMD64 возникает неприятная ошибка при обновлении пакета flashplugin-installer (Flash Player): package flashplugin-installer 10.3.183.4ubuntu3 failed to install/upgrade: nspluginwrapper: no appropriate viewer found for /usr/lib/flashplugin-installer/libflashplayer.so Лечение довольно простое: Необходимо включить поддержку multiarch, если она еще не включена: [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/linux/939-nspluginwrapper-no-appropriate-viewer-found/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Исправление ошибки установки Flash Player в <a href="http://blog.sjinks.pro/tag/ubuntu/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Ubuntu">Ubuntu</a> 11.10/AMD64</em></h2>
<p>При обновлении Ubuntu <a href="http://blog.sjinks.pro/tag/natty-narwhal/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Natty Narwhal">Natty Narwhal</a> до текущей альфы <a href="http://blog.sjinks.pro/tag/oneiric-ocelot/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Oneiric Ocelot">Oneiric Ocelot</a> на архитектуре AMD64 возникает неприятная <a href="http://blog.sjinks.pro/tag/bug/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  ошибка">ошибка</a> при обновлении пакета flashplugin-installer (Flash Player):</p>
<p><strong><br />
package flashplugin-installer 10.3.183.4ubuntu3 failed to install/upgrade:<br />
nspluginwrapper: no appropriate viewer found for /usr/lib/flashplugin-installer/libflashplayer.so<br />
</strong><span id="more-939"></span></p>
<p>Лечение довольно простое:</p>
<ol>
<li>Необходимо <a href="https://lists.ubuntu.com/archives/ubuntu-devel-announce/2011-August/000886.html">включить поддержку multiarch</a>, если она еще не включена:
          
<div class="codebox">
    <div class="the_code" style="" id="p93915">
        <div class="code bash" id="p939code15">
<span class="kw3">echo</span> foreign-architecture i386 <span class="sy0">&gt;</span> <span class="sy0">/</span>etc<span class="sy0">/</span>dpkg<span class="sy0">/</span>dpkg.cfg.d<span class="sy0">/</span>multiarch<br />
<span class="kw2">apt-get</span> update
        </div>
    </div>
</div>

Это позволит устанавливать пакеты для архитектуры i386 на AMD64.
</li>
<li>Затем нужно установить пакеты <code>libnss3:i386</code> и <code>libcurl3:i386</code>:
          
<div class="codebox">
    <div class="the_code" style="" id="p93916">
        <div class="code bash" id="p939code16">
<span class="kw2">aptitude</span> <span class="kw2">install</span> libnss3:i386 libcurl3:i386
        </div>
    </div>
</div>

В зависимостях подтянутся пакеты <code>libnspr4:i386</code> и <code>libsqlite3-0:i386</code>.
</li>
</ol>
<p>После этого можно спокойно (пере)установить пакет <code>flashplugin-installer</code> — всё будет работать.</p>
<p>С отчётом об ошибке и комментариями пользователей можно ознакомиться <a href="https://bugs.launchpad.net/ubuntu/+source/flashplugin-nonfree/+bug/762968">здесь</a>.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/linux/939-nspluginwrapper-no-appropriate-viewer-found/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/linux/939-nspluginwrapper-no-appropriate-viewer-found/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php: symbol zlibVersion, version libmysqlclient_16 not defined in in file libmysqlclient.so.16 with link time reference</title>
		<link>http://blog.sjinks.pro/linux/918-zlibversion-version-libmysqlclient_16-not-defined-in-file-libmysqlclientso16/</link>
		<comments>http://blog.sjinks.pro/linux/918-zlibversion-version-libmysqlclient_16-not-defined-in-file-libmysqlclientso16/#comments</comments>
		<pubDate>Mon, 30 May 2011 16:13:54 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ошибка]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=918</guid>
		<description><![CDATA[Быстрое исправление &#039;relocation error&#039; Не везёт мне с PHP на CentOS… Ситуация: имеется сервер на CentOS с установленной CPanel. PHP в случайные моменты времени завершается с ошибкой вида php: relocation error: php: symbol zlibVersion, version libmysqlclient_16 not defined in in file libmysqlclient.so.16 with link time reference Вместо zlibVersion может быть другое имя, например crc32. Из-за [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/linux/918-zlibversion-version-libmysqlclient_16-not-defined-in-file-libmysqlclientso16/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Быстрое исправление &#039;relocation error&#039;</em></h2>
<p><a href="http://blog.sjinks.pro/administering/460-upgrading-php-in-centos-5/">Не везёт</a> мне с <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a> на <a href="http://blog.sjinks.pro/tag/centos/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  CentOS">CentOS</a>…</p>
<p>Ситуация: имеется сервер на CentOS с установленной CPanel. PHP в случайные моменты времени завершается с ошибкой вида</p>
<p><strong>php: relocation error: php: symbol zlibVersion, version libmysqlclient_16 not defined in in file libmysqlclient.so.16 with link time reference</strong></p>
<p>Вместо <code>zlibVersion</code> может быть другое имя, например <code>crc32</code>.</p>
<p>Из-за CPanel/WHM возможности ограничены опциями, предоставляемыми EasyApache — обновить MySQL/PHP штатными средствами (например, через <code>yum</code>) не представляется возможным из-за риска сломать CPanel.<span id="more-918"></span></p>
<p>Текст ошибки явно указывает на проблему с версией библиотеки, поэтому в первую очередь нужно выянить, где на сервере находится <code>libmysqlclient</code>. В моём случае это <code>/usr/lib64</code> и <code>/usr/lib64/mysql</code>.</p>
<p>Затем смотрим, какую из библиотек использует <code>php</code>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p91820">
        <div class="code bash" id="p918code20">
$ <span class="kw2">ldd</span> <span class="sy0">`</span><span class="kw2">which</span> php<span class="sy0">`</span> <span class="sy0">|</span> <span class="kw2">grep</span> libmysqlclient<br />
&nbsp; &nbsp; &nbsp; &nbsp; libmysqlclient.so.16 =<span class="sy0">&gt;</span> <span class="sy0">/</span>usr<span class="sy0">/</span>lib64<span class="sy0">/</span>mysql<span class="sy0">/</span>libmysqlclient.so.16 <span class="br0">&#40;</span>0x00000034c6000000<span class="br0">&#41;</span><br />
$ <span class="kw2">ls</span> <span class="re5">-la</span> <span class="sy0">`/</span>usr<span class="sy0">/</span>lib64<span class="sy0">/</span>mysql<span class="sy0">/</span>libmysqlclient.so.16<span class="sy0">`</span><br />
lrwxrwxrwx <span class="nu0">1</span> root root <span class="nu0">27</span> May <span class="nu0">29</span> 00:08 <span class="sy0">/</span>usr<span class="sy0">/</span>lib64<span class="sy0">/</span>mysql<span class="sy0">/</span>libmysqlclient.so.16 -<span class="sy0">&gt;</span> libmysqlclient.so.16.0.0<span class="sy0">*</span>
        </div>
    </div>
</div>

<p>Но <code>libmysqlclient.so.16.0.0</code> существует и в <code>/usr/lib64</code>, и в <code>/usr/lib64/mysql</code>, поэтому посмотрим, где нужный символ есть:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p91821">
        <div class="code bash" id="p918code21">
$ <span class="kw2">nm</span> <span class="sy0">/</span>usr<span class="sy0">/</span>lib64<span class="sy0">/</span>mysql<span class="sy0">/</span>mysql<span class="sy0">/</span>libmysqlclient.so.16.0.0 <span class="sy0">|</span> <span class="kw2">grep</span> zlibVersion<br />
<span class="kw2">nm</span>: libmysqlclient.so.16.0.0: no symbols<br />
$ <span class="kw2">nm</span> <span class="sy0">/</span>usr<span class="sy0">/</span>lib64<span class="sy0">/</span>mysql<span class="sy0">/</span>libmysqlclient.so.16.0.0 <span class="sy0">|</span> <span class="kw2">grep</span> zlibVersion<br />
00000034c60d64b0 T zlibVersion
        </div>
    </div>
</div>

<p>Меняем символьную ссылку на нужный файл:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p91822">
        <div class="code bash" id="p918code22">
<span class="kw2">rm</span> <span class="re5">-f</span> <span class="sy0">/</span>usr<span class="sy0">/</span>lib64<span class="sy0">/</span>mysql<span class="sy0">/</span>libmysqlclient.so.16<br />
<span class="kw3">cd</span> <span class="sy0">/</span>usr<span class="sy0">/</span>lib64<span class="sy0">/</span>mysql<br />
<span class="kw2">ln</span> <span class="re5">-s</span> ..<span class="sy0">/</span>libmysqlclient.so.16.0.0 libmysqlclient.so.16
        </div>
    </div>
</div>

<p>После чего <a href="http://blog.sjinks.pro/tag/bug/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  ошибка">ошибка</a> исчезает.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/linux/918-zlibversion-version-libmysqlclient_16-not-defined-in-file-libmysqlclientso16/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/linux/918-zlibversion-version-libmysqlclient_16-not-defined-in-file-libmysqlclientso16/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ACSII-сортировка при помощи sort в Linux</title>
		<link>http://blog.sjinks.pro/linux/917-acsii-sort-linux/</link>
		<comments>http://blog.sjinks.pro/linux/917-acsii-sort-linux/#comments</comments>
		<pubDate>Mon, 16 May 2011 22:49:04 +0000</pubDate>
		<dc:creator>Wandering Soul</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[сортировка]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=917</guid>
		<description><![CDATA[О пользе RTFM Всё не так очевидно, как кажется на первый взгляд. Допустим, что имеется файл с таким текстом: ~a ~z c f x a b Так как ASCII-код тильды больше, чем у любой латинской буквы, то ожидаемый результат сортировки будет таким: a b c f x ~a ~z Тем не менее, если натравить команду [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/linux/917-acsii-sort-linux/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>О пользе RTFM</em></h2>
<p>Всё не так очевидно, как кажется на первый взгляд.</p>
<p>Допустим, что имеется файл с таким текстом:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p91727">
        <div class="code text" id="p917code27">
~a<br />
~z<br />
c<br />
f<br />
x<br />
a<br />
b
        </div>
    </div>
</div>

<p>Так как ASCII-код тильды больше, чем у любой латинской буквы, то ожидаемый результат сортировки будет таким:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p91728">
        <div class="code text" id="p917code28">
a<br />
b<br />
c<br />
f<br />
x<br />
~a<br />
~z
        </div>
    </div>
</div>

<p>Тем не менее, если натравить команду <code>sort</code> на исходный набор данных, получим такой результат:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p91729">
        <div class="code text" id="p917code29">
a<br />
~a<br />
b<br />
c<br />
f<br />
x<br />
~z
        </div>
    </div>
</div>

<p><span id="more-917"></span></p>
<p>Для того, чтобы получить ожидаемый результат нужно внимательно прочитать подсказку программы:</p>
<blockquote><strong>*** WARNING ***</strong><br />
The locale specified by the environment affects sort order.<br />
Set LC_ALL=C to get the traditional sort order that uses<br />
native byte values.</blockquote>
<p>Таким образом, для получения ожидаемого результата <code>sort</code> нужно запускать так:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p91730">
        <div class="code bash" id="p917code30">
<span class="re2">LC_ALL</span>=C <span class="kw2">sort</span> file.txt
        </div>
    </div>
</div>

<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/linux/917-acsii-sort-linux/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/linux/917-acsii-sort-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenMP, параллельный режим и утечки памяти в GNU Standard C++ Library</title>
		<link>http://blog.sjinks.pro/c-cpp/913-openmp-parallel-mode-memory-leak-libstdc/</link>
		<comments>http://blog.sjinks.pro/c-cpp/913-openmp-parallel-mode-memory-leak-libstdc/#comments</comments>
		<pubDate>Sat, 14 May 2011 04:23:09 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[OpenMP]]></category>
		<category><![CDATA[valgrind]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=913</guid>
		<description><![CDATA[Скрестив ужа и ежа, Мичурин получил колючую проволоку Стандартнуя библиотека GNU языка C++ поддерживает так называемый параллельный режим, который предоставляет экспериментальную поддержку параллельных алгоритмов из &#60;algorithm&#62; и &#60;numeric&#62;. Для включения данного режима исходный код нужно компилировать с опеределённым макросом _GLIBCXX_PARALLEL, либо явно подключать заголовочные файлы из &#60;parallel/&#62; и использовать пространство имён __gnu_parallel. В параллельном режиме [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/c-cpp/913-openmp-parallel-mode-memory-leak-libstdc/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Скрестив ужа и ежа, Мичурин получил колючую проволоку</em></h2>
<p>Стандартнуя библиотека GNU языка C++ поддерживает так называемый <dfn><a href="http://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html">параллельный режим</a></dfn>, который предоставляет экспериментальную поддержку параллельных алгоритмов из <code>&lt;algorithm&gt;</code> и <code>&lt;numeric&gt;</code>. Для включения данного режима исходный код нужно компилировать с опеределённым макросом <code>_GLIBCXX_PARALLEL</code>, либо явно подключать заголовочные файлы из <code>&lt;parallel/&gt;</code> и использовать пространство имён <code>__gnu_parallel</code>.</p>
<p>В параллельном режиме для реализации параллелизма используется <a href="http://blog.sjinks.pro/tag/openmp/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  OpenMP">OpenMP</a>.</p>
<p>Как оказалось, при использовании в своей программе OpenMP и параллельного режима <code>libstdc++</code> можно столкнуться с очень неприятными и недокументированными особенностями реализации и получить незабываемое «удовольствие» при отладке.<span id="more-913"></span></p>
<p>Есть очень простая тестовая программа, использующая OpenMP:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p91340">
        <div class="code cpp" id="p913code40">
<span class="co2">#include &lt;algorithm&gt;</span><br />
<span class="co2">#include &lt;vector&gt;</span><br />
<span class="co2">#include &lt;string&gt;</span><br />
<span class="co2">#include &lt;cstdlib&gt;</span><br />
<span class="co2">#include &lt;sstream&gt;</span><br />
<br />
<span class="kw4">typedef</span> std<span class="sy4">::</span><span class="me2">vector</span><span class="sy1">&lt;</span>std<span class="sy4">::</span><span class="me2">string</span><span class="sy1">&gt;</span> vector_t<span class="sy4">;</span><br />
<br />
<span class="kw2">template</span><span class="sy1">&lt;</span><span class="kw2">typename</span> T<span class="sy1">&gt;</span><br />
std<span class="sy4">::</span><span class="me2">string</span> toString<span class="br0">&#40;</span><span class="kw4">const</span> T<span class="sy3">&amp;</span> x<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">stringstream</span> converter<span class="sy4">;</span><br />
&nbsp; &nbsp; converter <span class="sy1">&lt;&lt;</span> x<span class="sy4">;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> converter.<span class="me1">str</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw2">template</span><span class="sy1">&lt;</span><span class="kw2">typename</span> T<span class="sy1">&gt;</span><br />
T gen<span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> std<span class="sy4">::</span><span class="kw3">rand</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw2">template</span><span class="sy1">&lt;&gt;</span><br />
std<span class="sy4">::</span><span class="me2">string</span> gen<span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> toString<span class="br0">&#40;</span>std<span class="sy4">::</span><span class="kw3">rand</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy4">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw4">int</span> main<span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">char</span><span class="sy2">**</span> argv<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; vector_t v1<span class="br0">&#40;</span>65536<span class="br0">&#41;</span><span class="sy4">;</span><br />
&nbsp; &nbsp; vector_t v2<span class="br0">&#40;</span>65536<span class="br0">&#41;</span><span class="sy4">;</span><br />
<br />
&nbsp; &nbsp; <span class="co2">#pragma omp parallel shared(v1, v2)</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">#pragma omp single nowait</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">#pragma omp task shared(v1)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">generate</span><span class="br0">&#40;</span>v1.<span class="me1">begin</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, v1.<span class="me1">end</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, gen<span class="sy1">&lt;</span>vector_t<span class="sy4">::</span><span class="me2">value_type</span><span class="sy1">&gt;</span><span class="br0">&#41;</span><span class="sy4">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; std<span class="sy4">::</span><span class="me2">generate</span><span class="br0">&#40;</span>v2.<span class="me1">begin</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, v2.<span class="me1">end</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, gen<span class="sy1">&lt;</span>vector_t<span class="sy4">::</span><span class="me2">value_type</span><span class="sy1">&gt;</span><span class="br0">&#41;</span><span class="sy4">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy4">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Программа использует два потока для заполнения двух векторов случайными строками. При использовании параллельного режима теоретически может использоваться более двух потоков — <code>libstdc++</code> имеет параллельную версию алгоритма <code>std::generate</code>.</p>
<p>Сборка программы выполняется так:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p91341">
        <div class="code bash" id="p913code41">
<span class="kw2">g++</span> <span class="re5">-fopenmp</span> <span class="re5">-O1</span> <span class="re5">-g3</span> test.cpp <span class="re5">-o</span> test1<br />
<span class="kw2">g++</span> <span class="re5">-fopenmp</span> <span class="re5">-O1</span> <span class="re5">-g3</span> -D_GLIBCXX_PARALLEL test.cpp <span class="re5">-o</span> test2
        </div>
    </div>
</div>

<p><code>test1</code> не использует параллельный режим, <code>test2</code> использует.</p>
<p>Самое интересное начинается при запуске обеих программ под <a href="http://blog.sjinks.pro/tag/valgrind/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  valgrind">Valgrind</a> — с целью нахождения утечек памяти.<br />
Запуск осуществляется так:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p91342">
        <div class="code bash" id="p913code42">
<span class="kw2">valgrind</span> <span class="re5">--num-callers</span>=20 <span class="re5">--leak-check</span>=<span class="kw2">yes</span> <span class="re5">--leak-resolution</span>=high <span class="re5">--show-reachable</span>=<span class="kw2">yes</span> .<span class="sy0">/</span>test1<br />
<span class="kw2">valgrind</span> <span class="re5">--num-callers</span>=20 <span class="re5">--leak-check</span>=<span class="kw2">yes</span> <span class="re5">--leak-resolution</span>=high <span class="re5">--show-reachable</span>=<span class="kw2">yes</span> .<span class="sy0">/</span>test2
        </div>
    </div>
</div>

<p>Получились такие результаты:</p>
<p><strong>Без использования параллельного режима:</strong></p>
          
<div class="codebox">
    <div class="the_code" style="" id="p91343">
        <div class="code text" id="p913code43">
==10569== HEAP SUMMARY:<br />
==10569== &nbsp; &nbsp; in use at exit: 2,936 bytes in 6 blocks<br />
==10569== &nbsp; total heap usage: 262,152 allocs, 262,146 frees, 75,956,839 bytes allocated<br />
…<br />
==10569== LEAK SUMMARY:<br />
==10569== &nbsp; &nbsp;definitely lost: 0 bytes in 0 blocks<br />
==10569== &nbsp; &nbsp;indirectly lost: 0 bytes in 0 blocks<br />
==10569== &nbsp; &nbsp; &nbsp;possibly lost: 912 bytes in 3 blocks<br />
==10569== &nbsp; &nbsp;still reachable: 2,024 bytes in 3 blocks<br />
==10569== &nbsp; &nbsp; &nbsp; &nbsp; suppressed: 0 bytes in 0 blocks
        </div>
    </div>
</div>

<p>Явных утечек памяти нет; по поводу <code>still reachable</code> разработчики говорят, что <a href="http://www.mail-archive.com/gcc-bugs@gcc.gnu.org/msg224364.html">это не ошибка</a> (я с ними согласен).</p>
<p>Таким образом, при использовании OpenMP и стандартного режима libstdc++ всё выглядит довольно-таки хорошо.</p>
<p><strong>С использованием параллельного режима:</strong></p>
          
<div class="codebox">
    <div class="the_code" style="" id="p91344">
        <div class="code text" id="p913code44">
==10628== HEAP SUMMARY:<br />
==10628== &nbsp; &nbsp; in use at exit: 4,522,599 bytes in 131,078 blocks<br />
==10628== &nbsp; total heap usage: 262,402 allocs, 131,324 frees, 77,022,766 bytes allocated<br />
…<br />
==10628== LEAK SUMMARY:<br />
==10628== &nbsp; &nbsp;definitely lost: 4,519,595 bytes in 131,070 blocks<br />
==10628== &nbsp; &nbsp;indirectly lost: 0 bytes in 0 blocks<br />
==10628== &nbsp; &nbsp; &nbsp;possibly lost: 980 bytes in 5 blocks<br />
==10628== &nbsp; &nbsp;still reachable: 2,024 bytes in 3 blocks<br />
==10628== &nbsp; &nbsp; &nbsp; &nbsp; suppressed: 0 bytes in 0 blocks
        </div>
    </div>
</div>

<p>Сразу бросается в глаза: <strong>definitely lost: 4,519,595 bytes in 131,070 blocks</strong> — это те самые два вектора (2×65536) плюс еще чуть-чуть.</p>
<p>Трасса вызовов выглядит так:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p91345">
        <div class="code text" id="p913code45">
==10628== 34 bytes in 1 blocks are possibly lost in loss record 2 of 10<br />
==10628== &nbsp; &nbsp;at 0x4C28B42: operator new(unsigned long) (vg_replace_malloc.c:261)<br />
==10628== &nbsp; &nbsp;by 0x4ECBE6C: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator&lt;char&gt; const&amp;) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.14)<br />
==10628== &nbsp; &nbsp;by 0x402FBB: char* std::string::_S_construct&lt;char*&gt;(char*, char*, std::allocator&lt;char&gt; const&amp;, std::forward_iterator_tag) (basic_string.tcc:138)<br />
==10628== &nbsp; &nbsp;by 0x403002: std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;::basic_string&lt;char*&gt;(char*, char*, std::allocator&lt;char&gt; const&amp;) (basic_string.h:1649)<br />
==10628== &nbsp; &nbsp;by 0x403234: std::string toString&lt;int&gt;(int const&amp;) (sstream:127)<br />
==10628== &nbsp; &nbsp;by 0x401CBD: std::string gen&lt;std::string&gt;() (test.cpp:27)<br />
==10628== &nbsp; &nbsp;by 0x402373: _ZN14__gnu_parallel46__for_each_template_random_access_workstealingIN9__gnu_cxx17__normal_iteratorIPSsNSt9__cxx19986vectorISsSaISsEEEEEPFSsvENS_19__generate_selectorIS8_EENS_12_DummyReductEbEET0_T_SF_SE_RT1_T2_T3_RSJ_NSt15iterator_traitsISF_E15difference_typeE.omp_fn.4 (for_each_selectors.h:77)<br />
==10628== &nbsp; &nbsp;by 0x40D68B: std::string (*__gnu_parallel::__for_each_template_random_access_workstealing&lt;__gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt;, std::string (*)(), __gnu_parallel::__generate_selector&lt;__gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt; &gt;, __gnu_parallel::_DummyReduct, bool&gt;(__gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt;, __gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt;, std::string (*)(), __gnu_parallel::__generate_selector&lt;__gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt; &gt;&amp;, __gnu_parallel::_DummyReduct, bool, bool&amp;, std::iterator_traits&lt;__gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt; &gt;::difference_type))() (workstealing.h:297)<br />
==10628== &nbsp; &nbsp;by 0x40D77C: std::string (*__gnu_parallel::__for_each_template_random_access&lt;__gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt;, std::string (*)(), __gnu_parallel::__generate_selector&lt;__gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt; &gt;, __gnu_parallel::_DummyReduct, bool&gt;(__gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt;, __gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt;, std::string (*)(), __gnu_parallel::__generate_selector&lt;__gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt; &gt;&amp;, __gnu_parallel::_DummyReduct, bool, bool&amp;, std::iterator_traits&lt;__gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt; &gt;::difference_type, __gnu_parallel::_Parallelism))() (for_each.h:86)<br />
==10628== &nbsp; &nbsp;by 0x40D814: void std::__parallel::__generate_switch&lt;__gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt;, std::string (*)()&gt;(__gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt;, __gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt;, std::string (*)(), std::random_access_iterator_tag, __gnu_parallel::_Parallelism) (algo.h:1556)<br />
==10628== &nbsp; &nbsp;by 0x40258C: main.omp_fn.1 (algo.h:1584)<br />
==10628== &nbsp; &nbsp;by 0x53C1A12: ??? (in /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0)<br />
==10628== &nbsp; &nbsp;by 0x53C3748: ??? (in /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0)<br />
==10628== &nbsp; &nbsp;by 0x53C1FBD: ??? (in /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0)<br />
==10628== &nbsp; &nbsp;by 0x57E4D8B: start_thread (pthread_create.c:304)<br />
==10628== &nbsp; &nbsp;by 0x5AE204C: clone (clone.S:112)
        </div>
    </div>
</div>

          
<div class="codebox">
    <div class="the_code" style="" id="p91346">
        <div class="code text" id="p913code46">
==10628== 2,259,752 bytes in 65,534 blocks are definitely lost in loss record 9 of 10<br />
==10628== &nbsp; &nbsp;at 0x4C28B42: operator new(unsigned long) (vg_replace_malloc.c:261)<br />
==10628== &nbsp; &nbsp;by 0x4ECBE6C: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator&lt;char&gt; const&amp;) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.14)<br />
==10628== &nbsp; &nbsp;by 0x402FBB: char* std::string::_S_construct&lt;char*&gt;(char*, char*, std::allocator&lt;char&gt; const&amp;, std::forward_iterator_tag) (basic_string.tcc:138)<br />
==10628== &nbsp; &nbsp;by 0x403002: std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;::basic_string&lt;char*&gt;(char*, char*, std::allocator&lt;char&gt; const&amp;) (basic_string.h:1649)<br />
==10628== &nbsp; &nbsp;by 0x403234: std::string toString&lt;int&gt;(int const&amp;) (sstream:127)<br />
==10628== &nbsp; &nbsp;by 0x401CBD: std::string gen&lt;std::string&gt;() (test.cpp:27)<br />
==10628== &nbsp; &nbsp;by 0x402373: _ZN14__gnu_parallel46__for_each_template_random_access_workstealingIN9__gnu_cxx17__normal_iteratorIPSsNSt9__cxx19986vectorISsSaISsEEEEEPFSsvENS_19__generate_selectorIS8_EENS_12_DummyReductEbEET0_T_SF_SE_RT1_T2_T3_RSJ_NSt15iterator_traitsISF_E15difference_typeE.omp_fn.4 (for_each_selectors.h:77)<br />
==10628== &nbsp; &nbsp;by 0x40D68B: std::string (*__gnu_parallel::__for_each_template_random_access_workstealing&lt;__gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt;, std::string (*)(), __gnu_parallel::__generate_selector&lt;__gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt; &gt;, __gnu_parallel::_DummyReduct, bool&gt;(__gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt;, __gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt;, std::string (*)(), __gnu_parallel::__generate_selector&lt;__gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt; &gt;&amp;, __gnu_parallel::_DummyReduct, bool, bool&amp;, std::iterator_traits&lt;__gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt; &gt;::difference_type))() (workstealing.h:297)<br />
==10628== &nbsp; &nbsp;by 0x40D77C: std::string (*__gnu_parallel::__for_each_template_random_access&lt;__gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt;, std::string (*)(), __gnu_parallel::__generate_selector&lt;__gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt; &gt;, __gnu_parallel::_DummyReduct, bool&gt;(__gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt;, __gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt;, std::string (*)(), __gnu_parallel::__generate_selector&lt;__gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt; &gt;&amp;, __gnu_parallel::_DummyReduct, bool, bool&amp;, std::iterator_traits&lt;__gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt; &gt;::difference_type, __gnu_parallel::_Parallelism))() (for_each.h:86)<br />
==10628== &nbsp; &nbsp;by 0x40D814: void std::__parallel::__generate_switch&lt;__gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt;, std::string (*)()&gt;(__gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt;, __gnu_cxx::__normal_iterator&lt;std::string*, std::__cxx1998::vector&lt;std::string, std::allocator&lt;std::string&gt; &gt; &gt;, std::string (*)(), std::random_access_iterator_tag, __gnu_parallel::_Parallelism) (algo.h:1556)<br />
==10628== &nbsp; &nbsp;by 0x402566: main.omp_fn.0 (algo.h:1584)<br />
==10628== &nbsp; &nbsp;by 0x40297B: main (test.cpp:35)
        </div>
    </div>
</div>

<p>Ключ к пониманию даёт <code>workstealing.h</code> (адрес 0x40D68B в трассе). В коде есть такая строка:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p91347">
        <div class="code cpp" id="p913code47">
<ol class="cpp" style="font-family:monospace;" start="139"><li class="li1"><div class="de1"><span class="co2"># &nbsp; &nbsp; pragma omp parallel shared(__busy) num_threads(__num_threads)</span></div></li>
</ol>
        </div>
    </div>
</div>

<p>Что получается: грубо говоря, следующее:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p91348">
        <div class="code cpp" id="p913code48">
<span class="co2">#pragma omp parallel</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co2">#pragma omp single nowait</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">#pragma omp task</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// …</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">#pragma omp parallel num_threads(__num_threads)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// …</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Есть предположение, что виноват <code>num_threads</code> во вложенном <code>omp parallel</code> (по крайней мере, если убрать <code>num_threads</code>, то утечки исчезают — но последствия изменений я не проверял).</p>
<p>Вроде бы в <code>num_threads</code> криминала нет — вложенный блок <code>omp parallel</code> создаёт новую группу потоков (при условии, что вложенность разрешена — либо через <code>OMP_NESTED=TRUE</code>, либо через вызов <code>omp_set_nested(true)</code>), а не изменяет количество потоков в существующей группе, но где-то что-то не до конца продумано.</p>
<p>Мораль на сегодняшний день такова: при использовании OpenMP параллельный режим глобально лучше не включать; при необходимости использования параллельных алгоритмов использовать алгоритм из пространства имён <code>__gnu_parallel</code> (и ни в коем случае не делать этого внутри блоков OpenMP).</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/c-cpp/913-openmp-parallel-mode-memory-leak-libstdc/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/c-cpp/913-openmp-parallel-mode-memory-leak-libstdc/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Как правильно избавляться от fglrx</title>
		<link>http://blog.sjinks.pro/linux/907-how-to-remove-fglrx-properly/</link>
		<comments>http://blog.sjinks.pro/linux/907-how-to-remove-fglrx-properly/#comments</comments>
		<pubDate>Wed, 13 Apr 2011 14:06:53 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[ATI]]></category>
		<category><![CDATA[crash]]></category>
		<category><![CDATA[fglrx]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=907</guid>
		<description><![CDATA[В действительности всё не так, как на самом деле У драйвера fglrx есть одна неприятная особенность: его не так-то просто удалить. И дело даже не в том, что после удаления fglrx остаются лишние файлы — всё намного хуже: с не полностью удалённым fglrx проявляются неожиданные ошибки в открытых драйверах ati/radeon. Симптомы не полностью удалённого fglrx включают: система [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/linux/907-how-to-remove-fglrx-properly/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>В действительности всё не так, как на самом деле</em></h2>
<p>У драйвера <a href="http://blog.sjinks.pro/tag/fglrx/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  fglrx">fglrx</a> есть одна неприятная особенность: его не так-то просто удалить. И дело даже не в том, что после удаления <a href="http://blog.sjinks.pro/tag/fglrx/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  fglrx">fglrx</a> остаются лишние файлы — всё намного хуже: с не полностью удалённым <a href="http://blog.sjinks.pro/tag/fglrx/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  fglrx">fglrx</a> проявляются неожиданные ошибки в открытых драйверах <a href="http://blog.sjinks.pro/tag/ati/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  ATI">ati</a>/radeon.<span id="more-907"></span></p>
<p>Симптомы не полностью удалённого fglrx включают:</p>
<ul>
<li>система не загружается, в логах могут содержаться ошибки, упоминающие MTRR;</li>
<li>проблемы с производительностью, glxgears/glxinfo могут перестать работать;</li>
<li>неожиданные зависания, сбои, проблемы с отрисовкой изображений.</li>
</ul>
<p>В частности, трассировка (backtrace), получаемая при сбое приложения, может содержать «отсылки» к fglrx, <a href="https://bugs.launchpad.net/bugs/748812">например</a>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p90753">
        <div class="code text" id="p907code53">
Error: vlc crashed with SIGSEGV in XF86DRIQueryVersion()<br />
Stacktrace:<br />
&nbsp; &nbsp;XF86DRIQueryVersion () from /usr/lib/fglrx/libGL.so.1<br />
&nbsp; &nbsp;XF86DRIQueryExtension () from /usr/lib/fglrx/libGL.so.1<br />
&nbsp; &nbsp;?? () from /usr/lib/fglrx/libGL.so.1<br />
&nbsp; &nbsp;?? () from /usr/lib/fglrx/libGL.so.1<br />
&nbsp; &nbsp;glXQueryVersion () from /usr/lib/fglrx/libGL.so.1
        </div>
    </div>
</div>

<p><a href="https://bugs.launchpad.net/bugs/747729">Или</a></p>
          
<div class="codebox">
    <div class="the_code" style="" id="p90754">
        <div class="code text" id="p907code54">
[ 57324.822] 0: /usr/bin/X (xorg_backtrace+0x26) [0x4a24d6]<br />
[ 57324.822] 1: /usr/bin/X (0x400000+0x6219a) [0x46219a]<br />
[ 57324.822] 2: /lib/x86_64-linux-gnu/libpthread.so.0 (0x7fb5852f6000+0xfc60) [0x7fb585305c60]<br />
[ 57324.822] 3: /usr/lib/xorg/extra-modules/modules/glesx.so (0x7fb57e5d2000+0x613a2) [0x7fb57e6333a2]<br />
[ 57324.822] 4: /usr/lib/xorg/extra-modules/modules/glesx.so (0x7fb57e5d2000+0x5f633) [0x7fb57e631633]<br />
[ 57324.822] 5: /usr/lib/xorg/extra-modules/modules/glesx.so (esutAddSrcSurf+0x1a) [0x7fb57e63074a]<br />
[ 57324.822] 6: /usr/lib/xorg/extra-modules/modules/glesx.so (0x7fb57e5d2000+0x56fa0) [0x7fb57e628fa0]<br />
[ 57324.822] 7: /usr/lib/xorg/extra-modules/modules/drivers/fglrx_drv.so (0x7fb58183e000+0x4579b4) [0x7fb581c959b4]<br />
[ 57324.823] 8: /usr/lib/xorg/extra-modules/modules/drivers/fglrx_drv.so (0x7fb58183e000+0x45739a) [0x7fb581c9539a]<br />
[ 57324.823] 9: /usr/lib/xorg/extra-modules/modules/drivers/fglrx_drv.so (xdl_xs110_swlDriBlockHandler+0x74) [0x7fb581cabeb4]<br />
[ 57324.823] 10: /usr/bin/X (BlockHandler+0x8d) [0x43217d]<br />
[ 57324.823] 11: /usr/bin/X (WaitForSomething+0x11d) [0x45c6ed]<br />
[ 57324.824] 12: /usr/bin/X (0x400000+0x2dff2) [0x42dff2]<br />
[ 57324.824] 13: /usr/bin/X (0x400000+0x21a4e) [0x421a4e]<br />
[ 57324.824] 14: /lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main+0xff) [0x7fb58422eeff]<br />
[ 57324.824] 15: /usr/bin/X (0x400000+0x215f9) [0x4215f9]<br />
[ 57324.824] Segmentation fault at address 0x10<br />
[ 57324.824] <br />
Caught signal 11 (Segmentation fault). Server aborting
        </div>
    </div>
</div>

<p><strong>Полное удаление fglrx</strong> (все действия должны выполняться от имени пользователя <code>root</code>):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p90755">
        <div class="code bash" id="p907code55">
<span class="kw2">apt-get</span> remove <span class="re5">--purge</span> xorg-driver-fglrx fglrx\<span class="sy0">*</span><br />
<span class="kw2">apt-get</span> <span class="kw2">install</span> <span class="re5">--reinstall</span> libgl1-mesa-glx libgl1-mesa-dri fglrx-modaliases<br />
dpkg-reconfigure xserver-xorg<br />
<span class="kw2">apt-get</span> <span class="kw2">install</span> <span class="re5">--reinstall</span> xserver-xorg-core
        </div>
    </div>
</div>

<p>Последняя команда нужна, если требуется поддержка эффектов рабочего стола (KDE, Compiz). Дело в том, что даже после <strong>полного удаления</strong>(!) fglrx от него остаётся файл <code>libglx.so</code> (он предоставляется пакетами <code>fglrx</code> и <code>xserver-xorg-core</code>); для нормальной работы в системе должна быть установлена правильная версия <code>libglx.so</code>.</p>
<p><strong>Полное удаления fglrx и переустановка ati</strong> (все действия должны выполняться от имени пользователя <code>root</code>):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p90756">
        <div class="code bash" id="p907code56">
<span class="br0">&#91;</span> <span class="re5">-x</span> <span class="sy0">/</span>usr<span class="sy0">/</span>share<span class="sy0">/</span>ati<span class="sy0">/</span>fglrx-uninstall.sh <span class="br0">&#93;</span> <span class="sy0">&amp;&amp;</span> <span class="sy0">/</span>usr<span class="sy0">/</span>share<span class="sy0">/</span>ati<span class="sy0">/</span>fglrx-uninstall.sh<br />
<span class="kw2">apt-get</span> remove <span class="re5">--purge</span> fglrx\<span class="sy0">*</span> xserver-xorg-video-ati xserver-xorg-video-radeon<br />
<span class="kw2">apt-get</span> <span class="kw2">install</span> xserver-xorg-video-ati<br />
<span class="kw2">apt-get</span> <span class="kw2">install</span> <span class="re5">--reinstall</span> libgl1-mesa-glx libgl1-mesa-dri xserver-xorg-core<br />
dpkg-reconfigure xserver-xorg<br />
<span class="kw2">apt-get</span> <span class="kw2">install</span> fglrx-modaliases
        </div>
    </div>
</div>

<p>Рекомендуется к прочтению: <a href="https://wiki.ubuntu.com/X/Troubleshooting/FglrxInteferesWithRadeonDriver">Troubleshooting when -fglrx Interferes with -radeon Driver</a></p>
<p><small><em>Кто там что говорил про дружественность <a href="http://blog.sjinks.pro/tag/linux/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Linux">Linux</a> на десктопах?</em></small></p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/linux/907-how-to-remove-fglrx-properly/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/linux/907-how-to-remove-fglrx-properly/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Kopete и проблемы с ICQ</title>
		<link>http://blog.sjinks.pro/linux/852-kopete-icq-login-problem-wrong-password/</link>
		<comments>http://blog.sjinks.pro/linux/852-kopete-icq-login-problem-wrong-password/#comments</comments>
		<pubDate>Fri, 19 Nov 2010 09:15:42 +0000</pubDate>
		<dc:creator>Wandering Soul</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[ICQ]]></category>
		<category><![CDATA[Kopete]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=852</guid>
		<description><![CDATA[Невозможно подключиться к ICQ с указанной учётной записью: задан неверный пароль Недавно у Kopete начались проблемы с подключением к ICQ: Kopete жаловался на неверный пароль. При этом другие клиенты (старый добрый Jimm) успешно работали. Проблема оказалась очень простой: сменился логин-сервер: если раньше по умолчанию использовался login.oscar.aol.com, то теперь он не работает для ICQ. Решение простое: [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/linux/852-kopete-icq-login-problem-wrong-password/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Невозможно подключиться к <a href="http://blog.sjinks.pro/tag/icq/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  ICQ">ICQ</a> с указанной учётной записью: задан неверный пароль</em></h2>
<p>Недавно у <a href="http://blog.sjinks.pro/tag/kopete/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Kopete">Kopete</a> начались проблемы с подключением к ICQ: <a href="http://blog.sjinks.pro/tag/kopete/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Kopete">Kopete</a> жаловался на неверный пароль. При этом другие клиенты (старый добрый Jimm) успешно работали.<span id="more-852"></span></p>
<p>Проблема оказалась очень простой: сменился логин-сервер: если раньше по умолчанию использовался <code>login.oscar.aol.com</code>, то теперь он не работает для ICQ. Решение простое: нужно заменить стандартную информацию о сервере на <code>login.icq.com</code>:</p>
<p><a href="http://static.sjinks.info/wp-content/uploads/2010/11/icq-params.png"><img src="http://static.sjinks.info/wp-content/uploads/2010/11/icq-params-300x292.png" alt="Параметры учётной записи ICQ" title="Параметры учётной записи ICQ" width="300" height="292" class="alignnone size-medium wp-image-853" /></a></p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/linux/852-kopete-icq-login-problem-wrong-password/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/linux/852-kopete-icq-login-problem-wrong-password/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Генерация карты сайта в HTML из XML: часть 2</title>
		<link>http://blog.sjinks.pro/seo/849-html-stemap-generation-from-xml-part-2/</link>
		<comments>http://blog.sjinks.pro/seo/849-html-stemap-generation-from-xml-part-2/#comments</comments>
		<pubDate>Mon, 08 Nov 2010 12:04:38 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XSL]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=849</guid>
		<description><![CDATA[Как сделать не более N ссылок на файл Продолжение статьи «Генерация карты сайта в HTML из XML». В этой части мы рассмотрим, как сделать так, чтобы на одной генерируемой странице располагалось не более определённого количества ссылок. Нам понадобятся: XSL из статьи «Преобразование карты сайта в список адресов для siege»: &#60;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&#62; &#60;xsl:stylesheet version=&#34;1.0&#34; xmlns:xsl=&#34;http://www.w3.org/1999/XSL/Transform&#34; [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/849-html-stemap-generation-from-xml-part-2/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Как сделать не более N ссылок на файл</em></h2>
<p>Продолжение статьи <strong>«<a href="http://blog.sjinks.pro/seo/847-html-stemap-generation-from-xml/">Генерация карты сайта в HTML из XML</a>»</strong>.</p>
<p>В этой части мы рассмотрим, как сделать так, чтобы на одной генерируемой странице располагалось не более определённого количества ссылок.<span id="more-849"></span></p>
<p>Нам понадобятся:</p>
<ul>
<li><a href="http://blog.sjinks.pro/tag/xsl/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XSL">XSL</a> из статьи <strong>«<a href="http://blog.sjinks.pro/linux/722-transform-sitemap-to-siege-url-list/">Преобразование карты сайта в список адресов для siege</a>»</strong>:
          
<div class="codebox">
    <div class="the_code" style="" id="p84960">
        <div class="code xml" id="p849code60">
<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;utf-8&quot;</span><span class="re2">?&gt;</span></span><br />
<span class="sc3"><span class="re1">&lt;xsl:stylesheet</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">xmlns:xsl</span>=<span class="st0">&quot;http://www.w3.org/1999/XSL/Transform&quot;</span> <span class="re0">xmlns:x</span>=<span class="st0">&quot;http://www.sitemaps.org/schemas/sitemap/0.9&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:output</span> <span class="re0">method</span>=<span class="st0">&quot;text&quot;</span> <span class="re0">media-type</span>=<span class="st0">&quot;text-plain&quot;</span> <span class="re0">indent</span>=<span class="st0">&quot;no&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:strip-space</span> <span class="re0">elements</span>=<span class="st0">&quot;*&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:template</span> <span class="re0">match</span>=<span class="st0">&quot;/x:urlset/x:url&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:value-of</span> <span class="re0">select</span>=<span class="st0">&quot;x:loc&quot;</span> <span class="re0">disable-output-escaping</span>=<span class="st0">&quot;yes&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:text<span class="re2">&gt;</span></span></span><span class="sc1">&amp;#x000A;</span><span class="sc3"><span class="re1">&lt;/xsl:text<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/xsl:template<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;/xsl:stylesheet<span class="re2">&gt;</span></span></span>
        </div>
    </div>
</div>

</li>
<li>XSL из статьи <strong>«<a href="http://blog.sjinks.pro/seo/847-html-stemap-generation-from-xml/">Генерация карты сайта в HTML из XML</a>»</strong>:
          
<div class="codebox">
    <div class="the_code" style="" id="p84961">
        <div class="code xml" id="p849code61">
<span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;utf-8&quot;</span><span class="re2">?&gt;</span></span><br />
<span class="sc3"><span class="re1">&lt;xsl:stylesheet</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">xmlns:xsl</span>=<span class="st0">&quot;http://www.w3.org/1999/XSL/Transform&quot;</span> <span class="re0">xmlns:x</span>=<span class="st0">&quot;http://www.sitemaps.org/schemas/sitemap/0.9&quot;</span> <span class="re0">xmlns</span>=<span class="st0">&quot;http://www.w3.org/1999/xhtml&quot;</span> <span class="re0">exclude-result-prefixes</span>=<span class="st0">&quot;x&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:output</span> <span class="re0">method</span>=<span class="st0">&quot;xml&quot;</span> <span class="re0">indent</span>=<span class="st0">&quot;yes&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span> <span class="re0">doctype-public</span>=<span class="st0">&quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;</span> <span class="re0">doctype-system</span>=<span class="st0">&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:strip-space</span> <span class="re0">elements</span>=<span class="st0">&quot;*&quot;</span><span class="re2">/&gt;</span></span><br />
<br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:template</span> <span class="re0">match</span>=<span class="st0">&quot;/x:urlset&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;html<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;head<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;meta</span> <span class="re0">http-equiv</span>=<span class="st0">&quot;Content-Type&quot;</span> <span class="re0">content</span>=<span class="st0">&quot;text/html; charset=utf-8&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;title<span class="re2">&gt;</span></span></span>Site Map<span class="sc3"><span class="re1">&lt;/title<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/head<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;body<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;h1<span class="re2">&gt;</span></span><span class="re1">&lt;a</span> <span class="re0">href</span>=<span class="st0">&quot;http://blog.sjinks.pro/&quot;</span><span class="re2">&gt;</span></span>Карта сайта<span class="sc3"><span class="re1">&lt;/a<span class="re2">&gt;</span></span><span class="re1">&lt;/h1<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;ul<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:apply-templates</span> <span class="re0">select</span>=<span class="st0">&quot;x:url&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/ul<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/body<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/html<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/xsl:template<span class="re2">&gt;</span></span></span><br />
<br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;xsl:template</span> <span class="re0">match</span>=<span class="st0">&quot;/x:urlset/x:url&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;li<span class="re2">&gt;</span></span><span class="re1">&lt;strong<span class="re2">&gt;</span></span><span class="re1">&lt;a</span> <span class="re0">href</span>=<span class="st0">&quot;{x:loc}&quot;</span><span class="re2">&gt;</span><span class="re1">&lt;xsl:value-of</span> <span class="re0">select</span>=<span class="st0">&quot;x:loc&quot;</span> <span class="re0">disable-output-escaping</span>=<span class="st0">&quot;yes&quot;</span><span class="re2">/&gt;</span><span class="re1">&lt;/a<span class="re2">&gt;</span></span><span class="re1">&lt;/strong<span class="re2">&gt;</span></span><span class="re1">&lt;/li<span class="re2">&gt;</span></span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/xsl:template<span class="re2">&gt;</span></span></span><br />
<span class="sc3"><span class="re1">&lt;/xsl:stylesheet<span class="re2">&gt;</span></span></span>
        </div>
    </div>
</div>

</li>
<li>Немного фантазии <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
<p>Алгоритм работы простой:</p>
<ol>
<li>Преобразовываем исходную карту в текстовый список адресов (один URL на строку)</li>
<li><a href="http://linux.die.net/man/1/split">Разбиваем</a> файл на несколько частей с заданным количеством строк</li>
<li>Преобразовываем каждый из полученных файлов в <a href="http://blog.sjinks.pro/tag/xml/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XML">XML</a></li>
<li>Преобразовываем полученные XML-файлы в HTML</li>
</ol>
<p>Пункты 3 и 4 можно совместить: вместо генерации XML-файла можно сразу генерировать HTML. Но на всякий случай будем генерировать и XML, и HTML.</p>
<p>Получим такой скрипт:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p84962">
        <div class="code bash" id="p849code62">
<span class="co0">#! /bin/sh</span><br />
<br />
xsltproc <span class="re5">-o</span> urls.txt sitemap2txt.xsl sitemap.xml<br />
<span class="kw2">split</span> <span class="re5">-d</span> <span class="re5">-l</span> 100 urls.txt map<br />
<span class="kw1">for</span> i <span class="kw1">in</span> map<span class="sy0">*</span>; <span class="kw1">do</span><br />
&nbsp; &nbsp; <span class="kw2">awk</span> <span class="st_h">'<br />
&nbsp; &nbsp; BEGIN {<br />
&nbsp; &nbsp; &nbsp; &nbsp; print &quot;&lt;?xml version=\&quot;1.0\&quot;?&gt;\<br />
&lt;urlset\<br />
&nbsp; &nbsp; xmlns:xsi=\&quot;http://www.w3.org/2001/XMLSchema-instance\&quot;\<br />
&nbsp; &nbsp; xsi:schemaLocation=\&quot;http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd\&quot;\<br />
&nbsp; &nbsp; xmlns=\&quot;http://www.sitemaps.org/schemas/sitemap/0.9\&quot;&gt;&quot;<br />
&nbsp; &nbsp; }<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; print &quot;&lt;url&gt;&lt;loc&gt;&quot;$1&quot;&lt;/loc&gt;&lt;/url&gt;&quot;<br />
&nbsp; &nbsp; }<br />
&nbsp; &nbsp; END {<br />
&nbsp; &nbsp; &nbsp; &nbsp; print &quot;&lt;/urlset&gt;&quot;<br />
&nbsp; &nbsp; }<br />
&nbsp; &nbsp; '</span> <span class="re1">$i</span> <span class="sy0">&gt;</span> site<span class="re1">$i</span>.xml<br />
&nbsp; &nbsp; xsltproc <span class="re5">-o</span> site<span class="re1">$i</span>.html sitemap2html.xsl site<span class="re1">$i</span>.xml<br />
<span class="kw1">done</span>
        </div>
    </div>
</div>

<p>Всё просто!™</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/seo/849-html-stemap-generation-from-xml-part-2/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/seo/849-html-stemap-generation-from-xml-part-2/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

