<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>http://51.250.0.107/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Kulikser</id>
	<title>CAMaaS preliminary wiki - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="http://51.250.0.107/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Kulikser"/>
	<link rel="alternate" type="text/html" href="http://51.250.0.107/w/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/Kulikser"/>
	<updated>2026-05-01T15:24:23Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>http://51.250.0.107/w/index.php?title=%D0%92%D0%B5%D0%B1-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80&amp;diff=2940</id>
		<title>Веб-сервер</title>
		<link rel="alternate" type="text/html" href="http://51.250.0.107/w/index.php?title=%D0%92%D0%B5%D0%B1-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80&amp;diff=2940"/>
		<updated>2016-07-04T23:01:10Z</updated>

		<summary type="html">&lt;p&gt;Kulikser: /* Установка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NavBar|{{Системная иерархия:Веб-сервер}} }}&lt;br /&gt;
&lt;br /&gt;
Веб-сервер должен принимать HTTP запросы, формируемые JS-скриптом на стороне клиента и содержащие запакованные входные параметры вызова серверной функции и идентификатор этой функции. В зависимости от значения идентификатора функции сервер должен обрабатывать запрос самостоятельно&amp;lt;ref&amp;gt;зачем?&amp;lt;/ref&amp;gt; либо делегировать вызов внутрипроцессному серверу (DLL, SO) с известной точкой входа:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
return_code entry_point( //возвращается код ошибки chsvlib (ноль в случае успешного завершения)&lt;br /&gt;
  uint ID, //идентификатор операции&lt;br /&gt;
  byte in_params[in_byte_count], //набор байт, содержащий упакованные входные параметры&lt;br /&gt;
  uint in_byte_count, //байтовый размер упакованных данных&lt;br /&gt;
  byte** out_params[out_byte_count], //буфер, который выделяется внутрипроцессным сервером и инициализируется ответом на запрос.&lt;br /&gt;
  uint*  out_byte_count //На выходе - размер выходных данных&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=c&amp;gt;&lt;br /&gt;
return_code_t FreeData( //возвращается код ошибки chsvlib (ноль в случае успешного завершения)&lt;br /&gt;
   void* pData // указатель на буфер, выделенный внутрипроцесным сервером,&lt;br /&gt;
               // т.е. возвращенный точкой входа entry_point через параметр out_params&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Коды ошибок, возвращаемых функциями внутрипроцессного сервера, могут быть преобразованы в текстовое описание ошибки с помощью следующей функции:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const char* GetErrorDescription( // возвращается read-only utf-8 C-строка, содержащая текстовое описание ошибки&lt;br /&gt;
   uint code, // код ошибки, на основе которого формируется текстовое описание&lt;br /&gt;
   uint* pSize // опциональный указатель на 32-битовую переменную, которой функцией присваивается длина строки в байтах. Если длина не нужна, параметр может быть NULL.&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме этого, возможно ведение журнала ошибок, возникающих на стороне управляющей подсистемы (но не на стороне предметной области, если та не возвращает коды ошибок управляющей подсистеме).&lt;br /&gt;
Следующая функция позволяет задать файл журнала ошибок в текстовом формате (utf-8) веб-сервером для записи туда событий об ошибок, возникающих на стороне внутрипроцессного сервера.&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
return_code_t SetErrorLogFile( // возвращается код ошибки chsvlib (ноль в случае успешного завершения)&lt;br /&gt;
   const char* pszFileName, //относительный или абсолютный путь к файлу журнала. Строка должна либо завершаться терминальным нулем (в этом случае cchFileName должен быть равен -1),&lt;br /&gt;
                            //либо должна быть длины, равной значению cchFileName.&lt;br /&gt;
   std::size_t cchFileName, //длина строки pszFileName, либо -1, если строка заканчивается терминальным символов&lt;br /&gt;
   bool fEraseContent //флаг удаления содержимого файла, если файл уже существует. Если файл существует, и флаг сброшен, сервер будет дополнять его новыми данными&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=cpp&amp;gt;&lt;br /&gt;
auto simulation = CAMaaS::make_package(CAMaaS::sequence_to_pack(&amp;quot;Node name&amp;quot;), CAMaaS::sequence_to_pack(strModelName));&lt;br /&gt;
char* pProcessName;&lt;br /&gt;
std::uint32_t cchProcessName;&lt;br /&gt;
std::uint32_t nErr = entry_point(StartSimulationId, simulation.data(), simulation.size(), (void**) &amp;amp;pProcessName, &amp;amp;cchProcessName);&lt;br /&gt;
if (nErr != 0)&lt;br /&gt;
{&lt;br /&gt;
   std::cerr &amp;lt;&amp;lt; &amp;quot;Error &amp;quot; &amp;lt;&amp;lt; nErr &amp;lt;&amp;lt; &amp;quot; was returned by the server: &amp;quot; &amp;lt;&amp;lt; GetErrorDescription(err, nullptr) &amp;lt;&amp;lt; &amp;quot;.\n&amp;quot;;&lt;br /&gt;
   return &amp;quot;&amp;quot;;&lt;br /&gt;
}else&lt;br /&gt;
{&lt;br /&gt;
   auto ret = std::string(pProcessName, cchProcessName);&lt;br /&gt;
   FreeData(pProcessName);&lt;br /&gt;
   return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Установка==&lt;br /&gt;
1. Для установки веб-сервера необходимо загрузить следующие пакеты из репозитория с помощью команды apt-get:&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install nginx uwsgi postgresql python-psycopg2 git python-dev uwsgi-plugin-python&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Скачиваем свежий репозиторий django:&lt;br /&gt;
&amp;lt;code&amp;gt;git clone git://github.com/django/django.git django-trunk&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Добавляем в файл &amp;lt;code&amp;gt;/usr/lib/python2.7/dist-packages/django.pth&amp;lt;/code&amp;gt; строку с абсолютным путем до скачанного репозитория&lt;br /&gt;
&lt;br /&gt;
4. Делаем для удобства ссылку в /usr/local/bin на django-admin.py с помощью команды ln.&lt;br /&gt;
&lt;br /&gt;
5. Установим утилиту setuptools:&lt;br /&gt;
&amp;lt;code&amp;gt;wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. В папке репозитория django запустим скрипт для установки:&lt;br /&gt;
&amp;lt;code&amp;gt;sudo python setup.py build install&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Настроим postgresql на прием всех запросов на порт 5433, для этого в файле /etc/postgresql/9.3/main/postgresql.conf поправим строчку &amp;lt;code&amp;gt;listen_addresses = '*'&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;port = 5433&amp;lt;/code&amp;gt;, затем перезапустим командой &amp;lt;code&amp;gt;sudo service postgresql restart&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
8. Заходим в psql под пользователем postgres с помощью команды &amp;lt;code&amp;gt;sudo -u postgres psql&amp;lt;/code&amp;gt; и создаем базу данных командой &amp;lt;code&amp;gt;CREATE DATABASE chsv_test WITH OWNER postgres ENCODING 'utf-8';&amp;lt;/code&amp;gt;, затем меняем пароль пользователя postgres командой &amp;lt;code&amp;gt;\password &amp;lt;chsvtest&amp;gt;&amp;lt;/code&amp;gt; и выходим командой &amp;lt;code&amp;gt;\q&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Переходим в репозиторий django, создаем новый проект командой &amp;lt;code&amp;gt;django-admin startproject CAMaaS1_web&amp;lt;/code&amp;gt;, затем копируем в создавшуюся папку содержимое репозитория web-сервера.&lt;/div&gt;</summary>
		<author><name>Kulikser</name></author>
	</entry>
	<entry>
		<id>http://51.250.0.107/w/index.php?title=%D0%92%D0%B5%D0%B1-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80&amp;diff=2938</id>
		<title>Веб-сервер</title>
		<link rel="alternate" type="text/html" href="http://51.250.0.107/w/index.php?title=%D0%92%D0%B5%D0%B1-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80&amp;diff=2938"/>
		<updated>2016-07-04T12:23:56Z</updated>

		<summary type="html">&lt;p&gt;Kulikser: /* Установка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NavBar|{{Системная иерархия:Веб-сервер}} }}&lt;br /&gt;
&lt;br /&gt;
Веб-сервер должен принимать HTTP запросы, формируемые JS-скриптом на стороне клиента и содержащие запакованные входные параметры вызова серверной функции и идентификатор этой функции. В зависимости от значения идентификатора функции сервер должен обрабатывать запрос самостоятельно&amp;lt;ref&amp;gt;зачем?&amp;lt;/ref&amp;gt; либо делегировать вызов внутрипроцессному серверу (DLL, SO) с известной точкой входа:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
return_code entry_point( //возвращается код ошибки chsvlib (ноль в случае успешного завершения)&lt;br /&gt;
  uint ID, //идентификатор операции&lt;br /&gt;
  byte in_params[in_byte_count], //набор байт, содержащий упакованные входные параметры&lt;br /&gt;
  uint in_byte_count, //байтовый размер упакованных данных&lt;br /&gt;
  byte** out_params[out_byte_count], //буфер, который выделяется внутрипроцессным сервером и инициализируется ответом на запрос.&lt;br /&gt;
  uint*  out_byte_count //На выходе - размер выходных данных&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=c&amp;gt;&lt;br /&gt;
return_code_t FreeData( //возвращается код ошибки chsvlib (ноль в случае успешного завершения)&lt;br /&gt;
   void* pData // указатель на буфер, выделенный внутрипроцесным сервером,&lt;br /&gt;
               // т.е. возвращенный точкой входа entry_point через параметр out_params&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Коды ошибок, возвращаемых функциями внутрипроцессного сервера, могут быть преобразованы в текстовое описание ошибки с помощью следующей функции:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const char* GetErrorDescription( // возвращается read-only utf-8 C-строка, содержащая текстовое описание ошибки&lt;br /&gt;
   uint code, // код ошибки, на основе которого формируется текстовое описание&lt;br /&gt;
   uint* pSize // опциональный указатель на 32-битовую переменную, которой функцией присваивается длина строки в байтах. Если длина не нужна, параметр может быть NULL.&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме этого, возможно ведение журнала ошибок, возникающих на стороне управляющей подсистемы (но не на стороне предметной области, если та не возвращает коды ошибок управляющей подсистеме).&lt;br /&gt;
Следующая функция позволяет задать файл журнала ошибок в текстовом формате (utf-8) веб-сервером для записи туда событий об ошибок, возникающих на стороне внутрипроцессного сервера.&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
return_code_t SetErrorLogFile( // возвращается код ошибки chsvlib (ноль в случае успешного завершения)&lt;br /&gt;
   const char* pszFileName, //относительный или абсолютный путь к файлу журнала. Строка должна либо завершаться терминальным нулем (в этом случае cchFileName должен быть равен -1),&lt;br /&gt;
                            //либо должна быть длины, равной значению cchFileName.&lt;br /&gt;
   std::size_t cchFileName, //длина строки pszFileName, либо -1, если строка заканчивается терминальным символов&lt;br /&gt;
   bool fEraseContent //флаг удаления содержимого файла, если файл уже существует. Если файл существует, и флаг сброшен, сервер будет дополнять его новыми данными&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=cpp&amp;gt;&lt;br /&gt;
auto simulation = CAMaaS::make_package(CAMaaS::sequence_to_pack(&amp;quot;Node name&amp;quot;), CAMaaS::sequence_to_pack(strModelName));&lt;br /&gt;
char* pProcessName;&lt;br /&gt;
std::uint32_t cchProcessName;&lt;br /&gt;
std::uint32_t nErr = entry_point(StartSimulationId, simulation.data(), simulation.size(), (void**) &amp;amp;pProcessName, &amp;amp;cchProcessName);&lt;br /&gt;
if (nErr != 0)&lt;br /&gt;
{&lt;br /&gt;
   std::cerr &amp;lt;&amp;lt; &amp;quot;Error &amp;quot; &amp;lt;&amp;lt; nErr &amp;lt;&amp;lt; &amp;quot; was returned by the server: &amp;quot; &amp;lt;&amp;lt; GetErrorDescription(err, nullptr) &amp;lt;&amp;lt; &amp;quot;.\n&amp;quot;;&lt;br /&gt;
   return &amp;quot;&amp;quot;;&lt;br /&gt;
}else&lt;br /&gt;
{&lt;br /&gt;
   auto ret = std::string(pProcessName, cchProcessName);&lt;br /&gt;
   FreeData(pProcessName);&lt;br /&gt;
   return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Установка==&lt;br /&gt;
1. Для установки веб-сервера необходимо загрузить следующие пакеты из репозитория с помощью команды apt-get:&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install nginx uwsgi postgresql python-psycopg2 git python-dev&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Скачиваем свежий репозиторий django:&lt;br /&gt;
&amp;lt;code&amp;gt;git clone git://github.com/django/django.git django-trunk&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Добавляем в файл &amp;lt;code&amp;gt;/usr/lib/python2.7/dist-packages/django.pth&amp;lt;/code&amp;gt; строку с абсолютным путем до скачанного репозитория&lt;br /&gt;
&lt;br /&gt;
4. Делаем для удобства ссылку в /usr/local/bin на django-admin.py с помощью команды ln.&lt;br /&gt;
&lt;br /&gt;
5. Установим утилиту setuptools:&lt;br /&gt;
&amp;lt;code&amp;gt;wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. В папке репозитория django запустим скрипт для установки:&lt;br /&gt;
&amp;lt;code&amp;gt;sudo python setup.py build install&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Настроим postgresql на прием всех запросов на порт 5433, для этого в файле /etc/postgresql/9.3/main/postgresql.conf поправим строчку &amp;lt;code&amp;gt;listen_addresses = '*'&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;port = 5433&amp;lt;/code&amp;gt;, затем перезапустим командой &amp;lt;code&amp;gt;sudo service postgresql restart&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
8. Заходим в psql под пользователем postgres с помощью команды &amp;lt;code&amp;gt;sudo -u postgres psql&amp;lt;/code&amp;gt; и создаем базу данных командой &amp;lt;code&amp;gt;CREATE DATABASE chsv_test WITH OWNER postgres ENCODING 'utf-8';&amp;lt;/code&amp;gt;, затем меняем пароль пользователя postgres командой &amp;lt;code&amp;gt;\password &amp;lt;chsvtest&amp;gt;&amp;lt;/code&amp;gt; и выходим командой &amp;lt;code&amp;gt;\q&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Переходим в репозиторий django, создаем новый проект командой &amp;lt;code&amp;gt;django-admin startproject CAMaaS1_web&amp;lt;/code&amp;gt;, затем копируем в создавшуюся папку содержимое репозитория web-сервера.&lt;/div&gt;</summary>
		<author><name>Kulikser</name></author>
	</entry>
	<entry>
		<id>http://51.250.0.107/w/index.php?title=%D0%92%D0%B5%D0%B1-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80&amp;diff=2880</id>
		<title>Веб-сервер</title>
		<link rel="alternate" type="text/html" href="http://51.250.0.107/w/index.php?title=%D0%92%D0%B5%D0%B1-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80&amp;diff=2880"/>
		<updated>2016-06-15T03:17:50Z</updated>

		<summary type="html">&lt;p&gt;Kulikser: /* Установка */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NavBar|{{Системная иерархия:Веб-сервер}} }}&lt;br /&gt;
