<?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=Velaar</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=Velaar"/>
		<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/Velaar"/>
		<updated>2026-05-04T18:23:26Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.20.2</generator>

	<entry>
		<id>http://man.deeptown.org/index.php/String</id>
		<title>String</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/String"/>
				<updated>2009-06-15T19:16:43Z</updated>
		
		<summary type="html">&lt;p&gt;Velaar: Правки Humbug (обсуждение) откачены к версии Korvin&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Класс &amp;lt;tt&amp;gt;string&amp;lt;/tt&amp;gt; используется для хранения и обработки стороковых данных. Класс предоставляет большое количество методов для управления строками, таких как: выделение, поиск и замена подстрок. Важно отметить, что все строки хранятся и обрабатываются в кодировке '''UTF-8'''. Например, метод &amp;lt;tt&amp;gt;[[#length|length]]&amp;lt;/tt&amp;gt; для этого класса, возвращает длинну строки &amp;lt;u&amp;gt;в символах&amp;lt;/u&amp;gt;, а не в байтах. Таким образом, реальный размер строки, содержащей многобайтные символы, не будет совпадать с ее длиной. При необходимости работы со строками как с потоком байтов, следует использовать класс &amp;lt;tt&amp;gt;[[bytea]]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Стандартные библиотеки конкретных языков расширяют функциональность данного класса, вводя дополнительные методы. Например, [[K++#Системная библиотека|библиотека языка K++]] вводит операторы &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;[]=&amp;lt;/tt&amp;gt; для упрощения работы со строками. Дополнительно, там же вводятся операции с использованием [[регулярных выражений]].&lt;br /&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;
[[#getc|getc]] &lt;br /&gt;
[[#get|get]] &lt;br /&gt;
[[#setc|setc]] &lt;br /&gt;
[[#set|set]] &lt;br /&gt;
[[#at|at]] &lt;br /&gt;
[[#empty|empty]] &lt;br /&gt;
[[#length|length]] &lt;br /&gt;
[[#clear|clear]] &lt;br /&gt;
[[#substr|substr]] &lt;br /&gt;
[[#substr_int|substr_int]] &lt;br /&gt;
[[#copy|copy]] &lt;br /&gt;
[[#copy_int|copy_int]] &lt;br /&gt;
[[#replace|replace]] &lt;br /&gt;
[[#replace_int|replace_int]] &lt;br /&gt;
[[#replace_rel_|replace_rel]] &lt;br /&gt;
[[#replace_rel_int|replace_rel_int]] &lt;br /&gt;
[[#replace_all|replace_all]] &lt;br /&gt;
[[#insert|insert]] &lt;br /&gt;
[[#insert_int|insert_int]] &lt;br /&gt;
[[#erase|erase]] &lt;br /&gt;
[[#erase_int|erase_int]] &lt;br /&gt;
[[#find|find]] &lt;br /&gt;
[[#find_first_of|find_first_of]] &lt;br /&gt;
[[#find_first_not_of|find_first_not_of]] &lt;br /&gt;
[[#begin|begin]] &lt;br /&gt;
[[#end|end]]&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Приводится к типам''': &amp;lt;tt&amp;gt;[[int]] [[real]] [[uid]] [[bytea]]&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
'''Реализует операторы''': &lt;br /&gt;
&amp;lt;tt&amp;gt;[[#оператор +|+]]&amp;lt;/tt&amp;gt;,&lt;br /&gt;
&amp;lt;tt&amp;gt;[[#оператор +=|+=]]&amp;lt;/tt&amp;gt;, &lt;br /&gt;
&amp;lt;tt&amp;gt;[[#оператор &amp;lt;&amp;lt;|&amp;lt;&amp;lt;]]&amp;lt;/tt&amp;gt;, &lt;br /&gt;
[[оператор присваивания|присваивания]],&lt;br /&gt;
[[операторы сравнения|сравнения]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&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;br&amp;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;
== оператор += ==&lt;br /&gt;
&lt;br /&gt;
operator += (''строка'': &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;
== оператор &amp;lt;&amp;lt; ==&lt;br /&gt;
&lt;br /&gt;
Эквивалент оператора &amp;lt;tt&amp;gt;[[#оператор +|+]]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== getc ==&lt;br /&gt;
&lt;br /&gt;
getc(''позиция'': &amp;lt;tt&amp;gt;[[string_iterator]]&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;
== get ==&lt;br /&gt;
&lt;br /&gt;
get(''индекс'': &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;
Метод возвращает числовой код символа, расположенного по переданному индексу (смещение относительно начала строки). При передаче индекса, выходящего за границы строки, будет возбуждено исключение &amp;lt;tt&amp;gt;[[Классы исключений#ERangeError|ERangeError]]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== setc ==&lt;br /&gt;
&lt;br /&gt;
setc(''позиция'': &amp;lt;tt&amp;gt;[[string_iterator]]&amp;lt;/tt&amp;gt;, ''новый код'': &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;
== set ==&lt;br /&gt;
&lt;br /&gt;
set(''индекс'': &amp;lt;tt&amp;gt;[[int]]&amp;lt;/tt&amp;gt;, ''новый код'': &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;
Метод устанавливает числовой код символа, расположенного по переданному индексу (смещение относительно начала строки). При передаче индекса, выходящего за границы строки, будет возбуждено исключение &amp;lt;tt&amp;gt;[[Классы исключений#ERangeError|ERangeError]]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== at ==&lt;br /&gt;
&lt;br /&gt;
set(''индекс'': &amp;lt;tt&amp;gt;[[int]]&amp;lt;/tt&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
'''Возвращает''': &amp;lt;tt&amp;gt;[[string_iterator]]&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод создает строковый итератор и инициализирует его так, чтобы он указывал на символ по переданному индексу.&lt;br /&gt;
&lt;br /&gt;
== empty ==&lt;br /&gt;
&lt;br /&gt;
'''Возвращает''': [[логическое значение]] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод проверяет строку на наличие в ней данных. &lt;br /&gt;
&lt;br /&gt;
== length ==&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;
== clear ==&lt;br /&gt;
&lt;br /&gt;
'''Возвращает''': текущий объект &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очищает строку от содержимого. После этого строка считается пустой.&lt;br /&gt;
&lt;br /&gt;
== substr ==&lt;br /&gt;
&lt;br /&gt;
substr(''начальная позиция:'' &amp;lt;tt&amp;gt;[[string_iterator]]&amp;lt;/tt&amp;gt;, ''количество символов'': &amp;lt;tt&amp;gt;[[int]]&amp;lt;/tt&amp;gt;) &amp;lt;br&amp;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;
== substr_int ==&lt;br /&gt;
&lt;br /&gt;
substr_int(''начальная позиция:'' &amp;lt;tt&amp;gt;[[int]]&amp;lt;/tt&amp;gt;, ''количество символов'': &amp;lt;tt&amp;gt;[[int]]&amp;lt;/tt&amp;gt;) &amp;lt;br&amp;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;[[#substr|substr]]&amp;lt;/tt&amp;gt;, только начальная позиция принимается в виде числа.&lt;br /&gt;
&lt;br /&gt;
== copy ==&lt;br /&gt;
&lt;br /&gt;
substr(''начальная позиция:'' &amp;lt;tt&amp;gt;[[string_iterator]]&amp;lt;/tt&amp;gt;, ''конечная позиция'': &amp;lt;tt&amp;gt;[[string_iterator]]&amp;lt;/tt&amp;gt;) &amp;lt;br&amp;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;
== copy_int ==&lt;br /&gt;
&lt;br /&gt;
copy_int(''начальная позиция:'' &amp;lt;tt&amp;gt;[[int]]&amp;lt;/tt&amp;gt;, ''конечная позиция'': &amp;lt;tt&amp;gt;[[int]]&amp;lt;/tt&amp;gt;) &amp;lt;br&amp;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;[[#copy|copy]]&amp;lt;/tt&amp;gt;, только позиции принимаются в виде чисел.&lt;br /&gt;
&lt;br /&gt;
== replace ==&lt;br /&gt;
&lt;br /&gt;
replace(''начальная позиция'': &amp;lt;tt&amp;gt;[[string_iterator]]&amp;lt;/tt&amp;gt;, ''количество символов'': &amp;lt;tt&amp;gt;[[int]]&amp;lt;/tt&amp;gt;, ''строка замены'': &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;
== replace_int ==&lt;br /&gt;
&lt;br /&gt;
replace(''начальная позиция'': &amp;lt;tt&amp;gt;[[int]]&amp;lt;/tt&amp;gt;, ''количество символов'': &amp;lt;tt&amp;gt;[[int]]&amp;lt;/tt&amp;gt;, ''строка замены'': &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;
Метод аналогичен методу &amp;lt;tt&amp;gt;[[#replace|replace]]&amp;lt;/tt&amp;gt;, только позиция передается в виде числа.&lt;br /&gt;
&lt;br /&gt;
== replace_rel ==&lt;br /&gt;
&lt;br /&gt;
== replace_rel_int ==&lt;br /&gt;
&lt;br /&gt;
== replace_all ==&lt;br /&gt;
&lt;br /&gt;
replace_all(''подстрока поиска'': &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;
'''Возвращает''': текущий объект &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод находит все включения подстроки поиска в исходной строке и заменяет их на подстроку замены.&lt;br /&gt;
&lt;br /&gt;
== insert ==&lt;br /&gt;
&lt;br /&gt;
insert(''позиция'': &amp;lt;tt&amp;gt;[[string_iterator]]&amp;lt;/tt&amp;gt;, ''строка'': &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;
== insert_int ==&lt;br /&gt;
&lt;br /&gt;
insert(''позиция'': &amp;lt;tt&amp;gt;[[int]]&amp;lt;/tt&amp;gt;, ''строка'': &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;
То же, что и метод &amp;lt;tt&amp;gt;[[#insert|insert]]&amp;lt;/tt&amp;gt;, только позиция передается числом.&lt;br /&gt;
&lt;br /&gt;
== erase ==&lt;br /&gt;
&lt;br /&gt;
erase(''начальная позиция:'' &amp;lt;tt&amp;gt;[[string_iterator]]&amp;lt;/tt&amp;gt;, ''количество символов'': &amp;lt;tt&amp;gt;[[string_iterator]]&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;
== erase_int ==&lt;br /&gt;
&lt;br /&gt;
erase_int(''начальная позиция:'' &amp;lt;tt&amp;gt;[[int]]&amp;lt;/tt&amp;gt;, ''количество символов'': &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;
То же, что и метод &amp;lt;tt&amp;gt;[[#erase|erase]]&amp;lt;/tt&amp;gt;, только позиция передается числом.&lt;br /&gt;
&lt;br /&gt;
== find ==&lt;br /&gt;
&lt;br /&gt;
find(''подстрока поиска'': &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_iterator]]&amp;lt;/tt&amp;gt;&amp;lt;/span&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
'''Возвращает''': &amp;lt;tt&amp;gt;[[string_iterator]]&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод ищет в исходной строке искомую подстроку и возвращает итератор начала вхождения. Для поиска подстроки, начиная с некоторой позиции, может быть передан второй параметр — итератор, установленный на нужную позицию.&lt;br /&gt;
&lt;br /&gt;
== find_first_of ==&lt;br /&gt;
&lt;br /&gt;
== find_first_not_of ==&lt;br /&gt;
&lt;br /&gt;
== begin ==&lt;br /&gt;
&lt;br /&gt;
'''Возвращает''': &amp;lt;tt&amp;gt;[[string_iterator]]&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод возвращает указатель на начало строки.&lt;br /&gt;
&lt;br /&gt;
== end ==&lt;br /&gt;
&lt;br /&gt;
'''Возвращает''': &amp;lt;tt&amp;gt;[[string_iterator]]&amp;lt;/tt&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод возвращает указатель на конец строки.&lt;br /&gt;
&lt;br /&gt;
'''Примечание''': Под &amp;quot;концом строки&amp;quot; здесь понимается позиция за последним символом строки. Таким образом, данный итератор не указывает на данные строки, а служит только как маркер конца строки. Конечно, при желании, можно использовать оператор &amp;lt;tt&amp;gt;[[string_iterator#оператор --|string_iterator:--]]&amp;lt;/tt&amp;gt;, для движения по строке в обратную сторону.&lt;/div&gt;</summary>
		<author><name>Velaar</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_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Velaar</id>
		<title>Обсуждение участника:Velaar</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_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Velaar"/>
				<updated>2009-06-14T11:52:20Z</updated>
		
		<summary type="html">&lt;p&gt;Velaar: Новая страница: «Все обсуждение в привате!»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Все обсуждение в привате!&lt;/div&gt;</summary>
		<author><name>Velaar</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Velaar</id>
		<title>Участник:Velaar</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Velaar"/>
				<updated>2009-06-14T11:51:48Z</updated>
		
		<summary type="html">&lt;p&gt;Velaar: Новая страница: «См. [http://ding.deeptown.org Deeptown DING Project]»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;См. [http://ding.deeptown.org Deeptown DING Project]&lt;/div&gt;</summary>
		<author><name>Velaar</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>2009-06-02T10:33:55Z</updated>
		
		<summary type="html">&lt;p&gt;Velaar: /* Базовые команды оболочки DSH */&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;br /&gt;
&lt;br /&gt;
=== Графические обозначения ===&lt;br /&gt;
&lt;br /&gt;
Для облегчения навигации по заданиям применено цветовое кодирование сложности поставленной задачи и ее востребованности:&lt;br /&gt;
&lt;br /&gt;
Категории сложности:&lt;br /&gt;
: &amp;lt;span style=&amp;quot;color: white; background-color: #00FF00;&amp;quot;&amp;gt;· раз плюнуть ·&amp;lt;/span&amp;gt;&lt;br /&gt;
: &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;&lt;br /&gt;
: &amp;lt;span style=&amp;quot;color: white; background-color: #FFCC00;&amp;quot;&amp;gt;· средняя ·&amp;lt;/span&amp;gt;&lt;br /&gt;
: &amp;lt;span style=&amp;quot;color: white; background-color: #FF8000;&amp;quot;&amp;gt;· выше среднего ·&amp;lt;/span&amp;gt;&lt;br /&gt;
: &amp;lt;span style=&amp;quot;color: white; background-color: #DD0000;&amp;quot;&amp;gt;· высокая ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Категории востребованности (приоритет):&lt;br /&gt;
: &amp;lt;span style=&amp;quot;color: white; background-color: #A0A0A0;&amp;quot;&amp;gt;· может подождать ·&amp;lt;/span&amp;gt;&lt;br /&gt;
: &amp;lt;span style=&amp;quot;color: white; background-color: #808080;&amp;quot;&amp;gt;· низкий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
: &amp;lt;span style=&amp;quot;color: white; background-color: #FFCC00;&amp;quot;&amp;gt;· средний ·&amp;lt;/span&amp;gt;&lt;br /&gt;
: &amp;lt;span style=&amp;quot;color: white; background-color: #FF8000;&amp;quot;&amp;gt;· выше среднего ·&amp;lt;/span&amp;gt;&lt;br /&gt;
: &amp;lt;span style=&amp;quot;color: white; background-color: #DD0000;&amp;quot;&amp;gt;· высокий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Операторы DSH ==&lt;br /&gt;
&lt;br /&gt;
По сути это команды, но играют роль структурных элементов шеллового языка программирования. Необходимо реализовать команды: true, false, test, if, switch, for, foreach.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #DD0000;&amp;quot;&amp;gt;· высокий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': &lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 07:38, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': &lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Базовые команды оболочки DSH ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены команды, которые требуется реализовать для нормального функционирования командной оболочки Диптауна (DSH). Дабы не изобретать велосипед, было решено делать команды максимально похожими на их UNIX аналоги. Однако, следует помнить, что при реализации команд, надо учитывать специфику диптауна и ориентироваться на максимальное юзабилити а не стопроцентное соответствие UNIX. Короче говоря, не надо стараться реализовать полный клон команды, со всеми &amp;quot;наворотами&amp;quot; — достаточно только базовых возможностей, которые гарантированно понадобятся и будут полезны.&lt;br /&gt;
&lt;br /&gt;
'''Примечание''': Все без исключения команды должны поддерживать следующие ключи:&lt;br /&gt;
;'''--version''': Вывод информации о версии программы и ее авторе.&lt;br /&gt;
;'''--help''': Вывод краткой справки по использованию команды. Может выводиться так же при отсутствии какого либо ввода со стороны пользователя (вызов команды без параметров), если это не противоречит логике работы команды.&lt;br /&gt;
;'''--''': Индикатор окончания списка параметров. Если в строке параметров встречается данный символ, это означает что дальнейшая информация уже не является параметрами. Например, команды &lt;br /&gt;
::&amp;lt;tt&amp;gt;deep$ ls -l&amp;lt;/tt&amp;gt;&lt;br /&gt;
и&lt;br /&gt;
::&amp;lt;tt&amp;gt;deep$ ls -- -l&amp;lt;/tt&amp;gt;&lt;br /&gt;
:имеют различный смысл. В первом случае вызывается расширенный список файлов текущей директории, тогда как во втором делается попытка отобразить содержимое директории с именем &amp;quot;-l&amp;quot;.&lt;br /&gt;
;'''-''': Отдельный дефиз может использоваться всесто имени файла для указания того, что данные требуется получать из стандартного устройства ввода. А вывод — соответственно направлять в устройство вывода. Конкретное поведение зависит от используемой команды. Таким образом, следующие команды являются эквивалентами:&lt;br /&gt;
::&amp;lt;tt&amp;gt;deep$ cat &amp;lt;/tt&amp;gt;&lt;br /&gt;
::&amp;lt;tt&amp;gt;deep$ cat - &amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;s&amp;gt;ls&amp;lt;/s&amp;gt;  === &lt;br /&gt;
&lt;br /&gt;
Команда ls (от англ. ''list'' — список) выводит в терминал содержимое некоторой директории. Формат списка, а так же исследуемая директория, задются с помощью соответствующих ключей. &lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #DD0000;&amp;quot;&amp;gt;· высокий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]], [[регулярные выражения]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 07:38, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=ls здесь].&lt;br /&gt;
* '''Исполнитель''': [http://ding.deeptown.org Deeptown DING project]&lt;br /&gt;
* '''Срок''': Реализовано&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;s&amp;gt;cat&amp;lt;/s&amp;gt;  === &lt;br /&gt;
&lt;br /&gt;
Команда cat выводит в терминал содержимое некоторого файла.&lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #DD0000;&amp;quot;&amp;gt;· высокий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]], [[регулярные выражения]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 07:38, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=ls здесь].&lt;br /&gt;
* '''Исполнитель''': [http://ding.deeptown.org Deeptown DING project]&lt;br /&gt;
* '''Срок''': Реализовано&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;s&amp;gt;cp&amp;lt;/s&amp;gt;  === &lt;br /&gt;
&lt;br /&gt;
Команда cp (от англ. ''copy'' — копировать) производит копирование содержимого указанного каталога в новый каталог. &lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #DD0000;&amp;quot;&amp;gt;· высокий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=cp здесь].&lt;br /&gt;
* '''Исполнитель''': [http://ding.deeptown.org Deeptown DING project]&lt;br /&gt;
* '''Срок''': реализовано&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== mv  === &lt;br /&gt;
&lt;br /&gt;
Команда mv (от англ. ''move'' — переместить) производит перемещение содержимого указанного каталога в новый каталог, либо переименовывает файлы (каталоги). &lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #DD0000;&amp;quot;&amp;gt;· высокий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=mv здесь].&lt;br /&gt;
* '''Исполнитель''': [http://ding.deeptown.org Deeptown DING project]&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;s&amp;gt;rm&amp;lt;/s&amp;gt;  === &lt;br /&gt;
&lt;br /&gt;
Команда rm (от англ. ''remove'' — удалить) удаляет файл, либо каталог. &lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #DD0000;&amp;quot;&amp;gt;· высокий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=rm здесь].&lt;br /&gt;
* '''Исполнитель''': [http://ding.deeptown.org Deeptown DING project]&lt;br /&gt;
* '''Срок''': реализовано&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;s&amp;gt;touch&amp;lt;/s&amp;gt;  === &lt;br /&gt;
&lt;br /&gt;
Команда touch (от англ. ''touch'' — потрогать) создает пустой файл с указанным именем, либо изменяет время доступа существующего файла. &lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #00FF00;&amp;quot;&amp;gt;· раз плюнуть ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #DD0000;&amp;quot;&amp;gt;· высокий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=touch здесь].&lt;br /&gt;
* '''Исполнитель''': [http://ding.deeptown.org Deeptown DING project]&lt;br /&gt;
* '''Срок''': реализовано&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== mkdir  === &lt;br /&gt;
&lt;br /&gt;
Команда mkdir (от англ. ''make directory'') создает директорию с указанным именем. &lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #00FF00;&amp;quot;&amp;gt;· раз плюнуть ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #DD0000;&amp;quot;&amp;gt;· высокий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=mkdir здесь].&lt;br /&gt;
* '''Исполнитель''': [http://ding.deeptown.org Deeptown DING project]&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== grep  === &lt;br /&gt;
&lt;br /&gt;
Команда grep производит фильтрацию своего входного потока и выдает результат в выходной поток. Следует иметь в виду, что реализация PCRE (используемая в К++) синтаксически отличается от канонической UNIX. Основная задача — выборка интересующих строк из входного потока.&lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #FF8000;&amp;quot;&amp;gt;· выше среднего ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]], [[регулярные выражения]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=grep здесь].&lt;br /&gt;
* '''Исполнитель''': [http://ding.deeptown.org Deeptown DING project]&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== sed  === &lt;br /&gt;
&lt;br /&gt;
Команда sed (от англ. ''stream editor'' — редактор потоков) производит фильтрацию своего входного потока и выдает результат в выходной поток. Следует иметь в виду, что реализация PCRE (используемая в К++) синтаксически отличается от канонической UNIX. Основная задача — преобразование данных по шаблону.&lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #808080;&amp;quot;&amp;gt;· низкий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]], [[регулярные выражения]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=sed здесь].&lt;br /&gt;
* '''Исполнитель''': [http://ding.deeptown.org Deeptown DING project]&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== wc  === &lt;br /&gt;
&lt;br /&gt;
Команда wc (от англ. ''word counter'' — счетчик слов) производит подсчет количества структурных элементов в своем входном потоке и выдает результат в выходной поток. В качестве таких элементов могут выступать символы (ключ &amp;lt;tt&amp;gt;-c&amp;lt;/tt&amp;gt;), строки (ключ &amp;lt;tt&amp;gt;-l&amp;lt;/tt&amp;gt;) и др. Таким образом, простейший способ подсчета количества строк в файле может выглядеть так:&lt;br /&gt;
:&amp;lt;tt&amp;gt;deep$ cat myfile | wc -l&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #808080;&amp;quot;&amp;gt;· низкий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]], [[регулярные выражения]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=wc здесь].&lt;br /&gt;
* '''Исполнитель''': [http://ding.deeptown.org Deeptown DING project]&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== nl  === &lt;br /&gt;
&lt;br /&gt;
Команда nl (от англ. ''numbered lines'' — пронумерованные строки) записывает в стандартный поток вывода данные из своего стандартного потока ввода, предворяя их номерами строк. Может использоваться для формирования листингов программ, составления отчетов и др.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #00FF00;&amp;quot;&amp;gt;· раз плюнуть ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #808080;&amp;quot;&amp;gt;· низкий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': &lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=nl здесь].&lt;br /&gt;
* '''Исполнитель''': [http://ding.deeptown.org Deeptown DING project]&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== sort  === &lt;br /&gt;
&lt;br /&gt;
Команда sort производит сортировку данных из своего входного потока и выдает результат в выходной поток. &lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #808080;&amp;quot;&amp;gt;· низкий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=sort здесь].&lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== head  === &lt;br /&gt;
&lt;br /&gt;
Команда head возвращает первые N строк из своего входного потока. &lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #00FF00;&amp;quot;&amp;gt;· раз плюнуть ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #808080;&amp;quot;&amp;gt;· низкий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=head здесь].&lt;br /&gt;
* '''Исполнитель''': [http://ding.deeptown.org Deeptown DING project]&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== tail  === &lt;br /&gt;
&lt;br /&gt;
Команда head возвращает последние N строк из своего входного потока. &lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #00FF00;&amp;quot;&amp;gt;· раз плюнуть ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #808080;&amp;quot;&amp;gt;· низкий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=tail здесь].&lt;br /&gt;
* '''Исполнитель''': [http://ding.deeptown.org Deeptown DING project]&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;s&amp;gt;more&amp;lt;/s&amp;gt;  === &lt;br /&gt;
&lt;br /&gt;
Команда more выводит данные из своего входного потока порциями по N строк. Используется для постепенного отображения содержимого буфера в консоль (так, чтобы пользователь успел все прочитать).&lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #00FF00;&amp;quot;&amp;gt;· раз плюнуть ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #DD0000;&amp;quot;&amp;gt;· высокий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=more здесь].&lt;br /&gt;
* '''Исполнитель''': [http://ding.deeptown.org Deeptown DING project]&lt;br /&gt;
* '''Срок''': Реализовано&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== mount  === &lt;br /&gt;
&lt;br /&gt;
Команда mount используется для привязки носителей данных к файловой системе Диптауна. Принципы ее работы несколько отличаются от UNIX аналога, поэтому документация не дается. Для получения информации, необходимо [[Обратная связь|связаться с разработчиками]].&lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #FF8000;&amp;quot;&amp;gt;· выше среднего ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''':&lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== chmod  === &lt;br /&gt;
&lt;br /&gt;
Команда chmod используется для изменения прав доступа к файлам в файловой системе Диптауна. Принципы ее работы несколько отличаются от UNIX аналога, поэтому документация не дается. Для получения информации, необходимо [[Обратная связь|связаться с разработчиками]].&lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #FF8000;&amp;quot;&amp;gt;· выше среднего ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''':&lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== chown  === &lt;br /&gt;
&lt;br /&gt;
Команда chown используется для изменения владельца и группы файлов в файловой системе Диптауна. &lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #FFCC00;&amp;quot;&amp;gt;· средний ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=chown здесь].&lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== chattr  === &lt;br /&gt;
&lt;br /&gt;
Команда chattr используется для изменения атрибутов файлов (в основном метаинформации) в файловой системе Диптауна. Принципы ее работы несколько отличаются от UNIX аналога, поэтому документация не дается. Для получения информации, необходимо [[Обратная связь|связаться с разработчиками]].&lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #FFCC00;&amp;quot;&amp;gt;· средний ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': &lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== su  === &lt;br /&gt;
&lt;br /&gt;
Команда su (от англ. ''switch user'' — переключить пользователя) используется для запуска подоболочки от имени другого пользователя.&lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #808080;&amp;quot;&amp;gt;· низкий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[UserDB]], [[DSH]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=su здесь].&lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== sudo  === &lt;br /&gt;
&lt;br /&gt;
Команда sudo позволяет выполнить команду от имени другого пользователя.&lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #808080;&amp;quot;&amp;gt;· низкий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[UserDB]], [[DSH]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=sudo здесь].&lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== passwd  === &lt;br /&gt;
&lt;br /&gt;
Команда passwd позволяет сменить пароль пользователя.&lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #FFCC00;&amp;quot;&amp;gt;· средний ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[UserDB]], [[DSH]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=passwd здесь].&lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Стандартный интерфейс SQL ==&lt;br /&gt;
== Универсальный HTTP клиент ==&lt;br /&gt;
== Универсальный HTTP сервер ==&lt;br /&gt;
== Репозиторий медиаданных ==&lt;/div&gt;</summary>
		<author><name>Velaar</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/Deptown_Programming_Contest_(DPC)</id>
		<title>Deptown Programming Contest (DPC)</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/Deptown_Programming_Contest_(DPC)"/>
				<updated>2009-05-17T19:56:40Z</updated>
		
		<summary type="html">&lt;p&gt;Velaar: /* Текущее положение дел */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Здравствуй Гость! Ты попал на страничку программерского соревнования в рамках проекта Диптаун =)&lt;br /&gt;
&lt;br /&gt;
DPC это соревнование, участие в котором принимают роботы, находящиеся в виртуальном пространстве диптауна. Управляет роботом программа, написанная на языке [[K++]].&lt;br /&gt;
&lt;br /&gt;
Идея соревнования была заимствована из проекта [http://robocode.sourceforge.net/ Robocode] и адаптирована под текущие реалии и специфику платформы Диптаун. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Для чего это нужно? ==&lt;br /&gt;
&lt;br /&gt;
Если говорить откровенно, то мы еще сами не знаем зачем все это и что из этого может получиться :)&lt;br /&gt;
&lt;br /&gt;
Но на самом деле, у DPC целей много. Во-первых, популяризация самого проекта Диптаун и наглядная демонстрация возможностей платформы Диптауна. Во-вторых, это отличный способ изучить язык [[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;
DPC это в первую очередь соревнование мозгов, а потом уже случайностей и прочих факторов. Поэтому, влияние случайностей должно быть сведено к минимуму. Однако убрать их совсем не получится, опять же в силу специфики платформы, да это и не нужно. Впрочем, нельзя исключать и элемент зрелищности, где случай может сыграть свою роль. Поэтому на данный момент у меня есть несколько вариантов игры :)&lt;br /&gt;
&lt;br /&gt;
На данный момент, я их представляю следующим образом: &lt;br /&gt;
&lt;br /&gt;
== Вариант первый: Sumo Challenge ==&lt;br /&gt;
&lt;br /&gt;
[[Изображение:DPC.png|right]]&lt;br /&gt;
В этом варианте соревнований самые простые правила и роботы. Однако это не значит что победить в нем легко. Наоборот, мне кажется что это лучший из вариантов, поскольку все зависит от тактики робота и качества программы. &lt;br /&gt;
&lt;br /&gt;
=== Арена ===&lt;br /&gt;
&lt;br /&gt;
Арена -- это пространство для соревнования. Арена зависит от типа проводимого соревнования. В данном случае это площадка без ограждений, размерами скажем 10 на 10 метров. Сама площадка может висеть над пустотой или просто являться возвыщением. &lt;br /&gt;
&lt;br /&gt;
В определенных местах на нее помещаются два робота соперника. По сингалу роботы начинают движение. Основная задача -- вытолкнуть соперника за пределы площадки, самому оставшись на ней. Роботы полностью идентичны, они состоят из одинаковых компонентов и имеют одинаковые параметры мощности и скорости. Единственное отличие в программе управления. Более умная программа должна учитывать положение соперника и нападать, в то же время стараясь не подставляться под удар.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Роботы ===&lt;br /&gt;
&lt;br /&gt;
Sumo это простейший вид соревнований, соответственно и роботы должны быть простые :) На данный момент планируется 2 вида роботов: четырех колесные и трехколесные. Первый имеет два рулевых колсеса являющиеся так же ведущими (машина с передним приводом), второй -- два ведущих и одно рулевое (трайк).&lt;br /&gt;
&lt;br /&gt;
Трехколесный робот более маневренный, однако и менее устойчивый. Четырехколесный более устойчивый, но управлять им сложнее. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Управление ===&lt;br /&gt;
&lt;br /&gt;
Независимо от конструкции, все роботы обладают следущим набором систем:&lt;br /&gt;
* Приводы колес (моторы). Можно задавать скорость вращения и угол поворота (для ведущих колес).&lt;br /&gt;
* Сенсор краев -- с его помощью можнно определять положение робота на площадке&lt;br /&gt;
* Радар -- служит для слежения за роботом противника. Дает информацию о его скорости и направлении движения.&lt;br /&gt;
&lt;br /&gt;
Дополнительно, сам робот знает скорость своего движения и свое положение в пространстве арены.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Стратегии ===&lt;br /&gt;
&lt;br /&gt;
Постараюсь привести пример нескольких стратегий поведения робота, а также возможные контр стратегии:&lt;br /&gt;
&lt;br /&gt;
==== Берсерк ====&lt;br /&gt;
&lt;br /&gt;
Наверное самая ломовая стратегия :) Просто фиксируем положение противника и гоним в него, в надежде что так мы его скинем с площадки. &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;
* Плюсы: выиграть сложно, но зато сам не улетишь. При определенных условиях, грамотно написанный &amp;quot;трус&amp;quot;, будет выигрывать у &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;
* Минусы: умрем раньше, чем два &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;
=== Очки ===&lt;br /&gt;
&lt;br /&gt;
За каждую победу начисляется одно очко, за поражение ноль.&lt;br /&gt;
&lt;br /&gt;
Для предотвращения затягивания боя, вводится трехминутное ограничение на длину боя. Если по истечении этого времени оба робота остались на площадке, бой завершается вничью. Для большей статистической значимости возможно проведение нескольких боев, после чего победившим считается соперник, набравший большее количество очков.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вариант второй -- классическая Robocode ==&lt;br /&gt;
&lt;br /&gt;
Здесь на первое место выходит зрелищность :) Действие происходит на поле, на котором может находиться сразу несколько соперников. Каждый соперник представлен танком, имеющим пушку и радар. По условиям, танки так же идентичны. &lt;br /&gt;
&lt;br /&gt;
На поле боя могут находиться вспомогательные элементы вроде стен или возвышений. Возвышения позволяют стрелять дальше, если въехать на них, стены помогают защищаться от вражеских выстрелов.&lt;br /&gt;
&lt;br /&gt;
Возможных вариантов стратегий здесь еще больше чем в Sumo. Описывать их все не хватит времени, тем более что по этой теме есть масса материалов на  [http://robocode.sourceforge.net/ официальном сайте].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Текущее положение дел ==&lt;br /&gt;
&lt;br /&gt;
--[[Участник:Velaar|Velaar]] 02:56, 18 мая 2009 (NOVST)&lt;br /&gt;
Всех желающих принять участие в реализации проекта просим в Deeptown DING project (информацию можно найти на сайте ding.deeptown.org) &lt;br /&gt;
&lt;br /&gt;
Как только перейдем к этому проекту появится соотвествующая новость и звпись здесь.&lt;/div&gt;</summary>
		<author><name>Velaar</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_%D0%B8_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B</id>
		<title>Классы и объекты</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_%D0%B8_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B"/>
				<updated>2009-04-09T15:18:34Z</updated>
		
		<summary type="html">&lt;p&gt;Velaar: Тавтология + export в main'е&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&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;
=== Концепция языка высокого уровня ===&lt;br /&gt;
&lt;br /&gt;
...С увеличением сложности программ, программировать на ассемблере становилось все сложнее и сложнее.  Ввиду естественных ограничений человеческой памяти и внимания, написание программ и их отладка стали настолько сложными, что люди всерьез подошли к рассмотрению идеи языка высокого уровня — некоторой системы обозначений и абстрактных команд, которая позволила бы записывать программы в абстрактной форме, не заботясь о том, как располагать в памяти код и данные, как их структурировать и т. д. Всю эту работу брал на себя компилятор. Кроме того, он обеспечивал программиста удобным способом записи математических выражений — в естественной форме. При этом, компилятор сам &amp;quot;разворачивал&amp;quot; эти выражения в наборы инструкций ассемблера, попутно подставляя значения констант и адреса переменных. Это дало возможность программистам записывать формулы вычислений в натуральном виде, что уменьшало трудозатраты, ускоряло написание программ и уменьшало вероятность ошибок. Тем не менее, многие авторитеты того времени очень негативно отзывались о языках высокого уровня. В то время языки были довольно несовершенными и генерировали &amp;quot;ужасный&amp;quot; с точки зрения программистов код. Код был не оптимален, занимал огромное по тем временам количество памяти и работал медленнее, чем та же программа, написанная на ассемблере. Смешно сказать, но в то время многие не верили в то, что будущее за ЯП высокого уровня; их считали не более чем игрушкой для &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;
Ну и наконец, одна светлая голова додумалась до мысли: &amp;quot;а что если в структурах группировать не только переменные, но и сами процедуры которые должны работать с ними?&amp;quot;. В результате получилось то, что мы сейчас называем классом — то есть, некоторая обособленная функциональная сущность, которая сама хранит свои данные, а главное сама умеет их обрабатывать. Теперь программисту не нужно помнить, какая из процедур отвечает за некоторое действие над такими-то переменными — он просто берет объект и работает с ним. Все что происходит с объектом внутри — это его личное дело.&lt;br /&gt;
&lt;br /&gt;
Последним шагом к современному пониманию программ явились концепции [http://ru.wikipedia.org/wiki/Полиморфизм_(программирование) полиморфизма], [http://ru.wikipedia.org/wiki/Инкапсуляция_(программирование) инкапсуляции] и [http://ru.wikipedia.org/wiki/Наследование_(программирование) наследования]. Не будем пока углубляться в суть этих понятий, отметим только, что их введение сформировало современное понимание объектно-ориентированного программирования.&lt;br /&gt;
&lt;br /&gt;
При написании программы на объектно-ориентированном языке, программист строит математическую модель взаимодействия различных сущностей. Каждая из сущностей это свой мир, у которого есть свои законы и особенности. При этом сущности могут быть как конкретные, вроде &amp;quot;сетевой интерфейс&amp;quot; или &amp;quot;файл&amp;quot;, так и совершенно абстрактные, например &amp;quot;отношение&amp;quot; или &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;
Итак, любой современный объектно-ориентированный язык оперирует понятиями классов и объектов. Точно такой же подход нашел свое применение в нашей виртуальной машине. Основой всей платформы Gide является объектно-ориентированный принцип. Причем, в этом смысле она является более объектно-ориентированной, нежели традиционные ЯП вроде C++. В C++ существуют понятия элементарных типов. Это сделано в целях производительности и было продиктовано архитектурой самого языка. В классических языках программирования, элементарные типы, так или иначе, отражают сущности из &amp;quot;реального мира&amp;quot;. Например, целочисленные типы int и short соответствуют 32х и 16ти разрядным регистрам процессора, указатели и строки соответствуют представлению данных в памяти и т. д. В Gide это не так. Все с чем оперирует виртуальная машина — это объекты. Соответственно, не существует понятия элементарных типов (просто нет критерия, который бы позволил отделить одно от другого). &lt;br /&gt;
&lt;br /&gt;
Язык K++ в полной мере наследует идеологию Gide. Скажем, для него нет отличия между типом &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; (целое число) и некоторым пользовательским классом &amp;lt;tt&amp;gt;MyWeirdClass&amp;lt;/tt&amp;gt;: везде, где можно использовать &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;, можно использовать &amp;lt;tt&amp;gt;MyWeirdClass&amp;lt;/tt&amp;gt; и наоборот. Более того, это позволяет работать с системными классами так же, как с пользовательскими! Например, ничто не мешает унаследовать свой класс от класса &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;, равно как ничто не мешает определить математические операторы для класса &amp;lt;tt&amp;gt;MyWeirdClass&amp;lt;/tt&amp;gt; и использовать объекты этого класса в арифметических выражениях. При этом изменится логика работы всего языка. К примеру, после добавления некоторого метода к классу int можно будет вызывать методы у всех его экземпляров, даже тех, что представлены числовыми константами внутри самого языка!&lt;br /&gt;
&lt;br /&gt;
== Понятие класса ==&lt;br /&gt;
&lt;br /&gt;
Что такое ''класс'' проще всего объяснить на примерах. Представьте, что вас спрашивают &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;
Другой пример: если вас попросить &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;
&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;, &amp;quot;только на запись&amp;quot; или &amp;quot;и на чтение и на запись&amp;quot;. Свойство может быть связано либо с некоторым полем, либо с методом. Например, если свойство доступно &amp;quot;только на чтение&amp;quot; то его можно использовать для получения значения, но не для его записи (то есть, такое свойство не может фигурировать в качестве [[lvalue]]).&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;lt;tt&amp;gt;'''private'''&amp;lt;/tt&amp;gt; — Частная собственность! Видимость только внутри методов данного класса&lt;br /&gt;
* &amp;lt;tt&amp;gt;'''protected'''&amp;lt;/tt&amp;gt; — &amp;quot;Семейная реликвия&amp;quot;, доступ внутри методов данного класса и всех его дочерних классов&lt;br /&gt;
* &amp;lt;tt&amp;gt;'''public'''&amp;lt;/tt&amp;gt; — видимость и доступ для всех&lt;br /&gt;
&lt;br /&gt;
'''Примечание:''' По умолчанию методы имеют видимость &amp;lt;tt&amp;gt;'''private'''&amp;lt;/tt&amp;gt;, в то время как свойства — &amp;lt;tt&amp;gt;'''public'''&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведем, наконец, пример объявления класса:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
class MyWeirdClass {&lt;br /&gt;
    var m_x = 0;  // поле m_x, изначально проинициализированное нулем&lt;br /&gt;
    const m_y = 1; // поле-константа m_y&lt;br /&gt;
&lt;br /&gt;
    // методы класса&lt;br /&gt;
    public const function int get_mul() { return m_x * m_y; }&lt;br /&gt;
    public function void set_mul(int x) { m_x = x / m_y; }&lt;br /&gt;
&lt;br /&gt;
    // свойство класса&lt;br /&gt;
    public property mul read get_mul write set_mul;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;1: Как у любого нормального разумного существа, у класса есть &amp;quot;голова&amp;quot; и &amp;quot;тело&amp;quot;. Ключевое слово &amp;lt;tt&amp;gt;'''class'''&amp;lt;/tt&amp;gt; начинает объявление класса. Далее за ним следует [[идентификатор]] имени класса, после чего идет тело класса.&lt;br /&gt;
&lt;br /&gt;
;3-4: Здесь мы видим объявление двух полей класса — переменной ''m_x'' и константы ''m_y'', которые, подобно обычным переменным инициализируются тут же, на месте объявления (камень в огород C++). Зачем нужны поля-константы, описано в главе [[Константы]].  &lt;br /&gt;
&lt;br /&gt;
;7-8: Для доступа к состоянию объекта, определены два метода: ''аксессор'' &amp;lt;tt&amp;gt;get_mul()&amp;lt;/tt&amp;gt; и ''мутатор'' &amp;lt;tt&amp;gt;set_mul()&amp;lt;/tt&amp;gt;. Подобные конструкции применяются настолько часто, что им были даны специальные имена. Как видно из названия, первый метод дает доступ к значению, второй изменяет или мутирует его.&lt;br /&gt;
&lt;br /&gt;
;11: Завершается объявление класса объявлением свойства ''mul'', которое связывается с аксессором и мутатором. Думаю, читатель уже догадался, что это свойство типа &amp;quot;чтение и запись&amp;quot;. Таким образом, при обращении к свойству на чтение, будет вызван аксессор, а результат его выполнения будет возвращен в качестве значения свойства. И, наоборот, при попытке записать в свойство некоторое значение, будет вызван мутатор, в качестве аргумента которому будет передано это самое значение, а уж сам мутатор позаботится о том, чтобы оно было &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;
Для создания объекта того или иного класса служит оператор &amp;lt;tt&amp;gt;'''new'''&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
    var myWeirdObject = new MyWeirdClass;&lt;br /&gt;
&amp;lt;/source&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;
&lt;br /&gt;
Для задания наследования, в объявлении класса следует указать ключевое слово &amp;lt;tt&amp;gt;'''extends'''&amp;lt;/tt&amp;gt;,  за которым необходимо перечислить список идентификаторов классов-родителей, разделяя их запятыми:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// коробка&lt;br /&gt;
class Box { &lt;br /&gt;
    // из чего сделана коробка?&lt;br /&gt;
    public const function string material() { return &amp;quot;Картон&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
    // что в коробке?&lt;br /&gt;
    public const function string contents() { return &amp;quot;Пусто&amp;quot;; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// коробка с картошкой&lt;br /&gt;
class BoxWithPotatoes extends Box { &lt;br /&gt;
    public const function string contents() { return &amp;quot;Картошка&amp;quot;; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function OutputBox(const Box b) {&lt;br /&gt;
    print(&amp;quot;Материал: &amp;quot; + b.material() + &amp;quot;, содержит: &amp;quot; + b.contents() + &amp;quot;\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export function main() {&lt;br /&gt;
    var b1 = new Box;&lt;br /&gt;
    var b2 = new BoxWithPotatoes;&lt;br /&gt;
    OutputBox(b1); // Материал: Картон, содержит: Пусто&lt;br /&gt;
    OutputBox(b2); // Материал: Картон, содержит: Картошка&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;2-7: В этом примере мы создаем класс &amp;lt;tt&amp;gt;Box&amp;lt;/tt&amp;gt;, который представляет собой некоторую коробку. Мы определяем ее свойства, такие как ''материал'' и ''содержимое''.&lt;br /&gt;
&lt;br /&gt;
;10-12: Далее мы определяем класс &amp;lt;tt&amp;gt;BoxWithPotatoes&amp;lt;/tt&amp;gt; (''коробка с картошкой''), который наследуется от класса &amp;lt;tt&amp;gt;Box&amp;lt;/tt&amp;gt;, и тем самым заимствует свойства материала и содержимого, но первое он переопределяет (в случае методов это называется ''перекрытием'') собственным методом.&lt;br /&gt;
&lt;br /&gt;
;14-16: Мы определяем некоторую [[Функции|функцию]] для работы с нашими классами, которая будет отображать их состояние. Заметьте, что в качестве [[Функции#Аргументы|аргумента функции]] передается экземпляр класса &amp;lt;tt&amp;gt;Box&amp;lt;/tt&amp;gt;, то есть класса-родителя. При этом мы предполагаем, что любой класс, унаследованный от базового класса, будет обладать необходимым нам интерфейсом, а именно методами получения информации о свойствах (аксессорами мы их не называем, потому что они не связаны с конкретным полем; это было бы неверно).&lt;br /&gt;
&lt;br /&gt;
;18-23: Объявляется функция &amp;lt;tt&amp;gt;main()&amp;lt;/tt&amp;gt;, внутри которой и происходит самое интересное. Сначала мы создаем два экземпляра ''b1'' и ''b2'' классов &amp;lt;tt&amp;gt;Box&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;BoxWithPotatoes&amp;lt;/tt&amp;gt; соответственно. А затем, вызываем вышеописанную функцию &amp;lt;tt&amp;gt;OutputBox()&amp;lt;/tt&amp;gt;, которая отображает содержимое. Вывод в терминал (написан в комментарии к вызову) показывает, как это все работает.&lt;br /&gt;
&lt;br /&gt;
'''Примечание:''' при использовании множественного наследования существует одно серьезное ограничение: его нельзя применять для наследования от классов стандартной библиотеки. Это ограничение связано с архитектурой платформы Gide. Однако его можно обойти с помощью создания [[Класс-обертка|классов-оберток]] для системного класса, с последующим наследованием от него нового класса.&lt;br /&gt;
&lt;br /&gt;
== Методы ==&lt;br /&gt;
&lt;br /&gt;
''Метод'' — это некоторый код, связанный с объектом и управляющий его поведением. Управление может заключаться в изменении переменных состояния объекта (полей), либо выполнением некоторых операций над ними.&lt;br /&gt;
&lt;br /&gt;
При объявлении метода могут быть указаны следующие ключевые слова, в указанном порядке:&lt;br /&gt;
* &amp;lt;tt&amp;gt;'''private'''&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;'''protected'''&amp;lt;/tt&amp;gt; или &amp;lt;tt&amp;gt;'''public'''&amp;lt;/tt&amp;gt; — определяют область видимости метода&lt;br /&gt;
* &amp;lt;tt&amp;gt;'''static'''&amp;lt;/tt&amp;gt; — указывает, что метод является ''статическим'' (см. ниже)&lt;br /&gt;
* &amp;lt;tt&amp;gt;'''const'''&amp;lt;/tt&amp;gt; — метод не изменяет объект&lt;br /&gt;
* &amp;lt;tt&amp;gt;'''function'''&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;'''operator'''&amp;lt;/tt&amp;gt; или &amp;lt;tt&amp;gt;'''constructor'''&amp;lt;/tt&amp;gt; указывает, что объявляется: ''метод'', ''[[Операторы|оператор]]'' или ''конструктор'' (см. ниже)&lt;br /&gt;
* &amp;lt;tt&amp;gt;'''const'''&amp;lt;/tt&amp;gt; — метод возвращает результат, который нельзя изменять&lt;br /&gt;
&lt;br /&gt;
После этого указывается тип, возвращаемый методом. Если он опущен — возвращается [[Переменные#Нетипированные (динамические) переменные|динамическая переменная]]; если вместо типа указано ключевое слово &amp;lt;tt&amp;gt;'''void'''&amp;lt;/tt&amp;gt; — метод не возвращает результата. Следом за типом идет имя метода, затем — перечисление [[Функции#Аргументы|аргументов]] в скобках. Подробнее об объявлении функций и передаче параметров, можно прочитать в главе [[Функции]].&lt;br /&gt;
&lt;br /&gt;
В теле метода доступны все поля, методы и свойства данного класса и его предков. Например, в нижеприведенном коде, метод &amp;lt;tt&amp;gt;F2()&amp;lt;/tt&amp;gt; вызывает метод &amp;lt;tt&amp;gt;F1()&amp;lt;/tt&amp;gt; для того же объекта:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
class MyClass {&lt;br /&gt;
    public const function string F1() { return &amp;quot;smth&amp;quot;; }&lt;br /&gt;
    public const function string F2() { return F1(); }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Статические методы ===&lt;br /&gt;
&lt;br /&gt;
''Статический метод класса'' — это метод, относящийся к данному классу, но не объекту этого класса. Т.е. это некоторая вспомогательная для данного класса функция.&lt;br /&gt;
&lt;br /&gt;
При объявлении статического метода нужно указать ключевое слово &amp;lt;tt&amp;gt;'''static'''&amp;lt;/tt&amp;gt;.&lt;br /&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;
class MyClass {&lt;br /&gt;
    public static function string Info() { return &amp;quot;Я MyClass!&amp;quot;; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function f() {&lt;br /&gt;
    // Вызов статического метода:&lt;br /&gt;
    var myClassInfo = MyClass.Info();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Конструкторы ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''Внимание: информация в этом разделе устарела. Необходимо обновление'''&amp;lt;/font&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;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
public constructor Create();&lt;br /&gt;
public static MyClass Create();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тело конструктора чаще всего выглядит следующим образом: сначала создается экземпляр класса при помощи оператора &amp;lt;tt&amp;gt;'''new'''&amp;lt;/tt&amp;gt;, затем производятся некоторые действия, инициализующие этот объект, и, наконец, этот объект возвращается в качестве результата. &lt;br /&gt;
&lt;br /&gt;
В качестве примера приведем пример реализации некоторого абстрактного класса &amp;lt;tt&amp;gt;MyStream&amp;lt;/tt&amp;gt;, использующего системную реализацию класса &amp;lt;tt&amp;gt;stream&amp;lt;/tt&amp;gt;, и определяющую собственный конструктор:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
class MyStream {&lt;br /&gt;
    var string m_URL;&lt;br /&gt;
    var stream m_Stream;&lt;br /&gt;
public:&lt;br /&gt;
    static const MODE_READ = 1;&lt;br /&gt;
    static const MODE_WRITE = 2;&lt;br /&gt;
    constructor open(const string url, int mode) {&lt;br /&gt;
        var self = new MyStream;&lt;br /&gt;
        self.m_Stream.open(url, mode);&lt;br /&gt;
        self.m_URL = url;&lt;br /&gt;
        return self;&lt;br /&gt;
    }&lt;br /&gt;
    // прочие методы (опущены для краткости)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;2-3: Объявляются поля ''m_URL'' и ''m_Stream'' нашего класса, которые будут инициализироваться в конструкторе. &lt;br /&gt;
&lt;br /&gt;
;5-6: В публичной области класса объявляются статические константы ''MODE_READ'' и ''MODE_WRITE'', которые задают желаемый режим доступа к открываемому потоку. Это единственный случай, когда поле класса доступно на прямой доступ извне.&lt;br /&gt;
&lt;br /&gt;
;7: Объявляется конструктор &amp;lt;tt&amp;gt;open()&amp;lt;/tt&amp;gt;, принимающий в качестве параметров [[URL]] ресурса который требуется открыть и число, задающее с помощью вышеописанных констант режим доступа к потоку. В теле конструктора мы создаем инстанцию ''self'' нашего класса. Затем производится попытка открытия потока ''m_Stream'': если операция пройдет успешно, то происходит инициализация оставшегося поля ''m_URL'' и выход из конструктора с возвратом созданной инстанции; если же операция открытия потока провалится, то будет сгенерировано ''[[Обработка исключений|исключение]]'' и выполнение конструктора прекратится (управление будет передано &amp;quot;наверх&amp;quot;, вызывающему коду).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Использовать наш класс можно примерно так:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;var data = MyStream.open(&amp;quot;http://www.deeptown.org/index.html&amp;quot;, MyStream.MODE_READ);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обратите внимание на второй параметр функции, где мы передаем константу ''MODE_READ'', объявленную внутри самого класса. Подобный подход, когда константы, используемые при работе с классом, инкапсулируются в тело класса, помогает сконцентрировать код в одном месте и избежать многих ошибок. В результате повышается читаемость кода и не возникает конфликта имен констант.&lt;br /&gt;
&lt;br /&gt;
== Поля ==&lt;br /&gt;
&lt;br /&gt;
Поле класса — это некоторый объект, используемый объектом данного класса.&lt;br /&gt;
&lt;br /&gt;
Объявление поля начинается с одного из трех ключевых слов:&lt;br /&gt;
* &amp;lt;tt&amp;gt;'''var'''&amp;lt;/tt&amp;gt;  — объявление &amp;quot;обычного&amp;quot; поля;&lt;br /&gt;
* &amp;lt;tt&amp;gt;'''const'''&amp;lt;/tt&amp;gt; — данное поле является константой и не может быть изменено;&lt;br /&gt;
* &amp;lt;tt&amp;gt;'''mutable'''&amp;lt;/tt&amp;gt; — значение данного поля не влияет на состояние объекта, и его можно менять даже в методах, объявленных константными.&lt;br /&gt;
&lt;br /&gt;
За ключевым словом следует тип поля и [[идентификатор]] его имени. Тип поля может быть опущен. После имени может стоять символ &amp;quot;=&amp;quot; и выражение, инициализирующее значение данного поля. В целом, синтаксис тот же, что и при объявлении обычной переменой или константы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
var int m_x;&lt;br /&gt;
const m_y = 0;&lt;br /&gt;
var m_stream = new stream;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тип поля определяется по следующим правилам:&lt;br /&gt;
* если тип указан явно, ничего определять не надо;&lt;br /&gt;
* если тип не указан, но при объявлении использован инициализатор — типом становится тип результата инициализатора;&lt;br /&gt;
* в противном случае, для поля устанавливается [[Переменные#Нетипированные (динамические) переменные|динамический тип]].&lt;br /&gt;
&lt;br /&gt;
'''Примечание:''' В K++ доступ к полям имеет только объект класса — т.е. фактически, все поля находятся в закрытой (private) области видимости. Для предоставления внешним классам доступа к полям следует использовать ''свойства'' (см. ниже).&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
''Свойства'' — это специальные конструкции языка К++, которые позволяют совмещать обращение к данным с вызовом определенного метода. Смысл свойств заключается в том, чтобы программист мог контролировать процесс изменения состояния объекта и своевременно реагировать на это изменение. Свойства бывают доступны на чтение, на запись, или на чтение и на запись одновременно. Это связано с тем, что некоторые свойства объекта (в естественном понимании этого слова), могут предполагать только получение информации о них, другие же могут подразумевать изменение состояния, без возможности чтения. &lt;br /&gt;
&lt;br /&gt;
В существующих языках программирования, таких как C++ тот же функционал реализуется с помощью вызова специальных методов: ''аксессоров'' и ''мутаторов'', которые используются для получения сведений о некотором свойстве или для записи соответственно. Однако это делает код менее читаемым, особенно в случае мутаторов. Свойства же, позволяют работать с собой подобно обычным полям или объектам, используя операторы. &lt;br /&gt;
&lt;br /&gt;
Приведем два примера, которые позволят понять смысл свойств и их отличие от обычных полей класса.&lt;br /&gt;
&lt;br /&gt;
Предположим, что у нас есть класс, отвечающий за чтение состояния некоторого устройства. Допустим, состояние представляется целым числом и должно определяться по мере обращения. Если бы мы писали на языке C++, то мы оформили бы это в виде метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class MyDevice {&lt;br /&gt;
    int GetState();&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Везде, где нам потребовалось бы читать состояние устройства мы должны были писать что-то типа:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int current_state = Device.GetState();&lt;br /&gt;
&amp;lt;/source&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;
class MyDevice {&lt;br /&gt;
    function int GetState();&lt;br /&gt;
    property int state read GetState;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&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 current_state = Device.state;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При обращении к свойству &amp;lt;tt&amp;gt;state&amp;lt;/tt&amp;gt;  будет автоматически вызван метод &amp;lt;tt&amp;gt;GetState()&amp;lt;/tt&amp;gt;, результат которого будет возвращен как значение свойства. Вышеописанный пример кому-то может показаться странным, ведь получается, что мы усложнили код класса ради сомнительного выигрыша в коде обращения. На самом деле, в реальных условиях, с настоящими классами, с большим количеством свойств и в сложных выражениях, выигрыш становится куда более заметен. Сравните два примера одного и того же участка кода, один из которых написан на C++, другой на K++. Несмотря на то, что приведенный код тоже взят &amp;quot;с потолка&amp;quot;, разница в читаемости уже более заметна. В целом, чем сложнее выражение и чем больше в нем применяется операций присваивания и доступа к полям классов — тем большее преимущество дает использование свойств:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Object1.SetStatus(Object2.GetStatus() &amp;gt; 0 ? Object2.GetStatus() : DefaultObject.GetStatus());&lt;br /&gt;
printf(&amp;quot;object %s (%d) located at %s : status changed to %u&amp;quot;, &lt;br /&gt;
    Object1.GetName(), Object1.GetIndex(), Object1.GetLocation(), Object1.GetStatus());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
Object1.status = Object2.status &amp;gt; 0 ? Object2.status : DefaultObject.status;&lt;br /&gt;
puts(&amp;quot;object % (%) located at % : status changed to %&amp;quot;, &lt;br /&gt;
    Object1.name, Object1.index, Object1.location, Object1.status);&lt;br /&gt;
&amp;lt;/source&amp;gt;&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;
&amp;lt;source lang=&amp;quot;kpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
class Widget {&lt;br /&gt;
    var m_Enabled = true; //поле, хранящее текущее состояние активности&lt;br /&gt;
    function void SetEnabled(const value) {&lt;br /&gt;
        var old_value = m_Enabled;&lt;br /&gt;
        m_Enabled = value;&lt;br /&gt;
        if (old_value != m_Enabled)&lt;br /&gt;
            Invalidate(); //Состояние изменилось, обновляем элемент управления&lt;br /&gt;
    }&lt;br /&gt;
    property enabled read m_Enabled write SetEnabled;&lt;br /&gt;
    //далее идет остальная часть класса, например методы отрисовки&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь, если мы унаследуем некоторый класс от данного класса и переопределим соответствующие методы отрисовки, то у класса потомка так же можно будет использовать свойство &amp;lt;tt&amp;gt;enabled&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
var myForm = new Form; //создаем окно&lt;br /&gt;
var myButton = Button.CreateAtPos(myForm, 10, 10); //добавляем кнопку&lt;br /&gt;
myButton.caption = &amp;quot;Click me!&amp;quot;; //устанавливаем подпись&lt;br /&gt;
myButton.OnClick += { |x| x.enabled = false; }; //подключаем обработчик события&lt;br /&gt;
myForm.Show(); //показываем окно&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приведенный выше код создаст окно и разместит на нем кнопку (подразумевается, что класс &amp;lt;tt&amp;gt;Button&amp;lt;/tt&amp;gt; унаследован от нашего класса &amp;lt;tt&amp;gt;Widget&amp;lt;/tt&amp;gt;). Затем устанавливаются свойства кнопки, такие как подпись и [[Блоки|блок]] обработчика события &amp;lt;tt&amp;gt;OnClick&amp;lt;/tt&amp;gt;. При нажатии на кнопку она станет неактивной.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В заключение, кратко опишем синтаксис объявления свойства и поясним его. Итак, объявление любого свойства начинается с указания ключевого слова &amp;lt;tt&amp;gt;'''property'''&amp;lt;/tt&amp;gt;, после которого идет [[идентификатор]] типа свойства. Тип может быть опущен, тогда для свойства будет определен [[Переменные#Нетипированные (динамические) переменные|динамический тип]]. Затем указывается идентификатор имени свойства. &lt;br /&gt;
&lt;br /&gt;
Оставшаяся часть зависит от того, какое свойство объявляется:&lt;br /&gt;
&lt;br /&gt;
* Если объявляется свойство на чтение, то указывается ключевое слово &amp;lt;tt&amp;gt;'''read'''&amp;lt;/tt&amp;gt;, после которого идет либо идентификатор имени поля, которое нужно читать, либо имя метода, который должен использоваться как ''аксессор''. В роли аксессора может выступать метод, не принимающий параметров и возвращающий некоторое значение, которое будет возвращаться как значение свойства.&lt;br /&gt;
* Если объявляется свойство на запись, то указывается, соответственно ключевое слово &amp;lt;tt&amp;gt;'''write'''&amp;lt;/tt&amp;gt; после которого идет либо имя поля, которое нужно записывать, либо имя метода, который должен использоваться как ''мутатор''. В качестве мутатора может выступать метод, принимающий один параметр. Возвращаемое значение игнорируется, так что оно может быть любым.&lt;br /&gt;
* Если объявляется свойство, доступное как на чтение, так и на запись, то указываются обе части, причем первой идет часть чтения.&lt;br /&gt;
&lt;br /&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;
property [тип] &amp;lt;имя&amp;gt; [read &amp;lt;аксессор|поле&amp;gt;] [write &amp;lt;мутатор|поле&amp;gt;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Примечание 2:''' Существует альтернативный синтаксис описания аксессоров и мутаторов, при котором код соответствующий им записывается прямо в определении самого свойства. Это выглядит так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
class MyClass {&lt;br /&gt;
    var f = 1;&lt;br /&gt;
    property int read { f + 1; } write { |v| f = v; };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И аксессор и мутатор, представлены здесь в виде inline конструкций, схожих по описанию (и смыслу) с inline блоками. Аксессор возвращает значение поля ''f'', увеличенное на единицу, в то время как мутатор принимает некоторое значение ''v'' и записывает его в соответствующее поле без каких либо изменений.&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;
Как правило, расширения применяются к классам [[Стандартной библиотека Gide|стандартной библиотеки]], либо к [[unmanaged код|неуправляемым классам]].&lt;br /&gt;
&lt;br /&gt;
В качестве примера приведем код, расширяющий функциональность класса &amp;lt;tt&amp;gt;[[Стандартные типы данных#Целые числа|int]]&amp;lt;/tt&amp;gt; с помощью свойства &amp;lt;tt&amp;gt;factorial&amp;lt;/tt&amp;gt;. Расширения объявляются путем указания ключевого слова &amp;lt;tt&amp;gt;'''extend'''&amp;lt;/tt&amp;gt;, после которого указывается [[идентификатор]] имени класса, который следует расширить. Затем идет тело расширения, такое же, как при описании классов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
package intmod_fact;&lt;br /&gt;
&lt;br /&gt;
extend int {&lt;br /&gt;
    const function int GetFactorial() {&lt;br /&gt;
        var result = 1;&lt;br /&gt;
        for (var x = this; x &amp;gt; 1; x--)&lt;br /&gt;
            result *= x;&lt;br /&gt;
        return result;&lt;br /&gt;
    }&lt;br /&gt;
    property int factorial read GetFactorial;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export function main() {&lt;br /&gt;
    puts(&amp;quot;Factorial of 10 is &amp;quot; + 10.factorial);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;3-11: Мы объявляем расширение класса &amp;lt;tt&amp;gt;[[Стандартные типы данных#Целые числа|int]]&amp;lt;/tt&amp;gt;, реализованного в [[Стандартная библиотека gide|стандартной библиотеке]]. Добавляется частный метод &amp;lt;tt&amp;gt;GetFactorial()&amp;lt;/tt&amp;gt;, и свойство &amp;lt;tt&amp;gt;factorial&amp;lt;/tt&amp;gt;, связанное с методом. Как видно из названия, метод рассчитывает факториал числа, которое содержится в объекте. В данном контексте, специальная переменная ''this'' имеет тип &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; и ссылается на сам объект. Таким образом, для числа 10 переменная ''this'' будет равна 10.&lt;br /&gt;
&lt;br /&gt;
;14: Здесь мы видим применение расширения в действии. Константа 10 на момент компиляции преобразуется в [[Константы#Константные объекты|константный объект]] класса &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;, который подобно любому другому объекту этого же класса будет иметь свойство &amp;lt;tt&amp;gt;factorial&amp;lt;/tt&amp;gt;, которое мы и используем. При попытке чтения из этого свойства будет вызван метод &amp;lt;tt&amp;gt;GetFactorial()&amp;lt;/tt&amp;gt;, результат выполнения которого возвращается как значение свойства, то есть как факториал числа. &amp;lt;!--Его мы вызываем с помощью специального синтаксиса, для передачи блока в качестве [[Функции#Аргументы|параметра функции]]. При этом сам блок указывается прямо в коде вызова функции. Тело блока состоит из одного вызова функции, выводящей текущее число в стандартный поток вывода. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Обратите внимание, что функция &amp;lt;tt&amp;gt;puts()&amp;lt;/tt&amp;gt;, принимает в качестве параметра [[Стандартные типы данных#Строки|строку]], в то время как тип свойства определен как &amp;lt;tt&amp;gt;[[Стандартные типы данных#Целые числа|int]]&amp;lt;/tt&amp;gt;. В этом нет ничего странного, потому что класс &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt; имеет [[Типы операторов#Операторы приведения типов|оператор приведения типа]] к классу &amp;lt;tt&amp;gt;[[Стандартные типы данных#Строки|string]]&amp;lt;/tt&amp;gt;, который вызывается компилятором автоматически. Таким образом, при вычислении значения выражения в скобках, сперва значение факториала ''приводится'' к типу строки, которая складываясь со строкой слева от оператора &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;, передается в качестве параметра функции.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Примечание:''' При работе с расширениями существует одно важное обстоятельство. Методы, объявленные в расширении, будут перекрывать соответствующие им методы класса. Важно понимать, что такое перекрытие не является объявлением виртуального метода — происходит именно замещение старого метода новым.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- '''Примечание:''' При работе с расширениями существует одно важное ограничение. Расширять классы можно только методами и свойствами, но не полями. Это связано с внутренней организацией языка К++ и виртуальной машины. Дополнительно стоит отметить, что методы объявленные в расширении будут перекрывать соответствующие им методы класса (имеется в виду ситуация когда имена и наборы параметров полностью совпадают). Важно понимать, что такое перекрытие не является объявлением виртуального метода — происходит именно замещение старого метода новым. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Смотри также ==&lt;/div&gt;</summary>
		<author><name>Velaar</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0</id>
		<title>Программирование поведения объекта</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0"/>
				<updated>2008-07-30T16:55:00Z</updated>
		
		<summary type="html">&lt;p&gt;Velaar: /* Где хранить файлы? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Перейдем от теории к практике. Перед прочтением этого документа рекомендуется ознакомиться с предыдущими. Здесь приведены конкретные рецепты - как и что делать, с примерами и их разбором.&lt;br /&gt;
&lt;br /&gt;
== Где хранить файлы? ==&lt;br /&gt;
&lt;br /&gt;
Ядро Диптауна использует DISS для хранения файлов. По-умолчанию, в корень DISS монтируется директория, которая находится в подкаталоге storage архива media. Таким образом,&lt;br /&gt;
* в linux это директория, которая расположена в $DEEPTOWN_MEDIA/storage&lt;br /&gt;
* в windows - INSTALL_DIR/Media/storage&lt;br /&gt;
&lt;br /&gt;
DISS при первом запуске индексирует рекурсивно все файлы своего каталога (это необходимо для выполнения сложных запросов к файловой системе). Поэтому, если Вы добавляете или удаляете какие-либо файлы где-либо в пределах этой директории, нужно удалить файл '''_index''' в ее корне, чтобы при следующем запуске DISS переиндексировал каталог заново, и &amp;quot;увидел&amp;quot; бы внесенные изменения.&lt;br /&gt;
&lt;br /&gt;
Далее в документе, везде, где указан путь к файлу, имеется ввиду DISS-путь.&lt;br /&gt;
&lt;br /&gt;
Для хранения объектов, в корне DISS есть подкаталог media, в котором есть следующие подкаталоги:&lt;br /&gt;
* materials - для хранения файлов материалов;&lt;br /&gt;
* meshes - для графических 3d моделей;&lt;br /&gt;
* models - для файлов объектов;&lt;br /&gt;
* scenes - для файлов сцен;&lt;br /&gt;
* scripts - для файлов скриптов;&lt;br /&gt;
* textures - для текстур.&lt;br /&gt;
&lt;br /&gt;
Отметим, что это лишь рекомендованные пути; Вы можете использовать любые другие в пределах DISS.&lt;br /&gt;
&lt;br /&gt;
== Создание простого объекта ==&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы создать объект, нужны&lt;br /&gt;
* файл материала;&lt;br /&gt;
* файл 3d модели в формате OGRE mesh;&lt;br /&gt;
* необходимые материалу текстуры.&lt;br /&gt;
&lt;br /&gt;
Все это можно получить, воспользовавшись одним из конверторов, доступных на [http://www.ogre3d.org/index.php?option=com_content&amp;amp;task=view&amp;amp;id=413&amp;amp;Itemid=133 официальном сайте OGRE].&lt;br /&gt;
&lt;br /&gt;
Пожалуйста, обратите внимание, что все размеры в файле 3d модели должны указываться '''в метрах'''.&lt;br /&gt;
&lt;br /&gt;
Если конвертер создает несколько файлов материалов, нужно объенидить их в один (в произвольном порядке). Кроме того, нужно '''переправить пути к текстурам''' в файлах материалов на абсолютные DISS-пути (т.е. '''/media/textures/...''').&lt;br /&gt;
&lt;br /&gt;
Когда все это сделано, остается последний шаг - создать файл модели. Для этого нужно создать XML-файл объекта, который, в простейшем случае, выглядит следующим образом:&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;material_script node=&amp;quot;путь к файлу материала&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;body name=&amp;quot;main_body&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;geometry&amp;gt;&lt;br /&gt;
            &amp;lt;!-- описание геометрии объекта --&amp;gt;&lt;br /&gt;
        &amp;lt;/geometry&amp;gt;&lt;br /&gt;
        &amp;lt;surfaces&amp;gt;&lt;br /&gt;
            &amp;lt;mesh name=&amp;quot;cube&amp;quot; node=&amp;quot;путь к файлу 3d модели&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/surfaces&amp;gt;&lt;br /&gt;
    &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/model&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Чтобы теперь сконвертировать этот файл в bxl, воспользуйтесь командой&lt;br /&gt;
 bxd filename.model.xml -f filename.model&lt;br /&gt;
&lt;br /&gt;
где filename.model.xml - имя исходного файла, filename.model - имя получаемого файла модели.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы использовать объект локально, необходимо задать его UID, записав его в метаинформацию DISS. В той же директории, где находится этот файл, создайте файл '''.meta''' и напишите туда следующее:&lt;br /&gt;
 [filename.model]&lt;br /&gt;
 version = 0.1&lt;br /&gt;
 wso_node = 1&lt;br /&gt;
 wso_uid = 0101-0001-00000001-0000000000000001&lt;br /&gt;
&lt;br /&gt;
UID (последняя строчка) должен различаться для каждой копии объекта в пространстве. Если один и тот же объект нужно использовать в сцене несколько раз, можно задать ему несколько UID-ов в метаинформации - задав несколько записей wso_uid.&lt;br /&gt;
&lt;br /&gt;
В самом UID-е можно менять только последний (самый длинный) блок цифр (это шестнадцатиричные цифры, т.е. от 0 до F).&lt;br /&gt;
&lt;br /&gt;
Если в директории находится несколько объектов, дописывайте в .meta секции одну за другой. Файл .meta сканируется при создании индекса DISS, так что при внесении изменений нужно удалять '''.index'''.&lt;br /&gt;
&lt;br /&gt;
=== Создание динамического объекта ===&lt;br /&gt;
&lt;br /&gt;
Объект, приведенный в примере выше, будет статичным, т.е. все время находиться в одном и том же месте пространства (обладать бесконечной массой). Если нужен динамический объект, следует добавить в описание модели информацию о массе и моменте инерции объекта:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body name=&amp;quot;main_body&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;mass_data&amp;gt;&lt;br /&gt;
        &amp;lt;mass value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;inertia i11=&amp;quot;1&amp;quot; i22=&amp;quot;1&amp;quot; i33=&amp;quot;1&amp;quot; i12=&amp;quot;0&amp;quot; i13=&amp;quot;0&amp;quot; i23=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/mass_data&amp;gt;&lt;br /&gt;
    &amp;lt;!-- ... --&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Масса указывается в килограммах.&lt;br /&gt;
&lt;br /&gt;
Момент инерции - в единицах СИ. Параметры - элементы симметричной матрицы инерции:&lt;br /&gt;
 | i11  i12  i13 |&lt;br /&gt;
 | i12  i22  i23 |&lt;br /&gt;
 | i13  i23  i33 |&lt;br /&gt;
&lt;br /&gt;
Вы можете не указывать тег '''inertia''' для простых тестов, но в этом случае объект будет вести себя неестественно.&lt;br /&gt;
&lt;br /&gt;
== Связывание объекта со скриптом ==&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить возможность программировать поведение объекта, нужно прописать в него адрес скрипта. Добавьте внутрь корневого XML-тега следующее:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;externals&amp;gt;&lt;br /&gt;
    &amp;lt;event_receiver url=&amp;quot;gide:/media/scripts/my_object.gbc!MyObject&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/externals&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом случае объект будет передавать все свои события объекту гайд-класса MyObject, объявленного в файле /media/scripts/my_object.gbc.&lt;br /&gt;
&lt;br /&gt;
В этом файле должен находиться '''скомпилированный''' код класса. Простейший, ничего не делающий код такого класса на [[K++]] выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
package my_object;&lt;br /&gt;
&lt;br /&gt;
import world;&lt;br /&gt;
&lt;br /&gt;
class MyObject extends WorldObject&lt;br /&gt;
{&lt;br /&gt;
    export function State_init()&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Напишите этот код в файл my_object.kpp в той же директории. Компилируется он командой&lt;br /&gt;
 kpp my_object.kpp&lt;br /&gt;
&lt;br /&gt;
== Добавление мотора ==&lt;br /&gt;
&lt;br /&gt;
Мотор - это интерфейс объекта, позволяющий контролировать его поведение.&lt;br /&gt;
&lt;br /&gt;
Все моторы объекта должны быть описаны в его файле модели. Делается это добавлением тега '''motor''' в корневую секцию:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;motor name=&amp;quot;engine&amp;quot; url=&amp;quot;linear_speed:main_body:(0,1,0)&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Такой тег создаст мотор '''engine''' с типом '''linear_speed''', прикладывающий силу к телу '''main_body''' (параметр '''name''' в теге '''body''') по вектору направления (0,1,0) - т.е. вверх.&lt;br /&gt;
&lt;br /&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;
export function State_init()&lt;br /&gt;
{&lt;br /&gt;
    var engine = this.getMotor('engine'); // получили интерфейс мотора&lt;br /&gt;
                            // первый параметр - имя, указанное при создании мотора (см. выше)&lt;br /&gt;
    engine.setParam('speed', 100); // максимальная скорость, сообщаемая объекту&lt;br /&gt;
    engine.setParam('force', 100); // максимальная сила, которая будет приложена для разгона&lt;br /&gt;
    engine.enable();  // включаем мотор&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Обработка пользовательского ввода ==&lt;br /&gt;
&lt;br /&gt;
Теперь научим наш объект реагировать на команду пользователя.&lt;br /&gt;
&lt;br /&gt;
Например, нам нужно, чтобы мотор был включен только пока нажата клавиша A на клавиатуре.&lt;br /&gt;
&lt;br /&gt;
Для этого нужно научить наш объект понимать две команды - &amp;quot;включить&amp;quot; и &amp;quot;выключить&amp;quot;, а в конфигурации движка ввода написать отправку команды &amp;quot;включить&amp;quot; на нажатие клавиши, а &amp;quot;выключить&amp;quot; - на ее отпускание.&lt;br /&gt;
&lt;br /&gt;
В файл '''/etc/world/input.conf''' в контекст '''local_control''' нужно добавить следующие строки:&lt;br /&gt;
 on key_press   check(key=A) do send_event:start_engine&lt;br /&gt;
 on key_release check(key=A) do send_event:stop_engine&lt;br /&gt;
&lt;br /&gt;
Таким образом, когда пользователь нажимает клавишу A, нашему объекту будет отправлено уведомление '''start_engine''', а когда отпускает - '''stop_engine'''.&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;
export function Control_start_engine(const bytea args)&lt;br /&gt;
{&lt;br /&gt;
    this.getMotor('engine').enable();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export function Control_stop_engine(const bytea args)&lt;br /&gt;
{&lt;br /&gt;
    this.getMotor('engine').disable();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(предполагается, что параметры мотора были установлены при инициализации, т.е. в State_init).&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;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
export function State_init()&lt;br /&gt;
{&lt;br /&gt;
    // создаем сенсор высоты&lt;br /&gt;
    this.createSensor('height:&amp;gt;100', 'too_high');&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
export function Signal_too_high(const bytea args)&lt;br /&gt;
{&lt;br /&gt;
    // метод будет вызван при срабатывании сенсора, т.е. когда абсолютная&lt;br /&gt;
    // высота объекта превысит 100 метров.&lt;br /&gt;
    this.getMotor('engine').disable();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Имя функции-обработчика формируется из префикса '''Signal_''' и второго параметра функции '''createSensor'''.&lt;br /&gt;
&lt;br /&gt;
== Создание сцены ==&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы теперь посмотреть на созданные объекты, нужно создать сцену и разместить на ней эти объекты, и затем загрузить сцену в движок.&lt;br /&gt;
&lt;br /&gt;
Сцена также описывается в формате BXL. XML-файл сцены выглядит довольно просто:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;scene bxd=&amp;quot;http://dao.deeptown.org/bxd/scene.bxd&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;model uid=&amp;quot;0101-0001-00000001-0000000000000002&amp;quot;&lt;br /&gt;
        x=&amp;quot;0.2&amp;quot; y=&amp;quot;0&amp;quot; z=&amp;quot;-5&amp;quot;&lt;br /&gt;
        qw=&amp;quot;1&amp;quot; qx=&amp;quot;0&amp;quot; qy=&amp;quot;0&amp;quot; qz=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/scene&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тегов '''model''' может быть сколь угодно много. В параметрах этого тега указываются координаты объекта на сцене и кватернион его поворота.&lt;br /&gt;
&lt;br /&gt;
== Пуск! ==&lt;br /&gt;
&lt;br /&gt;
И теперь остался последний момент - загрузить все это в движок.&lt;br /&gt;
&lt;br /&gt;
Для этого нужно набрать консольную команду&lt;br /&gt;
 world.local_start /media/scenes/filename.scene UID&lt;br /&gt;
&lt;br /&gt;
Первый параметр - имя файла сцены, второй - UID объекта, которому будет передаваться ввод пользователя.&lt;/div&gt;</summary>
		<author><name>Velaar</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-07-30T16:29:13Z</updated>
		
		<summary type="html">&lt;p&gt;Velaar: /* touch */&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;br /&gt;
&lt;br /&gt;
=== Графические обозначения ===&lt;br /&gt;
&lt;br /&gt;
Для облегчения навигации по заданиям применено цветовое кодирование сложности поставленной задачи и ее востребованности:&lt;br /&gt;
&lt;br /&gt;
Категории сложности:&lt;br /&gt;
: &amp;lt;span style=&amp;quot;color: white; background-color: #00FF00;&amp;quot;&amp;gt;· раз плюнуть ·&amp;lt;/span&amp;gt;&lt;br /&gt;
: &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;&lt;br /&gt;
: &amp;lt;span style=&amp;quot;color: white; background-color: #FFCC00;&amp;quot;&amp;gt;· средняя ·&amp;lt;/span&amp;gt;&lt;br /&gt;
: &amp;lt;span style=&amp;quot;color: white; background-color: #FF8000;&amp;quot;&amp;gt;· выше среднего ·&amp;lt;/span&amp;gt;&lt;br /&gt;
: &amp;lt;span style=&amp;quot;color: white; background-color: #DD0000;&amp;quot;&amp;gt;· высокая ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Категории востребованности (приоритет):&lt;br /&gt;
: &amp;lt;span style=&amp;quot;color: white; background-color: #A0A0A0;&amp;quot;&amp;gt;· может подождать ·&amp;lt;/span&amp;gt;&lt;br /&gt;
: &amp;lt;span style=&amp;quot;color: white; background-color: #808080;&amp;quot;&amp;gt;· низкий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
: &amp;lt;span style=&amp;quot;color: white; background-color: #FFCC00;&amp;quot;&amp;gt;· средний ·&amp;lt;/span&amp;gt;&lt;br /&gt;
: &amp;lt;span style=&amp;quot;color: white; background-color: #FF8000;&amp;quot;&amp;gt;· выше среднего ·&amp;lt;/span&amp;gt;&lt;br /&gt;
: &amp;lt;span style=&amp;quot;color: white; background-color: #DD0000;&amp;quot;&amp;gt;· высокий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Операторы DSH ==&lt;br /&gt;
&lt;br /&gt;
По сути это команды, но играют роль структурных элементов шеллового языка программирования. Необходимо реализовать команды: true, false, test, if, switch, for, foreach.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #DD0000;&amp;quot;&amp;gt;· высокий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': &lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 07:38, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': &lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Базовые команды оболочки DSH ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены команды, которые требуется реализовать для нормального функционирования командной оболочки Диптауна (DSH). Дабы не изобретать велосипед, было решено делать команды максимально похожими на их UNIX аналоги. Однако, следует помнить, что при реализации команд, надо учитывать специфику диптауна и ориентироваться на максимальное юзабилити а не стопроцентное соответствие UNIX. Короче говоря, не надо стараться реализовать полный клон команды, со всеми &amp;quot;наворотами&amp;quot; — достаточно только базовых возможностей, которые гарантированно понадобятся и будут полезны.&lt;br /&gt;
&lt;br /&gt;
'''Примечание''': Все без исключения команды должны поддерживать следующие ключи:&lt;br /&gt;
;'''--version''': Вывод информации о версии программы и ее авторе.&lt;br /&gt;
;'''--help''': Вывод краткой справки по использованию команды. Может выводиться так же при отсутствии какого либо ввода со стороны пользователя (вызов команды без параметров), если это не противоречит логике работы команды.&lt;br /&gt;
;'''--''': Индикатор окончания списка параметров. Если в строке параметров встречается данный символ, это означает что дальнейшая информация уже не является параметрами. Например, команды &lt;br /&gt;
::&amp;lt;tt&amp;gt;deep$ ls -l&amp;lt;/tt&amp;gt;&lt;br /&gt;
и&lt;br /&gt;
::&amp;lt;tt&amp;gt;deep$ ls -- -l&amp;lt;/tt&amp;gt;&lt;br /&gt;
:имеют различный смысл. В первом случае вызывается расширенный список файлов текущей директории, тогда как во втором делается попытка отобразить содержимое директории с именем &amp;quot;-l&amp;quot;.&lt;br /&gt;
;'''-''': Отдельный дефиз может использоваться всесто имени файла для указания того, что данные требуется получать из стандартного устройства ввода. А вывод — соответственно направлять в устройство вывода. Конкретное поведение зависит от используемой команды. Таким образом, следующие команды являются эквивалентами:&lt;br /&gt;
::&amp;lt;tt&amp;gt;deep$ cat &amp;lt;/tt&amp;gt;&lt;br /&gt;
::&amp;lt;tt&amp;gt;deep$ cat - &amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ls  === &lt;br /&gt;
&lt;br /&gt;
Команда ls (от англ. ''list'' — список) выводит в терминал содержимое некоторой директории. Формат списка, а так же исследуемая директория, задются с помощью соответствующих ключей. &lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #DD0000;&amp;quot;&amp;gt;· высокий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]], [[регулярные выражения]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 07:38, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=ls здесь].&lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== cp  === &lt;br /&gt;
&lt;br /&gt;
Команда cp (от англ. ''copy'' — копировать) производит копирование содержимого указанного каталога в новый каталог. &lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #DD0000;&amp;quot;&amp;gt;· высокий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=cp здесь].&lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== mv  === &lt;br /&gt;
&lt;br /&gt;
Команда mv (от англ. ''move'' — переместить) производит перемещение содержимого указанного каталога в новый каталог, либо переименовывает файлы (каталоги). &lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #DD0000;&amp;quot;&amp;gt;· высокий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=mv здесь].&lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== rm  === &lt;br /&gt;
&lt;br /&gt;
Команда rm (от англ. ''remove'' — удалить) удаляет файл, либо каталог. &lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #DD0000;&amp;quot;&amp;gt;· высокий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=rm здесь].&lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== touch  === &lt;br /&gt;
&lt;br /&gt;
Команда touch (от англ. ''touch'' — потрогать) создает пустой файл с указанным именем, либо изменяет время доступа существующего файла. &lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #00FF00;&amp;quot;&amp;gt;· раз плюнуть ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #DD0000;&amp;quot;&amp;gt;· высокий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=touch здесь].&lt;br /&gt;
* '''Исполнитель''': --[[Участник:Velaar|Velaar]] 12:29, 30 июля 2008 (EDT)&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== mkdir  === &lt;br /&gt;
&lt;br /&gt;
Команда mkdir (от англ. ''make directory'') создает директорию с указанным именем. &lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #00FF00;&amp;quot;&amp;gt;· раз плюнуть ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #DD0000;&amp;quot;&amp;gt;· высокий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=mkdir здесь].&lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== grep  === &lt;br /&gt;
&lt;br /&gt;
Команда grep производит фильтрацию своего входного потока и выдает результат в выходной поток. Следует иметь в виду, что реализация PCRE (используемая в К++) синтаксически отличается от канонической UNIX. Основная задача — выборка интересующих строк из входного потока.&lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #FF8000;&amp;quot;&amp;gt;· выше среднего ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]], [[регулярные выражения]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=grep здесь].&lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== sed  === &lt;br /&gt;
&lt;br /&gt;
Команда sed (от англ. ''stream editor'' — редактор потоков) производит фильтрацию своего входного потока и выдает результат в выходной поток. Следует иметь в виду, что реализация PCRE (используемая в К++) синтаксически отличается от канонической UNIX. Основная задача — преобразование данных по шаблону.&lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #808080;&amp;quot;&amp;gt;· низкий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]], [[регулярные выражения]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=sed здесь].&lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== wc  === &lt;br /&gt;
&lt;br /&gt;
Команда wc (от англ. ''word counter'' — счетчик слов) производит подсчет количества структурных элементов в своем входном потоке и выдает результат в выходной поток. В качестве таких элементов могут выступать символы (ключ &amp;lt;tt&amp;gt;-c&amp;lt;/tt&amp;gt;), строки (ключ &amp;lt;tt&amp;gt;-l&amp;lt;/tt&amp;gt;) и др. Таким образом, простейший способ подсчета количества строк в файле может выглядеть так:&lt;br /&gt;
:&amp;lt;tt&amp;gt;deep$ cat myfile | wc -l&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #808080;&amp;quot;&amp;gt;· низкий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]], [[регулярные выражения]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=wc здесь].&lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== nl  === &lt;br /&gt;
&lt;br /&gt;
Команда nl (от англ. ''numbered lines'' — пронумерованные строки) записывает в стандартный поток вывода данные из своего стандартного потока ввода, предворяя их номерами строк. Может использоваться для формирования листингов программ, составления отчетов и др.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #00FF00;&amp;quot;&amp;gt;· раз плюнуть ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #808080;&amp;quot;&amp;gt;· низкий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': &lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=nl здесь].&lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== sort  === &lt;br /&gt;
&lt;br /&gt;
Команда sort производит сортировку данных из своего входного потока и выдает результат в выходной поток. &lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #808080;&amp;quot;&amp;gt;· низкий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=sort здесь].&lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== head  === &lt;br /&gt;
&lt;br /&gt;
Команда head возвращает первые N строк из своего входного потока. &lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #00FF00;&amp;quot;&amp;gt;· раз плюнуть ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #808080;&amp;quot;&amp;gt;· низкий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=head здесь].&lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== tail  === &lt;br /&gt;
&lt;br /&gt;
Команда head возвращает последние N строк из своего входного потока. &lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #00FF00;&amp;quot;&amp;gt;· раз плюнуть ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #808080;&amp;quot;&amp;gt;· низкий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=tail здесь].&lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== more  === &lt;br /&gt;
&lt;br /&gt;
Команда more выводит данные из своего входного потока порциями по N строк. Используется для постепенного отображения содержимого буфера в консоль (так, чтобы пользователь успел все прочитать).&lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #00FF00;&amp;quot;&amp;gt;· раз плюнуть ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #DD0000;&amp;quot;&amp;gt;· высокий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=more здесь].&lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== mount  === &lt;br /&gt;
&lt;br /&gt;
Команда mount используется для привязки носителей данных к файловой системе Диптауна. Принципы ее работы несколько отличаются от UNIX аналога, поэтому документация не дается. Для получения информации, необходимо [[Обратная связь|связаться с разработчиками]].&lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #FF8000;&amp;quot;&amp;gt;· выше среднего ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''':&lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== chmod  === &lt;br /&gt;
&lt;br /&gt;
Команда chmod используется для изменения прав доступа к файлам в файловой системе Диптауна. Принципы ее работы несколько отличаются от UNIX аналога, поэтому документация не дается. Для получения информации, необходимо [[Обратная связь|связаться с разработчиками]].&lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #FF8000;&amp;quot;&amp;gt;· выше среднего ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''':&lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== chown  === &lt;br /&gt;
&lt;br /&gt;
Команда chown используется для изменения владельца и группы файлов в файловой системе Диптауна. &lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #FFCC00;&amp;quot;&amp;gt;· средний ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=chown здесь].&lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== chattr  === &lt;br /&gt;
&lt;br /&gt;
Команда chattr используется для изменения атрибутов файлов (в основном метаинформации) в файловой системе Диптауна. Принципы ее работы несколько отличаются от UNIX аналога, поэтому документация не дается. Для получения информации, необходимо [[Обратная связь|связаться с разработчиками]].&lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #FFCC00;&amp;quot;&amp;gt;· средний ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[DISS]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': &lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== su  === &lt;br /&gt;
&lt;br /&gt;
Команда su (от англ. ''switch user'' — переключить пользователя) используется для запуска подоболочки от имени другого пользователя.&lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #808080;&amp;quot;&amp;gt;· низкий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[UserDB]], [[DSH]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=su здесь].&lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== sudo  === &lt;br /&gt;
&lt;br /&gt;
Команда sudo позволяет выполнить команду от имени другого пользователя.&lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #808080;&amp;quot;&amp;gt;· низкий ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[UserDB]], [[DSH]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=sudo здесь].&lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== passwd  === &lt;br /&gt;
&lt;br /&gt;
Команда passwd позволяет сменить пароль пользователя.&lt;br /&gt;
&lt;br /&gt;
* '''Сложность''': &amp;lt;span style=&amp;quot;color: white; background-color: #008000;&amp;quot;&amp;gt;· низкая ·&amp;lt;/span&amp;gt;  '''Приоритет''': &amp;lt;span style=&amp;quot;color: white; background-color: #FFCC00;&amp;quot;&amp;gt;· средний ·&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Технологии''': [[UserDB]], [[DSH]]&lt;br /&gt;
* '''Автор''': --[[Участник:Korvin|Korvin]] 08:24, 18 июня 2008 (EDT)&lt;br /&gt;
* '''Примечания''': Описание UNIX аналога команды можно найти [http://www.opennet.ru/man.shtml?topic=passwd здесь].&lt;br /&gt;
* '''Исполнитель''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не назначен (вакансия)&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Срок''': &amp;lt;span style=&amp;quot;color: #808080;&amp;quot;&amp;gt;не установлен&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Стандартный интерфейс SQL ==&lt;br /&gt;
== Универсальный HTTP клиент ==&lt;br /&gt;
== Универсальный HTTP сервер ==&lt;br /&gt;
== Репозиторий медиаданных ==&lt;/div&gt;</summary>
		<author><name>Velaar</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D0%B5%D0%BA%D1%81%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B5%D0%BC%D0%BB%D0%B8_%D0%B8_%D1%8F%D1%89%D0%B8%D0%BA%D0%BE%D0%B2</id>
		<title>Добавление текстуры для земли и ящиков</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D0%B5%D0%BA%D1%81%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B5%D0%BC%D0%BB%D0%B8_%D0%B8_%D1%8F%D1%89%D0%B8%D0%BA%D0%BE%D0%B2"/>
				<updated>2008-07-29T16:24:23Z</updated>
		
		<summary type="html">&lt;p&gt;Velaar: &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;
Для этого необходимо открыть файл /media/meshes/cube_big.mesh.xml в любом текстовом редакторе и поменять название материала на любое другое.&lt;br /&gt;
&lt;br /&gt;
Например вот так:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;mesh&amp;gt;&lt;br /&gt;
    &amp;lt;submeshes&amp;gt;&lt;br /&gt;
        &amp;lt;submesh material=&amp;quot;Deeptown/Demo/CubeBig&amp;quot; usesharedvertices=&amp;quot;false&amp;quot; use32bitindexes=&amp;quot;false&amp;quot; operationtype=&amp;quot;triangle_list&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном примере название материала &amp;quot;Deeptown/Demo/CubeBig&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Сохраеяем файл. Далее необходимо сконвертировать файл в бинарный формат mesh. Для конвертации используется OgreXMLConverter, который можно скачать на [http://www.ogre3d.org/index.php?option=com_content&amp;amp;task=view&amp;amp;id=413&amp;amp;Itemid=133 сайте] (пакет &amp;quot;Command-line Tools&amp;quot;).&lt;br /&gt;
(Для Linux данный пакет входит в Ogre-devel)&lt;br /&gt;
&lt;br /&gt;
Для использования OgreXMLConverter необходимо перейти в директорию meshes и ввести команду:&lt;br /&gt;
 ogrexmlconverter cube_big.mesh.xml cube_big.mesh&lt;br /&gt;
&lt;br /&gt;
Затем открываем файл материала куба /media/materials/cube.material любым текстовым редактором и копируем описание материала Deeptown/Demo/Cube в тот же файл. Меняем название на то, что ввели в файле модели. Так же меняем имя файла текстуры.&lt;br /&gt;
&lt;br /&gt;
Вот что у меня получилось:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
material Deeptown/Demo/Cube&lt;br /&gt;
{&lt;br /&gt;
    technique&lt;br /&gt;
    {&lt;br /&gt;
        pass&lt;br /&gt;
        {&lt;br /&gt;
          lighting off&lt;br /&gt;
&lt;br /&gt;
            texture_unit&lt;br /&gt;
            {&lt;br /&gt;
                texture /media/textures/cube_small.png&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
material Deeptown/Demo/CubeBig&lt;br /&gt;
{&lt;br /&gt;
    technique&lt;br /&gt;
    {&lt;br /&gt;
        pass&lt;br /&gt;
        {&lt;br /&gt;
          lighting off&lt;br /&gt;
&lt;br /&gt;
            texture_unit&lt;br /&gt;
            {&lt;br /&gt;
                texture /media/textures/cube_big.png&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;
В данном случае большой куб Deeptown/Demo/CubeBig будет являться поверхностью, на которой расположены ваше авто и ящики. Для него указываем текстуру земли. Для малого куба указываем текстуру, которую вы хотели бы видеть на ящиках.&lt;br /&gt;
&lt;br /&gt;
Сохраняем файл cube.material и если вы добавляли текстуры, а вы как минимум одну новую добавили :) необходимо удалить файл индекса и запустить deep. После индексации смотрим результат.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[Участник:Stmf|Stmf]] 22:41, 21 июля 2008 (EDT)&lt;/div&gt;</summary>
		<author><name>Velaar</name></author>	</entry>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D0%B5%D0%BA%D1%81%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B5%D0%BC%D0%BB%D0%B8_%D0%B8_%D1%8F%D1%89%D0%B8%D0%BA%D0%BE%D0%B2</id>
		<title>Добавление текстуры для земли и ящиков</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D0%B5%D0%BA%D1%81%D1%82%D1%83%D1%80%D1%8B_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B5%D0%BC%D0%BB%D0%B8_%D0%B8_%D1%8F%D1%89%D0%B8%D0%BA%D0%BE%D0%B2"/>
				<updated>2008-07-29T16:23:29Z</updated>
		
		<summary type="html">&lt;p&gt;Velaar: &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;
Для этого необходимо открыть файл /media/meshes/cube_big.mesh.xml в любом текстовом редакторе и поменять название материала на любое другое.&lt;br /&gt;
&lt;br /&gt;
Например вот так:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;mesh&amp;gt;&lt;br /&gt;
    &amp;lt;submeshes&amp;gt;&lt;br /&gt;
        &amp;lt;submesh material=&amp;quot;Deeptown/Demo/CubeBig&amp;quot; usesharedvertices=&amp;quot;false&amp;quot; use32bitindexes=&amp;quot;false&amp;quot; operationtype=&amp;quot;triangle_list&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном примере название материала &amp;quot;Deeptown/Demo/CubeBig&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Сохраеяем файл. Далее необходимо сконвертировать файл в бинарный формат mesh. Для конвертации используется OgreXMLConverter, который можно скачать на [http://www.ogre3d.org/index.php?option=com_content&amp;amp;task=view&amp;amp;id=413&amp;amp;Itemid=133 сайте] (пакет &amp;quot;Command-line Tools&amp;quot;).&lt;br /&gt;
(Для Linux данный пакут входит в Ogre-devel)&lt;br /&gt;
&lt;br /&gt;
Для использования OgreXMLConverter необходимо перейти в директорию meshes и ввести команду:&lt;br /&gt;
 ogrexmlconverter cube_big.mesh.xml cube_big.mesh&lt;br /&gt;
&lt;br /&gt;
Затем открываем файл материала куба /media/materials/cube.material любым текстовым редактором и копируем описание материала Deeptown/Demo/Cube в тот же файл. Меняем название на то, что ввели в файле модели. Так же меняем имя файла текстуры.&lt;br /&gt;
&lt;br /&gt;
Вот что у меня получилось:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;kpp&amp;quot;&amp;gt;&lt;br /&gt;
material Deeptown/Demo/Cube&lt;br /&gt;
{&lt;br /&gt;
    technique&lt;br /&gt;
    {&lt;br /&gt;
        pass&lt;br /&gt;
        {&lt;br /&gt;
          lighting off&lt;br /&gt;
&lt;br /&gt;
            texture_unit&lt;br /&gt;
            {&lt;br /&gt;
                texture /media/textures/cube_small.png&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
material Deeptown/Demo/CubeBig&lt;br /&gt;
{&lt;br /&gt;
    technique&lt;br /&gt;
    {&lt;br /&gt;
        pass&lt;br /&gt;
        {&lt;br /&gt;
          lighting off&lt;br /&gt;
&lt;br /&gt;
            texture_unit&lt;br /&gt;
            {&lt;br /&gt;
                texture /media/textures/cube_big.png&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;
В данном случае большой куб Deeptown/Demo/CubeBig будет являться поверхностью, на которой расположены ваше авто и ящики. Для него указываем текстуру земли. Для малого куба указываем текстуру, которую вы хотели бы видеть на ящиках.&lt;br /&gt;
&lt;br /&gt;
Сохраняем файл cube.material и если вы добавляли текстуры, а вы как минимум одну новую добавили :) необходимо удалить файл индекса и запустить deep. После индексации смотрим результат.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[Участник:Stmf|Stmf]] 22:41, 21 июля 2008 (EDT)&lt;/div&gt;</summary>
		<author><name>Velaar</name></author>	</entry>

	</feed>