<?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://job-interview.ru/articles/post/tag/%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5/feed" rel="self" type="application/rss+xml" />
	<link>http://job-interview.ru/articles</link>
	<description>вакансии, вопросы, статьи</description>
	<lastBuildDate>Thu, 29 Mar 2012 20:53:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Разработка в среде WEB: Java или PHP?</title>
		<link>http://job-interview.ru/articles/post/356</link>
		<comments>http://job-interview.ru/articles/post/356#comments</comments>
		<pubDate>Tue, 28 Feb 2012 18:31:26 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[ООП]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">/articles/?p=356</guid>
		<description><![CDATA[Вместо предисловия.
Я постараюсь максимально объективно сравнить два языка. В конечном итоге, выбор платформы, стиля и языка &#8211; не определяющий фактор успеха. Главное, чтобы руки разработчика не повторяли форму интеграла. Ведь язык лишь инструмент, а инструмент, как известно, продолжение рук. 

Начнем.


WEB развивается уже второй десяток лет. Время статичных HTML-страниц кануло в истории, на смену которому пришел [...]]]></description>
			<content:encoded><![CDATA[<h2>Вместо предисловия.</h2>
<p>Я постараюсь максимально объективно сравнить два языка. В конечном итоге, выбор платформы, стиля и языка &#8211; не определяющий фактор успеха. Главное, чтобы руки разработчика не повторяли форму <em>интеграла</em>. Ведь язык лишь инструмент, а инструмент, как известно, продолжение рук. </p>
<p><span id="more-356"></span></p>
<h2>Начнем.</h2>
<p><img border="0" align="left" style="padding: 0px 10px 10px;" src="/img/javaphp/javaphp.jpg"></p>
<p style="height: 110px;">
<strong>WEB</strong> развивается уже второй десяток лет. Время статичных <strong>HTML-страниц</strong> кануло в истории, на смену которому пришел абстрактный стандарт <em>WEB2</em>, главное требование которого &#8211; взаимодействие с пользователем. Спорить, правильно ли это, конечно, можно, только в таком случае появляется вполне резонный вопрос: зачем читать эту статью, если она о средствах создания подобных сервисов? </p>
<h2>Порог вхождения.</h2>
<p>Традиционно для сравнительного анализа языков в первую очередь используют удобство синтаксиса, скорость работы и возможности.</p>
<p>Такой подход логичен для выбора собственного. А вот с точки зрения работодателя, качества самого программиста значительно важнее.</p>
<p><strong>PHP</strong> считается простым языком. Это не удивительно: от открытия учебника до первого &#8220;HelloWorld-a&#8221; проходит не больше 5 минут. С одной стороны это хорошо. Но подводных камней не мало.</p>
<p><img border="0" align="left" src="/img/javaphp/helloworld.jpg" style="padding: 10px;"></p>
<p>Потратив неделю на изучение PHP, можно научиться базовым приемам ввода-вывода, примитивной <em>выборке из БД</em> и парочке других алгоритмов обработки информации. С усложнением задач появляется соблазн <em>изобретать &#8220;велосипеды&#8221;</em> и &#8220;костыли&#8221; на основе старых знаний, делая код нечитабельным, уничтожая возможность дальнейшей поддержки на корню.</p>
<p>Работа с таким &#8220;<em>кодером</em>&#8221; в команде, или еще хуже, поддержка проекта, написанного им, превращается в будни школьного учителя. Естественно, это утверждение относится не ко всем, но такая проблема существует.</p>
<p>Что касается <strong>Java</strong>, порог вхождения очень высокий. Вместо &#8220;<em>Установка LAMP под Ubuntu</em>&#8221; и &#8220;<em>Скачать самоучитель PHP</em>&#8220;, необходимо вникнуть в <strong>сервлеты</strong>, взаимодействие между ними, <strong>jsp</strong>, научиться работе с каким-нибудь <em>фреймворком</em>.</p>
<p>Плюс <strong>ООП</strong>, который в Java обязателен. Если проводить аналогию, начало работы сравнимо с <em>высшей математикой</em> в ВУЗ-е: всех неспособных отправить на службу родине.</p>
<p>Подобный подход к оценке языка не панацея. Достаточно много серьезных проектов, написанных на <strong>PHP</strong>. Более того, на данный момент в сфере <strong>WEB-разработок</strong> он доминирует.</p>
<h2>Синтаксис и код.</h2>
<p><img border="0" align="left" src="/img/javaphp/sourcecode.jpg" style="padding: 10px;"></p>
<p>Одна из обсуждаемых проблем <strong>Java</strong> &#8211; длиннейшие названия классов и стандартных методов. Чего только стоит &#8220;<em>System.out.println()</em>&#8221; оного вместо &#8220;<em>echo</em>&#8221; на PHP. Конечно, это легко решается &#8220;<em>import</em>-ом&#8221; в начале документа или выбором современной <em>IDE</em>, в которой достаточно написать первую букву метода или поля, как появится возможность выбора нужного из списка. Тем не менее, отрицать впечатляющий объем кода на Java &#8211;  предвзято.</p>
<p><strong>PHP</strong> тоже не идеален. Взять к примеру обязательный знак доллара перед переменной. Конечно, рациональное зерно различия между обозначениями переменных и методами(функциями) присутствует. Лично у меня это вызывает жуткую головную боль. В первую очередь от созерцания самого знака. Плюс, я так и не сумел привить у себя<br />
привычки ставить доллар перед каждой переменной. Слишком меркантильно, что-ли&#8230;</p>
<p>Что касается кода, я думаю мало кто станет спорить, что серьезный проект == серьезная <em>работа в команде</em>. А работа в команде требует годного, понятного кода, качественную <em>документацию</em>, и возможность эффективно распределить работу.</p>
<p>Здесь принудительное ООП Java и <strong>Javadoc</strong> для документации дают ощутимый прирост в копилке аргументов &#8220;За Java&#8221;.</p>
<p>В PHP эти возможности так же есть. Сравнительно недавно я узнал о аналогах Javadoc в PHP- <strong>phpdoc</strong>/<strong>PhpDocumentor</strong>.</p>
<p>С известных версий PHP поддерживает объектный подход(ООП). Правда он смешанный, и соблазн написать простую функцию без обертки очень большой.</p>
<h2>Техническая площадка.</h2>
<p><img border="0" align="left" src="/img/javaphp/servers.jpg" style="padding: 10px;"></p>
<p>С кодом мы разобрались. А вот что касается хостинга, Java в проигрыше. <strong>PHP-хостинг</strong> распространен и он дешевле.</p>
<p>Правда под вопросом, стоит ли экономить на хостинге, если проект серьезный? Тем не менее, то, что заменить техническую основу проекта на PHP проще &#8211; факт.</p>
<p>Другой вопрос, если проект используется в интрасети. Стоимость <strong>хостинга</strong> отпадает. И программирование на стороне клиента дает плюс в сторону Java. Интеграция <em>апплетов</em> на нем в сети интернет потерпела крах, так как для запуска они требуют имплементатор на локалхосте. Но когда клиенты доступны физически, проблем нет.</p>
<p>Единая платформа, без связки разных языков &#8211; очевидный плюс. </p>
<h2>Вместо заключения.</h2>
<p>Я постарался не затрагивать сравнения технических характеристик языков. Такой информации в интернете полно. Так же считаю, что качество разработки значительно важнее. Язык создан для человека, а не для процессора. Для второго есть ассемблер.</p>
<p>Претензий на объективность у меня нет. Я попытался, насколько успешно- не знаю. Буду рад аргументированной критике.</p>
<p>Под конец повторюсь: все в руках разработчика, язык лишь инструмент. Профессионал и пальцем болт закрутит.</p>
]]></content:encoded>
			<wfw:commentRss>http://job-interview.ru/articles/post/356/feed</wfw:commentRss>
		<slash:comments>513</slash:comments>
		</item>
		<item>
		<title>Программист на фрилансе</title>
		<link>http://job-interview.ru/articles/post/332</link>
		<comments>http://job-interview.ru/articles/post/332#comments</comments>
		<pubDate>Tue, 31 May 2011 19:51:38 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[Фриланс]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[фриланс-биржи]]></category>

		<guid isPermaLink="false">/articles/?p=332</guid>
		<description><![CDATA[

В этой статье я хочу описать свой опыт работы на фрилансе.

Что за фриланс?

Может быть есть люди, которые не знают, что такое фриланс? &#8220;Freelance&#8221; буквально переводится как &#8220;внештатно&#8221;, соответственно &#8220;freelancer&#8221; — &#8220;внештатный сотрудник&#8221;. Обычно это подразумевает поиск заказов через интернет, выполнение их дома за компьютером (хотя некоторые ловко трудятся во время основной работы   ) [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/img/fl_sait_1000_rub.jpg" style="float:left;margin-right:5px;width:260px;" title="Сделаю сайт за 1000 рублей" /></p>
<p>
В этой статье я хочу описать свой опыт работы на фрилансе.
</p>
<h3>Что за фриланс?</h3>
<p>
Может быть есть люди, которые не знают, что такое <b>фриланс</b>? <i>&#8220;Freelance&#8221;</i> буквально переводится как &#8220;внештатно&#8221;, соответственно <i>&#8220;freelancer&#8221;</i> — &#8220;внештатный сотрудник&#8221;. Обычно это подразумевает поиск заказов через интернет, выполнение их дома за компьютером (хотя некоторые ловко трудятся во время основной работы <img src='/articles/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ) и оплату выполненной работы через интернет. Существуют специальные сайты — фриланс-биржы — на которых происходит общение заказчиков, имеющих какие-либо задания, и исполнителей, готовых эти задания выполнить.
</p>
<p><span id="more-332"></span></p>
<h3>А зачем это нужно?</h3>
<p>
Наверное каждый программист замечал, что работая постоянно, у него не хватает времени заниматься какими-то своими проектами. А различные идеи периодически приходят, и думаешь: &#8220;Вот было бы время, обязательно бы это реализовал&#8221;. Да и на работе бывают времена, что приходится заниматься неинтересными делами. Тем более в мои планы не входило всю жизнь работать &#8220;на дядю&#8221;, рано или поздно пришлось бы уходить на вольные хлеба, и во время особо скучного периода на тогдашней постоянной работе я и решил это сделать.
</p>
<p>
Для начала я решил закрепиться на <b>фриланс-биржах</b>, чтобы в случае чего всегда можно было бы заработать денег, невзирая на текущую жизненную ситуацию, был бы под рукой ноутбук и интернет. К тому же всегда есть из чего выбрать: захотел делать сайт — вперед, захотел написать скрипт — флаг в руки, надоел язык программирования — меняй, никто не запрещает.
</p>
<h3>Биржи? Биржи. Биржи&#8230;</h3>
<p>
Фриланс-бирж существует множество, как российских, так и зарубежных, в итоге я зарегистрировался на трех — <i>freelancer.com</i>, <i>free-lance.ru</i> и <i>weblancer.net</i>.
</p>
<p><img src="/img/fl_ows_f.png" style="float:left;width:200px;margin-right:3px;" /></p>
<p>
freelancer.com я выбрал, так как прочитал довольно интересную статью, описывающую прелесть работы на ней. Здесь я решил представиться веб-студией, по идее такой подход вызывает больше доверия у заказчиков, придумал &#8220;конторе&#8221; название, сделал простенький логотип, зарегистрировался и начал осматриваться.<br />
Если описать в общем, сайт представляет собой типичную фриланс-биржу &#8211; страницы разделов по возможным IT-работам, например создание сайтов &#8220;под ключ&#8221;, создание дизайнов, работа с различными CMS, написание скриптов, системное администрирование и т.д. Заказчик выбирает нужный ему раздел, создает проект, на который откликаются заинтересовавшиеся фрилансеры.
</p>
<p>
На freelancer.com ищут заказы очень много фрилансеров, среди которых немало выходцев из Азии. Качество работы большинства этих товарищей, как и знание английского языка, оставляет желать лучшего (кто не слышал про программистов-индусов <img src='/articles/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ), но они берут ценами, иногда демпинг с их стороны вызывает даже не недоумение, а смех. Вполне реально найти &#8220;исполнителя&#8221; на сложный специфичный портал за сумму например 100$ и сроком исполнения 3 дня. И это предложение еще могут перебить!<br />
Естественно, есть и мастера своего дела, с высочайшим профессионализмом, большим опытом и умением подойти к клиенту.
</p>
<p>
К сожалению, на этом сайте мне так и не удалось получить ни одного заказа, наверное из-за окончательной переориентации на отечественный рынок. Свою роль сыграли и не очень удовлетворительный английский, и разница во времени с многими заказчиками.
</p>
<p>
Российские биржи, на которых я зарегистрировался — free-lance.ru и weblancer.net. free-lance.ru &#8211; самая известная из отечественных, держит первенство по количеству проектов и активных фрилансеров. Содержит много платных услуг, жизнь без которых затруднена, например не имея pro-аккаунта можно подавать только три заявки на понравившиеся проекты в сутки. Но таким ограничением страдают все биржи, которые я встречал. Впрочем это мне не очень мешало, с первых дней мне хотелось насладится преимуществом выбора интересных заданий. К сожалению, появлялись они не так часто, как хотелось бы, а при подаче заявки меня всегда обходили более опытные исполнители, с отзывами и более долгим временем нахождения на сайте.
</p>
<p><a href="/img/fl_dem_cust.jpg" target="_blank"><img src="/img/fl_dem_cust_sm.jpg" style="float:left;margin-right:5px;" /></a></p>
<p>
Про это стоит упомянуть подробнее. Практически все заказчики смотрят на количество отзывов, имеющихся у фрилансера, которые оставили прошлые работодатели. Хорошо выполнил работу — написали положительный, плохо, не выполнил или исчез — отритцательный. Наверное уже с 3-мя отритцательными отзывами лучше завести новый аккаунт, так же как и если первый отзыв — негативный. То же самое и с временем, прошедшим после регистрации, некоторые не доверяют людям, у которых оно меньше месяца. Сначала порой приходилось работать и <del>за еду</del> просто за отзыв.
</p>
<p>
Когда подходящий проект найден, встает задача, чтобы заказчик выбрал именно вас. Тут у каждого свой подход, кто-то просто называет цену и оставляет сообщение &#8220;пишите в личку&#8221;, кто-то строчит простыни текста, в подробностях расписывая все свои предыдущие достижения, кто-то выбирает нечто среднее. По-моему стоит писать, какие подобные задания уже приходилось выполнять и по-возможности дать понять, что понимаешь задание и чуть ли не начал его делать.
</p>
<p>
Но вот первый проект получен, наконец-то меня выбрали исполнителем! Обсудив все детали задания, пора начинать работать! Но, что все не так просто, стало понятно через пару проектов. ТЗ и детали нужно обговаривать ОЧЕНЬ подробно, выясняя все до последних мелочей, иначе дорабатывать и изменять казалось бы незначительные и неважные детали и наводить красоту по вкусу заказчика можно вечно, либо, неправильно поняв суть задания, вообще выбрать неверный путь решения задачи. Был случай, когда недели две работы потратились впустую из-за непонимания и несогласованности между мной и заказчиком, в итоге я потерял деньги, а клиент время, хорошо, что в результате разошлись мирно, без написания отритцательных отзывов друг другу.
</p>
<p>
И наконец, самый приятный момент — оплата. На всех биржах есть сервисы безопасных сделок, которые сделаны для того, чтобы ни работодатель, ни исполнитель не обманывали друг друга. Я ими не пользовался ни разу, предпочитая или доверять заказчику, получая деньги после выполнения задания, или беря предоплату. В подавляющем большинстве случаев оплата происходит с помощью вебмани или яндекс-денег.
</p>
<h3>Не биржей единой</h3>
<p>
Поиск заказов не ограничивается только биржами.<br />
У многих заказчиков постоянно появляются новые задания, и если ты хорошо выполнил одно, наверняка следующее также достанется тебе, плюс этот заказчик будет рекомендовать тебя своим знакомым, у которых возникла необходимость в привлечении стороннего сотрудника.<br />
Постепенно знакомые и бывшие коллеги узнают о твоей работе на фрилансе и заказы начинают приходить через них.<br />
Через некоторое время я перестал заходить на биржи и выполнял только подобные задания, потому что они скорее всего будут интересные, с заказчиком уже сложились более-менее неплохие отношения, почти нет недоверия и настороженности, как у тебя, что прокатят с деньгами, так и у него, что работа не будет выполнена.
</p>
<p>
Также не стоит забывать про свои задумки, отводить какое-то время на них, даже если пока ни одна из них еще не приносит какой-либо ощутимой отдачи, ведь это только пока <img src='/articles/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Главное, что для них находится время.
</p>
<h3>Ожидания и реальность</h3>
<p><img src="/img/fl_good_bad.jpg" /></p>
<p>
Для кого-то работать дома в кайф, но я знал, что постоянно находиться в четырех стенах мне будет затруднительно, однако утешал себя мыслью, что можно будет выйти, например, в парк и работать там. Но на практике зарядки ноутбука хватает не намного времени, у нетбука маленький экран, а на лавке в парке с этими девайсами неудобно сидеть. Если еще вспомнить, каким жарким было лето 2010, то можно понять, как я завидовал людям, сидящим в прохладных офисах с кондиционерами, тогда как дома был только плохо спасающий от этого ада вентилятор.
</p>
<p>
Когда я начинал свой путь по дороге фриланса, то не строил иллюзий, что в первый же день клиенты выстроятся в очередь, но все же было неожиданно, что уцепиться за первый проект удалось только недели через две. Эта ситуация получилась и из-за того, что, как упоминалось ранее, я не откликался на неинтересные заявки, а ждал чего-то более привлекательного. Зато проект оказался интересным, довольно денежным и с хорошим заказчиком, которому впоследствии я выполнил еще несколько заданий.
</p>
<p>
По поводу рабочего времени происходило примерно так, как я и думал: то работы нет, то работать приходится по ночам, не говоря уже про выходные. Если на постоянной работе знаешь, что в субботу-воскресенье отдыхаешь, на фрилансе все смешивается и иногда удивляешься радости друзей о том, что завтра выходной.<br />
Можно безболезненно с утра покататься на велосипеде, посреди рабочего дня прерваться, например, на гантели или прогулку (это если нет срочной работы, конечно <img src='/articles/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  ).
</p>
<p>
Волнующий денежный вопрос. Честно говоря, когда я уходил на фриланс, то ожидал, что буду зарабатывать больше. Очень сложно назвать среднюю сумму заработка, в первые месяцы у меня выходило не более 10-15 тысяч ежемесячно.
</p>
<h3>Итого</h3>
<p>
Что же в итоге? Не жалею ли я о том, что ушел с постоянной работы на фриланс? Нет.<br />
Сейчас я частично (5 часов в день) работаю в офисе на постоянной работе, которая нашла меня через фриланс, остальное время практически полностью посвящаю своим делам, лишь иногда откликаясь на работу от постоянных заказчиков, приобретенных на фрилансе.
</p>
<p></p>
<p>
В заключение хочу выразить огромную благодарность своей девушке Саше, которая была со мной и  поддерживала меня все это время.</p>
]]></content:encoded>
			<wfw:commentRss>http://job-interview.ru/articles/post/332/feed</wfw:commentRss>
		<slash:comments>298</slash:comments>
		</item>
		<item>
		<title>Хочу открыть интернет-магазин</title>
		<link>http://job-interview.ru/articles/post/271</link>
		<comments>http://job-interview.ru/articles/post/271#comments</comments>
		<pubDate>Sun, 30 May 2010 13:31:35 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[Интернет-коммерция]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[интернет-магазин]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">/articles/?p=271</guid>
		<description><![CDATA[
Наверное, многие, проработав определенное время в какой-то отрасли, приходят к мыслям о том, что нужно попробовать что-то свое. С некоторых пор такие мысли стали посещать и меня.


Я web-программист, проработал уже достаточное время на этой должности и, честно говоря, порядком подустал. К тому же я не вижу каких-то особых перспектив, к которым мне хотелось бы стремиться.


Нет, [...]]]></description>
			<content:encoded><![CDATA[<p>
Наверное, многие, проработав определенное время в какой-то отрасли, приходят к мыслям о том, что нужно попробовать что-то свое. С некоторых пор такие мысли стали посещать и меня.
</p>
<p>
Я <strong>web-программист</strong>, проработал уже достаточное время на этой должности и, честно говоря, порядком подустал. К тому же я не вижу каких-то особых перспектив, к которым мне хотелось бы стремиться.
</p>
<p>
Нет, они, конечно, есть. Программист перерастает в руководителя группы, потом в руководителя отдела, возможно, потом еще в кого-то, потом «потолок». Кого-то может такая ситуация устраивает, но она не для меня.
</p>
<p>
И я решил, что нужно открывать свое дело, где ты работаешь только на себя, получаешь столько денег, сколько заработал сам. Вот здесь открываются огромные перспективы. Они мне интересны, хочется стремиться к поставленным для себя целям.
</p>
<p>
Для начала я посоветовался со своими друзьями, перечитал не мало статей про различные  <a href="http://moyevro.ru/category/vidy-zarabotka/" title="виды заработка в интернете">виды заработка</a> для программиста. И вот какие выводы я для себя сделал:
</p>
<blockquote><p>
Где web-программист может проявить себя самостоятельно? </p>
<ul>
<li>
Фриланс.
</li>
<p>
Возможно, стоило бы попробовать, но все-таки по рассказам знакомых фрилансеров больших денег там не заработаешь. Особенно первое время придется усиленно экономить. Да и все же это не совсем работа на себя, а работа на заказчика.
</p>
<li>
Web-студия.
</li>
<p>
Для ее открытия нужен какой-то стартовый капитал, которого у меня нет. Кроме того, большие риски, что вложенные на начальном этапе средства так и не окупятся. Опять же в этом варианте присутствуют заказчики, на которых тебе придется вкалывать.
</p>
<li>
Интернет-магазин.
</li>
<p>На данный момент самый подходящий для меня вариант. Его я и выбрал.</p>
</ul>
</blockquote>
<p><span id="more-271"></span></p>
<h2>Почему я хочу открыть интернет-магазин?</h2>
<p>
<img style="padding: 10px" src="/img/shop_1.jpg" align="left" alt="Почему я хочу открыть интернет-магазин?" title="Почему я хочу открыть интернет-магазин?"><br />
Устал от работы на дядю, надоели начальники, которые вечно самоутверждаются за счет своих подчиненных.
</p>
<p>Ситуацию можно описать известной фразой: «Я начальник, ты дурак, ты начальник, я дурак». Причем как-то получается так, что «дураком» ты становишься автоматически, независимо от объема твоих знаний, опыта и т.д. Начальник все равно знает больше, чем ты, только он может принять единственно верные решения.</p>
<p>
Кто-то может сказать: «Все правильно, он прошел свой путь, начиная простым программистом, набрался опыта, поднялся по карьерной лестнице и, конечно же, он будет обладать большими знаниями».
</p>
<p>
Если он бывший программист, то да, я согласен. Однако, очень часто в роли начальников выступают совсем не программисты, а менеджеры, которые считают, что разбираются в твоей области гораздо лучше, чем ты, а все программисты — это обычные кодеры, которые реализовывают их гениальные идеи.
</p>
<p>
Найдется ли такой программист, который никогда не попадал на такой диалог?<br />
<em> &#8211; Сколько займет времени, чтобы это сделать?</em> <br />
<em> &#8211; Думаю, что где-то полдня нужно будет.</em> <br />
<em> &#8211; Почему так долго? Здесь же просто кнопку поставить.</em> 
</p>
<p>
Дальше ты начинаешь пытаться как-то объяснить, почему это занимает столько времени, но понимаешь, что то, что ты говоришь, человеку все равно не понятно. Да и занятие это бесполезное, но какой может быть другой выход, если тебе задают подобный вопрос.
</p>
<p>
В ответ на твои объяснения ты получаешь примерно следующую фразу: «<em>Ну не знаю, мне кажется, что все равно это очень долго</em>».
</p>
<p>
Кроме того, много денег при работе на кого-то не заработаешь. Все равно есть потолок.
</p>
<p>
Доход от интернет-магазина будет зависеть только от тебя и от его развития. Теоретически предела доходам здесь нет.
</p>
<p>
Еще одна причина, по которой я хочу начать свое дело — устал от работы в коллективе. Возможно, эта причина относится только ко мне, а может и нет.
</p>
<p>
На мой взгляд, каждому коллективу присуща определенная доля лживости. Вроде как все говорят: «Мы вместе, мы одна команда». Все друг другу улыбаются, все друзья, все классно. Однако, это только на поверхности.
</p>
<p>
Как люди могут быть друзьями, когда они всеми силами стараются показать себя выше других, чтобы начальство их заметило? А этим приходится заниматься, все ведь хотят продвинуться вверх по службе.
</p>
<p>
Коллективу часто приходится объяснять начальству, почему не выдерживаются сроки в том или ином проекте. А начальству важно знать, кто конкретно тормозит проект. В таких ситуациях приходится закладывать кого-то из своих «друзей».
</p>
<p>
Когда в коллективе решают, кому конкретно доверить очередной проект, тут то и выясняется, чьи знания и опыт ценят, а чьи нет.
</p>
<p>
Но ведь на поверхности то все равны, все сотрудники одинаково ценятся.
</p>
<p>
В общем эта как-бы «дружба» не для меня. Чисто с психологической точки зрения я бы себя чувствовал спокойнее, занимаясь своим делом и не отвлекаясь на всякие закулисные склоки.
</p>
<h2>А что продавать?</h2>
<p>
<img style="padding: 10px" src="/img/shop_2.jpg" align="right" alt="А что продавать?" title="А что продавать?"><br />
Вот это очень трудный и самый важный вопрос на начальном этапе. На данный момент в интернете можно купить почти все. Конкуренты есть везде. Но выбирать что-то нужно.
</p>
<p>Я для себя определил следующие критерии моего будущего товара:</p>
<ul>
<li>
Он должен быть легким, чтобы не было проблем при доставке.
</li>
<li>
Его стоимость не должна быть очень низкой. Большого объема заказов в первое время не предвидится, поэтому даже один заказ должен приносить более менее приличную сумму (не 1 рубль, а, скажем, 200).
</li>
<li>
Он должен быть приспособлен для интернета. Например, продавать продукты питания через интернет, на мой взгляд, не самая лучшая идея. Все-таки некоторые товары люди хотят «пощупать», когда его выбирают.
</li>
<li>
В идеале этот товар должен быть интересен мне, чтобы я мог иметь какое-то мнение по нему. Тогда я бы мог составлять описания к товарам, а это поможет продвижению в поисковиках.
</li>
</ul>
<p>
Осталось теперь найти товар, удовлетворяющий этим моим критериям. Пока я нахожусь в поиске.
</p>
<p>
Под эти пункты очень подходят книги, но здесь очень высока конкуренция, поэтому их я не рассматриваю.
</p>
<p>
<strong>Определиться с товаром</strong> — это одна проблема. Решив ее, придется еще <strong>найти поставщиков</strong>, которые готовы этот товар поставлять. Кроме того, т.к. у меня нет никакого <em>начального капитала</em>, то закупать товар оптом я не смогу. Поэтому нужно найти поставщика, который будет готов поставлять товар по факту заказа. Т.е. мне представляется следующая схема: мне пришел заказ, я еду к поставщику, забираю у него товар, доставляю товар клиенту.
</p>
<p>
Найти такого поставщика будет нелегкой задачей, но все же она должна быть решаема. Делаю такой вывод, основываясь на различные статьи в блогах, где люди на начальных стадиях сталкивались с такой проблемой и находили выход.
</p>
<p>
Итак, товар выбран, поставщик найден. Чем мой магазин будет отличаться от других? Нужно придумать <strong>уникальное торговое предложение</strong> (УТП). Возможно, в моем магазине цены будут ниже, чем у конкурентов, возможно, что-то еще, но клиента нужно будет чем-то зацепить, чтобы, совершив один раз покупку у меня, он вернулся ко мне же за следующей.
</p>
<p>
На эту тему я пока даже не думаю, сначала надо определиться с товаром.
</p>
<h2>Планы</h2>
<p>
<img style="padding: 10px" src="/img/shop_3.jpg" align="left" alt="Планы" title="Планы"><br />
Перед открытием магазина я <strong>зарегистрирую ИП</strong>. Скорее всего воспользуюсь услугами какого-нибудь агентства, но, похоже, что даже в этом случае придется помотаться по всяким гос. учреждениям. Ну а что делать, без этого в нашей стране никуда.
</p>
<p>
Еще думаю, что может сначала не писать навороченный магазин, а сделать просто <strong>список товаров</strong> и рядом номер телефона. Посмотрю, как пойдут заказы. Если будет все хорошо, то доработаю до приличного магазина.
</p>
<p>
С другой стороны, все говорят о <em>дружелюбном интерфейсе</em> для покупателей, что чуть ли это не самое главное. Ну в общем это я еще решу, просто не хотелось бы тратить время, если в итоге магазин не оправдает моих надежд.
</p>
<p>
Да, еще планирую обзавестись прямым номером на свой мобильный. Оставлять 10-значный номер телефона на сайте, как мне кажется, будет выглядеть не серьезно.
</p>
<p>
Доставкой буду заниматься первое время сам. Придется как-то совмещать с текущей работой, но это, надеюсь, продлится не долго, т.к. за первые 1-2 месяца станет более менее понятно, что получится из магазина в итоге.
</p>
<p>
Если заказов будет не мало, то возьму отпуск, может даже за свой счет.
</p>
<p>
Моя первоначальная цель — достичь дохода от магазина, равного половине моей текущей зарплаты. Если добьюсь этого, то планирую уволиться, а часть денег зарабатывать на <em>фрилансе</em>. В итоге мой месячный доход будет равен текущему доходу на постоянной работе.
</p>
<p>
Давно хочу изучить <em>язык программирования python</em> и <em>фреймворк django</em>. Как раз мой магазин поможет мне в этом. Даже, если ничего путного не выйдет, то, как минимум, будет опыт программирования на python.
</p>
<p>
Ну вот вроде и все. Я хотел в этой статье поделиться своими мыслями и планами по поводу открытия своего <strong>интернет-магазина</strong>. Как только приступлю к реализации этих планов, поделюсь полученным опытом в следующей статье.
</p>
<p>
Жду любых ваших мнений в комментариях.
</p>
<p>
Также интересно было бы узнать мнение программистов, которые уже прошли путь <strong>открытия своего бизнеса</strong> (не обязательно интернет-магазин).</p>
]]></content:encoded>
			<wfw:commentRss>http://job-interview.ru/articles/post/271/feed</wfw:commentRss>
		<slash:comments>350</slash:comments>
		</item>
		<item>
		<title>Отладка программ в командной строке Linux</title>
		<link>http://job-interview.ru/articles/post/160</link>
		<comments>http://job-interview.ru/articles/post/160#comments</comments>
		<pubDate>Sat, 31 Oct 2009 18:08:33 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[отладка]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[язык C]]></category>

		<guid isPermaLink="false">/articles/?p=160</guid>
		<description><![CDATA[
Как известно, все программисты при написании программ допускают ошибки. Не думаю, что найдется хоть один разработчик, который,как-то решив разработать более-менее сложное приложение, сел за свой компьютер, открыл любимый редактор, набрал нужный код, скомпоновал его и после запуска программа сделала все то, что от нее требовалось.


Все это из области фантастики. Каждый из нас допускает ошибки, поэтому [...]]]></description>
			<content:encoded><![CDATA[<p>
Как известно, все <em>программисты</em> при написании программ допускают ошибки. Не думаю, что найдется хоть один разработчик, который,как-то решив разработать более-менее сложное приложение, сел за свой компьютер, открыл любимый редактор, набрал нужный код, скомпоновал его и после запуска программа сделала все то, что от нее требовалось.
</p>
<p><a target="_blank" href="http://6.joinru.programmerinfo.e-autopay.com/"><img src="/img/courses/C++bannergif.gif"></a></p>
<p>Все это из области фантастики. Каждый из нас допускает ошибки, поэтому нам нужно их как-то отлавливать. </p>
<p>Если <em>ошибка синтаксическая</em>, то  в большинстве случаев на это укажет компилятор. Но, если  <strong>ошибка логическая</strong>, то часто <em>программист</em> сам не в состоянии определить ее.</p>
<p>Конечно, если <em>программа</em> не сложная, то можно самостоятельно, не прибегая ни к каким дополнительным средствам, выявить ошибку.</p>
<p>Однако, в больших программах самостоятельно отследить тот момент, когда программа начинает вести себя неправильно в большинстве случаев просто невозможно. В таких ситуациях на помощь приходят <strong>отладчики</strong>, которые позволяют программисту пройти по пути работы программы, отслеживая при этом ее состояние в определенные моменты времени выполнения.</p>
<p>В этой статье рассказывается об <strong>отладке программ</strong>, написанных на языке C, в <em>командной строке Linux</em> с использованием утилиты <strong>GDB</strong>.</p>
<p><span id="more-160"></span></p>
<p>Многие программисты, которые с успехом разрабатывали свои приложения на <strong>языках C/C++</strong> для <em>Windows</em>, после перехода к разработке программ на том же языке, но под ОС семейства <em>Linux</em> с удивлением обнаруживают, что отсутствует возможность той отладки, которой они пользовались в редакторах при написании программ для <em>Windows</em>.</p>
<p>Однако, такая возможность есть и это <strong>отладчик GDB</strong>.</p>
<p>Как следует из документации к этой утилите «<em>цель отладчика GDB</em>  &#8211; это позволить вам увидеть, что происходит внутри программы пока она выполняется, или что программа делает в момент ее краха.».</p>
<p>На момент написания этой статьи <strong>отладчик GDB</strong> работает с программами, написанными на <em>языках C, C++, Modula-2</em>. Мы будем отлаживать приложение, написанное на <strong>языке C</strong>.</p>
<p>Давайте начнем с приведения кода программы, которая в качестве аргумента принимает число и высчитывает <em>факториал</em> этого числа при помощи <em>рекурсии</em>. Ее мы и будем отлаживать.</p>
<p><div class="wp_syntax">
<table>
<tr>
<td class="line_numbers">
<pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre>
</td>
<td class="code">
<pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;unistd.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> fact<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> num<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>num <span style="color: #339933;">&lt;=</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> num <span style="color: #339933;">*</span> fact<span style="color: #009900;">&#40;</span>num <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>argv<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">int</span> a <span style="color: #339933;">=</span> atoi<span style="color: #009900;">&#40;</span>argv<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d! = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> a<span style="color: #339933;">,</span> fact<span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre>
</td>
</tr>
</table>
</div>
<p>Теперь скомпилируем ее с включением отладочной информации. Для этого в командной строке заходим в директорию, в которой лежит наш файл с расширением .c и выполняем команду:</p>
<p>
<div class="wp_syntax">
<div class="code">
<pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">g++</span> <span style="color: #660033;">-g</span> fact.c <span style="color: #660033;">-o</span> fact</pre>
</div>
</div>
<p>Опция <em>-g</em> сообщает <em>компилятору</em> о том, что в программу нужно включить отладочную информацию, которой и воспользуется <strong>отладчик GDB</strong>. </p>
<p>Опция <em>-o</em> сообщает <strong>компилятору g++</strong> путь до исполняемого файла. Если ее не указать, то, по умолчанию, компилятор создаст исполняемый файл в той же директории, где находится наша программа, и назовет его a.out.</p>
<p>Теперь запустим нашу программу в режиме отладки:</p>
<p>
<div class="wp_syntax">
<div class="code">
<pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">gdb</span> <span style="color: #660033;">-q</span> fact</pre>
</div>
</div>
<p>Опцию <em>-q</em> можно не указывать, она используется лишь для того, чтобы при первом заходе в отладчик не выводилась информация о версии, лицензионное соглашение и т.д.</p>
<p>Итак, мы запустили отладчик. Теперь мы можем выполнять его команды.</p>
<p>Для просмотра исходного кода программы используется команда <em>list</em>, в которую можно передать номер строки для того, чтобы вывести код, окружающий переданную строку. </p>
<p>
<div class="wp_syntax">
<div class="code">
<pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> list <span style="color: #000000;">10</span>
<span style="color: #000000;">5</span>       int fact<span style="color: #7a0874; font-weight: bold;">&#40;</span>int num<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000;">6</span>       <span style="color: #7a0874; font-weight: bold;">&#123;</span>
<span style="color: #000000;">7</span>           <span style="color: #000000; font-weight: bold;">if</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>num <span style="color: #000000; font-weight: bold;">&lt;</span>= <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000;">8</span>           <span style="color: #7a0874; font-weight: bold;">&#123;</span>
<span style="color: #000000;">9</span>             <span style="color: #7a0874; font-weight: bold;">return</span> <span style="color: #000000;">1</span>;
<span style="color: #000000;">10</span>          <span style="color: #7a0874; font-weight: bold;">&#125;</span>
<span style="color: #000000;">11</span>
<span style="color: #000000;">12</span>          <span style="color: #7a0874; font-weight: bold;">return</span> num <span style="color: #000000; font-weight: bold;">*</span> fact<span style="color: #7a0874; font-weight: bold;">&#40;</span>num - <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;
<span style="color: #000000;">13</span>      <span style="color: #7a0874; font-weight: bold;">&#125;</span></pre>
</div>
</div>
<p>Также можно передать название функции, после чего будет выведен код, окружающий эту функцию.</p>
<p>
<div class="wp_syntax">
<div class="code">
<pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> list fact
<span style="color: #000000;">1</span>       <span style="color: #666666; font-style: italic;">#include &lt;stdio.h&gt;</span>
<span style="color: #000000;">2</span>       <span style="color: #666666; font-style: italic;">#include &lt;stdlib.h&gt;</span>
<span style="color: #000000;">3</span>       <span style="color: #666666; font-style: italic;">#include &lt;unistd.h&gt;</span>
<span style="color: #000000;">4</span>
<span style="color: #000000;">5</span>       int fact<span style="color: #7a0874; font-weight: bold;">&#40;</span>int num<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000;">6</span>       <span style="color: #7a0874; font-weight: bold;">&#123;</span>
<span style="color: #000000;">7</span>           <span style="color: #000000; font-weight: bold;">if</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>num <span style="color: #000000; font-weight: bold;">&lt;</span>= <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000;">8</span>           <span style="color: #7a0874; font-weight: bold;">&#123;</span>
<span style="color: #000000;">9</span>             <span style="color: #7a0874; font-weight: bold;">return</span> <span style="color: #000000;">1</span>;
<span style="color: #000000;">10</span>          <span style="color: #7a0874; font-weight: bold;">&#125;</span></pre>
</div>
</div>
<p>Давайте запустим теперь <strong>выполнение программы под отладчиком</strong>. Это можно сделать одной из двух команд: <em>run</em> или <em>start</em>.</p>
<p>Отличие между этими двумя командами в том, что, вызвав команду <em>start</em>, отладчик останавливается на входе в функцию main, а команда <em>run</em> выполняется до тех пор, пока не наткнется на <strong>точку останова</strong> (о них чуть позднее).</p>
<p>Обе эти команды принимают в качестве параметра аргументы программы так же, как если бы программа запускалась из командной строки.</p>
<p>Итак, запустим программу на выполнение в режиме отладки:</p>
<p>
<div class="wp_syntax">
<div class="code">
<pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> start <span style="color: #000000;">4</span>
Temporary breakpoint <span style="color: #000000;">2</span> at 0x8048556: <span style="color: #c20cb9; font-weight: bold;">file</span> fact.c, line 17.
Temporary breakpoint <span style="color: #000000;">2</span>, main <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">argc</span>=<span style="color: #000000;">2</span>, <span style="color: #007800;">argv</span>=0xbffffa24<span style="color: #7a0874; font-weight: bold;">&#41;</span> at fact.c:<span style="color: #000000;">17</span>
<span style="color: #000000;">17</span>        int a = atoi<span style="color: #7a0874; font-weight: bold;">&#40;</span>argv<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;</pre>
</div>
</div>
<p>Как видим, отладчик остановился сразу же на входе в функцию main, а также вывел код и номер строки, перед которой остановился.</p>
<p>Используя команду <em>print</em>, мы можем вывести значения переменных и выражений. Посмотрим какие входные аргументы приняла наша программа:</p>
<p>
<div class="wp_syntax">
<div class="code">
<pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> print argv<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
$<span style="color: #000000;">1</span> = 0xbffffb41 <span style="color: #ff0000;">&quot;/home/user/cpp/fact&quot;</span>
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> print argv<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
$<span style="color: #000000;">2</span> = 0xbffffb5f <span style="color: #ff0000;">&quot;4&quot;</span></pre>
</div>
</div>
<p>В нулевом элементе массива argv содержится путь до выполняемой программы, а в первом элементе наш переданный аргумент — 4.</p>
<p>Для того, чтобы перейти на следующую строку, необходимо выполнить команду <em>step</em> или <em>next</em>.</p>
<p>Используя эти команды, можно передвигаться по программе. Отличие этих команд состоит в том, что <em>step</em> будет заходить внутрь функции каждый раз, когда ее встретит, а <em>next</em> пойдет дальше.</p>
<p>Перейдем к следующей строке:</p>
<p>
<div class="wp_syntax">
<div class="code">
<pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> step
<span style="color: #000000;">18</span>        <span style="color: #7a0874; font-weight: bold;">printf</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">&quot;%d! = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, a, fact<span style="color: #7a0874; font-weight: bold;">&#40;</span>a<span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;</pre>
</div>
</div>
<p>Мы сделали один шаг и остановились перед 18-ой строкой.</p>
<p>Пойдем дальше:</p>
<p>
<div class="wp_syntax">
<div class="code">
<pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> step
fact <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">num</span>=<span style="color: #000000;">4</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> at fact.c:<span style="color: #000000;">7</span>
<span style="color: #000000;">7</span>           <span style="color: #000000; font-weight: bold;">if</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>num <span style="color: #000000; font-weight: bold;">&lt;</span>= <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span></pre>
</div>
</div>
<p>Мы вошли в функцию fact с входным параметром 4 и оказались перед 7-ой строкой.</p>
<p>Т.к. мы имеем дело с рекурсией, то, вероятно, нам будет интересно значение переменной num, которое будет изменяться при каждом рекурсивном входе в функцию fact.</p>
<p>Добавим в процесс отладки слежение за переменной num. Для этого существует команда <em>display</em>, которой необходимо передать название переменной. В нашем случае это будет переменная num.</p>
<p>Выполним команду <em>display</em> и перейдем на один шаг вперед:</p>
<p>
<div class="wp_syntax">
<div class="code">
<pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> display num
<span style="color: #000000;">1</span>: num = <span style="color: #000000;">4</span>
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> step
<span style="color: #000000;">12</span>          <span style="color: #7a0874; font-weight: bold;">return</span> num <span style="color: #000000; font-weight: bold;">*</span> fact<span style="color: #7a0874; font-weight: bold;">&#40;</span>num - <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;
<span style="color: #000000;">1</span>: num = <span style="color: #000000;">4</span></pre>
</div>
</div>
<p>Как видим, теперь при каждой остановке программы <strong>отладчик GDB</strong> сообщает нам значение переменной num.</p>
<p>Сейчас мы находимся перед рекурсивным входом в функцию fact. Заходим в нее и делаем еще один шаг вперед:</p>
<p>
<div class="wp_syntax">
<div class="code">
<pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> step
fact <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">num</span>=<span style="color: #000000;">3</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> at fact.c:<span style="color: #000000;">7</span>
<span style="color: #000000;">7</span>           <span style="color: #000000; font-weight: bold;">if</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>num <span style="color: #000000; font-weight: bold;">&lt;</span>= <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000;">1</span>: num = <span style="color: #000000;">3</span>
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> step
<span style="color: #000000;">12</span>          <span style="color: #7a0874; font-weight: bold;">return</span> num <span style="color: #000000; font-weight: bold;">*</span> fact<span style="color: #7a0874; font-weight: bold;">&#40;</span>num - <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;
<span style="color: #000000;">1</span>: num = <span style="color: #000000;">3</span></pre>
</div>
</div>
<p>Отладчик сообщает нам значение переменной num, которое уже равно 3. Сейчас мы снова находимся перед заходом в функцию fact. </p>
<p>Скорее всего, не имеет смысла каждый раз проделывать эти шаги в функции fact. Нам достаточно было бы отслеживать какие значения принимает переменная num в 12-ой строке, т.к. в этой строке происходит рекурсивный вызов функции, а также возвращается результат ее выполнения.</p>
<p>Для того, чтобы добиться поставленных целей, мы можем поставить <strong>точки останова</strong>. Наша рассматриваемая программа достаточно не велика, поэтому мы могли бы пройти по каждой строке, используя отладчик, вплоть до завершения программы.</p>
<p>Однако, в реальных программах <em>программисты</em> отлаживают код, который содержит в себе тысячи строк. Если бы для отладки такого кода пришлось бы обойти каждую строку, то это превратилось бы в долгую и муторную работу.</p>
<p>Расставив <strong>точки останова</strong>, отладчик может «перепрыгивать» к строкам, на которых они поставлены, минуя весь остальной код. Для этого можно использовать команду <em>continue</em>, которая продолжает выполнение программы до тех пор, пока не встретится <strong>точка останова</strong>. Если их нет, то программа выполнится до конца.</p>
<p>Итак, давайте поставим точку останова в строке 12 и выполним команду <em>continue</em>, чтобы продолжить программу до тех пор, пока не наткнемся на строку 12:</p>
<p>
<div class="wp_syntax">
<div class="code">
<pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">break</span> <span style="color: #000000;">12</span>
Breakpoint <span style="color: #000000;">2</span> at 0x8048529: <span style="color: #c20cb9; font-weight: bold;">file</span> fact.c, line 12.
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">continue</span>
Continuing.
&nbsp;
Breakpoint <span style="color: #000000;">2</span>, fact <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">num</span>=<span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> at fact.c:<span style="color: #000000;">12</span>
<span style="color: #000000;">12</span>          <span style="color: #7a0874; font-weight: bold;">return</span> num <span style="color: #000000; font-weight: bold;">*</span> fact<span style="color: #7a0874; font-weight: bold;">&#40;</span>num - <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;
<span style="color: #000000;">1</span>: num = <span style="color: #000000;">2</span></pre>
</div>
</div>
<p>Мы прошли все шаги, которые до этого проделывали командой <em>step</em>. Теперь, каждый раз выполняя команду <em>continue</em> мы будем оказываться на 12-ой строке, а, благодаря выполненной ранее команде <em>display</em>, мы сможем наблюдать как изменяется значение переменной num на каждом шаге.</p>
<p>Есть и другой способ следить за изменением переменной в ходе работы программы с использованием команды <em>watch</em>. В отличие от команды <em>display</em>, эта команда при каждом изменении переменной, переданной в качестве параметра, будет останавливать выполнение программы и выводить старое и новое значение переменной.</p>
<p>Обе команды <em>display</em> и <em>watch</em> могут в качестве параметра принимать не только переменные, но и выражения.</p>
<p>Продолжим выполнение программы:</p>
<p>
<div class="wp_syntax">
<div class="code">
<pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">continue</span>
Continuing.
<span style="color: #000000;">4</span><span style="color: #000000; font-weight: bold;">!</span> = <span style="color: #000000;">24</span>
&nbsp;
Program exited normally.</pre>
</div>
</div>
<p>Отладчик показал вывод нашей программы, а именно подсчитанный факториал от 4. Последняя строка в выводе отладчика сообщает, что программа завершилась. Отладчик также вывел бы код возврата программы в восьмеричной форме, если бы программа возвращала число, отличное от нуля.</p>
<p>Очень полезной может оказаться команда <em>set variable</em>, которая позволяет изменять значение переменной по ходу выполнения программы:</p>
<p>
<div class="wp_syntax">
<div class="code">
<pre class="bash" style="font-family:monospace;">user<span style="color: #000000; font-weight: bold;">@</span>linux-hn2z:~<span style="color: #000000; font-weight: bold;">/</span>cpp<span style="color: #000000; font-weight: bold;">/&gt;</span> <span style="color: #c20cb9; font-weight: bold;">gdb</span> <span style="color: #660033;">-q</span> fact
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> start <span style="color: #000000;">4</span>
Temporary breakpoint <span style="color: #000000;">1</span> at 0x8048556: <span style="color: #c20cb9; font-weight: bold;">file</span> fact.c, line 17.
Starting program: <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>user<span style="color: #000000; font-weight: bold;">/</span>cpp<span style="color: #000000; font-weight: bold;">/</span>fact <span style="color: #000000;">4</span>
&nbsp;
Temporary breakpoint <span style="color: #000000;">1</span>, main <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">argc</span>=<span style="color: #000000;">2</span>, <span style="color: #007800;">argv</span>=0xbfffef84<span style="color: #7a0874; font-weight: bold;">&#41;</span> at fact.c:<span style="color: #000000;">17</span>
<span style="color: #000000;">17</span>        int a = atoi<span style="color: #7a0874; font-weight: bold;">&#40;</span>argv<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> step
<span style="color: #000000;">18</span>        <span style="color: #7a0874; font-weight: bold;">printf</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">&quot;%d! = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, a, fact<span style="color: #7a0874; font-weight: bold;">&#40;</span>a<span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000; font-weight: bold;">set</span> variable <span style="color: #007800;">a</span>=<span style="color: #000000;">10</span>
<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">gdb</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> c
Continuing.
<span style="color: #000000;">10</span><span style="color: #000000; font-weight: bold;">!</span> = <span style="color: #000000;">3628800</span></pre>
</div>
</div>
<p>В этом примере мы запустили программу с входным параметром — 4, но по ходу выполнения программы мы заменили этот параметр на 10, и программа подсчитала факториал от 10.</p>
<p>Команду <em>set variable</em> можно применять, например, когда вы на каком-то шаге обнаружили, что программа ведет себя не верно, но путем изменения значения переменной можно исправить ситуацию и посмотреть как программа будет вести себя дальше.</p>
<p>В настоящей статье описаны далеко не все <strong>возможности отладчика GDB</strong>. За более подробными руководствами обращайтесь к документации по утилите, кроме того, находясь в отладчике, можно вывести список всех команд и описаний к ним, воспользовавшись командой <em>help</em>.</p>
<p>На этом все. Удачной отладки.</p>
]]></content:encoded>
			<wfw:commentRss>http://job-interview.ru/articles/post/160/feed</wfw:commentRss>
		<slash:comments>639</slash:comments>
		</item>
		<item>
		<title>PHP и HTTP</title>
		<link>http://job-interview.ru/articles/post/86</link>
		<comments>http://job-interview.ru/articles/post/86#comments</comments>
		<pubDate>Mon, 27 Jul 2009 19:00:02 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">/articles/?p=86</guid>
		<description><![CDATA[
В этой статье я постараюсь описать работу с HTTP-запросами в языке программирования PHP.


Очень часто на собеседованиях приходится слышать вопрос:

  Что происходит, когда пользователь в адресной строке браузера, вводит адрес сайта и нажимает enter?
  

Ответ должен звучать примерно так:


Отправляется HTTP-запрос по протоколу TCP/IP на сервер, на котором расположен сайт. Далее программа web-сервер (обычно Apache, [...]]]></description>
			<content:encoded><![CDATA[<p>
В этой статье я постараюсь описать работу с <strong>HTTP-запросами</strong> в языке программирования <strong>PHP</strong>.
</p>
<p>
Очень часто на <em>собеседованиях</em> приходится слышать вопрос:</p>
<blockquote><p>
  Что происходит, когда пользователь в адресной строке браузера, вводит адрес сайта и нажимает enter?
  </p></blockquote>
<p>
Ответ должен звучать примерно так:
</p>
<p>
Отправляется HTTP-запрос по протоколу <em>TCP/IP</em> на сервер, на котором расположен сайт. Далее программа web-сервер (обычно <em>Apache</em>, <em>nginx</em> или <em>lighttpd</em>) принимает этот запрос и в случае, если вызываемый файл — это обычный HTML, то посылает в ответ браузеру свой <strong>HTTP-ответ</strong>, в котором содержится этот <strong>HTML</strong>.
</p>
<p>
Если вызываемый файл — это скрипт, например PHP, то сначала передается управление этому скрипту, который после всех своих операций на выход подает HTML, который web-сервер отсылает HTTP-ответом обратно браузеру.
</p>
<p>
Получив от сервера HTML, браузер его преобразовывает в удобочитаемый вид согласно <a href="http://www.w3.org/" title="стандарт W3C">стандарту W3C</a>, отправляет дополнительные запросы для отображения изображений или flash и пользователь видит содержимое сайта — текст, картинки, flash и т.д.
</p>
<p>
В этой статье я дам подробное описание HTTP-запросов и параметров, которые могут в нем содержаться. Потом представлю реализацию обмена HTTP-запросами посредством языка PHP — мы напишем простой <strong>прокси-сервер</strong>, при обращении к которому он возвращает браузеру страницу сайта, адрес которого был указан в GET-параметре.
</p>
<p><span id="more-86"></span></p>
<p>
Для тех, кто не знает, браузеры обмениваются с серверами HTTP-запросами. Именно за счет этого мы можем переходить по ссылкам, отправлять данные формы и получать на эти действия ответы от сервера.
</p>
<p>
Кстати, очень полезными бывают утилиты, отображающие HTTP-запросы, которые отправляет и получает браузер. Я пользуюсь для этого браузером Mozilla Firefox и утилитой <a title="HttpFox" href="https://addons.mozilla.org/en-US/firefox/addon/6647">HttpFox</a>.
</p>
<p>
Итак, давайте рассмотрим пример.
</p>
<p>
Введем в адресную строку браузера <a href="http://example.com">http://example.com</a> и нажмем enter.
</p>
<p>
В результате браузер отправит HTTP-запрос вида:
</p>
<blockquote>
<pre>
GET / HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.8) Gecko/2009032600 SUSE/3.0.8-1.1.1 Firefox/3.0.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
</pre>
</blockquote>
<p>
В приведенном примере браузер хочет получить индексную страницу сайта example.com.
</p>
<p>
Получив запрос от браузера, web-сервер проверяет в своих настройках что является индексным файлом для сайта example.com.
</p>
<p>
Если это обычный HTML, например файл index.html, то просто возвращается его содержимое.
</p>
<p>При запросе индексной страницы сайта <a href="http://example.com">http://example.com</a> браузер получает от сервера следующий ответ:</p>
<blockquote>
<pre>
HTTP/1.x 200 OK
Date: Tue, 21 Jul 2009 17:09:54 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT
Etag: "b80f4-1b6-80bfd280"
Accept-Ranges: bytes
Content-Length: 438
Connection: close
Content-Type: text/html; charset=UTF-8 

&lt;HTML&gt;
&lt;HEAD&gt;
  &lt;TITLE&gt;Example Web Page&lt;/TITLE&gt;
&lt;/HEAD&gt;
&lt;body&gt;
&lt;p&gt;You have reached this web page by typing &quot;example.com&quot;,
&quot;example.net&quot;,
  or &quot;example.org&quot; into your web browser.&lt;/p&gt;
&lt;p&gt;These domain names are reserved for use in documentation and are not available
  for registration. See &lt;a href="http://www.rfc-editor.org/rfc/rfc2606.txt"&gt;RFC
  2606&lt;/a&gt;, Section 3.&lt;/p&gt;
&lt;/BODY&gt;
&lt;/HTML&gt;
</pre>
</blockquote>
<p>
Обратите внимание на <strong>2 перевода строки</strong> в ответе сервера. Они являются разделением между параметрами ответа и телом сообщения, содержащего html, который и отображается в окне браузера.
</p>
<p>
В случае какого-либо скрипта, сначала происходит выполнение этого скрипта, который возвращает web-серверу HTML. Web-сервер в свою очередь отправляет этот HTML браузеру.
</p>
<p>
Представим себе, что индексной страницей сайта example.com является файл index.php. Web-сервер в этом случае, получив запрос от браузера, сначала передает управление интерпретатору PHP, который выполняет код, содержащийся в этом файле.
</p>
<p>Например, в файле index.php содержался бы следующий код:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'category'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;p&gt;This is a category of example.com&lt;/p&gt;&quot;</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: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;p&gt;This is a main page of example.com&lt;/p&gt;&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>
Если ввести в адресной строке браузера http://example.com?category=1 и нажать enter, то браузер отправит примерно следующий запрос:</p>
<blockquote>
<pre>
GET /index.php?category=1 HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.8) Gecko/2009032600 SUSE/3.0.8-1.1.1 Firefox/3.0.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
</pre>
</blockquote>
<p>
От сервера придет в этом случае следующий ответ:</p>
<blockquote>
<pre>
HTTP/1.x 200 OK
Date: Tue, 21 Jul 2009 17:09:54 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT
Etag: "b80f4-1b6-80bfd280"
Accept-Ranges: bytes
Content-Length: 39
Connection: close
Content-Type: text/html; charset=UTF-8 

&lt;p&gt;This is a category of example.com&lt;p&gt;</pre>
</blockquote>
<p>
Однако, если в адресной строке браузера ввести http://example.com/index.php, то ответ сервера будет таким: </p>
<blockquote><pre>
HTTP/1.x 200 OK
Date: Tue, 21 Jul 2009 17:09:54 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT
Etag: "b80f4-1b6-80bfd280"
Accept-Ranges: bytes
Content-Length: 40
Connection: close
Content-Type: text/html; charset=UTF-8 

&lt;p&gt;This is a main page of example.com&lt;/p&gt;
</pre>
</blockquote>
<p>
С телом запроса думаю все понятно — в нем содержится html, который и отражается в окне браузера. Давайте теперь разберем что же хранится в параметрах запроса браузера и ответа сервера.
</p>
<p>
Начнем с HTTP-запроса, который отправляет браузер.
</p>
<p>
Первая строка &#8211;  это строка запроса. Она содержит следующие поля, разделенные через пробел:</p>
<ul>
<li><strong>Метод запроса</strong>. Может принимать значения: OPTIONS, GET, HEAD, POST, DELETE, TRACE. Целью настоящей статьи не является рассмотрение всех методов. Нам будет достаточно метода GET. Если вы хотите получить описание каждого из методов, то советую обратится к документу <a href="http://www.faqs.org/rfcs/rfc2068.html" title="документ RFC 2068">RFC 2068</a></li>
<li><strong>Запрашиваемый URI</strong> — путь до запрашиваемого ресурса на сервере. Если запрашивается главная страница сайта, то указывается путь до корневого каталога сервера &#8211; «/».</li>
<li>Версия <strong>HTTP-протокола</strong>. В этом поле содержится строка вида: «HTTP/1.1». О различных версиях протокола HTTP также можно прочитать в документе <a href="http://www.faqs.org/rfcs/rfc2068.html" title="документ RFC 2086">RFC 2086</a>.</li>
</ul>
<p>
Далее после строки запроса следуют <strong>HTTP-заголовки</strong>. Описание каждого заголовка начинается с новой строки и представлено в виде:<br />
ЗАГОЛОВОК: ЗНАЧЕНИЕ.
</p>
<p>
Рассмотрим заголовки, которые отсылает браузер в нашем примере.</p>
<ul>
<li><strong>Host</strong>. Значением для этого заголовка должно быть доменное имя и порт запрашиваемого ресурса. Значение представляется в виде:
<p>ДОМЕННОЕ_ИМЯ:ПОРТ</p>
<p>Порт можно не указывать. В этом случае предполагается, что используется порт по умолчанию — в нашем случае это порт 80.</p>
<p>В нашем последнем примере для этого заголовка устанавливается значение example.com, т.е. браузер отправляет запрос на сервер example.com и хочет обратиться к файлу /index.php с переданным GET-параметром category=1.</p>
</li>
<li><strong>User-Agent</strong>. Содержит информацию о клиенте, который инициировал запрос к серверу, а также его программное обеспечение. Значение этого поля описывает ряд компонентов клиента. Оно может быть множественным, где все значения отделены друг от друга через пробел.
<p>В нашем последнем примере значением этого заголовка является:</p>
<p>Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.8) Gecko/2009032600 SUSE/3.0.8-1.1.1 Firefox/3.0.8 </p>
<p>Здесь описываются параметры браузера и операционной системы — браузер Mozilla Firefox 3.0.8, основанный на движке Gecko, операционная система Linux Suse 11.1 оконной системой X11, процессор с архитектурой i686.</p>
<p>Этот заголовок используется для статистических целей.</p>
</li>
<li><strong>Accept</strong>. В этом заголовке клиент передает список форматов, которые допустимы для ответа. Значение этого поля хранит список допустимых форматов, разделенных через запятую. Кроме того, для каждого формата можно указать уровень предпочтения от 0 до 1. Если уровень предпочтения не указан, то он считается равным 1. Значение в этом поле должно соответствовать виду:
<p>ФОРМАТ1[;q=УРОВЕНЬ_ПРЕДПОЧТЕНИЯ1],ФОРМАТ2[;q=УРОВЕНЬ_ПРЕДПОЧТЕНИЯ2]&#8230;</p>
<p>В нашем примере браузер в этом заголовке посылает значение:</p>
<p>text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 </p>
<p>Его можно прочитать следующим образом: браузер предпочитает ответы в форматах text/html, application/xhtml+xml. Если сервер не может послать ответ в этих форматах, то браузер будет ожидать ответ в формате application/xml. Если же и в этом формате сервер не может послать ответ, то браузер примет ответ в любом формате.</p>
</li>
<li><strong>Accept-Language</strong>. Этот заголовок аналогичен заголовку ACCEPT, только здесь браузер сообщает серверу о своих предпочтениях о естественных языках, в которых должен приходить ответ.
<p>В нашем примере значением заголовка является:</p>
<p>ru,en-us;q=0.7,en;q=0.3 </p>
<p>Браузер сообщает серверу, что ждет ответ на русском языке, но также примет ответ на «американском английском» и английском языках.</p>
</li>
<li>
<strong>Accept-Encoding</strong>. Подобен ACCEPT. В этом заголовке браузер указывает какое кодирование к содержимому допустимо в ответе. Кодирование содержимого необходимо для сжатия или других его преобразований.
<p>В нашем примере в ответе для браузера допустимо сжатие программой gzip и механизмом deflate:</p>
<p>gzip,deflate</p>
</li>
<li><strong>Accept-Charset</strong>. Этот заголовок браузер посылает, чтобы сообщить серверу о своих предпочтениях кодировки ответа.
<p>В нашем примере этот заголовок принимает значение:</p>
<p>windows-1251,utf-8;q=0.7,*;q=0.7 </p>
<p>Браузер ждет ответ от сервера в первую очередь в кодировке windows-1251, но также примет ответ в любой кодировке.</p>
</li>
<li><strong>Keep-Alive</strong>. Заголовок Keep-Alive содержит значение, которое означает в течение какого времени в секундах будет удерживаться  соединение. Этот заголовок следует отправлять только в том случае, если заголовок Connection содержит значение keep-alive.
<p>Поддерживается только для протокола  HTTP версии 1.1.</p>
<p>В нашем примере этот заголовок содержит значение 300, т.е. браузер сообщает серверу, что намерен удерживать постоянное соединение с сервером в течение 300 секунд.</p>
</li>
<li>
<strong>Connection</strong>. Информация о проводимом соединении. В нашем примере этот заголовок принимает значение keep-alive, которое говорит серверу о том, что браузер хочет установить постоянное TCP соединение.
<p>До появления постоянных соединений для запроса каждой страницы сайта устанавливалось отдельное соединение. Открытие каждый раз отдельного соединения требует дополнительной нагрузки на сервер.</p>
<p>Например, браузер может запрашивать какую-то страницу с изображениями. После получения HTML страницы ему нужно будет запросить с сервера каждое изображение. При каждом запросе изображения будет открываться отдельное TCP соединение, что приведет к дополнительной нагрузке.</p>
<p>Использование постоянных соединений решает эту проблему. Если обе стороны (клиент и сервер) их поддерживают, то, в случае приведенного примера, HTML страницы и каждое изображение могут быть получены за одно TCP соединение.</p>
<p>Заголовок Connection поддерживается только для протокола  HTTP версии 1.1.</p>
<p>Этот заголовок также может принимать значение close. В этом случае клиент сообщит серверу, что после принятия HTTP-запроса соединение должно быть разорвано.</p>
</li>
</ul>
<p>
А теперь давайте рассмотрим параметры <strong>HTTP-ответа</strong>, который отправляет сервер браузеру.
</p>
<p>
Первая строка — это <strong>строка состояния</strong>, которая состоит из следующих полей, разделенных пробелом:
</p>
<ul>
<li><strong>Версия протокола HTTP</strong>. В нашем ответе от сервера в этом поле содержится HTTP/1.x. Сервер поддерживает протоколы HTTP 1.0 и 1.1.</li>
<li>Код состояния ответа. С возможными кодами состояния можно ознакомиться в документе <a href="http://www.faqs.org/rfcs/rfc2068.html" title="документ RFC 2068">RFC 2068</a>. В нашем случае от сервера нам необходим код состояния ответа, равный 200, который означат, что запрос браузера был выполнен удачно.</li>
<li><strong>Комментарий</strong>. Комментарий для кода состояния. Если код состояния 200, то комментарий будет «OK».</li>
</ul>
<p>
За строкой состояния следуют HTTP-заголовки, каждый начинается с новой строки. В нашем примере сервер отсылает следующие HTTP-заголовки:
</p>
<ul>
<li>
<p>
<strong>Date</strong>. В этом заголовке хранится дата в формате <a href="http://www.faqs.org/rfcs/rfc822.html" title="документ RFC 822">RFC 822</a>, описывающее когда отправляемый ответ был сгенерирован. Но это теория, на практике значением этого заголовка может быть любое время.
</p>
<p>В нашем примере в этом заголовке содержится:</p>
<p>Tue, 21 Jul 2009 17:09:54 GMT.</p>
</li>
<li>
<p>
<strong>Server</strong>. В этом заголовке содержится информация о программном обеспечении, которое используется на сервере, а также его компонентах. Если ответ от сервера направляется через proxy, то используется заголовок «Via».
</p>
<p>В ответе от сервере на наш запрос содержится следующее:</p>
<p>Apache/2.2.3 (CentOS)</p>
<p>Это означает, что на сервере используется web-сервер Apache версии 2.2.3. В качестве операционной системы используется дистрибутив Linux CentOS.</p>
</li>
<li>
<p>
<strong>Last-Modified</strong>. В этом заголовке сервер сообщает дату последнего изменения какой-либо сущности — файла, базы данных и т.п. В нашем случае сервер отправляет дату последнего изменения файла index.php.</p>
<p>Этот заголовок важен для браузера при использовании механизма кеширования. При обращении к какой-либо странице браузер кеширует ее. При повторном обращении к этой странице браузер, основываясь на заголовке Last-Modified проверит не устарела ли страница, сохраненная в кеше. Если нет, то браузер не будет еще раз считывать данные, а выведет страницу из кеша.</p>
<p>В ответе сервера из нашего примера в этом заголовке хранится:</p>
<p>Tue, 15 Nov 2005 13:24:10 GMT</p>
</li>
<li>
<p>
<strong>Etag</strong>. В этом заголовке содержится метка объекта ресурса. В нашем случае в качестве объекта выступает файл index.php.
</p>
<p>Наряду с заголовком Last-Modified значение этого заголовка используется при кешировании браузером. При первом запросе страницы браузер сохраняет значение Etag для страницы. При повторном запросе страницы значение Etag, которое пришло от сервера, сравнивается с тем, которое хранится в кеше браузера. Если они равны, то браузеру нет смысла считывать еще раз данные страницы, он просто возьмет их из кеша.</p>
<p>В нашем примере в ответе сервера Etag имеет следующее значение:</p>
<p>&#8220;b80f4-1b6-80bfd280&#8243;</p>
</li>
<li>
<p>
<strong>Accept-Ranges</strong>. Этот заголовок сообщает клиенту о том, что он может запрашивать данные с сервера фрагментами, указывая их смещение в байтах.
</p>
<p>Используется для реализации скачивания файлов с докачкой.</p>
<p>В нашем примере сервер поддерживает эту возможность, о чем он и сообщает, передав в заголовке Accept-Ranges значение bytes.</p>
<p>Зная эту возможность, браузер может передать серверу смещение в байтах, с которого необходимо начать передачу файла. Для этого браузер посылает заголовок Range с параметром bytes, значение которого и является смещением в байтах. Например:</p>
<p>Range: bytes=2048</p>
<p>Этот заголовок означает, что браузер запросил у сервера содержимое файла, начиная с 2-го мегабайта.</p>
</li>
<li>
<p>
Content-Length. Этот заголовок содержит размер тела HTTP-ответа сервера.<br />
В нашем примере размер тела сообщения 40.
</p>
</li>
<li>
<p>
<strong>Connection</strong>. Как и в случае для клиента, этот заголовок предоставляет информацию о проводимом соединении. В нашем примере этот заголовок принимает значение close, которое говорит клиенту о том, что сервер либо не поддерживает постоянное TCP соединение, либо он просто отказывает браузеру в постоянном соединении.
</p>
</li>
<li>
<p>
<strong>Content-Type</strong>. В этом заголовке содержится формат тела HTTP-ответа сервера.
</p>
<p>В нашем примере в этом заголовке содержится:</p>
<p>text/html; charset=UTF-8</p>
<p>Это означает, что сервер отвечает браузеру данными в формате text/html и кодировке UTF-8.</p>
<p>В этом заголовке сервера также может храниться, например, «text/css; charset=utf-8» при ответе браузеру на запрос файла CSS. Или, например, может храниться «image/gif» при ответе браузеру на запрос GIF-изображения.</p>
<p>О других форматах тела сообщения в ответах сервера читайте в <a href="http://www.faqs.org/rfcs/rfc822.html" title="документ RFC 822">RFC 822</a>.</p>
</li>
</ul>
<p>
После HTTP—заголовков в ответе сервера содержится 2 перевода строки, за которыми следует само тело сообщения. 2 перевода строки служат разделением между параметрами ответа сервера и телом сообщения, в котором содержится html, отображаемый браузером.
</p>
<p>
В нашем примере в теле сообщения ответа от сервера содержится:</p>
<blockquote><p>
  &lt;p&gt;This is a main page of example.com&lt;/p&gt;
  </p></blockquote>
<p>
Ну а теперь напишем простой <strong>прокси-сервер на PHP</strong>, который покажет практическое использование упомянутых HTTP-заголовков.
</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;">$body</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// доменное имя передаем в GET-параметре $_GET['host']</span>
<span style="color: #000088;">$host</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'host'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// открываем сокет на стандартном для HTTP порту 80</span>
<span style="color: #000088;">$hSocket</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fsockopen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$host</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">80</span><span style="color: #339933;">,</span> <span style="color: #000088;">$errno</span><span style="color: #339933;">,</span> <span style="color: #000088;">$errstr</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">30</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;">$hSocket</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// первой строкой идет строка запроса</span>
    <span style="color: #000088;">$request</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;GET / HTTP/1.1<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// указываем доменное имя</span>
    <span style="color: #000088;">$request</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;Host: <span style="color: #006699; font-weight: bold;">$host</span><span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span> 
     <span style="color: #666666; font-style: italic;">// пусть мы будем для сервера браузером Mozilla Firefox</span>
    <span style="color: #000088;">$request</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.8) Gecko/2009032600 SUSE/3.0.8-1.1.1 Firefox/3.0.<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// указываем форматы, в которых будем ожидать ответ от сервера</span>
    <span style="color: #000088;">$request</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span> 
    <span style="color: #666666; font-style: italic;">// языки, на которых ожидаем ответ</span>
    <span style="color: #000088;">$request</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;Accept-Language: ru,en-us;q=0.7,en;q=0.3<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span> 
    <span style="color: #666666; font-style: italic;">// указываем какое кодирование к содержимому допустимо в ответе. </span>
    <span style="color: #666666; font-style: italic;">//Только в этом случае нужно будет раскодировать содержимое.</span>
    <span style="color: #666666; font-style: italic;">//$request .= &quot;Accept-Encoding: gzip,deflate\r\n&quot;; </span>
    <span style="color: #666666; font-style: italic;">// выставляем предпочтения для кодировок ответа</span>
    <span style="color: #000088;">$request</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span> 
    <span style="color: #666666; font-style: italic;">// будем удерживать постоянное соединение в течение 300 секунд</span>
    <span style="color: #000088;">$request</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;Keep-Alive: 300<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// открываем постоянное соединение</span>
    <span style="color: #666666; font-style: italic;">// здесь мы завершаем передачу HTTP-заголовков, </span>
    <span style="color: #666666; font-style: italic;">// поэтому в конце обязательно указываем 2 перевода строки</span>
    <span style="color: #000088;">$request</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;Connection: keep-alive<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span> 
    <span style="color: #666666; font-style: italic;">// посылаем HTTP-заголовки через открытый сокет</span>
    <span style="color: #990000;">fwrite</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$hSocket</span><span style="color: #339933;">,</span> <span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
    <span style="color: #666666; font-style: italic;">// флаг, указывающий на то, что считывается тело запроса</span>
    <span style="color: #000088;">$bIsData</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span> 
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">feof</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$hSocket</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// считываем ответ от сервера</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$str</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fgets</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$hSocket</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">128</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: #000088;">$bIsData</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$body</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$str</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// тело запроса записываем в переменную $body</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #666666; font-style: italic;">// встретилась строка, содержащая только перевод строки, это означает, </span>
        <span style="color: #666666; font-style: italic;">//что дальше пойдет тело запроса</span>
        <span style="color: #b1b100;">elseif</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span> 
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$bIsData</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #990000;">fclose</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$hSocket</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// закрываем сокет</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// указываем на то, чтобы web-сервер отправил браузеру заголовки </span>
    <span style="color: #666666; font-style: italic;">// Last-Modified, Connection и Keep-alive</span>
    <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Last-Modified: Tue, 21 Jul 2009 17:09:54 GMT&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Connection: Keep-Alive&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//</span>
    <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Keep-Alive: timeout=30, max=100&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// передаем тело запроса</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$body</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// работа php-скрипта закончена, теперь web-сервер отправляет ответ браузеру</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Чтобы отправить заголовки серверу, необходимо сначала открыть сокет. <strong>Сокет</strong> — это программный интерфейс, который позволяет обмениваться данными между процессами. При этом процессы могут выполняться на разных компьютерах, связанных сетью.