&lt;br /&gt;
Веб-сервер должен принимать HTTP запросы, формируемые JS-скриптом на стороне клиента и содержащие запакованные входные параметры вызова серверной функции и идентификатор этой функции. В зависимости от значения идентификатора функции сервер должен обрабатывать запрос самостоятельно&amp;lt;ref&amp;gt;зачем?&amp;lt;/ref&amp;gt; либо делегировать вызов внутрипроцессному серверу (DLL, SO) с известной точкой входа:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
return_code entry_point( //возвращается код ошибки chsvlib (ноль в случае успешного завершения)&lt;br /&gt;
  uint ID, //идентификатор операции&lt;br /&gt;
  byte in_params[in_byte_count], //набор байт, содержащий упакованные входные параметры&lt;br /&gt;
  uint in_byte_count, //байтовый размер упакованных данных&lt;br /&gt;
  byte** out_params[out_byte_count], //буфер, который выделяется внутрипроцессным сервером и инициализируется ответом на запрос.&lt;br /&gt;
  uint*  out_byte_count //На выходе - размер выходных данных&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=c&amp;gt;&lt;br /&gt;
return_code_t FreeData( //возвращается код ошибки chsvlib (ноль в случае успешного завершения)&lt;br /&gt;
   void* pData // указатель на буфер, выделенный внутрипроцесным сервером,&lt;br /&gt;
               // т.е. возвращенный точкой входа entry_point через параметр out_params&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Коды ошибок, возвращаемых функциями внутрипроцессного сервера, могут быть преобразованы в текстовое описание ошибки с помощью следующей функции:&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const char* GetErrorDescription( // возвращается read-only utf-8 C-строка, содержащая текстовое описание ошибки&lt;br /&gt;
   uint code, // код ошибки, на основе которого формируется текстовое описание&lt;br /&gt;
   uint* pSize // опциональный указатель на 32-битовую переменную, которой функцией присваивается длина строки в байтах. Если длина не нужна, параметр может быть NULL.&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Кроме этого, возможно ведение журнала ошибок, возникающих на стороне управляющей подсистемы (но не на стороне предметной области, если та не возвращает коды ошибок управляющей подсистеме).&lt;br /&gt;
Следующая функция позволяет задать файл журнала ошибок в текстовом формате (utf-8) веб-сервером для записи туда событий об ошибок, возникающих на стороне внутрипроцессного сервера.&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
return_code_t SetErrorLogFile( // возвращается код ошибки chsvlib (ноль в случае успешного завершения)&lt;br /&gt;
   const char* pszFileName, //относительный или абсолютный путь к файлу журнала. Строка должна либо завершаться терминальным нулем (в этом случае cchFileName должен быть равен -1),&lt;br /&gt;
                            //либо должна быть длины, равной значению cchFileName.&lt;br /&gt;
   std::size_t cchFileName, //длина строки pszFileName, либо -1, если строка заканчивается терминальным символов&lt;br /&gt;
   bool fEraseContent //флаг удаления содержимого файла, если файл уже существует. Если файл существует, и флаг сброшен, сервер будет дополнять его новыми данными&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=cpp&amp;gt;&lt;br /&gt;
auto simulation = CAMaaS::make_package(CAMaaS::sequence_to_pack(&amp;quot;Node name&amp;quot;), CAMaaS::sequence_to_pack(strModelName));&lt;br /&gt;
char* pProcessName;&lt;br /&gt;
std::uint32_t cchProcessName;&lt;br /&gt;
std::uint32_t nErr = entry_point(StartSimulationId, simulation.data(), simulation.size(), (void**) &amp;amp;pProcessName, &amp;amp;cchProcessName);&lt;br /&gt;
if (nErr != 0)&lt;br /&gt;
{&lt;br /&gt;
   std::cerr &amp;lt;&amp;lt; &amp;quot;Error &amp;quot; &amp;lt;&amp;lt; nErr &amp;lt;&amp;lt; &amp;quot; was returned by the server: &amp;quot; &amp;lt;&amp;lt; GetErrorDescription(err, nullptr) &amp;lt;&amp;lt; &amp;quot;.\n&amp;quot;;&lt;br /&gt;
   return &amp;quot;&amp;quot;;&lt;br /&gt;
}else&lt;br /&gt;
{&lt;br /&gt;
   auto ret = std::string(pProcessName, cchProcessName);&lt;br /&gt;
   FreeData(pProcessName);&lt;br /&gt;
   return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Установка==&lt;br /&gt;
1. Для установки веб-сервера необходимо загрузить следующие пакеты из репозитория с помощью команды apt-get:&lt;br /&gt;
&amp;lt;code&amp;gt;sudo apt-get install nginx uwsgi postgresql python-psycopg2 git python-dev&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Скачиваем свежий репозиторий django:&lt;br /&gt;
&amp;lt;code&amp;gt;git clone git://github.com/django/django.git django-trunk&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Добавляем в файл &amp;lt;code&amp;gt;/usr/lib/python2.7/dist-packages/django.pth&amp;lt;/code&amp;gt; строку с абсолютным путем до скачанного репозитория&lt;br /&gt;
&lt;br /&gt;
4. Делаем для удобства ссылку в /usr/local/bin на django-admin.py с помощью команды ln.&lt;br /&gt;
&lt;br /&gt;
5. Установим утилиту setuptools:&lt;br /&gt;
&amp;lt;code&amp;gt;wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. В папке репозитория django запустим скрипт для установки:&lt;br /&gt;
&amp;lt;code&amp;gt;sudo python setup.py build install&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. Настроим postgresql на прием всех запросов на порт 5433, для этого в файле /etc/postgresql/9.3/main/postgresql.conf поправим строчку &amp;lt;code&amp;gt;listen_addresses = '*'&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;port = 5433&amp;lt;/code&amp;gt;, затем перезапустим командой &amp;lt;code&amp;gt;sudo service postgresql restart&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
8. Заходим в psql под пользователем postgres с помощью команды &amp;lt;code&amp;gt;sudo -u postgres psql&amp;lt;/code&amp;gt; и создаем базу данных командой &amp;lt;code&amp;gt;CREATE DATABASE chsv_test WITH OWNER postgres ENCODING 'utf-8';&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. Переходим в репозиторий django, создаем новый проект командой &amp;lt;code&amp;gt;django-admin startproject CAMaaS1_web&amp;lt;/code&amp;gt;, затем копируем в создавшуюся папку содержимое репозитория web-сервера.&lt;/div&gt;</summary>
		<author><name>Kulikser</name></author>
	</entry>
	<entry>
		<id>http://51.250.0.107/w/index.php?title=%D0%92%D0%B5%D1%80%D1%85%D0%BD%D0%B5%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D0%B5%D0%B2%D0%B0%D1%8F_%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0&amp;diff=90</id>
		<title>Верхнеуровневая архитектура</title>
		<link rel="alternate" type="text/html" href="http://51.250.0.107/w/index.php?title=%D0%92%D0%B5%D1%80%D1%85%D0%BD%D0%B5%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D0%B5%D0%B2%D0%B0%D1%8F_%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0&amp;diff=90"/>
		<updated>2015-07-08T22:34:58Z</updated>

		<summary type="html">&lt;p&gt;Kulikser: /* Обсужденная архитектура */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Обсужденная архитектура ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:New_Top_Struct_Design-1.jpg|thumb|Верхнеуровневая архитектура]]&lt;br /&gt;
&lt;br /&gt;
Use case, в котором все данные передаются через централизованную управляющую подсистему.&lt;br /&gt;
&lt;br /&gt;
# Пользователь через браузер подключается к управляющей подсистеме&lt;br /&gt;
# Пользователь загружает необходимые скрипты&lt;br /&gt;
# Пользователь создает модельный проект (загружает его с локального хранилища, подключается к работе над существующим проектом, ''загружает его с БД2?''&lt;br /&gt;
# Пользователь создает/изменяет геометрическую модель.&lt;br /&gt;
# Управляющая подсистема делегирует вызов подсистеме геометрического моделирования&lt;br /&gt;
# Подсистема геометрического моделирования фактически изменяет параметры геометрической модели&lt;br /&gt;
# ''Подсистема геометрического моделирования сохраняет модель в СУБД 2?''&lt;br /&gt;
# Подсистема геометрического моделирования передает модель управляющей подсистеме&lt;br /&gt;
# Управляющая подсистема передает полученные данные графической подсистеме.&lt;br /&gt;
# Графическая подсистема передает данные для визуализации пользователю&lt;br /&gt;
# Браузер выполняет визуализацию модели&lt;br /&gt;
# Пользователь обращается к управляющей подсистеме с запросом на ассоциацию данных из СУБД1 с компонентами геометрической модели для выбранной предметной области&lt;br /&gt;
# Управляющая подсистема делегирует запрос подсистеме предметной области.&lt;br /&gt;
# Подсистема предметной области запрашивает управляющую подсистему на получение данных из СУБД1.&lt;br /&gt;
# Управляющая подсистема, обращаясь к СУБД1, считывает данные и передает их ответом подсистеме предметной области.&lt;br /&gt;
# Подсистема предметной области считывает данные и задает их ассоциацию с компонентами геометрической модели.&lt;br /&gt;
# Подсистема предметной области возвращает ответ управляющей подсистеме&lt;br /&gt;
# Управляющая подсистема возвращает ответ пользователю&lt;br /&gt;
# Пользователь посылает запрос на запуск процедуры моделирования управляющей подсистеме.&lt;br /&gt;
# Управляющая подсистема делегирует вызов подсистеме предметной области&lt;br /&gt;
&lt;br /&gt;
* 3A В случае создания нового проекта, или если пользователь решает выполнить новое моделирование в выбранной им предметной области&lt;br /&gt;
** 1. Пользователь обращается к управляющей подсистемой с запросом на получение списка подсистем предметных областей (т.е. списка самих предметных областей).&lt;br /&gt;
** 2. Пользователь выбирает предметную область&lt;br /&gt;
&lt;br /&gt;
== Исходная архитектура ==&lt;br /&gt;
&lt;br /&gt;
Система состоит из следующих компонентов, распределенных по сети:&lt;br /&gt;
&lt;br /&gt;
[[Файл: Top_struct.jpg|thumb|Верхнеуровневая структурная диаграмма системы моделирования]]&lt;br /&gt;
&lt;br /&gt;
* ''[[Подсистема геометрического моделирования]]'' реализует хранение геометрической модели среды, в которой моделируется поле. Каждая модель ассоциирована с экземпляром [[сцены|сцена]] - хранилищем объектов. Подсистема реализует функционал сцены и хранения экземпляров сцены. Доступ к экземпляру осуществляется клиентом по имени модельного проекта. Компонент частично реализован в проекте chsvgrphc, в виде DLL-библиотеки и в совокупности с предметно-независимой визуализацией сцены. '''Новое:''' Предполагается разделить существующую реализацию следующим образом: хранилище геометрической модели выделить в удаленный сервер, а визуализацию проводить целиком на стороне клиента, выполняя репликацию геометрической модели при возникновении изменений на сервере.&lt;br /&gt;
&lt;br /&gt;
* ''[[Банк данных с системой управления | Система управления базами данных]]'' Разделяемый доступ компонентов CAM к постоянным справочным данным, необходимым при расчетах должен предоставляться отдельной обслуживающей подсистемой – банком данных. Информационное наполнение банка составляют данные, необходимые для проведения каждого имитационного эксперимента, например сведения о типичных источниках поля, о физических свойствах среды распределения поля для заданного набора внешних условий, количественные сведения, характеризующие поведение поля на границах раздела сред. Поскольку информационное наполнение определяется предметной областью, в которой выполняется моделирование, для каждой предметной области создается собственная база данных. В настоящий момент реализован базовый функционал СУБД в виде локального COM-сервера (проекты amdb_inner и amdb_outer), с прокси и заглушкой (amdv_outer_inner, amdb_outer_proxy). Поэтому теоретически реализация должна работать корректно и для удаленного сервера. На 07.07.2015 реализация может портить данные при большом количестве элементов данных и параллельных клиентов. Реализация ориентирована на быструю обработку поступающих параллельно запросов, с высокой вероятностью того, что доступ будет ограничен чтением. Также существует написанный мной сырой клиент СУБД, брошенный во времена написания диссертации &amp;quot;посередине&amp;quot;, поэтому пока он не выложен в репозиторий.&lt;br /&gt;
&lt;br /&gt;
* ''[[Клиент доступа к системе моделирования]]'' Пользовательский клиент, через который осуществляется доступ к системе моделирования. Сегодня клиент фактически представляет из себя простое окошко с визуализацией 3D модели сцены и [[командной строкой | командная строка клиента]]. Предоставляет пользователю интерфейс для ввода параметров моделирования и анализа в систему: объекты, степень их аппроксимации, физические размеры, которым соответствует моделируемое пространство, параметры среды распространения моделируемого физического поля, а также положение секущих плоскостей, на которых рассчитываются распределения характеристик поля.&lt;br /&gt;
&lt;br /&gt;
* ''[[Подсистема управления]]'' Централизованное управление узлами распределенной CAM, а также политика безопасности в CAM должны реализовываться сервером безопасности и управления доступными вычислительными узлами, задачей которого является хранение и предоставление адресов всех узлов системы, а также гарантия их подлинности и их авторизация. При развертывании CAM узлы системы должны регистрироваться на сервере, при этом идентификатор, адрес и ключи аутентификации регистрируемого узла должны быть занесены во внутренние базы данных сервера согласно протоколам определенным разработчиком. При необходимости клиент сервера по идентификатору должен получать адрес запрашиваемого узла лишь в том случае, если подлинность последнего подтверждена. При этом сервер исключается из набора участников информационного обмена между авторизированными узлами, таким образом, на него не налагаются требования по защите передаваемой между его клиентами информации. Это, во-первых, снижает информационную нагрузку на сервер, во-вторых, снижает роль сервера как арбитра, что является причиной недостатков множества существующих систем и протоколов безопасности [57, 92]. Этой же либо выделенной отдельно подсистемой должно осуществляться распределение нагрузки между аутентифицированными подсистемами предметной области. При этом возможно использование следующего протокола. Для каждой отдельно взятой предметной области создается реестр адресов моделирующих подсистем, не занятых выполнением моделирования. Также для каждой предметной области подсистемой создается список задач по выполнению отдельного имитационного эксперимента. Во время проведения процедуры моделирования, если реестр адресов подсистем предметной области  не пуст, параметры одного имитационного эксперимента из совокупности задач, которые необходимо выполнить для осуществления моделирования, передаются по одному из адресов из реестра. Если реестр пуст, параметры заносятся в список задач, выполнение которых осуществляется по мере освобождения подсистем предметной области. Подобные схемы управления нагрузкой в параллельных и распределенных системах имитационного моделирования являются предметом исследований в работах [25, 76], посвященных принципам PDES. В соответствующих терминах сервер осуществляет хранение списка событий, которыми являются сообщения о появлении задач по проведению имитационного эксперимента с заданными параметрами. В зависимости от требований к нагрузке на CAM и к стоимости развертывания системы сервер безопасности и подсистема управления доступными вычислительными узлами могут быть включены в одну из базовых подсистем. В этом случае такая подсистема назначается основной. Тогда остальные базовые подсистемы включаются в CAM через обращение к ней. ''Сегодня управления нет, центральной является система геометрического моделирования.''&lt;br /&gt;
&lt;br /&gt;
* ''[[Предметно-ориентированная подсистема]]'' Включает в себя подсистемы предметной области, реализованные с участием эксперта предметной области. Также включает в себя параллельный вычислительный ресурс, регистрируемый в подсистеме управления.&lt;/div&gt;</summary>
		<author><name>Kulikser</name></author>
	</entry>
</feed>