<?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 о разработке</title>
	<atom:link href="http://dev.good-guy.me/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>Настройка админской панели в django</title>
		<link>http://dev.good-guy.me/archives/419</link>
		<comments>http://dev.good-guy.me/archives/419#comments</comments>
		<pubDate>Thu, 08 Jul 2010 09:17:47 +0000</pubDate>
		<dc:creator>goodguy</dc:creator>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Языки]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://dev.good-guy.me/?p=419</guid>
		<description><![CDATA[Интересная заметка на habrahabr про то как минимальными усилиями сделать из обычной админской панели django красивый и удобный интерфейс.]]></description>
			<content:encoded><![CDATA[<p>
Интересная заметка на habrahabr про то как минимальными усилиями <a href="http://habrahabr.ru/blogs/django/98539/">сделать из обычной админской панели django красивый и удобный интерфейс</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.good-guy.me/archives/419/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Do it satchmo way</title>
		<link>http://dev.good-guy.me/archives/413</link>
		<comments>http://dev.good-guy.me/archives/413#comments</comments>
		<pubDate>Wed, 07 Jul 2010 17:53:22 +0000</pubDate>
		<dc:creator>goodguy</dc:creator>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[ПО]]></category>
		<category><![CDATA[Языки]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[satchmo]]></category>
		<category><![CDATA[велосипед]]></category>

		<guid isPermaLink="false">http://dev.good-guy.me/?p=413</guid>
		<description><![CDATA[Недавно потребовалось быстро развернуть более-менее универсальный магазин для нашего нового проекта торговли велотоварами. PHP-системы мне как-то не нравились и из симпатии к python начал было писать проект на django, но вскоре понял, что скорее всего получается велосипед, и начал искать что-то готовое. Оно пришло в виде Satchmo, весьма универсального и накручиваемого решения для электронной торговли. [...]]]></description>
			<content:encoded><![CDATA[<p>Недавно потребовалось быстро развернуть более-менее универсальный магазин для нашего нового <a href="http://fysika.ru">проекта торговли велотоварами</a>. PHP-системы мне как-то не нравились и из симпатии к <a href="http://python.org">python</a> начал было писать проект на <a href="http://djangoproject.com">django</a>, но вскоре понял, что скорее всего получается велосипед, и начал искать что-то готовое. Оно пришло в виде <a href="http://www.satchmoproject.com/">Satchmo</a>, весьма универсального и накручиваемого решения для электронной торговли. Что понравилось &#8211; немало настроек, в которых поначалу можно запутаться. Есть тонкости в адаптации под себя, но они описаны в документации (один отсутствующий момент &#8211; это как обновлять sitemaps, пришлось додумывать и доделывать самома). Но главное, магазин развернулся из коробки и через пару часов в нём уже можно было добавлять товары. А вот допиливания мелочей происходят уже по ходу, и зачастую незаметно для посетителей <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/413/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Антивелосипед</title>
		<link>http://dev.good-guy.me/archives/402</link>
		<comments>http://dev.good-guy.me/archives/402#comments</comments>
		<pubDate>Mon, 28 Jun 2010 09:43:18 +0000</pubDate>
		<dc:creator>goodguy</dc:creator>
				<category><![CDATA[Языки]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://dev.good-guy.me/?p=402</guid>
		<description><![CDATA[Python опять обрадовал меня наличием готовых модулей для всего и вся. На этот раз повезло быстро разобраться с чтением конфигурации из XML файла &#8211; для этого идеально подошёл модуль xmlobjects и простая конструкция вида: import xmlobjects import psycopg2 xml = """ user password dbname """ conf = xmlobjects.fromstring(xml) conn = psycopg2.connect('dbname=%s user=%s password=%s' % ( [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify"><a href="http://python.org">Python</a> опять обрадовал меня наличием готовых модулей для всего и вся. На этот раз повезло быстро разобраться с чтением конфигурации из XML файла &#8211; для этого идеально подошёл модуль <a href="http://pypi.python.org/pypi/xmlobjects/">xmlobjects</a> и простая конструкция вида:
</p>
<pre name="code" class="python">
import xmlobjects
import psycopg2

xml = """<settings>
<db>
   <user>user</user>
<password>password</password>
   <dbname>dbname</dbname>
</db>
</settings>"""

conf = xmlobjects.fromstring(xml)
conn = psycopg2.connect('dbname=%s user=%s password=%s' % (
    conf.db.dbname, conf.db.user, conf.db.password))
</pre>
]]></content:encoded>
			<wfw:commentRss>http://dev.good-guy.me/archives/402/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>Задание разрешения экрана в VirtualBox</title>
		<link>http://dev.good-guy.me/archives/384</link>
		<comments>http://dev.good-guy.me/archives/384#comments</comments>
		<pubDate>Wed, 21 Oct 2009 06:46:42 +0000</pubDate>
		<dc:creator>goodguy</dc:creator>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[ПО]]></category>

		<guid isPermaLink="false">http://dev.goodguy.spb.ru/?p=384</guid>
		<description><![CDATA[На рабочей системе я держу Kubuntu под VirtualBox в которой провожу основную разработку (привык к bash, да и gvim там как-то симпатичнее). Но вот проблема: разрешение рабочего стола у меня 1280&#215;800, но при запуске виртуальной машины в полный экран при загрузке получаю всего 1024&#215;768. Помогало переключение в оконный режим и возврат в полноэкранный. Но оказалось [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify">На рабочей системе я держу Kubuntu под VirtualBox в которой провожу основную разработку (привык к bash, да и <a href="http://www.vim.org/">gvim</a> там как-то симпатичнее). Но вот проблема: разрешение рабочего стола у меня 1280&#215;800, но при запуске виртуальной машины в полный экран при загрузке получаю всего 1024&#215;768. Помогало переключение в оконный режим и возврат в полноэкранный. Но оказалось есть более удачный способ. Нужно зайти в каталог где установлен VirtualBox и запустить команду вида:</p>
<p><code><br />
VBoxManage setextradata global GUI/MaxGuestResolution 1280,800<br />
</code></p>
<p style="text-align: justify">где последний параметр &mdash; это собственно и есть желаемое разрешение. Работает, сохраняется после выключения и новой загрузки. Такая вот магия командной строки <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/384/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Отлов ошибок PECL класса HTTPRequest</title>
		<link>http://dev.good-guy.me/archives/377</link>
		<comments>http://dev.good-guy.me/archives/377#comments</comments>
		<pubDate>Wed, 30 Sep 2009 06:35:34 +0000</pubDate>
		<dc:creator>goodguy</dc:creator>
				<category><![CDATA[Языки]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://dev.goodguy.spb.ru/?p=377</guid>
		<description><![CDATA[В модуле pecl_http есть очень удобный, но при этом не всегда хорошо задокументированный класс HTTPRequest. Одной из проблем, с которой я столкнулся при работе с ним, это то, что в случае ошибок при HTTP-соединениях, выбрасывались исключения с текстами: (HttpInvalidParamException) Empty or too short HTTP message: '' Понятное дело, для отладки они не подходят. Но, если [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify">В модуле <tt>pecl_http</tt> есть очень удобный, но при этом не всегда хорошо задокументированный класс <tt>HTTPRequest</tt>. Одной из проблем, с которой я столкнулся при работе с ним, это то, что в случае ошибок при HTTP-соединениях, выбрасывались исключения с текстами:</p>
<p><code><br />
(HttpInvalidParamException) Empty or too short HTTP message: ''<br />
</code></p>
<p style="text-align: justify">Понятное дело, для отладки они не подходят. Но, если вывести исключение полностью, то обычно там как-раз и были подробности проблемы:</p>
<p><code><br />
exception 'HttpInvalidParamException' with message 'Empty or too short HTTP message: ''' in example.php:189 inner exception 'HttpRequestException' with message 'Timeout was reached; Operation timed out after 10000 milliseconds with 0 bytes received (https://example.ru/)' in example.php:160<br />
</code></p>
<p style="text-align: justify">Видно, что самое важное содержится в сообщении от inner exception. И его, оказывается, легко поймать, если поставить дополнительный блок <tt>catch</tt> на <tt>HTTPException</tt>, например:</p>
<pre name="code" class="php">
try {
    $request->send();
} catch (HttpException $ex) {
    if (isset($ex->innerException)){
        echo $ex->innerException->getMessage();
        exit;
    } else {
        echo $ex;
        exit;
    }
}
</pre>
<p style="text-align: justify">Информация получена <a href="http://www.markfosteronline.com/2009/01/06/how-to-pecl-http-request-exception-and-error-handling/">отсюда</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.good-guy.me/archives/377/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>PHP и SOAP Message Security</title>
		<link>http://dev.good-guy.me/archives/356</link>
		<comments>http://dev.good-guy.me/archives/356#comments</comments>
		<pubDate>Wed, 29 Apr 2009 15:44:29 +0000</pubDate>
		<dc:creator>goodguy</dc:creator>
				<category><![CDATA[Языки]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[безопасность]]></category>

		<guid isPermaLink="false">http://dev.goodguy.spb.ru/?p=356</guid>
		<description><![CDATA[Очередной случай из жизни натолкнул меня на мысль расписать, как из PHP создать подписанный по стандарту SOAP Message Security SOAP-запрос по SSL-соединению. Насколько я понимаю, стандарт этот не единственный, но используется достаточно широко и базируется на различных XML-стандартах W3C. Сама суть механизма подписи хорошо описана в этой статье, из которой и я почерпнул для себя [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify">Очередной случай из жизни натолкнул меня на мысль расписать, как из PHP создать подписанный по стандарту <a href="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0.pdf">SOAP Message Security</a> SOAP-запрос по SSL-соединению. Насколько я понимаю, стандарт этот не единственный, но используется достаточно широко и базируется на различных XML-стандартах W3C.
<p style="text-align: justify">Сама суть механизма подписи хорошо описана в <a href="http://xmlhack.ru/texts/03/wssecurity/wssecurity.html">этой статье</a>, из которой и я почерпнул для себя несколько полезных моментов, на которых возник ступор поначалу. Но предлагаемый мной вариант имеет одно важное дополнение: он добавляет в SOAP-сообщение ещё и информацию о сертификате, с помощью которого была сделана подпись. Кстати, меня удивила логика одной системы, для которой это делалось (кстати, написанной на Microsoft&#8217;овских компонентах): помимо сертификата в SSL-соединении они ещё проверяли сертификат и в самом запросе, хотя могли бы и воспользоваться данными HTTPS и тем самым получить ещё дополнительную проверку того, что соединение открыто тем самым агентом, который подписывал запрос.</p>
<p style="text-align: justify">Основным моментом в подписи является то, что собираются хэши (дайджесты) узлов с данными, которые будут подписаны (при этом узлы приводятся в <a href="http://www.w3.org/TR/2002/REC-xml-exc-c14n-20020718/">канонический вид</a> с помощью утилиты <tt>xmllint</tt> из комплекта <tt>libxml2</tt>). После чего собранные внутри одной «обёртки» дайджесты подписываются ключом сертификата, тем самым гарантируя, что если подпись верна, то данные в этих узлах не были изменены во время передачи запроса.</p>
<p style="text-align: justify">Класс так-же переписывает механизм HTTP-запроса к удалённому серверу, т.к. даже с помощью <tt>stream_context</tt> PHP не позволяет использовать совместно с SOAP сертификаты в формате PKCS12. В итоге используется <tt>HTTPRequest</tt>, результат которого уже транслируется далее в обработку.</p>
<ul>
<li> Собственно сам класс: <a href='http://dev.goodguy.spb.ru/wp-content/uploads/2009/04/signedsoapclient.zip'>SignedSoapClient.zip</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://dev.good-guy.me/archives/356/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
