<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>&#60;CODE&#62;unit</title>
	<atom:link href="http://codeunit.ru/feed" rel="self" type="application/rss+xml" />
	<link>http://codeunit.ru</link>
	<description>Блог веб-разработчика</description>
	<lastBuildDate>Sat, 28 Jan 2012 10:30:07 +0000</lastBuildDate>
	<language>ru</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Работа с MySQL в Python</title>
		<link>http://codeunit.ru/working-with-mysql-in-python</link>
		<comments>http://codeunit.ru/working-with-mysql-in-python#comments</comments>
		<pubDate>Sat, 28 Jan 2012 10:30:07 +0000</pubDate>
		<dc:creator>IvanTheCrazy</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[mysqldb]]></category>
		<category><![CDATA[mysqldb python 3.2]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[python mysql windows]]></category>

		<guid isPermaLink="false">http://codeunit.ru/?p=1139</guid>
		<description><![CDATA[Потребовалось написать небольшую утилиту на Python, работающую с базой данных MySQL. Поскольку на работе вынужден пользоваться ОС Windows, возникли трудности при установке библиотек для работы с MySQL. Сейчас мы рассмотрим процесс установки расширения MySQLdb на Python 3.2, работающий под Windows, а после рассмотрим использование этой библиотеки. Стоит отметить, что с Python работать в принципе приятно, [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-1143" title="MySQL" src="http://codeunit.ru/wp-content/uploads/2012/01/MySQL.png" alt="" width="149" height="77" /><br />
<img class="alignleft size-full wp-image-1144" style="clear: left;" title="python" src="http://codeunit.ru/wp-content/uploads/2012/01/python.png" alt="" width="149" height="44" /><br />
Потребовалось написать небольшую утилиту на <strong>Python</strong>, работающую с базой данных <strong>MySQL</strong>. Поскольку на работе вынужден пользоваться ОС Windows, возникли трудности при установке библиотек для работы с <strong>MySQL</strong>. Сейчас мы рассмотрим процесс установки расширения <strong>MySQLdb</strong> на <strong>Python 3.2</strong>, работающий под <strong>Windows</strong>, а после рассмотрим использование этой библиотеки.<br />
Стоит отметить, что с Python работать в принципе приятно, а при такой простоте и количестве библиотек &#8211; вдвойне приятно.<br />
<span id="more-1139"></span><br />
Официального порта <strong>MySQLdb для Python 3.2</strong> найти не удалось (а pymysql не захотел собираться под win), однако удалось найти <a href="http://codeunit.ru/goto/http://www.lfd.uci.edu/~gohlke/pythonlibs/" >сайт</a> с большим количеством уже готовых бинариков. Оттуда и был скачен необходимый инсталлятор, который все сделал сам.<br />
Теперь рассмотрим работу с базой данных MySQL в Python при помощи библиотеки <strong>MySQLdb</strong>.<br />
Сначала нужно подключить саму библиотеку и установить соединение с БД (параметры соединения с БД приведены для примера, у вас могут быть другие):</p><pre><code>import MySQLdb
conn = MySQLdb.connect(host='127.0.0.1', port=3306, user='root', passwd='', db='test', charset='utf8')</code></pre><p>Теперь можно выполнять запросы к БД:<br />
Вот так мы получим список пользователей в базе данных, возраст которых более 20 лет:</p><pre><code>min_age = 20
sql = &quot;&quot;&quot;SELECT name, surname FROM users WHERE age &amp;gt; '%s'&quot;&quot;&quot; % (id)
cur = conn.cursor()
cur.execute(sql)
result = cur.fetchall()
cur.close()
for r in result:
    print(r)</code></pre><p>После окончания работы с БД соединение нужно закрыть:</p><pre><code>conn.close()</code></pre><p>Подробнее с функциями библиотеки <strong>MySQLdb</strong> вы сможете ознакомиться на <a href="http://codeunit.ru/goto/http://mysql-python.sourceforge.net/MySQLdb.html" >официальном сайте</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://codeunit.ru/working-with-mysql-in-python/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSS3 border-radius, box-shadow, border-image и другое для IE6-IE9</title>
		<link>http://codeunit.ru/css3-inie6-9</link>
		<comments>http://codeunit.ru/css3-inie6-9#comments</comments>
		<pubDate>Wed, 18 Jan 2012 12:20:09 +0000</pubDate>
		<dc:creator>IvanTheCrazy</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[border-image IE]]></category>
		<category><![CDATA[border-radius IE]]></category>
		<category><![CDATA[box-shadow IE]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[градиент IE]]></category>

		<guid isPermaLink="false">http://dev-4-web.ru/?p=1029</guid>
		<description><![CDATA[Такие замечательные вещи CSS3 как border-radius, box-shadow и border-image уже достаточно давно поддерживаются нормальными браузерами, к которым к сожалению не относится Internet Explorer. Зачастую из-за этого веб-разработчикам приходится отказываться от использования этих свойств и городить огород с использованием дополнительной разметки и картинок. Однако теперь появилось средство, позволяющее использовать CSS3 свойства в Internet Explorer. Итак, встречайте [...]]]></description>
			<content:encoded><![CDATA[<p>Такие замечательные вещи <strong>CSS3</strong> как <strong>border-radius</strong>, <strong>box-shadow</strong> и <strong>border-image</strong> уже достаточно давно поддерживаются нормальными браузерами, к которым к сожалению не относится <strong>Internet Explorer</strong>.<br />
Зачастую из-за этого веб-разработчикам приходится отказываться от использования этих свойств и городить огород с использованием дополнительной разметки и картинок. Однако теперь появилось средство, позволяющее использовать <strong>CSS3 свойства</strong> в <strong>Internet Explorer</strong>.</p>
<p>Итак, встречайте &#8211; PIE (Progressive Internet Explorer)! Это небольшой кусочек JavaScript кода, подключаемого к вашей странице с помощью CSS behaviors, который позволит вам использовать многие свойства CSS3 в Internet Explorer.</p>
<p><span id="more-1029"></span>Рассмотрим процесс внедрения PIE пошагово:</p>
<p>1. Сначала нужно скачать саму библиотеку с <noindex><a target="_blank" rel="nofollow" href="http://codeunit.ru/goto/http://css3pie.com" >официального сайта</a></noindex>.</p>
<p>2. Распаковать архив и загрузить библиотеку куда-нибудь на ваш сервер.</p>
<p>3. Создать необходимые CSS правила, например:</p><pre><code>#myAwesomeElement {
    border: 1px solid #999;
    -webkit-border-radius: 10px;
    -moz-border-radius: 10px;
    border-radius: 10px;
}</code></pre>
<p>4. В нужных CSS правилах (как например правило выше) добавить строку подключения Progressive IE:</p><pre><code>behavior: url(путь/к/PIE.htc);</code></pre><p>В итоге у вас получится такой код:</p><pre><code>#myAwesomeElement {
    border: 1px solid #999;
    -webkit-border-radius: 10px;
    -moz-border-radius: 10px;
    border-radius: 10px;
    behavior: url(путь/к/PIE.htc);
}</code></pre><p></p>
<p>5. Все готово!</p>
<p>Внимание! Для корректной работы behaviors файл PIE.htc должен отдаваться вашим сервером с заголовком Content-type: text/x-component. Если ваш веб-сервер не настроен на отдачу таких заголовков, то для PHP можно воспользоваться файлом PIE.php, идущим в комплекте с библиотекой, который автоматически добавляет нужные заголовки.</p>
]]></content:encoded>
			<wfw:commentRss>http://codeunit.ru/css3-inie6-9/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Установка Redmine в Ubuntu</title>
		<link>http://codeunit.ru/howto-install-redmine-in-ubuntu</link>
		<comments>http://codeunit.ru/howto-install-redmine-in-ubuntu#comments</comments>
		<pubDate>Fri, 23 Dec 2011 10:47:18 +0000</pubDate>
		<dc:creator>IvanTheCrazy</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[Администрирование]]></category>
		<category><![CDATA[Passenger]]></category>
		<category><![CDATA[Redmine]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[установка Redmine]]></category>

		<guid isPermaLink="false">http://dev-4-web.ru/?p=780</guid>
		<description><![CDATA[Redmine &#8211; на мой взгляд очень удачная система работы над проектами и отслеживания ошибок (баг-трекер). Попользовавшись целым рядом систем, я пришел к выводу, что для меня это оптимальный выбор. Сегодня мы рассмотрим процесс установки Redmine на сервер под управлением Ubuntu linux, используя Passenger и репозитории. Для начала хорошо бы установить веб-сервер apache с БД mysql, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://codeunit.ru/wp-content/uploads/2011/12/MF-Redmine-logo-021.png" ><img src="http://codeunit.ru/wp-content/uploads/2011/12/MF-Redmine-logo-021.png" alt="" title="Redmine-logo" width="157" height="66" class="alignleft size-full wp-image-784" /></a>Redmine &#8211; на мой взгляд очень удачная система работы над проектами и отслеживания ошибок (баг-трекер). Попользовавшись целым рядом систем, я пришел к выводу, что для меня это оптимальный выбор.<br />
Сегодня мы рассмотрим <strong>процесс установки Redmine</strong> на сервер под управлением <strong>Ubuntu</strong> linux, используя Passenger и репозитории.<br />
<span id="more-780"></span><br />
Для начала хорошо бы установить веб-сервер apache с БД mysql, именно под ними будет работать наш Redmine. Если apache и mysql у вас уже установлены, данный шаг можно пропустить.</p><pre><code>sudo tasksel install lamp-server</code></pre><p>Можно конечно же <strong>установить Redmine</strong> из репозитория, однако версия там не самая свежая, поэтому будем использовать ppa:</p><pre><code>sudo add-apt-repository ppa:ondrej/redmine
sudo apt-get update
sudo apt-get install redmine-mysql redmine</code></pre><p>Во время установки у вас будет запрошен пароль root для mysql, чтобы создать базу данных для <strong>Redmine</strong>, а также еще ряд параметров (например имя БД для Redmine).<br />
Теперь настал черед <strong>установки модуля Passenger для Apache</strong>:</p><pre><code>sudo apt-get install libapache2-mod-passenger</code></pre><p>Для доступа к Redmine извне нужно создать символическу ссылку на каталог public из установки redmine где-то внутри DOCUMENT_ROOT вашего Apache (в примере DOCUMENT_ROOT задан по умолчанию &#8211; /var/www):</p><pre><code>sudo ln -s /usr/share/redmine/public /var/www/redmine</code></pre><p>По умолчанию Passenger запускается с правами пользователя nobody, это нужно исправить, запуская его с правами пользователя www-data, с которыми запускается веб-сервер, для этого в файл <b>/etc/apache2/mods-available/passenger.conf</b> нужно добавить строку:</p><pre><code>PassengerDefaultUser www-data</code></pre><p>Теперь сконфигурировать папку /var/www/redmine в файле конфигурации Apache (для хоста по умолчанию в Ubuntu &#8211; <b>/etc/apache2/sites-available/default</b>):</p><pre><code>&lt;directory /var/www/redmine&gt;
    RailsBaseURI /redmine
    PassengerResolveSymlinksInDocumentRoot on
&lt;/directory&gt;</code></pre><p>Включаем модуль Passenger:</p><pre><code>sudo a2enmod passenger</code></pre><p>И перезапускаем Apache:</p><pre><code>sudo /etc/init.d/apache2 restart</code></pre><p>Все, теперь ваш <strong>Redmine</strong> будет доступен по адресу http://ваш сайт/redmine</p>
<p><b>P.S.</b> Если при заходе на обозначенную страничку вы получаете ошибку 403, то выполните такую команду:</p><pre><code>sudo chmod a+x /usr/share/redmine/public</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://codeunit.ru/howto-install-redmine-in-ubuntu/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Установка MongoDB под Windows</title>
		<link>http://codeunit.ru/install-mongodb-on-windows</link>
		<comments>http://codeunit.ru/install-mongodb-on-windows#comments</comments>
		<pubDate>Sun, 17 Jul 2011 16:25:27 +0000</pubDate>
		<dc:creator>IvanTheCrazy</dc:creator>
				<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[MongoDB Windows]]></category>
		<category><![CDATA[установка MongoDB]]></category>

		<guid isPermaLink="false">http://dev-4-web.ru/?p=652</guid>
		<description><![CDATA[MongoDB &#8211; относительно молодая и довольно перспективная документоориентированная база данных. Я решил заняться ее изучением, а всякое изучение продуктов подобного рода начинается с установки. Установка MongoDB под Windows не сопряжена с какими-либо сложностями, однако в официальном руководстве нет описания на русском языке. Я решил восполнить этот пробел. Итак, все до ужаса просто: Идем на сайт [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://codeunit.ru/wp-content/uploads/2011/07/logo-mongoDB.png" alt="" title="logo-mongoDB" width="217" height="90" class="alignleft size-full wp-image-653" />MongoDB &#8211; относительно молодая и довольно перспективная документоориентированная база данных. Я решил заняться ее изучением, а всякое изучение продуктов подобного рода начинается с установки. Установка MongoDB под Windows не сопряжена с какими-либо сложностями, однако в официальном руководстве нет описания на русском языке. Я решил восполнить этот пробел.<br />
<span id="more-652"></span><br />
Итак, все до ужаса просто:</p>
<ol>
<li>Идем на <a href="http://codeunit.ru/goto/http://www.mongodb.org/downloads" >сайт MongoDB</a>.</li>
<li>Качаем нужную версию</li>
<li>Распаковываем ее в какой-нибудь каталог</li>
<li>Создаем папки для хранения данных MongoDB:<br />
<pre><code>mkdir &lt;путь к папке данных&gt;\data
mkdir &lt;путь к папке данных&gt;\data\db</code></pre>
</li>
<li>Запускаем сервер MongoDB:<br />
<pre><code>mongod --dbpath &lt;путь к папке данных&gt;</code></pre>
</li>
<li>Если все ок, вырубаем процесс (ctrl-c), после чего <strong>устанавливаем MongoDB</strong> как сервис и запускаем его:<br />
<pre><code>mongod --install
net start MongoDB</code></pre>
</li>
<li>Теперь можно спокойно подключаться к работающему серверу MongoDB</li>
</ol>
<p>Удачной работы!</p>
]]></content:encoded>
			<wfw:commentRss>http://codeunit.ru/install-mongodb-on-windows/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ExtJS 4: работа со строками, датой и временем</title>
		<link>http://codeunit.ru/extjs-4-working-with-strings-date-and-time</link>
		<comments>http://codeunit.ru/extjs-4-working-with-strings-date-and-time#comments</comments>
		<pubDate>Wed, 13 Jul 2011 19:09:48 +0000</pubDate>
		<dc:creator>IvanTheCrazy</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[Ext.date.format]]></category>
		<category><![CDATA[Ext.string.format]]></category>
		<category><![CDATA[Ext.util]]></category>
		<category><![CDATA[ExtJS 4]]></category>
		<category><![CDATA[ExtJS date]]></category>
		<category><![CDATA[ExtJS форматирование строки]]></category>

		<guid isPermaLink="false">http://dev-4-web.ru/?p=648</guid>
		<description><![CDATA[Многим из вас наверняка приходилось работать с датой и временем, а также со строками в JavaScript. И очень часто это было связано с определенным набором проблем &#8211; в JavaScript нет удобных штатных средств для форматирования строк и дат. В этом случае нас спасает ExtJS, включающий богатые возможности по реализации данного функционала. Итак, начнем с простого [...]]]></description>
			<content:encoded><![CDATA[<p>Многим из вас наверняка приходилось работать с датой и временем, а также со строками в JavaScript. И очень часто это было связано с определенным набором проблем &#8211; в JavaScript нет удобных штатных средств для форматирования строк и дат. В этом случае нас спасает <string>ExtJS</string>, включающий богатые возможности по реализации данного функционала.<br />
<span id="more-650"></span><br />
Итак, начнем с простого &#8211; форматирование строк.<br />
Здесь все проще некуда:</p><pre><code>var dt = new Date();
console.log(Ext.Date.format(dt, 'Y-m-d'));                          // Текущая дата в формате ГГГГ-мм-дд
console.log(Ext.Date.format(dt, 'F j, Y, g:i a'));                  // Текущие дата и время в формате Месяц Число, Год, часы, минуты AM/PM</code></pre><p>Полный список возможностей <string>форматирования даты с помощью ExtJS 4</string> вы можете найти в официальной документации проекта, однако стоит заметить, что есть некий набор пресетов для форматирования даты и времени, который вы можете изменять по своему усмотрению:</p><pre><code>Ext.Date.patterns = {
    ISO8601Long:&quot;Y-m-d H:i:s&quot;,
    ISO8601Short:&quot;Y-m-d&quot;,
    ShortDate: &quot;n/j/Y&quot;,
    LongDate: &quot;l, F d, Y&quot;,
    FullDateTime: &quot;l, F d, Y g:i:s A&quot;,
    MonthDay: &quot;F d&quot;,
    ShortTime: &quot;g:i A&quot;,
    LongTime: &quot;g:i:s A&quot;,
    SortableDateTime: &quot;Y-m-d\\TH:i:s&quot;,
    UniversalSortableDateTime: &quot;Y-m-d H:i:sO&quot;,
    YearMonth: &quot;F, Y&quot;
};

//Пример использования
var dt = new Date();
console.log(Ext.Date.format(dt, Ext.Date.patterns.ShortDate));</code></pre><p><p>
Конечно было бы странно, если в таком серьезном проекте как ExtJS, не было бы еще массы функции для работы с датой и временем, но сегодня мы оставим их на самостоятельное изучение и рассмотрим <strong>форматирование строк при помощи ExtJS</strong>:</p>
<pre><code>var cls = 'my-class', text = 'Некий текст';
var s = Ext.String.format('&lt;div class=&quot;{0}&quot;&gt;{1}&lt;/div&gt;', cls, text);
//Строка s теперь равна &lt;div class=&quot;my-class&quot;&gt;Некий текст&lt;/div&gt;</code></pre><p><p>
<p>Это очень удобно &#8211; можно передать методу Ext.String.format в качестве первого параметра строку-шаблон, а в качестве остальных параметров &#8211; нужные значения и получить отформатированную нужным образом строку!</p>
<p>Также стоит отметить функции Ext.String.htmlDecode и Ext.String.htmlEncode, позволяющие производить прямое и обратное преобразование html-спецсимволов в вид, пригодный для отображения на веб-странице.</p>
]]></content:encoded>
			<wfw:commentRss>http://codeunit.ru/extjs-4-working-with-strings-date-and-time/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Использование Google Translate на сайте после закрытия API</title>
		<link>http://codeunit.ru/quering-google-translate-with-php</link>
		<comments>http://codeunit.ru/quering-google-translate-with-php#comments</comments>
		<pubDate>Sat, 09 Jul 2011 12:07:38 +0000</pubDate>
		<dc:creator>IvanTheCrazy</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[Google Translate API]]></category>
		<category><![CDATA[PHP Curl]]></category>

		<guid isPermaLink="false">http://dev-4-web.ru/?p=644</guid>
		<description><![CDATA[Google объявил о закрытии Translate API, что не есть гут &#8211; подобной альтернативы нет. Однако можно с помощью небольших ухищрений использовать Google Translate API на своем сайте. Можно было бы конечно воспользоваться Bing API, но там есть довольно серьезное ограничение на размер текста. Поэтому мы возьмем страничку translate.google.ru (ее вроде как закрывать не собираются) и [...]]]></description>
			<content:encoded><![CDATA[<p>Google объявил о закрытии Translate API, что не есть гут &#8211; подобной альтернативы нет. Однако можно с помощью небольших ухищрений <strong>использовать Google Translate API на своем сайте</strong>.<br />
Можно было бы конечно воспользоваться Bing API, но там есть довольно серьезное ограничение на размер текста.<br />
Поэтому мы возьмем страничку translate.google.ru (ее вроде как закрывать не собираются) и библиотеку CURL, с помощью чего и сделаем свое грязное дело &#8211; переведем текст <strong>на PHP с помощью Google Translate</strong>!<br />
<span id="more-644"></span><br />
Вот код на <strong>PHP для обращения к Google Translate</strong>. Отмечу заранее &#8211; данный код использует библиотеку <noindex><a target="_blank" rel="nofollow" href="http://codeunit.ru/goto/http://simplehtmldom.sourceforge.net/" >Simple HTML DOM</a></noindex> (спасибо за дополнение в комментариях Дмитрию).</p><pre><code>function doTranslation($str, $url, $from, $to) {
    $ch = curl_init($url);
    $postdata = 'js=n&amp;prev=_t&amp;hl=ru&amp;ie=UTF-8&amp;layout=2&amp;eotf=1&amp;text=' .
            rawurlencode($str) . '&amp;sl=' . $from . '&amp;tl=' . $to;
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'MIME-Version: 1.0',
        &quot;Content-type: application/x-www-form-urlencoded&quot;,
        'Content-transfer-encoding: text',
        'Accept-Charset:utf-8,windows-1251;q=0.7,*;q=0.3'
    ));
    $result = curl_exec($ch);
    $html = str_get_html($result);
    $content = $html-&gt;find('span[id=result_box]');
    $content = $content[0]-&gt;plaintext;
    curl_close($ch);
    return $content;
}</code></pre>
<p>При помощи данной функции я переводил без проблем в один прием до 200 текстов по 3-5 тыс. символов.</p>
]]></content:encoded>
			<wfw:commentRss>http://codeunit.ru/quering-google-translate-with-php/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>ExtJS: деревья</title>
		<link>http://codeunit.ru/trees-with-extjs</link>
		<comments>http://codeunit.ru/trees-with-extjs#comments</comments>
		<pubDate>Fri, 08 Jul 2011 17:15:41 +0000</pubDate>
		<dc:creator>IvanTheCrazy</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[AJAX-дерево]]></category>
		<category><![CDATA[ExtJS 4]]></category>
		<category><![CDATA[ExtJS TreeView]]></category>
		<category><![CDATA[ExtJS дерево]]></category>
		<category><![CDATA[Дерево JavaScript]]></category>

		<guid isPermaLink="false">http://dev-4-web.ru/?p=549</guid>
		<description><![CDATA[Ранее, при работе с jQuery UI мне приходилось постоянно подключать сторонние плагины для организации JavaScript дерева. При этом не было никакого единообразия в используемых компонентах. Используя ExtJS, можно удачно совместить единый API для работы со всеми компонентами, которые при этом будут еще и единообразно выглядеть. Кого интересует построение деревьев при помощи ExtJS &#8211; добро пожаловать! [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://codeunit.ru/wp-content/uploads/2011/07/Ext.tree_.Panel1_.png" alt="" title="Ext.tree.Panel1" width="225" height="175" class="alignleft size-full wp-image-639" />Ранее, при работе с jQuery UI мне приходилось постоянно подключать сторонние плагины для организации <strong>JavaScript дерева</strong>. При этом не было никакого единообразия в используемых компонентах. Используя <strong>ExtJS</strong>, можно удачно совместить единый API для работы со всеми компонентами, которые при этом будут еще и единообразно выглядеть.</p>
<p>Кого интересует построение деревьев при помощи ExtJS &#8211; добро пожаловать!</p>
<p><span id="more-549"></span></p>
<p>Для начала возьмем разметку страницы из <a href="http://codeunit.ru/getting-startedextjs-4" >первого урока по ExtJS</a>. Аналогично тому уроку следует подключить файлы ExtJS.</p>
<p>Теперь создадим окно с деревом:</p><pre><code>Ext.onReady(function() {
//Создаем хранилище для ExtJS дерева
var myStore = Ext.create(&quot;Ext.data.TreeStore&quot;, {
root: {
        expanded: true,
        text:&quot;&quot;,
        children: [
            { text:&quot;Первый листик&quot;, leaf: true },
            { text:&quot;Папка&quot;, expanded: true,
                children: [
                    { text:&quot;Листик внутри папки&quot;, leaf: true },
                    { text:&quot;Второй листик внутри папки&quot;, leaf: true}
                ]
            },
            { text: &quot;И еще один листик&quot;, leaf:true }
        ]
    }
});
Ext.create('Ext.tree.Panel', {
    title: 'Мое дерево',
    width: 200,
    height: 150,
    store: myStore,
    rootVisible: false,
    renderTo: Ext.getBody()
});
});</code></pre>
<p>Следует внести некоторые пояснения в код. Все <strong>элементы управления ExtJS</strong>, оперирующие пользовательскими данными, имеют такой атрибут как Store &#8211; хранилище этих самых данных. Для дерева используется TreeStore, для таблицы &#8211; просто Store.<br />
Хранилища данных в ExtJS поддерживают как статичное указание данных непосредственно в JavaScript коде, так и загрузку данных с сервера (поддерживаются как просто URL-адреса, на которые отправляется AJAX-запрос, так и REST-URL).<br />
При этом <strong>ExtJS TreeStore</strong> поддерживает так называемую &#8220;ленивую загрузку&#8221; &#8211; элементы дерева будут автоматически подгружаться с сервера только по мере разворачивания дерева. Для этого серверный скрипт должен придерживаться одного правила &#8211; ExtJS в качестве параметра запроса node передает id родительского листа на дереве. Данные скриптом должны отдаваться в формате JSON.<br />
Т.е. URL загрузки данных с сервера будет иметь вид: http://example.com?node=457. Имя данного параметра можно изменить в настройках хранилища (в нашем примере параметр запроса имеет имя parent).<br />
Дерево будет автоматически раскрываться только в том случае, если у каждого объекта дерева, загружаемого с сервера, имеется поле id. В противном случае потребуется написание еще нескольких строк кода.<br />
Изменим приведенный выше код (ту, часть, что отвечает за создание дерева) до следующего состояния:</p><pre><code>Ext.create('Ext.tree.Panel', {
    title: 'Мое дерево',
    width: 200,
    height: 150,
    store: myStore,
    rootVisible: false,
    renderTo: Ext.getBody(),
    listeners: {
        scope: this,
        beforetreeitemload: function(store, operation) {
		operation.params = {
			node: operation.node.get('имя нужного поля')
		};
	},
    }
});</code></pre><p>Теперь мы можем просматривать загружать дочерние элементы при отсутствии в листьях дерева поля id. В каком случае это может потребоваться? Ну например в том случае, если в дереве могут встречаться два элемента с одинаковыми id &#8211; если такое произойдет, то вы увидите неожиданные глюки при работе дерева.</p>
]]></content:encoded>
			<wfw:commentRss>http://codeunit.ru/trees-with-extjs/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Перекодирование MySQL базы из Latin1 в UTF-8</title>
		<link>http://codeunit.ru/change-mysql-encoding-from-latin1-to-utf8</link>
		<comments>http://codeunit.ru/change-mysql-encoding-from-latin1-to-utf8#comments</comments>
		<pubDate>Thu, 30 Jun 2011 19:07:56 +0000</pubDate>
		<dc:creator>IvanTheCrazy</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[iconv mysql]]></category>
		<category><![CDATA[MySQL UTF-8]]></category>
		<category><![CDATA[MySQL знаки вопроса]]></category>
		<category><![CDATA[MySQL кодировка]]></category>
		<category><![CDATA[MySQL смена кодировки]]></category>

		<guid isPermaLink="false">http://dev-4-web.ru/?p=636</guid>
		<description><![CDATA[По умолчанию кодировкой для MySQL является Latin-1. Это часто приводит к различным проблемам &#8211; например появлению знаков вопроса вместо русских букв. Часто при этом база уже импортирована и переделывать ее &#8211; процесс трудоемкий. Однако можно автоматизировать перекодирование MySQL базы в кодировку UTF8. Сейчас я расскажу вам как. Итак, нам потребуется: MySQL на linux-машине Доступ к [...]]]></description>
			<content:encoded><![CDATA[<p>По умолчанию кодировкой для MySQL является Latin-1. Это часто приводит к различным проблемам &#8211; например появлению знаков вопроса вместо русских букв. Часто при этом база уже импортирована и переделывать ее &#8211; процесс трудоемкий. Однако можно автоматизировать <strong>перекодирование MySQL базы<strong> в кодировку <strong>UTF8</strong>.<br />
Сейчас я расскажу вам как. Итак, нам потребуется:</p>
<ul>
<li>MySQL на linux-машине</li>
<li>Доступ к этому добру</li>
<li>Установленные iconv и perl</li>
</ul>
<p><span id="more-636"></span><br />
Далее подразумевается что вместо example.org вы вставите имя своего хоста (скорее всего localhost), вместо foo свое имя пользователя и вместо dbname &#8211; свое имя базы данных.<br />
1. Нужно сделать дамп существующей БД:</p><pre><code>mysqldump -h example.org --user=foo -p --default-character-set=latin1 -c \
 --insert-ignore --skip-set-charset -r dump.sql dbname</code></pre><p>2. Проверяем кодировку получившегося файла</p><pre><code>file dump.sql</code></pre><p>3. Меняем кодировку на нужную нам UTF-8:</p><pre><code>iconv -f ISO8859-1 -t UTF-8 dump.sql &gt; dump_utf8.sql</code></pre><p>4. Вносим изменения в дамп БД &#8211; нужно <strong>поменять кодировку</strong>, указанную в SQL запросах.</p><pre><code>perl -pi -w -e 's/CHARSET=latin1/CHARSET=utf8/g;' dump_utf8.sql</code></pre><p>5. Пересоздаем базу данных</p><pre><code>mysql --user=foo -p --execute=&quot;DROP DATABASE dbname;
 CREATE DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;&quot;</code></pre><p>6. Импортируем дамп</p><pre><code>mysql --user=foo --max_allowed_packet=16M -p --default-character-set=utf8 dbname &lt; dump_utf8.sql</code></pre><p>7.Profit! База данных теперь у нас в кодировке UTF8!!!</p>
<p>Метод 2 - несколько более простой, но на всякий случай рекомендую сделать резервную копию.<br />
Используйте для каждой из таблиц такой запрос (естественно вместо<br />
<table_name> подставьте имя вашей таблицы):</p><pre><code>ALTER TABLE &lt;table_name&gt; CONVERT TO CHARACTER SET utf8;</code></pre><p>Кодировку по умолчанию можно задать при помощи такого запроса:</p><pre><code>ALTER DATABASE &lt;database_name&gt; CHARACTER SET utf8;</code></pre><p>Стоит отметить, что CONVERT TO производит конвертирование всех столбцов таблицы в заданную кодировку. Однако если значения у вас хранятся не в той кодировке, что указано в MySQL, следует поступить иначе (для каждого столбца с такой проблемой):</p><pre><code>ALTER TABLE t1 CHANGE c1 c1 BLOB;
ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;</code></pre><p></p>
<p>Ну вот и все &#8211; теперь вы знаете, как можно <strong>изменить кодировку mySQL базы данных</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://codeunit.ru/change-mysql-encoding-from-latin1-to-utf8/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ExtJS 4: удобное хранение данных или Ext.util.MixedCollection</title>
		<link>http://codeunit.ru/extjs-4-storing-data-in-collection-with-ext-util-mixedcollection</link>
		<comments>http://codeunit.ru/extjs-4-storing-data-in-collection-with-ext-util-mixedcollection#comments</comments>
		<pubDate>Wed, 22 Jun 2011 15:19:48 +0000</pubDate>
		<dc:creator>IvanTheCrazy</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[Ext.util.MixedCollection]]></category>
		<category><![CDATA[ExtJS 4]]></category>
		<category><![CDATA[ExtJS MixedCollection]]></category>
		<category><![CDATA[ExtJS коллекции]]></category>
		<category><![CDATA[ExtJS на русском]]></category>
		<category><![CDATA[ExtJS уроки]]></category>

		<guid isPermaLink="false">http://dev-4-web.ru/?p=629</guid>
		<description><![CDATA[При работе с JavaScript мне всегда хотелось иметь какой-нибудь способ удобно хранить данные и осуществлять по ним итерацию &#8211; что-нибудь наподобие Dictionary в .NET. Но нативно такой возможности JavaScript не предоставляет, поэтому приходилось изобретать свои велосипеды. При работе с ExtJS ничего изобретать не нужно &#8211; все уже готово, а в данном конкретном случае нас спасет [...]]]></description>
			<content:encoded><![CDATA[<p>При работе с JavaScript мне всегда хотелось иметь какой-нибудь способ удобно хранить данные и осуществлять по ним итерацию &#8211; что-нибудь наподобие Dictionary в .NET. Но нативно такой возможности JavaScript не предоставляет, поэтому приходилось изобретать свои велосипеды. При работе с <strong>ExtJS</strong> ничего изобретать не нужно &#8211; все уже готово, а в данном конкретном случае нас спасет <strong>Ext.util.MixedCollection</strong>.<br />
Итак, встречайте! Ext.util.MixedCollection &#8211; инструмент, который вам позволит создать коллекцию пар типа &#8220;ключ-значение&#8221;.<br />
Теперь рассмотрим подробнее что нам позволит сделать этот удобнейший инструмент.<br />
<span id="more-629"></span><br />
При помощи <strong>Ext.util.MixedCollection</strong> вы сможете:</p>
<ol>
<li>Сортировать элементы коллекции</li>
<li>Получать доступ к элементам как по ключу, так и по индексу</li>
<li>Динамически добавлять и удалять столько элементов, сколько вам потребуется</li>
</ol>
<p>Теперь рассмотрим небольшой пример кода:</p><pre><code>var coll = new Ext.util.MixedCollection();
coll.add('key1', 'val1');
coll.add('key2', 'val2');
coll.add('key3', 'val3');
coll.addAll([
  { id: 'key4', value: 'val4' },
  { id: 'key5', value: 'val5' }
]);

console.log(coll.get('key1')); // выведет 'val1'
console.log(coll.indexOfKey('key3')); // выведет 2</code></pre>
<p>Здесь мы создаем коллекцию coll, в которую помещаем 3 пары &#8220;ключ-значение&#8221; с помощью метода add и еще 2 пары при помощи метода addAll &#8211; ему можно передавать сразу массив элементов. Стоит отметить, что все ключи в коллекции должны быть уникальны, иначе получим ошибку.<br />
Далее мы получаем значение элемента с ключом &#8220;key1&#8243; и номер элемента с ключом &#8220;key3&#8243; &#8211; посмотрите как все просто и удобно! Раньше о таком в JavaScript приходилось только мечтать.</p>
<p>При необходимости можно проверить, содержится ли какой-либо элемент или ключ в нашей коллекции:</p><pre><code>console.log(coll.contains('val1'));
console.log(coll.containsKey('key6'));</code></pre>
<p>А еще <strong>Ext.util.MixedCollection</strong> предоставляет нам удобнейший механизм итерации по элементам коллекции и по ее ключам:</p><pre><code>coll.each(function(item) {
  console.log(item);
}, scope);
coll.each(function(key) {
  console.log(key);
}, scope);</code></pre>
<p>Данные функции принимают два параметра:</p>
<ul>
<li><b>fn(item)</b> &#8211; функция, которая вызывается для каждого элемента (ключа), он передается в нее в качестве параметра</li>
<li><b>scope</b> &#8211; область видимости этой самой функции</li>
</ul>
<p>Удалить элементы из коллекции можно тоже довольно-таки просто:</p><pre><code>coll.remove(obj); //Удаляет из коллекции объект obj
  coll.removeAt(2);  //Удаляет из коллекции объект с индексом 2
  coll.clear();   //Удаляет все элементы из коллекции</code></pre>
<p>Если требуется заменить элемент с определенным ключом в <strong>MixedCollection</strong> &#8211; это тоже всегда пожалуйста:</p><pre><code>coll.replace('key2', 'val666');  //мы заменили значение элемента с ключом key2 на val666</code></pre>
<p>Стоит отметить, строки в качестве ключей и значений в данном примере приведены условно &#8211; на самом деле на их месте могут использоваться объекты любых типов.</p>
<p>P.S. результат вывода console.log вы сможете посмотреть в консоли firebug, инструментах разработчика Google Chrome и Internet Explorer.</p>
]]></content:encoded>
			<wfw:commentRss>http://codeunit.ru/extjs-4-storing-data-in-collection-with-ext-util-mixedcollection/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ExtJS 4: работа с AJAX или Ext.Ajax</title>
		<link>http://codeunit.ru/working-with-ajax-in-extjs-4</link>
		<comments>http://codeunit.ru/working-with-ajax-in-extjs-4#comments</comments>
		<pubDate>Tue, 21 Jun 2011 05:52:30 +0000</pubDate>
		<dc:creator>IvanTheCrazy</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Ext.Ajax]]></category>
		<category><![CDATA[Ext.Ajax.request]]></category>
		<category><![CDATA[ExtJS 4]]></category>
		<category><![CDATA[ExtJS Ajax]]></category>

		<guid isPermaLink="false">http://dev-4-web.ru/?p=622</guid>
		<description><![CDATA[Работа с AJAX &#8211; неотъемлемая часть сегодняшнего веба. При этом естественно, что для этого как правило используются готовые фреймворки и библиотеки. ExtJS 4 &#8211; мощный фреймворк, а не просто библиотека, поэтому было бы странно, если бы в ней отсутствовал механизм прямой работы с AJAX запросами. Ранее рассмотренные нами хранилища (Store) тоже используют AJAX, но делают [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://codeunit.ru/wp-content/uploads/2011/06/ajax-logo.jpg" alt="AJAX logo" title="ajax-logo" width="474" height="236" class="alignleft size-full wp-image-623" />Работа с AJAX &#8211; неотъемлемая часть сегодняшнего веба. При этом естественно, что для этого как правило используются готовые фреймворки и библиотеки. <strong>ExtJS 4</strong> &#8211; мощный фреймворк, а не просто библиотека, поэтому было бы странно, если бы в ней отсутствовал механизм прямой работы с <string>AJAX</strong> запросами. <a href="http://codeunit.ru/extjs-creating-datagrid-with-ext-grid-panel" >Ранее рассмотренные нами хранилища</a> (Store) тоже используют AJAX, но делают это скрыто от программиста, а иногда вам обязательно потребуется явно отослать AJAX-запрос на сервер. Кому это интересно &#8211; добро пожаловать под кат!<br />
<span id="more-622"></span><br />
Сразу приведу небольшой фрагмент кода:</p><pre><code>Ext.Ajax.request({
    url: 'page.php',
    method: 'post',
    params: {
        id: 1,
        param2: 'строка'
    },
    success: function(response){
        var text = response.responseText;
        //тут что-то делаем с ответом сервера
    }
});</code></pre>
<p>Здесь самое главное &#8211; функция Ext.Ajax.request, которая непосредственно отправляет запрос на сервер.<br />
У нее есть ряд параметров:</p>
<ul>
<li><b>url</b> &#8211; адрес, на который будет послан запрос</li>
<li><b>params</b> &#8211; список параметров, передаваемых на сервер</li>
<li><b>method</b> &#8211; тип запроса (GET или POST)</li>
<li><b>success</b> &#8211; функция, которая будет вызвана при успешном завершении запроса. при этом текст ответа сервера будет храниться в переменной response (первый параметр функции success) в поле responseText.</li>
</ul>
<p>Также в <strong>ExtJS</strong> можно <strong>задать таймаут AJAX запроса</strong> при помощи следующего кода (его нужно вызвать до вызова Ext.Ajax.request):</p><pre><code>Ext.Ajax.timeout = 60000; //Таймаут равен 60миллисекундам
Ext.Ajax.request({
//тут параметры запроса
});</code></pre><p>Таймаут запроса задается в миллисекундах.<br />
Вот в принципе и все, что я хотел рассказать о <strong>Ext.Ajax.request</strong>. Остальное вы сможете всегда прочитать в официальной документации ExtJS.<br />
<b>P.S.</b> А если вам нужно отправить AJAX-запрос на другой домен, то в этом вам поможет другая статья в моем блоге &#8211; <a href="http://codeunit.ru/extjs-cross-domain-ajax-requests-with-jsonp" >ExtJS: кросс-доменные AJAX запросы при помощи JSONP</a>.<br />
Удачной работы!</p>
]]></content:encoded>
			<wfw:commentRss>http://codeunit.ru/working-with-ajax-in-extjs-4/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

