<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>ALLDev</title>
		<link>http://alldev.perm.ru/</link>
		<description>Блог</description>
		<lastBuildDate>Sat, 10 Nov 2012 09:10:52 GMT</lastBuildDate>
		<generator>uCoz Web-Service</generator>
		<atom:link href="https://alldev.perm.ru/blog/rss" rel="self" type="application/rss+xml" />
		
		<item>
			<title>Десять правил спокойной разработки</title>
			<description>&lt;h4&gt;Введение&lt;/h4&gt;&lt;br&gt;
Современный темп разработки ПО просто поражает своей скоростью. 
Функционал всегда «нужен вчера». Зачем? Конкуренция — обойдут, обгонят. 
Времени тестировать нет, надо отгружать функционал, надо, надо, надо.&lt;br&gt;
&lt;br&gt;
На помощь командам разработки приходят практики, методологии, подходы и 
четкие регламенты. Попробую сформулировать в виде десяти правил 
концепцию «спокойной» разработки. А она то вынудит использовать 
современные методологии разработки ПО. И заказчик спокоен, и нервы свои 
целы. Profit!&lt;br&gt;
&lt;a name=&quot;habracut&quot;&gt;&lt;/a&gt;&lt;br&gt;
&lt;h4&gt;Проблема&lt;/h4&gt;&lt;br&gt;
В фильме &lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%9F%D0%B8%D1%80%D0%B0%D1%82%D1%8B_%D0%A1%D0%B8%D0%BB%D0%B8%D0%BA%D0%BE%D0%BD%D0%BE%D0%B2%D0%BE%D0%B9_%D0%B4%D0%BE%D0%BB%D0%B8%D0%BD%D1%8B_%28%D1%84%D0%B8%D0%BB%D1%8C%D0%BC%29&quot;&gt;«Пираты силиконовой долины»&lt;/a&gt;
 хорошо показаны замученные длительным марафоном разработчики Apple. А 
код уставшего разработчика часто не приятен даже ему самому на следующий
 день. Вывод —...</description>
			<content:encoded>&lt;h4&gt;Введение&lt;/h4&gt;&lt;br&gt;
Современный темп разработки ПО просто поражает своей скоростью. 
Функционал всегда «нужен вчера». Зачем? Конкуренция — обойдут, обгонят. 
Времени тестировать нет, надо отгружать функционал, надо, надо, надо.&lt;br&gt;
&lt;br&gt;
На помощь командам разработки приходят практики, методологии, подходы и 
четкие регламенты. Попробую сформулировать в виде десяти правил 
концепцию «спокойной» разработки. А она то вынудит использовать 
современные методологии разработки ПО. И заказчик спокоен, и нервы свои 
целы. Profit!&lt;br&gt;
&lt;a name=&quot;habracut&quot;&gt;&lt;/a&gt;&lt;br&gt;
&lt;h4&gt;Проблема&lt;/h4&gt;&lt;br&gt;
В фильме &lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%9F%D0%B8%D1%80%D0%B0%D1%82%D1%8B_%D0%A1%D0%B8%D0%BB%D0%B8%D0%BA%D0%BE%D0%BD%D0%BE%D0%B2%D0%BE%D0%B9_%D0%B4%D0%BE%D0%BB%D0%B8%D0%BD%D1%8B_%28%D1%84%D0%B8%D0%BB%D1%8C%D0%BC%29&quot;&gt;«Пираты силиконовой долины»&lt;/a&gt;
 хорошо показаны замученные длительным марафоном разработчики Apple. А 
код уставшего разработчика часто не приятен даже ему самому на следующий
 день. Вывод — не писать уставший код. Да и производительность оставляет
 желать лучшего.&lt;br&gt;
&lt;br&gt;
Но требования постоянно меняются, горизонты продукта размыты, заказчик 
не может внятно объяснить, что хочет. Для таких случаев и придумали &lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%93%D0%B8%D0%B1%D0%BA%D0%B0%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8&quot;&gt;Agile&lt;/a&gt;.
 Все родственные методологии позволяют гибко подстраиваться под 
изменяющиеся требования заказчика и выдерживать должный темп разработки 
без ущерба здоровью команды.&lt;br&gt;
&lt;br&gt;
Перейдем к правилам «спокойной» разработки.&lt;br&gt;
&lt;br&gt;
&lt;h4&gt;Правила&lt;/h4&gt;&lt;br&gt;
&lt;ol&gt;&lt;li&gt;&lt;b&gt;Срочных задач не бывает, бывают приоритеты&lt;/b&gt;&lt;br&gt;
Если задача имеет фатальный приоритет, то о ней надо было думать еще 
неделю назад. Явная ошибка планирования. Либо был проигнорирован пункт 9
 и «хомяк» грозится откусить пол руки;&lt;br&gt;
&lt;/li&gt;&lt;li&gt;&lt;b&gt;Приступай к задаче после полного ее понимания&lt;/b&gt;&lt;br&gt;
Типичная ошибка в больших системах. Что-то сделал, как-то проверил, получил нечто;&lt;br&gt;
&lt;/li&gt;&lt;li&gt;&lt;b&gt;Наладь диалог с заказчиком&lt;/b&gt;&lt;br&gt;
В любом проекте приходится искать компромиссы, расставлять приоритеты. Найти общий язык с заказчиком дорогого стоит;&lt;br&gt;
&lt;/li&gt;&lt;li&gt;&lt;b&gt;Руководствуйся ТЗ&lt;/b&gt;&lt;br&gt;
ТЗ будет идеальным при использовании пункта 3, поэтому проблем быть не 
должно. А если функционального элемента нет, то и делать его не надо;&lt;br&gt;
&lt;/li&gt;&lt;li&gt;&lt;b&gt;Используй только проверенный код&lt;/b&gt;&lt;br&gt;
Любой код должен проходить серьезный цикл проверки перед поставкой 
заказчику. Любые сторонние модули должны быть покрыты тестовым кодом и 
хорошо проверены. Свой код надо проверять в обязательном порядке, без 
исключений;&lt;br&gt;
&lt;/li&gt;&lt;li&gt;&lt;b&gt;Рабочий день 8 часов&lt;/b&gt;&lt;br&gt;
Очень полезный пункт. Порой надо себе об этом напоминать. Семья тоже 
требует внимания, да и здоровье свое надо беречь. Если не хватает 
времени, то смотри пункт 1.&lt;br&gt;
&lt;/li&gt;&lt;li&gt;&lt;b&gt;Пиши документацию&lt;/b&gt;&lt;br&gt;
Без документации нет функционала. К тому же, она экономит уйму времени, 
потому что достаточно дать ссылку интересующемуся. Если документация не 
понятна, устарела или имеет двойственную трактовку, то ее надо 
актуализировать;&lt;br&gt;
&lt;/li&gt;&lt;li&gt;&lt;b&gt;Держи код в порядке&lt;/b&gt;&lt;br&gt;
Ужасный код должен переписываться, а не врастать в систему. Нет времени? Поставь TODO и исправь в ближайшую свободную минуту;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Заказчик не лабораторный хомячок для экспериментов&lt;/b&gt;&lt;br&gt;
Есть такой подход &lt;a href=&quot;http://kristina-ametov.narod.ru/7502525.html&quot;&gt;«стрельба трассирующими»&lt;/a&gt;.
 Его можно использовать только в молодых и еще мало-функциональных 
продуктах. Как только продукт переходит в фазу зрелости, заказчик 
перестает мириться даже с самыми маленькими ошибками. Продукт должен 
быть идеален. Иначе будет снижаться лояльность, а значит и уровень 
оплаты работ; &lt;br&gt;
&lt;/li&gt;&lt;li&gt;&lt;b&gt;Тестируй&lt;/b&gt;&lt;br&gt;
Очень важный пункт. Если функция не имеет теста, то вообще ничего нельзя
 сказать о ее работоспособности. ПО нестабильно. Яркий пример &lt;a href=&quot;http://eao197.blogspot.ru/2011/12/progtesting-sqlite.html&quot;&gt;SQLite&lt;/a&gt;. Вот почему эта БД успешно работает в самых разных системах.&lt;br&gt;
&lt;/li&gt;&lt;/ol&gt;&lt;br&gt;
&lt;br&gt;
&lt;h4&gt;Заключение&lt;/h4&gt;&lt;br&gt;
Берегите здоровье, пишите качественный код, получайте удовольствие от 
работы. Будьте спокойны! Какие еще на Ваш взгляд правила стоит 
упомянуть?</content:encoded>
			<link>https://alldev.perm.ru/blog/desjat_pravil_spokojnoj_razrabotki/2012-11-10-11</link>
			<dc:creator>artkil</dc:creator>
			<guid>https://alldev.perm.ru/blog/desjat_pravil_spokojnoj_razrabotki/2012-11-10-11</guid>
			<pubDate>Sat, 10 Nov 2012 09:10:52 GMT</pubDate>
		</item>
		<item>
			<title>Домашний датацентр или как начать не именя за душой ни гроша</title>
			<description>&lt;div class=&quot;content&quot;&gt;
 &lt;img src=&quot;http://lh4.ggpht.com/_nbThjpyHYDQ/TJ5BJtEDobI/AAAAAAAAADI/Ep-WjrhZgsU/s640/IMG_0096.JPG&quot; alt=&quot;датацентр под столом&quot;&gt;Вы
 молоды, амбициозны, полны сил и идей, и готовы перевернуть весь Мир! Но
 как правило, все хорошие начинания всегда заканчивается на самом 
банальном — нет средств для их реализации. Инвесторы готовы вложить в 
Ваш проект средства, но им нужно доказать «как Вашу состоятельность, так
 и состоятельность Вашего проекта». А, имея мешок идей и ничего за 
плечами — есть большая вероятность, что в «Вас Не Поверят». Как начать, 
не имея стартового капитала?...</description>
			<content:encoded>&lt;div class=&quot;content&quot;&gt;
 &lt;img src=&quot;http://lh4.ggpht.com/_nbThjpyHYDQ/TJ5BJtEDobI/AAAAAAAAADI/Ep-WjrhZgsU/s640/IMG_0096.JPG&quot; alt=&quot;датацентр под столом&quot;&gt;Вы
 молоды, амбициозны, полны сил и идей, и готовы перевернуть весь Мир! Но
 как правило, все хорошие начинания всегда заканчивается на самом 
банальном — нет средств для их реализации. Инвесторы готовы вложить в 
Ваш проект средства, но им нужно доказать «как Вашу состоятельность, так
 и состоятельность Вашего проекта». А, имея мешок идей и ничего за 
плечами — есть большая вероятность, что в «Вас Не Поверят». Как начать, 
не имея стартового капитала?$CUT$&lt;br&gt;
&lt;a name=&quot;habracut&quot;&gt;&lt;/a&gt;&lt;br&gt;
&lt;h5&gt;Концепция проекта&lt;/h5&gt;&lt;br&gt;
Прежде всего должна быть разработана концепция: Что из себя представляет
 проект, Основные задачи, Целевая аудитория, Методы монетизации. &lt;br&gt;
Пример моего проекта. Введение связанное с названием и изюминку проекта я опускаю. &lt;br&gt;
Далее идет приблизительное описание: проект представляет комплекс 
сервисов для домохозяек. Целевая аудитория: Женщины 20-45 лет, как 
правило сидят дома с детьми. Что им нужно? Их интересы:&lt;br&gt;
&lt;b&gt;Во первых&lt;/b&gt; дать комплекс средств по предоставлению свежей информации по интересам, как правило это могут быть RSS каналы с других сайтов. &lt;br&gt;
&lt;b&gt;Во вторых&lt;/b&gt; им нужно общение между собой: чат, форум, мессенжер, блоги.&lt;br&gt;
&lt;b&gt;В третьих&lt;/b&gt; им нужно средство для выражения самореализации: блоги, фото-альбомы.&lt;br&gt;
&lt;br&gt;
Необходимо охватить информацию по рубрикам: Дом и семья, Красота и 
здоровье, Покупки, Разводы и как пережить одиночество, Деловая женщина.&lt;br&gt;
&lt;br&gt;
&lt;h5&gt;Финансовая составляющая проекта&lt;/h5&gt; &lt;br&gt;
Это самый главный раздел для инвесторов. Должно быть два раздела: Расходы и Доходы. &lt;br&gt;
Расходная часть имеет две составляющей, единовременые расходы: (покупка серверов) &lt;br&gt;
и постоянные: аренда серверов и каналов( хостинг или колокейшен), з/п 
персонала (контент-менеджеров, поддержка проекта, модератеров)&lt;br&gt;
&lt;br&gt;
Доходная часть: Возможные доходы (в зависимости от посещаемости)&lt;br&gt;
&lt;ul&gt;&lt;li&gt;от размещения баннеров, &lt;/li&gt;&lt;li&gt;от контекстной рекламы&lt;/li&gt;&lt;li&gt;от привлечения партнеров по рекламе их услуг&lt;/li&gt;&lt;li&gt;анонсы новых товаров и услуг в ввиде заказных статей.&lt;/li&gt;&lt;li&gt;прочие фишки проекта: подарки, открытки ...&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;
&lt;h5&gt;Прототип проекта&lt;/h5&gt;&lt;br&gt;
Самое главное — это предоставить инвестору прототип рабочего проекта. 
Если проект не большой и умещается в рамках шаринг-хостинга, это не 
проблема. Если проект амбициозный, расчитан на высокую нагрузку и 
представляет распределенный кластер серверов, то как вариант — это 
организация собственного домашнего Дата-центра. Проект должен «задышать»
 в ваших руках и «ожить» в глазах инвесторов.&lt;br&gt;
