<?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>goodguy о разработке &#187; Разное</title>
	<atom:link href="http://dev.good-guy.me/archives/category/uncategorized/feed" rel="self" type="application/rss+xml" />
	<link>http://dev.good-guy.me</link>
	<description>python, zope, php, sqlite, postgresql, mysql и прочее с чем сталкиваюсь</description>
	<lastBuildDate>Thu, 08 Jul 2010 09:17:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Получение приватного SSL-ключа без пароля</title>
		<link>http://dev.good-guy.me/archives/389</link>
		<comments>http://dev.good-guy.me/archives/389#comments</comments>
		<pubDate>Thu, 29 Oct 2009 10:32:57 +0000</pubDate>
		<dc:creator>goodguy</dc:creator>
				<category><![CDATA[ПО]]></category>
		<category><![CDATA[Разное]]></category>
		<category><![CDATA[ssl]]></category>

		<guid isPermaLink="false">http://dev.goodguy.spb.ru/?p=389</guid>
		<description><![CDATA[Защищать приватный ключ SSL-соединений паролем в большинстве случаев очень хорошая идея, но некоторое ПО (в частности некоторые классы PHP) не всегда нормально воспринимают такие файлы, особенно в формате PEM. Чтобы дать им счастье и умиротворение достаточно с помощью openssl провести пару простых операций импорта-экспорта и получить желаемый файл без паролей: cat my.crt my.key > my.pem [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify">Защищать приватный ключ SSL-соединений паролем в большинстве случаев очень хорошая идея, но некоторое ПО (в частности некоторые классы PHP) не всегда нормально воспринимают такие файлы, особенно в формате PEM. Чтобы дать им счастье и умиротворение достаточно с помощью <tt>openssl</tt> провести пару простых операций импорта-экспорта и получить желаемый файл без паролей:
<pre>
cat my.crt my.key > my.pem
openssl pkcs12 -export -in my.pem -nodes -out my.pfx
openssl pkcs12 -in my.pfx -out my-nodes.key -nodes -nocerts
</pre>
<p style="text-align: justify">В примере из файлов <tt>my.crt</tt> и <tt>my.key</tt> получаем незащищенный файл <tt>my-nodes.key</tt>. Взято <a href="http://www.digizenstudio.com/blog/2007/07/28/export-a-private-key-without-encryption-using-openssl/">отсюда</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.good-guy.me/archives/389/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unknown SSL protocol error</title>
		<link>http://dev.good-guy.me/archives/371</link>
		<comments>http://dev.good-guy.me/archives/371#comments</comments>
		<pubDate>Fri, 28 Aug 2009 13:22:48 +0000</pubDate>
		<dc:creator>goodguy</dc:creator>
				<category><![CDATA[ПО]]></category>
		<category><![CDATA[Разное]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://dev.goodguy.spb.ru/?p=371</guid>
		<description><![CDATA[При запросе из PHP с помощью HTTPRequest к интерфейсу одной серьёзной биллинговой системы получал постоянно ошибку «Unknown SSL protocol error in connection to xxx.xxx.xxx.xxx:443». Быстрый взгляд в гугл подсказал только перебирать параметры, что оказалось вполне верной догадкой: оказывается хост нормальное работал с SSLv2, который не использовался при соединении. Пришлось указать принудительно строкой: $req-&#62;setOptions(array('ssl' =&#62; array('version' [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify">При запросе из PHP с помощью <tt><a href="http://ru.php.net/manual/en/class.httprequest.php">HTTPRequest</a></tt> к интерфейсу одной серьёзной биллинговой системы получал постоянно ошибку «<tt>Unknown SSL protocol error in connection to xxx.xxx.xxx.xxx:443</tt>». Быстрый взгляд в гугл подсказал только перебирать параметры, что оказалось вполне верной догадкой: оказывается хост нормальное работал с SSLv2, который не использовался при соединении. Пришлось указать принудительно строкой:</p>
<pre name="code" class="php">
$req-&gt;setOptions(array('ssl' =&gt; array('version' =&gt; SSL_VERSION_SSLv2)));
</pre>
<p style="text-align: justify">Потом правда всплыли и другие прелести, вроде отдачи XML в UTF-8 с типом «<tt>text/html; charset=ISO-8859-1</tt>», но такие шутки находятся быстрее и решаются проще.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.good-guy.me/archives/371/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Загадка бытия</title>
		<link>http://dev.good-guy.me/archives/369</link>
		<comments>http://dev.good-guy.me/archives/369#comments</comments>
		<pubDate>Thu, 18 Jun 2009 07:09:46 +0000</pubDate>
		<dc:creator>goodguy</dc:creator>
				<category><![CDATA[Разное]]></category>

		<guid isPermaLink="false">http://dev.goodguy.spb.ru/archives/369</guid>
		<description><![CDATA[Почему в Eclipse до сих пор не сделали такой банальной вещи как цветовая схема?]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify">Почему в <a href="http://eclipse.org">Eclipse</a> до сих пор не сделали такой банальной вещи как цветовая схема?</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.good-guy.me/archives/369/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Чудны дела</title>
		<link>http://dev.good-guy.me/archives/364</link>
		<comments>http://dev.good-guy.me/archives/364#comments</comments>
		<pubDate>Thu, 11 Jun 2009 06:45:57 +0000</pubDate>
		<dc:creator>goodguy</dc:creator>
				<category><![CDATA[ПО]]></category>
		<category><![CDATA[Разное]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[велосипед]]></category>

		<guid isPermaLink="false">http://dev.goodguy.spb.ru/?p=364</guid>
		<description><![CDATA[Удивительно, но совсем рядом с теми людьми, кто проводит конференции разработчиков высоконагруженных систем находятся довольно забавные люди. Кто-то сравнивает непонятно что, непонятно с чем, а кто-то, видимо, начитавшись подобного пишет платёжные системы на ASP.NET, сталкивается с проблемами нагрузки и, вместо того чтобы заниматься оптимизацией БД, репликацией, установкой load balancer&#8217;а, делает такой финт: ставит несколько серверов, [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify">Удивительно, но совсем рядом с теми людьми, кто проводит <a href="http://highload.ru/">конференции разработчиков высоконагруженных систем</a> находятся довольно забавные люди. Кто-то <a href="http://hlabs.spb.ru/news/fake_comparisons.html">сравнивает непонятно что, непонятно с чем</a>, а кто-то, видимо, начитавшись подобного пишет платёжные системы на ASP.NET, сталкивается с проблемами нагрузки и, вместо того чтобы заниматься оптимизацией БД, репликацией, установкой load balancer&#8217;а, делает такой финт: ставит несколько серверов, обслуживающих веб-запросы, которые за собой лезут к единой базе. Клиентам предлагает самостоятельно искать, какой-же из серверов сейчас доступен. Но даже, если ты счастливо находишь этот доступный сервер, это не значит, что ты совершишь свою операцию: база то одна на всех, и задержка ответов у неё дикая, и, например, список доступных провайдеров выдать быстро уже не может. Ну хорошо, отвечают они, вот вы действительно не можете получить этот список, так попробуйте увеличить время ожидания ответа. Но, максимальный таймаут прописан уже на их стороне, в обслуживающем веб-сервере и увеличить его никак! Задаюсь теперь вопросом: сколько же должно быть записей, чтобы для их получения и форматирования в <tt>SOAP</tt>-ответ требовалось более 3 минут? Вопрос почему же нельзя сделать простейший <tt>master (read/write) — slave (read)</tt> и брать статусы, списки и т.п. со второго сервера, а так-же почему бы не сделать простейший скрипт распределения нагрузки самим уже отпал <img src='http://dev.good-guy.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: justify"><strong>Дополнение:</strong> В процессе работы выяснился момент, что у ребят в<tt> WSDL</tt> были указаны неверные адреса сервиса, из-за этого и происходили проблемы с получением списка. Но перебор серверов всё-равно требуется.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.good-guy.me/archives/364/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenID</title>
		<link>http://dev.good-guy.me/archives/341</link>
		<comments>http://dev.good-guy.me/archives/341#comments</comments>
		<pubDate>Mon, 16 Mar 2009 06:50:29 +0000</pubDate>
		<dc:creator>goodguy</dc:creator>
				<category><![CDATA[Разное]]></category>
		<category><![CDATA[стандарты]]></category>

		<guid isPermaLink="false">http://dev.goodguy.spb.ru/?p=341</guid>
		<description><![CDATA[В стремлении сделать лучше хотя бы свой уголочек Сети, поставил в оба блога плагин к WordPress для подписи комментариев с помощью OpenID, а заодно он стал и моим OpenID-провайдером без всякого делегирования (хотя и такое тоже умеет).]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify">В стремлении сделать лучше хотя бы свой уголочек Сети, поставил в оба блога плагин к WordPress для <a href="http://wordpress.org/extend/plugins/openid/">подписи комментариев с помощью OpenID</a>, а заодно он стал и моим OpenID-провайдером без всякого делегирования (хотя и такое тоже умеет).</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.good-guy.me/archives/341/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Болезнь велосипеда в криптосредствах</title>
		<link>http://dev.good-guy.me/archives/336</link>
		<comments>http://dev.good-guy.me/archives/336#comments</comments>
		<pubDate>Tue, 10 Mar 2009 14:48:57 +0000</pubDate>
		<dc:creator>goodguy</dc:creator>
				<category><![CDATA[ПО]]></category>
		<category><![CDATA[Разное]]></category>
		<category><![CDATA[велосипед]]></category>

		<guid isPermaLink="false">http://dev.goodguy.spb.ru/?p=336</guid>
		<description><![CDATA[Насколько мне известно, у нас в стране официально признан только криптопровайдер КриптоПро, и это всерьёз касается серьёзных банков и т.п. организаций. Недостаток его в том, что он сделан в виде COM-объекта, но решение как к нему подключиться, если потребуется, можно найти. А для всех остальных случаев, есть надёжный и удобный GPG/PGP с интерфейсами под кучи [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify">Насколько мне известно, у нас в стране официально признан только криптопровайдер КриптоПро, и это всерьёз касается серьёзных банков и т.п. организаций. Недостаток его в том, что он сделан в виде COM-объекта, но решение как к нему подключиться, если потребуется, можно найти. А для всех остальных случаев, есть надёжный и удобный GPG/PGP с интерфейсами под кучи языков программирования, отлаженными библиотеками, и поддержкой всех платформ. Но вот как  понять очередных «гениев», создающих свои библиотеки шифрования с какими-то бредовыми наворотами? Уже в третий раз за короткий срок сталкиваюсь с необходимостью прикрутить поделку неизвестных творцов и на этот раз это вообще шедевр &mdash; используются RSA ключи и нормальная PGP подпись, только в начало добавлены хэши и идентификатор ключа, да чуть изменены строковые разделители. Почему нельзя было обойтись обычной armor-записью и вытаскивать данные прямо из подписи? И ведь не поленились, написали версии под разные платформы и к тому же под C, C++, Delphi и Java.</p>
<p style="text-align: justify">Болезнь придумывания своего, походу, поражает только российские умы. Работали с британскими аутсорсерами одних наших партнеров &mdash; сразу предложили GPG. А наши всё пытаются или какую-то .NET DLL пропихнуть, или ещё какое-нибудь чудо, которому из настроек можно только адрес сервера дать и гадай какие у неё таймауты на соединение и логика запроса. А могли бы упростить работу по поддержке и себе. Но, пока им удобнее сотворить некое Windows DLL, а вы там уж сами разбирайтесь.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.good-guy.me/archives/336/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Русский брат большого брата</title>
		<link>http://dev.good-guy.me/archives/145</link>
		<comments>http://dev.good-guy.me/archives/145#comments</comments>
		<pubDate>Tue, 09 Sep 2008 09:26:13 +0000</pubDate>
		<dc:creator>goodguy</dc:creator>
				<category><![CDATA[Разное]]></category>
		<category><![CDATA[yandex]]></category>

		<guid isPermaLink="false">http://goodguy.spb.ru/?p=145</guid>
		<description><![CDATA[Если у Google есть Google Labs, то у Яндекса есть мини-брат в виде Яндекс.нано, в котором живут забавные и полезные проекты, вроде «Склонятора», разных виджетов для поиска и не только и даже немного радости для любителей iPhone или русского языка. Можно поразвлекаться на досуге]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify">Если у Google есть <a href="http://labs.google.com/">Google Labs</a>, то у Яндекса есть мини-брат в виде <a href="http://nano.yandex.ru/">Яндекс.нано</a>, в котором живут забавные и полезные <a href="http://nano.yandex.ru/projects/">проекты</a>, вроде «<a href="http://nano.yandex.ru/project/inflect/">Склонятора</a>», разных виджетов для поиска и не только и даже немного радости для любителей iPhone или русского языка. Можно поразвлекаться на досуге <img src='http://dev.good-guy.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://dev.good-guy.me/archives/145/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Полезные дополнения к datetime</title>
		<link>http://dev.good-guy.me/archives/132</link>
		<comments>http://dev.good-guy.me/archives/132#comments</comments>
		<pubDate>Thu, 04 Sep 2008 08:09:16 +0000</pubDate>
		<dc:creator>goodguy</dc:creator>
				<category><![CDATA[Разное]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://goodguy.spb.ru/?p=132</guid>
		<description><![CDATA[Есть такое удобное дополнение к модулю datetime в python, как dateutil. Из часто встречающихся нужд позволяет упростить: Разбор строки в объект datetime; Работу с временными зонами (включая их справочник и использование информации системы); Разнообразные вычисления дат исходя из правил, вроде &#171;первый понедельник марта&#187;.]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify">Есть такое удобное дополнение к модулю <a href="http://docs.python.org/lib/module-datetime.html"><tt>datetime</tt></a> в <tt>python</tt>, как <a href="http://labix.org/python-dateutil"><tt>dateutil</tt></a>. Из часто встречающихся нужд позволяет упростить:</p>
<ul>
<li>Разбор строки в объект <tt>datetime</tt>;</li>
<li>Работу с временными зонами (включая их справочник и использование информации системы);</li>
<li>Разнообразные вычисления дат исходя из правил, вроде &laquo;первый понедельник марта&raquo;.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://dev.good-guy.me/archives/132/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Внимательное отношение к стандартам</title>
		<link>http://dev.good-guy.me/archives/123</link>
		<comments>http://dev.good-guy.me/archives/123#comments</comments>
		<pubDate>Tue, 26 Aug 2008 13:32:30 +0000</pubDate>
		<dc:creator>goodguy</dc:creator>
				<category><![CDATA[Разное]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[стандарты]]></category>

		<guid isPermaLink="false">http://goodguy.spb.ru/?p=123</guid>
		<description><![CDATA[По ходу работы пришлось мне немного освоить perl, для того, чтобы помочь нашим партнёрам написать SOAP-клиента для нашей системы (уже забавно, помогать знающим язык, параллельно его изучая). Использовалась там более-менее стандартная библиотека SOAP::Lite. Но, когда я работал над клиентом у меня стояла её довольно ранняя версия, под которой я успешно отладил пример, и отдал его [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify">По ходу работы пришлось мне немного освоить <a href="http://perl.com/">perl</a>, для того, чтобы помочь нашим партнёрам написать <a href="http://www.w3.org/TR/2000/NOTE-SOAP-20000508/">SOAP</a>-клиента для нашей системы (уже забавно, помогать знающим язык, параллельно его изучая). Использовалась там более-менее стандартная библиотека <a href="http://soaplite.com/">SOAP::Lite</a>. Но, когда я работал над клиентом у меня стояла её довольно ранняя версия, под которой я успешно отладил пример, и отдал его для дальнейшей эксплуатации. Проблема всплыла позже, когда партнёры стали заводить систему у себя. И обнаружили, что сообщения об ошибке возвращаются от них не в совсем том виде, в котором ожидает наша система, а именно подробности об ошибке в <tt>detail</tt> были как-то странно закодированы. Для наших компонент эта часть сообщения была весьма критичной и начали разбираться. Сначала выкопал, что ребята вообще не запарились включить поддержку юникода в своём скрипте, а потом стало ясно, что версии библиотек у нас не совпадают. Обновил свою и радостно увидел ту-же самую муть, что приходила от них. В поисках решения перекопал кучу страниц, и в одном документе увидел интересный момент в описании <a href="http://search.cpan.org/~mkutter/SOAP-Lite/lib/SOAP/Fault.pod"><tt>SOAP::Fault</tt></a>:</p>
<blockquote><p>Note that fault detail content in a message is represented as tag blocks.</p></blockquote>
<p style="text-align: justify">Что привело меня на волшебный документ &#8211; <a href="http://www.w3.org/TR/2000/NOTE-SOAP-20000508/#_Toc478383507">спецификацию</a>, в которой подразумевается, что в <tt>detail</tt> должны быть дочерние элементы:</p>
<blockquote><p>All immediate child elements of the detail element are called detail entries and each detail entry is encoded as an independent element within the detail element.</p></blockquote>
<p style="text-align: justify">Авторы библиотеки явно строго последовали этому принципу и не оставили лазейки для передачи там обычной строки. Система, не рассчитанная на такую возможность, оказалась без возможности взаимодействовать по стандартам и требует доработки. Отсюда вывод: даже если инструментарий позволяет немножко нарушать стандарты, это не повод о них забывать &#8211; они могут аукнуться совсем неожиданно.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.good-guy.me/archives/123/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Удаление всех файлов из списка</title>
		<link>http://dev.good-guy.me/archives/111</link>
		<comments>http://dev.good-guy.me/archives/111#comments</comments>
		<pubDate>Mon, 25 Aug 2008 07:06:37 +0000</pubDate>
		<dc:creator>goodguy</dc:creator>
				<category><![CDATA[Разное]]></category>
		<category><![CDATA[bash]]></category>

		<guid isPermaLink="false">http://goodguy.spb.ru/?p=111</guid>
		<description><![CDATA[Всё время вылетает из головы написание команды, поэтому записываю как для себя так и для интересующихся. Как просто в bash грохнуть все файлы, названия которых сохранены в некотором somefile: for name in `cat &#60;somefile&#62;` ; do rm $name ; done; Подсказка из комментов: есть более простой вариант: xargs rm < somefile]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify">Всё время вылетает из головы написание команды, поэтому записываю как для себя так и для интересующихся. Как просто в <a href="http://tiswww.case.edu/php/chet/bash/bashtop.html">bash</a> грохнуть все файлы, названия которых сохранены в некотором <tt>somefile</tt>: </p>
<p><code>for name in `cat &lt;somefile&gt;` ; do rm $name ; done;</code></p>
<p style="text-align: justify"><span style="font-weight: bold">Подсказка из комментов:</span> есть более простой вариант: <code>xargs rm < somefile</code></p>
]]></content:encoded>
			<wfw:commentRss>http://dev.good-guy.me/archives/111/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
