<?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:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>В лабиринте извилин</title>
	
	<link>http://www.charnad.com</link>
	<description>Блог-центр им. CharnaD</description>
	<lastBuildDate>Mon, 09 Nov 2009 19:32:12 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/charnad" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Судоку на PHP и jQuery</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/WSkYsVKBOyw/</link>
		<comments>http://www.charnad.com/blog/sudoku-na-php-i-jquery/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 16:06:22 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=800</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><iframe frameborder="0" width="480" height="500" align="center" src="http://dev.charnad.com/sudoku" scrolling="no"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/sudoku-na-php-i-jquery/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/sudoku-na-php-i-jquery/</feedburner:origLink></item>
		<item>
		<title>Mercurial и NetBeans</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/lJnqiav4gxg/</link>
		<comments>http://www.charnad.com/blog/mercurial-i-netbeans/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 21:18:51 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Mercurial]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=679</guid>
		<description><![CDATA[В продолжение истории про установку Mercurial я расскажу как настроить IDE NetBeans. По умолчанию плагин для работы с меркуриалом должен быть включен, если же нет, то идите в Tools -> Plugin и там включайте. Репозитарий инициируется в свойствах проекта. Коммитится все локально, поэтому проблем тут, я думаю, не может быть никаких. Проблемы начинаются, когда вы [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/logo_netbeans.gif" alt="NetBeans logo" />В продолжение истории про установку Mercurial я расскажу как настроить IDE NetBeans. По умолчанию плагин для работы с меркуриалом должен быть включен, если же нет, то идите в Tools -> Plugin и там включайте. Репозитарий инициируется в свойствах проекта. Коммитится все локально, поэтому проблем тут, я думаю, не может быть никаких. Проблемы начинаются, когда вы хотите сделать pull/push. Он начинается и идет бесконечно. Дело все в том, что авторизация по ssh для NetBeans проходит только с помощью пары ключей. У пользователей Линукса он уже должен быть в ~/.ssh. А те, у кого Windows, <a href="http://www.charnad.com/blog/ssh-pod-windows/">помните</a> мы вместе с ssh копировали ssh-keygen.exe, вот его и настала пора использовать. Запускаете и на все вопросы нажимаете просто Enter. Хотя, по желанию можете установить пароль. В папке, которую вы определили, как HOME, появится .ssh папка с двумя файлами id_rsa и id_rsa.pub (если вы не выбирали другое название). Если вы хотите работать с BitBucket, тогда содержимое pub файла копируете в ваш профиль на сайте. Если вы хотите пушить/пуллить на свой сервер, тогда у пользователя mercurial (или того, кто управляет репозиториями) в папке ~/.ssh создайте файл authorized_keys, если еще нет и добавьте строку с содержимым pub файла. Теперь у вас все должно работать.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/mercurial-i-netbeans/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/mercurial-i-netbeans/</feedburner:origLink></item>
		<item>
		<title>Как подружились Mercurial, Windows и Debian.</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/BeIq18Wqfp8/</link>
		<comments>http://www.charnad.com/blog/kak-podruzhilis-mercurial-windows-i-debian/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 01:52:44 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[Mercurial]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=657</guid>
		<description><![CDATA[Эта история началась трагически. Я случайно стер исходники проекта, над которым работал несколько дней. Бекапов не делал, svn забросил (я работаю один, без команды), для версионности вполне обходился Local History в Eclipse/NetBeans. Но эта потеря заставила меня как следует задуматься о том, чтобы все-таки использовать VCS, хотя бы для бекапа. Основной выбор был между Git [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/mercurial-logo.png" alt="Mercurial logo"/>Эта история началась трагически. Я случайно стер исходники проекта, над которым работал несколько дней. Бекапов не делал, svn забросил (я работаю один, без команды), для версионности вполне обходился Local History в Eclipse/NetBeans. Но эта потеря заставила меня как следует задуматься о том, чтобы все-таки использовать VCS, хотя бы для бекапа. Основной выбор был между Git и Mercurial (о достоинствах и недостатках CVS/SVN и прочих ищите в поисковиках). За Mercurial для меня сыграло то, что на Bitbucket был бесплатно доступен один приватный репозиторий, в отличии от Github, где все публично. А у меня на некоторых сайтах пароли в коде зашиты.<span id="more-657"></span></p>
<p>Установка Mercurial на Windows делается элементарно: Next, Next, Next, Ok. Скачать можно, например, <a href="http://mercurial.berkwood.com/">здесь</a>. Можете так же скачать <a href="http://bitbucket.org/tortoisehg/stable/wiki/download">TortoiseHg</a>, если вам нравится их TortoiseSVN. Под Linux еще проще.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> mercurial</pre></div></div>

<p> Для Eclipse IDE поищите плагин Eclipse Mercurial, а в NetBeans поддержка встроенная. Возможно вам понадобится прописать в системную переменную PATH путь к тому месту, куда вы установили Mercurial.</p>
<p>И все, вы можете пользоваться Меркуриалом. Ему, в отличии от SVN совершенно не нужно поднимать сервер. Все ваши изменения будут хранится в папке .hg в корне проекта. В отличии от svn Mercurial, Git и другие современные системы не суют свои папки в каждую папку проекта.</p>
<p>Вкратце расскажу о том, как начать работу с этой системой. Если у вас проект лежит локально, то в папке проекта в консоли введите</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">hg init</pre></div></div>

<p> Тем самым, вы инициируете проект в этой папке. Дальше, как в svn:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">hg add; hg commit <span style="color: #660033;">-m</span> <span style="color: #ff0000;">'Initial commit'</span>;</pre></div></div>

<p>Тем самым вы добавляете все файлы в текущей папке к проекту и сразу же коммитите с комментарием "Initial commit". Если же проект где-то выложен и вы хотите подключиться к нему, тогда клонируете его себе в пустую папку.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">hg clone адрес репозитория</pre></div></div>

<p>Я думаю, что как создать и закоммитить проект в IDE вы разберетесь.</p>
<p>Итак, бесплатные репозитории на BitBucket публичны (кроме всего одного приватного), а размер всего 150 мегабайт. Значит надо ставить свой "сервер". Здесь все оказалось довольно быстро и просто. Как установить Mercurial на Debian я уже выше написал. После чего создал нового пользователя mercurial с помощью adduser. Дал ему в распоряжение папку /home/mercurial, закачал на сервер коды проектов по папкам и инициировал в каждой проект Меркуриала. А потом просто в Windows сделал так:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">hg pull <span style="color: #c20cb9; font-weight: bold;">ssh</span>:<span style="color: #000000; font-weight: bold;">//</span>mercurial<span style="color: #000000; font-weight: bold;">@</span>myserver<span style="color: #000000; font-weight: bold;">/</span>myproject
hg update</pre></div></div>

<p> Если у вас Винда ругается на отсутствие ssh смотрите <a href="http://www.charnad.com/blog/ssh-pod-windows/">здесь</a>. Обьясню, что я сделал. Так как в Mercurial нет центрального сервера, то все репозитории равны. И вы всегда коммитите в свой локальный. А чтобы обменяться изменениями вы делаете pull (скачиваете) или push (закачиваете). Таким образом я скачал проект с сервера, чтобы удостоверится, что все работает. Надеюсь, что и у вас все получилось. А если нет - спрашивайте в комментариях.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/kak-podruzhilis-mercurial-windows-i-debian/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/kak-podruzhilis-mercurial-windows-i-debian/</feedburner:origLink></item>
		<item>
		<title>SSH под Windows</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/ab23FHxVblU/</link>
		<comments>http://www.charnad.com/blog/ssh-pod-windows/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 00:53:27 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=651</guid>
		<description><![CDATA[Мне потребовалось получить ssh доступ к удаленной машине из под Windows. И, хотя PuTTY меня всем устраивал, в данном случае он помочь не мог - ssh требовался распределенной системе контроля версий Mercurial. Ну что ж, надо значит надо.
Чтобы запустить консольный OpenSSH клиент в Винде нужно поставить Cygwin, а так же пакеты zlib и openssh. Cygwin [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/ssh_pic.png" alt="" />Мне потребовалось получить ssh доступ к удаленной машине из под Windows. И, хотя PuTTY меня всем устраивал, в данном случае он помочь не мог - ssh требовался распределенной системе контроля версий Mercurial. Ну что ж, надо значит надо.<span id="more-651"></span></p>
<p>Чтобы запустить консольный OpenSSH клиент в Винде нужно поставить Cygwin, а так же пакеты zlib и openssh. Cygwin позволяет запускать линуксовые приложения под виндой. Я всегда довольно подозрительно отношусь к софту, который меняет поведение системы, поэтому собирал ssh не запуская инсталлятор Cygwin.</p>
<p>Для начала я сделал папку SSH в Program Files. На одном из <a href="http://www.cygwin.com/mirrors.html">этих</a> сайтов я скачал пакеты cygwin, zlib, openssh, openssl и minires. Из них нужно в нашу папку SSH положить файлы: cygwin1.dll из пакета cygwin, cygz.dll из zlib, ssh.exe и ssh-keygen.exe из ssh, cygcrypto-0.9.8.dll из openssl, и cygminires.dll из minires. Дальше идем в настройки переменных окружения, в PATH прописываем путь к папке SSH, а так же создаем переменную HOME и так же прописываем путь к папке SSH. Все!</p>
<p>
<img src="http://www.charnad.com/blog/wp-content/uploads/pictures/ssh_working.png" align="center" alt="Working ssh"/></p>
<p>Те, кто не хочет заморачиваться со всем этим, может просто скачать уже готовый архив с SSH <a href="http://www.charnad.com/files/ssh_for_win.zip">вот здесь</a>. Вам останется только прописать переменные окружения.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/ssh-pod-windows/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/ssh-pod-windows/</feedburner:origLink></item>
		<item>
		<title>Как защитить upload</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/CwSdhNpKyqk/</link>
		<comments>http://www.charnad.com/blog/kak-zashitit-upload/#comments</comments>
		<pubDate>Sat, 03 Oct 2009 02:14:50 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=638</guid>
		<description><![CDATA[Иногда в скриптах нужна возможность аплоада файлов. Картинок на сервер, архивов, чего угодно. Делается это все несложно, однако есть опасность, что некто сумеет обойти ваши фильтры и таки закачает php скрипт. Чтобы ничто не могло мне навредить, во все папки, где не должны быть php скрипты положите .htaccess файл с текстом

php_value engine Off

Это отключит интерпретацию [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/apache_feather.png" alt=""/>Иногда в скриптах нужна возможность аплоада файлов. Картинок на сервер, архивов, чего угодно. Делается это все несложно, однако есть опасность, что некто сумеет обойти ваши фильтры и таки закачает php скрипт. Чтобы ничто не могло мне навредить, во все папки, где не должны быть php скрипты положите .htaccess файл с текстом</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">php_value engine Off</pre></div></div>

<p>Это отключит интерпретацию и скрипты злоумышленника не будут работать. Только свои скрипты не кладите рядом, иначе любой сможет их скачать в виде исходных кодов.</p>
<p><strong>&lt;Upd>Нужно настроить опцию AllowOverride в конфиге Apache. Насколько я понял хватит AllowOverride Options. На shared хостингах, где PHP работает в CGI режиме, этой фичей воспользоваться не получится.&lt;/upd></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/kak-zashitit-upload/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/kak-zashitit-upload/</feedburner:origLink></item>
		<item>
		<title>Kohana и Formo</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/WMu_RasAi-I/</link>
		<comments>http://www.charnad.com/blog/kohana-i-formo/#comments</comments>
		<pubDate>Sat, 11 Jul 2009 00:10:27 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[formo]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[kohana]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=609</guid>
		<description><![CDATA[Я взялся за изучение фреймворка Kohana. Подкупил меня размер - чуть меньше мегабайта. Я давно хотел найти быстрый и легкий фреймворк для небольших разработок. Пока я не настолько его изучил, чтобы делать глобальные выводы, но могу рассказать о процессе изучения.
О том как установить Kohana легко найти в интернете. Вкратце: скачать, распаковать, запустить install, удалить install. [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/kohana_logo.png" alt=""/>Я взялся за изучение фреймворка Kohana. Подкупил меня размер - чуть меньше мегабайта. Я давно хотел найти быстрый и легкий фреймворк для небольших разработок. Пока я не настолько его изучил, чтобы делать глобальные выводы, но могу рассказать о процессе изучения.<span id="more-609"></span></p>
<p>О том как установить Kohana легко найти в интернете. Вкратце: скачать, распаковать, запустить install, удалить install. Про то, как убрать index.php из адреса тоже пару слов всего: переименовать example.htaccess в .htaccess и убрать index.php из $config['index_page'] в конфиге.</p>
<p>Собственно постороение приложения на Кохане я начал с того, что захотел переписать на этом фреймворке скриптик по удаленному управлению сайтами. И первая задача - формочка добавления сайта в БД. И тут возникли первые проблемы. Компоненты для построения форм, которые описаны в туториалах: Forge и Formation. Я выбрал Formation, скачал, установил. Не работает, выдает ошибки. Гуглил, читал форумы, боролся. От безысходности постучался в аську к одному парню, который имел дело с Коханой и получил ответ, что Forge и Formation блин уже deprecated. Как вам такое? На сайте я не видел об этом ни слова. Может не там искал?</p>
<p>
Ладно, пошел я дальше искать модуль для создания формочек. Посоветовали мне Morf. Зашел на страничку проекта. А там такой тухляк.. полгода код не обновляется, висит один тикет и еще два закрыто. Понятно все, не надо нам добра такого. В общем остался последний модуль на который были все надежды - Formo.</p>
<p>Formo завелся сразу, подключился без особых хлопот.  Только вот одна проблема, форму мне выводит с помощью P и DIV, а мне проще в TABLE запихать. Стал искать способы заставить генерить форму по-другому. Модифицировал объект, менял настройки - фиг. Нашел в мануале статью по темплейтам, переделал под темплейт. Не работает. Оказалось пример приведен с использованием шаблонизаторов, коими я не пользуюсь. В итоге кое-как заставил генериться форму как надо.</p>
<p>С валидацеий тоже номер. Искал как в валидацию передать $_POST, чтобы сверить с установками. Оказалось, что Formo сама жрет POST. Так же сама делает repopulation, основываясь на имени таблицы и hidden инпуте. Пока этого не знаешь - пугаешься и мучаешься, когда узнаешь - становится просто и легко. После чего за два дня доделал простейший CRUD.</p>
<p>Общие впечатления о фреймворке на этот момент:<br />
1. Наименования классов xxx_Core, когда вызываются они new xxx(); ломает автокомплит из-за чего надо совать IDE отдельный файлик, где прописаны "class xxx extends xxx_Core {}".<br />
2. Документация местами ужасна. Референс мануал нормальный, референс есть референс. Но вот тьюториалов мало, документация модулей слабая, коммьюнити маленькое. В общем въезжать тяжело.<br />
3. Местами все все-таки достаточно просто. За 10 минут добавил себе пару нужных хелперов, за полчаса написал плагин к Formo. И то, и другое я выложу чуть попозже.<br />
4. Дурацкие сообщения об ошибках. Если я ошибся и сунул не тот параметр, который ожидается - вылезает Fatal error где-то в глубине ядра. О том, что это я ошибся в параметре, а не Кохана концы отбрасывает можно только догадываться.<br />
5. ORM успел посмотреть на уровне CRUD одной таблицы. Удобно.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/kohana-i-formo/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/kohana-i-formo/</feedburner:origLink></item>
		<item>
		<title>Поездка в Финляндию. Часть 3.</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/D6RJdCbY6Zw/</link>
		<comments>http://www.charnad.com/blog/poezdka-v-finlyandiyu-part-3/#comments</comments>
		<pubDate>Fri, 10 Jul 2009 13:53:26 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Обо мне]]></category>
		<category><![CDATA[Путешествия]]></category>
		<category><![CDATA[Фото]]></category>
		<category><![CDATA[Финляндия]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=611</guid>
		<description><![CDATA[Окончание рассказа о моем двухдневном пребывании в Хельсинки, столице Финляндии. Начало истории можно прочитать тут: часть 1, часть 2. В этой части будет больше фотографий и меньше текста.
�о второй день, а это было воскресенье, мы пошли в торговый центр, который называется Itakeskus. Он как раз находится на той станции метро, до которой мы пешком шли [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/finland.png" alt="" />Окончание рассказа о моем двухдневном пребывании в Хельсинки, столице Финляндии. Начало истории можно прочитать тут: <a href="http://www.charnad.com/blog/poezdka-v-finlyandiyu-part-1/">часть 1</a>, <a href="http://www.charnad.com/blog/poezdka-v-finlyandiyu-part-2/">часть 2</a>. В этой части будет больше фотографий и меньше текста.<span id="more-611"></span></p>
<p>
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0588.JPG" title="" class="shutterset_singlepic24" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/24__160x120_DSC_0588.JPG" alt="DSC_0588" title="DSC_0588" />
</a>
Во второй день, а это было воскресенье, мы пошли в торговый центр, который называется Itakeskus. Он как раз находится на той станции метро, до которой мы пешком шли во второй части. Финский торговый центр почти ничем не отличается от торговых центров в Питере или Москве. Много магазинов, местами кафешки, местами скамейки. В Итакескусе, кстати, можно часто услышать русскую речь. Те, кто едут в Хельсинки на экскурсию на больших автобусах заезжают туда. А вот в чем отличие от российских магазинов, так это в качестве товаров и скидках. Сами цены чуть выше питерских. Если бы евро не подорожал из-за кризиса - были бы ровно питерские. Однако местами можно найти распродажи, скажем развал футболок за 3/5/7 евро. Вот так мы и ходили и покупали все, что дешево, но при этом качественно и симпатично. Особой нужды в одежде не было, так что набрали футболок. Я, как и в любой стране, старался найти футболку с финским флагом. Нашел только с надписью Suomi (Финляндия по-фински), что в общем меня устроило.</p>
<p>
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0608.JPG" title="" class="shutterset_singlepic26" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/26__160x120_DSC_0608.JPG" alt="DSC_0608" title="DSC_0608" />
</a>
Заехали после магазина домой, закинули вещи и поехали в центр, на станцию Kaisaniemi. Мы там бегали во второй части по площади. А теперь пошли в другую сторону. И дошли до кафедрального собора. На синем небе белоснежный собор смотрится офигительно. Его делали на подобие питерского Исаакиевского собора, получилось вполне похоже. Не пофотаться на таком фоне просто грех.</p>
<p>
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0682.JPG" title="" class="shutterset_singlepic28" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/28__140x110_DSC_0682.JPG" alt="DSC_0682" title="DSC_0682" />
</a>
 
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0686.JPG" title="" class="shutterset_singlepic29" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/29__140x110_DSC_0686.JPG" alt="DSC_0686" title="DSC_0686" />
</a>
 
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0688.JPG" title="" class="shutterset_singlepic30" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/30__140x110_DSC_0688.JPG" alt="DSC_0688" title="DSC_0688" />
</a>
<br clear='all'><br />
Собор находится на Сенатской площади. Там же стоит памятник Александру 2, который собственно и сделал Хельскински столицей "княжества Финляндского". Прошли чуть дальше по улице к пристани. На одно здание села чайка. Я успел удачно ее сфотографировать. Не сразу даже понятно, что она не часть скульптуры.<br clear='all'><br />

<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/dsc_0713.jpg" title="" class="shutterset_singlepic39" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/39__140x110_dsc_0713.jpg" alt="dsc_0713" title="dsc_0713" />
</a>
 
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0721.JPG" title="" class="shutterset_singlepic31" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/31__140x110_DSC_0721.JPG" alt="DSC_0721" title="DSC_0721" />
</a>
 
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/dsc_0775.jpg" title="" class="shutterset_singlepic40" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/40__140x110_dsc_0775.jpg" alt="dsc_0775" title="dsc_0775" />
</a>
<br clear='all'><br />
Набережная, к корой мы вышли прекрасна. Везде стоят яхты, в том числе парусные со штурвалами. Красота да и только. Ну и, конечно, Успенский собор. На портовых зданиях висели огромные винт и якорь.<br clear='all'><br />

<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/dsc_0729.jpg" title="" class="shutterset_singlepic41" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/41__160x120_dsc_0729.jpg" alt="dsc_0729" title="dsc_0729" />
</a>
 
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0773.JPG" title="" class="shutterset_singlepic32" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/32__160x120_DSC_0773.JPG" alt="DSC_0773" title="DSC_0773" />
</a>
 
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0777.JPG" title="" class="shutterset_singlepic34" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/34__160x120_DSC_0777.JPG" alt="DSC_0777" title="DSC_0777" />
</a>
<br clear='all'><br />
Нагулявшись, мы поехали домой. На станцию Kaisaniemi, как оказалось есть еще один очень интересный вход с "наскальной" живописью. Если бы не знак метро - я бы точно туда не пошел.<br />

<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0815.JPG" title="" class="shutterset_singlepic35" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/35__140x110_DSC_0815.JPG" alt="DSC_0815" title="DSC_0815" />
</a>
 
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0822.JPG" title="" class="shutterset_singlepic36" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/36__140x110_DSC_0822.JPG" alt="DSC_0822" title="DSC_0822" />
</a>
 
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0839.JPG" title="" class="shutterset_singlepic37" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/37__140x110_DSC_0839.JPG" alt="DSC_0839" title="DSC_0839" />
</a>
<br clear='all'><br />
А на следующий день мы уехали в Питер.<br clear='all'><br />
Те, кто хочет посмотреть более подробную фотоисторию - прошу пожаловать в <a href="http://picasaweb.google.com/charnad/20090620#">Picasa</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/poezdka-v-finlyandiyu-part-3/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/poezdka-v-finlyandiyu-part-3/</feedburner:origLink></item>
		<item>
		<title>Поездка в Финляндию. Часть 2.</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/gBWXIeQ6AIw/</link>
		<comments>http://www.charnad.com/blog/poezdka-v-finlyandiyu-part-2/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 21:00:38 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Обо мне]]></category>
		<category><![CDATA[Путешествия]]></category>
		<category><![CDATA[Фото]]></category>
		<category><![CDATA[Финляндия]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=590</guid>
		<description><![CDATA[ Продолжение истории про то, как я ездил в Финляндию. Напомню, что в первой части я закончил рассказ на том, что мы с Викой дошли до странной скульптуры в конце улицы Itamerenkatu, что рядом с конечной станцией метро. Дальше этой скульптуры решили не ходить, чтобы не заблудиться.
�о дороге назад к метро, мы заметили интересную особенность финских [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/finland.png" alt="" /> Продолжение истории про то, <a href="http://www.charnad.com/blog/poezdka-v-finlyandiyu-part-1/" target="_self">как я ездил в Финляндию</a>. Напомню, что в первой части я закончил рассказ на том, что мы с Викой дошли до странной скульптуры в конце улицы Itamerenkatu, что рядом с конечной станцией метро. Дальше этой скульптуры решили не ходить, чтобы не заблудиться.<span id="more-590"></span></p>
<p>
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0212.JPG" title="" class="shutterset_singlepic14" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/14__160x120_DSC_0212.JPG" alt="6. Подъезд" title="6. Подъезд" />
</a>
По дороге назад к метро, мы заметили интересную особенность финских адресов. У нас как, улица, дом, квартира. А у них улица, дом, подъезд, фамилия. Адрес говорят типа: улица такая-то, дом такой-то подъезд K, или подъезд J.  А там уж ищи по фамилии кто тебе нужен. Еще, рядом с каждым подъездом стоит устройство из трех щеток, щетиной направлены в общий центр. Как мы поняли, это сделано для того, чтобы зимой чистить ботинки от снега. Хотя по первости это было похоже на волосатую стоянку для велосипеда.</p>
<p>
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0254.JPG" title="" class="shutterset_singlepic16" >
	<img class="ngg-singlepic ngg-right" src="http://www.charnad.com/blog/wp-content/gallery/cache/16__160x120_DSC_0254.JPG" alt="7. Метро Kalasatama" title="7. Метро Kalasatama" />
</a>
Когда мы вернулись в метро, у нас еще оставалось минут 10 действия билета. Мы решили доехать до моста, с которого открывался красивый вид на Балтийское море (или это все еще считается Финским заливом). Станиця эта называется Kalasatama. С финского какая-то там гавань.  Оттуда мы пошли пешком. Позже выяснилось, что зря, но тогда мы были полны энтузиазма.
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/dsc_0266.jpg" title="" class="shutterset_singlepic38" >
	<img class="ngg-singlepic ngg-right" src="http://www.charnad.com/blog/wp-content/gallery/cache/38__160x120_dsc_0266.jpg" alt="8. Финский залив" title="8. Финский залив" />
</a>
 Так как на карту мы не расчитывали, то старались идти вдоль линии метро. Чаще всего параллельно шла автомобильная дорога и не было пешеходной. Нам часто приходилось сворачивать и идти по соседним улочкам. В этом собственно и заключался кайф такого путешествия. Никто не старался показать лучшее, никто не вопил "посмотрите налево", мы сами смотрели куда хотели и что хотели. Нам открывался город таким, каким его видят местные финны.</p>
<p>
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0284.JPG" title="" class="shutterset_singlepic17" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/17__160x120_DSC_0284.JPG" alt="8. Цветочки" title="8. Цветочки" />
</a>
 На одной из улиц рядом с домом увидели красивый куст какого-то растения. У нас я таких не видел. Несколько раз по дороге попадались сороки. Опять же, в Питере я помню только один раз когда видел сороку - на следующий день после приезда из Хельсинки. Зато ворон и голубей у них значительно меньше. 
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0361.JPG" title="" class="shutterset_singlepic19" >
	<img class="ngg-singlepic ngg-right" src="http://www.charnad.com/blog/wp-content/gallery/cache/19__160x120_DSC_0361.JPG" alt="9. Подземный переход" title="9. Подземный переход" />
</a>
 Наша дорога периодически пересекала пути метро, образуя подобие подземного перехода. Но куда более интересных для фотографа. Мне кажется в таком месте можно делать шикарнейшие фотки.</p>
<p>Итак мы шли. Часа три-четыре заняла такая прогулка и уже порядком уставшие вышли к Itakeskus. Оставалось всего ничего - две станции метро до дома. 
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0527.JPG" title="" class="shutterset_singlepic21" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/21__160x120_DSC_0527.JPG" alt="10. Вокзал" title="10. Вокзал" />
</a>
 Идти сил не было, а платить два евро за часовой билет ради двух станций совсем не хотелось. Идти еще две станции мы уже точно не могли, поэтому купили билеты. И что же вы думаете? Решили использовать их по-максимуму) Сели и поехали обратно в центр до Kaisaniemi. Минут за 15 доехали, выскочили и побежали в сторону где по идее должны были быть достопримечательности. 
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0559.JPG" title="" class="shutterset_singlepic22" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/22__160x120_DSC_0559.JPG" alt="DSC_0559" title="DSC_0559" />
</a>
За 20 минут оббежали площадь, сфотали все, что было симпатичного (на фото - вокзал) и побежали обратно. Украшение эскалатора на Kaisaniemi простое, но очень симпатичное. Как росчерки светового пера. На этот раз уже сели в метро и ехали домой до самой Kontula.</p>
<p>Вот так закончился наш первый день. Мы уже порядком разобрались в схеме метро, попривыкли к городу. А на следующий день мы пошли по магазинам и поехали гулять в центр, туда где еще не были. Куда оказывается надо было ехать с самого начала. Но это будет в следующей части.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/poezdka-v-finlyandiyu-part-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/poezdka-v-finlyandiyu-part-2/</feedburner:origLink></item>
		<item>
		<title>Win32:Vitro</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/_lq-tfSpipM/</link>
		<comments>http://www.charnad.com/blog/win32vitro/#comments</comments>
		<pubDate>Wed, 01 Jul 2009 14:43:03 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Обо мне]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=586</guid>
		<description><![CDATA[Подцепил нынче эту заразу. Хотел кряк скачать, а скачал подлянку. Причем NOD и Avast промолчали. Avira ругнулась, но она на все кряки ругается. Ничто не предвещало беды. А теперь..
"The Vitro Trojan WILL, I repeat, WILL require you to back up your data, format your hard disk, then do a wipe of your drive, then reinstall [...]]]></description>
			<content:encoded><![CDATA[<p>Подцепил нынче эту заразу. Хотел кряк скачать, а скачал подлянку. Причем NOD и Avast промолчали. Avira ругнулась, но она на все кряки ругается. Ничто не предвещало беды. А теперь..</p>
<p>"The Vitro Trojan WILL, I repeat, WILL require you to back up your data, format your hard disk, then do a wipe of your drive, then reinstall Windows, all of the service packs and updates, all of your software, then restore your data. This IS the only way to get rid of it." Почитать еще можно <a href="http://www.lockergnome.com/savemybutt/2009/05/10/win32vitro-what-is-it/">тут</a>.<br />
(Тут сказано, что чтобы избавиться от этого вируса надо форматировать и очищать полностью весь жесткий диск, на котором он побывал, в том числе и внешние).</p>
<p>Хочу выразить свою искреннюю ненависть тем, кто его сделал. Горите в аду.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/win32vitro/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/win32vitro/</feedburner:origLink></item>
		<item>
		<title>Поездка в Финляндию. Часть 1.</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/i3VI-9eqkuM/</link>
		<comments>http://www.charnad.com/blog/poezdka-v-finlyandiyu-part-1/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 10:33:04 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Обо мне]]></category>
		<category><![CDATA[Путешествия]]></category>
		<category><![CDATA[Финляндия]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=564</guid>
		<description><![CDATA[
Съездил в Финляндию на пару дней. Вообще Финляндия просто райское место отдыха для Петербуржцев. Съездить туда стоит 15-20 евро, смотря как договоритесь. Ехать туда 6-7 часов. Вечером в пятницу поехал, в воскресенье вечером вернулся. Красота да и только. Самое сложное, конечно, с проживанием. У нас там знакомые, поэтому никаких проблем не было. Дальше буду рассказывать [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/finland.png" alt="" /></p>
<p>Съездил в Финляндию на пару дней. Вообще Финляндия просто райское место отдыха для Петербуржцев. Съездить туда стоит 15-20 евро, смотря как договоритесь. Ехать туда 6-7 часов. Вечером в пятницу поехал, в воскресенье вечером вернулся. Красота да и только. Самое сложное, конечно, с проживанием. У нас там знакомые, поэтому никаких проблем не было. Дальше буду рассказывать и показывать (много фоток).</p>
<p><span id="more-564"></span></p>
<p>
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0159.JPG" title="" class="shutterset_singlepic9" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/9__160x120_DSC_0159.JPG" alt="1. Вид метро Kontula" title="1. Вид метро Kontula" />
</a>
В Финляндии я уже второй раз, но первый мы ездили в Иматру и жили в коттедже. Финнов-то почти не видели. В этот раз мы были в Хельсинки, меня и девушку мою отвели к метро и сказали:"Вот сюда тыкаешь, суешь 2 евро, получаешь билет на 1 час на метро/трамвай/автобус", и оставили нас одних. Делать нечего, спустились в метро. После Питерского, очень непривычно: у них станции чисто утилитарные, без изысков. Понятно теперь, почему наши станции иностранцы считают музеями. Метро у них почти везде наземное, и это прекрасно. Едешь, в окошко смотришь, красота. Много  зелени, залив, очень красиво все. (Хочу, кстати, заметить, что государственных языка в Финляндии два. Финский и шведский, поэтому все указатели как минимум на двух языках. Иногда еще добавляется английский.)<br />

<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0160.JPG" title="" class="shutterset_singlepic10" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/10__160x120_DSC_0160.JPG" alt="2. Карта метро" title="2. Карта метро" />
</a>
Станция, ближайшая к нашему дому называлась Kontula. Схема метро в Хельсинки вообще довольно простая, главное в Itakeskus не перепутать и не уехать на другую ветку. Для этого на каждой электричке на лбу и боках бегущие строки, где написана конечная станция следования. Сели в электричку, куда ехать - не знаем, полнейший шок, выходить не хочется. Так и доехали до конечной.<br />

<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0162.JPG" title="" class="shutterset_singlepic11" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/11__160x120_DSC_0162.JPG" alt="3. Вика в вагоне" title="3. Вика в вагоне" />
</a>
 Вагоны у них в метро очень удобные. Они во-первых шире и вместительнее наших, во-вторых никто не портит сиденья, хотя они просто пластиковые. Я бы совсем не отказался, чтобы у нас было такое же метро, как в Хельсинки.<br />
Вышли мы на конечной станции и пошли по улице. Карта города была в рюкзаке, но от шока забыв про нее и не достали. Так и шли наугад. Вы смеетесь, а представьте себя первый раз в чужом городе, чужой стране, языка не знаем... ужас. На самом деле к тому времени(через полчаса где-то после того, как сели в метро) шок стал проходить и мы стали фотографировали все подряд. Дошли до конца улицы, где стояла странная скульптура.<br />

<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0205.JPG" title="" class="shutterset_singlepic12" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/12__160x120_DSC_0205.JPG" alt="4. Странная композиция" title="4. Странная композиция" />
</a>
 Что это такое мы так и не узнали. 
<a href="http://www.charnad.com/blog/wp-content/gallery/finland-06-2009/DSC_0210.JPG" title="" class="shutterset_singlepic13" >
	<img class="ngg-singlepic ngg-right" src="http://www.charnad.com/blog/wp-content/gallery/cache/13__160x120_DSC_0210.JPG" alt="5. Отражающий знак" title="5. Отражающий знак" />
</a>
<br />
Недалеко от скульптуры находилось трамвайное кольцо. Ни на трамвае, ни на автобусе мы не покатались, боялись уехать неизвестно куда. На карте были обозначеные некоторые маршруты, но рисковать не хотелось. Интересно, что во многих местах у них стоят отражающие знаки, чтобы были видно возможную опасность из-за угла. А может и для таких туристов, как мы))</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/poezdka-v-finlyandiyu-part-1/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/poezdka-v-finlyandiyu-part-1/</feedburner:origLink></item>
		<item>
		<title>SVN, Nginx и ошибка 405 Not Allowed</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/A6F0PbRifzY/</link>
		<comments>http://www.charnad.com/blog/svn-nginx-i-oshibka-405-not-allowed/#comments</comments>
		<pubDate>Thu, 21 May 2009 20:19:32 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[блог]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[VDS]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=559</guid>
		<description><![CDATA[ Для тех у кого проблемы с commit в svn. У меня сегодня случилась ошибка "405 Not Allowed". Оказалось во всем виноват nginx, который я недавно поставил. Проблема, вероятно, появляется у тех, у кого VDS от FirstVDS.ru. Дело в том, что nginx автоматически сжирает конфига апача и настраивает кеширование. А тогда, когда вы пытаетесь закоммитить [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/svnlogo.png" alt=""/> Для тех у кого проблемы с commit в svn. У меня сегодня случилась ошибка "405 Not Allowed". Оказалось во всем виноват nginx, который я недавно поставил. Проблема, вероятно, появляется у тех, у кого VDS от FirstVDS.ru. Дело в том, что nginx автоматически сжирает конфига апача и настраивает кеширование. А тогда, когда вы пытаетесь закоммитить css, js или еще что-то, что nginx пытается проксировать, возникает ошибка. Я ее решил следующим способом - полностью закомментировал location в настройках субдомена svn.charnad.com, где указывается обработка статического контента, так как на это субдомене ничего не надо проксировтаь. После чего рестарт nginx'a и все отлично. Удачи.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/svn-nginx-i-oshibka-405-not-allowed/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/svn-nginx-i-oshibka-405-not-allowed/</feedburner:origLink></item>
		<item>
		<title>Symfony: плагин sfPropelToggler 1.0.0b</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/wN_u78jdD9E/</link>
		<comments>http://www.charnad.com/blog/symfony-plagin-sfpropeltoggler-100b/#comments</comments>
		<pubDate>Sat, 16 May 2009 11:58:36 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[sfPropelToggler]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[togglers]]></category>
		<category><![CDATA[переключатели]]></category>
		<category><![CDATA[плагин]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=511</guid>
		<description><![CDATA[Не так давно я писал про тогглеры (переключатели) в Symfony. Вчера я поработал над ними и существенно упростил их принцип работы, теперь они доступны в качестве плагина. Сразу же дам ссылку, вы можете их скачать в виде PEAR package и просто zip-архив. Дальше я расскажу как этим плагином пользоваться.
Вообще, по правилам PEAR все инструкции написаны [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/symfony_logo.gif" alt=""/>Не так давно я писал про <a href="http://www.charnad.com/blog/symfony-pereklyuchateli/">тогглеры (переключатели) в Symfony</a>. Вчера я поработал над ними и существенно упростил их принцип работы, теперь они доступны в качестве плагина. Сразу же дам ссылку, вы можете их скачать в виде <a href="http://www.charnad.com/files/sfpropeltoggler/sfPropelTogglerPlugin-1.0.0b.tgz">PEAR package</a> и просто <a href="http://www.charnad.com/files/sfpropeltoggler/sfPropelTogglerPlugin-1.0.0b.zip">zip-архив</a>. Дальше я расскажу как этим плагином пользоваться.<span id="more-511"></span></p>
<p>Вообще, по правилам PEAR все инструкции написаны в README. Но там по-английски. А тут я приведу русскую инструкцию. Итак.<br />
1. Надо или установить плагин, как PEAR пакет, или распаковать архив в папку plugins. Папка с плагином должна называться sfPropelTogglerPlugin. После этого вызовите команду symfony 'plugin:publish-assets' чтобы картинки из плагина скопировались в папку web/sfPropelTogglerPlugin. Если ничего не скопировалось - проверьте название папки плагина.<br />
2. В settings.yml вашего приложения впишите в пункт enabled_modules: [default, sfPropelToggler]. Если вы этого не сделаете - будет выскакивать ошибка о том, что модуль не активирован.<br />
3. В том файле, где будете подключать тогглер напишите</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">use_helper<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Toggler'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>4. Собственно сам переключатель может быть вставлен 2мя способами. Первый:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">echo</span> toggler<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'table'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'table_name'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'field'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'field_name'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'id'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$item</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'state'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$item</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getState</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Где table -имя таблицы, field - поле, id - первичный ключ записи, а state - текущее состояние переключателя.<br />
Второй способ через объект:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">echo</span> object_toggler<span style="color: #009900;">&#40;</span><span style="color: #000088;">$object</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'field_name'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Где object - объект Пропела, а field_name - поле, которе будем переключать.
</p>
<p>На этом этапе у вас все должно заработать. Если же нет - спрашивайте в комментариях.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/symfony-plagin-sfpropeltoggler-100b/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/symfony-plagin-sfpropeltoggler-100b/</feedburner:origLink></item>
		<item>
		<title>Панорамы и Autostitch</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/LqoY1fyZHWA/</link>
		<comments>http://www.charnad.com/blog/panorami-i-autostitch/#comments</comments>
		<pubDate>Fri, 15 May 2009 08:59:50 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Фото]]></category>
		<category><![CDATA[панорамы]]></category>
		<category><![CDATA[фотографии]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=498</guid>
		<description><![CDATA[Autostitch - это такая хорошая програмка, которая сшивает несколько изображений в одно, причем автоматически. Это очень удобно и легко, а так как я люблю панорамы - просто суперски. Чтобы не быть голословным - вот вам мои панорамки. Они уменьшены в 4-5 раз на самом деле.
Саму программку можно скачать на сайте автора.
Есть, конечно, некоторые недостатки. Например [...]]]></description>
			<content:encoded><![CDATA[<p>Autostitch - это такая хорошая програмка, которая сшивает несколько изображений в одно, причем автоматически. Это очень удобно и легко, а так как я люблю панорамы - просто суперски. Чтобы не быть голословным - вот вам мои панорамки. Они уменьшены в 4-5 раз на самом деле.</p>

<div class="ngg-galleryoverview" id="ngg-gallery-2-498">


	
	<!-- Thumbnails -->
		
	<div id="ngg-image-6" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.charnad.com/blog/wp-content/gallery/panoramas/izokna_cr3_small.jpg" title=" " class="shutterset_panoramas" >
								<img title="izokna_cr3_small.jpg" alt="izokna_cr3_small.jpg" src="http://www.charnad.com/blog/wp-content/gallery/panoramas/thumbs/thumbs_izokna_cr3_small.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-7" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.charnad.com/blog/wp-content/gallery/panoramas/zaliv_cr_small.jpg" title=" " class="shutterset_panoramas" >
								<img title="zaliv_cr_small.jpg" alt="zaliv_cr_small.jpg" src="http://www.charnad.com/blog/wp-content/gallery/panoramas/thumbs/thumbs_zaliv_cr_small.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-8" class="ngg-gallery-thumbnail-box"  >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://www.charnad.com/blog/wp-content/gallery/panoramas/stachek_small.jpg" title=" " class="shutterset_panoramas" >
								<img title="stachek_small.jpg" alt="stachek_small.jpg" src="http://www.charnad.com/blog/wp-content/gallery/panoramas/thumbs/thumbs_stachek_small.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 	 	
	<!-- Pagination -->
 	<div class='ngg-clear'></div>
 	
</div>


<p>Саму программку можно скачать на сайте <a href="http://www.cs.ubc.ca/~mbrown/autostitch/autostitch.html">автора</a>.<br />
Есть, конечно, некоторые недостатки. Например "фантомы". Это полупрозрачные куски машин, зданий, которые есть на одной фотографии, но нет на другой. Чтобы их не было - надо выбирать кадры, где нет машин вообще. А с прямыми руками и GIMP (Фотошопом) получится очень даже хорошо.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/panorami-i-autostitch/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/panorami-i-autostitch/</feedburner:origLink></item>
		<item>
		<title>Купил черного друга. Nikon D60</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/DVkBlH53pQI/</link>
		<comments>http://www.charnad.com/blog/kupil-chernogo-druga-nikon-d60/#comments</comments>
		<pubDate>Fri, 15 May 2009 08:18:37 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Фото]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=494</guid>
		<description><![CDATA[ Вдруг взбрендилось мне купить зеркалку. Мой первый фотик Panasonic LZ5, который верой и правдой служил мне и отщелкал 12 тысяч кадров подло украли. Временно я купил себе Canon A610, который меня кстати порадовал чуть более, чем полностью. Однако мыльница на 5 мегапикселей, пусть и с ручным фокусом и диафрагмой не могла удовлетворить всех моих [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/d60.gif" alt="" /> Вдруг взбрендилось мне купить зеркалку. Мой первый фотик Panasonic LZ5, который верой и правдой служил мне и отщелкал 12 тысяч кадров подло украли. Временно я купил себе Canon A610, который меня кстати порадовал чуть более, чем полностью. Однако мыльница на 5 мегапикселей, пусть и с ручным фокусом и диафрагмой не могла удовлетворить всех моих фотографических потребностей. Душа требовала нечто большего.<span id="more-494"></span></p>
<p>Первым делом в общем-то я стал смотреть на Canon, а конкретнее на 450D. Смотрел, смотрел, народ спрашивал, интересовался. Первая зеркалка, которую мне удалось потрогать оказалась Никоном Д60 с телеобъективом 70-300мм. Для тех, кто вдруг не знает, в зеркалке сам фотоаппарат - не больше половины, а то и меньше во всей системе. Огромную роль играет объектив, который может стоить больше самого фотоаппарата.</p>
<p>Что такое фокусное расстояние 300мм для человека, который считал, что его мыльницкий зум 6х это круто.. вы просто представить не можете. Это чистый восторг. В общем культурный шок имел место быть. Мой друг Паша, у которого я брал зеркалку сказал, что даст мне штатный объектив 18-55мм, если я куплю Никон. В общем я пошел и купил Никон. Такой же как у него, потому что денег у меня было не так много. Вот теперь и хожу с Никоном Д60 и штатным объективом 18-55мм.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/kupil-chernogo-druga-nikon-d60/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/kupil-chernogo-druga-nikon-d60/</feedburner:origLink></item>
		<item>
		<title>Symfony: порядок записей в таблице</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/gAY1lsPxZpE/</link>
		<comments>http://www.charnad.com/blog/symfony-poryadok-zapisej-v-tablice/#comments</comments>
		<pubDate>Sat, 02 May 2009 10:17:27 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[работа]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=488</guid>
		<description><![CDATA[Этим постом я отвечаю на вопрос в комментариях о том, как я реализовал стрелки вверх и вниз для категорий. Перейдем к делу
У меня в базе данных введен в таблице специальный столбик, называемый order_num. Он как раз и определяет порядковый номер записи в таблице. По нажатию на кнопке вверх (я называю эту процедуру promote), порядковый номер [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/symfony_logo.gif" alt=""/>Этим постом я отвечаю на вопрос в комментариях о том, как я реализовал стрелки вверх и вниз для <a href="http://www.charnad.com/blog/symfony-kategorii-i-podkategorii/">категорий</a>. Перейдем к делу<span id="more-488"></span></p>
<p>У меня в базе данных введен в таблице специальный столбик, называемый order_num. Он как раз и определяет порядковый номер записи в таблице. По нажатию на кнопке вверх (я называю эту процедуру promote), порядковый номер текущей записи меняется местами с порядковым ближайшим большим порядковым номером. Обратная процедура (demote) меняет с ближайшим меньшим.</p>
<p>Обращу ваше внимание на то, что этот пример сделан не для категорий а для контентных страниц (что сути не меняет), к тому же учитывается parent_id, то есть можно менять порядок внутри категории не затрагивая другие.</p>
<p><strong>Promote:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> executePromote<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$page_id</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getRequestParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'page_id'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$connection</span> <span style="color: #339933;">=</span> Propel<span style="color: #339933;">::</span><span style="color: #004000;">getConnection</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$promoting_RS</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SELECT order_num, parent_id FROM static_pages WHERE page_id='<span style="color: #006699; font-weight: bold;">{$page_id}</span>'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$promoting</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$promoting_RS</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fetch</span><span style="color: #009900;">&#40;</span>PDO<span style="color: #339933;">::</span><span style="color: #004000;">FETCH_ASSOC</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$promoting_num</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$promoting</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'order_num'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$promoting_parent</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$promoting</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'parent_id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$promoting_num</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'static_pages/index'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000088;">$demoting_num_RS</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SELECT MAX(order_num) AS order_num, page_id FROM static_pages WHERE parent_id='<span style="color: #006699; font-weight: bold;">{$promoting_parent}</span>' AND order_num &lt; '<span style="color: #006699; font-weight: bold;">{$promoting_num}</span>' GROUP BY NULL&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$demoting</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$demoting_num_RS</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fetch</span><span style="color: #009900;">&#40;</span>PDO<span style="color: #339933;">::</span><span style="color: #004000;">FETCH_ASSOC</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$demoting_num</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$demoting</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'order_num'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;UPDATE static_pages SET order_num = CASE
   WHEN page_id = '&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$page_id</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;' THEN '&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$demoting_num</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;'
   WHEN parent_id='<span style="color: #006699; font-weight: bold;">{$promoting_parent}</span>' AND order_num='<span style="color: #006699; font-weight: bold;">{$demoting_num}</span>' THEN '&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$promoting_num</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;'
   END
   WHERE page_id = &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$page_id</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot; OR (parent_id=<span style="color: #006699; font-weight: bold;">{$promoting_parent}</span> AND order_num=<span style="color: #006699; font-weight: bold;">{$demoting_num}</span>)&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'static_pages/index'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">return</span> sfView<span style="color: #339933;">::</span><span style="color: #004000;">NONE</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

</p>
<p>Мы берем id из запроса, потом запросом ищем максимальный order_num, который меньше текущего, и потом запросом меняем их местами. Не забудьте ставить WHERE в UPDATE. На основе этого, думаю demote легко дописать самому. <br /> P.S> Поле не должно быть UNIQUE, я так и не придумал как одним запросом менять значения между собой в UNIQUE поле. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/symfony-poryadok-zapisej-v-tablice/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/symfony-poryadok-zapisej-v-tablice/</feedburner:origLink></item>
		<item>
		<title>Symfony: переключатели</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/0fdhicqtzto/</link>
		<comments>http://www.charnad.com/blog/symfony-pereklyuchateli/#comments</comments>
		<pubDate>Fri, 24 Apr 2009 14:20:35 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[togglers]]></category>
		<category><![CDATA[переключатели]]></category>
		<category><![CDATA[работа]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=482</guid>
		<description><![CDATA[ Давно я не брал в руки шашек. То есть не писал про symfony. А разработка продолжается. Сайт фактически готов, остаются мелкие доделки, доработка напильником и все такое. О "переключателях" или "тогглерах"(togglers), или не знаю как еще их назвать я уже давно хотел написать. Ну вот и пришло время, получайте.
Итак что же за переключатели такие? [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/symfony_logo.gif" alt="" /> Давно я не брал в руки шашек. То есть не писал про symfony. А разработка продолжается. Сайт фактически готов, остаются мелкие доделки, доработка напильником и все такое. О "переключателях" или "тогглерах"(togglers), или не знаю как еще их назвать я уже давно хотел написать. Ну вот и пришло время, получайте.<span id="more-482"></span></p>
<p>Итак что же за переключатели такие? Допустим у нас есть сайт, а у него база данных, а в базе данных таблица, а в таблице поле, которое принимает только 2 значения - 0 и 1. Такие поля делаются типа TINYINT(1). Берем пример из жизни. Одно такое поле отвечает за то, разрешено ли пользователю входить в систему или нет. И если вдруг надо нам попереключать часть пользователей, то надо залезать в свойства каждого и менять, потом сохранять. А мне захотелось жить красивее и придумал я переключатели.</p>
<p><img style="margin-right: 10px;" src="http://www.charnad.com/blog/wp-content/uploads/pictures/togglers/overview.png" alt="Список пользователей"/></p>
<p>Вот так примерно выглядит список пользователей. Зеленая галочка и красный крестик и есть переключатели. Что сделать чтобы переключить пользователя? Просто кликнуть на них! По клику отправляется AJAX запрос, меняет поле в базе данных и по результатам меняет картинку. Красиво, удобно, быстро. А теперь о том, как это сделано.</p>
<p>Для каждого пользователя в таблице нам надо вставить партиал (partial), который будет отображать картинку. Для формирования таблицы мы foreach перебираем пользователей и вот код partial для переключателя.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&lt;div id=&quot;active_<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$user</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot;&gt;
  <span style="color: #000000; font-weight: bold;">&lt;?php</span> include_partial<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'activity'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$user</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'state'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$user</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'is_active'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;/div&gt;</pre></div></div>

<p>Как видно в него мы передаем 2 параметра, это id пользователя и его текущий статус. В самом партиалле находится следующий код:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> 
<span style="color: #000088;">$field</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'IsActive'</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;div align=&quot;center&quot; id=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$field</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'_'</span><span style="color: #339933;">.</span><span style="color: #000088;">$id</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot;&gt;
<span style="color: #000000; font-weight: bold;">&lt;?php</span>
include_component<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'main'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'toggler'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
  <span style="color: #0000ff;">'id'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$id</span><span style="color: #339933;">,</span>
  <span style="color: #0000ff;">'table'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'sfGuardUser'</span><span style="color: #339933;">,</span>
  <span style="color: #0000ff;">'state'</span> <span style="color: #339933;">=&gt;</span> sfGuardUserPeer<span style="color: #339933;">::</span><span style="color: #004000;">retrieveByPK</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getIsActive</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
  <span style="color: #0000ff;">'field'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$field</span>
<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;/div&gt;</pre></div></div>

<p>Здесь $field - имя поля в базе данных. В партиалле создается div с названием $field_$id, куда будет присылаться ответ. Ну а дальше вызывается компонент main/toggler, который и будет собственно переключать. Компоненту мы передаем id пользователя, имя таблицы, текущее состояние и имя поля.
</p>
<p>На этом подключение переключателя к модулю завершено. То есть вам надо всего лишь вызвать partial из шаблона, а в partiall'e подправить названия поля и таблицы. Все очень просто и быстро. Ну а собственно что в компоненте main/toggler? А там вот что:<br />
<strong>components.class.php</strong></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> executeToggler<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">//i just call _toggler.php partial</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>_toggler.php</strong></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$update</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$field</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'_'</span><span style="color: #339933;">.</span><span style="color: #000088;">$id</span><span style="color: #339933;">;</span>
sfApplicationConfiguration<span style="color: #339933;">::</span><span style="color: #004000;">getActive</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">loadHelpers</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Javascript'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$image_name</span> <span style="color: #339933;">=</span> <span style="color: #990000;">intval</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$state</span><span style="color: #009900;">&#41;</span>? <span style="color: #0000ff;">'active.png'</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">'inactive.png'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> link_to_remote<span style="color: #009900;">&#40;</span>image_tag<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/images/icons/admin/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$image_name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span>
   <span style="color: #0000ff;">'url'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'main/toggle?id='</span><span style="color: #339933;">.</span><span style="color: #000088;">$id</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&amp;table='</span><span style="color: #339933;">.</span><span style="color: #000088;">$table</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&amp;field='</span><span style="color: #339933;">.</span><span style="color: #000088;">$field</span><span style="color: #339933;">,</span>
   <span style="color: #0000ff;">'update'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$update</span>
<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Мы формируем $update - поле, куда вернем ответ. А в виде ответа мы возвращаем... переключатель. Нам надо подгрузить хелпер Javascript (обратите внимание, что надо с большой буквы писать, иначе ничего не получится. симфони требует соблюдения регистра). И с помощью хелпера генерим аяксовую ссылку на экшен, который уже и будет переключать.</p>
<p>Что же получается? Итак общая картинка такая. Мы подключаем partial, который вызывает компонент, который генерит шаблон выдавая нам аяксовую ссылку на действие (action). А экшен переключает нам поле, и рендерит тот же самый компонент.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> executeToggle<span style="color: #009900;">&#40;</span>sfWebRequest <span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">isXmlHttpRequest</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">renderText</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Error. XMLHttpRequests only.'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #000088;">$id</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$table</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'table'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$field</span> <span style="color: #339933;">=</span>  <span style="color: #000088;">$request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'field'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$peer</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">normalizeName</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$table</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'Peer'</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000088;">$method</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ReflectionMethod<span style="color: #009900;">&#40;</span><span style="color: #000088;">$peer</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'retrieveByPK'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$object</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$method</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">invoke</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span> <span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000088;">$setter</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'set'</span><span style="color: #339933;">.</span><span style="color: #990000;">ucfirst</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$field</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$getter</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'get'</span><span style="color: #339933;">.</span><span style="color: #990000;">ucfirst</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$field</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000088;">$object</span><span style="color: #339933;">-&gt;</span><span style="color: #000088;">$setter</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$state</span> <span style="color: #339933;">=</span> <span style="color: #339933;">!</span><span style="color: #000088;">$object</span><span style="color: #339933;">-&gt;</span><span style="color: #000088;">$getter</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">renderPartial</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'main/toggler'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$id</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'state'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$state</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'table'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$table</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'field'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$field</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
protected <span style="color: #000000; font-weight: bold;">function</span> normalizeName<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$name</span> <span style="color: #339933;">=</span> <span style="color: #990000;">preg_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/[^a-zA-Z0-9]/'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">' '</span><span style="color: #339933;">,</span> <span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$name</span> <span style="color: #339933;">=</span> <span style="color: #990000;">ucwords</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$name</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">' '</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #000088;">$name</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Принимаем только аяксовые запросы, из запроса получаем таблицу, поле и имя Propel Peer-класса для управления таблицей. Имя таблицы мы "нормализуем", т.к. симфони не использует, например, подчеркиваний в названии Peer-классов. Ну а дальше, с помощью рефлексии мы вызываем метод для того, чтобы получить объект, над которым производим действия. Геттеры и сеттер имеют стандартные названия и их рефлексить нам не надо. После чего в ответ рендерим тот же самый компонент, который вернет нам картинку с аяксовой ссылкой на то же самое действие.
</p>
<p>Я догадываюсь, что это не так просто понять. Если будет совсем не в моготу - задавайте вопросы в комментариях.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/symfony-pereklyuchateli/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/symfony-pereklyuchateli/</feedburner:origLink></item>
		<item>
		<title>Sun Tech Days 2009</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/Wsf02gQodX4/</link>
		<comments>http://www.charnad.com/blog/sun-tech-days-2009/#comments</comments>
		<pubDate>Fri, 10 Apr 2009 21:12:12 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Обо мне]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[sun tech days]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=454</guid>
		<description><![CDATA[Сходил я тут на Sun Tech Days. Само мероприятие длится три дня, я пошел только на первый. Дальше напишу что там было и выложу фотки.
Сразу замечу, что организация была на высшем уровне. Только мы с другом вышли из метро - нам на глаза попался парень с табличкой Sun Tech Days. Он нам обьяснил, что ходит [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/sunlogo.gif" alt=""/>Сходил я тут на Sun Tech Days. Само мероприятие длится три дня, я пошел только на первый. Дальше напишу что там было и выложу фотки.<span id="more-454"></span></p>
<p>Сразу замечу, что организация была на высшем уровне. Только мы с другом вышли из метро - нам на глаза попался парень с табличкой Sun Tech Days. Он нам обьяснил, что ходит бесплатный автобус до Ленэкспо. Пройдя чуть дальше мы заметили и второго парня с такой же табличкой. То есть пропустить их можно было, только если очень постараться. Самого автобуса пришлось подождать минут 15. Ехать там на самом деле 5 минут. </p>
<p>И вот мы приехали.
<a href="http://www.charnad.com/blog/wp-content/gallery/suntechdays09/1.jpg" title="" class="shutterset_singlepic42" >
	<img class="ngg-singlepic ngg-right" src="http://www.charnad.com/blog/wp-content/gallery/cache/42__160x120_1.jpg" alt="1" title="1" />
</a>
</a>. У нас заранее был распечатан бар-код для быстрой регистрации. Мой друг (Женя <Riot> Кузнецов) зарегистрировался очень быстро, а вот мой бейджик никак не могли распечатать. В итоге я простоял там около 15 минут пока девушки на регистрации не придумали написать мне маркером имя-фамилию. Позже я подошел и забрал распечатку. Это был единственный организационный прокол во всем, что я видел. С бейджиком выдали пакет, где лежали анкеты для викторин, несколько дисков и рекламок.</p>

<a href="http://www.charnad.com/blog/wp-content/gallery/suntechdays09/2.jpg" title="" class="shutterset_singlepic51" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/51__160x120_2.jpg" alt="2" title="2" />
</a>

<p>Так как доклады должны были начаться позже - мы пошли осматривать стенды. Первым шел стенд от AMD, где мы тут же затарились ковриками для мышки и дисками с некими tools. Что там я так пока и не знаю. Кроме рекламных листовок на стенде больше ничего не было. Напротив AMD у входа стоял стенд кого бы вы думали.. правильно, Intel. На самом стенде опять же куча рекламного мусора, для ознакомления 2 ноутбука Dell на процессорах Интел. Тут удалось ухватить пару ручек и раскладной стаканчик. Спрашивать у АМДшников и Интеловщиков нам в общем было нечего. Первый к кому я обратился был мужик рассказывающий о Cloud Computing. Он мне рассказал, что Sun собирается помогать людям разворачивать свои собственные облака для вычислений. Как - я не понял. Я думаю сказалось не то, что мужик говорил на английском, тут-то я все понимал, а то, что я не очень знаю про облачные вычисления.</p>
<p>Следующий стенд на который я обратил внимание - стенд Virtual Box. На 2х 30 дюймовых мониторах под управлением Виртуал Бокса крутилось порядка 20 осей. В том числе и Leopard. Я тут же спросил, неужели можно запустить Mac OS 10.5 Leopard на Virtual Box. Мне ответили, что это скорее proof of concept. Короче спецы смогли, а вот дома вряд ли получится. Стенд с MySQL мне был интересен, однако спрашивать мне было особо нечего, а сами они ничего не показывали. На стенде с соц. сетью от Sun, которая называется OSUM мы зарегистрировались и получили браслетик и значок. Если честно фигня какая-то) Но халява. На стенде с JavaFX была куча различных демок возможностей этой технологии. Меня поразил паззл, когда видео разбито на кусочки и надо его собирать. Видео при этом продолжало идти.</p>

<a href="http://www.charnad.com/blog/wp-content/gallery/suntechdays09/3.jpg" title="" class="shutterset_singlepic52" >
	<img class="ngg-singlepic ngg-right" src="http://www.charnad.com/blog/wp-content/gallery/cache/52__160x120_3.jpg" alt="3" title="3" />
</a>
Что меня на самом деле заинтересовало, так это стенд с супер-ручкой и роботом. В ручку был вмонтирована камера и экранчик. В специальном блокноте (там была спец. бумага с вкраплениями металла, чтобы ручка могла распознать положение) были нарисованы кнопки. Они и управляли ручкой. Можно было писать текст и говорить. После чего ткнуть в написанное и ручка воспроизводила речь с того момента. Так же умела считать как калькулятор. Кнопки были так же нарисованы. А робот просто ездил туда-сюда и избегал препятствий. Не очень, конечно, впечатлило, зато интереснее других стендов. Надо заметить что все это работало под управлением Java ME.</p>
<p>Тут пришло время докладов. Мы вместе пошли на Ajax Best Practice. 
<a href="http://www.charnad.com/blog/wp-content/gallery/suntechdays09/4.jpg" title="" class="shutterset_singlepic53" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/53__160x120_4.jpg" alt="4" title="4" />
</a>
 Девушка, кажется ее звали Дорис Чен, рассказывала о том, как лучше всего писать JS и AJAX код, а так же затронула YSlow плагин для FireFox. Мне показалось, что лекция была не сбалансирована. То она говорит, что JS и CSS надо отделять от HTML (это в детском саду проходят), то говорит про Etags, о которых я не слышал вовсе. С помощью YSlow Дорис проверила разные сайты. Особенно одобрительный гул поднялся в зале, когда сайту Microsoft была присвоена самая низкая оценка оптимизации F. После окончания лекции мы встретили еще одного друга Диму.</p>
<p>
<a href="http://www.charnad.com/blog/wp-content/gallery/suntechdays09/5.jpg" title="" class="shutterset_singlepic54" >
	<img class="ngg-singlepic ngg-right" src="http://www.charnad.com/blog/wp-content/gallery/cache/54__160x120_5.jpg" alt="5" title="5" />
</a>
На вторую лекцию я пошел один. Женя пошел на C++, а я на MySQL. Докладывал один из разработчиков сервера. О чем он говорил - повторять не возьмусь. Основные темы - MySQl 5.1, 6.0, форки, какие изменения грядут, почему и как. В отличии от Дорис, которая была евангелистом, этот парень - разработчик и его технический уровень был значительно выше. Из множеста терминов я запомнил только то, что будет Row Base Replication, сделают backup, который сможет делать резервную копию не блокируя таблицу. Так же рассказали про partitioning, рассказали про то, как идет разработка и почему не принимаются сторонние патчи. Теперь они кстати будут приниматься. В общем этого парня бы я слушал часами. Лекция пролетела моментом.</p>
<p>Дальше был обеденный перерыв. Тут я очень удивился, поскольку принесли бутерброды с сыром, с колбасой, булочки с мясом, еще какие-то которых я не попробовал, соки, чай, кофе, сливки, сахар, сандвичи, фрукты, даже небольшие коробочки с салатами. Улавливаете? Можно было очень неплохо и вкусно поесть. За это Sunу отдельное спасибо. На голодный желудок технологии воспринимаются не так хорошо. Немного мешала толпа рвущихся к еде, но это понятно, народу было очень, очень много.</p>
<p>Дальше по нашей программе шел мастер класс по JS инструментам. Прождав минут 20 в корридоре мы с Димой(Женя уже уехал) были счастливы что пришли раньше. Оказалось, что на мастер-класс записывались заранее и количество участников было ограничено. Когда оказалось, что есть свободные места стали пускать остальных. Мы оказались последними кого пустили. Повезло! Усадили нас за компьютеры: монитор Sun, мышка Sun, клавиатура Sun. И все ОЧЕНЬ ТОРМОЗИТ. 
<a href="http://www.charnad.com/blog/wp-content/gallery/suntechdays09/6.jpg" title="" class="shutterset_singlepic55" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/55__160x120_6.jpg" alt="6" title="6" />
</a>
Но думаю это связано с тем, что мы сидели не за настоящим компьютером, а за эмуляцией на виртуальной машине. Системных блоков под столами не было, а были только куча проводов. Пока были вступительные слова про курсы, которые ведет лектор я немного пощупал Open Solaris. (Кажется это был он). Я не нашел никаких особых отличий от других UNIX систем. Та же консоль, тот же Gnome.</p>
<p>Тут пришла пора взяться за практические задания. Среда разработки была NetBeans, браузер FireFox. Всего три задания. Первое: настроить автокомплит на Prototype, второе настроить базу данных для него и третье - на основе YUI сделать красивую табличку с юзерами. Времени было очень мало и мы на самом деле не успели толком сделать даже первое задание. Кое-как перескочили на второе, пока создавали базу пришла пора третьего. Тут мы уже ничего не делали просто изучали. И.. доизучались) Вызвали 500 Server Error. 
<a href="http://www.charnad.com/blog/wp-content/gallery/suntechdays09/7.jpg" title="" class="shutterset_singlepic56" >
	<img class="ngg-singlepic ngg-right" src="http://www.charnad.com/blog/wp-content/gallery/cache/56__160x120_7.jpg" alt="7" title="7" />
</a>
</a>Вообще я думаю это не очень хорошо характеризует Java Server Faces или что там было. Ничего криминального мы не делали, код не меняли, а ошибка вылезла.</p>
<p>Когда закончился мастер-класс сил идти на лекции у нас уже не было, да и все они были не очень интересные. Полтора часа мы просидели и пробродили везде где только могли. Ничего нового уже не услышали на стендах, ничего нового не взяли. Встретили нашего преподавателя, который так же был моим дипломным руководителем. Ждали, ждали и дождались. В 18.40 стали раздавать рюкзаки. В них помимо кучи рекламы были несколько журналов и дисков. Получив рюкзак я поехал домой. Остался невероятно доволен! Дальше я просто положу некоторые фотки.</p>
<p>
<a href="http://www.charnad.com/blog/wp-content/gallery/suntechdays09/8.jpg" title="" class="shutterset_singlepic57" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/57__160x120_8.jpg" alt="8" title="8" />
</a>
 
<a href="http://www.charnad.com/blog/wp-content/gallery/suntechdays09/9.jpg" title="" class="shutterset_singlepic58" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/58__160x120_9.jpg" alt="9" title="9" />
</a>


<a href="http://www.charnad.com/blog/wp-content/gallery/suntechdays09/10.jpg" title="" class="shutterset_singlepic43" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/43__160x120_10.jpg" alt="10" title="10" />
</a>
 
<a href="http://www.charnad.com/blog/wp-content/gallery/suntechdays09/11.jpg" title="" class="shutterset_singlepic44" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/44__160x120_11.jpg" alt="11" title="11" />
</a>
 
<a href="http://www.charnad.com/blog/wp-content/gallery/suntechdays09/12.jpg" title="" class="shutterset_singlepic45" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/45__160x120_12.jpg" alt="12" title="12" />
</a>
 
<a href="http://www.charnad.com/blog/wp-content/gallery/suntechdays09/13.jpg" title="" class="shutterset_singlepic46" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/46__160x120_13.jpg" alt="13" title="13" />
</a>
 
<a href="http://www.charnad.com/blog/wp-content/gallery/suntechdays09/14.jpg" title="" class="shutterset_singlepic47" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/47__160x120_14.jpg" alt="14" title="14" />
</a>
 
<a href="http://www.charnad.com/blog/wp-content/gallery/suntechdays09/15.jpg" title="" class="shutterset_singlepic48" >
	<img class="ngg-singlepic ngg-left" src="http://www.charnad.com/blog/wp-content/gallery/cache/48__160x120_15.jpg" alt="15" title="15" />
</a>

<p><br clear="both"><br />
<br /><strong>Upd:</strong>adw0rd написал отчет о втором днем. <noindex><a href="http://adw0rd.ru/2009/sun-tech-days-2009-report/" rel="nofollow">Смотрим</a></noindex>.<br /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/sun-tech-days-2009/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/sun-tech-days-2009/</feedburner:origLink></item>
		<item>
		<title>Апдейт класса wp-poster</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/S8EK4O34q6k/</link>
		<comments>http://www.charnad.com/blog/apdejt-klassa-wp-poster/#comments</comments>
		<pubDate>Wed, 01 Apr 2009 09:47:36 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[wp-poster]]></category>
		<category><![CDATA[xml-rpc]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=447</guid>
		<description><![CDATA[Долго-долго не было апдейтов, но вот пора настала. Изменилось в общем-то немного. По-прежнему надо дописать FAQ и Manual, по-прежнему куча нереализованных фишек.. но движение какое-то есть. Рассказывать мне особо нечего, просто повешу ссылку.
http://www.charnad.com/wp-poster/
Прошу писать мне идеи, багрепорты и предложения.
]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/code_wp_poster.png" alt="wp-poster" />Долго-долго не было апдейтов, но вот пора настала. Изменилось в общем-то немного. По-прежнему надо дописать FAQ и Manual, по-прежнему куча нереализованных фишек.. но движение какое-то есть. Рассказывать мне особо нечего, просто повешу ссылку.</p>
<p><a href="http://www.charnad.com/wp-poster/">http://www.charnad.com/wp-poster/</a></p>
<p>Прошу писать мне идеи, багрепорты и предложения.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/apdejt-klassa-wp-poster/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/apdejt-klassa-wp-poster/</feedburner:origLink></item>
		<item>
		<title>Переезд блога</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/2HnHtqknMm8/</link>
		<comments>http://www.charnad.com/blog/pereezd-bloga/#comments</comments>
		<pubDate>Fri, 27 Mar 2009 11:08:00 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[блог]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[VDS]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=438</guid>
		<description><![CDATA[Как некоторые возможно заметили блог переехал. Раньше я жил на шаред хостинге. Тариф был нормальный, возможностей было уйма: SVN, Jabber, RoR, MsSQL, PostreSQL, возможность запускать демонов и куча всего еще. Но.. 1 домен и 1 БД. Это все равно что Ferrari в чаще леса. Круто, но не развернешься. Присмотрел я себе 3 хостинга для переезда: [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/freebsd.gif" alt="" />Как некоторые возможно заметили блог переехал. Раньше я жил на шаред хостинге. Тариф был нормальный, возможностей было уйма: SVN, Jabber, RoR, MsSQL, PostreSQL, возможность запускать демонов и куча всего еще. Но.. 1 домен и 1 БД. Это все равно что Ferrari в чаще леса. Круто, но не развернешься. Присмотрел я себе 3 хостинга для переезда: Infobox, McHost и неизвестный мне до этого Domishko. С первыми двумя я общался по работе(техподдержка у Инфобокса надо заметить отменная). Но тут вдруг мой товарищ YS.PRO предложил попробовать VDS.<span id="more-438"></span></p>
<p>Ну сказано-сделано. Срок оплаты хостинга кончался через пару недель, так что я заплатил 150р за самый дешевый тариф и получил в свое распоряжение сервер с 64 метрами оперативки, 300Мгц процессором под управлением FreeBSD 6.3. ФриБСД я в общем-то увидел в первый раз в жизни. Но так как я уже имел немного дел с линуксовой командной строкой особых затруднений не возникло. Однако, первые затруднения возникили - я захотел поставить SVN. Утомлять тонкостями не буду, скажу просто, что заняло это у меня день. И потом еще пол дня чтобы нормально суметь закоммитить туда проект.</p>
<p>Потом начался перенос домена. Казалось бы что сложного, поменял ns-ки и всего делов. Ну поменял. А блог все равно остается по старому адресу. Ну ладно думаю, может где DNS сглючило, из панели VDS послал команду обновить. Опа, сайт мой заработал на VDS... да недолго, через час опять у хостера оказался. Нифига себе, думаю, заявочки. А оказалось, что хостер тянет одеяло на себя - надо было домен у него в панели отвязать. Вот они и перетягивали домен кто куда.</p>
<p>На настоящий момент все хорошо, полет нормальный. Тормозить конечно стало больше. Значительно. Подумываю о том, чтобы взять следующий тариф, но это уже видно будет позже. Пока что кеш спасает.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/pereezd-bloga/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/pereezd-bloga/</feedburner:origLink></item>
		<item>
		<title>Symfony: теги</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/4KeS8IF2fFg/</link>
		<comments>http://www.charnad.com/blog/symfony-tegi/#comments</comments>
		<pubDate>Sun, 15 Mar 2009 15:24:00 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=416</guid>
		<description><![CDATA[Продолжаю серию постов про разработку на симфони. На этот раз задача состояла в том, чтобы сделать администрирование тегов. Задача:" все теги можно редактировать на одной странице, теги можно только редактировать и удалять, если тег после редакции совпадает с уже существующим - они склеиваются". Ну что ж, поехали.
Почти сразу у меня возникла идея использовать input_in_place_editor. То [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/symfony_logo.gif" alt=""/>Продолжаю серию постов про разработку на симфони. На этот раз задача состояла в том, чтобы сделать администрирование тегов. Задача:" все теги можно редактировать на одной странице, теги можно только редактировать и удалять, если тег после редакции совпадает с уже существующим - они склеиваются". Ну что ж, поехали.<span id="more-416"></span></p>
<p>Почти сразу у меня возникла идея использовать input_in_place_editor. То есть табличка, в ней теги, тыкаешь на ячейку, появляется поле редактирования, изменения происходят аяксово. С самим in_place_editor возникло немало сложностей из-за его опций. Сделать табличку и насовать в каждую ячейку по эдитору несложно. Не забудьте, надо облачить это все в див, который будет обновляться. Мы же хотим показывать сохраненный тег.</p>
<p>Первое, с чем мне пришлось столкнуться - эффект затухания. Это очень красиво, когда наводишь на элемент, который можно редактировать, фон загорается цветом, и медленно затухает, когда уводишь мышку. Изначально фон загорается желтым, а так как админка у меня выдержана в цветах Админ-генератора, то есть синем, то и цвет надо поменять. Однако, изменив цвет на <span style="background-color: white;">'#eef'</span>, я обломался. Затухания не было. Фон сначала загорался, а потом через время менял свой цвет на изначальный. И только позже, случайно я догадался расписать цвет полностью на <span style="background-color: white;">'#efefff'</span>.</p>
<p>Следующим моментом стало изменение текстов сохранения. То есть тот текст, который написан на элементе пока идет аякс запрос. Нашел опцию, поставил значение, и... ничего не работает. Оказалось, что некоторые опции (а они задаются ассоциативным массивом) надо задавать особенно. Например опцию 'save_text' надо не просто заключать в кавычки (потому что это строка), а еще и добавлять кавычки внутри самой строки. Иначе это дело парсится без кавычек. Тупизм, неужели создаетли Protoype'а не могли сами ставить кавычки? Приходится теперь писать так:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #0000ff;">'savingText'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'\'Сохранение...\''</span></pre></div></div>

</p>
<p>Кнопочку удаления так же сделал дивом, но это просто. Position: relative, height: 0px, align: right; Надо заметить, что на время редактирования тега, кнопочку надо скрывать, иначе она уезжает вниз и портит вид. А делается это с помощью опции 'onEnterEditMode'. Вот так:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #0000ff;">'onEnterEditMode'</span> <span style="color: #339933;">=&gt;</span> 
<span style="color: #0000ff;">&quot;function(form, value) { $('delete_&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$tag</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'tag_id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;').hide(); }&quot;</span></pre></div></div>

</p>
<p>Ну и наконец, сделать надо было системку, которая находит дубликаты тегов. А сделал я так: при сохранении тега, я нахожу ВСЕ теги с таким названием. Если такой тег один (которы мы только что сохранили), то все прекрасно, а если нет, тогда в цикле генерим 2 запроса. Один UPDATE, другой DELETE. UPDATE'ом, все товары, которые были привязаны к дубликату тега перепривязываем к самому первому найденному. Он в итоге остается у нас единственным. А DELETE'ом, удаляем дубликаты. Вот так вот:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$criteria</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Criteria<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span>TagsPeer<span style="color: #339933;">::</span><span style="color: #004000;">TITLE</span><span style="color: #339933;">,</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$duplicates</span> <span style="color: #339933;">=</span> TagsPeer<span style="color: #339933;">::</span><span style="color: #004000;">doSelect</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$criteria</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//В качестве итогового тега берем самый первый</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$duplicates</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$original</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$duplicates</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$query_update</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;UPDATE tags_bouquets SET tag_id='{<span style="color: #006699; font-weight: bold;">$original-&gt;getTagId</span>()}' WHERE tag_id IN(&quot;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$query_delete</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;DELETE FROM tags WHERE tag_id IN (&quot;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$pass_first</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$duplicates</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$duplicate</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$pass_first</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000088;">$pass_first</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000088;">$query_update</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$duplicate</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getTagId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">','</span><span style="color: #339933;">;</span>
      <span style="color: #000088;">$query_delete</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$duplicate</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getTagId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">','</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>   
  <span style="color: #009900;">&#125;</span>
  <span style="color: #000088;">$query_delete</span> <span style="color: #339933;">=</span> <span style="color: #990000;">rtrim</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query_delete</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">','</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">');'</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$query_update</span> <span style="color: #339933;">=</span> <span style="color: #990000;">rtrim</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query_update</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">','</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">');'</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$conn</span> <span style="color: #339933;">=</span> Propel<span style="color: #339933;">::</span><span style="color: #004000;">getConnection</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$conn</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'BEGIN; '</span><span style="color: #339933;">.</span><span style="color: #000088;">$query_update</span><span style="color: #339933;">.</span><span style="color: #000088;">$query_delete</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'COMMIT;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getUser</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFlash</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'notice_duplicated'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Были найдены и удалены дубликаты тега '</span><span style="color: #339933;">.</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

</p>
<p>Результат на картинке. Легкая синева - это как раз затухание фона, я специально мышкой повозил.<br />
<img src="http://www.charnad.com/blog/wp-content/uploads/pictures/flower_tags.png" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/symfony-tegi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/symfony-tegi/</feedburner:origLink></item>
		<item>
		<title>Symfony: категории и подкатегории</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/yLZ4SDwKnTI/</link>
		<comments>http://www.charnad.com/blog/symfony-kategorii-i-podkategorii/#comments</comments>
		<pubDate>Fri, 06 Mar 2009 09:39:40 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[работа]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=394</guid>
		<description><![CDATA[Этот пост не совсем про симфони. На самом деле я опишу, как реализовывал категории и подкатегории для сайта над которым тружусь уже около месяца. Но так как сам сайт создается на symfony, то без нее тут никуда. Задача стояла примерно такая: для удобной навигации и поиска по товарам их нужно отнести к различным категориям и [...]]]></description>
			<content:encoded><![CDATA[<p><img class="oppic" src="http://www.charnad.com/blog/wp-content/uploads/pictures/symfony_logo.gif" alt=""/>Этот пост не совсем про симфони. На самом деле я опишу, как реализовывал категории и подкатегории для сайта над которым тружусь уже около месяца. Но так как сам сайт создается на symfony, то без нее тут никуда. Задача стояла примерно такая: для удобной навигации и поиска по товарам их нужно отнести к различным категориям и подкатегориям. Количество как первых, так и вторых может быть бесконечно. Единственное ограничение - уровень вложенности, он равен двум. В тех.задании категории и подкатегории были описаны двумя таблицами. Я думаю, что если бы последовал этому - я бы сэкономил пару-тройку часов, однако же, мне пришла в голову идея сделать все в одной таблице. Ведь по сути эти сущности ничем не отличаются, только что подкатегории имеют родительские категории.</p>
<p><span id="more-394"></span></p>
<p>По моему плану в поле, обозначающем предка в базе данных у всех должен стоять id родительской категории, а у собственно родительских - 0. Сказано - сделано, создана таблица, заполнена тестовыми данными. Заказчик обрисовал в ТЗ форму редактирования примерно так:</p>
<div><img src="http://www.charnad.com/blog/wp-content/uploads/pictures/categories_task.png" alt="" align="center" /></div>
<p>Стрелочки вверх и вниз редактируют порядок категорий. Плюсики - добавление категории или подкатегории.</p>
<p>Обрисовав примерную форму в Admin Generator'e в симфони, я скопировал все сгенерированные файлы в папку модуля, удалил generator.yml, то есть дальше модуль был полностью под моим контролем. Конечно, симфони генерит много необязательного кода, чтобы его убрать требуется время. Например мне сейчас совсем не нужна интернационализация, поэтому я старательно убрал все __() функции и подключения хелперов. Так же сократил количество файлов, мне не нужны были партиаллы header, footer, а некоторые я просто объединил. В итоге у меня оказалось всего 3 партиалла и 2 файла темплейтов.</p>
<p>Тут, собственно, и начинается самое интересное. Чтобы не переписывать шаблоны полностью, я не хотел терять функционала Propel'a и доставал все значения из базы именно им. Но вот тут возник вопрос: "Как вывести массив объектов, возвращенных Пропелом, так, чтобы подкатегории шли сразу за своей категорией?". Решение я придумал довольно быстро - нужно было построить дерево. И вот что я сделал:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$tree</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$element</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   <span style="color: #000088;">$parentId</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$element</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getParentId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$parentId</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000088;">$tree</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'root'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$element</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCatId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$element</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000088;">$tree</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'branches'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$parentId</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$element</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Поясню. Если в массиве встречается элемент, у которого $parentId == 0, значит это родительская категория и мы кладем ее среди корневых элементов в $tree['root'][-ид-категории-]. Если же $parentId не 0, значит это подкатегория, и мы кладем ее в одну из веток $tree['branches']['-ид-родителя'][]. Поэтому теперь в темплейте, я могу писать 2 вложенных foreach. Во внешнем я перебираю $tree['root'], а во внутреннем $tree['branches'][-ид-текущего-родителя-]. Код приводить не буду - там много лишних деталей, суть же, надеюсь, я передал достаточно понятно.<br />
Отступ для подкатегорий, кстати, делается так:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #cc00cc;">#sf_admin_container</span> <span style="color: #6666ff;">.sf_admin_subcat_row_0</span> td<span style="color: #3333ff;">:first-child </span><span style="color: #00AA00;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">padding-left</span><span style="color: #00AA00;">:</span> <span style="color: #933;">20px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #cc00cc;">#sf_admin_container</span> <span style="color: #6666ff;">.sf_admin_subcat_row_1</span> td<span style="color: #3333ff;">:first-child </span><span style="color: #00AA00;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">padding-left</span><span style="color: #00AA00;">:</span> <span style="color: #933;">20px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #cc00cc;">#sf_admin_container</span> <span style="color: #6666ff;">.sf_admin_subcat_row_0</span> td <span style="color: #00AA00;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">background-color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#eef</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>То есть применяем padding-left: 20px только для :first-child.</p>
<p>Следующим трудным моментом стало редактирование/сохранение/создание категорий. Дело все в том, что в данном модуле используется одна форма для редактирования существующих категорий или создания новой и используется функция get..OrCreate (.. - название модели). Так делается в админ генераторе по умолчанию. Идея эта хороша, однако тут мне надо было обрабатывать создание новой категории особенным способом. Если в запросе создания передается cat_id, значит мы создаем подкатегорию, а эта cat_id будет родительской, а если не передаем, значит создается родительская категория. Все было хорошо до тех пор, пока мне не пришлось передавать тот самый параметр cat_id. Проблема была в том, что он терялся среди редиректов и сабмитов. Поэтому при запросе на создание я делал setFlash('force_create', $cat_id). Причем тут 'force_create'? При том, что если я хочу создать категорию и передаю id - симфони ловит его и пытается послать меня не подкатегорию создавать, а родительскую редактировать. Потому что так работает get..OrCreate. Мне пришлось ее редактировать, чтобы при hasFlash('force_create') она создавала новую категорию. Ну и потом при сохранении я достаю этот Flash и вставляю как родительский id. Звучит, наверное, просто, но нервов пришлось потратить много, пока разобрался почему терялся id, как его не терять и как избежать конфликтов. Трудно все-таки, когда одна функция создает категории, подкатегории и редактирует существующие.</p>
<p>На этом приключения еще не закончились. Нужно было сделать управление порядком категорий и подкатегорий. Тут я позаимствовал код, который использовался для создания порядка в статических страницах и модифицировал с учетом того, что порядковый номер может быть одинаковый. Ведь у нас может быть первая подкатегория во многих категориях. В итоге я пришек к такому запросу, который апдейтил сразу оба значения</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;UPDATE categories SET order_num = CASE
       WHEN cat_id = '&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$cat_id</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;' THEN '&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$demoting_num</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;'
       WHEN parent_id='<span style="color: #006699; font-weight: bold;">{$promoting_parent}</span>'
          AND order_num='<span style="color: #006699; font-weight: bold;">{$demoting_num}</span>' THEN '&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$promoting_num</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;'
       END
       WHERE cat_id IN (&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$cat_id</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;)
          OR (parent_id=<span style="color: #006699; font-weight: bold;">{$promoting_parent}</span> AND order_num=<span style="color: #006699; font-weight: bold;">{$demoting_num}</span>)&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Вот так весело прошел день моей работы. В результате я получил вот такую симпатичную формочку</p>
<p><img src="http://www.charnad.com/blog/wp-content/uploads/pictures/categories_result.png" alt="" /></p>
<p>Если вам понравился этот рассказ - пожалуйста, обязательно напишите комментарий. Дайте мне знать, что вам хочется чтобы я писал что-то подобное еще. Ну или не пишите, если не хотите, чтобы я продолжал.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/symfony-kategorii-i-podkategorii/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/symfony-kategorii-i-podkategorii/</feedburner:origLink></item>
		<item>
		<title>Symfony: динамический роутинг</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/8VBNvvkcHec/</link>
		<comments>http://www.charnad.com/blog/symfony-dinamicheskij-routing/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 12:31:07 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=388</guid>
		<description><![CDATA[
Продолжаю посты про symfony. Сегодня сделаем динамический роутинг. То есть будем добавлять правила роутинга из php, минуя routing.yml. Это нужно, например, если вы хотите делать страницы вида http://site.com/page1, где page1 может быть создана, может быть удалена и прочее. Дело в том, что указать какой-то общий шаблон нельзя, потому что иначе он будет конфликтовать с дефолтным [...]]]></description>
			<content:encoded><![CDATA[<p><img style="margin-right: 10px;" src="http://www.charnad.com/blog/wp-content/uploads/pictures/symfony_logo.gif" alt="" align="left" /><br />
Продолжаю посты про symfony. Сегодня сделаем динамический роутинг. То есть будем добавлять правила роутинга из php, минуя routing.yml. Это нужно, например, если вы хотите делать страницы вида http://site.com/page1, где page1 может быть создана, может быть удалена и прочее. Дело в том, что указать какой-то общий шаблон нельзя, потому что иначе он будет конфликтовать с дефолтным /:module. Что делать? А вот что. <span id="more-388"></span><br />
Идею я подсмотрел на одном из забугорных блогов, за что большое <a href="http://www.dfwtek.com/blog/129-dynamic-routes-in-symfony12.html">автору</a> спасибо. </p>
<p>Собственно для тех, кто не хочет ждать, а хочет кода - кладем это дело в frontendConfiguration.php:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> frontendConfiguration <span style="color: #000000; font-weight: bold;">extends</span> sfApplicationConfiguration <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> configure<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>  <span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">dispatcher</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">connect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'routing.load_configuration'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'registerRoutes'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'listenToRoutingLoadConfigurationEvent'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> registerRoutes <span style="color: #009900;">&#123;</span>
  static <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> listenToRoutingLoadConfigurationEvent<span style="color: #009900;">&#40;</span>sfEvent <span style="color: #000088;">$event</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$routing</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$event</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getSubject</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000088;">$criteria</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Criteria<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">clearSelectColumns</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addSelectColumn</span><span style="color: #009900;">&#40;</span>StaticPagesPeer<span style="color: #339933;">::</span><span style="color: #004000;">LINK_NAME</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$pages</span> <span style="color: #339933;">=</span> StaticPagesPeer<span style="color: #339933;">::</span><span style="color: #004000;">doSelectStmt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$criteria</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$pages</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fetch</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$link</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$routing</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">prependRoute</span><span style="color: #009900;">&#40;</span>
      <span style="color: #0000ff;">'static_'</span><span style="color: #339933;">.</span><span style="color: #000088;">$link</span><span style="color: #339933;">,</span>
      <span style="color: #000000; font-weight: bold;">new</span> sfRoute<span style="color: #009900;">&#40;</span>
       <span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$link</span><span style="color: #339933;">,</span>
      <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
          <span style="color: #0000ff;">'module'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'main'</span><span style="color: #339933;">,</span> 
          <span style="color: #0000ff;">'action'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'static'</span><span style="color: #339933;">,</span> 
          <span style="color: #0000ff;">'page'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$link</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">//with slash</span>
     <span style="color: #000088;">$routing</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">prependRoute</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'static_'</span><span style="color: #339933;">.</span><span style="color: #000088;">$link</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'_wish_slash'</span><span style="color: #339933;">,</span>
        <span style="color: #000000; font-weight: bold;">new</span> sfRoute<span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$link</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">,</span>
          <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'module'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'main'</span><span style="color: #339933;">,</span> 
          <span style="color: #0000ff;">'action'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'static'</span><span style="color: #339933;">,</span> 
          <span style="color: #0000ff;">'page'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$link</span><span style="color: #009900;">&#41;</span>
     <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Тут я из базы выбираю поля link_name, и создаю правила на их основе. Каким образом это дело крепится к инициализации роутов - я не знаю. На остальные вопросы отвечу в комментариях.</p>
<hr />
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/symfony-dinamicheskij-routing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/symfony-dinamicheskij-routing/</feedburner:origLink></item>
		<item>
		<title>Symfony: человеческое расположение админки</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/4dZ53cG5psI/</link>
		<comments>http://www.charnad.com/blog/symfony-chelovecheskoe-raspolojenie-adminki/#comments</comments>
		<pubDate>Sun, 22 Feb 2009 23:00:45 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=381</guid>
		<description><![CDATA[
Тем, кто изучает симфони известно, что админку часто делают через "generate:app backend". То есть мы создаем приложение внутри нашего проекта. Это прекрасно, но есть одно НО. Чтобы нам зайти в админку требуется писать http://project/backend.php/some-admin-pages. Можно конечно обьяснять заказчикам, что мол понимаете, это другое приложение внутри проекта, другой фронт-контроллер, так надо. Но лучше сделать иначе. Скажу [...]]]></description>
			<content:encoded><![CDATA[<p><img style="margin-right: 10px;" src="http://www.charnad.com/blog/wp-content/uploads/pictures/symfony_logo.gif" alt="" align="left" /></p>
<p>Тем, кто изучает симфони известно, что админку часто делают через "generate:app backend". То есть мы создаем приложение внутри нашего проекта. Это прекрасно, но есть одно НО. Чтобы нам зайти в админку требуется писать http://project/backend.php/some-admin-pages. Можно конечно обьяснять заказчикам, что мол понимаете, это другое приложение внутри проекта, другой фронт-контроллер, так надо. Но лучше сделать иначе. Скажу сразу, этот метод взят с официального форума симфони. Но найти его проблематично.</p>
<p>Метод таков:</p>
<ol>
<li>Создаем папку "admin" внутри папки "web". Копируем туда .htaccess из той же "web", и заменяем<br />
RewriteRule ^(.*)$ index.php [QSA,L]<br />
на<br />
RewriteRule ^(.*)$ ../backend.php [QSA,L]
</li>
<li>Идем в настройки роутинга для backend (app/backend/config/routing.yml) и добавляем папку /admin/ ко всем роутам. Например:
<p># default rules<br />
homepage:<br />
  url: /admin/<br />
  param: { module: default, action: index }
</li>
<li>Меняем no_script_name на "on" в настройках backend (app/backend/config/settings.yml):<br />
prod:<br />
.settings:<br />
no_script_name: on
</li>
<li>Чистим кеш и заходим в папку: http://project/admin/ без проблем.</li>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/symfony-chelovecheskoe-raspolojenie-adminki/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/symfony-chelovecheskoe-raspolojenie-adminki/</feedburner:origLink></item>
		<item>
		<title>Yet Another CAPTCHA Idea</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/pfpWTUJXIoc/</link>
		<comments>http://www.charnad.com/blog/yet-another-captcha-idea/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 13:13:31 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[captcha]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=379</guid>
		<description><![CDATA[Кратко:
Моя YACI состоит в том, чтобы сделать чекбокс, и положить его в display:none контейнер. После чего onload страницы ставить туда галочку. 
+ Юзеру ВООБЩЕ ничего не надо делать
+ Нет никаких назойливых картинок (все помнят котят рапиды?)
+ JS выполняется только в браузере. Спамилки и прочие ими не являются.
- Не у всех включен JS. (Мой проект широко [...]]]></description>
			<content:encoded><![CDATA[<p>Кратко:<br />
Моя YACI состоит в том, чтобы сделать чекбокс, и положить его в display:none контейнер. После чего onload страницы ставить туда галочку. </p>
<p>+ Юзеру ВООБЩЕ ничего не надо делать<br />
+ Нет никаких назойливых картинок (все помнят котят рапиды?)<br />
+ JS выполняется только в браузере. Спамилки и прочие ими не являются.</p>
<p>- Не у всех включен JS. (Мой проект широко использует JS, поэтому там без него делать нечего)<br />
- Все равно не спасает от custom спамилки. (от них по-моему ничего не спасает)</p>
<p>Идея по-моему здравая, хотя и неуниверсальная.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/yet-another-captcha-idea/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/yet-another-captcha-idea/</feedburner:origLink></item>
		<item>
		<title>Документация Symfony</title>
		<link>http://feedproxy.google.com/~r/charnad/~3/7vNSWW1jTq4/</link>
		<comments>http://www.charnad.com/blog/documentacia-symfony/#comments</comments>
		<pubDate>Wed, 18 Feb 2009 09:35:44 +0000</pubDate>
		<dc:creator>CharnaD</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.charnad.com/?p=367</guid>
		<description><![CDATA[
Сейчас по долгу службы я работаю над движком для одного сайта. И сделать я его решил с использованием фреймворка, о котором слышал много хорошего. Я говорю о Symfony. Заниматься копипастом хвалебных речей с других сайтов я не буду, сам писать подобное так же не буду. Скажу только, что поначалу мне было трудно разобраться. Я даже [...]]]></description>
			<content:encoded><![CDATA[<p><img style="margin-right: 10px;" src="http://www.charnad.com/blog/wp-content/uploads/pictures/symfony_logo.gif" alt="" align="left" />
<p>Сейчас по долгу службы я работаю над движком для одного сайта. И сделать я его решил с использованием фреймворка, о котором слышал много хорошего. Я говорю о Symfony. Заниматься копипастом хвалебных речей с других сайтов я не буду, сам писать подобное так же не буду. Скажу только, что поначалу мне было трудно разобраться. Я даже хотел все бросить и писать на своей простой MVC системке, но в итоге не бросил. Упорно читал мануалы, стал понимать принципы построения приложения с использованием симфони. Собственно тут я хочу лишь выложить ссылки, которые могут помочь тем, кто будет изучать symfony.</p>
<p>Конечно, ссылка номер 1 это ссылка на главный сайт: <a href="http://www.symfony-project.org/">http://www.symfony-project.org/<br />
</a>Там большое количество документации, которые стоит осилить. Я пожалел времени, начал рубить сплеча, однако сейчас все равно пришел к тому, что надо читать мануалы и я их читаю. И всем придется, кто хочет понять всю мощь этого фреймворка.</p>
<p>
Ссылка номер 2 - это ссылка на главный гайд "симфонистов" <a href="http://www.symfony-project.org/book/1_2/">The Book</a> (<a href="http://www.symfony-project.org/get/pdf/book-1.2-en.pdf">PDF</a>). Книга на английском. Методично рассказывается о всех сторонах фреймворка.</p>
<p>
Ссылка номер 3 - это практическое руководство, так называемые <a href="http://www.symfony-project.org/askeet/1_0/en/">Askeet</a> (<a href="http://www.symfony-project.org/get/pdf/askeet-1.0-en.pdf">PDF</a>) и <a href="http://www.symfony-project.org/jobeet/1_2/Propel/en/">Jobeet</a> (<a href="http://www.symfony-project.org/get/pdf/jobeet-1.2-propel-en.pdf">PDF</a>). Они обе используют <a href="http://propel.phpdb.org/trac/">Propel</a> в качестве ORM вендора (на есть вариант и для Doctrine). Имейте ввиду, что Askeet был написан для Symfony 1.0, а Jobeet для 1.2. В сети есть <a href="http://symfony.artsofte.ru/theme/list/title/Переводы">переводы</a> некоторых глав на русский.
</p>
<p>Это то, что стоит читать в первую очередь. Возможно я найду время перевести некоторые главы на русский, но не обещаю. Удачи вам в изучении.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.charnad.com/blog/documentacia-symfony/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.charnad.com/blog/documentacia-symfony/</feedburner:origLink></item>
	</channel>
</rss>
