<?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://mr-ozio.ru/c/dev/feed" rel="self" type="application/rss+xml" />
	<link>http://mr-ozio.ru</link>
	<description>Привет! Меня зовут Николай Соловьёв, этот блог я создал чтобы делится своим опытом и просто рассказывать о своих открытиях в разных областях своих увлечений.</description>
	<lastBuildDate>Mon, 19 Jul 2010 10:10:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>DreamSpark и MSDN Academic Alliance для студентов</title>
		<link>http://mr-ozio.ru/269</link>
		<comments>http://mr-ozio.ru/269#comments</comments>
		<pubDate>Mon, 29 Mar 2010 07:13:41 +0000</pubDate>
		<dc:creator>mr.ozio</dc:creator>
				<category><![CDATA[Программинг]]></category>
		<category><![CDATA[Dreamspark]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[MSDN Academic Alliance]]></category>
		<category><![CDATA[софт]]></category>

		<guid isPermaLink="false">http://mr-ozio.ru/?p=269</guid>
		<description><![CDATA[У меня есть один такой принцип &#8211; я пользуюсь только тем ломаным софтом который мне действительно необходим и который я действительно не имею возможности купить, однако пользуюсь я этим софтом как бы в долг, т.е. когда у меня появится возможность &#8211; я обязательно этот софт приобрету. Часто приходится стоять на перепутье &#8211; скачать ломаную версию [...]]]></description>
			<content:encoded><![CDATA[<p>У меня есть один такой принцип &#8211; я пользуюсь только тем ломаным софтом который мне действительно необходим и который я действительно не имею возможности купить, однако пользуюсь я этим софтом как бы в долг, т.е. когда у меня появится возможность &#8211; я обязательно этот софт приобрету.</p>
<p>Часто приходится стоять на перепутье &#8211; скачать ломаную версию или выбрать бесплатную альтернативу. И каждый раз когда я выбираю второй вариант &#8211; это победа и я ей искренне радуюсь. Так было, например, при выборе ftp-клиента (сменил CuteFTP на FileZilla), офисного пакета (MS Office на OpenOffice).</p>
<p>Некоторые компании осознают, что есть такие ситуации, когда их программный продукт действительно востребован, однако не доступен для немалой части целевой аудитории, что толкает эту аудиторию нарушать законодательство.</p>
<p>Отчасти именно из-за этого понимания я и полюбил компанию Microsoft, которая позволила мне, как студенту технического вуза без какой-либо платы установить профессиональный лицензионный софт, которым я с радостью пользуюсь.</p>
<h3><a href="http://msdn.microsoft.com/ru-ru/academic/default.aspx" target="_blank">MSDN Academic Alliance</a></h3>
<p>По этой программе Microsoft подарил мне безвременные лицензии на профессиональные редакции Windows 7 и Visual Studio 2008. Помимо них по программе доступен просто необъятный список продуктов, включая </p>
<ul>
<li>Windows Server 2008 R2, </li>
<li>Microsoft SQL Server 2008 (различных редакций),</li>
<li>Visual Studio 2008 (различных редакций), </li>
<li>Microsoft Robotics Developer Studio 2008 R2, </li>
<li>Microsoft CCR and DSS Toolkit 2008 R2, </li>
<li>XNA Game Studio 3, </li>
<li>Microsoft Surface SDK, </li>
<li>Access 2007, </li>
<li>InfoPath 2007, </li>
<li>OneNote 2007, </li>
<li>Project 2007, </li>
<li>Office SharePoint Server 2007</li>
</ul>
<p>Да, MS Office тут не дают :)</p>
<p>Ищите у себя в ВУЗе объявления и спрашивайте у преподавателей что они знают об этой программе. Вся информация <a href="http://msdn.microsoft.com/ru-ru/academic/default.aspx">здесь</a>.</p>
<p>Чтобы участвовать в программе необходимо было всего лишь составить список студентов группы которые хотели участвовать в этой программе, напротив имени написать номер зачёток и отнести эту бумажку в некий кабинет в ректорате. После чего нужно было просто зарегистрироваться на сайте msdnaa под своим именем и указав номер зачётки.</p>
<h3><a href="http://www.dreamspark.ru/" target="_blank">Microsoft DreamSpark</a></h3>
<p>Если честно, я сам не очень понимаю в чём эта программа отлична от msdnaa, однако здесь требуется только скан собственного студака (правда почему-то максимальный размер скана который можно им отправить &#8211; что-то в районе 50кбайт).</p>
<p>По этой программе можно получить тоже самое что и в msdnaa, однако помимо этого есть ещё и Expression Studio 3, Windows Embedded CE 6.0, Visual Studio 2010 Ultimate Beta 2, Microsoft Virtual PC и всяческие утилиты для разработки под Windows Phone.</p>
<p>Вся информация о программе <a href="http://www.dreamspark.ru/">здесь</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://mr-ozio.ru/269/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Статистика сайта в Jabber</title>
		<link>http://mr-ozio.ru/179</link>
		<comments>http://mr-ozio.ru/179#comments</comments>
		<pubDate>Sun, 26 Jul 2009 19:30:26 +0000</pubDate>
		<dc:creator>mr.ozio</dc:creator>
				<category><![CDATA[Программинг]]></category>
		<category><![CDATA[jabber]]></category>
		<category><![CDATA[jabber.ru]]></category>
		<category><![CDATA[xmphp]]></category>
		<category><![CDATA[xmpp]]></category>
		<category><![CDATA[статистика]]></category>

		<guid isPermaLink="false">http://mr-ozio.ru/?p=179</guid>
		<description><![CDATA[Обещаный пост про то как я организовал доставку статистики сайта прямо в мессенджер. В данном конкретном случае меня интересовало с какого поисковика и по какому запросу пришел посетитель. Ведь одно дело если мы смотрим статистику по прошествии какого-то времени, а совсем другое когда мы можем её оценивать в реальном времени. Ничего особо сложного в решении [...]]]></description>
			<content:encoded><![CDATA[<p>Обещаный пост про то как я организовал доставку статистики сайта прямо в мессенджер. В данном конкретном случае меня интересовало с какого поисковика и по какому запросу пришел посетитель. Ведь одно дело если мы смотрим статистику по прошествии какого-то времени, а совсем другое когда мы можем её оценивать в реальном времени.</p>
<p>Ничего особо сложного в решении поставленной задачи нету, но тем не менее и написать обещал, и в твиттере уже есть как минимум 1 человек которому интересно, да и когда объясняешь много нового сам узнаёшь.</p>
<p>Нам необходимо написать 2 основных части. Первая — определение поисковика и запроса, вторая — отправка в джаббер. Язык у нас, естественно PHP.</p>
<h3>Часть 1. Обработка суперглобального массива $_SERVER['HTTP_REFERER']</h3>
<p>Вся информация о поисковике и запросе хранится в суперглобальной переменной $_SERVER['HTTP_REFERER']. При переходе с поискового сервиса выглядит примерно так: http://yandex.ru/yandsearch?text=%D0%BE%D0%B7%D0%B8%D0%BE&#038;stpar2=%2Fh1%2Ftm8%2Fs1&#038;stpar4=%2Fs1&#038;stpar1=%2Fu0.</p>
<p>Для того что бы отсеять те случаи когда человек приходит не с поисковика и не нагружать сервер лишний раз я решил соорудить проверку на наличие запроса после адреса.</p>
<pre class="brush:php">
// кладём суперглобальную переменную в обычную, чтоб удобней работать было
$url = $_SERVER['HTTP_REFERER'];
// parse_url – разбиваем запрос на составляющие и отправляем в массив $complete
// urldecode – декодируем символы «%D0%BE%D0%B7%» в человеко-разумный вид
// trim – чистим содержимое от лишних пробелов и прочей пакости
$complete = parse_url(urldecode(trim($url)));
/* после всего колдовства массив $complete выглядит у нас примерно так:

Array
(
    [scheme] => http
    [host] => yandex.ru
    [path] => /yandsearch
    [query] => text=озио&#038;stpar2=/h1/tm8/s1&#038;stpar4=/s1&#038;stpar1=/u0
)

*/
// выполняем остальной код только при наличии элемента query
if ($complete['query'] != '') {

parse_str($complete['query'], $output);</pre>
<p>Тем самым мы не просто осуществили проверку на поисковость запроса, но и убили лишнего зайца выполнив часть кода необходимого в дальнейшем.</p>
<p>Теперь когда мы имеем разложенный по полочкам URL в массиве $complete всё значительно упрощается. Ну и для удобства мы точно также раскладываем по элементам содержимое элемента query, что бы иметь сам поисковый запрос отдельной переменной. А после уже начинаем проверку на поисковик.</p>
<p>Ну и после того как мы отпарсили элемент $complete['query'] мы имеем свой элемент массива с ключевой фразой. В зависимости от поисковика элемент имеет своё название, например на Яндексе ключевая фраза передаётся в переменной text, значит и элемент массива у нас называется $output['text'].</p>
<pre class="brush:php">// функция eregi ищет в переменной $url слово 'yandex', если есть, то исполняется if
if (eregi('yandex', $url)) {

echo 'Вы пришли с Яндекса по запросу '.$output['text'];

}</pre>
<p>Точно таким же образом с помощью elseif проверяем на причастность запроса к остальным поисковикам. Кстати, тут встретил такую малюсенькую тонкость — помимо обычного поиска Яндекса есть ведь ещё и Яндекс.Блоги и Яндекс.Картинки и всякое такое. Что бы их отловить надо использовать if с условием eregi(&#8216;blogs.yandex&#8217;, $url), что, впрочем, логично.</p>
<h3>Часть 2. Отправка сообщений в мессенджер с помощью фрэймворка xmphp.</h3>
<p>Да-да, фрэймворка. Ну нафиг мне нужно рыться в спецификации xmpp если колесо давно изобретено?</p>
<p>Выбор фрэймворка был очень прост. На сайте <a href="http://xmpp.org">xmpp.org</a> он оказался единственным, без проблем позволяющим отправлять сообщения, написав всего пару строчек кода. Хотя, конечно, с ним тоже пришлось повозиться.</p>
<p>Во-первых, он не захотел работать со специально зарегистрированным мной ботом на gmail, хотя судя по примерам со страницы проекта gmail — стандарт. В общем благо проблем с Jabber-серверами у нас нету и я зарегистрировал бота на jabber.ru.</p>
<p>Во-вторых, возникла проблема с кодом, нашлась функция, которую текущая версия php определяла как не существующую вовсе, благо функция была задействована в выводе лога при отладке, так-что я просто её закомментарил и никаких проблем тут не возникло.</p>
<p>Ну и в-третьих, скрипт отказывался работать с включённым SSL/TLS шифрованием.</p>
<p>Всё что нужно для того чтобы фрэймворк заработал — надо закачать на сайт папку XMPPHP и прописать на странице пару строчек кода.</p>
<pre class="brush:php">include ‘XMPPHP/XMPP.php’;

$conn = new XMPPHP_XMPP('allports.jabber.ru', 443, 'логин', 'пароль', 'xmpphp', 'jabber.ru', $printlog=false, $loglevel=XMPPHP_Log::LEVEL_INFO);
try
{
	$conn->connect();
	$conn->use_encryption = false;
	$conn->processUntil('session_start');
	$conn->presence();
	$conn->message('mr_ozio@livejournal.com', $output[text]."\n---\nЯндекс\n$doc_url");
	$conn->disconnect();
} catch(XMPPHP_Exception $e) {
	die($e->getMessage());
}</pre>
<p>Тут дальше есть несколько вариантов. Вполне логично было бы вынести отправление в отдельный класс, но я как обычно решил всё упростить (или усложнить, тут с какой стороны посмотреть) и добавил в проверку по каждому поисковику.</p>
<p>Вот и всё. </p>
<p>А <a href="http://mr-ozio.ru/wp-content/uploads/2009/07/oziobot.png">вот так</a> это сегодня смотрелось в моём Pidgin&#8217;е.</p>
]]></content:encoded>
			<wfw:commentRss>http://mr-ozio.ru/179/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