&lt;br&gt;
Несомненно прежде чем реализовывать проект, необходимо оговорить с 
провайдером тариф, узнать полосу пропускания как входящего, так и 
исходящего трафика, и конечно должен быть выделенный IP адрес. Пока мой 
трариф 15 Mbit трафика. &lt;br&gt;
&lt;br&gt;
Архитектура проекта разработана таким образом, что в случае «взлета» 
проекта, его можно было безболезненно разнести на несколько серверов. 
Каждая функциональная единица имеет свой поддомен. Впрочем, архитектура 
проекта — это отдельная тема другого блога. &lt;br&gt;
&lt;img src=&quot;http://lh6.ggpht.com/_nbThjpyHYDQ/TJ5BKFbz8dI/AAAAAAAAADM/gnqq0Su21jU/%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0.JPG&quot; alt=&quot;схема Датацентр под столом&quot;&gt;&lt;br&gt;
Одна из возможных схем расположения серверов проекта представлена на рис 1.&lt;br&gt;
&lt;b&gt;Сервер 1&lt;/b&gt; является прокси сервером и WEB. &lt;b&gt;Сервер 2&lt;/b&gt; является сервером БД, который должен быть в одной локальной сети с Сервером 1 (черный цвет). &lt;b&gt;Сервер 3&lt;/b&gt;
 — это скриптовый сервер, на нем запускаются разные бэдграундовские 
скрипты, которые осуществляют поиск информации в интернете и 
обрабатывают пользовательский контент. В идеале, Срвер 3 должен иметь 
отдельный доступ в интернет, но «на безрыбье и рак рыба». Сервер 3 
подключается через домашний роутер, ну и конечно через этот же роутер 
подключается мой ноут, как сервер разработчика, так и компьютер жены. &lt;br&gt;
&lt;br&gt;
&lt;h5&gt;Издержки и железо&lt;/h5&gt;&lt;br&gt;
Будите смеяться, но сервера почти с помойки, однако свою функцию они выполняют.&lt;br&gt;
&lt;ul&gt;&lt;li&gt;Сервер 1 — P-IV/2200MHz/2Gb (одноядерный) — подарил друг,&lt;/li&gt;&lt;li&gt;Сервер 2, P-III/800MHz/512Мb — в свое время пожалел выкинуть.&lt;/li&gt;&lt;li&gt;Сервер 3, P-III/800MHz/512Мb — отдали в дар на работе (собирались тоже выкинуть).&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;
&lt;br&gt;
На сегодняшний день издержки составляют:&lt;br&gt;
разовые: &lt;br&gt;
регистрация домена 650 руб,&lt;br&gt;
две сетевых карты 220 х 2 = 440 руб&lt;br&gt;
апгрейд памяти — 1500 руб&lt;br&gt;
&lt;br&gt;
Переменные:&lt;br&gt;
удорожание тарифа + 500 руб&lt;br&gt;
&lt;br&gt;
Как видите, такие издержки может вполне позволить даже начинающий &lt;strike&gt;программист&lt;/strike&gt; бизнесмен.&lt;br&gt;
&lt;br&gt;
&lt;h5&gt;Состояние дел и возможный исход событий&lt;/h5&gt;&lt;br&gt;
&lt;ul&gt;&lt;li&gt;продаться за миллион баксов (шутка, рублей но тогда уж пару). Вполне
 возможно, но для этого проект должен быть на 100% завершен и уже 
собирать какие-то деньги.&lt;/li&gt;&lt;li&gt;найти соинвестора, что наиболее вероятно. Варианты рассматриваются. 
Особенно надо будет хорошенько вливать финансы на первом этапе после 
запуска в промоушен (даже и не знаю сколько).&lt;/li&gt;&lt;li&gt;Допиливать проект самостоятельно по вечерам, не лучший но вполне 
возможный вариант. Вся прибыль твоя, но есть большой риск «не взлететь» 
вообще.&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;
На сегодняшний день есть дышащий прототип с 35% реализованного 
функционала. После доработки дизайна, проект в принципе можно будет 
открывать.&lt;br&gt;
&lt;br&gt;
и так: &lt;b&gt;Не ошибается тот, кто ничего не делает&lt;/b&gt;&lt;br&gt;
и &lt;b&gt;Кто не рискует, тот не пьет шампанского&lt;/b&gt;

 

 

 
&lt;/div&gt;</content:encoded>
			<link>https://alldev.perm.ru/blog/domashnij_datacentr_ili_kak_nachat_ne_imenja_za_dushoj_ni_grosha/2010-09-26-10</link>
			<dc:creator>artkil</dc:creator>
			<guid>https://alldev.perm.ru/blog/domashnij_datacentr_ili_kak_nachat_ne_imenja_za_dushoj_ni_grosha/2010-09-26-10</guid>
			<pubDate>Sat, 25 Sep 2010 21:58:42 GMT</pubDate>
		</item>
		<item>
			<title>Изучаем английский с Anki</title>
			<description>Anki — это программа для запоминания иностранных слов. Список её преимуществ перед аналогами впечатляет!&lt;br&gt;
&lt;a name=&quot;more&quot;&gt;&lt;/a&gt; Судите сами:&lt;br&gt;
&lt;br&gt;
&lt;ul&gt;&lt;li&gt;Широкие возможности по настройке вида карточек&lt;/li&gt;&lt;li&gt;Поддержка мультимедиа&lt;/li&gt;&lt;li&gt;Большое количество плагинов&lt;/li&gt;&lt;li&gt;Настройка алгоритма обучения&lt;/li&gt;&lt;li&gt;Подробная статистика&lt;/li&gt;&lt;li&gt;Поддержка большинства современных платформ (Linux, Windows, Mac, iPhone, Android, список можно продолжить!)&lt;/li&gt;&lt;li&gt;Синхронизация данных&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;
И всё бы хорошо, да вот только благодаря таким обширным возможностям, в 
 Anki может быть не так просто разобраться. Надеюсь, мой скринкаст вам в
 этом поможет.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Официальный сайт — &lt;a href=&quot;http://ichi2.net/anki/&quot;&gt;ichi2.net/anki/&lt;/a&gt;&lt;br&gt;
Программу можно найти в Центре приложений Ubuntu.</description>
			<content:encoded>Anki — это программа для запоминания иностранных слов. Список её преимуществ перед аналогами впечатляет!&lt;br&gt;
&lt;a name=&quot;more&quot;&gt;&lt;/a&gt; Судите сами:&lt;br&gt;
&lt;br&gt;
&lt;ul&gt;&lt;li&gt;Широкие возможности по настройке вида карточек&lt;/li&gt;&lt;li&gt;Поддержка мультимедиа&lt;/li&gt;&lt;li&gt;Большое количество плагинов&lt;/li&gt;&lt;li&gt;Настройка алгоритма обучения&lt;/li&gt;&lt;li&gt;Подробная статистика&lt;/li&gt;&lt;li&gt;Поддержка большинства современных платформ (Linux, Windows, Mac, iPhone, Android, список можно продолжить!)&lt;/li&gt;&lt;li&gt;Синхронизация данных&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;
И всё бы хорошо, да вот только благодаря таким обширным возможностям, в 
 Anki может быть не так просто разобраться. Надеюсь, мой скринкаст вам в
 этом поможет.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Официальный сайт — &lt;a href=&quot;http://ichi2.net/anki/&quot;&gt;ichi2.net/anki/&lt;/a&gt;&lt;br&gt;
Программу можно найти в Центре приложений Ubuntu.</content:encoded>
			<link>https://alldev.perm.ru/blog/izuchaem_anglijskij_s_anki/2010-09-17-9</link>
			<dc:creator>artkil</dc:creator>
			<guid>https://alldev.perm.ru/blog/izuchaem_anglijskij_s_anki/2010-09-17-9</guid>
			<pubDate>Fri, 17 Sep 2010 11:34:55 GMT</pubDate>
		</item>
		<item>
			<title>Пресс-релиз по итогам съезда Пиратской Партии России</title>
			<description>&lt;div class=&quot;content&quot;&gt; &lt;img src=&quot;http://habrastorage.org/storage/4143d56d/c2fa5727/18a8097f/576e1f13.jpg&quot;&gt; &lt;br&gt;
В России скоро появится новая политическая партия. Такое решение было 
принято делегатами первого съезда Пиратской Партии России, который 
прошел 10-12 сентября 2010 в подмосковной Малаховке.&lt;a name=&quot;more&quot;&gt;&lt;/a&gt;&lt;br&gt;
В съезде участвовали представители Москвы, Питера, Нижнего Новгорода, 
Воронежа, Новосибирска, Ростова-на-Дону и других регионов России. 
Присутствовал международный координатор Пиратской партии Германии и 
сопредседатель Pirate Parties International — Gregory Engels.&lt;br&gt;
&lt;br&gt;
Организационный съезд принял программу действий на год, ключевым пунктом
 в которой является регистрация Пиратской партии, как политической 
партии.&lt;br&gt;
Для участия в выборах партией создана «Школа кандидата».&lt;br&gt;
&lt;b&gt;&lt;i&gt;Также съезд поддержал первого кандидата в депутаты города Шумерля 
 Чувашской Республики от Пиратской партии России Иванькова Александра.&lt;/i&gt;&lt;/b&gt;&lt;br&gt;
За основу внутренней орган...</description>
			<content:encoded>&lt;div class=&quot;content&quot;&gt; &lt;img src=&quot;http://habrastorage.org/storage/4143d56d/c2fa5727/18a8097f/576e1f13.jpg&quot;&gt; &lt;br&gt;
В России скоро появится новая политическая партия. Такое решение было 
принято делегатами первого съезда Пиратской Партии России, который 
прошел 10-12 сентября 2010 в подмосковной Малаховке.&lt;a name=&quot;more&quot;&gt;&lt;/a&gt;&lt;br&gt;
В съезде участвовали представители Москвы, Питера, Нижнего Новгорода, 
Воронежа, Новосибирска, Ростова-на-Дону и других регионов России. 
Присутствовал международный координатор Пиратской партии Германии и 
сопредседатель Pirate Parties International — Gregory Engels.&lt;br&gt;
&lt;br&gt;
Организационный съезд принял программу действий на год, ключевым пунктом
 в которой является регистрация Пиратской партии, как политической 
партии.&lt;br&gt;
Для участия в выборах партией создана «Школа кандидата».&lt;br&gt;
&lt;b&gt;&lt;i&gt;Также съезд поддержал первого кандидата в депутаты города Шумерля 
 Чувашской Республики от Пиратской партии России Иванькова Александра.&lt;/i&gt;&lt;/b&gt;&lt;br&gt;
За основу внутренней организации партии принята прямая электронная демократия.&lt;br&gt;
&lt;br&gt;
Была принята резолюция под ироническим названием &lt;a href=&quot;http://pirateparty.ru/wiki/index.php?title=%D0%9C%D0%B0%D0%BB%D0%B0%D1%85%D0%BE%D0%B2%D1%81%D0%BA%D0%B8%D0%B9_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB&quot;&gt;«Малаховский протокол»&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://www.chaskor.ru/article/piraty_znayut_vse_kachayut_19749&quot;&gt;Публикация о съезде в Частном Корреспонденте.&lt;/a&gt; &lt;/div&gt;</content:encoded>
			<link>https://alldev.perm.ru/blog/press_reliz_po_itogam_sezda_piratskoj_partii_rossii/2010-09-17-8</link>
			<dc:creator>artkil</dc:creator>
			<guid>https://alldev.perm.ru/blog/press_reliz_po_itogam_sezda_piratskoj_partii_rossii/2010-09-17-8</guid>
			<pubDate>Fri, 17 Sep 2010 11:33:45 GMT</pubDate>
		</item>
		<item>
			<title>Почему хороший игрок в Starcraft — идеальный работник для стартапа?</title>
			<description>В последнее время мы как-то особенно углубились в тему стартапов (это и 
 понятно, ведь новые проекты занимают все наши мысли и свободное время),
 поэтому активно читаем все, что пишут по этой теме у нас и в 
англоязычных источниках.&lt;br&gt;
И вот наткнулись на забавную статью. Автор написал ее, размышляя о 
турнире StartupCraft (турнир по Starcraft для IT-компаний), пытаясь 
понять, является ли выигрыш в этом турнире свидетельством успеха 
компании в работе или инвесторы должны дать денег в первую очередь тем, 
 кто проиграл (ведь они еще что-то кроме Starcraftа умеют). Без 
сомнения, автор склоняется к первому варианту:)&lt;br&gt;
&lt;br&gt;
&lt;img alt=&quot;image&quot; src=&quot;http://habrastorage.org/storage/6e3cb407/43ef41b2/4fd8f835/04c7c750.jpg&quot;&gt;&lt;br&gt;
&lt;br&gt;
Под катом перевод этой самой статьи ...</description>
			<content:encoded>В последнее время мы как-то особенно углубились в тему стартапов (это и 
 понятно, ведь новые проекты занимают все наши мысли и свободное время),
 поэтому активно читаем все, что пишут по этой теме у нас и в 
англоязычных источниках.&lt;br&gt;
И вот наткнулись на забавную статью. Автор написал ее, размышляя о 
турнире StartupCraft (турнир по Starcraft для IT-компаний), пытаясь 
понять, является ли выигрыш в этом турнире свидетельством успеха 
компании в работе или инвесторы должны дать денег в первую очередь тем, 
 кто проиграл (ведь они еще что-то кроме Starcraftа умеют). Без 
сомнения, автор склоняется к первому варианту:)&lt;br&gt;
&lt;br&gt;
&lt;img alt=&quot;image&quot; src=&quot;http://habrastorage.org/storage/6e3cb407/43ef41b2/4fd8f835/04c7c750.jpg&quot;&gt;&lt;br&gt;
&lt;br&gt;
Под катом перевод этой самой статьи $CUT$&lt;br&gt;
&lt;a name=&quot;more&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://www.blogger.com/post-edit.g?blogID=8511633488317993065&amp;amp;postID=2888462438187878273&quot; name=&quot;habracut&quot;&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;h4&gt;Почему хороший игрок в Starcraft — идеальный работник для стартапа?&lt;/h4&gt;&lt;br&gt;
&lt;b&gt;Хорошие игроки в Starcraft помешаны на совершенстве&lt;/b&gt;&lt;br&gt;
Если бы мне предложили выбрать единственное обязательное качество для 
людей, которые со мной работают, я бы выбрал стремление становиться 
лучше. Наивно думать, что люди изначально делают всё хорошо. Таких 
сотрудников вы не найдете. А вот сотрудники, которые постоянно учатся и 
 профессионально совершенствуются — это то, что нужно.&lt;br&gt;
&lt;br&gt;
Хорошие игроки в Starcraft смотрят реплеи, чтобы понять — где они 
поступили неправильно и, самое главное, почему кому-то удалось победить.
 Раз за разом они повышают свой скилл, чтобы быть ближе к победе в 
