<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://man.deeptown.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://man.deeptown.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Root</id>
		<title>Deeptown Manual - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://man.deeptown.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Root"/>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Root"/>
		<updated>2026-05-19T06:30:32Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.20.2</generator>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8</id>
		<title>Алгоритм синхронизации</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8"/>
				<updated>2008-10-23T19:26:48Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Механизм коррекции ошибки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Здесь будет рассмотрена математическая составляющая алгоритмов синхронизации физики. Понимающих в этом деле, просьба прокомментировать.&lt;br /&gt;
&lt;br /&gt;
== Построение сплайна ==&lt;br /&gt;
&lt;br /&gt;
Для синхронизации была выбрана форма кубических сплайнов, при которой за основу берутся значения функции и ее производной в двух точках. &lt;br /&gt;
&lt;br /&gt;
Свойства сплайна:&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t_i) = f(t_i), \quad s'(t_i) = f'(t_i)\!&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Уравнения сплайна:&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = a + bt + ct^2 + dt^3\!&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;s'(t) = b + 2ct + 3dt^2\!&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для нахождения коэффициентов &amp;lt;math&amp;gt;a, b, c, d&amp;lt;/math&amp;gt; записываем систему уравнений:&lt;br /&gt;
:&amp;lt;math&amp;gt;\begin{cases}&lt;br /&gt;
a + bt_0 + ct_0^2 + dt_0^3 = f(t_0) \\&lt;br /&gt;
a + bt_1 + ct_1^2 + dt_1^3 = f(t_1) \\&lt;br /&gt;
b + 2ct_0 + 3dt_0^2 = f'(t_0) \\&lt;br /&gt;
b + 2ct_1 + 3dt_1^2 = f'(t_1)&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подставляем известные значения в правой части системы (даны по условию):&lt;br /&gt;
:&amp;lt;math&amp;gt;\begin{cases}&lt;br /&gt;
a + bt_0 + ct_0^2 + dt_0^3 = x_0 \\&lt;br /&gt;
a + bt_1 + ct_1^2 + dt_1^3 = x_1 \\&lt;br /&gt;
b + 2ct_0 + 3dt_0^2 = v_0 \\&lt;br /&gt;
b + 2ct_1 + 3dt_1^2 = v_1&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку сплайн не зависит от конкретных значений &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;t_1&amp;lt;/math&amp;gt;, положим &amp;lt;math&amp;gt;t_0 = 0&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;t_1 = t&amp;lt;/math&amp;gt;. В результате, пара уравнений становится тривиальной:&lt;br /&gt;
:&amp;lt;math&amp;gt;\begin{cases}&lt;br /&gt;
a = x_0 \\&lt;br /&gt;
a + bt_1 + ct_1^2 + dt_1^3 = x_1 \\&lt;br /&gt;
b = v_0 \\&lt;br /&gt;
b + 2ct_1 + 3dt_1^2 = v_1&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Заменяем в оставшихся уравнениях известные теперь коэффициенты и получаем конечную систему:&lt;br /&gt;
:&amp;lt;math&amp;gt;\begin{cases}&lt;br /&gt;
x_0 + v_0t_1 + ct_1^2 + dt_1^3 = x_1 \\&lt;br /&gt;
v_0 + 2ct_1 + 3dt_1^2 = v_1&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После нехитрых манипуляций, получаем выражения для оставшихся коэффициентов:&lt;br /&gt;
:&amp;lt;math&amp;gt;\begin{cases}&lt;br /&gt;
c = \frac{3x_1 - 3x_0 - 2v_0t - v_1t}{t^2} \\&lt;br /&gt;
d = \frac{v_1t - 2x_1 + 2x_0 + v_ot}{t^3}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ниже представлены графики оригинальной функции с наложенным на них графиком сплайна, построенного по точкам. Парабола и экспонента построены по фиксированному набору точек (-2.5, -2, -0.5, 0.5, 2, 2.5). Синусоида построена по точкам с интервалом 0.05.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Изображение:Exp.gif|Экспонента&lt;br /&gt;
Изображение:Parabola2.gif|Парабола&lt;br /&gt;
Изображение:Sin.gif|Синус&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Механизм коррекции ошибки ==&lt;br /&gt;
&lt;br /&gt;
На клиенте Диптауна работает физический движок - точно такой же, как и на сервере. Он хранит в памяти собственную копию мира (в пределах некотрого радиуса видимости), и, по приходящим от сервера данным, старается делать его наиболее похожим на мир, который находится на сервере.&lt;br /&gt;
&lt;br /&gt;
В идеальном случае, при нулевой задержке времени между клиентом и сервером, а также при достаточно большой частоте обновлений, рассинхронизация между миром клиента и миром сервера была бы пренебрежимо мала. Однако, суровая реальность говорит обратное. В результате, клиентская часть, по сути, находится в прошлом от серверной (на время половины пинга). Поэтому, возникает необходимость подгонять траекторию движения клиентских тел так, чтобы она коррелировала с эталонной, серверной траекторией, опорные точки которой мы получаем.&lt;br /&gt;
&lt;br /&gt;
Коррекция осуществляется путем приложения сторонней силы к движущемуся телу так, чтобы &amp;quot;подтолкнуть&amp;quot; его в сторону желаемой траектории. Коррекция осуществляется в отношении собственно координаты тела и в отношении вектора его скорости. Опять же, в идеальном случае, скорректированная траектория полностью накладывается на серверную, вплоть до равенства параметров в соответствующих точках. Необходимо найти такую корректирующую силу, которая бы наиболее быстро и незаметно сблизила бы реальную траекторию движения с идеальной. Задача сводится к нахождению уравнения движения, а также определению граничных параметров, которые позволят выполнить коррекцию гладко, без перерегулирования. &lt;br /&gt;
&lt;br /&gt;
=== Поиск уравнения коррекции ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим некоторый объект. В клиентской копии мира, он находится в некоторой точке и движется по некоторой траектории. Одновременно с этим, с сервера поступают данные о том, по какой траектории он движется на сервере. По этим данным клиент строит сплайн, описанный в предыдущем разделе, и получает траекторию, по которой данный объект должен двигаться на самом деле. Таким образом, в каждый момент времени нам известны вектор положения и вектор скорости объекта, а также вектор положения и вектор скорости, с которыми он должен двигаться в этот момент по данным сервера.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы стабилизировать траекторию объекта, мы должны приложить к нему две силы - для коррекции положения и для коррекции скорости. Сумма двух этих сил скорректирует траекторию объекта некоторым образом. Если она будет слишком маленькой - мы не добъемся необходимого эффекта; если слишком большой - объект &amp;quot;перелетит&amp;quot; нужную нам траекторию, и начнет колебаться вокруг нее под действием этой силы - такое поведение, конечно, недопустимо. Для того, чтобы подобрать оптимальную силу, мы запишем уравнение движения объекта под ее действием и, проанализировав параметры, подберем оптимальные значения для регулирующих коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Сила коррекции координаты должна быть направлена по разности векторов положений объектов, и пропорциональна этой разности. Также она должна быть пропорциональна массе объекта - чтобы и тяжелые, и легкие объекты вели себя одинаково. Кроме того, подумав, мы решили что эта сила должна быть пропорциональна модулю скорости объекта - для того, чтобы при малых скоростях ее действие не было бы слишком заметным для глаз пользователя (впрочем, с этим множителем не все так просто - см. ниже). Осталось домножить все это на некоторый коэффициент пропорциональности - именно его мы и будем анализировать.&lt;br /&gt;
&lt;br /&gt;
Сила коррекции скорости, аналогично: направлена по разности векторов скорости, пропорциональна этой разности; пропорциональна массе тела и некоторому второму коэффициенту.&lt;br /&gt;
&lt;br /&gt;
Осталось убедиться, что сумма этих сил действительно стабилизирует траекторию движения объекта, не приведет к колебаниям, и найти оптимальные значения для коэффициентов двух сил.&lt;br /&gt;
&lt;br /&gt;
Чтобы упростить себе жизнь, рассмотрим двумерный случай. Пусть серверная траектория тела совпадает с осью X; клиентская траектория — параллельна этой оси и находится от нее на расстоянии, равном H. В нулевой момент времени тело находится в нуле по оси X как на клиентской, так и на серверной траекториях.&lt;br /&gt;
&lt;br /&gt;
Пусть и серверная, и клиентская точки имеют горизонтальную скорость &amp;lt;math&amp;gt;V_x&amp;lt;/math&amp;gt;, а по вертикальной оси они неподвижны. Никаких прочих сил на объект не действует. Поскольку никаких сил по горизонтали не действует, мы будем рассматривать только движение по оси y.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сила коррекции высоты, по такой модели, будет направлена &amp;quot;вниз&amp;quot; на эту точку, и будет равна: &lt;br /&gt;
:&amp;lt;math&amp;gt;F_p = - K_p \cdot y(t) \cdot V_x \cdot m&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; — это высота точки и &lt;br /&gt;
:&amp;lt;math&amp;gt;y(0) = H\!&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Множитель &amp;lt;math&amp;gt;V_x&amp;lt;/math&amp;gt; мы добавляем специально, чтобы уменьшить влияние силы коррекции на малых скоростях (иначе еле движущееся тело будет менять свое положение заметными глазу рывками).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сила коррекции вертикальной скорости точки:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_v = - K_v \cdot V_y(t) \cdot m&amp;lt;/math&amp;gt;&lt;br /&gt;
и &lt;br /&gt;
:&amp;lt;math&amp;gt;V_y(0) = 0\!&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Известно, что скорость — это производная координаты по времени:&lt;br /&gt;
:&amp;lt;math&amp;gt;V_y(t) = \frac{\partial y(t)}{\partial t}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Соответственно, сила, которая действует на объект:&lt;br /&gt;
:&amp;lt;math&amp;gt;F(t) = m \cdot y''(t) = F_p + F_v = - K_p \cdot y(t) \cdot V_x \cdot m - K_v \cdot V_y(t) \cdot m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;F - F_p - F_v = 0\!&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разделив на массу, и записав уравнение в дифференциальной форме, получим:&lt;br /&gt;
:&amp;lt;math&amp;gt;y''(t) + K_v \cdot y'(t) + K_p \cdot y(t) \cdot Vx = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Перепишем параметрически:&lt;br /&gt;
:&amp;lt;math&amp;gt;y''(t) + A \cdot y'(t) + B \cdot y(t) = 0\!&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Характеристическое уравнение:&lt;br /&gt;
:&amp;lt;math&amp;gt;\lambda^2 + A \cdot \lambda + B = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Дискриминант характеристического уравнения:&lt;br /&gt;
:&amp;lt;math&amp;gt;D = A^2 - 4 \cdot B = K_v^2 - 4 \cdot K_p \cdot V_x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для исключения колебательного процесса, необходимо условие &amp;lt;math&amp;gt;D \geqslant 0&amp;lt;/math&amp;gt;. Следовательно:&lt;br /&gt;
:&amp;lt;math&amp;gt;K_v^2 - 4 \cdot K_p \cdot V_x \geqslant 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;K_v^2 \geqslant 4 \cdot K_p \cdot V_x, \quad V_x \leqslant \frac{K_v^2}{4 \cdot K_p}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Видно, что если &amp;lt;math&amp;gt;V_x&amp;lt;/math&amp;gt; будет больше чем эта дробь, то возникнут колебания (нарушается условие &amp;lt;math&amp;gt;D \geqslant 0&amp;lt;/math&amp;gt;). Поэтому, при малых скоростях используется само значение &amp;lt;math&amp;gt;V_x&amp;lt;/math&amp;gt;, а когда &amp;lt;math&amp;gt;V_x&amp;lt;/math&amp;gt; численно становится больше этой дроби, следует заменять ее на эту дробь (ограничение сверху).&lt;br /&gt;
&lt;br /&gt;
В конечном счете, коэффициенты &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; выражаются как&lt;br /&gt;
:&amp;lt;math&amp;gt;\alpha_{1,2} = \frac{-K_v \pm \sqrt{D}}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Далее, найдем &amp;lt;math&amp;gt;C_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_2&amp;lt;/math&amp;gt;: &lt;br /&gt;
:&amp;lt;math&amp;gt;y(t) = C_1 \cdot e^{\alpha_1 t} + C_2 \cdot e^{\alpha_2 t}&amp;lt;/math&amp;gt;&lt;br /&gt;
Зная начальные условия  &amp;lt;math&amp;gt;y(0) = H&amp;lt;/math&amp;gt; (начальное расстояние между объектами) и &amp;lt;math&amp;gt;y'(t) = 0&amp;lt;/math&amp;gt; получаем уравнение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;C_1 \cdot e^{\alpha_1 \cdot 0} + C_2 \cdot e^{\alpha_2 \cdot 0} = y(0) = H&amp;lt;/math&amp;gt; &lt;br /&gt;
следовательно &lt;br /&gt;
:&amp;lt;math&amp;gt;C_1 + C_2 = H\!&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Из второго условия:&lt;br /&gt;
:&amp;lt;math&amp;gt;\alpha_1 \cdot C_1 \cdot e^{\alpha_1 \cdot 0} + \alpha_2 \cdot C_2 \cdot e^{\alpha_2 \cdot 0} = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\alpha_1 \cdot C_1 + \alpha_2 \cdot C_2 = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Получаем систему следующих уравнений:&lt;br /&gt;
:&amp;lt;math&amp;gt;\begin{cases}&lt;br /&gt;
C_1 + C_2 = H \\&lt;br /&gt;
\alpha_1 \cdot C_1 + \alpha_2 \cdot C_2 = 0&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Решая систему относительно &amp;lt;math&amp;gt;C_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_2&amp;lt;/math&amp;gt;, получаем&lt;br /&gt;
:&amp;lt;math&amp;gt;C_{1,2} = \left ( \frac{1}{2} \pm \frac{K_v}{\sqrt{D}} \right ) \cdot H&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все коэффициенты найдены, задачу можно считать решенной. Однако, есть еще один немаловаждый момент.&lt;br /&gt;
&lt;br /&gt;
=== Оценка параметров ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выше уже было упомянуто, что колебательный процесс для нас недопустим. Скажем, в случае летящей стрелы, это могло выглядеть как ее периодические колебания вдоль траектории движения, что плохо скажется на реалистичности.&lt;br /&gt;
&lt;br /&gt;
Математически, коэффициенты были рассчитаны так, чтобы этого избежать. Проблема заключается в том, что в случае клиента, мы имеем дело не с непрерывными математическими функциями, а с дискретной апроксимацией. Плюс к этому, изменение модуля прилагаемой силы осуществляется не непрерывно, а, естественно, тоже дискретно. Поскольку в моменты времени &amp;quot;между&amp;quot; коррекциями тело предоставлено само себе, оно и будет двигаться в указанную ему сторону. В худшем случае, при больших и плохо подобранных параметрах, уже после первого корректирующего воздействия, тело вылетит &amp;quot;за траекторию&amp;quot;, соответственно возникнут колебания (возможно даже возрастающие).&lt;br /&gt;
&lt;br /&gt;
Для избежания этого неприятного момента, попробуем оценить параметры и найти их &amp;quot;практический потолок&amp;quot;, с тем, чтобы не позволять пользователю задавать значения выходящие за границы.&lt;br /&gt;
&lt;br /&gt;
Итак, при моделировании, будем считать что в течение шага тело движется по прямой. Соответственно, сила, которая будет действовать на тело в течение первого шага, т.е. времени &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, будет равна &lt;br /&gt;
:&amp;lt;math&amp;gt;F_p = - K_p \cdot V_x \cdot H \cdot m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Соответственно, в течение первого шага тело будет двигаться с ускорением &lt;br /&gt;
:&amp;lt;math&amp;gt;a = - K_p \cdot Vx \cdot H&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Условие стабилизации — расстояние, которое преодолеет тело за первый шаг должно быть меньше &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;K_p \cdot V_x \cdot H \cdot \frac{T^2}{2} &amp;lt; H, \quad K_p \cdot V_x \cdot \frac{T^2}{2} &amp;lt; 2, \quad K_p &amp;lt; \frac{2}{V_x \cdot {T^2}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Левая часть будет минимальной в случае, когда &amp;lt;math&amp;gt;V_x&amp;lt;/math&amp;gt; максимальна, т.е. равна &amp;lt;math&amp;gt;\tfrac{K_v^2}{4 \cdot K_p}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Это означает, что в том случае когда модуль скорости тела меньше чем указанное значение, то коррекция происходить гладко; когда больше — в формуле для силы стабилизации положения &amp;lt;math&amp;gt;V_x&amp;lt;/math&amp;gt; заменяется на &amp;lt;math&amp;gt;\tfrac{K_v^2}{4 \cdot K_p}&amp;lt;/math&amp;gt;. Объяснение было дано выше, при оценке дискриминанта характеристического уравнения.&lt;br /&gt;
&lt;br /&gt;
Из этого следует, что чтобы действительно сделать невидимым действие нашей силы на малых скоростях, необходимо, чтобы значение &amp;lt;math&amp;gt;\tfrac{K_v^2}{4 \cdot K_p}&amp;lt;/math&amp;gt; было бы достаточно большим. Мы взяли его по-умолчанию равным 10, но это значение можно бдет менять в свойствах каждого конкретного объекта.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Осталось только численно оценить коэффициенты &amp;lt;math&amp;gt;K_p&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;K_v&amp;lt;/math&amp;gt;. Для &amp;lt;math&amp;gt;K_p&amp;lt;/math&amp;gt; конкретное значение получается, если подставить в условие &lt;br /&gt;
:&amp;lt;math&amp;gt;K_p &amp;lt; \frac{2}{V_x \cdot T^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
значения &amp;lt;math&amp;gt;V_x = 10&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T = 0.04&amp;lt;/math&amp;gt;. Получается, что &amp;lt;math&amp;gt;K_p &amp;lt; 125&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для нахождения &amp;lt;math&amp;gt;K_v&amp;lt;/math&amp;gt; вместо &amp;lt;math&amp;gt;V_x&amp;lt;/math&amp;gt; необходимо подставить наибольшее возможное для нее значение &amp;lt;math&amp;gt;\tfrac{K_v^2}{4 \cdot K_p}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;K_p &amp;lt; \frac{2}{\frac{K_v^2}{4 \cdot K_p} \cdot T^2}, \quad K_p &amp;lt; \frac{2 \cdot 4 \cdot K_p}{K_v^2 \cdot T^2}, \quad 1 &amp;lt; \frac{8}{K_v^2 \cdot T^2}, \quad K_v^2 &amp;lt; \frac{8}{T^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Окончательно,&lt;br /&gt;
:&amp;lt;math&amp;gt;K_v &amp;lt; \frac{2\sqrt{2}}{T}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При подстановке значения &amp;lt;math&amp;gt;T = 0.04&amp;lt;/math&amp;gt;, получается, что &amp;lt;math&amp;gt;K_v &amp;lt; 70&amp;lt;/math&amp;gt;. В реальных условиях эти пределы взяты еще меньше, для защиты от граничных случаев. Конкретно, &amp;lt;math&amp;gt;K_p&amp;lt;/math&amp;gt; по-умолчанию не может превышать 50, а &amp;lt;math&amp;gt;K_v&amp;lt;/math&amp;gt; — 30&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[20:40:39] &amp;lt;droot@deeptown.org&amp;gt; так&lt;br /&gt;
[20:40:44] &amp;lt;droot@deeptown.org&amp;gt; а теперь - самое веселое&lt;br /&gt;
[20:40:51] &amp;lt;droot@deeptown.org&amp;gt; все то же самое, но только для вращения =)&lt;br /&gt;
[20:46:32] &amp;lt;korvin&amp;gt; мде..&lt;br /&gt;
[20:46:56] &amp;lt;droot@deeptown.org&amp;gt; там почти то же самое&lt;br /&gt;
[20:47:00] &amp;lt;korvin&amp;gt; ну вообще там не должно быть сильно сложно&lt;br /&gt;
[20:47:02] &amp;lt;korvin&amp;gt; то же самое по сути&lt;br /&gt;
[20:47:09] &amp;lt;droot@deeptown.org&amp;gt; т.е. плоская задача там будет точно такой же&lt;br /&gt;
[20:47:24] &amp;lt;droot@deeptown.org&amp;gt; только не y(t), а fi(t) - угол от времени&lt;br /&gt;
[20:48:03] &amp;lt;droot@deeptown.org&amp;gt; я вот не могу сообразить, что будет являться трехмерным представлением этого угла&lt;br /&gt;
[20:48:37] &amp;lt;korvin&amp;gt; в смысле?&lt;br /&gt;
[20:49:14] &amp;lt;droot@deeptown.org&amp;gt; ну вот в случае движения, от нашей задачи можно легко перейти к трехмерной, просто взяв не y(t), а r(t) - вектор координаты&lt;br /&gt;
[20:49:18] &amp;lt;droot@deeptown.org&amp;gt; мм..&lt;br /&gt;
[20:49:23] &amp;lt;droot@deeptown.org&amp;gt; ну точнее не совсем так&lt;br /&gt;
[20:49:27] &amp;lt;droot@deeptown.org&amp;gt; там же надо разность брать&lt;br /&gt;
[20:49:32] &amp;lt;droot@deeptown.org&amp;gt; а, ну да&lt;br /&gt;
[20:49:44] &amp;lt;droot@deeptown.org&amp;gt; т.е. вместо y(t) мы пишем разность векторов между сервером и клиентом&lt;br /&gt;
[20:49:45] &amp;lt;korvin&amp;gt; ну там вроде же просто 3 угла, которые можно точно так же линейно интерполировать&lt;br /&gt;
[20:50:45] &amp;lt;droot@deeptown.org&amp;gt; Vx - это модуль серверной скорости&lt;br /&gt;
[20:50:58] &amp;lt;droot@deeptown.org&amp;gt; ну а все остальное понятно&lt;br /&gt;
[20:51:29] &amp;lt;droot@deeptown.org&amp;gt; что же касается углов&lt;br /&gt;
[20:51:41] &amp;lt;droot@deeptown.org&amp;gt; ну если посмотреть на задачу с практической точки зрения&lt;br /&gt;
[20:51:50] &amp;lt;droot@deeptown.org&amp;gt; т.е. у нас есть два кватерниона&lt;br /&gt;
[20:53:24] &amp;lt;droot@deeptown.org&amp;gt; надо сообразить, что будет являться кватернионом вращения из одного положения во второе&lt;br /&gt;
[20:53:50] &amp;lt;korvin&amp;gt; в смысле что будет?&lt;br /&gt;
[20:54:12] &amp;lt;korvin&amp;gt; м... может проще представить кватернион в виде косинусов и дальше по частям?&lt;br /&gt;
[20:54:21] &amp;lt;korvin&amp;gt; покомпонентно в смысле&lt;br /&gt;
[20:54:23] &amp;lt;droot@deeptown.org&amp;gt; это долго считать&lt;br /&gt;
[20:59:55] &amp;lt;droot@deeptown.org&amp;gt; мм ну вообще все понятно&lt;br /&gt;
[21:00:19] &amp;lt;droot@deeptown.org&amp;gt; если сумма вращений задается кватернионом Q = q2 * q1&lt;br /&gt;
[21:00:47] &amp;lt;droot@deeptown.org&amp;gt; то разность вращений будет q2 = Q * q1^(-1) = Q * q1'&lt;br /&gt;
[21:01:36] &amp;lt;droot@deeptown.org&amp;gt; т.е. мы легко можем посчитать кватернион, который является разностью между клиентским и серверным вращениями&lt;br /&gt;
[21:03:54] &amp;lt;droot@deeptown.org&amp;gt; для того, чтобы повернуть тело этим кватернионом, нам нужно приложить к нему момент вращения, направление которого также можно посчитать&lt;br /&gt;
[21:05:56] &amp;lt;droot@deeptown.org&amp;gt; а зависеть он будет от тех же модуля серверной угловой скорости, собсно кватерниона разности, момента вращения, ну и соответственно некоторого коэффициента&lt;br /&gt;
[21:08:54] &amp;lt;droot@deeptown.org&amp;gt; ну а для стабилизации разности угловых скоростей все элементарно: момент вращения будет просто пропорционален разности векторов угловых скоростей (ну и направлен вдоль вектора этой разности)&lt;br /&gt;
[21:11:22] &amp;lt;korvin&amp;gt; так, ну это понятно&lt;br /&gt;
[21:11:32] &amp;lt;korvin&amp;gt; а с перерегулированием что делать?&lt;br /&gt;
[21:11:37] &amp;lt;korvin&amp;gt; ну то есть если перестараемся&lt;br /&gt;
[21:11:41] &amp;lt;droot@deeptown.org&amp;gt; (я вот щас мысленно пытаюсь себе это представить и думаю нсчет вектора разности...)&lt;br /&gt;
[21:12:44] &amp;lt;droot@deeptown.org&amp;gt; там собсно соотношение этих коэффициентов точно такое же должно получиться&lt;br /&gt;
[21:13:34] &amp;lt;droot@deeptown.org&amp;gt; т.е. W &amp;lt; Kw^2 / (4*Kr)&lt;br /&gt;
[21:42:36] &amp;lt;droot@deeptown.org&amp;gt; хочешь почитать веселую книжку? =)&lt;br /&gt;
[21:43:09] &amp;lt;droot@deeptown.org&amp;gt; я тут с аленкой попробовал проконсультироваться, и она мне оч посоветовала =) ландау-лифшиц &amp;quot;механика&amp;quot; называется =)&lt;br /&gt;
[21:55:38] &amp;lt;droot@deeptown.org&amp;gt; вообще, вот что до ограничений сверху для этих всех коэффициентов - я думаю, что надо просто взять некую константу - скажем, 30 - и ей ограничиться&lt;br /&gt;
[21:55:53] &amp;lt;droot@deeptown.org&amp;gt; т.е. Kv &amp;lt; 30&lt;br /&gt;
[21:56:10] &amp;lt;droot@deeptown.org&amp;gt; ну, для Kp можно ограничение чуть больше - скажем, Kp &amp;lt; 50&lt;br /&gt;
[21:58:57] &amp;lt;droot@deeptown.org&amp;gt; мм. а вообще, я бы даже не так сделал&lt;br /&gt;
[21:59:22] &amp;lt;droot@deeptown.org&amp;gt; мне кажется что параметризовать надо не через Kp и Kv, а через Vx и Kp, а уже Kv выражать через них&lt;br /&gt;
[21:59:36] &amp;lt;korvin&amp;gt; мм&lt;br /&gt;
[21:59:39] &amp;lt;korvin&amp;gt; а смысл?&lt;br /&gt;
[21:59:41] &amp;lt;droot@deeptown.org&amp;gt; (ну т.е. Vx - это максимальная скорость)&lt;br /&gt;
[21:59:50] &amp;lt;droot@deeptown.org&amp;gt; а это более понятные пользователю числа&lt;br /&gt;
[22:01:30] &amp;lt;droot@deeptown.org&amp;gt; хотя... ладно, фиг с ним, пусть будет напрямую&lt;br /&gt;
[22:01:40] &amp;lt;droot@deeptown.org&amp;gt; надо еще подумать, какие значения по-умолчанию лучше всего взять&lt;br /&gt;
[22:01:59] &amp;lt;droot@deeptown.org&amp;gt; ну Vx видимо надо брать где-то 10 как раз - это 36 км/ч&lt;br /&gt;
[22:02:22] &amp;lt;korvin&amp;gt; 10 м/с не жирно ли?&lt;br /&gt;
[22:02:24] &amp;lt;droot@deeptown.org&amp;gt; при большей уже вряд ли будут заметны эти силы&lt;br /&gt;
[22:02:55] &amp;lt;droot@deeptown.org&amp;gt; ну 36 км/ч - это где-то как раз граница воспринимаемых скоростей имхо&lt;br /&gt;
[22:04:02] &amp;lt;droot@deeptown.org&amp;gt; Kv предлагаю взять равным где-то 20&lt;br /&gt;
[22:04:46] &amp;lt;droot@deeptown.org&amp;gt; при этом будет хороший запас до сваливания из-за шага рассчета, но и время стабилизации будет достаточно малым&lt;br /&gt;
[22:04:55] &amp;lt;droot@deeptown.org&amp;gt; ну а Kp щас посчитаем&lt;br /&gt;
[22:05:11] &amp;lt;droot@deeptown.org&amp;gt; Vx = Kv^2 / (4*Kp)&lt;br /&gt;
[22:05:26] &amp;lt;droot@deeptown.org&amp;gt; Kp = Vx * 4 / Kv^2&lt;br /&gt;
[22:05:37] &amp;lt;droot@deeptown.org&amp;gt; тьфу&lt;br /&gt;
[22:05:57] &amp;lt;droot@deeptown.org&amp;gt; Kp = Kv&amp;amp;2 / (Vx*4)&lt;br /&gt;
[22:06:31] &amp;lt;droot@deeptown.org&amp;gt; Kp = 20^2 / 40 = 10&lt;br /&gt;
[22:06:40] &amp;lt;droot@deeptown.org&amp;gt; ну, вполне себе круглые числа =)&lt;br /&gt;
[22:06:48] &amp;lt;droot@deeptown.org&amp;gt; Vx = 10, Kp = 10, Kv = 20&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8</id>
		<title>Алгоритм синхронизации</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8"/>
				<updated>2008-10-23T19:25:31Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Механизм коррекции ошибки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Здесь будет рассмотрена математическая составляющая алгоритмов синхронизации физики. Понимающих в этом деле, просьба прокомментировать.&lt;br /&gt;
&lt;br /&gt;
== Построение сплайна ==&lt;br /&gt;
&lt;br /&gt;
Для синхронизации была выбрана форма кубических сплайнов, при которой за основу берутся значения функции и ее производной в двух точках. &lt;br /&gt;
&lt;br /&gt;
Свойства сплайна:&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t_i) = f(t_i), \quad s'(t_i) = f'(t_i)\!&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Уравнения сплайна:&lt;br /&gt;
:&amp;lt;math&amp;gt;s(t) = a + bt + ct^2 + dt^3\!&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;s'(t) = b + 2ct + 3dt^2\!&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для нахождения коэффициентов &amp;lt;math&amp;gt;a, b, c, d&amp;lt;/math&amp;gt; записываем систему уравнений:&lt;br /&gt;
:&amp;lt;math&amp;gt;\begin{cases}&lt;br /&gt;
a + bt_0 + ct_0^2 + dt_0^3 = f(t_0) \\&lt;br /&gt;
a + bt_1 + ct_1^2 + dt_1^3 = f(t_1) \\&lt;br /&gt;
b + 2ct_0 + 3dt_0^2 = f'(t_0) \\&lt;br /&gt;
b + 2ct_1 + 3dt_1^2 = f'(t_1)&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подставляем известные значения в правой части системы (даны по условию):&lt;br /&gt;
:&amp;lt;math&amp;gt;\begin{cases}&lt;br /&gt;
a + bt_0 + ct_0^2 + dt_0^3 = x_0 \\&lt;br /&gt;
a + bt_1 + ct_1^2 + dt_1^3 = x_1 \\&lt;br /&gt;
b + 2ct_0 + 3dt_0^2 = v_0 \\&lt;br /&gt;
b + 2ct_1 + 3dt_1^2 = v_1&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Поскольку сплайн не зависит от конкретных значений &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;t_1&amp;lt;/math&amp;gt;, положим &amp;lt;math&amp;gt;t_0 = 0&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;t_1 = t&amp;lt;/math&amp;gt;. В результате, пара уравнений становится тривиальной:&lt;br /&gt;
:&amp;lt;math&amp;gt;\begin{cases}&lt;br /&gt;
a = x_0 \\&lt;br /&gt;
a + bt_1 + ct_1^2 + dt_1^3 = x_1 \\&lt;br /&gt;
b = v_0 \\&lt;br /&gt;
b + 2ct_1 + 3dt_1^2 = v_1&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Заменяем в оставшихся уравнениях известные теперь коэффициенты и получаем конечную систему:&lt;br /&gt;
:&amp;lt;math&amp;gt;\begin{cases}&lt;br /&gt;
x_0 + v_0t_1 + ct_1^2 + dt_1^3 = x_1 \\&lt;br /&gt;
v_0 + 2ct_1 + 3dt_1^2 = v_1&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После нехитрых манипуляций, получаем выражения для оставшихся коэффициентов:&lt;br /&gt;
:&amp;lt;math&amp;gt;\begin{cases}&lt;br /&gt;
c = \frac{3x_1 - 3x_0 - 2v_0t - v_1t}{t^2} \\&lt;br /&gt;
d = \frac{v_1t - 2x_1 + 2x_0 + v_ot}{t^3}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ниже представлены графики оригинальной функции с наложенным на них графиком сплайна, построенного по точкам. Парабола и экспонента построены по фиксированному набору точек (-2.5, -2, -0.5, 0.5, 2, 2.5). Синусоида построена по точкам с интервалом 0.05.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Изображение:Exp.gif|Экспонента&lt;br /&gt;
Изображение:Parabola2.gif|Парабола&lt;br /&gt;
Изображение:Sin.gif|Синус&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Механизм коррекции ошибки ==&lt;br /&gt;
&lt;br /&gt;
На клиенте Диптауна работает физический движок - точно такой же, как и на сервере. Он хранит в памяти собственную копию мира (в пределах некоего радиуса видимости), и, по приходящим от сервера данным, старается делать его наиболее похожим на мир, который находится на сервере.&lt;br /&gt;
&lt;br /&gt;
В идеальном случае, при нулевой задержке времени между клиентом и сервером, а также при достаточно большой частоте обновлений, рассинхронизация между миром клиента и миром сервера была бы пренебрежимо мала. Однако, суровая реальность говорит обратное. В результате, клиентская часть, по сути, находится в прошлом от серверной (на время половины пинга). Поэтому, возникает необходимость подгонять траекторию движения клиентских тел так, чтобы она коррелировала с эталонной, серверной траекторией, опорные точки которой мы получаем.&lt;br /&gt;
&lt;br /&gt;
Коррекция осуществляется путем приложения сторонней силы к движущемуся телу так, чтобы &amp;quot;подтолкнуть&amp;quot; его в сторону желаемой траектории. Коррекция осуществляется в отношении собственно координаты тела и в отношении вектора его скорости. Опять же, в идеальном случае, скорректированная траектория полностью накладывается на серверную, вплоть до равенства параметров в соответствующих точках. Необходимо найти такую корректирующую силу, которая бы наиболее быстро и незаметно сблизила бы реальную траекторию движения с идеальной. Задача сводится к нахождению уравнения движения, а также определению граничных параметров, которые позволят выполнить коррекцию гладко, без перерегулирования. &lt;br /&gt;
&lt;br /&gt;
=== Поиск уравнения коррекции ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим некоторый объект. В клиентской копии мира, он находится в некоторой точке и движется по некоторой траектории. Одновременно с этим, с сервера поступают данные о том, по какой траектории он движется на сервере. По этим данным клиент строит сплайн, описанный в предыдущем разделе, и получает траекторию, по которой данный объект должен двигаться на самом деле. Таким образом, в каждый момент времени нам известны вектор положения и вектор скорости объекта, а также вектор положения и вектор скорости, с которыми он должен двигаться в этот момент по данным сервера.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы стабилизировать траекторию объекта, мы должны приложить к нему две силы - для коррекции положения и для коррекции скорости. Сумма двух этих сил скорректирует траекторию объекта некоторым образом. Если она будет слишком маленькой - мы не добъемся необходимого эффекта; если слишком большой - объект &amp;quot;перелетит&amp;quot; нужную нам траекторию, и начнет колебаться вокруг нее под действием этой силы - такое поведение, конечно, недопустимо. Для того, чтобы подобрать оптимальную силу, мы запишем уравнение движения объекта под ее действием и, проанализировав параметры, подберем оптимальные значения для регулирующих коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Сила коррекции координаты должна быть направлена по разности векторов положений объектов, и пропорциональна этой разности. Также она должна быть пропорциональна массе объекта - чтобы и тяжелые, и легкие объекты вели себя одинаково. Кроме того, подумав, мы решили что эта сила должна быть пропорциональна модулю скорости объекта - для того, чтобы при малых скоростях ее действие не было бы слишком заметным для глаз пользователя (впрочем, с этим множителем не все так просто - см. ниже). Осталось домножить все это на некоторый коэффициент пропорциональности - именно его мы и будем анализировать.&lt;br /&gt;
&lt;br /&gt;
Сила коррекции скорости, аналогично: направлена по разности векторов скорости, пропорциональна этой разности; пропорциональна массе тела и некоторому второму коэффициенту.&lt;br /&gt;
&lt;br /&gt;
Осталось убедиться, что сумма этих сил действительно стабилизирует траекторию движения объекта, не приведет к колебаниям, и найти оптимальные значения для коэффициентов двух сил.&lt;br /&gt;
&lt;br /&gt;
Чтобы упростить себе жизнь, рассмотрим двумерный случай. Пусть серверная траектория тела совпадает с осью X; клиентская траектория — параллельна этой оси и находится от нее на расстоянии, равном H. В нулевой момент времени тело находится в нуле по оси X как на клиентской, так и на серверной траекториях.&lt;br /&gt;
&lt;br /&gt;
Пусть и серверная, и клиентская точки имеют горизонтальную скорость &amp;lt;math&amp;gt;V_x&amp;lt;/math&amp;gt;, а по вертикальной оси они неподвижны. Никаких прочих сил на объект не действует. Поскольку никаких сил по горизонтали не действует, мы будем рассматривать только движение по оси y.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сила коррекции высоты, по такой модели, будет направлена &amp;quot;вниз&amp;quot; на эту точку, и будет равна: &lt;br /&gt;
:&amp;lt;math&amp;gt;F_p = - K_p \cdot y(t) \cdot V_x \cdot m&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; — это высота точки и &lt;br /&gt;
:&amp;lt;math&amp;gt;y(0) = H\!&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Множитель &amp;lt;math&amp;gt;V_x&amp;lt;/math&amp;gt; мы добавляем специально, чтобы уменьшить влияние силы коррекции на малых скоростях (иначе еле движущееся тело будет менять свое положение заметными глазу рывками).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сила коррекции вертикальной скорости точки:&lt;br /&gt;
:&amp;lt;math&amp;gt;F_v = - K_v \cdot V_y(t) \cdot m&amp;lt;/math&amp;gt;&lt;br /&gt;
и &lt;br /&gt;
:&amp;lt;math&amp;gt;V_y(0) = 0\!&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Известно, что скорость — это производная координаты по времени:&lt;br /&gt;
:&amp;lt;math&amp;gt;V_y(t) = \frac{\partial y(t)}{\partial t}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Соответственно, сила, которая действует на объект:&lt;br /&gt;
:&amp;lt;math&amp;gt;F(t) = m \cdot y''(t) = F_p + F_v = - K_p \cdot y(t) \cdot V_x \cdot m - K_v \cdot V_y(t) \cdot m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;F - F_p - F_v = 0\!&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разделив на массу, и записав уравнение в дифференциальной форме, получим:&lt;br /&gt;
:&amp;lt;math&amp;gt;y''(t) + K_v \cdot y'(t) + K_p \cdot y(t) \cdot Vx = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Перепишем параметрически:&lt;br /&gt;
:&amp;lt;math&amp;gt;y''(t) + A \cdot y'(t) + B \cdot y(t) = 0\!&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Характеристическое уравнение:&lt;br /&gt;
:&amp;lt;math&amp;gt;\lambda^2 + A \cdot \lambda + B = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Дискриминант характеристического уравнения:&lt;br /&gt;
:&amp;lt;math&amp;gt;D = A^2 - 4 \cdot B = K_v^2 - 4 \cdot K_p \cdot V_x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для исключения колебательного процесса, необходимо условие &amp;lt;math&amp;gt;D \geqslant 0&amp;lt;/math&amp;gt;. Следовательно:&lt;br /&gt;
:&amp;lt;math&amp;gt;K_v^2 - 4 \cdot K_p \cdot V_x \geqslant 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;K_v^2 \geqslant 4 \cdot K_p \cdot V_x, \quad V_x \leqslant \frac{K_v^2}{4 \cdot K_p}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Видно, что если &amp;lt;math&amp;gt;V_x&amp;lt;/math&amp;gt; будет больше чем эта дробь, то возникнут колебания (нарушается условие &amp;lt;math&amp;gt;D \geqslant 0&amp;lt;/math&amp;gt;). Поэтому, при малых скоростях используется само значение &amp;lt;math&amp;gt;V_x&amp;lt;/math&amp;gt;, а когда &amp;lt;math&amp;gt;V_x&amp;lt;/math&amp;gt; численно становится больше этой дроби, следует заменять ее на эту дробь (ограничение сверху).&lt;br /&gt;
&lt;br /&gt;
В конечном счете, коэффициенты &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; выражаются как&lt;br /&gt;
:&amp;lt;math&amp;gt;\alpha_{1,2} = \frac{-K_v \pm \sqrt{D}}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Далее, найдем &amp;lt;math&amp;gt;C_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_2&amp;lt;/math&amp;gt;: &lt;br /&gt;
:&amp;lt;math&amp;gt;y(t) = C_1 \cdot e^{\alpha_1 t} + C_2 \cdot e^{\alpha_2 t}&amp;lt;/math&amp;gt;&lt;br /&gt;
Зная начальные условия  &amp;lt;math&amp;gt;y(0) = H&amp;lt;/math&amp;gt; (начальное расстояние между объектами) и &amp;lt;math&amp;gt;y'(t) = 0&amp;lt;/math&amp;gt; получаем уравнение:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;C_1 \cdot e^{\alpha_1 \cdot 0} + C_2 \cdot e^{\alpha_2 \cdot 0} = y(0) = H&amp;lt;/math&amp;gt; &lt;br /&gt;
следовательно &lt;br /&gt;
:&amp;lt;math&amp;gt;C_1 + C_2 = H\!&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Из второго условия:&lt;br /&gt;
:&amp;lt;math&amp;gt;\alpha_1 \cdot C_1 \cdot e^{\alpha_1 \cdot 0} + \alpha_2 \cdot C_2 \cdot e^{\alpha_2 \cdot 0} = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\alpha_1 \cdot C_1 + \alpha_2 \cdot C_2 = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Получаем систему следующих уравнений:&lt;br /&gt;
:&amp;lt;math&amp;gt;\begin{cases}&lt;br /&gt;
C_1 + C_2 = H \\&lt;br /&gt;
\alpha_1 \cdot C_1 + \alpha_2 \cdot C_2 = 0&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Решая систему относительно &amp;lt;math&amp;gt;C_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_2&amp;lt;/math&amp;gt;, получаем&lt;br /&gt;
:&amp;lt;math&amp;gt;C_{1,2} = \left ( \frac{1}{2} \pm \frac{K_v}{\sqrt{D}} \right ) \cdot H&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Все коэффициенты найдены, задачу можно считать решенной. Однако, есть еще один немаловаждый момент.&lt;br /&gt;
&lt;br /&gt;
=== Оценка параметров ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Выше уже было упомянуто, что колебательный процесс для нас недопустим. Скажем, в случае летящей стрелы, это могло выглядеть как ее периодические колебания вдоль траектории движения, что плохо скажется на реалистичности.&lt;br /&gt;
&lt;br /&gt;
Математически, коэффициенты были рассчитаны так, чтобы этого избежать. Проблема заключается в том, что в случае клиента, мы имеем дело не с непрерывными математическими функциями, а с дискретной апроксимацией. Плюс к этому, изменение модуля прилагаемой силы осуществляется не непрерывно, а, естественно, тоже дискретно. Поскольку в моменты времени &amp;quot;между&amp;quot; коррекциями тело предоставлено само себе, оно и будет двигаться в указанную ему сторону. В худшем случае, при больших и плохо подобранных параметрах, уже после первого корректирующего воздействия, тело вылетит &amp;quot;за траекторию&amp;quot;, соответственно возникнут колебания (возможно даже возрастающие).&lt;br /&gt;
&lt;br /&gt;
Для избежания этого неприятного момента, попробуем оценить параметры и найти их &amp;quot;практический потолок&amp;quot;, с тем, чтобы не позволять пользователю задавать значения выходящие за границы.&lt;br /&gt;
&lt;br /&gt;
Итак, при моделировании, будем считать что в течение шага тело движется по прямой. Соответственно, сила, которая будет действовать на тело в течение первого шага, т.е. времени &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, будет равна &lt;br /&gt;
:&amp;lt;math&amp;gt;F_p = - K_p \cdot V_x \cdot H \cdot m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Соответственно, в течение первого шага тело будет двигаться с ускорением &lt;br /&gt;
:&amp;lt;math&amp;gt;a = - K_p \cdot Vx \cdot H&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Условие стабилизации — расстояние, которое преодолеет тело за первый шаг должно быть меньше &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;:&lt;br /&gt;
:&amp;lt;math&amp;gt;K_p \cdot V_x \cdot H \cdot \frac{T^2}{2} &amp;lt; H, \quad K_p \cdot V_x \cdot \frac{T^2}{2} &amp;lt; 2, \quad K_p &amp;lt; \frac{2}{V_x \cdot {T^2}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Левая часть будет минимальной в случае, когда &amp;lt;math&amp;gt;V_x&amp;lt;/math&amp;gt; максимальна, т.е. равна &amp;lt;math&amp;gt;\tfrac{K_v^2}{4 \cdot K_p}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Это означает, что в том случае когда модуль скорости тела меньше чем указанное значение, то коррекция происходить гладко; когда больше — в формуле для силы стабилизации положения &amp;lt;math&amp;gt;V_x&amp;lt;/math&amp;gt; заменяется на &amp;lt;math&amp;gt;\tfrac{K_v^2}{4 \cdot K_p}&amp;lt;/math&amp;gt;. Объяснение было дано выше, при оценке дискриминанта характеристического уравнения.&lt;br /&gt;
&lt;br /&gt;
Из этого следует, что чтобы действительно сделать невидимым действие нашей силы на малых скоростях, необходимо, чтобы значение &amp;lt;math&amp;gt;\tfrac{K_v^2}{4 \cdot K_p}&amp;lt;/math&amp;gt; было бы достаточно большим. Мы взяли его по-умолчанию равным 10, но это значение можно бдет менять в свойствах каждого конкретного объекта.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Осталось только численно оценить коэффициенты &amp;lt;math&amp;gt;K_p&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;K_v&amp;lt;/math&amp;gt;. Для &amp;lt;math&amp;gt;K_p&amp;lt;/math&amp;gt; конкретное значение получается, если подставить в условие &lt;br /&gt;
:&amp;lt;math&amp;gt;K_p &amp;lt; \frac{2}{V_x \cdot T^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
значения &amp;lt;math&amp;gt;V_x = 10&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T = 0.04&amp;lt;/math&amp;gt;. Получается, что &amp;lt;math&amp;gt;K_p &amp;lt; 125&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для нахождения &amp;lt;math&amp;gt;K_v&amp;lt;/math&amp;gt; вместо &amp;lt;math&amp;gt;V_x&amp;lt;/math&amp;gt; необходимо подставить наибольшее возможное для нее значение &amp;lt;math&amp;gt;\tfrac{K_v^2}{4 \cdot K_p}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;K_p &amp;lt; \frac{2}{\frac{K_v^2}{4 \cdot K_p} \cdot T^2}, \quad K_p &amp;lt; \frac{2 \cdot 4 \cdot K_p}{K_v^2 \cdot T^2}, \quad 1 &amp;lt; \frac{8}{K_v^2 \cdot T^2}, \quad K_v^2 &amp;lt; \frac{8}{T^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Окончательно,&lt;br /&gt;
:&amp;lt;math&amp;gt;K_v &amp;lt; \frac{2\sqrt{2}}{T}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При подстановке значения &amp;lt;math&amp;gt;T = 0.04&amp;lt;/math&amp;gt;, получается, что &amp;lt;math&amp;gt;K_v &amp;lt; 70&amp;lt;/math&amp;gt;. В реальных условиях эти пределы взяты еще меньше, для защиты от граничных случаев. Конкретно, &amp;lt;math&amp;gt;K_p&amp;lt;/math&amp;gt; по-умолчанию не может превышать 50, а &amp;lt;math&amp;gt;K_v&amp;lt;/math&amp;gt; — 30&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[20:40:39] &amp;lt;droot@deeptown.org&amp;gt; так&lt;br /&gt;
[20:40:44] &amp;lt;droot@deeptown.org&amp;gt; а теперь - самое веселое&lt;br /&gt;
[20:40:51] &amp;lt;droot@deeptown.org&amp;gt; все то же самое, но только для вращения =)&lt;br /&gt;
[20:46:32] &amp;lt;korvin&amp;gt; мде..&lt;br /&gt;
[20:46:56] &amp;lt;droot@deeptown.org&amp;gt; там почти то же самое&lt;br /&gt;
[20:47:00] &amp;lt;korvin&amp;gt; ну вообще там не должно быть сильно сложно&lt;br /&gt;
[20:47:02] &amp;lt;korvin&amp;gt; то же самое по сути&lt;br /&gt;
[20:47:09] &amp;lt;droot@deeptown.org&amp;gt; т.е. плоская задача там будет точно такой же&lt;br /&gt;
[20:47:24] &amp;lt;droot@deeptown.org&amp;gt; только не y(t), а fi(t) - угол от времени&lt;br /&gt;
[20:48:03] &amp;lt;droot@deeptown.org&amp;gt; я вот не могу сообразить, что будет являться трехмерным представлением этого угла&lt;br /&gt;
[20:48:37] &amp;lt;korvin&amp;gt; в смысле?&lt;br /&gt;
[20:49:14] &amp;lt;droot@deeptown.org&amp;gt; ну вот в случае движения, от нашей задачи можно легко перейти к трехмерной, просто взяв не y(t), а r(t) - вектор координаты&lt;br /&gt;
[20:49:18] &amp;lt;droot@deeptown.org&amp;gt; мм..&lt;br /&gt;
[20:49:23] &amp;lt;droot@deeptown.org&amp;gt; ну точнее не совсем так&lt;br /&gt;
[20:49:27] &amp;lt;droot@deeptown.org&amp;gt; там же надо разность брать&lt;br /&gt;
[20:49:32] &amp;lt;droot@deeptown.org&amp;gt; а, ну да&lt;br /&gt;
[20:49:44] &amp;lt;droot@deeptown.org&amp;gt; т.е. вместо y(t) мы пишем разность векторов между сервером и клиентом&lt;br /&gt;
[20:49:45] &amp;lt;korvin&amp;gt; ну там вроде же просто 3 угла, которые можно точно так же линейно интерполировать&lt;br /&gt;
[20:50:45] &amp;lt;droot@deeptown.org&amp;gt; Vx - это модуль серверной скорости&lt;br /&gt;
[20:50:58] &amp;lt;droot@deeptown.org&amp;gt; ну а все остальное понятно&lt;br /&gt;
[20:51:29] &amp;lt;droot@deeptown.org&amp;gt; что же касается углов&lt;br /&gt;
[20:51:41] &amp;lt;droot@deeptown.org&amp;gt; ну если посмотреть на задачу с практической точки зрения&lt;br /&gt;
[20:51:50] &amp;lt;droot@deeptown.org&amp;gt; т.е. у нас есть два кватерниона&lt;br /&gt;
[20:53:24] &amp;lt;droot@deeptown.org&amp;gt; надо сообразить, что будет являться кватернионом вращения из одного положения во второе&lt;br /&gt;
[20:53:50] &amp;lt;korvin&amp;gt; в смысле что будет?&lt;br /&gt;
[20:54:12] &amp;lt;korvin&amp;gt; м... может проще представить кватернион в виде косинусов и дальше по частям?&lt;br /&gt;
[20:54:21] &amp;lt;korvin&amp;gt; покомпонентно в смысле&lt;br /&gt;
[20:54:23] &amp;lt;droot@deeptown.org&amp;gt; это долго считать&lt;br /&gt;
[20:59:55] &amp;lt;droot@deeptown.org&amp;gt; мм ну вообще все понятно&lt;br /&gt;
[21:00:19] &amp;lt;droot@deeptown.org&amp;gt; если сумма вращений задается кватернионом Q = q2 * q1&lt;br /&gt;
[21:00:47] &amp;lt;droot@deeptown.org&amp;gt; то разность вращений будет q2 = Q * q1^(-1) = Q * q1'&lt;br /&gt;
[21:01:36] &amp;lt;droot@deeptown.org&amp;gt; т.е. мы легко можем посчитать кватернион, который является разностью между клиентским и серверным вращениями&lt;br /&gt;
[21:03:54] &amp;lt;droot@deeptown.org&amp;gt; для того, чтобы повернуть тело этим кватернионом, нам нужно приложить к нему момент вращения, направление которого также можно посчитать&lt;br /&gt;
[21:05:56] &amp;lt;droot@deeptown.org&amp;gt; а зависеть он будет от тех же модуля серверной угловой скорости, собсно кватерниона разности, момента вращения, ну и соответственно некоторого коэффициента&lt;br /&gt;
[21:08:54] &amp;lt;droot@deeptown.org&amp;gt; ну а для стабилизации разности угловых скоростей все элементарно: момент вращения будет просто пропорционален разности векторов угловых скоростей (ну и направлен вдоль вектора этой разности)&lt;br /&gt;
[21:11:22] &amp;lt;korvin&amp;gt; так, ну это понятно&lt;br /&gt;
[21:11:32] &amp;lt;korvin&amp;gt; а с перерегулированием что делать?&lt;br /&gt;
[21:11:37] &amp;lt;korvin&amp;gt; ну то есть если перестараемся&lt;br /&gt;
[21:11:41] &amp;lt;droot@deeptown.org&amp;gt; (я вот щас мысленно пытаюсь себе это представить и думаю нсчет вектора разности...)&lt;br /&gt;
[21:12:44] &amp;lt;droot@deeptown.org&amp;gt; там собсно соотношение этих коэффициентов точно такое же должно получиться&lt;br /&gt;
[21:13:34] &amp;lt;droot@deeptown.org&amp;gt; т.е. W &amp;lt; Kw^2 / (4*Kr)&lt;br /&gt;
[21:42:36] &amp;lt;droot@deeptown.org&amp;gt; хочешь почитать веселую книжку? =)&lt;br /&gt;
[21:43:09] &amp;lt;droot@deeptown.org&amp;gt; я тут с аленкой попробовал проконсультироваться, и она мне оч посоветовала =) ландау-лифшиц &amp;quot;механика&amp;quot; называется =)&lt;br /&gt;
[21:55:38] &amp;lt;droot@deeptown.org&amp;gt; вообще, вот что до ограничений сверху для этих всех коэффициентов - я думаю, что надо просто взять некую константу - скажем, 30 - и ей ограничиться&lt;br /&gt;
[21:55:53] &amp;lt;droot@deeptown.org&amp;gt; т.е. Kv &amp;lt; 30&lt;br /&gt;
[21:56:10] &amp;lt;droot@deeptown.org&amp;gt; ну, для Kp можно ограничение чуть больше - скажем, Kp &amp;lt; 50&lt;br /&gt;
[21:58:57] &amp;lt;droot@deeptown.org&amp;gt; мм. а вообще, я бы даже не так сделал&lt;br /&gt;
[21:59:22] &amp;lt;droot@deeptown.org&amp;gt; мне кажется что параметризовать надо не через Kp и Kv, а через Vx и Kp, а уже Kv выражать через них&lt;br /&gt;
[21:59:36] &amp;lt;korvin&amp;gt; мм&lt;br /&gt;
[21:59:39] &amp;lt;korvin&amp;gt; а смысл?&lt;br /&gt;
[21:59:41] &amp;lt;droot@deeptown.org&amp;gt; (ну т.е. Vx - это максимальная скорость)&lt;br /&gt;
[21:59:50] &amp;lt;droot@deeptown.org&amp;gt; а это более понятные пользователю числа&lt;br /&gt;
[22:01:30] &amp;lt;droot@deeptown.org&amp;gt; хотя... ладно, фиг с ним, пусть будет напрямую&lt;br /&gt;
[22:01:40] &amp;lt;droot@deeptown.org&amp;gt; надо еще подумать, какие значения по-умолчанию лучше всего взять&lt;br /&gt;
[22:01:59] &amp;lt;droot@deeptown.org&amp;gt; ну Vx видимо надо брать где-то 10 как раз - это 36 км/ч&lt;br /&gt;
[22:02:22] &amp;lt;korvin&amp;gt; 10 м/с не жирно ли?&lt;br /&gt;
[22:02:24] &amp;lt;droot@deeptown.org&amp;gt; при большей уже вряд ли будут заметны эти силы&lt;br /&gt;
[22:02:55] &amp;lt;droot@deeptown.org&amp;gt; ну 36 км/ч - это где-то как раз граница воспринимаемых скоростей имхо&lt;br /&gt;
[22:04:02] &amp;lt;droot@deeptown.org&amp;gt; Kv предлагаю взять равным где-то 20&lt;br /&gt;
[22:04:46] &amp;lt;droot@deeptown.org&amp;gt; при этом будет хороший запас до сваливания из-за шага рассчета, но и время стабилизации будет достаточно малым&lt;br /&gt;
[22:04:55] &amp;lt;droot@deeptown.org&amp;gt; ну а Kp щас посчитаем&lt;br /&gt;
[22:05:11] &amp;lt;droot@deeptown.org&amp;gt; Vx = Kv^2 / (4*Kp)&lt;br /&gt;
[22:05:26] &amp;lt;droot@deeptown.org&amp;gt; Kp = Vx * 4 / Kv^2&lt;br /&gt;
[22:05:37] &amp;lt;droot@deeptown.org&amp;gt; тьфу&lt;br /&gt;
[22:05:57] &amp;lt;droot@deeptown.org&amp;gt; Kp = Kv&amp;amp;2 / (Vx*4)&lt;br /&gt;
[22:06:31] &amp;lt;droot@deeptown.org&amp;gt; Kp = 20^2 / 40 = 10&lt;br /&gt;
[22:06:40] &amp;lt;droot@deeptown.org&amp;gt; ну, вполне себе круглые числа =)&lt;br /&gt;
[22:06:48] &amp;lt;droot@deeptown.org&amp;gt; Vx = 10, Kp = 10, Kv = 20&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/Deeptown_SDK</id>
		<title>Deeptown SDK</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/Deeptown_SDK"/>
				<updated>2008-08-14T19:02:21Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Список дистрибутивов */ Новый релиз&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание Deeptown SDK ==&lt;br /&gt;
&lt;br /&gt;
'''Deeptown Software Development Kit''' — это набор программ, утилит и библиотек для разработки приложений для платформы Deeptown.&lt;br /&gt;
&lt;br /&gt;
В публичном доступе выпускается бинарная версия SDK — т.е. набор библиотек и программ, скомпилированных для различных операционных систем. Исходные коды по прежнему остаются закрытыми; доступ к ним предоставляется только при необходимости и при подписании соответствующего соглашения о конфиденциальности. Если Вас это интересует — [[Обратная связь|пишите]].&lt;br /&gt;
&lt;br /&gt;
== Структура SDK ==&lt;br /&gt;
&lt;br /&gt;
SDK поставляется в виде отдельных небольших пакетов. Для различных задач Вам может потребоваться только часть из них. В ближайшем будущем, на этой Wiki будет выложена подробная информация о существующих пакетах и их составе.&lt;br /&gt;
&lt;br /&gt;
== Установка SDK на POSIX-совместимых системах ==&lt;br /&gt;
&lt;br /&gt;
=== Требования к системе ===&lt;br /&gt;
&lt;br /&gt;
На данный момент из всех POSIX-совместимых систем Deeptown SDK поддерживает только ОС Linux. В ближайшем будущем планируется поддержка FreeBSD; остальные POSIX-системы мы не поддерживаем, т.к. это почти никому не требуется. Если Вам нужен дистрибутив для какой-то конкретной системы, Вы можете [[Обратная связь|написать нам]], и мы постараемся собрать дистрибутив для Вашей системы, если это будет возможно.&lt;br /&gt;
&lt;br /&gt;
Для ядра системы требуются:&lt;br /&gt;
* gcc версии &amp;gt;=3.4 с модулем поддержки языка C++ (g++);&lt;br /&gt;
* make&lt;br /&gt;
* perl &amp;gt;= 5.0&lt;br /&gt;
* wget&lt;br /&gt;
&lt;br /&gt;
Кроме того, для некоторых важных модулей требуются библиотеки:&lt;br /&gt;
* libpcre &amp;gt;=6.6&lt;br /&gt;
* sqlite3&lt;br /&gt;
&lt;br /&gt;
=== Подготовка к установке ===&lt;br /&gt;
&lt;br /&gt;
Все программы и библиотеки, входящие в состав Deeptown SDK, собраны для установки в директорию /opt/deeptown. Абсолютно все изменения в Вашей системе будут происходить именно в этой директории; больше ничего использоваться не будет. Это сделано специально - для удобства удаления и/или переустановки SDK.&lt;br /&gt;
&lt;br /&gt;
Для удобства использования программ, добавьте путь /opt/deeptown/bin к пути поиска программ (переменная среды PATH). Если Вы используете bash, это можно сделать, добавив в $HOME/.bash_profile следующую строчку:&lt;br /&gt;
&lt;br /&gt;
 export PATH=/opt/deeptown/bin:$PATH&lt;br /&gt;
&lt;br /&gt;
Кроме того, рекомендуется установить для себя права на запись в директорию /opt/deeptown, чтобы производить установку новых пакетов под обычным пользователем, а не под рутом. Просто создайте эту директорию вручную и измените ее владельца на свою рабочую учетную запись.&lt;br /&gt;
&lt;br /&gt;
=== Установка dpmake ===&lt;br /&gt;
&lt;br /&gt;
Наконец, переходим к процессу установки.&lt;br /&gt;
&lt;br /&gt;
В первую очередь нужно вручную скачать и установить утилиту dpmake. Она предназначена для сборки библиотек на платформе Диптаун; она же служит простейшим менеджером пакетов Deeptown SDK.&lt;br /&gt;
&lt;br /&gt;
Последняя версия dpmake находится по адресу [http://dao.deeptown.org/release/all/dpmake.tbz2 http://dao.deeptown.org/release/all/dpmake.tbz2].&lt;br /&gt;
&lt;br /&gt;
Скачав ее, наберите следующие команды:&lt;br /&gt;
 tar -jxf dpmake.tbz2        # распаковываем архив&lt;br /&gt;
 cd dpmake                   # переходим в директорию сборки&lt;br /&gt;
 ./build                     # настройка и компиляция&lt;br /&gt;
 make install                # установка в /opt/deeptown&lt;br /&gt;
&lt;br /&gt;
Последняя команда может потребовать привелегий суперпользователя, если Вы не последовали предыдущему совету разрешить себе права на запись в /opt/deeptown.&lt;br /&gt;
&lt;br /&gt;
Чтобы убедиться, что Ваша система поддерживается, наберите команду&lt;br /&gt;
 dpmake_config --platform&lt;br /&gt;
&lt;br /&gt;
Эта команда выведет имя платформы, состоящее из названия ОС, архитектуры процессора и версии libc. На данный момент Deeptown SDK поддерживает следующие платформы:&lt;br /&gt;
* linux-i686-libc6&lt;br /&gt;
* linux-x86_64-libc6&lt;br /&gt;
&lt;br /&gt;
Если предыдущая команда вывела одну из указанных в списке платформ - все нормально, Вы можете продолжать установку.&lt;br /&gt;
&lt;br /&gt;
В противном случае, Вы можете попробовать одно из следующих действий:&lt;br /&gt;
* указать платформу вручную, передавая команде dpmake параметр ''--platform=имя_платформы_из_списка'';&lt;br /&gt;
* [[Обратная связь|Написать нам]] просьбу собрать Deeptown SDK для Вашей платформы. Мы постараемся сделать это как можно скорее; это не должно занять больше недели времени (в зависимости от занятости разработчиков).&lt;br /&gt;
&lt;br /&gt;
=== Установка пакетов ===&lt;br /&gt;
&lt;br /&gt;
Для установки пакетов служит команда&lt;br /&gt;
 dpmake binpkg имя_пакета&lt;br /&gt;
&lt;br /&gt;
Она автоматически загружает требуемый пакет с сервера и распаковывает его.&lt;br /&gt;
&lt;br /&gt;
Полный список пакетов в настоящее время выглядит так:&lt;br /&gt;
&lt;br /&gt;
* osa&lt;br /&gt;
* dptools&lt;br /&gt;
* bxl&lt;br /&gt;
* dpkernel&lt;br /&gt;
* deeptown &lt;br /&gt;
** diss&lt;br /&gt;
** gide&lt;br /&gt;
** mein&lt;br /&gt;
** network&lt;br /&gt;
** security&lt;br /&gt;
** servers&lt;br /&gt;
** startup&lt;br /&gt;
** stream&lt;br /&gt;
** tinyftpd&lt;br /&gt;
** utils&lt;br /&gt;
*** kpp_compiler&lt;br /&gt;
*** graphics_config&lt;br /&gt;
** world&lt;br /&gt;
&lt;br /&gt;
'''Примечание''': Пакеты '''deeptown''' и '''utils''' являются т. н. ''метапакетами'', содержащими все пакеты уровнем ниже. Таким образом, при установке пакета utils, будут установлены пакеты kpp_compiler и graphics_config; а при установке пакета deeptown — все пакеты от diss до world включительно.&lt;br /&gt;
&lt;br /&gt;
Более подробно почитать о назначении пакетов можно здесь: [[Описание установочных пакетов]].&lt;br /&gt;
&lt;br /&gt;
=== Завершение установки ===&lt;br /&gt;
&lt;br /&gt;
Наконец, для использования SDK, требуется выполнить следующие действия.&lt;br /&gt;
&lt;br /&gt;
Прежде всего необходимо установить файлы данных, с которыми будут работать программы из SDK. Подробное описание этих файлов и их форматов можно найти в соответствующей документации.&lt;br /&gt;
&lt;br /&gt;
Последнюю версию медиаданных всегда можно найти в форматах [http://dao.deeptown.org/release/all/media.rar rar] или [http://dao.deeptown.org/release/all/media.tar.bz2 tar.bz2]. Загрузите и распакуйте этот архив в любое удобное для Вас место на диске.&lt;br /&gt;
&lt;br /&gt;
При этом необходимо учесть следующие моменты:&lt;br /&gt;
* программам будет требоваться доступ на запись в пределах этой директории;&lt;br /&gt;
* многое из того, что Вы будете создавать с использованием Deeptown SDK, будет сохраняться в рамках этой директории. Поэтому, когда загружаете новую версию media, не удаляйте старую, а распаковывайте файлы поверх предыдущих.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- После того, как директория media распакована, нужно перейти в нее, скопировать файл config.dsh.sample в файл config.dsh, и отредактировать его в соответствии со своими нуждами. В файле приводятся подробные комментарии ко всем опциям. За более подробной информацией я опять же отсылаю Вас к соответствующей документации. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И самое последнее, что необходимо сделать — это определить три переменные среды, которые используются для поиска необходимых файлов:&lt;br /&gt;
* DEEPTOWN_LIBRARY = /opt/deeptown/lib — путь к плагинам;&lt;br /&gt;
* DEEPTOWN_MEDIA — путь к директории media, про которую шла речь выше;&lt;br /&gt;
* DEEPTOWN_CONFIG = /opt/deeptown/etc/deeptown — путь к файлам конфигурации.&lt;br /&gt;
&lt;br /&gt;
Для того же bash соответствующие строки в .bash_profile будут выглядеть следующим образом:&lt;br /&gt;
 export DEEPTOWN_LIBRARY=&amp;quot;/opt/deeptown/lib&amp;quot;&lt;br /&gt;
 export DEEPTOWN_CONFIG=&amp;quot;/opt/deeptown/etc/deeptown&amp;quot;&lt;br /&gt;
 export DEEPTOWN_MEDIA=&amp;quot;/home/user/deeptown/media&amp;quot;   # замените на свой путь!&lt;br /&gt;
&lt;br /&gt;
=== Быстрый старт использования компилятора K++ ===&lt;br /&gt;
&lt;br /&gt;
Текущий пользователь — user.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 1. Создаем /opt/deeptown и устанавливаем права:&lt;br /&gt;
sudo mkdir /opt/deeptown&lt;br /&gt;
sudo chown user:user /opt/deeptown&lt;br /&gt;
&lt;br /&gt;
# 2. Устанавливаем dpmake&lt;br /&gt;
cd ~&lt;br /&gt;
wget http://dao.deeptown.org/release/all/dpmake.tbz2&lt;br /&gt;
tar -jxf dpmake.tbz2&lt;br /&gt;
cd dpmake&lt;br /&gt;
./build&lt;br /&gt;
make install&lt;br /&gt;
&lt;br /&gt;
# 3. Прописываем необходимые переменные среды&lt;br /&gt;
cd ~&lt;br /&gt;
echo 'export PATH=&amp;quot;/opt/deeptown/bin:$PATH&amp;quot;' &amp;gt;&amp;gt; .bash_profile&lt;br /&gt;
echo 'export DEEPTOWN_LIBRARY=&amp;quot;/opt/deeptown/lib&amp;quot;' &amp;gt;&amp;gt; .bash_profile&lt;br /&gt;
echo 'export DEEPTOWN_CONFIG=&amp;quot;/opt/deeptown/etc/deeptown&amp;quot;' &amp;gt;&amp;gt; .bash_profile&lt;br /&gt;
echo 'export DEEPTOWN_MEDIA=&amp;quot;/home/user/deeptown/media&amp;quot;' &amp;gt;&amp;gt; .bash_profile&lt;br /&gt;
. .bash_profile&lt;br /&gt;
&lt;br /&gt;
# 4. Устанавливаем необходимые пакеты&lt;br /&gt;
dpmake binpkg osa&lt;br /&gt;
dpmake binpkg bxl&lt;br /&gt;
dpmake binpkg dpkernel&lt;br /&gt;
dpmake binpkg gide&lt;br /&gt;
dpmake binpkg kpp_compiler&lt;br /&gt;
&lt;br /&gt;
# 5. Распаковываем media&lt;br /&gt;
cd ~&lt;br /&gt;
mkdir -p deeptown/media&lt;br /&gt;
cd deeptown/media&lt;br /&gt;
wget http://dao.deeptown.org/release/all/media.rar&lt;br /&gt;
rar x media.rar&lt;br /&gt;
&lt;br /&gt;
# 6. Используем&lt;br /&gt;
cd ~&lt;br /&gt;
echo 'export function main() { puts(&amp;quot;Hello, world!\n&amp;quot;); }' &amp;gt; test.kpp&lt;br /&gt;
kpp -e test.kpp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустите kpp без параметров, чтобы получить полный список поддерживаемых опций.&lt;br /&gt;
&lt;br /&gt;
== Установка SDK на ОС Windows ==&lt;br /&gt;
&lt;br /&gt;
На ОС Windows все гораздо проще: мы подготовили программу-инсталлятор, которая все сделает сама.&lt;br /&gt;
&lt;br /&gt;
Ссылки на инсталляторы см. ниже.&lt;br /&gt;
&lt;br /&gt;
Обращаем Ваше внимание на то, что при первом запуске требуется подождать некоторое время, пока идет индексация содержимого. При последующих запусках ждать будет не нужно.&lt;br /&gt;
&lt;br /&gt;
'''Обратите внимание''', что устанавливаемый файл &amp;lt;tt&amp;gt;kpp.exe&amp;lt;/tt&amp;gt; является консольной утилитой. Его нужно запускать из командной строки. Для получения списка возможных параметров, наберите &amp;lt;tt&amp;gt;kpp -h&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Список дистрибутивов ===&lt;br /&gt;
&lt;br /&gt;
Ниже приведен список дистрибутивов Deeptown SDK для Windows различных версий. Пожалуйста, указывайте версию дистрибутива в отчетах об ошибках.&lt;br /&gt;
&lt;br /&gt;
* Последняя выпущенная версия:&lt;br /&gt;
** 15.08.2008: [http://dao.deeptown.org/release/windows-x86/deep-sdk-20080815.exe deep-sdk-20080815.exe]&lt;br /&gt;
* Более ранние версии:&lt;br /&gt;
** 16.07.2008: [http://dao.deeptown.org/release/windows-x86/deep-sdk-20080716.exe deep-sdk-20080716.exe]&lt;br /&gt;
** 19.06.2008: [http://dao.deeptown.org/release/windows-x86/deep-sdk-20080619.exe deep-sdk-20080619.exe]&lt;br /&gt;
** 12.05.2008: [http://dao.deeptown.org/release/windows-x86/deep_sdk_win32.exe deep_sdk_win32.exe]&lt;br /&gt;
&lt;br /&gt;
== Что дальше? ==&lt;br /&gt;
&lt;br /&gt;
Дальше, если все прошло успешно, вы можете обратиться к странице &amp;quot;[[с чего начать]]&amp;quot;, где вкратце описано что и как можно делать.&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%B0</id>
		<title>Базовые свойства контрола</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%B0"/>
				<updated>2008-07-28T21:03:49Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Стили */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Общие свойства ==&lt;br /&gt;
&lt;br /&gt;
=== Стили ===&lt;br /&gt;
; margin : size&lt;br /&gt;
; proportion : integer&lt;br /&gt;
; expand : {full|shaped|none}&lt;br /&gt;
; fixedMinSize : boolean&lt;br /&gt;
; align : {left|right|center}&lt;br /&gt;
; verticalAlign : {top|middle|bottom}&lt;br /&gt;
&lt;br /&gt;
== Видимые элементы ==&lt;br /&gt;
&lt;br /&gt;
=== Стили ===&lt;br /&gt;
&lt;br /&gt;
; border : {simple|sunken|raised|none|default}&lt;br /&gt;
; tabTraversal : boolean&lt;br /&gt;
; scroll : {vertical|horizontal|both|none|default}&lt;br /&gt;
; enabled : boolean&lt;br /&gt;
; visible : boolean&lt;br /&gt;
; color : color&lt;br /&gt;
; backgroundColor : color&lt;br /&gt;
; left : size&lt;br /&gt;
; top : size&lt;br /&gt;
; width : size&lt;br /&gt;
; height : size&lt;br /&gt;
; cursor : {pointer|wait|busy|hand|question|none|default}&lt;br /&gt;
; fontFamily : string (''generic fonts: default, serif, sans-serif, cursive, fantasy, monospace'') or array of strings&lt;br /&gt;
; fontSize : size&lt;br /&gt;
; fontWeight : {normal|bold|default}&lt;br /&gt;
; fontDecoration : {none|underline|default}&lt;br /&gt;
; fontStyle : {normal|italic|default}&lt;br /&gt;
; label : string&lt;br /&gt;
; minSize : [ size, size ]&lt;br /&gt;
; maxSize : [ size, size ]&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%B0</id>
		<title>Базовые свойства контрола</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%B0"/>
				<updated>2008-07-28T20:30:41Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Стили */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Общие свойства ==&lt;br /&gt;
&lt;br /&gt;
=== Стили ===&lt;br /&gt;
; margin : size&lt;br /&gt;
; proportion : integer&lt;br /&gt;
; expand : {full|shaped|none}&lt;br /&gt;
; fixedMinSize : boolean&lt;br /&gt;
; align : {left|right|center}&lt;br /&gt;
; verticalAlign : {top|middle|bottom}&lt;br /&gt;
&lt;br /&gt;
== Видимые элементы ==&lt;br /&gt;
&lt;br /&gt;
=== Стили ===&lt;br /&gt;
&lt;br /&gt;
; border : {simple|sunken|raised|none|default}&lt;br /&gt;
; tabTraversal : boolean&lt;br /&gt;
; scroll : {vertical|horizontal|both|none|default}&lt;br /&gt;
; enabled : boolean&lt;br /&gt;
; visible : boolean&lt;br /&gt;
; color : color&lt;br /&gt;
; backgroundColor : color&lt;br /&gt;
; left : size&lt;br /&gt;
; top : size&lt;br /&gt;
; width : size&lt;br /&gt;
; height : size&lt;br /&gt;
; cursor : {pointer|wait|busy|hand|question|none|default}&lt;br /&gt;
; fontFamily : string (''generic fonts: serif, sans-serif, cursive, fantasy, monospace'') or array of strings&lt;br /&gt;
; fontSize : size&lt;br /&gt;
; fontWeight : {normal|bold|default}&lt;br /&gt;
; fontDecoration : {none|underline|default}&lt;br /&gt;
; fontStyle : {normal|italic|default}&lt;br /&gt;
; label : string&lt;br /&gt;
; minSize : [ size, size ]&lt;br /&gt;
; maxSize : [ size, size ]&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%B0</id>
		<title>Базовые свойства контрола</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%B0"/>
				<updated>2008-07-28T19:59:36Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Стили */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Общие свойства ==&lt;br /&gt;
&lt;br /&gt;
=== Стили ===&lt;br /&gt;
; margin : size&lt;br /&gt;
; proportion : integer&lt;br /&gt;
; expand : {full|shaped|none}&lt;br /&gt;
; fixedMinSize : boolean&lt;br /&gt;
; align : {left|right|center}&lt;br /&gt;
; verticalAlign : {top|middle|bottom}&lt;br /&gt;
&lt;br /&gt;
== Видимые элементы ==&lt;br /&gt;
&lt;br /&gt;
=== Стили ===&lt;br /&gt;
&lt;br /&gt;
; border : {simple|sunken|raised|none|default}&lt;br /&gt;
; tabTraversal : boolean&lt;br /&gt;
; scroll : {vertical|horizontal|both|none|default}&lt;br /&gt;
; enabled : boolean&lt;br /&gt;
; visible : boolean&lt;br /&gt;
; color : color&lt;br /&gt;
; backgroundColor : color&lt;br /&gt;
; left : size&lt;br /&gt;
; top : size&lt;br /&gt;
; width : size&lt;br /&gt;
; height : size&lt;br /&gt;
; cursor : {pointer|idle|link|none|default}&lt;br /&gt;
; fontFamily : string (''generic fonts: serif, sans-serif, cursive, fantasy, monospace'') or array of strings&lt;br /&gt;
; fontSize : size&lt;br /&gt;
; fontWeight : {normal|bold}&lt;br /&gt;
; fontDecoration : {none|underline}&lt;br /&gt;
; fontStyle : {normal|italic}&lt;br /&gt;
; label : string&lt;br /&gt;
; minSize : [ size, size ]&lt;br /&gt;
; maxSize : [ size, size ]&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%B0</id>
		<title>Базовые свойства контрола</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%B0"/>
				<updated>2008-07-28T19:50:30Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Стили */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Общие свойства ==&lt;br /&gt;
&lt;br /&gt;
=== Стили ===&lt;br /&gt;
; margin : size&lt;br /&gt;
; proportion : integer&lt;br /&gt;
; expand : {full|shaped|none}&lt;br /&gt;
; fixedMinSize : boolean&lt;br /&gt;
; align : {left|right|center}&lt;br /&gt;
; verticalAlign : {top|middle|bottom}&lt;br /&gt;
&lt;br /&gt;
== Видимые элементы ==&lt;br /&gt;
&lt;br /&gt;
=== Стили ===&lt;br /&gt;
&lt;br /&gt;
; border : {simple|sunken|raised|none|default}&lt;br /&gt;
; tabTraversal : boolean&lt;br /&gt;
; scroll : {vertical|horizontal|both|none|default}&lt;br /&gt;
; enabled : boolean&lt;br /&gt;
; visible : boolean&lt;br /&gt;
; color : color&lt;br /&gt;
; backgroundColor : color&lt;br /&gt;
; left : size&lt;br /&gt;
; top : size&lt;br /&gt;
; width : size&lt;br /&gt;
; height : size&lt;br /&gt;
; cursor : {pointer|idle|link|none}&lt;br /&gt;
; fontFamily : string (''generic fonts: serif, sans-serif, cursive, fantasy, monospace'') or array of strings&lt;br /&gt;
; fontSize : size&lt;br /&gt;
; fontWeight : {normal|bold}&lt;br /&gt;
; fontDecoration : {none|underline}&lt;br /&gt;
; fontStyle : {normal|italic}&lt;br /&gt;
; label : string&lt;br /&gt;
; minSize : [ size, size ]&lt;br /&gt;
; maxSize : [ size, size ]&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%B0</id>
		<title>Базовые свойства контрола</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%B0"/>
				<updated>2008-07-28T19:47:21Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Стили */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Общие свойства ==&lt;br /&gt;
&lt;br /&gt;
=== Стили ===&lt;br /&gt;
; margin : size&lt;br /&gt;
; proportion : integer&lt;br /&gt;
; expand : {full|shaped|none}&lt;br /&gt;
; fixedMinSize : boolean&lt;br /&gt;
; align : {left|right|center}&lt;br /&gt;
; verticalAlign : {top|middle|bottom}&lt;br /&gt;
&lt;br /&gt;
== Видимые элементы ==&lt;br /&gt;
&lt;br /&gt;
=== Стили ===&lt;br /&gt;
&lt;br /&gt;
; border : {simple|sunken|raised|none|default}&lt;br /&gt;
; tabTraversal : boolean&lt;br /&gt;
; scroll : {vertical|horizontal|both|none}&lt;br /&gt;
; enabled : boolean&lt;br /&gt;
; visible : boolean&lt;br /&gt;
; color : color&lt;br /&gt;
; backgroundColor : color&lt;br /&gt;
; left : size&lt;br /&gt;
; top : size&lt;br /&gt;
; width : size&lt;br /&gt;
; height : size&lt;br /&gt;
; cursor : {pointer|idle|link|none}&lt;br /&gt;
; fontFamily : string (''generic fonts: serif, sans-serif, cursive, fantasy, monospace'') or array of strings&lt;br /&gt;
; fontSize : size&lt;br /&gt;
; fontWeight : {normal|bold}&lt;br /&gt;
; fontDecoration : {none|underline}&lt;br /&gt;
; fontStyle : {normal|italic}&lt;br /&gt;
; label : string&lt;br /&gt;
; minSize : [ size, size ]&lt;br /&gt;
; maxSize : [ size, size ]&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%9B%D0%BE%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D1%8B</id>
		<title>Логические группы</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%9B%D0%BE%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D1%8B"/>
				<updated>2008-07-28T19:07:48Z</updated>
		
		<summary type="html">&lt;p&gt;Root: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Общие ==&lt;br /&gt;
&lt;br /&gt;
=== Стили ===&lt;br /&gt;
&lt;br /&gt;
; minWidth : size&lt;br /&gt;
; minHeight : size&lt;br /&gt;
&lt;br /&gt;
== BoxSizer ==&lt;br /&gt;
&lt;br /&gt;
=== Стили ===&lt;br /&gt;
&lt;br /&gt;
; orientation : {vertical|horizontal}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GridSizer ==&lt;br /&gt;
&lt;br /&gt;
=== Стили ===&lt;br /&gt;
&lt;br /&gt;
; rows : integer&lt;br /&gt;
; columns : integer&lt;br /&gt;
; horizontalGap : size&lt;br /&gt;
; verticalGap : size&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%B0</id>
		<title>Базовые свойства контрола</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%B0"/>
				<updated>2008-07-28T19:06:58Z</updated>
		
		<summary type="html">&lt;p&gt;Root: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Общие свойства ==&lt;br /&gt;
&lt;br /&gt;
=== Стили ===&lt;br /&gt;
; margin : size&lt;br /&gt;
; proportion : integer&lt;br /&gt;
; expand : {full|shaped|none}&lt;br /&gt;
; fixedMinSize : boolean&lt;br /&gt;
; align : {left|right|center}&lt;br /&gt;
; verticalAlign : {top|middle|bottom}&lt;br /&gt;
&lt;br /&gt;
== Видимые элементы ==&lt;br /&gt;
&lt;br /&gt;
=== Стили ===&lt;br /&gt;
&lt;br /&gt;
; border : {simple|sunken|raised|none}&lt;br /&gt;
; tabTraversal : boolean&lt;br /&gt;
; scroll : {vertical|horizontal|both|none}&lt;br /&gt;
; enabled : boolean&lt;br /&gt;
; visible : boolean&lt;br /&gt;
; color : color&lt;br /&gt;
; backgroundColor : color&lt;br /&gt;
; left : size&lt;br /&gt;
; top : size&lt;br /&gt;
; width : size&lt;br /&gt;
; height : size&lt;br /&gt;
; cursor : {pointer|idle|link|none}&lt;br /&gt;
; fontFamily : string (''generic fonts: serif, sans-serif, cursive, fantasy, monospace'') or array of strings&lt;br /&gt;
; fontSize : size&lt;br /&gt;
; fontWeight : {normal|bold}&lt;br /&gt;
; fontDecoration : {none|underline}&lt;br /&gt;
; fontStyle : {normal|italic}&lt;br /&gt;
; label : string&lt;br /&gt;
; minSize : [ size, size ]&lt;br /&gt;
; maxSize : [ size, size ]&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/MEIN</id>
		<title>MEIN</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/MEIN"/>
				<updated>2008-07-28T19:04:01Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Controls */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;На данной странице будет собрана информация по движку интерфейса MEIN (MEta INterface). На данный момент здесь размещен бессвязный материал, использующийся в разработке; в дальнейшем все будет структурировано.&lt;br /&gt;
&lt;br /&gt;
== Controls ==&lt;br /&gt;
&lt;br /&gt;
Контролы в MEIN - это низкоуровневые классы, предназначенные для отображения одной сущности. Контролы предоставляют унифицированный кросплатформенный интерфейс для управления.&lt;br /&gt;
&lt;br /&gt;
Каждый контрол&lt;br /&gt;
* имеет набор свойств, которые могут задаваться через стили&lt;br /&gt;
* может генерировать стандартный набор событий&lt;br /&gt;
* имеет набор методов для управления.&lt;br /&gt;
&lt;br /&gt;
Каждый из контролов стандартного набора должен поддерживаться всеми серверами интерфейса. Внешний вид контролов на тех или иных серверах может сильно различаться (вплоть до использования различных графических элементов), но набор свойств, событий и методов должен сохраняться неизменным. Некоторые системы могут расширять этот набор, но не урезать его.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что данное описание предполагает некую иерархию свойств контролов, реальные иерархии классов могут различаться. Т.е. главное - чтобы контрол предоставлял необходимый набор свойств, а на иерархию классов пользовательский код опираться не будет (поскольку используется динамический язык).&lt;br /&gt;
&lt;br /&gt;
* [[Базовые свойства контрола]]&lt;br /&gt;
** общие&lt;br /&gt;
** видимые элементы&lt;br /&gt;
** контейнеры&lt;br /&gt;
* [[Группы верхнего уровня]]&lt;br /&gt;
** Frame&lt;br /&gt;
** Dialog&lt;br /&gt;
* [[Логические группы]]&lt;br /&gt;
** BoxSizer&lt;br /&gt;
** GridSizer&lt;br /&gt;
** Spacer&lt;br /&gt;
* [[Управляющие группы]]&lt;br /&gt;
** Panel&lt;br /&gt;
** StaticBox&lt;br /&gt;
** Splitter&lt;br /&gt;
** StatusBar&lt;br /&gt;
** ToolBar&lt;br /&gt;
** Notebook&lt;br /&gt;
** Scroller (scrolled window)&lt;br /&gt;
* [[Диалоги]]&lt;br /&gt;
** MessageDialog&lt;br /&gt;
** TextEntryDialog&lt;br /&gt;
* [[Элементы управления]]&lt;br /&gt;
** Animation&lt;br /&gt;
** Button&lt;br /&gt;
** BitmapButton&lt;br /&gt;
** ToggleButton&lt;br /&gt;
** CheckBox&lt;br /&gt;
** CheckListBox&lt;br /&gt;
** Choice&lt;br /&gt;
** ComboBox&lt;br /&gt;
** Gauge&lt;br /&gt;
** ListBox&lt;br /&gt;
** StringCtrl (single-line string)&lt;br /&gt;
** TextCtrl (multiline string)&lt;br /&gt;
** SpinCtrl&lt;br /&gt;
** StaticText&lt;br /&gt;
** Label&lt;br /&gt;
** Hyperlink&lt;br /&gt;
** Bitmap&lt;br /&gt;
** RadioButton&lt;br /&gt;
* [[Меню]]&lt;br /&gt;
** Menu&lt;br /&gt;
** MenuBar&lt;br /&gt;
** MenuItem&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/MEIN</id>
		<title>MEIN</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/MEIN"/>
				<updated>2008-07-28T19:02:14Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Controls */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;На данной странице будет собрана информация по движку интерфейса MEIN (MEta INterface). На данный момент здесь размещен бессвязный материал, использующийся в разработке; в дальнейшем все будет структурировано.&lt;br /&gt;
&lt;br /&gt;
== Controls ==&lt;br /&gt;
&lt;br /&gt;
Контролы в MEIN - это низкоуровневые классы, предназначенные для отображения одной сущности. Контролы предоставляют унифицированный кросплатформенный интерфейс для управления.&lt;br /&gt;
&lt;br /&gt;
Каждый контрол&lt;br /&gt;
* имеет набор свойств, которые могут задаваться через стили&lt;br /&gt;
* может генерировать стандартный набор событий&lt;br /&gt;
* имеет набор методов для управления.&lt;br /&gt;
&lt;br /&gt;
Каждый из контролов стандартного набора должен поддерживаться всеми серверами интерфейса. Внешний вид контролов на тех или иных серверах может сильно различаться (вплоть до использования различных графических элементов), но набор свойств, событий и методов должен сохраняться неизменным. Некоторые системы могут расширять этот набор, но не урезать его.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что данное описание предполагает некую иерархию свойств контролов, реальные иерархии классов могут различаться. Т.е. главное - чтобы контрол предоставлял необходимый набор свойств, а на иерархию классов пользовательский код опираться не будет (поскольку используется динамический язык).&lt;br /&gt;
&lt;br /&gt;
* [[Базовые свойства контрола]]&lt;br /&gt;
** логические группы&lt;br /&gt;
** контейнеры&lt;br /&gt;
** элементы управления&lt;br /&gt;
* [[Группы верхнего уровня]]&lt;br /&gt;
** Frame&lt;br /&gt;
** Dialog&lt;br /&gt;
* [[Логические группы]]&lt;br /&gt;
** BoxSizer&lt;br /&gt;
** GridSizer&lt;br /&gt;
** Spacer&lt;br /&gt;
* [[Управляющие группы]]&lt;br /&gt;
** Panel&lt;br /&gt;
** StaticBox&lt;br /&gt;
** Splitter&lt;br /&gt;
** StatusBar&lt;br /&gt;
** ToolBar&lt;br /&gt;
** Notebook&lt;br /&gt;
** Scroller (scrolled window)&lt;br /&gt;
* [[Диалоги]]&lt;br /&gt;
** MessageDialog&lt;br /&gt;
** TextEntryDialog&lt;br /&gt;
* [[Элементы управления]]&lt;br /&gt;
** Animation&lt;br /&gt;
** Button&lt;br /&gt;
** BitmapButton&lt;br /&gt;
** ToggleButton&lt;br /&gt;
** CheckBox&lt;br /&gt;
** CheckListBox&lt;br /&gt;
** Choice&lt;br /&gt;
** ComboBox&lt;br /&gt;
** Gauge&lt;br /&gt;
** ListBox&lt;br /&gt;
** StringCtrl (single-line string)&lt;br /&gt;
** TextCtrl (multiline string)&lt;br /&gt;
** SpinCtrl&lt;br /&gt;
** StaticText&lt;br /&gt;
** Label&lt;br /&gt;
** Hyperlink&lt;br /&gt;
** Bitmap&lt;br /&gt;
** RadioButton&lt;br /&gt;
* [[Меню]]&lt;br /&gt;
** Menu&lt;br /&gt;
** MenuBar&lt;br /&gt;
** MenuItem&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%B0</id>
		<title>Базовые свойства контрола</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%B0"/>
				<updated>2008-07-28T18:55:39Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Стили */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Стили ==&lt;br /&gt;
&lt;br /&gt;
; border : {simple|sunken|raised|none}&lt;br /&gt;
; margin : size&lt;br /&gt;
; tabTraversal : boolean&lt;br /&gt;
; scroll : {vertical|horizontal|both|none}&lt;br /&gt;
; enabled : boolean&lt;br /&gt;
; visible : boolean&lt;br /&gt;
; color : color&lt;br /&gt;
; backgroundColor : color&lt;br /&gt;
; left : size&lt;br /&gt;
; top : size&lt;br /&gt;
; width : size&lt;br /&gt;
; height : size&lt;br /&gt;
; cursor : {pointer|idle|link|none}&lt;br /&gt;
; fontFamily : string (''generic fonts: serif, sans-serif, cursive, fantasy, monospace'') or array of strings&lt;br /&gt;
; fontSize : size&lt;br /&gt;
; fontWeight : {normal|bold}&lt;br /&gt;
; fontDecoration : {none|underline}&lt;br /&gt;
; fontStyle : {normal|italic}&lt;br /&gt;
; label : string&lt;br /&gt;
; proportion : integer&lt;br /&gt;
; expand : {full|shaped|none}&lt;br /&gt;
; minSize : [ size, size ]&lt;br /&gt;
; maxSize : [ size, size ]&lt;br /&gt;
; fixedMinSize : boolean&lt;br /&gt;
; align : {left|right|center}&lt;br /&gt;
; verticalAlign : {top|middle|bottom}&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%9B%D0%BE%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D1%8B</id>
		<title>Логические группы</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%9B%D0%BE%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D1%8B"/>
				<updated>2008-07-28T18:47:34Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* GridSizer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== BoxSizer ==&lt;br /&gt;
&lt;br /&gt;
=== Стили ===&lt;br /&gt;
&lt;br /&gt;
; orientation : {vertical|horizontal}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GridSizer ==&lt;br /&gt;
&lt;br /&gt;
=== Стили ===&lt;br /&gt;
&lt;br /&gt;
; rows : integer&lt;br /&gt;
; columns : integer&lt;br /&gt;
; horizontalGap : size&lt;br /&gt;
; verticalGap : size&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%9B%D0%BE%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D1%8B</id>
		<title>Логические группы</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%9B%D0%BE%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D1%8B"/>
				<updated>2008-07-28T18:47:18Z</updated>
		
		<summary type="html">&lt;p&gt;Root: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== BoxSizer ==&lt;br /&gt;
&lt;br /&gt;
=== Стили ===&lt;br /&gt;
&lt;br /&gt;
; orientation : {vertical|horizontal}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GridSizer ==&lt;br /&gt;
&lt;br /&gt;
; rows : integer&lt;br /&gt;
; columns : integer&lt;br /&gt;
; horizontalGap : size&lt;br /&gt;
; verticalGap : size&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%9B%D0%BE%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D1%8B</id>
		<title>Логические группы</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%9B%D0%BE%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D1%8B"/>
				<updated>2008-07-28T18:43:00Z</updated>
		
		<summary type="html">&lt;p&gt;Root: Новая: == BoxSizer ==  === Стили ===  ; orientation : {vertical|horizontal}&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== BoxSizer ==&lt;br /&gt;
&lt;br /&gt;
=== Стили ===&lt;br /&gt;
&lt;br /&gt;
; orientation : {vertical|horizontal}&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%B0</id>
		<title>Базовые свойства контрола</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%B0"/>
				<updated>2008-07-28T11:48:20Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Стили */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Стили ==&lt;br /&gt;
&lt;br /&gt;
; border : {simple|sunken|raised|none}&lt;br /&gt;
; margin : size&lt;br /&gt;
; tabTraversal : boolean&lt;br /&gt;
; scroll : {vertical|horizontal|both|none}&lt;br /&gt;
; enabled : boolean&lt;br /&gt;
; visible : boolean&lt;br /&gt;
; color : color&lt;br /&gt;
; backgroundColor : color&lt;br /&gt;
; left : size&lt;br /&gt;
; right : size&lt;br /&gt;
; top : size&lt;br /&gt;
; bottom : size&lt;br /&gt;
; cursor : {pointer|idle|link|none}&lt;br /&gt;
; fontFamily : string (''generic fonts: serif, sans-serif, cursive, fantasy, monospace'') or array of strings&lt;br /&gt;
; fontSize : size&lt;br /&gt;
; fontWeight : {normal|bold}&lt;br /&gt;
; fontDecoration : {none|underline}&lt;br /&gt;
; fontStyle : {normal|italic}&lt;br /&gt;
; label : string&lt;br /&gt;
; proportion : integer&lt;br /&gt;
; expand : {full|shaped|none}&lt;br /&gt;
; minSize : [ size, size ]&lt;br /&gt;
; maxSize : [ size, size ]&lt;br /&gt;
; fixedMinSize : boolean&lt;br /&gt;
; align : {left|right|center}&lt;br /&gt;
; verticalAlign : {top|middle|bottom}&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%B0</id>
		<title>Базовые свойства контрола</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%B0"/>
				<updated>2008-07-28T11:28:01Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Стили */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Стили ==&lt;br /&gt;
&lt;br /&gt;
; border : {simple|sunken|raised|none}&lt;br /&gt;
; margin : size&lt;br /&gt;
; tabTraversal : boolean&lt;br /&gt;
; scroll : {vertical|horizontal|both|none}&lt;br /&gt;
; enabled : boolean&lt;br /&gt;
; visible : boolean&lt;br /&gt;
; color : color&lt;br /&gt;
; backgroundColor : color&lt;br /&gt;
; left : size&lt;br /&gt;
; right : size&lt;br /&gt;
; top : size&lt;br /&gt;
; bottom : size&lt;br /&gt;
; cursor : {pointer|idle|link|none}&lt;br /&gt;
; fontFamily : string (''generic fonts: serif, sans-serif, cursive, fantasy, monospace'') or array of strings&lt;br /&gt;
; fontSize : size&lt;br /&gt;
; fontWeight : {normal|bold}&lt;br /&gt;
; fontDecoration : {none|underline}&lt;br /&gt;
; fontStyle : {normal|italic}&lt;br /&gt;
; label : string&lt;br /&gt;
; proportion : integer&lt;br /&gt;
; expand : boolean&lt;br /&gt;
; align : {left|right|center}&lt;br /&gt;
; verticalAlign : {top|middle|bottom}&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%B0</id>
		<title>Базовые свойства контрола</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%B0"/>
				<updated>2008-07-27T15:16:50Z</updated>
		
		<summary type="html">&lt;p&gt;Root: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Стили ==&lt;br /&gt;
&lt;br /&gt;
; border : {simple|sunken|raised|none}&lt;br /&gt;
; tabTraversal : boolean&lt;br /&gt;
; scroll : {vertical|horizontal|both|none}&lt;br /&gt;
; enabled : boolean&lt;br /&gt;
; visible : boolean&lt;br /&gt;
; color : color&lt;br /&gt;
; backgroundColor : color&lt;br /&gt;
; left : size&lt;br /&gt;
; right : size&lt;br /&gt;
; top : size&lt;br /&gt;
; bottom : size&lt;br /&gt;
; cursor : {pointer|idle|link|none}&lt;br /&gt;
; fontFamily : string (''generic fonts: serif, sans-serif, cursive, fantasy, monospace'') or array of strings&lt;br /&gt;
; fontSize : size&lt;br /&gt;
; fontWeight : {normal|bold}&lt;br /&gt;
; fontDecoration : {none|underline}&lt;br /&gt;
; fontStyle : {normal|italic}&lt;br /&gt;
; label : string&lt;br /&gt;
; proportion : integer&lt;br /&gt;
; expand : boolean&lt;br /&gt;
; align : {left|right|center}&lt;br /&gt;
; verticalAlign : {top|middle|bottom}&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%B0</id>
		<title>Базовые свойства контрола</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%B0"/>
				<updated>2008-07-27T15:16:20Z</updated>
		
		<summary type="html">&lt;p&gt;Root: Новая: == Стили ==  ; border : {simple|sunken|raised|none} ; tabTraversal : boolean ; scroll : {vertical|horizontal|both|none} ; enabled : boolean ; visible : boolean ; color : color : bac...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Стили ==&lt;br /&gt;
&lt;br /&gt;
; border : {simple|sunken|raised|none}&lt;br /&gt;
; tabTraversal : boolean&lt;br /&gt;
; scroll : {vertical|horizontal|both|none}&lt;br /&gt;
; enabled : boolean&lt;br /&gt;
; visible : boolean&lt;br /&gt;
; color : color&lt;br /&gt;
: backgroundColor : color&lt;br /&gt;
; left : size&lt;br /&gt;
; right : size&lt;br /&gt;
; top : size&lt;br /&gt;
; bottom : size&lt;br /&gt;
; cursor : {pointer|idle|link|none}&lt;br /&gt;
; fontFamily : string (''generic fonts: serif, sans-serif, cursive, fantasy, monospace'') or array of strings&lt;br /&gt;
; fontSize : size&lt;br /&gt;
; fontWeight : {normal|bold}&lt;br /&gt;
; fontDecoration : {none|underline}&lt;br /&gt;
; fontStyle : {normal|italic}&lt;br /&gt;
; label : string&lt;br /&gt;
; proportion : integer&lt;br /&gt;
; expand : boolean&lt;br /&gt;
; align : {left|right|center}&lt;br /&gt;
; verticalAlign : {top|middle|bottom}&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/MEIN</id>
		<title>MEIN</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/MEIN"/>
				<updated>2008-07-26T19:01:18Z</updated>
		
		<summary type="html">&lt;p&gt;Root: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;На данной странице будет собрана информация по движку интерфейса MEIN (MEta INterface). На данный момент здесь размещен бессвязный материал, использующийся в разработке; в дальнейшем все будет структурировано.&lt;br /&gt;
&lt;br /&gt;
== Controls ==&lt;br /&gt;
&lt;br /&gt;
Контролы в MEIN - это низкоуровневые классы, предназначенные для отображения одной сущности. Контролы предоставляют унифицированный кросплатформенный интерфейс для управления.&lt;br /&gt;
&lt;br /&gt;
Каждый контрол&lt;br /&gt;
* имеет набор свойств, которые могут задаваться через стили&lt;br /&gt;
* может генерировать стандартный набор событий&lt;br /&gt;
* имеет набор методов для управления.&lt;br /&gt;
&lt;br /&gt;
Каждый из контролов стандартного набора должен поддерживаться всеми серверами интерфейса. Внешний вид контролов на тех или иных серверах может сильно различаться (вплоть до использования различных графических элементов), но набор свойств, событий и методов должен сохраняться неизменным. Некоторые системы могут расширять этот набор, но не урезать его.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что данное описание предполагает некую иерархию свойств контролов, реальные иерархии классов могут различаться. Т.е. главное - чтобы контрол предоставлял необходимый набор свойств, а на иерархию классов пользовательский код опираться не будет (поскольку используется динамический язык).&lt;br /&gt;
&lt;br /&gt;
* [[Базовые свойства контрола]]&lt;br /&gt;
* [[Группы верхнего уровня]]&lt;br /&gt;
** Frame&lt;br /&gt;
** Dialog&lt;br /&gt;
* [[Логические группы]]&lt;br /&gt;
** BoxSizer&lt;br /&gt;
** GridSizer&lt;br /&gt;
** Spacer&lt;br /&gt;
* [[Управляющие группы]]&lt;br /&gt;
** Panel&lt;br /&gt;
** StaticBox&lt;br /&gt;
** Splitter&lt;br /&gt;
** StatusBar&lt;br /&gt;
** ToolBar&lt;br /&gt;
** Notebook&lt;br /&gt;
** Scroller (scrolled window)&lt;br /&gt;
* [[Диалоги]]&lt;br /&gt;
** MessageDialog&lt;br /&gt;
** TextEntryDialog&lt;br /&gt;
* [[Элементы управления]]&lt;br /&gt;
** Animation&lt;br /&gt;
** Button&lt;br /&gt;
** BitmapButton&lt;br /&gt;
** ToggleButton&lt;br /&gt;
** CheckBox&lt;br /&gt;
** CheckListBox&lt;br /&gt;
** Choice&lt;br /&gt;
** ComboBox&lt;br /&gt;
** Gauge&lt;br /&gt;
** ListBox&lt;br /&gt;
** StringCtrl (single-line string)&lt;br /&gt;
** TextCtrl (multiline string)&lt;br /&gt;
** SpinCtrl&lt;br /&gt;
** StaticText&lt;br /&gt;
** Label&lt;br /&gt;
** Hyperlink&lt;br /&gt;
** Bitmap&lt;br /&gt;
** RadioButton&lt;br /&gt;
* [[Меню]]&lt;br /&gt;
** Menu&lt;br /&gt;
** MenuBar&lt;br /&gt;
** MenuItem&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/MEIN</id>
		<title>MEIN</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/MEIN"/>
				<updated>2008-07-26T18:51:50Z</updated>
		
		<summary type="html">&lt;p&gt;Root: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;На данной странице будет собрана информация по движку интерфейса MEIN (MEta INterface). На данный момент здесь размещен бессвязный материал, использующийся в разработке; в дальнейшем все будет структурировано.&lt;br /&gt;
&lt;br /&gt;
== Controls ==&lt;br /&gt;
&lt;br /&gt;
Контролы в MEIN - это низкоуровневые классы, предназначенные для отображения одной сущности. Контролы предоставляют унифицированный кросплатформенный интерфейс для управления.&lt;br /&gt;
&lt;br /&gt;
Каждый контрол&lt;br /&gt;
* имеет набор свойств, которые могут задаваться через стили&lt;br /&gt;
* может генерировать стандартный набор событий&lt;br /&gt;
* имеет набор методов для управления.&lt;br /&gt;
&lt;br /&gt;
Каждый из контролов стандартного набора должен поддерживаться всеми серверами интерфейса. Внешний вид контролов на тех или иных серверах может сильно различаться (вплоть до использования различных графических элементов), но набор свойств, событий и методов должен сохраняться неизменным. Некоторые системы могут расширять этот набор, но не урезать его.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что данное описание предполагает некую иерархию свойств контролов, реальные иерархии классов могут различаться. Т.е. главное - чтобы контрол предоставлял необходимый набор свойств, а на иерархию классов пользовательский код опираться не будет (поскольку используется динамический язык).&lt;br /&gt;
&lt;br /&gt;
* [[Базовые свойства контрола]]&lt;br /&gt;
* [[Группы верхнего уровня]]&lt;br /&gt;
** Frame&lt;br /&gt;
** Dialog&lt;br /&gt;
* [[Логические группы]]&lt;br /&gt;
** BoxSizer&lt;br /&gt;
** GridSizer&lt;br /&gt;
* [[Управляющие группы]]&lt;br /&gt;
** Panel&lt;br /&gt;
** StaticBox&lt;br /&gt;
** Splitter&lt;br /&gt;
** StatusBar&lt;br /&gt;
** ToolBar&lt;br /&gt;
** Notebook&lt;br /&gt;
** Scroller (scrolled window)&lt;br /&gt;
* [[Диалоги]]&lt;br /&gt;
** MessageDialog&lt;br /&gt;
** TextEntryDialog&lt;br /&gt;
* [[Элементы управления]]&lt;br /&gt;
** Animation&lt;br /&gt;
** Button&lt;br /&gt;
** BitmapButton&lt;br /&gt;
** ToggleButton&lt;br /&gt;
** CheckBox&lt;br /&gt;
** CheckListBox&lt;br /&gt;
** Choice&lt;br /&gt;
** ComboBox&lt;br /&gt;
** Gauge&lt;br /&gt;
** ListBox&lt;br /&gt;
** StringCtrl (single-line string)&lt;br /&gt;
** TextCtrl (multiline string)&lt;br /&gt;
** SpinCtrl&lt;br /&gt;
** StaticText&lt;br /&gt;
** Hyperlink&lt;br /&gt;
** Bitmap&lt;br /&gt;
** RadioButton&lt;br /&gt;
* [[Меню]]&lt;br /&gt;
** Menu&lt;br /&gt;
** MenuBar&lt;br /&gt;
** MenuItem&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/MEIN</id>
		<title>MEIN</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/MEIN"/>
				<updated>2008-07-26T17:06:28Z</updated>
		
		<summary type="html">&lt;p&gt;Root: Новая: На данной странице будет собрана информация по движку интерфейса MEIN (MEta INterface). На данный момент здесь ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;На данной странице будет собрана информация по движку интерфейса MEIN (MEta INterface). На данный момент здесь размещен бессвязный материал, использующийся в разработке; в дальнейшем все будет структурировано.&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/MediaWiki:Sidebar</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/MediaWiki:Sidebar"/>
				<updated>2008-07-26T17:04:54Z</updated>
		
		<summary type="html">&lt;p&gt;Root: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* navigation&lt;br /&gt;
** mainpage|mainpage&lt;br /&gt;
** portal-url|portal&lt;br /&gt;
** currentevents-url|currentevents&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help&lt;br /&gt;
** sitesupport-url|sitesupport&lt;br /&gt;
* информация&lt;br /&gt;
** О проекте|О проекте&lt;br /&gt;
** Deeptown SDK|Deeptown SDK&lt;br /&gt;
** Задачи|Задачи&lt;br /&gt;
** Багтрекер|Багтрекер&lt;br /&gt;
** Рассылка|Рассылка&lt;br /&gt;
** Release Notes|Release Notes&lt;br /&gt;
** Обратная связь|Обратная связь&lt;br /&gt;
* документация&lt;br /&gt;
** K++|K++&lt;br /&gt;
** Платформа Gide|Gide&lt;br /&gt;
** Стандартная библиотека gide|Gide stdlib&lt;br /&gt;
** World Engine|World Engine&lt;br /&gt;
** MEIN|MEIN&lt;br /&gt;
** Туториалы и HOWTO|HOWTO&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/Object</id>
		<title>Object</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/Object"/>
				<updated>2008-07-01T16:35:13Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* frozen */ уже реализован&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Класс &amp;lt;tt&amp;gt;Object&amp;lt;/tt&amp;gt; является сердцем всей стандартной библиотеки и ее центральным классом. Все остальные классы, прямо или косвенно наследуются от &amp;lt;tt&amp;gt;Object&amp;lt;/tt&amp;gt;, что позволяет реализовывать централизованное управление и сбор информации об объектах. Данный класс имеет набор методов которые реализуют механизм рефлексии, который заключается в том, что объекты могут динамически получать информацию о других объектах (включая самих себя). Например, объект A может узнать, какие методы имеет объект B, и на основании этой информации выполнять те или иные действия. &lt;br /&gt;
&lt;br /&gt;
Класс &amp;lt;tt&amp;gt;Object&amp;lt;/tt&amp;gt; вводит понятие инспектирования объектов, которое позволяет получать сведения о содержимом объектов в удобной для восприятия форме (это может быть особенно полезно при отладке и трассировке программ).&lt;br /&gt;
&lt;br /&gt;
'''Родители''': &amp;lt;tt&amp;gt;Object&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
'''Методы''': &amp;lt;tt&amp;gt;[[#class|class]] [[#className|className]] [[#instanceOf|instanceOf]] [[#call|call]] [[#invoke|invoke]] [[#freeze|freeze]] [[#frozen|frozen]] [[#clone|clone]] [[#dup|dup]] [[#inspect|inspect]] [[#equals|equals]] [[#hasMethod|hasMethod]] [[#getMethod|getMethod]] [[#methods|methods]]&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Реализует операторы''': &amp;lt;tt&amp;gt;[[#equals|==]]&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
== class ==&lt;br /&gt;
&lt;br /&gt;
'''Возвращает''': &amp;lt;tt&amp;gt;[[Class]]&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод возвращает инстанцию класса &amp;lt;tt&amp;gt;[[Class]]&amp;lt;/tt&amp;gt;, соответствующую классу данного объекта. Например:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
var x = 1;        //переменная типа int&lt;br /&gt;
var c = x.class;  //переменная типа Class&lt;br /&gt;
puts(c.name);     //выведет на экран строку &amp;quot;int&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== className ==&lt;br /&gt;
&lt;br /&gt;
'''Возвращает''': &amp;lt;tt&amp;gt;[[string]]&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эквивалент операции &amp;lt;tt&amp;gt;x.class.name&amp;lt;/tt&amp;gt;, только работает быстрее (без создания промежуточного объекта)&lt;br /&gt;
&lt;br /&gt;
== instanceOf ==&lt;br /&gt;
&lt;br /&gt;
instanceOf(''имя класса:'' &amp;lt;tt&amp;gt;[[string]]&amp;lt;/tt&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
instanceOf(''класс:'' &amp;lt;tt&amp;gt;[[Class]]&amp;lt;/tt&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
'''Возвращает''': [[логическое значение]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверяет, является ли текущий объект инстанцией указанного класса.&lt;br /&gt;
&lt;br /&gt;
== call ==&lt;br /&gt;
&lt;br /&gt;
call(''имя метода:'' &amp;lt;tt&amp;gt;[[string]]&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;'''...'''&amp;lt;/tt&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
'''Возвращает''': динамическую переменную &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод позволяет вызывать методы объектов динамически, по их имени. Приэтом, вызываемому методу передаются все последующие параметры (если таковые имеются). Естественно, никакой проверки типов фактических параметров не производится. Всю работу по приведению типов программист должен осуществлять сам. Пример:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
var ary = new array; &lt;br /&gt;
ary.call(:push, 1, 2, 3);&lt;br /&gt;
puts(ary.inspect); // [1, 2, 3]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== invoke ==&lt;br /&gt;
&lt;br /&gt;
invoke(''имя метода:'' &amp;lt;tt&amp;gt;[[string]]&amp;lt;/tt&amp;gt;, ''параметры:'' &amp;lt;tt&amp;gt;[[array]]&amp;lt;/tt&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
'''Возвращает''': динамическую переменную &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод аналогичен по смыслу методу &amp;lt;tt&amp;gt;[[#call|call]]&amp;lt;/tt&amp;gt;, за исключением того, что последующие параметры передаются в массиве. При вызове этот массив будет &amp;quot;развернут&amp;quot;, как если бы все параметры были записаны через запятую:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
var ary = new array; &lt;br /&gt;
ary.invoke(:push, [1, 2, 3]);&lt;br /&gt;
puts(ary.inspect); // [1, 2, 3]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== freeze ==&lt;br /&gt;
&lt;br /&gt;
'''Возвращает''': текущий объект &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод &amp;quot;замораживает&amp;quot; текущий объект, после чего он становится доступным только для чтения. Обратной операции не существует, так что разморозить однажды замороженный объект нельзя.&lt;br /&gt;
&lt;br /&gt;
== frozen ==&lt;br /&gt;
&lt;br /&gt;
'''Возвращает''': [[логическое значение]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверяет, является ли текущий объект замороженным.&lt;br /&gt;
&lt;br /&gt;
== clone ==&lt;br /&gt;
&lt;br /&gt;
'''Возвращает''': копию текущего объекта &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод служит для создания копии текущего объекта, используя оператор &amp;quot;&amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt;&amp;quot;. Если объект (или его класс) располагает таким методом, будет создана пустая инстанция класса, которой будет присвоено значение текущего объекта.&lt;br /&gt;
&lt;br /&gt;
'''Примечание:''' В случае с контейнерами копирование происходит только в том случае, если данный элемент обладает оператором &amp;quot;&amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt;&amp;quot;; в противном случае, в копии контейнера будет лежать тот же объект:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
var ary = new array; &lt;br /&gt;
ary.push(5);&lt;br /&gt;
ary.push(Stream.open(...));&lt;br /&gt;
var copy = ary.clone;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом примере, переменная ''copy'' будет содержать копию оригинального массива ''ary''. Однако скопирован будет только нулевой элемент массива, то есть объект соответствующий константе 5. Инстанция потока будет передана &amp;quot;как есть&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== dup ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== inspect ==&lt;br /&gt;
&lt;br /&gt;
'''Возвращает''': &amp;lt;tt&amp;gt;[[string]]&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод преобразует и возвращает информацию об объекте в удобном для восприятия виде. Переопределяется в классах-потомках для отображения более детальной информации. Во многих случаях является аналогом оператора приведения к строке, однако не всегда. Например, в случае K++, для класса строки оператор приведения к типу &amp;lt;tt&amp;gt;[[string]]&amp;lt;/tt&amp;gt; возвращает саму строку, тогда как метод &amp;lt;tt&amp;gt;inspect&amp;lt;/tt&amp;gt; возвращает строку с восстановленными спецсимволами и заключенную в кавычки:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
var hello = &amp;quot;hello\tworld\n&amp;quot;;&lt;br /&gt;
puts(hello);           //вывод: hello    world&lt;br /&gt;
puts(hello as string); //вывод: hello    world&lt;br /&gt;
puts(hello.inspect);   //вывод: &amp;quot;hello\tworld\n&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Другие классы, такие как контейнеры переопределяют метод для отображения своего содержимого. При этом, в коде метода рекурсивно вызывеются метод &amp;lt;tt&amp;gt;inspect&amp;lt;/tt&amp;gt; самих элементов для отображения их значения:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
var ary = [1, [2,'3'], :x, { :a =&amp;gt; 1 }];&lt;br /&gt;
puts(ary.inspect);  //вывод: [1, [2, &amp;quot;3&amp;quot;], &amp;quot;x&amp;quot;, { &amp;quot;a&amp;quot; =&amp;gt; 1 }]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== equals ==&lt;br /&gt;
&lt;br /&gt;
equals(''объект сравнения'') &amp;lt;br&amp;gt;&lt;br /&gt;
operator == (''объект сравнения'') &amp;lt;br&amp;gt;&lt;br /&gt;
'''Возвращает''': [[логическое значение]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод используется для проверки объектов на идентичность. Возвращает истину только в том случае когда текущий объект и передный параметр — это один и тот же объект. Два объекта, с одинаковыми значениями все равно считаются неидентичными:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
var x = 5;&lt;br /&gt;
var b1 = x.equals(x);&lt;br /&gt;
var y = 4 + 1;&lt;br /&gt;
var b2 = x.equals(y);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом примере переменная ''b1'' будет истинной, в то время как переменная ''b2'' ложной. Несмотря на то, что переменные ''x'' и ''y'' равны численно — они представлены разными объектами.&lt;br /&gt;
&lt;br /&gt;
'''Примечание:''' В случае с классом &amp;lt;tt&amp;gt;Object&amp;lt;/tt&amp;gt; для тех же целей может применяться и оператор &amp;lt;tt&amp;gt;==&amp;lt;/tt&amp;gt;, однако предполагается что он должен переопределяться дочерними классами для достижения собственных целей. Сам же метод &amp;lt;tt&amp;gt;equals&amp;lt;/tt&amp;gt; переопределяться не должен никогда (для обеспечения оригинального функционала).&lt;br /&gt;
&lt;br /&gt;
== hasMethod ==&lt;br /&gt;
&lt;br /&gt;
hasMethod(''имя метода:'' &amp;lt;tt&amp;gt;[[string]]&amp;lt;/tt&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
'''Возвращает''': [[логическое значение]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверяет, имеет ли объект указанный метод.&lt;br /&gt;
&lt;br /&gt;
== getMethod ==&lt;br /&gt;
&lt;br /&gt;
getMethod(''имя метода:'' &amp;lt;tt&amp;gt;[[string]]&amp;lt;/tt&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
'''Возвращает''': &amp;lt;tt&amp;gt;[[Method]]&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данный метод возвращает метод объекта в виде объекта метода =) Впоследствии, этот объект может использоваться для удаленного вызова метода, либо для получения дополнительной информации. При попытке получения несуществующего метода будет возбуждено исключение &amp;lt;tt&amp;gt;[[Классы исключений#ENotFound|ENotFound]]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
var ary = new array;&lt;br /&gt;
var p = ary.getMethod(:push);&lt;br /&gt;
p(1, 2, 3);&lt;br /&gt;
ary.inspect; //значение: [1, 2, 3]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== methods ==&lt;br /&gt;
&lt;br /&gt;
'''Возвращает''': &amp;lt;tt&amp;gt;[[array]]&amp;lt;[[string]]&amp;gt;&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод возвращает массив имен методов.&lt;br /&gt;
&lt;br /&gt;
'''Примечание:''' Результирующий массив создается по требованию при каждом вызове метода. Поэтому, при необходимости перебора элементов, следует сначала сохранить полученный массив в переменную, а затем работать уже с ней.&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/Object</id>
		<title>Object</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/Object"/>
				<updated>2008-07-01T16:34:51Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* freeze */ уже реализован&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Класс &amp;lt;tt&amp;gt;Object&amp;lt;/tt&amp;gt; является сердцем всей стандартной библиотеки и ее центральным классом. Все остальные классы, прямо или косвенно наследуются от &amp;lt;tt&amp;gt;Object&amp;lt;/tt&amp;gt;, что позволяет реализовывать централизованное управление и сбор информации об объектах. Данный класс имеет набор методов которые реализуют механизм рефлексии, который заключается в том, что объекты могут динамически получать информацию о других объектах (включая самих себя). Например, объект A может узнать, какие методы имеет объект B, и на основании этой информации выполнять те или иные действия. &lt;br /&gt;
&lt;br /&gt;
Класс &amp;lt;tt&amp;gt;Object&amp;lt;/tt&amp;gt; вводит понятие инспектирования объектов, которое позволяет получать сведения о содержимом объектов в удобной для восприятия форме (это может быть особенно полезно при отладке и трассировке программ).&lt;br /&gt;
&lt;br /&gt;
'''Родители''': &amp;lt;tt&amp;gt;Object&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
'''Методы''': &amp;lt;tt&amp;gt;[[#class|class]] [[#className|className]] [[#instanceOf|instanceOf]] [[#call|call]] [[#invoke|invoke]] [[#freeze|freeze]] [[#frozen|frozen]] [[#clone|clone]] [[#dup|dup]] [[#inspect|inspect]] [[#equals|equals]] [[#hasMethod|hasMethod]] [[#getMethod|getMethod]] [[#methods|methods]]&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Реализует операторы''': &amp;lt;tt&amp;gt;[[#equals|==]]&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
== class ==&lt;br /&gt;
&lt;br /&gt;
'''Возвращает''': &amp;lt;tt&amp;gt;[[Class]]&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод возвращает инстанцию класса &amp;lt;tt&amp;gt;[[Class]]&amp;lt;/tt&amp;gt;, соответствующую классу данного объекта. Например:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
var x = 1;        //переменная типа int&lt;br /&gt;
var c = x.class;  //переменная типа Class&lt;br /&gt;
puts(c.name);     //выведет на экран строку &amp;quot;int&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== className ==&lt;br /&gt;
&lt;br /&gt;
'''Возвращает''': &amp;lt;tt&amp;gt;[[string]]&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Эквивалент операции &amp;lt;tt&amp;gt;x.class.name&amp;lt;/tt&amp;gt;, только работает быстрее (без создания промежуточного объекта)&lt;br /&gt;
&lt;br /&gt;
== instanceOf ==&lt;br /&gt;
&lt;br /&gt;
instanceOf(''имя класса:'' &amp;lt;tt&amp;gt;[[string]]&amp;lt;/tt&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
instanceOf(''класс:'' &amp;lt;tt&amp;gt;[[Class]]&amp;lt;/tt&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
'''Возвращает''': [[логическое значение]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверяет, является ли текущий объект инстанцией указанного класса.&lt;br /&gt;
&lt;br /&gt;
== call ==&lt;br /&gt;
&lt;br /&gt;
call(''имя метода:'' &amp;lt;tt&amp;gt;[[string]]&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;'''...'''&amp;lt;/tt&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
'''Возвращает''': динамическую переменную &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод позволяет вызывать методы объектов динамически, по их имени. Приэтом, вызываемому методу передаются все последующие параметры (если таковые имеются). Естественно, никакой проверки типов фактических параметров не производится. Всю работу по приведению типов программист должен осуществлять сам. Пример:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
var ary = new array; &lt;br /&gt;
ary.call(:push, 1, 2, 3);&lt;br /&gt;
puts(ary.inspect); // [1, 2, 3]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== invoke ==&lt;br /&gt;
&lt;br /&gt;
invoke(''имя метода:'' &amp;lt;tt&amp;gt;[[string]]&amp;lt;/tt&amp;gt;, ''параметры:'' &amp;lt;tt&amp;gt;[[array]]&amp;lt;/tt&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
'''Возвращает''': динамическую переменную &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод аналогичен по смыслу методу &amp;lt;tt&amp;gt;[[#call|call]]&amp;lt;/tt&amp;gt;, за исключением того, что последующие параметры передаются в массиве. При вызове этот массив будет &amp;quot;развернут&amp;quot;, как если бы все параметры были записаны через запятую:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
var ary = new array; &lt;br /&gt;
ary.invoke(:push, [1, 2, 3]);&lt;br /&gt;
puts(ary.inspect); // [1, 2, 3]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== freeze ==&lt;br /&gt;
&lt;br /&gt;
'''Возвращает''': текущий объект &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод &amp;quot;замораживает&amp;quot; текущий объект, после чего он становится доступным только для чтения. Обратной операции не существует, так что разморозить однажды замороженный объект нельзя.&lt;br /&gt;
&lt;br /&gt;
== frozen ==&lt;br /&gt;
&lt;br /&gt;
'''Возвращает''': [[логическое значение]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверяет, является ли текущий объект замороженным.&lt;br /&gt;
&lt;br /&gt;
'''Примечание:''' В текущей версии виртуальной машины, данная опция не реализована.&lt;br /&gt;
&lt;br /&gt;
== clone ==&lt;br /&gt;
&lt;br /&gt;
'''Возвращает''': копию текущего объекта &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод служит для создания копии текущего объекта, используя оператор &amp;quot;&amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt;&amp;quot;. Если объект (или его класс) располагает таким методом, будет создана пустая инстанция класса, которой будет присвоено значение текущего объекта.&lt;br /&gt;
&lt;br /&gt;
'''Примечание:''' В случае с контейнерами копирование происходит только в том случае, если данный элемент обладает оператором &amp;quot;&amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt;&amp;quot;; в противном случае, в копии контейнера будет лежать тот же объект:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
var ary = new array; &lt;br /&gt;
ary.push(5);&lt;br /&gt;
ary.push(Stream.open(...));&lt;br /&gt;
var copy = ary.clone;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом примере, переменная ''copy'' будет содержать копию оригинального массива ''ary''. Однако скопирован будет только нулевой элемент массива, то есть объект соответствующий константе 5. Инстанция потока будет передана &amp;quot;как есть&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== dup ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== inspect ==&lt;br /&gt;
&lt;br /&gt;
'''Возвращает''': &amp;lt;tt&amp;gt;[[string]]&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод преобразует и возвращает информацию об объекте в удобном для восприятия виде. Переопределяется в классах-потомках для отображения более детальной информации. Во многих случаях является аналогом оператора приведения к строке, однако не всегда. Например, в случае K++, для класса строки оператор приведения к типу &amp;lt;tt&amp;gt;[[string]]&amp;lt;/tt&amp;gt; возвращает саму строку, тогда как метод &amp;lt;tt&amp;gt;inspect&amp;lt;/tt&amp;gt; возвращает строку с восстановленными спецсимволами и заключенную в кавычки:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
var hello = &amp;quot;hello\tworld\n&amp;quot;;&lt;br /&gt;
puts(hello);           //вывод: hello    world&lt;br /&gt;
puts(hello as string); //вывод: hello    world&lt;br /&gt;
puts(hello.inspect);   //вывод: &amp;quot;hello\tworld\n&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Другие классы, такие как контейнеры переопределяют метод для отображения своего содержимого. При этом, в коде метода рекурсивно вызывеются метод &amp;lt;tt&amp;gt;inspect&amp;lt;/tt&amp;gt; самих элементов для отображения их значения:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
var ary = [1, [2,'3'], :x, { :a =&amp;gt; 1 }];&lt;br /&gt;
puts(ary.inspect);  //вывод: [1, [2, &amp;quot;3&amp;quot;], &amp;quot;x&amp;quot;, { &amp;quot;a&amp;quot; =&amp;gt; 1 }]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== equals ==&lt;br /&gt;
&lt;br /&gt;
equals(''объект сравнения'') &amp;lt;br&amp;gt;&lt;br /&gt;
operator == (''объект сравнения'') &amp;lt;br&amp;gt;&lt;br /&gt;
'''Возвращает''': [[логическое значение]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод используется для проверки объектов на идентичность. Возвращает истину только в том случае когда текущий объект и передный параметр — это один и тот же объект. Два объекта, с одинаковыми значениями все равно считаются неидентичными:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
var x = 5;&lt;br /&gt;
var b1 = x.equals(x);&lt;br /&gt;
var y = 4 + 1;&lt;br /&gt;
var b2 = x.equals(y);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом примере переменная ''b1'' будет истинной, в то время как переменная ''b2'' ложной. Несмотря на то, что переменные ''x'' и ''y'' равны численно — они представлены разными объектами.&lt;br /&gt;
&lt;br /&gt;
'''Примечание:''' В случае с классом &amp;lt;tt&amp;gt;Object&amp;lt;/tt&amp;gt; для тех же целей может применяться и оператор &amp;lt;tt&amp;gt;==&amp;lt;/tt&amp;gt;, однако предполагается что он должен переопределяться дочерними классами для достижения собственных целей. Сам же метод &amp;lt;tt&amp;gt;equals&amp;lt;/tt&amp;gt; переопределяться не должен никогда (для обеспечения оригинального функционала).&lt;br /&gt;
&lt;br /&gt;
== hasMethod ==&lt;br /&gt;
&lt;br /&gt;
hasMethod(''имя метода:'' &amp;lt;tt&amp;gt;[[string]]&amp;lt;/tt&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
'''Возвращает''': [[логическое значение]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверяет, имеет ли объект указанный метод.&lt;br /&gt;
&lt;br /&gt;
== getMethod ==&lt;br /&gt;
&lt;br /&gt;
getMethod(''имя метода:'' &amp;lt;tt&amp;gt;[[string]]&amp;lt;/tt&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
'''Возвращает''': &amp;lt;tt&amp;gt;[[Method]]&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данный метод возвращает метод объекта в виде объекта метода =) Впоследствии, этот объект может использоваться для удаленного вызова метода, либо для получения дополнительной информации. При попытке получения несуществующего метода будет возбуждено исключение &amp;lt;tt&amp;gt;[[Классы исключений#ENotFound|ENotFound]]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
var ary = new array;&lt;br /&gt;
var p = ary.getMethod(:push);&lt;br /&gt;
p(1, 2, 3);&lt;br /&gt;
ary.inspect; //значение: [1, 2, 3]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== methods ==&lt;br /&gt;
&lt;br /&gt;
'''Возвращает''': &amp;lt;tt&amp;gt;[[array]]&amp;lt;[[string]]&amp;gt;&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод возвращает массив имен методов.&lt;br /&gt;
&lt;br /&gt;
'''Примечание:''' Результирующий массив создается по требованию при каждом вызове метода. Поэтому, при необходимости перебора элементов, следует сначала сохранить полученный массив в переменную, а затем работать уже с ней.&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/Deeptown_SDK</id>
		<title>Deeptown SDK</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/Deeptown_SDK"/>
				<updated>2008-06-20T18:43:41Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Установка SDK на ОС Windows */ Список инсталляторов&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание Deeptown SDK ==&lt;br /&gt;
&lt;br /&gt;
'''Deeptown Software Development Kit''' — это набор программ, утилит и библиотек для разработки приложений для платформы Deeptown.&lt;br /&gt;
&lt;br /&gt;
В публичном доступе выпускается бинарная версия SDK — т.е. набор библиотек и программ, скомпилированных для различных операционных систем. Исходные коды по прежнему остаются закрытыми; доступ к ним предоставляется только при необходимости и при подписании соответствующего соглашения о конфиденциальности. Если Вас это интересует — [[Обратная связь|пишите]].&lt;br /&gt;
&lt;br /&gt;
== Структура SDK ==&lt;br /&gt;
&lt;br /&gt;
SDK поставляется в виде отдельных небольших пакетов. Для различных задач Вам может потребоваться только часть из них. В ближайшем будущем, на этой Wiki будет выложена подробная информация о существующих пакетах и их составе.&lt;br /&gt;
&lt;br /&gt;
== Установка SDK на POSIX-совместимых системах ==&lt;br /&gt;
&lt;br /&gt;
=== Требования к системе ===&lt;br /&gt;
&lt;br /&gt;
На данный момент из всех POSIX-совместимых систем Deeptown SDK поддерживает только ОС Linux. В ближайшем будущем планируется поддержка FreeBSD; остальные POSIX-системы мы не поддерживаем, т.к. это почти никому не требуется. Если Вам нужен дистрибутив для какой-то конкретной системы, Вы можете [[Обратная связь|написать нам]], и мы постараемся собрать дистрибутив для Вашей системы, если это будет возможно.&lt;br /&gt;
&lt;br /&gt;
Для ядра системы требуются:&lt;br /&gt;
* gcc версии &amp;gt;=3.4 с модулем поддержки языка C++ (g++);&lt;br /&gt;
* make&lt;br /&gt;
* perl &amp;gt;= 5.0&lt;br /&gt;
* wget&lt;br /&gt;
&lt;br /&gt;
Кроме того, для некоторых важных модулей требуются библиотеки:&lt;br /&gt;
* libpcre &amp;gt;=6.6&lt;br /&gt;
* sqlite3&lt;br /&gt;
&lt;br /&gt;
=== Подготовка к установке ===&lt;br /&gt;
&lt;br /&gt;
Все программы и библиотеки, входящие в состав Deeptown SDK, собраны для установки в директорию /opt/deeptown. Абсолютно все изменения в Вашей системе будут происходить именно в этой директории; больше ничего использоваться не будет. Это сделано специально - для удобства удаления и/или переустановки SDK.&lt;br /&gt;
&lt;br /&gt;
Для удобства использования программ, добавьте путь /opt/deeptown/bin к пути поиска программ (переменная среды PATH). Если Вы используете bash, это можно сделать, добавив в $HOME/.bash_profile следующую строчку:&lt;br /&gt;
&lt;br /&gt;
 export PATH=/opt/deeptown/bin:$PATH&lt;br /&gt;
&lt;br /&gt;
Кроме того, рекомендуется установить для себя права на запись в директорию /opt/deeptown, чтобы производить установку новых пакетов под обычным пользователем, а не под рутом. Просто создайте эту директорию вручную и измените ее владельца на свою рабочую учетную запись.&lt;br /&gt;
&lt;br /&gt;
=== Установка dpmake ===&lt;br /&gt;
&lt;br /&gt;
Наконец, переходим к процессу установки.&lt;br /&gt;
&lt;br /&gt;
В первую очередь нужно вручную скачать и установить утилиту dpmake. Она предназначена для сборки библиотек на платформе Диптаун; она же служит простейшим менеджером пакетов Deeptown SDK.&lt;br /&gt;
&lt;br /&gt;
Последняя версия dpmake находится по адресу [http://dao.deeptown.org/release/all/dpmake.tbz2 http://dao.deeptown.org/release/all/dpmake.tbz2].&lt;br /&gt;
&lt;br /&gt;
Скачав ее, наберите следующие команды:&lt;br /&gt;
 tar -jxf dpmake.tbz2        # распаковываем архив&lt;br /&gt;
 cd dpmake                   # переходим в директорию сборки&lt;br /&gt;
 ./build                     # настройка и компиляция&lt;br /&gt;
 make install                # установка в /opt/deeptown&lt;br /&gt;
&lt;br /&gt;
Последняя команда может потребовать привелегий суперпользователя, если Вы не последовали предыдущему совету разрешить себе права на запись в /opt/deeptown.&lt;br /&gt;
&lt;br /&gt;
Чтобы убедиться, что Ваша система поддерживается, наберите команду&lt;br /&gt;
 dpmake_config --platform&lt;br /&gt;
&lt;br /&gt;
Эта команда выведет имя платформы, состоящее из названия ОС, архитектуры процессора и версии libc. На данный момент Deeptown SDK поддерживает следующие платформы:&lt;br /&gt;
* linux-i686-libc6&lt;br /&gt;
* linux-x86_64-libc6&lt;br /&gt;
&lt;br /&gt;
Если предыдущая команда вывела одну из указанных в списке платформ - все нормально, Вы можете продолжать установку.&lt;br /&gt;
&lt;br /&gt;
В противном случае, Вы можете попробовать одно из следующих действий:&lt;br /&gt;
* указать платформу вручную, передавая команде dpmake параметр ''--platform=имя_платформы_из_списка'';&lt;br /&gt;
* [[Обратная связь|Написать нам]] просьбу собрать Deeptown SDK для Вашей платформы. Мы постараемся сделать это как можно скорее; это не должно занять больше недели времени (в зависимости от занятости разработчиков).&lt;br /&gt;
&lt;br /&gt;
=== Установка пакетов ===&lt;br /&gt;
&lt;br /&gt;
Для установки пакетов служит команда&lt;br /&gt;
 dpmake binpkg имя_пакета&lt;br /&gt;
&lt;br /&gt;
Она автоматически загружает требуемый пакет с сервера и распаковывает его.&lt;br /&gt;
&lt;br /&gt;
Полный список пакетов в настоящее время выглядит так:&lt;br /&gt;
&lt;br /&gt;
* osa&lt;br /&gt;
* dptools&lt;br /&gt;
* bxl&lt;br /&gt;
* dpkernel&lt;br /&gt;
* deeptown &lt;br /&gt;
** diss&lt;br /&gt;
** gide&lt;br /&gt;
** mein&lt;br /&gt;
** network&lt;br /&gt;
** security&lt;br /&gt;
** servers&lt;br /&gt;
** startup&lt;br /&gt;
** stream&lt;br /&gt;
** tinyftpd&lt;br /&gt;
** utils&lt;br /&gt;
*** kpp_compiler&lt;br /&gt;
*** graphics_config&lt;br /&gt;
** world&lt;br /&gt;
&lt;br /&gt;
'''Примечание''': Пакеты '''deeptown''' и '''utils''' являются т. н. ''метапакетами'', содержащими все пакеты уровнем ниже. Таким образом, при установке пакета utils, будут установлены пакеты kpp_compiler и graphics_config; а при установке пакета deeptown — все пакеты от diss до world включительно.&lt;br /&gt;
&lt;br /&gt;
Более подробно почитать о назначении пакетов можно здесь: [[Описание установочных пакетов]].&lt;br /&gt;
&lt;br /&gt;
=== Завершение установки ===&lt;br /&gt;
&lt;br /&gt;
Наконец, для использования SDK, требуется выполнить следующие действия.&lt;br /&gt;
&lt;br /&gt;
Прежде всего необходимо установить файлы данных, с которыми будут работать программы из SDK. Подробное описание этих файлов и их форматов можно найти в соответствующей документации.&lt;br /&gt;
&lt;br /&gt;
Последнюю версию медиаданных всегда можно найти в форматах [http://dao.deeptown.org/release/all/media.rar rar] или [http://dao.deeptown.org/release/all/media.tar.bz2 tar.bz2]. Загрузите и распакуйте этот архив в любое удобное для Вас место на диске.&lt;br /&gt;
&lt;br /&gt;
При этом необходимо учесть следующие моменты:&lt;br /&gt;
* программам будет требоваться доступ на запись в пределах этой директории;&lt;br /&gt;
* многое из того, что Вы будете создавать с использованием Deeptown SDK, будет сохраняться в рамках этой директории. Поэтому, когда загружаете новую версию media, не удаляйте старую, а распаковывайте файлы поверх предыдущих.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- После того, как директория media распакована, нужно перейти в нее, скопировать файл config.dsh.sample в файл config.dsh, и отредактировать его в соответствии со своими нуждами. В файле приводятся подробные комментарии ко всем опциям. За более подробной информацией я опять же отсылаю Вас к соответствующей документации. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И самое последнее, что необходимо сделать — это определить три переменные среды, которые используются для поиска необходимых файлов:&lt;br /&gt;
* DEEPTOWN_LIBRARY = /opt/deeptown/lib — путь к плагинам;&lt;br /&gt;
* DEEPTOWN_MEDIA — путь к директории media, про которую шла речь выше;&lt;br /&gt;
* DEEPTOWN_CONFIG = /opt/deeptown/etc/deeptown — путь к файлам конфигурации.&lt;br /&gt;
&lt;br /&gt;
Для того же bash соответствующие строки в .bash_profile будут выглядеть следующим образом:&lt;br /&gt;
 export DEEPTOWN_LIBRARY=&amp;quot;/opt/deeptown/lib&amp;quot;&lt;br /&gt;
 export DEEPTOWN_CONFIG=&amp;quot;/opt/deeptown/etc/deeptown&amp;quot;&lt;br /&gt;
 export DEEPTOWN_MEDIA=&amp;quot;/home/user/deeptown/media&amp;quot;   # замените на свой путь!&lt;br /&gt;
&lt;br /&gt;
=== Быстрый старт использования компилятора K++ ===&lt;br /&gt;
&lt;br /&gt;
Текущий пользователь — user.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 1. Создаем /opt/deeptown и устанавливаем права:&lt;br /&gt;
sudo mkdir /opt/deeptown&lt;br /&gt;
sudo chown user:user /opt/deeptown&lt;br /&gt;
&lt;br /&gt;
# 2. Устанавливаем dpmake&lt;br /&gt;
cd ~&lt;br /&gt;
wget http://dao.deeptown.org/release/all/dpmake.tbz2&lt;br /&gt;
tar -jxf dpmake.tbz2&lt;br /&gt;
cd dpmake&lt;br /&gt;
./build&lt;br /&gt;
make install&lt;br /&gt;
&lt;br /&gt;
# 3. Прописываем необходимые переменные среды&lt;br /&gt;
cd ~&lt;br /&gt;
echo 'export PATH=&amp;quot;/opt/deeptown/bin:$PATH&amp;quot;' &amp;gt;&amp;gt; .bash_profile&lt;br /&gt;
echo 'export DEEPTOWN_LIBRARY=&amp;quot;/opt/deeptown/lib&amp;quot;' &amp;gt;&amp;gt; .bash_profile&lt;br /&gt;
echo 'export DEEPTOWN_CONFIG=&amp;quot;/opt/deeptown/etc/deeptown&amp;quot;' &amp;gt;&amp;gt; .bash_profile&lt;br /&gt;
echo 'export DEEPTOWN_MEDIA=&amp;quot;/home/user/deeptown/media&amp;quot;' &amp;gt;&amp;gt; .bash_profile&lt;br /&gt;
. .bash_profile&lt;br /&gt;
&lt;br /&gt;
# 4. Устанавливаем необходимые пакеты&lt;br /&gt;
dpmake binpkg osa&lt;br /&gt;
dpmake binpkg bxl&lt;br /&gt;
dpmake binpkg dpkernel&lt;br /&gt;
dpmake binpkg gide&lt;br /&gt;
dpmake binpkg kpp_compiler&lt;br /&gt;
&lt;br /&gt;
# 5. Распаковываем media&lt;br /&gt;
cd ~&lt;br /&gt;
mkdir -p deeptown/media&lt;br /&gt;
cd deeptown/media&lt;br /&gt;
wget http://dao.deeptown.org/release/all/media.rar&lt;br /&gt;
rar x media.rar&lt;br /&gt;
&lt;br /&gt;
# 6. Используем&lt;br /&gt;
cd ~&lt;br /&gt;
echo 'export function main() { puts(&amp;quot;Hello, world!\n&amp;quot;); }' &amp;gt; test.kpp&lt;br /&gt;
kpp -e test.kpp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустите kpp без параметров, чтобы получить полный список поддерживаемых опций.&lt;br /&gt;
&lt;br /&gt;
== Установка SDK на ОС Windows ==&lt;br /&gt;
&lt;br /&gt;
На ОС Windows все гораздо проще: мы подготовили программу-инсталлятор, которая все сделает сама.&lt;br /&gt;
&lt;br /&gt;
Ссылки на инсталляторы см. ниже.&lt;br /&gt;
&lt;br /&gt;
Обращаем Ваше внимание на то, что при первом запуске требуется подождать некоторое время, пока идет индексация содержимого. При последующих запусках ждать будет не нужно.&lt;br /&gt;
&lt;br /&gt;
'''Обратите внимание''', что устанавливаемый файл &amp;lt;tt&amp;gt;kpp.exe&amp;lt;/tt&amp;gt; является консольной утилитой. Его нужно запускать из командной строки. Для получения списка возможных параметров, наберите &amp;lt;tt&amp;gt;kpp -h&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Список дистрибутивов ===&lt;br /&gt;
&lt;br /&gt;
Ниже приведен список дистрибутивов Deeptown SDK для Windows различных версий. Пожалуйста, указывайте версию дистрибутива в отчетах об ошибках.&lt;br /&gt;
&lt;br /&gt;
* Последняя выпущенная версия:&lt;br /&gt;
** 19.06.2008: [http://dao.deeptown.org/release/windows-x86/deep-sdk-20080619.exe deep-sdk-20080619.exe]&lt;br /&gt;
* Более ранние версии:&lt;br /&gt;
** 12.05.2008: [http://dao.deeptown.org/release/windows-x86/deep_sdk_win32.exe deep_sdk_win32.exe]&lt;br /&gt;
&lt;br /&gt;
== Что дальше? ==&lt;br /&gt;
&lt;br /&gt;
Дальше, если все прошло успешно, вы можете обратиться к странице &amp;quot;[[с чего начать]]&amp;quot;, где вкратце описано что и как можно делать.&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/Deeptown_SDK</id>
		<title>Deeptown SDK</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/Deeptown_SDK"/>
				<updated>2008-06-20T18:35:17Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Завершение установки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание Deeptown SDK ==&lt;br /&gt;
&lt;br /&gt;
'''Deeptown Software Development Kit''' — это набор программ, утилит и библиотек для разработки приложений для платформы Deeptown.&lt;br /&gt;
&lt;br /&gt;
В публичном доступе выпускается бинарная версия SDK — т.е. набор библиотек и программ, скомпилированных для различных операционных систем. Исходные коды по прежнему остаются закрытыми; доступ к ним предоставляется только при необходимости и при подписании соответствующего соглашения о конфиденциальности. Если Вас это интересует — [[Обратная связь|пишите]].&lt;br /&gt;
&lt;br /&gt;
== Структура SDK ==&lt;br /&gt;
&lt;br /&gt;
SDK поставляется в виде отдельных небольших пакетов. Для различных задач Вам может потребоваться только часть из них. В ближайшем будущем, на этой Wiki будет выложена подробная информация о существующих пакетах и их составе.&lt;br /&gt;
&lt;br /&gt;
== Установка SDK на POSIX-совместимых системах ==&lt;br /&gt;
&lt;br /&gt;
=== Требования к системе ===&lt;br /&gt;
&lt;br /&gt;
На данный момент из всех POSIX-совместимых систем Deeptown SDK поддерживает только ОС Linux. В ближайшем будущем планируется поддержка FreeBSD; остальные POSIX-системы мы не поддерживаем, т.к. это почти никому не требуется. Если Вам нужен дистрибутив для какой-то конкретной системы, Вы можете [[Обратная связь|написать нам]], и мы постараемся собрать дистрибутив для Вашей системы, если это будет возможно.&lt;br /&gt;
&lt;br /&gt;
Для ядра системы требуются:&lt;br /&gt;
* gcc версии &amp;gt;=3.4 с модулем поддержки языка C++ (g++);&lt;br /&gt;
* make&lt;br /&gt;
* perl &amp;gt;= 5.0&lt;br /&gt;
* wget&lt;br /&gt;
&lt;br /&gt;
Кроме того, для некоторых важных модулей требуются библиотеки:&lt;br /&gt;
* libpcre &amp;gt;=6.6&lt;br /&gt;
* sqlite3&lt;br /&gt;
&lt;br /&gt;
=== Подготовка к установке ===&lt;br /&gt;
&lt;br /&gt;
Все программы и библиотеки, входящие в состав Deeptown SDK, собраны для установки в директорию /opt/deeptown. Абсолютно все изменения в Вашей системе будут происходить именно в этой директории; больше ничего использоваться не будет. Это сделано специально - для удобства удаления и/или переустановки SDK.&lt;br /&gt;
&lt;br /&gt;
Для удобства использования программ, добавьте путь /opt/deeptown/bin к пути поиска программ (переменная среды PATH). Если Вы используете bash, это можно сделать, добавив в $HOME/.bash_profile следующую строчку:&lt;br /&gt;
&lt;br /&gt;
 export PATH=/opt/deeptown/bin:$PATH&lt;br /&gt;
&lt;br /&gt;
Кроме того, рекомендуется установить для себя права на запись в директорию /opt/deeptown, чтобы производить установку новых пакетов под обычным пользователем, а не под рутом. Просто создайте эту директорию вручную и измените ее владельца на свою рабочую учетную запись.&lt;br /&gt;
&lt;br /&gt;
=== Установка dpmake ===&lt;br /&gt;
&lt;br /&gt;
Наконец, переходим к процессу установки.&lt;br /&gt;
&lt;br /&gt;
В первую очередь нужно вручную скачать и установить утилиту dpmake. Она предназначена для сборки библиотек на платформе Диптаун; она же служит простейшим менеджером пакетов Deeptown SDK.&lt;br /&gt;
&lt;br /&gt;
Последняя версия dpmake находится по адресу [http://dao.deeptown.org/release/all/dpmake.tbz2 http://dao.deeptown.org/release/all/dpmake.tbz2].&lt;br /&gt;
&lt;br /&gt;
Скачав ее, наберите следующие команды:&lt;br /&gt;
 tar -jxf dpmake.tbz2        # распаковываем архив&lt;br /&gt;
 cd dpmake                   # переходим в директорию сборки&lt;br /&gt;
 ./build                     # настройка и компиляция&lt;br /&gt;
 make install                # установка в /opt/deeptown&lt;br /&gt;
&lt;br /&gt;
Последняя команда может потребовать привелегий суперпользователя, если Вы не последовали предыдущему совету разрешить себе права на запись в /opt/deeptown.&lt;br /&gt;
&lt;br /&gt;
Чтобы убедиться, что Ваша система поддерживается, наберите команду&lt;br /&gt;
 dpmake_config --platform&lt;br /&gt;
&lt;br /&gt;
Эта команда выведет имя платформы, состоящее из названия ОС, архитектуры процессора и версии libc. На данный момент Deeptown SDK поддерживает следующие платформы:&lt;br /&gt;
* linux-i686-libc6&lt;br /&gt;
* linux-x86_64-libc6&lt;br /&gt;
&lt;br /&gt;
Если предыдущая команда вывела одну из указанных в списке платформ - все нормально, Вы можете продолжать установку.&lt;br /&gt;
&lt;br /&gt;
В противном случае, Вы можете попробовать одно из следующих действий:&lt;br /&gt;
* указать платформу вручную, передавая команде dpmake параметр ''--platform=имя_платформы_из_списка'';&lt;br /&gt;
* [[Обратная связь|Написать нам]] просьбу собрать Deeptown SDK для Вашей платформы. Мы постараемся сделать это как можно скорее; это не должно занять больше недели времени (в зависимости от занятости разработчиков).&lt;br /&gt;
&lt;br /&gt;
=== Установка пакетов ===&lt;br /&gt;
&lt;br /&gt;
Для установки пакетов служит команда&lt;br /&gt;
 dpmake binpkg имя_пакета&lt;br /&gt;
&lt;br /&gt;
Она автоматически загружает требуемый пакет с сервера и распаковывает его.&lt;br /&gt;
&lt;br /&gt;
Полный список пакетов в настоящее время выглядит так:&lt;br /&gt;
&lt;br /&gt;
* osa&lt;br /&gt;
* dptools&lt;br /&gt;
* bxl&lt;br /&gt;
* dpkernel&lt;br /&gt;
* deeptown &lt;br /&gt;
** diss&lt;br /&gt;
** gide&lt;br /&gt;
** mein&lt;br /&gt;
** network&lt;br /&gt;
** security&lt;br /&gt;
** servers&lt;br /&gt;
** startup&lt;br /&gt;
** stream&lt;br /&gt;
** tinyftpd&lt;br /&gt;
** utils&lt;br /&gt;
*** kpp_compiler&lt;br /&gt;
*** graphics_config&lt;br /&gt;
** world&lt;br /&gt;
&lt;br /&gt;
'''Примечание''': Пакеты '''deeptown''' и '''utils''' являются т. н. ''метапакетами'', содержащими все пакеты уровнем ниже. Таким образом, при установке пакета utils, будут установлены пакеты kpp_compiler и graphics_config; а при установке пакета deeptown — все пакеты от diss до world включительно.&lt;br /&gt;
&lt;br /&gt;
Более подробно почитать о назначении пакетов можно здесь: [[Описание установочных пакетов]].&lt;br /&gt;
&lt;br /&gt;
=== Завершение установки ===&lt;br /&gt;
&lt;br /&gt;
Наконец, для использования SDK, требуется выполнить следующие действия.&lt;br /&gt;
&lt;br /&gt;
Прежде всего необходимо установить файлы данных, с которыми будут работать программы из SDK. Подробное описание этих файлов и их форматов можно найти в соответствующей документации.&lt;br /&gt;
&lt;br /&gt;
Последнюю версию медиаданных всегда можно найти в форматах [http://dao.deeptown.org/release/all/media.rar rar] или [http://dao.deeptown.org/release/all/media.tar.bz2 tar.bz2]. Загрузите и распакуйте этот архив в любое удобное для Вас место на диске.&lt;br /&gt;
&lt;br /&gt;
При этом необходимо учесть следующие моменты:&lt;br /&gt;
* программам будет требоваться доступ на запись в пределах этой директории;&lt;br /&gt;
* многое из того, что Вы будете создавать с использованием Deeptown SDK, будет сохраняться в рамках этой директории. Поэтому, когда загружаете новую версию media, не удаляйте старую, а распаковывайте файлы поверх предыдущих.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- После того, как директория media распакована, нужно перейти в нее, скопировать файл config.dsh.sample в файл config.dsh, и отредактировать его в соответствии со своими нуждами. В файле приводятся подробные комментарии ко всем опциям. За более подробной информацией я опять же отсылаю Вас к соответствующей документации. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И самое последнее, что необходимо сделать — это определить три переменные среды, которые используются для поиска необходимых файлов:&lt;br /&gt;
* DEEPTOWN_LIBRARY = /opt/deeptown/lib — путь к плагинам;&lt;br /&gt;
* DEEPTOWN_MEDIA — путь к директории media, про которую шла речь выше;&lt;br /&gt;
* DEEPTOWN_CONFIG = /opt/deeptown/etc/deeptown — путь к файлам конфигурации.&lt;br /&gt;
&lt;br /&gt;
Для того же bash соответствующие строки в .bash_profile будут выглядеть следующим образом:&lt;br /&gt;
 export DEEPTOWN_LIBRARY=&amp;quot;/opt/deeptown/lib&amp;quot;&lt;br /&gt;
 export DEEPTOWN_CONFIG=&amp;quot;/opt/deeptown/etc/deeptown&amp;quot;&lt;br /&gt;
 export DEEPTOWN_MEDIA=&amp;quot;/home/user/deeptown/media&amp;quot;   # замените на свой путь!&lt;br /&gt;
&lt;br /&gt;
=== Быстрый старт использования компилятора K++ ===&lt;br /&gt;
&lt;br /&gt;
Текущий пользователь — user.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 1. Создаем /opt/deeptown и устанавливаем права:&lt;br /&gt;
sudo mkdir /opt/deeptown&lt;br /&gt;
sudo chown user:user /opt/deeptown&lt;br /&gt;
&lt;br /&gt;
# 2. Устанавливаем dpmake&lt;br /&gt;
cd ~&lt;br /&gt;
wget http://dao.deeptown.org/release/all/dpmake.tbz2&lt;br /&gt;
tar -jxf dpmake.tbz2&lt;br /&gt;
cd dpmake&lt;br /&gt;
./build&lt;br /&gt;
make install&lt;br /&gt;
&lt;br /&gt;
# 3. Прописываем необходимые переменные среды&lt;br /&gt;
cd ~&lt;br /&gt;
echo 'export PATH=&amp;quot;/opt/deeptown/bin:$PATH&amp;quot;' &amp;gt;&amp;gt; .bash_profile&lt;br /&gt;
echo 'export DEEPTOWN_LIBRARY=&amp;quot;/opt/deeptown/lib&amp;quot;' &amp;gt;&amp;gt; .bash_profile&lt;br /&gt;
echo 'export DEEPTOWN_CONFIG=&amp;quot;/opt/deeptown/etc/deeptown&amp;quot;' &amp;gt;&amp;gt; .bash_profile&lt;br /&gt;
echo 'export DEEPTOWN_MEDIA=&amp;quot;/home/user/deeptown/media&amp;quot;' &amp;gt;&amp;gt; .bash_profile&lt;br /&gt;
. .bash_profile&lt;br /&gt;
&lt;br /&gt;
# 4. Устанавливаем необходимые пакеты&lt;br /&gt;
dpmake binpkg osa&lt;br /&gt;
dpmake binpkg bxl&lt;br /&gt;
dpmake binpkg dpkernel&lt;br /&gt;
dpmake binpkg gide&lt;br /&gt;
dpmake binpkg kpp_compiler&lt;br /&gt;
&lt;br /&gt;
# 5. Распаковываем media&lt;br /&gt;
cd ~&lt;br /&gt;
mkdir -p deeptown/media&lt;br /&gt;
cd deeptown/media&lt;br /&gt;
wget http://dao.deeptown.org/release/all/media.rar&lt;br /&gt;
rar x media.rar&lt;br /&gt;
&lt;br /&gt;
# 6. Используем&lt;br /&gt;
cd ~&lt;br /&gt;
echo 'export function main() { puts(&amp;quot;Hello, world!\n&amp;quot;); }' &amp;gt; test.kpp&lt;br /&gt;
kpp -e test.kpp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустите kpp без параметров, чтобы получить полный список поддерживаемых опций.&lt;br /&gt;
&lt;br /&gt;
== Установка SDK на ОС Windows ==&lt;br /&gt;
&lt;br /&gt;
На ОС Windows все гораздо проще: мы подготовили программу-инсталлятор, которая все сделает сама.&lt;br /&gt;
&lt;br /&gt;
Скачать инсталлятор можно по адресу [http://dao.deeptown.org/release/windows-x86/deep_sdk_win32.exe deep_sdk_win32.exe].&lt;br /&gt;
&lt;br /&gt;
Обращаем Ваше внимание на то, что при первом запуске требуется подождать некоторое время, пока идет индексация содержимого. При последующих запусках ждать будет не нужно.&lt;br /&gt;
&lt;br /&gt;
=== Примечания ===&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что устанавливаемый файл &amp;lt;tt&amp;gt;kpp.exe&amp;lt;/tt&amp;gt; является консольной утилитой. Его нужно запускать из командной строки. Для получения списка возможных параметров, наберите &amp;lt;tt&amp;gt;kpp -h&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Что дальше? ==&lt;br /&gt;
&lt;br /&gt;
Дальше, если все прошло успешно, вы можете обратиться к странице &amp;quot;[[с чего начать]]&amp;quot;, где вкратце описано что и как можно делать.&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0_%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%B4%D0%B0</id>
		<title>Правила оформления кода</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0_%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%B4%D0%B0"/>
				<updated>2008-06-10T18:26:15Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Комментарий в начале файла */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Введение ==&lt;br /&gt;
&lt;br /&gt;
На этой странице описаны правила оформления кода для библиотек и прикладных программ проекта Deeptown. Соблюдение этих правил не менее важно, чем качество кода: это повышает читаемость кода другими людьми. Несоблюдение этих правил может стать причиной отказа в принятии кода.&lt;br /&gt;
&lt;br /&gt;
Конечно, из любых правил есть исключения, и никто не требует следовать этим правилам до буквы. Но практика показывает, что код, оформленный в едином стиле, легче читается и понимается людьми, занятыми в проекте. В отличие от многих других проектов, наши правила - не очень строгие, и в них обозначены только самые базовые вещи.&lt;br /&gt;
&lt;br /&gt;
В первом разделе приводятся общие правила для всех языков программирования и разметки; в последующих разделах они конкретизируются для различных языков.&lt;br /&gt;
&lt;br /&gt;
== Общие правила ==&lt;br /&gt;
&lt;br /&gt;
=== Язык и кодировка ===&lt;br /&gt;
&lt;br /&gt;
Для кода програм следует использовать только английский язык. Все имена в программе и комментарии к ней должны быть составлены на ангийском. Использование транслита в именах строго запрещено. Помните, что Ваш код могут читать не только русские.&lt;br /&gt;
&lt;br /&gt;
Для интернациональных символов в проекте используется кодировка UTF-8. Вы можете использовать строки на русском и других языках прямо в коде программ - для этого нужно сохранить исходный код программы в кодировке UTF-8. Но помните, что это является плохим стилем: в хорошей программе, все интернациональные сообщения находятся в файлах данных.&lt;br /&gt;
&lt;br /&gt;
=== Подход к написанию кода ===&lt;br /&gt;
&lt;br /&gt;
Самое главное правило: код должен быть легкочитаем и красив.&lt;br /&gt;
&lt;br /&gt;
Диптаун - это очень большой проект, состоящий из множества модулей. Эти модули завязаны друг на друга, и правильное функционирование одних невозможно без других. Поэтому мы не приемлем write-only код.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы код получался красивым, прежде всего нужен творческий подход к его написанию. Поэтому мы не приводим каких-либо формальных правил по этому вопросу. Спорные ситуации будут решаться в дискуссиях.&lt;br /&gt;
&lt;br /&gt;
Очень советуем прочитать статью про [http://ru.wikipedia.org/wiki/%D0%90%D0%BD%D1%82%D0%B8-%D0%BF%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD анти-паттерны] в википедии.&lt;br /&gt;
&lt;br /&gt;
=== Комментарии ===&lt;br /&gt;
&lt;br /&gt;
Код должен быть откомментирован так, чтобы обеспечить его читаемость, но и не должен быть перегружен комментариями.&lt;br /&gt;
&lt;br /&gt;
Обычно для выполнения этого условия достаточно написать небольшие пояснения к каждому классу и методу в этом классе.&lt;br /&gt;
&lt;br /&gt;
Комментарии должны объяснять, '''как''' работает код, но не '''что''' он делает. Ответ на второй вопрос должен содержаться в документации, а не в коде; мы не используем в проекте системы вроде doxygen для создания документации из кода, поскольку убеждены, что документация в коде загромождает этот код и делает его трудночитаемым.&lt;br /&gt;
&lt;br /&gt;
Кроме того, '''все комментарии должны быть на английском языке'''. У этого правила несколько причин, самые главные из которых - возможность чтения кода иностранцами и в любом редакторе. Комментарии транслитом также не допускаются.&lt;br /&gt;
&lt;br /&gt;
=== Комментарий в начале файла ===&lt;br /&gt;
&lt;br /&gt;
В начале каждого исходного файла должна содержаться следующая информация:&lt;br /&gt;
&lt;br /&gt;
 //&lt;br /&gt;
 // project : &amp;lt;project name&amp;gt;&lt;br /&gt;
 // date    : &amp;lt;current date&amp;gt;&lt;br /&gt;
 // author  : &amp;lt;author name&amp;gt;&lt;br /&gt;
 // e-mail  : &amp;lt;author email&amp;gt;&lt;br /&gt;
 // licence : &amp;lt;licence name&amp;gt;&lt;br /&gt;
 //&lt;br /&gt;
&lt;br /&gt;
Имя проекта - это название задания в списке задач, переведенное на английский язык, например, - '''console programs'''. Дата - текущая дата в формате yyyy-mm-dd. Имя автора записывается в форме '''Имя Фамилия''' (также по-английски), например: '''Vasily Petrov''' (но не Petrov Vasily). E-mail - это актуальный адрес автора, который может быть использован для писем по вопросам работоспособности данного кода.&lt;br /&gt;
&lt;br /&gt;
Лицензия - это либо название одной из применяемых в проекте лицензий ('''MIT''', '''LGPL''' etc), либо имя файла с лицензией. Персональные лицензии должны храниться в файлах, содержащих имя автора в имени файла, например '''licence-petrov-vasily.txt'''. Все такие лицензии будут добавлены в репозиторий с кодом.&lt;br /&gt;
&lt;br /&gt;
После этого комментария может идти текст лицензии или какие-либо лицензионные предупреждения (некоторые лицензии это требуют). Но такой текст должен идти ПОСЛЕ заголовка, а не до него.&lt;br /&gt;
&lt;br /&gt;
Поля author и e-mail могут быть записаны несколько раз, в случае если авторов/адресов несколько.&lt;br /&gt;
&lt;br /&gt;
Строгость формата заголовка нужна в частности для того, чтобы можно было писать скрипты, собирающие статистику. Например, это будет использоваться скриптами, которые будут анализировать объемы работ различных авторов.&lt;br /&gt;
&lt;br /&gt;
Пример заголовочного комментария:&lt;br /&gt;
&lt;br /&gt;
 //&lt;br /&gt;
 // project : mysql database driver&lt;br /&gt;
 // date    : 2008-11-30&lt;br /&gt;
 // author  : Ivan Ivanov&lt;br /&gt;
 // e-mail  : ivan.ivanov@example.com&lt;br /&gt;
 // licence : MIT&lt;br /&gt;
 //&lt;br /&gt;
&lt;br /&gt;
=== Отступы в коде ===&lt;br /&gt;
&lt;br /&gt;
Прежде всего, в качестве отступов нельзя использовать символы табуляции. Они по-разному отображаются в различных программах просмотра/редакторах, что затрудняет чтение кода. В качестве отступов следует использовать четыре символа &amp;quot;пробел&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Использование операторных скобок { } ===&lt;br /&gt;
&lt;br /&gt;
Все операторные скобки ставятся на новой строке; к коду, заключенному в &lt;br /&gt;
операторные скобки, добавляется один отступ. Код начинается со следующей &lt;br /&gt;
после открывающей скобки строки. Исключение делается для конструкций, где &lt;br /&gt;
тело операторных скобок состоит из не более чем 10 строк. В этом случае &lt;br /&gt;
допускается открывающую операторную скобку поставить на ту же строку, что и &lt;br /&gt;
&amp;quot;породивший&amp;quot; ее оператор:&lt;br /&gt;
&lt;br /&gt;
 while(...) {&lt;br /&gt;
     // some stuff&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Кроме того, специальное исключение делается для конструкции if ... else:&lt;br /&gt;
&lt;br /&gt;
 if(...) {&lt;br /&gt;
     // stuff...&lt;br /&gt;
 } else {&lt;br /&gt;
     // more stuff...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Исключение также применимо только для не слишком длинных конструкций.&lt;br /&gt;
&lt;br /&gt;
== Правила для K++ кода ==&lt;br /&gt;
&lt;br /&gt;
=== Правила именования ===&lt;br /&gt;
&lt;br /&gt;
(жирным отмечены обязательные правила, остальные - желательны, но не обязательны).&lt;br /&gt;
&lt;br /&gt;
# '''Модули именуются в стиле MyModuleName''';&lt;br /&gt;
# '''Имена файлов в точности совпадают с именами модулей'''. Например, модуль Proto::HTTP должен находиться в файле Proto/HTTP.kpp;&lt;br /&gt;
# '''Классы именуются в стиле MyClassName''', без каких-либо префиксов;&lt;br /&gt;
# '''Публичные методы и свойства именуются в стиле someMethodName''';&lt;br /&gt;
# '''Аргументы функций именуются в стиле argument_name''';&lt;br /&gt;
# '''Все публичные имена должны быть говорящими, желательно без сокращений, но при этом не слишком длинными'''. Примерное ограничение по длине имени - 20 символов;&lt;br /&gt;
# Приватные методы и свойства именуются аналогично публичным;&lt;br /&gt;
# Локальные переменные именуются в стиле variable_name (все буквы - строчные, символы подчеркивания между словами);&lt;br /&gt;
# Поля класса именуются аналогично локальным переменным, но с префиксом '''m_'''. &lt;br /&gt;
&lt;br /&gt;
Такой подход к именованию имеет множество плюсов. В нем практически не используются префиксы (которые обычно надоедают), но при этом стиль написания имен классов, методов и переменных различается, что облегчает читаемость кода.&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что мы требуем выполнения правил по именованию публичных частей модуля, но по именам &amp;quot;внутренней кухни&amp;quot; даем лишь рекомендации. Это сделано для обеспечения единобразия интерфейсов.&lt;br /&gt;
&lt;br /&gt;
== Правила для C++ кода ==&lt;br /&gt;
&lt;br /&gt;
Этот раздел скопирован из стандарта кода самого Диптауна. Возможно, некоторым не понравится такой стиль, но так уж исторически сложилось. Если возражений будет слишком много - мы напишем скрипт, который сконвертирует один стиль в другой. Но делать это будем централизованно. Сейчас в проекте принят такой стиль, и холивары по этому поводу очень нежелательны.&lt;br /&gt;
&lt;br /&gt;
=== Переносимость кода ===&lt;br /&gt;
&lt;br /&gt;
Весь код проекта должен компилироваться, собираться и работать на любой &lt;br /&gt;
системе, будь то Windows, Mac, UNIX, Solaris и другие. Использование &lt;br /&gt;
библиотек также ограничено лишь лицензионными соглашениями и переносимостью &lt;br /&gt;
их на другие системы. В некоторых случаях допускаются исключения: код может &lt;br /&gt;
быть написан в нескольких вариантах для разных систем. Но в конечном итоге, &lt;br /&gt;
должна быть возможность сборки кода на любой системе.&lt;br /&gt;
&lt;br /&gt;
=== Схемы разыменовывания ===&lt;br /&gt;
&lt;br /&gt;
Далее по тексту используются следующие определения для имен различных &lt;br /&gt;
объектов:&lt;br /&gt;
* ''произвольная'' - объект может быть назван произвольно.&lt;br /&gt;
* ''прописная слитная'' - объект должен быть назван прописными буквами, слова не должны отделяться друг от друга. Например, OBJECTNAME.&lt;br /&gt;
* ''прописная [раздельная]'' - объект должен быть назван прописными буквами, слова отделяются друг от друга знаком подчеркивания: OBJECT_NAME.&lt;br /&gt;
* ''строчная слитная'', ''строчная [раздельная]'' - аналогично: objectname и object_name соответственно.&lt;br /&gt;
* ''основная'' - название должно начинаться с прописной буквы, и каждое слово должно начинаться с прописной буквы. Остальные буквы - строчные: ObjectName.&lt;br /&gt;
&lt;br /&gt;
=== Файловая структура верхнего уровня ===&lt;br /&gt;
&lt;br /&gt;
Весь код проекта представляет собой дерево подпроектов. Каждый подпроект - это&lt;br /&gt;
логически завершенный модуль, который может либо сам состоять из подпроектов;&lt;br /&gt;
либо компилироваться в программу, статическую или динамическую библиотеку или&lt;br /&gt;
скрипт; либо, наконец, содержать в себе и то, и другое. Подпроекты именуются по&lt;br /&gt;
строчной (иногда раздельной) схеме именования и располагаются в каталогах,&lt;br /&gt;
соответствующих их именам.&lt;br /&gt;
&lt;br /&gt;
Таким образом, за каждым подпроектом закрепляется его уникальный идентификатор -&lt;br /&gt;
это путь к подпроекту относительно корневого каталога проекта.&lt;br /&gt;
&lt;br /&gt;
=== Разыменовывание файлов ===&lt;br /&gt;
&lt;br /&gt;
Все файлы модуля должны быть названы по строчной схеме именования. Исключение&lt;br /&gt;
составляют лишь исходные файлы, в которых находятся реализации некоторых классах&lt;br /&gt;
- они в точности соответствуют именам классов. Об этом будет сказано далее.&lt;br /&gt;
&lt;br /&gt;
=== Разбиение файлов по каталогам ===&lt;br /&gt;
&lt;br /&gt;
Все файлы модуля разбиваются по каталогам следующим образом:&lt;br /&gt;
* все публичные включаемые файлы должны находиться в корневом каталоге модуля;&lt;br /&gt;
* все внутренние включаемые файлы должны находиться в подкаталоге ''impl'';&lt;br /&gt;
* все исходные файлы должны находиться в каталоге ''source''.&lt;br /&gt;
&lt;br /&gt;
=== Разбиение функций и классов по файлам ===&lt;br /&gt;
&lt;br /&gt;
Внутри каждого модуля или его части, функции и классы разбиваются на &lt;br /&gt;
внутренние - используемые только данным модулем, и публичные - экспортируемые &lt;br /&gt;
модулем для &amp;quot;внешнего мира&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Все публичные функции и классы должны быть вынесены в один или несколько &lt;br /&gt;
заголовочных файлов. На разбиение по файлам ограничений не накладывается.&lt;br /&gt;
&lt;br /&gt;
Внутренние функции и классы не должны быть объявлены в публичных заголовочных &lt;br /&gt;
файлах, и никоим образом не должны быть доступны для &amp;quot;внешнего мира&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Реализация каждого класса должна быть вынесена в отдельный исходный файл, имя &lt;br /&gt;
которого совпадает с именем класса.&lt;br /&gt;
&lt;br /&gt;
На разбиение реализаций отдельных функций по файлам ограничений не &lt;br /&gt;
накладывается.&lt;br /&gt;
&lt;br /&gt;
=== Пространства имен ===&lt;br /&gt;
&lt;br /&gt;
Все объявления каждого модуля должны быть внесены в отдельное пространство имен (namespace),&lt;br /&gt;
имя которого совпадает с именем модуля, записанного по основной схеме разыменовывания.&lt;br /&gt;
&lt;br /&gt;
=== Стражи включения ===&lt;br /&gt;
&lt;br /&gt;
Все файлы заголовков должны быть защищены стражем включения. Имя стража &lt;br /&gt;
включения дается следующему шаблону: __PRFX_FILENAME_H_INCLUDED.&lt;br /&gt;
&lt;br /&gt;
Здесь PRFX - префикс модуля и его части (см. п. 4.1), FILENAME - имя &lt;br /&gt;
заголовочного файла, записанное прописными буквами.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
 #ifndef __SEST_INDEXBUFFER_H_INCLUDED&lt;br /&gt;
 #define __SEST_INDEXBUFFER_H_INCLUDED&lt;br /&gt;
 // ...&lt;br /&gt;
 // ...&lt;br /&gt;
 #endif&lt;br /&gt;
 // EOF&lt;br /&gt;
&lt;br /&gt;
=== Правила именования сущностей ===&lt;br /&gt;
&lt;br /&gt;
Применяются следующие правила разыменовывания:&lt;br /&gt;
&lt;br /&gt;
* Определения препроцессора именуются по прописной схеме. Кроме того, для всех определений препроцессора ставится два префикса. Первый соответствует модулю и его части (4 символа), второй - смыслу определения. Префиксы отделяются друг от друга и от имени знаком подчеркивания. Пример: '''SEST_IBS_LOADED''' (Soung Engine, STreaming module; Index Buffer State).&lt;br /&gt;
* Интерфейсы (классы, в которых все методы - абстрактные) именуются по стандартной схеме, ставится префикс '''I''' (ISomeName).&lt;br /&gt;
* Классы именуются по стандартной схеме, ставится префикс '''C''' (CClassName).&lt;br /&gt;
* Структуры именуются по стандартной схеме (StructName).&lt;br /&gt;
* Функции и методы классов также именуются по стандартной схеме.&lt;br /&gt;
* Закрытые поля и локальные переменные именуются произвольно.&lt;br /&gt;
* Публичные поля классов и аргументы функций именуются по следующей схеме: имя переменной записываеися по основной схеме; добавляется префикс, соответствующий типу переменной (pszIndexName). К публичным полям класса также добавляется префикс m_ (m_pszIndexName).&lt;br /&gt;
&lt;br /&gt;
Префиксы для стандартных типов:&lt;br /&gt;
* [unsigned] int: i, u, n&lt;br /&gt;
* unsigned char, byte: b&lt;br /&gt;
* char: c&lt;br /&gt;
* char*, char[] (в смысле строки): sz&lt;br /&gt;
* [unsigned] short, word: w&lt;br /&gt;
* dword: dw&lt;br /&gt;
* qword: qw&lt;br /&gt;
* любой указатель: p&lt;br /&gt;
&lt;br /&gt;
Для нестандартных типов, префикс выбирается в соответствии с именем типа. &lt;br /&gt;
Длина префикса - от одного до двух символов.&lt;br /&gt;
&lt;br /&gt;
Кроме того:&lt;br /&gt;
# Публичные имена следует давать осмысленными - из имени должно быть ясно, зачем нужна переменная (функция, ...).&lt;br /&gt;
# Предпочтительный диапазон длины имени - от 4 до 20 символов.&lt;br /&gt;
# Предпочтительное количество слов, из которых составлено имя - от 1 до 3.&lt;br /&gt;
# Имена в объявлении класса не должны содержать имя класса. Например, в объявлении класса CFile не должно быть поля m_dwFileSize; следует использовать имя m_dwSize.&lt;br /&gt;
&lt;br /&gt;
=== Правила оформления операторов ===&lt;br /&gt;
&lt;br /&gt;
Для оформления операторов применяются следующие правила:&lt;br /&gt;
&lt;br /&gt;
# Каждому оператору выделяется новая строка.&lt;br /&gt;
# Круглые скобки не выделяются пробелами.&lt;br /&gt;
# Максимальная длина строки - 80 символов. Если требуется больше, остаток оператора переносится на следующую строку, к нему (остатку) добавляется дополнительный отступ.&lt;br /&gt;
# Если тело оператора if или цикла состоит из одного оператора, операторные скобки не ставятся, а оператор записывается с новой строки с дополнительным отступом.&lt;br /&gt;
# На использование пробелов ограничений не накладывается.&lt;br /&gt;
&lt;br /&gt;
=== Запрещенные конструкции ===&lt;br /&gt;
&lt;br /&gt;
Запрещается использование оператора goto. Единственное исключение - выход из циклов с несколькими уровнями вложенности.&lt;br /&gt;
&lt;br /&gt;
Конструкцию do { ... } while(...); крайне не рекомендуется использовать, особенно если тело цикла больше 10 строк.&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0_%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%B4%D0%B0</id>
		<title>Правила оформления кода</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0_%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%B4%D0%B0"/>
				<updated>2008-06-10T18:03:28Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Правила именования сущностей */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Введение ==&lt;br /&gt;
&lt;br /&gt;
На этой странице описаны правила оформления кода для библиотек и прикладных программ проекта Deeptown. Соблюдение этих правил не менее важно, чем качество кода: это повышает читаемость кода другими людьми. Несоблюдение этих правил может стать причиной отказа в принятии кода.&lt;br /&gt;
&lt;br /&gt;
Конечно, из любых правил есть исключения, и никто не требует следовать этим правилам до буквы. Но практика показывает, что код, оформленный в едином стиле, легче читается и понимается людьми, занятыми в проекте. В отличие от многих других проектов, наши правила - не очень строгие, и в них обозначены только самые базовые вещи.&lt;br /&gt;
&lt;br /&gt;
В первом разделе приводятся общие правила для всех языков программирования и разметки; в последующих разделах они конкретизируются для различных языков.&lt;br /&gt;
&lt;br /&gt;
== Общие правила ==&lt;br /&gt;
&lt;br /&gt;
=== Язык и кодировка ===&lt;br /&gt;
&lt;br /&gt;
Для кода програм следует использовать только английский язык. Все имена в программе и комментарии к ней должны быть составлены на ангийском. Использование транслита в именах строго запрещено. Помните, что Ваш код могут читать не только русские.&lt;br /&gt;
&lt;br /&gt;
Для интернациональных символов в проекте используется кодировка UTF-8. Вы можете использовать строки на русском и других языках прямо в коде программ - для этого нужно сохранить исходный код программы в кодировке UTF-8. Но помните, что это является плохим стилем: в хорошей программе, все интернациональные сообщения находятся в файлах данных.&lt;br /&gt;
&lt;br /&gt;
=== Подход к написанию кода ===&lt;br /&gt;
&lt;br /&gt;
Самое главное правило: код должен быть легкочитаем и красив.&lt;br /&gt;
&lt;br /&gt;
Диптаун - это очень большой проект, состоящий из множества модулей. Эти модули завязаны друг на друга, и правильное функционирование одних невозможно без других. Поэтому мы не приемлем write-only код.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы код получался красивым, прежде всего нужен творческий подход к его написанию. Поэтому мы не приводим каких-либо формальных правил по этому вопросу. Спорные ситуации будут решаться в дискуссиях.&lt;br /&gt;
&lt;br /&gt;
Очень советуем прочитать статью про [http://ru.wikipedia.org/wiki/%D0%90%D0%BD%D1%82%D0%B8-%D0%BF%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD анти-паттерны] в википедии.&lt;br /&gt;
&lt;br /&gt;
=== Комментарии ===&lt;br /&gt;
&lt;br /&gt;
Код должен быть откомментирован так, чтобы обеспечить его читаемость, но и не должен быть перегружен комментариями.&lt;br /&gt;
&lt;br /&gt;
Обычно для выполнения этого условия достаточно написать небольшие пояснения к каждому классу и методу в этом классе.&lt;br /&gt;
&lt;br /&gt;
Комментарии должны объяснять, '''как''' работает код, но не '''что''' он делает. Ответ на второй вопрос должен содержаться в документации, а не в коде; мы не используем в проекте системы вроде doxygen для создания документации из кода, поскольку убеждены, что документация в коде загромождает этот код и делает его трудночитаемым.&lt;br /&gt;
&lt;br /&gt;
Кроме того, '''все комментарии должны быть на английском языке'''. У этого правила несколько причин, самые главные из которых - возможность чтения кода иностранцами и в любом редакторе. Комментарии транслитом также не допускаются.&lt;br /&gt;
&lt;br /&gt;
=== Комментарий в начале файла ===&lt;br /&gt;
&lt;br /&gt;
В начале каждого исходного файла должна содержаться следующая информация:&lt;br /&gt;
&lt;br /&gt;
 //&lt;br /&gt;
 // project : &amp;lt;project name&amp;gt;&lt;br /&gt;
 // date    : &amp;lt;current date&amp;gt;&lt;br /&gt;
 // author  : &amp;lt;author name&amp;gt;&lt;br /&gt;
 // e-mail  : &amp;lt;author email&amp;gt;&lt;br /&gt;
 // licence : &amp;lt;licence name&amp;gt;&lt;br /&gt;
 //&lt;br /&gt;
&lt;br /&gt;
Имя проекта - это название задания в списке задач, переведенное на английский язык, например, - '''console programs'''. Дата - текущая дата в формате yyyy-mm-dd. Имя автора записывается в форме '''Имя Фамилия''' (также по-английски), например: '''Vasily Petrov''' (но не Petrov Vasily). E-mail - это актуальный адрес автора, который может быть использован для писем по вопросам работоспособности данного кода.&lt;br /&gt;
&lt;br /&gt;
Лицензия - это либо название одной из применяемых в проекте лицензий ('''MIT''', '''LGPL''' etc), либо имя файла с лицензией. Персональные лицензии должны храниться в файлах, содержащих имя автора в имени файла, например '''licence-petrov-vasily.txt'''. Все такие лицензии будут добавлены в репозиторий с кодом.&lt;br /&gt;
&lt;br /&gt;
После этого комментария может идти текст лицензии или какие-либо лицензионные предупреждения (некоторые лицензии это требуют). Но такой текст должен идти ПОСЛЕ заголовка, а не до него.&lt;br /&gt;
&lt;br /&gt;
Строгость формата заголовка нужна в частности для того, чтобы можно было писать скрипты, собирающие статистику. Например, это будет использоваться скриптами, которые будут анализировать объемы работ различных авторов.&lt;br /&gt;
&lt;br /&gt;
Пример заголовочного комментария:&lt;br /&gt;
&lt;br /&gt;
 //&lt;br /&gt;
 // project : mysql database driver&lt;br /&gt;
 // date    : 2008-11-30&lt;br /&gt;
 // author  : Ivan Ivanov&lt;br /&gt;
 // e-mail  : ivan.ivanov@example.com&lt;br /&gt;
 // licence : MIT&lt;br /&gt;
 //&lt;br /&gt;
&lt;br /&gt;
=== Отступы в коде ===&lt;br /&gt;
&lt;br /&gt;
Прежде всего, в качестве отступов нельзя использовать символы табуляции. Они по-разному отображаются в различных программах просмотра/редакторах, что затрудняет чтение кода. В качестве отступов следует использовать четыре символа &amp;quot;пробел&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Использование операторных скобок { } ===&lt;br /&gt;
&lt;br /&gt;
Все операторные скобки ставятся на новой строке; к коду, заключенному в &lt;br /&gt;
операторные скобки, добавляется один отступ. Код начинается со следующей &lt;br /&gt;
после открывающей скобки строки. Исключение делается для конструкций, где &lt;br /&gt;
тело операторных скобок состоит из не более чем 10 строк. В этом случае &lt;br /&gt;
допускается открывающую операторную скобку поставить на ту же строку, что и &lt;br /&gt;
&amp;quot;породивший&amp;quot; ее оператор:&lt;br /&gt;
&lt;br /&gt;
 while(...) {&lt;br /&gt;
     // some stuff&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Кроме того, специальное исключение делается для конструкции if ... else:&lt;br /&gt;
&lt;br /&gt;
 if(...) {&lt;br /&gt;
     // stuff...&lt;br /&gt;
 } else {&lt;br /&gt;
     // more stuff...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Исключение также применимо только для не слишком длинных конструкций.&lt;br /&gt;
&lt;br /&gt;
== Правила для K++ кода ==&lt;br /&gt;
&lt;br /&gt;
=== Правила именования ===&lt;br /&gt;
&lt;br /&gt;
(жирным отмечены обязательные правила, остальные - желательны, но не обязательны).&lt;br /&gt;
&lt;br /&gt;
# '''Модули именуются в стиле MyModuleName''';&lt;br /&gt;
# '''Имена файлов в точности совпадают с именами модулей'''. Например, модуль Proto::HTTP должен находиться в файле Proto/HTTP.kpp;&lt;br /&gt;
# '''Классы именуются в стиле MyClassName''', без каких-либо префиксов;&lt;br /&gt;
# '''Публичные методы и свойства именуются в стиле someMethodName''';&lt;br /&gt;
# '''Аргументы функций именуются в стиле argument_name''';&lt;br /&gt;
# '''Все публичные имена должны быть говорящими, желательно без сокращений, но при этом не слишком длинными'''. Примерное ограничение по длине имени - 20 символов;&lt;br /&gt;
# Приватные методы и свойства именуются аналогично публичным;&lt;br /&gt;
# Локальные переменные именуются в стиле variable_name (все буквы - строчные, символы подчеркивания между словами);&lt;br /&gt;
# Поля класса именуются аналогично локальным переменным, но с префиксом '''m_'''. &lt;br /&gt;
&lt;br /&gt;
Такой подход к именованию имеет множество плюсов. В нем практически не используются префиксы (которые обычно надоедают), но при этом стиль написания имен классов, методов и переменных различается, что облегчает читаемость кода.&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что мы требуем выполнения правил по именованию публичных частей модуля, но по именам &amp;quot;внутренней кухни&amp;quot; даем лишь рекомендации. Это сделано для обеспечения единобразия интерфейсов.&lt;br /&gt;
&lt;br /&gt;
== Правила для C++ кода ==&lt;br /&gt;
&lt;br /&gt;
Этот раздел скопирован из стандарта кода самого Диптауна. Возможно, некоторым не понравится такой стиль, но так уж исторически сложилось. Если возражений будет слишком много - мы напишем скрипт, который сконвертирует один стиль в другой. Но делать это будем централизованно. Сейчас в проекте принят такой стиль, и холивары по этому поводу очень нежелательны.&lt;br /&gt;
&lt;br /&gt;
=== Переносимость кода ===&lt;br /&gt;
&lt;br /&gt;
Весь код проекта должен компилироваться, собираться и работать на любой &lt;br /&gt;
системе, будь то Windows, Mac, UNIX, Solaris и другие. Использование &lt;br /&gt;
библиотек также ограничено лишь лицензионными соглашениями и переносимостью &lt;br /&gt;
их на другие системы. В некоторых случаях допускаются исключения: код может &lt;br /&gt;
быть написан в нескольких вариантах для разных систем. Но в конечном итоге, &lt;br /&gt;
должна быть возможность сборки кода на любой системе.&lt;br /&gt;
&lt;br /&gt;
=== Схемы разыменовывания ===&lt;br /&gt;
&lt;br /&gt;
Далее по тексту используются следующие определения для имен различных &lt;br /&gt;
объектов:&lt;br /&gt;
* ''произвольная'' - объект может быть назван произвольно.&lt;br /&gt;
* ''прописная слитная'' - объект должен быть назван прописными буквами, слова не должны отделяться друг от друга. Например, OBJECTNAME.&lt;br /&gt;
* ''прописная [раздельная]'' - объект должен быть назван прописными буквами, слова отделяются друг от друга знаком подчеркивания: OBJECT_NAME.&lt;br /&gt;
* ''строчная слитная'', ''строчная [раздельная]'' - аналогично: objectname и object_name соответственно.&lt;br /&gt;
* ''основная'' - название должно начинаться с прописной буквы, и каждое слово должно начинаться с прописной буквы. Остальные буквы - строчные: ObjectName.&lt;br /&gt;
&lt;br /&gt;
=== Файловая структура верхнего уровня ===&lt;br /&gt;
&lt;br /&gt;
Весь код проекта представляет собой дерево подпроектов. Каждый подпроект - это&lt;br /&gt;
логически завершенный модуль, который может либо сам состоять из подпроектов;&lt;br /&gt;
либо компилироваться в программу, статическую или динамическую библиотеку или&lt;br /&gt;
скрипт; либо, наконец, содержать в себе и то, и другое. Подпроекты именуются по&lt;br /&gt;
строчной (иногда раздельной) схеме именования и располагаются в каталогах,&lt;br /&gt;
соответствующих их именам.&lt;br /&gt;
&lt;br /&gt;
Таким образом, за каждым подпроектом закрепляется его уникальный идентификатор -&lt;br /&gt;
это путь к подпроекту относительно корневого каталога проекта.&lt;br /&gt;
&lt;br /&gt;
=== Разыменовывание файлов ===&lt;br /&gt;
&lt;br /&gt;
Все файлы модуля должны быть названы по строчной схеме именования. Исключение&lt;br /&gt;
составляют лишь исходные файлы, в которых находятся реализации некоторых классах&lt;br /&gt;
- они в точности соответствуют именам классов. Об этом будет сказано далее.&lt;br /&gt;
&lt;br /&gt;
=== Разбиение файлов по каталогам ===&lt;br /&gt;
&lt;br /&gt;
Все файлы модуля разбиваются по каталогам следующим образом:&lt;br /&gt;
* все публичные включаемые файлы должны находиться в корневом каталоге модуля;&lt;br /&gt;
* все внутренние включаемые файлы должны находиться в подкаталоге ''impl'';&lt;br /&gt;
* все исходные файлы должны находиться в каталоге ''source''.&lt;br /&gt;
&lt;br /&gt;
=== Разбиение функций и классов по файлам ===&lt;br /&gt;
&lt;br /&gt;
Внутри каждого модуля или его части, функции и классы разбиваются на &lt;br /&gt;
внутренние - используемые только данным модулем, и публичные - экспортируемые &lt;br /&gt;
модулем для &amp;quot;внешнего мира&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Все публичные функции и классы должны быть вынесены в один или несколько &lt;br /&gt;
заголовочных файлов. На разбиение по файлам ограничений не накладывается.&lt;br /&gt;
&lt;br /&gt;
Внутренние функции и классы не должны быть объявлены в публичных заголовочных &lt;br /&gt;
файлах, и никоим образом не должны быть доступны для &amp;quot;внешнего мира&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Реализация каждого класса должна быть вынесена в отдельный исходный файл, имя &lt;br /&gt;
которого совпадает с именем класса.&lt;br /&gt;
&lt;br /&gt;
На разбиение реализаций отдельных функций по файлам ограничений не &lt;br /&gt;
накладывается.&lt;br /&gt;
&lt;br /&gt;
=== Пространства имен ===&lt;br /&gt;
&lt;br /&gt;
Все объявления каждого модуля должны быть внесены в отдельное пространство имен (namespace),&lt;br /&gt;
имя которого совпадает с именем модуля, записанного по основной схеме разыменовывания.&lt;br /&gt;
&lt;br /&gt;
=== Стражи включения ===&lt;br /&gt;
&lt;br /&gt;
Все файлы заголовков должны быть защищены стражем включения. Имя стража &lt;br /&gt;
включения дается следующему шаблону: __PRFX_FILENAME_H_INCLUDED.&lt;br /&gt;
&lt;br /&gt;
Здесь PRFX - префикс модуля и его части (см. п. 4.1), FILENAME - имя &lt;br /&gt;
заголовочного файла, записанное прописными буквами.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
 #ifndef __SEST_INDEXBUFFER_H_INCLUDED&lt;br /&gt;
 #define __SEST_INDEXBUFFER_H_INCLUDED&lt;br /&gt;
 // ...&lt;br /&gt;
 // ...&lt;br /&gt;
 #endif&lt;br /&gt;
 // EOF&lt;br /&gt;
&lt;br /&gt;
=== Правила именования сущностей ===&lt;br /&gt;
&lt;br /&gt;
Применяются следующие правила разыменовывания:&lt;br /&gt;
&lt;br /&gt;
* Определения препроцессора именуются по прописной схеме. Кроме того, для всех определений препроцессора ставится два префикса. Первый соответствует модулю и его части (4 символа), второй - смыслу определения. Префиксы отделяются друг от друга и от имени знаком подчеркивания. Пример: '''SEST_IBS_LOADED''' (Soung Engine, STreaming module; Index Buffer State).&lt;br /&gt;
* Интерфейсы (классы, в которых все методы - абстрактные) именуются по стандартной схеме, ставится префикс '''I''' (ISomeName).&lt;br /&gt;
* Классы именуются по стандартной схеме, ставится префикс '''C''' (CClassName).&lt;br /&gt;
* Структуры именуются по стандартной схеме (StructName).&lt;br /&gt;
* Функции и методы классов также именуются по стандартной схеме.&lt;br /&gt;
* Закрытые поля и локальные переменные именуются произвольно.&lt;br /&gt;
* Публичные поля классов и аргументы функций именуются по следующей схеме: имя переменной записываеися по основной схеме; добавляется префикс, соответствующий типу переменной (pszIndexName). К публичным полям класса также добавляется префикс m_ (m_pszIndexName).&lt;br /&gt;
&lt;br /&gt;
Префиксы для стандартных типов:&lt;br /&gt;
* [unsigned] int: i, u, n&lt;br /&gt;
* unsigned char, byte: b&lt;br /&gt;
* char: c&lt;br /&gt;
* char*, char[] (в смысле строки): sz&lt;br /&gt;
* [unsigned] short, word: w&lt;br /&gt;
* dword: dw&lt;br /&gt;
* qword: qw&lt;br /&gt;
* любой указатель: p&lt;br /&gt;
&lt;br /&gt;
Для нестандартных типов, префикс выбирается в соответствии с именем типа. &lt;br /&gt;
Длина префикса - от одного до двух символов.&lt;br /&gt;
&lt;br /&gt;
Кроме того:&lt;br /&gt;
# Публичные имена следует давать осмысленными - из имени должно быть ясно, зачем нужна переменная (функция, ...).&lt;br /&gt;
# Предпочтительный диапазон длины имени - от 4 до 20 символов.&lt;br /&gt;
# Предпочтительное количество слов, из которых составлено имя - от 1 до 3.&lt;br /&gt;
# Имена в объявлении класса не должны содержать имя класса. Например, в объявлении класса CFile не должно быть поля m_dwFileSize; следует использовать имя m_dwSize.&lt;br /&gt;
&lt;br /&gt;
=== Правила оформления операторов ===&lt;br /&gt;
&lt;br /&gt;
Для оформления операторов применяются следующие правила:&lt;br /&gt;
&lt;br /&gt;
# Каждому оператору выделяется новая строка.&lt;br /&gt;
# Круглые скобки не выделяются пробелами.&lt;br /&gt;
# Максимальная длина строки - 80 символов. Если требуется больше, остаток оператора переносится на следующую строку, к нему (остатку) добавляется дополнительный отступ.&lt;br /&gt;
# Если тело оператора if или цикла состоит из одного оператора, операторные скобки не ставятся, а оператор записывается с новой строки с дополнительным отступом.&lt;br /&gt;
# На использование пробелов ограничений не накладывается.&lt;br /&gt;
&lt;br /&gt;
=== Запрещенные конструкции ===&lt;br /&gt;
&lt;br /&gt;
Запрещается использование оператора goto. Единственное исключение - выход из циклов с несколькими уровнями вложенности.&lt;br /&gt;
&lt;br /&gt;
Конструкцию do { ... } while(...); крайне не рекомендуется использовать, особенно если тело цикла больше 10 строк.&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0_%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%B4%D0%B0</id>
		<title>Правила оформления кода</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0_%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%B4%D0%B0"/>
				<updated>2008-06-10T18:00:01Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Правила именования */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Введение ==&lt;br /&gt;
&lt;br /&gt;
На этой странице описаны правила оформления кода для библиотек и прикладных программ проекта Deeptown. Соблюдение этих правил не менее важно, чем качество кода: это повышает читаемость кода другими людьми. Несоблюдение этих правил может стать причиной отказа в принятии кода.&lt;br /&gt;
&lt;br /&gt;
Конечно, из любых правил есть исключения, и никто не требует следовать этим правилам до буквы. Но практика показывает, что код, оформленный в едином стиле, легче читается и понимается людьми, занятыми в проекте. В отличие от многих других проектов, наши правила - не очень строгие, и в них обозначены только самые базовые вещи.&lt;br /&gt;
&lt;br /&gt;
В первом разделе приводятся общие правила для всех языков программирования и разметки; в последующих разделах они конкретизируются для различных языков.&lt;br /&gt;
&lt;br /&gt;
== Общие правила ==&lt;br /&gt;
&lt;br /&gt;
=== Язык и кодировка ===&lt;br /&gt;
&lt;br /&gt;
Для кода програм следует использовать только английский язык. Все имена в программе и комментарии к ней должны быть составлены на ангийском. Использование транслита в именах строго запрещено. Помните, что Ваш код могут читать не только русские.&lt;br /&gt;
&lt;br /&gt;
Для интернациональных символов в проекте используется кодировка UTF-8. Вы можете использовать строки на русском и других языках прямо в коде программ - для этого нужно сохранить исходный код программы в кодировке UTF-8. Но помните, что это является плохим стилем: в хорошей программе, все интернациональные сообщения находятся в файлах данных.&lt;br /&gt;
&lt;br /&gt;
=== Подход к написанию кода ===&lt;br /&gt;
&lt;br /&gt;
Самое главное правило: код должен быть легкочитаем и красив.&lt;br /&gt;
&lt;br /&gt;
Диптаун - это очень большой проект, состоящий из множества модулей. Эти модули завязаны друг на друга, и правильное функционирование одних невозможно без других. Поэтому мы не приемлем write-only код.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы код получался красивым, прежде всего нужен творческий подход к его написанию. Поэтому мы не приводим каких-либо формальных правил по этому вопросу. Спорные ситуации будут решаться в дискуссиях.&lt;br /&gt;
&lt;br /&gt;
Очень советуем прочитать статью про [http://ru.wikipedia.org/wiki/%D0%90%D0%BD%D1%82%D0%B8-%D0%BF%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD анти-паттерны] в википедии.&lt;br /&gt;
&lt;br /&gt;
=== Комментарии ===&lt;br /&gt;
&lt;br /&gt;
Код должен быть откомментирован так, чтобы обеспечить его читаемость, но и не должен быть перегружен комментариями.&lt;br /&gt;
&lt;br /&gt;
Обычно для выполнения этого условия достаточно написать небольшие пояснения к каждому классу и методу в этом классе.&lt;br /&gt;
&lt;br /&gt;
Комментарии должны объяснять, '''как''' работает код, но не '''что''' он делает. Ответ на второй вопрос должен содержаться в документации, а не в коде; мы не используем в проекте системы вроде doxygen для создания документации из кода, поскольку убеждены, что документация в коде загромождает этот код и делает его трудночитаемым.&lt;br /&gt;
&lt;br /&gt;
Кроме того, '''все комментарии должны быть на английском языке'''. У этого правила несколько причин, самые главные из которых - возможность чтения кода иностранцами и в любом редакторе. Комментарии транслитом также не допускаются.&lt;br /&gt;
&lt;br /&gt;
=== Комментарий в начале файла ===&lt;br /&gt;
&lt;br /&gt;
В начале каждого исходного файла должна содержаться следующая информация:&lt;br /&gt;
&lt;br /&gt;
 //&lt;br /&gt;
 // project : &amp;lt;project name&amp;gt;&lt;br /&gt;
 // date    : &amp;lt;current date&amp;gt;&lt;br /&gt;
 // author  : &amp;lt;author name&amp;gt;&lt;br /&gt;
 // e-mail  : &amp;lt;author email&amp;gt;&lt;br /&gt;
 // licence : &amp;lt;licence name&amp;gt;&lt;br /&gt;
 //&lt;br /&gt;
&lt;br /&gt;
Имя проекта - это название задания в списке задач, переведенное на английский язык, например, - '''console programs'''. Дата - текущая дата в формате yyyy-mm-dd. Имя автора записывается в форме '''Имя Фамилия''' (также по-английски), например: '''Vasily Petrov''' (но не Petrov Vasily). E-mail - это актуальный адрес автора, который может быть использован для писем по вопросам работоспособности данного кода.&lt;br /&gt;
&lt;br /&gt;
Лицензия - это либо название одной из применяемых в проекте лицензий ('''MIT''', '''LGPL''' etc), либо имя файла с лицензией. Персональные лицензии должны храниться в файлах, содержащих имя автора в имени файла, например '''licence-petrov-vasily.txt'''. Все такие лицензии будут добавлены в репозиторий с кодом.&lt;br /&gt;
&lt;br /&gt;
После этого комментария может идти текст лицензии или какие-либо лицензионные предупреждения (некоторые лицензии это требуют). Но такой текст должен идти ПОСЛЕ заголовка, а не до него.&lt;br /&gt;
&lt;br /&gt;
Строгость формата заголовка нужна в частности для того, чтобы можно было писать скрипты, собирающие статистику. Например, это будет использоваться скриптами, которые будут анализировать объемы работ различных авторов.&lt;br /&gt;
&lt;br /&gt;
Пример заголовочного комментария:&lt;br /&gt;
&lt;br /&gt;
 //&lt;br /&gt;
 // project : mysql database driver&lt;br /&gt;
 // date    : 2008-11-30&lt;br /&gt;
 // author  : Ivan Ivanov&lt;br /&gt;
 // e-mail  : ivan.ivanov@example.com&lt;br /&gt;
 // licence : MIT&lt;br /&gt;
 //&lt;br /&gt;
&lt;br /&gt;
=== Отступы в коде ===&lt;br /&gt;
&lt;br /&gt;
Прежде всего, в качестве отступов нельзя использовать символы табуляции. Они по-разному отображаются в различных программах просмотра/редакторах, что затрудняет чтение кода. В качестве отступов следует использовать четыре символа &amp;quot;пробел&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Использование операторных скобок { } ===&lt;br /&gt;
&lt;br /&gt;
Все операторные скобки ставятся на новой строке; к коду, заключенному в &lt;br /&gt;
операторные скобки, добавляется один отступ. Код начинается со следующей &lt;br /&gt;
после открывающей скобки строки. Исключение делается для конструкций, где &lt;br /&gt;
тело операторных скобок состоит из не более чем 10 строк. В этом случае &lt;br /&gt;
допускается открывающую операторную скобку поставить на ту же строку, что и &lt;br /&gt;
&amp;quot;породивший&amp;quot; ее оператор:&lt;br /&gt;
&lt;br /&gt;
 while(...) {&lt;br /&gt;
     // some stuff&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Кроме того, специальное исключение делается для конструкции if ... else:&lt;br /&gt;
&lt;br /&gt;
 if(...) {&lt;br /&gt;
     // stuff...&lt;br /&gt;
 } else {&lt;br /&gt;
     // more stuff...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Исключение также применимо только для не слишком длинных конструкций.&lt;br /&gt;
&lt;br /&gt;
== Правила для K++ кода ==&lt;br /&gt;
&lt;br /&gt;
=== Правила именования ===&lt;br /&gt;
&lt;br /&gt;
(жирным отмечены обязательные правила, остальные - желательны, но не обязательны).&lt;br /&gt;
&lt;br /&gt;
# '''Модули именуются в стиле MyModuleName''';&lt;br /&gt;
# '''Имена файлов в точности совпадают с именами модулей'''. Например, модуль Proto::HTTP должен находиться в файле Proto/HTTP.kpp;&lt;br /&gt;
# '''Классы именуются в стиле MyClassName''', без каких-либо префиксов;&lt;br /&gt;
# '''Публичные методы и свойства именуются в стиле someMethodName''';&lt;br /&gt;
# '''Аргументы функций именуются в стиле argument_name''';&lt;br /&gt;
# '''Все публичные имена должны быть говорящими, желательно без сокращений, но при этом не слишком длинными'''. Примерное ограничение по длине имени - 20 символов;&lt;br /&gt;
# Приватные методы и свойства именуются аналогично публичным;&lt;br /&gt;
# Локальные переменные именуются в стиле variable_name (все буквы - строчные, символы подчеркивания между словами);&lt;br /&gt;
# Поля класса именуются аналогично локальным переменным, но с префиксом '''m_'''. &lt;br /&gt;
&lt;br /&gt;
Такой подход к именованию имеет множество плюсов. В нем практически не используются префиксы (которые обычно надоедают), но при этом стиль написания имен классов, методов и переменных различается, что облегчает читаемость кода.&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что мы требуем выполнения правил по именованию публичных частей модуля, но по именам &amp;quot;внутренней кухни&amp;quot; даем лишь рекомендации. Это сделано для обеспечения единобразия интерфейсов.&lt;br /&gt;
&lt;br /&gt;
== Правила для C++ кода ==&lt;br /&gt;
&lt;br /&gt;
Этот раздел скопирован из стандарта кода самого Диптауна. Возможно, некоторым не понравится такой стиль, но так уж исторически сложилось. Если возражений будет слишком много - мы напишем скрипт, который сконвертирует один стиль в другой. Но делать это будем централизованно. Сейчас в проекте принят такой стиль, и холивары по этому поводу очень нежелательны.&lt;br /&gt;
&lt;br /&gt;
=== Переносимость кода ===&lt;br /&gt;
&lt;br /&gt;
Весь код проекта должен компилироваться, собираться и работать на любой &lt;br /&gt;
системе, будь то Windows, Mac, UNIX, Solaris и другие. Использование &lt;br /&gt;
библиотек также ограничено лишь лицензионными соглашениями и переносимостью &lt;br /&gt;
их на другие системы. В некоторых случаях допускаются исключения: код может &lt;br /&gt;
быть написан в нескольких вариантах для разных систем. Но в конечном итоге, &lt;br /&gt;
должна быть возможность сборки кода на любой системе.&lt;br /&gt;
&lt;br /&gt;
=== Схемы разыменовывания ===&lt;br /&gt;
&lt;br /&gt;
Далее по тексту используются следующие определения для имен различных &lt;br /&gt;
объектов:&lt;br /&gt;
* ''произвольная'' - объект может быть назван произвольно.&lt;br /&gt;
* ''прописная слитная'' - объект должен быть назван прописными буквами, слова не должны отделяться друг от друга. Например, OBJECTNAME.&lt;br /&gt;
* ''прописная [раздельная]'' - объект должен быть назван прописными буквами, слова отделяются друг от друга знаком подчеркивания: OBJECT_NAME.&lt;br /&gt;
* ''строчная слитная'', ''строчная [раздельная]'' - аналогично: objectname и object_name соответственно.&lt;br /&gt;
* ''основная'' - название должно начинаться с прописной буквы, и каждое слово должно начинаться с прописной буквы. Остальные буквы - строчные: ObjectName.&lt;br /&gt;
&lt;br /&gt;
=== Файловая структура верхнего уровня ===&lt;br /&gt;
&lt;br /&gt;
Весь код проекта представляет собой дерево подпроектов. Каждый подпроект - это&lt;br /&gt;
логически завершенный модуль, который может либо сам состоять из подпроектов;&lt;br /&gt;
либо компилироваться в программу, статическую или динамическую библиотеку или&lt;br /&gt;
скрипт; либо, наконец, содержать в себе и то, и другое. Подпроекты именуются по&lt;br /&gt;
строчной (иногда раздельной) схеме именования и располагаются в каталогах,&lt;br /&gt;
соответствующих их именам.&lt;br /&gt;
&lt;br /&gt;
Таким образом, за каждым подпроектом закрепляется его уникальный идентификатор -&lt;br /&gt;
это путь к подпроекту относительно корневого каталога проекта.&lt;br /&gt;
&lt;br /&gt;
=== Разыменовывание файлов ===&lt;br /&gt;
&lt;br /&gt;
Все файлы модуля должны быть названы по строчной схеме именования. Исключение&lt;br /&gt;
составляют лишь исходные файлы, в которых находятся реализации некоторых классах&lt;br /&gt;
- они в точности соответствуют именам классов. Об этом будет сказано далее.&lt;br /&gt;
&lt;br /&gt;
=== Разбиение файлов по каталогам ===&lt;br /&gt;
&lt;br /&gt;
Все файлы модуля разбиваются по каталогам следующим образом:&lt;br /&gt;
* все публичные включаемые файлы должны находиться в корневом каталоге модуля;&lt;br /&gt;
* все внутренние включаемые файлы должны находиться в подкаталоге ''impl'';&lt;br /&gt;
* все исходные файлы должны находиться в каталоге ''source''.&lt;br /&gt;
&lt;br /&gt;
=== Разбиение функций и классов по файлам ===&lt;br /&gt;
&lt;br /&gt;
Внутри каждого модуля или его части, функции и классы разбиваются на &lt;br /&gt;
внутренние - используемые только данным модулем, и публичные - экспортируемые &lt;br /&gt;
модулем для &amp;quot;внешнего мира&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Все публичные функции и классы должны быть вынесены в один или несколько &lt;br /&gt;
заголовочных файлов. На разбиение по файлам ограничений не накладывается.&lt;br /&gt;
&lt;br /&gt;
Внутренние функции и классы не должны быть объявлены в публичных заголовочных &lt;br /&gt;
файлах, и никоим образом не должны быть доступны для &amp;quot;внешнего мира&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Реализация каждого класса должна быть вынесена в отдельный исходный файл, имя &lt;br /&gt;
которого совпадает с именем класса.&lt;br /&gt;
&lt;br /&gt;
На разбиение реализаций отдельных функций по файлам ограничений не &lt;br /&gt;
накладывается.&lt;br /&gt;
&lt;br /&gt;
=== Пространства имен ===&lt;br /&gt;
&lt;br /&gt;
Все объявления каждого модуля должны быть внесены в отдельное пространство имен (namespace),&lt;br /&gt;
имя которого совпадает с именем модуля, записанного по основной схеме разыменовывания.&lt;br /&gt;
&lt;br /&gt;
=== Стражи включения ===&lt;br /&gt;
&lt;br /&gt;
Все файлы заголовков должны быть защищены стражем включения. Имя стража &lt;br /&gt;
включения дается следующему шаблону: __PRFX_FILENAME_H_INCLUDED.&lt;br /&gt;
&lt;br /&gt;
Здесь PRFX - префикс модуля и его части (см. п. 4.1), FILENAME - имя &lt;br /&gt;
заголовочного файла, записанное прописными буквами.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
 #ifndef __SEST_INDEXBUFFER_H_INCLUDED&lt;br /&gt;
 #define __SEST_INDEXBUFFER_H_INCLUDED&lt;br /&gt;
 // ...&lt;br /&gt;
 // ...&lt;br /&gt;
 #endif&lt;br /&gt;
 // EOF&lt;br /&gt;
&lt;br /&gt;
=== Правила именования сущностей ===&lt;br /&gt;
&lt;br /&gt;
Применяются следующие правила разыменовывания:&lt;br /&gt;
&lt;br /&gt;
* Определения препроцессора именуются по прописной схеме. Кроме того, для всех определений препроцессора ставится два префикса. Первый соответствует модулю и его части (4 символа), второй - смыслу определения. Префиксы отделяются друг от друга и от имени знаком подчеркивания. Пример: '''SEST_IBS_LOADED''' (Soung Engine, STreaming module; Index Buffer State).&lt;br /&gt;
* Классы именуются по стандартной схеме, ставится префикс '''C''' (CClassName).&lt;br /&gt;
* Структуры именуются по стандартной схеме (StructName).&lt;br /&gt;
* Функции и методы классов также именуются по стандартной схеме.&lt;br /&gt;
* Закрытые поля и локальные переменные именуются произвольно.&lt;br /&gt;
* Публичные поля классов и аргументы функций именуются по следующей схеме: имя переменной записываеися по основной схеме; добавляется префикс, соответствующий типу переменной (pszIndexName). К публичным полям класса также добавляется префикс m_ (m_pszIndexName).&lt;br /&gt;
&lt;br /&gt;
Префиксы для стандартных типов:&lt;br /&gt;
* [unsigned] int: i, u, n&lt;br /&gt;
* unsigned char, byte: b&lt;br /&gt;
* char: c&lt;br /&gt;
* char*, char[] (в смысле строки): sz&lt;br /&gt;
* [unsigned] short, word: w&lt;br /&gt;
* dword: dw&lt;br /&gt;
* qword: qw&lt;br /&gt;
* любой указатель: p&lt;br /&gt;
&lt;br /&gt;
Для нестандартных типов, префикс выбирается в соответствии с именем типа. &lt;br /&gt;
Длина префикса - от одного до двух символов.&lt;br /&gt;
&lt;br /&gt;
Кроме того:&lt;br /&gt;
# Публичные имена следует давать осмысленными - из имени должно быть ясно, зачем нужна переменная (функция, ...).&lt;br /&gt;
# Предпочтительный диапазон длины имени - от 4 до 20 символов.&lt;br /&gt;
# Предпочтительное количество слов, из которых составлено имя - от 1 до 3.&lt;br /&gt;
# Имена в объявлении класса не должны содержать имя класса. Например, в объявлении класса CFile не должно быть поля m_dwFileSize; следует использовать имя m_dwSize.&lt;br /&gt;
&lt;br /&gt;
=== Правила оформления операторов ===&lt;br /&gt;
&lt;br /&gt;
Для оформления операторов применяются следующие правила:&lt;br /&gt;
&lt;br /&gt;
# Каждому оператору выделяется новая строка.&lt;br /&gt;
# Круглые скобки не выделяются пробелами.&lt;br /&gt;
# Максимальная длина строки - 80 символов. Если требуется больше, остаток оператора переносится на следующую строку, к нему (остатку) добавляется дополнительный отступ.&lt;br /&gt;
# Если тело оператора if или цикла состоит из одного оператора, операторные скобки не ставятся, а оператор записывается с новой строки с дополнительным отступом.&lt;br /&gt;
# На использование пробелов ограничений не накладывается.&lt;br /&gt;
&lt;br /&gt;
=== Запрещенные конструкции ===&lt;br /&gt;
&lt;br /&gt;
Запрещается использование оператора goto. Единственное исключение - выход из циклов с несколькими уровнями вложенности.&lt;br /&gt;
&lt;br /&gt;
Конструкцию do { ... } while(...); крайне не рекомендуется использовать, особенно если тело цикла больше 10 строк.&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0_%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%B4%D0%B0</id>
		<title>Правила оформления кода</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0_%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%B4%D0%B0"/>
				<updated>2008-06-10T17:57:18Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Комментарий в начале файла */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Введение ==&lt;br /&gt;
&lt;br /&gt;
На этой странице описаны правила оформления кода для библиотек и прикладных программ проекта Deeptown. Соблюдение этих правил не менее важно, чем качество кода: это повышает читаемость кода другими людьми. Несоблюдение этих правил может стать причиной отказа в принятии кода.&lt;br /&gt;
&lt;br /&gt;
Конечно, из любых правил есть исключения, и никто не требует следовать этим правилам до буквы. Но практика показывает, что код, оформленный в едином стиле, легче читается и понимается людьми, занятыми в проекте. В отличие от многих других проектов, наши правила - не очень строгие, и в них обозначены только самые базовые вещи.&lt;br /&gt;
&lt;br /&gt;
В первом разделе приводятся общие правила для всех языков программирования и разметки; в последующих разделах они конкретизируются для различных языков.&lt;br /&gt;
&lt;br /&gt;
== Общие правила ==&lt;br /&gt;
&lt;br /&gt;
=== Язык и кодировка ===&lt;br /&gt;
&lt;br /&gt;
Для кода програм следует использовать только английский язык. Все имена в программе и комментарии к ней должны быть составлены на ангийском. Использование транслита в именах строго запрещено. Помните, что Ваш код могут читать не только русские.&lt;br /&gt;
&lt;br /&gt;
Для интернациональных символов в проекте используется кодировка UTF-8. Вы можете использовать строки на русском и других языках прямо в коде программ - для этого нужно сохранить исходный код программы в кодировке UTF-8. Но помните, что это является плохим стилем: в хорошей программе, все интернациональные сообщения находятся в файлах данных.&lt;br /&gt;
&lt;br /&gt;
=== Подход к написанию кода ===&lt;br /&gt;
&lt;br /&gt;
Самое главное правило: код должен быть легкочитаем и красив.&lt;br /&gt;
&lt;br /&gt;
Диптаун - это очень большой проект, состоящий из множества модулей. Эти модули завязаны друг на друга, и правильное функционирование одних невозможно без других. Поэтому мы не приемлем write-only код.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы код получался красивым, прежде всего нужен творческий подход к его написанию. Поэтому мы не приводим каких-либо формальных правил по этому вопросу. Спорные ситуации будут решаться в дискуссиях.&lt;br /&gt;
&lt;br /&gt;
Очень советуем прочитать статью про [http://ru.wikipedia.org/wiki/%D0%90%D0%BD%D1%82%D0%B8-%D0%BF%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD анти-паттерны] в википедии.&lt;br /&gt;
&lt;br /&gt;
=== Комментарии ===&lt;br /&gt;
&lt;br /&gt;
Код должен быть откомментирован так, чтобы обеспечить его читаемость, но и не должен быть перегружен комментариями.&lt;br /&gt;
&lt;br /&gt;
Обычно для выполнения этого условия достаточно написать небольшие пояснения к каждому классу и методу в этом классе.&lt;br /&gt;
&lt;br /&gt;
Комментарии должны объяснять, '''как''' работает код, но не '''что''' он делает. Ответ на второй вопрос должен содержаться в документации, а не в коде; мы не используем в проекте системы вроде doxygen для создания документации из кода, поскольку убеждены, что документация в коде загромождает этот код и делает его трудночитаемым.&lt;br /&gt;
&lt;br /&gt;
Кроме того, '''все комментарии должны быть на английском языке'''. У этого правила несколько причин, самые главные из которых - возможность чтения кода иностранцами и в любом редакторе. Комментарии транслитом также не допускаются.&lt;br /&gt;
&lt;br /&gt;
=== Комментарий в начале файла ===&lt;br /&gt;
&lt;br /&gt;
В начале каждого исходного файла должна содержаться следующая информация:&lt;br /&gt;
&lt;br /&gt;
 //&lt;br /&gt;
 // project : &amp;lt;project name&amp;gt;&lt;br /&gt;
 // date    : &amp;lt;current date&amp;gt;&lt;br /&gt;
 // author  : &amp;lt;author name&amp;gt;&lt;br /&gt;
 // e-mail  : &amp;lt;author email&amp;gt;&lt;br /&gt;
 // licence : &amp;lt;licence name&amp;gt;&lt;br /&gt;
 //&lt;br /&gt;
&lt;br /&gt;
Имя проекта - это название задания в списке задач, переведенное на английский язык, например, - '''console programs'''. Дата - текущая дата в формате yyyy-mm-dd. Имя автора записывается в форме '''Имя Фамилия''' (также по-английски), например: '''Vasily Petrov''' (но не Petrov Vasily). E-mail - это актуальный адрес автора, который может быть использован для писем по вопросам работоспособности данного кода.&lt;br /&gt;
&lt;br /&gt;
Лицензия - это либо название одной из применяемых в проекте лицензий ('''MIT''', '''LGPL''' etc), либо имя файла с лицензией. Персональные лицензии должны храниться в файлах, содержащих имя автора в имени файла, например '''licence-petrov-vasily.txt'''. Все такие лицензии будут добавлены в репозиторий с кодом.&lt;br /&gt;
&lt;br /&gt;
После этого комментария может идти текст лицензии или какие-либо лицензионные предупреждения (некоторые лицензии это требуют). Но такой текст должен идти ПОСЛЕ заголовка, а не до него.&lt;br /&gt;
&lt;br /&gt;
Строгость формата заголовка нужна в частности для того, чтобы можно было писать скрипты, собирающие статистику. Например, это будет использоваться скриптами, которые будут анализировать объемы работ различных авторов.&lt;br /&gt;
&lt;br /&gt;
Пример заголовочного комментария:&lt;br /&gt;
&lt;br /&gt;
 //&lt;br /&gt;
 // project : mysql database driver&lt;br /&gt;
 // date    : 2008-11-30&lt;br /&gt;
 // author  : Ivan Ivanov&lt;br /&gt;
 // e-mail  : ivan.ivanov@example.com&lt;br /&gt;
 // licence : MIT&lt;br /&gt;
 //&lt;br /&gt;
&lt;br /&gt;
=== Отступы в коде ===&lt;br /&gt;
&lt;br /&gt;
Прежде всего, в качестве отступов нельзя использовать символы табуляции. Они по-разному отображаются в различных программах просмотра/редакторах, что затрудняет чтение кода. В качестве отступов следует использовать четыре символа &amp;quot;пробел&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Использование операторных скобок { } ===&lt;br /&gt;
&lt;br /&gt;
Все операторные скобки ставятся на новой строке; к коду, заключенному в &lt;br /&gt;
операторные скобки, добавляется один отступ. Код начинается со следующей &lt;br /&gt;
после открывающей скобки строки. Исключение делается для конструкций, где &lt;br /&gt;
тело операторных скобок состоит из не более чем 10 строк. В этом случае &lt;br /&gt;
допускается открывающую операторную скобку поставить на ту же строку, что и &lt;br /&gt;
&amp;quot;породивший&amp;quot; ее оператор:&lt;br /&gt;
&lt;br /&gt;
 while(...) {&lt;br /&gt;
     // some stuff&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Кроме того, специальное исключение делается для конструкции if ... else:&lt;br /&gt;
&lt;br /&gt;
 if(...) {&lt;br /&gt;
     // stuff...&lt;br /&gt;
 } else {&lt;br /&gt;
     // more stuff...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Исключение также применимо только для не слишком длинных конструкций.&lt;br /&gt;
&lt;br /&gt;
== Правила для K++ кода ==&lt;br /&gt;
&lt;br /&gt;
=== Правила именования ===&lt;br /&gt;
&lt;br /&gt;
(жирным отмечены обязательные правила, остальные - желательны, но не обязательны).&lt;br /&gt;
&lt;br /&gt;
# '''Модули именуются в стиле MyModuleName''';&lt;br /&gt;
# '''Имена файлов в точности совпадают с именами модулей'''. Например, модуль Proto::HTTP должен находиться в файле Proto/HTTP.kpp;&lt;br /&gt;
# '''Классы именуются в стиле MyClassName''', без каких-либо префиксов;&lt;br /&gt;
# '''Публичные методы и свойства именуются в стиле someMethodName''';&lt;br /&gt;
# '''Имена классов, публичных методов и свойств должны быть говорящими, желательно без сокращений, но при этом не слишком длинными'''. Примерное ограничение по длине имени - 20 символов;&lt;br /&gt;
# Приватные методы и свойства именуются аналогично публичным;&lt;br /&gt;
# Локальные переменные именуются в стиле variable_name (все буквы - строчные, символы подчеркивания между словами);&lt;br /&gt;
# Поля класса именуются аналогично локальным переменным, но с префиксом '''m_'''. &lt;br /&gt;
&lt;br /&gt;
Такой подход к именованию имеет множество плюсов. В нем практически не используются префиксы (которые обычно надоедают), но при этом стиль написания имен классов, методов и переменных различается, что облегчает читаемость кода.&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что мы требуем выполнения правил по именованию публичных частей модуля, но по именам &amp;quot;внутренней кухни&amp;quot; даем лишь рекомендации. Это сделано для обеспечения единобразия интерфейсов.&lt;br /&gt;
&lt;br /&gt;
== Правила для C++ кода ==&lt;br /&gt;
&lt;br /&gt;
Этот раздел скопирован из стандарта кода самого Диптауна. Возможно, некоторым не понравится такой стиль, но так уж исторически сложилось. Если возражений будет слишком много - мы напишем скрипт, который сконвертирует один стиль в другой. Но делать это будем централизованно. Сейчас в проекте принят такой стиль, и холивары по этому поводу очень нежелательны.&lt;br /&gt;
&lt;br /&gt;
=== Переносимость кода ===&lt;br /&gt;
&lt;br /&gt;
Весь код проекта должен компилироваться, собираться и работать на любой &lt;br /&gt;
системе, будь то Windows, Mac, UNIX, Solaris и другие. Использование &lt;br /&gt;
библиотек также ограничено лишь лицензионными соглашениями и переносимостью &lt;br /&gt;
их на другие системы. В некоторых случаях допускаются исключения: код может &lt;br /&gt;
быть написан в нескольких вариантах для разных систем. Но в конечном итоге, &lt;br /&gt;
должна быть возможность сборки кода на любой системе.&lt;br /&gt;
&lt;br /&gt;
=== Схемы разыменовывания ===&lt;br /&gt;
&lt;br /&gt;
Далее по тексту используются следующие определения для имен различных &lt;br /&gt;
объектов:&lt;br /&gt;
* ''произвольная'' - объект может быть назван произвольно.&lt;br /&gt;
* ''прописная слитная'' - объект должен быть назван прописными буквами, слова не должны отделяться друг от друга. Например, OBJECTNAME.&lt;br /&gt;
* ''прописная [раздельная]'' - объект должен быть назван прописными буквами, слова отделяются друг от друга знаком подчеркивания: OBJECT_NAME.&lt;br /&gt;
* ''строчная слитная'', ''строчная [раздельная]'' - аналогично: objectname и object_name соответственно.&lt;br /&gt;
* ''основная'' - название должно начинаться с прописной буквы, и каждое слово должно начинаться с прописной буквы. Остальные буквы - строчные: ObjectName.&lt;br /&gt;
&lt;br /&gt;
=== Файловая структура верхнего уровня ===&lt;br /&gt;
&lt;br /&gt;
Весь код проекта представляет собой дерево подпроектов. Каждый подпроект - это&lt;br /&gt;
логически завершенный модуль, который может либо сам состоять из подпроектов;&lt;br /&gt;
либо компилироваться в программу, статическую или динамическую библиотеку или&lt;br /&gt;
скрипт; либо, наконец, содержать в себе и то, и другое. Подпроекты именуются по&lt;br /&gt;
строчной (иногда раздельной) схеме именования и располагаются в каталогах,&lt;br /&gt;
соответствующих их именам.&lt;br /&gt;
&lt;br /&gt;
Таким образом, за каждым подпроектом закрепляется его уникальный идентификатор -&lt;br /&gt;
это путь к подпроекту относительно корневого каталога проекта.&lt;br /&gt;
&lt;br /&gt;
=== Разыменовывание файлов ===&lt;br /&gt;
&lt;br /&gt;
Все файлы модуля должны быть названы по строчной схеме именования. Исключение&lt;br /&gt;
составляют лишь исходные файлы, в которых находятся реализации некоторых классах&lt;br /&gt;
- они в точности соответствуют именам классов. Об этом будет сказано далее.&lt;br /&gt;
&lt;br /&gt;
=== Разбиение файлов по каталогам ===&lt;br /&gt;
&lt;br /&gt;
Все файлы модуля разбиваются по каталогам следующим образом:&lt;br /&gt;
* все публичные включаемые файлы должны находиться в корневом каталоге модуля;&lt;br /&gt;
* все внутренние включаемые файлы должны находиться в подкаталоге ''impl'';&lt;br /&gt;
* все исходные файлы должны находиться в каталоге ''source''.&lt;br /&gt;
&lt;br /&gt;
=== Разбиение функций и классов по файлам ===&lt;br /&gt;
&lt;br /&gt;
Внутри каждого модуля или его части, функции и классы разбиваются на &lt;br /&gt;
внутренние - используемые только данным модулем, и публичные - экспортируемые &lt;br /&gt;
модулем для &amp;quot;внешнего мира&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Все публичные функции и классы должны быть вынесены в один или несколько &lt;br /&gt;
заголовочных файлов. На разбиение по файлам ограничений не накладывается.&lt;br /&gt;
&lt;br /&gt;
Внутренние функции и классы не должны быть объявлены в публичных заголовочных &lt;br /&gt;
файлах, и никоим образом не должны быть доступны для &amp;quot;внешнего мира&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Реализация каждого класса должна быть вынесена в отдельный исходный файл, имя &lt;br /&gt;
которого совпадает с именем класса.&lt;br /&gt;
&lt;br /&gt;
На разбиение реализаций отдельных функций по файлам ограничений не &lt;br /&gt;
накладывается.&lt;br /&gt;
&lt;br /&gt;
=== Пространства имен ===&lt;br /&gt;
&lt;br /&gt;
Все объявления каждого модуля должны быть внесены в отдельное пространство имен (namespace),&lt;br /&gt;
имя которого совпадает с именем модуля, записанного по основной схеме разыменовывания.&lt;br /&gt;
&lt;br /&gt;
=== Стражи включения ===&lt;br /&gt;
&lt;br /&gt;
Все файлы заголовков должны быть защищены стражем включения. Имя стража &lt;br /&gt;
включения дается следующему шаблону: __PRFX_FILENAME_H_INCLUDED.&lt;br /&gt;
&lt;br /&gt;
Здесь PRFX - префикс модуля и его части (см. п. 4.1), FILENAME - имя &lt;br /&gt;
заголовочного файла, записанное прописными буквами.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
 #ifndef __SEST_INDEXBUFFER_H_INCLUDED&lt;br /&gt;
 #define __SEST_INDEXBUFFER_H_INCLUDED&lt;br /&gt;
 // ...&lt;br /&gt;
 // ...&lt;br /&gt;
 #endif&lt;br /&gt;
 // EOF&lt;br /&gt;
&lt;br /&gt;
=== Правила именования сущностей ===&lt;br /&gt;
&lt;br /&gt;
Применяются следующие правила разыменовывания:&lt;br /&gt;
&lt;br /&gt;
* Определения препроцессора именуются по прописной схеме. Кроме того, для всех определений препроцессора ставится два префикса. Первый соответствует модулю и его части (4 символа), второй - смыслу определения. Префиксы отделяются друг от друга и от имени знаком подчеркивания. Пример: '''SEST_IBS_LOADED''' (Soung Engine, STreaming module; Index Buffer State).&lt;br /&gt;
* Классы именуются по стандартной схеме, ставится префикс '''C''' (CClassName).&lt;br /&gt;
* Структуры именуются по стандартной схеме (StructName).&lt;br /&gt;
* Функции и методы классов также именуются по стандартной схеме.&lt;br /&gt;
* Закрытые поля и локальные переменные именуются произвольно.&lt;br /&gt;
* Публичные поля классов и аргументы функций именуются по следующей схеме: имя переменной записываеися по основной схеме; добавляется префикс, соответствующий типу переменной (pszIndexName). К публичным полям класса также добавляется префикс m_ (m_pszIndexName).&lt;br /&gt;
&lt;br /&gt;
Префиксы для стандартных типов:&lt;br /&gt;
* [unsigned] int: i, u, n&lt;br /&gt;
* unsigned char, byte: b&lt;br /&gt;
* char: c&lt;br /&gt;
* char*, char[] (в смысле строки): sz&lt;br /&gt;
* [unsigned] short, word: w&lt;br /&gt;
* dword: dw&lt;br /&gt;
* qword: qw&lt;br /&gt;
* любой указатель: p&lt;br /&gt;
&lt;br /&gt;
Для нестандартных типов, префикс выбирается в соответствии с именем типа. &lt;br /&gt;
Длина префикса - от одного до двух символов.&lt;br /&gt;
&lt;br /&gt;
Кроме того:&lt;br /&gt;
# Публичные имена следует давать осмысленными - из имени должно быть ясно, зачем нужна переменная (функция, ...).&lt;br /&gt;
# Предпочтительный диапазон длины имени - от 4 до 20 символов.&lt;br /&gt;
# Предпочтительное количество слов, из которых составлено имя - от 1 до 3.&lt;br /&gt;
# Имена в объявлении класса не должны содержать имя класса. Например, в объявлении класса CFile не должно быть поля m_dwFileSize; следует использовать имя m_dwSize.&lt;br /&gt;
&lt;br /&gt;
=== Правила оформления операторов ===&lt;br /&gt;
&lt;br /&gt;
Для оформления операторов применяются следующие правила:&lt;br /&gt;
&lt;br /&gt;
# Каждому оператору выделяется новая строка.&lt;br /&gt;
# Круглые скобки не выделяются пробелами.&lt;br /&gt;
# Максимальная длина строки - 80 символов. Если требуется больше, остаток оператора переносится на следующую строку, к нему (остатку) добавляется дополнительный отступ.&lt;br /&gt;
# Если тело оператора if или цикла состоит из одного оператора, операторные скобки не ставятся, а оператор записывается с новой строки с дополнительным отступом.&lt;br /&gt;
# На использование пробелов ограничений не накладывается.&lt;br /&gt;
&lt;br /&gt;
=== Запрещенные конструкции ===&lt;br /&gt;
&lt;br /&gt;
Запрещается использование оператора goto. Единственное исключение - выход из циклов с несколькими уровнями вложенности.&lt;br /&gt;
&lt;br /&gt;
Конструкцию do { ... } while(...); крайне не рекомендуется использовать, особенно если тело цикла больше 10 строк.&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0_%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%B4%D0%B0</id>
		<title>Правила оформления кода</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0_%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%B4%D0%B0"/>
				<updated>2008-06-10T17:54:55Z</updated>
		
		<summary type="html">&lt;p&gt;Root: Общие правила - язык и кодировка&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Введение ==&lt;br /&gt;
&lt;br /&gt;
На этой странице описаны правила оформления кода для библиотек и прикладных программ проекта Deeptown. Соблюдение этих правил не менее важно, чем качество кода: это повышает читаемость кода другими людьми. Несоблюдение этих правил может стать причиной отказа в принятии кода.&lt;br /&gt;
&lt;br /&gt;
Конечно, из любых правил есть исключения, и никто не требует следовать этим правилам до буквы. Но практика показывает, что код, оформленный в едином стиле, легче читается и понимается людьми, занятыми в проекте. В отличие от многих других проектов, наши правила - не очень строгие, и в них обозначены только самые базовые вещи.&lt;br /&gt;
&lt;br /&gt;
В первом разделе приводятся общие правила для всех языков программирования и разметки; в последующих разделах они конкретизируются для различных языков.&lt;br /&gt;
&lt;br /&gt;
== Общие правила ==&lt;br /&gt;
&lt;br /&gt;
=== Язык и кодировка ===&lt;br /&gt;
&lt;br /&gt;
Для кода програм следует использовать только английский язык. Все имена в программе и комментарии к ней должны быть составлены на ангийском. Использование транслита в именах строго запрещено. Помните, что Ваш код могут читать не только русские.&lt;br /&gt;
&lt;br /&gt;
Для интернациональных символов в проекте используется кодировка UTF-8. Вы можете использовать строки на русском и других языках прямо в коде программ - для этого нужно сохранить исходный код программы в кодировке UTF-8. Но помните, что это является плохим стилем: в хорошей программе, все интернациональные сообщения находятся в файлах данных.&lt;br /&gt;
&lt;br /&gt;
=== Подход к написанию кода ===&lt;br /&gt;
&lt;br /&gt;
Самое главное правило: код должен быть легкочитаем и красив.&lt;br /&gt;
&lt;br /&gt;
Диптаун - это очень большой проект, состоящий из множества модулей. Эти модули завязаны друг на друга, и правильное функционирование одних невозможно без других. Поэтому мы не приемлем write-only код.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы код получался красивым, прежде всего нужен творческий подход к его написанию. Поэтому мы не приводим каких-либо формальных правил по этому вопросу. Спорные ситуации будут решаться в дискуссиях.&lt;br /&gt;
&lt;br /&gt;
Очень советуем прочитать статью про [http://ru.wikipedia.org/wiki/%D0%90%D0%BD%D1%82%D0%B8-%D0%BF%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD анти-паттерны] в википедии.&lt;br /&gt;
&lt;br /&gt;
=== Комментарии ===&lt;br /&gt;
&lt;br /&gt;
Код должен быть откомментирован так, чтобы обеспечить его читаемость, но и не должен быть перегружен комментариями.&lt;br /&gt;
&lt;br /&gt;
Обычно для выполнения этого условия достаточно написать небольшие пояснения к каждому классу и методу в этом классе.&lt;br /&gt;
&lt;br /&gt;
Комментарии должны объяснять, '''как''' работает код, но не '''что''' он делает. Ответ на второй вопрос должен содержаться в документации, а не в коде; мы не используем в проекте системы вроде doxygen для создания документации из кода, поскольку убеждены, что документация в коде загромождает этот код и делает его трудночитаемым.&lt;br /&gt;
&lt;br /&gt;
Кроме того, '''все комментарии должны быть на английском языке'''. У этого правила несколько причин, самые главные из которых - возможность чтения кода иностранцами и в любом редакторе. Комментарии транслитом также не допускаются.&lt;br /&gt;
&lt;br /&gt;
=== Комментарий в начале файла ===&lt;br /&gt;
&lt;br /&gt;
В начале каждого исходного файла должна содержаться следующая информация:&lt;br /&gt;
&lt;br /&gt;
 //&lt;br /&gt;
 // project : &amp;lt;project name&amp;gt;&lt;br /&gt;
 // date    : &amp;lt;current date&amp;gt;&lt;br /&gt;
 // author  : &amp;lt;author name&amp;gt;&lt;br /&gt;
 // e-mail  : &amp;lt;author email&amp;gt;&lt;br /&gt;
 // licence : &amp;lt;licence name&amp;gt;&lt;br /&gt;
 //&lt;br /&gt;
&lt;br /&gt;
Имя проекта - это название задания в списке задач, переведенное на английский язык, например, - '''console programs'''. Дата - текущая дата в формате yyyy-mm-dd. Имя автора записывается в форме '''Имя Фамилия''' (также по-английски), например: '''Vasily Petrov''' (но не Petrov Vasily). E-mail - это актуальный адрес автора, который может быть использован для писем по вопросам работоспособности данного кода.&lt;br /&gt;
&lt;br /&gt;
Лицензия - это либо название одной из применяемых в проекте лицензий ('''MIT''', '''LGPL''' etc), либо имя файла с лицензией. Персональные лицензии должны храниться в файлах, содержащих имя автора в имени файла, например '''licence-petrov-vasily.txt'''. Все такие лицензии будут добавлены в репозиторий с кодом.&lt;br /&gt;
&lt;br /&gt;
После этого комментария может идти текст лицензии или какие-либо лицензионные предупреждения (некоторые лицензии это требуют). Но такой текст должен идти ПОСЛЕ заголовка, а не до него.&lt;br /&gt;
&lt;br /&gt;
Строгость формата заголовка нужна в частности для того, чтобы можно было писать скрипты, собирающие статистику. Например, это будет использоваться скриптами, которые будут анализировать объемы работ различных авторов.&lt;br /&gt;
&lt;br /&gt;
Пример заголовочного комментария:&lt;br /&gt;
&lt;br /&gt;
 //&lt;br /&gt;
 // project : mysql database driver&lt;br /&gt;
 // date    : 2008-11-30&lt;br /&gt;
 // author  : Ivan Ivanov&lt;br /&gt;
 // licence : MIT&lt;br /&gt;
 //&lt;br /&gt;
&lt;br /&gt;
=== Отступы в коде ===&lt;br /&gt;
&lt;br /&gt;
Прежде всего, в качестве отступов нельзя использовать символы табуляции. Они по-разному отображаются в различных программах просмотра/редакторах, что затрудняет чтение кода. В качестве отступов следует использовать четыре символа &amp;quot;пробел&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Использование операторных скобок { } ===&lt;br /&gt;
&lt;br /&gt;
Все операторные скобки ставятся на новой строке; к коду, заключенному в &lt;br /&gt;
операторные скобки, добавляется один отступ. Код начинается со следующей &lt;br /&gt;
после открывающей скобки строки. Исключение делается для конструкций, где &lt;br /&gt;
тело операторных скобок состоит из не более чем 10 строк. В этом случае &lt;br /&gt;
допускается открывающую операторную скобку поставить на ту же строку, что и &lt;br /&gt;
&amp;quot;породивший&amp;quot; ее оператор:&lt;br /&gt;
&lt;br /&gt;
 while(...) {&lt;br /&gt;
     // some stuff&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Кроме того, специальное исключение делается для конструкции if ... else:&lt;br /&gt;
&lt;br /&gt;
 if(...) {&lt;br /&gt;
     // stuff...&lt;br /&gt;
 } else {&lt;br /&gt;
     // more stuff...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Исключение также применимо только для не слишком длинных конструкций.&lt;br /&gt;
&lt;br /&gt;
== Правила для K++ кода ==&lt;br /&gt;
&lt;br /&gt;
=== Правила именования ===&lt;br /&gt;
&lt;br /&gt;
(жирным отмечены обязательные правила, остальные - желательны, но не обязательны).&lt;br /&gt;
&lt;br /&gt;
# '''Модули именуются в стиле MyModuleName''';&lt;br /&gt;
# '''Имена файлов в точности совпадают с именами модулей'''. Например, модуль Proto::HTTP должен находиться в файле Proto/HTTP.kpp;&lt;br /&gt;
# '''Классы именуются в стиле MyClassName''', без каких-либо префиксов;&lt;br /&gt;
# '''Публичные методы и свойства именуются в стиле someMethodName''';&lt;br /&gt;
# '''Имена классов, публичных методов и свойств должны быть говорящими, желательно без сокращений, но при этом не слишком длинными'''. Примерное ограничение по длине имени - 20 символов;&lt;br /&gt;
# Приватные методы и свойства именуются аналогично публичным;&lt;br /&gt;
# Локальные переменные именуются в стиле variable_name (все буквы - строчные, символы подчеркивания между словами);&lt;br /&gt;
# Поля класса именуются аналогично локальным переменным, но с префиксом '''m_'''. &lt;br /&gt;
&lt;br /&gt;
Такой подход к именованию имеет множество плюсов. В нем практически не используются префиксы (которые обычно надоедают), но при этом стиль написания имен классов, методов и переменных различается, что облегчает читаемость кода.&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что мы требуем выполнения правил по именованию публичных частей модуля, но по именам &amp;quot;внутренней кухни&amp;quot; даем лишь рекомендации. Это сделано для обеспечения единобразия интерфейсов.&lt;br /&gt;
&lt;br /&gt;
== Правила для C++ кода ==&lt;br /&gt;
&lt;br /&gt;
Этот раздел скопирован из стандарта кода самого Диптауна. Возможно, некоторым не понравится такой стиль, но так уж исторически сложилось. Если возражений будет слишком много - мы напишем скрипт, который сконвертирует один стиль в другой. Но делать это будем централизованно. Сейчас в проекте принят такой стиль, и холивары по этому поводу очень нежелательны.&lt;br /&gt;
&lt;br /&gt;
=== Переносимость кода ===&lt;br /&gt;
&lt;br /&gt;
Весь код проекта должен компилироваться, собираться и работать на любой &lt;br /&gt;
системе, будь то Windows, Mac, UNIX, Solaris и другие. Использование &lt;br /&gt;
библиотек также ограничено лишь лицензионными соглашениями и переносимостью &lt;br /&gt;
их на другие системы. В некоторых случаях допускаются исключения: код может &lt;br /&gt;
быть написан в нескольких вариантах для разных систем. Но в конечном итоге, &lt;br /&gt;
должна быть возможность сборки кода на любой системе.&lt;br /&gt;
&lt;br /&gt;
=== Схемы разыменовывания ===&lt;br /&gt;
&lt;br /&gt;
Далее по тексту используются следующие определения для имен различных &lt;br /&gt;
объектов:&lt;br /&gt;
* ''произвольная'' - объект может быть назван произвольно.&lt;br /&gt;
* ''прописная слитная'' - объект должен быть назван прописными буквами, слова не должны отделяться друг от друга. Например, OBJECTNAME.&lt;br /&gt;
* ''прописная [раздельная]'' - объект должен быть назван прописными буквами, слова отделяются друг от друга знаком подчеркивания: OBJECT_NAME.&lt;br /&gt;
* ''строчная слитная'', ''строчная [раздельная]'' - аналогично: objectname и object_name соответственно.&lt;br /&gt;
* ''основная'' - название должно начинаться с прописной буквы, и каждое слово должно начинаться с прописной буквы. Остальные буквы - строчные: ObjectName.&lt;br /&gt;
&lt;br /&gt;
=== Файловая структура верхнего уровня ===&lt;br /&gt;
&lt;br /&gt;
Весь код проекта представляет собой дерево подпроектов. Каждый подпроект - это&lt;br /&gt;
логически завершенный модуль, который может либо сам состоять из подпроектов;&lt;br /&gt;
либо компилироваться в программу, статическую или динамическую библиотеку или&lt;br /&gt;
скрипт; либо, наконец, содержать в себе и то, и другое. Подпроекты именуются по&lt;br /&gt;
строчной (иногда раздельной) схеме именования и располагаются в каталогах,&lt;br /&gt;
соответствующих их именам.&lt;br /&gt;
&lt;br /&gt;
Таким образом, за каждым подпроектом закрепляется его уникальный идентификатор -&lt;br /&gt;
это путь к подпроекту относительно корневого каталога проекта.&lt;br /&gt;
&lt;br /&gt;
=== Разыменовывание файлов ===&lt;br /&gt;
&lt;br /&gt;
Все файлы модуля должны быть названы по строчной схеме именования. Исключение&lt;br /&gt;
составляют лишь исходные файлы, в которых находятся реализации некоторых классах&lt;br /&gt;
- они в точности соответствуют именам классов. Об этом будет сказано далее.&lt;br /&gt;
&lt;br /&gt;
=== Разбиение файлов по каталогам ===&lt;br /&gt;
&lt;br /&gt;
Все файлы модуля разбиваются по каталогам следующим образом:&lt;br /&gt;
* все публичные включаемые файлы должны находиться в корневом каталоге модуля;&lt;br /&gt;
* все внутренние включаемые файлы должны находиться в подкаталоге ''impl'';&lt;br /&gt;
* все исходные файлы должны находиться в каталоге ''source''.&lt;br /&gt;
&lt;br /&gt;
=== Разбиение функций и классов по файлам ===&lt;br /&gt;
&lt;br /&gt;
Внутри каждого модуля или его части, функции и классы разбиваются на &lt;br /&gt;
внутренние - используемые только данным модулем, и публичные - экспортируемые &lt;br /&gt;
модулем для &amp;quot;внешнего мира&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Все публичные функции и классы должны быть вынесены в один или несколько &lt;br /&gt;
заголовочных файлов. На разбиение по файлам ограничений не накладывается.&lt;br /&gt;
&lt;br /&gt;
Внутренние функции и классы не должны быть объявлены в публичных заголовочных &lt;br /&gt;
файлах, и никоим образом не должны быть доступны для &amp;quot;внешнего мира&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Реализация каждого класса должна быть вынесена в отдельный исходный файл, имя &lt;br /&gt;
которого совпадает с именем класса.&lt;br /&gt;
&lt;br /&gt;
На разбиение реализаций отдельных функций по файлам ограничений не &lt;br /&gt;
накладывается.&lt;br /&gt;
&lt;br /&gt;
=== Пространства имен ===&lt;br /&gt;
&lt;br /&gt;
Все объявления каждого модуля должны быть внесены в отдельное пространство имен (namespace),&lt;br /&gt;
имя которого совпадает с именем модуля, записанного по основной схеме разыменовывания.&lt;br /&gt;
&lt;br /&gt;
=== Стражи включения ===&lt;br /&gt;
&lt;br /&gt;
Все файлы заголовков должны быть защищены стражем включения. Имя стража &lt;br /&gt;
включения дается следующему шаблону: __PRFX_FILENAME_H_INCLUDED.&lt;br /&gt;
&lt;br /&gt;
Здесь PRFX - префикс модуля и его части (см. п. 4.1), FILENAME - имя &lt;br /&gt;
заголовочного файла, записанное прописными буквами.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
 #ifndef __SEST_INDEXBUFFER_H_INCLUDED&lt;br /&gt;
 #define __SEST_INDEXBUFFER_H_INCLUDED&lt;br /&gt;
 // ...&lt;br /&gt;
 // ...&lt;br /&gt;
 #endif&lt;br /&gt;
 // EOF&lt;br /&gt;
&lt;br /&gt;
=== Правила именования сущностей ===&lt;br /&gt;
&lt;br /&gt;
Применяются следующие правила разыменовывания:&lt;br /&gt;
&lt;br /&gt;
* Определения препроцессора именуются по прописной схеме. Кроме того, для всех определений препроцессора ставится два префикса. Первый соответствует модулю и его части (4 символа), второй - смыслу определения. Префиксы отделяются друг от друга и от имени знаком подчеркивания. Пример: '''SEST_IBS_LOADED''' (Soung Engine, STreaming module; Index Buffer State).&lt;br /&gt;
* Классы именуются по стандартной схеме, ставится префикс '''C''' (CClassName).&lt;br /&gt;
* Структуры именуются по стандартной схеме (StructName).&lt;br /&gt;
* Функции и методы классов также именуются по стандартной схеме.&lt;br /&gt;
* Закрытые поля и локальные переменные именуются произвольно.&lt;br /&gt;
* Публичные поля классов и аргументы функций именуются по следующей схеме: имя переменной записываеися по основной схеме; добавляется префикс, соответствующий типу переменной (pszIndexName). К публичным полям класса также добавляется префикс m_ (m_pszIndexName).&lt;br /&gt;
&lt;br /&gt;
Префиксы для стандартных типов:&lt;br /&gt;
* [unsigned] int: i, u, n&lt;br /&gt;
* unsigned char, byte: b&lt;br /&gt;
* char: c&lt;br /&gt;
* char*, char[] (в смысле строки): sz&lt;br /&gt;
* [unsigned] short, word: w&lt;br /&gt;
* dword: dw&lt;br /&gt;
* qword: qw&lt;br /&gt;
* любой указатель: p&lt;br /&gt;
&lt;br /&gt;
Для нестандартных типов, префикс выбирается в соответствии с именем типа. &lt;br /&gt;
Длина префикса - от одного до двух символов.&lt;br /&gt;
&lt;br /&gt;
Кроме того:&lt;br /&gt;
# Публичные имена следует давать осмысленными - из имени должно быть ясно, зачем нужна переменная (функция, ...).&lt;br /&gt;
# Предпочтительный диапазон длины имени - от 4 до 20 символов.&lt;br /&gt;
# Предпочтительное количество слов, из которых составлено имя - от 1 до 3.&lt;br /&gt;
# Имена в объявлении класса не должны содержать имя класса. Например, в объявлении класса CFile не должно быть поля m_dwFileSize; следует использовать имя m_dwSize.&lt;br /&gt;
&lt;br /&gt;
=== Правила оформления операторов ===&lt;br /&gt;
&lt;br /&gt;
Для оформления операторов применяются следующие правила:&lt;br /&gt;
&lt;br /&gt;
# Каждому оператору выделяется новая строка.&lt;br /&gt;
# Круглые скобки не выделяются пробелами.&lt;br /&gt;
# Максимальная длина строки - 80 символов. Если требуется больше, остаток оператора переносится на следующую строку, к нему (остатку) добавляется дополнительный отступ.&lt;br /&gt;
# Если тело оператора if или цикла состоит из одного оператора, операторные скобки не ставятся, а оператор записывается с новой строки с дополнительным отступом.&lt;br /&gt;
# На использование пробелов ограничений не накладывается.&lt;br /&gt;
&lt;br /&gt;
=== Запрещенные конструкции ===&lt;br /&gt;
&lt;br /&gt;
Запрещается использование оператора goto. Единственное исключение - выход из циклов с несколькими уровнями вложенности.&lt;br /&gt;
&lt;br /&gt;
Конструкцию do { ... } while(...); крайне не рекомендуется использовать, особенно если тело цикла больше 10 строк.&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0_%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%B4%D0%B0</id>
		<title>Правила оформления кода</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0_%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%B4%D0%B0"/>
				<updated>2008-06-10T17:40:36Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Введение */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Введение ==&lt;br /&gt;
&lt;br /&gt;
На этой странице описаны правила оформления кода для библиотек и прикладных программ проекта Deeptown. Соблюдение этих правил не менее важно, чем качество кода: это повышает читаемость кода другими людьми. Несоблюдение этих правил может стать причиной отказа в принятии кода.&lt;br /&gt;
&lt;br /&gt;
Конечно, из любых правил есть исключения, и никто не требует следовать этим правилам до буквы. Но практика показывает, что код, оформленный в едином стиле, легче читается и понимается людьми, занятыми в проекте. В отличие от многих других проектов, наши правила - не очень строгие, и в них обозначены только самые базовые вещи.&lt;br /&gt;
&lt;br /&gt;
В первом разделе приводятся общие правила для всех языков программирования и разметки; в последующих разделах они конкретизируются для различных языков.&lt;br /&gt;
&lt;br /&gt;
== Общие правила ==&lt;br /&gt;
&lt;br /&gt;
=== Подход к написанию кода ===&lt;br /&gt;
&lt;br /&gt;
Самое главное правило: код должен быть легкочитаем и красив.&lt;br /&gt;
&lt;br /&gt;
Диптаун - это очень большой проект, состоящий из множества модулей. Эти модули завязаны друг на друга, и правильное функционирование одних невозможно без других. Поэтому мы не приемлем write-only код.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы код получался красивым, прежде всего нужен творческий подход к его написанию. Поэтому мы не приводим каких-либо формальных правил по этому вопросу. Спорные ситуации будут решаться в дискуссиях.&lt;br /&gt;
&lt;br /&gt;
Очень советуем прочитать статью про [http://ru.wikipedia.org/wiki/%D0%90%D0%BD%D1%82%D0%B8-%D0%BF%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD анти-паттерны] в википедии.&lt;br /&gt;
&lt;br /&gt;
=== Комментарии ===&lt;br /&gt;
&lt;br /&gt;
Код должен быть откомментирован так, чтобы обеспечить его читаемость, но и не должен быть перегружен комментариями.&lt;br /&gt;
&lt;br /&gt;
Обычно для выполнения этого условия достаточно написать небольшие пояснения к каждому классу и методу в этом классе.&lt;br /&gt;
&lt;br /&gt;
Комментарии должны объяснять, '''как''' работает код, но не '''что''' он делает. Ответ на второй вопрос должен содержаться в документации, а не в коде; мы не используем в проекте системы вроде doxygen для создания документации из кода, поскольку убеждены, что документация в коде загромождает этот код и делает его трудночитаемым.&lt;br /&gt;
&lt;br /&gt;
Кроме того, '''все комментарии должны быть на английском языке'''. У этого правила несколько причин, самые главные из которых - возможность чтения кода иностранцами и в любом редакторе. Комментарии транслитом также не допускаются.&lt;br /&gt;
&lt;br /&gt;
=== Комментарий в начале файла ===&lt;br /&gt;
&lt;br /&gt;
В начале каждого исходного файла должна содержаться следующая информация:&lt;br /&gt;
&lt;br /&gt;
 //&lt;br /&gt;
 // project : &amp;lt;project name&amp;gt;&lt;br /&gt;
 // date    : &amp;lt;current date&amp;gt;&lt;br /&gt;
 // author  : &amp;lt;author name&amp;gt;&lt;br /&gt;
 // e-mail  : &amp;lt;author email&amp;gt;&lt;br /&gt;
 // licence : &amp;lt;licence name&amp;gt;&lt;br /&gt;
 //&lt;br /&gt;
&lt;br /&gt;
Имя проекта - это название задания в списке задач, переведенное на английский язык, например, - '''console programs'''. Дата - текущая дата в формате yyyy-mm-dd. Имя автора записывается в форме '''Имя Фамилия''' (также по-английски), например: '''Vasily Petrov''' (но не Petrov Vasily). E-mail - это актуальный адрес автора, который может быть использован для писем по вопросам работоспособности данного кода.&lt;br /&gt;
&lt;br /&gt;
Лицензия - это либо название одной из применяемых в проекте лицензий ('''MIT''', '''LGPL''' etc), либо имя файла с лицензией. Персональные лицензии должны храниться в файлах, содержащих имя автора в имени файла, например '''licence-petrov-vasily.txt'''. Все такие лицензии будут добавлены в репозиторий с кодом.&lt;br /&gt;
&lt;br /&gt;
После этого комментария может идти текст лицензии или какие-либо лицензионные предупреждения (некоторые лицензии это требуют). Но такой текст должен идти ПОСЛЕ заголовка, а не до него.&lt;br /&gt;
&lt;br /&gt;
Строгость формата заголовка нужна в частности для того, чтобы можно было писать скрипты, собирающие статистику. Например, это будет использоваться скриптами, которые будут анализировать объемы работ различных авторов.&lt;br /&gt;
&lt;br /&gt;
Пример заголовочного комментария:&lt;br /&gt;
&lt;br /&gt;
 //&lt;br /&gt;
 // project : mysql database driver&lt;br /&gt;
 // date    : 2008-11-30&lt;br /&gt;
 // author  : Ivan Ivanov&lt;br /&gt;
 // licence : MIT&lt;br /&gt;
 //&lt;br /&gt;
&lt;br /&gt;
=== Отступы в коде ===&lt;br /&gt;
&lt;br /&gt;
Прежде всего, в качестве отступов нельзя использовать символы табуляции. Они по-разному отображаются в различных программах просмотра/редакторах, что затрудняет чтение кода. В качестве отступов следует использовать четыре символа &amp;quot;пробел&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Использование операторных скобок { } ===&lt;br /&gt;
&lt;br /&gt;
Все операторные скобки ставятся на новой строке; к коду, заключенному в &lt;br /&gt;
операторные скобки, добавляется один отступ. Код начинается со следующей &lt;br /&gt;
после открывающей скобки строки. Исключение делается для конструкций, где &lt;br /&gt;
тело операторных скобок состоит из не более чем 10 строк. В этом случае &lt;br /&gt;
допускается открывающую операторную скобку поставить на ту же строку, что и &lt;br /&gt;
&amp;quot;породивший&amp;quot; ее оператор:&lt;br /&gt;
&lt;br /&gt;
 while(...) {&lt;br /&gt;
     // some stuff&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Кроме того, специальное исключение делается для конструкции if ... else:&lt;br /&gt;
&lt;br /&gt;
 if(...) {&lt;br /&gt;
     // stuff...&lt;br /&gt;
 } else {&lt;br /&gt;
     // more stuff...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Исключение также применимо только для не слишком длинных конструкций.&lt;br /&gt;
&lt;br /&gt;
== Правила для K++ кода ==&lt;br /&gt;
&lt;br /&gt;
=== Правила именования ===&lt;br /&gt;
&lt;br /&gt;
(жирным отмечены обязательные правила, остальные - желательны, но не обязательны).&lt;br /&gt;
&lt;br /&gt;
# '''Модули именуются в стиле MyModuleName''';&lt;br /&gt;
# '''Имена файлов в точности совпадают с именами модулей'''. Например, модуль Proto::HTTP должен находиться в файле Proto/HTTP.kpp;&lt;br /&gt;
# '''Классы именуются в стиле MyClassName''', без каких-либо префиксов;&lt;br /&gt;
# '''Публичные методы и свойства именуются в стиле someMethodName''';&lt;br /&gt;
# '''Имена классов, публичных методов и свойств должны быть говорящими, желательно без сокращений, но при этом не слишком длинными'''. Примерное ограничение по длине имени - 20 символов;&lt;br /&gt;
# Приватные методы и свойства именуются аналогично публичным;&lt;br /&gt;
# Локальные переменные именуются в стиле variable_name (все буквы - строчные, символы подчеркивания между словами);&lt;br /&gt;
# Поля класса именуются аналогично локальным переменным, но с префиксом '''m_'''. &lt;br /&gt;
&lt;br /&gt;
Такой подход к именованию имеет множество плюсов. В нем практически не используются префиксы (которые обычно надоедают), но при этом стиль написания имен классов, методов и переменных различается, что облегчает читаемость кода.&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что мы требуем выполнения правил по именованию публичных частей модуля, но по именам &amp;quot;внутренней кухни&amp;quot; даем лишь рекомендации. Это сделано для обеспечения единобразия интерфейсов.&lt;br /&gt;
&lt;br /&gt;
== Правила для C++ кода ==&lt;br /&gt;
&lt;br /&gt;
Этот раздел скопирован из стандарта кода самого Диптауна. Возможно, некоторым не понравится такой стиль, но так уж исторически сложилось. Если возражений будет слишком много - мы напишем скрипт, который сконвертирует один стиль в другой. Но делать это будем централизованно. Сейчас в проекте принят такой стиль, и холивары по этому поводу очень нежелательны.&lt;br /&gt;
&lt;br /&gt;
=== Переносимость кода ===&lt;br /&gt;
&lt;br /&gt;
Весь код проекта должен компилироваться, собираться и работать на любой &lt;br /&gt;
системе, будь то Windows, Mac, UNIX, Solaris и другие. Использование &lt;br /&gt;
библиотек также ограничено лишь лицензионными соглашениями и переносимостью &lt;br /&gt;
их на другие системы. В некоторых случаях допускаются исключения: код может &lt;br /&gt;
быть написан в нескольких вариантах для разных систем. Но в конечном итоге, &lt;br /&gt;
должна быть возможность сборки кода на любой системе.&lt;br /&gt;
&lt;br /&gt;
=== Схемы разыменовывания ===&lt;br /&gt;
&lt;br /&gt;
Далее по тексту используются следующие определения для имен различных &lt;br /&gt;
объектов:&lt;br /&gt;
* ''произвольная'' - объект может быть назван произвольно.&lt;br /&gt;
* ''прописная слитная'' - объект должен быть назван прописными буквами, слова не должны отделяться друг от друга. Например, OBJECTNAME.&lt;br /&gt;
* ''прописная [раздельная]'' - объект должен быть назван прописными буквами, слова отделяются друг от друга знаком подчеркивания: OBJECT_NAME.&lt;br /&gt;
* ''строчная слитная'', ''строчная [раздельная]'' - аналогично: objectname и object_name соответственно.&lt;br /&gt;
* ''основная'' - название должно начинаться с прописной буквы, и каждое слово должно начинаться с прописной буквы. Остальные буквы - строчные: ObjectName.&lt;br /&gt;
&lt;br /&gt;
=== Файловая структура верхнего уровня ===&lt;br /&gt;
&lt;br /&gt;
Весь код проекта представляет собой дерево подпроектов. Каждый подпроект - это&lt;br /&gt;
логически завершенный модуль, который может либо сам состоять из подпроектов;&lt;br /&gt;
либо компилироваться в программу, статическую или динамическую библиотеку или&lt;br /&gt;
скрипт; либо, наконец, содержать в себе и то, и другое. Подпроекты именуются по&lt;br /&gt;
строчной (иногда раздельной) схеме именования и располагаются в каталогах,&lt;br /&gt;
соответствующих их именам.&lt;br /&gt;
&lt;br /&gt;
Таким образом, за каждым подпроектом закрепляется его уникальный идентификатор -&lt;br /&gt;
это путь к подпроекту относительно корневого каталога проекта.&lt;br /&gt;
&lt;br /&gt;
=== Разыменовывание файлов ===&lt;br /&gt;
&lt;br /&gt;
Все файлы модуля должны быть названы по строчной схеме именования. Исключение&lt;br /&gt;
составляют лишь исходные файлы, в которых находятся реализации некоторых классах&lt;br /&gt;
- они в точности соответствуют именам классов. Об этом будет сказано далее.&lt;br /&gt;
&lt;br /&gt;
=== Разбиение файлов по каталогам ===&lt;br /&gt;
&lt;br /&gt;
Все файлы модуля разбиваются по каталогам следующим образом:&lt;br /&gt;
* все публичные включаемые файлы должны находиться в корневом каталоге модуля;&lt;br /&gt;
* все внутренние включаемые файлы должны находиться в подкаталоге ''impl'';&lt;br /&gt;
* все исходные файлы должны находиться в каталоге ''source''.&lt;br /&gt;
&lt;br /&gt;
=== Разбиение функций и классов по файлам ===&lt;br /&gt;
&lt;br /&gt;
Внутри каждого модуля или его части, функции и классы разбиваются на &lt;br /&gt;
внутренние - используемые только данным модулем, и публичные - экспортируемые &lt;br /&gt;
модулем для &amp;quot;внешнего мира&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Все публичные функции и классы должны быть вынесены в один или несколько &lt;br /&gt;
заголовочных файлов. На разбиение по файлам ограничений не накладывается.&lt;br /&gt;
&lt;br /&gt;
Внутренние функции и классы не должны быть объявлены в публичных заголовочных &lt;br /&gt;
файлах, и никоим образом не должны быть доступны для &amp;quot;внешнего мира&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Реализация каждого класса должна быть вынесена в отдельный исходный файл, имя &lt;br /&gt;
которого совпадает с именем класса.&lt;br /&gt;
&lt;br /&gt;
На разбиение реализаций отдельных функций по файлам ограничений не &lt;br /&gt;
накладывается.&lt;br /&gt;
&lt;br /&gt;
=== Пространства имен ===&lt;br /&gt;
&lt;br /&gt;
Все объявления каждого модуля должны быть внесены в отдельное пространство имен (namespace),&lt;br /&gt;
имя которого совпадает с именем модуля, записанного по основной схеме разыменовывания.&lt;br /&gt;
&lt;br /&gt;
=== Стражи включения ===&lt;br /&gt;
&lt;br /&gt;
Все файлы заголовков должны быть защищены стражем включения. Имя стража &lt;br /&gt;
включения дается следующему шаблону: __PRFX_FILENAME_H_INCLUDED.&lt;br /&gt;
&lt;br /&gt;
Здесь PRFX - префикс модуля и его части (см. п. 4.1), FILENAME - имя &lt;br /&gt;
заголовочного файла, записанное прописными буквами.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
 #ifndef __SEST_INDEXBUFFER_H_INCLUDED&lt;br /&gt;
 #define __SEST_INDEXBUFFER_H_INCLUDED&lt;br /&gt;
 // ...&lt;br /&gt;
 // ...&lt;br /&gt;
 #endif&lt;br /&gt;
 // EOF&lt;br /&gt;
&lt;br /&gt;
=== Правила именования сущностей ===&lt;br /&gt;
&lt;br /&gt;
Применяются следующие правила разыменовывания:&lt;br /&gt;
&lt;br /&gt;
* Определения препроцессора именуются по прописной схеме. Кроме того, для всех определений препроцессора ставится два префикса. Первый соответствует модулю и его части (4 символа), второй - смыслу определения. Префиксы отделяются друг от друга и от имени знаком подчеркивания. Пример: '''SEST_IBS_LOADED''' (Soung Engine, STreaming module; Index Buffer State).&lt;br /&gt;
* Классы именуются по стандартной схеме, ставится префикс '''C''' (CClassName).&lt;br /&gt;
* Структуры именуются по стандартной схеме (StructName).&lt;br /&gt;
* Функции и методы классов также именуются по стандартной схеме.&lt;br /&gt;
* Закрытые поля и локальные переменные именуются произвольно.&lt;br /&gt;
* Публичные поля классов и аргументы функций именуются по следующей схеме: имя переменной записываеися по основной схеме; добавляется префикс, соответствующий типу переменной (pszIndexName). К публичным полям класса также добавляется префикс m_ (m_pszIndexName).&lt;br /&gt;
&lt;br /&gt;
Префиксы для стандартных типов:&lt;br /&gt;
* [unsigned] int: i, u, n&lt;br /&gt;
* unsigned char, byte: b&lt;br /&gt;
* char: c&lt;br /&gt;
* char*, char[] (в смысле строки): sz&lt;br /&gt;
* [unsigned] short, word: w&lt;br /&gt;
* dword: dw&lt;br /&gt;
* qword: qw&lt;br /&gt;
* любой указатель: p&lt;br /&gt;
&lt;br /&gt;
Для нестандартных типов, префикс выбирается в соответствии с именем типа. &lt;br /&gt;
Длина префикса - от одного до двух символов.&lt;br /&gt;
&lt;br /&gt;
Кроме того:&lt;br /&gt;
# Публичные имена следует давать осмысленными - из имени должно быть ясно, зачем нужна переменная (функция, ...).&lt;br /&gt;
# Предпочтительный диапазон длины имени - от 4 до 20 символов.&lt;br /&gt;
# Предпочтительное количество слов, из которых составлено имя - от 1 до 3.&lt;br /&gt;
# Имена в объявлении класса не должны содержать имя класса. Например, в объявлении класса CFile не должно быть поля m_dwFileSize; следует использовать имя m_dwSize.&lt;br /&gt;
&lt;br /&gt;
=== Правила оформления операторов ===&lt;br /&gt;
&lt;br /&gt;
Для оформления операторов применяются следующие правила:&lt;br /&gt;
&lt;br /&gt;
# Каждому оператору выделяется новая строка.&lt;br /&gt;
# Круглые скобки не выделяются пробелами.&lt;br /&gt;
# Максимальная длина строки - 80 символов. Если требуется больше, остаток оператора переносится на следующую строку, к нему (остатку) добавляется дополнительный отступ.&lt;br /&gt;
# Если тело оператора if или цикла состоит из одного оператора, операторные скобки не ставятся, а оператор записывается с новой строки с дополнительным отступом.&lt;br /&gt;
# На использование пробелов ограничений не накладывается.&lt;br /&gt;
&lt;br /&gt;
=== Запрещенные конструкции ===&lt;br /&gt;
&lt;br /&gt;
Запрещается использование оператора goto. Единственное исключение - выход из циклов с несколькими уровнями вложенности.&lt;br /&gt;
&lt;br /&gt;
Конструкцию do { ... } while(...); крайне не рекомендуется использовать, особенно если тело цикла больше 10 строк.&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0_%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%B4%D0%B0</id>
		<title>Правила оформления кода</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0_%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BA%D0%BE%D0%B4%D0%B0"/>
				<updated>2008-06-10T17:38:38Z</updated>
		
		<summary type="html">&lt;p&gt;Root: Новая: == Введение ==  На этой странице описаны правила оформления кода для библиотек и прикладных программ пр...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Введение ==&lt;br /&gt;
&lt;br /&gt;
На этой странице описаны правила оформления кода для библиотек и прикладных программ проекта Deeptown. Соблюдение этих правил не менее важно, чем качество кода: это повышает читаемость кода другими людьми. Несоблюдение этих правил может стать причиной отказа в принятии кода.&lt;br /&gt;
&lt;br /&gt;
Конечно, из любых правил есть исключения, и никто не требует следовать этим правилам до буквы. Но практика показывает, что код, оформленный в едином стиле, более просто читается и понимается среди людей, занятых в проекте. В отличие от многих других проектов, наши правила - не очень строгие, и в них обозначены только самые базовые вещи.&lt;br /&gt;
&lt;br /&gt;
В первом разделе приводятся общие правила для всех языков программирования и разметки; в последующих разделах они конкретизируются для различных языков.&lt;br /&gt;
&lt;br /&gt;
== Общие правила ==&lt;br /&gt;
&lt;br /&gt;
=== Подход к написанию кода ===&lt;br /&gt;
&lt;br /&gt;
Самое главное правило: код должен быть легкочитаем и красив.&lt;br /&gt;
&lt;br /&gt;
Диптаун - это очень большой проект, состоящий из множества модулей. Эти модули завязаны друг на друга, и правильное функционирование одних невозможно без других. Поэтому мы не приемлем write-only код.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы код получался красивым, прежде всего нужен творческий подход к его написанию. Поэтому мы не приводим каких-либо формальных правил по этому вопросу. Спорные ситуации будут решаться в дискуссиях.&lt;br /&gt;
&lt;br /&gt;
Очень советуем прочитать статью про [http://ru.wikipedia.org/wiki/%D0%90%D0%BD%D1%82%D0%B8-%D0%BF%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD анти-паттерны] в википедии.&lt;br /&gt;
&lt;br /&gt;
=== Комментарии ===&lt;br /&gt;
&lt;br /&gt;
Код должен быть откомментирован так, чтобы обеспечить его читаемость, но и не должен быть перегружен комментариями.&lt;br /&gt;
&lt;br /&gt;
Обычно для выполнения этого условия достаточно написать небольшие пояснения к каждому классу и методу в этом классе.&lt;br /&gt;
&lt;br /&gt;
Комментарии должны объяснять, '''как''' работает код, но не '''что''' он делает. Ответ на второй вопрос должен содержаться в документации, а не в коде; мы не используем в проекте системы вроде doxygen для создания документации из кода, поскольку убеждены, что документация в коде загромождает этот код и делает его трудночитаемым.&lt;br /&gt;
&lt;br /&gt;
Кроме того, '''все комментарии должны быть на английском языке'''. У этого правила несколько причин, самые главные из которых - возможность чтения кода иностранцами и в любом редакторе. Комментарии транслитом также не допускаются.&lt;br /&gt;
&lt;br /&gt;
=== Комментарий в начале файла ===&lt;br /&gt;
&lt;br /&gt;
В начале каждого исходного файла должна содержаться следующая информация:&lt;br /&gt;
&lt;br /&gt;
 //&lt;br /&gt;
 // project : &amp;lt;project name&amp;gt;&lt;br /&gt;
 // date    : &amp;lt;current date&amp;gt;&lt;br /&gt;
 // author  : &amp;lt;author name&amp;gt;&lt;br /&gt;
 // e-mail  : &amp;lt;author email&amp;gt;&lt;br /&gt;
 // licence : &amp;lt;licence name&amp;gt;&lt;br /&gt;
 //&lt;br /&gt;
&lt;br /&gt;
Имя проекта - это название задания в списке задач, переведенное на английский язык, например, - '''console programs'''. Дата - текущая дата в формате yyyy-mm-dd. Имя автора записывается в форме '''Имя Фамилия''' (также по-английски), например: '''Vasily Petrov''' (но не Petrov Vasily). E-mail - это актуальный адрес автора, который может быть использован для писем по вопросам работоспособности данного кода.&lt;br /&gt;
&lt;br /&gt;
Лицензия - это либо название одной из применяемых в проекте лицензий ('''MIT''', '''LGPL''' etc), либо имя файла с лицензией. Персональные лицензии должны храниться в файлах, содержащих имя автора в имени файла, например '''licence-petrov-vasily.txt'''. Все такие лицензии будут добавлены в репозиторий с кодом.&lt;br /&gt;
&lt;br /&gt;
После этого комментария может идти текст лицензии или какие-либо лицензионные предупреждения (некоторые лицензии это требуют). Но такой текст должен идти ПОСЛЕ заголовка, а не до него.&lt;br /&gt;
&lt;br /&gt;
Строгость формата заголовка нужна в частности для того, чтобы можно было писать скрипты, собирающие статистику. Например, это будет использоваться скриптами, которые будут анализировать объемы работ различных авторов.&lt;br /&gt;
&lt;br /&gt;
Пример заголовочного комментария:&lt;br /&gt;
&lt;br /&gt;
 //&lt;br /&gt;
 // project : mysql database driver&lt;br /&gt;
 // date    : 2008-11-30&lt;br /&gt;
 // author  : Ivan Ivanov&lt;br /&gt;
 // licence : MIT&lt;br /&gt;
 //&lt;br /&gt;
&lt;br /&gt;
=== Отступы в коде ===&lt;br /&gt;
&lt;br /&gt;
Прежде всего, в качестве отступов нельзя использовать символы табуляции. Они по-разному отображаются в различных программах просмотра/редакторах, что затрудняет чтение кода. В качестве отступов следует использовать четыре символа &amp;quot;пробел&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Использование операторных скобок { } ===&lt;br /&gt;
&lt;br /&gt;
Все операторные скобки ставятся на новой строке; к коду, заключенному в &lt;br /&gt;
операторные скобки, добавляется один отступ. Код начинается со следующей &lt;br /&gt;
после открывающей скобки строки. Исключение делается для конструкций, где &lt;br /&gt;
тело операторных скобок состоит из не более чем 10 строк. В этом случае &lt;br /&gt;
допускается открывающую операторную скобку поставить на ту же строку, что и &lt;br /&gt;
&amp;quot;породивший&amp;quot; ее оператор:&lt;br /&gt;
&lt;br /&gt;
 while(...) {&lt;br /&gt;
     // some stuff&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Кроме того, специальное исключение делается для конструкции if ... else:&lt;br /&gt;
&lt;br /&gt;
 if(...) {&lt;br /&gt;
     // stuff...&lt;br /&gt;
 } else {&lt;br /&gt;
     // more stuff...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Исключение также применимо только для не слишком длинных конструкций.&lt;br /&gt;
&lt;br /&gt;
== Правила для K++ кода ==&lt;br /&gt;
&lt;br /&gt;
=== Правила именования ===&lt;br /&gt;
&lt;br /&gt;
(жирным отмечены обязательные правила, остальные - желательны, но не обязательны).&lt;br /&gt;
&lt;br /&gt;
# '''Модули именуются в стиле MyModuleName''';&lt;br /&gt;
# '''Имена файлов в точности совпадают с именами модулей'''. Например, модуль Proto::HTTP должен находиться в файле Proto/HTTP.kpp;&lt;br /&gt;
# '''Классы именуются в стиле MyClassName''', без каких-либо префиксов;&lt;br /&gt;
# '''Публичные методы и свойства именуются в стиле someMethodName''';&lt;br /&gt;
# '''Имена классов, публичных методов и свойств должны быть говорящими, желательно без сокращений, но при этом не слишком длинными'''. Примерное ограничение по длине имени - 20 символов;&lt;br /&gt;
# Приватные методы и свойства именуются аналогично публичным;&lt;br /&gt;
# Локальные переменные именуются в стиле variable_name (все буквы - строчные, символы подчеркивания между словами);&lt;br /&gt;
# Поля класса именуются аналогично локальным переменным, но с префиксом '''m_'''. &lt;br /&gt;
&lt;br /&gt;
Такой подход к именованию имеет множество плюсов. В нем практически не используются префиксы (которые обычно надоедают), но при этом стиль написания имен классов, методов и переменных различается, что облегчает читаемость кода.&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что мы требуем выполнения правил по именованию публичных частей модуля, но по именам &amp;quot;внутренней кухни&amp;quot; даем лишь рекомендации. Это сделано для обеспечения единобразия интерфейсов.&lt;br /&gt;
&lt;br /&gt;
== Правила для C++ кода ==&lt;br /&gt;
&lt;br /&gt;
Этот раздел скопирован из стандарта кода самого Диптауна. Возможно, некоторым не понравится такой стиль, но так уж исторически сложилось. Если возражений будет слишком много - мы напишем скрипт, который сконвертирует один стиль в другой. Но делать это будем централизованно. Сейчас в проекте принят такой стиль, и холивары по этому поводу очень нежелательны.&lt;br /&gt;
&lt;br /&gt;
=== Переносимость кода ===&lt;br /&gt;
&lt;br /&gt;
Весь код проекта должен компилироваться, собираться и работать на любой &lt;br /&gt;
системе, будь то Windows, Mac, UNIX, Solaris и другие. Использование &lt;br /&gt;
библиотек также ограничено лишь лицензионными соглашениями и переносимостью &lt;br /&gt;
их на другие системы. В некоторых случаях допускаются исключения: код может &lt;br /&gt;
быть написан в нескольких вариантах для разных систем. Но в конечном итоге, &lt;br /&gt;
должна быть возможность сборки кода на любой системе.&lt;br /&gt;
&lt;br /&gt;
=== Схемы разыменовывания ===&lt;br /&gt;
&lt;br /&gt;
Далее по тексту используются следующие определения для имен различных &lt;br /&gt;
объектов:&lt;br /&gt;
* ''произвольная'' - объект может быть назван произвольно.&lt;br /&gt;
* ''прописная слитная'' - объект должен быть назван прописными буквами, слова не должны отделяться друг от друга. Например, OBJECTNAME.&lt;br /&gt;
* ''прописная [раздельная]'' - объект должен быть назван прописными буквами, слова отделяются друг от друга знаком подчеркивания: OBJECT_NAME.&lt;br /&gt;
* ''строчная слитная'', ''строчная [раздельная]'' - аналогично: objectname и object_name соответственно.&lt;br /&gt;
* ''основная'' - название должно начинаться с прописной буквы, и каждое слово должно начинаться с прописной буквы. Остальные буквы - строчные: ObjectName.&lt;br /&gt;
&lt;br /&gt;
=== Файловая структура верхнего уровня ===&lt;br /&gt;
&lt;br /&gt;
Весь код проекта представляет собой дерево подпроектов. Каждый подпроект - это&lt;br /&gt;
логически завершенный модуль, который может либо сам состоять из подпроектов;&lt;br /&gt;
либо компилироваться в программу, статическую или динамическую библиотеку или&lt;br /&gt;
скрипт; либо, наконец, содержать в себе и то, и другое. Подпроекты именуются по&lt;br /&gt;
строчной (иногда раздельной) схеме именования и располагаются в каталогах,&lt;br /&gt;
соответствующих их именам.&lt;br /&gt;
&lt;br /&gt;
Таким образом, за каждым подпроектом закрепляется его уникальный идентификатор -&lt;br /&gt;
это путь к подпроекту относительно корневого каталога проекта.&lt;br /&gt;
&lt;br /&gt;
=== Разыменовывание файлов ===&lt;br /&gt;
&lt;br /&gt;
Все файлы модуля должны быть названы по строчной схеме именования. Исключение&lt;br /&gt;
составляют лишь исходные файлы, в которых находятся реализации некоторых классах&lt;br /&gt;
- они в точности соответствуют именам классов. Об этом будет сказано далее.&lt;br /&gt;
&lt;br /&gt;
=== Разбиение файлов по каталогам ===&lt;br /&gt;
&lt;br /&gt;
Все файлы модуля разбиваются по каталогам следующим образом:&lt;br /&gt;
* все публичные включаемые файлы должны находиться в корневом каталоге модуля;&lt;br /&gt;
* все внутренние включаемые файлы должны находиться в подкаталоге ''impl'';&lt;br /&gt;
* все исходные файлы должны находиться в каталоге ''source''.&lt;br /&gt;
&lt;br /&gt;
=== Разбиение функций и классов по файлам ===&lt;br /&gt;
&lt;br /&gt;
Внутри каждого модуля или его части, функции и классы разбиваются на &lt;br /&gt;
внутренние - используемые только данным модулем, и публичные - экспортируемые &lt;br /&gt;
модулем для &amp;quot;внешнего мира&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Все публичные функции и классы должны быть вынесены в один или несколько &lt;br /&gt;
заголовочных файлов. На разбиение по файлам ограничений не накладывается.&lt;br /&gt;
&lt;br /&gt;
Внутренние функции и классы не должны быть объявлены в публичных заголовочных &lt;br /&gt;
файлах, и никоим образом не должны быть доступны для &amp;quot;внешнего мира&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Реализация каждого класса должна быть вынесена в отдельный исходный файл, имя &lt;br /&gt;
которого совпадает с именем класса.&lt;br /&gt;
&lt;br /&gt;
На разбиение реализаций отдельных функций по файлам ограничений не &lt;br /&gt;
накладывается.&lt;br /&gt;
&lt;br /&gt;
=== Пространства имен ===&lt;br /&gt;
&lt;br /&gt;
Все объявления каждого модуля должны быть внесены в отдельное пространство имен (namespace),&lt;br /&gt;
имя которого совпадает с именем модуля, записанного по основной схеме разыменовывания.&lt;br /&gt;
&lt;br /&gt;
=== Стражи включения ===&lt;br /&gt;
&lt;br /&gt;
Все файлы заголовков должны быть защищены стражем включения. Имя стража &lt;br /&gt;
включения дается следующему шаблону: __PRFX_FILENAME_H_INCLUDED.&lt;br /&gt;
&lt;br /&gt;
Здесь PRFX - префикс модуля и его части (см. п. 4.1), FILENAME - имя &lt;br /&gt;
заголовочного файла, записанное прописными буквами.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
 #ifndef __SEST_INDEXBUFFER_H_INCLUDED&lt;br /&gt;
 #define __SEST_INDEXBUFFER_H_INCLUDED&lt;br /&gt;
 // ...&lt;br /&gt;
 // ...&lt;br /&gt;
 #endif&lt;br /&gt;
 // EOF&lt;br /&gt;
&lt;br /&gt;
=== Правила именования сущностей ===&lt;br /&gt;
&lt;br /&gt;
Применяются следующие правила разыменовывания:&lt;br /&gt;
&lt;br /&gt;
* Определения препроцессора именуются по прописной схеме. Кроме того, для всех определений препроцессора ставится два префикса. Первый соответствует модулю и его части (4 символа), второй - смыслу определения. Префиксы отделяются друг от друга и от имени знаком подчеркивания. Пример: '''SEST_IBS_LOADED''' (Soung Engine, STreaming module; Index Buffer State).&lt;br /&gt;
* Классы именуются по стандартной схеме, ставится префикс '''C''' (CClassName).&lt;br /&gt;
* Структуры именуются по стандартной схеме (StructName).&lt;br /&gt;
* Функции и методы классов также именуются по стандартной схеме.&lt;br /&gt;
* Закрытые поля и локальные переменные именуются произвольно.&lt;br /&gt;
* Публичные поля классов и аргументы функций именуются по следующей схеме: имя переменной записываеися по основной схеме; добавляется префикс, соответствующий типу переменной (pszIndexName). К публичным полям класса также добавляется префикс m_ (m_pszIndexName).&lt;br /&gt;
&lt;br /&gt;
Префиксы для стандартных типов:&lt;br /&gt;
* [unsigned] int: i, u, n&lt;br /&gt;
* unsigned char, byte: b&lt;br /&gt;
* char: c&lt;br /&gt;
* char*, char[] (в смысле строки): sz&lt;br /&gt;
* [unsigned] short, word: w&lt;br /&gt;
* dword: dw&lt;br /&gt;
* qword: qw&lt;br /&gt;
* любой указатель: p&lt;br /&gt;
&lt;br /&gt;
Для нестандартных типов, префикс выбирается в соответствии с именем типа. &lt;br /&gt;
Длина префикса - от одного до двух символов.&lt;br /&gt;
&lt;br /&gt;
Кроме того:&lt;br /&gt;
# Публичные имена следует давать осмысленными - из имени должно быть ясно, зачем нужна переменная (функция, ...).&lt;br /&gt;
# Предпочтительный диапазон длины имени - от 4 до 20 символов.&lt;br /&gt;
# Предпочтительное количество слов, из которых составлено имя - от 1 до 3.&lt;br /&gt;
# Имена в объявлении класса не должны содержать имя класса. Например, в объявлении класса CFile не должно быть поля m_dwFileSize; следует использовать имя m_dwSize.&lt;br /&gt;
&lt;br /&gt;
=== Правила оформления операторов ===&lt;br /&gt;
&lt;br /&gt;
Для оформления операторов применяются следующие правила:&lt;br /&gt;
&lt;br /&gt;
# Каждому оператору выделяется новая строка.&lt;br /&gt;
# Круглые скобки не выделяются пробелами.&lt;br /&gt;
# Максимальная длина строки - 80 символов. Если требуется больше, остаток оператора переносится на следующую строку, к нему (остатку) добавляется дополнительный отступ.&lt;br /&gt;
# Если тело оператора if или цикла состоит из одного оператора, операторные скобки не ставятся, а оператор записывается с новой строки с дополнительным отступом.&lt;br /&gt;
# На использование пробелов ограничений не накладывается.&lt;br /&gt;
&lt;br /&gt;
=== Запрещенные конструкции ===&lt;br /&gt;
&lt;br /&gt;
Запрещается использование оператора goto. Единственное исключение - выход из циклов с несколькими уровнями вложенности.&lt;br /&gt;
&lt;br /&gt;
Конструкцию do { ... } while(...); крайне не рекомендуется использовать, особенно если тело цикла больше 10 строк.&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B8</id>
		<title>Задачи</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B8"/>
				<updated>2008-06-10T11:04:59Z</updated>
		
		<summary type="html">&lt;p&gt;Root: MIT licence link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В данном разделе мы публикуем текущий список задач Deeptown SDK. Большая часть задач — это раздаботка тех или иных модулей/программ на языке K++. Некоторые задачи предполагают реализацию на C++.&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет пополняться со временем. Особо важные изменения будут отмечаться в [[Рассылка|рассылке]].&lt;br /&gt;
&lt;br /&gt;
== Информация ==&lt;br /&gt;
&lt;br /&gt;
=== Для кого этот раздел ===&lt;br /&gt;
&lt;br /&gt;
Браться за выполнение задач может абсолютно любой желающий. В том числе и Вы, дорогой читатель ;)&lt;br /&gt;
&lt;br /&gt;
Для простых задач потребуются только базовые навыки программирования и знание [[K++]], который [[K++|подробно описан]] на этом сайте. Категории сложности задач обозначены в их описаниях.&lt;br /&gt;
&lt;br /&gt;
Однако будьте готовы к тому, что мы не примем некачественный код. Мы следим за качеством нашей системы. Перед тем, как приступать, пожалуйста, ознакомьтесь с [[Правила оформления кода|правилами оформления кода]].&lt;br /&gt;
&lt;br /&gt;
=== Оформление данного раздела ===&lt;br /&gt;
&lt;br /&gt;
В данном разделе задачи разбиты на несколько категорий. Каждая задача — это подраздел в своей категории. Простые задачи описываются прямо в тексте; для более сложных даются ссылки на отдельные страницы описаний. Новые задачи всегда добавляются наверх своего раздела.&lt;br /&gt;
&lt;br /&gt;
Для каждой задачи приводится следующая служебная информация:&lt;br /&gt;
* '''сложность''' — уровень сложности задачи: простая, средняя, сложная&lt;br /&gt;
* '''технологии''' — список технологий (языков, библиотек, etc), которые потребуются для выполнения задачи&lt;br /&gt;
* '''приоритет''' — степень важности задачи: низкий, средний, высокий&lt;br /&gt;
* '''автор''' — подпись автора задачи&lt;br /&gt;
* '''примечания''' — технические примечания автора&lt;br /&gt;
* '''исполнитель''' — контактная информация исполнителя&lt;br /&gt;
* '''срок''' — срок завершения, обозначенный исполнителем&lt;br /&gt;
&lt;br /&gt;
=== Порядок выполнения задач ===&lt;br /&gt;
&lt;br /&gt;
Прежде всего, выберите задачу, за которую Вы хотели бы взяться. Выбирать следует только из тех задач, для которых не указан исполнитель. Предпочтительнее брать задачи с более высоким приоритетом, но это не обязательно: прежде всего выбирайте то, что Вам будет интересно делать.&lt;br /&gt;
&lt;br /&gt;
После того как выбор сделан, вставьте информацию об исполнителе и о сроке.&lt;br /&gt;
&lt;br /&gt;
В информации об исполнителе должно указываться какое-нибудь средство связи с Вами: e-mail, ICQ или jabber. Вы можете написать свои контактные данные в &amp;quot;мою страницу&amp;quot; вики, а в графу &amp;quot;исполнитель&amp;quot; просто поставить подпись.&lt;br /&gt;
&lt;br /&gt;
Срок введен для того, чтобы отсекать &amp;quot;призраков&amp;quot;. Представьте что кто-то взял задачу и пропал на долгое время. С одной стороны передавать эту задачу кому-то другому нельзя, потому что она уже занята; с другой — работа стоит.&lt;br /&gt;
&lt;br /&gt;
Срок — это не строгое поле. Если Вы активно работаете над задачей, но не успеваете в срок — Вы всегда можете его отодвинуть. Главное для нас то, что процесс идет.&lt;br /&gt;
&lt;br /&gt;
В поле &amp;quot;срок&amp;quot; следует вписать предполагаемую дату завершения. Максимальный срок, который Вы можете установить — это текущая дата плюс 2 недели, если иное не указано в примечаниях к задаче.&lt;br /&gt;
&lt;br /&gt;
Процедура обнаружения &amp;quot;призраков&amp;quot; такова. Когда срок исполнения выходит, мы связываемся с Вами по указанным контактным данным, и узнаем статус задачи/договариваемся о дальнейшем. Если связаться не удается в течение недели — мы убираем информацию об исполнителе, открывая таким образом задачу для других.&lt;br /&gt;
&lt;br /&gt;
=== Порядок приема задач ===&lt;br /&gt;
&lt;br /&gt;
На данный момент у нас нет (публичного) централизованного обменника исходными кодами. Поэтому, высылайте свои труды в архиве на адрес developers (гав) deeptown.org. Либо Вы можете выложить их куда-нибудь в интернет, и выслать ссылку по этому адресу.&lt;br /&gt;
&lt;br /&gt;
=== Условия лицензирования ===&lt;br /&gt;
&lt;br /&gt;
Мы можем принять Ваш код только в том случае, если Вы передаете его нам на условиях свободной лицензии. Пожалуйста, вложите текст лицензии в архив с кодом. Мы не будем принимать архивы без текстов лицензии, поскольку это может грозить нам судебными исками (исключение — только для наших разработчиков, которые подписали с нами договор).&lt;br /&gt;
&lt;br /&gt;
Предпочтительной является лицензия [http://www.opensource.org/licenses/mit-license.php MIT], но Вы можете взять другую свободную лицензию или даже написать свою. Однако имейте ввиду: мы ответственно подходим к лицензированию кода, поэтому без внимания мы это не оставим.&lt;br /&gt;
&lt;br /&gt;
Со своей стороны обещаем соблюдать условия лицензии, либо не принимать Ваш код, если нас она не устроит.&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B8</id>
		<title>Задачи</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B8"/>
				<updated>2008-06-10T06:11:27Z</updated>
		
		<summary type="html">&lt;p&gt;Root: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В данном разделе мы публикуем текущий список задач Deeptown SDK. Большая часть задач - это раздаботка тех или иных модулей/программ на языке K++. Некоторые задачи предполагают реализацию на C++.&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет пополняться со временем. Особо важные изменения будут отмечаться в [[Рассылка|рассылке]].&lt;br /&gt;
&lt;br /&gt;
== Информация ==&lt;br /&gt;
&lt;br /&gt;
=== Для кого этот раздел ===&lt;br /&gt;
&lt;br /&gt;
Браться за выполнение задач может абсолютно любой желающий. В том числе и Вы, дорогой читатель ;)&lt;br /&gt;
&lt;br /&gt;
Для простых задач потребуются только базовые навыки программирования и знание K++, который подробно описан на этом сайте. Категории сложности задач обозначены в их описаниях.&lt;br /&gt;
&lt;br /&gt;
Однако будьте готовы к тому, что мы не примем некачественный код. Мы следим за качеством нашей системы. Перед тем, как приступать, пожалуйста, ознакомьтесь с [[Правила оформления кода|правилами оформления кода]].&lt;br /&gt;
&lt;br /&gt;
=== Оформление данного раздела ===&lt;br /&gt;
&lt;br /&gt;
В данном разделе задачи разбиты на несколько категорий. Каждая задача - это подраздел в своей категории. Простые задачи описываются прямо в тексте; для более сложных даются ссылки на отдельные страницы описаний. Новые задачи всегда добавляются наверх своего раздела.&lt;br /&gt;
&lt;br /&gt;
Для каждой задачи приводится следующая служебная информация:&lt;br /&gt;
* '''сложность''' - уровень сложности задачи: простая, средняя, сложная&lt;br /&gt;
* '''технологии''' - список технологий (языков, библиотек, etc), которые потребуются для выполнения задачи&lt;br /&gt;
* '''приоритет''' - степень важности задачи: низкий, средний, высокий&lt;br /&gt;
* '''автор''' - подпись автора задачи&lt;br /&gt;
* '''примечания''' - технические примечания автора&lt;br /&gt;
* '''исполнитель''' - контактная информация исполнителя&lt;br /&gt;
* '''срок''' - срок завершения, обозначенный исполнителем&lt;br /&gt;
&lt;br /&gt;
=== Порядок выполнения задач ===&lt;br /&gt;
&lt;br /&gt;
Прежде всего, выберите задачу, за которую Вы хотели бы взяться. Выбирать следует только из тех задач, для которых не указан исполнитель. Предпочтительнее брать задачи с более высоким приоритетом, но это не обязательно: прежде всего выбирайте то, что Вам будет интересно делать.&lt;br /&gt;
&lt;br /&gt;
После того как выбор сделан, вставьте информацию об исполнителе и о сроке.&lt;br /&gt;
&lt;br /&gt;
В информации об исполнителе должно указываться какое-нибудь средство связи с Вами: e-mail, ICQ или jabber. Вы можете написать свои контактные данные в &amp;quot;мою страницу&amp;quot; вики, а в графу &amp;quot;исполнитель&amp;quot; просто поставить подпись.&lt;br /&gt;
&lt;br /&gt;
Срок введен для того, чтобы отсекать &amp;quot;призраков&amp;quot;. Представьте что кто-то взял задачу и пропал на долгое время. С одной стороны передавать эту задачу кому-то другому нельзя, потому что она уже занята; с другой - работа стоит.&lt;br /&gt;
&lt;br /&gt;
Срок - это не строгое поле. Если Вы активно работаете над задачей, но не успеваете в срок - Вы всегда можете его отодвинуть. Главное для нас то, что процесс идет.&lt;br /&gt;
&lt;br /&gt;
В поле &amp;quot;срок&amp;quot; следует вписать предполагаемую дату завершения. Максимальный срок, который Вы можете установить - это текущая дата плюс 2 недели, если иное не указано в примечаниях к задаче.&lt;br /&gt;
&lt;br /&gt;
Процедура обнаружения &amp;quot;призраков&amp;quot; такова. Когда срок исполнения выходит, мы связываемся с Вами по указанным контактным данным, и узнаем статус задачи/договариваемся о дальнейшем. Если связаться не удается в течение недели - мы убираем информацию об исполнителе, открывая таким образом задачу для других.&lt;br /&gt;
&lt;br /&gt;
=== Порядок приема задач ===&lt;br /&gt;
&lt;br /&gt;
На данный момент у нас нет (публичного) централизованного обменника исходными кодами. Поэтому, высылайте свои труды в архиве на адрес developers (гав) deeptown.org. Либо Вы можете выложить их куда-нибудь в интернет, и выслать ссылку по этому адресу.&lt;br /&gt;
&lt;br /&gt;
=== Условия лицензирования ===&lt;br /&gt;
&lt;br /&gt;
Мы можем принять Ваш код только в том случае, если Вы передаете его нам на условиях свободной лицензии. Пожалуйста, вложите текст лицензии в архив с кодом. Мы не будем принимать архивы без текстов лицензии, поскольку это может грозить нам судебными исками (исключение - только для наших разработчиков, которые подписали с нами договор).&lt;br /&gt;
&lt;br /&gt;
Предпочтительной является лицензия MIT (ссылка?), но Вы можете взять другую свободную лицензию или даже написать свою. Однако имейте ввиду: мы ответственно подходим к лицензированию кода, поэтому без внимания мы это не оставим.&lt;br /&gt;
&lt;br /&gt;
Со своей стороны обещаем соблюдать условия лицензии, либо не принимать Ваш код, если нас она не устроит.&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B8</id>
		<title>Задачи</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B8"/>
				<updated>2008-06-10T06:10:06Z</updated>
		
		<summary type="html">&lt;p&gt;Root: Новая: В данном разделе мы публикуем текущий список задач Deeptown SDK. Большая часть задач - это раздаботка тех ил...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В данном разделе мы публикуем текущий список задач Deeptown SDK. Большая часть задач - это раздаботка тех или иных модулей/программ на языке K++. Некоторые задачи предполагают реализацию на C++.&lt;br /&gt;
&lt;br /&gt;
Данный раздел будет пополняться со временем. Особо важные изменения будут отмечаться в [[Список рассылки|рассылке]].&lt;br /&gt;
&lt;br /&gt;
== Информация ==&lt;br /&gt;
&lt;br /&gt;
=== Для кого этот раздел ===&lt;br /&gt;
&lt;br /&gt;
Браться за выполнение задач может абсолютно любой желающий. В том числе и Вы, дорогой читатель ;)&lt;br /&gt;
&lt;br /&gt;
Для простых задач потребуются только базовые навыки программирования и знание K++, который подробно описан на этом сайте. Категории сложности задач обозначены в их описаниях.&lt;br /&gt;
&lt;br /&gt;
Однако будьте готовы к тому, что мы не примем некачественный код. Мы следим за качеством нашей системы. Перед тем, как приступать, пожалуйста, ознакомьтесь с [[Правила оформления кода|правилами оформления кода]].&lt;br /&gt;
&lt;br /&gt;
=== Оформление данного раздела ===&lt;br /&gt;
&lt;br /&gt;
В данном разделе задачи разбиты на несколько категорий. Каждая задача - это подраздел в своей категории. Простые задачи описываются прямо в тексте; для более сложных даются ссылки на отдельные страницы описаний. Новые задачи всегда добавляются наверх своего раздела.&lt;br /&gt;
&lt;br /&gt;
Для каждой задачи приводится следующая служебная информация:&lt;br /&gt;
* '''сложность''' - уровень сложности задачи: простая, средняя, сложная&lt;br /&gt;
* '''технологии''' - список технологий (языков, библиотек, etc), которые потребуются для выполнения задачи&lt;br /&gt;
* '''приоритет''' - степень важности задачи: низкий, средний, высокий&lt;br /&gt;
* '''автор''' - подпись автора задачи&lt;br /&gt;
* '''примечания''' - технические примечания автора&lt;br /&gt;
* '''исполнитель''' - контактная информация исполнителя&lt;br /&gt;
* '''срок''' - срок завершения, обозначенный исполнителем&lt;br /&gt;
&lt;br /&gt;
=== Порядок выполнения задач ===&lt;br /&gt;
&lt;br /&gt;
Прежде всего, выберите задачу, за которую Вы хотели бы взяться. Выбирать следует только из тех задач, для которых не указан исполнитель. Предпочтительнее брать задачи с более высоким приоритетом, но это не обязательно: прежде всего выбирайте то, что Вам будет интересно делать.&lt;br /&gt;
&lt;br /&gt;
После того как выбор сделан, вставьте информацию об исполнителе и о сроке.&lt;br /&gt;
&lt;br /&gt;
В информации об исполнителе должно указываться какое-нибудь средство связи с Вами: e-mail, ICQ или jabber. Вы можете написать свои контактные данные в &amp;quot;мою страницу&amp;quot; вики, а в графу &amp;quot;исполнитель&amp;quot; просто поставить подпись.&lt;br /&gt;
&lt;br /&gt;
Срок введен для того, чтобы отсекать &amp;quot;призраков&amp;quot;. Представьте что кто-то взял задачу и пропал на долгое время. С одной стороны передавать эту задачу кому-то другому нельзя, потому что она уже занята; с другой - работа стоит.&lt;br /&gt;
&lt;br /&gt;
Срок - это не строгое поле. Если Вы активно работаете над задачей, но не успеваете в срок - Вы всегда можете его отодвинуть. Главное для нас то, что процесс идет.&lt;br /&gt;
&lt;br /&gt;
В поле &amp;quot;срок&amp;quot; следует вписать предполагаемую дату завершения. Максимальный срок, который Вы можете установить - это текущая дата плюс 2 недели, если иное не указано в примечаниях к задаче.&lt;br /&gt;
&lt;br /&gt;
Процедура обнаружения &amp;quot;призраков&amp;quot; такова. Когда срок исполнения выходит, мы связываемся с Вами по указанным контактным данным, и узнаем статус задачи/договариваемся о дальнейшем. Если связаться не удается в течение недели - мы убираем информацию об исполнителе, открывая таким образом задачу для других.&lt;br /&gt;
&lt;br /&gt;
=== Порядок приема задач ===&lt;br /&gt;
&lt;br /&gt;
На данный момент у нас нет (публичного) централизованного обменника исходными кодами. Поэтому, высылайте свои труды в архиве на адрес developers (гав) deeptown.org. Либо Вы можете выложить их куда-нибудь в интернет, и выслать ссылку по этому адресу.&lt;br /&gt;
&lt;br /&gt;
=== Условия лицензирования ===&lt;br /&gt;
&lt;br /&gt;
Мы можем принять Ваш код только в том случае, если Вы передаете его нам на условиях свободной лицензии. Пожалуйста, вложите текст лицензии в архив с кодом. Мы не будем принимать архивы без текстов лицензии, поскольку это может грозить нам судебными исками (исключение - только для наших разработчиков, которые подписали с нами договор).&lt;br /&gt;
&lt;br /&gt;
Предпочтительной является лицензия MIT (ссылка?), но Вы можете взять другую свободную лицензию или даже написать свою. Однако имейте ввиду: мы ответственно подходим к лицензированию кода, поэтому без внимания мы это не оставим.&lt;br /&gt;
&lt;br /&gt;
Со своей стороны обещаем соблюдать условия лицензии, либо не принимать Ваш код, если нас она не устроит.&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0</id>
		<title>Заглавная страница</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0"/>
				<updated>2008-06-10T06:09:41Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Информация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Информация ==&lt;br /&gt;
&lt;br /&gt;
* [[О проекте]]&lt;br /&gt;
* [[Deeptown SDK]]&lt;br /&gt;
* [[Задачи|Текущие задачи]]&lt;br /&gt;
* [[Bugzilla]]&lt;br /&gt;
* [[Рассылка]]&lt;br /&gt;
* [[Release Notes]]&lt;br /&gt;
* [[Обратная связь]]&lt;br /&gt;
&lt;br /&gt;
== Документация ==&lt;br /&gt;
&lt;br /&gt;
* [[K++]]&lt;br /&gt;
* [[World Engine]]&lt;br /&gt;
* [[Платформа Gide]]&lt;br /&gt;
* [[Стандартная библиотека gide]]&lt;br /&gt;
* [[Туториалы и HOWTO]]&lt;br /&gt;
* [[Building and running from source]]&lt;br /&gt;
* [[Советы и подсказки]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/MediaWiki:Sidebar</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/MediaWiki:Sidebar"/>
				<updated>2008-06-10T06:09:05Z</updated>
		
		<summary type="html">&lt;p&gt;Root: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* navigation&lt;br /&gt;
** mainpage|mainpage&lt;br /&gt;
** portal-url|portal&lt;br /&gt;
** currentevents-url|currentevents&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help&lt;br /&gt;
** sitesupport-url|sitesupport&lt;br /&gt;
* информация&lt;br /&gt;
** О проекте|О проекте&lt;br /&gt;
** Deeptown SDK|Deeptown SDK&lt;br /&gt;
** Задачи|Задачи&lt;br /&gt;
** Багтрекер|Багтрекер&lt;br /&gt;
** Рассылка|Рассылка&lt;br /&gt;
** Release Notes|Release Notes&lt;br /&gt;
** Обратная связь|Обратная связь&lt;br /&gt;
* документация&lt;br /&gt;
** K++|K++&lt;br /&gt;
** Платформа Gide|Gide&lt;br /&gt;
** Стандартная библиотека gide|Gide stdlib&lt;br /&gt;
** World Engine|World Engine&lt;br /&gt;
** Туториалы и HOWTO|HOWTO&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/Deeptown_SDK</id>
		<title>Deeptown SDK</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/Deeptown_SDK"/>
				<updated>2008-05-10T19:58:11Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Установка SDK на ОС Windows */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Описание Deeptown SDK ==&lt;br /&gt;
&lt;br /&gt;
'''Deeptown Software Development Kit''' — это набор программ, утилит и библиотек для разработки приложений для платформы Deeptown.&lt;br /&gt;
&lt;br /&gt;
В публичном доступе выпускается бинарная версия SDK — т.е. набор библиотек и программ, скомпилированных для различных операционных систем. Исходные коды по прежнему остаются закрытыми; доступ к ним предоставляется только при необходимости и при подписании соответствующего соглашения о конфиденциальности. Если Вас это интересует — [[Обратная связь|пишите]].&lt;br /&gt;
&lt;br /&gt;
== Структура SDK ==&lt;br /&gt;
&lt;br /&gt;
SDK поставляется в виде отдельных небольших пакетов. Для различных задач Вам может потребоваться только часть из них. В ближайшем будущем, на этой Wiki будет выложена подробная информация о существующих пакетах и их составе.&lt;br /&gt;
&lt;br /&gt;
== Установка SDK на POSIX-совместимых системах ==&lt;br /&gt;
&lt;br /&gt;
=== Требования к системе ===&lt;br /&gt;
&lt;br /&gt;
На данный момент из всех POSIX-совместимых систем Deeptown SDK поддерживает только ОС Linux. В ближайшем будущем планируется поддержка FreeBSD; остальные POSIX-системы мы не поддерживаем, т.к. это почти никому не требуется. Если Вам нужен дистрибутив для какой-то конкретной системы, Вы можете [[Обратная связь|написать нам]], и мы постараемся собрать дистрибутив для Вашей системы, если это будет возможно.&lt;br /&gt;
&lt;br /&gt;
Для ядра системы требуются:&lt;br /&gt;
* gcc версии &amp;gt;=3.4 с модулем поддержки языка C++ (g++);&lt;br /&gt;
* make&lt;br /&gt;
* perl &amp;gt;= 5.0&lt;br /&gt;
* wget&lt;br /&gt;
&lt;br /&gt;
Кроме того, для некоторых важных модулей требуются библиотеки:&lt;br /&gt;
* libpcre &amp;gt;=6.6&lt;br /&gt;
* sqlite3&lt;br /&gt;
&lt;br /&gt;
=== Подготовка к установке ===&lt;br /&gt;
&lt;br /&gt;
Все программы и библиотеки, входящие в состав Deeptown SDK, собраны для установки в директорию /opt/deeptown. Абсолютно все изменения в Вашей системе будут происходить именно в этой директории; больше ничего использоваться не будет. Это сделано специально - для удобства удаления и/или переустановки SDK.&lt;br /&gt;
&lt;br /&gt;
Для удобства использования программ, добавьте путь /opt/deeptown/bin к пути поиска программ (переменная среды PATH). Если Вы используете bash, это можно сделать, добавив в $HOME/.bash_profile следующую строчку:&lt;br /&gt;
&lt;br /&gt;
 export PATH=/opt/deeptown/bin:$PATH&lt;br /&gt;
&lt;br /&gt;
Кроме того, рекомендуется установить для себя права на запись в директорию /opt/deeptown, чтобы производить установку новых пакетов под обычным пользователем, а не под рутом. Просто создайте эту директорию вручную и измените ее владельца на свою рабочую учетную запись.&lt;br /&gt;
&lt;br /&gt;
=== Установка dpmake ===&lt;br /&gt;
&lt;br /&gt;
Наконец, переходим к процессу установки.&lt;br /&gt;
&lt;br /&gt;
В первую очередь нужно вручную скачать и установить утилиту dpmake. Она предназначена для сборки библиотек на платформе Диптаун; она же служит простейшим менеджером пакетов Deeptown SDK.&lt;br /&gt;
&lt;br /&gt;
Последняя версия dpmake находится по адресу [http://dao.deeptown.org/release/all/dpmake.tbz2 http://dao.deeptown.org/release/all/dpmake.tbz2].&lt;br /&gt;
&lt;br /&gt;
Скачав ее, наберите следующие команды:&lt;br /&gt;
 tar -jxf dpmake.tbz2        # распаковываем архив&lt;br /&gt;
 cd dpmake                   # переходим в директорию сборки&lt;br /&gt;
 ./build                     # настройка и компиляция&lt;br /&gt;
 make install                # установка в /opt/deeptown&lt;br /&gt;
&lt;br /&gt;
Последняя команда может потребовать привелегий суперпользователя, если Вы не последовали предыдущему совету разрешить себе права на запись в /opt/deeptown.&lt;br /&gt;
&lt;br /&gt;
Чтобы убедиться, что Ваша система поддерживается, наберите команду&lt;br /&gt;
 dpmake_config --platform&lt;br /&gt;
&lt;br /&gt;
Эта команда выведет имя платформы, состоящее из названия ОС, архитектуры процессора и версии libc. На данный момент Deeptown SDK поддерживает следующие платформы:&lt;br /&gt;
* linux-i686-libc6&lt;br /&gt;
* linux-x86_64-libc6&lt;br /&gt;
&lt;br /&gt;
Если предыдущая команда вывела одну из указанных в списке платформ - все нормально, Вы можете продолжать установку.&lt;br /&gt;
&lt;br /&gt;
В противном случае, Вы можете попробовать одно из следующих действий:&lt;br /&gt;
* указать платформу вручную, передавая команде dpmake параметр ''--platform=имя_платформы_из_списка'';&lt;br /&gt;
* [[Обратная связь|Написать нам]] просьбу собрать Deeptown SDK для Вашей платформы. Мы постараемся сделать это как можно скорее; это не должно занять больше недели времени (в зависимости от занятости разработчиков).&lt;br /&gt;
&lt;br /&gt;
=== Установка пакетов ===&lt;br /&gt;
&lt;br /&gt;
Для установки пакетов служит команда&lt;br /&gt;
 dpmake binpkg имя_пакета&lt;br /&gt;
&lt;br /&gt;
Она автоматически загружает требуемый пакет с сервера и распаковывает его.&lt;br /&gt;
&lt;br /&gt;
Полный список пакетов в настоящее время выглядит так:&lt;br /&gt;
&lt;br /&gt;
* osa&lt;br /&gt;
* dptools&lt;br /&gt;
* bxl&lt;br /&gt;
* dpkernel&lt;br /&gt;
* deeptown &lt;br /&gt;
** diss&lt;br /&gt;
** gide&lt;br /&gt;
** mein&lt;br /&gt;
** network&lt;br /&gt;
** security&lt;br /&gt;
** servers&lt;br /&gt;
** startup&lt;br /&gt;
** stream&lt;br /&gt;
** tinyftpd&lt;br /&gt;
** utils&lt;br /&gt;
*** kpp_compiler&lt;br /&gt;
*** graphics_config&lt;br /&gt;
** world&lt;br /&gt;
&lt;br /&gt;
'''Примечание''': Пакеты '''deeptown''' и '''utils''' являются т. н. ''метапакетами'', содержащими все пакеты уровнем ниже. Таким образом, при установке пакета utils, будут установлены пакеты kpp_compiler и graphics_config; а при установке пакета deeptown — все пакеты от diss до world включительно.&lt;br /&gt;
&lt;br /&gt;
Более подробно почитать о назначении пакетов можно здесь: [[Описание установочных пакетов]].&lt;br /&gt;
&lt;br /&gt;
=== Завершение установки ===&lt;br /&gt;
&lt;br /&gt;
Наконец, для использования SDK, требуется выполнить следующие действия.&lt;br /&gt;
&lt;br /&gt;
Прежде всего необходимо установить файлы данных, с которыми будут работать программы из SDK. Подробное описание этих файлов и их форматов можно найти в соответствующей документации.&lt;br /&gt;
&lt;br /&gt;
Последнюю версию медиаданных всегда можно найти по адресу [http://dao.deeptown.org/release/all/media.rar http://dao.deeptown.org/release/all/media.rar]. Загрузите и распакуйте этот архив в любое удобное для Вас место на диске.&lt;br /&gt;
&lt;br /&gt;
При этом необходимо учесть следующие моменты:&lt;br /&gt;
* программам будет требоваться доступ на запись в пределах этой директории;&lt;br /&gt;
* многое из того, что Вы будете создавать с использованием Deeptown SDK, будет сохраняться в рамках этой директории. Поэтому, когда загружаете новую версию media, не удаляйте старую, а распаковывайте файлы поверх предыдущих.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- После того, как директория media распакована, нужно перейти в нее, скопировать файл config.dsh.sample в файл config.dsh, и отредактировать его в соответствии со своими нуждами. В файле приводятся подробные комментарии ко всем опциям. За более подробной информацией я опять же отсылаю Вас к соответствующей документации. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И самое последнее, что необходимо сделать — это определить три переменные среды, которые используются для поиска необходимых файлов:&lt;br /&gt;
* DEEPTOWN_LIBRARY = /opt/deeptown/lib — путь к плагинам;&lt;br /&gt;
* DEEPTOWN_MEDIA — путь к директории media, про которую шла речь выше;&lt;br /&gt;
* DEEPTOWN_CONFIG = /opt/deeptown/etc/deeptown — путь к файлам конфигурации.&lt;br /&gt;
&lt;br /&gt;
Для того же bash соответствующие строки в .bash_profile будут выглядеть следующим образом:&lt;br /&gt;
 export DEEPTOWN_LIBRARY=&amp;quot;/opt/deeptown/lib&amp;quot;&lt;br /&gt;
 export DEEPTOWN_CONFIG=&amp;quot;/opt/deeptown/etc/deeptown&amp;quot;&lt;br /&gt;
 export DEEPTOWN_MEDIA=&amp;quot;/home/user/deeptown/media&amp;quot;   # замените на свой путь!&lt;br /&gt;
&lt;br /&gt;
=== Быстрый старт использования компилятора K++ ===&lt;br /&gt;
&lt;br /&gt;
Текущий пользователь — user.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 1. Создаем /opt/deeptown и устанавливаем права:&lt;br /&gt;
sudo mkdir /opt/deeptown&lt;br /&gt;
sudo chown user:user /opt/deeptown&lt;br /&gt;
&lt;br /&gt;
# 2. Устанавливаем dpmake&lt;br /&gt;
cd ~&lt;br /&gt;
wget http://dao.deeptown.org/release/all/dpmake.tbz2&lt;br /&gt;
tar -jxf dpmake.tbz2&lt;br /&gt;
cd dpmake&lt;br /&gt;
./build&lt;br /&gt;
make install&lt;br /&gt;
&lt;br /&gt;
# 3. Прописываем необходимые переменные среды&lt;br /&gt;
cd ~&lt;br /&gt;
echo 'export PATH=&amp;quot;/opt/deeptown/bin:$PATH&amp;quot;' &amp;gt;&amp;gt; .bash_profile&lt;br /&gt;
echo 'export DEEPTOWN_LIBRARY=&amp;quot;/opt/deeptown/lib&amp;quot;' &amp;gt;&amp;gt; .bash_profile&lt;br /&gt;
echo 'export DEEPTOWN_CONFIG=&amp;quot;/opt/deeptown/etc/deeptown&amp;quot;' &amp;gt;&amp;gt; .bash_profile&lt;br /&gt;
echo 'export DEEPTOWN_MEDIA=&amp;quot;/home/user/deeptown/media&amp;quot;' &amp;gt;&amp;gt; .bash_profile&lt;br /&gt;
. .bash_profile&lt;br /&gt;
&lt;br /&gt;
# 4. Устанавливаем необходимые пакеты&lt;br /&gt;
dpmake binpkg osa&lt;br /&gt;
dpmake binpkg bxl&lt;br /&gt;
dpmake binpkg dpkernel&lt;br /&gt;
dpmake binpkg gide&lt;br /&gt;
dpmake binpkg kpp_compiler&lt;br /&gt;
&lt;br /&gt;
# 5. Распаковываем media&lt;br /&gt;
cd ~&lt;br /&gt;
mkdir -p deeptown/media&lt;br /&gt;
cd deeptown/media&lt;br /&gt;
wget http://dao.deeptown.org/release/all/media.rar&lt;br /&gt;
rar x media.rar&lt;br /&gt;
&lt;br /&gt;
# 6. Используем&lt;br /&gt;
cd ~&lt;br /&gt;
echo 'package test; export function main() { puts(&amp;quot;Hello, world!\n&amp;quot;); }' &amp;gt; test.kpp&lt;br /&gt;
kpp -e test.kpp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Запустите kpp без параметров, чтобы получить полный список поддерживаемых опций.&lt;br /&gt;
&lt;br /&gt;
== Установка SDK на ОС Windows ==&lt;br /&gt;
&lt;br /&gt;
На ОС Windows все гораздо проще: мы подготовили программу-инсталлятор, которая все сделает сама.&lt;br /&gt;
&lt;br /&gt;
Скачать инсталлятор можно по адресу [http://dao.deeptown.org/release/windows-x86/deep_sdk_win32.exe deep_sdk_win32.exe].&lt;br /&gt;
&lt;br /&gt;
Обращаем Ваше внимание на то, что при первом запуске требуется подождать некоторое время, пока идет индексация содержимого. При последующих запусках ждать будет не нужно.&lt;br /&gt;
&lt;br /&gt;
=== Примечания ===&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что устанавливаемый файл &amp;lt;tt&amp;gt;kpp.exe&amp;lt;/tt&amp;gt; является консольной утилитой. Его нужно запускать из командной строки. Для получения списка возможных параметров, наберите &amp;lt;tt&amp;gt;kpp -h&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Что дальше? ==&lt;br /&gt;
&lt;br /&gt;
Дальше, если все прошло успешно, вы можете обратиться к странице &amp;quot;[[с чего начать]]&amp;quot;, где вкратце описано что и как можно делать.&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/Node_(DISS)</id>
		<title>Node (DISS)</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/Node_(DISS)"/>
				<updated>2008-05-03T05:27:13Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* revert */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Класс &amp;lt;tt&amp;gt;Node&amp;lt;/tt&amp;gt; является базовым классом, представляющим элементы графа файловой системы [[DISS]]. Класс предоставляет общие для всех типов нод методы, например метод &amp;lt;tt&amp;gt;[[#path|path]]&amp;lt;/tt&amp;gt;, возвращающий путь до данной ноды. Потомки класса &amp;lt;tt&amp;gt;Node&amp;lt;/tt&amp;gt; представляют конкретные типы сущностей, например &amp;lt;tt&amp;gt;[[File]]&amp;lt;/tt&amp;gt; или &amp;lt;tt&amp;gt;[[Directory]]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Родители''': &amp;lt;tt&amp;gt;[[Object]]&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
'''Методы''': &amp;lt;tt&amp;gt;&lt;br /&gt;
[[#mountPoint|mountPoint]]&lt;br /&gt;
[[#rights|rights]]&lt;br /&gt;
[[#path|path]]&lt;br /&gt;
[[#deleteTag|deleteTag]]&lt;br /&gt;
[[#revision|revision]]&lt;br /&gt;
[[#revision=|revision=]]&lt;br /&gt;
[[#firstRevision|firstRevision]]&lt;br /&gt;
[[#lastRevision|lastRevision]]&lt;br /&gt;
[[#revisionBefore|revisionBefore]]&lt;br /&gt;
[[#revisionAfter|revisionAfter]]&lt;br /&gt;
[[#revisionCTime|revisionCTime]]&lt;br /&gt;
[[#revisionATime|revisionATime]]&lt;br /&gt;
[[#revert|revert]]&lt;br /&gt;
[[#delete|delete]]&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Операторы''': [[операторы индексного доступа]]&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
== операторы индексного доступа ==&lt;br /&gt;
&lt;br /&gt;
operator [] &amp;lt;br&amp;gt;&lt;br /&gt;
'''Возвращает''': &amp;lt;tt&amp;gt;[[array]]&amp;lt;[[string]]&amp;gt;&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Оператор индексного чтения возвращает массив строк, содержащих тэги метаинформации.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
operator []= (''ключ'': &amp;lt;tt&amp;gt;[[string]]&amp;lt;/tt&amp;gt;, ''значение'': &amp;lt;tt&amp;gt;[[string]]&amp;lt;/tt&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
operator []= (''ключ'': &amp;lt;tt&amp;gt;[[string]]&amp;lt;/tt&amp;gt;, ''значение'': &amp;lt;tt&amp;gt;[[array]]&amp;lt;[[string]]&amp;gt;&amp;lt;/tt&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
'''Возвращает''': текущий объект &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Оператор индексной записи записывает метаинформацию по указанному ключу. В качестве значения может быть передана либо строка, либо массив строк.&lt;br /&gt;
&lt;br /&gt;
== mountPoint ==&lt;br /&gt;
&lt;br /&gt;
'''Возвращает''': &amp;lt;tt&amp;gt;[[MountPoint]]&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод возвращает точку монтирования, которая поддерживает данную ноду.&lt;br /&gt;
&lt;br /&gt;
== rights ==&lt;br /&gt;
&lt;br /&gt;
'''Возвращает''': &amp;lt;tt&amp;gt;[[int]]&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод возвращает число, соответствующее правам доступа для данной ноды.&lt;br /&gt;
&lt;br /&gt;
== path ==&lt;br /&gt;
&lt;br /&gt;
'''Возвращает''': &amp;lt;tt&amp;gt;[[string]]&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод возвращает полный путь до данной ноды.&lt;br /&gt;
&lt;br /&gt;
== deleteTag ==&lt;br /&gt;
&lt;br /&gt;
deleteTag(''ключ'': &amp;lt;tt&amp;gt;[[string]]&amp;lt;/tt&amp;gt;, &amp;lt;span style=&amp;quot;background-color: #EBEBEB;&amp;quot;&amp;gt;''значение'': &amp;lt;tt&amp;gt;[[string]]&amp;lt;/tt&amp;gt;&amp;lt;/span&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
'''Возвращает''': текущий объект &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод удаляет переданный тэг (ключ и все значения) из метаинформации данной ноды. Если передан второй параметр, то будет удалена только соответствующая пара ключ-значение.&lt;br /&gt;
&lt;br /&gt;
== revision ==&lt;br /&gt;
&lt;br /&gt;
'''Возвращает''': &amp;lt;tt&amp;gt;[[int]]&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод возвращает текущую ревизию файла.&lt;br /&gt;
&lt;br /&gt;
== revision= ==&lt;br /&gt;
&lt;br /&gt;
revision= (''требуемая ревизия'': &amp;lt;tt&amp;gt;[[int]]&amp;lt;/tt&amp;gt;)&amp;lt;br&amp;gt;&lt;br /&gt;
'''Возвращает''': текущий объект &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод устанавливает текущую ревизию для ноды. Соответственно, при открытии файла на чтение будет открываться эта ревизия.&lt;br /&gt;
&lt;br /&gt;
== firstRevision ==&lt;br /&gt;
&lt;br /&gt;
'''Возвращает''': &amp;lt;tt&amp;gt;[[int]]&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод возвращает номер первой из доступных (имеющихся) ревизий.&lt;br /&gt;
&lt;br /&gt;
== lastRevision ==&lt;br /&gt;
&lt;br /&gt;
'''Возвращает''': &amp;lt;tt&amp;gt;[[int]]&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод возвращает номер последней из доступных (имеющихся) ревизий.&lt;br /&gt;
&lt;br /&gt;
== revisionBefore ==&lt;br /&gt;
&lt;br /&gt;
revisionBefore(''время'': &amp;lt;tt&amp;gt;[[int]]&amp;lt;/tt&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
'''Возвращает''': &amp;lt;tt&amp;gt;[[int]]&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод возвращает ревизию, созданную раньше указанного времени.&lt;br /&gt;
&lt;br /&gt;
== revisionAfter ==&lt;br /&gt;
&lt;br /&gt;
revisionAfter(''время'': &amp;lt;tt&amp;gt;[[int]]&amp;lt;/tt&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
'''Возвращает''': &amp;lt;tt&amp;gt;[[int]]&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод возвращает ревизию, созданную позднее указанного времени.&lt;br /&gt;
&lt;br /&gt;
== revisionCTime ==&lt;br /&gt;
&lt;br /&gt;
revisionAfter(''ревизия'': &amp;lt;tt&amp;gt;[[int]]&amp;lt;/tt&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
'''Возвращает''': &amp;lt;tt&amp;gt;[[int]]&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод возвращает время создания указанной ревизии.&lt;br /&gt;
&lt;br /&gt;
== revisionATime ==&lt;br /&gt;
&lt;br /&gt;
revisionAfter(''ревизия'': &amp;lt;tt&amp;gt;[[int]]&amp;lt;/tt&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
'''Возвращает''': &amp;lt;tt&amp;gt;[[int]]&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод возвращает время последнего доступа к указанной ревизии.&lt;br /&gt;
&lt;br /&gt;
== revert ==&lt;br /&gt;
&lt;br /&gt;
revert(''ревизия'': &amp;lt;tt&amp;gt;[[int]]&amp;lt;/tt&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
'''Возвращает''': текущий объект &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод совершает откат файла до указанной ревизии. Откат осуществляется путем создания новой ревизии на основе копии указанной.&lt;br /&gt;
&lt;br /&gt;
== delete ==&lt;br /&gt;
&lt;br /&gt;
Метод удаляет ноду из файловой системы. Удаляются все ревии и соответствующая метаинформация.&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0</id>
		<title>Заглавная страница</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0"/>
				<updated>2008-05-01T02:38:34Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Документация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Информация ==&lt;br /&gt;
&lt;br /&gt;
* [[О проекте]]&lt;br /&gt;
* [[Deeptown SDK]]&lt;br /&gt;
* [[Bugzilla]]&lt;br /&gt;
* [[Рассылка]]&lt;br /&gt;
* [[Release Notes]]&lt;br /&gt;
* [[Обратная связь]]&lt;br /&gt;
&lt;br /&gt;
== Документация ==&lt;br /&gt;
&lt;br /&gt;
* [[K++]]&lt;br /&gt;
* [[World Engine]]&lt;br /&gt;
* [[Платформа Gide]]&lt;br /&gt;
* [[Стандартная библиотека gide]]&lt;br /&gt;
* [[Туториалы и HOWTO]]&lt;br /&gt;
* [[Building and running from source]]&lt;br /&gt;
* [[Советы и подсказки]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2</id>
		<title>Основы программирования объектов</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2"/>
				<updated>2008-04-27T11:01:53Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Класс Sensor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Каждое уведомление, которое получает объект (а таких уведомлений бывает 5 типов - см. предыдущий раздел), он передает в свой обработчик событий (у одного объекта может быть несколько обработчиков, но использовать эту возможность не рекомендуется).&lt;br /&gt;
&lt;br /&gt;
Сам обработчик может быть реализован либо в движке, либо в модуле-расширении - это просто некоторый объект, получающий события и выполняющий определенные действия на них. Но в данном разделе нас будет интересовать прикладное программирование объектов на гайд-совместимых языках.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы это стало возможным, реализован обработчик gide, который все полученные события передает гайд-объекту, а также предоставляет ряд классов для работы с объектом из прикладного кода.&lt;br /&gt;
&lt;br /&gt;
== Задание обработчика для объекта ==&lt;br /&gt;
&lt;br /&gt;
Как уже было сказано в примере в предыдущем разделе, URL обработчика задается в файле описания объекта следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;model bxd=&amp;quot;http://dao.deeptown.org/bxd/model.bxd&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- ... --&amp;gt;&lt;br /&gt;
    &amp;lt;externals&amp;gt;&lt;br /&gt;
        &amp;lt;event_receiver url=&amp;quot;gide:/media/scripts/cube_small_dynamic.gbc!cube_small_dynamic/CubeSmallDynamic&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/externals&amp;gt;&lt;br /&gt;
&amp;lt;/model&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как видим, в адресе фигурирует имя DISS-файла с байткодом (расширение gbc) и имя класса, который будет обрабатывать события нашего объекта. Обратите внимание, что имя класса - '''полное'''; оно состоит из имени модуля (слово после '''package'''), символа &amp;quot;/&amp;quot; и имени класса.&lt;br /&gt;
&lt;br /&gt;
Все примеры далее будут написаны на языке [[K++]].&lt;br /&gt;
&lt;br /&gt;
Вот простейший код обработчика, который никак не реагирует на события, происходящие с объектом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
package cube_small_dynamic;&lt;br /&gt;
&lt;br /&gt;
import World;&lt;br /&gt;
using World;&lt;br /&gt;
&lt;br /&gt;
class CubeSmallDynamic extends WorldObject&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.е. это просто класс, унаследованный от класса WorldObject, объявленного в модуле World.&lt;br /&gt;
&lt;br /&gt;
== Обработка уведомлений ==&lt;br /&gt;
&lt;br /&gt;
Все уведомления, которые приходят к объекту, по-умолчанию передаются методам нашего объекта-обработчика, имя которых строится из типа уведомления и имени события. Более подробно об этом будет рассказано в разделах, посвященных конкретным взаимодействиям; сейчас нам важно отметить одно: чтобы обработать какое-либо уведомление, все, что нужно сделать - это добавить в тело нашего класса функцию-обработчик со специальным именем. Никаких дополнительных манипуляций, как то регистрация этого обработчика где-либо, или вызов его в зависимости от каких-либо условий, делать не нужно.&lt;br /&gt;
&lt;br /&gt;
Например, когда объект создается, ему высылается уведомление о состоянии объекта &amp;quot;init&amp;quot;. Для того, чтобы обработать это уведомление, нужно определить в нашем классе метод State_init без параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
class CubeSmallDynamic extends WorldObject&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    function void State_init()&lt;br /&gt;
    {&lt;br /&gt;
        // Функция будет вызвана в момент создания объекта&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Функции и классы модуля world ==&lt;br /&gt;
&lt;br /&gt;
=== Класс Object ===&lt;br /&gt;
&lt;br /&gt;
Этот класс является прародителем всех классов, представляющих объекты виртуального пространства. В нем определены следующие методы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
class Object&lt;br /&gt;
{&lt;br /&gt;
    constructor connect(const uid UID); // создает объект по его UID&lt;br /&gt;
    public operator Object = (const Object obj);  // оператор присваивания&lt;br /&gt;
    public function uid const getUID(); // возвращает UID объекта&lt;br /&gt;
    public function bool const isLocal(); // true если объект находится на текущем сервере&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Отдельного комментария заслуживает лишь метод isLocal(). Он возвращает true, если объект, с которым мы работаем, находится на том же сервере, на котором находится наш обработчик. Дело в том, что объекты в сети Диптауна могут передаваться от сервера к серверу в процессе существования, и если объект находится на другом сервере, общение с ним происходит по относительно медленному механизму событий сетевого движка.&lt;br /&gt;
&lt;br /&gt;
=== Класс WorldObject ===&lt;br /&gt;
&lt;br /&gt;
Этот класс унаследован от Object и представляет собой интерфейс для объекта пространства. В нем определены следующие методы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
class WorldObject extends Object&lt;br /&gt;
{&lt;br /&gt;
    constructor connect(const uid UID); // аналогично&lt;br /&gt;
    public function WorldObject const guest(); // сброс привелегий&lt;br /&gt;
    public function array const motorNames(); // список моторов&lt;br /&gt;
    public function Motor const getMotor(const string name); // мотор по имени&lt;br /&gt;
    public function Sensor const createSensor(const string url, const string signal); // создать сенсор&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функция guest возвращает копию данного объекта, не обладающую привелегиями управления своими моторами и сенсорами. На данный момент, просто не обращайте на нее внимания.&lt;br /&gt;
&lt;br /&gt;
Функция motorNames() возвращает массив строк - имен моторов, которые установлены на объекте. Напоминаю, что сами моторы перечислены в файле описания объекта и не могут быть динамически добавлены или удалены.&lt;br /&gt;
&lt;br /&gt;
Функция getMotor() возвращает мотор по его имени (см. описание класса ниже).&lt;br /&gt;
&lt;br /&gt;
Функция createSensor() создает сенсор. Первый параметр - это URL сенсора, который, как обычно, состоит из типа и адреса, разделенных двоеточием. Второй параметр - имя сигнала, который будет передан нашему обработчику в случае срабатвания сенсора. В классе должен быть определен метод Signal_xxx, где xxx - это имя сигнала. Например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
class MyObject extends WorldObject&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    function void State_init()&lt;br /&gt;
    {&lt;br /&gt;
        // Создаем сенсор:&lt;br /&gt;
        this.createSensor('type:address', :makaka);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Функция-обработчик сигнала makaka, который будет послан сенсором&lt;br /&gt;
    // в случае его срабатывания:&lt;br /&gt;
    function Signal_makaka(const bytea args)&lt;br /&gt;
    {&lt;br /&gt;
        // Реакция на сигнал...&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обратите также внимание, что в функцию-обработчик сигнала передается параметр типа bytea. Его значение зависит от конкретного сенсора, здесь могут быть произвольные параметры, упакованные в бинарную строку. Для их распаковки реализована вспомогательная функция parseArguments().&lt;br /&gt;
&lt;br /&gt;
=== Класс Scene ===&lt;br /&gt;
&lt;br /&gt;
Пока не рассматриваем.&lt;br /&gt;
&lt;br /&gt;
=== Класс Motor ===&lt;br /&gt;
&lt;br /&gt;
Данный класс предоставляет интерфейс мотора. Объекты этого класса создаются путем вызова метода getMotor() объекта-обработчика.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
class Motor&lt;br /&gt;
{&lt;br /&gt;
    public operator Motor = (const Motor what);&lt;br /&gt;
    public function void enable(); // включить мотор&lt;br /&gt;
    public function void disable(); // выключить&lt;br /&gt;
    public function bool isEnabled(); // включен ли?&lt;br /&gt;
    public function array const paramNames(); // имена параметров&lt;br /&gt;
    public function real const getParam(const string name); // получить параметр&lt;br /&gt;
    public function void setParam(const string name, const real value); // установить параметр&lt;br /&gt;
    public function array const statusNames(); // имена статусов&lt;br /&gt;
    public function real const getStatus(const string name); // получить статус&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для включения и выключения мотора служат функции enable() и disable(). По-умолчанию все моторы выключены. Функция isEnabled() возвращает текущее состояние мотора.&lt;br /&gt;
&lt;br /&gt;
Функции paramNames(), getParam() и setParam() позволяют управлять параметрами мотора. Количество и смысл этих параметров зависит от конкретного типа мотора. Например, у уже рассмотренного нами в предыдущих разделах мотора linear_speed таких параметров два: speed и force. speed определяет скорость, до которой мотор разгоняет объект, а force - максимальную силу, которую мотор прикладывает к объекту.&lt;br /&gt;
&lt;br /&gt;
Аналогично, statusNames() и getStatus() позволяют получать статусы мотора, которые также зависят от конкретного типа мотора.&lt;br /&gt;
&lt;br /&gt;
=== Класс Sensor ===&lt;br /&gt;
&lt;br /&gt;
Данный класс предоставляет интерфейс сенсора. Объекты этого класса создаются путем вызова метода createSensor() объекта-обработчика. Обратите внимание, что сенсоры никак не проиндексированы в объекте, т.е. создав сенсор, невозможно потом получить его интерфейс по имени или еще каким-либо способом. Поэтому, если Вам требуется изменять какие-то параметры сенсора после его создания, сохраняйте его экземпляр в полях класса.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
class Sensor&lt;br /&gt;
{&lt;br /&gt;
    public operator Sensor = (const Sensor what);&lt;br /&gt;
    public function void enable(); // включить сенсор&lt;br /&gt;
    public function void disable(); // выключить сенсор&lt;br /&gt;
    public function bool isEnabled(); // включен ли?&lt;br /&gt;
    public function void erase(); // удалить сенсор&lt;br /&gt;
    public function array const paramNames(); // список параметров&lt;br /&gt;
    public function getParam(const string name); // получить параметр&lt;br /&gt;
    public function void setParam(const string name, const value); // установить&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функции enable() / disable() включают / выключают сенсор. В отличие от моторов, при создании сенсор по-умолчанию включен. isEnabled() возвращает текущее состояние.&lt;br /&gt;
&lt;br /&gt;
Функция erase() удаляет сенсор. Все обращения к другим методам после erase() приведут к генерации исключения.&lt;br /&gt;
&lt;br /&gt;
Функции paramNames() / getParam() / setParam() управляют параметрами сенсора. В отличие от параметров моторов, параметры сенсоров могут иметь произвольный простой тип. Функция getParam() может вернуть:&lt;br /&gt;
* целое число&lt;br /&gt;
* массив целых чисел&lt;br /&gt;
* вещественное число&lt;br /&gt;
* массив вещественных чисел&lt;br /&gt;
* uid&lt;br /&gt;
* массив из uid&lt;br /&gt;
* строку.&lt;br /&gt;
&lt;br /&gt;
В setParam() значение параметра нужно указывать в том же виде, в котором его вернула getParam(). Более подробно это описано в документации по конкретным сенсорам.&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2</id>
		<title>Основы программирования объектов</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2"/>
				<updated>2008-04-27T10:22:11Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Класс WorldObject */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Каждое уведомление, которое получает объект (а таких уведомлений бывает 5 типов - см. предыдущий раздел), он передает в свой обработчик событий (у одного объекта может быть несколько обработчиков, но использовать эту возможность не рекомендуется).&lt;br /&gt;
&lt;br /&gt;
Сам обработчик может быть реализован либо в движке, либо в модуле-расширении - это просто некоторый объект, получающий события и выполняющий определенные действия на них. Но в данном разделе нас будет интересовать прикладное программирование объектов на гайд-совместимых языках.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы это стало возможным, реализован обработчик gide, который все полученные события передает гайд-объекту, а также предоставляет ряд классов для работы с объектом из прикладного кода.&lt;br /&gt;
&lt;br /&gt;
== Задание обработчика для объекта ==&lt;br /&gt;
&lt;br /&gt;
Как уже было сказано в примере в предыдущем разделе, URL обработчика задается в файле описания объекта следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;model bxd=&amp;quot;http://dao.deeptown.org/bxd/model.bxd&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- ... --&amp;gt;&lt;br /&gt;
    &amp;lt;externals&amp;gt;&lt;br /&gt;
        &amp;lt;event_receiver url=&amp;quot;gide:/media/scripts/cube_small_dynamic.gbc!cube_small_dynamic/CubeSmallDynamic&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/externals&amp;gt;&lt;br /&gt;
&amp;lt;/model&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как видим, в адресе фигурирует имя DISS-файла с байткодом (расширение gbc) и имя класса, который будет обрабатывать события нашего объекта. Обратите внимание, что имя класса - '''полное'''; оно состоит из имени модуля (слово после '''package'''), символа &amp;quot;/&amp;quot; и имени класса.&lt;br /&gt;
&lt;br /&gt;
Все примеры далее будут написаны на языке [[K++]].&lt;br /&gt;
&lt;br /&gt;
Вот простейший код обработчика, который никак не реагирует на события, происходящие с объектом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
package cube_small_dynamic;&lt;br /&gt;
&lt;br /&gt;
import World;&lt;br /&gt;
using World;&lt;br /&gt;
&lt;br /&gt;
class CubeSmallDynamic extends WorldObject&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.е. это просто класс, унаследованный от класса WorldObject, объявленного в модуле World.&lt;br /&gt;
&lt;br /&gt;
== Обработка уведомлений ==&lt;br /&gt;
&lt;br /&gt;
Все уведомления, которые приходят к объекту, по-умолчанию передаются методам нашего объекта-обработчика, имя которых строится из типа уведомления и имени события. Более подробно об этом будет рассказано в разделах, посвященных конкретным взаимодействиям; сейчас нам важно отметить одно: чтобы обработать какое-либо уведомление, все, что нужно сделать - это добавить в тело нашего класса функцию-обработчик со специальным именем. Никаких дополнительных манипуляций, как то регистрация этого обработчика где-либо, или вызов его в зависимости от каких-либо условий, делать не нужно.&lt;br /&gt;
&lt;br /&gt;
Например, когда объект создается, ему высылается уведомление о состоянии объекта &amp;quot;init&amp;quot;. Для того, чтобы обработать это уведомление, нужно определить в нашем классе метод State_init без параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
class CubeSmallDynamic extends WorldObject&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    function void State_init()&lt;br /&gt;
    {&lt;br /&gt;
        // Функция будет вызвана в момент создания объекта&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Функции и классы модуля world ==&lt;br /&gt;
&lt;br /&gt;
=== Класс Object ===&lt;br /&gt;
&lt;br /&gt;
Этот класс является прародителем всех классов, представляющих объекты виртуального пространства. В нем определены следующие методы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
class Object&lt;br /&gt;
{&lt;br /&gt;
    constructor connect(const uid UID); // создает объект по его UID&lt;br /&gt;
    public operator Object = (const Object obj);  // оператор присваивания&lt;br /&gt;
    public function uid const getUID(); // возвращает UID объекта&lt;br /&gt;
    public function bool const isLocal(); // true если объект находится на текущем сервере&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Отдельного комментария заслуживает лишь метод isLocal(). Он возвращает true, если объект, с которым мы работаем, находится на том же сервере, на котором находится наш обработчик. Дело в том, что объекты в сети Диптауна могут передаваться от сервера к серверу в процессе существования, и если объект находится на другом сервере, общение с ним происходит по относительно медленному механизму событий сетевого движка.&lt;br /&gt;
&lt;br /&gt;
=== Класс WorldObject ===&lt;br /&gt;
&lt;br /&gt;
Этот класс унаследован от Object и представляет собой интерфейс для объекта пространства. В нем определены следующие методы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
class WorldObject extends Object&lt;br /&gt;
{&lt;br /&gt;
    constructor connect(const uid UID); // аналогично&lt;br /&gt;
    public function WorldObject const guest(); // сброс привелегий&lt;br /&gt;
    public function array const motorNames(); // список моторов&lt;br /&gt;
    public function Motor const getMotor(const string name); // мотор по имени&lt;br /&gt;
    public function Sensor const createSensor(const string url, const string signal); // создать сенсор&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функция guest возвращает копию данного объекта, не обладающую привелегиями управления своими моторами и сенсорами. На данный момент, просто не обращайте на нее внимания.&lt;br /&gt;
&lt;br /&gt;
Функция motorNames() возвращает массив строк - имен моторов, которые установлены на объекте. Напоминаю, что сами моторы перечислены в файле описания объекта и не могут быть динамически добавлены или удалены.&lt;br /&gt;
&lt;br /&gt;
Функция getMotor() возвращает мотор по его имени (см. описание класса ниже).&lt;br /&gt;
&lt;br /&gt;
Функция createSensor() создает сенсор. Первый параметр - это URL сенсора, который, как обычно, состоит из типа и адреса, разделенных двоеточием. Второй параметр - имя сигнала, который будет передан нашему обработчику в случае срабатвания сенсора. В классе должен быть определен метод Signal_xxx, где xxx - это имя сигнала. Например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
class MyObject extends WorldObject&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    function void State_init()&lt;br /&gt;
    {&lt;br /&gt;
        // Создаем сенсор:&lt;br /&gt;
        this.createSensor('type:address', :makaka);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Функция-обработчик сигнала makaka, который будет послан сенсором&lt;br /&gt;
    // в случае его срабатывания:&lt;br /&gt;
    function Signal_makaka(const bytea args)&lt;br /&gt;
    {&lt;br /&gt;
        // Реакция на сигнал...&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обратите также внимание, что в функцию-обработчик сигнала передается параметр типа bytea. Его значение зависит от конкретного сенсора, здесь могут быть произвольные параметры, упакованные в бинарную строку. Для их распаковки реализована вспомогательная функция parseArguments().&lt;br /&gt;
&lt;br /&gt;
=== Класс Scene ===&lt;br /&gt;
&lt;br /&gt;
Пока не рассматриваем.&lt;br /&gt;
&lt;br /&gt;
=== Класс Motor ===&lt;br /&gt;
&lt;br /&gt;
Данный класс предоставляет интерфейс мотора. Объекты этого класса создаются путем вызова метода getMotor() объекта-обработчика.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
class Motor&lt;br /&gt;
{&lt;br /&gt;
    public operator Motor = (const Motor what);&lt;br /&gt;
    public function void enable(); // включить мотор&lt;br /&gt;
    public function void disable(); // выключить&lt;br /&gt;
    public function bool isEnabled(); // включен ли?&lt;br /&gt;
    public function array const paramNames(); // имена параметров&lt;br /&gt;
    public function real const getParam(const string name); // получить параметр&lt;br /&gt;
    public function void setParam(const string name, const real value); // установить параметр&lt;br /&gt;
    public function array const statusNames(); // имена статусов&lt;br /&gt;
    public function real const getStatus(const string name); // получить статус&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для включения и выключения мотора служат функции enable() и disable(). По-умолчанию все моторы выключены. Функция isEnabled() возвращает текущее состояние мотора.&lt;br /&gt;
&lt;br /&gt;
Функции paramNames(), getParam() и setParam() позволяют управлять параметрами мотора. Количество и смысл этих параметров зависит от конкретного типа мотора. Например, у уже рассмотренного нами в предыдущих разделах мотора linear_speed таких параметров два: speed и force. speed определяет скорость, до которой мотор разгоняет объект, а force - максимальную силу, которую мотор прикладывает к объекту.&lt;br /&gt;
&lt;br /&gt;
Аналогично, statusNames() и getStatus() позволяют получать статусы мотора, которые также зависят от конкретного типа мотора.&lt;br /&gt;
&lt;br /&gt;
=== Класс Sensor ===&lt;br /&gt;
&lt;br /&gt;
Данный класс предоставляет интерфейс сенсора. Объекты этого класса создаются путем вызова метода createSensor() объекта-обработчика. Обратите внимание, что сенсоры никак не проиндексированы в объекте, т.е. создав сенсор, невозможно потом получить его интерфейс по имени или еще каким-либо способом. Поэтому, если Вам требуется изменять какие-то параметры сенсора после его создания, сохраняйте его экземпляр в полях класса.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
class Sensor&lt;br /&gt;
{&lt;br /&gt;
    public operator Sensor = (const Sensor what);&lt;br /&gt;
    public function void enable(); // включить сенсор&lt;br /&gt;
    public function void disable(); // выключить сенсор&lt;br /&gt;
    public function bool isEnabled(); // включен ли?&lt;br /&gt;
    public function void erase(); // удалить сенсор&lt;br /&gt;
    public function array const paramNames(); // список параметров&lt;br /&gt;
    public function getParam(const string name); // получить параметр&lt;br /&gt;
    public function void setParam(const string name, const string value); // установить&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функции enable() / disable() включают / выключают сенсор. В отличие от моторов, при создании сенсор по-умолчанию включен. isEnabled() возвращает текущее состояние.&lt;br /&gt;
&lt;br /&gt;
Функция erase() удаляет сенсор. Все обращения к другим методам после erase() приведут к генерации исключения.&lt;br /&gt;
&lt;br /&gt;
Функции paramNames() / getParam() / setParam() управляют параметрами сенсора. В отличие от параметров моторов, параметры сенсоров могут иметь произвольный простой тип. Функция getParam() может вернуть:&lt;br /&gt;
* целое число&lt;br /&gt;
* массив целых чисел&lt;br /&gt;
* вещественное число&lt;br /&gt;
* массив вещественных чисел&lt;br /&gt;
* uid&lt;br /&gt;
* массив из uid&lt;br /&gt;
* строку.&lt;br /&gt;
&lt;br /&gt;
В setParam() значение параметра нужно указывать в виде строки с точным указанием низкоуровневого типа (на уровне реализации - стандартная строка для типа vary). Например, &amp;quot;dword 3&amp;quot; - целое число 3; &amp;quot;float 3.1,3.2,3.3&amp;quot; - массив из трех вещественных чисел, и т.д.&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2</id>
		<title>Основы программирования объектов</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2"/>
				<updated>2008-04-27T10:21:14Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Обработка уведомлений */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Каждое уведомление, которое получает объект (а таких уведомлений бывает 5 типов - см. предыдущий раздел), он передает в свой обработчик событий (у одного объекта может быть несколько обработчиков, но использовать эту возможность не рекомендуется).&lt;br /&gt;
&lt;br /&gt;
Сам обработчик может быть реализован либо в движке, либо в модуле-расширении - это просто некоторый объект, получающий события и выполняющий определенные действия на них. Но в данном разделе нас будет интересовать прикладное программирование объектов на гайд-совместимых языках.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы это стало возможным, реализован обработчик gide, который все полученные события передает гайд-объекту, а также предоставляет ряд классов для работы с объектом из прикладного кода.&lt;br /&gt;
&lt;br /&gt;
== Задание обработчика для объекта ==&lt;br /&gt;
&lt;br /&gt;
Как уже было сказано в примере в предыдущем разделе, URL обработчика задается в файле описания объекта следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;model bxd=&amp;quot;http://dao.deeptown.org/bxd/model.bxd&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- ... --&amp;gt;&lt;br /&gt;
    &amp;lt;externals&amp;gt;&lt;br /&gt;
        &amp;lt;event_receiver url=&amp;quot;gide:/media/scripts/cube_small_dynamic.gbc!cube_small_dynamic/CubeSmallDynamic&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/externals&amp;gt;&lt;br /&gt;
&amp;lt;/model&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как видим, в адресе фигурирует имя DISS-файла с байткодом (расширение gbc) и имя класса, который будет обрабатывать события нашего объекта. Обратите внимание, что имя класса - '''полное'''; оно состоит из имени модуля (слово после '''package'''), символа &amp;quot;/&amp;quot; и имени класса.&lt;br /&gt;
&lt;br /&gt;
Все примеры далее будут написаны на языке [[K++]].&lt;br /&gt;
&lt;br /&gt;
Вот простейший код обработчика, который никак не реагирует на события, происходящие с объектом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
package cube_small_dynamic;&lt;br /&gt;
&lt;br /&gt;
import World;&lt;br /&gt;
using World;&lt;br /&gt;
&lt;br /&gt;
class CubeSmallDynamic extends WorldObject&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.е. это просто класс, унаследованный от класса WorldObject, объявленного в модуле World.&lt;br /&gt;
&lt;br /&gt;
== Обработка уведомлений ==&lt;br /&gt;
&lt;br /&gt;
Все уведомления, которые приходят к объекту, по-умолчанию передаются методам нашего объекта-обработчика, имя которых строится из типа уведомления и имени события. Более подробно об этом будет рассказано в разделах, посвященных конкретным взаимодействиям; сейчас нам важно отметить одно: чтобы обработать какое-либо уведомление, все, что нужно сделать - это добавить в тело нашего класса функцию-обработчик со специальным именем. Никаких дополнительных манипуляций, как то регистрация этого обработчика где-либо, или вызов его в зависимости от каких-либо условий, делать не нужно.&lt;br /&gt;
&lt;br /&gt;
Например, когда объект создается, ему высылается уведомление о состоянии объекта &amp;quot;init&amp;quot;. Для того, чтобы обработать это уведомление, нужно определить в нашем классе метод State_init без параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
class CubeSmallDynamic extends WorldObject&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    function void State_init()&lt;br /&gt;
    {&lt;br /&gt;
        // Функция будет вызвана в момент создания объекта&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Функции и классы модуля world ==&lt;br /&gt;
&lt;br /&gt;
=== Класс Object ===&lt;br /&gt;
&lt;br /&gt;
Этот класс является прародителем всех классов, представляющих объекты виртуального пространства. В нем определены следующие методы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
class Object&lt;br /&gt;
{&lt;br /&gt;
    constructor connect(const uid UID); // создает объект по его UID&lt;br /&gt;
    public operator Object = (const Object obj);  // оператор присваивания&lt;br /&gt;
    public function uid const getUID(); // возвращает UID объекта&lt;br /&gt;
    public function bool const isLocal(); // true если объект находится на текущем сервере&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Отдельного комментария заслуживает лишь метод isLocal(). Он возвращает true, если объект, с которым мы работаем, находится на том же сервере, на котором находится наш обработчик. Дело в том, что объекты в сети Диптауна могут передаваться от сервера к серверу в процессе существования, и если объект находится на другом сервере, общение с ним происходит по относительно медленному механизму событий сетевого движка.&lt;br /&gt;
&lt;br /&gt;
=== Класс WorldObject ===&lt;br /&gt;
&lt;br /&gt;
Этот класс унаследован от Object и представляет собой интерфейс для объекта пространства. В нем определены следующие методы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
class WorldObject extends Object&lt;br /&gt;
{&lt;br /&gt;
    constructor connect(const uid UID); // аналогично&lt;br /&gt;
    public function WorldObject const guest(); // сброс привелегий&lt;br /&gt;
    public function array const motorNames(); // список моторов&lt;br /&gt;
    public function Motor const getMotor(const string name); // мотор по имени&lt;br /&gt;
    public function Sensor const createSensor(const string url, const string signal); // создать сенсор&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функция guest возвращает копию данного объекта, не обладающую привелегиями управления своими моторами и сенсорами. На данный момент, просто не обращайте на нее внимания.&lt;br /&gt;
&lt;br /&gt;
Функция motorNames() возвращает массив строк - имен моторов, которые установлены на объекте. Напоминаю, что сами моторы перечислены в файле описания объекта и не могут быть динамически добавлены или удалены.&lt;br /&gt;
&lt;br /&gt;
Функция getMotor() возвращает мотор по его имени (см. описание класса ниже).&lt;br /&gt;
&lt;br /&gt;
Функция createSensor() создает сенсор. Первый параметр - это URL сенсора, который, как обычно, состоит из типа и адреса, разделенных двоеточием. Второй параметр - имя сигнала, который будет передан нашему обработчику в случае срабатвания сенсора. В классе должен быть определен метод Signal_xxx, где xxx - это имя сигнала. Например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
class MyObject extends WorldObject&lt;br /&gt;
{&lt;br /&gt;
    export function void State_init()&lt;br /&gt;
    {&lt;br /&gt;
        // Создаем сенсор:&lt;br /&gt;
        this.createSensor('type:address', 'makaka');&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Функция-обработчик сигнала makaka, который будет послан сенсором&lt;br /&gt;
    // в случае его срабатывания:&lt;br /&gt;
    export function Signal_makaka(const bytea args)&lt;br /&gt;
    {&lt;br /&gt;
        // Реакция на сигнал...&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обратите также внимание, что в функцию-обработчик сигнала передается параметр типа bytea. Его значение зависит от конкретного сенсора, здесь могут быть произвольные параметры, упакованные в бинарную строку. Для их распаковки реализована вспомогательная функция parseArguments().&lt;br /&gt;
&lt;br /&gt;
=== Класс Scene ===&lt;br /&gt;
&lt;br /&gt;
Пока не рассматриваем.&lt;br /&gt;
&lt;br /&gt;
=== Класс Motor ===&lt;br /&gt;
&lt;br /&gt;
Данный класс предоставляет интерфейс мотора. Объекты этого класса создаются путем вызова метода getMotor() объекта-обработчика.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
class Motor&lt;br /&gt;
{&lt;br /&gt;
    public operator Motor = (const Motor what);&lt;br /&gt;
    public function void enable(); // включить мотор&lt;br /&gt;
    public function void disable(); // выключить&lt;br /&gt;
    public function bool isEnabled(); // включен ли?&lt;br /&gt;
    public function array const paramNames(); // имена параметров&lt;br /&gt;
    public function real const getParam(const string name); // получить параметр&lt;br /&gt;
    public function void setParam(const string name, const real value); // установить параметр&lt;br /&gt;
    public function array const statusNames(); // имена статусов&lt;br /&gt;
    public function real const getStatus(const string name); // получить статус&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для включения и выключения мотора служат функции enable() и disable(). По-умолчанию все моторы выключены. Функция isEnabled() возвращает текущее состояние мотора.&lt;br /&gt;
&lt;br /&gt;
Функции paramNames(), getParam() и setParam() позволяют управлять параметрами мотора. Количество и смысл этих параметров зависит от конкретного типа мотора. Например, у уже рассмотренного нами в предыдущих разделах мотора linear_speed таких параметров два: speed и force. speed определяет скорость, до которой мотор разгоняет объект, а force - максимальную силу, которую мотор прикладывает к объекту.&lt;br /&gt;
&lt;br /&gt;
Аналогично, statusNames() и getStatus() позволяют получать статусы мотора, которые также зависят от конкретного типа мотора.&lt;br /&gt;
&lt;br /&gt;
=== Класс Sensor ===&lt;br /&gt;
&lt;br /&gt;
Данный класс предоставляет интерфейс сенсора. Объекты этого класса создаются путем вызова метода createSensor() объекта-обработчика. Обратите внимание, что сенсоры никак не проиндексированы в объекте, т.е. создав сенсор, невозможно потом получить его интерфейс по имени или еще каким-либо способом. Поэтому, если Вам требуется изменять какие-то параметры сенсора после его создания, сохраняйте его экземпляр в полях класса.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
class Sensor&lt;br /&gt;
{&lt;br /&gt;
    public operator Sensor = (const Sensor what);&lt;br /&gt;
    public function void enable(); // включить сенсор&lt;br /&gt;
    public function void disable(); // выключить сенсор&lt;br /&gt;
    public function bool isEnabled(); // включен ли?&lt;br /&gt;
    public function void erase(); // удалить сенсор&lt;br /&gt;
    public function array const paramNames(); // список параметров&lt;br /&gt;
    public function getParam(const string name); // получить параметр&lt;br /&gt;
    public function void setParam(const string name, const string value); // установить&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функции enable() / disable() включают / выключают сенсор. В отличие от моторов, при создании сенсор по-умолчанию включен. isEnabled() возвращает текущее состояние.&lt;br /&gt;
&lt;br /&gt;
Функция erase() удаляет сенсор. Все обращения к другим методам после erase() приведут к генерации исключения.&lt;br /&gt;
&lt;br /&gt;
Функции paramNames() / getParam() / setParam() управляют параметрами сенсора. В отличие от параметров моторов, параметры сенсоров могут иметь произвольный простой тип. Функция getParam() может вернуть:&lt;br /&gt;
* целое число&lt;br /&gt;
* массив целых чисел&lt;br /&gt;
* вещественное число&lt;br /&gt;
* массив вещественных чисел&lt;br /&gt;
* uid&lt;br /&gt;
* массив из uid&lt;br /&gt;
* строку.&lt;br /&gt;
&lt;br /&gt;
В setParam() значение параметра нужно указывать в виде строки с точным указанием низкоуровневого типа (на уровне реализации - стандартная строка для типа vary). Например, &amp;quot;dword 3&amp;quot; - целое число 3; &amp;quot;float 3.1,3.2,3.3&amp;quot; - массив из трех вещественных чисел, и т.д.&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2</id>
		<title>Основы программирования объектов</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2"/>
				<updated>2008-04-27T10:20:31Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Задание обработчика для объекта */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Каждое уведомление, которое получает объект (а таких уведомлений бывает 5 типов - см. предыдущий раздел), он передает в свой обработчик событий (у одного объекта может быть несколько обработчиков, но использовать эту возможность не рекомендуется).&lt;br /&gt;
&lt;br /&gt;
Сам обработчик может быть реализован либо в движке, либо в модуле-расширении - это просто некоторый объект, получающий события и выполняющий определенные действия на них. Но в данном разделе нас будет интересовать прикладное программирование объектов на гайд-совместимых языках.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы это стало возможным, реализован обработчик gide, который все полученные события передает гайд-объекту, а также предоставляет ряд классов для работы с объектом из прикладного кода.&lt;br /&gt;
&lt;br /&gt;
== Задание обработчика для объекта ==&lt;br /&gt;
&lt;br /&gt;
Как уже было сказано в примере в предыдущем разделе, URL обработчика задается в файле описания объекта следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;model bxd=&amp;quot;http://dao.deeptown.org/bxd/model.bxd&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- ... --&amp;gt;&lt;br /&gt;
    &amp;lt;externals&amp;gt;&lt;br /&gt;
        &amp;lt;event_receiver url=&amp;quot;gide:/media/scripts/cube_small_dynamic.gbc!cube_small_dynamic/CubeSmallDynamic&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/externals&amp;gt;&lt;br /&gt;
&amp;lt;/model&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как видим, в адресе фигурирует имя DISS-файла с байткодом (расширение gbc) и имя класса, который будет обрабатывать события нашего объекта. Обратите внимание, что имя класса - '''полное'''; оно состоит из имени модуля (слово после '''package'''), символа &amp;quot;/&amp;quot; и имени класса.&lt;br /&gt;
&lt;br /&gt;
Все примеры далее будут написаны на языке [[K++]].&lt;br /&gt;
&lt;br /&gt;
Вот простейший код обработчика, который никак не реагирует на события, происходящие с объектом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
package cube_small_dynamic;&lt;br /&gt;
&lt;br /&gt;
import World;&lt;br /&gt;
using World;&lt;br /&gt;
&lt;br /&gt;
class CubeSmallDynamic extends WorldObject&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.е. это просто класс, унаследованный от класса WorldObject, объявленного в модуле World.&lt;br /&gt;
&lt;br /&gt;
== Обработка уведомлений ==&lt;br /&gt;
&lt;br /&gt;
Все уведомления, которые приходят к объекту, по-умолчанию передаются методам нашего объекта-обработчика, имя которых строится из типа уведомления и имени события. Более подробно об этом будет рассказано в разделах, посвященных конкретным взаимодействиям; сейчас нам важно отметить одно: чтобы обработать какое-либо уведомление, все, что нужно сделать - это добавить в тело нашего класса функцию-обработчик со специальным именем. Никаких дополнительных манипуляций, как то регистрация этого обработчика где-либо, или вызов его в зависимости от каких-либо условий, делать не нужно.&lt;br /&gt;
&lt;br /&gt;
Единственное, что нужно помнить всегда - все такие функции должны быть помечены как export, поскольку вызываются они напрямую, минуя IDL.&lt;br /&gt;
&lt;br /&gt;
Например, когда объект создается, ему высылается уведомление о состоянии объекта &amp;quot;init&amp;quot;. Для того, чтобы обработать это уведомление, нужно определить в нашем классе метод State_init без параметров:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
class CubeSmallDynamic extends WorldObject&lt;br /&gt;
{&lt;br /&gt;
    export function void State_init()&lt;br /&gt;
    {&lt;br /&gt;
        // Функция будет вызвана в момент создания объекта&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Функции и классы модуля world ==&lt;br /&gt;
&lt;br /&gt;
=== Класс Object ===&lt;br /&gt;
&lt;br /&gt;
Этот класс является прародителем всех классов, представляющих объекты виртуального пространства. В нем определены следующие методы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
class Object&lt;br /&gt;
{&lt;br /&gt;
    constructor connect(const uid UID); // создает объект по его UID&lt;br /&gt;
    public operator Object = (const Object obj);  // оператор присваивания&lt;br /&gt;
    public function uid const getUID(); // возвращает UID объекта&lt;br /&gt;
    public function bool const isLocal(); // true если объект находится на текущем сервере&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Отдельного комментария заслуживает лишь метод isLocal(). Он возвращает true, если объект, с которым мы работаем, находится на том же сервере, на котором находится наш обработчик. Дело в том, что объекты в сети Диптауна могут передаваться от сервера к серверу в процессе существования, и если объект находится на другом сервере, общение с ним происходит по относительно медленному механизму событий сетевого движка.&lt;br /&gt;
&lt;br /&gt;
=== Класс WorldObject ===&lt;br /&gt;
&lt;br /&gt;
Этот класс унаследован от Object и представляет собой интерфейс для объекта пространства. В нем определены следующие методы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
class WorldObject extends Object&lt;br /&gt;
{&lt;br /&gt;
    constructor connect(const uid UID); // аналогично&lt;br /&gt;
    public function WorldObject const guest(); // сброс привелегий&lt;br /&gt;
    public function array const motorNames(); // список моторов&lt;br /&gt;
    public function Motor const getMotor(const string name); // мотор по имени&lt;br /&gt;
    public function Sensor const createSensor(const string url, const string signal); // создать сенсор&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функция guest возвращает копию данного объекта, не обладающую привелегиями управления своими моторами и сенсорами. На данный момент, просто не обращайте на нее внимания.&lt;br /&gt;
&lt;br /&gt;
Функция motorNames() возвращает массив строк - имен моторов, которые установлены на объекте. Напоминаю, что сами моторы перечислены в файле описания объекта и не могут быть динамически добавлены или удалены.&lt;br /&gt;
&lt;br /&gt;
Функция getMotor() возвращает мотор по его имени (см. описание класса ниже).&lt;br /&gt;
&lt;br /&gt;
Функция createSensor() создает сенсор. Первый параметр - это URL сенсора, который, как обычно, состоит из типа и адреса, разделенных двоеточием. Второй параметр - имя сигнала, который будет передан нашему обработчику в случае срабатвания сенсора. В классе должен быть определен метод Signal_xxx, где xxx - это имя сигнала. Например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
class MyObject extends WorldObject&lt;br /&gt;
{&lt;br /&gt;
    export function void State_init()&lt;br /&gt;
    {&lt;br /&gt;
        // Создаем сенсор:&lt;br /&gt;
        this.createSensor('type:address', 'makaka');&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Функция-обработчик сигнала makaka, который будет послан сенсором&lt;br /&gt;
    // в случае его срабатывания:&lt;br /&gt;
    export function Signal_makaka(const bytea args)&lt;br /&gt;
    {&lt;br /&gt;
        // Реакция на сигнал...&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обратите также внимание, что в функцию-обработчик сигнала передается параметр типа bytea. Его значение зависит от конкретного сенсора, здесь могут быть произвольные параметры, упакованные в бинарную строку. Для их распаковки реализована вспомогательная функция parseArguments().&lt;br /&gt;
&lt;br /&gt;
=== Класс Scene ===&lt;br /&gt;
&lt;br /&gt;
Пока не рассматриваем.&lt;br /&gt;
&lt;br /&gt;
=== Класс Motor ===&lt;br /&gt;
&lt;br /&gt;
Данный класс предоставляет интерфейс мотора. Объекты этого класса создаются путем вызова метода getMotor() объекта-обработчика.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
class Motor&lt;br /&gt;
{&lt;br /&gt;
    public operator Motor = (const Motor what);&lt;br /&gt;
    public function void enable(); // включить мотор&lt;br /&gt;
    public function void disable(); // выключить&lt;br /&gt;
    public function bool isEnabled(); // включен ли?&lt;br /&gt;
    public function array const paramNames(); // имена параметров&lt;br /&gt;
    public function real const getParam(const string name); // получить параметр&lt;br /&gt;
    public function void setParam(const string name, const real value); // установить параметр&lt;br /&gt;
    public function array const statusNames(); // имена статусов&lt;br /&gt;
    public function real const getStatus(const string name); // получить статус&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для включения и выключения мотора служат функции enable() и disable(). По-умолчанию все моторы выключены. Функция isEnabled() возвращает текущее состояние мотора.&lt;br /&gt;
&lt;br /&gt;
Функции paramNames(), getParam() и setParam() позволяют управлять параметрами мотора. Количество и смысл этих параметров зависит от конкретного типа мотора. Например, у уже рассмотренного нами в предыдущих разделах мотора linear_speed таких параметров два: speed и force. speed определяет скорость, до которой мотор разгоняет объект, а force - максимальную силу, которую мотор прикладывает к объекту.&lt;br /&gt;
&lt;br /&gt;
Аналогично, statusNames() и getStatus() позволяют получать статусы мотора, которые также зависят от конкретного типа мотора.&lt;br /&gt;
&lt;br /&gt;
=== Класс Sensor ===&lt;br /&gt;
&lt;br /&gt;
Данный класс предоставляет интерфейс сенсора. Объекты этого класса создаются путем вызова метода createSensor() объекта-обработчика. Обратите внимание, что сенсоры никак не проиндексированы в объекте, т.е. создав сенсор, невозможно потом получить его интерфейс по имени или еще каким-либо способом. Поэтому, если Вам требуется изменять какие-то параметры сенсора после его создания, сохраняйте его экземпляр в полях класса.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
class Sensor&lt;br /&gt;
{&lt;br /&gt;
    public operator Sensor = (const Sensor what);&lt;br /&gt;
    public function void enable(); // включить сенсор&lt;br /&gt;
    public function void disable(); // выключить сенсор&lt;br /&gt;
    public function bool isEnabled(); // включен ли?&lt;br /&gt;
    public function void erase(); // удалить сенсор&lt;br /&gt;
    public function array const paramNames(); // список параметров&lt;br /&gt;
    public function getParam(const string name); // получить параметр&lt;br /&gt;
    public function void setParam(const string name, const string value); // установить&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функции enable() / disable() включают / выключают сенсор. В отличие от моторов, при создании сенсор по-умолчанию включен. isEnabled() возвращает текущее состояние.&lt;br /&gt;
&lt;br /&gt;
Функция erase() удаляет сенсор. Все обращения к другим методам после erase() приведут к генерации исключения.&lt;br /&gt;
&lt;br /&gt;
Функции paramNames() / getParam() / setParam() управляют параметрами сенсора. В отличие от параметров моторов, параметры сенсоров могут иметь произвольный простой тип. Функция getParam() может вернуть:&lt;br /&gt;
* целое число&lt;br /&gt;
* массив целых чисел&lt;br /&gt;
* вещественное число&lt;br /&gt;
* массив вещественных чисел&lt;br /&gt;
* uid&lt;br /&gt;
* массив из uid&lt;br /&gt;
* строку.&lt;br /&gt;
&lt;br /&gt;
В setParam() значение параметра нужно указывать в виде строки с точным указанием низкоуровневого типа (на уровне реализации - стандартная строка для типа vary). Например, &amp;quot;dword 3&amp;quot; - целое число 3; &amp;quot;float 3.1,3.2,3.3&amp;quot; - массив из трех вещественных чисел, и т.д.&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%A1_%D1%87%D0%B5%D0%B3%D0%BE_%D0%BD%D0%B0%D1%87%D0%B0%D1%82%D1%8C</id>
		<title>С чего начать</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%A1_%D1%87%D0%B5%D0%B3%D0%BE_%D0%BD%D0%B0%D1%87%D0%B0%D1%82%D1%8C"/>
				<updated>2008-04-27T09:27:36Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Что еще можно посмотреть? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Где я? ==&lt;br /&gt;
&lt;br /&gt;
Если вы читаете эту страницу, то видимо уже установили себе Deeptown SDK и хотите что либо с ним сделать :)&lt;br /&gt;
Если еще не установили, то вам сюда: [[Deeptown SDK]].&lt;br /&gt;
&lt;br /&gt;
Данная страница предназначена для того, чтобы дать самое общее представление о том, что же из себя представляет система Диптауна на данный момент и что с ней можно сделать интересного. Здесь мы постараемся (в свободной форме) описать возможные пути исследования и продемонстрировать некоторые вещи на примерах.&lt;br /&gt;
&lt;br /&gt;
То что здесь будет описано, по большей части преследует одну цель — дать человеку отправную точку и помочь сориентироваться в многообразии информации. Мы не в состоянии объяснить все, а можем лишь указать путь :) Поэтому — пробуйте, пытайтесь, изучайте систему и делитесь своим опытом на форуме :) Кроме того, эта wiki — так же к вашим услугам. Если вам есть что добавить или исправить — милости просим.&lt;br /&gt;
&lt;br /&gt;
== Что это? Как попасть в Диптаун? ==&lt;br /&gt;
&lt;br /&gt;
SDK это набор программных средств, включающий в себя саму платформу диптауна (aka &amp;quot;движок&amp;quot;), а так же набор разнообразных, сопутствующих программ, таких как компилятор языка К++. Короче говоря, это основа, на базе которой и будет строиться Диптаун. На данный момент, &amp;quot;того&amp;quot; Диптауна еще не существует. Точнее, существуют некоторые его части у наших архитекторов, но они еще не в публичном доступе. Так что, &amp;quot;попадать&amp;quot; пока еще некуда.&lt;br /&gt;
&lt;br /&gt;
Тем не менее, обычные пользователи могут попробовать использовать &amp;quot;все это&amp;quot; для того, чтобы оценить возможности системы и просто посмотреть &amp;quot;красивые картинки&amp;quot;, которые скоро будут. Ниже будет описано, как заставить систему работать и посмотреть некоторые уже существующие демки.&lt;br /&gt;
&lt;br /&gt;
Люди, желающие поглубже изучить саму систему, найдут здесь полезную информацию о том, как совершаются типовые действия, вроде добавления объектов и их программирования. Более подробно это будет рассмотрено в соответствующей документации.&lt;br /&gt;
&lt;br /&gt;
== Первый запуск ==&lt;br /&gt;
[[Изображение:Showto 1.png|thumb]]&lt;br /&gt;
[[Изображение:Showto 2.png|thumb]]&lt;br /&gt;
Для начала попробуем запустить все &amp;quot;как есть&amp;quot;. Для этого нам понадобится собственно Deeptown SDK и архив с медиа файлами, который уже должен быть при вас, если вы внимательно читали инструкцию по установке. &lt;br /&gt;
&lt;br /&gt;
Попробуйте запустить файл deep.exe (если вы в windows) или /opt/deeptown/bin/deep в *nix. Будьте терпеливы, потому что в первый запуск система производит индексацию содержимого каталога Media (того самого) и создает в нем файл &amp;quot;.index&amp;quot;, который используется для поиска файлов самой системой. При последующих запусках эта операция выполняться не будет (только в [[Индексация DISS|определенных случаях]]).&lt;br /&gt;
&lt;br /&gt;
Если все прошло успешно, то вы должны будете увидеть окошко рендеринга и, через некоторое время, простейшую демосцену, загружаемую по умолчанию. На данный момент это сцена &amp;quot;bonnet&amp;quot;, содержащая в себе машину и кучку кубиков. Выглядеть это должно примерно как на картинках справа. &lt;br /&gt;
&lt;br /&gt;
Машиной можно ездить и сбивать кубики. Изначально они расположены справа и сзади от вас (конечно это все можно изменить!)&lt;br /&gt;
&lt;br /&gt;
=== Управление ===&lt;br /&gt;
&lt;br /&gt;
* Ctrl+Q — переключиться в режим курсора (управление окошком)&lt;br /&gt;
* W, S, A, D — движение камерой '''при зажатой кнопке Alt'''&lt;br /&gt;
* Стрелки клавиатуры — управление машиной (попробуйте наехать на кубики)&lt;br /&gt;
* Пробел, либо стрелка назад — тормозить (пока работает не очень хорошо, надо подкрутить параметры)&lt;br /&gt;
* Кнопка &amp;quot;spawn object&amp;quot; интерфейса — создает в воздухе еще один кубик, где то неподалеку. Кубики создаются всегда случайным образом (и это тоже можно изменить!).&lt;br /&gt;
* Кнопка &amp;quot;cleanup&amp;quot; — удаляет все созданные вами кубики (те которые были изначально — созданы другим путем, поэтому они останутся на месте)&lt;br /&gt;
&lt;br /&gt;
'''Примечания''': &lt;br /&gt;
* Машина (а так же форма интерфейса) управляется скриптом /media/storage/media/scripts/bonnet.kpp&lt;br /&gt;
* Переназначить клавиши управления можно редактируя файл /media/storage/etc/world/input.conf&lt;br /&gt;
* Чтобы выйти из системы, надо либо нажать крестик на окне интерфейса, либо нажать Alt+Tab и закрыть окно рендеринга&lt;br /&gt;
* Если вы обнаружили что то странное, либо программа попросту &amp;quot;совершила недопустимую операцию&amp;quot;, то смело идите в багтрекер по адресу [http://bugs.deeptown.org http://bugs.deeptown.org] и оставляйте свое сообщение. &lt;br /&gt;
* Есть еще и другие сцены, которые можно попробовать запустить. Для этого надо открыть файл /media/storage/etc/boot/services и раскомментировать одну из строчек client_wm:..., не забыв закомментировать строчку, где упоминается bonnet.scene!&lt;br /&gt;
&lt;br /&gt;
== Консоль ==&lt;br /&gt;
&lt;br /&gt;
Консоль Диптауна является стандартным средством взаимодействия с системой, которая позволяет (точнее будет позволять) всецело управлять системой и отдавать ей команды. На данный момент она реализована только в самых общих чертах (даже стандартных команд оболочки еще нет). В будущем она будет существенно расширена и дополнена. &lt;br /&gt;
&lt;br /&gt;
Подключение к консоли осуществляется по протоколу Telnet, любым из клиентов, поддерживающих этот протокол. Чтобы подключиться из windows надо: &lt;br /&gt;
# зайти в меню Пуск&lt;br /&gt;
# открыть диалог &amp;quot;выполнить&amp;quot; (или сразу нажать Win+R)&lt;br /&gt;
# ввести туда &amp;lt;tt&amp;gt;telnet localhost 4830&amp;lt;/tt&amp;gt; и нажать Enter&lt;br /&gt;
&lt;br /&gt;
Линуксоиды скорее всего и сами разберутся ;)&lt;br /&gt;
&lt;br /&gt;
Далее, можно попробовать запустить программы, имеющиеся по умолчанию. Например можно ввести команду /bin/hello.gbc и получить простенькое тестовое окно с известным сообщением. Просьба не судить строго, ведь это не конечный продукт, а всего лишь тесты :)&lt;br /&gt;
&lt;br /&gt;
Если у вас возникнет желание написать более толковое приложение — обращайтесь к нам и [http://forum.deeptown.org на форум].&lt;br /&gt;
&lt;br /&gt;
Выход из консоли осуществляется вводом команды exit.&lt;br /&gt;
&lt;br /&gt;
== Что еще можно посмотреть? ==&lt;br /&gt;
&lt;br /&gt;
Практически все &amp;quot;интересные&amp;quot; вещи сосредоточены в уже известной вам директории Media. Приведем здесь список основных поддиректорий с комментариями к ним.&lt;br /&gt;
&lt;br /&gt;
;Media/storage: Это корневая директория для внутренней ФС диптауна. Все внутренние пути указываются относительно нее. Скажем, если в файле материала указана строка texture &amp;lt;tt&amp;gt;/media/textures/grass.png&amp;lt;/tt&amp;gt;, то это значит что реальный файл расположен по адресу &amp;lt;tt&amp;gt;Media/storage/media/textures/grass.png&amp;lt;/tt&amp;gt;.&lt;br /&gt;
;Media/storage/bin: Здесь будут располагаться исполняемые файлы скриптов.&lt;br /&gt;
;Media/storage/boot: Директория системного загрузчика (ничего интересного).&lt;br /&gt;
;Media/storage/etc: А здесь хранятся файлы настроек. Заглянуть рекомендуется настоятельно. По крайней мере поизучать. Попробуйте загрузить другую сцену вместо той что грузится по умолчанию. '''Примечание''': Все текстовые файлы в диптауне используют формат UNIX, когда строка переводится одним символом LF. Поэтому, в windows открывать их надо либо wordpad-ом (он правильно понимает переносы), либо другим редактором, поддерживающим такие файлы. Хорошо работает редактор в FAR Manager-е.&lt;br /&gt;
;Media/storage/home: пока пустует. &lt;br /&gt;
;Media/storage/media: Здесь тоже много чего интересного. Это основное хранилище различных медиа данных, имеющих отношение к собственно виртуальному пространству. Содержит такие поддиректории как:&lt;br /&gt;
::* '''materials''' — файлы материалов OGRE. Определяют графические свойства поверхностей моделей, такие как текстуры, цвета, привязанные шейдеры и др.&lt;br /&gt;
::* '''mein''' — медиафайлы для встроенного графического интерфейса, такие как скины и шрифты&lt;br /&gt;
::* '''meshes''' — здесь хранятся меш файлы загружаемых моделей. Более подробно про это можно почитать в статье [[импорт моделей в диптаун]].&lt;br /&gt;
::* '''models''' — а здесь хранятся сами модели. Модель это нечто большее, чем просто меш с натянутой текстурой. Файл модели описывает также понятия, относящиеся к другим представлениям объекта, а не только к графическому. Например, там указывается масса модели, момент ее инерции и много других параметров. Смотри так же [[понятие объекта в пространстве]].&lt;br /&gt;
::* '''scenes''' — если кратко, то сцена — это совокупность объектов, расположенных в некоторой области виртуального пространства. В этой директории хранятся файлы локальных сцен.&lt;br /&gt;
::* '''scripts''' — самое интересное :) Здесь расположены скрипты, задающие поведение отдельных объектов. Поскольку диптаун изначально создавался как интерактивная среда, то каждый объект, находящийся в виртуальном пространстве, может быть &amp;quot;живым&amp;quot; и &amp;quot;разумным&amp;quot;. С объектом ассоциируется некоторый скрипт, который программирует его действия и управляет его поведением. Например, скрипт bonnet.kpp реализует интерфейс к той самой машине и позволяет пользователю (то есть нам с вами) управлять ей. Скрипт park.kpp создает интерфейс управления анимацией для сцены park, и сам создает эту анимацию. Все скрипты написаны на нашем языке [[K++]].&lt;br /&gt;
::* '''shaders''' — хранилище для шейдеров. Думаю что это такое, объяснять не требуется.&lt;br /&gt;
::* '''textures''' — ну и здесь наверное все понятно.&lt;br /&gt;
&lt;br /&gt;
== Что еще можно сделать? ==&lt;br /&gt;
&lt;br /&gt;
Это зависит, в первую очередь, от вашего желания и способностей, а так же от имеющихся навыков. &lt;br /&gt;
&lt;br /&gt;
=== Программистам ===&lt;br /&gt;
&lt;br /&gt;
Если вы знакомы с такими языками программирования как Паскаль, Си++ или Java, то вам не составит труда изучить, или по крайней мере разобраться, в языке [[K++]]. Он очень похож на эти языки.&lt;br /&gt;
&lt;br /&gt;
Попробуйте например, модифицировать скрипт bonnet.kpp так, чтобы создаваемые кубики располагались не случайным образом а один над другим. Главное поставить высоту побольше, чтобы кубики не пытались телефрагить друг друга.&lt;br /&gt;
&lt;br /&gt;
=== Моделерам ===&lt;br /&gt;
&lt;br /&gt;
Если вы умеете моделировать объекты в 3D пакетах, таких как 3D Studio, Maya или Blender, и желаете создать свои модели, то вам стоит обратиться в раздел [[Разработка моделей]]. Там в скором времени появится информация о том, каких правил следует придерживаться при создании моделей, а так же детально будет расписан процесс конвертирования моделей в формат Диптауна.&lt;br /&gt;
&lt;br /&gt;
В настоящее время, мы испытываем большой дефицит людей этой профессии, так что если вас заинтересовал проект — смело обращайтесь [http://forum.deeptown.org на форум]. Мы постараемся оказать вам всестороннуюю помощь и поддержку.&lt;br /&gt;
&lt;br /&gt;
=== Всем ===&lt;br /&gt;
&lt;br /&gt;
Как вы понимаете, написание пространной и качественной документации — длительный и трудоемкий процесс, отнимающий наше время и силы. Несмотря на то, что мы стараемся поддерживать документацию на уровне, это не всегда возможно. Поэтому, если вы желаете поделиться собственным опытом в изучении Диптауна или написать HOWTO на определенную тему — пробуйте. Эта wiki к вашим услугам :) Собственно, она и создавалась для этих целей. В ближайшее время, мы постараемся написать серию HOWTO, затрагивающих основные вопросы, вроде скриптования объектов и создания собственных сцен. Ссылки на них будут размещаться [[HOWTOs|здесь]]. Присоединяйтесь :)&lt;br /&gt;
&lt;br /&gt;
Вы можете помочь проекту, даже не будучи программистом или дизайнером. Для этого, достаточно просто быть грамотным человеком. Если на страницах этой wiki вы встретите неточности, орфографические, либо пунктуационные ошибки, или просто заметите дефиc там, где должно стоять тире — исправьте, пожалуйста, текст так, как вы считаете нужным. Это можно сделать с помощью вкладки &amp;quot;Править&amp;quot; вверху каждой страницы, либо с помощью соответствующей ссылки в каждом заголовке.&lt;br /&gt;
&lt;br /&gt;
Если вы сомневаетесь относительно верности вашего исправления, тогда вы можете написать об этом на странице обсуждения. Не забудьте только указать место в тексте, где, по вашему мнению, находится ошибка и ваш вариант написания. Ссылка на страницу обсуждения находится, так же, вверху каждой страницы.&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5,_%D0%B8%D0%BB%D0%B8_%D0%BA%D1%80%D0%B0%D1%82%D0%BA%D0%B8%D0%B9_%D0%BE%D0%B1%D0%B7%D0%BE%D1%80</id>
		<title>Обсуждение:Введение, или краткий обзор</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5,_%D0%B8%D0%BB%D0%B8_%D0%BA%D1%80%D0%B0%D1%82%D0%BA%D0%B8%D0%B9_%D0%BE%D0%B1%D0%B7%D0%BE%D1%80"/>
				<updated>2008-04-25T15:17:14Z</updated>
		
		<summary type="html">&lt;p&gt;Root: /* Re */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Тема конфликтов расширений классов не раскрыта.&lt;br /&gt;
&lt;br /&gt;
== Re ==&lt;br /&gt;
&lt;br /&gt;
Введение потому так и называется, что оно дает общее представление и не углубляется в детали. Если хочется прочитать подробнее — читайте [[Классы и объекты#расширения|подробнее]]. И вообще, что понимаете под конфликтом? --[[Участник:Korvin|Korvin]] 04:15, 25 апреля 2008 (EDT).&lt;br /&gt;
&lt;br /&gt;
PS: Представьтесь пожалуйста.&lt;br /&gt;
&lt;br /&gt;
== Re ==&lt;br /&gt;
Там тоже не раскрыта.&lt;br /&gt;
&lt;br /&gt;
В прочем раскрыть ее всеравно не получится.&lt;br /&gt;
Ибо конфликт фундаментальный.&lt;br /&gt;
Примерно теже проблемы возникают у системы типов Haskell'я при попытке скрестить эту систему типов с компонентностью.&lt;br /&gt;
&lt;br /&gt;
А конфликт прост:&lt;br /&gt;
&lt;br /&gt;
Заводим 2 модуля A и B.&lt;br /&gt;
&lt;br /&gt;
В обоих модулях расширяем класс int методом GetFactorial.&lt;br /&gt;
&lt;br /&gt;
Далие в модуле C пытаемся использовать модули A и B.&lt;br /&gt;
&lt;br /&gt;
Внимание вопрос: GetFactorial из какого модуля использовать будем?&lt;br /&gt;
&lt;br /&gt;
Особенно весело становится если все 3 модуля пишут разные люди.&lt;br /&gt;
&lt;br /&gt;
Еще веселее если изначально в модуле B небыло GetFactorial, а через некоторое время появился.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сердитый Ученый.&lt;br /&gt;
&lt;br /&gt;
ЗЫ Это я еще копать не начал...&lt;br /&gt;
&lt;br /&gt;
ЗЗЫ С виду язык в целом приличный (видел и сильно хуже), а вот вся остальная система вызывает большие сомнения в работоспособности при попытке запустить ее в большой сети.&lt;br /&gt;
&lt;br /&gt;
== Re ==&lt;br /&gt;
&lt;br /&gt;
Использован будет последний, то есть последний перекрывает всех предыдущих. И действовать будут естественно в рамках модуля, объявившего данное расширение и всех модулях, которые его используют. Видать примеры в книге корявые, надо придумать что нибудь более реальное.&lt;br /&gt;
&lt;br /&gt;
В целом, расширения не предназначены для написания фундаментального кода. Основная идея в том, чтобы можно было подкрутить класс &amp;quot;под себя&amp;quot;, без необходимости перелопачивать код. Ориентировка на то, что тебе дали объект, но ты хочешь от него чего то еще. Если проводить аналогию с тем же Ruby. Тебе возвращают объект, но ты хочешь чтобы он умел производить с собой некоторые действия, скажем выводить некоторую информацию (инспектировать себя). И эту информацию ты используешь в своем коде. Тогда просто создается расширение в котором объявляется необходимый метод. Притом что оно никоим образом не мешает другим пользователям (которые так же могут у себя делать расширения). Альтернатива этому подходу -- написание врапперов и преобразование там где надо. Но это уже изврат, однако. Особенно если надо всего пару фич объявить. &lt;br /&gt;
&lt;br /&gt;
Ну или другой вариант: другая библиотека присылает некий контейнер, который приходится использовать в текущем модуле. Но вот беда, язык на котором написан &amp;quot;тот&amp;quot; модуль понятия не имеет о замыканиях и соответственно ни о каком методе each() не знает (скажем, используется принцип search-valid-next). А нам таки хочется пользоваться всеми преимуществами примеси Enumerable. Тогда берем и расширяем класс методом each() и добавляем в родители соответствующую примесь:&lt;br /&gt;
 extend TheirWeirdCollection extends Enumerable {&lt;br /&gt;
     public const function each(block b) {&lt;br /&gt;
         for(this.search(); this.valid(); this.next())&lt;br /&gt;
             b(this.current());&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
И радуемся жизни:&lt;br /&gt;
 var col = SomeMethod(); //скажем, возвращает этот самый TheirWeirdCollection &lt;br /&gt;
 var result = col.select() { |x| x &amp;gt; 5; }; //применяем примесь&lt;br /&gt;
 result.each() { |x| puts(x); } //тут уже конечно не TheirWeirdCollection, а array&lt;br /&gt;
&lt;br /&gt;
А для написания основного кода надо использовать наследование, как и положено.&lt;br /&gt;
&lt;br /&gt;
ЗЫ: Сомнения дело хорошее. До тех пор, пока порождают конструктивные диалоги а не флуд и прочие холивары&lt;br /&gt;
&lt;br /&gt;
--[[Участник:Korvin|Korvin]] 09:52, 25 апреля 2008 (EDT)&lt;br /&gt;
&lt;br /&gt;
== Re ==&lt;br /&gt;
Еще раз:&lt;br /&gt;
&lt;br /&gt;
Модуль А и модуль Б созданны '''независимыми''' разработчиками. Они друг о друге вобще ничего не знают.&lt;br /&gt;
&lt;br /&gt;
Соответственно упорядочить модули А и Б друг относительно друга невозможно.&lt;br /&gt;
&lt;br /&gt;
Они расширили один и тотже класс одним и темже методом.&lt;br /&gt;
&lt;br /&gt;
Теперь третий разработчик импортировал оба модуля А и Б.&lt;br /&gt;
&lt;br /&gt;
Чей метод будет использован?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сердитый Ученый. &lt;br /&gt;
&lt;br /&gt;
ЗЫ Чем дальше тем сильнее прихожу к выводу что наследование реализаций это вобще зло. Ибо очень сильно связывает систему. ИМХО можно использовать только наследование интерфейсов. Тогда система остается в управляемом состоянии гораздо дольше.&lt;br /&gt;
&lt;br /&gt;
Чтобы не дублировать код можно завести 3 сущьности:&lt;br /&gt;
&lt;br /&gt;
1)Интерфейс. Чистый контракт без каких либо намеков на реализацию.&lt;br /&gt;
&lt;br /&gt;
2)Миксин. Может содержать код и данные. Реализует один или несколько интерфейсов. Может требовать чтобы использующий его тип реализовал один или несколько других интерфейсов нужных миксину для работы.&lt;br /&gt;
&lt;br /&gt;
3)Тип. Может содержать код и данные. Может агрегировать миксины. Реализует один или несколько интерфейсов. Тип расширять нельзя. Ни наследованием ни добавление методов.&lt;br /&gt;
&lt;br /&gt;
ЗЗЫ Не первый год пишу high load системы. Те куски информации что есть на вашем сайте вызывают сомнение что система вобще взлетит под хоть какойнибудь нагрузкой. Подроный анализ делать лень. Тем болие что не все подсистемы описаны.&lt;br /&gt;
&lt;br /&gt;
== Re ==&lt;br /&gt;
&lt;br /&gt;
Скажем так. На уровне виртуальной машины - будет использован тот метод, который загружен последним, т.е. из того модуля, который идет последним в списке импорта. Но это если писать на [[Описание платформы Gide|гайд-ассемблере]].&lt;br /&gt;
&lt;br /&gt;
K++ просто ругнется ошибкой method redefinition. На этапе компиляции вся информация о методах есть.&lt;br /&gt;
&lt;br /&gt;
ЗЫ. По поводу всей системы предлагаю закончить тут флуд, либо перенести его на форум или в обсуждения блоговых записей.&lt;br /&gt;
&lt;br /&gt;
--[[Участник:Root|_root]] 11:17, 25 апреля 2008 (EDT)&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5,_%D0%B8%D0%BB%D0%B8_%D0%BA%D1%80%D0%B0%D1%82%D0%BA%D0%B8%D0%B9_%D0%BE%D0%B1%D0%B7%D0%BE%D1%80</id>
		<title>Обсуждение:Введение, или краткий обзор</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5,_%D0%B8%D0%BB%D0%B8_%D0%BA%D1%80%D0%B0%D1%82%D0%BA%D0%B8%D0%B9_%D0%BE%D0%B1%D0%B7%D0%BE%D1%80"/>
				<updated>2008-04-25T15:17:00Z</updated>
		
		<summary type="html">&lt;p&gt;Root: Re&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Тема конфликтов расширений классов не раскрыта.&lt;br /&gt;
&lt;br /&gt;
== Re ==&lt;br /&gt;
&lt;br /&gt;
Введение потому так и называется, что оно дает общее представление и не углубляется в детали. Если хочется прочитать подробнее — читайте [[Классы и объекты#расширения|подробнее]]. И вообще, что понимаете под конфликтом? --[[Участник:Korvin|Korvin]] 04:15, 25 апреля 2008 (EDT).&lt;br /&gt;
&lt;br /&gt;
PS: Представьтесь пожалуйста.&lt;br /&gt;
&lt;br /&gt;
== Re ==&lt;br /&gt;
Там тоже не раскрыта.&lt;br /&gt;
&lt;br /&gt;
В прочем раскрыть ее всеравно не получится.&lt;br /&gt;
Ибо конфликт фундаментальный.&lt;br /&gt;
Примерно теже проблемы возникают у системы типов Haskell'я при попытке скрестить эту систему типов с компонентностью.&lt;br /&gt;
&lt;br /&gt;
А конфликт прост:&lt;br /&gt;
&lt;br /&gt;
Заводим 2 модуля A и B.&lt;br /&gt;
&lt;br /&gt;
В обоих модулях расширяем класс int методом GetFactorial.&lt;br /&gt;
&lt;br /&gt;
Далие в модуле C пытаемся использовать модули A и B.&lt;br /&gt;
&lt;br /&gt;
Внимание вопрос: GetFactorial из какого модуля использовать будем?&lt;br /&gt;
&lt;br /&gt;
Особенно весело становится если все 3 модуля пишут разные люди.&lt;br /&gt;
&lt;br /&gt;
Еще веселее если изначально в модуле B небыло GetFactorial, а через некоторое время появился.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сердитый Ученый.&lt;br /&gt;
&lt;br /&gt;
ЗЫ Это я еще копать не начал...&lt;br /&gt;
&lt;br /&gt;
ЗЗЫ С виду язык в целом приличный (видел и сильно хуже), а вот вся остальная система вызывает большие сомнения в работоспособности при попытке запустить ее в большой сети.&lt;br /&gt;
&lt;br /&gt;
== Re ==&lt;br /&gt;
&lt;br /&gt;
Использован будет последний, то есть последний перекрывает всех предыдущих. И действовать будут естественно в рамках модуля, объявившего данное расширение и всех модулях, которые его используют. Видать примеры в книге корявые, надо придумать что нибудь более реальное.&lt;br /&gt;
&lt;br /&gt;
В целом, расширения не предназначены для написания фундаментального кода. Основная идея в том, чтобы можно было подкрутить класс &amp;quot;под себя&amp;quot;, без необходимости перелопачивать код. Ориентировка на то, что тебе дали объект, но ты хочешь от него чего то еще. Если проводить аналогию с тем же Ruby. Тебе возвращают объект, но ты хочешь чтобы он умел производить с собой некоторые действия, скажем выводить некоторую информацию (инспектировать себя). И эту информацию ты используешь в своем коде. Тогда просто создается расширение в котором объявляется необходимый метод. Притом что оно никоим образом не мешает другим пользователям (которые так же могут у себя делать расширения). Альтернатива этому подходу -- написание врапперов и преобразование там где надо. Но это уже изврат, однако. Особенно если надо всего пару фич объявить. &lt;br /&gt;
&lt;br /&gt;
Ну или другой вариант: другая библиотека присылает некий контейнер, который приходится использовать в текущем модуле. Но вот беда, язык на котором написан &amp;quot;тот&amp;quot; модуль понятия не имеет о замыканиях и соответственно ни о каком методе each() не знает (скажем, используется принцип search-valid-next). А нам таки хочется пользоваться всеми преимуществами примеси Enumerable. Тогда берем и расширяем класс методом each() и добавляем в родители соответствующую примесь:&lt;br /&gt;
 extend TheirWeirdCollection extends Enumerable {&lt;br /&gt;
     public const function each(block b) {&lt;br /&gt;
         for(this.search(); this.valid(); this.next())&lt;br /&gt;
             b(this.current());&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
И радуемся жизни:&lt;br /&gt;
 var col = SomeMethod(); //скажем, возвращает этот самый TheirWeirdCollection &lt;br /&gt;
 var result = col.select() { |x| x &amp;gt; 5; }; //применяем примесь&lt;br /&gt;
 result.each() { |x| puts(x); } //тут уже конечно не TheirWeirdCollection, а array&lt;br /&gt;
&lt;br /&gt;
А для написания основного кода надо использовать наследование, как и положено.&lt;br /&gt;
&lt;br /&gt;
ЗЫ: Сомнения дело хорошее. До тех пор, пока порождают конструктивные диалоги а не флуд и прочие холивары&lt;br /&gt;
&lt;br /&gt;
--[[Участник:Korvin|Korvin]] 09:52, 25 апреля 2008 (EDT)&lt;br /&gt;
&lt;br /&gt;
== Re ==&lt;br /&gt;
Еще раз:&lt;br /&gt;
&lt;br /&gt;
Модуль А и модуль Б созданны '''независимыми''' разработчиками. Они друг о друге вобще ничего не знают.&lt;br /&gt;
&lt;br /&gt;
Соответственно упорядочить модули А и Б друг относительно друга невозможно.&lt;br /&gt;
&lt;br /&gt;
Они расширили один и тотже класс одним и темже методом.&lt;br /&gt;
&lt;br /&gt;
Теперь третий разработчик импортировал оба модуля А и Б.&lt;br /&gt;
&lt;br /&gt;
Чей метод будет использован?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сердитый Ученый. &lt;br /&gt;
&lt;br /&gt;
ЗЫ Чем дальше тем сильнее прихожу к выводу что наследование реализаций это вобще зло. Ибо очень сильно связывает систему. ИМХО можно использовать только наследование интерфейсов. Тогда система остается в управляемом состоянии гораздо дольше.&lt;br /&gt;
&lt;br /&gt;
Чтобы не дублировать код можно завести 3 сущьности:&lt;br /&gt;
&lt;br /&gt;
1)Интерфейс. Чистый контракт без каких либо намеков на реализацию.&lt;br /&gt;
&lt;br /&gt;
2)Миксин. Может содержать код и данные. Реализует один или несколько интерфейсов. Может требовать чтобы использующий его тип реализовал один или несколько других интерфейсов нужных миксину для работы.&lt;br /&gt;
&lt;br /&gt;
3)Тип. Может содержать код и данные. Может агрегировать миксины. Реализует один или несколько интерфейсов. Тип расширять нельзя. Ни наследованием ни добавление методов.&lt;br /&gt;
&lt;br /&gt;
ЗЗЫ Не первый год пишу high load системы. Те куски информации что есть на вашем сайте вызывают сомнение что система вобще взлетит под хоть какойнибудь нагрузкой. Подроный анализ делать лень. Тем болие что не все подсистемы описаны.&lt;br /&gt;
&lt;br /&gt;
== Re ==&lt;br /&gt;
&lt;br /&gt;
Скажем так. На уровне виртуальной машины - будет использован тот метод, который загружен последним, т.е. из того модуля, который идет последним в списке импорта. Но это если писать на [[Описание платформы Gide|гайд-ассемблере]].&lt;br /&gt;
&lt;br /&gt;
K++ просто ругнется ошибкой method redefinition. На этапе компиляции вся информация о методах есть.&lt;br /&gt;
&lt;br /&gt;
ЗЫ. По поводу всей системы предлагаю закончить тут флуд, либо перенести его на форум или в обсуждения блоговых записей.&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/MediaWiki:Sidebar</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/MediaWiki:Sidebar"/>
				<updated>2008-04-19T14:44:27Z</updated>
		
		<summary type="html">&lt;p&gt;Root: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* navigation&lt;br /&gt;
** mainpage|mainpage&lt;br /&gt;
** portal-url|portal&lt;br /&gt;
** currentevents-url|currentevents&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help&lt;br /&gt;
** sitesupport-url|sitesupport&lt;br /&gt;
* информация&lt;br /&gt;
** О проекте|О проекте&lt;br /&gt;
** Deeptown SDK|Deeptown SDK&lt;br /&gt;
** Багтрекер|Багтрекер&lt;br /&gt;
** Рассылка|Рассылка&lt;br /&gt;
** Release Notes|Release Notes&lt;br /&gt;
** Обратная связь|Обратная связь&lt;br /&gt;
* документация&lt;br /&gt;
** K++|K++&lt;br /&gt;
** Платформа Gide|Gide&lt;br /&gt;
** Стандартная библиотека gide|Gide stdlib&lt;br /&gt;
** World Engine|World Engine&lt;/div&gt;</summary>
		<author><name>Root</name></author>	</entry>

	</feed>