</p>
<p>
В нашем случае один процесс — это процесс браузера, второй — это процесс web-сервера, запущенный на удаленном компьютере.
</p>
<p>
В PHP сокет открывается функцией <a href="http://ru.php.net/fsockopen" title="функция PHP fsockopen">fsockopen</a>. Далее в переменную $request мы записываем все нужные нам заголовки и отправляем их серверу функцией <a href="http://ru.php.net/fwrite" title="функция PHP fwrite">fwrite</a>. После этого мы построчно считываем ответ сервера пока не будет достигнут конец данных (<a href="http://ru.php.net/feof" title="функция PHP feof">feof</a>). После получения ответа мы отправляем этот ответ браузеру вместе с заголовками, которые в PHP выставляются функцией <a href="http://ru.php.net/header" title="функция PHP header">header</a>.
</p>
<p>
Этот скрипт принимает через GET-параметр доменное имя сайта и отправляет к нему HTTP-запрос, считывает ответ и отдает этот ответ web-серверу, который отправляет его браузеру.
</p>
<p>
При помощи подобного скрипта вы можете сами поиграться с отправляемыми HTTP-запросами.
</p>
<p>
Нам этом все. Спасибо за внимание.
</p>
<p>
Для тех, кто заинтересовался и хочет подробнее изучить <strong>HTTP</strong> могу посоветовать следующие ссылки:
</p>
<p>
<a href="http://ru.wikipedia.org/wiki/HTTP" title="статья, подробно описывающая HTTP">http://ru.wikipedia.org/wiki/HTTP</a> &#8211; статья, подробно описывающая HTTP.
</p>
<p>
<a href="http://www.faqs.org/rfcs/rfc2068.html" title="документ RFC 2068">http://www.faqs.org/rfcs/rfc2068.html</a> &#8211; документ RFC 2068.</p>
]]></content:encoded>
			<wfw:commentRss>http://job-interview.ru/articles/post/86/feed</wfw:commentRss>
		<slash:comments>5546</slash:comments>
		</item>
		<item>
		<title>Добро пожаловать на сайт, посвященный поиску работы для программистов.</title>
		<link>http://job-interview.ru/articles/post/1</link>
		<comments>http://job-interview.ru/articles/post/1#comments</comments>
		<pubDate>Mon, 15 Jun 2009 14:12:35 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[Проект Job-Interview.ru]]></category>
		<category><![CDATA[job-interview.ru]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[проект]]></category>

		<guid isPermaLink="false">http://jo-in.ru/blog/?p=1</guid>
		<description><![CDATA[Предполагаемая аудитория &#8211; это люди, занимающиеся web-разработками, системным программированием и всем тем, что связано с IT.
Нашей целью является объединить людей этой профессии для оказания помощи друг другу в прохождении собеседования, составлении резюме, накоплении знаний. 
В разделе &#8220;Вопросы на собеседовании&#8221; мы будем выкладывать самые распространенные вопросы, которые задает работодатель соискателю, откликнувшемуся на его вакансию программиста. Раздел [...]]]></description>
			<content:encoded><![CDATA[<p>Предполагаемая аудитория &#8211; это люди, занимающиеся <em>web-разработками</em>, <em>системным программированием</em> и всем тем, что связано с <em>IT</em>.</p>
<p>Нашей целью является объединить людей этой профессии для оказания помощи друг другу в <strong>прохождении собеседования</strong>, составлении резюме, накоплении знаний. </p>
<p>В разделе <a href="/questions/" title="Вопросы на собеседовании для программистов">&#8220;Вопросы на собеседовании&#8221;</a> мы будем выкладывать самые распространенные вопросы, которые задает работодатель соискателю, откликнувшемуся на его вакансию программиста. Раздел будет постоянно пополняться, сейчас в нем можно найти вопросы по <a href="/questions/php" title="Вопросы на собеседовании по PHP">PHP</a>, <a href="/questions/cpp" title="Вопросы на собеседовании по C++">C++</a>, <a href="/questions/dotnet" title="Вопросы на собеседовании по .NET">.NET</a> и <a href="/questions/database" title="Вопросы на собеседовании по базам данных">базам данных</a>.</p>
<p>В разделе <a href="/vacancy/" title="Вакансии для программистов">&#8220;Вакансии&#8221;</a> вы сможете найти самые свежие объявления от работодателей для программистов. Раздел обновляется несколько раз в день.</p>
<p>Мы также предлагаем вам проверить свои знания, посетив раздел <a href="/test/" title="Тесты для программистов">&#8220;Тесты&#8221;</a>. Зарегистрированные пользователи при желании могут <strong>разместить свой тест</strong>, который им предлагали пройти на собеседовании, а затем в личном кабинете следить за статистикой прохождения теста другими пользователями сайта.</p>
<p>В разделе <a href="/books/">&#8220;Книги&#8221;</a> собраны <strong>книги для программистов</strong>. Здесь можно найти литературу по самым разным IT-тематикам: <em>устройство компьютера</em> и <em>работа с &#8220;железом&#8221;</em>, <em>языки программирования</em> и <em>алгоритмы</em>, <em>компьютерные сети</em>, а также многое другое. </p>
<p>Если вы опытный <strong>программист</strong>:</p>
<div style="padding-left: 10px">На нашем сайте вы можете рассказывать о своем опыте прохождения собеседований, выкладывать различные <em>вопросы</em>, на которые вам приходилось отвечать, а также делиться знаниями с пока менее продвинутыми коллегами. Для этого в разделе <a href="/articles">&#8220;Статьи&#8221;</a> мы предлагаем вам выкладывать свои соображения по всем вышеперечисленным вопросам.</div>
<p>Если вы начинающий <strong>программист</strong>:</p>
<div style="padding-left: 10px">Вы получаете возможность общаться и набираться знаний. Задавайте свои вопросы и советуйтесь с теми, кто уже сталкивался с вашими проблемами.</div>
<p>
Итак, </p>
<ul>
<li>если вы готовитесь к собеседованию или вам просто интересно узнать о самых распространенных <strong>вопросах на собеседовании</strong>, то вам <a href="/questions/">сюда</a>.</li>
<li>если вы в поисках работы, то посетите раздел <a href="/vacancy/" title="Вакансии для программистов">Вакансии для программистов</a>, в котором всегда самые свежие предложения от работодателей.</li>
<li>если вам есть, что рассказать, или вы хотели бы получить ответ на какой-либо вопрос от более опытных коллег, вам <a href="/articles">сюда</a>.  Вы также можете <strong>разместить свою статью</strong>, для этого необходимо будет пройти простую процедуру <a href="/articles/login?action=register">регистрации</a>.</li>
<li>если вы хотите проверить свои знания, то вам в раздел <a href="/test/" title="Тесты для программистов">Тесты для программистов</a>.</li>
</ul>
<p>
Присоединяйтесь к нашей <a target="_blank" href="http://vkontakte.ru/club17930164" rel="external nofollow">группе Вконтакте</a>.<br />
<a target="_blank" href="http://vkontakte.ru/club17930164" rel="external nofollow"><br />
<img border="0" src="/img/vkontakte.jpg"><br />
</a>
</p>
<p>Следите за нашими вакансиями в <a title="Следите за нашими вакансиями в Twitter" rel="external nofollow" href="http://twitter.com/jobinterview_ru" target="_blank">Twitter</a> <a title="Следите за нашими вакансиями в Twitter" rel="external nofollow" href="http://twitter.com/jobinterview_ru" target="_blank" style="text-decoration: none;">&nbsp;<img border="0" src="/img/Twitter_32x32.png"></a></p>
<p>Желаем удачи,<br />
 Команда Job-Interview.ru</p>
]]></content:encoded>
			<wfw:commentRss>http://job-interview.ru/articles/post/1/feed</wfw:commentRss>
		<slash:comments>8328</slash:comments>
		</item>
	</channel>
</rss>