каждой следующей игре.&lt;br&gt;
&lt;br&gt;
Для работника стартапа такое качество жизненно необходимо. Если все ваши
 сотрудники также стремятся к самосовершенствованию, как хорошие 
геймеры, то ваша команда всегда будет оставаться в отличной форме.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Хорошие игроки в Starcraft хороши во всём&lt;/b&gt;&lt;br&gt;
В стартапе, особенно в небольшом, сотрудники должны уметь всё. Например,
 когда я работал в EduFire, я никогда не занимался тем, что было 
написано в моей должностной инструкции. Мы все были готовы выполнять 
самые разнообразные задания, подменять друг друга в трудных ситуациях и 
 делать не то, что можешь, а то что нужно.&lt;br&gt;
&lt;br&gt;
Хорошим старкрафтерам, на мой взгляд, все равно за кого играть. То есть 
 они могут победить, играя за любую из трех рас, корректируя свою 
стратегию в зависимости от этого. Я бы не отказался от сотрудников с 
такими качествами в моей команде.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Хорошие игроки в Starcraft знают, как нужно развиваться&lt;/b&gt;&lt;br&gt;
Есть такие игроки, которые предпочитают не уходить далеко от базы и 
внезапно обнаруживают себя «запертыми», привязанными к своим минералам. 
 Есть те, которые, наоборот, захватывают слишком много территории и 
проигрывают из-за нехватки ресурсов. Но хорошие игроки в Starcraft знают
 когда и куда можно расширяться.&lt;br&gt;
&lt;br&gt;
Стартапу не нужны работники, которые распыляют себя во всех возможных 
направлениях (и поэтому менее эффективны во всем, что делают) и не нужны
 те, кто все время сидит на одном месте (и никогда не делают ничего, 
кроме того, что великолепно умеют). Команде нужны люди, знающие, куда 
можно расти и развиваться, и умеющие выбрать для этого правильное время.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Хорошие игроки в Starcraft говорят GLHF&lt;/b&gt;&lt;br&gt;
GLHF = Good Luck Have Fun — пожелание удачи в игре. Это правило хорошего
 тона — говорить так. Ни одна компания не откажется от сотрудника с 
хорошими манерами, который ведет себя с окружающими так, как им бы того 
 хотелось. Если в команде стартапа есть люди, которые не могут ладить 
друг с другом, — ждите проблем.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Хорошие игроки в Starcraft знают, что такое микро&lt;/b&gt;&lt;br&gt;
Микро-контроль — очень важная часть игры в Starcraft. Это значит, нужно 
 использовать минимальное количество ресурсов настолько эффективно, 
чтобы победить даже тогда, когда это кажется невозможным. Вы просто не 
 представляете, что хороший игрок в Starcraft может выжать всего из 
нескольких юнитов. В стартапах обычно не хватает денег… и вообще с 
ресурсами — напряженно. Сотрудники должны уметь сделать многое из 
ничего. Хорошие стракрафтеры — настоящие эксперты в этом.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;У хороших игроков в Starcraft высокий рейтинг&lt;/b&gt;&lt;br&gt;
Да, так и есть. Рейтинг – это самый быстрый и простой способ показать, 
чего ты добился в прошлом. Чаще всего (и слава богу), выбирая 
сотрудников для стартапа, не обращают внимания на резюме. Обращают 
внимание на то, чего человек добился. Рейтинг это самое то. Каждая 
победа – это победа, а каждое поражение – поражение, и уже неважно как 
именно ты победил (так и в резюме, если написано «увеличил продажи на 
25% в 2009», то кому интересно как конкретно?). На основе рейтинга 
игрока и лиги, в которой он состоит, можно многое сказать о нем, и так 
же можно понять главное о претенденте на работу, изучив то, чего он 
добился и что он создал.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Хорошие игроки в Starcraft принимают быстрые, правильные решения&lt;/b&gt;&lt;br&gt;
Если вы, играя в Starcraft, не можете принимать правильные решение 
быстро (например, когда идти вперед, когда применить пси-шторм или когда
 отозвать ворона), то вы долго не продержитесь. Хорошие игроки 
принимают решения и действуют прямо сейчас, несмотря на все атаки, 
здания и юниты, которые используют против них враги. Мгновенная реакция
 и решительные действия в верном направлении – это именно те качества, 
 которые я бы хотел видеть в коллеге или сотруднике, особенно в 
стартапе.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Хорошие игроки в Starcraft не забывают про разведку&lt;/b&gt;&lt;br&gt;
В Starcrafte важно узнать максимум возможной информации о противнике. Но
 хитрость в том, чтобы не заниматься только этим. Если вы уделяете всё 
 внимание изучению врага, то у вас уже не останется сил (армии, 
ресурсов, времени и пр.), чтобы с ним бороться. Стартапам нужны 
сотрудники, которые изучают конкурентов, но тратят большую часть 
времени на развитие своего собственного проекта.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Хорошие игроки в Starcraft знают, когда нужно уйти&lt;/b&gt;&lt;br&gt;
Иногда, вы ведете бой, в котором не можете победить. Хорошие 
старкрафтеры знают, когда приходит время сказать GG и уйти, вместо того,
 чтобы дожидаться конца игры, которая все равно закончится поражением. 
 Нет ничего плохого в том, чтобы уйти или оставить какое-то занятие, 
если сделать это осознанно. Это дает тебе больше времени для вещей, 
которые действительно важны и могут привести к успеху. Не все, что мы 
делаем, оказывается правильным, поэтому нужно хотя бы понимать, когда 
приходит время остановиться и обратить взгляд на что-то другое.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;У хороших игроков в Starcraft высокий АРМ&lt;/b&gt;&lt;br&gt;
АРМ – количество действий в минуту. Чем опытней игрок, тем выше его АРМ 
 (это значит, он может следить за большим числом вещей одновременно). 
Несмотря на то, что мне больше нравится фокусироваться на одной задаче, в
 работе нужно стремиться к максимальной эффективности. Люди с высоким 
АРМ обычно знают все хоткеи и отлично ориентируются в меню игры.&lt;br&gt;
&lt;br&gt;
Скорее всего, такие сотрудники смогут использовать все возможные 
средства, чтобы повысить эффективность своей работы: они быстро 
печатают, знают горячие клавиши, находят специальные приложения для 
оптимизации рабочего процесса и пр. Конечно, каждая из этих деталей 
экономит всего лишь пару секунд, но задумайтесь, сколько это времени в 
неделю, месяц или год. Да, такие сотрудники экономят массу времени и 
поэтому полезны.&lt;br&gt;
&lt;br&gt;
&lt;b&gt;Хорошие игроки в Starcraft интересуются еще чем-то кроме работы&lt;/b&gt;&lt;br&gt;
Это уж точно… по крайней мере их интересует Starcraft. Никому не нужны 
сотрудники, которые работают по 18 часов в сутки и способны думать 
только о работе (ну мне точно не нужны). Мне нравятся люди, с которыми 
можно заняться чем-то еще, например поиграть в Starcraft:)</content:encoded>
			<link>https://alldev.perm.ru/blog/pochemu_khoroshij_igrok_v_starcraft_idealnyj_rabotnik_dlja_startapa/2010-09-17-7</link>
			<dc:creator>artkil</dc:creator>
			<guid>https://alldev.perm.ru/blog/pochemu_khoroshij_igrok_v_starcraft_idealnyj_rabotnik_dlja_startapa/2010-09-17-7</guid>
			<pubDate>Fri, 17 Sep 2010 11:32:38 GMT</pubDate>
		</item>
		<item>
			<title>Алгоритм определения пола</title>
			<description>При работе с базой данных клиентов, для автоматизации выборки встала 
задача определить пол человека. В базе есть и русские и иностранцы. 
Думал долго, взвешивал все варианты и остановился на способе, о котором 
 хочу рассказать....</description>
			<content:encoded>При работе с базой данных клиентов, для автоматизации выборки встала 
задача определить пол человека. В базе есть и русские и иностранцы. 
Думал долго, взвешивал все варианты и остановился на способе, о котором 
 хочу рассказать.$CUT$&lt;br&gt;
&lt;a name=&quot;more&quot;&gt;&lt;/a&gt; &lt;br&gt;
&lt;br&gt;
&lt;img alt=&quot;image&quot; src=&quot;http://blog.bolderworld.com/wp-content/uploads/2009/04/yinyang.jpg&quot;&gt;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;h4&gt;Введение&lt;/h4&gt;&lt;br&gt;
На просторах интернета нашел два проекта наработки из которых мне помогли в решении задачи.&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/blog-post_15.html&quot; name=&quot;habracut&quot;&gt;&lt;/a&gt;&lt;br&gt;
&lt;ul&gt;&lt;li&gt;Программа для твиттера – &lt;a href=&quot;http://www.twidium.com/&quot;&gt;Twidum&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Библиотека морфоанализа &lt;a href=&quot;http://macrocosm.narod.ru/&quot;&gt;macrocosm.narod.ru&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;
Из первой программы нам потребуется аккуратно собранные разработчиками 
базы русских и английских имен. Скачиваем программу, устанавливаем, 
забираем файлы с говорящими именами &lt;strong&gt;girls_ru.txt girls_en.txt boys_ru.txt boys_en.txt&lt;/strong&gt;
 (я не стал выкладывать файлы отдельно, возможно это нарушает лицензию 
 разработчика, поэтому каждому придется скачать программу 
самостоятельно). Во всех четырех файлах имена отсортированные в 
алфавитном порядке, так что организовать быстрый поиск труда не 
составит. &lt;br&gt;
&lt;br&gt;
&lt;strong&gt;Итого имеем:&lt;/strong&gt;&lt;br&gt;
12217 русских женских имен, 11033 русских мужских имен, 5915 английских 
 женских имен, 1533 английских мужских имен. На лицо дискриминация 
мужских имен :). Обратите внимание, что все имена написаны с маленькой 
буквы. Видимо для чегото разработчикам это потребовалось, а нам нужно 
будет просто это учитывать.&lt;br&gt;
&lt;br&gt;
На счет морфоанализа. Он важен только для русского языка т.к. у меня в 
базе не все имена встречались в именительном падеже. Качаем mcd.dll 
отсюда: &lt;a href=&quot;http://macrocosm.narod.ru/madown.html&quot;&gt;macrocosm.narod.ru/madown.html&lt;/a&gt; и не забываем скачать файл rus_morphology.mcr (он должен лежать в одной папке с dll`кой).&lt;br&gt;
&lt;br&gt;
&lt;h4&gt;Алгоритм&lt;/h4&gt;&lt;br&gt;
Если имя написано латиницей делаем перебор по английским именам, если 
кириллицой, то сначала ищем имя как есть, если не находим, включаем 
морфологический модуль. В архиве с dll есть примеры на Delphi, С++ и C#,
 без них только по докам с сайта разобраться будет трудно. Основная 
мысль – морфологический модуль приводит имя поданное на вход к словарной
 форме (единственное число, именительный падеж) ну, а дальше нам 
остается только поискать слово в базе имен.&lt;br&gt;
&lt;br&gt;
Надеюсь эта небольшая зарисовка поможет кому-нибудь решить подобную задачу.</content:encoded>
			<link>https://alldev.perm.ru/blog/algoritm_opredelenija_pola/2010-09-17-5</link>
			<dc:creator>artkil</dc:creator>
			<guid>https://alldev.perm.ru/blog/algoritm_opredelenija_pola/2010-09-17-5</guid>
			<pubDate>Fri, 17 Sep 2010 11:30:51 GMT</pubDate>
		</item>
		<item>
			<title>Ubuntu начинает формировать список сертифицированного оборудования</title>
			<description>Проект Ubuntu формирует список сертифицированного оборудования, которое
 совместимо с последними версиями дистрибутивов. На специально 
отведенной веб страничке можно посмотреть, например, поддерживается ли 
Ваш недавно купленный ноутбук, каких проприетарных драйверов может не 
хватать, а также пути решения некоторых проблем с устройствами.&lt;br&gt;
Поддержка устройств отличается &quot;статусом&quot;: Certified, Enabled, либо 
Ready. Первый означает, что производители сами предоставили свое 
оборудование для тестирования инженерами Canonical и все тесты пройдены 
 успешно. Во-втором случае Canonical самостоятельно настраивает Ubuntu 
для работы на данном оборудовании и следит за должной 
производительностью. Последний же статус означает, что оборудование 
тестировалось самим производителем с помощью специального тестового 
пакета, результаты были направлены на проверку в Canonical. &lt;br&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;a href=&quot;http://webapps.ubuntu.com/certification/&quot;&gt;Подробности&lt;/a&gt;</description>
			<content:encoded>Проект Ubuntu формирует список сертифицированного оборудования, которое
 совместимо с последними версиями дистрибутивов. На специально 
отведенной веб страничке можно посмотреть, например, поддерживается ли 
Ваш недавно купленный ноутбук, каких проприетарных драйверов может не 
хватать, а также пути решения некоторых проблем с устройствами.&lt;br&gt;
Поддержка устройств отличается &quot;статусом&quot;: Certified, Enabled, либо 
Ready. Первый означает, что производители сами предоставили свое 
оборудование для тестирования инженерами Canonical и все тесты пройдены 
 успешно. Во-втором случае Canonical самостоятельно настраивает Ubuntu 
для работы на данном оборудовании и следит за должной 
производительностью. Последний же статус означает, что оборудование 
тестировалось самим производителем с помощью специального тестового 
пакета, результаты были направлены на проверку в Canonical. &lt;br&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;a href=&quot;http://webapps.ubuntu.com/certification/&quot;&gt;Подробности&lt;/a&gt;</content:encoded>
			<link>https://alldev.perm.ru/blog/ubuntu_nachinaet_formirovat_spisok_sertificirovannogo_oborudovanija/2010-09-17-4</link>
			<dc:creator>artkil</dc:creator>
			<guid>https://alldev.perm.ru/blog/ubuntu_nachinaet_formirovat_spisok_sertificirovannogo_oborudovanija/2010-09-17-4</guid>
			<pubDate>Fri, 17 Sep 2010 11:29:37 GMT</pubDate>
		</item>
		<item>
			<title>Создаем Web-приложение, умеющее работать с Twitter</title>
			<description>Похоже, что в наши дни Twiiter можно обнаружить где угодно. Политики, 
