<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8511633488317993065</id><updated>2024-08-28T10:59:42.030-07:00</updated><title type='text'>Admoprog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://admoprog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://admoprog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>anatakil</name><uri>http://www.blogger.com/profile/13091951289499869135</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>32</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8511633488317993065.post-1362636076731100991</id><published>2011-03-17T06:45:00.001-07:00</published><updated>2011-03-17T06:45:34.041-07:00</updated><title type='text'>Восстановление данных с CD/DVD.</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Во-первых, никогда не храните важные данные на компакт-дисках. Даже  самые надежные из прослужат вам недолго! Дали диск&amp;nbsp; другу, принесли на  работу - и диск медленно, но верно портится. Но если испорченные фильмы  можно скачать в интернете, то важные документы уже будет трудновато  восстановить.&lt;br /&gt;
Но все-таки ваши драгоценные файлы можно вернуть с  помощью специальных, программ. Принцип работы таких программ в основном  одинаков. Операционная система при чтении битого файла прекращает его  чтение, а специальные утилиты могут копировать весь файл целиком. Но  если, например, в вашей курсовой исчезнет пара другая строк это все-таки  не так страшно как потеря всей курсовой.&lt;br /&gt;
Итак, рассмотрим наиболее популярные программы восстановления данных.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
BadCopy Pro. &lt;/b&gt;Одна  из самых популярных программ по восстановлению информации с  поврежденных носителей. Схема работы проста: выбираем необходимый  носитель, выбираем режим восстановения и жмем на кнопку &quot;Восстановить&quot;.  Кстати, в BadCopy можен устанавливать глубину сканирования носителя,  хотя это пагубно сказывается на скорости работы программы. После  завершения восстановления нужно указать куда программа сохранит  восстановленные файлы.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
IsoBuster&lt;/b&gt;. Неплохая программа с  большам количеством поддерживаемых носителей, включая HD DVD и Blu-Ray.  Pro версия имеет больше возможностей для восстановления, но за это надо  будет заплатить. Free версия имеет базовый набор утилит для  восстановления, так что можно пользоваться и бесплатной версией.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
CDCheck&lt;/b&gt;.  Не только восстанавливает данные с носителя, но и указывает возможные  причины возникновения повреждений носителя. Самый большой минус  программы - это нероятная медлительность программы.&lt;br /&gt;
&lt;br /&gt;
В заключении хочу сказать что поцарапанные диски еще не повод для паники. Полезные утилиты помогут вам. &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admoprog.blogspot.com/feeds/1362636076731100991/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://admoprog.blogspot.com/2011/03/cddvd.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/1362636076731100991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/1362636076731100991'/><link rel='alternate' type='text/html' href='http://admoprog.blogspot.com/2011/03/cddvd.html' title='Восстановление данных с CD/DVD.'/><author><name>anatakil</name><uri>http://www.blogger.com/profile/13091951289499869135</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511633488317993065.post-4505880761422130942</id><published>2011-03-07T08:48:00.000-08:00</published><updated>2011-03-07T08:50:01.889-08:00</updated><title type='text'>OpenGL и GLUT</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div class=&quot;postentry&quot;&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;Содержание:&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt; &lt;div&gt;&lt;a href=&quot;http://admoprog.blogspot.com/2011/03/opengl-glut.html#1&quot;&gt;Что        такое GLUT?&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt; &lt;div&gt;&lt;a href=&quot;http://admoprog.blogspot.com/2011/03/opengl-glut.html#2&quot;&gt;Основные        шаги для построения минимальной программы&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt; &lt;div&gt;&lt;a href=&quot;http://admoprog.blogspot.com/2011/03/opengl-glut.html#3&quot;&gt;Работа        с окнами в GLUT&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt; &lt;div&gt;&lt;a href=&quot;http://admoprog.blogspot.com/2011/03/opengl-glut.html#4&quot;&gt;Связь        между GLUT и вашей OpenGL программой&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/a&gt;&lt;span id=&quot;more-20&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;a href=&quot;http://www.blogger.com/post-edit.g?blogID=8511633488317993065&amp;amp;postID=4505880761422130942&quot; name=&quot;1&quot;&gt;1. Что такое GLUT?&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
Как вы уже знаете, OpenGL является мультиплатформенной библиотекой,     т.е. программы написанные с помощью OpenGL можно легко переносить на  различные    операционные системы, при этом получая один и тот же  визуальный результат. Единственное    что плохо – это то, что для  конкретной операционной системы необходимо    по своему производить  настройку OpenGL. То есть, допустим, вы написали OpenGL    программу под  Windows и захотели перенести её в Linux, код OpenGL должен перенестись     без проблем, но вот операции с окнами, интерфейс управления, операции  с устройствами    ввода/вывода нужно заново переписать уже под другую  операционную систему – Linux.&lt;br /&gt;
К счастью, существует специальная мультиплатформенная библиотека,     позволяющая решить вышеописанные проблемы. И называется эта библиотека –     GLUT.&lt;br /&gt;
Данная статья познакомит вас с основными возможностями  программирования    с использованием GLUT. Вы узнаете каким образом  создавать окна, элементы интерфейса,    управлять устройствами  ввода/вывода и как все это связывать с OpenGL. В первой    части этой  статьи вы познакомитесь с основами GLUTа и основными операциями с     окнами.&lt;br /&gt;
&lt;span style=&quot;color: maroon;&quot;&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;b&gt;&lt;a href=&quot;http://www.blogger.com/post-edit.g?blogID=8511633488317993065&amp;amp;postID=4505880761422130942&quot; name=&quot;2&quot;&gt;2. Основные шаги для    построения минимальной программы&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
Прежде всего необходимо научиться самому основному – это созданию     окна, в котором можно будет рисовать с помощью OpenGL. Минимальная  программа,    которая создает окно и что-нибудь рисует там состоит из  следующих шагов:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt; &lt;div&gt;Инициализация GLUT&lt;/div&gt;&lt;/li&gt;
&lt;li&gt; &lt;div&gt;Установка параметров окна.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt; &lt;div&gt;Создание окна.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt; &lt;div&gt;Установка функций, отвечающих за рисование в окне и изменении        формы окна.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt; &lt;div&gt;Вход в главный цикл GLUT.&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;Итак, рассмотрим все 5 пунктов поподробнее:&lt;br /&gt;
1. Инициализация GLUT производится командой:&lt;br /&gt;
&lt;b&gt;void glutInit(int *argcp, char **argv);&lt;/b&gt;&lt;br /&gt;
Первый параметр представляет из себя указатель на количество  аргументов    в командной строке, а второй – указатель на массив  аргументов. Обычно эти значения    берутся из главной функции программы:  &lt;b&gt;int main(int argc, char *argv[])&lt;/b&gt;.&lt;br /&gt;
2. Установка параметров окна содержит в себе несколько этапов. Прежде    всего необходимо указать размеры окна:&lt;br /&gt;
&lt;b&gt;void glutInitWindowSize(int width, int height);&lt;/b&gt;&lt;br /&gt;
Первый параметр width – ширина окна в пикселях, второй height –     высота окна в пикселях. Отмечу также, что если эту команду опустить, то  GLUT    сам установит размеры окна по умолчанию, обычно это 300×300.&lt;br /&gt;
Далее можно задать положение создаваемого окна относительно    верхнего левого угла экрана. Делается это командой:&lt;br /&gt;
&lt;b&gt;void glutInitWindowPosition(int x, int y); &lt;/b&gt;&lt;br /&gt;
Необходимо также установить для окна режим отображения информации.     Т.е. установить для окна такие параметры как: используемая цветовая  модель,    количество различных буферов, и т.д. Для этого в GLUT  существует команда:&lt;br /&gt;
&lt;b&gt;void glutInitDisplayMode(unsigned int mode);&lt;/b&gt;&lt;br /&gt;
У команды имеется единственный параметр, который может быть  представлен    одной из следующих констант или комбинацией этих констант  с помощью побитового    ИЛИ.&lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td bgcolor=&quot;yellow&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;Константа&lt;/span&gt;&lt;/b&gt;&lt;/td&gt; &lt;td bgcolor=&quot;yellow&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;Значение&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;&lt;b&gt;GLUT_RGB&lt;/b&gt;&lt;/td&gt; &lt;td&gt;Для отображения графической информации используются 3 компоненты цвета        RGB.&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;&lt;b&gt;GLUT_RGBA&lt;/b&gt;&lt;/td&gt; &lt;td&gt;То же что и RGB, но используется также 4 компонента ALPHA (прозрачность).&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;&lt;b&gt;GLUT_INDEX&lt;/b&gt;&lt;/td&gt; &lt;td&gt;Цвет задается не с помощью RGB компонентов, а с помощью палитры.         Используется для старых дисплеев, где количество цветов например  256.&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;&lt;b&gt;GLUT_SINGLE&lt;/b&gt;&lt;/td&gt; &lt;td&gt;Вывод в окно осуществляется с использованием 1 буфера. Обычно используется        для статического вывода информации.&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;&lt;b&gt;GLUT_DOUBLE&lt;/b&gt;&lt;/td&gt; &lt;td&gt;Вывод в окно осуществляется с использованием 2 буферов. Применяется для        анимации, чтобы исключить эффект мерцания.&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;&lt;b&gt;GLUT_ACCUM&lt;/b&gt;&lt;/td&gt; &lt;td&gt;Использовать также буфер накопления (Accumulation Buffer). Этот  буфер        применяется для создания специальных эффектов, например  отражения и тени.&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;&lt;b&gt;GLUT_ALPHA&lt;/b&gt;&lt;/td&gt; &lt;td&gt;Использовать буфер ALPHA. Этот буфер, как уже говорилось  используется        для задания 4-го компонента цвета – ALPHA. Обычно  применяется для таких        эффектов как прозрачность объектов и  антиалиасинг.&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;&lt;b&gt;GLUT_DEPTH&lt;/b&gt;&lt;/td&gt; &lt;td&gt;Создать буфер глубины. Этот буфер используется для отсечения  невидимых        линий в 3D пространстве при выводе на плоский экран  монитора.&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;&lt;b&gt;GLUT_STENCIL&lt;/b&gt;&lt;/td&gt; &lt;td&gt;Буфер трафарета используется для таких эффектов как вырезание части  фигуры,        делая этот кусок прозрачным. Например, наложив  прямоугольный трафарет на        стену дома, вы получите окно, через  которое можно увидеть что находится        внутри дома.&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;&lt;b&gt;GLUT_STEREO&lt;/b&gt;&lt;/td&gt; &lt;td&gt;Этот флаг используется для создания стереоизображений. Используется  редко,        так как для просмотра такого изображения нужна специальная  аппаратура.&lt;/td&gt; &lt;/tr&gt;
&lt;/tbody&gt; &lt;/table&gt;Вот пример использования этой команды:&lt;b&gt;void glutInitDisplayMode(GLUT_RGB    | GLUT_DOUBLE);&lt;/b&gt;&lt;br /&gt;
3. Создание окна. После того как окно установлено необходимо    его создать.&lt;br /&gt;
&lt;b&gt;int glutCreateWindow(const char *title);&lt;/b&gt;&lt;br /&gt;
Эта команда создаёт окно с заголовком, который вы укажете в качестве     параметра и возвращает HANDLER окна в виде числа int. Этот HANDLER  обычно используется    для последующих операций над этим окном, таких  как изменение параметров окна    и закрытие окна.&lt;br /&gt;
4. Установка функций, отвечающих за рисование в окне и изменении    формы окна.&lt;br /&gt;
После того, как окно, в которое будет выводится или как говорят     рендерится графическая информация, подготовлено и создано, необходимо  связать    с ним процедуры, которые будут отвечать за вывод графической  информации, следить    за размерами окна, следить за нажатиями на  клавиши и т.д. Самая первая и самая    необходимая функция которую мы  рассмотрим, отвечает за рисование. Именно она    всегда будет вызываться  операционной системой, чтобы нарисовать (перерисовать)    содержимое  окна. Итак, задаётся эта функция командой:&lt;br /&gt;
&lt;b&gt;void glutDisplayFunc(void (*func)(void));&lt;/b&gt;&lt;br /&gt;
Единственный параметр этой функции – это указатель на функцию,  которая    будет отвечать за рисование в окне. Например чтобы функция &lt;b&gt;void Draw(void)&lt;/b&gt;,    определенная в вашей программе отвечала за рисование в окне, надо присоединить    ее к GLUT следующим образом: &lt;b&gt;glutDisplayFunc(Draw);&lt;/b&gt;&lt;br /&gt;
И ещё одна функция, которая по моему мнению является важной – это     функция, которая отслеживает изменения окна. Как только у окна  изменились размеры,    необходимо перестроить вывод графической  информации уже в новое окно с другими    размерами. Если этого не  сделать, то например увеличив размеры окна, вывод    информации будет  производиться в старую область окна, с меньшими размерами.    Определить  функцию, отвечающую за изменение размеров окна нужно следующей  командой:&lt;br /&gt;
&lt;b&gt;void glutReshapeFunc(void (*func)(int width, int height));&lt;/b&gt;&lt;br /&gt;
Единственный параметр – это указатель на функцию, отвечающую за     изменение размеров окна, которая как видно должна принимать два  параметра &lt;b&gt;width&lt;/b&gt; и &lt;b&gt;height&lt;/b&gt;, соответственно ширина и высота нового (измененного)    окна.&lt;br /&gt;
5. Вход в главный цикл GLUT.&lt;br /&gt;
Ну и последнее, что необходимо сделать, чтобы запустить нашу  программу    – это войти в так называемый главный цикл GLUT. Этот цикл  запускает на выполнение    так называемое сердце GLUT, которое  обеспечивает взаимосвязь между операционной    системой и теми  функциями, которые отвечают за окно, получают информацию    от устройств  ввода/вывода. Для того, чтобы перейти в главный цикл GLUT, надо     выполнить единственную команду:&lt;br /&gt;
&lt;b&gt;void glutMainLoop(void);&lt;/b&gt;&lt;br /&gt;
Вот в принципе основные шаги для самой простейшей GLUT программы.     Теперь я приведу эту самую программу. Как вы сейчас убедитесь – это  очень легкая    программа и трудного тут ничего нет. И ещё, прежде чем  использовать функции    из GLUT необходимо к программе подключить  заголовок: &lt;b&gt;#include &amp;lt;GL/glut.h&amp;gt;&lt;/b&gt;.    Программа чертит линию посередине экрана. Вот текст самой программы:&lt;br /&gt;
&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;cpp&quot; style=&quot;font-family: monospace;&quot;&gt;&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;GL/glut.h&amp;gt;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; Reshape&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; width, &lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; height&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: green;&quot;&gt;{&lt;/span&gt;
  glViewport&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;, width, height&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glMatrixMode&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;GL_PROJECTION&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glLoadIdentity&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  gluOrtho2D&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;1&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;1&lt;/span&gt;, &lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;1&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glMatrixMode&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;GL_MODELVIEW&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: green;&quot;&gt;}&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; Draw&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: green;&quot;&gt;{&lt;/span&gt;
  glClear&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;GL_COLOR_BUFFER_BIT&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
  glColor3f&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;0.0f&lt;/span&gt;, &lt;span style=&quot;color: purple;&quot;&gt;0.0f&lt;/span&gt;, &lt;span style=&quot;color: purple;&quot;&gt;1.0f&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glLineWidth&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
  glBegin&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;GL_LINES&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
    glVertex2f&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;color: purple;&quot;&gt;0.5f&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
    glVertex2f&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;0.5f&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glEnd&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
  glFlush&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: green;&quot;&gt;}&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; main&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; argc, &lt;span style=&quot;color: blue;&quot;&gt;char&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;argv&lt;span style=&quot;color: green;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: green;&quot;&gt;{&lt;/span&gt;
  glutInit&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt;argc, argv&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glutInitWindowSize&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;400&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glutInitWindowPosition&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;100&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
  glutInitDisplayMode&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;GLUT_RGB&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glutCreateWindow&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;&quot;Romka Demo&quot;&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
  glutReshapeFunc&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;Reshape&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glutDisplayFunc&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;Draw&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glClearColor&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
  glutMainLoop&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: green;&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Полный исходный код программы можно взять отсюда: &lt;a href=&quot;http://madli.ut.ee/%7Eromka/opengl/doc/samples/simple_demo.zip&quot;&gt;simple_demo.zip&lt;/a&gt;&lt;br /&gt;
После того как наша первая программа готова, я расскажу вам немножко    поподробнее об операциях с окнами.&lt;br /&gt;
&lt;span style=&quot;color: maroon;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;a href=&quot;http://www.blogger.com/post-edit.g?blogID=8511633488317993065&amp;amp;postID=4505880761422130942&quot; name=&quot;3&quot;&gt;3. Работа с окнами в GLUT&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
GLUT предоставляет всевозможные функции для работы с окнами.    Среди  этих функций найти можно практически всё необходимое для создания  небольших    программ.&lt;br /&gt;
Как я уже выше говорил, при создании окна, функция &lt;b&gt;glutCreateWindow&lt;/b&gt;  при успешном завершении возвращает дескриптор созданного окна (значение  int).    Это значение в дальнейшем может быть использовано для операций  с этим окном.    Рассмотрим те операции, которые можно производить над  окном. Прежде всего необходимо    выбрать наше окно, т.е. сделать его  текущим (не забывайте, создано может быть    несколько окон и надо  сообщить GLUT с каким именно окном вы хотите работать).    Если вы  создали всего одно окно то следующую функцию можно опустить.&lt;br /&gt;
&lt;b&gt;void glutSetWindow(int win);&lt;/b&gt;&lt;br /&gt;
Эта функция делает окно &lt;b&gt;win&lt;/b&gt; текущим. После этого    можно производить различные операции над этим окном.&lt;br /&gt;
&lt;b&gt;int glutGetWindow(void); &lt;/b&gt;&lt;br /&gt;
Эта функция позволяет вам определить какое в данный момент окно    является активным. Функция возвращает дескриптор окна.&lt;br /&gt;
После того как выбрано окно, можно производить над ним конкретные    действия:&lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td bgcolor=&quot;yellow&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;Функция&lt;/span&gt;&lt;/b&gt;&lt;/td&gt; &lt;td bgcolor=&quot;yellow&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;Значение&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;void glutSetWindowTitle(const char *title);&lt;/td&gt; &lt;td&gt;Изменяет заголовок окна&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;void glutPositionWindow(int x, int y);&lt;/td&gt; &lt;td&gt;Изменяет расположение окна. Новые координаты левого верхнего угла окна        (x,y)&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;void glutReshapeWindow(int width, int height);&lt;/td&gt; &lt;td&gt;Изменяет размеры окна. Новые размеры окна: width, height&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;void glutIconifyWindow(void);&lt;/td&gt; &lt;td&gt;Сворачивает окно в иконку.&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;void glutHideWindow(void);&lt;/td&gt; &lt;td&gt;Скрывает окно.&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;void glutShowWindow(void);&lt;/td&gt; &lt;td&gt;Показывает окно.&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;void glutFullScreen(void);&lt;/td&gt; &lt;td&gt;Развернуть окно на весь экран. При этом убираются с экрана заголовок         окна и его остальные части, кроме содержимого окна, т.е. ваше  приложение        становится полноэкранным.&lt;/td&gt; &lt;/tr&gt;
&lt;/tbody&gt; &lt;/table&gt;Существует еще одна интересная функция, которая позволяет устанавливать в окне    форму курсора:&lt;br /&gt;
&lt;b&gt;void glutSetCursor(int cursor);&lt;/b&gt;&lt;br /&gt;
Параметр &lt;b&gt;cursor&lt;/b&gt; может принимать одно из следующих  значений:    GLUT_CURSOR_RIGHT_ARROW, GLUT_CURSOR_LEFT_ARROW,  GLUT_CURSOR_INFO, GLUT_CURSOR_DESTROY,    GLUT_CURSOR_HELP,  GLUT_CURSOR_CYCLE, GLUT_CURSOR_SPRAY, GLUT_CURSOR_WAIT,  GLUT_CURSOR_TEXT,    GLUT_CURSOR_CROSSHAIR, GLUT_CURSOR_UP_DOWN,  GLUT_CURSOR_LEFT_RIGHT, GLUT_CURSOR_TOP_SIDE,     GLUT_CURSOR_BOTTOM_SIDE, GLUT_CURSOR_LEFT_SIDE, GLUT_CURSOR_RIGHT_SIDE,  GLUT_CURSOR_TOP_LEFT_CORNER,    GLUT_CURSOR_TOP_RIGHT_CORNER,  GLUT_CURSOR_BOTTOM_RIGHT_CORNER, GLUT_CURSOR_BOTTOM_LEFT_CORNER,     GLUT_CURSOR_INHERIT, GLUT_CURSOR_NONE, GLUT_CURSOR_FULL_CROSSHAIR.&lt;br /&gt;
В GLUT существует специальный режим, позволяющий вам использовать  режим игры    для вашей OpenGL программы, т.е. когда ваше приложение  занимает весь экран.&lt;br /&gt;
Для этого в GLUT существуют специальные команды для управления этим режимом.&lt;br /&gt;
Первая из них:&lt;br /&gt;
&lt;b&gt;void glutGameModeString(const char *string);&lt;/b&gt;&lt;br /&gt;
Эта функция определяет параметры устанавливаемого разрешения экрана,  глубину    цвета и частоту обновления экрана(в герцах). Формат входного  параметра    такой:&lt;br /&gt;
(Screen_width)x(Screen_height):(Depth)@(Refresh_Frequency)&lt;br /&gt;
Например: glutGameModeString(“640×480:16@72″); – Означает, что  необходимо выбрать    разрешение экрана 640 на 480 пикселей при глубине  цвета в 16 бит и частоте обновления    экрана 72 герца.&lt;br /&gt;
Чтобы перейти в режим GAME MODE необходимо вызвать функцию:&lt;br /&gt;
&lt;b&gt;int glutEnterGameMode(void);&lt;/b&gt;&lt;br /&gt;
А чтобы выйти из режима GAME MODE необходимо вызвать функцию:&lt;br /&gt;
&lt;b&gt;void glutLeaveGameMode(void);&lt;/b&gt;&lt;br /&gt;
Ну и чтобы было понятнее приведу пример использования этого режима:&lt;br /&gt;
&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;cpp&quot; style=&quot;font-family: monospace;&quot;&gt;...
&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; main&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; argc, &lt;span style=&quot;color: blue;&quot;&gt;char&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;argv&lt;span style=&quot;color: green;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: green;&quot;&gt;{&lt;/span&gt;
&amp;nbsp;
  WindW &lt;span style=&quot;color: navy;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;400&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  WindH &lt;span style=&quot;color: navy;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
  glutInit&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt;argc, argv&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glutInitWindowSize&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;WindW, WindH&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glutInitDisplayMode&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;GLUT_RGB&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #666666;&quot;&gt;// Enter to game mode: 800x600, 32 bit color, 72 Hz refresh rate&lt;/span&gt;
  glutGameModeString&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;&quot;800x600:32@72&quot;&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color: #666666;&quot;&gt;// For full screen game mode&lt;/span&gt;
  glutEnterGameMode&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt; 
&amp;nbsp;
  glutReshapeFunc&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;Reshape&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glutDisplayFunc&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;Draw&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glutKeyboardFunc&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;Key&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glClearColor&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glutMainLoop&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
  &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: green;&quot;&gt;}&lt;/span&gt;
...&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Полный исходный код программы можно взять отсюда: &lt;a href=&quot;http://madli.ut.ee/%7Eromka/opengl/doc/samples/game_mode.zip&quot;&gt;game_mode.zip&lt;/a&gt;&lt;br /&gt;
Отмечу также что можно вызывать функцию glutGameModeString и таким образом:&lt;br /&gt;
&lt;b&gt;glutGameModeString(“800×600:32″);&lt;/b&gt;&lt;br /&gt;
Т.е. не указывая частоту обновления экрана. При этом GLUT сама выберет    подходящую частоту.&lt;br /&gt;
&lt;span style=&quot;color: maroon;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;a href=&quot;http://www.blogger.com/post-edit.g?blogID=8511633488317993065&amp;amp;postID=4505880761422130942&quot; name=&quot;4&quot;&gt;4. Связь между GLUT и вашей OpenGL    программой&lt;/a&gt; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
В этой части я расскажу о том, каким образом происходит взаимодействие вашей    OpenGL программы и GLUT.&lt;br /&gt;
Самой первой по значимости (без которой не обойтись ни в одной  программе) идет    функция отвечающая за перерисовку содержимого окна:&lt;br /&gt;
&lt;b&gt;void glutDisplayFunc(void (*func)(void));&lt;/b&gt;&lt;br /&gt;
Эта функция устанавливает функцию в вашей программе, которая будет  отвечать    за перерисовку окна. Это нужно для того, что когда системе  потребуется перерисовать    ваше окно (например когда вы из свернутого  состояния развернули окно), то она    вызовет соответствующую функцию в  вашей программе, которая ответственна за перерисовку    содержимого  окна. Также функция перерисовки окна вызывается при самом    первом  запуске вашего приложения. Отмечу, что если вы создаете окно в GLUT,     то определять функцию перерисовки окна нужно обязательно! С другой  стороны,    вы сами можете заставить систему перерисовать окно, это  нужно например тогда,    когда вы изменили состояния объектов или  изменили их внешность, то вам понадобится    перерисовать содержимое  окна, чтобы отобразить сделанные изменения. Поэтому    в GLUT существует  специальная функция &lt;b&gt;glutPostRedisplay()&lt;/b&gt;, которая     заставляет систему перерисовать текущее окно. Если вдруг вам захочется  перерисовать    не текущее окно, а какое-то другое, то предусмотрена  следующая функция: &lt;b&gt;glutPostWindowRedisplay(int    win)&lt;/b&gt;, которая перерисовывает содержимое &lt;b&gt;win&lt;/b&gt; окна.&lt;br /&gt;
&lt;b&gt;void glutReshapeFunc(void (*func)(int width, int height));&lt;/b&gt;&lt;br /&gt;
Как уже говорилось, это функция устанавливает другую функцию в вашей  программе,    которая будет ответственна за изменение размеров окна. Как  только у окна    изменились размеры, необходимо перестроить вывод  графической информации уже    в новое окно с другими размерами. Для  этого в вызываемую функцию (т.е. функцию    в вашей программе)  передаются 2 параметра &lt;b&gt;width&lt;/b&gt; и &lt;b&gt;height&lt;/b&gt;,    т.е. ширина и высота измененного окна. Обычно в самом начале функции, вызывается    функция &lt;b&gt;glViewport&lt;/b&gt;, например так: &lt;b&gt;glViewport(0, 0,    width, height)&lt;/b&gt;, чтобы перестроить вывод изображения уже в окно    с другими размерами.&lt;br /&gt;
Еще одна интересная функция, которая устанавливает функцию в вашей  программе,    которая будет вызываться системой всякий раз, когда окно  становиться видимым    или наоборот становиться невидимым.&lt;br /&gt;
&lt;b&gt;void glutVisibilityFunc(void (*func)(int state));&lt;/b&gt;&lt;br /&gt;
Единственный параметр, который передается в вызываемую системой функцию: &lt;b&gt;state&lt;/b&gt;.     Сравнивая этот параметр с константами GLUT_NOT_VISIBLE и  GLUT_VISIBLE можно    определить, что произошло с окном, либо оно стало  невидимым или наоборот    – видимым.&lt;br /&gt;
&lt;b&gt;void glutIdleFunc(void (*func)(void));&lt;/b&gt;&lt;br /&gt;
Функция, которая устанавливает функцию в вашей программе, которая  будет    вызываться системой всякий раз, когда ваше приложение  простаивает, т.е. ничего    не делает. Часто эту функцию используют для  анимации.&lt;br /&gt;
Ну и последняя функция, которую мы рассмотрим:&lt;br /&gt;
&lt;b&gt;void glutTimerFunc(unsigned int millis, void (*func)(int value), int    value);&lt;/b&gt;&lt;br /&gt;
Эта функция устанавливает таймер. Первый параметр &lt;b&gt;millis&lt;/b&gt;  задает    время в миллисекундах, по истечении которых вызывается  функция, которая указана    как второй параметр. Третий параметр &lt;b&gt;value&lt;/b&gt; указывает индентификатор    таймера, т.е. таймеров может быть одновременно запущено несколько. То же    самое значение &lt;b&gt;value&lt;/b&gt;  есть и в функции, которая вызывается таймером.    Это нужно для того,  чтобы определить, какой таймер сработал, т.е. если ваша    функция  обрабатывает несколько таймеров.&lt;br /&gt;
Далее привожу пример небольшой программки, которая рисует вращающуюся линию.    Исходный текст программы можно взять и отсюда: &lt;a href=&quot;http://madli.ut.ee/%7Eromka/opengl/doc/samples/animation.zip&quot;&gt;animation.zip&lt;/a&gt;&lt;br /&gt;
&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;cpp&quot; style=&quot;font-family: monospace;&quot;&gt;&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;GL/glut.h&amp;gt;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; WindW, WindH&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; i&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; alpha&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; Reshape&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; width, &lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; height&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #666666;&quot;&gt;// Reshape function&lt;/span&gt;
&lt;span style=&quot;color: green;&quot;&gt;{&lt;/span&gt;
  glViewport&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;, width, height&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glMatrixMode&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;GL_PROJECTION&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glLoadIdentity&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  gluOrtho2D&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;1&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;1&lt;/span&gt;, &lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;1&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glMatrixMode&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;GL_MODELVIEW&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
  WindW &lt;span style=&quot;color: navy;&quot;&gt;=&lt;/span&gt; width&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  WindH &lt;span style=&quot;color: navy;&quot;&gt;=&lt;/span&gt; height&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: green;&quot;&gt;}&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; Draw&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #666666;&quot;&gt;// Window redraw function&lt;/span&gt;
&lt;span style=&quot;color: green;&quot;&gt;{&lt;/span&gt;
  glClear&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;GL_COLOR_BUFFER_BIT&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
  glLineWidth&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glColor3f&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;0.0f&lt;/span&gt;, &lt;span style=&quot;color: purple;&quot;&gt;0.6f&lt;/span&gt;, &lt;span style=&quot;color: purple;&quot;&gt;0.9f&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
  glPushMatrix&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glRotatef&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;alpha, &lt;span style=&quot;color: purple;&quot;&gt;0.0f&lt;/span&gt;, &lt;span style=&quot;color: purple;&quot;&gt;0.0f&lt;/span&gt;, &lt;span style=&quot;color: purple;&quot;&gt;1.0f&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  alpha &lt;span style=&quot;color: #000040;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: navy;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;alpha &lt;span style=&quot;color: navy;&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;359&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt; alpha &lt;span style=&quot;color: navy;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glBegin&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;GL_LINES&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
    glVertex2f&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;0.5f&lt;/span&gt;, &lt;span style=&quot;color: purple;&quot;&gt;0.5f&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
    glVertex2f&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;0.5f&lt;/span&gt;, &lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;0.5f&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glEnd&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glPopMatrix&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
  glFlush&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glutSwapBuffers&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: green;&quot;&gt;}&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; Visibility&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; state&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #666666;&quot;&gt;// Visibility function&lt;/span&gt;
&lt;span style=&quot;color: green;&quot;&gt;{&lt;/span&gt;
  &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;state &lt;span style=&quot;color: navy;&quot;&gt;==&lt;/span&gt; GLUT_NOT_VISIBLE&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;printf&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;&quot;Window not visible!&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;state &lt;span style=&quot;color: navy;&quot;&gt;==&lt;/span&gt; GLUT_VISIBLE&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;printf&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;&quot;Window visible!&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: green;&quot;&gt;}&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; timf&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; value&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #666666;&quot;&gt;// Timer function&lt;/span&gt;
&lt;span style=&quot;color: green;&quot;&gt;{&lt;/span&gt;
  glutPostRedisplay&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;  &lt;span style=&quot;color: #666666;&quot;&gt;// Redraw windows&lt;/span&gt;
  glutTimerFunc&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;40&lt;/span&gt;, timf, &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color: #666666;&quot;&gt;// Setup next timer&lt;/span&gt;
&lt;span style=&quot;color: green;&quot;&gt;}&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; main&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;int&lt;/span&gt; argc, &lt;span style=&quot;color: blue;&quot;&gt;char&lt;/span&gt; &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;argv&lt;span style=&quot;color: green;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;
&lt;span style=&quot;color: green;&quot;&gt;{&lt;/span&gt;
  WindW &lt;span style=&quot;color: navy;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;400&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  WindH &lt;span style=&quot;color: navy;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  alpha &lt;span style=&quot;color: navy;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt; 
&amp;nbsp;
  glutInit&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #000040;&quot;&gt;&amp;amp;&lt;/span&gt;argc, argv&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glutInitWindowSize&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;WindW, WindH&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  glutInitDisplayMode&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;GLUT_RGB &lt;span style=&quot;color: #000040;&quot;&gt;|&lt;/span&gt; GLUT_DOUBLE&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;glutCreateWindow&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;&quot;Romka Demo&quot;&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
  glutReshapeFunc&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;Reshape&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color: #666666;&quot;&gt;// Set up reshape function&lt;/span&gt;
  glutDisplayFunc&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;Draw&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;    &lt;span style=&quot;color: #666666;&quot;&gt;// Set up redisplay function&lt;/span&gt;
  glutTimerFunc&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;40&lt;/span&gt;, timf, &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color: #666666;&quot;&gt;// Set up timer for 40ms, about 25 fps&lt;/span&gt;
  glutVisibilityFunc&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;Visibility&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color: #666666;&quot;&gt;// Set up visibility funtion&lt;/span&gt;
  glClearColor&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
  glutMainLoop&lt;span style=&quot;color: green;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
  &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: teal;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: green;&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;Попробуйте свернуть окно, а потом развернуть и посмотрите на консоль,      это сработала процедура Visibility.&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admoprog.blogspot.com/feeds/4505880761422130942/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://admoprog.blogspot.com/2011/03/opengl-glut.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/4505880761422130942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/4505880761422130942'/><link rel='alternate' type='text/html' href='http://admoprog.blogspot.com/2011/03/opengl-glut.html' title='OpenGL и GLUT'/><author><name>anatakil</name><uri>http://www.blogger.com/profile/13091951289499869135</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511633488317993065.post-1131489301025200727</id><published>2010-10-03T10:28:00.000-07:00</published><updated>2010-10-03T10:28:03.238-07:00</updated><title type='text'>Oracle опубликовала планы по улучшению платформы Java</title><content type='html'>Компания Oracle обнародовала планы по совершенствованию платформы  Java Platform, Standard Edition (Java SE) и ее оптимизации под новые  модели приложений и типы оборудования, включая расширенную поддержку  скриптовых языков, повышение производительности разработки и сокращение  операционных затрат.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Представленные планы предусматривают выпуск  новых версий OpenJDK в 2011 и в 2012 гг. Эти новые версии лежат в основе  Oracle Java Development Kit (JDK) 7 и JDK 8. Решения о включении новых  функций в выпуски JDK 7 и JDK 8 принимались при активном участии  сообщества Java-разработчиков.&lt;br /&gt;
Проект OpenJDK продолжает успешно  развиваться благодаря вкладу Oracle, а также других компаний,  исследователей и разработчиков. Модель лицензирования OpenJDK остается  неизменной. &lt;br /&gt;
В настоящее время Oracle работает над объединением  Oracle Java HotSpot Java Virtual Machine (JVM) и Oracle JRockit JVM в  единую виртуальную машину, в которой будут эффективно использоваться  преимущества каждой из этих реализаций виртуальных машин. &lt;br /&gt;
Oracle  JDK и Java Runtime Environment (JRE) будут по-прежнему доступны для  бесплатной загрузки, без изменения существующих моделей лицензирования.&lt;br /&gt;
Дополнительные  приложения, такие как JRockit Mission Control, JRockit Real Time, Java  for Business и Enterprise Support, как и раньше, будут доступны за  отдельную плату.&lt;br /&gt;
&lt;b&gt;В выпуске JDK 7 запланированы:&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt; Инструкция InvokeDynamic и вспомогательные функции для динамических языков программирования&lt;/li&gt;
&lt;li&gt; Fork/Join Framework и дополнения к API параллелизма и поддержки коллекций для многопоточного Java-кода&lt;/li&gt;
&lt;li&gt;  Усовершенствования языка (большая часть результатов проекта Coin) для  повышения производительности разработки, а также для создания более  понятного и лаконичного Java-кода&lt;/li&gt;
&lt;li&gt; Поддержка протоколов Session Description Protocol (SDP) и Stream Control Transport Protocol (SCTP)&lt;/li&gt;
&lt;li&gt; Новые API ввода/вывода — гибкий API для работы с файловой системой и асинхронный ввод/вывод&lt;/li&gt;
&lt;li&gt; Поддержка усовершенствованных стандартов — Unicode, локализация, безопасность, шифрование, XML и JDBC&lt;/li&gt;
&lt;li&gt; Повышение производительности JVM&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;В выпуске JDK 8 запланированы:&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt; Лямбда-выражения для повышения производительности разработки и более эффективного использования многоядерных процессоров&lt;/li&gt;
&lt;li&gt; Усовершенствования языка (остальные результаты проекта Coin)&lt;/li&gt;
&lt;li&gt; Реализация модульности (проект Jigsaw) для упрощения задач проектирования, сборки и развертывания приложений&lt;/li&gt;
&lt;li&gt; Ускоренный запуск JVM и совершенствование эргономичности.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;a href=&quot;http://www.oracle.com/us/corporate/press/173782&quot;&gt;Подробности&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://admoprog.blogspot.com/feeds/1131489301025200727/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://admoprog.blogspot.com/2010/10/oracle-java.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/1131489301025200727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/1131489301025200727'/><link rel='alternate' type='text/html' href='http://admoprog.blogspot.com/2010/10/oracle-java.html' title='Oracle опубликовала планы по улучшению платформы Java'/><author><name>anatakil</name><uri>http://www.blogger.com/profile/13091951289499869135</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511633488317993065.post-5640153227624682653</id><published>2010-09-25T14:57:00.001-07:00</published><updated>2010-09-25T14:59:04.212-07:00</updated><title type='text'>Домашний датацентр или как начать не именя за душой ни гроша</title><content type='html'>&lt;h2 class=&quot;entry-title single-entry-title&quot;&gt;&lt;span class=&quot;topic&quot; title=&quot;http://habrahabr.ru/blogs/startup/104948/&quot;&gt;&lt;/span&gt;                                        &lt;/h2&gt;&lt;div class=&quot;content&quot;&gt;&lt;img alt=&quot;датацентр под столом&quot; src=&quot;http://lh4.ggpht.com/_nbThjpyHYDQ/TJ5BJtEDobI/AAAAAAAAADI/Ep-WjrhZgsU/s640/IMG_0096.JPG&quot; /&gt;Вы  молоды, амбициозны, полны сил и идей, и готовы перевернуть весь Мир! Но  как правило, все хорошие начинания всегда заканчивается на самом  банальном — нет средств для их реализации. Инвесторы готовы вложить в  Ваш проект средства, но им нужно доказать «как Вашу состоятельность, так  и состоятельность Вашего проекта». А, имея мешок идей и ничего за  плечами — есть большая вероятность, что в «Вас Не Поверят». Как начать,  не имея стартового капитала?&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.blogger.com/post-edit.g?blogID=8511633488317993065&amp;amp;postID=5640153227624682653&quot; 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 alt=&quot;схема Датацентр под столом&quot; 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; /&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;&lt;ul class=&quot;tags&quot;&gt;&lt;li&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;</content><link rel='replies' type='application/atom+xml' href='http://admoprog.blogspot.com/feeds/5640153227624682653/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://admoprog.blogspot.com/2010/09/blog-post_25.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/5640153227624682653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/5640153227624682653'/><link rel='alternate' type='text/html' href='http://admoprog.blogspot.com/2010/09/blog-post_25.html' title='Домашний датацентр или как начать не именя за душой ни гроша'/><author><name>anatakil</name><uri>http://www.blogger.com/profile/13091951289499869135</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_nbThjpyHYDQ/TJ5BJtEDobI/AAAAAAAAADI/Ep-WjrhZgsU/s72-c/IMG_0096.JPG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511633488317993065.post-8871696001315042925</id><published>2010-09-17T00:27:00.001-07:00</published><updated>2010-09-17T00:27:47.540-07:00</updated><title type='text'>Сохраняем видео из Flash Player 10.2 или unlink нам не помеха</title><content type='html'>Я, как, вероятно, и многие другие пользователи Linux, привык сохранять  видео с сайтов вроде YouTube, копируя временные файлы, создаваемые Adobe  Flash.&lt;br /&gt;
&lt;a name=&#39;more&#39;&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;&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 &#39;$4 ~ /^[0-9]+/ &amp;amp;&amp;amp; $5 == &quot;REG&quot;&#39;
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><link rel='replies' type='application/atom+xml' href='http://admoprog.blogspot.com/feeds/8871696001315042925/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://admoprog.blogspot.com/2010/09/flash-player-102-unlink.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/8871696001315042925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/8871696001315042925'/><link rel='alternate' type='text/html' href='http://admoprog.blogspot.com/2010/09/flash-player-102-unlink.html' title='Сохраняем видео из Flash Player 10.2 или unlink нам не помеха'/><author><name>anatakil</name><uri>http://www.blogger.com/profile/13091951289499869135</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511633488317993065.post-1698321101353128822</id><published>2010-09-17T00:24:00.000-07:00</published><updated>2010-09-17T00:24:10.647-07:00</updated><title type='text'>Dell Inspiron Duo — гибрид нетбука и планшета</title><content type='html'>Можно сказать что буквально только что компания &lt;b&gt;Dell&lt;/b&gt; представила концепцию нового класса устройств — гибрид нетбука и планшета, в виде устройства под названием &lt;b&gt;Dell Inspiron Duo&lt;/b&gt;.&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=&#39;more&#39;&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;&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><link rel='replies' type='application/atom+xml' href='http://admoprog.blogspot.com/feeds/1698321101353128822/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://admoprog.blogspot.com/2010/09/dell-inspiron-duo.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/1698321101353128822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/1698321101353128822'/><link rel='alternate' type='text/html' href='http://admoprog.blogspot.com/2010/09/dell-inspiron-duo.html' title='Dell Inspiron Duo — гибрид нетбука и планшета'/><author><name>anatakil</name><uri>http://www.blogger.com/profile/13091951289499869135</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511633488317993065.post-8230100974582971738</id><published>2010-09-16T07:06:00.000-07:00</published><updated>2010-09-16T07:06:14.829-07:00</updated><title type='text'>Создаем Web-приложение, умеющее работать с Twitter</title><content type='html'>Похоже, что в наши дни Twiiter можно обнаружить где угодно. Политики, актеры, наши родители – все пользуются ресурсами социальных сетей. Клиенты требуют приложений, которые не только позволяют пользоваться Twitter, но и имеют глянцевый вид в стиле Web 2.0, которого можно добиться только с помощью Ajax.  Нам в этом помогут         Django и jQuery.         &lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;&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; height=&quot;287&quot; src=&quot;http://www.ibm.com/developerworks/ru/library/os-social-twitter/figure1.jpg&quot; width=&quot;567&quot; /&gt;             &lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;&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;&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®.&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;&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;&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;&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;&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;&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;&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=&#39;yourUserName&#39;, password=&#39;yourPassword&#39;)
&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;&quot; name=&quot;table1&quot;&gt;&lt;b&gt;Таблица 1. Некоторые полезные методы API, доступные в 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; class=&quot;ibm-data-table&quot; summary=&quot;python-twitter API methods&quot; width=&quot;&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;&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;&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;&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()[ &#39;__file__&#39; ] )

DEBUG = True
TEMPLATE_DEBUG = DEBUG

ADMINS = (
)

MANAGERS = ADMINS

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

TIME_ZONE = &#39;America/Chicago&#39;
LANGUAGE_CODE = &#39;en-us&#39;

SITE_ID = 1

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

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

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

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

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

ROOT_URLCONF = &#39;pytweetproj.urls&#39;

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

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

# добавим это для сессий
SESSION_ENGINE = &#39;django.contrib.sessions.backends.cached_db&#39;
&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()[ &#39;__file__&#39; ] )&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;&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;&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(&#39;&#39;,
    ( r&#39;^resources/(?P&amp;lt;path&amp;gt;.*)$&#39;, 
      &#39;django.views.static.serve&#39;, 
      { &#39;document_root&#39;: settings.MEDIA_ROOT } ),
    ( r&#39;^twitterPanel/&#39;, include( &#39;twitterPanel.urls&#39; ) ),
)
&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;&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;&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( &#39;&#39;,
    url( r&#39;^$&#39;, index, name = &#39;twitterPanel_index&#39; ),
    url( r&#39;^panel/$&#39;, panel, name = &#39;twitterPanel_panel&#39; ),
    url( r&#39;^update/$&#39;, update, name = &#39;twitterPanel_update&#39; ),
)
&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;&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;&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;&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 = &#39;index.html&#39;
    userName = request.POST.get( &#39;userTxt&#39; )
    password = request.POST.get( &#39;passwordTxt&#39; )

    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[&#39;statuses&#39;] = statuses
    request.session[&#39;following&#39;] = following
    request.session[&#39;userName&#39;] = userName
    request.session[&#39;password&#39;] = password
    
    data = {
        &#39;statuses&#39; : statuses,
        &#39;following&#39; : 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;&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 = &#39;panel.html&#39;
    data = {
        &#39;statuses&#39; : request.session[&#39;statuses&#39;],
        &#39;following&#39; : request.session[&#39;following&#39;]
    }
    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;&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 = &#39;panel.html&#39;
  
    userName = request.session[&#39;userName&#39;]
    password = request.session[&#39;password&#39;]
 
    try:
        api = twitter.Api( username = request.session[&#39;userName&#39;], 
                           password = request.session[&#39;password&#39;]) 
        api.PostUpdate(request.POST.get(&#39;updateTextArea&#39;))
        updated = True
        statuses = api.GetUserTimeline()[0:5] # перезагружаем статусы
    except NameError, e:
        print &quot;unable to login&quot;
        updated = False

    data = {
        &#39;userName&#39; : request.session[&#39;userName&#39;],
        &#39;password&#39; : request.session[&#39;password&#39;],
        &#39;updated&#39;  : updated,
        &#39;statuses&#39; : 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;&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;&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;&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Sample Python-Twitter Application&amp;lt;/title&amp;gt;
    &amp;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;
    &amp;lt;script type=&quot;text/javascript&quot; 
        src=&quot;{{MEDIA_URL}}js/jquery-1.3.2.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script type=&quot;text/javascript&quot; 
        src=&quot;{{MEDIA_URL}}js/jquery-ui-1.7.2.custom.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;

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

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

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

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

        // Ссылка на диалог
        $(&#39;#dialog_link&#39;).click(function(){
          $(&#39;#dialog&#39;).dialog(&#39;open&#39;);
          return false;
        });
        //добавляем статическим виджетам &quot;подвешенное&quot; состояние
        $(&#39;#dialog_link, ul#icons li&#39;).hover(
          function() { $(this).addClass(&#39;ui-state-hover&#39;); },
          function() { $(this).removeClass(&#39;ui-state-hover&#39;); }
        );
      });
    &amp;lt;/script&amp;gt;
    &amp;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;}
    &amp;lt;/style&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
  &amp;lt;h2 id=&quot;demoTitle&quot; class=&quot;demoHeaders&quot;&amp;gt;PyTwitter Demo&amp;lt;/h2&amp;gt;
  &amp;lt;p&amp;gt;
    &amp;lt;a href=&quot;#&quot; id=&quot;dialog_link&quot; class=&quot;ui-state-default ui-corner-all&quot;&amp;gt;
      &amp;lt;span class=&quot;ui-icon ui-icon-newwin&quot;&amp;gt;&amp;lt;/span&amp;gt;Start Demo
    &amp;lt;/a&amp;gt;
  &amp;lt;/p&amp;gt;
  &amp;lt;div style=&quot;position: relative; width: 96%; height: 200px; padding:1% 4%; 
       overflow:hidden;&quot; class=&quot;fakewindowcontain&quot;&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;!-- диалог ввода имени пользователя и пароля --&amp;gt;
  &amp;lt;div id=&quot;dialog&quot; title=&quot;Login&quot; &amp;gt;
    &amp;lt;p&amp;gt;
      &amp;lt;form action=&quot;#&quot; name=&quot;loginForm&quot; id=&quot;loginForm&quot; method=&quot;POST&quot;&amp;gt;
        &amp;lt;table&amp;gt;
          &amp;lt;tr&amp;gt;
            &amp;lt;td&amp;gt;user&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;userTxt&quot; id=&quot;userTxt&quot;/&amp;gt;&amp;lt;/td&amp;gt;
          &amp;lt;/tr&amp;gt;
          &amp;lt;tr&amp;gt;
            &amp;lt;td&amp;gt;password&amp;lt;/td&amp;gt; 
            &amp;lt;td&amp;gt;&amp;lt;input type=&quot;password&quot; name=&quot;passwordTxt&quot; id=&quot;passwordTxt&quot;/&amp;gt;&amp;lt;/td&amp;gt;
          &amp;lt;/tr&amp;gt;
        &amp;lt;/table&amp;gt;
      &amp;lt;/form&amp;gt;
    &amp;lt;/p&amp;gt;
  &amp;lt;/div&amp;gt;

  &amp;lt;!-- показываем только если пользователь вошел в систему --&amp;gt;
  &amp;lt;!-- виджет Accordion --&amp;gt;
  &amp;lt;div id=&quot;panel&quot; style=&quot;position: absolute; top: 2%; left:2%; 
     width:600px; visibility:visible;&quot;&amp;gt; 
  &amp;lt;/div&amp;gt;
                
  &amp;lt;/body&amp;gt;
&amp;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;&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; height=&quot;126&quot; src=&quot;http://www.ibm.com/developerworks/ru/library/os-social-twitter/figure2.jpg&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;&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; height=&quot;208&quot; src=&quot;http://www.ibm.com/developerworks/ru/library/os-social-twitter/figure3.jpg&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(&#39;name&#39;)&lt;/code&gt;  выглядит так:   &lt;code&gt;$(&#39;#name&#39;)&lt;/code&gt;.  Например, мы определяем элемент dialog из jQuery UI с помощью тега   &lt;code&gt;&amp;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;$( &#39;#panel&#39; ).html( &#39;&amp;amp;nbsp;&#39; ).load( &#39;{% url twitterPanel_panel %}&#39; )&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;&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;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
    $(function(){
      $(&quot;#main&quot;).accordion({
        header: &quot;h3&quot;,
        autoHeight: true
      })
      .hide()
      .fadeIn(1500);

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

      $(&#39;#updateBtn&#39;).click(function(){
        if($(&#39;#updateTextArea&#39;).val().length &amp;lt;= 140){
          // отсылаем данные из формы на сервер
          $.post(&#39;{% url twitterPanel_update %}&#39;, $(&quot;#updateForm&quot;).serialize()); 
          $(&quot;#updateStatus&quot;).text(&quot;last update: &quot; + $(&#39;#updateTextArea&#39;).val());
          // очищаем текстовое поле
          $(&#39;#updateTextArea&#39;).val(&quot;&quot;); 
          // и сбрасываем счетчик
          $(&#39;#charCount&#39;).text( &quot;140&quot; );
        } 
        return false;
      });
    });
  &amp;lt;/script&amp;gt;                        
  
  &amp;lt;div id=&quot;main&quot;&amp;gt;
    &amp;lt;div&amp;gt;
      &amp;lt;h3&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;My Recent Tweets&amp;lt;/a&amp;gt;&amp;lt;/h3&amp;gt;
      &amp;lt;div&amp;gt;
        {% if statuses %}
          {% for s in statuses %}
            &amp;lt;p style=&quot;border-top:1px dashed #f00; margin-top:1em; 
                padding-top:1em font: 80% &#39;Trebuchet MS&#39;, sans-serif;&quot;&amp;gt;
              {{ s.text }}
            &amp;lt;/p&amp;gt;
          {% endfor %}
        {% else %}
          No tweets found
        {% endif %}
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div&amp;gt;
      &amp;lt;h3&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;Update Status&amp;lt;/a&amp;gt;&amp;lt;/h3&amp;gt;
      &amp;lt;div&amp;gt;
        &amp;lt;form action=&quot;#&quot; id=&quot;updateForm&quot; name=&quot;updateForm&quot; method=&quot;POST&quot;&amp;gt;
          &amp;lt;textarea id=&quot;updateTextArea&quot; name=&quot;updateTextArea&quot; rows=2 cols=70 /&amp;gt;
          &amp;lt;button id=&quot;updateBtn&quot; class=&quot;ui-state-default ui-corner-all&quot;&amp;gt;Update&amp;lt;/button&amp;gt;
        &amp;lt;/form&amp;gt;
        &amp;lt;div id=&quot;charCount&quot; name=&quot;charCount&quot; value=140&amp;gt;140&amp;lt;/div&amp;gt;
        &amp;lt;div id=&quot;updateStatus&quot; name=&quot;updateStatus&quot;&amp;gt;&amp;lt;!-- update message here --&amp;gt;&amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div&amp;gt;
      &amp;lt;h3&amp;gt;&amp;lt;a href=&quot;#&quot;&amp;gt;Following&amp;lt;/a&amp;gt;&amp;lt;/h3&amp;gt;
      &amp;lt;div&amp;gt;
        {% if following %}
          {% for f in following %}
            &amp;lt;img src=&quot;{{ f.GetProfileImageUrl }}&quot; width=28 height=28 /&amp;gt;
          {% endfor %}
        {% else %}
          following variable is empty
        {% endif %}
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;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;&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; height=&quot;287&quot; src=&quot;http://www.ibm.com/developerworks/ru/library/os-social-twitter/figure4.jpg&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;&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; height=&quot;287&quot; src=&quot;http://www.ibm.com/developerworks/ru/library/os-social-twitter/figure5.jpg&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;&amp;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;&amp;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;&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;&quot; name=&quot;download&quot;&gt;Загрузка&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;ibm-data-table&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;&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><link rel='replies' type='application/atom+xml' href='http://admoprog.blogspot.com/feeds/8230100974582971738/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://admoprog.blogspot.com/2010/09/web-twitter.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/8230100974582971738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/8230100974582971738'/><link rel='alternate' type='text/html' href='http://admoprog.blogspot.com/2010/09/web-twitter.html' title='Создаем Web-приложение, умеющее работать с Twitter'/><author><name>anatakil</name><uri>http://www.blogger.com/profile/13091951289499869135</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511633488317993065.post-5182163463758867333</id><published>2010-09-16T07:04:00.000-07:00</published><updated>2010-09-16T07:04:03.711-07:00</updated><title type='text'>Ubuntu начинает формировать список сертифицированного оборудования</title><content type='html'>Проект 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><link rel='replies' type='application/atom+xml' href='http://admoprog.blogspot.com/feeds/5182163463758867333/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://admoprog.blogspot.com/2010/09/ubuntu.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/5182163463758867333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/5182163463758867333'/><link rel='alternate' type='text/html' href='http://admoprog.blogspot.com/2010/09/ubuntu.html' title='Ubuntu начинает формировать список сертифицированного оборудования'/><author><name>anatakil</name><uri>http://www.blogger.com/profile/13091951289499869135</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511633488317993065.post-5828461370681302353</id><published>2010-09-16T07:02:00.001-07:00</published><updated>2010-09-16T07:04:24.924-07:00</updated><title type='text'>Полнофункциональный RDP клиент — FreeRDP</title><content type='html'>&lt;div class=&quot;content&quot;&gt;&lt;img align=&quot;right&quot; src=&quot;http://habrastorage.org/storage/f8862152/4a262ed5/10ddc1ca/4ade65fd.png&quot; /&gt;Не  секрет, что в современном мире без продуктов Microsoft практически не  обойтись. Однако во многих случаях получается так, что гораздо  эффективней использовать на рабочих компьютерах системы на базе &lt;b&gt;GNU/Linux&lt;/b&gt;,  а не Windows. Это значительно упрощает администрирование и сокращает  расходы, предоставляя при этом пользователям гораздо больше  легкодоступного функционала. Но что делать с теми приложениями, которые  работают только под Windows и которым нет подходящего аналога в мире  Linux? Поскольку обычно таких приложений единицы (иначе просто нету  смысла ставить Linux на рабочий компьютер), то разумным выбором может  стать использование терминальных серверов, работающих под серверными ОС  от Microsoft. Кроме того, Linux лучше всего подходит для любых тонких  клиентов, поскольку адекватных версий Windows для них просто не  существует.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
В любом случае необходимо уметь подключаться к терминальным серверам  Windows. Для этого в MS был разработан свой протокол удалённого рабочего  стола — &lt;b&gt;RDP&lt;/b&gt;. Однако до недавнего времени для Linux существовал единственный открытый клиент для работы с этим протоколом — &lt;b&gt;rdesktop&lt;/b&gt;.  К сожалению, его развитие давно остановилось, и он испытывает огромные  трудности при взаимодействии с современными версиями Windows.&lt;br /&gt;
&lt;br /&gt;
Но недавно тихо и незаметно проект rdesktop был форкнут, в результате чего на свет появился новый открытый RDP клиент — &lt;b&gt;FreeRDP&lt;/b&gt;.  Первый же релиз этой программы разом исправил большинство известных  проблем rdesktop, и проект продолжает активно развиваться. Почему-то  появление столь полезного приложение обошли вниманием, поэтому я и решил  опубликовать этот пост, чтобы хоть как-то исправить эту ситуацию и  рассказать всем о существовании нормального RDP клиента для Linux. Под  катом — описание возможностей FreeRDP и немного про отличную графическую  оболочку &lt;b&gt;Remmina&lt;/b&gt; для него.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.blogger.com/post-edit.g?blogID=8511633488317993065&amp;amp;postID=5828461370681302353&quot; name=&quot;habracut&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h4&gt;FreeRDP&lt;/h4&gt;&lt;br /&gt;
Официальный сайт проекта — &lt;a href=&quot;http://www.freerdp.com/&quot;&gt;www.freerdp.com&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Там же можно найти описание возможностей текущей версии и планы на будущее. Основные отличия от rdesktop:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Произведён значительный рефакторинг кода. Пользовательский интерфейс  полностью переписан и отделён от основной библиотеки, реализована  система плагинов.&lt;/li&gt;
&lt;li&gt;Код максимально приведён в соответствие со спецификацией RDP от Microsoft и подробно комментирован.&lt;/li&gt;
&lt;li&gt;Переписана работа с клавиатурой — больше никаких проблем с раскладками.&lt;/li&gt;
&lt;li&gt;Переписана работа с принтерами, звуком и другими пробрасываемыми устройствами и сервисами.&lt;/li&gt;
&lt;li&gt;Исправлены проблемы с указателем и лицензиями при подключении к серверу терминалов Windows 2008.&lt;/li&gt;
&lt;li&gt;Реализовано кеширование графики (bitmap caching), что позволяет значительно повысить производительность.&lt;/li&gt;
&lt;/ul&gt;Поломанные и убранные возможность rdesktop:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;В данный момент не реализована поддержка проброса COM портов и поддержка смарт-карт.&lt;/li&gt;
&lt;li&gt;Убрана поддержка режима SeamlessRDP в пользу реализации RemoteApp, которой правда тоже пока что нет.&lt;/li&gt;
&lt;/ul&gt;&lt;h4&gt;Remmina&lt;/h4&gt;&lt;br /&gt;
Кроме того, один из самых удобных графических менеджеров подключений к удалённым рабочим столам &lt;b&gt;Remmina&lt;/b&gt; с версии 0.8 перешёл на использование FreeRDP в качестве RDP клиента.&lt;br /&gt;
&lt;br /&gt;
В версии 0.8 также реализована поддержка .rdp файлов Windows, все  протоколы теперь являются отдельными плагинами, добавлена поддержка IPv6  и произведено много мелких улучшений и исправлений ошибок.&lt;br /&gt;
&lt;br /&gt;
Скачать последние версии FreeRDP и Remmina можно с официальных сайтов:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://remmina.sourceforge.net/&quot;&gt;Официальный сайт Remmina&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.freerdp.com/&quot;&gt;Официальный сайт FreeRDP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;Для пользователей &lt;b&gt;Ubuntu&lt;/b&gt; также доступен PPA репозиторий от разработчика FreeRDP и Remmina с самыми последними версиями этих программ:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://launchpad.net/%7Ellyzs/+archive/ppa&quot;&gt;https://launchpad.net/~llyzs/+archive/ppa&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admoprog.blogspot.com/feeds/5828461370681302353/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://admoprog.blogspot.com/2010/09/rdp-freerdp.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/5828461370681302353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/5828461370681302353'/><link rel='alternate' type='text/html' href='http://admoprog.blogspot.com/2010/09/rdp-freerdp.html' title='Полнофункциональный RDP клиент — FreeRDP'/><author><name>anatakil</name><uri>http://www.blogger.com/profile/13091951289499869135</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511633488317993065.post-5007595825174434086</id><published>2010-09-15T14:23:00.000-07:00</published><updated>2010-09-15T14:23:31.829-07:00</updated><title type='text'>А вы любите программировать?</title><content type='html'>&lt;a href=&quot;http://blogs.byte-force.com/xor/archive/2010/09/15/do-you-love-programming.aspx&quot;&gt;А вы любите программировать? Если не любите, если любили, но забыли, как  страшный сон, то дальше можно не читать. Сразу предупрежу, что пишу это  с целью – хочу объяснить, почему программисту необходимо ходить на  воркшопы и посещать конференции разработчиков.&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://admoprog.blogspot.com/feeds/5007595825174434086/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://admoprog.blogspot.com/2010/09/blog-post_9773.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/5007595825174434086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/5007595825174434086'/><link rel='alternate' type='text/html' href='http://admoprog.blogspot.com/2010/09/blog-post_9773.html' title='А вы любите программировать?'/><author><name>anatakil</name><uri>http://www.blogger.com/profile/13091951289499869135</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511633488317993065.post-792312242755643482</id><published>2010-09-15T14:22:00.001-07:00</published><updated>2010-09-15T14:22:28.237-07:00</updated><title type='text'>Что такое минимализм?</title><content type='html'>&lt;div class=&quot;content&quot;&gt;  &lt;img src=&quot;http://habrastorage.org/storage/d411d106/b0fcb1b0/59094970/75074e4e.png&quot; /&gt;&lt;br /&gt;
&lt;h2&gt;Минимализм vs. простота&lt;/h2&gt;&lt;br /&gt;
Я постоянно слышу термин «минимализм» и «минималистический». В мире  дизайна есть разные способы, чтобы описать дизайн, простой, ясный и  удобный. Однако большинство используют термин — «минимализм». Если вы  собираетесь использовать это слово, то по крайней мере потрудитесь  понять истинное значение и использовать его правильно. Первое, что нужно  понимать, что &lt;strong&gt;простота — это не минимализм&lt;/strong&gt;. Они похожи, но они не то же самое.&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;&quot; name=&quot;habracut&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;Что такое минимализм?&lt;/h2&gt;&lt;br /&gt;
Действительно минималистический дизайн — дизайн с&lt;strong&gt; максимальным соотношением сигнал\шум&lt;/strong&gt;.  Сигнал — это информация, которую вы бы хотели сообщить; шум —  посторонняя информация, которая размывает сигнал. Ключевым моментом в  создании минималистского дизайна, является достижение &lt;strong&gt;максимального&lt;/strong&gt;&lt;strong&gt; сигнала и &lt;/strong&gt;&lt;strong&gt;минимального&lt;/strong&gt;&lt;strong&gt; шума&lt;/strong&gt;.  Когда вы добились этого, вы сократили нагрузку на пользователя и  создали четкий фокус на вашей информации. В минималистском дизайне, &lt;strong&gt;удаление ненужных элементов делает акцент на важной информации&lt;/strong&gt;, в результате чего усиливается сигнал и уменьшается шум. Сигнал увеличивается, когда вы &lt;strong&gt;выделяете необходимую информацию&lt;/strong&gt;,  придавая ей еще больший акцент и контраст по отношению к менее важной  информации. Прежде чем говорить о минимализме необходимо иметь как можно  более высокое отношение сигнала к шуму.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Отношение сигнал \ шум (пример)&lt;/h2&gt;&lt;br /&gt;
&lt;img src=&quot;http://habrastorage.org/storage/0b6cadd6/52a5cec5/cc3094ff/a11e16b6.png&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Минимализм не всегда нужен&lt;/h2&gt;&lt;br /&gt;
Когда нужен минимализм в дизайне? Это зависит от того, как вы  определяете успех для вашего дизайна. Если хороший дизайн тот, который  очень красив, то первая панель навигации ниже, может быть вашим выбором.  Если вы одновременно хотите добиться привлекательного внешнего вида и  одновременно не напрягать пользователей, то вторая и третья панели  навигации будут хорошим выбором. Но, может, вы думаете: «минимализм —  это круто!», любите простые вещи и решения (например, шрифт Helvetica  Neue Light). Если да, то самая нижняя навигационная панель будут лучшим  выбором. &lt;strong&gt;Все зависит от вас и как вы определяете успех вашего дизайна&lt;/strong&gt;.  Однако я бы посоветовал убедится, что ваш сигнал, по крайней мере выше,  чем шум. Тогда то, что вы хотите передать пользователям будет ясно.  Минимализм — это хорошо, но иногда достаточно простоты.&lt;br /&gt;
&lt;br /&gt;
&lt;img src=&quot;http://habrastorage.org/storage/f5582ba9/d4b5f72c/98b6bfec/9b1630ef.png&quot; /&gt;          &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admoprog.blogspot.com/feeds/792312242755643482/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://admoprog.blogspot.com/2010/09/blog-post_2739.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/792312242755643482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/792312242755643482'/><link rel='alternate' type='text/html' href='http://admoprog.blogspot.com/2010/09/blog-post_2739.html' title='Что такое минимализм?'/><author><name>anatakil</name><uri>http://www.blogger.com/profile/13091951289499869135</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511633488317993065.post-3567717805114206136</id><published>2010-09-15T14:21:00.002-07:00</published><updated>2010-09-15T14:21:47.552-07:00</updated><title type='text'>Алгоритм определения пола</title><content type='html'>При работе с базой данных клиентов, для автоматизации выборки встала  задача определить пол человека. В базе есть и русские и иностранцы.  Думал долго, взвешивал все варианты и остановился на способе, о котором  хочу рассказать.&lt;br /&gt;
&lt;a name=&#39;more&#39;&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;&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><link rel='replies' type='application/atom+xml' href='http://admoprog.blogspot.com/feeds/3567717805114206136/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://admoprog.blogspot.com/2010/09/blog-post_15.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/3567717805114206136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/3567717805114206136'/><link rel='alternate' type='text/html' href='http://admoprog.blogspot.com/2010/09/blog-post_15.html' title='Алгоритм определения пола'/><author><name>anatakil</name><uri>http://www.blogger.com/profile/13091951289499869135</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511633488317993065.post-1954117880335393631</id><published>2010-09-15T14:21:00.000-07:00</published><updated>2011-02-01T07:16:01.188-08:00</updated><title type='text'>Роутим IPv4 и IPv6 в KVM на примере Hetzner</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div class=&quot;content&quot;&gt;&lt;img src=&quot;http://habreffect.ru/files/a93/101301b05/hz.png&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Данная статья посвящена вопросам правильной настройки IPv4 и IPv6 в сетевых конфигурациях, аналогичных тем, что применяются в &lt;a href=&quot;http://hetzner.de/&quot;&gt;Hetzner&lt;/a&gt; на базе KVM (так же потенциально подходит для любых других HVM, и для Xen).&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Примеры конфигурации интерфейсов основаны на ifup, так как на хосте и  большинстве виртуалок у меня Ubuntu. Гайд по IPv4 местами основан на &lt;a href=&quot;http://wiki.hetzner.de/index.php/KVM_mit_Nutzung_aller_IPs_aus_Subnetz&quot;&gt;статье из Hetzner Wiki&lt;/a&gt;, вопросы IPv6 я, в основном, гуглил.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Стартовые условия&lt;/h4&gt;&lt;br /&gt;
&lt;br /&gt;
У данного хостера вы сходу получаете один IPv4 адрес. Дополнительно к  нему вы можете попросить/приобрести до трех IPv4-адресов и блоки  подсетей. В данном примере будет рассматриваться следующую конфигураця:&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;blockquote&gt;IP хоста: &lt;span style=&quot;color: red;&quot;&gt;123.45.12.48&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;Шлюз: &lt;span style=&quot;color: blue;&quot;&gt;123.45.12.1&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;Дополнительные IP: &lt;span style=&quot;color: purple;&quot;&gt;123.45.53.11&lt;/span&gt;, &lt;span style=&quot;color: purple;&quot;&gt;123.45.53.12&lt;/span&gt;, &lt;span style=&quot;color: purple;&quot;&gt;123.45.53.13&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;Дополнительная подсеть: &lt;span style=&quot;color: green;&quot;&gt;123.45.90.112/29&lt;/span&gt;&lt;/blockquote&gt;&lt;div class=&quot;content&quot;&gt;&lt;br /&gt;
Hetzner шлет все пакеты на MAC-адрес первого (и, обычно, единственного)  интерфейса eth0, и ожидает, что все исходящие пакеты будут уходить с  этого же MAC-адреса. Через саппорт можно попросить поставить другие  MAC-адреса для дополнительных &lt;span style=&quot;color: purple;&quot;&gt;«поштучных»&lt;/span&gt; IP-адресов, что позволяет закинуть vnet* интерфейсы KVM-ок в один мост с eth0, но эту конфигурацию я рассматривать не буду.&lt;br /&gt;
&lt;br /&gt;
Итак, что необходимо получить в итоговой конфигурации:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;отсутствие NAT, каждая VM получает минимум один публичный IP-адрес;&lt;/li&gt;
&lt;li&gt;хост занимается всем роутингом:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;трафик между разными VM;&lt;/li&gt;
&lt;li&gt;трифик между VM и интернетом;&lt;/li&gt;
&lt;li&gt;централизовано фильтрует пакеты в iptables (можно ограничивать взаимодействие VM друг с другом и интернетом)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;IP-адреса из выделенных подсетей не теряются (в &lt;span style=&quot;color: green;&quot;&gt;демонстрационной подсети&lt;/span&gt; адреса 123.45.90.112 и 123.45.90.119 обычным методом использовать нельзя – это адреса сети и броадкаста)&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
Для настройки сети понадобятся следующие пакеты: bridge-utils, dhcp3-server, iptables, iproute2.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Настраиваем основной интерфейс хоста&lt;/h4&gt;&lt;br /&gt;
В /etc/network/interfaces необходимо описать eth0 следующим образом:&lt;br /&gt;
&lt;code&gt;auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
&amp;nbsp;&amp;nbsp;address &lt;span style=&quot;color: red;&quot;&gt;123.45.12.48&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;netmask 255.255.255.255&lt;br /&gt;
&amp;nbsp;&amp;nbsp;gateway &lt;span style=&quot;color: blue;&quot;&gt;123.45.12.1&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;pointopoint &lt;span style=&quot;color: blue;&quot;&gt;123.45.12.1&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
Маска 255.255.255.255 означает, что все исходящие пакеты будут уходить  на шлюз, через опцию pointopoint ifup определяет, что гейтвей технически  находится на этом же интерфейсе (куда он, естественно, иначе не  попадает из-за ограниченной маски). Это эквивалентно следующим правилам  роутинга:&lt;br /&gt;
&lt;code&gt;&lt;span style=&quot;color: blue;&quot;&gt;123.45.12.1&lt;/span&gt; dev eth0 proto kernel scope link src &lt;span style=&quot;color: red;&quot;&gt;123.45.12.48&lt;/span&gt; &lt;br /&gt;
default via &lt;span style=&quot;color: blue;&quot;&gt;123.45.12.1&lt;/span&gt; dev eth0 metric 100&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Настраиваем по мосту для VM&lt;/h4&gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку в задачу входит ограничение трафика между VM, их нельзя засунуть в один мост. Для каждого &lt;span style=&quot;color: purple;&quot;&gt;дополнительного&lt;/span&gt; IP-адреса и &lt;b&gt;каждого&lt;/b&gt; адреса &lt;span style=&quot;color: green;&quot;&gt;из подсети /29&lt;/span&gt; необходимо описать отдельный мост:&lt;br /&gt;
&lt;code&gt;auto br&lt;span style=&quot;color: green;&quot;&gt;112&lt;/span&gt;&lt;br /&gt;
br&lt;span style=&quot;color: green;&quot;&gt;112&lt;/span&gt; iface inet static&lt;br /&gt;
&amp;nbsp;&amp;nbsp;address 172.30.&lt;span style=&quot;color: green;&quot;&gt;112&lt;/span&gt;.1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;netmask 255.255.255.0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;pre-up brctl addbr br&lt;span style=&quot;color: green;&quot;&gt;112&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;post-up route add -host &lt;span style=&quot;color: green;&quot;&gt;123.45.90.112&lt;/span&gt; br112&lt;br /&gt;
&amp;nbsp;&amp;nbsp;post-down brctl delbr br&lt;span style=&quot;color: green;&quot;&gt;112&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
Каждый мост будет называться br&amp;lt;xxx&amp;gt;, где xxx – последний байт  IPv4 адреса. На нем поднимается приватный IPv4 адрес из 172.30.xx.0/24  (зачем это надо – описано далее), тут же в описании интерфейса привязан  brctl (создание моста в pre-up, уничтожение в post-down), и  настраивается роутинг (публичный IP-адрес определяется на этом мосту).&lt;br /&gt;
&lt;br /&gt;
Абсолютно идентично описываются br&lt;span style=&quot;color: purple;&quot;&gt;11&lt;/span&gt;, br&lt;span style=&quot;color: purple;&quot;&gt;12&lt;/span&gt;, br&lt;span style=&quot;color: purple;&quot;&gt;13&lt;/span&gt;, и br&lt;span style=&quot;color: green;&quot;&gt;113&lt;/span&gt;–br&lt;span style=&quot;color: green;&quot;&gt;119&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Настраиваем DHCP&lt;/h4&gt;&lt;br /&gt;
&lt;br /&gt;
Так как pointopoint конфигурация затруднена в процессе инсталляции  некоторых OS, на каждом мосту для VM будет работать DHCP-сервер, который  даст базовую конфигурацию IPv4, достаточную для завершения установки.&lt;br /&gt;
&lt;br /&gt;
Модифицируем конфиг dhcp3 в /etc/dhcp3/dhcpd.conf следующим образом:&lt;br /&gt;
&lt;code&gt;authoritative;&lt;br /&gt;
default-lease-time 3600;&lt;br /&gt;
max-lease-time 3600;&lt;br /&gt;
ddns-update-style ad-hoc;&lt;br /&gt;
log-facility local7;&lt;br /&gt;
use-host-decl-names on;&lt;br /&gt;
&lt;br /&gt;
option subnet-mask 255.255.255.0;&lt;br /&gt;
option domain-name &quot;lan&quot;;&lt;br /&gt;
option domain-name-servers xx.yy.100.100, xx.yy.99.99, xx.yy.98.98; &lt;b&gt;&amp;lt;-- заменяем на актуальные DNS–серверы&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
subnet 172.30.11.0 netmask 255.255.255.0 {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;option routers 172.30.11.1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;range 172.30.11.10 172.30.11.200;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
subnet 172.30.12.0 netmask 255.255.255.0 {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;option routers 172.30.12.1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;range 172.30.12.10 172.30.12.200;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
subnet 172.30.13.0 netmask 255.255.255.0 {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;option routers 172.30.13.1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;range 172.30.13.10 172.30.13.200;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
subnet 172.30.112.0 netmask 255.255.255.0 {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;option routers 172.30.112.1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;range 172.30.112.10 172.30.112.200;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
subnet 172.30.119.0 netmask 255.255.255.0 {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;option routers 172.30.119.1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;range 172.30.119.10 172.30.119.200;&lt;br /&gt;
}&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Также объясняем, на каких интерфейсах dhcp3 должен работать: в файле /etc/default/dhcp3-server изменяем INTERFACES:&lt;br /&gt;
&lt;code&gt;INTERFACES=&quot;br11 br12 br13 br112 br113 br114 br115 br116 br117 br118 br119&quot;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
После чего перезапускаем dhcp3:&lt;br /&gt;
&lt;code&gt;/etc/init.d/dhcp3-server restart&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Настройка iptables&lt;/h4&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;#!/bin/sh&lt;br /&gt;
it=&quot;/sbin/iptables&quot;&lt;br /&gt;
&lt;br /&gt;
MY_NET=&quot;&lt;span style=&quot;color: green;&quot;&gt;123.45.90.112/29&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;123.45.53.11/32&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;123.45.53.12/32&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;123.45.53.13/32&lt;/span&gt;&quot;&lt;br /&gt;
MY_NET_DHCP=&quot;172.30.0.0/16&quot;&lt;br /&gt;
HOST_IP=&quot;&lt;span style=&quot;color: red;&quot;&gt;123.45.12.48&lt;/span&gt;&quot;&lt;br /&gt;
MAIN_IF=&quot;eth0&quot;&lt;br /&gt;
&lt;br /&gt;
# INPUT&lt;br /&gt;
$it -F INPUT&lt;br /&gt;
&lt;br /&gt;
$it -A INPUT -p udp --dport 67 -i br+ -j ACCEPT&lt;br /&gt;
# настраиваем другие политики INPUT&lt;br /&gt;
#$it -A INPUT -j DROP&lt;br /&gt;
&lt;br /&gt;
# FORWARD&lt;br /&gt;
$it -F FORWARD&lt;br /&gt;
&lt;br /&gt;
$it -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
for NET in $MY_NET; do&lt;br /&gt;
$it -A FORWARD -i br+ -o $MAIN_IF -s $NET -j ACCEPT # VM[fixed_ip] --&amp;gt; net&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
for NET in $MY_NET_DHCP; do&lt;br /&gt;
$it -A FORWARD -i br+ -o $MAIN_IF -s $NET -j ACCEPT # VM[dhcp] --&amp;gt; net&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
for SOURCE_NET in $MY_NET $MY_NET_DHCP; do&lt;br /&gt;
for DEST_NET in $MY_NET; do&lt;br /&gt;
$it -A FORWARD -i br+ -o br+ -s $SOURCE_NET -d $DEST_NET -j ACCEPT # VM &amp;lt;--&amp;gt; VM&lt;br /&gt;
done&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
for NET in $MY_NET; do&lt;br /&gt;
$it -A FORWARD -i $MAIN_IF -o br+ -d $NET -j ACCEPT # net --&amp;gt; VM&lt;br /&gt;
done&lt;br /&gt;
$it -A FORWARD -i $MAIN_IF -o gbr1 -d $MY_NET_PVT -j ACCEPT # net --&amp;gt; PVT&lt;br /&gt;
&lt;br /&gt;
$it -P FORWARD DROP&lt;br /&gt;
&lt;br /&gt;
# POSTROUTING&lt;br /&gt;
$it -t nat -F POSTROUTING&lt;br /&gt;
for NET in $MY_NET_DHCP; do&lt;br /&gt;
$it -t nat -A POSTROUTING -o $MAIN_IF -s $NET -j SNAT --to-source $HOST_IP # nat the dhcp&lt;br /&gt;
# NAT для приватных IP-адресов от DHCP&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo 1 &amp;gt; / proc/sys/net/ipv4/ip_forward&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Настройка VM&lt;/h4&gt;&lt;br /&gt;
&lt;br /&gt;
Ну и последний этап – непосредственно настроить VM. Для libvirt/KVM описываем сеть через мост:&lt;br /&gt;
&lt;code&gt;&amp;lt;interface type=&#39;bridge&#39;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;source bridge=&#39;brXX&#39;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;model type=&#39;virtio&#39;/&amp;gt;&lt;br /&gt;
&amp;lt;/interface&amp;gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
При этом, на первичной загрузке виртуалка получит приватный адрес от  DHCP, а уже после установки необходимо зафиксировать на ней публичный  IP:&lt;br /&gt;
&lt;code&gt;auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
&amp;nbsp;&amp;nbsp;address &lt;span style=&quot;color: green;&quot;&gt;123.45.90.116&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;netmask 255.255.255.255&lt;br /&gt;
&amp;nbsp;&amp;nbsp;gateway &lt;span style=&quot;color: red;&quot;&gt;123.45.12.48&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;pointopoint &lt;span style=&quot;color: red;&quot;&gt;123.45.12.48&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Объем статьи вышел достаточно большой, так что про IPv6 напишу отдельно.          &lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admoprog.blogspot.com/feeds/1954117880335393631/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://admoprog.blogspot.com/2010/09/ipv4-ipv6-kvm-hetzner.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/1954117880335393631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/1954117880335393631'/><link rel='alternate' type='text/html' href='http://admoprog.blogspot.com/2010/09/ipv4-ipv6-kvm-hetzner.html' title='Роутим IPv4 и IPv6 в KVM на примере Hetzner'/><author><name>anatakil</name><uri>http://www.blogger.com/profile/13091951289499869135</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511633488317993065.post-3446692190654168729</id><published>2010-09-15T14:20:00.001-07:00</published><updated>2010-09-15T14:20:12.522-07:00</updated><title type='text'>Искра 10.4</title><content type='html'>Представлена новая версия развлекательной платформы &lt;a href=&quot;http://integra-l.ru/site/index.php/bluebird&quot;&gt;Синяя птица&lt;/a&gt;  – Искра 10.4. Основным новшеством стало начало кампании по интеграции  русскоязычных информационных ресурсов и интернет-сервисов. Так, создан  каталог интернет-ресурсов Медиатека (представленный «лучшими  тематическими ссылками на самые популярные и интересные отечественные  сайты») и, кроме того, будет осуществлена его интеграция в главное меню и  основной браузер. Операционная система имеет три варианта окружения  рабочего стола: Liquid (GNOME), KDE и Liquid UNE (медиацентр). Среди  программного обеспечения, вошедшего в дистрибутив: Mozilla Firefox 3.6,  GIMP 2.6, OpenOffice.org 3.2, два ядра - linux 2.6.32 generic x86 и  linux 2.6.32 generic-pae x86, GNOME 2.30, KDE4.4.2 и другое. Искра 10.4  включила в свой состав 45 игр (0 A.D., BosWars, Warzone 2100, Битва за  Веснот, и другие), а еще «несколько сотен» доступны для загрузки из  Интернета, посредством встроенного установщика программ. Вы можете  ознакомиться с дополнительной информацией &lt;a href=&quot;http://www.integra-l.ru/site/index.php/more-about-company/news/131-spark10-4-start&quot;&gt;здесь&lt;/a&gt;, а также загрузить операционную систему &lt;a href=&quot;http://www.integra-l.ru/site/index.php/bluebird/download-page#spark&quot;&gt;здесь&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://admoprog.blogspot.com/feeds/3446692190654168729/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://admoprog.blogspot.com/2010/09/104.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/3446692190654168729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/3446692190654168729'/><link rel='alternate' type='text/html' href='http://admoprog.blogspot.com/2010/09/104.html' title='Искра 10.4'/><author><name>anatakil</name><uri>http://www.blogger.com/profile/13091951289499869135</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511633488317993065.post-6745386182198829933</id><published>2010-09-15T14:19:00.000-07:00</published><updated>2010-09-15T14:19:39.949-07:00</updated><title type='text'>Локальный сервер на Debian GNU/Linux для начинающих</title><content type='html'>&lt;div class=&quot;content&quot;&gt;  &lt;img align=&quot;right&quot; alt=&quot;Локальный сервер на Debian GNU/Linux» для начинающих&quot; src=&quot;http://habreffect.ru/files/04f/79e2ce9dd/localserver.png&quot; title=&quot;Локальный сервер на Debian GNU/Linux» для начинающих&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Представляю первую версию руководства «Локальный сервер на Debian  GNU/Linux» для начинающих пользователей Debian, которое содержит в себе  четыре главы: &lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;установка и настройка Debian GNU/Linux;&lt;/li&gt;
&lt;li&gt;установка web-сервера, его настройка и настройка виртуальных хостов;&lt;/li&gt;
&lt;li&gt;установка Drupal;&lt;/li&gt;
&lt;li&gt;установка и работа с Drush.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;Примечание:&lt;/b&gt;&lt;br /&gt;
В руководстве содержатся примеры выполнения команд в терминале, даны  описания командам, приведены скриншоты, которые помогут  сориентироваться.&lt;br /&gt;
&lt;br /&gt;
Руководство не претендует на полноту изложения, но содержит в себе всё необходимое для начала работы в этой замечательной ОС.&lt;br /&gt;
&lt;br /&gt;
Руководство будет полезно для начального знакомства с системой.  Некоторые аспекты работы в Debian рассмотрены очень поверхностно,  некоторые — глубоко, некоторых не хватает (перебор информации для  начального уровня). &lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;&quot; name=&quot;habracut&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Содержание&lt;/h2&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Часть первая: установка и настройка Debian GNU/Linux&lt;/h3&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;рассмотрена графическая установка;&lt;/li&gt;
&lt;li&gt;работа с sudo;&lt;/li&gt;
&lt;li&gt;работа с репозиториями;&lt;/li&gt;
&lt;li&gt;редактирование файлов в редакторах nano и gedit;&lt;/li&gt;
&lt;li&gt;установка и настройка файлового сервера Samba;&lt;/li&gt;
&lt;li&gt;удаление, установка и обновление программ;&lt;/li&gt;
&lt;li&gt;работа с deb-пакетами.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Часть вторая: установка web-сервера, его настройка и настройка виртуальных хостов&lt;/h3&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;установка Apache2, MySQL, PHP5;&lt;/li&gt;
&lt;li&gt;установка дополнительных модулей и библиотек;&lt;/li&gt;
&lt;li&gt;установка Pecl APC;&lt;/li&gt;
&lt;li&gt;компилирование PHP с GD;&lt;/li&gt;
&lt;li&gt;настройка Apache; &lt;/li&gt;
&lt;li&gt;настройка PHP; &lt;/li&gt;
&lt;li&gt;настройка виртуальных хостов.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Часть третья: установка Drupal&lt;/h3&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;рассмотрена базовая установка и настройка Drupal.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Часть четвёртая: установка и работа с Drush&lt;/h3&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;установка Drush;&lt;/li&gt;
&lt;li&gt;рассмотрены основные команды Drush на примере работы с модулем.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Автор:&lt;/strong&gt; &lt;a href=&quot;http://blog.ezersky.ru/&quot;&gt;Станислав Езерский&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;Формат:&lt;/strong&gt; pdf&lt;br /&gt;
&lt;strong&gt;Количество страниц:&lt;/strong&gt; 34&lt;br /&gt;
&lt;a href=&quot;http://shared.ezersky.ru/debian/Local_server_on_Debian_Linux_-_User_Guide.pdf&quot;&gt;&lt;strong&gt;Скачать&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Благодарю &lt;a href=&quot;http://drupal.ru/username/dan&quot;&gt;Даниэля (aka Dan) Ишмаева&lt;/a&gt; за внесённые дополнения и предложения по содержанию.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt; Буду признателен за поправки и предложения по внесению новых пунктов в содержание руководства.&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
Приятного и полезного чтения!          &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admoprog.blogspot.com/feeds/6745386182198829933/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://admoprog.blogspot.com/2010/09/debian-gnulinux.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/6745386182198829933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/6745386182198829933'/><link rel='alternate' type='text/html' href='http://admoprog.blogspot.com/2010/09/debian-gnulinux.html' title='Локальный сервер на Debian GNU/Linux для начинающих'/><author><name>anatakil</name><uri>http://www.blogger.com/profile/13091951289499869135</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511633488317993065.post-2888462438187878273</id><published>2010-09-15T01:09:00.000-07:00</published><updated>2010-09-15T01:11:36.634-07:00</updated><title type='text'>Почему хороший игрок в Starcraft — идеальный работник для стартапа?</title><content type='html'>В последнее время мы как-то особенно углубились в тему стартапов (это и  понятно, ведь новые проекты занимают все наши мысли и свободное время),  поэтому активно читаем все, что пишут по этой теме у нас и в  англоязычных источниках.&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;
Под катом перевод этой самой статьи &lt;br /&gt;
&lt;a name=&#39;more&#39;&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:)&lt;br /&gt;
&lt;br /&gt;
Источник: &lt;a href=&quot;http://www.helloko.com/2010/09/why-startups-should-only-hire-good-starcraft-players/&quot;&gt;www.helloko.com&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://admoprog.blogspot.com/feeds/2888462438187878273/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://admoprog.blogspot.com/2010/09/starcraft.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/2888462438187878273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/2888462438187878273'/><link rel='alternate' type='text/html' href='http://admoprog.blogspot.com/2010/09/starcraft.html' title='Почему хороший игрок в Starcraft — идеальный работник для стартапа?'/><author><name>anatakil</name><uri>http://www.blogger.com/profile/13091951289499869135</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511633488317993065.post-7053546384465480984</id><published>2010-09-15T01:08:00.001-07:00</published><updated>2010-09-15T01:08:31.567-07:00</updated><title type='text'>Инвентаризация компьютеров в сети не вставая со стула или OCS Inventory + GLPI</title><content type='html'>&lt;div class=&quot;content&quot;&gt;  &lt;h4&gt;Всем доброго времени суток!&lt;/h4&gt;&lt;br /&gt;
Как видно из заголовка, речь пойдет о двух программах:&lt;br /&gt;
&lt;b&gt;1. Open Computers and Software Inventory&lt;/b&gt;&lt;br /&gt;
OCS-Inventory основан на распределяемых модулях, устанавливаемых на  инвентаризируемые машины, которые отсылают подробную информацию о  системе, подключенных устройствах и установленном ПО в выделенную базу  данных. &lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Поддерживаются следующие OS: Microsoft Windows, Linux, *BSD, Sun Solaris, IBM AIX, HP-UX, MacOS X&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2. GPLI — Guestion Libre de Parc Informatique&lt;/b&gt;&lt;br /&gt;
Проект предназначен для работы с базой данных IT и телекоммуникационного  оборудования, установленного на предприятии. Также имеется возможность  ведения учета расходных материалов и организации службы технической  поддержки по расписанию и по заявкам пользователей.&lt;br /&gt;
&lt;br /&gt;
На просторах сети интернет достаточно много информации о настройке  данной связки, но мне не встретилось ни одного подробного how to, где  были бы решены все вопросы с локализацией. Поэтому я изложу компиляцию  найденых решений и собственных доработок.&lt;br /&gt;
&lt;a href=&quot;&quot; name=&quot;habracut&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h4&gt;Итак, начнем!&lt;/h4&gt;&lt;br /&gt;
&lt;b&gt;Установка OCS Inventory.&lt;/b&gt;&lt;br /&gt;
&lt;i&gt;Версия OCS: Ver. 1.3.2&lt;/i&gt; &lt;br /&gt;
В качестве серверной ОС для сбора данных у меня будет выступать ОС  FreeBSD. Я не буду описывать установку и настройку LAMP(в данном случае  FAMP =)). Будем исходить из того, что это у вас уже настроено.&lt;br /&gt;
Перед тем как начать установку и настройку OCS Inventory, проверьте установленны ли следующие порты&lt;br /&gt;
&lt;code&gt;/usr/ports/www/mod_perl2&lt;br /&gt;
/usr/ports/sysutils/logrotate&lt;br /&gt;
/usr/ports/lang/perl&lt;/code&gt;&lt;br /&gt;
В конфиге apache должна быть строка&lt;br /&gt;
&lt;code&gt;LoadModule perl_module libexec/apache22/mod_perl.so&lt;/code&gt;&lt;br /&gt;
Проверьте установленны ли следующие модули perl &lt;br /&gt;
&lt;code&gt;Apache::DBI -- 1.08&lt;br /&gt;
BSD::Resource -- 1.2904&lt;br /&gt;
Bundle::NetSNMP -- ???&lt;br /&gt;
Class::Inspector -- 1.24&lt;br /&gt;
Compress::Raw::Bzip2 -- 2.030&lt;br /&gt;
Compress::Raw::Zlib -- 2.030&lt;br /&gt;
DBD::mysql -- 4.017&lt;br /&gt;
DBI -- 1.613&lt;br /&gt;
Digest::SHA1 -- 2.13&lt;br /&gt;
ExtUtils::MakeMaker -- undef&lt;br /&gt;
HTML::Parser -- 3.68&lt;br /&gt;
HTML::Tagset -- 3.20&lt;br /&gt;
IO::Compress -- ???&lt;br /&gt;
LWP -- 5.836&lt;br /&gt;
Locale::gettext -- 1.05&lt;br /&gt;
Net::IP -- 1.25&lt;br /&gt;
Perl -- 5.8.9&lt;br /&gt;
SOAP::Lite -- 0.712&lt;br /&gt;
Storable -- 2.21&lt;br /&gt;
Task::Weaken -- 1.03&lt;br /&gt;
URI -- 1.55&lt;br /&gt;
XML::Entities -- 1.0000&lt;br /&gt;
XML::Parser -- 2.36&lt;br /&gt;
XML::Simple -- 2.18&lt;br /&gt;
mod_perl2 -- 2.000004&lt;/code&gt;&lt;br /&gt;
для этого достаточно запустить вот такой скрипт&lt;br /&gt;
&lt;code&gt;#!/usr/local/bin/perl&lt;br /&gt;
use ExtUtils::Installed;&lt;br /&gt;
my $instmod = ExtUtils::Installed-&amp;gt;new();&lt;br /&gt;
foreach my $module ($instmod-&amp;gt;modules()) {&lt;br /&gt;
my $version = $instmod-&amp;gt;version($module) || &quot;???&quot;;&lt;br /&gt;
print &quot;$module -- $version\n&quot;;&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
Если что-то из приведенного списка у вас отсутствует, то установите коммандой&lt;br /&gt;
&lt;code&gt;#cpan -e ModulName&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h5&gt;&lt;i&gt;1. Качаем пропатченый сервер&lt;/i&gt;&lt;/h5&gt;&lt;br /&gt;
&lt;a href=&quot;ftp://linvinus.ru/ocs/1.3.2/OCSNG_UNIX_SERVER-1.3.2-linvinus-with-utf8_patch.tar.gz&quot;&gt;OCSNG в UTF8&lt;/a&gt;. Спасибо некоему linvinus! &lt;br /&gt;
Автор патча сделал для нас все что нужно, нам лишь осталось исправить  небольшой недочет. Открываем архив, находим там файл  /ocsinventory-server-1.3.2/ocsreports/languages/russian.txt, меняем в  первой строке windows-1251 на utf8 и сохраняем в кодировке UTF8. Тарбол с  исправленным russian.txt можно взять &lt;a href=&quot;http://unixadmins.su/index.php?action=dlattach;topic=160.0;attach=564&quot;&gt;здесь&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h5&gt;&lt;i&gt;2. Распаковывыем архив в папку на сервере(у меня это /usr/local/www/ocs/).&lt;/i&gt;&lt;/h5&gt;&lt;br /&gt;
#tar -xf OCSNG_UNIX_SERVER-1.3.2-linvinus-with-utf8_patch.tar.gz&lt;br /&gt;
&lt;br /&gt;
&lt;h5&gt;&lt;i&gt;3. Создадим директорию для logrotate&lt;/i&gt;&lt;/h5&gt;&lt;br /&gt;
&lt;code&gt;#mkdir /etc/logrotate.d&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h5&gt;&lt;i&gt;4. Изменяем владельца папки&lt;/i&gt;&lt;/h5&gt;&lt;br /&gt;
&lt;code&gt;# chown -R www:www /usr/local/www/ocs/&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h5&gt;&lt;i&gt;5. Далее переходим в папку и запускаем setup.sh&lt;/i&gt;&lt;/h5&gt;&lt;br /&gt;
&lt;code&gt;#sh setup.sh&lt;br /&gt;
&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
| |&lt;br /&gt;
| Welcome to OCS Inventory NG Management server setup ! |&lt;br /&gt;
| |&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
CAUTION: If upgrading Communication server from OCS Inventory NG 1.0 RC2 and&lt;br /&gt;
previous, please remove any Apache configuration for Communication Server!&lt;br /&gt;
&lt;br /&gt;
Do you wish to continue ([y]/n)?&lt;br /&gt;
Assuming Communication server 1.0 RC2 or previous is not installed&lt;br /&gt;
on this computer.&lt;br /&gt;
&lt;br /&gt;
Starting OCS Inventory NG Management server setup from folder /usr/local/www/ocs&lt;br /&gt;
Storing log in file /usr/local/www/ocs/ocs_server_setup.log&lt;br /&gt;
&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
| Checking for database server properties... |&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
Your MySQL client seems to be part of MySQL version 5.1.&lt;br /&gt;
Your computer seems to be running MySQL 4.1 or higher, good ;-)&lt;br /&gt;
&lt;br /&gt;
Which host is running database server [localhost] ?&lt;br /&gt;
OK, database server is running on host localhost ;-)&lt;br /&gt;
&lt;br /&gt;
On which port is running database server [3306] ?&lt;br /&gt;
OK, database server is running on port 3306 ;-)&lt;br /&gt;
&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
| Checking for Apache web server daemon... |&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
Where is Apache daemon binary [/usr/local/sbin/httpd] ?&lt;br /&gt;
OK, using Apache daemon /usr/local/sbin/httpd ;-)&lt;br /&gt;
&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
| Checking for Apache main configuration file... |&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
Where is Apache main configuration file [/usr/local/etc/apache22/httpd.conf] ?&lt;br /&gt;
OK, using Apache main configuration file /usr/local/etc/apache22/httpd.conf ;-)&lt;br /&gt;
&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
| Checking for Apache user account... |&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
Which user account is running Apache web server [User] ?www&lt;br /&gt;
OK, Apache is running under user account www ;-)&lt;br /&gt;
&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
| Checking for Apache group... |&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
Which user group is running Apache web server [www] ?www&lt;br /&gt;
OK, Apache is running under users group www ;-)&lt;br /&gt;
&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
| Checking for Apache Include configuration directory... |&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
Setup found Apache Include configuration directory in&lt;br /&gt;
.&lt;br /&gt;
Setup will put OCS Inventory NG Apache configuration in this directory.&lt;br /&gt;
Where is Apache Include configuration directory [] ?/usr/local/etc/apache22/Includes&lt;br /&gt;
OK, Apache Include configuration directory /usr/local/etc/apache22/Includes found ;-)&lt;br /&gt;
&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
| Checking for PERL Interpreter... |&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
Found PERL Intrepreter at &amp;lt;/usr/bin/perl&amp;gt; ;-)&lt;br /&gt;
Where is PERL Intrepreter binary [/usr/bin/perl] ?&lt;br /&gt;
OK, using PERL Intrepreter /usr/bin/perl ;-)&lt;br /&gt;
&lt;br /&gt;
Do you wish to setup Communication server on this computer ([y]/n)?&lt;br /&gt;
&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
| Checking for Make utility... |&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
OK, Make utility found at &amp;lt;/usr/bin/make&amp;gt; ;-)&lt;br /&gt;
&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
| Checking for Apache mod_perl version... |&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
Checking for Apache mod_perl version 1.99_22 or higher&lt;br /&gt;
Found that mod_perl version 1.99_22 or higher is available.&lt;br /&gt;
OK, Apache is using mod_perl version 1.99_22 or higher ;-)&lt;br /&gt;
&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
| Checking for Communication server log directory... |&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
Communication server can create detailled logs. This logs can be enabled&lt;br /&gt;
by setting interger value of LOGLEVEL to 1 in Administration console&lt;br /&gt;
menu Configuration.&lt;br /&gt;
Where to put Communication server log directory [/var/log/ocsinventory-server] ?&lt;br /&gt;
OK, Communication server will put logs into directory /var/log/ocsinventory-server ;-)&lt;br /&gt;
&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
| Checking for required Perl Modules... |&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
Checking for DBI PERL module...&lt;br /&gt;
Found that PERL module DBI is available.&lt;br /&gt;
Checking for Apache::DBI PERL module...&lt;br /&gt;
Found that PERL module Apache::DBI is available.&lt;br /&gt;
Checking for DBD::mysql PERL module...&lt;br /&gt;
Found that PERL module DBD::mysql is available.&lt;br /&gt;
Checking for Compress::Zlib PERL module...&lt;br /&gt;
Found that PERL module Compress::Zlib is available.&lt;br /&gt;
Checking for XML::Simple PERL module...&lt;br /&gt;
Found that PERL module XML::Simple is available.&lt;br /&gt;
Checking for Net::IP PERL module...&lt;br /&gt;
Found that PERL module Net::IP is available.&lt;br /&gt;
&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
| Checking for optional Perl Modules... |&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
Checking for SOAP::Lite PERL module...&lt;br /&gt;
Found that PERL module SOAP::Lite is available.&lt;br /&gt;
Checking for XML::Entities PERL module...&lt;br /&gt;
Found that PERL module XML::Entities is available.&lt;br /&gt;
&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
| OK, looks good ;-) |&lt;br /&gt;
| |&lt;br /&gt;
| Configuring Communication server Perl modules... |&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
Writing Makefile for Apache::Ocsinventory&lt;br /&gt;
&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
| OK, looks good ;-) |&lt;br /&gt;
| |&lt;br /&gt;
| Preparing Communication server Perl modules... |&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
| OK, prepare finshed ;-) |&lt;br /&gt;
| |&lt;br /&gt;
| Installing Communication server Perl modules... |&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
| OK, Communication server Perl modules install finished;-)|&lt;br /&gt;
| |&lt;br /&gt;
| Creating Communication server log directory... |&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
Creating Communication server log directory /var/log/ocsinventory-server.&lt;br /&gt;
&lt;br /&gt;
Fixing Communication server log directory files permissions.&lt;br /&gt;
Configuring logrotate for Communication server.&lt;br /&gt;
/usr/local/www/ocs&lt;br /&gt;
Removing old communication server logrotate file /etc/logrotate.d/ocsinventory-NG&lt;br /&gt;
Writing communication server logrotate to file /etc/logrotate.d/ocsinventory-server&lt;br /&gt;
&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
| OK, Communication server log directory created ;-) |&lt;br /&gt;
| |&lt;br /&gt;
| Now configuring Apache web server... |&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
To ensure Apache loads mod_perl before OCS Inventory NG Communication Server,&lt;br /&gt;
Setup can name Communication Server Apache configuration file&lt;br /&gt;
&#39;z-ocsinventory-server.conf&#39; instead of &#39;ocsinventory-server.conf&#39;.&lt;br /&gt;
Do you allow Setup renaming Communication Server Apache configuration file&lt;br /&gt;
to &#39;z-ocsinventory-server.conf&#39; ([y]/n) ?y&lt;br /&gt;
OK, using &#39;z-ocsinventory-server.conf&#39; as Communication Server Apache configuration file&lt;br /&gt;
Removing old communication server configuration to file /usr/local/etc/apache22/Includes/ocsinventory.conf&lt;br /&gt;
Writing communication server configuration to file /usr/local/etc/apache22/Includes/z-ocsinventory-server.conf&lt;br /&gt;
&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
| OK, Communication server setup sucessfully finished ;-) |&lt;br /&gt;
| |&lt;br /&gt;
| Please, review /usr/local/etc/apache22/Includes/z-ocsinventory-server.conf&lt;br /&gt;
| to ensure all is good. Then restart Apache daemon. |&lt;br /&gt;
+----------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
Do you wish to setup Administration Server (Web Administration Console)&lt;br /&gt;
on this computer ([y]/n)?n&lt;br /&gt;
&lt;br /&gt;
Setup has created a log file /usr/local/www/ocs/ocs_server_setup.log. Please, save this file.&lt;br /&gt;
If you encounter error while running OCS Inventory NG Management server,&lt;br /&gt;
we can ask you to show us his content !&lt;br /&gt;
&lt;br /&gt;
DON&#39;T FORGET TO RESTART APACHE DAEMON !&lt;br /&gt;
&lt;br /&gt;
Enjoy OCS Inventory NG ;-)&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;h5&gt;&lt;i&gt;6. Создадим файл виртуалхоста &lt;/i&gt;&lt;/h5&gt;&lt;br /&gt;
&lt;code&gt;#ee /usr/local/etc/apache22/Includes/ocs.conf&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
ServerAdmin webmaster@domen.ru&lt;br /&gt;
DocumentRoot /usr/local/www/ocs/ocsreports&lt;br /&gt;
ServerName ocs.domen.ru&lt;br /&gt;
ServerAlias &lt;a href=&quot;http://www.ocs.domen.ru/&quot;&gt;www.ocs.domen.ru&lt;/a&gt;&lt;br /&gt;
ErrorLog &quot;|/usr/local/sbin/rotatelogs /var/log/httpd/http.ocs.domen.ru-error_log.%Y-%m-%d-%H_%M_%S 86400&quot;&lt;br /&gt;
CustomLog &quot;|/usr/local/sbin/rotatelogs /var/log/httpd/http.ocs.domen.ru-access_log.%Y-%m-%d-%H_%M_%S 86400&quot; common&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;lt;Directory /&amp;gt;&lt;br /&gt;
Order deny,allow&lt;br /&gt;
Allow from 192.168.0.0/16&lt;br /&gt;
Options Indexes FollowSymLinks&lt;br /&gt;
DirectoryIndex index.php&lt;br /&gt;
AllowOverride Options&lt;br /&gt;
php_flag file_uploads on&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h5&gt;&lt;i&gt;7. Подключимся к mysql и создадим пользователя с нужными правами&lt;/i&gt;&lt;/h5&gt;&lt;br /&gt;
&lt;code&gt;# mysql -u root -p&lt;br /&gt;
Enter password: &lt;br /&gt;
Welcome to the MySQL monitor. Commands end with ; or \g.&lt;br /&gt;
Your MySQL connection id is 3495&lt;br /&gt;
Server version: 5.1.41 FreeBSD port: mysql-server-5.1.41&lt;br /&gt;
&lt;br /&gt;
Type &#39;help;&#39; or &#39;\h&#39; for help. Type &#39;\c&#39; to clear the current input statement.&lt;br /&gt;
&lt;br /&gt;
mysql&amp;gt; GRANT ALL PRIVILEGES ON ocsweb.* TO &#39;ocs&#39;@&#39;localhost&#39; IDENTIFIED BY &#39;ocs&#39;;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h5&gt;&lt;i&gt;8. Мы почти у цели, открываем наш любимый &lt;s&gt;фаерфокс&lt;/s&gt; браузер и вводим &lt;/i&gt;&lt;/h5&gt;&lt;br /&gt;
http: // ip_address/ocsreports&lt;br /&gt;
&lt;b&gt;В строке «Nombre del servidor» вводим localhost&lt;/b&gt;&lt;br /&gt;
&lt;img alt=&quot;image&quot; src=&quot;http://unixadmins.su/index.php?action=dlattach;topic=160.0;attach=567;image&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;жмем «Отправить запрос»&lt;/b&gt;&lt;br /&gt;
&lt;img alt=&quot;image&quot; src=&quot;http://unixadmins.su/index.php?action=dlattach;topic=160.0;attach=569;image&quot; /&gt;&lt;br /&gt;
&lt;b&gt;Кликаем по ссылке&lt;/b&gt;&lt;br /&gt;
&lt;img alt=&quot;image&quot; src=&quot;http://unixadmins.su/index.php?action=dlattach;topic=160.0;attach=571;image&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Выбираем флаг нашей Родины и вводим admin/admin&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img alt=&quot;image&quot; src=&quot;http://unixadmins.su/index.php?action=dlattach;topic=160.0;attach=573;image&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h5&gt;&lt;i&gt;9. Проверяем работоспособность нашего OCSNG сервера&lt;/i&gt;&lt;/h5&gt;&lt;br /&gt;
Для того чтобы к нам на сервер приходили отчеты о хардверной начинке  компьютеров и установленном ПО необходимо установить агента на  компьютеры нашей сети. Для этого вновь идем на ftp linvinus&#39;а и &lt;a href=&quot;ftp://linvinus.ru/ocs/windows-agent-1.3/OcsAgentSetup.exe&quot;&gt;качаем пропатченный агент&lt;/a&gt;.&lt;br /&gt;
На сервере выполняем комманду&lt;br /&gt;
&lt;code&gt;tail -F /var/log/httpd/http.ocs.domen.ru-error_log.2010-09-14-00_00_00&lt;/code&gt; &lt;br /&gt;
и переходим к установке агента. В процессе установки нам будет предложенно указать сервер для сбора данных&lt;br /&gt;
&lt;img alt=&quot;image&quot; src=&quot;http://unixadmins.su/index.php?action=dlattach;topic=160.0;attach=577;image&quot; /&gt;&lt;br /&gt;
не забудьте поставить галочку как на скриншоте, для того чтобы после установки агент послал информацию серверу&lt;br /&gt;
Если в логе мы видим ругань подобную этой&lt;br /&gt;
&lt;code&gt;[Tue Sep 14 19:16:34 2010] [error] [client 192.168.254.2] Can&#39;t  call method &quot;rollback&quot; on an undefined value at  /usr/local/lib/perl5/site_perl/5.8.9/Apache/Ocsinventory/Server/System.pm  line 265.\n&lt;/code&gt;&lt;br /&gt;
то необходимо проверить правильность установок подключения к mysql в файле &lt;br /&gt;
&lt;code&gt;/usr/local/www/ocs/ocsreports/dbconfig.inc.php &lt;/code&gt;&lt;br /&gt;
и в &lt;br /&gt;
&lt;code&gt;/usr/local/etc/apache22/Includes/z-ocsinventory-server.conf&lt;/code&gt;&lt;br /&gt;
&lt;b&gt;Если все в порядке, то в веб интерфейсе OCS появится новая запись, примерно как на скриншоте =)&lt;/b&gt;&lt;br /&gt;
&lt;img alt=&quot;image&quot; src=&quot;http://unixadmins.su/index.php?action=dlattach;topic=160.0;attach=579;image&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h5&gt;&lt;i&gt;10. Последним штрихом будет развертка агента в сети средствами Active Directory.&lt;/i&gt;&lt;/h5&gt;&lt;br /&gt;
В вики OCS есть скрипт который нуждается лишь в небольшом исправлении в соответствии с реалиями вашей сети.&lt;br /&gt;
&lt;code&gt;@echo off&lt;br /&gt;
&lt;br /&gt;
REM *********** Declare variables *********************************************&lt;br /&gt;
REM *********** Adjust to your situation **************************************&lt;br /&gt;
SET Version=4061.1&lt;br /&gt;
REM имя или IP сервера где установлен OCSNG&lt;br /&gt;
SET Server=ocs.domen.ru&lt;br /&gt;
REM путь к папке на расшареном ресурсе, который доступен всем компьютерам домена&lt;br /&gt;
SET SetupPath=\\dc\shareUstPril&lt;br /&gt;
&lt;br /&gt;
REM *********** Install if agent isn&#39;t found **********************************&lt;br /&gt;
IF EXIST &quot;%PROGRAMFILES%\OCS Inventory agent\OCSInventory.exe&quot; GOTO update&lt;br /&gt;
:install &lt;br /&gt;
%SetupPath%\OcsAgentSetup.exe /S /SERVER:%Server% /NP /DEBUG &lt;br /&gt;
GOTO version&lt;br /&gt;
&lt;br /&gt;
:update&lt;br /&gt;
REM *********** Update agent if %Version%.txt isn&#39;t found *********************&lt;br /&gt;
IF EXIST &quot;%PROGRAMFILES%\OCS Inventory agent\%Version%.txt&quot; GOTO end&lt;br /&gt;
:upgrade&lt;br /&gt;
%SetupPath%\OcsAgentSetup.exe /S /SERVER:%Server% /NP /UPGRADE /DEBUG &lt;br /&gt;
&lt;br /&gt;
:version&lt;br /&gt;
cd /D &quot;%PROGRAMFILES%\OCS Inventory agent\&quot;&lt;br /&gt;
echo pwouet &amp;gt; %Version%.txt&lt;br /&gt;
&lt;br /&gt;
:end&lt;br /&gt;
REM *********** Cleanup variables *********************************************&lt;br /&gt;
SET Version=&lt;br /&gt;
SET Server=&lt;br /&gt;
SET SetupPath=&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
Сохраняем как install_ocs_agent.bat и настраиваем GPO соответствующим образом.&lt;br /&gt;
На этом с OCS закончим. Стоит лишь отметить что данные от агентов  приходят с рандомной задержкой, поэтому после окончания настройки  пройдет достаточно много времени перед тем как вы получите данные от  всех компьютеров.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Установка GLPI.&lt;/b&gt;&lt;br /&gt;
&lt;i&gt;Версия GLPI: glpi-0.72.4_1&lt;/i&gt;&lt;br /&gt;
&lt;h5&gt;&lt;i&gt;1. Установим GLPI из портов.&lt;/i&gt;&lt;/h5&gt;&lt;br /&gt;
&lt;code&gt;make -c /usr/ports/www/glpi install clean&lt;/code&gt;&lt;br /&gt;
После чего создаем алиас или виртуалхост(кому как нравится) в апаче. У меня это алиас&lt;br /&gt;
&lt;code&gt;Alias /glpi &quot;/usr/local/www/glpi&quot;&lt;br /&gt;
&amp;lt;Directory &quot;/usr/local/www/glpi&quot;&amp;gt;&lt;br /&gt;
Options Indexes FollowSymlinks MultiViews&lt;br /&gt;
AllowOverride None&lt;br /&gt;
Order allow,deny&lt;br /&gt;
Allow from 192.168.0.0/16&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
*Почему-то закрывающая &quot;/Directory&quot; не отобразилась, поэтому если копипастите будьте внимательны =)&lt;br /&gt;
&lt;br /&gt;
&lt;h5&gt;&lt;i&gt;2.Создадим пользователя в mysql с необходимыми правами &lt;/i&gt;&lt;/h5&gt;&lt;br /&gt;
&lt;code&gt;mysql&amp;gt; grant all privileges on glpi.* to &#39;glpi&#39;@&#39;localhost&#39; identified by &#39;password_ololo&#39;;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h5&gt;&lt;i&gt;3. Идем на http:// domen.ru/glpi и следуем по шагам мастера установки &lt;/i&gt;&lt;/h5&gt;&lt;br /&gt;
&lt;img alt=&quot;image&quot; src=&quot;http://unixadmins.su/index.php?action=dlattach;topic=160.0;attach=585;image&quot; /&gt;&lt;br /&gt;
&lt;img alt=&quot;image&quot; src=&quot;http://unixadmins.su/index.php?action=dlattach;topic=160.0;attach=583;image&quot; /&gt;&lt;br /&gt;
&lt;img alt=&quot;image&quot; src=&quot;http://unixadmins.su/index.php?action=dlattach;topic=160.0;attach=581;image&quot; /&gt;&lt;br /&gt;
&lt;img alt=&quot;image&quot; src=&quot;http://unixadmins.su/index.php?action=dlattach;topic=160.0;attach=597;image&quot; /&gt;&lt;br /&gt;
&lt;img alt=&quot;image&quot; src=&quot;http://unixadmins.su/index.php?action=dlattach;topic=160.0;attach=595;image&quot; /&gt;&lt;br /&gt;
&lt;img alt=&quot;image&quot; src=&quot;http://unixadmins.su/index.php?action=dlattach;topic=160.0;attach=593;image&quot; /&gt;&lt;br /&gt;
&lt;img alt=&quot;image&quot; src=&quot;http://unixadmins.su/index.php?action=dlattach;topic=160.0;attach=591;image&quot; /&gt;&lt;br /&gt;
&lt;img alt=&quot;image&quot; src=&quot;http://unixadmins.su/index.php?action=dlattach;topic=160.0;attach=589;image&quot; /&gt;&lt;br /&gt;
&lt;img alt=&quot;image&quot; src=&quot;http://unixadmins.su/index.php?action=dlattach;topic=160.0;attach=587;image&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h5&gt;&lt;i&gt;3.Немного поправим исходники GLPI &lt;/i&gt;&lt;/h5&gt;&lt;br /&gt;
Правим файл &lt;br /&gt;
&lt;code&gt;/usr/local/www/glpi/inc/ocsng.class.php&lt;/code&gt;&lt;br /&gt;
Находим класс &lt;br /&gt;
&lt;code&gt;class DBocs extends DBmysql&lt;/code&gt;&lt;br /&gt;
и меняем строку &lt;br /&gt;
&lt;code&gt;$this-&amp;gt;dbenc=&quot;latin1&quot;;&lt;/code&gt;&lt;br /&gt;
на &lt;br /&gt;
&lt;code&gt;$this-&amp;gt;dbenc=&quot;utf8&quot;;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h5&gt;&lt;i&gt;4. Устанавливаем плагин для импорта из OCS &lt;/i&gt;&lt;/h5&gt;&lt;br /&gt;
&lt;a href=&quot;https://forge.indepnet.net/attachments/download/433/glpi-massocsimport-1.3.0.tar.gz&quot;&gt;OCS Import&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Плагин нужно распаковать в папку &lt;br /&gt;
&lt;code&gt;/usr/local/www/glpi/plugins/&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
После чего перейти в веб интерфейсе GLPI &lt;br /&gt;
# Основная панель &amp;gt;&lt;br /&gt;
# Установки &amp;gt;&lt;br /&gt;
# Дополнения&lt;br /&gt;
Жмем «Установить», затем «Включить»&lt;br /&gt;
&lt;br /&gt;
Далее отправляемся в&lt;br /&gt;
# Основная панель &amp;gt;&lt;br /&gt;
# Установки &amp;gt;&lt;br /&gt;
# Общие&lt;br /&gt;
# Ограничения&lt;br /&gt;
«Активировать режим OCSNG » — Да&lt;br /&gt;
&lt;br /&gt;
теперь &lt;br /&gt;
# Основная панель &amp;gt;&lt;br /&gt;
# Установки &amp;gt;&lt;br /&gt;
# Режим OCSNG&lt;br /&gt;
Устанавливаем опции&lt;br /&gt;
&lt;img alt=&quot;image&quot; src=&quot;http://unixadmins.su/index.php?action=dlattach;topic=160.0;attach=601;image&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
# Основная панель &amp;gt;&lt;br /&gt;
# Инструментарий &amp;gt;&lt;br /&gt;
# OCSNG &lt;br /&gt;
# Импортирование новых компьютеров&lt;br /&gt;
Делаем импорт и вуаля =)&lt;br /&gt;
&lt;img alt=&quot;image&quot; src=&quot;http://unixadmins.su/index.php?action=dlattach;topic=160.0;attach=605;image&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h5&gt;&lt;i&gt;И в заключение экспорт в pdf на русском&lt;/i&gt;&lt;/h5&gt;&lt;br /&gt;
&lt;br /&gt;
1. Заменяем все вызовы utf8_decode на utf8_decode_cyr&lt;br /&gt;
&lt;code&gt;#sed -e &#39;s/utf8_decode/utf8_decode_cyr/g&#39;  /usr/local/www/glpi/inc/export.function.php &amp;gt;  /usr/local/www/glpi/inc/export.function.php.new&lt;br /&gt;
#mv /usr/local/www/glpi/inc/export.function.php.new /usr/local/www/glpi/inc/export.function.php&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
2. Добавляем в /var/www/glpi/inc/export.function.php функцию&lt;br /&gt;
&lt;code&gt;function utf8_decode_cyr($value){&lt;br /&gt;
return iconv(&quot;UTF-8&quot;,&quot;Windows-1251&quot;,$value);&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
3. Качаем набор шрифтов по &lt;a href=&quot;http://unixadmins.su/index.php?action=dlattach;topic=160.0;attach=609&quot;&gt;cсылке&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
4. Складываем файлы из архива в /usr/local/www/glpi/lib/ezpdf/fonts/&lt;br /&gt;
Теперь pdf экспортируется как надо&lt;br /&gt;
&lt;img alt=&quot;image&quot; src=&quot;http://unixadmins.su/index.php?action=dlattach;topic=160.0;attach=607;image&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Фуууухххх… управились!&lt;br /&gt;
Все, связка OCS + GLPI установлена и настроена.&lt;br /&gt;
Мне лишь осталось поблагодарить за помощь и поддержку камрада &lt;a href=&quot;http://unixadmins.su/index.php?action=profile;u=1&quot;&gt;Pascal&lt;/a&gt; с форума системных администраторов UNIX и перечислить используемые источники информации =)&lt;br /&gt;
&lt;br /&gt;
1. &lt;a href=&quot;http://www.tux.in.ua/articles/1500&quot;&gt;www.tux.in.ua/articles/1500&lt;/a&gt;&lt;br /&gt;
2. &lt;a href=&quot;http://forums.ocsinventory-ng.org/viewtopic.php?id=4104&quot;&gt;forums.ocsinventory-ng.org/viewtopic.php?id=4104&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
ps&lt;br /&gt;
У GLPI есть еще масса интересных функций, но в рамки данной заметки они ни как не попадают.&lt;br /&gt;
Если у кого то будут траблы с установкой — жду в каментах, чем смогу, как говорится.          &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admoprog.blogspot.com/feeds/7053546384465480984/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://admoprog.blogspot.com/2010/09/ocs-inventory-glpi.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/7053546384465480984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/7053546384465480984'/><link rel='alternate' type='text/html' href='http://admoprog.blogspot.com/2010/09/ocs-inventory-glpi.html' title='Инвентаризация компьютеров в сети не вставая со стула или OCS Inventory + GLPI'/><author><name>anatakil</name><uri>http://www.blogger.com/profile/13091951289499869135</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511633488317993065.post-1948254062446381310</id><published>2010-09-14T06:06:00.000-07:00</published><updated>2010-09-14T06:06:34.227-07:00</updated><title type='text'>Почему Git</title><content type='html'>Было время, когда я&amp;nbsp;ничего не&amp;nbsp;знал про VCS, ни&amp;nbsp;что это такое, ни тем  более зачем это мне. И&amp;nbsp;верхом своих достижений считал папочку с&amp;nbsp;архивами  версий. К&amp;nbsp;моменту осознания необходимости системы контроля версий я&amp;nbsp;уже  набил шишек и&amp;nbsp;прочувствовал необходимость такого инструмента.  Но&amp;nbsp;борландовский аналог CVS меня не&amp;nbsp;впечатлил. У&amp;nbsp;каждого файла свой  номер версии. Как мне получить срез определенного релиза я&amp;nbsp;так  и&amp;nbsp;не&amp;nbsp;разобрался.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt; А&amp;nbsp;в&amp;nbsp;это время SVN победоносно шла сквозь умы  разработчиков. Черт, это было то, чего мне так не&amp;nbsp;хватало. Прочитав доку  и&amp;nbsp;начав работать я&amp;nbsp;просто влюбился в&amp;nbsp;нее. Да, были трудности  и&amp;nbsp;определенные неудобства, но&amp;nbsp;куда без них.&lt;br /&gt;
Так я&amp;nbsp;и&amp;nbsp;работал&amp;nbsp;бы в&amp;nbsp;SVN, но&amp;nbsp;ничего не&amp;nbsp;стоит на&amp;nbsp;месте. В&amp;nbsp;интернете уже  потекли тонкие ручейки новостей про Git. Я&amp;nbsp;не&amp;nbsp;кидаюсь за&amp;nbsp;каждой новой  технологией, и&amp;nbsp;прошло уже достаточно много времени, пока мне  не&amp;nbsp;прожужжали этим Git’ом все мозги. Мне стало любопытно, я&amp;nbsp;вначале  присматривался, примерялся, а&amp;nbsp;потом плюнул и&amp;nbsp;начал новый проект на&amp;nbsp;Git.  Мучался с&amp;nbsp;ребятами 2 недели, накачал литературы, написал шпаргалку. &lt;br /&gt;
Потом ничего, привык, … а&amp;nbsp;потом меня поперло.&lt;br /&gt;
&lt;br /&gt;
Теперь меня регулярно просят рассказать про Git и&amp;nbsp;что в&amp;nbsp;нем такого. Мне  уже надоело, поэтому этот пост для тех, кто еще сомневается.&lt;br /&gt;
&lt;a href=&quot;&quot; name=&quot;habracut&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Все локально&lt;/strong&gt;&lt;br /&gt;
Репозитарий, история, ветки и&amp;nbsp;коммиты.&lt;br /&gt;
Отсюда вытекает 2 важных следствия: все очень быстро, и&amp;nbsp;второе&amp;nbsp;— вы&amp;nbsp;получаете абсолютный контроль над репозитарием.&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Создать репозитарий в&amp;nbsp;текущей директории&amp;nbsp;— «git init». Все.&lt;/li&gt;
&lt;li&gt;Всего одна папочка .git и&amp;nbsp;никакой порнографии ввиде .svn в&amp;nbsp;каждой директории.&lt;/li&gt;
&lt;li&gt;Интернет не&amp;nbsp;нужен. Работать одному вообще шикарно&amp;nbsp;— локальный  репозитарий, который разворачивается за&amp;nbsp;доли секунды. Работа  в&amp;nbsp;распределенной команде&amp;nbsp;— у&amp;nbsp;каждого своя копия репозитария, никто  не&amp;nbsp;зависит от&amp;nbsp;доступности центрального сервера.&lt;/li&gt;
&lt;li&gt;Не&amp;nbsp;надо задумываться о&amp;nbsp;создании системы резервного копирования.  У&amp;nbsp;каждого участника есть копия, из&amp;nbsp;которой можно поднять оригинал.&lt;br /&gt;
Поднимите руки те, кто поднимал потерянный &lt;nobr&gt;svn-репо&lt;/nobr&gt; из&amp;nbsp;своей копии &lt;nobr&gt;git-репозитария&lt;/nobr&gt;.&lt;/li&gt;
&lt;li&gt;В&amp;nbsp;своем репозитарии вы&amp;nbsp;делаете все, что хотите. Любые ветки, никто их&amp;nbsp;не&amp;nbsp;увидит.&lt;br /&gt;
Черт, я&amp;nbsp;помню как мне запрещали в&amp;nbsp;SVN создавать отдельную ветку для работы над экспериментальной версией.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;strong&gt;Контроль&lt;/strong&gt;&lt;br /&gt;
В&amp;nbsp;Git можно делать с&amp;nbsp;коммитами и&amp;nbsp;историей все что угодно:&lt;ul&gt;&lt;li&gt;Удалить коммит, как будто его и&amp;nbsp;не&amp;nbsp;было&lt;/li&gt;
&lt;li&gt;Изменить комментарий коммита&lt;/li&gt;
&lt;li&gt;Поменять коммиты местами&lt;/li&gt;
&lt;li&gt;Объединить несколько коммитов в&amp;nbsp;один, особенно когда нужно «докоммитить» &lt;nobr&gt;что-то&lt;/nobr&gt; забытое&lt;/li&gt;
&lt;li&gt;Разбить коммит на&amp;nbsp;несколько&lt;/li&gt;
&lt;/ul&gt;Ветки:&lt;ul&gt;&lt;li&gt;Перенести/скопировать коммит из&amp;nbsp;одной ветки в&amp;nbsp;другую&lt;/li&gt;
&lt;li&gt;Переместить ветку в&amp;nbsp;любую точку&lt;/li&gt;
&lt;/ul&gt;Очень хорошо это описано здесь: &lt;a href=&quot;http://gq.net.ru/2009/12/16/git-history-rewrite/&quot;&gt;http://gq.net.ru/2009/12/16/&lt;nobr&gt;git-history-rewrite&lt;/nobr&gt;/&lt;/a&gt;&lt;br /&gt;
От&amp;nbsp;таких возможностей сносит голову и&amp;nbsp;&lt;div class=&quot;content&quot;&gt;&lt;nobr&gt;кому-то&lt;/nobr&gt; это может показаться слишком опасным. Да, пару раз я&amp;nbsp;терял коммиты &lt;nobr&gt;из-за&lt;/nobr&gt; своих неопытных манипуляций и&amp;nbsp;потом рылся в&amp;nbsp;«корзине», чтобы их&amp;nbsp;восстановить.&lt;br /&gt;
Но&amp;nbsp;по&amp;nbsp;мере того, как привыкаешь к&amp;nbsp;этому и&amp;nbsp;понимаешь что и&amp;nbsp;как работает,  у&amp;nbsp;тебя вырастают крылья, и&amp;nbsp;ты&amp;nbsp;начинаешь работать намного эффективнее,  получая попутно кучу удовольствия от&amp;nbsp;этого.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Ветки&lt;/strong&gt;&lt;br /&gt;
Git&amp;nbsp;— это ветки. Это настолько просто, гибко и&amp;nbsp;удобно, что все делается в&amp;nbsp;ветках. От&amp;nbsp;релиза, до&amp;nbsp;маленьких задач.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Создать ветку, переключиться в&amp;nbsp;нее, объединить ветки, вернуться назад&amp;nbsp;— это рутинные операции.&lt;/li&gt;
&lt;li&gt;Никаких проблем с&amp;nbsp;мерджем, никогда ничего не&amp;nbsp;теряется.&lt;/li&gt;
&lt;li&gt;За&amp;nbsp;исключением релизных, большинство веток очень короткие и&amp;nbsp;живут 1–3 дня.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;strong&gt;Коммит&lt;/strong&gt;&lt;br /&gt;
Чтобы сделать коммит, надо указать какие именно изменения нужно туда  положить. Изменения, а&amp;nbsp;не&amp;nbsp;файлы. «git add» надо вызывать как для  измененных, так и&amp;nbsp;для новых файлов. Таким образом подготавливается  временное состояние, которое я&amp;nbsp;называю «временный коммит» (в&amp;nbsp;оригинале  «staging area» или «index»).&lt;br /&gt;
В&amp;nbsp;чем преимущество:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Я&amp;nbsp;всегда могу посмотреть что я&amp;nbsp;буду коммитить, а&amp;nbsp;что не&amp;nbsp;попадет в&amp;nbsp;коммит&lt;/li&gt;
&lt;li&gt;Поскольку git принимает «изменения», я&amp;nbsp;могу положить в&amp;nbsp;коммит только  часть изменений в&amp;nbsp;одном файле, а&amp;nbsp;другую часть в&amp;nbsp;этом&amp;nbsp;же файле откатить  или положить в&amp;nbsp;другой коммит.&lt;br /&gt;
&lt;br /&gt;
Последнее время я&amp;nbsp;использую только «git add -p»&amp;nbsp;— Git показывает чанк  за&amp;nbsp;чанком (набор изменений в&amp;nbsp;рамках файла) и&amp;nbsp;спрашивает добавить  в&amp;nbsp;коммит или нет. Так я&amp;nbsp;вижу, что я&amp;nbsp;изменил и&amp;nbsp;буду коммитить. И&amp;nbsp;поэтому  в&amp;nbsp;коммит у&amp;nbsp;меня никогда не&amp;nbsp;попадут отладочный код, комментарии, лишние  правки, пробелы. И&amp;nbsp;коммиты получаются четкими и&amp;nbsp;атомарными.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;strong&gt;Диф и&amp;nbsp;лог&lt;/strong&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Я&amp;nbsp;могу посмотреть диф всей ветки или группы коммитов, чтобы не&amp;nbsp;листать по&amp;nbsp;коммиту, особенно, если они неграмотно оформлены.&lt;/li&gt;
&lt;li&gt;Могу посмотреть разницу между 2 ветками, посмотреть какими коммитами они отличаются.&lt;/li&gt;
&lt;li&gt;Посмотреть диф без учета пробелов (git di&amp;nbsp;-b -w), если &lt;nobr&gt;кто-то&lt;/nobr&gt; увлекся форматированием и&amp;nbsp;превратил диф в&amp;nbsp;одну сплошную кашу&lt;/li&gt;
&lt;li&gt;Могу в&amp;nbsp;конфиге настроить кучу алиасов, которые будут выводить логи коммитов в&amp;nbsp;разных форматах, например, сформировать &lt;nobr&gt;change-log&lt;/nobr&gt;.&lt;/li&gt;
&lt;/ul&gt;Лог&amp;nbsp;— это вообще бездна возможностей.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Stash&lt;/strong&gt;&lt;br /&gt;
Я&amp;nbsp;работаю над задачей, разобрал проект на&amp;nbsp;части и&amp;nbsp;тут мне надо все  бросить, переключиться на&amp;nbsp;другую ветку, чтобы пофикстить баг или  провести ревью. Я&amp;nbsp;сохраняю свои правки во&amp;nbsp;временном состоянии (stash),  переключаюсь, делаю все, что мне надо, возвращаюсь обратно,  восстанавливаю свои правки и&amp;nbsp;продолжаю работать.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Bisect&lt;/strong&gt;&lt;br /&gt;
Команда для поиска коммита, в&amp;nbsp;котором была допущена ошибка. Я&amp;nbsp;указываю  коммит, где я&amp;nbsp;точно знаю, что этой ошибки нет. И&amp;nbsp;коммит, где эта ошибка  уже есть. Далее Git бинарным поиском выбирает коммит для проверки,  переключается на&amp;nbsp;него и&amp;nbsp;предлагает ответить, есть здесь ошибка или нет.  И&amp;nbsp;так до&amp;nbsp;тех пор, пока не&amp;nbsp;будет найден ошибочный коммит. Если есть  возможность, то&amp;nbsp;можно написать скрипт, который будет автоматически  проверять наличие ошибки и&amp;nbsp;возвращать соответствующий код. Отдать этот  скрипт в&amp;nbsp;bisect и&amp;nbsp;получить битую правку.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;git-svn&amp;nbsp;— для тех, кто в&amp;nbsp;подполье&lt;/strong&gt;&lt;br /&gt;
Вы&amp;nbsp;можете локально работать в&amp;nbsp;Git и&amp;nbsp;коммитить при этом в&amp;nbsp;SVN. Никто даже  не&amp;nbsp;догадается, если вы&amp;nbsp;сами не&amp;nbsp;проколитесь по&amp;nbsp;своей счастливой  физиономии. Вы&amp;nbsp;можете легко объединиться со&amp;nbsp;своими коллегами  подпольщиками и&amp;nbsp;делиться веткам и&amp;nbsp;правками из&amp;nbsp;своих репозитариев.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;GUI и&amp;nbsp;консоль&lt;/strong&gt;&lt;br /&gt;
Я, честно говоря, не&amp;nbsp;знаю какой есть GUI у&amp;nbsp;Git. Я&amp;nbsp;никогда  им&amp;nbsp;не&amp;nbsp;пользовался и&amp;nbsp;рекомендую не&amp;nbsp;лишать себя удовольствия работы  с&amp;nbsp;Git’ом в&amp;nbsp;консоли. Не&amp;nbsp;превращайтесь в&amp;nbsp;мартышек, которые ищут нужную  кнопку или галочку в&amp;nbsp;интерфейсе, вместо того, чтобы просто набрать  команду в&amp;nbsp;консоли.&lt;br /&gt;
Ладно, без обид. Я&amp;nbsp;просто хотел сказать, что работа в&amp;nbsp;консоли намного богаче и&amp;nbsp;удобнее.&lt;br /&gt;
У&amp;nbsp;кого нет нормальной консоли… ну, тогда выбирайте GUI, IDE или… OS, у&amp;nbsp;которой эта консоль есть.&lt;br /&gt;
Единственным окошком, которым я&amp;nbsp;регулярно пользуюсь,&amp;nbsp;— это «gitk -all  &amp;amp;». Он&amp;nbsp;показывает дерево коммитов с&amp;nbsp;ветками и&amp;nbsp;тегами. Очень удобно  смотреть где ты&amp;nbsp;сейчас находишься, где какие ветки и&amp;nbsp;как они  переплетаются. Там есть простой поиск и&amp;nbsp;просмотр дифа.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Работа в&amp;nbsp;команде&lt;/strong&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;В&amp;nbsp;git нельзя закрыть доступ к&amp;nbsp;определенной ветке или модулю. Или все  или ничего. Но&amp;nbsp;это еще ни&amp;nbsp;разу не&amp;nbsp;создало мне проблем. Если &lt;nobr&gt;кто-то&lt;/nobr&gt;  ошибся и&amp;nbsp;закоммитил не&amp;nbsp;туда, куда ему следовало (как мы&amp;nbsp;заранее  договорились), тогда я&amp;nbsp;просто откачу эти правки так, как будто  их&amp;nbsp;и&amp;nbsp;никогда и&amp;nbsp;не&amp;nbsp;было, и&amp;nbsp;проведу разъяснительную беседу.&lt;/li&gt;
&lt;li&gt;Все задачи делаются атомарно в&amp;nbsp;ветках и&amp;nbsp;в&amp;nbsp;таком&amp;nbsp;же виде передаются на&amp;nbsp;ревью и&amp;nbsp;мердж. &lt;nobr&gt;Т. е.&lt;/nobr&gt; при желании, ни&amp;nbsp;один коммит не&amp;nbsp;попадет в&amp;nbsp;основной ствол без ревью.&lt;/li&gt;
&lt;li&gt;Очень удобно проводить ревью задачи, которая выполнена в&amp;nbsp;отдельной ветке. Посмотреть полный диф всех коммитов, &lt;nobr&gt;что-то&lt;/nobr&gt; исправить, прокомментировать, отправить обратно на&amp;nbsp;доработку, а&amp;nbsp;потом объединить отдельные коммиты и&amp;nbsp;слить в&amp;nbsp;основную ветку.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;&lt;br /&gt;
Это классная платформа, где можно бесплатно разместить и&amp;nbsp;опубликовать  свой репозитарий. Где живет куча проектов, которые форкаются,  развиваются и&amp;nbsp;обсуждаются. Сейчас там лежат все мои проекты.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Это конечно, далеко не&amp;nbsp;все, что может Git. Есть еще куча всего, чего  я&amp;nbsp;не&amp;nbsp;рассказал и&amp;nbsp;чего я&amp;nbsp;до&amp;nbsp;сих пор еще не&amp;nbsp;знаю. Я&amp;nbsp;постарался осветить  принципиальные моменты.&lt;br /&gt;
У&amp;nbsp;Git’a, конечно, есть и&amp;nbsp;определенные минусы и&amp;nbsp;трудности, но&amp;nbsp;без них не&amp;nbsp;бывает. Да&amp;nbsp;они не&amp;nbsp;существенны. Чаще всего это вопрос &lt;nobr&gt;git-way&lt;/nobr&gt;.&lt;br /&gt;
Правда у&amp;nbsp;Git’а есть один серьезный минус&amp;nbsp;— он&amp;nbsp;не&amp;nbsp;для ленивых. Поэтому  подумайте заранее, прежде чем предлагать Git таким ребятам.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Что дальше&lt;/h4&gt;&lt;br /&gt;
Дальше&amp;nbsp;— начинать работать. Можно читать кучу обзоров и&amp;nbsp;обсуждать  сколько угодно, но&amp;nbsp;до&amp;nbsp;тех пор пока не&amp;nbsp;начнешь работать, ничего  не&amp;nbsp;изменится.&lt;br /&gt;
За&amp;nbsp;один день я&amp;nbsp;перерыл доку и&amp;nbsp;начал работать, 2 недели привыкал, через месяц учил остальных, через 3&amp;nbsp;— расправил крылья.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Как начать&lt;/strong&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Скачать, установить и&amp;nbsp;настроить, я&amp;nbsp;думаю, ни&amp;nbsp;у&amp;nbsp;кого не&amp;nbsp;возникнет  проблем. Почитаете еще статьи в&amp;nbsp;этом блоге про настройки и&amp;nbsp;прочие фишки.&lt;/li&gt;
&lt;li&gt;Прочитайте любую книгу из&amp;nbsp;списке указанного ниже. Правда,  прочитайте. Хоть по&amp;nbsp;диагонали, зато будете знать, что вообще есть. Это  легко сделать за&amp;nbsp;пару часов.&lt;/li&gt;
&lt;li&gt;И&amp;nbsp;начинайте работать над новым проектом или переносите существующий (импортировать не&amp;nbsp;составить труда).&lt;/li&gt;
&lt;/ol&gt;Есть &lt;nobr&gt;чит-шит&lt;/nobr&gt;, который поможет с&amp;nbsp;командами на&amp;nbsp;первое  время. Есть «git help &amp;lt;команда&amp;gt;». Рекомендую не&amp;nbsp;лениться  и&amp;nbsp;регулярно читать хелп для каждой новой команды, а&amp;nbsp;потом еще читать  и&amp;nbsp;перечитывать. Так я&amp;nbsp;узнал большинство возможностей, тонкостей  и&amp;nbsp;нюансов.&lt;br /&gt;
Ну&amp;nbsp;и&amp;nbsp;пишите, если что не&amp;nbsp;понятно. Мне очень трудно понять, какие  очевидные для меня вещи, не&amp;nbsp;понятны новичкам. За&amp;nbsp;второй статьей дело  не&amp;nbsp;станет.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Ссылки:&lt;/strong&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Книга «&lt;a href=&quot;http://progit.org/book/&quot;&gt;Pro Git&lt;/a&gt;»&lt;/li&gt;
&lt;li&gt;Книга «&lt;a href=&quot;http://book.git-scm.com/&quot;&gt;Git Community Book&lt;/a&gt;»&lt;/li&gt;
&lt;li&gt;Книга «Git Magic», нашел здесь: &lt;a href=&quot;http://habrahabr.ru/blogs/Git/80909/&quot;&gt;http://habrahabr.ru/blogs/Git/80909/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://git.or.cz/course/svn.html&quot;&gt;Сравнение команд Git-SVN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://gq.net.ru/2009/12/16/git-history-rewrite/&quot;&gt;Редактирование истории в&amp;nbsp;git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Мои &lt;a href=&quot;http://github.com/maxim-oleinik/symfony-dev-rules/blob/master/git.txt&quot;&gt;правила оформления коммитов и&amp;nbsp;веток&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Мой &lt;a href=&quot;http://github.com/maxim-oleinik/symfony-dev-rules/blob/master/git-cheat-sheet.txt&quot;&gt;cheat-sheet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admoprog.blogspot.com/feeds/1948254062446381310/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://admoprog.blogspot.com/2010/09/git.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/1948254062446381310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/1948254062446381310'/><link rel='alternate' type='text/html' href='http://admoprog.blogspot.com/2010/09/git.html' title='Почему Git'/><author><name>anatakil</name><uri>http://www.blogger.com/profile/13091951289499869135</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511633488317993065.post-8602598208804439696</id><published>2010-09-14T02:30:00.001-07:00</published><updated>2010-09-14T02:30:34.310-07:00</updated><title type='text'>Пресс-релиз по итогам съезда Пиратской Партии России</title><content type='html'>&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=&#39;more&#39;&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><link rel='replies' type='application/atom+xml' href='http://admoprog.blogspot.com/feeds/8602598208804439696/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://admoprog.blogspot.com/2010/09/blog-post_6777.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/8602598208804439696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/8602598208804439696'/><link rel='alternate' type='text/html' href='http://admoprog.blogspot.com/2010/09/blog-post_6777.html' title='Пресс-релиз по итогам съезда Пиратской Партии России'/><author><name>anatakil</name><uri>http://www.blogger.com/profile/13091951289499869135</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511633488317993065.post-8395179794966882583</id><published>2010-09-14T02:29:00.002-07:00</published><updated>2010-09-14T02:29:44.420-07:00</updated><title type='text'>GLGDI+ или «переходим с GDI+ на OpenTK»</title><content type='html'>Думаю, многим приходилось сталкиваться с проблемой, что GDI+ тормозит, а тормозит, потому что не ускоряется железом.&lt;br /&gt;
Вот и я как-то писал редактор уровней&lt;br /&gt;
&lt;img src=&quot;http://habrastorage.org/storage/0c3ee603/dacd0f40/d3166666/1a09765f.jpg&quot; /&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
и понял, что GDI+ мне больше не хватает, нужно переходить на что-то  ускоренное, причем за минимальное время. Немного погуглив, я решил  остановить свой выбор на библиотеке OpenTK.&lt;br /&gt;
&lt;a href=&quot;&quot; name=&quot;habracut&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;OpenTK (Open Toolkit) — это низкоуровневая библиотека,  которая является враппером для OpenGL, OpenGL ES, OpenCL и OpenAL.  Данная библиотека предназначена для игр, научных приложений, а также для  любых других приложений, которым требуется 3D-графика, аудио и  вычислительная функциональность. OpenTK является кроссплатформенной  библиотекой и работает как на Mono, так и на .NET.&lt;/blockquote&gt;&lt;br /&gt;
Почему выбор пал именно на OpenTK? Во-первых, OpenTK предоставляет класс  GLControl (является прямым наследником UserControl), который позволяет  упростить переход на данную библиотеку. Во-вторых, в комплекте идет  класс TextPrinter, который позволяет довольно просто выводить текст на  экран. В-третьих во время гугления я нашел небольшой архив «Engine.zip» с  набором классов для 2D-отрисовки, инициализации OpenGL и прочими  приятностями.&lt;br /&gt;
&lt;br /&gt;
Сначала я планировал описать какие подводные камни встретились мне при  переходе на OpenTK, но, вспомнив, что вопрос перехода с GDI+ на что-то  быстрое является довольно популярным, решил написать небольшую  библиотеку, которая мимикрирует под GDI+ и выложить ее в открытом  доступе. Назвал я ее &lt;a href=&quot;http://code.google.com/p/glgdiplus/&quot;&gt;GLGDI+&lt;/a&gt;.  Помните, что это легковесная библиотека и содержит только самый  необходимый минимум и не пытается полностью копировать API GDI+. Она  содержит классы GLGraphics, GLImage и GLMultiImage. GLGraphics содержит  следующие методы:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;DrawString — выводит текст&lt;/li&gt;
&lt;li&gt;DrawImage — рисует GLImage&lt;/li&gt;
&lt;li&gt;DrawLine — рисует линию&lt;/li&gt;
&lt;li&gt;DrawRectangle — рисует прямоугольник&lt;/li&gt;
&lt;li&gt;FillRectangle — рисует закрашенный прямоугольник&lt;/li&gt;
&lt;li&gt;DrawPoint — рисует точку&lt;/li&gt;
&lt;li&gt;DrawPoints — рисует несколько точек&lt;/li&gt;
&lt;li&gt;DrawMultiImage — рисует GLMultiImage (для отрисовки нескольких  одинаковых изображений разом — это гораздо быстрее, нежели рисовать по  одному, если таких изображений много)&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h5&gt;Некоторые моменты&lt;/h5&gt;&lt;br /&gt;
Я все же опишу некоторые моменты, с которыми мне пришлось столкнуться  при использовании OpenTK. На сайте OpenTK есть хорошие туториалы,  которые я, конечно же, не читал, ознакомься я с ними, и парой проблем  было бы меньше. Но, что было, то было:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Первое с чем я столкнулся: контрол вообще не перерисовывался при  запуске, решилось просто, нужно не забыть вызвать метод SwapBuffers в  конце OnPaint, GLControl уже имеет встроенную функциональность  DoubleBuffer, нужно только переключить буфер&lt;/li&gt;
&lt;li&gt;Следующий момент, о который я споткнулся — это черные прямоугольники  вместо изображений. Решалось вызовом image.SetBlending() перед  отрисовкой, сейчас в библиотеке все изображения рисуются с блендингом,  поэтому с этим проблем быть не должно&lt;/li&gt;
&lt;li&gt;Когда я второй контрол перевел на рельсы OpenTK, то оказалось, что  первый контрол после этого перестал выполнять свои функции, решилось  вызовом метода MakeCurrent в OnPaint перед отрисовкой элементов&lt;/li&gt;
&lt;li&gt;TextPrinter (основа для DrawString) иногда падает при выводе текста,  тут ничего не поделаешь — класс глючный и на определенных сочетаниях  качества отрисовки, шрифта и размера шрифта он падает, пришлось  подбирать шрифт и размер&lt;/li&gt;
&lt;li&gt;Еще нужно отслеживать, что контрол загрузился и только после этого  работать с OpenTK/GLGraphics, а также проверять, что контрол не в режиме  дизайнера форм&lt;/li&gt;
&lt;li&gt;При изменении размеров контрола нужно не забыть вызвать GLGraphics.Resize(Width, Height)&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;h5&gt;Заключение&lt;/h5&gt;&lt;br /&gt;
Библиотека лежит &lt;a href=&quot;http://code.google.com/p/glgdiplus/&quot;&gt;на GoogleCode&lt;/a&gt;,  под BSD лицензией. Если кому понадобится — пользуйтесь на здоровье.  Чтобы понять как работать с библиотекой — посмотрите исходный текст  сэмпла, который идет в комплекте, он очень простой:&lt;br /&gt;
&lt;img src=&quot;http://habrastorage.org/storage/863919b1/984cf9c7/ba364ab7/edf084be.png&quot; /&gt;&lt;br /&gt;
Все описанные выше «моменты» в нем учтены.&lt;br /&gt;
Данную библиотеку я пока не рекомендовал бы использовать для продуктов,  нацеленных на массового пользователя — она слишком молода для этого, но в  утилитах вполне пригодна к использованию.&lt;br /&gt;
На данный момент планов по развитию библиотеки у меня нет — мне ее функционала хватает. Но багфиксы и патчи приветствуются :)&lt;br /&gt;
&lt;br /&gt;
Судя по тому, что я прочитал на OpenTK форуме, TextPrinter (используется  для вывода текста) в будущем будет исключен из библиотеки, но,  возможно, в отдельный проект. Так что его судьба пока что туманна.  Сейчас он в состоянии Deprecated, поэтому дает warnings при компиляции  библиотеки.&lt;br /&gt;
&lt;br /&gt;
Вот теперь редактор карт работает значительно быстрее и ничего не тормозит, чего и вам желаю!&lt;br /&gt;
&lt;br /&gt;
UPD: забыл указать ссылку на сайт &lt;a href=&quot;http://www.opentk.com/&quot;&gt;OpenTK&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;UPD2:&lt;/strong&gt; исправил баг с путями в исходниках сэмпла (как в архиве, так и в SVN)</content><link rel='replies' type='application/atom+xml' href='http://admoprog.blogspot.com/feeds/8395179794966882583/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://admoprog.blogspot.com/2010/09/glgdi-gdi-opentk.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/8395179794966882583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/8395179794966882583'/><link rel='alternate' type='text/html' href='http://admoprog.blogspot.com/2010/09/glgdi-gdi-opentk.html' title='GLGDI+ или «переходим с GDI+ на OpenTK»'/><author><name>anatakil</name><uri>http://www.blogger.com/profile/13091951289499869135</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511633488317993065.post-5375995225172787503</id><published>2010-09-14T02:29:00.000-07:00</published><updated>2010-09-14T02:29:00.500-07:00</updated><title type='text'>Депутат Мосгордумы предлагает запретить торренты и штрафовать пользователей</title><content type='html'>Только что в программе «25-й час» (ТВ Центр) было интервью с депутатом  Мосгордумы Милявским. Он сказал, что вносит законопроект о полном  запрете торрентов как таковых, т.е. вообще всех, а не только пиратских  файлов. Кроме того он предлагает привлекать к ответственности граждан,  покупающих пиратские диски.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Однако, одно его предложение меня очень удивило. На нём остановлюсь чуть подробнее.&lt;br /&gt;
Не так давно (вы помните эту историю: &lt;a href=&quot;http://habrahabr.ru/blogs/copyright/86415/&quot;&gt;[1]&lt;/a&gt;, &lt;a href=&quot;http://habrahabr.ru/blogs/copyright/86435/&quot;&gt;[2]&lt;/a&gt;) &lt;a href=&quot;http://webpublishers.ru/?p=30&quot;&gt;webpublishers.ru&lt;/a&gt; (это не копирасты, это наши друзья!) предлагали выкупать за деньги авторские права у авторов и передавать произведения в &lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5_%D0%B4%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5&quot;&gt;общественное достояние&lt;/a&gt;.&lt;br /&gt;
Милявский предлагает тоже за счёт бюджета выкупать авторские права и  размещать все произведения в Интернете. Но этого естественно  недостаточно, возможно Милявский просто не знает что такое общественное  достояние.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;UPD&lt;/b&gt;: &lt;a href=&quot;http://www.tvc.ru/showSobytia25.aspx?id=63f65571-1167-40e7-8b29-dd9c7d65723b&quot;&gt;Вот видеозапись&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://admoprog.blogspot.com/feeds/5375995225172787503/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://admoprog.blogspot.com/2010/09/blog-post_14.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/5375995225172787503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/5375995225172787503'/><link rel='alternate' type='text/html' href='http://admoprog.blogspot.com/2010/09/blog-post_14.html' title='Депутат Мосгордумы предлагает запретить торренты и штрафовать пользователей'/><author><name>anatakil</name><uri>http://www.blogger.com/profile/13091951289499869135</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511633488317993065.post-4735476887697481023</id><published>2010-09-14T02:28:00.000-07:00</published><updated>2010-09-14T02:28:16.497-07:00</updated><title type='text'>Муртазин: «Ростехнологии на наши деньги врут президенту России»</title><content type='html'>«В результате так называемой „разработки“ на государственные деньги мы  получим ещё одно никому ненужное чудо-юдо, которое пропадёт с горизонта  вместе с освоенными бюджетами. Я обвиняю госкорпорацию „Ростехнологии“ в  том, что они либо некомпетентны (и тогда их надо гнать взашей, а не  кормить за наши деньги), либо они осознанно запустили проект без  будущего, преследуя свои корыстные цели.»</content><link rel='replies' type='application/atom+xml' href='http://admoprog.blogspot.com/feeds/4735476887697481023/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://admoprog.blogspot.com/2010/09/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/4735476887697481023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/4735476887697481023'/><link rel='alternate' type='text/html' href='http://admoprog.blogspot.com/2010/09/blog-post.html' title='Муртазин: «Ростехнологии на наши деньги врут президенту России»'/><author><name>anatakil</name><uri>http://www.blogger.com/profile/13091951289499869135</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511633488317993065.post-3135442829552182708</id><published>2010-09-14T02:27:00.001-07:00</published><updated>2010-09-14T02:27:36.818-07:00</updated><title type='text'>Кто же он такой, отечественный IT-лидер?</title><content type='html'>Все больше и больше IT-компаний озабочены поиском руководителей, так  называемых IT-лидеров, или просто — специалистов на руководящую  должность (&lt;a href=&quot;http://www.e-xecutive.ru/education/adviser/1375019/&quot;&gt;proof&lt;/a&gt;).&lt;br /&gt;
Но что именно вкладывают в понятие IT-лидера компании и почему их поиски не приносят желаемых результатов? &lt;i&gt;Ответ смотрите сегодня вечером на канале ТНТ!&lt;/i&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
А если серьезно, то на лицо идет явное нарушение логики в требованиях к &lt;b&gt;знаниям&lt;/b&gt; и &lt;b&gt;умениям&lt;/b&gt;. И сейчас я объясню, почему.&lt;br /&gt;
&lt;a href=&quot;&quot; name=&quot;habracut&quot;&gt;&lt;/a&gt;&lt;br /&gt;
Итак, прежде всего сам специалист. К нему сразу 2 требования — быть в  курсе современных технологий и способов их применений, и уметь  руководить людьми.&lt;br /&gt;
Однако, сразу возникает вопрос, а почему такой специалист идет работать  наемным сотрудником? Ведь он может сам организовать свой бизнес. Он в  курсе что делать и как общаться с программистами.&lt;br /&gt;
Тут может быть единственный вариант сотрудничества — это партнерство,  когда кроме высокой зарплаты, IT-лидер получает опционы, как это  делается в крупных зарубежных компаниях. Его вклад в работу подобен  банковскому счету — если он работал хорошо, то он получает отчисления от  компании, которые значительно больше ЗП, и главное — к его мнению  прислушиваются не только подчиненные, но и непосредственные  руководители.&lt;br /&gt;
Если сравнить создание IT-проекта со строительством дома, то обычные  программисты являются строителями, строящими модуль за модулем код, а  IT-лидер — строительной фирмой, которая обеспечивает архитектурный  проект, утверждение и контроль за его постройкой.&lt;br /&gt;
&lt;br /&gt;
Однако в сфере отечественных IT-компаний, особенно тех, которые работают  на аутсорс, а таких — большинство, в термин IT-лидера вкладываются  совершенно другие понятия.&lt;br /&gt;
Прежде всего, ни о какой свободе выбора или высказывании своего мнения и  речи быть не может. Руководитель, общаясь непосредственно с заказчиком,  на самом высоком уровне, собирает общие представления о требованиях,  которые потом будут уточняться по мере хода работы.&lt;br /&gt;
И от IT-лидера требуется создать проект, по нечеткому ТЗ, которое еще и будет несколько раз изменено.&lt;br /&gt;
В этом случае IT-лидер выполняет роль прораба, а руководство с  заказчиком — роль сумасбродной блондинки, которая заказала ремонт в  своей квартире, «так чтоб было по-европейски гламурненько, а по цене —  дешевенько».&lt;br /&gt;
И начинается. Сегодня — «Хочу стены розовые». Завтра — «Я передумала,  хочу золотые обои». Послезавтра — «Нет, пусть будет белая штукатурка, я  сама разрисую по-феншую».&lt;br /&gt;
В действительности, руководитель такой компании, чистый менеджер, не  понимает почему нужно так кардинально менять код, как и не понимает  блондинка, почему подготовка стен под обои или краску требует разных  грунтовок и шпаклевки.&lt;br /&gt;
Да они и не хотят понимать, они платят деньги, а ты, IT-прораб  выкручивайся как хочешь. И объясняй уставшим программистам, почему в  очередной раз изменился алгоритм программы и что теперь надо менять.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на современном рынке IT, больше всего затребован  прораб-телепат с навыками пророковедения, способный прочитать мысли  заказчика на расстоянии и предвидеть возможные изменения, чтоб  изначально подойти к проекту таким образом, чтоб он был завершен в срок и  удовлетворил заказчика.</content><link rel='replies' type='application/atom+xml' href='http://admoprog.blogspot.com/feeds/3135442829552182708/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://admoprog.blogspot.com/2010/09/it.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/3135442829552182708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/3135442829552182708'/><link rel='alternate' type='text/html' href='http://admoprog.blogspot.com/2010/09/it.html' title='Кто же он такой, отечественный IT-лидер?'/><author><name>anatakil</name><uri>http://www.blogger.com/profile/13091951289499869135</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511633488317993065.post-477880352445715105</id><published>2010-09-12T06:50:00.001-07:00</published><updated>2010-09-12T06:50:42.871-07:00</updated><title type='text'>Завершена разработка Microsoft Office For Mac 2011</title><content type='html'>&lt;span class=&quot;topic&quot; title=&quot;http://habrahabr.ru/blogs/microsoft_office/104061/&quot;&gt;&lt;/span&gt;       &lt;div class=&quot;content&quot;&gt;  &lt;img alt=&quot;image&quot; src=&quot;http://microgeek.ru/upload/blog/office/edc/edc9d04adc1b81cff05b884443075d22.png&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Радостная новость! Разработка новой версии офисного пакета Office For  Mac 2011 была завершена. Об этом сообщают сами разработчики &lt;a href=&quot;http://blog.officeformac.com/office-for-mac-2011-hits-rtm/&quot;&gt;у себя в блоге&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Напомню, что в новой версии Office for Mac будет добавлено множество  функциональных нововведений из Office 2010, интерфейс будет приведен к  новому внешнему виду, напоминающему ribbon. В состав пакета впервые  войдет почтовый клиент Outlook for Mac. Кроме того, пользователи Office  For Mac смогут подключаться к облачным сервисам Office Web Apps и  SkyDrive.&lt;br /&gt;
&lt;br /&gt;
Дата выпуска Office For Mac 2011 и поступление в продажу пока неизвестна. Но надо думать, что времени осталось совсем немного.          &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admoprog.blogspot.com/feeds/477880352445715105/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://admoprog.blogspot.com/2010/09/microsoft-office-for-mac-2011.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/477880352445715105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/477880352445715105'/><link rel='alternate' type='text/html' href='http://admoprog.blogspot.com/2010/09/microsoft-office-for-mac-2011.html' title='Завершена разработка Microsoft Office For Mac 2011'/><author><name>anatakil</name><uri>http://www.blogger.com/profile/13091951289499869135</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511633488317993065.post-6205080636691862696</id><published>2010-09-11T07:51:00.001-07:00</published><updated>2010-09-12T06:50:03.553-07:00</updated><title type='text'>Сотрудники Microsoft хоронят iPhone</title><content type='html'>По случаю выхода RTM Windows Phone 7, сотрудники Microsoft устроили похоронную процессию iPhone.&lt;br /&gt;
&lt;br /&gt;
&lt;img src=&quot;http://habrastorage.org/storage/677f0bf3/2d450d05/769005d3/e2093cd8.jpg&quot; /&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.blogger.com/post-edit.g?blogID=8511633488317993065&amp;amp;postID=6205080636691862696&quot; name=&quot;habracut&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;img src=&quot;http://habrastorage.org/storage/d4bd0d14/edcf0f98/600febe6/8857f872.jpg&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;http://habrastorage.org/storage/677f0bf3/2d450d05/769005d3/e2093cd8.jpg&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;http://habrastorage.org/storage/4bfd5b9b/99abf31f/a4f38345/34feb9d0.jpg&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;http://habrastorage.org/storage/6eefd252/5eed3fc9/8a95e5f5/87d09626.jpg&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;http://habrastorage.org/storage/67470585/7bba5ec5/8f35c59a/d8dc0b46.jpg&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;http://habrastorage.org/storage/0c30529d/a4ca8370/ce2144fa/245b358d.jpg&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;http://habrastorage.org/storage/a98c051d/c44a08d6/39f5d9b9/41b23044.jpg&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;http://habrastorage.org/storage/8216ca53/7355448d/c802fca7/09657db1.jpg&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;http://habrastorage.org/storage/53df678b/60433a26/b4ab3b4b/abd91dcd.jpg&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
А так же на радостях исполнили танец Thriller</content><link rel='replies' type='application/atom+xml' href='http://admoprog.blogspot.com/feeds/6205080636691862696/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://admoprog.blogspot.com/2010/09/microsoft-iphone.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/6205080636691862696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511633488317993065/posts/default/6205080636691862696'/><link rel='alternate' type='text/html' href='http://admoprog.blogspot.com/2010/09/microsoft-iphone.html' title='Сотрудники Microsoft хоронят iPhone'/><author><name>anatakil</name><uri>http://www.blogger.com/profile/13091951289499869135</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>