<?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>Журнал системного программиста &#187; Туториалы</title>
	<atom:link href="http://sadko.xskernel.org/archives/category/howto/feed" rel="self" type="application/rss+xml" />
	<link>http://sadko.xskernel.org</link>
	<description>блог обо всём и ни о чём</description>
	<lastBuildDate>Wed, 14 Dec 2011 20:21:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>openSUSE 11.2 Migration tips #2</title>
		<link>http://sadko.xskernel.org/archives/1625</link>
		<comments>http://sadko.xskernel.org/archives/1625#comments</comments>
		<pubDate>Sat, 28 Nov 2009 18:42:00 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[Одминское]]></category>
		<category><![CDATA[Свободное ПО]]></category>
		<category><![CDATA[Туториалы]]></category>
		<category><![CDATA[opensuse linux]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/?p=1625</guid>
		<description><![CDATA[Tweet Вторая проблема, с которой пришлось столкнуться &#8212; это откровенно медленная работа Mozilla Firefox. Грузить страницу за 30 секунд при 9-мегабитном коннекте &#8212; позор. Поэтому, пошерстив немного инет, вышел на следующую страничку: Sooo slow Firefox on Suse 11.2 Оказывается, господа-разработчики Firefox немного перемудрили и врубили автоматическое использование DNS для IPv6. Поэтому лекарство следующее: 1. Пишем [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1625',
  title: 'openSUSE 11.2 Migration tips #2',
  description: 'Вторая проблема, с которой пришлось столкнуться - это откровенно медленная работа Mozilla Firefox. Грузить страницу за 30 секунд при 9-мегабитном коннекте - позор.\nПоэтому, пошерстив немного инет, выш...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1625"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="openSUSE 11.2 Migration tips #2" data-url="http://sadko.xskernel.org/archives/1625">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><p>Вторая проблема, с которой пришлось столкнуться &#8212; это откровенно медленная работа <b>Mozilla Firefox</b>. Грузить страницу за 30 секунд при 9-мегабитном коннекте &#8212; позор.<br />
Поэтому, пошерстив немного инет, вышел на следующую страничку:<br />
<a href="http://www.linuxquestions.org/questions/susenovell-60/sooo-slow-firefox-on-suse-11.2-769848/">Sooo slow Firefox on Suse 11.2</a><br />
Оказывается, господа-разработчики Firefox немного перемудрили и врубили автоматическое использование DNS для IPv6. Поэтому лекарство следующее:<br />
1. Пишем в адресной строке: <b>about:config</b><br />
2. Ищем параметр <b>network.dns.disableIPv6</b> и выставляем его в <b>false</b><br />
3. &#8230;<br />
4. PROFIT!</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1625/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>openSUSE 11.2 Migration tips #1</title>
		<link>http://sadko.xskernel.org/archives/1617</link>
		<comments>http://sadko.xskernel.org/archives/1617#comments</comments>
		<pubDate>Sat, 28 Nov 2009 12:57:04 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[Одминское]]></category>
		<category><![CDATA[Туториалы]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[opensuse]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/?p=1617</guid>
		<description><![CDATA[Tweet В связи с тем, что моя openSUSE 10.2 в последнее время стала себя плохо чувствовать, я решил-таки заняться постепенной миграцией на openSUSE 11.2. Я не буду расписывать пока впечатления о системе, так как ещё до конца её не настроил. Здесь же постараюсь выложить решение проблем, с которыми я столкнулся при миграции. Итак, первая проблема [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1617',
  title: 'openSUSE 11.2 Migration tips #1',
  description: 'В связи с тем, что моя openSUSE 10.2 в последнее время стала себя плохо чувствовать, я решил-таки заняться постепенной миграцией на openSUSE 11.2.\n\nЯ не буду расписывать пока впечатления о системе, так как...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1617"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="openSUSE 11.2 Migration tips #1" data-url="http://sadko.xskernel.org/archives/1617">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><p>В связи с тем, что моя openSUSE 10.2 в последнее время стала себя плохо чувствовать, я решил-таки заняться постепенной миграцией на openSUSE 11.2.</p>
<p>Я не буду расписывать пока впечатления о системе, так как ещё до конца её не настроил. Здесь же постараюсь выложить решение проблем, с которыми я столкнулся при миграции.</p>
<p>Итак, первая проблема &#8212; это монтирование шифрованного раздела. При установке надо под любым предлогом отказаться от монтирования скрытого раздела, так как YaST Manager согласится с этим только при условии его полного форматирования.<br />
После установки монтируем старый корневой раздел (я ставил новую систему в другой, заведомо подготовленный раздел) и смотрим содержимое файла /etc/cryptotab:</p>

<div class="wp_codebox"><table><tr id="p16177"><td class="code" id="p1617code7"><pre class="text" style="font-family:monospace;">/dev/loop0  /dev/hda6 /home ext3 twofish256 acl,user_xattr</pre></td></tr></table></div>

<p>И, соответственно, переписываем это в /etc/fstab:</p>

<div class="wp_codebox"><table><tr id="p16178"><td class="code" id="p1617code8"><pre class="text" style="font-family:monospace;">/dev/sda6 /home ext3 acl,user_xattr,loop,encryption=twofish256 1 1</pre></td></tr></table></div>

<p>Отметим, что в <b>/etc/cryptotab</b> используется устройство <b>/dev/hda6</b>, а в <b>/etc/fstab</b> новой системы &#8212; <b>/dev/sda6</b>, так как в новых версиях ядра Linux используется немного другая система именования устройств.</p>
<p>После чего подгружаем необходимые модули:</p>

<div class="wp_codebox"><table><tr id="p16179"><td class="code" id="p1617code9"><pre class="bash" style="font-family:monospace;">modprobe cryptoloop
modprobe twofish
<span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sda6</pre></td></tr></table></div>

<p>Теперь раздел подмонтирован. Осталось закрепить результат, для этого идём в <b>/etc/sysconfig/kernel</b> и добавляем к параметру <b>MODULES_LOADED_ON_BOOT</b> значения:</p>

<div class="wp_codebox"><table><tr id="p161710"><td class="code" id="p1617code10"><pre class="text" style="font-family:monospace;">MODULES_LOADED_ON_BOOT=&quot;cryptoloop twofish&quot;</pre></td></tr></table></div>

<p><b>UPD</b>: Конечно, это не решает проблему до конца: при автоматическом монтировании раздела при загрузке системы.<br />
Чтобы не было проблем, включаем сервис <b>boot.crypto</b>:</p>

<div class="wp_codebox"><table><tr id="p161711"><td class="code" id="p1617code11"><pre class="bash" style="font-family:monospace;">chkconfig boot.crypto on</pre></td></tr></table></div>

<p>После этого создаём файл <b>/etc/cryptotab</b> и прописываем туда:</p>

<div class="wp_codebox"><table><tr id="p161712"><td class="code" id="p1617code12"><pre class="text" style="font-family:monospace;">/dev/loop0 /dev/sda6 /home ext3 twofish256 acl,user_xattr</pre></td></tr></table></div>

<p>И убираем заранее созданную запись из <b>/etc/fstab</b>.</p>
<p>На этом решение первой проблемы заканчивается <img src='http://sadko.xskernel.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1617/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ещё один успешный возврат!</title>
		<link>http://sadko.xskernel.org/archives/1543</link>
		<comments>http://sadko.xskernel.org/archives/1543#comments</comments>
		<pubDate>Sun, 18 Oct 2009 11:56:00 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[Интернеты]]></category>
		<category><![CDATA[Свободное ПО]]></category>
		<category><![CDATA[Туториалы]]></category>
		<category><![CDATA[lenovo]]></category>
		<category><![CDATA[oem]]></category>
		<category><![CDATA[озпп]]></category>
		<category><![CDATA[фас]]></category>
		<category><![CDATA[цест]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/?p=1543</guid>
		<description><![CDATA[Tweet И кто говорил, что все бодания ЦеСТ, ФАС и ОЗПП бессмысленны? Вот уже виден результат: человек вернул ненужное ПО вендору. В данном случае это Lenovo. Оригинал записи ЖЖ-юзера joe_braker тут: Возврат Windows — это просто! Замечательно то, что возврат осуществлялся через магазин, без посещения сервисных центров, что есть большой плюс. Краткое howto по возврату [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1543',
  title: 'Ещё один успешный возврат!',
  description: 'И кто говорил, что все бодания ЦеСТ, ФАС и ОЗПП бессмысленны?\nВот уже виден результат: человек вернул ненужное ПО вендору. В данном случае это Lenovo.\nОригинал записи ЖЖ-юзера  тут:\nВозврат Windows — ...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1543"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="&ETH;&Ntilde;&Ntilde; &ETH;&frac34;&ETH;&acute;&ETH;&cedil;&ETH;&frac12; &Ntilde;&Ntilde;&ETH;&iquest;&ETH;&micro;&Ntilde;&ETH;&frac12;&Ntilde;&ETH;&sup1; &ETH;&sup2;&ETH;&frac34;&ETH;&middot;&ETH;&sup2;&Ntilde;&ETH;&deg;&Ntilde;!" data-url="http://sadko.xskernel.org/archives/1543">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><p>И кто говорил, что все бодания ЦеСТ, ФАС и ОЗПП бессмысленны?<br />
Вот уже виден результат: человек вернул ненужное ПО вендору. В данном случае это Lenovo.<br />
Оригинал записи ЖЖ-юзера <a href="http://users.livejournal.com/joe_braker/profile/"><img src="http://stat.livejournal.com/img/userinfo.gif" style="border: 0pt none ; vertical-align: bottom;" height="17" width="17"></a><a href="http://users.livejournal.com/joe_braker/"><b>joe_braker</b></a> тут:<br />
<a href="http://joe-braker.livejournal.com/9606.html">Возврат Windows — это просто!</a><br />
Замечательно то, что возврат осуществлялся через магазин, без посещения сервисных центров, что есть большой плюс.</p>
<p>Краткое howto по возврату системы у <b>Lenovo</b>:</p>
<blockquote><p>
1. Вы приходите в магазин, с распечатанными правилами Леново, фотоаппаратом (достаточно телефонного), и двумя экземплярами требования о возврате ОС.<br />
2. Покупаете ноутбук, отдаете один экземпляр требования фирме, другой забираете себе с распиской сотрудника магазина и печатью. Теперь у них есть 10 дней на ответ, но, если, магазин нормальный, (как в моем случае) они ответят гораздо быстрее.<br />
3. Леново потребует у вас фотографию лицензионной наклейки Windows, приклеенную на нижнюю крышку ноутбука, и фото наклейки с серийным номером компьютера (находится рядом на нижней крышке). Проследите, чтобы серийники читались! Вы можете для ускорения процесса, отдать их сразу, прямо в магазине.<br />
4. Оставляете свой адрес электронной почты, ждете подтверждения и приезжаете еще один раз за деньгами. При этом диск можете сразу отформатировать, поставить туда, что захотите и пользоваться ноутом в свое удовольствие. Когда приедете за деньгами, компьютер брать с собой необязательно. Хотя я взял на всякий случай.<br />
5. Отдаете магазину наклейку, диски с Windows, расписываетесь о том, что получили деньги и немедленно их получаете. При этом старый чек, который обязательно нужно взять с собой, вы меняете на новый, где сумма покупки уменьшена на стоимость ОС!
</p></blockquote>
<p>Мои поздравления автору!</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1543/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Основы работы с GnuPG #2</title>
		<link>http://sadko.xskernel.org/archives/1455</link>
		<comments>http://sadko.xskernel.org/archives/1455#comments</comments>
		<pubDate>Mon, 07 Sep 2009 09:34:42 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[Свободное ПО]]></category>
		<category><![CDATA[Туториалы]]></category>
		<category><![CDATA[cryptography]]></category>
		<category><![CDATA[gnupg]]></category>
		<category><![CDATA[rsa]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/?p=1455</guid>
		<description><![CDATA[Tweet LiveJournal ввиду своей ущербности не разрешает большие посты. Поэтому пришлось бить туториал на две части. Итак, продолжаем. Как можно экспортировать ключи? Для того, чтобы экспортировать открытые ключи для шифрования, можно воспользоватья командой: gpg --armor --export user_id Пример: sadko@sadovnikov:~/.ssh&#62; gpg --armor --export &#34;Vladimir Sadovnikov&#34; -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.4.5 &#40;GNU/Linux&#41; &#160; mQENBEiNyy4BCACoDXiTAMZXlf/geeR9cSmNZxbyxnOCGZvLdoWLcJ5akaK22s3/ [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1455',
  title: 'Основы работы с GnuPG #2',
  description: 'LiveJournal ввиду своей ущербности не разрешает большие посты. Поэтому пришлось бить туториал на две части. Итак, продолжаем.\n\n Как можно экспортировать ключи? \n\nДля того, чтобы экспортировать отк...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1455"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="&ETH;&Ntilde;&ETH;&frac12;&ETH;&frac34;&ETH;&sup2;&Ntilde; &Ntilde;&ETH;&deg;&ETH;&plusmn;&ETH;&frac34;&Ntilde;&Ntilde; &Ntilde; GnuPG #2" data-url="http://sadko.xskernel.org/archives/1455">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><p><a href="http://www.livejournal.com/">LiveJournal</a> ввиду своей ущербности не разрешает большие посты. Поэтому пришлось бить туториал на две части. Итак, продолжаем.<br />
<span id="more-1455"></span></p>
<h3> Как можно экспортировать ключи? </h3>
<p>Для того, чтобы экспортировать открытые ключи для шифрования, можно воспользоватья командой:</p>

<div class="wp_codebox"><table><tr id="p145532"><td class="code" id="p1455code32"><pre class="bash" style="font-family:monospace;">gpg <span style="color: #660033;">--armor</span> <span style="color: #660033;">--export</span> user_id</pre></td></tr></table></div>

<p>Пример:</p>

<div class="wp_codebox"><table><tr id="p145533"><td class="code" id="p1455code33"><pre class="bash" style="font-family:monospace;">sadko<span style="color: #000000; font-weight: bold;">@</span>sadovnikov:~<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">&gt;</span> gpg <span style="color: #660033;">--armor</span> <span style="color: #660033;">--export</span> <span style="color: #ff0000;">&quot;Vladimir Sadovnikov&quot;</span>
<span style="color: #660033;">-----BEGIN</span> PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.5 <span style="color: #7a0874; font-weight: bold;">&#40;</span>GNU<span style="color: #000000; font-weight: bold;">/</span>Linux<span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
mQENBEiNyy4BCACoDXiTAMZXlf<span style="color: #000000; font-weight: bold;">/</span>geeR9cSmNZxbyxnOCGZvLdoWLcJ5akaK22s3<span style="color: #000000; font-weight: bold;">/</span>
75lMgyDtSKQAZ20<span style="color: #000000; font-weight: bold;">/</span>fPGebdiI690ZTnYZOJaYaZXSALCDgcI5ncrjdWkpUR<span style="color: #000000; font-weight: bold;">/</span>ecTrn
Am3VZZv6qly9mfnx1ci06mNda8GzOVsIqXIipBGIKrPmoR6GLP9KqjNbb2AGl3XF
ISApk5yDGpMtFgwk9COlsmOFL+sEUcmavd05U25ggoMADieLGWehMifJzdPJwcJl
8jNqZeVnPfKnAR44VzNn21hJ+Qi66ufTQ3dCOLHjUhAwV4MgYN76lyRZRgg1tlLu
L3DcIyq3reiwqcC3QgznOaRNpxTSDQU9AEFpABEBAAG0O1ZsYWRpbWlyIFNhZG92
bmlrb3YgKFBFUkwgRGV2ZWxvcGVyKSA8c2Fkb3ZuaWtvdkBwcm90ZWkucnU+iQE2
BBMBAgAgBQJIjcsuAhsDBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQ3VxaNfP0
dD+zigf+JE1xSUMvKxczOZwxJQC8JeqpxWpdDptmOzZgtrinT4YLxSyuukA6jZRk
Pcs5LCcOlsOF+xaUteOAbtaYatedOaSfvgAhf5Hym165I+m9eBuGg85hVhIEWBXD
MdlEwEXhNEyWbL4lQ90rTvTy5UUOv0I6RvHIDjip7Zjf5K9EIn7+HXdeBvkR3ego
hq38j<span style="color: #000000; font-weight: bold;">/</span>8gXPyVY+FTjIp8v7iIJJ<span style="color: #000000; font-weight: bold;">/</span>vsTpeuYaOFvB+0JG7o9Kkpj1f3HzT8i46SKLj
yT9hMeMMMl6tJ+me+EFqXVXynAGtnIj0z7y8FgMTMFvPBzGNWSzmCwmiv7nxk+Xp
zgpWcP1F9d4DXIBHkglO8PpJtim6lLkBDQRIjcv9AQgA<span style="color: #000000; font-weight: bold;">/</span>RAMD8QDBIgVjOA<span style="color: #000000; font-weight: bold;">/</span>aiDm
JlcmSO<span style="color: #000000; font-weight: bold;">/</span>kQWkFFuUeTv12CBcuCdYOZyrF5ISfnRASysPPcONlj7jIV<span style="color: #000000; font-weight: bold;">/</span>zyqKNUMVTQ
Mkn+1fDa<span style="color: #000000; font-weight: bold;">/</span>KunS0Zti2oIGAq2UL1DiQPhgr+EXtrAaoWloEI74O3UIeFvKO+DyyS+
9aAsTjx3TUMkj3xDWLniWQSG5i3Ij5UM1z+IUHxHxmsKSZNo<span style="color: #000000; font-weight: bold;">/</span>jswFLqcyStWX1Mx
c5CaCJVjL<span style="color: #000000; font-weight: bold;">/</span>OxQ0TZhOY7tOYWpFkHCLP25SZOWElOKHOzJCIOrfv5Zip01kslVLNn
UV24Mz<span style="color: #000000; font-weight: bold;">/</span>1YAj2nDJqiiKdkh3n3jy80EuDObBzI2Fdw7d12pZD7SnzZ<span style="color: #000000; font-weight: bold;">/</span>UziguMgqyY
cQARAQABiQEfBBgBAgAJBQJIjcv9AhsMAAoJEN1cWjXz9HQ<span style="color: #000000; font-weight: bold;">/</span>dHUIAKfMGIX53Dmg
<span style="color: #000000; font-weight: bold;">/</span>EDIWqmnOgCB0r0XY3vjyO<span style="color: #000000; font-weight: bold;">/</span>I8weXiRmz1BX0uyzdp<span style="color: #000000; font-weight: bold;">/</span>bDzXvFht8rEx6g4M7V+2yz
Ie1rh5P3mUoAnm3zuVYdfqHv8YLu9mDqvyL1B+sGUFAD17CJn+BWIV6R2vpoWuRF
Rz0QvnjRPGD1QrmiL<span style="color: #000000; font-weight: bold;">/</span>KzwNbEpz6nHLymgf5VR<span style="color: #000000; font-weight: bold;">/</span>gx8Kh7may0bc4iZ1KSupK7kG82
YMHf1<span style="color: #000000; font-weight: bold;">/</span>8CazCTzow9pXFGh1OVgPPPWJJWCUAgRh2foOlRbH8ThTq9lpSYLfXQ+bP7
MuKdg+glfItmXlGsmJcixk<span style="color: #000000; font-weight: bold;">/</span>rD1wkma6NqGEDVpZyYYy0uP8WztBsH5XUTV965lpo
5gXr+<span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">bJ6wE</span>=
=CFlk
<span style="color: #660033;">-----END</span> PGP PUBLIC KEY BLOCK-----</pre></td></tr></table></div>

<p>Опция <b>&#8212;armor</b> позволяет экспортировать ключ в ASCII-режиме. Без неё ключ будет экспортирован в бинарном виде.</p>
<p>Для того, чтобы экспортировать закрытые ключи для <b>ЭЦП</b> и шифрования, можно воспользоваться командой:</p>

<div class="wp_codebox"><table><tr id="p145534"><td class="code" id="p1455code34"><pre class="bash" style="font-family:monospace;">gpg <span style="color: #660033;">--armor</span> <span style="color: #660033;">--export-secret-keys</span> user_id</pre></td></tr></table></div>

<p>Пример:</p>

<div class="wp_codebox"><table><tr id="p145535"><td class="code" id="p1455code35"><pre class="bash" style="font-family:monospace;">sadko<span style="color: #000000; font-weight: bold;">@</span>sadovnikov:~<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">&gt;</span> gpg <span style="color: #660033;">--armor</span> <span style="color: #660033;">--export-secret-keys</span> <span style="color: #ff0000;">&quot;Vladimir Sadovnikov&quot;</span>
<span style="color: #660033;">-----BEGIN</span> PGP PRIVATE KEY BLOCK-----
Version: GnuPG v1.4.5 <span style="color: #7a0874; font-weight: bold;">&#40;</span>GNU<span style="color: #000000; font-weight: bold;">/</span>Linux<span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
lQO+BEiNyy4BCACoDXiTAMZXlf<span style="color: #000000; font-weight: bold;">/</span>geeR9cSmNZxbyxnOCGZvLdoWLcJ5akaK22s3<span style="color: #000000; font-weight: bold;">/</span>
75lMgyDtSKQAZ20<span style="color: #000000; font-weight: bold;">/</span>fPGebdiI690ZTnYZOJaYaZXSALCDgcI5ncrjdWkpUR<span style="color: #000000; font-weight: bold;">/</span>ecTrn
Am3VZZv6qly9mfnx1ci06mNda8GzOVsIqXIipBGIKrPmoR6GLP9KqjNbb2AGl3XF
ISApk5yDGpMtFgwk9COlsmOFL+sEUcmavd05U25ggoMADieLGWehMifJzdPJwcJl
8jNqZeVnPfKnAR44VzNn21hJ+Qi66ufTQ3dCOLHjUhAwV4MgYN76lyRZRgg1tlLu
L3DcIyq3reiwqcC3QgznOaRNpxTSDQU9AEFpABEBAAH+AwMCc6eBgSYAbgFg4Pbd
bJT+pJCeRfkWlvhBzpbICfn5bWec8dExEtY9I3CjiQ8SvRmLnT4HvdPy3ZYiCKCA
Gx2N6SH2JHaUe5cClbScbkWcAN+4H7nlhWLSG2oxgw3MBwgEuAC36U+SJ5sytSOa
FudaI0RApLR7Nhvkk0vntjb7H39Bo4w7SigX5kF+m5jb4TEP82oPf2eH6ZW7EwEn
VnmXe3uN<span style="color: #000000; font-weight: bold;">/</span>wonciNLJ8I465M+5dgLHeWzkqznWu8SHJT1i8cYnvRE8KsWD5ljsQlM
oFuyMsdLA76U0<span style="color: #000000; font-weight: bold;">/</span>WyfampyQ2Nn96ZhkRYv<span style="color: #000000; font-weight: bold;">/</span>a+JpOZ2dWmdaRQTg7gGuVmetfqudJ4
9t+z9nnYN96uskOC7RD2Im8GjLKqM+VhoimlFj8GraOd1KzHy9zPp1ZxUCTYjjfe
rzjl+V5JMboXeYXIiS5+BdsFpyTfp<span style="color: #000000; font-weight: bold;">/</span>4zQdOixcJDE2wR95F0qA67wNjDRXD5YpAV
SeAa9TJC79T4lyFwizTqdDqPVlJV1VxInXTkU5bDsNrlwHdUSD499NAevck6jVcx
3nq4LVShaEkx0YhgeMVfcVJGIUyHgztNKQDulSaOEHiyNjDW6dUSqFc<span style="color: #000000; font-weight: bold;">/</span>C82vD4R+
cfEBdYZV<span style="color: #000000; font-weight: bold;">/</span>TSznALPCMfwowAYUuv4eN0atpSkzTHez1VFImiFvH<span style="color: #000000; font-weight: bold;">/</span>QfUOB3cZLijyk
HNLZq<span style="color: #000000; font-weight: bold;">/</span>JuMRc6GPmR6PVQfNkPaas0W+68hQ7Bziy+1g6mQ0MRKr5yRmu15gqQdczo
u7GJOr31dA2YzIHLSFVgakhbUWL14xWPaS3a9EhSnZLc1ENb2hofUxWUS8I0UhPV
FN3sMj7SVNlIY0mgpdMFXviwYy3zN1id400OtZVwr4wGqEHsTvylk<span style="color: #000000; font-weight: bold;">//</span>SbY7K+FRl
vhzpuLKdWmf5D9<span style="color: #000000; font-weight: bold;">/</span>XfqmR0T3DkGujAINqJsTXADnjnxs7zhKVzqkuFO<span style="color: #000000; font-weight: bold;">/</span>hI<span style="color: #000000; font-weight: bold;">/</span>3DyVfk
X7Q7VmxhZGltaXIgU2Fkb3ZuaWtvdiAoUEVSTCBEZXZlbG9wZXIpIDxzYWRvdm5p
a292QHByb3RlaS5ydT6JATYEEwECACAFAkiNyy4CGwMGCwkIBwMCBBUCCAMEFgID
AQIeAQIXgAAKCRDdXFo18<span style="color: #000000; font-weight: bold;">/</span>R0P7OKB<span style="color: #000000; font-weight: bold;">/</span>4kTXFJQy8rFzM5nDElALwl6qnFal0Om2Y7
NmC2uKdPhgvFLK66QDqNlGQ9yzksJw6Ww4X7FpS144Bu1phq1505pJ++ACF<span style="color: #000000; font-weight: bold;">/</span>kfKb
Xrkj6b14G4aDzmFWEgRYFcMx2UTAReE0TJZsviVD3StO9PLlRQ6<span style="color: #000000; font-weight: bold;">/</span>QjpG8cgOOKnt
mN<span style="color: #000000; font-weight: bold;">/</span>kr0Qifv4dd14G+RHd6CiGrfyP<span style="color: #000000; font-weight: bold;">/</span>yBc<span style="color: #000000; font-weight: bold;">/</span>JVj4VOMiny<span style="color: #000000; font-weight: bold;">/</span>uIgkn++xOl65ho4W8H7Q
kbuj0qSmPV<span style="color: #000000; font-weight: bold;">/</span>cfNPyLjpIouPJP2Ex4wwyXq0n6Z74QWpdVfKcAa2ciPTPvLwWAxMw
W88HMY1ZLOYLCaK<span style="color: #000000; font-weight: bold;">/</span>ufGT5enOClZw<span style="color: #000000; font-weight: bold;">/</span>UX13gNcgEeSCU7w+km2KbqUnQO+BEiNy<span style="color: #000000; font-weight: bold;">/</span>0B
CAD9EAwPxAMEiBWM4D9qIOYmVyZI7+RBaQUW5R5O<span style="color: #000000; font-weight: bold;">/</span>XYIFy4J1g5nKsXkhJ+dEBLK
w89w42WPuMhX<span style="color: #000000; font-weight: bold;">/</span>PKoo1QxVNAySf7V8Nr8q6dLRm2LaggYCrZQvUOJA+GCv4Re2sBq
haWgQjvg7dQh4W8o74PLJL71oCxOPHdNQySPfENYueJZBIbmLciPlQzXP4hQfEfG
awpJk2j+OzAUupzJK1ZfUzFzkJoIlWMv87FDRNmE5ju05hakWQcIs<span style="color: #000000; font-weight: bold;">/</span>blJk5YSU4o
c7MkIg6t+<span style="color: #000000; font-weight: bold;">/</span>lmKnTWSyVUs2dRXbgzP<span style="color: #000000; font-weight: bold;">/</span>VgCPacMmqKIp2SHefePLzQS4M5sHMjYV3D
t3XalkPtKfNn9TOKC4yCrJhxABEBAAH+AwMCkJDSW9wC3FpgRky+0rXpWWMMMyJI
LKyzxhKktlGTmtEclGOZVZN0+LN0lo+QP5zYJ7<span style="color: #000000; font-weight: bold;">/</span>WxOb4FrJ2zVgEE9ECt<span style="color: #000000; font-weight: bold;">/</span>YjiZMq
VB4wIBZBXBpNQxORl05csRolTmpHeMjxwKieoWaJyUZNXK2yXXcKc3UAZJWFcpu7
d8AmBiifQyqwZ54oDriNvWNhwWJS4oxapQ0eLCL7Pm+TxQTqW8LUsRSNFv6gqMSp
FWiLRt0skI1lIpn<span style="color: #000000; font-weight: bold;">/</span>AKQwfG7lyMnewTRaLw6Y+w41FU3+8YN7LWp<span style="color: #000000; font-weight: bold;">/</span>NlWxCvTB5sPB
31pg7FajMxuHSbzL7u1lgRL2YpBWu<span style="color: #000000; font-weight: bold;">/</span>UAtWGiqKNhGiCcGgOKGtnnEfqyxCPUtvgT
UOcTx<span style="color: #000000; font-weight: bold;">/</span>daXzH8ULxANIAirBY7SFc+sBxmJoYH7JoSSOFb7befAdJggMVxzhbrCgM9
9q97YApOUZS3gsZylpA6RkCztwhD5zbUbH1pOWRWW<span style="color: #000000; font-weight: bold;">/</span>P<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">8</span>+OHkv1AnD6NWg16b7Qe
dUGEqIMImQRBwnOfV6ksUHLlKaYHMgJc2LJSxeCMY3W90stVIKbzSHz+H6<span style="color: #000000; font-weight: bold;">/</span>xt82C
bTBOgPA<span style="color: #000000; font-weight: bold;">/</span>F0DNuqvMq4cZoTbSeU+fkdNUYrxDQj5JoGnkGEeI+j4rv9u4kYwqoaRI
NifyAXMLq2RlAgWJBKSzsWG4jozdovzzVqYC<span style="color: #000000; font-weight: bold;">/</span>XATpTjUrSQl+C4dikNJzfphJDHp
nI3ciFKEquukQkVQy+sfUo3kZSMHqSLz9XPaXMKnFrMX7DlCGshm11gc4c7KIKew
JrwbOb7vnYWgtida<span style="color: #000000; font-weight: bold;">/</span>wK5mdKAo0h0Lv09<span style="color: #000000; font-weight: bold;">/</span>DlWjrdiOBlNhaaMMKTPI+yoF8WwXrPp
so9fBaTTOWqnFNZOjzGywCVA92GqizGUYSjuku8CBy+F6lZDWN0OhjkRMWQfJZzR
Ed96JWt7KfcpoCeUQyjNtvnnL8gjw+BT0+sJnLFsp1JjGLHlpDf294kBHwQYAQIA
CQUCSI3L<span style="color: #000000; font-weight: bold;">/</span>QIbDAAKCRDdXFo18<span style="color: #000000; font-weight: bold;">/</span>R0P3R1CACnzBiF+dw5oPxAyFqppzoAgdK9F2N7
48jvyPMHl4kZs9QV9Lss3af2w817xYbfKxMeoODO1ftssyHta4eT95lKAJ5t87lW
HX6h7<span style="color: #000000; font-weight: bold;">/</span>GC7vZg6r8i9QfrBlBQA9ewiZ<span style="color: #000000; font-weight: bold;">/</span>gViFekdr6aFrkRUc9EL540Txg9UK5oi<span style="color: #000000; font-weight: bold;">/</span>y
s8DWxKc+pxy8poH+VUf4MfCoe5mstG3OImdSkrqSu5BvNmDB39f<span style="color: #000000; font-weight: bold;">/</span>Amswk86MPaVx
RodTlYDzz1iSVglAIEYdn6DpUWx<span style="color: #000000; font-weight: bold;">/</span>E4U6vZaUmC310Pmz+zLinYPoJXyLZl5RrJiX
IsZP6w9cJJmujahhA1aWcmGMtLj<span style="color: #000000; font-weight: bold;">/</span>Fs7QbB+V1E1feuZaaOYF6<span style="color: #000000; font-weight: bold;">/</span>v2yesB
=3Fkz
<span style="color: #660033;">-----END</span> PGP PRIVATE KEY BLOCK-----</pre></td></tr></table></div>

<p>Для экспорта закрытого ключа для шифрования можно воспользоваться командой:</p>

<div class="wp_codebox"><table><tr id="p145536"><td class="code" id="p1455code36"><pre class="bash" style="font-family:monospace;">gpg <span style="color: #660033;">--armor</span> <span style="color: #660033;">--export-secret-subkeys</span> user_id</pre></td></tr></table></div>

<p>Пример:</p>

<div class="wp_codebox"><table><tr id="p145537"><td class="code" id="p1455code37"><pre class="bash" style="font-family:monospace;">sadko<span style="color: #000000; font-weight: bold;">@</span>sadovnikov:~<span style="color: #000000; font-weight: bold;">&gt;</span> gpg <span style="color: #660033;">--armor</span> <span style="color: #660033;">--export-secret-subkeys</span> <span style="color: #ff0000;">&quot;Vladimir Sadovnikov&quot;</span>
<span style="color: #660033;">-----BEGIN</span> PGP PRIVATE KEY BLOCK-----
Version: GnuPG v1.4.5 <span style="color: #7a0874; font-weight: bold;">&#40;</span>GNU<span style="color: #000000; font-weight: bold;">/</span>Linux<span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
lQEVBEiNyy4BCACoDXiTAMZXlf<span style="color: #000000; font-weight: bold;">/</span>geeR9cSmNZxbyxnOCGZvLdoWLcJ5akaK22s3<span style="color: #000000; font-weight: bold;">/</span>
75lMgyDtSKQAZ20<span style="color: #000000; font-weight: bold;">/</span>fPGebdiI690ZTnYZOJaYaZXSALCDgcI5ncrjdWkpUR<span style="color: #000000; font-weight: bold;">/</span>ecTrn
Am3VZZv6qly9mfnx1ci06mNda8GzOVsIqXIipBGIKrPmoR6GLP9KqjNbb2AGl3XF
ISApk5yDGpMtFgwk9COlsmOFL+sEUcmavd05U25ggoMADieLGWehMifJzdPJwcJl
8jNqZeVnPfKnAR44VzNn21hJ+Qi66ufTQ3dCOLHjUhAwV4MgYN76lyRZRgg1tlLu
L3DcIyq3reiwqcC3QgznOaRNpxTSDQU9AEFpABEBAAH+A2UCR05VAbQ7VmxhZGlt
aXIgU2Fkb3ZuaWtvdiAoUEVSTCBEZXZlbG9wZXIpIDxzYWRvdm5pa292QHByb3Rl
aS5ydT6JATYEEwECACAFAkiNyy4CGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK
CRDdXFo18<span style="color: #000000; font-weight: bold;">/</span>R0P7OKB<span style="color: #000000; font-weight: bold;">/</span>4kTXFJQy8rFzM5nDElALwl6qnFal0Om2Y7NmC2uKdPhgvF
LK66QDqNlGQ9yzksJw6Ww4X7FpS144Bu1phq1505pJ++ACF<span style="color: #000000; font-weight: bold;">/</span>kfKbXrkj6b14G4aD
zmFWEgRYFcMx2UTAReE0TJZsviVD3StO9PLlRQ6<span style="color: #000000; font-weight: bold;">/</span>QjpG8cgOOKntmN<span style="color: #000000; font-weight: bold;">/</span>kr0Qifv4d
d14G+RHd6CiGrfyP<span style="color: #000000; font-weight: bold;">/</span>yBc<span style="color: #000000; font-weight: bold;">/</span>JVj4VOMiny<span style="color: #000000; font-weight: bold;">/</span>uIgkn++xOl65ho4W8H7Qkbuj0qSmPV<span style="color: #000000; font-weight: bold;">/</span>c
fNPyLjpIouPJP2Ex4wwyXq0n6Z74QWpdVfKcAa2ciPTPvLwWAxMwW88HMY1ZLOYL
CaK<span style="color: #000000; font-weight: bold;">/</span>ufGT5enOClZw<span style="color: #000000; font-weight: bold;">/</span>UX13gNcgEeSCU7w+km2KbqUnQO+BEiNy<span style="color: #000000; font-weight: bold;">/</span>0BCAD9EAwPxAME
iBWM4D9qIOYmVyZI7+RBaQUW5R5O<span style="color: #000000; font-weight: bold;">/</span>XYIFy4J1g5nKsXkhJ+dEBLKw89w42WPuMhX
<span style="color: #000000; font-weight: bold;">/</span>PKoo1QxVNAySf7V8Nr8q6dLRm2LaggYCrZQvUOJA+GCv4Re2sBqhaWgQjvg7dQh
4W8o74PLJL71oCxOPHdNQySPfENYueJZBIbmLciPlQzXP4hQfEfGawpJk2j+OzAU
upzJK1ZfUzFzkJoIlWMv87FDRNmE5ju05hakWQcIs<span style="color: #000000; font-weight: bold;">/</span>blJk5YSU4oc7MkIg6t+<span style="color: #000000; font-weight: bold;">/</span>lm
KnTWSyVUs2dRXbgzP<span style="color: #000000; font-weight: bold;">/</span>VgCPacMmqKIp2SHefePLzQS4M5sHMjYV3Dt3XalkPtKfNn
9TOKC4yCrJhxABEBAAH+AwMCkJDSW9wC3FpgRky+0rXpWWMMMyJILKyzxhKktlGT
mtEclGOZVZN0+LN0lo+QP5zYJ7<span style="color: #000000; font-weight: bold;">/</span>WxOb4FrJ2zVgEE9ECt<span style="color: #000000; font-weight: bold;">/</span>YjiZMqVB4wIBZBXBpN
QxORl05csRolTmpHeMjxwKieoWaJyUZNXK2yXXcKc3UAZJWFcpu7d8AmBiifQyqw
Z54oDriNvWNhwWJS4oxapQ0eLCL7Pm+TxQTqW8LUsRSNFv6gqMSpFWiLRt0skI1l
Ipn<span style="color: #000000; font-weight: bold;">/</span>AKQwfG7lyMnewTRaLw6Y+w41FU3+8YN7LWp<span style="color: #000000; font-weight: bold;">/</span>NlWxCvTB5sPB31pg7FajMxuH
SbzL7u1lgRL2YpBWu<span style="color: #000000; font-weight: bold;">/</span>UAtWGiqKNhGiCcGgOKGtnnEfqyxCPUtvgTUOcTx<span style="color: #000000; font-weight: bold;">/</span>daXzH8
ULxANIAirBY7SFc+sBxmJoYH7JoSSOFb7befAdJggMVxzhbrCgM99q97YApOUZS3
gsZylpA6RkCztwhD5zbUbH1pOWRWW<span style="color: #000000; font-weight: bold;">/</span>P<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">8</span>+OHkv1AnD6NWg16b7QedUGEqIMImQRB
wnOfV6ksUHLlKaYHMgJc2LJSxeCMY3W90stVIKbzSHz+H6<span style="color: #000000; font-weight: bold;">/</span>xt82CbTBOgPA<span style="color: #000000; font-weight: bold;">/</span>F0DN
uqvMq4cZoTbSeU+fkdNUYrxDQj5JoGnkGEeI+j4rv9u4kYwqoaRINifyAXMLq2Rl
AgWJBKSzsWG4jozdovzzVqYC<span style="color: #000000; font-weight: bold;">/</span>XATpTjUrSQl+C4dikNJzfphJDHpnI3ciFKEquuk
QkVQy+sfUo3kZSMHqSLz9XPaXMKnFrMX7DlCGshm11gc4c7KIKewJrwbOb7vnYWg
tida<span style="color: #000000; font-weight: bold;">/</span>wK5mdKAo0h0Lv09<span style="color: #000000; font-weight: bold;">/</span>DlWjrdiOBlNhaaMMKTPI+yoF8WwXrPpso9fBaTTOWqn
FNZOjzGywCVA92GqizGUYSjuku8CBy+F6lZDWN0OhjkRMWQfJZzREd96JWt7Kfcp
oCeUQyjNtvnnL8gjw+BT0+sJnLFsp1JjGLHlpDf294kBHwQYAQIACQUCSI3L<span style="color: #000000; font-weight: bold;">/</span>QIb
DAAKCRDdXFo18<span style="color: #000000; font-weight: bold;">/</span>R0P3R1CACnzBiF+dw5oPxAyFqppzoAgdK9F2N748jvyPMHl4kZ
s9QV9Lss3af2w817xYbfKxMeoODO1ftssyHta4eT95lKAJ5t87lWHX6h7<span style="color: #000000; font-weight: bold;">/</span>GC7vZg
6r8i9QfrBlBQA9ewiZ<span style="color: #000000; font-weight: bold;">/</span>gViFekdr6aFrkRUc9EL540Txg9UK5oi<span style="color: #000000; font-weight: bold;">/</span>ys8DWxKc+pxy8
poH+VUf4MfCoe5mstG3OImdSkrqSu5BvNmDB39f<span style="color: #000000; font-weight: bold;">/</span>Amswk86MPaVxRodTlYDzz1iS
VglAIEYdn6DpUWx<span style="color: #000000; font-weight: bold;">/</span>E4U6vZaUmC310Pmz+zLinYPoJXyLZl5RrJiXIsZP6w9cJJmu
jahhA1aWcmGMtLj<span style="color: #000000; font-weight: bold;">/</span>Fs7QbB+V1E1feuZaaOYF6<span style="color: #000000; font-weight: bold;">/</span>v2yesB
=Zi1I
<span style="color: #660033;">-----END</span> PGP PRIVATE KEY BLOCK-----</pre></td></tr></table></div>

<p>Результат работы всех этих команд можно перенаправить в файл. Пример:</p>

<div class="wp_codebox"><table><tr id="p145538"><td class="code" id="p1455code38"><pre class="bash" style="font-family:monospace;">sadko<span style="color: #000000; font-weight: bold;">@</span>sadovnikov:~<span style="color: #000000; font-weight: bold;">&gt;</span> gpg <span style="color: #660033;">--export</span> <span style="color: #000000; font-weight: bold;">&gt;</span>public.key
sadko<span style="color: #000000; font-weight: bold;">@</span>sadovnikov:~<span style="color: #000000; font-weight: bold;">&gt;</span> gpg <span style="color: #660033;">--export-secret-keys</span> <span style="color: #000000; font-weight: bold;">&gt;</span>private.key</pre></td></tr></table></div>

<h3> Как зашифровать данные? </h3>
<p>Чтобы зашифровать данные, необходимо воспользоваться опцией <b>&#8212;encrypt</b>.<br />
Шифровать можно как без добавления <b>ЭЦП</b>, так и с добавлением <b>ЭЦП</b>. Если нужно добавить ЭЦП, следует воспользоваться опцией <b>&#8212;sign</b>.</p>
<p>Для шифрования без <b>ЭЦП</b> можно воспользоваться командой:</p>

<div class="wp_codebox"><table><tr id="p145539"><td class="code" id="p1455code39"><pre class="bash" style="font-family:monospace;">gpg <span style="color: #660033;">--recipient</span> user_id <span style="color: #660033;">--output</span> output_file <span style="color: #660033;">--encrypt</span> input_file</pre></td></tr></table></div>

<p>Пример шифрования:</p>

<div class="wp_codebox"><table><tr id="p145540"><td class="code" id="p1455code40"><pre class="bash" style="font-family:monospace;">sadko<span style="color: #000000; font-weight: bold;">@</span>sadovnikov:~<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #c20cb9; font-weight: bold;">cat</span> export.txt
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">HOME</span>=<span style="color: #ff0000;">&quot;/home/sadko&quot;</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">LOGNAME</span>=<span style="color: #ff0000;">&quot;sadko&quot;</span>
<span style="color: #7a0874; font-weight: bold;">export</span> OLDPWD
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PATH</span>=<span style="color: #ff0000;">&quot;/usr/bin:/bin&quot;</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PWD</span>=<span style="color: #ff0000;">&quot;/home/sadko&quot;</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">SHELL</span>=<span style="color: #ff0000;">&quot;/bin/sh&quot;</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">SHLVL</span>=<span style="color: #ff0000;">&quot;2&quot;</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">USER</span>=<span style="color: #ff0000;">&quot;sadko&quot;</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">_</span>=<span style="color: #ff0000;">&quot;/home/sadko/test.sh&quot;</span>
&nbsp;
sadko<span style="color: #000000; font-weight: bold;">@</span>sadovnikov:~<span style="color: #000000; font-weight: bold;">&gt;</span> gpg <span style="color: #660033;">--recipient</span> <span style="color: #ff0000;">&quot;Vladimir Sadovnikov&quot;</span> <span style="color: #660033;">--output</span> export.txt.crypted <span style="color: #660033;">--encrypt</span> export.txt
&nbsp;
sadko<span style="color: #000000; font-weight: bold;">@</span>sadovnikov:~<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #c20cb9; font-weight: bold;">cat</span> export.txt.crypted
�
<span style="color: #666666; font-style: italic;">#:;���r��$��&gt;/ɢ�</span>
		<span style="color: #000000; font-weight: bold;">&lt;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>▒�ly�z�N���\�����D<span style="color: #000000; font-weight: bold;">!</span>�s�Z<span style="color: #000000; font-weight: bold;">&lt;/</span>a<span style="color: #000000; font-weight: bold;">/</span>�
D�Dt�u��D<span style="color: #000000; font-weight: bold;">@*</span>���W<span style="color: #7a0874; font-weight: bold;">&#40;</span>�<span style="color: #000000; font-weight: bold;">&lt;</span>+�                           Q<span style="color: #000000; font-weight: bold;">`</span> :�κ�s �ha�    �ۥ<span style="color: #666666; font-style: italic;">#�[O</span>
�ȝ<span style="color: #000000; font-weight: bold;">*</span>Q� �:���Ŭ<span style="color: #000000; font-weight: bold;">!</span> mgWB�<span style="color: #000000;">6</span><span style="color: #ff0000;">'E�a�=��o���y&amp;ɽl�j�#���f-��Mz��$�� ���zr
							���r��CS�E��qH�'</span>C�� <span style="color: #000000; font-weight: bold;">/%</span>���Y��
�^�ox�<span style="color: #000000; font-weight: bold;">@</span>r�Q+��<span style="color: #7a0874; font-weight: bold;">&#123;</span>  mo��b��o<span style="color: #000000; font-weight: bold;">@</span>�SW�f<span style="color: #000000; font-weight: bold;">&lt;</span>襒�����9m���Ҫ\?�A<span style="color: #000000; font-weight: bold;">!</span><span style="color: #c20cb9; font-weight: bold;">w</span>���yI�U;��Nb��X<span style="color: #7a0874; font-weight: bold;">&#91;</span>�����A�����<span style="color: #7a0874; font-weight: bold;">&#93;</span>�<span style="color: #7a0874; font-weight: bold;">&#40;</span>��▒<span style="color: #000000;">8</span>���<span style="color: #c20cb9; font-weight: bold;">w</span>~�Ԭ����5A�4kf�<span style="color: #000000; font-weight: bold;">`</span>��Lt��<span style="color: #000000; font-weight: bold;">!</span>V���<span style="color: #7a0874; font-weight: bold;">&#125;</span>���������YN�wGj���<span style="color: #7a0874; font-weight: bold;">&#123;</span>��λ.�ō�D<span style="color: #7a0874; font-weight: bold;">&#91;</span>sadko<span style="color: #000000; font-weight: bold;">@</span>sadovnikov:~<span style="color: #000000; font-weight: bold;">&gt;</span> �c�<span style="color: #7a0874; font-weight: bold;">&#125;</span><span style="color: #000000; font-weight: bold;">/</span>ގ<span style="color: #000000;">7</span>���Bijp�<span style="color: #000000;">1</span>_�ЅEp</pre></td></tr></table></div>

<p>Для шифрования с <b>ЭЦП</b> необходимо воспользоваться опцией <b>&#8212;sign</b>. Чтобы не вводить пароль к закрытому ключу в интерактивном режиме, можно использовать опцию <b>&#8212;passphrase</b> :</p>

<div class="wp_codebox"><table><tr id="p145541"><td class="code" id="p1455code41"><pre class="bash" style="font-family:monospace;">gpg <span style="color: #660033;">--sign</span> <span style="color: #660033;">--passphrase</span> passphrase <span style="color: #660033;">--recipient</span> user_id <span style="color: #660033;">--output</span> output_file <span style="color: #660033;">--encrypt</span> input_file</pre></td></tr></table></div>

<p>Пример:</p>

<div class="wp_codebox"><table><tr id="p145542"><td class="code" id="p1455code42"><pre class="bash" style="font-family:monospace;">sadko<span style="color: #000000; font-weight: bold;">@</span>sadovnikov:~<span style="color: #000000; font-weight: bold;">&gt;</span> gpg <span style="color: #660033;">--sign</span> <span style="color: #660033;">--passphrase</span> <span style="color: #ff0000;">&quot;passphrase_ok&quot;</span> <span style="color: #660033;">--recipient</span> <span style="color: #ff0000;">&quot;Vladimir Sadovnikov&quot;</span> <span style="color: #660033;">--output</span> export.txt.crypted.sign <span style="color: #660033;">--encrypt</span> export.txt
&nbsp;
You need a passphrase to unlock the secret key <span style="color: #000000; font-weight: bold;">for</span>
user: <span style="color: #ff0000;">&quot;Vladimir Sadovnikov (PERL Developer) &lt;sadovnikov@protei.ru&gt;&quot;</span>
<span style="color: #000000;">2048</span>-bit RSA key, ID F3F4743F, created <span style="color: #000000;">2008</span>-07-<span style="color: #000000;">28</span></pre></td></tr></table></div>

<h3> Как расшифровать данные? </h3>
<p>Чтобы расшифровать данные, можно воспользоваться командой:</p>

<div class="wp_codebox"><table><tr id="p145543"><td class="code" id="p1455code43"><pre class="bash" style="font-family:monospace;">gpg <span style="color: #660033;">--recipient</span> user_id <span style="color: #660033;">--passphrase</span> passphrase <span style="color: #660033;">--output</span> output_file <span style="color: #660033;">--decrypt</span> input_file</pre></td></tr></table></div>

<p>Пример дешифрования:</p>

<div class="wp_codebox"><table><tr id="p145544"><td class="code" id="p1455code44"><pre class="bash" style="font-family:monospace;">sadko<span style="color: #000000; font-weight: bold;">@</span>sadovnikov:~<span style="color: #000000; font-weight: bold;">&gt;</span> gpg <span style="color: #660033;">--recipient</span> <span style="color: #ff0000;">&quot;Vladimir Sadovnikov&quot;</span> <span style="color: #660033;">--passphrase</span> <span style="color: #ff0000;">&quot;passphrase_ok&quot;</span> <span style="color: #660033;">--output</span> export.txt.decrypted <span style="color: #660033;">--decrypt</span> export.txt.crypted
&nbsp;
You need a passphrase to unlock the secret key <span style="color: #000000; font-weight: bold;">for</span>
user: <span style="color: #ff0000;">&quot;Vladimir Sadovnikov (PERL Developer) &lt;sadovnikov@protei.ru&gt;&quot;</span>
<span style="color: #000000;">2048</span>-bit RSA key, ID EBD472E7, created <span style="color: #000000;">2008</span>-07-<span style="color: #000000;">28</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>main key ID F3F4743F<span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
gpg: encrypted with <span style="color: #000000;">2048</span>-bit RSA key, ID EBD472E7, created <span style="color: #000000;">2008</span>-07-<span style="color: #000000;">28</span>
<span style="color: #ff0000;">&quot;Vladimir Sadovnikov (PERL Developer) &lt;sadovnikov@protei.ru&gt;&quot;</span>
&nbsp;
sadko<span style="color: #000000; font-weight: bold;">@</span>sadovnikov:~<span style="color: #000000; font-weight: bold;">&gt;</span> gpg <span style="color: #660033;">--recipient</span> <span style="color: #ff0000;">&quot;Vladimir Sadovnikov&quot;</span> <span style="color: #660033;">--passphrase</span> <span style="color: #ff0000;">&quot;passphrase_ok&quot;</span> <span style="color: #660033;">--output</span> export.txt.decrypted.sign <span style="color: #660033;">--decrypt</span> export.txt.crypted.sign
&nbsp;
You need a passphrase to unlock the secret key <span style="color: #000000; font-weight: bold;">for</span>
user: <span style="color: #ff0000;">&quot;Vladimir Sadovnikov (PERL Developer) &lt;sadovnikov@protei.ru&gt;&quot;</span>
<span style="color: #000000;">2048</span>-bit RSA key, ID EBD472E7, created <span style="color: #000000;">2008</span>-07-<span style="color: #000000;">28</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>main key ID F3F4743F<span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
gpg: encrypted with <span style="color: #000000;">2048</span>-bit RSA key, ID EBD472E7, created <span style="color: #000000;">2008</span>-07-<span style="color: #000000;">28</span>
<span style="color: #ff0000;">&quot;Vladimir Sadovnikov (PERL Developer) &lt;sadovnikov@protei.ru&gt;&quot;</span>
gpg: Signature made Втр <span style="color: #000000;">29</span> Июл <span style="color: #000000;">2008</span> <span style="color: #000000;">18</span>:<span style="color: #000000;">38</span>:<span style="color: #000000;">14</span> MSD using RSA key ID F3F4743F
gpg: Good signature from <span style="color: #ff0000;">&quot;Vladimir Sadovnikov (PERL Developer) &lt;sadovnikov@protei.ru&gt;&quot;</span>
&nbsp;
sadko<span style="color: #000000; font-weight: bold;">@</span>sadovnikov:~<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #c20cb9; font-weight: bold;">cat</span> export.txt.decrypted
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">HOME</span>=<span style="color: #ff0000;">&quot;/home/sadko&quot;</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">LOGNAME</span>=<span style="color: #ff0000;">&quot;sadko&quot;</span>
<span style="color: #7a0874; font-weight: bold;">export</span> OLDPWD
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PATH</span>=<span style="color: #ff0000;">&quot;/usr/bin:/bin&quot;</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PWD</span>=<span style="color: #ff0000;">&quot;/home/sadko&quot;</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">SHELL</span>=<span style="color: #ff0000;">&quot;/bin/sh&quot;</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">SHLVL</span>=<span style="color: #ff0000;">&quot;2&quot;</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">USER</span>=<span style="color: #ff0000;">&quot;sadko&quot;</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">_</span>=<span style="color: #ff0000;">&quot;/home/sadko/test.sh&quot;</span></pre></td></tr></table></div>

<h3> Как удалить ключи? </h3>
<p>Для удаления закрытых ключей можно использовать команду:</p>

<div class="wp_codebox"><table><tr id="p145545"><td class="code" id="p1455code45"><pre class="bash" style="font-family:monospace;">gpg <span style="color: #660033;">--delete-secret-keys</span> user_id</pre></td></tr></table></div>

<p>Пример:</p>

<div class="wp_codebox"><table><tr id="p145546"><td class="code" id="p1455code46"><pre class="bash" style="font-family:monospace;">sadko<span style="color: #000000; font-weight: bold;">@</span>sadovnikov:~<span style="color: #000000; font-weight: bold;">&gt;</span> gpg <span style="color: #660033;">--delete-secret-keys</span> <span style="color: #ff0000;">&quot;Vladimir Sadovnikov&quot;</span>
gpg <span style="color: #7a0874; font-weight: bold;">&#40;</span>GnuPG<span style="color: #7a0874; font-weight: bold;">&#41;</span> 1.4.5; Copyright <span style="color: #7a0874; font-weight: bold;">&#40;</span>C<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000;">2006</span> Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is <span style="color: #c20cb9; font-weight: bold;">free</span> software, and you are welcome to redistribute it
under certain conditions. See the <span style="color: #c20cb9; font-weight: bold;">file</span> COPYING <span style="color: #000000; font-weight: bold;">for</span> details.
&nbsp;
&nbsp;
sec  2048R<span style="color: #000000; font-weight: bold;">/</span>F3F4743F <span style="color: #000000;">2008</span>-07-<span style="color: #000000;">28</span> Vladimir Sadovnikov <span style="color: #7a0874; font-weight: bold;">&#40;</span>PERL Developer<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000; font-weight: bold;">&lt;</span>sadovnikov<span style="color: #000000; font-weight: bold;">@</span>protei.ru<span style="color: #000000; font-weight: bold;">&gt;</span>
&nbsp;
Delete this key from the keyring? <span style="color: #7a0874; font-weight: bold;">&#40;</span>y<span style="color: #000000; font-weight: bold;">/</span>N<span style="color: #7a0874; font-weight: bold;">&#41;</span> y
This is a secret key<span style="color: #000000; font-weight: bold;">!</span> - really delete? <span style="color: #7a0874; font-weight: bold;">&#40;</span>y<span style="color: #000000; font-weight: bold;">/</span>N<span style="color: #7a0874; font-weight: bold;">&#41;</span> y</pre></td></tr></table></div>

<p>Для удаления открытых ключей используется команда:</p>

<div class="wp_codebox"><table><tr id="p145547"><td class="code" id="p1455code47"><pre class="bash" style="font-family:monospace;">gpg <span style="color: #660033;">--delete-keys</span> user_id</pre></td></tr></table></div>

<p>Пример:</p>

<div class="wp_codebox"><table><tr id="p145548"><td class="code" id="p1455code48"><pre class="bash" style="font-family:monospace;">sadko<span style="color: #000000; font-weight: bold;">@</span>sadovnikov:~<span style="color: #000000; font-weight: bold;">&gt;</span> gpg <span style="color: #660033;">--delete-keys</span> <span style="color: #ff0000;">&quot;Vladimir Sadovnikov&quot;</span>
gpg <span style="color: #7a0874; font-weight: bold;">&#40;</span>GnuPG<span style="color: #7a0874; font-weight: bold;">&#41;</span> 1.4.5; Copyright <span style="color: #7a0874; font-weight: bold;">&#40;</span>C<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000;">2006</span> Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is <span style="color: #c20cb9; font-weight: bold;">free</span> software, and you are welcome to redistribute it
under certain conditions. See the <span style="color: #c20cb9; font-weight: bold;">file</span> COPYING <span style="color: #000000; font-weight: bold;">for</span> details.
&nbsp;
&nbsp;
pub  2048R<span style="color: #000000; font-weight: bold;">/</span>F3F4743F <span style="color: #000000;">2008</span>-07-<span style="color: #000000;">28</span> Vladimir Sadovnikov <span style="color: #7a0874; font-weight: bold;">&#40;</span>PERL Developer<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000; font-weight: bold;">&lt;</span>sadovnikov<span style="color: #000000; font-weight: bold;">@</span>protei.ru<span style="color: #000000; font-weight: bold;">&gt;</span>
&nbsp;
Delete this key from the keyring? <span style="color: #7a0874; font-weight: bold;">&#40;</span>y<span style="color: #000000; font-weight: bold;">/</span>N<span style="color: #7a0874; font-weight: bold;">&#41;</span> y</pre></td></tr></table></div>

<h3> Как импортировать ключи? </h3>
<p>Необходимо воспользоваться опцией <b>&#8212;import</b>:</p>

<div class="wp_codebox"><table><tr id="p145549"><td class="code" id="p1455code49"><pre class="bash" style="font-family:monospace;">gpg <span style="color: #660033;">--import</span> key_file</pre></td></tr></table></div>

<p>Пример:</p>

<div class="wp_codebox"><table><tr id="p145550"><td class="code" id="p1455code50"><pre class="bash" style="font-family:monospace;">sadko<span style="color: #000000; font-weight: bold;">@</span>sadovnikov:~<span style="color: #000000; font-weight: bold;">&gt;</span> gpg <span style="color: #660033;">--import</span> public.key
gpg: key F3F4743F: public key <span style="color: #ff0000;">&quot;Vladimir Sadovnikov (PERL Developer) &lt;sadovnikov@protei.ru&gt;&quot;</span> imported
gpg: Total number processed: <span style="color: #000000;">1</span>
gpg:               imported: <span style="color: #000000;">1</span>  <span style="color: #7a0874; font-weight: bold;">&#40;</span>RSA: <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
sadko<span style="color: #000000; font-weight: bold;">@</span>sadovnikov:~<span style="color: #000000; font-weight: bold;">&gt;</span> gpg <span style="color: #660033;">--import</span> private.key
gpg: key F3F4743F: secret key imported
gpg: key F3F4743F: <span style="color: #ff0000;">&quot;Vladimir Sadovnikov (PERL Developer) &lt;sadovnikov@protei.ru&gt;&quot;</span> not changed
gpg: Total number processed: <span style="color: #000000;">1</span>
gpg:              unchanged: <span style="color: #000000;">1</span>
gpg:       secret keys <span style="color: #c20cb9; font-weight: bold;">read</span>: <span style="color: #000000;">1</span>
gpg:   secret keys imported: <span style="color: #000000;">1</span></pre></td></tr></table></div>

<h3> Как можно узнать, что команда выполнилась успешно? </h3>
<p>В случае успешного выполнения команды <b>gpg</b> возвращает 0. Для получения кодов ошибок можно обратиться к файлу <b>gpg-error.h</b>.</p>
<h3> Что ещё можно почитать? </h3>
<p>Полезные ссылки:</p>
<li><a href="http://www.gnupg.org/gph/de/manual/r1023.html" alt="GnuPG Manpage">GPG Manpage</a></li>
<li><a href="http://ru.wikipedia.org/wiki/GnuPG " alt=" RU Wikipedia"> RU Wikipedia</a></li>
<li><a href="http://en.wikipedia.org/wiki/GnuPG " alt=" EN Wikipedia"> EN Wikipedia</a></li>
<li><a href="http://www.somacon.com/p107.php" alt="http://www.somacon.com/p107.php">http://www.somacon.com/p107.php</a></li>
<li><a href="http://linsec.ca/Using_GnuPG" alt="http://linsec.ca/Using_GnuPG">http://linsec.ca/Using_GnuPG</a></li>
<li><a href="http://www.spywarewarrior.com/uiuc/gpg/gpg-com-4.htm" alt="http://www.spywarewarrior.com/uiuc/gpg/gpg-com-4.htm">http://www.spywarewarrior.com/uiuc/gpg/gpg-com-4.htm</a></li>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1455/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Основы работы с GnuPG #1</title>
		<link>http://sadko.xskernel.org/archives/1447</link>
		<comments>http://sadko.xskernel.org/archives/1447#comments</comments>
		<pubDate>Mon, 07 Sep 2009 09:31:26 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[Свободное ПО]]></category>
		<category><![CDATA[Туториалы]]></category>
		<category><![CDATA[cryptography]]></category>
		<category><![CDATA[gnupg]]></category>
		<category><![CDATA[rsa]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/?p=1447</guid>
		<description><![CDATA[Tweet Некогда по работе пришлось разбираться с работой GnuPG и описывать принципы работы с ней для сотрудников. Ниже приведён текст краткого howto, написанного мной. Для чего всё это надо? GNU Privacy Guard, GnuPG, GPG — свободная альтернатива набору криптографического ПО PGP, выпущенная под лицензией GPL. Является частью проекта GNU, получила гранты от Германского правительства. GnuPG [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1447',
  title: 'Основы работы с GnuPG #1',
  description: 'Некогда по работе пришлось разбираться с работой GnuPG и описывать принципы работы с ней для сотрудников. Ниже приведён текст краткого howto, написанного мной.\n\n Для чего всё это надо? \n\nGNU Privacy Guard,...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1447"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="&ETH;&Ntilde;&ETH;&frac12;&ETH;&frac34;&ETH;&sup2;&Ntilde; &Ntilde;&ETH;&deg;&ETH;&plusmn;&ETH;&frac34;&Ntilde;&Ntilde; &Ntilde; GnuPG #1" data-url="http://sadko.xskernel.org/archives/1447">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><p>Некогда по работе пришлось разбираться с работой <a href="http://www.gnupg.org/" alt="gnupg">GnuPG</a> и описывать принципы работы с ней для сотрудников. Ниже приведён текст краткого howto, написанного мной.<br />
<span id="more-1447"></span></p>
<h3> Для чего всё это надо? </h3>
<p><b>GNU Privacy Guard</b>, <b>GnuPG</b>, <b>GPG</b> — свободная альтернатива набору криптографического ПО <b>PGP</b>, выпущенная под лицензией GPL. Является частью проекта GNU, получила гранты от Германского правительства. GnuPG полностью совместим со стандартом IETF OpenPGP. Текущие версии GnuPG могут взаимодействовать с <b>PGP</b> и другими <b>OpenPGP</b>-совместимыми системами в режиме совместимости. <b>GnuPG</b> позволяет шифровать и подписывать данные в целях безопасного хранения и передачи информации.</p>
<h3> Какие особенности GnuPG по сравнению с PGP/OpenPGP? </h3>
<p><b>GnuPG</b> обладает следующими особенностями:</p>
<li>Полная альтернатива <b>PGP</b>.</li>
<li>Не использует патентованные алгоритмы.</li>
<li>Распространяется под GNU General Public License.</li>
<li>Полная реализация <b>OpenPGP</b> (RFC2440).</li>
<li>Расшифрование и аутентификация сообщений, созданных с помощью <b>PGP</b> 5, 6 и 7.</li>
<li>Поддержка электронной подписи с помощью алгоритмов <b>ElGamal</b>, <b>DSA</b>, <b>RSA</b> и хеш-функций <b>MD5</b>, <b>SHA-1</b>, <b>RIPE-MD-160</b> и <b>TIGER</b>.</li>
<li>Работа с ассиметричным шифрованием <b>ElGamal</b> и <b>RSA</b> (длина ключа от 1024 до 4096 бит).</li>
<li>Поддержка блочных алгоритмов симметричного шифрования <b>AES</b>, <b>3DES</b>, <b>Blowfish</b>, <b>Twofish</b>, <b>CAST5</b>, а также <b>IDEA</b> с помощью плагина.</li>
<li>Лёгкая реализация новых алгоритмов с помощью дополнительных модулей.</li>
<li>Поддержка просроченных ключей и подписей.</li>
<li>Интегрированная поддержка <b>HKP</b> серверов ключей.</li>
<h3> Каков принцип работы GnuPG? </h3>
<p><b>GnuPG</b> шифрует сообщения, используя асимметричные пары ключей, генерируемые пользователями <b>GnuPG</b>. Публичными ключами можно обмениваться с другими пользователями различными путями, в том числе и через интернет с помощью серверов ключей. Также <b>GnuPG</b> позволяет добавлять криптографическую цифровую подпись к сообщению, при этом целостность и отправитель сообщения могут быть проверены.</p>
<p><b>GnuPG</b> не использует запатентованное или иначе ограниченное ПО и/или алгоритмы, включая алгоритм <b>IDEA</b>, который представлен в <b>PGP</b> почти с самого начала. <b>GnuPG</b> использует другие непатентованные алгоритмы <b>CAST5</b>, <b>3DES</b>, <b>AES</b>, <b>Blowfish</b> и <b>Twofish</b>. Тем не менее, возможно использование в <b>GnuPG</b> и алгоритма <b>IDEA</b> с помощью дополнительного модуля.</p>
<p><b>GnuPG</b> — это гибридное криптографическое программное обеспечение, которое использует комбинацию стандартного шифрования с помощью симметричных ключей и шифрования с публичным ключом для безопасного обмена ключами, публичный ключ получателя необходим для шифрования ключа сессии, используемого единожды. Такой режим работы является частью стандарта <b>OpenPGP</b> и частью <b>PGP</b> в его первой версии.</p>
<h3> Как работать с утилитой gpg? </h3>
<p>Утилита <b>gpg</b> доступна из командной строки, поэтому б<b>о</b>льшую часть криптографических функций можно осуществлять, вызывая её из других программ. К таким функциям относятся, например, шифрование, дешифрование, проверка цифровых подписей. Однако, некоторые операции производятся в интерактивном режиме, например редактирование и создание ключей.</p>
<p>При работе с утилитой необходимо начать с создания своих ключей или импорта чужих открытых ключей (public keys). Далее, имея необходимые ключи, можно осуществлять шифрование/дешифрование данных и добавление электронной цифровой подписи (ЭЦП), позволяющей удостовериться, что данные действительно принадлежат отправителю.</p>
<h3> Как создать свой ключ? </h3>
<p>Для создания собственного ключа необходимо использовать команду:</p>

<div class="wp_codebox"><table><tr id="p144761"><td class="code" id="p1447code61"><pre class="bash" style="font-family:monospace;">gpg <span style="color: #660033;">--gen-key</span></pre></td></tr></table></div>

<p>Пример работы команды:</p>

<div class="wp_codebox"><table><tr id="p144762"><td class="code" id="p1447code62"><pre class="bash" style="font-family:monospace;">sadko<span style="color: #000000; font-weight: bold;">@</span>sadovnikov:~<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">&gt;</span> gpg <span style="color: #660033;">--gen-key</span>
gpg <span style="color: #7a0874; font-weight: bold;">&#40;</span>GnuPG<span style="color: #7a0874; font-weight: bold;">&#41;</span> 1.4.5; Copyright <span style="color: #7a0874; font-weight: bold;">&#40;</span>C<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000;">2006</span> Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is <span style="color: #c20cb9; font-weight: bold;">free</span> software, and you are welcome to redistribute it
under certain conditions. See the <span style="color: #c20cb9; font-weight: bold;">file</span> COPYING <span style="color: #000000; font-weight: bold;">for</span> details.
&nbsp;
Please <span style="color: #000000; font-weight: bold;">select</span> what kind of key you want:
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> DSA and Elgamal <span style="color: #7a0874; font-weight: bold;">&#40;</span>default<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> DSA <span style="color: #7a0874; font-weight: bold;">&#40;</span>sign only<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">5</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> RSA <span style="color: #7a0874; font-weight: bold;">&#40;</span>sign only<span style="color: #7a0874; font-weight: bold;">&#41;</span>
Your selection? <span style="color: #000000;">5</span>
RSA keys may be between <span style="color: #000000;">1024</span> and <span style="color: #000000;">4096</span> bits long.
What keysize <span style="color: #000000; font-weight: bold;">do</span> you want? <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">2048</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
Requested keysize is <span style="color: #000000;">2048</span> bits
Please specify how long the key should be valid.
	<span style="color: #000000;">0</span> = key does not expire
<span style="color: #000000; font-weight: bold;">&lt;</span>n<span style="color: #000000; font-weight: bold;">&gt;</span>  = key expires <span style="color: #000000; font-weight: bold;">in</span> n days
<span style="color: #000000; font-weight: bold;">&lt;</span>n<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #c20cb9; font-weight: bold;">w</span> = key expires <span style="color: #000000; font-weight: bold;">in</span> n weeks
<span style="color: #000000; font-weight: bold;">&lt;</span>n<span style="color: #000000; font-weight: bold;">&gt;</span>m = key expires <span style="color: #000000; font-weight: bold;">in</span> n months
<span style="color: #000000; font-weight: bold;">&lt;</span>n<span style="color: #000000; font-weight: bold;">&gt;</span>y = key expires <span style="color: #000000; font-weight: bold;">in</span> n years
Key is valid <span style="color: #000000; font-weight: bold;">for</span>? <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000;">0</span>
Key does not expire at all
Is this correct? <span style="color: #7a0874; font-weight: bold;">&#40;</span>y<span style="color: #000000; font-weight: bold;">/</span>N<span style="color: #7a0874; font-weight: bold;">&#41;</span> y
&nbsp;
You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address <span style="color: #000000; font-weight: bold;">in</span> this form:
<span style="color: #ff0000;">&quot;Heinrich Heine (Der Dichter) &lt;heinrichh@duesseldorf.de&gt;&quot;</span>
&nbsp;
Real name: Vladimir Sadovnikov
Email address: sadovnikov<span style="color: #000000; font-weight: bold;">@</span>protei.ru
Comment: PERL Developer
You selected this USER-ID:
<span style="color: #ff0000;">&quot;Vladimir Sadovnikov (PERL Developer) &lt;sadovnikov@protei.ru&gt;&quot;</span>
&nbsp;
Change <span style="color: #7a0874; font-weight: bold;">&#40;</span>N<span style="color: #7a0874; font-weight: bold;">&#41;</span>ame, <span style="color: #7a0874; font-weight: bold;">&#40;</span>C<span style="color: #7a0874; font-weight: bold;">&#41;</span>omment, <span style="color: #7a0874; font-weight: bold;">&#40;</span>E<span style="color: #7a0874; font-weight: bold;">&#41;</span>mail or <span style="color: #7a0874; font-weight: bold;">&#40;</span>O<span style="color: #7a0874; font-weight: bold;">&#41;</span>kay<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>Q<span style="color: #7a0874; font-weight: bold;">&#41;</span>uit? O
You need a Passphrase to protect your secret key.
Enter passphrase:
Confirm passphrase:  
&nbsp;
We need to generate a lot of random bytes. It is a good idea to perform
some other action <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">type</span> on the keyboard, move the mouse, utilize the
disks<span style="color: #7a0874; font-weight: bold;">&#41;</span> during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
&nbsp;
Not enough random bytes available.  Please <span style="color: #000000; font-weight: bold;">do</span> some other work to give
the OS a chance to collect <span style="color: #c20cb9; font-weight: bold;">more</span> entropy<span style="color: #000000; font-weight: bold;">!</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>Need <span style="color: #000000;">284</span> <span style="color: #c20cb9; font-weight: bold;">more</span> bytes<span style="color: #7a0874; font-weight: bold;">&#41;</span>
..........+++++
+++++
gpg: key F3F4743F marked <span style="color: #c20cb9; font-weight: bold;">as</span> ultimately trusted
public and secret key created and signed.
&nbsp;
gpg: checking the trustdb
gpg: <span style="color: #000000;">3</span> marginal<span style="color: #7a0874; font-weight: bold;">&#40;</span>s<span style="color: #7a0874; font-weight: bold;">&#41;</span> needed, <span style="color: #000000;">1</span> <span style="color: #7a0874; font-weight: bold;">complete</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>s<span style="color: #7a0874; font-weight: bold;">&#41;</span> needed, PGP trust model
gpg: depth: <span style="color: #000000;">0</span>  valid:   <span style="color: #000000;">1</span>  signed:   <span style="color: #000000;">0</span>  trust: <span style="color: #000000;">0</span>-, 0q, 0n, 0m, 0f, 1u
pub   2048R<span style="color: #000000; font-weight: bold;">/</span>F3F4743F <span style="color: #000000;">2008</span>-07-<span style="color: #000000;">28</span>
Key fingerprint = 6D16 A862 4CC8 487D E388  <span style="color: #000000;">3235</span> DD5C 5A35 F3F4 743F
uid                  Vladimir Sadovnikov <span style="color: #7a0874; font-weight: bold;">&#40;</span>PERL Developer<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000; font-weight: bold;">&lt;</span>sadovnikov<span style="color: #000000; font-weight: bold;">@</span>protei.ru<span style="color: #000000; font-weight: bold;">&gt;</span>
&nbsp;
Note that this key cannot be used <span style="color: #000000; font-weight: bold;">for</span> encryption.  You may want to use
the <span style="color: #7a0874; font-weight: bold;">command</span> <span style="color: #ff0000;">&quot;--edit-key&quot;</span> to generate a subkey <span style="color: #000000; font-weight: bold;">for</span> this purpose.</pre></td></tr></table></div>

<p>В данном примере были созданы открытый (public key) и закрытый ключи (private key) для алгоритма шифрования <b>RSA</b> длиной 2048 бит, защищённые паролем. Эти ключи будут использоваться для добавления <b>ЭЦП</b>. Владелец этих ключей &#8212; пользователь с идентификатором <b>Vladimir Sadovnikov</b>. Однако, шифровать данные при помощи этих ключей не получится. Поэтому надо к этим ключам создать ещё пару ключей для шифрования. Это делается при помощи консольной команды:</p>

<div class="wp_codebox"><table><tr id="p144763"><td class="code" id="p1447code63"><pre class="bash" style="font-family:monospace;">gpg <span style="color: #660033;">--edit-key</span> user-id</pre></td></tr></table></div>

<p>В интерактивном режиме можно при помощи команды <b>trust</b> задать критерий доверия ключу, а при помощи команды <b>addkey</b> создать пару ключей для шифрования данных.<br />
Пример работы команды:</p>

<div class="wp_codebox"><table><tr id="p144764"><td class="code" id="p1447code64"><pre class="bash" style="font-family:monospace;">sadko<span style="color: #000000; font-weight: bold;">@</span>sadovnikov:~<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">&gt;</span> gpg <span style="color: #660033;">--edit-key</span> <span style="color: #ff0000;">&quot;Vladimir Sadovnikov&quot;</span>
gpg <span style="color: #7a0874; font-weight: bold;">&#40;</span>GnuPG<span style="color: #7a0874; font-weight: bold;">&#41;</span> 1.4.5; Copyright <span style="color: #7a0874; font-weight: bold;">&#40;</span>C<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000;">2006</span> Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is <span style="color: #c20cb9; font-weight: bold;">free</span> software, and you are welcome to redistribute it
under certain conditions. See the <span style="color: #c20cb9; font-weight: bold;">file</span> COPYING <span style="color: #000000; font-weight: bold;">for</span> details.
&nbsp;
Secret key is available.
&nbsp;
pub  2048R<span style="color: #000000; font-weight: bold;">/</span>F3F4743F  created: <span style="color: #000000;">2008</span>-07-<span style="color: #000000;">28</span>  expires: never       usage: SC
		trust: ultimate      validity: ultimate
<span style="color: #7a0874; font-weight: bold;">&#91;</span>ultimate<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>. Vladimir Sadovnikov <span style="color: #7a0874; font-weight: bold;">&#40;</span>PERL Developer<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000; font-weight: bold;">&lt;</span>sadovnikov<span style="color: #000000; font-weight: bold;">@</span>protei.ru<span style="color: #000000; font-weight: bold;">&gt;</span>
&nbsp;
Command<span style="color: #000000; font-weight: bold;">&gt;</span> trust
pub  2048R<span style="color: #000000; font-weight: bold;">/</span>F3F4743F  created: <span style="color: #000000;">2008</span>-07-<span style="color: #000000;">28</span>  expires: never       usage: SC
		trust: ultimate      validity: ultimate
<span style="color: #7a0874; font-weight: bold;">&#91;</span>ultimate<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>. Vladimir Sadovnikov <span style="color: #7a0874; font-weight: bold;">&#40;</span>PERL Developer<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000; font-weight: bold;">&lt;</span>sadovnikov<span style="color: #000000; font-weight: bold;">@</span>protei.ru<span style="color: #000000; font-weight: bold;">&gt;</span>
&nbsp;
Please decide how far you trust this user to correctly verify other <span style="color: #c20cb9; font-weight: bold;">users</span><span style="color: #ff0000;">' keys
(by looking at passports, checking fingerprints from different sources, etc.)
&nbsp;
1 = I don'</span>t know or won<span style="color: #ff0000;">'t say
2 = I do NOT trust
3 = I trust marginally
4 = I trust fully
5 = I trust ultimately
m = back to the main menu
&nbsp;
Your decision? 5
Do you really want to set this key to ultimate trust? (y/N) y
&nbsp;
pub  2048R/F3F4743F  created: 2008-07-28  expires: never       usage: SC
		trust: ultimate      validity: ultimate
[ultimate] (1). Vladimir Sadovnikov (PERL Developer) &lt;sadovnikov@protei.ru&gt;
&nbsp;
Command&gt; addkey
Key is protected.
&nbsp;
You need a passphrase to unlock the secret key for
user: &quot;Vladimir Sadovnikov (PERL Developer) &lt;sadovnikov@protei.ru&gt;&quot;
2048-bit RSA key, ID F3F4743F, created 2008-07-28
Enter passphrase:
&nbsp;
Please select what kind of key you want:
(2) DSA (sign only)
(4) Elgamal (encrypt only)
(5) RSA (sign only)
(6) RSA (encrypt only)
Your selection? 6
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
Requested keysize is 2048 bits
Please specify how long the key should be valid.
	0 = key does not expire
&lt;n&gt;  = key expires in n days
&lt;n&gt;w = key expires in n weeks
&lt;n&gt;m = key expires in n months
&lt;n&gt;y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
Is this correct? (y/N) y
Really create? (y/N) y
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
............+++++
........+++++
&nbsp;
pub  2048R/F3F4743F  created: 2008-07-28  expires: never       usage: SC
		trust: ultimate      validity: ultimate
sub  2048R/EBD472E7  created: 2008-07-28  expires: never       usage: E
[ultimate] (1). Vladimir Sadovnikov (PERL Developer) &lt;sadovnikov@protei.ru&gt;
&nbsp;
Command&gt; quit
Save changes? (y/N) y</span></pre></td></tr></table></div>

<p>Для ключей к <b>ЭЦП</b> пользователя <b>Vladimir Sadovnikov</b> создаётся пара ключей RSA длиной 2048 бит. Эти ключи уже можно использовать для шифрования данных.</p>
<h3> Как можно посмотреть доступные ключи? </h3>
<p>Для просмотра открытых ключей можно воспользоваться командой:</p>

<div class="wp_codebox"><table><tr id="p144765"><td class="code" id="p1447code65"><pre class="bash" style="font-family:monospace;">gpg <span style="color: #660033;">--list-keys</span> user_id</pre></td></tr></table></div>

<p>Пример:</p>

<div class="wp_codebox"><table><tr id="p144766"><td class="code" id="p1447code66"><pre class="bash" style="font-family:monospace;">sadko<span style="color: #000000; font-weight: bold;">@</span>sadovnikov:~<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">&gt;</span> gpg <span style="color: #660033;">--list-keys</span>
gpg: checking the trustdb
gpg: <span style="color: #000000;">3</span> marginal<span style="color: #7a0874; font-weight: bold;">&#40;</span>s<span style="color: #7a0874; font-weight: bold;">&#41;</span> needed, <span style="color: #000000;">1</span> <span style="color: #7a0874; font-weight: bold;">complete</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>s<span style="color: #7a0874; font-weight: bold;">&#41;</span> needed, PGP trust model
gpg: depth: <span style="color: #000000;">0</span>  valid:   <span style="color: #000000;">1</span>  signed:   <span style="color: #000000;">0</span>  trust: <span style="color: #000000;">0</span>-, 0q, 0n, 0m, 0f, 1u
<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>sadko<span style="color: #000000; font-weight: bold;">/</span>.gnupg<span style="color: #000000; font-weight: bold;">/</span>pubring.gpg
<span style="color: #660033;">------------------------------</span>
pub   2048R<span style="color: #000000; font-weight: bold;">/</span>F3F4743F <span style="color: #000000;">2008</span>-07-<span style="color: #000000;">28</span>
uid                  Vladimir Sadovnikov <span style="color: #7a0874; font-weight: bold;">&#40;</span>PERL Developer<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000; font-weight: bold;">&lt;</span>sadovnikov<span style="color: #000000; font-weight: bold;">@</span>protei.ru<span style="color: #000000; font-weight: bold;">&gt;</span>
sub   2048R<span style="color: #000000; font-weight: bold;">/</span>EBD472E7 <span style="color: #000000;">2008</span>-07-<span style="color: #000000;">28</span></pre></td></tr></table></div>

<p>Просмотр закрытых ключей можно также сделать командой:</p>

<div class="wp_codebox"><table><tr id="p144767"><td class="code" id="p1447code67"><pre class="bash" style="font-family:monospace;">gpg <span style="color: #660033;">--list-secret-keys</span> user_id</pre></td></tr></table></div>

<p>Пример:</p>

<div class="wp_codebox"><table><tr id="p144768"><td class="code" id="p1447code68"><pre class="bash" style="font-family:monospace;">sadko<span style="color: #000000; font-weight: bold;">@</span>sadovnikov:~<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">&gt;</span> gpg <span style="color: #660033;">--list-secret-keys</span>
<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>sadko<span style="color: #000000; font-weight: bold;">/</span>.gnupg<span style="color: #000000; font-weight: bold;">/</span>secring.gpg
<span style="color: #660033;">------------------------------</span>
sec   2048R<span style="color: #000000; font-weight: bold;">/</span>F3F4743F <span style="color: #000000;">2008</span>-07-<span style="color: #000000;">28</span>
uid                  Vladimir Sadovnikov <span style="color: #7a0874; font-weight: bold;">&#40;</span>PERL Developer<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000; font-weight: bold;">&lt;</span>sadovnikov<span style="color: #000000; font-weight: bold;">@</span>protei.ru<span style="color: #000000; font-weight: bold;">&gt;</span>
ssb   2048R<span style="color: #000000; font-weight: bold;">/</span>EBD472E7 <span style="color: #000000;">2008</span>-07-<span style="color: #000000;">28</span></pre></td></tr></table></div>

<p>Для просмотра &#171;отпечатов пальцев&#187; используется команда:</p>

<div class="wp_codebox"><table><tr id="p144769"><td class="code" id="p1447code69"><pre class="bash" style="font-family:monospace;">gpg <span style="color: #660033;">--fingerprint</span> user_id</pre></td></tr></table></div>

<p>Пример:</p>

<div class="wp_codebox"><table><tr id="p144770"><td class="code" id="p1447code70"><pre class="bash" style="font-family:monospace;">sadko<span style="color: #000000; font-weight: bold;">@</span>sadovnikov:~<span style="color: #000000; font-weight: bold;">&gt;</span> gpg <span style="color: #660033;">--fingerprint</span>
<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>sadko<span style="color: #000000; font-weight: bold;">/</span>.gnupg<span style="color: #000000; font-weight: bold;">/</span>pubring.gpg
<span style="color: #660033;">------------------------------</span>
pub   2048R<span style="color: #000000; font-weight: bold;">/</span>F3F4743F <span style="color: #000000;">2008</span>-07-<span style="color: #000000;">28</span>
Key fingerprint = 6D16 A862 4CC8 487D E388  <span style="color: #000000;">3235</span> DD5C 5A35 F3F4 743F
uid                  Vladimir Sadovnikov <span style="color: #7a0874; font-weight: bold;">&#40;</span>PERL Developer<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000; font-weight: bold;">&lt;</span>sadovnikov<span style="color: #000000; font-weight: bold;">@</span>protei.ru<span style="color: #000000; font-weight: bold;">&gt;</span>
sub   2048R<span style="color: #000000; font-weight: bold;">/</span>EBD472E7 <span style="color: #000000;">2008</span>-07-<span style="color: #000000;">28</span></pre></td></tr></table></div>

<p>Команда выводит аналогичный результат, что и <b>&#8212;list-keys</b>, но с полем <b>Key fingerprint</b>.</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1447/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Патчим DokuWiki.</title>
		<link>http://sadko.xskernel.org/archives/1433</link>
		<comments>http://sadko.xskernel.org/archives/1433#comments</comments>
		<pubDate>Fri, 04 Sep 2009 18:28:23 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[Кодинг]]></category>
		<category><![CDATA[Туториалы]]></category>
		<category><![CDATA[dokuwiki]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[быдлокодинг]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/?p=1433</guid>
		<description><![CDATA[Tweet Совсем недавно всплыла проблема с навигацией в dokuwiki. ПХПисты совсем обалдели и расхлябались! Суют свой быдлокод куда ни попадя, правильно на неправильно исправляют (ибо в предыдущей версии такого не было). Приходится всё за них переделывать. Итак, у кого кривая навигация в dokuwiki наверху, смело применяем этот патч на файле inc/template.php: diff -cr template.old template.php [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1433',
  title: 'Патчим DokuWiki.',
  description: 'Совсем недавно всплыла проблема с навигацией в dokuwiki.\n\nПХПисты совсем обалдели и расхлябались! Суют свой быдлокод куда ни попадя, правильно на неправильно исправляют (ибо в предыдущей версии ...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1433"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="&ETH;&ETH;&deg;&Ntilde;&Ntilde;&ETH;&cedil;&ETH;&frac14; DokuWiki." data-url="http://sadko.xskernel.org/archives/1433">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><p>Совсем недавно всплыла проблема с навигацией в dokuwiki.</p>
<p>ПХПисты совсем обалдели и расхлябались! Суют свой быдлокод куда ни попадя, правильно на неправильно исправляют (ибо в предыдущей версии такого не было). Приходится всё за них переделывать.</p>
<p>Итак, у кого кривая навигация в dokuwiki наверху, смело применяем этот патч на файле <strong>inc/template.php</strong>:<br />
<span id="more-1433"></span></p>

<div class="wp_codebox"><table><tr id="p143373"><td class="code" id="p1433code73"><pre class="diff" style="font-family:monospace;">diff -cr template.old template.php
<span style="color: #888822;">*** template.old        2009-02-14 15:13:25.000000000 +0300</span>
<span style="color: #888822;">--- template.php        2009-03-14 17:29:19.000000000 +0300</span>
***************
<span style="color: #888822;">*** 875,885 ****</span>
      // output
      echo $sep;
      if<span style="">&#40;</span>$exists<span style="">&#41;</span><span style="">&#123;</span>
<span style="color: #0011dd;">!       $title = useHeading<span style="">&#40;</span>'navigation'<span style="">&#41;</span> ? p_get_first_heading<span style="">&#40;</span>$page<span style="">&#41;</span> : $page;</span>
<span style="color: #0011dd;">!       if<span style="">&#40;</span>!$title<span style="">&#41;</span> $title = $parts<span style="">&#91;</span>$i<span style="">&#93;</span>;</span>
<span style="color: #0011dd;">!       tpl_link<span style="">&#40;</span>wl<span style="">&#40;</span>$page<span style="">&#41;</span>,hsc<span style="">&#40;</span>$title<span style="">&#41;</span>,'title=&quot;'.$page.'&quot;'<span style="">&#41;</span>;</span>
      <span style="">&#125;</span>else<span style="">&#123;</span>
<span style="color: #0011dd;">!       tpl_link<span style="">&#40;</span>wl<span style="">&#40;</span>$page<span style="">&#41;</span>,$parts<span style="">&#91;</span>$i<span style="">&#93;</span>,'title=&quot;'.$page.'&quot; class=&quot;wikilink2&quot; rel=&quot;nofollow&quot;'<span style="">&#41;</span>;</span>
      <span style="">&#125;</span>
    <span style="">&#125;</span>
&nbsp;
<span style="color: #888822;">--- 875,888 ----</span>
      // output
      echo $sep;
      if<span style="">&#40;</span>$exists<span style="">&#41;</span><span style="">&#123;</span>
<span style="color: #0011dd;">!       //$title = useHeading<span style="">&#40;</span>'navigation'<span style="">&#41;</span> ? p_get_first_heading<span style="">&#40;</span>$page<span style="">&#41;</span> : $page;</span>
<span style="color: #0011dd;">!       //if<span style="">&#40;</span>!$title<span style="">&#41;</span> $title = $parts<span style="">&#91;</span>$i<span style="">&#93;</span>;</span>
<span style="color: #0011dd;">!       //tpl_link<span style="">&#40;</span>wl<span style="">&#40;</span>$page<span style="">&#41;</span>,hsc<span style="">&#40;</span>$title<span style="">&#41;</span>,'title=&quot;'.$page.'&quot;'<span style="">&#41;</span>;</span>
<span style="color: #0011dd;">!       $title = useHeading<span style="">&#40;</span>'navigation'<span style="">&#41;</span> ? p_get_first_heading<span style="">&#40;</span>$page<span style="">&#41;</span> : $parts<span style="">&#91;</span>$i<span style="">&#93;</span>;</span>
<span style="color: #0011dd;">!       tpl_link<span style="">&#40;</span>wl<span style="">&#40;</span>$page<span style="">&#41;</span>,hsc<span style="">&#40;</span>$title<span style="">&#41;</span>,'title=&quot;'.$page.'&quot;'<span style="">&#41;</span>;</span>
      <span style="">&#125;</span>else<span style="">&#123;</span>
<span style="color: #0011dd;">!       //tpl_link<span style="">&#40;</span>wl<span style="">&#40;</span>$page<span style="">&#41;</span>,$parts<span style="">&#91;</span>$i<span style="">&#93;</span>,'title=&quot;'.$page.'&quot; class=&quot;wikilink2&quot; rel=&quot;nofollow&quot;'<span style="">&#41;</span>;</span>
<span style="color: #0011dd;">!         tpl_link<span style="">&#40;</span>wl<span style="">&#40;</span>$page<span style="">&#41;</span>,$parts<span style="">&#91;</span>$i<span style="">&#93;</span>,'title=&quot;'.$page.'&quot; class=&quot;wikilink2&quot; rel=&quot;nofollow&quot;'<span style="">&#41;</span>;</span>
      <span style="">&#125;</span>
    <span style="">&#125;</span>
&nbsp;
***************
<span style="color: #888822;">*** 889,897 ****</span>
    if<span style="">&#40;</span>$page == $conf<span style="">&#91;</span>'start'<span style="">&#93;</span><span style="">&#41;</span> return;
    echo $sep;
    if<span style="">&#40;</span>page_exists<span style="">&#40;</span>$page<span style="">&#41;</span><span style="">&#41;</span><span style="">&#123;</span>
<span style="color: #0011dd;">!     $title = useHeading<span style="">&#40;</span>'navigation'<span style="">&#41;</span> ? p_get_first_heading<span style="">&#40;</span>$page<span style="">&#41;</span> : $page;</span>
<span style="color: #0011dd;">!     if<span style="">&#40;</span>!$title<span style="">&#41;</span> $title = $parts<span style="">&#91;</span>$i<span style="">&#93;</span>;</span>
<span style="color: #0011dd;">!     tpl_link<span style="">&#40;</span>wl<span style="">&#40;</span>$page<span style="">&#41;</span>,hsc<span style="">&#40;</span>$title<span style="">&#41;</span>,'title=&quot;'.$page.'&quot;'<span style="">&#41;</span>;</span>
    <span style="">&#125;</span>else<span style="">&#123;</span>
      tpl_link<span style="">&#40;</span>wl<span style="">&#40;</span>$page<span style="">&#41;</span>,$parts<span style="">&#91;</span>$i<span style="">&#93;</span>,'title=&quot;'.$page.'&quot; class=&quot;wikilink2&quot; rel=&quot;nofollow&quot;'<span style="">&#41;</span>;
    <span style="">&#125;</span>
<span style="color: #888822;">--- 892,902 ----</span>
    if<span style="">&#40;</span>$page == $conf<span style="">&#91;</span>'start'<span style="">&#93;</span><span style="">&#41;</span> return;
    echo $sep;
    if<span style="">&#40;</span>page_exists<span style="">&#40;</span>$page<span style="">&#41;</span><span style="">&#41;</span><span style="">&#123;</span>
<span style="color: #0011dd;">!     //$title = useHeading<span style="">&#40;</span>'navigation'<span style="">&#41;</span> ? p_get_first_heading<span style="">&#40;</span>$page<span style="">&#41;</span> : $page;</span>
<span style="color: #0011dd;">!     //if<span style="">&#40;</span>!$title<span style="">&#41;</span> $title = $parts<span style="">&#91;</span>$i<span style="">&#93;</span>;</span>
<span style="color: #0011dd;">!     //tpl_link<span style="">&#40;</span>wl<span style="">&#40;</span>$page<span style="">&#41;</span>,hsc<span style="">&#40;</span>$title<span style="">&#41;</span>,'title=&quot;'.$page.'&quot;'<span style="">&#41;</span>;</span>
<span style="color: #0011dd;">!       $title = useHeading<span style="">&#40;</span>'navigation'<span style="">&#41;</span> ? p_get_first_heading<span style="">&#40;</span>$page<span style="">&#41;</span> : $parts<span style="">&#91;</span>$i<span style="">&#93;</span>;</span>
<span style="color: #0011dd;">!       tpl_link<span style="">&#40;</span>wl<span style="">&#40;</span>$page<span style="">&#41;</span>,hsc<span style="">&#40;</span>$title<span style="">&#41;</span>,'title=&quot;'.$page.'&quot;'<span style="">&#41;</span>;</span>
    <span style="">&#125;</span>else<span style="">&#123;</span>
      tpl_link<span style="">&#40;</span>wl<span style="">&#40;</span>$page<span style="">&#41;</span>,$parts<span style="">&#91;</span>$i<span style="">&#93;</span>,'title=&quot;'.$page.'&quot; class=&quot;wikilink2&quot; rel=&quot;nofollow&quot;'<span style="">&#41;</span>;
    <span style="">&#125;</span></pre></td></tr></table></div>

<p><strong>UPD1:</strong><br />
Чтобы увидеть работу патча, привожу скриншоты.<br />
Это панель навигации до патча:<br />
<img class="size-full wp-image-1440" title="wiki-before-patch" src="http://sadko.xskernel.org/wp-content/uploads/2009/09/wiki-before-patch.jpg" alt="wiki-before-patch" width="658" height="105" /></p>
<p>А вот так она выглядит после патча:<br />
<img class="size-full wp-image-1440" title="wiki-before-patch" src="http://sadko.xskernel.org/wp-content/uploads/2009/09/wiki-after-patch.jpg" alt="wiki-after-patch" width="658" height="105" /></p>
<p><strong>UPD2:</strong><br />
Для недовольных выкладываю патч в universal-формате:</p>

<div class="wp_codebox"><table><tr id="p143374"><td class="code" id="p1433code74"><pre class="diff" style="font-family:monospace;">diff -ruN template.old template.php
<span style="color: #888822;">--- template.old        2009-02-14 15:13:25.000000000 +0300</span>
<span style="color: #888822;">+++ template.php        2009-03-14 17:29:19.000000000 +0300</span>
<span style="color: #440088;">@@ -875,11 +875,14 @@</span>
     // output
     echo $sep;
     if<span style="">&#40;</span>$exists<span style="">&#41;</span><span style="">&#123;</span>
<span style="color: #991111;">-      $title = useHeading<span style="">&#40;</span>'navigation'<span style="">&#41;</span> ? p_get_first_heading<span style="">&#40;</span>$page<span style="">&#41;</span> : $page;</span>
<span style="color: #991111;">-      if<span style="">&#40;</span>!$title<span style="">&#41;</span> $title = $parts<span style="">&#91;</span>$i<span style="">&#93;</span>;</span>
<span style="color: #991111;">-      tpl_link<span style="">&#40;</span>wl<span style="">&#40;</span>$page<span style="">&#41;</span>,hsc<span style="">&#40;</span>$title<span style="">&#41;</span>,'title=&quot;'.$page.'&quot;'<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+      //$title = useHeading<span style="">&#40;</span>'navigation'<span style="">&#41;</span> ? p_get_first_heading<span style="">&#40;</span>$page<span style="">&#41;</span> : $page;</span>
<span style="color: #00b000;">+      //if<span style="">&#40;</span>!$title<span style="">&#41;</span> $title = $parts<span style="">&#91;</span>$i<span style="">&#93;</span>;</span>
<span style="color: #00b000;">+      //tpl_link<span style="">&#40;</span>wl<span style="">&#40;</span>$page<span style="">&#41;</span>,hsc<span style="">&#40;</span>$title<span style="">&#41;</span>,'title=&quot;'.$page.'&quot;'<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+       $title = useHeading<span style="">&#40;</span>'navigation'<span style="">&#41;</span> ? p_get_first_heading<span style="">&#40;</span>$page<span style="">&#41;</span> : $parts<span style="">&#91;</span>$i<span style="">&#93;</span>;</span>
<span style="color: #00b000;">+       tpl_link<span style="">&#40;</span>wl<span style="">&#40;</span>$page<span style="">&#41;</span>,hsc<span style="">&#40;</span>$title<span style="">&#41;</span>,'title=&quot;'.$page.'&quot;'<span style="">&#41;</span>;</span>
     <span style="">&#125;</span>else<span style="">&#123;</span>
<span style="color: #991111;">-      tpl_link<span style="">&#40;</span>wl<span style="">&#40;</span>$page<span style="">&#41;</span>,$parts<span style="">&#91;</span>$i<span style="">&#93;</span>,'title=&quot;'.$page.'&quot; class=&quot;wikilink2&quot; rel=&quot;nofollow&quot;'<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+      //tpl_link<span style="">&#40;</span>wl<span style="">&#40;</span>$page<span style="">&#41;</span>,$parts<span style="">&#91;</span>$i<span style="">&#93;</span>,'title=&quot;'.$page.'&quot; class=&quot;wikilink2&quot; rel=&quot;nofollow&quot;'<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+        tpl_link<span style="">&#40;</span>wl<span style="">&#40;</span>$page<span style="">&#41;</span>,$parts<span style="">&#91;</span>$i<span style="">&#93;</span>,'title=&quot;'.$page.'&quot; class=&quot;wikilink2&quot; rel=&quot;nofollow&quot;'<span style="">&#41;</span>;</span>
     <span style="">&#125;</span>
   <span style="">&#125;</span>
&nbsp;
<span style="color: #440088;">@@ -889,9 +892,11 @@</span>
   if<span style="">&#40;</span>$page == $conf<span style="">&#91;</span>'start'<span style="">&#93;</span><span style="">&#41;</span> return;
   echo $sep;
   if<span style="">&#40;</span>page_exists<span style="">&#40;</span>$page<span style="">&#41;</span><span style="">&#41;</span><span style="">&#123;</span>
<span style="color: #991111;">-    $title = useHeading<span style="">&#40;</span>'navigation'<span style="">&#41;</span> ? p_get_first_heading<span style="">&#40;</span>$page<span style="">&#41;</span> : $page;</span>
<span style="color: #991111;">-    if<span style="">&#40;</span>!$title<span style="">&#41;</span> $title = $parts<span style="">&#91;</span>$i<span style="">&#93;</span>;</span>
<span style="color: #991111;">-    tpl_link<span style="">&#40;</span>wl<span style="">&#40;</span>$page<span style="">&#41;</span>,hsc<span style="">&#40;</span>$title<span style="">&#41;</span>,'title=&quot;'.$page.'&quot;'<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    //$title = useHeading<span style="">&#40;</span>'navigation'<span style="">&#41;</span> ? p_get_first_heading<span style="">&#40;</span>$page<span style="">&#41;</span> : $page;</span>
<span style="color: #00b000;">+    //if<span style="">&#40;</span>!$title<span style="">&#41;</span> $title = $parts<span style="">&#91;</span>$i<span style="">&#93;</span>;</span>
<span style="color: #00b000;">+    //tpl_link<span style="">&#40;</span>wl<span style="">&#40;</span>$page<span style="">&#41;</span>,hsc<span style="">&#40;</span>$title<span style="">&#41;</span>,'title=&quot;'.$page.'&quot;'<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+       $title = useHeading<span style="">&#40;</span>'navigation'<span style="">&#41;</span> ? p_get_first_heading<span style="">&#40;</span>$page<span style="">&#41;</span> : $parts<span style="">&#91;</span>$i<span style="">&#93;</span>;</span>
<span style="color: #00b000;">+       tpl_link<span style="">&#40;</span>wl<span style="">&#40;</span>$page<span style="">&#41;</span>,hsc<span style="">&#40;</span>$title<span style="">&#41;</span>,'title=&quot;'.$page.'&quot;'<span style="">&#41;</span>;</span>
   <span style="">&#125;</span>else<span style="">&#123;</span>
     tpl_link<span style="">&#40;</span>wl<span style="">&#40;</span>$page<span style="">&#41;</span>,$parts<span style="">&#91;</span>$i<span style="">&#93;</span>,'title=&quot;'.$page.'&quot; class=&quot;wikilink2&quot; rel=&quot;nofollow&quot;'<span style="">&#41;</span>;
   <span style="">&#125;</span></pre></td></tr></table></div>

<p><b>UPD 3:</b><br />
Обсуждение патча на <a href="http://bugs.splitbrain.org/index.php?do=details&#038;task_id=1750">багзилле DokuWiki</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1433/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Sequoia изнутри #3</title>
		<link>http://sadko.xskernel.org/archives/1385</link>
		<comments>http://sadko.xskernel.org/archives/1385#comments</comments>
		<pubDate>Thu, 27 Aug 2009 14:46:01 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[Кодинг]]></category>
		<category><![CDATA[Одминское]]></category>
		<category><![CDATA[Свободное ПО]]></category>
		<category><![CDATA[Туториалы]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[c-jdbc]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[sequoia]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/?p=1385</guid>
		<description><![CDATA[Tweet Пролог В предыдущем посте я описал, на какие грабли пришлось наступить, чтобы заставить Sequoia создавать таблицы в RecoveryLog и запускать backends. Тем не менее, сама работа контроллера по-прежнему оставалась некорректной, и, как выяснилось, без правки исходников решить проблему никак не получалось. Ковыряем исходники Исходники Sequoia точно так же, как дистрибутив и документация, доступны на [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1385',
  title: 'Sequoia изнутри #3',
  description: 'Пролог\nВ предыдущем посте я описал, на какие грабли пришлось наступить, чтобы заставить Sequoia создавать таблицы в RecoveryLog и запускать backends. Тем не менее, сама работа контроллера по-прежнему оста...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1385"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="Sequoia &ETH;&cedil;&ETH;&middot;&ETH;&frac12;&Ntilde;&Ntilde;&Ntilde;&ETH;&cedil; #3" data-url="http://sadko.xskernel.org/archives/1385">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><h3>Пролог</h3>
<p>В <a href="http://sadko.xskernel.org/archives/1379">предыдущем посте</a> я описал, на какие грабли пришлось наступить, чтобы заставить Sequoia создавать таблицы в RecoveryLog и запускать backends. Тем не менее, сама работа контроллера по-прежнему оставалась некорректной, и, как выяснилось, без правки исходников решить проблему никак не получалось.<br />
<span id="more-1385"></span></p>
<h3>Ковыряем исходники</h3>
<p>Исходники Sequoia точно так же, как дистрибутив и документация, доступны <a href="http://www.continuent.com/community/lab-projects/sequoia">на официальном сайте</a>. После разархивации объём исходников меня разочаровал, я ожидал от подобной супер-системы большего числа файлов. Но не в количестве файлов суть.<br />
Ещё раз поглядев на генерируемое исключение, я дополз до проблемного кода в файле src/org/continuent/sequoia/controller/recoverylog/events/LogRequestEvent.java. Вот он:</p>
<pre>  <span style="color: #008000; font-weight: bold">public</span> <span style="color: #B00040">void</span> <span style="color: #0000FF">execute</span><span style="color: #666666">(</span>LoggerThread loggerThread<span style="color: #666666">,</span>
      RecoveryLogConnectionManager manager<span style="color: #666666">)</span>
  <span style="color: #666666">{</span>

    Trace logger <span style="color: #666666">=</span> loggerThread<span style="color: #666666">.</span><span style="color: #7D9029">getLogger</span><span style="color: #666666">();</span>
    <span style="color: #008000; font-weight: bold">try</span>
    <span style="color: #666666">{</span>
      <span style="color: #008000; font-weight: bold">if</span> <span style="color: #666666">(</span>logger<span style="color: #666666">.</span><span style="color: #7D9029">isDebugEnabled</span><span style="color: #666666">())</span>

        logger<span style="color: #666666">.</span><span style="color: #7D9029">debug</span><span style="color: #666666">(</span>Translate<span style="color: #666666">.</span><span style="color: #7D9029">get</span><span style="color: #666666">(</span><span style="color: #BA2121">&quot;recovery.jdbc.loggerthread.log.info&quot;</span><span style="color: #666666">,</span>
            logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getLogId</span><span style="color: #666666">()));</span>

      PreparedStatement pstmt <span style="color: #666666">=</span> manager<span style="color: #666666">.</span><span style="color: #7D9029">getLogPreparedStatement</span><span style="color: #666666">();</span>
      pstmt<span style="color: #666666">.</span><span style="color: #7D9029">setLong</span><span style="color: #666666">(</span>RecoveryLog<span style="color: #666666">.</span><span style="color: #7D9029">COLUMN_INDEX_LOG_ID</span><span style="color: #666666">,</span> logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getLogId</span><span style="color: #666666">());</span>

      pstmt<span style="color: #666666">.</span><span style="color: #7D9029">setString</span><span style="color: #666666">(</span>RecoveryLog<span style="color: #666666">.</span><span style="color: #7D9029">COLUMN_INDEX_VLOGIN</span><span style="color: #666666">,</span> logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getLogin</span><span style="color: #666666">());</span>
      pstmt<span style="color: #666666">.</span><span style="color: #7D9029">setString</span><span style="color: #666666">(</span>RecoveryLog<span style="color: #666666">.</span><span style="color: #7D9029">COLUMN_INDEX_SQL</span><span style="color: #666666">,</span> logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getQuery</span><span style="color: #666666">());</span>

      pstmt<span style="color: #666666">.</span><span style="color: #7D9029">setString</span><span style="color: #666666">(</span>RecoveryLog<span style="color: #666666">.</span><span style="color: #7D9029">COLUMN_INDEX_SQL_PARAMS</span><span style="color: #666666">,</span> logEntry
          <span style="color: #666666">.</span><span style="color: #7D9029">getQueryParams</span><span style="color: #666666">());</span>
      pstmt<span style="color: #666666">.</span><span style="color: #7D9029">setString</span><span style="color: #666666">(</span>RecoveryLog<span style="color: #666666">.</span><span style="color: #7D9029">COLUMN_INDEX_AUTO_CONN_TRAN</span><span style="color: #666666">,</span> logEntry
          <span style="color: #666666">.</span><span style="color: #7D9029">getAutoConnTrans</span><span style="color: #666666">());</span>

      pstmt<span style="color: #666666">.</span><span style="color: #7D9029">setLong</span><span style="color: #666666">(</span>RecoveryLog<span style="color: #666666">.</span><span style="color: #7D9029">COLUMN_INDEX_TRANSACTION_ID</span><span style="color: #666666">,</span> logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getTid</span><span style="color: #666666">());</span>
      pstmt<span style="color: #666666">.</span><span style="color: #7D9029">setLong</span><span style="color: #666666">(</span>RecoveryLog<span style="color: #666666">.</span><span style="color: #7D9029">COLUMN_INDEX_REQUEST_ID</span><span style="color: #666666">,</span> logEntry
          <span style="color: #666666">.</span><span style="color: #7D9029">getRequestId</span><span style="color: #666666">());</span>

      pstmt<span style="color: #666666">.</span><span style="color: #7D9029">setString</span><span style="color: #666666">(</span>RecoveryLog<span style="color: #666666">.</span><span style="color: #7D9029">COLUMN_INDEX_EXEC_STATUS</span><span style="color: #666666">,</span> logEntry
          <span style="color: #666666">.</span><span style="color: #7D9029">getExecutionStatus</span><span style="color: #666666">());</span>
      pstmt<span style="color: #666666">.</span><span style="color: #7D9029">setLong</span><span style="color: #666666">(</span>RecoveryLog<span style="color: #666666">.</span><span style="color: #7D9029">COLUMN_INDEX_EXEC_TIME</span><span style="color: #666666">,</span> logEntry
          <span style="color: #666666">.</span><span style="color: #7D9029">getExecutionTimeInMs</span><span style="color: #666666">());</span>

      pstmt<span style="color: #666666">.</span><span style="color: #7D9029">setLong</span><span style="color: #666666">(</span>RecoveryLog<span style="color: #666666">.</span><span style="color: #7D9029">COLUMN_INDEX_UPDATE_COUNT</span><span style="color: #666666">,</span> logEntry
          <span style="color: #666666">.</span><span style="color: #7D9029">getUpdateCountResult</span><span style="color: #666666">());</span>

      <span style="color: #008000; font-weight: bold">if</span> <span style="color: #666666">(</span>logger<span style="color: #666666">.</span><span style="color: #7D9029">isDebugEnabled</span><span style="color: #666666">())</span>

        logger<span style="color: #666666">.</span><span style="color: #7D9029">debug</span><span style="color: #666666">(</span>pstmt<span style="color: #666666">.</span><span style="color: #7D9029">toString</span><span style="color: #666666">());</span>
      <span style="color: #008000; font-weight: bold">try</span>
      <span style="color: #666666">{</span>
        pstmt<span style="color: #666666">.</span><span style="color: #7D9029">setEscapeProcessing</span><span style="color: #666666">(</span>logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getEscapeProcessing</span><span style="color: #666666">());</span>

      <span style="color: #666666">}</span>
      <span style="color: #008000; font-weight: bold">catch</span> <span style="color: #666666">(</span>Exception ignore<span style="color: #666666">)</span>
      <span style="color: #666666">{</span>
      <span style="color: #666666">}</span>
      <span style="color: #408080; font-style: italic">// Здесь бросается исключение:</span>

      <span style="color: #B00040">int</span> updatedRows <span style="color: #666666">=</span> pstmt<span style="color: #666666">.</span><span style="color: #7D9029">executeUpdate</span><span style="color: #666666">();</span>
      <span style="color: #008000; font-weight: bold">if</span> <span style="color: #666666">((</span>updatedRows <span style="color: #666666">!=</span> <span style="color: #666666">1)</span> <span style="color: #666666">&amp;&amp;</span> logger<span style="color: #666666">.</span><span style="color: #7D9029">isWarnEnabled</span><span style="color: #666666">())</span>

        logger
            <span style="color: #666666">.</span><span style="color: #7D9029">warn</span><span style="color: #666666">(</span><span style="color: #BA2121">&quot;Recovery log did not update a single entry while executing: &quot;</span>
                <span style="color: #666666">+</span> pstmt<span style="color: #666666">.</span><span style="color: #7D9029">toString</span><span style="color: #666666">());</span>
    <span style="color: #666666">}</span>

    <span style="color: #008000; font-weight: bold">catch</span> <span style="color: #666666">(</span>SQLException e<span style="color: #666666">)</span>
    <span style="color: #666666">{</span>
      manager<span style="color: #666666">.</span><span style="color: #7D9029">invalidate</span><span style="color: #666666">();</span>
      <span style="color: #008000; font-weight: bold">if</span> <span style="color: #666666">(</span><span style="color: #BA2121">&quot;T&quot;</span><span style="color: #666666">.</span><span style="color: #7D9029">equals</span><span style="color: #666666">(</span>logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getAutoConnTrans</span><span style="color: #666666">()))</span>

        logger<span style="color: #666666">.</span><span style="color: #7D9029">error</span><span style="color: #666666">(</span>Translate<span style="color: #666666">.</span><span style="color: #7D9029">get</span><span style="color: #666666">(</span>
            <span style="color: #BA2121">&quot;recovery.jdbc.loggerthread.log.failed.transaction&quot;</span><span style="color: #666666">,</span> <span style="color: #008000; font-weight: bold">new</span> String<span style="color: #666666">[]{</span>

                logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getQuery</span><span style="color: #666666">(),</span> String<span style="color: #666666">.</span><span style="color: #7D9029">valueOf</span><span style="color: #666666">(</span>logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getTid</span><span style="color: #666666">())}),</span> e<span style="color: #666666">);</span>

      <span style="color: #008000; font-weight: bold">else</span>
        logger<span style="color: #666666">.</span><span style="color: #7D9029">error</span><span style="color: #666666">(</span>Translate<span style="color: #666666">.</span><span style="color: #7D9029">get</span><span style="color: #666666">(</span><span style="color: #BA2121">&quot;recovery.jdbc.loggerthread.log.failed&quot;</span><span style="color: #666666">,</span>
            logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getQuery</span><span style="color: #666666">()),</span> e<span style="color: #666666">);</span>

      <span style="color: #408080; font-style: italic">// Push object back in the queue, it needs to be logged again</span>
      loggerThread<span style="color: #666666">.</span><span style="color: #7D9029">putBackAtHeadOfQueue</span><span style="color: #666666">(</span><span style="color: #008000; font-weight: bold">this</span><span style="color: #666666">,</span> e<span style="color: #666666">);</span>
    <span style="color: #666666">}</span>

  <span style="color: #666666">}</span>
</pre>
<p>От этого кода я и стал плясать, в результате чего всё-таки смог найти место, где можно выплюнуть создаваемое SQL-выражение. Дело осталось за небольшим &#8212; скомпилить исходники.</p>
<h3>Сборка Sequoia</h3>
<p>Сборка, в принципе, несложна и выполняется через Ant. Но предварительно следовало сконфигурировать файл build.properties, в котором я прописал версию используемой JDK &#8212; 1.5:</p>
<pre>
javac.target = 1.5
javac.source = 1.5
</pre>
<p>После этого, немного поизучав build.xml, я запустил в shell следующую команду:</p>
<pre>
ant clean &#038;&#038; ant jar
</pre>
<p>Исходники собрались (правда, с ворнингами, ARGH!!!), и у меня на руках уже были новые JAR, которые я и подпихнул взамен штатных.</p>
<h3>Патчинг</h3>
<p>После перезапуска контроллера пропатченный код выплюнул в лог SQL-выражения, используемые для вставки/обновления данных RecoveryLog:</p>
<pre>
2009-08-26 19:17:25,368 DEBUG sequoia.controller.recoverylog Insert statement: INSERT INTO T_RECOVERY VALUES(?,?,?,?,?,?,?,?,?,?)
2009-08-26 19:17:25,372 DEBUG sequoia.controller.recoverylog Update statement: UPDATE T_RECOVERY SET exec_status=?,update_count=?,exec_time=? WHERE log_id=?
</pre>
<p>Синтаксис INSERT-выражения меня просто убил, так как в нём не учтено, что поля могут поменяться местами. Потратив час на модификацию кода, я, в конце-концов, пропатчил создаваемые SQL-выражения, а также добавил отладочную инфу к проблемной функции в файле src/org/continuent/sequoia/controller/recoverylog/events/LogRequestEvent.java:</p>
<pre>  <span style="color: #008000; font-weight: bold">public</span> <span style="color: #B00040">void</span> <span style="color: #0000FF">execute</span><span style="color: #666666">(</span>LoggerThread loggerThread<span style="color: #666666">,</span>
      RecoveryLogConnectionManager manager<span style="color: #666666">)</span>
  <span style="color: #666666">{</span>

    Trace logger <span style="color: #666666">=</span> loggerThread<span style="color: #666666">.</span><span style="color: #7D9029">getLogger</span><span style="color: #666666">();</span>
    <span style="color: #008000; font-weight: bold">try</span>
    <span style="color: #666666">{</span>
      <span style="color: #008000; font-weight: bold">if</span> <span style="color: #666666">(</span>logger<span style="color: #666666">.</span><span style="color: #7D9029">isDebugEnabled</span><span style="color: #666666">())</span>

        logger<span style="color: #666666">.</span><span style="color: #7D9029">debug</span><span style="color: #666666">(</span>Translate<span style="color: #666666">.</span><span style="color: #7D9029">get</span><span style="color: #666666">(</span><span style="color: #BA2121">&quot;recovery.jdbc.loggerthread.log.info&quot;</span><span style="color: #666666">,</span>
            logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getLogId</span><span style="color: #666666">()));</span>

      PreparedStatement pstmt <span style="color: #666666">=</span> manager<span style="color: #666666">.</span><span style="color: #7D9029">getLogPreparedStatement</span><span style="color: #666666">();</span>

      pstmt<span style="color: #666666">.</span><span style="color: #7D9029">setLong</span><span style="color: #666666">(</span>RecoveryLog<span style="color: #666666">.</span><span style="color: #7D9029">COLUMN_INDEX_LOG_ID</span><span style="color: #666666">,</span> logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getLogId</span><span style="color: #666666">());</span>

      <span style="color: #008000; font-weight: bold">if</span> <span style="color: #666666">(</span>logger<span style="color: #666666">.</span><span style="color: #7D9029">isDebugEnabled</span><span style="color: #666666">())</span>
        logger<span style="color: #666666">.</span><span style="color: #7D9029">debug</span><span style="color: #666666">(</span><span style="color: #BA2121">&quot;logID = &quot;</span> <span style="color: #666666">+</span> logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getLogId</span><span style="color: #666666">());</span>

      pstmt<span style="color: #666666">.</span><span style="color: #7D9029">setString</span><span style="color: #666666">(</span>RecoveryLog<span style="color: #666666">.</span><span style="color: #7D9029">COLUMN_INDEX_VLOGIN</span><span style="color: #666666">,</span> logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getLogin</span><span style="color: #666666">());</span>
      <span style="color: #008000; font-weight: bold">if</span> <span style="color: #666666">(</span>logger<span style="color: #666666">.</span><span style="color: #7D9029">isDebugEnabled</span><span style="color: #666666">())</span>

        logger<span style="color: #666666">.</span><span style="color: #7D9029">debug</span><span style="color: #666666">(</span><span style="color: #BA2121">&quot;login = &quot;</span> <span style="color: #666666">+</span> logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getLogin</span><span style="color: #666666">());</span>
      pstmt<span style="color: #666666">.</span><span style="color: #7D9029">setString</span><span style="color: #666666">(</span>RecoveryLog<span style="color: #666666">.</span><span style="color: #7D9029">COLUMN_INDEX_SQL</span><span style="color: #666666">,</span> logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getQuery</span><span style="color: #666666">());</span>

      <span style="color: #008000; font-weight: bold">if</span> <span style="color: #666666">(</span>logger<span style="color: #666666">.</span><span style="color: #7D9029">isDebugEnabled</span><span style="color: #666666">())</span>
        logger<span style="color: #666666">.</span><span style="color: #7D9029">debug</span><span style="color: #666666">(</span><span style="color: #BA2121">&quot;query = &quot;</span> <span style="color: #666666">+</span> logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getQuery</span><span style="color: #666666">());</span>

      pstmt<span style="color: #666666">.</span><span style="color: #7D9029">setString</span><span style="color: #666666">(</span>RecoveryLog<span style="color: #666666">.</span><span style="color: #7D9029">COLUMN_INDEX_SQL_PARAMS</span><span style="color: #666666">,</span> logEntry
          <span style="color: #666666">.</span><span style="color: #7D9029">getQueryParams</span><span style="color: #666666">());</span>
      <span style="color: #008000; font-weight: bold">if</span> <span style="color: #666666">(</span>logger<span style="color: #666666">.</span><span style="color: #7D9029">isDebugEnabled</span><span style="color: #666666">())</span>

        logger<span style="color: #666666">.</span><span style="color: #7D9029">debug</span><span style="color: #666666">(</span><span style="color: #BA2121">&quot;queryParams = &quot;</span> <span style="color: #666666">+</span> logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getQueryParams</span><span style="color: #666666">());</span>
      pstmt<span style="color: #666666">.</span><span style="color: #7D9029">setString</span><span style="color: #666666">(</span>RecoveryLog<span style="color: #666666">.</span><span style="color: #7D9029">COLUMN_INDEX_AUTO_CONN_TRAN</span><span style="color: #666666">,</span> logEntry
          <span style="color: #666666">.</span><span style="color: #7D9029">getAutoConnTrans</span><span style="color: #666666">());</span>

      <span style="color: #008000; font-weight: bold">if</span> <span style="color: #666666">(</span>logger<span style="color: #666666">.</span><span style="color: #7D9029">isDebugEnabled</span><span style="color: #666666">())</span>
        logger<span style="color: #666666">.</span><span style="color: #7D9029">debug</span><span style="color: #666666">(</span><span style="color: #BA2121">&quot;autoConnTrans = &quot;</span> <span style="color: #666666">+</span> logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getAutoConnTrans</span><span style="color: #666666">());</span>

      pstmt<span style="color: #666666">.</span><span style="color: #7D9029">setLong</span><span style="color: #666666">(</span>RecoveryLog<span style="color: #666666">.</span><span style="color: #7D9029">COLUMN_INDEX_TRANSACTION_ID</span><span style="color: #666666">,</span> logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getTid</span><span style="color: #666666">());</span>
      <span style="color: #008000; font-weight: bold">if</span> <span style="color: #666666">(</span>logger<span style="color: #666666">.</span><span style="color: #7D9029">isDebugEnabled</span><span style="color: #666666">())</span>

        logger<span style="color: #666666">.</span><span style="color: #7D9029">debug</span><span style="color: #666666">(</span><span style="color: #BA2121">&quot;transactionID = &quot;</span> <span style="color: #666666">+</span> logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getTid</span><span style="color: #666666">());</span>
      pstmt<span style="color: #666666">.</span><span style="color: #7D9029">setLong</span><span style="color: #666666">(</span>RecoveryLog<span style="color: #666666">.</span><span style="color: #7D9029">COLUMN_INDEX_REQUEST_ID</span><span style="color: #666666">,</span> logEntry
          <span style="color: #666666">.</span><span style="color: #7D9029">getRequestId</span><span style="color: #666666">());</span>

      <span style="color: #008000; font-weight: bold">if</span> <span style="color: #666666">(</span>logger<span style="color: #666666">.</span><span style="color: #7D9029">isDebugEnabled</span><span style="color: #666666">())</span>
        logger<span style="color: #666666">.</span><span style="color: #7D9029">debug</span><span style="color: #666666">(</span><span style="color: #BA2121">&quot;RequestID = &quot;</span> <span style="color: #666666">+</span> logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getRequestId</span><span style="color: #666666">());</span>

      pstmt<span style="color: #666666">.</span><span style="color: #7D9029">setString</span><span style="color: #666666">(</span>RecoveryLog<span style="color: #666666">.</span><span style="color: #7D9029">COLUMN_INDEX_EXEC_STATUS</span><span style="color: #666666">,</span> logEntry
          <span style="color: #666666">.</span><span style="color: #7D9029">getExecutionStatus</span><span style="color: #666666">());</span>
      <span style="color: #008000; font-weight: bold">if</span> <span style="color: #666666">(</span>logger<span style="color: #666666">.</span><span style="color: #7D9029">isDebugEnabled</span><span style="color: #666666">())</span>

        logger<span style="color: #666666">.</span><span style="color: #7D9029">debug</span><span style="color: #666666">(</span><span style="color: #BA2121">&quot;executionStatus = &quot;</span> <span style="color: #666666">+</span> logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getExecutionStatus</span><span style="color: #666666">());</span>
      pstmt<span style="color: #666666">.</span><span style="color: #7D9029">setLong</span><span style="color: #666666">(</span>RecoveryLog<span style="color: #666666">.</span><span style="color: #7D9029">COLUMN_INDEX_EXEC_TIME</span><span style="color: #666666">,</span> logEntry
          <span style="color: #666666">.</span><span style="color: #7D9029">getExecutionTimeInMs</span><span style="color: #666666">());</span>

      <span style="color: #008000; font-weight: bold">if</span> <span style="color: #666666">(</span>logger<span style="color: #666666">.</span><span style="color: #7D9029">isDebugEnabled</span><span style="color: #666666">())</span>
        logger<span style="color: #666666">.</span><span style="color: #7D9029">debug</span><span style="color: #666666">(</span><span style="color: #BA2121">&quot;executionTimeMs = &quot;</span> <span style="color: #666666">+</span> logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getExecutionTimeInMs</span><span style="color: #666666">());</span>

      pstmt<span style="color: #666666">.</span><span style="color: #7D9029">setLong</span><span style="color: #666666">(</span>RecoveryLog<span style="color: #666666">.</span><span style="color: #7D9029">COLUMN_INDEX_UPDATE_COUNT</span><span style="color: #666666">,</span> logEntry
          <span style="color: #666666">.</span><span style="color: #7D9029">getUpdateCountResult</span><span style="color: #666666">());</span>
      <span style="color: #008000; font-weight: bold">if</span> <span style="color: #666666">(</span>logger<span style="color: #666666">.</span><span style="color: #7D9029">isDebugEnabled</span><span style="color: #666666">())</span>

        logger<span style="color: #666666">.</span><span style="color: #7D9029">debug</span><span style="color: #666666">(</span><span style="color: #BA2121">&quot;updateCount = &quot;</span> <span style="color: #666666">+</span> logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getUpdateCountResult</span><span style="color: #666666">());</span>

      <span style="color: #008000; font-weight: bold">if</span> <span style="color: #666666">(</span>logger<span style="color: #666666">.</span><span style="color: #7D9029">isDebugEnabled</span><span style="color: #666666">())</span>

        logger<span style="color: #666666">.</span><span style="color: #7D9029">debug</span><span style="color: #666666">(</span>pstmt<span style="color: #666666">.</span><span style="color: #7D9029">toString</span><span style="color: #666666">());</span>
      <span style="color: #008000; font-weight: bold">try</span>
      <span style="color: #666666">{</span>
        pstmt<span style="color: #666666">.</span><span style="color: #7D9029">setEscapeProcessing</span><span style="color: #666666">(</span>logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getEscapeProcessing</span><span style="color: #666666">());</span>

      <span style="color: #666666">}</span>
      <span style="color: #008000; font-weight: bold">catch</span> <span style="color: #666666">(</span>Exception ignore<span style="color: #666666">)</span>
      <span style="color: #666666">{</span>
      <span style="color: #666666">}</span>

      <span style="color: #B00040">int</span> updatedRows <span style="color: #666666">=</span> pstmt<span style="color: #666666">.</span><span style="color: #7D9029">executeUpdate</span><span style="color: #666666">();</span>
      <span style="color: #008000; font-weight: bold">if</span> <span style="color: #666666">((</span>updatedRows <span style="color: #666666">!=</span> <span style="color: #666666">1)</span> <span style="color: #666666">&amp;&amp;</span> logger<span style="color: #666666">.</span><span style="color: #7D9029">isWarnEnabled</span><span style="color: #666666">())</span>

        logger
            <span style="color: #666666">.</span><span style="color: #7D9029">warn</span><span style="color: #666666">(</span><span style="color: #BA2121">&quot;Recovery log did not update a single entry while executing: &quot;</span>
                <span style="color: #666666">+</span> pstmt<span style="color: #666666">.</span><span style="color: #7D9029">toString</span><span style="color: #666666">());</span>
    <span style="color: #666666">}</span>

    <span style="color: #008000; font-weight: bold">catch</span> <span style="color: #666666">(</span>SQLException e<span style="color: #666666">)</span>
    <span style="color: #666666">{</span>
      manager<span style="color: #666666">.</span><span style="color: #7D9029">invalidate</span><span style="color: #666666">();</span>
      <span style="color: #008000; font-weight: bold">if</span> <span style="color: #666666">(</span><span style="color: #BA2121">&quot;T&quot;</span><span style="color: #666666">.</span><span style="color: #7D9029">equals</span><span style="color: #666666">(</span>logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getAutoConnTrans</span><span style="color: #666666">()))</span>

        logger<span style="color: #666666">.</span><span style="color: #7D9029">error</span><span style="color: #666666">(</span>Translate<span style="color: #666666">.</span><span style="color: #7D9029">get</span><span style="color: #666666">(</span>
            <span style="color: #BA2121">&quot;recovery.jdbc.loggerthread.log.failed.transaction&quot;</span><span style="color: #666666">,</span> <span style="color: #008000; font-weight: bold">new</span> String<span style="color: #666666">[]{</span>

                logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getQuery</span><span style="color: #666666">(),</span> String<span style="color: #666666">.</span><span style="color: #7D9029">valueOf</span><span style="color: #666666">(</span>logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getTid</span><span style="color: #666666">())}),</span> e<span style="color: #666666">);</span>

      <span style="color: #008000; font-weight: bold">else</span>
        logger<span style="color: #666666">.</span><span style="color: #7D9029">error</span><span style="color: #666666">(</span>Translate<span style="color: #666666">.</span><span style="color: #7D9029">get</span><span style="color: #666666">(</span><span style="color: #BA2121">&quot;recovery.jdbc.loggerthread.log.failed&quot;</span><span style="color: #666666">,</span>
            logEntry<span style="color: #666666">.</span><span style="color: #7D9029">getQuery</span><span style="color: #666666">()),</span> e<span style="color: #666666">);</span>

      <span style="color: #408080; font-style: italic">// Push object back in the queue, it needs to be logged again</span>
      loggerThread<span style="color: #666666">.</span><span style="color: #7D9029">putBackAtHeadOfQueue</span><span style="color: #666666">(</span><span style="color: #008000; font-weight: bold">this</span><span style="color: #666666">,</span> e<span style="color: #666666">);</span>
    <span style="color: #666666">}</span>

  <span style="color: #666666">}</span>
</pre>
<p>Ряд исключений сразу исчез. Тем не менее, остались ещё проблемы, которые были исправлены только за счёт комментирования этих строчек кода:</p>
<pre><span style="color: #408080; font-style: italic">/*      try</span>
<span style="color: #408080; font-style: italic">      {</span>
<span style="color: #408080; font-style: italic">        pstmt.setEscapeProcessing(logEntry.getEscapeProcessing());</span>
<span style="color: #408080; font-style: italic">      }</span>
<span style="color: #408080; font-style: italic">      catch (Exception ignore)</span>

<span style="color: #408080; font-style: italic">      {</span>
<span style="color: #408080; font-style: italic">      }*/</span>
</pre>
<p>Только после этого и очередной, N-надцатой пересборки пакетов перезапускаемый контроллер перестал ругаться на вставку и выборку данных при прогонке теста. Краш тест?</p>
<h3>Краш-тест (leightweight version)</h3>
<p>В качестве leightweight-теста я решил воспользоваться Sequoia Console и вырубить второй backend:</p>
<pre>
CJDBC(admin) > disable oracle02
Disabling backend oracle02 with automatic checkpoint.
</pre>
<p>Прогнав тест, я убедился, что в первую базу запись была вставлена, а в отключенную &#8212; нет. При чём, содержимое Recovery Log пополнилось записями:</p>
<pre>
LOG_ID                 VLOGIN                                                           SQL_QUERY                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        SQL_QUERY_PARAM                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  AUTO_CONN_TRAN TRANSACTION_ID         REQUEST_ID             EXEC_STATUS EXEC_TIME              UPDATE_COUNT
---------------------- ---------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------- ---------------------- ---------------------- ----------- ---------------------- ----------------------
1                      user                                                             begin                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             T              0                      0                      S           0                      -1
2                      user                                                             INSERT INTO Tm_First (nID, strMessage, nCode) VALUES (?, ?, ?)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   <!%I|666|!%><!%S|Hello, World!|!%><!%I|13|!%>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    T              0                      0                      S           118                    1
3                      user                                                             commit                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            T              0                      0                      S           0                      0
4                      user                                                             rollback                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          T              1                      0                      S           0                      0
</pre>
<p>Что ж, впечатляет! Попробуем заново поднять backend:</p>
<pre>
CJDBC(admin) > enable oracle02
Enabling backend oracle02 from its last known checkpoint
</pre>
<p>После некоторых раздумий и логописательств, контроллер-таки остановился, и я убедился, что недостающая запись во второй базе появилась. Только это никак не ура, возвращаемся к краш-тестам.</p>
<h3>Краш-тест (hardcore version)</h3>
<p>Что ж, этот краш-тест, как и в предыдущих случаях, заключался в блокировке пользователя и обрубании коннекций с последующим запуском теста.<br />
Что же в результате? В RecoveryLog появилась запись о вставке, и в первый backend запись была вставлена. Я, было, обрадовался такому положению дел и разлочил пользовательскую учётку, что не вызвало никакой реакции со стороны контроллера. Последующие запуски теста не накладывали никаких отпечатков на вторую доступную базу.<br />
Тогда я решил перезапустить backend через консоль:</p>
<pre>
CJDBC(admin) > disable oracle02
Disabling backend oracle02 with automatic checkpoint.
CJDBC(admin) > enable oracle02
Enabling backend oracle02 from its last known checkpoint
Cannot enable backend oracle02 from a known state. Resynchronize this backend by restoring a dump.
</pre>
<p>Оппаньки! Это, значит, после временной потери коннекта я должен восстанавливать базу из бэкапа? Что за бред!!!</p>
<p>В поисках лекарства решил заглянуть в Administration Guide, но там нашёл инфу только про дампы.</p>
<h3>Резюме</h3>
<p>Фу и фи. Чем больше ковыряюсь в этой софтине, тем больше убеждаюсь в её реальной непродуманности и ненадёжности. Может быть, я чего-то упускаю, но за эти четыре дня у меня уже порой лезут глаза на лоб от её выходок. Больше всего поражают танцы с бубном вокруг, казалось бы, простых вещей. В общем, завтра ещё поковыряюсь с ней, может всё-таки докопаюсь до истины.</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1385/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sequoia изнутри #2</title>
		<link>http://sadko.xskernel.org/archives/1379</link>
		<comments>http://sadko.xskernel.org/archives/1379#comments</comments>
		<pubDate>Thu, 27 Aug 2009 13:19:02 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[Кодинг]]></category>
		<category><![CDATA[Одминское]]></category>
		<category><![CDATA[Туториалы]]></category>
		<category><![CDATA[c-jdbc]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[log4j]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[sequoia]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/?p=1379</guid>
		<description><![CDATA[Tweet Введение Собственно, после первой неудачи с RAIDb1, изложенной в этом посте, я решил воспользоваться такой фичей, как RecoveryLog. Для этого ещё раз перечитывал туториал по созданию виртуальной БД. RecoveryLog Что ж, для того, чтобы запустить RecoveryLog, нужно чётко прописать параметры каждой таблицы, а также заиметь ещё одну базу. Но, если мы заимеем ещё одну [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1379',
  title: 'Sequoia изнутри #2',
  description: 'Введение\nСобственно, после первой неудачи с RAIDb1, изложенной в этом посте, я решил воспользоваться такой фичей, как RecoveryLog. Для этого ещё раз перечитывал туториал по созданию виртуальной БД.\n\nR...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1379"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="Sequoia &ETH;&cedil;&ETH;&middot;&ETH;&frac12;&Ntilde;&Ntilde;&Ntilde;&ETH;&cedil; #2" data-url="http://sadko.xskernel.org/archives/1379">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><h3>Введение</h3>
<p>Собственно, после первой неудачи с RAIDb1, изложенной <a href="http://sadko.xskernel.org/archives/1365">в этом посте</a>, я решил воспользоваться такой фичей, как RecoveryLog. Для этого ещё раз перечитывал туториал по созданию виртуальной БД.<br />
<span id="more-1379"></span></p>
<h3>RecoveryLog</h3>
<p>Что ж, для того, чтобы запустить RecoveryLog, нужно чётко прописать параметры каждой таблицы, а также заиметь ещё одну базу. Но, если мы заимеем ещё одну базу, надёжность такой системы резко снижается, так как в случае отказа RecoveryLog всё накрывается медным тазом. Как вариант, разработчики Sequoia предлагают создать для RecoveryLog отдельную виртуальную базу, объединённую&#8230; в RAIDb1! Это, получается, матрёшка в матрёшке. Поэтому такой бредятины я делать не стал, а просто-напросто создал в первой базе дополнительную схему (ну не было у меня ещё одного сервера БД), а вторую базу оставил под краш-тесты. Согласно заверениям разработчиков:</p>
<blockquote><p>The C-JDBC Recovery Log stores write queries and transactions between logical checkpoints defined by the user. The log can be only be stored in a database (or cluster of databases) using a JDBCRecoveryLog element.</p>
<p>The JDBCRecoveryLog stores the recovery information in a database. To access this database, you must provide the driver class name to load (driver), an optional jar file or directory where to find the class to load (driverPath), the JDBC url to access the database as well as a valid login/password.</p>
<p>A timeout in seconds can be defined for the sql requests. If no value is given, the default timeout is set to 60 seconds. Warning! 0 means no timeout and wait forever until completion.
</p></blockquote>
<p>Вроде бы, всё понятно. То есть, я теперь должен описать все типы полей для таблиц, чем я кропотливо и занялся.</p>
<h3>Грабли как они есть</h3>
<p>Для экономии времени я скопировал пример из каталога config и прописал вместо указанных типов соответствующие им типы ORACLE. После этого я запустил систему, контроллер стартовал и, вроде бы, в лог никаких исключений не сыпалось, я решил запустить тест (см. предыдущий пост), который повис на коннекте, потому что контроллер почему-то не поднял ни одного backend. Что за ерунда?<br />
После получаса гугления я-таки выполз на вот эту страничку:<br />
<a href="http://blogs.sun.com/JagadishPrasath/entry/using_sequoia_with_glassfish">Using Sequoia with GlassFish</a>.<br />
Собственно, оттуда почерпал сакральные знания о том, что нужно воспользоваться консолью, прилагаемой к дистрибутиву.</p>
<h3>Sequoia controller console</h3>
<p>Консоль запускается shell-скриптом из каталога bin, имеет гламурный вид (используются цветастые надписи). Примерно так:</p>
<pre>
sadovnikov:/opt/sequoia # bin/console.sh
Launching the Sequoia controller console
Initializing Controller module...
Initializing VirtualDatabase Administration module...
Initializing SQL Console module...
Sequoia driver (Sequoia core v2.10.10) successfully loaded.
localhost:1090 >
</pre>
<p>При этом, контроллер тоже должен быть запущен.<br />
Далее надо указать, какую виртуальную базу мы хотим админить:</p>
<pre>
localhost:1090 > admin CJDBC
Virtual database Administrator Login > admin
Virtual database Administrator Password >
Ready to administrate virtual database CJDBC
</pre>
<p>Для того, чтобы вся эта дребедень заработала, надо проинициализировать каждый backend:</p>
<pre>
CJDBC(admin) > initialize oracle01 force
Virtual Database CJDBC has been successfully initialized from backend oracle01
CJDBC(admin) > initialize oracle02 force
Virtual Database CJDBC has been successfully initialized from backend oracle02
</pre>
<p>После этого надо стартануть backends:</p>
<pre>
CJDBC(admin) > enable oracle01
Enabling backend oracle01 from its last known checkpoint
CJDBC(admin) > enable oracle02
Enabling backend oracle02 from its last known checkpoint
CJDBC(admin) >
</pre>
<p>Всё бы хорошо, но вот на включение backend система посыпала кучу исключений, потому что в примерах были описаны типы не для всех колонок.</p>
<h3>Мытарства с описанием RecoveryLog</h3>
<p>Скрипя сердцем я взял документацию и стал построчно сравнивать каждый параметр с целью поиска недостающих описаний колонок таблицы. После добавления недостающих колонок и присваивания им соответствующих типов я снова попытался поднять backend и&#8230; облом. Оказывается, даже в доках были описаны не все поля и требуемые для них типы. Вспомнив, что Sequoia использует для ведения логов <b>log4j</b>, полез в конфигу log4j.properties, где заменил строчку:<br />
<code>log4j.logger.org.continuent.sequoia.controller.recoverylog=INFO, Console,Filetrace</code><br />
На следующую:<br />
<code>log4j.logger.org.continuent.sequoia.controller.recoverylog=ALL, Console,Filetrace</code><br />
Вычислить, для кого нужно было включить логи, было несложно, так как в Stack Trace выплёвываемого исключения было написано, какой класс какого пакета его вызывал.<br />
Это мне сильно помогло, так как в лог стали писаться SQL Statements, используемые backend&#8217;ом для создания таблиц Recovery Log. Вот их пример:</p>
<pre>
2009-08-26 17:21:50,679 DEBUG sequoia.controller.recoverylog Log table create statement: CREATE TABLE RECOVERY (log_id INTEGER NOT NULL ENABLE,vlogin VARCHAR2(32) NOT NULL,sql VARCHAR2(32) NOT NULL,sql_param VARCHAR,auto_conn_tran NUMBER NOT NULL,transaction_id INTEGER NOT NULL,request_id INTEGER,exec_status NUMBER NOT NULL,exec_time INTEGER,update_count NUMBER, CONSTRAINT RECOVERY_PK PRIMARY KEY (log_id))
2009-08-26 17:21:50,681 DEBUG sequoia.controller.recoverylog Checkpoint table create statement: CREATE TABLE CHECKPOINT (name VARCHAR2(64) NOT NULL,log_id INTEGER, CONSTRAINT CHECKPOINT_PK PRIMARY KEY (name))
2009-08-26 17:21:50,682 DEBUG sequoia.controller.recoverylog Backend table create statement: CREATE TABLE BACKEND (database_name VARCHAR2(32) NOT NULL, backend_name VARCHAR2(32) NOT NULL,backend_state INTEGER, checkpoint_name VARCHAR2(32) NOT NULL )
2009-08-26 17:21:50,684 DEBUG sequoia.controller.recoverylog Dump table create statement: CREATE TABLE DUMP (dump_name VARCHAR2(32) NOT NULL,dump_date TIMESTAMP(6),dump_path VARCHAR2(64) NOT NULL,dump_format VARCHAR2(64) NOT NULL,checkpoint_name VARCHAR2(64) NOT NULL,backend_name VARCHAR2(64) NOT NULL,tables VARCHAR2(64) NOT NULL)
</pre>
<p>Только благодаря этому логу я смог выяснить, почему SQL statement у меня не прошёл (оказывается, ВНЕЗАПНО вылез тип VARCHAR для поля, которое не было описано в доке). Стыдно, господа-разработчики!</p>
<h3>Итоговый конфиг???</h3>
<p>После мытарств с конфигом я в конце-концов получил следующий конфиг контроллера:</p>
<pre><span style="color: #BC7A00">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;</span>
<span style="color: #BC7A00">&lt;!DOCTYPE SEQUOIA-CONTROLLER PUBLIC &quot;-//Continuent//DTD SEQUOIA-CONTROLLER 2.10.10//EN&quot;  &quot;http://sequoia.continuent.org/dtds/sequoia-controller-2.10.10.dtd&quot;&gt;</span>
<span style="color: #008000; font-weight: bold">&lt;SEQUOIA-CONTROLLER&gt;</span>

  <span style="color: #008000; font-weight: bold">&lt;Controller</span> <span style="color: #7D9029">port=</span><span style="color: #BA2121">&quot;25322&quot;</span><span style="color: #008000; font-weight: bold">&gt;</span>
    <span style="color: #008000; font-weight: bold">&lt;Report</span> <span style="color: #7D9029">hideSensitiveData=</span><span style="color: #BA2121">&quot;true&quot;</span> <span style="color: #7D9029">generateOnShutdown=</span><span style="color: #BA2121">&quot;true&quot;</span> <span style="color: #7D9029">generateOnFatal=</span><span style="color: #BA2121">&quot;true&quot;</span> <span style="color: #7D9029">enableFileLogging=</span><span style="color: #BA2121">&quot;true&quot;</span> <span style="color: #008000; font-weight: bold">/&gt;</span>

    <span style="color: #008000; font-weight: bold">&lt;JmxSettings&gt;</span>
      <span style="color: #008000; font-weight: bold">&lt;RmiJmxAdaptor/&gt;</span>
    <span style="color: #008000; font-weight: bold">&lt;/JmxSettings&gt;</span>

    <span style="color: #008000; font-weight: bold">&lt;VirtualDatabase</span> <span style="color: #7D9029">configFile=</span><span style="color: #BA2121">&quot;/opt/sequoia/config/virtualdatabase/sequoia.xml&quot;</span> <span style="color: #7D9029">virtualDatabaseName=</span><span style="color: #BA2121">&quot;CJDBC&quot;</span> <span style="color: #7D9029">autoEnableBackends=</span><span style="color: #BA2121">&quot;true&quot;</span> <span style="color: #7D9029">checkpointName=</span><span style="color: #BA2121">&quot;cjdbc_checkpoint&quot;</span> <span style="color: #008000; font-weight: bold">/&gt;</span>

  <span style="color: #008000; font-weight: bold">&lt;/Controller&gt;</span>
<span style="color: #008000; font-weight: bold">&lt;/SEQUOIA-CONTROLLER&gt;</span>
</pre>
<p>И следующий конфиг виртуальной базы:</p>
<pre><span style="color: #BC7A00">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</span>
<span style="color: #BC7A00">&lt;!DOCTYPE SEQUOIA PUBLIC &quot;-//Continuent//DTD SEQUOIA 2.10.10//EN&quot; &quot;http://sequoia.continuent.org/dtds/sequoia-2.10.10.dtd&quot;&gt;</span>
<span style="color: #008000; font-weight: bold">&lt;SEQUOIA&gt;</span>

  <span style="color: #008000; font-weight: bold">&lt;VirtualDatabase</span> <span style="color: #7D9029">name=</span><span style="color: #BA2121">&quot;CJDBC&quot;</span> <span style="color: #7D9029">maxNbOfConnections=</span><span style="color: #BA2121">&quot;150&quot;</span> <span style="color: #7D9029">minNbOfThreads=</span><span style="color: #BA2121">&quot;40&quot;</span> <span style="color: #7D9029">maxNbOfThreads=</span><span style="color: #BA2121">&quot;150&quot;</span> <span style="color: #7D9029">sqlDumpLength=</span><span style="color: #BA2121">&quot;80&quot;</span> <span style="color: #008000; font-weight: bold">&gt;</span>

    <span style="color: #008000; font-weight: bold">&lt;AuthenticationManager&gt;</span>
      <span style="color: #008000; font-weight: bold">&lt;Admin&gt;</span>
        <span style="color: #008000; font-weight: bold">&lt;User</span> <span style="color: #7D9029">username=</span><span style="color: #BA2121">&quot;admin&quot;</span> <span style="color: #7D9029">password=</span><span style="color: #BA2121">&quot;sql&quot;</span><span style="color: #008000; font-weight: bold">/&gt;</span>
      <span style="color: #008000; font-weight: bold">&lt;/Admin&gt;</span>

      <span style="color: #008000; font-weight: bold">&lt;VirtualUsers&gt;</span>
        <span style="color: #008000; font-weight: bold">&lt;VirtualLogin</span> <span style="color: #7D9029">vLogin=</span><span style="color: #BA2121">&quot;user&quot;</span> <span style="color: #7D9029">vPassword=</span><span style="color: #BA2121">&quot;sql&quot;</span><span style="color: #008000; font-weight: bold">/&gt;</span>
      <span style="color: #008000; font-weight: bold">&lt;/VirtualUsers&gt;</span>
    <span style="color: #008000; font-weight: bold">&lt;/AuthenticationManager&gt;</span>

    <span style="color: #408080; font-style: italic">&lt;!--</span>
<span style="color: #408080; font-style: italic">        Here is a list (non-exhaustive) of backends that can be used with C-JDBC.</span>
<span style="color: #408080; font-style: italic">    --&gt;</span>

    <span style="color: #408080; font-style: italic">&lt;!-- Database # 1 --&gt;</span>
    <span style="color: #008000; font-weight: bold">&lt;DatabaseBackend</span> <span style="color: #7D9029">name=</span><span style="color: #BA2121">&quot;oracle01&quot;</span> <span style="color: #7D9029">driver=</span><span style="color: #BA2121">&quot;oracle.jdbc.OracleDriver&quot;</span> <span style="color: #7D9029">url=</span><span style="color: #BA2121">&quot;jdbc:oracle:thin:@192.168.0.140:1521:oracle&quot;</span> <span style="color: #7D9029">connectionTestStatement=</span><span style="color: #BA2121">&quot;select * from dual&quot;</span><span style="color: #008000; font-weight: bold">&gt;</span>

        <span style="color: #008000; font-weight: bold">&lt;DatabaseSchema</span> <span style="color: #7D9029">dynamicPrecision=</span><span style="color: #BA2121">&quot;table&quot;</span> <span style="color: #7D9029">gatherSystemTables=</span><span style="color: #BA2121">&quot;false&quot;</span> <span style="color: #008000; font-weight: bold">/&gt;</span>

        <span style="color: #008000; font-weight: bold">&lt;ConnectionManager</span> <span style="color: #7D9029">vLogin=</span><span style="color: #BA2121">&quot;user&quot;</span> <span style="color: #7D9029">rLogin=</span><span style="color: #BA2121">&quot;cjdbc&quot;</span> <span style="color: #7D9029">rPassword=</span><span style="color: #BA2121">&quot;cjdbc&quot;</span><span style="color: #008000; font-weight: bold">&gt;</span>

                <span style="color: #008000; font-weight: bold">&lt;VariablePoolConnectionManager</span> <span style="color: #7D9029">initPoolSize=</span><span style="color: #BA2121">&quot;10&quot;</span> <span style="color: #7D9029">minPoolSize=</span><span style="color: #BA2121">&quot;5&quot;</span> <span style="color: #7D9029">maxPoolSize=</span><span style="color: #BA2121">&quot;50&quot;</span> <span style="color: #7D9029">idleTimeout=</span><span style="color: #BA2121">&quot;180&quot;</span> <span style="color: #7D9029">waitTimeout=</span><span style="color: #BA2121">&quot;120&quot;</span><span style="color: #008000; font-weight: bold">/&gt;</span>

        <span style="color: #008000; font-weight: bold">&lt;/ConnectionManager&gt;</span>
    <span style="color: #008000; font-weight: bold">&lt;/DatabaseBackend&gt;</span>

    <span style="color: #408080; font-style: italic">&lt;!-- Database # 2 --&gt;</span>
    <span style="color: #008000; font-weight: bold">&lt;DatabaseBackend</span> <span style="color: #7D9029">name=</span><span style="color: #BA2121">&quot;oracle02&quot;</span> <span style="color: #7D9029">driver=</span><span style="color: #BA2121">&quot;oracle.jdbc.OracleDriver&quot;</span> <span style="color: #7D9029">url=</span><span style="color: #BA2121">&quot;jdbc:oracle:thin:@192.168.0.141:1521:oracle&quot;</span> <span style="color: #7D9029">connectionTestStatement=</span><span style="color: #BA2121">&quot;select * from dual&quot;</span><span style="color: #008000; font-weight: bold">&gt;</span>

        <span style="color: #008000; font-weight: bold">&lt;DatabaseSchema</span> <span style="color: #7D9029">dynamicPrecision=</span><span style="color: #BA2121">&quot;table&quot;</span> <span style="color: #7D9029">gatherSystemTables=</span><span style="color: #BA2121">&quot;false&quot;</span> <span style="color: #008000; font-weight: bold">/&gt;</span>

        <span style="color: #008000; font-weight: bold">&lt;ConnectionManager</span> <span style="color: #7D9029">vLogin=</span><span style="color: #BA2121">&quot;user&quot;</span> <span style="color: #7D9029">rLogin=</span><span style="color: #BA2121">&quot;cjdbc&quot;</span> <span style="color: #7D9029">rPassword=</span><span style="color: #BA2121">&quot;cjdbc&quot;</span><span style="color: #008000; font-weight: bold">&gt;</span>

                <span style="color: #008000; font-weight: bold">&lt;VariablePoolConnectionManager</span> <span style="color: #7D9029">initPoolSize=</span><span style="color: #BA2121">&quot;10&quot;</span> <span style="color: #7D9029">minPoolSize=</span><span style="color: #BA2121">&quot;5&quot;</span> <span style="color: #7D9029">maxPoolSize=</span><span style="color: #BA2121">&quot;50&quot;</span> <span style="color: #7D9029">idleTimeout=</span><span style="color: #BA2121">&quot;180&quot;</span> <span style="color: #7D9029">waitTimeout=</span><span style="color: #BA2121">&quot;120&quot;</span><span style="color: #008000; font-weight: bold">/&gt;</span>

        <span style="color: #008000; font-weight: bold">&lt;/ConnectionManager&gt;</span>
    <span style="color: #008000; font-weight: bold">&lt;/DatabaseBackend&gt;</span>

    <span style="color: #408080; font-style: italic">&lt;!--</span>
<span style="color: #408080; font-style: italic">        Request Manager</span>
<span style="color: #408080; font-style: italic">    --&gt;</span>
    <span style="color: #008000; font-weight: bold">&lt;RequestManager&gt;</span>

        <span style="color: #008000; font-weight: bold">&lt;RequestScheduler&gt;</span>
            <span style="color: #008000; font-weight: bold">&lt;RAIDb-1Scheduler</span> <span style="color: #7D9029">level=</span><span style="color: #BA2121">&quot;passThrough&quot;</span><span style="color: #008000; font-weight: bold">/&gt;</span>
        <span style="color: #008000; font-weight: bold">&lt;/RequestScheduler&gt;</span>

        <span style="color: #008000; font-weight: bold">&lt;RequestCache&gt;</span>

            <span style="color: #008000; font-weight: bold">&lt;MetadataCache</span> <span style="color: #7D9029">maxNbOfMetadata=</span><span style="color: #BA2121">&quot;10000&quot;</span> <span style="color: #7D9029">maxNbOfField=</span><span style="color: #BA2121">&quot;0&quot;</span><span style="color: #008000; font-weight: bold">/&gt;</span>

            <span style="color: #008000; font-weight: bold">&lt;ParsingCache</span> <span style="color: #7D9029">backgroundParsing=</span><span style="color: #BA2121">&quot;false&quot;</span> <span style="color: #7D9029">maxNbOfEntries=</span><span style="color: #BA2121">&quot;5000&quot;</span><span style="color: #008000; font-weight: bold">/&gt;</span>

            <span style="color: #008000; font-weight: bold">&lt;ResultCache</span> <span style="color: #7D9029">granularity=</span><span style="color: #BA2121">&quot;table&quot;</span> <span style="color: #7D9029">maxNbOfEntries=</span><span style="color: #BA2121">&quot;100000&quot;</span> <span style="color: #7D9029">pendingTimeout=</span><span style="color: #BA2121">&quot;0&quot;</span> <span style="color: #008000; font-weight: bold">/&gt;</span>
        <span style="color: #008000; font-weight: bold">&lt;/RequestCache&gt;</span>

        <span style="color: #008000; font-weight: bold">&lt;LoadBalancer&gt;</span>
            <span style="color: #008000; font-weight: bold">&lt;RAIDb-1&gt;</span>
                <span style="color: #008000; font-weight: bold">&lt;WaitForCompletion</span> <span style="color: #7D9029">policy=</span><span style="color: #BA2121">&quot;first&quot;</span><span style="color: #008000; font-weight: bold">/&gt;</span>

                <span style="color: #008000; font-weight: bold">&lt;RAIDb-1-LeastPendingRequestsFirst/&gt;</span>

            <span style="color: #008000; font-weight: bold">&lt;/RAIDb-1&gt;</span>
        <span style="color: #008000; font-weight: bold">&lt;/LoadBalancer&gt;</span>

      <span style="color: #008000; font-weight: bold">&lt;RecoveryLog</span> <span style="color: #7D9029">driver=</span><span style="color: #BA2121">&quot;oracle.jdbc.OracleDriver&quot;</span> <span style="color: #7D9029">url=</span><span style="color: #BA2121">&quot;jdbc:oracle:thin:@192.168.0.140:1521:oracle&quot;</span> <span style="color: #7D9029">login=</span><span style="color: #BA2121">&quot;cjdbcrec&quot;</span> <span style="color: #7D9029">password=</span><span style="color: #BA2121">&quot;cjdbcrec&quot;</span><span style="color: #008000; font-weight: bold">&gt;</span>

        <span style="color: #008000; font-weight: bold">&lt;RecoveryLogTable</span> <span style="color: #7D9029">tableName=</span><span style="color: #BA2121">&quot;RECOVERY&quot;</span>
            <span style="color: #7D9029">logIdColumnType=</span><span style="color: #BA2121">&quot;INTEGER NOT NULL ENABLE&quot;</span>
            <span style="color: #7D9029">vloginColumnType=</span><span style="color: #BA2121">&quot;VARCHAR2(64) NOT NULL&quot;</span>
            <span style="color: #7D9029">sqlColumnName=</span><span style="color: #BA2121">&quot;sql&quot;</span>

            <span style="color: #7D9029">sqlColumnType=</span><span style="color: #BA2121">&quot;VARCHAR2(2048) NOT NULL&quot;</span>
            <span style="color: #7D9029">sqlParamColumnType=</span><span style="color: #BA2121">&quot;VARCHAR2(2048)&quot;</span>
            <span style="color: #7D9029">autoConnTranColumnType=</span><span style="color: #BA2121">&quot;VARCHAR2(4) NOT NULL&quot;</span>
            <span style="color: #7D9029">transactionIdColumnType=</span><span style="color: #BA2121">&quot;INTEGER NOT NULL&quot;</span>
            <span style="color: #7D9029">requestIdColumnType=</span><span style="color: #BA2121">&quot;INTEGER&quot;</span>

            <span style="color: #7D9029">execTimeColumnType=</span><span style="color: #BA2121">&quot;INTEGER&quot;</span>
            <span style="color: #7D9029">updateCountColumnType=</span><span style="color: #BA2121">&quot;NUMBER&quot;</span>
            <span style="color: #7D9029">extraStatementDefinition=</span><span style="color: #BA2121">&quot;, CONSTRAINT RECOVERY_PK PRIMARY KEY (log_id)&quot;</span><span style="color: #008000; font-weight: bold">/&gt;</span>

        <span style="color: #008000; font-weight: bold">&lt;CheckpointTable</span> <span style="color: #7D9029">tableName=</span><span style="color: #BA2121">&quot;CHECKPOINT&quot;</span>

            <span style="color: #7D9029">checkpointNameColumnType=</span><span style="color: #BA2121">&quot;VARCHAR2(128) NOT NULL&quot;</span>
            <span style="color: #7D9029">logIdColumnType=</span><span style="color: #BA2121">&quot;INTEGER&quot;</span>
            <span style="color: #7D9029">extraStatementDefinition=</span><span style="color: #BA2121">&quot;, CONSTRAINT CHECKPOINT_PK PRIMARY KEY (name)&quot;</span><span style="color: #008000; font-weight: bold">/&gt;</span>

        <span style="color: #008000; font-weight: bold">&lt;BackendTable</span> <span style="color: #7D9029">tableName=</span><span style="color: #BA2121">&quot;BACKEND&quot;</span>

            <span style="color: #7D9029">databaseNameColumnType=</span><span style="color: #BA2121">&quot;VARCHAR2(64) NOT NULL&quot;</span>
            <span style="color: #7D9029">backendNameColumnType=</span><span style="color: #BA2121">&quot;VARCHAR2(128) NOT NULL&quot;</span>
            <span style="color: #7D9029">checkpointNameColumnType=</span><span style="color: #BA2121">&quot;VARCHAR2(128) NOT NULL&quot;</span><span style="color: #008000; font-weight: bold">/&gt;</span>

        <span style="color: #008000; font-weight: bold">&lt;DumpTable</span> <span style="color: #7D9029">tableName=</span><span style="color: #BA2121">&quot;DUMP&quot;</span>

            <span style="color: #7D9029">dumpNameColumnType=</span><span style="color: #BA2121">&quot;VARCHAR2(64) NOT NULL&quot;</span>
            <span style="color: #7D9029">dumpDateColumnType=</span><span style="color: #BA2121">&quot;TIMESTAMP(6)&quot;</span>
            <span style="color: #7D9029">dumpPathColumnType=</span><span style="color: #BA2121">&quot;VARCHAR2(128) NOT NULL&quot;</span>
            <span style="color: #7D9029">dumpFormatColumnType=</span><span style="color: #BA2121">&quot;CLOB NOT NULL&quot;</span>
            <span style="color: #7D9029">checkpointNameColumnType=</span><span style="color: #BA2121">&quot;VARCHAR(128) NOT NULL&quot;</span>

            <span style="color: #7D9029">backendNameColumnType=</span><span style="color: #BA2121">&quot;VARCHAR2(128) NOT NULL&quot;</span>
            <span style="color: #7D9029">tablesColumnType=</span><span style="color: #BA2121">&quot;VARCHAR2(128) NOT NULL&quot;</span><span style="color: #008000; font-weight: bold">/&gt;</span>
      <span style="color: #008000; font-weight: bold">&lt;/RecoveryLog&gt;</span>
    <span style="color: #008000; font-weight: bold">&lt;/RequestManager&gt;</span>
  <span style="color: #008000; font-weight: bold">&lt;/VirtualDatabase&gt;</span>

<span style="color: #008000; font-weight: bold">&lt;/SEQUOIA&gt;</span>enableFileLogging=&quot;true&quot; /&gt;
    <span style="color: #008000; font-weight: bold">&lt;JmxSettings&gt;</span>
      <span style="color: #008000; font-weight: bold">&lt;RmiJmxAdaptor/&gt;</span>
    <span style="color: #008000; font-weight: bold">&lt;/JmxSettings&gt;</span>

    <span style="color: #008000; font-weight: bold">&lt;VirtualDatabase</span> <span style="color: #7D9029">configFile=</span><span style="color: #BA2121">&quot;/opt/sequoia/config/virtualdatabase/sequoia.xml&quot;</span> <span style="color: #7D9029">virtualDatabaseName=</span><span style="color: #BA2121">&quot;CJDBC&quot;</span> <span style="color: #7D9029">autoEnableBackends=</span><span style="color: #BA2121">&quot;true&quot;</span> <span style="color: #7D9029">checkpointName=</span><span style="color: #BA2121">&quot;cjdbc_checkpoint&quot;</span> <span style="color: #008000; font-weight: bold">/&gt;</span>

  <span style="color: #008000; font-weight: bold">&lt;/Controller&gt;</span>
<span style="color: #008000; font-weight: bold">&lt;/SEQUOIA-CONTROLLER&gt;</span>
</pre>
<p>Добившись, наконец, того, что система создавала таблицы (важно &#8212; искомые типы полей брались по спецификации из доков и примеров) и запускала оба backend, я решился прогнать тест.</p>
<h3>Пока ещё не краш-тест</h3>
<p>Вставка данных прошла, но вот контроллер снова высыпал кучу исключений. Я искренне удивился, когда увидел, что он пытается вставлять null-значения в not-nullable колонки. Помимо этого, названия таблиц и колонка &#8216;log&#8217; были такими же, что и функции ORACLE, то есть, пришлось всё это переименовывать, в результате чего я получил-таки финальную версию конфиги для RecoveryLog:</p>
<pre>        <span style="color: #008000; font-weight: bold">&lt;RecoveryLogTable</span> <span style="color: #7D9029">tableName=</span><span style="color: #BA2121">&quot;T_RECOVERY&quot;</span>
            <span style="color: #7D9029">logIdColumnType=</span><span style="color: #BA2121">&quot;INTEGER NOT NULL ENABLE&quot;</span>
            <span style="color: #7D9029">vloginColumnType=</span><span style="color: #BA2121">&quot;VARCHAR2(64) NOT NULL&quot;</span>
            <span style="color: #7D9029">sqlColumnName=</span><span style="color: #BA2121">&quot;sql_query&quot;</span>

            <span style="color: #7D9029">sqlColumnType=</span><span style="color: #BA2121">&quot;VARCHAR2(2048) NOT NULL&quot;</span>
            <span style="color: #7D9029">sqlParamColumnType=</span><span style="color: #BA2121">&quot;VARCHAR2(2048)&quot;</span>
            <span style="color: #7D9029">autoConnTranColumnType=</span><span style="color: #BA2121">&quot;VARCHAR2(4) NOT NULL&quot;</span>
            <span style="color: #7D9029">transactionIdColumnType=</span><span style="color: #BA2121">&quot;INTEGER NOT NULL&quot;</span>
            <span style="color: #7D9029">requestIdColumnType=</span><span style="color: #BA2121">&quot;INTEGER&quot;</span>

            <span style="color: #7D9029">execTimeColumnType=</span><span style="color: #BA2121">&quot;INTEGER&quot;</span>
            <span style="color: #7D9029">updateCountColumnType=</span><span style="color: #BA2121">&quot;NUMBER&quot;</span>
            <span style="color: #7D9029">extraStatementDefinition=</span><span style="color: #BA2121">&quot;, CONSTRAINT RECOVERY_PK PRIMARY KEY (log_id)&quot;</span><span style="color: #008000; font-weight: bold">/&gt;</span>

        <span style="color: #008000; font-weight: bold">&lt;CheckpointTable</span> <span style="color: #7D9029">tableName=</span><span style="color: #BA2121">&quot;T_CHECKPOINT&quot;</span>

            <span style="color: #7D9029">checkpointNameColumnType=</span><span style="color: #BA2121">&quot;VARCHAR2(128) NOT NULL&quot;</span>
            <span style="color: #7D9029">logIdColumnType=</span><span style="color: #BA2121">&quot;INTEGER&quot;</span>
            <span style="color: #7D9029">extraStatementDefinition=</span><span style="color: #BA2121">&quot;, CONSTRAINT CHECKPOINT_PK PRIMARY KEY (name)&quot;</span><span style="color: #008000; font-weight: bold">/&gt;</span>

        <span style="color: #008000; font-weight: bold">&lt;BackendTable</span> <span style="color: #7D9029">tableName=</span><span style="color: #BA2121">&quot;T_BACKEND&quot;</span>

            <span style="color: #7D9029">databaseNameColumnType=</span><span style="color: #BA2121">&quot;VARCHAR2(64) NOT NULL&quot;</span>
            <span style="color: #7D9029">backendNameColumnType=</span><span style="color: #BA2121">&quot;VARCHAR2(128) NOT NULL&quot;</span>
            <span style="color: #7D9029">checkpointNameColumnType=</span><span style="color: #BA2121">&quot;VARCHAR2(128)&quot;</span><span style="color: #008000; font-weight: bold">/&gt;</span>

        <span style="color: #008000; font-weight: bold">&lt;DumpTable</span> <span style="color: #7D9029">tableName=</span><span style="color: #BA2121">&quot;T_DUMP&quot;</span>

            <span style="color: #7D9029">dumpNameColumnType=</span><span style="color: #BA2121">&quot;VARCHAR2(64) NOT NULL&quot;</span>
            <span style="color: #7D9029">dumpDateColumnType=</span><span style="color: #BA2121">&quot;TIMESTAMP(6)&quot;</span>
            <span style="color: #7D9029">dumpPathColumnType=</span><span style="color: #BA2121">&quot;VARCHAR2(128) NOT NULL&quot;</span>
            <span style="color: #7D9029">dumpFormatColumnType=</span><span style="color: #BA2121">&quot;CLOB NOT NULL&quot;</span>
            <span style="color: #7D9029">checkpointNameColumnType=</span><span style="color: #BA2121">&quot;VARCHAR(128) NOT NULL&quot;</span>

            <span style="color: #7D9029">backendNameColumnType=</span><span style="color: #BA2121">&quot;VARCHAR2(128) NOT NULL&quot;</span>
            <span style="color: #7D9029">tablesColumnType=</span><span style="color: #BA2121">&quot;VARCHAR2(128) NOT NULL&quot;</span><span style="color: #008000; font-weight: bold">/&gt;</span>
</pre>
<p>Думаете, это было последняя битва с Recovery Log? Ошибаетесь! При попытке вставить в таблицу контроллер продолжал стабильно сыпать исключения такого вида:</p>
<pre>
2009-08-26 17:59:53,394 ERROR sequoia.controller.recoverylog Failed to log begin for transaction 0
java.sql.SQLException: ORA-00911: invalid character

        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
        at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)
        at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)
        at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:955)
        at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1168)
        at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3285)
        at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3368)
        at org.continuent.sequoia.controller.recoverylog.events.LogRequestEvent.execute(LogRequestEvent.java:104)
        at org.continuent.sequoia.controller.recoverylog.LoggerThread.run(LoggerThread.java:678)
</pre>
<p>Вот вам и опровержение абзаца из мануала:</p>
<blockquote><p>Users reported successful usage of Sequoia with the following RDBMS: Oracle®, PostgreSQL, MySQL, Apache Derby, IBM DB2®, Sybase®, SAP DB (MySQL MaxDB), HyperSonic SQL, Firebird, MS SQL Server and InstantDB.</p></blockquote>
<p>В общем, Google помог слабо, нашёл один хиленький баг-тред, из которого вынес только то, что для достижения совместимости с ORACLE придётся патчить исходники.</p>
<h3>Резюме</h3>
<p>Проковырявшись с настройками RecoveryLog целый рабочий день, я так и не смог до конца заставить его работать. Видать, разработчики очень плохо тестировали свой продукт на СУБД ORACLE. Что самое обидное, в сети по возникающим проблемам с Sequoia найти ответ на свой вопрос очень тяжело.<br />
В следующей части я опишу процесс сборки Sequoia и её краш-тест.</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1379/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sequoia изнутри #1</title>
		<link>http://sadko.xskernel.org/archives/1365</link>
		<comments>http://sadko.xskernel.org/archives/1365#comments</comments>
		<pubDate>Thu, 27 Aug 2009 11:01:10 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[Кодинг]]></category>
		<category><![CDATA[Одминское]]></category>
		<category><![CDATA[Туториалы]]></category>
		<category><![CDATA[apache2 license]]></category>
		<category><![CDATA[cjdbc]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jdbc]]></category>
		<category><![CDATA[lgpl]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[sequoia]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/?p=1365</guid>
		<description><![CDATA[Tweet Как бэ вступление По работе возникла необходимость синхронной рабты с кластером БД (4 базы, в которых должны храниться одни и те же данные). Для этого я несколько месяцев подряд писать тулзу data_proc (коммерческая разработка), которая обрабатывает данные в поточном режиме и устойчива к connection-loss/database-failure ошибкам. Единственный недостаток &#8212; это хранение данных на локальном диске [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1365',
  title: 'Sequoia изнутри #1',
  description: 'Как бэ вступление\nПо работе возникла необходимость синхронной рабты с кластером БД (4 базы, в которых должны храниться одни и те же данные). Для этого я несколько месяцев подряд писать тулзу dat...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1365"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="Sequoia &ETH;&cedil;&ETH;&middot;&ETH;&frac12;&Ntilde;&Ntilde;&Ntilde;&ETH;&cedil; #1" data-url="http://sadko.xskernel.org/archives/1365">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><h3>Как бэ вступление</h3>
<p>По работе возникла необходимость синхронной рабты с кластером БД (4 базы, в которых должны храниться одни и те же данные). Для этого я несколько месяцев подряд писать тулзу <strong>data_proc</strong> (коммерческая разработка), которая обрабатывает данные в поточном режиме и устойчива к connection-loss/database-failure ошибкам. Единственный недостаток &#8212; это хранение данных на локальном диске в виде журналов, объём которых достаточно велик, если база несколько часов находится offline.<br />
Помимо <strong>data_proc</strong> у нас есть ещё куча других приложений, для которых пришлось писать балансировщик нагрузки для SELECT-запросов, с чем мы успешно справились. Тем не менее, вопрос балансировки нагрузки и кластеризации (с целью упрощения <strong>data_proc</strong>) остался, и мне предложили разобраться с C-JDBC, о чём я и буду сейчас писать.<br />
<span id="more-1365"></span></p>
<h3>C-JDBC или Sequoia</h3>
<p>Собственно, было предложено покопаться в проекте <a href="http://c-jdbc.ow2.org/">C-JDBC (Clustered JDBC)</a>, который имеет лицензию LGPL. Выкачал дистрибутив, сорсы и доки для Linux, поставил в /opt. Стал разбираться, как скрестить это чудо с <a href="http://www.oracle.com/">ORACLE</a>. Честно прочитал <a href="http://c-jdbc.ow2.org/doc/index.html">бОльшую часть документации на этот продукт</a>, и после некоторых бдений с когфигами и осознавания того, что я делаю не так, выяснил, что ан-нет, не получается никак. Это чудо генерило исключения при попытке получить схему БД ORACLE. Да, я бы всё понял, если бы это не было <strong>java.lang.NullPointerException</strong>. После долгих скитаний в <a>Google</a> я, было, совсем отчаялся.<br />
&#171;А, может, я не ту версию скачал?&#187; &#8212; подумал я, и пошёл снова на официальный сайт C-JDBC, на котором заметил, что C-JDBC имеет своё продолжение &#8212; проект <a href="http://www.continuent.com/community/lab-projects/sequoia">Sequoia</a>, с изменённой лицензией на Apache License. Скачав последнюю версию, стал ковырять&#8230;</p>
<h3>Первые грабли</h3>
<p>Первыми граблями оказалось портирование конфига с C-JDBC на Sequoia. Очень жестокий XML-валидатор ругался и матерился, пока я всё-таки не выяснил, что ему действительно было нужно от меня. Разобравшись с валидатором, я всё-таки написал конфиг, объединяющий две схемы двух разных БД в кластер по технологии <a href="http://c-jdbc.ow2.org/current/doc/userGuide/html/ar01s10.html#raidb1">RAIDb-1</a>. Контроллер вроде бы запустился, да даже вроде бы поднял так называемые backends (проще говоря, законнектился к базам).<br />
Отлично, теперь можно слабать простенькую табличку:<br />
<code>CREATE TABLE TM_FIRST<br />
(<br />
nID NUMBER,<br />
strMessage VARCHAR2(256),<br />
nCode NUMBER<br />
)<br />
</code><br />
Что я незамедлительно и проделал на обеих схемах.<br />
Пришло время написать какой-нить код, который что-то делает с этим кластером. Что ж, берём в руки <a href="http://www.eclipse.org/">Eclipse</a>, создаём проект и заводим вот такой классик:</p>
<pre>
<FONT COLOR=RED><B>package</B></FONT> test<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>cjdbc<FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

<FONT COLOR=RED><B>import</B></FONT> java<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>sql<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT><FONT COLOR=BLUE SIZE=+1>*</FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

<FONT COLOR=RED><B>import</B></FONT> org<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>continuent<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>sequoia<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>driver<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>DataSource<FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

<FONT COLOR=GREEN><I>/** CJDBC controller test
 * @author Vladimir Sadovnikov
 *
 */</I></FONT>

<FONT COLOR=RED><B>public</B></FONT> <FONT COLOR=RED><B>class</B></FONT> Tm_CJDBCTest
<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
	<FONT COLOR=GREEN><I>/**
	 * @param args
	 */</I></FONT>
	<FONT COLOR=RED><B>public</B></FONT> <FONT COLOR=RED><B>static</B></FONT> <FONT COLOR=RED><B>void</B></FONT> main<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT>String<FONT COLOR=BLUE SIZE=+1><B>[</B></FONT><FONT COLOR=BLUE SIZE=+1><B>]</B></FONT> args<FONT COLOR=BLUE SIZE=+1><B>)</B></FONT>

	<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
		DataSource ds <FONT COLOR=BLUE SIZE=+1>=</FONT> <FONT COLOR=RED><B>new</B></FONT> DataSource<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

		ds<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>setURL<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=PURPLE>"jdbc:sequoia://localhost:25322/CJDBC"</FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

		ds<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>setUser<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=PURPLE>"user"</FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>
		ds<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>setPassword<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=PURPLE>"userpass"</FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

		<FONT COLOR=RED><B>try</B></FONT>
		<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
			Connection conn <FONT COLOR=BLUE SIZE=+1>=</FONT> ds<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>getConnection<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

			conn<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>setAutoCommit<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT>false<FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

			<FONT COLOR=RED><B>try</B></FONT>
			<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
				PreparedStatement stm <FONT COLOR=BLUE SIZE=+1>=</FONT> conn<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>prepareStatement<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=PURPLE>"INSERT INTO Tm_First (nID, strMessage, nCode) VALUES (?, ?, ?)"</FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

				<FONT COLOR=RED><B>try</B></FONT>
				<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
					stm<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>setInt<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BROWN>1</FONT><FONT COLOR=BLUE SIZE=+1><B>,</B></FONT> <FONT COLOR=BROWN>666</FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

					stm<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>setString<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BROWN>2</FONT><FONT COLOR=BLUE SIZE=+1><B>,</B></FONT> <FONT COLOR=PURPLE>"Hello, World!"</FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>
					stm<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>setInt<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BROWN>3</FONT><FONT COLOR=BLUE SIZE=+1><B>,</B></FONT> <FONT COLOR=BROWN>13</FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

					stm<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>addBatch<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

					stm<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>execute<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>
					conn<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>commit<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

				<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>
				<FONT COLOR=RED><B>catch</B></FONT> <FONT COLOR=BLUE SIZE=+1><B>(</B></FONT>SQLException ex<FONT COLOR=BLUE SIZE=+1><B>)</B></FONT>
				<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
					conn<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>rollback<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

					<FONT COLOR=RED><B>throw</B></FONT> ex<FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>
				<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>
				<FONT COLOR=RED><B>finally</B></FONT>
				<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
					stm<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>close<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

				<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>

				stm <FONT COLOR=BLUE SIZE=+1>=</FONT> conn<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>prepareStatement<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=PURPLE>"SELECT * from Tm_First"</FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

				<FONT COLOR=RED><B>try</B></FONT>

				<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
					ResultSet rset <FONT COLOR=BLUE SIZE=+1>=</FONT> stm<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>executeQuery<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

					<FONT COLOR=RED><B>try</B></FONT>

					<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
						<FONT COLOR=RED><B>while</B></FONT> <FONT COLOR=BLUE SIZE=+1><B>(</B></FONT>rset<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>next<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT>
						<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>

							String result <FONT COLOR=BLUE SIZE=+1>=</FONT> <FONT COLOR=PURPLE>"fetched item: "</FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>
							result <FONT COLOR=BLUE SIZE=+1>+</FONT><FONT COLOR=BLUE SIZE=+1>=</FONT> rset<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>getInt<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BROWN>1</FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT> <FONT COLOR=BLUE SIZE=+1>+</FONT> <FONT COLOR=PURPLE>";"</FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

							result <FONT COLOR=BLUE SIZE=+1>+</FONT><FONT COLOR=BLUE SIZE=+1>=</FONT> rset<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>getString<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BROWN>2</FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT> <FONT COLOR=BLUE SIZE=+1>+</FONT> <FONT COLOR=PURPLE>";"</FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

							result <FONT COLOR=BLUE SIZE=+1>+</FONT><FONT COLOR=BLUE SIZE=+1>=</FONT> rset<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>getInt<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BROWN>3</FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT> <FONT COLOR=BLUE SIZE=+1>+</FONT> <FONT COLOR=PURPLE>"\n"</FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

							System<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>out<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>println<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT>result<FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>
						<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>
					<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>

					<FONT COLOR=RED><B>finally</B></FONT>
					<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
						rset<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>close<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>
					<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>

				<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>
				<FONT COLOR=RED><B>catch</B></FONT> <FONT COLOR=BLUE SIZE=+1><B>(</B></FONT>SQLException ex<FONT COLOR=BLUE SIZE=+1><B>)</B></FONT>
				<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
					conn<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>rollback<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

					<FONT COLOR=RED><B>throw</B></FONT> ex<FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>
				<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>
				<FONT COLOR=RED><B>finally</B></FONT>
				<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
					stm<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>close<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

				<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>
			<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>
			<FONT COLOR=RED><B>finally</B></FONT>
			<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
				conn<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>close<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

			<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>
		<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>
		<FONT COLOR=RED><B>catch</B></FONT> <FONT COLOR=BLUE SIZE=+1><B>(</B></FONT>SQLException ex<FONT COLOR=BLUE SIZE=+1><B>)</B></FONT>
		<FONT COLOR=BLUE SIZE=+1><B>{</B></FONT>
			ex<FONT COLOR=BLUE SIZE=+1><B>.</B></FONT>printStackTrace<FONT COLOR=BLUE SIZE=+1><B>(</B></FONT><FONT COLOR=BLUE SIZE=+1><B>)</B></FONT><FONT COLOR=BLUE SIZE=+1><B>;</B></FONT>

		<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>
	<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT>
<FONT COLOR=BLUE SIZE=+1><B>}</B></FONT></pre>
<p>Запускаем класс на выполнение, в базы вставляется по строчке, контроллер рапортует об успехе, выдав мне на SELECT-запрос строчку. Ура-ура-ура: в базах данные вроде бы синхронны. Что ж, пора брать в руки молоток.</p>
<h3>Краш-тест</h3>
<p>Что ж, посмотрим, как контроллер отреагирует на отказ в работе одной из БД.<br />
Для этого, не мудрствуя лукаво, я делаю следующий трюк:<br />
<code>ALTER USER cjdbc ACCOUNT LOCK</code><br />
То есть, блокирую аккаунт, через который контроллер Sequoia подключается к базе. После чего вывожу список коннекций:<br />
<code>select s.sid s.serial#, s.osuser, s.username, s.program FROM v$session s where USERNAME like 'CJDBC' and OSUSER IS NULL</code><br />
И поочереди сношу их через<br />
<code>ALTER SYSTEM KILL SESSION  IMMEDIATE;</code><br />
После этого база контроллеру недоступна, и я с чистой совестью снова прогоняю тест. В результате чего в одной базе две записи, в другой &#8212; одна. И никаких дополнительных метаданных, по которым можно было бы восстановить зеркальность баз, нет ни в первой, ни во второй.<br />
Что ж, может это очень умная штука, которая использует какие-то ораклёвые фичи, о которых я не знаю? OK, тогда разрешаем аккаунт:<br />
<code>ALTER USER cjdbc ACCOUNT UNLOCK</code><br />
И снова прогоняем тест. В первой базе три записи, во второй &#8212; по-прежнему одна, а SELECT бодро выдаёт три записи через ResultSet.<br />
Может быть, оно после рестарта как-то восстановится? Ладно, вырубаю контроллер (жёстко, по ctrl-c). Запускаю снова. Sequoia подключается к обеим базам, вытаскивает схемы и&#8230; больше ничего не делает.<br />
Ладно, прогоняю ещё раз тест&#8230; В первой базе четыре записи, во второй &#8212; всего две, и выдёргивается через SELECT только две.</p>
<h3>Но не может же быть!</h3>
<p>subj, ведь в официальной документации от Sequoia говорится следующее:<br />
<quote><br />
You have a Java application or a Java-based application server that accesses one or several databases. The database tier becomes the bottleneck of your application or it is a single point of failure or both. Sequoia can help you resolve these problems by providing:<br />
    * performance scalability by adding database nodes and balancing the load among these nodes.<br />
    * high availability of the database tier, i.e. Sequoia tolerates database crashes and offers transparent failover using database replication techniques.<br />
    * improved performance with fine grain query caching and transparent connection pooling.<br />
    * SQL traffic logging for performance monitoring and analysis.<br />
    * support for clusters of heterogeneous database engines.<br />
</quote><br />
Вспоминаю, что в доках упоминалась такая фигня, как <a href="http://c-jdbc.ow2.org/current/doc/userGuide/html/ar01s11.html#dtd_recoverylog">RecoveryLog</a>. Может, причина в том, что я не сконфигурировал его? Да, похоже, надо конфигурить, но это тема для отдельного поста.</p>
<h3>Заключение</h3>
<p>Первое знакомство с C-JDBC оказалось неудачным, в Sequoia был пофиксен ряд багов, что, тем не менее, не мешало ей валить исключения при определённых настройках. Тестирование работы RAIDb-1 оказалось полностью провальным (до первого сбоя), опция RecoveryLog не использовалась. Похоже, что в документации нас хотят обмануть. Но исследование продолжается.</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1365/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Миграция на WordPress</title>
		<link>http://sadko.xskernel.org/archives/1340</link>
		<comments>http://sadko.xskernel.org/archives/1340#comments</comments>
		<pubDate>Sat, 22 Aug 2009 12:05:01 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[Кодинг]]></category>
		<category><![CDATA[Одминское]]></category>
		<category><![CDATA[Туториалы]]></category>
		<category><![CDATA[livejournal]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[быдлокодинг]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/?p=1340</guid>
		<description><![CDATA[Tweet Итак, как обещал, пишу свои впечатления от миграции на WordPress. Прежде всего хочу акцентировать внимание на то, почему я всё же решил &#171;слинять&#187; с LiveJournal. Окончательной причиной такого решения стала тотальная кривость движка ЖЖ, которая меня очень сильно поражает. Почему я для того, чтобы удалить запись, должен жать на 3 кнопки (править &#8212; удалить [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1340',
  title: 'Миграция на WordPress',
  description: 'Итак, как обещал, пишу свои впечатления от миграции на WordPress.\n\nПрежде всего хочу акцентировать внимание на то, почему я всё же решил &quot;слинять&quot; с LiveJournal. Окончательной причиной такого решения ст...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1340"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="&ETH;&ETH;&cedil;&ETH;&sup3;&Ntilde;&ETH;&deg;&Ntilde;&ETH;&cedil;&Ntilde; &ETH;&frac12;&ETH;&deg; WordPress" data-url="http://sadko.xskernel.org/archives/1340">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><p>Итак, как обещал, пишу свои впечатления от миграции на WordPress.</p>
<p>Прежде всего хочу акцентировать внимание на то, почему я всё же решил &#171;слинять&#187; с <a href="http://www.livejournal.com/">LiveJournal</a>. Окончательной причиной такого решения стала тотальная кривость движка ЖЖ, которая меня очень сильно поражает. Почему я для того, чтобы удалить запись, должен жать на 3 кнопки (править &#8212; удалить &#8212; согласен) вместо того, чтобы воспользоваться всего двумя (удалить &#8212; согласен). Зачастую даже путаешься в интерфейсе для того, чтобы совершить простейшую операцию &#8212; перейти из личного кабинета в блог и наоборот. Ну а также не удовлетворяют тормоза в работе, сильная перегруженность контента ЖЖ и ВНЕЗАПНО появившаяся реклама.</p>
<p>Тем не менее, недостатки, как выяснилось, у WordPress тоже в наличии, но они не такие большие.<br />
Прежде всего претензии к плагинам, работающими с ЖЖ: ни lj-xp, ни lj-user работать нормально не хотели. Ну если в lj-xp всё не так страшно и ограничивается только мелкими патчами кода, неработающего на новой версии PHP, то о плагине lj-user можно сказать только то, что автор вообще не знал, чего писал. Это просто БЫДЛОКОДИНГ, и результат этого быдлокодинга тупо вешал движок WordPress при, казалось бы, элементаной операции обработки текста. Заведомо практически не зная PHP, я написал <u>нормальный</u> плагин lj-user, который не вгоняет в вечный цикл движок WordPress, и именно поэтому считаю стирание исконного автора из комментариев справедливым.</p>
<p>Именно поэтому я публикую исправленные версии плагинов у себя на сервере:<br />
<a href="http://download.xskernel.org/pub/wordpress/plugins/lj-xp.tar.bz2">LJ CrossPost (lj-xp)</a>.<br />
<a href="http://download.xskernel.org/pub/wordpress/plugins/lj-user.tar.bz2">LJ User (lj-user)</a>.</p>
<p>В общем, надеюсь, вам эти плагины тоже помогут.</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1340/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