актеры, наши родители – все пользуются ресурсами социальных сетей. 
Клиенты требуют приложений, которые не только позволяют пользоваться 
Twitter, но и имеют глянцевый вид в стиле Web 2.0, которого можно 
добиться только с помощью Ajax. Нам в этом помогут Django и 
jQuery. ...</description>
			<content:encoded>Похоже, что в наши дни Twiiter можно обнаружить где угодно. Политики, 
актеры, наши родители – все пользуются ресурсами социальных сетей. 
Клиенты требуют приложений, которые не только позволяют пользоваться 
Twitter, но и имеют глянцевый вид в стиле Web 2.0, которого можно 
добиться только с помощью Ajax. Нам в этом помогут Django и 
jQuery. $CUT$&lt;br&gt;
&lt;a name=&quot;more&quot;&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;fig1&quot;&gt;&lt;b&gt;Рисунок 1. Панель Twitter, показывающая последние записи&lt;/b&gt;&lt;/a&gt;&lt;br&gt;
&lt;img alt=&quot;Screenshot shows Twitter panel with recent tweets&quot; src=&quot;http://www.ibm.com/developerworks/ru/library/os-social-twitter/figure1.jpg&quot; height=&quot;287&quot; width=&quot;567&quot;&gt; &lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;Dependencies&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;Зависимости&lt;/span&gt;&lt;/a&gt;&lt;br&gt;
&lt;div class=&quot;ibm-container ibm-alt-header dw-container-sidebar&quot;&gt;&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;fua&quot;&gt;&lt;/a&gt;&lt;h2&gt;Часто используемые сокращения&lt;/h2&gt;&lt;div class=&quot;ibm-container-body&quot;&gt; &lt;ul&gt;&lt;li&gt;&lt;strong&gt;Ajax:&lt;/strong&gt; Асинхронный JavaScript + XML&lt;/li&gt;&lt;li&gt;&lt;strong&gt;API:&lt;/strong&gt; Интерфейс программирования приложений (Application programming interface)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;CSS:&lt;/strong&gt; Каскадные таблицы стилей (Cascading style sheet)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;FAQ:&lt;/strong&gt; Часто задаваемые вопросы (Frequently asked questions)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;HTML:&lt;/strong&gt; Язык разметки гипертекста (Hypertext Markup Language)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;HTTP:&lt;/strong&gt; Протокол передачи гипертекста (Hypertext Transfer Protocol)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;REST:&lt;/strong&gt; Передача состояния представления (Representational State Transfer)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;UI:&lt;/strong&gt; Пользовательский интерфейс (User interface)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;Прежде чем приступать к работе с этой статьей, я 
настоятельно рекомендую вам проработать учебное руководство по Django. 
Также вы должны иметь уверенные знания JavaScript. Разумеется, у вас 
должна быть учетная запись Twitter, и вы должны знать его жаргон, 
например, что такое &lt;em&gt;твит&lt;/em&gt;. В арсенале ваших инструментов должны быть Python, Django, jQuery и библиотека pyhon-twitter. В разделе &lt;a href=&quot;http://www.ibm.com/developerworks/ru/library/os-social-twitter/index.html?S_TACT=105AGX99&amp;amp;S_CMP=GR01#resources&quot;&gt;Ресурсы&lt;/a&gt; приведены ссылки, по которым их можно загрузить.&lt;br&gt;
Также нам понадобится включенная в Python база данных sqlite3 для 
хранения данных о сеансах, а о сохранении остальных данных позаботится 
инфраструктура Twitter. Конечно же, в дальнейшем для улучшения 
приложения можно будет интегрировать более сложную структуру базы данных
 для хранения на вашем сервере статистики, копий твитов и любой другой 
