<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>ByteFlow</title>
	
	<link>http://byteflow.hackndev.org/blog</link>
	<description>записки девелоперов</description>
	<pubDate>Sat, 09 May 2009 07:36:19 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<creativeCommons:license>http://creativecommons.org/licenses/by/3.0/</creativeCommons:license><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/Byteflow" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>OpenKyiv 2009 Call for Papers</title>
		<link>http://feedproxy.google.com/~r/Byteflow/~3/T-vmJNuY2Tk/</link>
		<comments>http://byteflow.hackndev.org/blog/index.php/2009/05/openkyiv-2009-call-for-papers/#comments</comments>
		<pubDate>Sat, 09 May 2009 07:35:20 +0000</pubDate>
		<dc:creator>Владимир Кириллов</dc:creator>
		
		<category><![CDATA[Записки]]></category>

		<guid isPermaLink="false">http://byteflow.hackndev.org/blog/?p=230</guid>
		<description><![CDATA[Начата активная подготовка к BSD-конференции OpenKyiv 2009, открыта регистрация.
Мы рады объявить начало периода сбора докладов на конференцию OpenKyiv. Докладчики приглашаются предоставить на рассмотрение свои работы, посвященные OpenBSD. OpenKyiv - единственная регулярная конференция BSD на пост-советском пространстве, проходящая в Киеве.
Просмотрите страницу конференции для получения более подробной информации, регистрации, а также деталей о предстоящих событиях.

регистрация: http://uaoug.org.ua/openkyiv/2009/register
информация по [...]]]></description>
			<content:encoded><![CDATA[<p>Начата активная подготовка к BSD-конференции OpenKyiv 2009, открыта регистрация.</p>
<blockquote><p>Мы рады объявить начало периода сбора докладов на конференцию OpenKyiv. Докладчики приглашаются предоставить на рассмотрение свои работы, посвященные OpenBSD. OpenKyiv - единственная регулярная конференция BSD на пост-советском пространстве, проходящая в Киеве.</p>
<p>Просмотрите страницу конференции для получения более подробной информации, регистрации, а также деталей о предстоящих событиях.
</p></blockquote>
<p>регистрация: <a href="http://uaoug.org.ua/openkyiv/2009/register" onclick="pageTracker._trackPageview('/outgoing/uaoug.org.ua/openkyiv/2009/register?referer=');">http://uaoug.org.ua/openkyiv/2009/register</a><br />
информация по сбору: <a href="http://uaoug.org.ua/openkyiv/2009/callforpapers" onclick="pageTracker._trackPageview('/outgoing/uaoug.org.ua/openkyiv/2009/callforpapers?referer=');">http://uaoug.org.ua/openkyiv/2009/callforpapers</a><br />
общая информация по конференции: <a href="http://uaoug.org.ua/openkyiv/2009" onclick="pageTracker._trackPageview('/outgoing/uaoug.org.ua/openkyiv/2009?referer=');">http://uaoug.org.ua/openkyiv/2009</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Byteflow?a=T-vmJNuY2Tk:WliBlGPpdAA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Byteflow?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Byteflow?a=T-vmJNuY2Tk:WliBlGPpdAA:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Byteflow?i=T-vmJNuY2Tk:WliBlGPpdAA:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Byteflow?a=T-vmJNuY2Tk:WliBlGPpdAA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Byteflow?i=T-vmJNuY2Tk:WliBlGPpdAA:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Byteflow/~4/T-vmJNuY2Tk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://byteflow.hackndev.org/blog/index.php/2009/05/openkyiv-2009-call-for-papers/feed/</wfw:commentRss>
		<feedburner:origLink>http://byteflow.hackndev.org/blog/index.php/2009/05/openkyiv-2009-call-for-papers/</feedburner:origLink></item>
		<item>
		<title>Byteflow, нам уже 9 месяцев!</title>
		<link>http://feedproxy.google.com/~r/Byteflow/~3/ZZ9SxV1muSc/</link>
		<comments>http://byteflow.hackndev.org/blog/index.php/2009/02/byteflow-%d0%bd%d0%b0%d0%bc-%d1%83%d0%b6%d0%b5-7-%d0%bc%d0%b5%d1%81%d1%8f%d1%86%d0%b5%d0%b2/#comments</comments>
		<pubDate>Tue, 10 Feb 2009 23:55:48 +0000</pubDate>
		<dc:creator>Владимир Пузанов</dc:creator>
		
		<category><![CDATA[ByteFlow]]></category>

		<guid isPermaLink="false">http://byteflow.hackndev.org/blog/?p=227</guid>
		<description><![CDATA[Очень разует что нас читают. Значит пишем полезные вещи! Значит людям это интересно.
Итод по сайтам, с которых попадают на byteflow: лидирует личный сайт Владимира Кириллова, почти догнал его сайт украинского сообщества программистов (Макс, спасибо что пригласил в ленту!), четвертым (DOU заняло 2 и 3 позиции по двум ссылкам) идет Google Reader и подводит итог пятерке [...]]]></description>
			<content:encoded><![CDATA[<p>Очень разует что нас читают. Значит пишем полезные вещи! Значит людям это интересно.</p>
<p>Итод по сайтам, с которых попадают на byteflow: лидирует личный сайт <a href="http://darkproger.net/" onclick="pageTracker._trackPageview('/outgoing/darkproger.net/?referer=');">Владимира Кириллова</a>, почти догнал его <a href="http://developers.org.ua" onclick="pageTracker._trackPageview('/outgoing/developers.org.ua?referer=');">сайт украинского сообщества программистов</a> (Макс, спасибо что пригласил в ленту!), четвертым (DOU заняло 2 и 3 позиции по двум ссылкам) идет <a href="http://google.com/reader" onclick="pageTracker._trackPageview('/outgoing/google.com/reader?referer=');">Google Reader</a> и подводит итог пятерке <a href="http://hackndev.org" onclick="pageTracker._trackPageview('/outgoing/hackndev.org?referer=');">иформационная страничка проектов Hack&#038;Dev</a>.</p>
<p>Поисковые запросы, приводящие на byteflow вполне закономерны. С существенным отрывом идет термин &#8220;objective-c&#8221;. На втором месте - &#8220;мировой чат&#8221; (наш конспиратор rilian - гений, написал <a href="http://byteflow.hackndev.org/blog/index.php/2008/08/world-chat-with-set-language/">заметку</a> почти ни о чем, а она срывает все сливки). Далее собственно &#8220;byteflow&#8221; (русский и украинский варианты гугла отдают ссылку на нас на первой странице), &#8220;wchar_t&#8221; и &#8220;cocotron&#8221;.</p>
<p>Самые читаемые статьи: <a href="http://byteflow.hackndev.org/blog/index.php/2008/09/mac-os-пол-года-спустя/">моя заметка о ПО для OSX</a>, <a href="http://byteflow.hackndev.org/blog/index.php/2008/10/динамические-древовидные-меню-на-iphone/">еще моя заметка про меню на iPhone</a>, <a href="http://byteflow.hackndev.org/blog/index.php/2008/06/objective-c-зачем-оно-и-с-чем-его-есть/">снова моя заметка о Obj-C</a>, ну и наконец страница обо мне и о Владимире Кириллове. Мировые чаты - это хорошо, но не достаточно :)</p>
<p>620 хитов за январь по данным wordpress.com и 390 - по google analytics. Из чего следует, что половина пользователей гуглового аналитика режет как баннер :)</p>
<p>Треть пользователей остается с нами. Это радует, хотя ставит под сомнение количество читающих на feedburner&#8217;е. Если не RSS - как сюда попадают?</p>
<p>Пользователей Firefox на Windows и Safari на Mac почти поровну. Блог читают даже пользователи OpenBSD, и я знаю кто. :)</p>
<p>Статистика по хитам с гугловой аналитики подтверждает цифры с wordpress.com.</p>
<p>Несколько выводов для отображения общей картины, в форме тезисов. Блог полезен не только нам. По Objective-C на русском информации мало. Мировой чат - актуальна тема.</p>
<p>Постараемься и дальше радовать старых и новых читателей, хотя многие статьи выглядят скорее короткими заметками, в других часто путается логичность изложения, ну и у меня хромает грамматика русского языка или пальцы бегают мимо нужных букв (за остальными авторами не замечал). :)</p>
<p>PS: WP&#8217;шный интерфейс для создания постов ужасно неудобен при больших объемах стати. Надо придумать какую-то реальную замену, TextMate нагрузить снова что-ли?..</p>
<p>PPS: хм, пересчитал месяца по архиву - получилось не семь, а девять. Ночью спать надо, а не заметки писать&#8230;</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/Byteflow?a=wz9YibVj"><img src="http://feeds.feedburner.com/~f/Byteflow?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/Byteflow?a=kp2tQmGD"><img src="http://feeds.feedburner.com/~f/Byteflow?i=kp2tQmGD" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/Byteflow?a=Oly5fRKV"><img src="http://feeds.feedburner.com/~f/Byteflow?i=Oly5fRKV" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Byteflow/~4/ZZ9SxV1muSc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://byteflow.hackndev.org/blog/index.php/2009/02/byteflow-%d0%bd%d0%b0%d0%bc-%d1%83%d0%b6%d0%b5-7-%d0%bc%d0%b5%d1%81%d1%8f%d1%86%d0%b5%d0%b2/feed/</wfw:commentRss>
		<feedburner:origLink>http://byteflow.hackndev.org/blog/index.php/2009/02/byteflow-%d0%bd%d0%b0%d0%bc-%d1%83%d0%b6%d0%b5-7-%d0%bc%d0%b5%d1%81%d1%8f%d1%86%d0%b5%d0%b2/</feedburner:origLink></item>
		<item>
		<title>Cappuccino, из чего состоит программа</title>
		<link>http://feedproxy.google.com/~r/Byteflow/~3/1rYC84yN0OA/</link>
		<comments>http://byteflow.hackndev.org/blog/index.php/2009/02/cappuccino-%d0%b8%d0%b7-%d1%87%d0%b5%d0%b3%d0%be-%d1%81%d0%be%d1%81%d1%82%d0%be%d0%b8%d1%82-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b0/#comments</comments>
		<pubDate>Tue, 10 Feb 2009 21:11:17 +0000</pubDate>
		<dc:creator>Владимир Пузанов</dc:creator>
		
		<category><![CDATA[Cappuccino]]></category>

		<category><![CDATA[Objective-J]]></category>

		<category><![CDATA[Web]]></category>

		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://byteflow.hackndev.org/blog/?p=223</guid>
		<description><![CDATA[Сделал небольшой перерыв на осмысление задачи, на которой бы демонстрировал Cappuccino, под руку подвернулось задание с собеседования на Bindows. Вкратце - сделать адресную книгу на базе данных в xml.
В этой статье я рассмотрю элементы программы на Cappuccino, а далее приступим к моментам практической реализации.
И так, новый проект на Cappuccino состоит из следующих файлов.
index.html и index-debug.html. [...]]]></description>
			<content:encoded><![CDATA[<p>Сделал небольшой перерыв на осмысление задачи, на которой бы демонстрировал Cappuccino, под руку подвернулось задание с собеседования на Bindows. Вкратце - сделать адресную книгу на базе данных в xml.</p>
<p>В этой статье я рассмотрю элементы программы на Cappuccino, а далее приступим к моментам практической реализации.<span id="more-223"></span></p>
<p>И так, новый проект на Cappuccino состоит из следующих файлов.<br />
<strong>index.html</strong> и <strong>index-debug.html</strong>. Это точки запуска веб-приложения. Отличаются друг от друга только путями поиска библиотек (в index-debug отладочные версии идут первыми). Содержимое файлов отображается в броузере пока необходимые для работы программы файлы не загрузятся, после чего содержимое будет полностью удалено и управление содержимым окна полностью перейдет к Cappuccino.</p>
<p><strong>main.j</strong>. Как и в С, в objective-J программа начинается с функции main. Единственная задача main - запустить собственно Cappuccino. Как рантайм узнает, кому передавать управление? Очень просто:</p>
<p><strong>Info.plist</strong> описывает несколько важных параметров, один из которых, CPApplicationDelegateClass - имя класса выступаещего делегатом приложения. Экземпляр именно этого класса получит сообщение  <em>applicationDidFinishLaunching:</em>. Обращу ваше внимание на то, что main.j содержит следующую строчку:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">@import <span style="color: #bf1d1a;">&quot;AppController.j&quot;</span></pre></div></div>

<p>без этого класс не загрузится, и рантайм не будет знать, где его искать.</p>
<p><strong>AppController.j</strong> содержит реализацию делегата программы. Собственно именно тут и начинается магия Cappuccino, прямо с <em>applicationDidFinishLaunching:</em>.</p>
<p>В отличие от Objective-C, в Objective-J нет описания классов (interface), только реализация (implementation). Список переменных класса соответственно перенесен в реализацию.</p>
<p>В коде по умолчанию контроллер создает окно на весь экран и в нем лейбл &#8220;Hello world&#8221;. Безжалостно уничтожим этот код :)</p>
<p>Наше главное окно будет содержать список контактов в виде, похожем на Address Book из OSX: слева список контактов, справа - вид карточки. Начнем с описания полноценного перемещаемого окна:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@implementation</span> AppController <span style="color: #002200;">:</span> CPObject
<span style="color: #002200;">&#123;</span>
    CPWindow contactsWindow;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>applicationDidFinishLaunching<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>CPNotification<span style="color: #002200;">&#41;</span>aNotification
<span style="color: #002200;">&#123;</span>
    <span style="color: #11740a; font-style: italic;">// initialize primary window</span>
    contactsWindow <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>CPWindow alloc<span style="color: #002200;">&#93;</span>
                      initWithContentRect<span style="color: #002200;">:</span>CPMakeRect<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">50</span>,<span style="color: #2400d9;">50</span>,<span style="color: #2400d9;">600</span>,<span style="color: #2400d9;">300</span><span style="color: #002200;">&#41;</span>
                      styleMask<span style="color: #002200;">:</span>CPTitledWindowMask|CPResizableWindowMask|CPTexturedBackgroundWindowMask<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>contactsWindow setTitle<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Address Book&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>contactsWindow setMinSize<span style="color: #002200;">:</span>CPMakeSize<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">400</span>,<span style="color: #2400d9;">300</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
    var cwView <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>contactsWindow contentView<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Ссылка на основное окно нам еще пригодится, потому мы сохраним ее в ivar нашего контроллера. Все что нам не пригодится - описываем локально (например cwView). JavaScript - язык не типизированный, так что вместо типа переменной необходимо писать JS&#8217;ный var.</p>
<p>Еще одно замечание насчет документации и поиска методов у классов - очень советую поставить doxygen и перегенерить доки (ant documentation). На сайте они устарели. Кроме того я на днях нашел проблему с пропаданием методов (doxygen вообще использует синтаксис Obj-C, и на некоторых местах его парсер ломается), так что на днях надеюсь допинать апстрим новой, более полной документацией.</p>
<p>И так, мы создали новое окно в заданном прямоугольнике, с заголовком (CPTitledWindowMask), возможностью изменять размер (CPResizableWindowMask) и текстурированным фоном (CPTexturedBackgroundWindowMask). Так же задали текст заголовка и минимальный размер. Для полного счастья можно попросить окно появиться:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">&#91;</span>contactsWindow orderFront<span style="color: #002200;">:</span>self<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>и запустив index.html поигратся с перетягиванием и изменением размера пустого и пока что совершенно бесполезного окна. Хотя неплохо, как для четырех строчек.</p>
<p>Теперь рассмотрим, как нам получить и обработать данные с сервера. Для этого мы заведем новый класс ABManager, производный от CPObject в файле ABManager.j. Поскольку оригинальный xml распарсить можно только средствами JS, то я решил прикрутить немного XSLT, для того чтобы больше раскрыть работу с объектами и немного KVC (Key-Value Coding) Cappuccino. Код получился не очень красивый и отягощенный поддержкой гадкого IE.</p>
<p>Исходный XML выглядит так:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;AddressBook<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Contact<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;CustomerID<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>ALFKI<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/CustomerID<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;CompanyName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Alfreds Futterkiste<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/CompanyName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ContactName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Maria Anders<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ContactName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ContactTitle<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Sales Representative<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ContactTitle<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Address<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Obere Str. 57<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Address<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;City<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Berlin<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/City<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Email<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>dummy@gmail.com<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Email<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;PostalCode<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>12209<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/PostalCode<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Country<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Germany<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Country<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Phone<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>030-0074321<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Phone<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Fax<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>030-0076545<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Fax<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Contact<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Contact<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;CustomerID<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>ANATR<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/CustomerID<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;CompanyName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Ana Trujillo Emparedados y helados<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/CompanyName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ContactName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Ana Trujillo<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ContactName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ContactTitle<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Owner<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ContactTitle<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Address<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Avda. de la Constitución 2222<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Address<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;City<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>México D.F.<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/City<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Email<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>dummy@gmail.com<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Email<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;PostalCode<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>05021<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/PostalCode<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Country<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Mexico<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Country<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Phone<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>(5) 555-4729<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Phone<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Fax<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>(5) 555-3745<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Fax<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Contact<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	...
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/AddressBook<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Из него надо сделать <a href="http://www.apple.com/DTDs/PropertyList-1.0.dtd" onclick="pageTracker._trackPageview('/outgoing/www.apple.com/DTDs/PropertyList-1.0.dtd?referer=');">property list</a> (plist&#8217;ы повсемесно используются как и в Макоси, так и в производной от Cocoa - Cappuccino). Делается конвертация одним простым XSLT:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:stylesheet</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span></span>
<span style="color: #009900;">                <span style="color: #000066;">xmlns:xsl</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/1999/XSL/Transform&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:output</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span> <span style="color: #000066;">indent</span>=<span style="color: #ff0000;">&quot;yes&quot;</span> <span style="color: #000066;">method</span>=<span style="color: #ff0000;">&quot;xml&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:template</span> <span style="color: #000066;">match</span>=<span style="color: #ff0000;">&quot;/AddressBook&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;plist</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;array<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:apply-templates</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;Contact&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/array<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/plist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:template<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:template</span> <span style="color: #000066;">match</span>=<span style="color: #ff0000;">&quot;/AddressBook/Contact&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;dict<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:apply-templates</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;*&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dict<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:template<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:template</span> <span style="color: #000066;">match</span>=<span style="color: #ff0000;">&quot;/AddressBook/Contact/*&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;xsl:value-of</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;name()&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;xsl:value-of</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;text()&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:template<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:stylesheet<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Тут мы сначала находим элемент AddressBook и создаем базовый тег plist и array контактов. Потом для каждого Contact мы делаем новый dict, в который через последнее правило записывем пары ключ-значение на базе имени тега. Таким образом из обработанного plist можно получить город пятого контакта путем вызова</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>contacts objectAtIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">4</span><span style="color: #002200;">&#93;</span> valueForKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">&quot;City&quot;</span><span style="color: #002200;">&#93;</span></pre></div></div>

<p>.</p>
<p>И так, наш ABManager. Должен уметь грузить контакты, и отдавать их список:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@implementation</span> ABManager <span style="color: #002200;">:</span> CPObject
<span style="color: #002200;">&#123;</span>
    CPArray _contacts;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Для начала загрузим входной xml и xslt:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>initWithXML<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>CPString<span style="color: #002200;">&#41;</span>path
<span style="color: #002200;">&#123;</span>
    self <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>super init<span style="color: #002200;">&#93;</span>;
&nbsp;
    var xml <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>CPURLConnection
                      sendSynchronousRequest<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>CPURLRequest requestWithURL<span style="color: #002200;">:</span>path<span style="color: #002200;">&#93;</span>
                      returningResponse<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span>
                      error<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>xml <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span>
        <span style="color: #a61390;">return</span> <span style="color: #a61390;">nil</span>;
&nbsp;
    var xslt <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>CPURLConnection
                sendSynchronousRequest<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>CPURLRequest requestWithURL<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;abplist.xsl&quot;</span><span style="color: #002200;">&#93;</span>
                returningResponse<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span>
                error<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>xslt <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span>
        <span style="color: #a61390;">return</span> <span style="color: #a61390;">nil</span>;</pre></div></div>

<p>В Cappuccino очень просто делать синхронные или асинхронные запросы в сеть. CPURL пока что отсутствует, и вместо него следует использовать просто CPString (т.е. строку).</p>
<p>Теперь несколько кросс-броузерной магии. В начало файла добавим функцию (не забывайте - писать можно все что является правильным JS):</p>

<div class="wp_syntax"><div class="code"><pre class="js" style="font-family:monospace;">function XmlFromString(xmlData)
{
	if (window.ActiveXObject) {
		//for IE
		xmlDoc=new ActiveXObject(&quot;Microsoft.XMLDOM&quot;);
		xmlDoc.async=&quot;false&quot;;
		xmlDoc.loadXML(xmlData);
		return xmlDoc;
	} else if (document.implementation &amp;&amp; document.implementation.createDocument) {
		//for Mozila
		parser=new DOMParser();
		xmlDoc=parser.parseFromString(xmlData,&quot;text/xml&quot;);
		return xmlDoc;
	}
}</pre></div></div>

<p>XmlFromString на вход получает строку, на выходе - обработанный Document. Теперь можно получить из двух строк два документа и трансформировать xml из полученного абстрактного типа в конкретный plist:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">    var xmlDoc  <span style="color: #002200;">=</span> XmlFromString<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>xml <span style="color: #a61390;">string</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
    var xsltDoc <span style="color: #002200;">=</span> XmlFromString<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>xslt <span style="color: #a61390;">string</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
    var plist <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;
&nbsp;
    <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>window.ActiveXObject<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
        plist <span style="color: #002200;">=</span> xmlDoc.transformNode<span style="color: #002200;">&#40;</span>xsltDoc<span style="color: #002200;">&#41;</span>;
        plist <span style="color: #002200;">=</span> plist.xml;
    <span style="color: #002200;">&#125;</span> <span style="color: #a61390;">else</span> <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>document.implementation<span style="color: #002200;">&amp;&amp;</span> document.implementation.createDocument<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
        xsltProcessor <span style="color: #002200;">=</span> new XSLTProcessor<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span>;
        xsltProcessor.importStylesheet<span style="color: #002200;">&#40;</span>xsltDoc<span style="color: #002200;">&#41;</span>;
        plist <span style="color: #002200;">=</span> xsltProcessor.transformToFragment<span style="color: #002200;">&#40;</span>xmlDoc, document<span style="color: #002200;">&#41;</span>;
        plist <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span>new XMLSerializer<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span>.serializeToString<span style="color: #002200;">&#40;</span>plist<span style="color: #002200;">&#41;</span>;
    <span style="color: #002200;">&#125;</span> <span style="color: #a61390;">else</span>
        <span style="color: #a61390;">return</span> <span style="color: #a61390;">nil</span>;</pre></div></div>

<p>А plist уже распарсит Cappuccino:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">    _contacts <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>CPData alloc<span style="color: #002200;">&#93;</span> initWithString<span style="color: #002200;">:</span>plist<span style="color: #002200;">&#93;</span> plistObject<span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #a61390;">return</span> self;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Кстати, в данный момент в IE это не работает, там парсер plist несколько сломан. Патч <a href="http://cappuccino.lighthouseapp.com/projects/16499/tickets/216-plist-parser-fails-on-ie8-when-theres-no-dtd-header-in-xml#ticket-216-2" onclick="pageTracker._trackPageview('/outgoing/cappuccino.lighthouseapp.com/projects/16499/tickets/216-plist-parser-fails-on-ie8-when-theres-no-dtd-header-in-xml_ticket-216-2?referer=');">тут</a>, если кто тестит только в IE. На Firefox и WebKit-based все работает отлично.</p>
<p>Еще добавим getter-метод для нашего списка контактов и получим вот такой вот ABManager.j:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">@import &lt;Foundation<span style="color: #002200;">/</span>CPObject.j&gt;
&nbsp;
<span style="color: #11740a; font-style: italic;">/*!
    Helper function to load xml documents
*/</span>
function XmlFromString<span style="color: #002200;">&#40;</span>xmlData<span style="color: #002200;">&#41;</span>
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>window.ActiveXObject<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
		<span style="color: #11740a; font-style: italic;">//for IE</span>
		xmlDoc<span style="color: #002200;">=</span>new ActiveXObject<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;Microsoft.XMLDOM&quot;</span><span style="color: #002200;">&#41;</span>;
		xmlDoc.async<span style="color: #002200;">=</span><span style="color: #bf1d1a;">&quot;false&quot;</span>;
		xmlDoc.loadXML<span style="color: #002200;">&#40;</span>xmlData<span style="color: #002200;">&#41;</span>;
		<span style="color: #a61390;">return</span> xmlDoc;
	<span style="color: #002200;">&#125;</span> <span style="color: #a61390;">else</span> <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>document.implementation <span style="color: #002200;">&amp;&amp;</span> document.implementation.createDocument<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
		<span style="color: #11740a; font-style: italic;">//for Mozila</span>
		parser<span style="color: #002200;">=</span>new DOMParser<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span>;
		xmlDoc<span style="color: #002200;">=</span>parser.parseFromString<span style="color: #002200;">&#40;</span>xmlData,<span style="color: #bf1d1a;">&quot;text/xml&quot;</span><span style="color: #002200;">&#41;</span>;
		<span style="color: #a61390;">return</span> xmlDoc;
	<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">/*!
    Core class that manages address book. It loads given ab.xml, converts it
    into plist and stores in contacts.
*/</span>
<span style="color: #a61390;">@implementation</span> ABManager <span style="color: #002200;">:</span> CPObject
<span style="color: #002200;">&#123;</span>
    CPArray _contacts;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">/*!
    Used to initialize ABController
    @param path path to XML document with contacts data
*/</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>initWithXML<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>CPString<span style="color: #002200;">&#41;</span>path
<span style="color: #002200;">&#123;</span>
    self <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>super init<span style="color: #002200;">&#93;</span>;
&nbsp;
    var xml <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>CPURLConnection
                      sendSynchronousRequest<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>CPURLRequest requestWithURL<span style="color: #002200;">:</span>path<span style="color: #002200;">&#93;</span>
                      returningResponse<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span>
                      error<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>xml <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span>
        <span style="color: #a61390;">return</span> <span style="color: #a61390;">nil</span>;
&nbsp;
    var xslt <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>CPURLConnection
                sendSynchronousRequest<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>CPURLRequest requestWithURL<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;abplist.xsl&quot;</span><span style="color: #002200;">&#93;</span>
                returningResponse<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span>
                error<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>xslt <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span>
        <span style="color: #a61390;">return</span> <span style="color: #a61390;">nil</span>;
&nbsp;
    <span style="color: #11740a; font-style: italic;">// now some js crap to convert xml :)</span>
    var xmlDoc  <span style="color: #002200;">=</span> XmlFromString<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>xml <span style="color: #a61390;">string</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
    var xsltDoc <span style="color: #002200;">=</span> XmlFromString<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>xslt <span style="color: #a61390;">string</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
    var plist <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;
&nbsp;
    <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>window.ActiveXObject<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
        plist <span style="color: #002200;">=</span> xmlDoc.transformNode<span style="color: #002200;">&#40;</span>xsltDoc<span style="color: #002200;">&#41;</span>;
        plist <span style="color: #002200;">=</span> plist.xml;
    <span style="color: #002200;">&#125;</span> <span style="color: #a61390;">else</span> <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>document.implementation<span style="color: #002200;">&amp;&amp;</span> document.implementation.createDocument<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
        xsltProcessor <span style="color: #002200;">=</span> new XSLTProcessor<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span>;
        xsltProcessor.importStylesheet<span style="color: #002200;">&#40;</span>xsltDoc<span style="color: #002200;">&#41;</span>;
        plist <span style="color: #002200;">=</span> xsltProcessor.transformToFragment<span style="color: #002200;">&#40;</span>xmlDoc, document<span style="color: #002200;">&#41;</span>;
        plist <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span>new XMLSerializer<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span>.serializeToString<span style="color: #002200;">&#40;</span>plist<span style="color: #002200;">&#41;</span>;
    <span style="color: #002200;">&#125;</span> <span style="color: #a61390;">else</span>
        <span style="color: #a61390;">return</span> <span style="color: #a61390;">nil</span>;
&nbsp;
    _contacts <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>CPData alloc<span style="color: #002200;">&#93;</span> initWithString<span style="color: #002200;">:</span>plist<span style="color: #002200;">&#93;</span> plistObject<span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #a61390;">return</span> self;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">/*!
    Just a getter method
*/</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>CPArray<span style="color: #002200;">&#41;</span>contacts
<span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">return</span> _contacts;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>(я постараюсь создать репозиторий, где в ревизиях будет история по статьям. Пока что спасайтесь копипастом).</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/Byteflow?a=fMz3WIl9"><img src="http://feeds.feedburner.com/~f/Byteflow?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/Byteflow?a=N8dnUxrH"><img src="http://feeds.feedburner.com/~f/Byteflow?i=N8dnUxrH" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/Byteflow?a=tbrHRhYI"><img src="http://feeds.feedburner.com/~f/Byteflow?i=tbrHRhYI" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Byteflow/~4/1rYC84yN0OA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://byteflow.hackndev.org/blog/index.php/2009/02/cappuccino-%d0%b8%d0%b7-%d1%87%d0%b5%d0%b3%d0%be-%d1%81%d0%be%d1%81%d1%82%d0%be%d0%b8%d1%82-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b0/feed/</wfw:commentRss>
		<feedburner:origLink>http://byteflow.hackndev.org/blog/index.php/2009/02/cappuccino-%d0%b8%d0%b7-%d1%87%d0%b5%d0%b3%d0%be-%d1%81%d0%be%d1%81%d1%82%d0%be%d0%b8%d1%82-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b0/</feedburner:origLink></item>
		<item>
		<title>Cappuccino, часть первая</title>
		<link>http://feedproxy.google.com/~r/Byteflow/~3/ZxcAhVlg328/</link>
		<comments>http://byteflow.hackndev.org/blog/index.php/2009/01/cappuccino-%d1%87%d0%b0%d1%81%d1%82%d1%8c-%d0%bf%d0%b5%d1%80%d0%b2%d0%b0%d1%8f/#comments</comments>
		<pubDate>Fri, 30 Jan 2009 12:45:57 +0000</pubDate>
		<dc:creator>Владимир Пузанов</dc:creator>
		
		<category><![CDATA[Cappuccino]]></category>

		<category><![CDATA[Web]]></category>

		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://byteflow.hackndev.org/blog/?p=218</guid>
		<description><![CDATA[Я хочу попробовать написать цикл статей, в которых пропробую раскрыть функциональный возможности новой интересной платформы Cappuccino.
Для начала, краткое введение в курс дела. Cappuccino - это веб фреймворк, который упрощает создание полнофункциональных клиентских веб-приложений, которые работают в броузере.

Cappuccino основан на JavaScript и реализует часть общеупобребляемых API из GNUstep и Apple Cocoa. При программировании на Cappuccino, разработчик [...]]]></description>
			<content:encoded><![CDATA[<p>Я хочу попробовать написать цикл статей, в которых пропробую раскрыть функциональный возможности новой интересной платформы Cappuccino.</p>
<p>Для начала, краткое введение в курс дела. <a href="http://www.cappuccino.org/" onclick="pageTracker._trackPageview('/outgoing/www.cappuccino.org/?referer=');">Cappuccino</a> - это веб фреймворк, который упрощает создание полнофункциональных клиентских веб-приложений, которые работают в броузере.<br />
<span id="more-218"></span></p>
<p>Cappuccino основан на JavaScript и реализует часть общеупобребляемых API из GNUstep и Apple Cocoa. При программировании на Cappuccino, разработчик думает не понятиями HTML-документа, CSS или DOM модели, а окнами, видами, кнопками в конце концов.</p>
<p>Cappuccino основан на языке программирования Objective-J, который сделан по образу и подобию Objective-C как суперсет JavaScript.</p>
<p>Для примера того, как это выглядит, посмотрите на <a href="http://280slides.com/" onclick="pageTracker._trackPageview('/outgoing/280slides.com/?referer=');">280slides</a>, <a href="http://cappuccino.org/learn/demos/FlickrPhotoDemo/" onclick="pageTracker._trackPageview('/outgoing/cappuccino.org/learn/demos/FlickrPhotoDemo/?referer=');">Flickr Photo Demo</a>, <a href="http://cappuccino.org/learn/demos/FloorPlan/" onclick="pageTracker._trackPageview('/outgoing/cappuccino.org/learn/demos/FloorPlan/?referer=');">Floor Plan</a>. Очень впечатляющие демонстрации, особенно впечатляет количество написанного кода.</p>
<p>Ладно, давайте уже программить, нет ничего лучше чем пример кода. Я пишу эту статью, основываясь на том, что читатели знакомы с базовыми понятиями *NIX, у них есть git, java, и оптимально - OSX :)</p>
<p>С Cappuccino можно работать двумя путями - или скачать <a href="http://cappuccino.org/starter/" onclick="pageTracker._trackPageview('/outgoing/cappuccino.org/starter/?referer=');">пакет для начинающих</a>, или поставить свежую версию из git. Первый путь не вызывает никаких проблем, так что далее я рассматриваю только второй.</p>
<p>И так, еще раз о необходимых утилитах: git для получения репозитория, ant для сборки (минимальная версия 1.7.0), gcc (по сути только нужен только препроцессор С: cpp). Опционально - doxygen для генерации API доков, но они и так <a href="http://cappuccino.org/learn/documentation/annotated.html" onclick="pageTracker._trackPageview('/outgoing/cappuccino.org/learn/documentation/annotated.html?referer=');">есть</a> на офсайте.</p>
<p>Начинаем с того, что клонируем дерево:<br />
<code>git clone git://github.com/280north/cappuccino.git cappuccino</code></p>
<p>Теперь нужно указать Cappuccino, куда складывать собираемые файлы:<br />
<code>export STEAM_BUILD="~/temp/steam-build"</code><br />
(указанный каталог должен существовать в ФС).</p>
<p>Еще хочу отметить что Rhino (интерпретатор JavaScript) на OSX и JVM 1.6 не работает как надо (насчет остальных ОС не уверен), так что при сборке Cappuccino лучше иметь активной JVM 1.5.</p>
<p>И так, переходим в каталог с Cappuccino и выполняем сборку:<br />
<code>cd cappuccino<br />
sudo echo<br />
# (если sudo у вас в системе спрашивает пароль - то это его<br />
# закеширует на пару минут, для установки Cappuccino в /usr/local/share/<br />
ant bootstrap<br />
ant all</code></p>
<p>После этого у вас будет собранный в /usr/local/share/objj Cappuccino, и симлинки в /usr/local/bin.</p>
<p>Для того чтобы убедится, что все работает, создадим тестовый проект:<br />
<code>steam create TestApp -l</code><br />
и если все нормально, откроем index-debug.html в броузере.</p>
<p>В следующей части мы рассмотрим элементы программы на Cappuccino.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/Byteflow?a=RCTalWcy"><img src="http://feeds.feedburner.com/~f/Byteflow?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/Byteflow?a=D0ukZmMC"><img src="http://feeds.feedburner.com/~f/Byteflow?i=D0ukZmMC" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/Byteflow?a=BtXeMjlO"><img src="http://feeds.feedburner.com/~f/Byteflow?i=BtXeMjlO" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Byteflow/~4/ZxcAhVlg328" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://byteflow.hackndev.org/blog/index.php/2009/01/cappuccino-%d1%87%d0%b0%d1%81%d1%82%d1%8c-%d0%bf%d0%b5%d1%80%d0%b2%d0%b0%d1%8f/feed/</wfw:commentRss>
		<feedburner:origLink>http://byteflow.hackndev.org/blog/index.php/2009/01/cappuccino-%d1%87%d0%b0%d1%81%d1%82%d1%8c-%d0%bf%d0%b5%d1%80%d0%b2%d0%b0%d1%8f/</feedburner:origLink></item>
		<item>
		<title>Простое решение для HTTP-запросов</title>
		<link>http://feedproxy.google.com/~r/Byteflow/~3/Wt4Ulp9s88c/</link>
		<comments>http://byteflow.hackndev.org/blog/index.php/2009/01/%d0%bf%d1%80%d0%be%d1%81%d1%82%d0%be%d0%b5-%d1%80%d0%b5%d1%88%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b4%d0%bb%d1%8f-http-%d0%b7%d0%b0%d0%bf%d1%80%d0%be%d1%81%d0%be%d0%b2/#comments</comments>
		<pubDate>Sat, 10 Jan 2009 20:25:35 +0000</pubDate>
		<dc:creator>Владимир Пузанов</dc:creator>
		
		<category><![CDATA[Objective-C]]></category>

		<category><![CDATA[iPhone]]></category>

		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://byteflow.hackndev.org/blog/?p=215</guid>
		<description><![CDATA[Для приложений под iPhone которые взаимодействуют с веб-сервисами актуальны запросы по HTTP для получения каких либо данных от сервера. Далее я покажу простой метод для реализации такого запроса.
Самый простой вариант - блокируемые сокеты (запрос послали, тут же его и получили). Он не может быть применен в основном потоке, так как интерфейс &#8220;залипнет&#8221;, но ничего не [...]]]></description>
			<content:encoded><![CDATA[<p>Для приложений под iPhone которые взаимодействуют с веб-сервисами актуальны запросы по HTTP для получения каких либо данных от сервера. Далее я покажу простой метод для реализации такого запроса.<span id="more-215"></span></p>
<p>Самый простой вариант - блокируемые сокеты (запрос послали, тут же его и получили). Он не может быть применен в основном потоке, так как интерфейс &#8220;залипнет&#8221;, но ничего не мешает сделать для него отдельный поток.</p>
<p>В нашей гипотетической ситуации необходим класс, который получит набор аргументов, URL, выполнит запрос на удаленном сервере и вернет какой-либо документ (предположим что сервер возвращает XML по DTD Apple Property List).</p>
<p>Объявим несколько констант:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">static</span> <span style="color: #a61390;">const</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>kURLKey <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;__url__&quot;</span>;
<span style="color: #a61390;">static</span> <span style="color: #a61390;">const</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>kErrorKey <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;__error__&quot;</span>;
<span style="color: #a61390;">static</span> <span style="color: #a61390;">const</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>kSelectorKey <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;__selector__&quot;</span>;
<span style="color: #a61390;">static</span> <span style="color: #a61390;">const</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>kTargetKey <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;__target__&quot;</span>;
<span style="color: #a61390;">static</span> <span style="color: #a61390;">const</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>kMultipartKey <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;__multipart__&quot;</span>;</pre></div></div>

<p>Они пригодятся в функции, которая будет создавать поток для выполнения запроса (в него можно передать только один объект - это будет NSDictionary с параметрами):</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>sendAsyncRequest<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>url withPayload<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSDictionary</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>post multipart<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>mp target<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>tar selector<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">SEL</span><span style="color: #002200;">&#41;</span>sel
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSMutableDictionary</span> <span style="color: #002200;">*</span>dic <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableDictionary</span> alloc<span style="color: #002200;">&#93;</span> initWithDictionary<span style="color: #002200;">:</span>post<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>dic setObject<span style="color: #002200;">:</span>url forKey<span style="color: #002200;">:</span>kURLKey<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>dic setObject<span style="color: #002200;">:</span>tar forKey<span style="color: #002200;">:</span>kTargetKey<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>dic setObject<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSNumber</span> numberWithBool<span style="color: #002200;">:</span>mp<span style="color: #002200;">&#93;</span> forKey<span style="color: #002200;">:</span>kMultipartKey<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>dic setObject<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithUTF8String<span style="color: #002200;">:</span>sel_getName<span style="color: #002200;">&#40;</span>sel<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span> forKey<span style="color: #002200;">:</span>kSelectorKey<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span><span style="color: #400080;">NSThread</span>
	 detachNewThreadSelector<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>do_sendAsyncRequestWithPayload<span style="color: #002200;">:</span><span style="color: #002200;">&#41;</span>
	 toTarget<span style="color: #002200;">:</span>self
	 withObject<span style="color: #002200;">:</span>dic<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Данный метод получает на вход <em>url</em запроса, аргументы к нему в <em>post</em>, флаг необходимости отправить его через <a href="http://byteflow.hackndev.org/blog/index.php/2008/12/multipartform-data-в-cocoa/">DQMultipartForm</a> в <em>mp</em>. Когда запрос будет обработан, результат бедет передан объекту <em>tar</em> через селектор <em>sel</em>, который должен принимать один объект класса NSDictionary.</p>
<p>Теперь большой и страшный кусок кода:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>do_sendAsyncRequestWithPayload<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSMutableDictionary</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>d
<span style="color: #002200;">&#123;</span>
	<span style="color: #11740a; font-style: italic;">// в контексте потока нам нужно свое управление памятью</span>
	<span style="color: #400080;">NSAutoreleasePool</span> <span style="color: #002200;">*</span>pool <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSAutoreleasePool</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #400080;">NSURL</span> <span style="color: #002200;">*</span>rqUrl <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSURL</span> URLWithString<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>d objectForKey<span style="color: #002200;">:</span>kURLKey<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #400080;">NSMutableURLRequest</span> <span style="color: #002200;">*</span>req;
	<span style="color: #11740a; font-style: italic;">// получаем все не-POST аргументы и удаляем их из целевого массива</span>
	<span style="color: #a61390;">SEL</span> sel <span style="color: #002200;">=</span> sel_registerName<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>d objectForKey<span style="color: #002200;">:</span>kSelectorKey<span style="color: #002200;">&#93;</span> UTF8String<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
	<span style="color: #a61390;">id</span> target <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>d objectForKey<span style="color: #002200;">:</span>kTargetKey<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">BOOL</span> multipart <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>d objectForKey<span style="color: #002200;">:</span>kMultipartKey<span style="color: #002200;">&#93;</span> boolValue<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>d removeObjectForKey<span style="color: #002200;">:</span>kURLKey<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>d removeObjectForKey<span style="color: #002200;">:</span>kSelectorKey<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>d removeObjectForKey<span style="color: #002200;">:</span>kTargetKey<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>d removeObjectForKey<span style="color: #002200;">:</span>kMultipartKey<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">// есть необходимо цеплятьданные через multipart/form-data - инициализируем DQMultipartForm и забиваем его объектами</span>
	<span style="color: #11740a; font-style: italic;">// (код изначально был написан под OSX Tiger, потому не использует новомодные решения ObjC)</span>
	<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>multipart<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
		DQMultipartForm <span style="color: #002200;">*</span>form <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>DQMultipartForm alloc<span style="color: #002200;">&#93;</span> initWithURL<span style="color: #002200;">:</span>rqUrl<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;
		<span style="color: #400080;">NSEnumerator</span> <span style="color: #002200;">*</span>ke <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>d keyEnumerator<span style="color: #002200;">&#93;</span>;
		<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>k;
		<span style="color: #a61390;">while</span><span style="color: #002200;">&#40;</span> <span style="color: #002200;">&#40;</span>k <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>ke nextObject<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
			<span style="color: #a61390;">id</span> obj <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>d objectForKey<span style="color: #002200;">:</span>k<span style="color: #002200;">&#93;</span>;
			<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>obj isKindOfClass<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSArray</span> class<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
				<span style="color: #400080;">NSMutableArray</span> <span style="color: #002200;">*</span>s <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableArray</span> array<span style="color: #002200;">&#93;</span>;
				<span style="color: #400080;">NSEnumerator</span> <span style="color: #002200;">*</span>te <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>obj objectEnumerator<span style="color: #002200;">&#93;</span>;
				<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>t;
				<span style="color: #a61390;">while</span><span style="color: #002200;">&#40;</span> <span style="color: #002200;">&#40;</span>t <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>te nextObject<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
					<span style="color: #002200;">&#91;</span>form addValue<span style="color: #002200;">:</span>t forField<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>k stringByAppendingString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;[]&quot;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
				<span style="color: #002200;">&#125;</span>
			<span style="color: #002200;">&#125;</span> <span style="color: #a61390;">else</span> <span style="color: #002200;">&#123;</span>
				<span style="color: #002200;">&#91;</span>form addValue<span style="color: #002200;">:</span>obj forField<span style="color: #002200;">:</span>k<span style="color: #002200;">&#93;</span>;
			<span style="color: #002200;">&#125;</span>
		<span style="color: #002200;">&#125;</span>
		req <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>form urlRequest<span style="color: #002200;">&#93;</span> retain<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span> <span style="color: #a61390;">else</span> <span style="color: #002200;">&#123;</span>
		<span style="color: #11740a; font-style: italic;">// если у нас обычный запрос - то формируем в строку</span>
		req <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableURLRequest</span> alloc<span style="color: #002200;">&#93;</span> initWithURL<span style="color: #002200;">:</span>rqUrl<span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#91;</span>req setHTTPMethod<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;POST&quot;</span><span style="color: #002200;">&#93;</span>;
		<span style="color: #400080;">NSMutableArray</span> <span style="color: #002200;">*</span>l <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableArray</span> alloc<span style="color: #002200;">&#93;</span> initWithCapacity<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>d count<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
		<span style="color: #400080;">NSEnumerator</span> <span style="color: #002200;">*</span>ke <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>d keyEnumerator<span style="color: #002200;">&#93;</span>;
		<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>k;
		<span style="color: #a61390;">while</span><span style="color: #002200;">&#40;</span> <span style="color: #002200;">&#40;</span>k <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>ke nextObject<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
			<span style="color: #002200;">&#91;</span>l addObject<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%@=%@&quot;</span>,
						  k,
						  <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>d objectForKey<span style="color: #002200;">:</span>k<span style="color: #002200;">&#93;</span> description<span style="color: #002200;">&#93;</span>
							stringByAddingPercentEscapesUsingEncoding<span style="color: #002200;">:</span>NSUTF8StringEncoding<span style="color: #002200;">&#93;</span>
							stringByReplacingOccurrencesOfString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;+&quot;</span> withString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%2B&quot;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#125;</span>
		<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>reqPayload <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>l componentsJoinedByString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&amp;&quot;</span><span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#91;</span>l release<span style="color: #002200;">&#93;</span>;
		<span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span>reqPayload_c <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>reqPayload UTF8String<span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#91;</span>req setHTTPBody<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSData</span> dataWithBytes<span style="color: #002200;">:</span>reqPayload_c length<span style="color: #002200;">:</span><span style="color: #a61390;">strlen</span><span style="color: #002200;">&#40;</span>reqPayload_c<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>
	<span style="color: #11740a; font-style: italic;">// и так, на этот момент у нас есть NSURLRequest с готовым URL и POST-данными, пора его передать серверу!</span>
	<span style="color: #400080;">NSURLResponse</span> <span style="color: #002200;">*</span>resp;
	<span style="color: #400080;">NSError</span> <span style="color: #002200;">*</span>err;
	<span style="color: #11740a; font-style: italic;">// вот тут мы можем провисеть некоторое время (пока придет ответ от сервера</span>
	<span style="color: #11740a; font-style: italic;">// но блокируется только этот поток</span>
	<span style="color: #400080;">NSData</span> <span style="color: #002200;">*</span>respData <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSURLConnection</span>
						sendSynchronousRequest<span style="color: #002200;">:</span>req
						returningResponse<span style="color: #002200;">:&amp;</span>resp
						error<span style="color: #002200;">:&amp;</span>err<span style="color: #002200;">&#93;</span>;
	<span style="color: #400080;">NSMutableDictionary</span> <span style="color: #002200;">*</span>respDict <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableDictionary</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>err<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
		<span style="color: #11740a; font-style: italic;">// если что-то не так - наверх пойдет информация об ошибке</span>
		<span style="color: #002200;">&#91;</span>respDict setObject<span style="color: #002200;">:</span>err forKey<span style="color: #002200;">:</span>kErrorKey<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span> <span style="color: #a61390;">else</span> <span style="color: #002200;">&#123;</span>
		<span style="color: #11740a; font-style: italic;">// Иначе считаем что все в порядке и нам передали XML с корневым элементом dict.</span>
		<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>plistString <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> alloc<span style="color: #002200;">&#93;</span> initWithBytes<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>respData bytes<span style="color: #002200;">&#93;</span> length<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>respData length<span style="color: #002200;">&#93;</span> encoding<span style="color: #002200;">:</span>NSUTF8StringEncoding<span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#91;</span>respDict release<span style="color: #002200;">&#93;</span>;
		respDict <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>plistString propertyList<span style="color: #002200;">&#93;</span> retain<span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#91;</span>plistString release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>
&nbsp;
	<span style="color: #11740a; font-style: italic;">// respDict возвращается в основной поток и передается обработчику. Его надо будет обязательно release'нуть после обработки.</span>
	<span style="color: #002200;">&#91;</span>target
	 performSelector<span style="color: #002200;">:</span>sel
	 onThread<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSThread</span> mainThread<span style="color: #002200;">&#93;</span>
	 withObject<span style="color: #002200;">:</span>respDict
	 waitUntilDone<span style="color: #002200;">:</span><span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #002200;">&#91;</span>d release<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #002200;">&#91;</span>pool drain<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Так, теперь как нам собственно выполнить запрос? Элементарно:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>callSomeAsyncRequestForUser<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSNumber</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>uid
<span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>self
	 sendAsyncRequest<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;http://ourserver.com/iphone-api/somequery&quot;</span>
	 withPayload<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSDictionary</span> dictionaryWithObjectsAndKeys<span style="color: #002200;">:</span>
				  uid, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;user_id&quot;</span>,
				  <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;1.0&quot;</span>, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;client_version&quot;</span>,
				  <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>
	 multipart<span style="color: #002200;">:</span><span style="color: #a61390;">NO</span>
	 target<span style="color: #002200;">:</span>self
	 selector<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>do_callSomeAsyncRequestForUser<span style="color: #002200;">:</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>do_callSomeAsyncRequestForUser<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSDictionary</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>respDict
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSError</span> <span style="color: #002200;">*</span>err <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>respDict objectForKey<span style="color: #002200;">:</span>kErrorKey<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>err<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
		<span style="color: #11740a; font-style: italic;">// что-то пошло не так, сообщить пользователю</span>
		...
	<span style="color: #002200;">&#125;</span> <span style="color: #a61390;">else</span> <span style="color: #002200;">&#123;</span>
		<span style="color: #11740a; font-style: italic;">// обрабатываем данные от сервера</span>
		...
	<span style="color: #002200;">&#125;</span>
	<span style="color: #002200;">&#91;</span>respDict release<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Замечания и комментарии приветствуются.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/Byteflow?a=Rz6Ptj3E"><img src="http://feeds.feedburner.com/~f/Byteflow?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/Byteflow?a=96crHxkY"><img src="http://feeds.feedburner.com/~f/Byteflow?i=96crHxkY" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/Byteflow?a=QeUsCXqK"><img src="http://feeds.feedburner.com/~f/Byteflow?i=QeUsCXqK" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Byteflow/~4/Wt4Ulp9s88c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://byteflow.hackndev.org/blog/index.php/2009/01/%d0%bf%d1%80%d0%be%d1%81%d1%82%d0%be%d0%b5-%d1%80%d0%b5%d1%88%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b4%d0%bb%d1%8f-http-%d0%b7%d0%b0%d0%bf%d1%80%d0%be%d1%81%d0%be%d0%b2/feed/</wfw:commentRss>
		<feedburner:origLink>http://byteflow.hackndev.org/blog/index.php/2009/01/%d0%bf%d1%80%d0%be%d1%81%d1%82%d0%be%d0%b5-%d1%80%d0%b5%d1%88%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b4%d0%bb%d1%8f-http-%d0%b7%d0%b0%d0%bf%d1%80%d0%be%d1%81%d0%be%d0%b2/</feedburner:origLink></item>
		<item>
		<title>Упрощаем переход между табами в Safari</title>
		<link>http://feedproxy.google.com/~r/Byteflow/~3/LhjLFvdVMck/</link>
		<comments>http://byteflow.hackndev.org/blog/index.php/2009/01/%d1%83%d0%bf%d1%80%d0%be%d1%89%d0%b0%d0%b5%d0%bc-%d0%bf%d0%b5%d1%80%d0%b5%d1%85%d0%be%d0%b4-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d1%82%d0%b0%d0%b1%d0%b0%d0%bc%d0%b8-%d0%b2-safari/#comments</comments>
		<pubDate>Sat, 03 Jan 2009 23:27:56 +0000</pubDate>
		<dc:creator>Владимир Пузанов</dc:creator>
		
		<category><![CDATA[Mac]]></category>

		<guid isPermaLink="false">http://byteflow.hackndev.org/blog/?p=210</guid>
		<description><![CDATA[Я думаю, всем извесно о хоткеях ⇧⌘→ и ⇧⌘← для перехода между закладками в Safari. Есть одна неприятная вещь, связанная с это комбинацией клавиш – ⌘← и ⌘→ выполняют функции кнопок Home и End на PC. Ну а Shift дополняет перемещение выделеним, что приводит к невозможности перейти в другой таб, когда курсор в текстовом поле [...]]]></description>
			<content:encoded><![CDATA[<p>Я думаю, всем извесно о хоткеях ⇧⌘→ и ⇧⌘← для перехода между закладками в Safari. Есть одна неприятная вещь, связанная с это комбинацией клавиш – ⌘← и ⌘→ выполняют функции кнопок Home и End на PC. Ну а Shift дополняет перемещение выделеним, что приводит к невозможности перейти в другой таб, когда курсор в текстовом поле (особеннораздражает при написании переводов постов, когда оригинал в соседнем табе).</p>
<p>У этой проблемы есть очень простое решение, при чем штатными средствами. Откройте панель настройки хоткеев (Preferences - Keyboard &#038; Mouse - Keyboard Shortcuts), нажмите на плюс, в приложении выберите Safari, в названии пункта меню введите &#8220;Выбрать следующую вкладку&#8221; (&#8221;Select Next Tab&#8221; в английской локали), а в хоткее укажите что-то нейтральное, например ⌥⌘→. То же самое повторите для второго пункта меню (предидущего таба).</p>
<p>Перезапустите Safari и наслаждайтесь переходом по табам без &#8220;залипаний&#8221;!<br />
<a href="http://byteflow.hackndev.org/blog/wp-content/uploads/2009/01/prefs.png"><img src="http://byteflow.hackndev.org/blog/wp-content/uploads/2009/01/prefs-300x273.png" alt="prefs" title="prefs" width="300" height="273" class="aligncenter size-medium wp-image-211" /></a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/Byteflow?a=nF4D8AfP"><img src="http://feeds.feedburner.com/~f/Byteflow?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/Byteflow?a=VY7N8D6R"><img src="http://feeds.feedburner.com/~f/Byteflow?i=VY7N8D6R" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/Byteflow?a=UHLyGYFG"><img src="http://feeds.feedburner.com/~f/Byteflow?i=UHLyGYFG" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Byteflow/~4/LhjLFvdVMck" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://byteflow.hackndev.org/blog/index.php/2009/01/%d1%83%d0%bf%d1%80%d0%be%d1%89%d0%b0%d0%b5%d0%bc-%d0%bf%d0%b5%d1%80%d0%b5%d1%85%d0%be%d0%b4-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d1%82%d0%b0%d0%b1%d0%b0%d0%bc%d0%b8-%d0%b2-safari/feed/</wfw:commentRss>
		<feedburner:origLink>http://byteflow.hackndev.org/blog/index.php/2009/01/%d1%83%d0%bf%d1%80%d0%be%d1%89%d0%b0%d0%b5%d0%bc-%d0%bf%d0%b5%d1%80%d0%b5%d1%85%d0%be%d0%b4-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d1%82%d0%b0%d0%b1%d0%b0%d0%bc%d0%b8-%d0%b2-safari/</feedburner:origLink></item>
		<item>
		<title>Как создать взвешенное дерево категорий с подкатегориями?</title>
		<link>http://feedproxy.google.com/~r/Byteflow/~3/URV2h9nHx2g/</link>
		<comments>http://byteflow.hackndev.org/blog/index.php/2008/12/sql-query-for-weighted-category-tree-with-subcategories/#comments</comments>
		<pubDate>Fri, 19 Dec 2008 01:42:49 +0000</pubDate>
		<dc:creator>rilian</dc:creator>
		
		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[Web]]></category>

		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://byteflow.hackndev.org/blog/?p=204</guid>
		<description><![CDATA[Допустим у вас есть интернет магазин, но товары в нем выводятся в одной куче - как в магазине секонд-хэнд. И вы мечтаете все отсортировать по категориям с подкатегориями. Причем категория джинсов идет перед категорией носков, а носки в добавок делятся на дырявые и обычные, ну и обычные идут первее.
Итак, вам нужно вывести взвешенный список категорий [...]]]></description>
			<content:encoded><![CDATA[<p>Допустим у вас есть интернет магазин, но товары в нем выводятся в одной куче - как в магазине секонд-хэнд. И вы мечтаете все отсортировать по категориям с подкатегориями. Причем категория джинсов идет перед категорией носков, а носки в добавок делятся на дырявые и обычные, ну и обычные идут первее.</p>
<p>Итак, вам нужно вывести <strong>взвешенный список категорий с подкатегориями</strong>. Это просто.<br />
<span id="more-204"></span></p>
<p>Есть таблица категорий, где category_title это название категории, category_id это ее номер в базе, parent_category_id это номер родительской категории (если он NULL - то категория сама является родительской) и weight это вес категории среди категорий ее уровня:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">EXISTS</span> <span style="color: #ff0000;">`category`</span> <span style="color: #66cc66;">&#40;</span>
  <span style="color: #ff0000;">`category_id`</span> int<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`parent_category_id`</span> int<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`title`</span> varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">250</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`weight`</span> int<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`category_id`</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span> ENGINE<span style="color: #66cc66;">=</span>MyISAM  COMMENT<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'shop categories'</span> <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span><span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span>;</pre></div></div>

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

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span>
    COALESCE<span style="color: #66cc66;">&#40;</span> DC2<span style="color: #66cc66;">.</span>title<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;parent_title&quot;</span><span style="color: #66cc66;">,</span>
    COALESCE<span style="color: #66cc66;">&#40;</span> DC2<span style="color: #66cc66;">.</span>category_id<span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;parent_category_id&quot;</span><span style="color: #66cc66;">,</span>
    DC2<span style="color: #66cc66;">.</span>weight <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;parent_weight&quot;</span><span style="color: #66cc66;">,</span>
    DC1<span style="color: #66cc66;">.</span>title <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;subcategory_title&quot;</span><span style="color: #66cc66;">,</span>
    DC1<span style="color: #66cc66;">.</span>category_id <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;subcategory_category_id&quot;</span><span style="color: #66cc66;">,</span>
    DC1<span style="color: #66cc66;">.</span>weight <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;subcategory_weight&quot;</span>
<span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">`category`</span> <span style="color: #993333; font-weight: bold;">AS</span> DC1
    <span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">OUTER</span> <span style="color: #993333; font-weight: bold;">JOIN</span> <span style="color: #ff0000;">`category`</span> <span style="color: #993333; font-weight: bold;">AS</span> DC2
        <span style="color: #993333; font-weight: bold;">ON</span> DC1<span style="color: #66cc66;">.</span>parent_category_id <span style="color: #66cc66;">=</span> DC2<span style="color: #66cc66;">.</span>category_id
<span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span>
    DC2<span style="color: #66cc66;">.</span>category_id <span style="color: #993333; font-weight: bold;">ASC</span><span style="color: #66cc66;">,</span>
    DC2<span style="color: #66cc66;">.</span>weight <span style="color: #993333; font-weight: bold;">DESC</span><span style="color: #66cc66;">,</span>
    DC1<span style="color: #66cc66;">.</span>weight <span style="color: #993333; font-weight: bold;">DESC</span><span style="color: #66cc66;">,</span>
    DC2<span style="color: #66cc66;">.</span>title <span style="color: #993333; font-weight: bold;">ASC</span><span style="color: #66cc66;">,</span>
    DC1<span style="color: #66cc66;">.</span>title <span style="color: #993333; font-weight: bold;">ASC</span></pre></div></div>

<p>Как несложно заметить, если у записи из выдачи parent_category_id=0 то это родительская категория. Иначе это подкатегория с номером subcategory_id для категории с номером parent_category_id.</p>
<p>При выдаче категории сортируются так: сначала идут родительские категории, затем подкатегории отсортированные по весу и по алфавиту.</p>
<p>Далее, используя ваш любимый язык программирования, следует записать выдачу в ассоциативный массив, и загнать его в ваш любимый шаблонизатор.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/Byteflow?a=yGyCkevK"><img src="http://feeds.feedburner.com/~f/Byteflow?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/Byteflow?a=YHN4wEfh"><img src="http://feeds.feedburner.com/~f/Byteflow?i=YHN4wEfh" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/Byteflow?a=aEXVbtU6"><img src="http://feeds.feedburner.com/~f/Byteflow?i=aEXVbtU6" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Byteflow/~4/URV2h9nHx2g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://byteflow.hackndev.org/blog/index.php/2008/12/sql-query-for-weighted-category-tree-with-subcategories/feed/</wfw:commentRss>
		<feedburner:origLink>http://byteflow.hackndev.org/blog/index.php/2008/12/sql-query-for-weighted-category-tree-with-subcategories/</feedburner:origLink></item>
		<item>
		<title>multipart/form-data в Cocoa</title>
		<link>http://feedproxy.google.com/~r/Byteflow/~3/x5csunFjLRs/</link>
		<comments>http://byteflow.hackndev.org/blog/index.php/2008/12/multipartform-data-%d0%b2-cocoa/#comments</comments>
		<pubDate>Sat, 13 Dec 2008 18:23:32 +0000</pubDate>
		<dc:creator>Владимир Пузанов</dc:creator>
		
		<category><![CDATA[Objective-C]]></category>

		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://byteflow.hackndev.org/blog/?p=200</guid>
		<description><![CDATA[Не знаю, по какой причине в Cocoa нет встроенного пути для создания HTTP запроса multipart/form-data (применяется в POST-запросах с бинарными данными, в основном – для передачи данных.
В сети можно найти несколько реализаций. Все они не устраивали меня по тем или иным причинам, так что я решил написать еще одну. Я должен сказать, что RFC 2388 [...]]]></description>
			<content:encoded><![CDATA[<p>Не знаю, по какой причине в Cocoa нет встроенного пути для создания HTTP запроса multipart/form-data (применяется в POST-запросах с бинарными данными, в основном – для передачи данных.</p>
<p>В сети можно найти несколько реализаций. Все они не устраивали меня по тем или иным причинам, так что я решил написать еще одну. Я должен сказать, что <a href="http://www.faqs.org/rfcs/rfc2388.html" onclick="pageTracker._trackPageview('/outgoing/www.faqs.org/rfcs/rfc2388.html?referer=');">RFC 2388</a> достаточно неочевиден и делать реализацию только по нему сложно. Так что основывался я на реализации &#8220;Mini-Mallows: A Multi-Part Form Wrapper for Cocoa &#038; iPhone&#8221; &copy; <a href="http://www.samuelschroeder.com" onclick="pageTracker._trackPageview('/outgoing/www.samuelschroeder.com?referer=');">Sam Schroeder</a>.<br />
<span id="more-200"></span><br />
И так, давайте определим, что нам нужно от интерфейса. А нужно нам всего три вещи:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>initWithURL<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSURL</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>url;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>addValue<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>v forField<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>f;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSURLRequest</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>urlRequest;</pre></div></div>

<p>init для создания нового экземпляра с указанным URL, addValue:forField: для добавления нового поля и urlRequest для получения объекта запроса. В принципе можно было бы сделать класс более совместимым с KVC, но он и так достаточно гибок и прост в использовании.</p>
<p>Поля мы будем хранить не в очевидном для этой задачи NSMutableDictionary, а в NSMutableArray. Почему? Потому что есть такая презабавнейшая вещь как PHP, которая принимает агрументы вида f[]=a&#038;f[]=b и собирает их в массив. А мне как раз надо было отправлять файл на PHP-обработчик по спеке заказчика, потому пришлось подумать о случае с неуникальными ключами.</p>
<p>Для создания ключа границы мы будем использовать /dev/urandom. Это дает высокую вероятность того, что в байтовом потоке такой ключ случайно не попадется (идею я взял из Сафари, изучая его Wireshark&#8217;ом). Данный код частично написан proger&#8217;ом, потому как я что-то начал подзабывать простые указатели и libc:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>getRandomBoundary
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSMutableString</span> <span style="color: #002200;">*</span>s <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableString</span> <span style="color: #a61390;">string</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>s appendString<span style="color: #002200;">:</span>kPrefix<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">int</span> i;
	<span style="color: #a61390;">FILE</span> <span style="color: #002200;">*</span>fp <span style="color: #002200;">=</span> <span style="color: #a61390;">fopen</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;/dev/urandom&quot;</span>, <span style="color: #bf1d1a;">&quot;r&quot;</span><span style="color: #002200;">&#41;</span>;
	<span style="color: #a61390;">assert</span><span style="color: #002200;">&#40;</span>fp<span style="color: #002200;">&#41;</span>;
	<span style="color: #a61390;">for</span><span style="color: #002200;">&#40;</span>i<span style="color: #002200;">=</span><span style="color: #2400d9;">0</span>; i&lt;kRandomPartLength; <span style="color: #002200;">++</span>i<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
		<span style="color: #a61390;">char</span> c;
		<span style="color: #a61390;">do</span> c <span style="color: #002200;">=</span> <span style="color: #a61390;">fgetc</span><span style="color: #002200;">&#40;</span>fp<span style="color: #002200;">&#41;</span>; <span style="color: #a61390;">while</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">!</span><span style="color: #a61390;">isalnum</span><span style="color: #002200;">&#40;</span>c<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span>;
		<span style="color: #002200;">&#91;</span>s appendFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%c&quot;</span>, c<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>
	<span style="color: #a61390;">fclose</span><span style="color: #002200;">&#40;</span>fp<span style="color: #002200;">&#41;</span>;
	<span style="color: #a61390;">return</span> s;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Второй интересный момент - как мы собираем поля в байтовый объект. Мы проверяем value на принадлежность классу NSString. Если это строка – то проверяем первый символ <strong>field</strong> (не value). Если ключ начинается на @, то мы работаем как curl, и принимаем value как путь к файлу.</p>
<p>Если значение не строка, то просто конвертируем его через -[description]. Еще бы неплохо добавить поддержку NSData для прямого ввода бинарних данных, но руки не дошли. Если есть желание – &#8220;Fix it and send patch&#8221; &copy; Paul Sokolovsky. Еще бы неплохо все это завернуть в NSInputStream (если файл большой), но опять же руки не дошли.</p>
<p><a href="http://dl.getdropbox.com/u/248886/ByteFlow/DQMultipartForm.zip" onclick="pageTracker._trackPageview('/outgoing/dl.getdropbox.com/u/248886/ByteFlow/DQMultipartForm.zip?referer=');">DQMultipartForm.zip</a> доступен из DropBox (AS-IS), замечания и предложения – в комментарии и на почту.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/Byteflow?a=2KgXm0BH"><img src="http://feeds.feedburner.com/~f/Byteflow?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/Byteflow?a=LkZKsQGK"><img src="http://feeds.feedburner.com/~f/Byteflow?i=LkZKsQGK" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/Byteflow?a=Ff6UrLEP"><img src="http://feeds.feedburner.com/~f/Byteflow?i=Ff6UrLEP" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Byteflow/~4/x5csunFjLRs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://byteflow.hackndev.org/blog/index.php/2008/12/multipartform-data-%d0%b2-cocoa/feed/</wfw:commentRss>
		<feedburner:origLink>http://byteflow.hackndev.org/blog/index.php/2008/12/multipartform-data-%d0%b2-cocoa/</feedburner:origLink></item>
		<item>
		<title>Установка mysql + phpmyadmin на macos</title>
		<link>http://feedproxy.google.com/~r/Byteflow/~3/-axK_1CgizY/</link>
		<comments>http://byteflow.hackndev.org/blog/index.php/2008/12/install-mysql-and-phpmyadmin-on-macos/#comments</comments>
		<pubDate>Sat, 13 Dec 2008 17:51:58 +0000</pubDate>
		<dc:creator>rilian</dc:creator>
		
		<category><![CDATA[Mac]]></category>

		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[Документация]]></category>

		<guid isPermaLink="false">http://byteflow.hackndev.org/blog/?p=193</guid>
		<description><![CDATA[Краткая пошаговая инструкция по установке PHPMyAdmin на MacBook
Как известно PHP уже предустановлен в MacOS. В моей системе уже поставлен PHP 5.2
Ставим MySQL
1) скачать и установить нужный дистрибутив MySQL на сайте http://dev.mysql.com/downloads/
2) поставить административные утилиты MySQL Administrator с http://dev.mysql.com/downloads/gui-tools/5.0.html
3) поставить MySQL prefPanel с ftp://ftp.mysql.com/pub/mysql/download/gui-tools/MySQL.prefPane-leopardfix.zip
4) теперь неплохо бы зайти в Системные Настройки и запустить демон MySQL
5) откройте [...]]]></description>
			<content:encoded><![CDATA[<p>Краткая пошаговая инструкция по установке PHPMyAdmin на MacBook<span id="more-193"></span></p>
<p>Как известно PHP уже предустановлен в MacOS. В моей системе уже поставлен PHP 5.2</p>
<p><strong>Ставим MySQL</strong></p>
<p>1) скачать и установить нужный дистрибутив MySQL на сайте http://dev.mysql.com/downloads/</p>
<p>2) поставить административные утилиты <strong>MySQL Administrator</strong> с http://dev.mysql.com/downloads/gui-tools/5.0.html</p>
<p>3) поставить <strong>MySQL prefPanel</strong> с ftp://ftp.mysql.com/pub/mysql/download/gui-tools/MySQL.prefPane-leopardfix.zip</p>
<p>4) теперь неплохо бы зайти в <strong>Системные Настройки</strong> и запустить демон MySQL</p>
<p>5) откройте <strong>MySQL Administrator</strong> и создайте себе пользователя <strong>username/password</strong> и выдайте ему необходимые права</p>
<p><strong>Ставим PHPMyAdmin</strong></p>
<p>1) скачать последний дистрибутив <strong>phpMyAdmin</strong> с http://www.phpmyadmin.net/home_page/downloads.php</p>
<p>2) распаковать содержимое архива в папку <strong>/Sites/phpmyadmin/</strong> вашего пользователя</p>
<p>3) в <strong>Системных Настройках</strong> надо активировать <strong>Общий Веб Доступ</strong> для вашего пользователя. После этого вы сможете запустить <strong>phpMyAdmin</strong> набрав путь http://localhost/~Username/phpmyadmin/index.php</p>
<p>4) откройте файл <strong>/Sites/phpmyadmin/config.sample.inc.php</strong> вашим любимым текстовым редактором и сохраните его как <strong>config.inc.php</strong></p>
<p>5) в настройках первого сервера выставьте</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">/* Authentication type */</span>
<span style="color: #000088;">$cfg</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Servers'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'auth_type'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'cookie'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$cfg</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Servers'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'user'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'root'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$cfg</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Servers'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'password'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'password'</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">/* Server parameters */</span>
<span style="color: #000088;">$cfg</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Servers'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'host'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'localhost'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$cfg</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Servers'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'connect_type'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'tcp'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$cfg</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Servers'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'compress'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">/* Select mysqli if your server has it */</span>
<span style="color: #000088;">$cfg</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Servers'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'extension'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'mysqli'</span><span style="color: #339933;">;</span></pre></div></div>

<p>Если у вас MySQL установлен с нестандартным сокетом, то в конфиге phpMyAdmin прийдется написать примерно так:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$cfg</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Servers'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'connect_type'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'socket'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$cfg</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Servers'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'socket'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/tmp/mysql.sock'</span><span style="color: #339933;">;</span></pre></div></div>

<p><strong>Настройка временной зоны в PHP</strong></p>
<p>1) откройте терминал и выполните</p>
<pre>cp /etc/php.ini{.default,}</pre>
<p>2) теперь в файле /etc/php.ini раскомментируйте параметр <strong>date.timezone</strong> и укажите его значение, например</p>
<pre>date.timezone = Europe/London</pre>
<p><strong>Настройка сервера PHPMyAdmin</strong></p>
<p>1) зайдите на http://localhost/~Username/phpMyAdmin/<strong>setup</strong>/index.php и отредактируйте сервер заменив <strong>localhost</strong> на <strong>127.0.0.1</strong></p>
<p><strong>Готово!</strong></p>
<p>Заходите на http://localhost/~Username/phpMyAdmin/ под юзером username/password</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/Byteflow?a=VvNBLNLO"><img src="http://feeds.feedburner.com/~f/Byteflow?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/Byteflow?a=1t0kHfbJ"><img src="http://feeds.feedburner.com/~f/Byteflow?i=1t0kHfbJ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/Byteflow?a=tQ36Kmpq"><img src="http://feeds.feedburner.com/~f/Byteflow?i=tQ36Kmpq" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Byteflow/~4/-axK_1CgizY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://byteflow.hackndev.org/blog/index.php/2008/12/install-mysql-and-phpmyadmin-on-macos/feed/</wfw:commentRss>
		<feedburner:origLink>http://byteflow.hackndev.org/blog/index.php/2008/12/install-mysql-and-phpmyadmin-on-macos/</feedburner:origLink></item>
		<item>
		<title>ByteFlow @ Twitter</title>
		<link>http://feedproxy.google.com/~r/Byteflow/~3/Jz7WoZqZc70/</link>
		<comments>http://byteflow.hackndev.org/blog/index.php/2008/12/byteflow-twitter/#comments</comments>
		<pubDate>Tue, 02 Dec 2008 20:59:01 +0000</pubDate>
		<dc:creator>Владимир Пузанов</dc:creator>
		
		<category><![CDATA[ByteFlow]]></category>

		<guid isPermaLink="false">http://byteflow.hackndev.org/blog/?p=189</guid>
		<description><![CDATA[Теперь наш блог доступен и на твиттере, подписывайтесь на @byteflow, или просматривайте на сайте!
]]></description>
			<content:encoded><![CDATA[<p>Теперь наш блог доступен и на твиттере, подписывайтесь на @byteflow, или просматривайте <a href="http://twitter.com/byteflow" onclick="pageTracker._trackPageview('/outgoing/twitter.com/byteflow?referer=');">на сайте</a>!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/Byteflow?a=PEQ6RtVP"><img src="http://feeds.feedburner.com/~f/Byteflow?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/Byteflow?a=BYrlDWEi"><img src="http://feeds.feedburner.com/~f/Byteflow?i=BYrlDWEi" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/Byteflow?a=sj3Mn8MU"><img src="http://feeds.feedburner.com/~f/Byteflow?i=sj3Mn8MU" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Byteflow/~4/Jz7WoZqZc70" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://byteflow.hackndev.org/blog/index.php/2008/12/byteflow-twitter/feed/</wfw:commentRss>
		<feedburner:origLink>http://byteflow.hackndev.org/blog/index.php/2008/12/byteflow-twitter/</feedburner:origLink></item>
	</channel>
</rss>
