<?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>Персональный блог Валерия Леонтьева &#187; сайты</title>
	<atom:link href="http://valera.ws/tag/sajty/feed/" rel="self" type="application/rss+xml" />
	<link>http://valera.ws</link>
	<description>Маленький блог для публикации интересных личных заметок</description>
	<lastBuildDate>Tue, 20 Apr 2010 19:23:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Собеседование по PHP</title>
		<link>http://valera.ws/2009.04.26~php-interview/</link>
		<comments>http://valera.ws/2009.04.26~php-interview/#comments</comments>
		<pubDate>Sun, 26 Apr 2009 17:10:42 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[Все рубрики]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[сайты]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=311</guid>
		<description><![CDATA[Компания, в которой я работаю, собирается искать хорошего PHP-программера. В связи с этим мне стала задача разработать план проведения собеседования. Решил подготовиться к этому и составить план-список вопросов, по которым будет проходить беседа.

Первым длом полез в гугл. Зачем делать работу, которую уже наверняка кто-то сделал? Так и оказалось, сразу нашел довольно неплохой план собеседования (ссылки [...]]]></description>
			<content:encoded><![CDATA[<p>Компания, в которой я работаю, собирается искать хорошего PHP-программера. В связи с этим мне стала задача разработать план проведения собеседования. Решил подготовиться к этому и составить план-список вопросов, по которым будет проходить беседа.</p>
<p><span id="more-311"></span></p>
<p>Первым длом полез в гугл. Зачем делать работу, которую уже наверняка кто-то сделал? Так и оказалось, сразу нашел довольно неплохой план собеседования (ссылки внизу). Взял из него большуючасть вопросов и добавил свои.</p>
<p>Естественно, что вопросов программисту PHP можно задать море. Особенно учитвая, что знать надо связанные области (БД, сети, HTML и иже с ним, Linux). Смысла задать все вопросы, какие только можно, конечно нету. Задача — определить уровень специалиста, чтобы принять решение: подходит он нам или нет. По-этому выбрал наиболее подходящие на мой взгляд вопросы, по которым я смогу оценить уровень кандидата.</p>
<p>Кроме того, конечно не одиними вопросами можно обойтись. Следует предложить пройти небольшие тесты по практическим моментам. Об этом ниже.</p>
<h1>Вопросы</h1>
<p><strong>1. PHP и основы программирования</strong><br />
1.1. Почему PHP?<br />
1.2. Что такое ООП, основные принципы ООП.<br />
1.3. Понятие абстракции, наследования, инкапсуляции и полиморфизма.<br />
1.4. Что такое MVC?<br />
1.5. Какие паттерны проектирования вам известны?<br />
1.6. Под какую версию PHP писали? В чем различия между четвертой и пятой версиями?<br />
1.7. Какими сторонними библиотеками пользовались?<br />
1.8. Опыт работы с различными Frameworks/CMS?<br />
1.9. Типы данных в PHP? (string, int, float, object, resource, null, bool, array)<br />
1.10. Назовите по памяти функции для работы с массивами, строками и объектами в PHP (хотя бы по 5 штук).<br />
1.11. Что такое сериализация?<br />
1.12. Чем отличается абстрактный класс от интерфейса?<br />
1.13. В каких случаях лучше использовать статические методы и классы?<br />
1.14. Можно ли создать приватный конструктор? Зачем?<br />
1.15. Как сказывается большое количество объектов в коде на производительность?<br />
1.16. Что такое хэш?<br />
1.17. Что такое область видимости переменной?<br />
1.18. Что такое PDO? Что такое ORM?<br />
1.19. Что такое PEAR?<br />
1.20. Когда лучше использовать <em>mysql_pconnect</em>?<br />
1.21. Обязательно ли писать ?&gt; в конце скрипта?<br />
1.22. Как вы отлаживаете PHP-код?<br />
1.23. Проводили когда-нибудь оптимизацию сайтов?<br />
1.24. Какую IDE используете? Какие использовали ранее?<br />
1.25. Что такое unit-test? Использовали?<br />
<strong>2. Tools</strong><br />
2.1. Что такое Apache? mod_rewrite? nginx?<br />
2.2. Аббревиатуры SVN и CVS о чем-нить говорят? А Git и Mercurial?<br />
2.3. Багтрекинг системы? BugZilla? Mantis? Redmine? JIRA?<br />
2.4 .Моделирование, UML использовали?<br />
2.5. Что такое SSH? Какие есть варианты авторизации при входе по SSH?<br />
<strong>3. D</strong><strong>ata Bases</strong><br />
3.1. Что такое реляционная база данных? Какие есть типы БД?<br />
3.2. Нормализация, денормализация.<br />
3.3. SQL. Join&#8217;ы, Union. Подзапросы.<br />
3.4. Процедуры, тригеры.<br />
3.5. Вьюшки.<br />
3.6. InnoDB vs MyISAM.<br />
3.7. Какие бывают индексы в MySQL?<br />
3.8. В чем отличие MySQL от PostgreSQL?<br />
3.9. Что такое SQL-инъекция? Приведите пример.<br />
<strong>4. HTML + CSS</strong><br />
4.1. Нарисуйте простенькую форму для отправки файла.<br />
4.2. Что такое CSS? В чем разница между записью <em>#my</em> и <em>.my</em>? Для каких атрибутов можно указать :hover?<br />
4.3. Расшифруй вот такую запись в CSS <em>table#a tbody td.odd {text-decoration:inherit}</em>?<br />
4.4. Что такое стандарты W3C?<br />
<strong>5. JavaScript</strong><br />
5.1. Как работает наследование в JS?<br />
5.2. Чем отличается хэш от объекта? (провокационный)<br />
5.3. А хэш от массива?<br />
5.4. Если ли опыт работы с Jquery, ExtJS? Какие фреймворки использовались?<br />
5.5. Что такое Ajax? Есть ли опыт работы с ним?<br />
5.6. Использовали ли FireBug? Drag-on-fly?<br />
5.7. Что такое замыкания и как они работают?<br />
<strong>6. Linux</strong><br />
6.1. С *nix знаком? Какие дистрибутивы? Почему?<br />
6.2. Apache, PHP и СУБД устанавливали под *nix? Настраивали? Оптимизировали?<br />
<strong>7. Networking</strong><br />
7.1. Что такое уровни модели OSI? Сколько их?<br />
7.2. По какому протоколу осуществляется передача данных в сети Интернет?<br />
7.3. Какие вообще есть сетевые протоколы?<br />
7.4. Расскажите, что происходит, когда в строке браузера набираешь адрес и нажимаешь Enter?<br />
7.5. Что такое WSDL &amp; web-services? Есть опыт работы?<br />
7.6. Что такое SSL? Как работает HTTPS? Какой принцип работы HTTPS? Какие есть варианты авторизации HTTP?<br />
<strong>8. Что такое XSLT, XML? Есть ли опыт работы с ними?</strong></p>
<h2>Как отработает код?</h2>
<p><strong>1)</strong><br />
&lt;?php<br />
/* Что будет выведено на экран? */<br />
$a = &#8216;true&#8217;;<br />
if( 0 == $a || $a )<br />
{<br />
echo &#8216;yes&#8217;;<br />
}</p>
<p><strong>2)</strong><br />
&lt;?php<br />
/* Что будет выведено на экран? */<br />
$a = 10;<br />
echo $a&#8211; &#8211; - &#8211; - &#8211; - &#8211; - &#8211; - &#8211;$a;</p>
<p><strong>3)</strong></p>
<p>&lt;?php<br />
class A {private function __construct(){throw new Exception(&#8221;);} public function A(){return array(&#8217;a',&#8217;b',&#8217;c');} public static function I(){return new A();}}<br />
/*<br />
Как вывести на экран именно то &#8216;b&#8217;, которое определено в массиве выше, используя одну команду (одну строку кода)?<br />
*/</p>
<p><strong>4)</strong><br />
&lt;?php</p>
<p>/*<br />
Какая строчка выведется при исполнении скрипта?<br />
Почему исполняется или не исполняется каждое из условий?<br />
*/<br />
$x = 1;<br />
if ($x == &#8216;1&#8242;) {<br />
echo &#8216;a&#8217;;<br />
}<br />
if ($x == true) {<br />
echo &#8216;b&#8217;;<br />
}<br />
if((bool)$x === true){<br />
echo &#8216;e&#8217;;<br />
}<br />
if ($x === true) {<br />
echo &#8216;c&#8217;;<br />
}<br />
if((int)$x === true){<br />
echo &#8216;d&#8217;;<br />
}</p>
<p><strong>5)</strong><br />
&lt;?php<br />
/*<br />
Что выведет скрипт? (запускается непосредственно)<br />
*/<br />
error_reporting(E_ALL);<br />
ini_set(&#8217;display_errors&#8217;,'0&#8242;);</p>
<p>print $x[0];<br />
dddxxxx();</p>
<p><strong>6)</strong><br />
&lt;?php<br />
/*<br />
Для какой версии PHP будет работать этот скрипт?<br />
Что выведет этот скрипт?<br />
*/<br />
class Test{</p>
<p>private $var;</p>
<p>function setMe($value){<br />
$this-&gt;var = $value;<br />
}<br />
}</p>
<p>class More extends Test{<br />
public $var;<br />
}</p>
<p>$oTest = new Test;<br />
$oMore = new More;</p>
<p>echo $oTest-&gt;setMe(&#8217;foo&#8217;);</p>
<p>echo $oMore-&gt;setMe(&#8217;foo&#8217;);</p>
<p>echo $oMore-&gt;var;</p>
<p>echo $oTest-&gt;var;</p>
<h2>Тест на corp.mamba.ru</h2>
<p><a href="http://www.corp.mamba.ru/test/promo.phtml" target="_blank">http://www.corp.mamba.ru/test/promo.phtml</a></p>
<h2>Ссылки</h2>
<p>А вот и те ссылки, которые помогли мне в составлении списка.</p>
<p><a href="http://habrahabr.ru/blogs/php/21681/" target="_blank">http://habrahabr.ru/blogs/php/21681/</a></p>
<p><a href="http://habrahabr.ru/blogs/webdev/19964/" target="_blank">http://habrahabr.ru/blogs/webdev/19964/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2009.04.26~php-interview/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Локальная офисная версия сайта</title>
		<link>http://valera.ws/2008.12.06~office-website/</link>
		<comments>http://valera.ws/2008.12.06~office-website/#comments</comments>
		<pubDate>Sat, 06 Dec 2008 14:05:24 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Все рубрики]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[сайты]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=213</guid>
		<description><![CDATA[Часто в компаниях есть штатные редакторы, которые работают с некими сайтами этой, принадлежащими ей — наполняют их контентом, модерируют и т.д. Обычно редакторы вместе с обычными пользователями пользуются одной версией сайта, которая располагается на хостинге в сети. Но это не оптимально, так как лишний трафик (прежде всего HTML-код страниц, рисунки, css) гуляет с сервера на [...]]]></description>
			<content:encoded><![CDATA[<p>Часто в компаниях есть штатные редакторы, которые работают с некими сайтами этой, принадлежащими ей — наполняют их контентом, модерируют и т.д. Обычно редакторы вместе с обычными пользователями пользуются одной версией сайта, которая располагается на хостинге в сети. Но это не оптимально, так как лишний трафик (прежде всего HTML-код страниц, рисунки, css) гуляет с сервера на офис, занимая внешний канал компании и тратя трафик веб-сервера. При мдленном внешнем канале тратится так же и время редакторов.</p>
<p><span id="more-213"></span>В идеале, в данном случае передавать необходимо только добавляемые и получаемые данные, так как весь антураж может быть сохранен и доступен в пределах офиса локально.</p>
<p>Для решения этой задачи можно использовать общую базу данных, которая будет  располагаться на хостинге. На сервере в локальной сети поднять сайт, указать для  подключения к СУБД параметры доступа к база на удаленном сервере. Таким образом, у вас будут 2 одинаковых сайта, параллельно работающих с одним источником данных.</p>
<p>В принципе это обычная схема для балансировки нагрузки на фронтэнд (web-сервер). Практику много фронтэндов — один бэкэнд (база) применяют довольно часто, а следующий этап разделения нагрузки (когда уже СУБД не выдерживает напора) — кластеризация серверов баз данных. Но это лирическое отступление.</p>
<p>Следуюет учесть три нюанса. Во-первых, так как сервера у нас теперь два, время на них может быть разное. Следовательно при записи в базу временные показатели будут для серверов расходиться и может возникнуть путаница. Чтобы этого избежать, проще всего брать время из СУБД. Делать это надо естественно 1 раз за запрос (кэшировать), а не при каждой необходимости (при условии, что запрос выполняется не более 1 секунды; если больше, значит ваша система нуждается в оптимизации). Таким образом время на всех серверах будет синхронизировано по времени на сервере с СУБД.</p>
<p>Второй нюанс заключается в том, что по сети информация между сервером на офисе и базой у провайдера будет ходить в открытом виде, что потенциально опасно. Так же опасно создавать пользователя, которому будет разрешено удаленно подключаться к сети с любого хоста, так как получив ваш пароль злоумышленник легко завладеет базой и сайтом (если IP статичский, второй аспект не актуален).</p>
<p>Решить эту проблему можно через подключение к СУБД по защищенному SSL-протоколу. Популярные СУБД поддерживают SSL (MySQL, PgSQL). Подключение клиента к серверу через SSL поддерживают родные C API этих СУБД, и PHP MySQL/PgSQL API тоже. Но SSL не поддерживается PDO (во всяком случае я не нашел информацию о поддержке), который в настоящее время очень популярен и который следует использовать. По этому вариант подключения к базе через SSL отпадает.</p>
<p>Остается другой, довольно простой для использования и сложный для настройки вариант — перегон трафика между офисом и хостингом через VPN. Сам <a href="http://valera.ws/2008.11.21~traffic-security/">VPN я уже описывал</a> в своем блоге. После поднятия VPN-тоннеля необходимо прописать роут на IP вашего сервера (того сервера, где находится СУБД) через виртуальный интерфейс VPN-соединения. Таким образом весь трафик между PHP и СУБД будет ходить по безопасному зашифрованному каналу.</p>
<p>Третий нюанс заключается в кэшировании. Часто кэш некоторых элементов заводят пожизненно (или на долгое время), а сбрасывается он только при изменении данных редактором. В этом случае, при внесении изменений на одном из серверов, кэш не сбросится на втором и на неопределенный срок там останется неактуальная информация. Эта проблема решается через изменение стратегии кэширования, либо использование общего сервера кэширования и выходит за рамки данной статьи. Если именно этот вопрос для вас остается актуальным, ищите информацию в гугле, т.к. та же самая проблема существует при  балансировке нагрузки путем &#8220;размножения&#8221; фронэндов.</p>
<p>Когда все проблемы решены, все что остается делать — это следить за тем, чтобы версии скриптов на серверах в сети и на офисе были одинаковыми, чтобы не повредить базу.</p>
<p>Теперь редакторы сайта смогут пользоваться более быстрой локальной версией сайта, но все изменения будут отображаться в том числе и на сайте в сети.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2008.12.06~office-website/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Реестр настроект для сайта</title>
		<link>http://valera.ws/2008.07.13~site-registry/</link>
		<comments>http://valera.ws/2008.07.13~site-registry/#comments</comments>
		<pubDate>Sun, 13 Jul 2008 18:14:59 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[алгоритмы]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[сайты]]></category>

		<guid isPermaLink="false">http://valera.ws/2008.07.13~site-registry/</guid>
		<description><![CDATA[Одной из лучших &#8220;фишек&#8221; Windows считается ее реестр. Есть, конечно, и те, кто реестр считает самым большим злом в мире. У каждой стороны есть свои аргументы. Главный козырь противников реестра — непереносимость софта и невозможность сделать рабочую настроенную версию данной программы. Главный козырь защитников — все настройки хранятся в одном месте, в которое имеют доступ [...]]]></description>
			<content:encoded><![CDATA[<p>Одной из лучших &#8220;фишек&#8221; Windows считается ее реестр. Есть, конечно, и те, кто реестр считает самым большим злом в мире. У каждой стороны есть свои аргументы. Главный козырь противников реестра — непереносимость софта и невозможность сделать рабочую настроенную версию данной программы. Главный козырь защитников — все настройки хранятся в одном месте, в которое имеют доступ все программы и пользователь. Это облегчает создание снапшотов системы и возможность написания огромного количества разного рода твикеров. Теоретическая упорядоченность реестра за счет дерева каталогов тоже плюс. А так же удобным является автоподстановка ветки текущего пользователя, залогиненного в систему.</p>
<p>Теперь рассмотрим преимущества реестра в применении к веб-сайту.</p>
<p><span id="more-60"></span></p>
<p>Во-первых, сайт — это по сути обычная многопользовательская система с удаленным доступом. Большинство сайтов имеют собственную пользовательскую подсистему (логин), а случаи доступа незалогиненных пользователей можно рассматривать как гостевой доступ (учетка guest).</p>
<p>Во-вторых, сайту, как и обычному приложению для ОС, требуется где-то хранить ряд своих настроек. Одни из них в процессе жизни сайта не меняются (такие настройки часто устанавливают прямо в коде в виде констант), другие можно менять (в CMS обычно есть страничка &#8220;настройки&#8221;; примерами таких настроек может служить информационное сообщение на всех страницах сайта или количество записей на одной странице в списках). Третье настройки зависят от текущего пользователя (обычно это какие-либо привилегии, часть которых часто реализуется в системе прав доступа, и персональные установки пользователя).</p>
<p>Настройки всегда касаются либо всего приложения в целом (например, путь к www_root), либо отдельных его компонентов (например, количество новостей в блоке на главной странице).</p>
<p>Когда разложена по полочкам классификация настроек, можно прикинуть предположительную структуру реестра настроек сайта:</p>
<ul>
<li>ветвь глобальных настроек приложения, которые касаются всех пользователей;</li>
<li>ветвь локальных настроек модулей, которые касаются всех пользователей;</li>
<li>ветвь настроек текущего пользователя (подставляется в зависимости от залогиненного пользователя);</li>
<li>ветвь настроек пользователя по умолчанию (all users).</li>
</ul>
<p>Каждая из ветвей имеет свою вложенную подсистему каталогов по аналогии с реестром Windows. Каждый компонент сайта должен хранить свои настройки в каталоге, название которого совпадает с названием компонента. Таким образом мы получим хорошо упорядоченную структуру настроек сайта.</p>
<p>В ветви глобальных настроек должны храниться только настройки ядра (часто эти настройки сохраняют в коде в виде констант, что не очень хорошо). Эти настройки нужны всегда в независимости от наполненности сайта теми или иными компонентами. Содержимое этой ветви можно распространять с ядром фрейморка, построенного с учетом описанных в этой статье принципов.</p>
<p>В ветви локальных настроек должны храниться такие настройки, которые нужны исключительно отдельным компонентам сайта, а при отсутствии этих компонентов они не имеют смысла.</p>
<p>Ветвь настроек пользователя по умолчанию — это настройки анонима. Т.е. на практике эти настройки касаются всех пользователей сайта. Ветвь настроек текущего пользователя — это настройки, которые касаются только того пользователя, который сейчас залогинен в систему. Ядро должно автоматически подставлять в эту ветвь соответствующие значения при запросах. В этих ветках могут быть и глобальные настройки системы, и локальные настройки компонентов, которые различаются для разных залогиненных пользователей. Информация должна быть так же разложена по подкаталогам.</p>
<p>Такая система позволит упорядочить огромный массив настроек сайта, ядра, компонентов, в удобном виде хранить пользовательские настройки, а так же применить систему каталогов (и подкаталогов) для хранения настроек и удобного доступа к ним. Остается решить самую сложную задачу — эффективно реализовать такой относительно сложный алгоритм системы. Так как настройки нужны в коде постоянно и к менеджеру подсистемы настроек будет довольно много обращений за один запрос пользователя, самым важным качеством такой подсистемы является высокая производительность.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2008.07.13~site-registry/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Верстка MTS.RU</title>
		<link>http://valera.ws/2008.03.27~mts-verstka/</link>
		<comments>http://valera.ws/2008.03.27~mts-verstka/#comments</comments>
		<pubDate>Wed, 26 Mar 2008 22:39:56 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Все рубрики]]></category>
		<category><![CDATA[верстка]]></category>
		<category><![CDATA[МТС]]></category>
		<category><![CDATA[Опечатка]]></category>
		<category><![CDATA[сайты]]></category>

		<guid isPermaLink="false">http://valera.ws/2008.03.27~mts-vertska/</guid>
		<description><![CDATA[Полгода назад заметил на российском сайте МТС баг верстки. Проявляется при наличии вертикального скрола на странице. 
Сделал скрин:

Сегодня вспомнил про старый скрин и решил посмотреть, исправлен  ли баг за это время? :)

Оказалось, не исправлен.
Проверил на FF (самый тормозной браузер что дома, что на работе). Ровно то же самое. Скрин не делал — выглядит точно так [...]]]></description>
			<content:encoded><![CDATA[<p><img style="width: 100px; height: 48px" height="48" width="100" align="left" src="/images/mts_mini.png" />Полгода назад заметил на российском <a href="http://www.mts.ru/" target="_blank">сайте МТС</a> баг верстки. Проявляется при наличии вертикального скрола на странице. <span id="more-25"></span></p>
<p>Сделал скрин:</p>
<p><img src="/images/mts1.jpg" width="720" height="468" style="width: 720px; height: 468px" /></p>
<p>Сегодня вспомнил про старый скрин и решил посмотреть, исправлен  ли баг за это время? :)</p>
<p><img src="/images/mts2.jpg" /></p>
<p>Оказалось, не исправлен.</p>
<p>Проверил на FF (самый тормозной браузер что дома, что на работе). Ровно то же самое. Скрин не делал — выглядит точно так же, как в опере. В IE не проверил по техническим причинам. Но думаю, эффект будет тот же.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2008.03.27~mts-verstka/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