информации, связанной с вашей учетной записью Twitter. Также в этой 
статье предполагается, что вы работаете на Linux&amp;reg;.&lt;br&gt;
Я проверял данное приложение с Python 2.5.2. По умолчанию Python 
установлен на большинстве Linux-машин, однако если Python у вас все же 
отсутствует, то в разделе &lt;a href=&quot;http://www.ibm.com/developerworks/ru/library/os-social-twitter/index.html?S_TACT=105AGX99&amp;amp;S_CMP=GR01#resources&quot;&gt;Ресурсы&lt;/a&gt; можно найти информацию по его загрузке и установке. &lt;br&gt;
Twitter позволяет получать данные с помощью двух API-интерфейсов: API 
поиска и REST API. (На сайте Twitter в разделе FAQ упоминается о планах 
по созданию единого API). REST Web-сервисом называется Web-сервис, 
реализованный на протоколе http и следующий принципам архитектуры REST 
(см. информацию в разделе &lt;a href=&quot;http://www.ibm.com/developerworks/ru/library/os-social-twitter/index.html?S_TACT=105AGX99&amp;amp;S_CMP=GR01#resources&quot;&gt;Ресурсы&lt;/a&gt;).&lt;br&gt;
&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;python-twitter&quot;&gt;&lt;span class=&quot;smalltitle&quot;&gt;Устанавливаем библиотеку python-twitter&lt;/span&gt;&lt;/a&gt;&lt;br&gt;
Последний компонент, который нам нужен - это библиотека python-twitter. 
Согласно сайту проекта, она представляет собой &quot;оберточную библиотеку 
python, основанную на API Twitter и модели данных twitter&quot;. Существует 
несколько библиотек, позволяющих взаимодействовать с сервисами Twitter
 во множестве языков - от Ruby до Eiffel. В настоящий момент в Python 
имеется 5 библиотек для взаимодействия с Twitter: Python-twitter Де 
Витта Клинтона (DeWitt Clinton), python-twyt Эндрю Прайса (Andrew 
Price), twitty-twister Дастина Сэллингса (Dustin Sallings), twython 
Райана Макграта (Ryan McGrath) и Tweepy Джоша Росслейна (Josh 
Roesslein).&lt;br&gt;
Библиотеке python-twitter для работы нужен пакет simplejson (см. &lt;a href=&quot;http://www.ibm.com/developerworks/ru/library/os-social-twitter/index.html?S_TACT=105AGX99&amp;amp;S_CMP=GR01#resources&quot;&gt;Ресурсы&lt;/a&gt;). Загрузите этот пакет и установите его, выполнив команды, показанные в листинге 1.&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;list1&quot;&gt;&lt;b&gt;Листинг 1. Команды для установки simplejson&lt;/b&gt;&lt;/a&gt;&lt;br&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;tar -zxvf simplejson-2.0.9.tar.gz
cd simplejson-2.0.9
sudo python setup.py build
sudo python setup.py install 
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;
Если вы предпочитаете работать с egg-пакетами, используйте команду &lt;code&gt;sudo easy_install simplejson-2.0.9-py2.5-win32.egg&lt;/code&gt;.&lt;br&gt;
Теперь можно установить и python-twitter. Загрузите пакет и выполните команды, показанные в листинге 2.&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;list2&quot;&gt;&lt;b&gt;Листинг 2. Команды для установки python-twitter&lt;/b&gt;&lt;/a&gt;&lt;br&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;tar -zxvf python-twitter-0.6.tar.gz
cd python-twitter-0.6
sudo python setup.py build
sudo python setup.py install
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;
&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;install_django&quot;&gt;&lt;span class=&quot;smalltitle&quot;&gt;Устанавливаем Django&lt;/span&gt;&lt;/a&gt;&lt;br&gt;
Теперь пришло время установить Django - мощную инфраструктуру разработки
 Web-приложений на Python. В описываемом в данной статье приложении я 
работал с Django версии 1.1.1. Установка Django так же проста, как 
установка simplejson и python-twitter. Загрузите пакет и выполните в 
терминале команды, показанные в листинге 3.&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;list3&quot;&gt;&lt;b&gt;Листинг 3. Команды для установки Django&lt;/b&gt;&lt;/a&gt;&lt;br&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;tar -zxvf Django-1.1.1.tar.gz
cd Django-1.1.1
sudo python setup.py build
sudo python setup.py install
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;
Проверьте, что путь к Django есть в вашей переменной path, для чего выполните команду &lt;code&gt;$ django-admin --version&lt;/code&gt;. Если все прошло как ожидалось, то можно взяться за написание кода.&lt;br&gt;
&lt;div class=&quot;ibm-alternate-rule&quot;&gt;&lt;hr&gt;&lt;/div&gt;&lt;div class=&quot;ibm-ind-link ibm-back-to-top&quot;&gt;&lt;a class=&quot;ibm-anchor-up-link&quot; href=&quot;http://www.ibm.com/developerworks/ru/library/os-social-twitter/index.html?S_TACT=105AGX99&amp;amp;S_CMP=GR01#ibm-pcon&quot;&gt;В начало&lt;/a&gt;&lt;/div&gt;&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;library&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;Библиотека python-twitter&lt;/span&gt;&lt;/a&gt;&lt;br&gt;
Установив библиотеку python-twitter, можно приступить к изучению ее 
возможностей. Чтобы получить доступ к библиотеке, выполните команду &lt;code&gt;import twitter&lt;/code&gt;. Модуль &lt;code&gt;twitter&lt;/code&gt; предоставляет обертки для модели данных Twitter и его API. В нем имеется три класса моделей данных: &lt;code&gt;twitter.Status&lt;/code&gt;, &lt;code&gt;twitter.User&lt;/code&gt; и &lt;code&gt;twitter.DirectMessage&lt;/code&gt;. Все вызовы API возвращают объект одного из этих классов. Для работы с API следует создать экземпляр класса &lt;code&gt;twitter.Api()&lt;/code&gt;
 (обратите внимание, что первая буква - заглавная). Если создать 
экземпляр этого класса, не передавая в конструктор никаких параметров, 
то можно будет вызывать только методы, которые не требуют входа в 
систему. Чтобы войти в систему и получить полный доступ к API, 
используйте следующий синтаксис:&lt;br&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;import twitter
api = twitter.Api(username=&apos;yourUserName&apos;, password=&apos;yourPassword&apos;)
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;
Имея экземпляр класса &lt;code&gt;Api&lt;/code&gt;, можно запрашивать ваших 
фолловеров (пользователей, которые читают ваши твиты), пользователей, 
твиты которых читаете вы, получать статусы (твиты), можно посылать 
твиты и т.д. Например, чтобы получить список твитов пользователя, 
сделайте вызов &lt;code&gt;statuses = api.GetUserTimeline()&lt;/code&gt;, который вернет список объектов &lt;code&gt;twitter.Status&lt;/code&gt;. Чтобы создать список с текстом (строками) ваших твитов, можно использовать следующее выражение: &lt;code&gt;&amp;gt;&amp;gt;&amp;gt;print [s.text for s in statuses]&lt;/code&gt;.&lt;br&gt;
В таблице 1 перечислены классы и методы, которые мы будем использовать в
 нашем Web-приложении. С полной документацией можно ознакомиться через 
pydoc, например — &lt;code&gt;$ pydoc twitter.Api&lt;/code&gt;, или на web-странице документации python-twitter (см. &lt;a href=&quot;http://www.ibm.com/developerworks/ru/library/os-social-twitter/index.html?S_TACT=105AGX99&amp;amp;S_CMP=GR01#resources&quot;&gt;Ресурсы&lt;/a&gt;).&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;table1&quot;&gt;&lt;b&gt;Таблица 1. Некоторые полезные методы API, доступные в python-twitter&lt;/b&gt;&lt;/a&gt;&lt;br&gt;
&lt;table class=&quot;ibm-data-table&quot; summary=&quot;python-twitter API methods&quot; width=&quot;&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;Метод&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Возвращаемое значение&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Описание&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;GetUserTimeline()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Список объектов &lt;code&gt;twitter.Status&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Запрашивает все твиты пользователя&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;GetFriends()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Список объектов &lt;code&gt;twitter.User&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Запрашивает список фолловеров (пользователей, читающих ваши твиты)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;PostUpdate()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Объект класса &lt;code&gt;twitter.Status&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Публикует твит&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;
&lt;div class=&quot;ibm-alternate-rule&quot;&gt;&lt;hr&gt;&lt;/div&gt;&lt;div class=&quot;ibm-ind-link ibm-back-to-top&quot;&gt;&lt;a class=&quot;ibm-anchor-up-link&quot; href=&quot;http://www.ibm.com/developerworks/ru/library/os-social-twitter/index.html?S_TACT=105AGX99&amp;amp;S_CMP=GR01#ibm-pcon&quot;&gt;В начало&lt;/a&gt;&lt;/div&gt;&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;adding_jquery&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;Добавляем в коктейль jQuery&lt;/span&gt;&lt;/a&gt;&lt;br&gt;
Следует уточнить, что мы будем использовать не только ядро jQuery, но и 
 библиотеку jQuery UI, предоставляющую виджеты, темы и анимацию. 
Посетите страницу &lt;a href=&quot;http://jqueryui.com/themeroller&quot;&gt;ThemeRoller&lt;/a&gt; и на панели слева нажмите на вкладку &lt;strong&gt;Gallery&lt;/strong&gt; (Галерея). Выберите тему, которая вам нравится (я в этом приложении использовал тему Cupertino) и перейдите по ссылке &lt;strong&gt;Download&lt;/strong&gt;,
 находящейся под именем темы. Вы попадете на страницу загрузки. Выберите
 на ней текущую (стабильную) версию. На момент написания статьи это 
была версия 1.7.2 для jQuery 1.3+.&lt;br&gt;
Процесса установки как такового нет, просто извлеките файл ThemeRoller и
 поместите нужные директории/файлы в нужное место. Также при желании 
можно создать новую тему, но я в этом примере ограничился использованием
 одной из готовых тем. &lt;br&gt;
&lt;div class=&quot;ibm-alternate-rule&quot;&gt;&lt;hr&gt;&lt;/div&gt;&lt;div class=&quot;ibm-ind-link ibm-back-to-top&quot;&gt;&lt;a class=&quot;ibm-anchor-up-link&quot; href=&quot;http://www.ibm.com/developerworks/ru/library/os-social-twitter/index.html?S_TACT=105AGX99&amp;amp;S_CMP=GR01#ibm-pcon&quot;&gt;В начало&lt;/a&gt;&lt;/div&gt;&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;django_project&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;Создаем проект Django&lt;/span&gt;&lt;/a&gt;&lt;br&gt;
Теперь нужно создать новый проект Django. Это делается с помощью команды &lt;code&gt;django-admin startproject pytweetproj&lt;/code&gt;, где &lt;em&gt;pytweetproj&lt;/em&gt;
 – это имя проекта, используемое в этой статье. Вы можете указать любое
 другое имя, однако в таком случае следите за тем, чтобы везде дальше 
по ходу статьи использовать именно его. Перейдите в директорию 
pytweetproj. Чтобы запустить web-сервер Django, выполните в терминале 
команду &lt;code&gt;python manage.py runserver&lt;/code&gt;, запустите 
Web-браузер и перейдите по адресу http://127.0.0.1:8000. Вы увидите 
страницу с надписью «It worked!». Если вы в какой-либо момент захотите
 остановить или перезапустить сервер, нажмите &lt;strong&gt;Ctrl+C&lt;/strong&gt;, 
 чтобы завершить его процесс. Не используйте сервер разработки в рабочей
 среде. Завершив разработку проекта, перенесите его на надежный и 
безопасный сервер, например, Apache. &lt;br&gt;
Создайте в корневой директории проекта поддиректорию с именем resources,
 в которой мы будем хранить CSS-файлы, сценарии JavaScript и прочие 
медиа-файлы. Скопируйте сюда директории css и js, извлеченные из 
ZIP-архива ThemeRoller, а также ядро jQuery. &lt;br&gt;
Откройте в своем любимом текстовом редакторе файл settings.py и поменяйте его согласно листингу 4. &lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;list4&quot;&gt;&lt;b&gt;Листинг 4. Настройки проекта Django &lt;/b&gt;&lt;/a&gt;&lt;br&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;# Настройки Django для проекта pytweetproj.
import os
APPLICATION_DIR = os.path.dirname( globals()[ &apos;__file__&apos; ] )

DEBUG = True
TEMPLATE_DEBUG = DEBUG

ADMINS = (
)

MANAGERS = ADMINS

# для кэширования мы будем использовать базу данных sqlite3
DATABASE_ENGINE = &apos;sqlite3&apos; 
DATABASE_NAME = &apos;session.db&apos; 
DATABASE_USER = &apos;&apos; 
DATABASE_PASSWORD = &apos;&apos; 
DATABASE_HOST = &apos;&apos; 
DATABASE_PORT = &apos;&apos; 

TIME_ZONE = &apos;America/Chicago&apos;
LANGUAGE_CODE = &apos;en-us&apos;

SITE_ID = 1

# если вы не будете пользоваться возможностями интернационализации, то для скорости
# работы лучше оставить этому параметру значение false
USE_I18N = False

MEDIA_ROOT = os.path.join( APPLICATION_DIR, &apos;resources&apos; )
MEDIA_URL = &apos;http://localhost:8000/resources/&apos;
ADMIN_MEDIA_PREFIX = &apos;/media/&apos;

# Сделайте этот ключ уникальным и никому его не показывайте.
SECRET_KEY = &apos;=y^moj$+yfgwy2kc7^oexnl-f6(b#rkvvhq6c-ckks9_c#$35&apos;

# Список загрузчиков шаблонов, которые могут импортировать шаблоны из различных 
# источников.
TEMPLATE_LOADERS = (
 &apos;django.template.loaders.filesystem.load_template_source&apos;,
 &apos;django.template.loaders.app_directories.load_template_source&apos;,
# &apos;django.template.loaders.eggs.load_template_source&apos;,
)

MIDDLEWARE_CLASSES = (
 &apos;django.middleware.common.CommonMiddleware&apos;,
 &apos;django.contrib.sessions.middleware.SessionMiddleware&apos;, 
 &apos;django.contrib.auth.middleware.AuthenticationMiddleware&apos;,
) 

ROOT_URLCONF = &apos;pytweetproj.urls&apos;

TEMPLATE_DIRS = (
 os.path.join( APPLICATION_DIR, &apos;templates&apos; ), 
)

INSTALLED_APPS = (
 &apos;django.contrib.auth&apos;,
 &apos;django.contrib.contenttypes&apos;,
 &apos;django.contrib.sessions&apos;,
 &apos;django.contrib.sites&apos;,
 &apos;twitterPanel&apos;,
)

# добавим это для сессий
SESSION_ENGINE = &apos;django.contrib.sessions.backends.cached_db&apos;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;
При задании директории приложения используйте вызов &lt;code&gt;os.path.dirname( globals()[ &apos;__file__&apos; ] )&lt;/code&gt;,
 который возвращает путь к текущей рабочей директории и работает на всех
 операционных системах. С помощью этого вызова задайте путь к 
директории ресурсов, а также TEMPLATE_DIR. Также необходимо задать 
переменной MEDIA_URL значение http://localhost:8000/resources/. &lt;br&gt;
Мы будем использовать базу данных sqlite3, по умолчанию включенную в 
Python. Также необходимо задать переменные DATABASE_ENGINE, 
DATABASE_NAME и ROOT_URLCONF. Обратите внимание, что в переменной 
INSTALLED_APPS, в которой перечисляются установленные приложения, 
указано еще не созданное приложение &lt;code&gt;twitterPanel&lt;/code&gt;. Мы создадим это приложение чуть позже. А пока выполним команду &lt;code&gt;python manage.py syncdb&lt;/code&gt; чтобы создать базу данных для session.db. &lt;br&gt;
Выполните команду &lt;code&gt;django-admin startapp twitterPanel&lt;/code&gt; чтобы создать приложение &lt;code&gt;twitterPanel&lt;/code&gt;,
 после чего перейдите в только что созданную директорию twitterPanel. В
 директории twitterPanel создайте директорию с именем templates, в 
которой мы будем хранить шаблоны Django. &lt;br&gt;
&lt;div class=&quot;ibm-alternate-rule&quot;&gt;&lt;hr&gt;&lt;/div&gt;&lt;div class=&quot;ibm-ind-link ibm-back-to-top&quot;&gt;&lt;a class=&quot;ibm-anchor-up-link&quot; href=&quot;http://www.ibm.com/developerworks/ru/library/os-social-twitter/index.html?S_TACT=105AGX99&amp;amp;S_CMP=GR01#ibm-pcon&quot;&gt;В начало&lt;/a&gt;&lt;/div&gt;&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;urls&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;Создаем адреса URL&lt;/span&gt;&lt;/a&gt;&lt;br&gt;
Откройте в своем любимом текстовом редакторе файл url.py, находящийся в 
 корневой директории проекта и поменяйте код в соответствии с листингом 
 5. В этом файле шаблонам адресов URL ставятся в соответствие функции 
обратного вызова. &lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;list5&quot;&gt;&lt;b&gt;Листинг 5. Настраиваем корневые адреса URL&lt;/b&gt;&lt;/a&gt;&lt;br&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;from django.conf.urls.defaults import *
from django.conf import settings

urlpatterns = patterns(&apos;&apos;,
 ( r&apos;^resources/(?P&lt;path&amp;gt;.*)$&apos;, 
 &apos;django.views.static.serve&apos;, 
 { &apos;document_root&apos;: settings.MEDIA_ROOT } ),
 ( r&apos;^twitterPanel/&apos;, include( &apos;twitterPanel.urls&apos; ) ),
)
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;
&lt;div class=&quot;ibm-container ibm-alt-header dw-container-sidebar&quot;&gt;&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;reg_exp&quot;&gt;&lt;/a&gt;&lt;h2&gt;Регулярные выражения&lt;/h2&gt;&lt;div class=&quot;ibm-container-body&quot;&gt;
 Согласно Википедии, регулярные выражения &quot;предоставляют лаконичные и 
гибкие средства для идентификации текста, представляющего интерес, 
например, содержащего определенные символы, слова или шаблоны 
символов&quot;. Если у вас нет опыта работы с регулярными выражениями, я 
рекомендую вам книгу &lt;em&gt;Mastering Regular Expressions&lt;/em&gt;, написанную Джеффри Фридлом (Jeffrey Friedl) или &lt;em&gt;Text Processing in Python&lt;/em&gt;,
 написанную Дэвидом Мерцем (David Mertz). Также можно начать с 
HOWTO-руководства по регулярным выражениям, размещенного на странице 
документации Python.&lt;br&gt;
&lt;/div&gt;&lt;/div&gt;Первый элемент &lt;code&gt;urlpatterns&lt;/code&gt; определяет, как 
будут обрабатываться статические ресурсы или медиа-файлы – например 
изображения. Поскольку мы используем сервер разработки Django, для 
обслуживания статических данных мы будем использовать представление &lt;code&gt;django.views.static.serve()&lt;/code&gt;. Второй элемент &lt;code&gt;urlpatterns&lt;/code&gt; подключает шаблоны URL, найденные в приложении &lt;code&gt;twitterPanel&lt;/code&gt;.
 Откройте файл url.py, находящийся в директории twitterPanel (не 
путайте его с файлом url.py, находящимся в корне проекта) и добавьте в 
него код, показанный в листинге 6. &lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;list6&quot;&gt;&lt;b&gt;Листинг 6. URL адреса приложения twitterPanel&lt;/b&gt;&lt;/a&gt;&lt;br&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;from django.conf.urls.defaults import *
from twitterPanel.views import *

urlpatterns = patterns( &apos;&apos;,
 url( r&apos;^$&apos;, index, name = &apos;twitterPanel_index&apos; ),
 url( r&apos;^panel/$&apos;, panel, name = &apos;twitterPanel_panel&apos; ),
 url( r&apos;^update/$&apos;, update, name = &apos;twitterPanel_update&apos; ),
)
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;
&lt;div class=&quot;ibm-alternate-rule&quot;&gt;&lt;hr&gt;&lt;/div&gt;&lt;div class=&quot;ibm-ind-link ibm-back-to-top&quot;&gt;&lt;a class=&quot;ibm-anchor-up-link&quot; href=&quot;http://www.ibm.com/developerworks/ru/library/os-social-twitter/index.html?S_TACT=105AGX99&amp;amp;S_CMP=GR01#ibm-pcon&quot;&gt;В начало&lt;/a&gt;&lt;/div&gt;&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;views&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;Представления&lt;/span&gt;&lt;/a&gt;&lt;br&gt;
Мы создадим только три представления: index, panel и update. Обратите 
внимание, что мы будем добавлять представления не в корень проекта, а в
 приложение twitterPanel. Откройте файл views.py, находящийся в 
директории twitterPanel, и добавьте в начало файла инструкции импорта, 
указанные в листинге 7: &lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;list7&quot;&gt;&lt;b&gt;Листинг 7. Инструкции импорта в файле представлений приложения twitterPanel&lt;/b&gt;&lt;/a&gt;&lt;br&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;from django.shortcuts import render_to_response
from django.template.context import RequestContext
import twitter
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;
Метод Django &lt;code&gt;render_to_response()&lt;/code&gt; отображает шаблон с определенным контекстом и возвращает объект класса &lt;code&gt;HttpResponse&lt;/code&gt;. &lt;code&gt;RequestContext&lt;/code&gt; - это контекст Django, немного отличающийся от обычного контекста &lt;code&gt;django.template.Context&lt;/code&gt;, а именно, он принимает объект класса &lt;code&gt;HttpRequest&lt;/code&gt; и автоматически заполняет контекст переменными, найденными в параметре &lt;code&gt;TEMPLATE_CONTEXT_PROCESSORS&lt;/code&gt;.&lt;br&gt;
Первый метод представления – &lt;code&gt;index()&lt;/code&gt; - должен выглядеть так, как показано в листинге 8. &lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;list8&quot;&gt;&lt;b&gt; Листинг 8. Представление &lt;code&gt;index&lt;/code&gt;&lt;/b&gt;&lt;/a&gt;&lt;br&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;def index(request):
 template = &apos;index.html&apos;
 userName = request.POST.get( &apos;userTxt&apos; )
 password = request.POST.get( &apos;passwordTxt&apos; )

 if userName is not None and password is not None: 
 try:
 api = twitter.Api( username = userName, password = password) 
 # запрашиваем 5 первых твитов
 statuses = api.GetUserTimeline()[0:5] 
 # получаем 120 первых друзей
 following = api.GetFriends()[0:120] 
 except NameError, e:
 print &quot;unable to login&quot;

 else:
 statuses = {}
 following = False 

 # помещаем данные в сессию
 request.session[&apos;statuses&apos;] = statuses
 request.session[&apos;following&apos;] = following
 request.session[&apos;userName&apos;] = userName
 request.session[&apos;password&apos;] = password
 
 data = {
 &apos;statuses&apos; : statuses,
 &apos;following&apos; : following,
 }

 return render_to_response(template, data, 
 context_instance = RequestContext(request))
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;
Шаблон index.html еще не написан. Сейчас мы пока просто запомним, что у
 нас есть два HTML-элемента: поля для ввода имени пользователя и 
пароля. Данные посылаются в представление с помощью метода &lt;code&gt;POST&lt;/code&gt;. Если имя пользователя и пароль введены, мы создаем объект класса &lt;code&gt;twitter.Api&lt;/code&gt;
 и извлекаем для этого пользователя первые 5 твитов и первых 120 
пользователей, за твитами которых он следит. Статусы, друзья, имя 
пользователя и пароль сохраняются в сеансе, чтобы к ним можно было 
обратиться в других частях нашей программы. &lt;br&gt;
Второй метод представления - &lt;code&gt;panel()&lt;/code&gt; - намного короче. Он показан в листинге 9. &lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;list9&quot;&gt;&lt;b&gt;Листинг 9. Представление &lt;code&gt;panel&lt;/code&gt;&lt;/b&gt;&lt;/a&gt;&lt;br&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;def panel(request):
 template = &apos;panel.html&apos;
 data = {
 &apos;statuses&apos; : request.session[&apos;statuses&apos;],
 &apos;following&apos; : request.session[&apos;following&apos;]
 }
 return render_to_response(template, data,
 context_instance = RequestContext(request))
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;
Здесь мы используем шаблон panel.html, которого также еще нет. После 
входа пользователя все действия происходят именно в этом представлении.
 Именно здесь отображаются твиты, друзья и выполняются обновления. Чуть 
 позже мы расскажем об этом подробнее. В настоящий момент все, что мы 
здесь делаем - это получаем из сеанса некоторые данные и вызываем метод
 &lt;code&gt;render_and_response&lt;/code&gt;. Третий метод представления - &lt;code&gt;update&lt;/code&gt; - напротив, немного сложнее. Взгляните на листинг 10:&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;list10&quot;&gt;&lt;b&gt;Листинг 10. Представление update&lt;/b&gt;&lt;/a&gt;&lt;br&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;def update(request):
 template = &apos;panel.html&apos;
 
 userName = request.session[&apos;userName&apos;]
 password = request.session[&apos;password&apos;]
 
 try:
 api = twitter.Api( username = request.session[&apos;userName&apos;], 
 password = request.session[&apos;password&apos;]) 
 api.PostUpdate(request.POST.get(&apos;updateTextArea&apos;))
 updated = True
 statuses = api.GetUserTimeline()[0:5] # перезагружаем статусы
 except NameError, e:
 print &quot;unable to login&quot;
 updated = False

 data = {
 &apos;userName&apos; : request.session[&apos;userName&apos;],
 &apos;password&apos; : request.session[&apos;password&apos;],
 &apos;updated&apos; : updated,
 &apos;statuses&apos; : statuses
 }
 return render_to_response(template, data,
 context_instance = RequestContext(request))
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;
Имя пользователя и пароль извлекаются из сеанса и используются для создания еще одного объекта &lt;code&gt;twitter.Api&lt;/code&gt;, который используется для отправки обновления. После этого производится перезагрузка статусов. &lt;br&gt;
&lt;div class=&quot;ibm-alternate-rule&quot;&gt;&lt;hr&gt;&lt;/div&gt;&lt;div class=&quot;ibm-ind-link ibm-back-to-top&quot;&gt;&lt;a class=&quot;ibm-anchor-up-link&quot; href=&quot;http://www.ibm.com/developerworks/ru/library/os-social-twitter/index.html?S_TACT=105AGX99&amp;amp;S_CMP=GR01#ibm-pcon&quot;&gt;В начало&lt;/a&gt;&lt;/div&gt;&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;templates&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;Шаблоны&lt;/span&gt;&lt;/a&gt;&lt;br&gt;
В директории twitterPanel/templates создайте файл index.html. Откройте 
этот файл и поместите в него код, показанный в листинге 11. &lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;list11&quot;&gt;&lt;b&gt;Листинг 11. Шаблон index&lt;/b&gt;&lt;/a&gt;&lt;br&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;&lt;html&amp;gt;
 &lt;head&amp;gt;
 &lt;title&amp;gt;Sample Python-Twitter Application&lt;/title&amp;gt;
 &lt;link type=&quot;text/css&quot; 
 href=&quot;{{MEDIA_URL}}css/cupertino/jquery-ui-1.7.2.custom.css&quot; 
 rel=&quot;stylesheet&quot; /&amp;gt;
 &lt;script type=&quot;text/javascript&quot; 
 src=&quot;{{MEDIA_URL}}js/jquery-1.3.2.min.js&quot;&amp;gt;&lt;/script&amp;gt;
 &lt;script type=&quot;text/javascript&quot; 
 src=&quot;{{MEDIA_URL}}js/jquery-ui-1.7.2.custom.min.js&quot;&amp;gt;&lt;/script&amp;gt;
 &lt;script type=&quot;text/javascript&quot;&amp;gt;

 $(function(){
 // Диалог 
 $(&apos;#dialog&apos;).dialog({
 autoOpen: false,
 width: 400,
 buttons: {
 &quot;Ok&quot;: function() {
 $(this).dialog(&quot;close&quot;);

 $.post(&apos;{% url twitterPanel_index %}&apos;, $(&quot;#loginForm&quot;).serialize()); 
 $( &apos;#panel&apos; ).html( &apos;&amp;amp;nbsp;&apos; ).load( &apos;{% url twitterPanel_panel %}&apos; )

 $( &apos;#dialog_link&apos; ).fadeOut(1500);
 $( &apos;#demoTitle&apos; ).fadeOut(1500);

 },
 &quot;Cancel&quot;: function() {
 $(this).dialog(&quot;close&quot;);
 }
 }
 });

 // Ссылка на диалог
 $(&apos;#dialog_link&apos;).click(function(){
 $(&apos;#dialog&apos;).dialog(&apos;open&apos;);
 return false;
 });
 //добавляем статическим виджетам &quot;подвешенное&quot; состояние
 $(&apos;#dialog_link, ul#icons li&apos;).hover(
 function() { $(this).addClass(&apos;ui-state-hover&apos;); },
 function() { $(this).removeClass(&apos;ui-state-hover&apos;); }
 );
 });
 &lt;/script&amp;gt;
 &lt;style type=&quot;text/css&quot;&amp;gt;
 body{ font: 62.5% &quot;Trebuchet MS&quot;, sans-serif; margin: 50px;}
 .demoHeaders { margin-top: 2em; }
 #dialog_link {padding: .4em 1em .4em 20px; 
 text-decoration:none; position: relative;}
 #dialog_link span.ui-icon {
 margin: 0 5px 0 0;position: absolute; 
 left: .2em;top: 50%;margin-top: -8px;}
 ul#icons {margin: 0; padding: 0;}
 ul#icons li {
 margin: 2px; position: relative; padding: 4px 0; 
 cursor: pointer; float: left; list-style: none;}
 ul#icons span.ui-icon {float: left; margin: 0 4px;}
 &lt;/style&amp;gt;
 &lt;/head&amp;gt;
 &lt;body&amp;gt;
 &lt;h2 id=&quot;demoTitle&quot; class=&quot;demoHeaders&quot;&amp;gt;PyTwitter Demo&lt;/h2&amp;gt;
 &lt;p&amp;gt;
 &lt;a href=&quot;#&quot; id=&quot;dialog_link&quot; class=&quot;ui-state-default ui-corner-all&quot;&amp;gt;
 &lt;span class=&quot;ui-icon ui-icon-newwin&quot;&amp;gt;&lt;/span&amp;gt;Start Demo
 &lt;/a&amp;gt;
 &lt;/p&amp;gt;
 &lt;div style=&quot;position: relative; width: 96%; height: 200px; padding:1% 4%; 
 overflow:hidden;&quot; class=&quot;fakewindowcontain&quot;&amp;gt;
 &lt;/div&amp;gt;
 &lt;!-- диалог ввода имени пользователя и пароля --&amp;gt;
 &lt;div id=&quot;dialog&quot; title=&quot;Login&quot; &amp;gt;
 &lt;p&amp;gt;
 &lt;form action=&quot;#&quot; name=&quot;loginForm&quot; id=&quot;loginForm&quot; method=&quot;POST&quot;&amp;gt;
 &lt;table&amp;gt;
 &lt;tr&amp;gt;
 &lt;td&amp;gt;user&lt;/td&amp;gt; &lt;td&amp;gt;&lt;input type=&quot;text&quot; name=&quot;userTxt&quot; id=&quot;userTxt&quot;/&amp;gt;&lt;/td&amp;gt;
 &lt;/tr&amp;gt;
 &lt;tr&amp;gt;
 &lt;td&amp;gt;password&lt;/td&amp;gt; 
 &lt;td&amp;gt;&lt;input type=&quot;password&quot; name=&quot;passwordTxt&quot; id=&quot;passwordTxt&quot;/&amp;gt;&lt;/td&amp;gt;
 &lt;/tr&amp;gt;
 &lt;/table&amp;gt;
 &lt;/form&amp;gt;
 &lt;/p&amp;gt;
 &lt;/div&amp;gt;

 &lt;!-- показываем только если пользователь вошел в систему --&amp;gt;
 &lt;!-- виджет Accordion --&amp;gt;
 &lt;div id=&quot;panel&quot; style=&quot;position: absolute; top: 2%; left:2%; 
 width:600px; visibility:visible;&quot;&amp;gt; 
 &lt;/div&amp;gt;
 
 &lt;/body&amp;gt;
&lt;/html&amp;gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;
На рисунке 2 показан вид нашего приложения при запуске: кнопка jQuery UI &lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;fig2&quot;&gt;&lt;b&gt;Рисунок 2. кнопка jQuery UI&lt;/b&gt;&lt;/a&gt;&lt;br&gt;
&lt;img alt=&quot;Screenshot displays jQuery UI button&quot; src=&quot;http://www.ibm.com/developerworks/ru/library/os-social-twitter/figure2.jpg&quot; height=&quot;126&quot; width=&quot;222&quot;&gt; &lt;br&gt;
&lt;br&gt;
Эта кнопка вызывает окно &lt;strong&gt;Login&lt;/strong&gt;, показанное на рисунке 3. &lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;fig3&quot;&gt;&lt;b&gt;Рисунок 3. Окно Login&lt;/b&gt;&lt;/a&gt;&lt;br&gt;
&lt;img alt=&quot;Figure 3 shows the login window&quot; src=&quot;http://www.ibm.com/developerworks/ru/library/os-social-twitter/figure3.jpg&quot; height=&quot;208&quot; width=&quot;426&quot;&gt; &lt;br&gt;
&lt;br&gt;
Давайте изучим код, показанный в &lt;a href=&quot;http://www.ibm.com/developerworks/ru/library/os-social-twitter/index.html?S_TACT=105AGX99&amp;amp;S_CMP=GR01#list11&quot;&gt;листинге 11&lt;/a&gt;. Сначала мы с помощью переменной &lt;code&gt;{{MEDIA_URL}}&lt;/code&gt; сообщаем браузеру о том, где находятся файлы CSS, JavaScript и jQuery. При отображении шаблона Django подставляет вместо &lt;code&gt;{{MEDIA_URL}}&lt;/code&gt; фактический путь к файлам.&lt;br&gt;
Внутри заголовка добавим свой код JavaScript. Знак доллара (&lt;code&gt;$&lt;/code&gt;) – это сокращение, с помощью которого можно обратиться к экземпляру jQuery. В jQuery краткая форма записи для &lt;code&gt;document.getElementById(&apos;name&apos;)&lt;/code&gt; выглядит так: &lt;code&gt;$(&apos;#name&apos;)&lt;/code&gt;. Например, мы определяем элемент dialog из jQuery UI с помощью тега &lt;code&gt;&lt;div&amp;gt;&lt;/code&gt;, а затем вызываем метод &lt;code&gt;.dialog()&lt;/code&gt; для создания окна jQuery. Внутри этого окна мы помещаем кнопки &lt;strong&gt;OK&lt;/strong&gt; и &lt;strong&gt;Cancel&lt;/strong&gt;. Кнопка &lt;strong&gt;Cancel&lt;/strong&gt; закрывает окно, а &lt;strong&gt;OK&lt;/strong&gt;
 не просто закрывает окно, но и посылает данные на сервер. Если 
данные, полученные представлением index, являются корректными именем 
пользователя и паролем, приложение вернет данные о твитах и о 
читателях твитов данного пользователя. После этого окно с кнопками 
исчезает и вместо него появляется панель Twitter. &lt;br&gt;
Вся магия здесь заключена в строке &lt;code&gt;$( &apos;#panel&apos; ).html( &apos;&amp;amp;nbsp;&apos; ).load( &apos;{% url twitterPanel_panel %}&apos; )&lt;/code&gt;,
 в которой загружается внешний шаблон Django с именем panel.html. 
Панель Twitter представляет собой виджет accordion, входящий в 
библиотеку jQuery UI. В листинге 12 показан код шаблона panel. 
Сохраните его в файле panel.html в директории twitterPanel/templates. &lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;list12&quot;&gt;&lt;b&gt;Листинг 12. Шаблон panel&lt;/b&gt;&lt;/a&gt;&lt;br&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td class=&quot;code-outline&quot;&gt;&lt;pre class=&quot;displaycode&quot;&gt;&lt;script type=&quot;text/javascript&quot;&amp;gt;
 $(function(){
 $(&quot;#main&quot;).accordion({
 header: &quot;h3&quot;,
 autoHeight: true
 })
 .hide()
 .fadeIn(1500);

 $(&apos;#updateTextArea&apos;).keyup(function(){ 
 // здесь text обозначает, сколько символов еще можно ввести. 
 // Var() - сколько символов уже введено
 var tweetLength = $(&apos;#updateTextArea&apos;).val().length;
 $(&apos;#charCount&apos;).text( 140 - tweetLength );
 });

 $(&apos;#updateBtn&apos;).click(function(){
 if($(&apos;#updateTextArea&apos;).val().length &lt;= 140){
 // отсылаем данные из формы на сервер
 $.post(&apos;{% url twitterPanel_update %}&apos;, $(&quot;#updateForm&quot;).serialize()); 
 $(&quot;#updateStatus&quot;).text(&quot;last update: &quot; + $(&apos;#updateTextArea&apos;).val());
 // очищаем текстовое поле
 $(&apos;#updateTextArea&apos;).val(&quot;&quot;); 
 // и сбрасываем счетчик
 $(&apos;#charCount&apos;).text( &quot;140&quot; );
 } 
 return false;
 });
 });
 &lt;/script&amp;gt; 
 
 &lt;div id=&quot;main&quot;&amp;gt;
 &lt;div&amp;gt;
 &lt;h3&amp;gt;&lt;a href=&quot;#&quot;&amp;gt;My Recent Tweets&lt;/a&amp;gt;&lt;/h3&amp;gt;
 &lt;div&amp;gt;
 {% if statuses %}
 {% for s in statuses %}
 &lt;p style=&quot;border-top:1px dashed #f00; margin-top:1em; 
 padding-top:1em font: 80% &apos;Trebuchet MS&apos;, sans-serif;&quot;&amp;gt;
 {{ s.text }}
 &lt;/p&amp;gt;
 {% endfor %}
 {% else %}
 No tweets found
 {% endif %}
 &lt;/div&amp;gt;
 &lt;/div&amp;gt;
 &lt;div&amp;gt;
 &lt;h3&amp;gt;&lt;a href=&quot;#&quot;&amp;gt;Update Status&lt;/a&amp;gt;&lt;/h3&amp;gt;
 &lt;div&amp;gt;
 &lt;form action=&quot;#&quot; id=&quot;updateForm&quot; name=&quot;updateForm&quot; method=&quot;POST&quot;&amp;gt;
 &lt;textarea id=&quot;updateTextArea&quot; name=&quot;updateTextArea&quot; rows=2 cols=70 /&amp;gt;
 &lt;button id=&quot;updateBtn&quot; class=&quot;ui-state-default ui-corner-all&quot;&amp;gt;Update&lt;/button&amp;gt;
 &lt;/form&amp;gt;
 &lt;div id=&quot;charCount&quot; name=&quot;charCount&quot; value=140&amp;gt;140&lt;/div&amp;gt;
 &lt;div id=&quot;updateStatus&quot; name=&quot;updateStatus&quot;&amp;gt;&lt;!-- update message here --&amp;gt;&lt;/div&amp;gt;
 &lt;/div&amp;gt;
 &lt;/div&amp;gt;
 &lt;div&amp;gt;
 &lt;h3&amp;gt;&lt;a href=&quot;#&quot;&amp;gt;Following&lt;/a&amp;gt;&lt;/h3&amp;gt;
 &lt;div&amp;gt;
 {% if following %}
 {% for f in following %}
 &lt;img src=&quot;{{ f.GetProfileImageUrl }}&quot; width=28 height=28 /&amp;gt;
 {% endfor %}
 {% else %}
 following variable is empty
 {% endif %}
 &lt;/div&amp;gt;
 &lt;/div&amp;gt;
 &lt;/div&amp;gt;

&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br&gt;
На рисунке 4 показана панель Twitter с вкладкой &lt;strong&gt;Update Status&lt;/strong&gt;.&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;fig4&quot;&gt;&lt;b&gt;Рисунок 4. Панель Twitter, показывающая вкладку Update Status&lt;/b&gt;&lt;/a&gt;&lt;br&gt;
&lt;img alt=&quot;Figure 4 shows screenshot of Twitter panel with Update Status tab&quot; src=&quot;http://www.ibm.com/developerworks/ru/library/os-social-twitter/figure4.jpg&quot; height=&quot;287&quot; width=&quot;572&quot;&gt; &lt;br&gt;
&lt;br&gt;
Дадим виджету accordion имя «main». Вся работа приложения после входа 
пользователя в систему происходит именно здесь. В этом виджете имеется
 3 вкладки: My Recent Tweets, Update Status и Following, которые 
показаны на рисунке 5. &lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;fig5&quot;&gt;&lt;b&gt;Рисунок 5. Панель Twitter, показывающая вкладку Following&lt;/b&gt;&lt;/a&gt;&lt;br&gt;
&lt;img alt=&quot;Figure 5 shows screenshot of Twitter panel, displaying the Following tab&quot; src=&quot;http://www.ibm.com/developerworks/ru/library/os-social-twitter/figure5.jpg&quot; height=&quot;287&quot; width=&quot;567&quot;&gt; &lt;br&gt;
&lt;br&gt;
На первой вкладке просто отображается 5 последних твитов. Если объект &lt;code&gt;status&lt;/code&gt; не пустой, Django проходит по всем объектам &lt;code&gt;status&lt;/code&gt; и отображает соответствующий текст. В противном случае на этой вкладке выводится сообщение &quot;No tweets found&quot;. &lt;br&gt;
На второй вкладке - Update Status - находится HTML-форма с текстовым полем и кнопкой. Под формой находятся 2 элемента &lt;code&gt;&lt;div&amp;gt;&lt;/code&gt;: один с именем &lt;code&gt;charCount&lt;/code&gt;, другой с именем &lt;code&gt;updateStatus&lt;/code&gt;. Вкладке Update Status назначается событие &lt;code&gt;onclick&lt;/code&gt;,
 при котором проверяется, что длина введенного сообщения не превышает 
140 символов, и, если это так, введенный текст отправляется с помощью 
имеющегося в jQuery метода &lt;code&gt;post&lt;/code&gt; в представление update, которое выполняет остальную работу. После этого на данной странице отображаются последние твиты. &lt;br&gt;
Ради интереса я также добавил JavaScript-код, подсчитывающий количество 
символов, которые еще можно ввести в твите. Как вы помните, Twitter 
ограничивает длину сообщения 140 символами. Этот код при каждом 
отпускании клавиши вычитает из 140 количество символов, введенных в 
поле &lt;strong&gt;update text&lt;/strong&gt;, после чего обновляет счетчик символов на странице. &lt;br&gt;
На третьей вкладке панели Twitter – &lt;strong&gt;Following&lt;/strong&gt; в первую очередь проверяется, что объект &lt;code&gt;following&lt;/code&gt; не пустой, и, если это так, то как и на вкладке &lt;strong&gt;My Recent Tweets&lt;/strong&gt;,
 приложение в цикле обходит всех пользователей. У каждого пользователя 
можно получить URL изображения, показываемого в профиле. Мы привяжем это
 значение к атрибуту &lt;code&gt;src&lt;/code&gt; тега &lt;code&gt;&lt;image&amp;gt;&lt;/code&gt;. В результате на третьей вкладке будут показаны все пользователи, за твитами которых вы следите. &lt;br&gt;
Теперь, когда мы разложили все по своим местам, давайте запустим сервер 
Django и откроем URL http://127.0.0.1:8000/twitterPanel. Вы должны 
увидеть кнопку jQuery UI для входа в приложение. После того как вы 
нажмете эту кнопку и введете имя пользователя и пароль для twitter, 
должна появиться панель Twitter. &lt;br&gt;
&lt;div class=&quot;ibm-alternate-rule&quot;&gt;&lt;hr&gt;&lt;/div&gt;&lt;div class=&quot;ibm-ind-link ibm-back-to-top&quot;&gt;&lt;a class=&quot;ibm-anchor-up-link&quot; href=&quot;http://www.ibm.com/developerworks/ru/library/os-social-twitter/index.html?S_TACT=105AGX99&amp;amp;S_CMP=GR01#ibm-pcon&quot;&gt;В начало&lt;/a&gt;&lt;/div&gt;&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;N103A2&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;Заключение&lt;/span&gt;&lt;/a&gt;&lt;br&gt;
Теперь, когда вы познакомились с демо-приложением, вы наверняка оценили 
 динамику и эффектность, придаваемую приложению библиотекой jQuery UI. В
 свою очередь Django облегчает работу с серверным кодом Python и 
шаблонами. &lt;br&gt;
Данное приложение можно улучшить, добавив проверки в процесс 
регистрации, окна с сообщениями об ошибках, список пользователей, 
следящих за вашими твитами, посылку личных твитов, а также поиск 
твитов. Разумеется, возможности расширения приложения ограничены 
только вашим воображением. &lt;br&gt;
&lt;br&gt;
&lt;div class=&quot;ibm-alternate-rule&quot;&gt;&lt;hr&gt;&lt;/div&gt;&lt;div class=&quot;ibm-ind-link ibm-back-to-top&quot;&gt;&lt;a class=&quot;ibm-anchor-up-link&quot; href=&quot;http://www.ibm.com/developerworks/ru/library/os-social-twitter/index.html?S_TACT=105AGX99&amp;amp;S_CMP=GR01#ibm-pcon&quot;&gt;В начало&lt;/a&gt;&lt;/div&gt;&lt;span class=&quot;atitle&quot;&gt;&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;download&quot;&gt;Загрузка&lt;/a&gt;&lt;/span&gt;&lt;br&gt;
&lt;table class=&quot;ibm-data-table&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;th scope=&quot;col&quot;&gt;Описание&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Имя&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Размер&lt;/th&gt;&lt;th scope=&quot;col&quot;&gt;Метод загрузки&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tb-row&quot; scope=&quot;row&quot;&gt;Пример кода&lt;/td&gt;&lt;td nowrap=&quot;nowrap&quot;&gt;os-social-twitter-pytweetproj.zip&lt;/td&gt;&lt;td nowrap=&quot;nowrap&quot;&gt;160КБ&lt;/td&gt;&lt;td nowrap=&quot;nowrap&quot;&gt;&lt;a class=&quot;fbox&quot; href=&quot;http://www.ibm.com/developerworks/apps/download/index.jsp?contentid=521897&amp;amp;filename=os-social-twitter-pytweetproj.zip&amp;amp;method=http&amp;amp;locale=ru_RU&quot;&gt;HTTP&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;a class=&quot;ibm-forward-link&quot; href=&quot;http://www.ibm.com/developerworks/library/whichmethod.html&quot;&gt;Информация о методах загрузки&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/web-twitter.html&quot; name=&quot;resources&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;Ресурсы&lt;/span&gt;&lt;/a&gt;&lt;br&gt;
&lt;b&gt;Научиться&lt;/b&gt;&lt;br&gt;
&lt;ul&gt;&lt;li&gt;Ознакомьтесь с оригиналом статьи: &lt;a href=&quot;http://www.ibm.com/developerworks/opensource/library/os-social-twitter/index.html?S_TACT=105AGX99&amp;amp;S_CMP=CP&quot;&gt;Build a Twitter Web application&lt;/a&gt; (EN, developerWorks, ноябрь 2009 г.).&lt;br&gt;
&lt;/li&gt;&lt;li&gt; Узнайте о &lt;a href=&quot;http://en.wikipedia.org/wiki/Representational_State_Transfer&quot;&gt;REST-архитектуре разработки приложений&lt;/a&gt; (EN).&lt;br&gt;
&lt;/li&gt;&lt;li&gt; Ознакомьтесь с &lt;a href=&quot;https://twitterapi.pbworks.com/Twitter-API-Documentation&quot;&gt;документацией по API Twitter&lt;/a&gt; (EN), чтобы узнать об этом API все, что вам нужно.&lt;br&gt;
&lt;/li&gt;&lt;li&gt; Следите за новостями в разделе &lt;a href=&quot;http://www.ibm.com/developerworks/offers/techbriefings/?S_TACT=105AGX99&amp;amp;S_CMP=CP&quot;&gt;технических мероприятий и Web-трансляций&lt;/a&gt; developerWorks.&lt;br&gt;
&lt;/li&gt;&lt;li&gt; Следите за &lt;a href=&quot;http://twitter.com/developerworks&quot;&gt;developerWorks в Twitter&lt;/a&gt;.&lt;br&gt;
&lt;/li&gt;&lt;li&gt; Предстоящие конференции, выставки, сеансы Web-вещания и другие &lt;a href=&quot;http://www.ibm.com/developerworks/views/opensource/events.jsp&quot;&gt;события&lt;/a&gt; во всем мире, интересные для разработчиков open source.(EN) &lt;br&gt;
&lt;/li&gt;&lt;li&gt; Бесплатные &lt;a href=&quot;http://www.ibm.com/developerworks/offers/lp/demos/?S_TACT=105AGX99&amp;amp;S_CMP=CP&quot;&gt;демонстрации developerWorks по требованию&lt;/a&gt; технологий и возможностей продуктов IBM и open source.(EN) &lt;br&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Получить продукты и технологии&lt;/b&gt;&lt;br&gt;
&lt;ul&gt;&lt;li&gt; Загрузите &lt;a href=&quot;http://www.python.org/&quot;&gt;Python&lt;/a&gt;, найдите документацию и проработайте обучающее руководство по Python. Затем загрузите библиотеку &lt;a href=&quot;http://code.google.com/p/python-twitter&quot;&gt;python-twitter&lt;/a&gt; (EN).&lt;br&gt;
&lt;/li&gt;&lt;li&gt; Загрузите &lt;a href=&quot;http://www.djangoproject.com/&quot;&gt;Django&lt;/a&gt;, &lt;a href=&quot;http://jquery.com/&quot;&gt;jQuery&lt;/a&gt; и &lt;a href=&quot;http://jqueryui.com/&quot;&gt;jQuery UI&lt;/a&gt; (EN).&lt;br&gt;
&lt;/li&gt;&lt;li&gt; Обязательно загрузите &lt;a href=&quot;http://cheeseshop.python.org/pypi/simplejson&quot;&gt;simplejson&lt;/a&gt; (EN) - пакет, необходимый для работы библиотеки python-twitter.&lt;br&gt;
&lt;/li&gt;&lt;li&gt; Разработайте ваш следующий проект с помощью &lt;a href=&quot;http://www.ibm.com/developerworks/downloads/?S_TACT=105AGX99&amp;amp;S_CMP=CP&quot;&gt;пробного ПО от IBM&lt;/a&gt;, доступного для загрузки и на DVD.&lt;/li&gt;&lt;/ul&gt;</content:encoded>
			<link>https://alldev.perm.ru/blog/sozdaem_web_prilozhenie_umejushhee_rabotat_s_twitter/2010-09-17-3</link>
			<dc:creator>artkil</dc:creator>
			<guid>https://alldev.perm.ru/blog/sozdaem_web_prilozhenie_umejushhee_rabotat_s_twitter/2010-09-17-3</guid>
			<pubDate>Fri, 17 Sep 2010 11:28:52 GMT</pubDate>
		</item>
		<item>
			<title>Dell Inspiron Duo — гибрид нетбука и планшета</title>
			<description>Можно сказать что буквально только что компания &lt;b&gt;Dell&lt;/b&gt; представила концепцию нового класса устройств — гибрид нетбука и планшета, в виде устройства под названием &lt;b&gt;Dell Inspiron Duo&lt;/b&gt;....</description>
			<content:encoded>Можно сказать что буквально только что компания &lt;b&gt;Dell&lt;/b&gt; представила концепцию нового класса устройств — гибрид нетбука и планшета, в виде устройства под названием &lt;b&gt;Dell Inspiron Duo&lt;/b&gt;.$CUT$&lt;br&gt;
&lt;br&gt;
&lt;img alt=&quot;Dell-Inspiron-Duo-1&quot; src=&quot;http://img.skitch.com/20100916-tw76wsybn1gcmq383uk99351qf.jpg&quot;&gt;&lt;br&gt;
&lt;br&gt;
&lt;a name=&quot;more&quot;&gt;&lt;/a&gt;Отнести устройство к определенному из существующих 
классов сложно, поскольку таковой отсутствует, однако многие уже успели
 дают ему название «кабриолет».&lt;br&gt;
&lt;br&gt;
Что же так уникален &lt;b&gt;Dell Inspiron Duo&lt;/b&gt; в своей конструкции и что представляет из себя внутри?&lt;br&gt;
&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/dell-inspiron-duo.html&quot; name=&quot;habracut&quot;&gt;&lt;/a&gt;&lt;br&gt;
Внешне Dell Inspiron Duo представляет из себя классический нетбук с 10&quot; экраном на базе Windows 7.&lt;br&gt;
&lt;img alt=&quot;Dell-Inspiron-Duo-2&quot; src=&quot;http://img.skitch.com/20100916-g95tmeghjaruqns7mc1cj56gur.jpg&quot;&gt;&lt;br&gt;
Однако легким поворотом экрана (именно в принципе вращения экрана и 
кроется его революционность) он превращается в планшет на той же Windows
 7 но с переработанным UI под «планшетную» сторону устройства.&lt;br&gt;
&lt;img alt=&quot;Dell-Inspiron-Duo-3&quot; src=&quot;http://img.skitch.com/20100916-e93u5g4xyxwkq1ff89f14jipdm.jpg&quot;&gt;&lt;br&gt;
Новая модель будет работать на базе процессора Intel Atom N550 1,5 ГГц 
Dual Core, 1 или 2 Gb оперативной памяти DDR3 и HDD (размеры пока небыли
 объявлены). Dell Inspiron Duo будет оснащен практически всеми 
стандартными портами I/O которые можно найти в классических нетбуках.&lt;br&gt;
&lt;img alt=&quot;Dell-Inspiron-Duo-4&quot; src=&quot;http://img.skitch.com/20100916-ff12riege7xnt6gnpbkn3eqjti.jpg&quot;&gt;&lt;br&gt;
О приблизительных ценах на Dell Inspiron Duo конечно пока информации 
нет, как и конкретных датах начала продаж. Однако Dell пообещало что 
пользователи смогут купить Dell Inspiron Duo ужа до конца этого года.</content:encoded>
			<link>https://alldev.perm.ru/blog/dell_inspiron_duo_gibrid_netbuka_i_plansheta/2010-09-17-2</link>
			<dc:creator>artkil</dc:creator>
			<guid>https://alldev.perm.ru/blog/dell_inspiron_duo_gibrid_netbuka_i_plansheta/2010-09-17-2</guid>
			<pubDate>Fri, 17 Sep 2010 11:27:42 GMT</pubDate>
		</item>
		<item>
			<title>Сохраняем видео из Flash Player 10.2 или unlink нам не помеха</title>
			<description>Я, как, вероятно, и многие другие пользователи Linux, привык сохранять 
видео с сайтов вроде YouTube, копируя временные файлы, создаваемые Adobe
 Flash....</description>
			<content:encoded>Я, как, вероятно, и многие другие пользователи Linux, привык сохранять 
видео с сайтов вроде YouTube, копируя временные файлы, создаваемые Adobe
 Flash.$CUT$&lt;br&gt;
&lt;a name=&quot;more&quot;&gt;&lt;/a&gt; Примерно так:&lt;br&gt;
&lt;br&gt;
&lt;blockquote&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;$ cp /tmp/FlashIBmQCU video.flv&lt;/pre&gt;&lt;/blockquote&gt;&lt;br&gt;
Поставив свежий пре-релиз флэш-плеера, который на днях &lt;a href=&quot;http://habrahabr.ru/blogs/adobe/104330/&quot; title=&quot;Вышел Preview Release 64-битного флеш-плеера для всех платформ&quot;&gt;обсуждали на хабре&lt;/a&gt;
 (у меня 64-битная система), я с удивлением обнаружил, что этот способ 
 больше не работает, так как никакие файлы во временном каталоге не 
создаются. Рассудив, однако, что едва ли плеер хранит видео целиком в 
памяти, и куда-то он его всё-таки должен писать, я приступил к 
расследованию.&lt;br&gt;
&lt;a href=&quot;http://admoprog.blogspot.com/2010/09/flash-player-102-unlink.html&quot; name=&quot;habracut&quot;&gt;&lt;/a&gt;&lt;br&gt;
…То есть решил посмотреть список открытых плагином файлов. Для начала 
нам нужен PID процесса, в котором хостится плагин. Пользуюсь я 
Firefox-ом, так что искать будем просто:&lt;br&gt;
&lt;blockquote&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;$ ps x | grep firefox
 9800 ? S 0:00 /bin/sh /usr/lib/firefox-3.6.9/firefox
 9805 ? S 0:00 /bin/sh /usr/lib/firefox-3.6.9/run-mozilla.sh /usr/lib/firefox-3.6.9/firefox-bin
 9809 ? Sl 14:58 /usr/lib/firefox-3.6.9/firefox-bin
10099 ? Sl 4:10 /usr/lib/firefox-3.6.9/plugin-container /usr/lib/mozilla/plugins/libflashplayer.so 9809 plugin
26199 pts/13 S+ 0:00 grep firefox&lt;/pre&gt;&lt;/blockquote&gt;&lt;br&gt;
Как видно, Mozilla запускает плагин в отдельном процессе и его PID&amp;nbsp;— 
10099. Теперь список открытых файлов можно посмотреть командой &lt;code&gt;lsof&lt;/code&gt;:&lt;br&gt;
&lt;blockquote&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;$ lsof -p 10099
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
# поскипано 152 строки
plugin-co 10099 rooslan mem REG 8,21 26048 2656 /usr/lib/gconv/gconv-modules.cache
plugin-co 10099 rooslan mem REG 8,21 343 106080 /usr/lib/locale/ru_RU.utf8/LC_IDENTIFICATION
plugin-co 10099 rooslan 0r CHR 1,3 3419 /dev/null
plugin-co 10099 rooslan 1w FIFO 0,6 9649 pipe
plugin-co 10099 rooslan 2w FIFO 0,6 9649 pipe
plugin-co 10099 rooslan 3u unix 0xffff88007304a3c0 287192 socket
plugin-co 10099 rooslan 4r 0000 0,7 0 32 anon_inode
plugin-co 10099 rooslan 5w unix 0xffff8800c5425e40 287277 socket
plugin-co 10099 rooslan 6r unix 0xffff8800c5424b00 287278 socket
plugin-co 10099 rooslan 7w FIFO 0,6 287279 pipe
plugin-co 10099 rooslan 8r FIFO 0,6 287279 pipe
plugin-co 10099 rooslan 9w FIFO 0,6 287280 pipe
plugin-co 10099 rooslan 10u FIFO 0,6 287280 pipe
plugin-co 10099 rooslan 11u FIFO 0,6 287281 pipe
plugin-co 10099 rooslan 12u FIFO 0,6 287281 pipe
plugin-co 10099 rooslan 13u unix 0xffff88007304a100 287284 socket
plugin-co 10099 rooslan 14u REG 8,24 376832 1409239 /home/rooslan/.mozilla/firefox/xxxxxxxx.default/cert8.db
plugin-co 10099 rooslan 15w REG 8,24 16384 1409240 /home/rooslan/.mozilla/firefox/xxxxxxxx.default/key3.db
plugin-co 10099 rooslan 16u REG 8,23 494641 16 /tmp/FlashXXlm7mcU (deleted)
plugin-co 10099 rooslan 17u FIFO 0,6 404625 pipe
plugin-co 10099 rooslan 18u FIFO 0,6 404625 pipe
plugin-co 10099 rooslan 19r FIFO 0,6 404626 pipe
plugin-co 10099 rooslan 20w FIFO 0,6 404626 pipe
plugin-co 10099 rooslan 21r unix 0xffff880015a2b9c0 404630 socket&lt;/pre&gt;&lt;/blockquote&gt;&lt;br&gt;
Всё самое интересное оказалось в конце и сразу перед глазами, но для 
порядка попробуем отфильтровать открытые процессом обычные (regular) 
файлы. Вероятно, это можно сделать встроенными средствами &lt;code&gt;lsof&lt;/code&gt;, но размеры &lt;code&gt;man lsof&lt;/code&gt;
 быстро отбивают желание читать его для решения такой проходной задачи.
 Поэтому я предпочёл воспользоваться простым фильтром на AWK:&lt;br&gt;
&lt;blockquote&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;$ lsof -p 10099 | awk &apos;$4 ~ /^[0-9]+/ &amp;amp;&amp;amp; $5 == &quot;REG&quot;&apos;
plugin-co 10099 rooslan 14u REG 8,24 376832 1409239 /home/rooslan/.mozilla/firefox/xxxxxxxx.default/cert8.db
plugin-co 10099 rooslan 15w REG 8,24 16384 1409240 /home/rooslan/.mozilla/firefox/xxxxxxxx.default/key3.db
plugin-co 10099 rooslan 16u REG 8,23 494641 16 /tmp/FlashXXlm7mcU (deleted)&lt;/pre&gt;&lt;/blockquote&gt;&lt;br&gt;
Сразу стало понятно, куда делся наш временный файл: плагин удалил (&lt;a href=&quot;http://linux.die.net/man/2/unlink&quot; title=&quot;man 2 unlink&quot;&gt;unlink&lt;/a&gt;)
 ссылку на файл из каталога, но оставил открытым его дескриптор. Таким 
 образом файл перестал быть виден в файловой системе, но не исчез, и 
окончательно удалён он будет только когда закроется последний 
ссылающийся на него дескриптор.&lt;br&gt;
Но как нам теперь достать содержимое файла, открытого лишь одним процессом? Очень просто, с помощью файловой системы &lt;a href=&quot;http://linux.die.net/man/5/proc&quot; title=&quot;man 5 proc&quot;&gt;procfs&lt;/a&gt;. Каталог &lt;code&gt;/proc/$PID/fd&lt;/code&gt; содержит символьные ссылки на все открытые процессом &lt;em&gt;PID&lt;/em&gt; дескрипторы.&lt;br&gt;
&lt;blockquote&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;$ ls -l /proc/10099/fd
итого 0
lr-x------ 1 rooslan rooslan 64 2010-09-16 23:56 0 -&amp;gt; /dev/null
l-wx------ 1 rooslan rooslan 64 2010-09-16 23:56 1 -&amp;gt; pipe:[9649]
lrwx------ 1 rooslan rooslan 64 2010-09-16 23:56 10 -&amp;gt; pipe:[287280]
lrwx------ 1 rooslan rooslan 64 2010-09-16 23:56 11 -&amp;gt; pipe:[287281]
lrwx------ 1 rooslan rooslan 64 2010-09-16 23:56 12 -&amp;gt; pipe:[287281]
lrwx------ 1 rooslan rooslan 64 2010-09-16 23:56 13 -&amp;gt; socket:[287284]
lrwx------ 1 rooslan rooslan 64 2010-09-16 23:56 14 -&amp;gt; /home/rooslan/.mozilla/firefox/xxxxxxxx.default/cert8.db
l-wx------ 1 rooslan rooslan 64 2010-09-16 23:56 15 -&amp;gt; /home/rooslan/.mozilla/firefox/xxxxxxxx.default/key3.db
lrwx------ 1 rooslan rooslan 64 2010-09-16 23:56 16 -&amp;gt; /tmp/FlashXXpOdDuF (deleted)
lrwx------ 1 rooslan rooslan 64 2010-09-16 23:56 17 -&amp;gt; pipe:[396658]
lrwx------ 1 rooslan rooslan 64 2010-09-16 23:56 18 -&amp;gt; pipe:[396658]
lr-x------ 1 rooslan rooslan 64 2010-09-16 23:56 19 -&amp;gt; pipe:[396659]
l-wx------ 1 rooslan rooslan 64 2010-09-16 23:56 2 -&amp;gt; pipe:[9649]
l-wx------ 1 rooslan rooslan 64 2010-09-16 23:56 20 -&amp;gt; pipe:[396659]
lr-x------ 1 rooslan rooslan 64 2010-09-16 23:56 21 -&amp;gt; socket:[396663]
lrwx------ 1 rooslan rooslan 64 2010-09-16 23:56 3 -&amp;gt; socket:[287192]
lr-x------ 1 rooslan rooslan 64 2010-09-16 23:56 4 -&amp;gt; anon_inode:[eventpoll]
l-wx------ 1 rooslan rooslan 64 2010-09-16 23:56 5 -&amp;gt; socket:[287277]
lr-x------ 1 rooslan rooslan 64 2010-09-16 23:56 6 -&amp;gt; socket:[287278]
l-wx------ 1 rooslan rooslan 64 2010-09-16 23:56 7 -&amp;gt; pipe:[287279]
lr-x------ 1 rooslan rooslan 64 2010-09-16 23:56 8 -&amp;gt; pipe:[287279]
l-wx------ 1 rooslan rooslan 64 2010-09-16 23:56 9 -&amp;gt; pipe:[287280]&lt;/pre&gt;&lt;/blockquote&gt;&lt;br&gt;
(Вот, кстати, ещё один способ посмотреть открытые процессом файлы, помимо &lt;code&gt;lsof&lt;/code&gt;).&lt;br&gt;
И, хотя &lt;a href=&quot;http://linux.die.net/man/2/readlink&quot; title=&quot;man 2 readlink&quot;&gt;readlink&lt;/a&gt;
 возвращает для некоторых из этих ссылок имена несуществующих файлов, 
из них можно спокойно читать (если права позволяют), чем мы и 
воспользуемся:&lt;br&gt;
&lt;blockquote&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;$ cp /proc/10099/fd/16 video.flv&lt;/pre&gt;&lt;/blockquote&gt;&lt;br&gt;
Вот и всё. Это достаточно тривиальные вещи (многие, думаю, догадались, о
 чём пойдёт речь с одного лишь заголовка), но, надеюсь, для кого-то 
этот простой трюк окажется полезным.</content:encoded>
			<link>https://alldev.perm.ru/blog/sokhranjaem_video_iz_flash_player_10_2_ili_unlink_nam_ne_pomekha/2010-09-17-1</link>
			<dc:creator>artkil</dc:creator>
			<guid>https://alldev.perm.ru/blog/sokhranjaem_video_iz_flash_player_10_2_ili_unlink_nam_ne_pomekha/2010-09-17-1</guid>
			<pubDate>Fri, 17 Sep 2010 11:26:20 GMT</pubDate>
		</item>
	</channel>
</rss>