Разработка информационно-справочной системы технической поддержки пользователей сети телефонной сети
Заказать уникальную дипломную работу- 100 100 страниц
- 10 + 10 источников
- Добавлена 29.03.2014
- Содержание
- Часть работы
- Список литературы
- Вопросы/Ответы
Введение 6
1. Информационные потоки в службе технической поддержки пользователей 9
2. Постановка задачи 15
3. Принцип разработки 16
3.1. Описание общей архитектуры приложения 16
3.2. Выбор инструментальных средств 20
4. Реализация информационной системы 24
4.1. Описание веб-приложения 24
4.2. Выбор хостинга и выкладывание приложения на веб-сервер 34
4.3. Тестирование, отладка и внедрение системы 41
Заключение 43
СПИСОК ЛИТЕРАТУРЫ 44
Приложение 45
Collections;
using System.Configuration;
using System.Diagnostics;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.Configuration;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Text;
using System.IO;
using System.Data.SqlClient;
namespace aspnet_1
{
public partial class Site3 : System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{
}
///
/// ////////////////////////////////////////////////////////////////////
///
///
///
protected void Button1_Click(object sender, EventArgs e)
{
string websitePath = Request.PhysicalApplicationPath;
SqlConnection myConnection = new SqlConnection();
myConnection.ConnectionString =
@"Data Source=localhost\SQLEXPRESS;" +
@"User Instance=True; AttachDBFilename = " +
websitePath +
"App_Data\\Database1.mdf;" +
"Integrated Security=True";
try
{
myConnection.Open();
Label1.Text = "Server Version: " + myConnection.ServerVersion;
Label1.Text += "
Connection Is: " +
myConnection.State.ToString();
}
catch (Exception err)
{
// Handle an error by displaying the information.
Label1.Text = "Error reading the database. ";
Label1.Text += err.Message;
}
finally
{
bool added;
SqlCommand myCommand = new SqlCommand();
myCommand.Connection = myConnection;
myCommand.CommandText = " INSERT INTO users (users,passw,data)" +
"VALUES ('" +
TextBox1.Text +
"','" +
TextBox2.Text+
"','" +
TextBox3.Text +
"') ";
myCommand.ExecuteNonQuery();
myCommand.Clone();
myConnection.Close();
Label11.Text += "
Now Connection Is: ";
Label11.Text += myConnection.State.ToString();
Response.Redirect("Default.aspx");
}//try connection
}
}
}
using System;
using System.Collections;
using System.Configuration;
using System.Diagnostics;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.Configuration;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Text;
using System.IO;
using System.Data.SqlClient;
using System.Runtime.InteropServices;
using Word = Microsoft.Office.Interop.Word;
namespace aspnet_1
{
public partial class Site1 : System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
// Server.Transfer("HTMLPage1.htm");
string websitePath = Request.PhysicalApplicationPath;
SqlConnection myConnection = new SqlConnection();
myConnection.ConnectionString =
@"Data Source=localhost\SQLEXPRESS;" +
@"User Instance=True; AttachDBFilename = " +
websitePath +
"App_Data\\Database1.mdf;" +
"Integrated Security=True";
try
{
myConnection.Open();
lblInfo.Text = "Server Version: " + myConnection.ServerVersion;
lblInfo.Text += "
Connection Is: " +
myConnection.State.ToString();
}
catch (Exception err)
{
// Handle an error by displaying the information.
lblInfo.Text = "Error reading the database. ";
lblInfo.Text += err.Message;
}
finally
{
SqlCommand myCommand = new SqlCommand();
myCommand.Connection = myConnection;
myCommand.CommandText = "SELECT * FROM users ORDER BY users ";
SqlDataReader myReader;
myReader = myCommand.ExecuteReader();
lstNames.Items.Clear();
while (myReader.Read())// The first row in the result set is now available.
{
lstNames.Items.Add(myReader["users"] + ", " + myReader["passw"] + ", " + myReader["data"]);
}
myReader.Close();
myConnection.Close();
lblInfo.Text += "
Now Connection Is: ";
lblInfo.Text += myConnection.State.ToString();
}
}
protected void Button2_Click(object sender, EventArgs e)
{
Response.Redirect("Default.aspx");
}
///
/// ///////////////////////////////////////////
///
///
///
protected void Button3_Click(object sender, EventArgs e)
{
// Server.Transfer("HTMLPage1.htm");
string websitePath = Request.PhysicalApplicationPath;
SqlConnection myConnection = new SqlConnection();
myConnection.ConnectionString =
@"Data Source=localhost\SQLEXPRESS;" +
@"User Instance=True; AttachDBFilename = " +
websitePath +
"App_Data\\Database1.mdf;" +
"Integrated Security=True";
try
{
myConnection.Open();
lblInfo.Text = "Server Version: " + myConnection.ServerVersion;
lblInfo.Text += "
Connection Is: " +
myConnection.State.ToString();
}
catch (Exception err)
{
// Handle an error by displaying the information.
lblInfo.Text = "Error reading the database. ";
lblInfo.Text += err.Message;
}
finally
{
SqlCommand myCommand = new SqlCommand();
myCommand.Connection = myConnection;
myCommand.CommandText = "SELECT * FROM produce ";
SqlDataReader myReader;
myReader = myCommand.ExecuteReader();
lstNames.Items.Clear();
while (myReader.Read())// The first row in the result set is now available.
{
lstNames.Items.Add(myReader["user_log"] + ", " + myReader["tovar"] +
", " + myReader["pict_file"]+
", " + myReader["price"]);
}
myReader.Close();
myConnection.Close();
lblInfo.Text += "
Now Connection Is: ";
lblInfo.Text += myConnection.State.ToString();
}
}
///
/// ////////////////////////////////////////////////////
///
///
///
protected void Button4_Click(object sender, EventArgs e)
{
Word.Application wordapp;
try
{
wordapp = new Word.Application();
wordapp.Visible = true;
Object template = Type.Missing;
Object newTemplate = false;
Object documentType = Word.WdNewDocumentType.wdNewBlankDocument;
Object visible = true;
//Ñîçäàåì äîêóìåíò 1
//Ìåíÿåì øàáëîí
string websitePath = Request.PhysicalApplicationPath;
template = websitePath+"a1.doc";
Word.Document worddocument;
worddocument =
wordapp.Documents.Add(
ref template, ref newTemplate, ref documentType, ref visible);
Word.Paragraphs wordparagraphs;
Word.Paragraph wordparagraph;
wordparagraphs = worddocument.Paragraphs;
//Áóäåì ðàáîòàòü ñ ïåðâûì ïàðàãðàôîì
wordparagraph = (Word.Paragraph)wordparagraphs[1];
//Îïðåäåëÿåì äëÿ ÷åãî ñîçäàåòñÿ ñòèëü: wdStyleTypeTable,
//wdStyleTypeList, wdStyleTypeParagraph, wdStyleTypeCharacter
object patternstyle = Word.WdStyleType.wdStyleTypeParagraph;
Word.Style wordstyle = worddocument.Styles.Add("myStyle", ref patternstyle);
//Óñòàíàâëèâàåì ïàðàìåòðû øðèôòà
wordstyle.Font.Size = 30;
wordstyle.Font.Italic = 1;
wordstyle.Font.Bold = 1;
//Óñòàíàâëèâàåì ïàðàìåòðû ïàðàãðàôà
wordstyle.ParagraphFormat.LeftIndent
= worddocument.Content.Application.CentimetersToPoints((float)2);
wordstyle.ParagraphFormat.RightIndent
= worddocument.Content.Application.CentimetersToPoints((float)2);
object begin = Type.Missing;
Object end = Type.Missing;
Word.Range wordrange = worddocument.Range(ref begin, ref end);
object oWordStyle = wordstyle;
wordrange.set_Style(ref oWordStyle);
lblInfo.Text = wordparagraph.Range.Text;
wordparagraph.Range.Text = "Òåêñò êîòîðûé ìû âûâîäèì â 1 àáçàö";
//Ìåíÿåì õàðàêòåðèñòèêè òåêñòà è ïàðàãðàôà
wordparagraph.Range.Font.Color = Word.WdColor.wdColorBlue;
wordparagraph.Range.Font.Size = 20;
wordparagraph.Range.Font.Name = "Arial";
wordparagraph.Range.Font.Italic = 1;
wordparagraph.Range.Font.Bold = 0;
wordparagraph.Range.Font.Underline = Word.WdUnderline.wdUnderlineSingle;
wordparagraph.Range.Font.UnderlineColor = Word.WdColor.wdColorDarkRed;
Object fileName = websitePath + "a2.doc";
Object fileFormat = Word.WdSaveFormat.wdFormatDocument;
Object lockComments = false;
Object password = "";
Object addToRecentFiles = false;
Object writePassword = "";
Object readOnlyRecommended = false;
Object embedTrueTypeFonts = false;
Object saveNativePictureFormat = false;
Object saveFormsData = false;
Object saveAsAOCELetter = Type.Missing;
Object encoding = Type.Missing;
Object insertLineBreaks = Type.Missing;
Object allowSubstitutions = Type.Missing;
Object lineEnding = Type.Missing;
Object addBiDiMarks = Type.Missing;
#if OFFICEXP
worddocument.SaveAs2000(ref fileName,
#else
worddocument.SaveAs(ref fileName,
#endif
ref fileFormat, ref lockComments,
ref password, ref addToRecentFiles, ref writePassword,
ref readOnlyRecommended, ref embedTrueTypeFonts,
ref saveNativePictureFormat, ref saveFormsData,
ref saveAsAOCELetter, ref encoding, ref insertLineBreaks,
ref allowSubstitutions, ref lineEnding, ref addBiDiMarks);
Object saveChanges = Word.WdSaveOptions.wdPromptToSaveChanges;
Object originalFormat = Word.WdOriginalFormat.wdWordDocument;
Object routeDocument = Type.Missing;
//((Word._Application)wordapp).Quit(ref saveChanges,
// ref originalFormat, ref routeDocument);
//wordapp = null;
}
catch (Exception ex)
{
lblInfo.Text = ex.Message;
}
}
}
}
using System;
using System.Collections;
using System.Configuration;
using System.Diagnostics;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.Configuration;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Text;
using System.IO;
using System.Data.SqlClient;
namespace aspnet_1
{
public partial class Site2 : System.Web.UI.MasterPage
{
public Product saleProduct;
public string login_user;
public Site2()
{
login_user = "xxx";
}
public void ChangeDetected()
{
// This code executes in response to the PriceChanged event.
int qqq = 0;
//saleProduct = null;
}
protected void Page_Load(object sender, EventArgs e)
{
FileUpload1.Visible = false;
Button2.Visible = false;
TextBox3.Visible = false;
TextBox4.Visible = false;
Label3.Visible = false;
Label4.Visible = false;
Label5.Visible = false;
}
protected void Button1_Click(object sender, EventArgs e)
{
string pass = TextBox1.Text + TextBox2.Text;
string pass1;
int passed = 0;
string websitePath = Request.PhysicalApplicationPath;
SqlConnection myConnection = new SqlConnection();
myConnection.ConnectionString =
@"Data Source=localhost\SQLEXPRESS;" +
@"User Instance=True; AttachDBFilename = " +
websitePath +
"App_Data\\Database1.mdf;" +
"Integrated Security=True";
try
{
myConnection.Open();
Label2.Text = "Server Version: " + myConnection.ServerVersion;
Label2.Text += "
Connection Is: " +
myConnection.State.ToString();
}
catch (Exception err)
{
// Handle an error by displaying the information.
Label2.Text = "Error reading the database. ";
Label2.Text += err.Message;
}
finally
{
SqlCommand myCommand = new SqlCommand();
myCommand.Connection = myConnection;
myCommand.CommandText = "SELECT * FROM users ORDER BY users ";
SqlDataReader myReader1;
myReader1 = myCommand.ExecuteReader();
while (myReader1.Read())// The first row in the result set is now available.
{
pass1 = myReader1["users"].ToString().Trim()+ myReader1["passw"].ToString().Trim();
pass1 = pass1.Trim();
if (pass == pass1) { passed = 1; }
}
myReader1.Close();
Label2.Text += "
Now Connection Is: ";
Label2.Text += myConnection.State.ToString();
if (passed==1)
{
login_user = TextBox1.Text.Trim();
System.Text.StringBuilder sb = new System.Text.StringBuilder();
myCommand.CommandText = "SELECT * FROM produce WHERE user_log='" + TextBox1.Text + "' ORDER BY user_log";
SqlDataReader myReader2;
myReader2 = myCommand.ExecuteReader();
Label1.Text = "
your data are: ";
sb.Append("
");
while (myReader2.Read())// The first row in the result set is now available.
{
sb.Append("Produse Type: ");
sb.Append(myReader2["tovar"].ToString().Trim());
sb.Append("Picture file is: ");
sb.Append(myReader2["pict_file"].ToString().Trim());
sb.Append(" price: ");
sb.Append(myReader2["price"].ToString().Trim());
sb.Append("
");
}
Label1.Text = Label1.Text + sb.ToString();
FileUpload1.Visible = true;
Button2.Visible = true;
TextBox2.Visible = true;
TextBox3.Visible = true;
TextBox4.Visible = true;
Label3.Visible = true;
Label4.Visible = true;
Label5.Visible = true;
Button3.Visible = false;
myReader2.Close();
}
else
{
Label1.Text = "
login-password are not true";
}
myConnection.Close();
}//finally
}
///
/// ///////////////////////////////////////////////////////
///
///
///
protected void Button2_Click(object sender, EventArgs e)
{
string websitePath = Request.PhysicalApplicationPath;
string name_p="";
if (FileUpload1.HasFile)
try
{
name_p = FileUpload1.FileName.Substring(0, FileUpload1.FileName.IndexOf("."));
name_p = TextBox3.Text;
FileUpload1.SaveAs(
websitePath + "base_im/" + name_p + ".jpeg"
);
Label1.Text = "File name: " +
FileUpload1.PostedFile.FileName + "
" +
FileUpload1.PostedFile.ContentLength + " kb
" +
"Content type: " +
FileUpload1.PostedFile.ContentType;
}
catch (Exception ex)
{
Label1.Text = "ERROR: " + ex.Message.ToString();
}
else
{
Label1.Text = "You have not specified a file.";
}
if (!(TextBox3.Text.Trim() == ""))
{
if (saleProduct == null)
{
saleProduct = new Product(TextBox3.Text, Int32.Parse(TextBox4.Text));
}
saleProduct.PriceChanged += ChangeDetected;
saleProduct.Price = saleProduct.Price + 1;
saleProduct.ImageUrl = "http://localhost:"+
Request.Url.Port.ToString()+
"/base_im/" + name_p +".jpeg";
Response.Write(saleProduct.GetHtml());
SqlConnection myConnection = new SqlConnection();
myConnection.ConnectionString =
@"Data Source=localhost\SQLEXPRESS;" +
@"User Instance=True; AttachDBFilename = " +
websitePath +
"App_Data\\Database1.mdf;" +
"Integrated Security=True";
try
{
myConnection.Open();
Label1.Text = "Server Version: " + myConnection.ServerVersion;
Label1.Text += "
Connection Is: " +
myConnection.State.ToString();
}
catch (Exception err)
{
// Handle an error by displaying the information.
Label1.Text = "Error reading the database. ";
Label1.Text += err.Message;
}
finally
{
bool added;
SqlCommand myCommand = new SqlCommand();
myCommand.Connection = myConnection;
myCommand.CommandText = " INSERT INTO produce (tovar,user_log,pict_file,price)" +
"VALUES ('" +
TextBox3.Text +
"','" +
TextBox1.Text
+ "','" +
name_p +".jpeg"+
"','" +
TextBox4.Text+
"') ";
//myCommand.CommandText = " INSERT INTO produce (tovar,user_log,pict_file)" +
// "VALUES ('qwe','qq','wre') ";
myCommand.ExecuteNonQuery();
System.Text.StringBuilder sb = new System.Text.StringBuilder();
myCommand.CommandText = "SELECT * FROM produce WHERE user_log='" + TextBox1.Text + "' ORDER BY user_log";
SqlDataReader myReader2;
myReader2 = myCommand.ExecuteReader();
Label1.Text = "
your data are: ";
sb.Append("
");
while (myReader2.Read())// The first row in the result set is now available.
{
sb.Append(" Produse Type: ");
sb.Append(myReader2["tovar"].ToString().Trim());
sb.Append(" Picture file is: ");
sb.Append(myReader2["pict_file"].ToString().Trim());
sb.Append(" price: ");
sb.Append(myReader2["price"].ToString().Trim());
sb.Append("
");
sb.Append("
");
}
Label1.Text = Label1.Text + sb.ToString();
myConnection.Close();
Label1.Text += "
Now Connection Is: ";
Label1.Text += myConnection.State.ToString();
Label2.Text += "
Now Connection Is: ";
Label2.Text += myConnection.State.ToString();
}//try connection
}//if(!(TextBox3.Text.Trim()==""))
}
protected void TextBox4_TextChanged(object sender, EventArgs e)
{
}
protected void Button3_Click(object sender, EventArgs e)
{
Response.Redirect("WebForm4.aspx");
}
}
}
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="third_page.Master.cs" Inherits="aspnet_1.Site2" %>
<script language="javascript" type="text/javascript">
<br />// <!CDATA[
<br/><br/><br/><br />// ]]>
<br /></script>
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="second_page.Master.cs" Inherits="aspnet_1.Site1" %>
105
Работа завершена:
«__»__________2014 г. _______________________________Фамилия И.О. ___________
« __ » ____________ 2010 г.
Работа допущена к защите:
Научный руководитель
Должность
« __ » ____________ 2014 г.__________________________ Фамилия И.О.
Заведующий кафедрой
« __ » ____________ 2014 г. _________________________Фамилия И.О.
1. Емельянова Н.З., Партыка Т.Л., Попов И.И. Основы построения автоматизированных информационных систем. – М.: Форум, Инфра-М, 2007.
2. Муссиано Ч., Кеннеди Б. HTML и XHTML . Подробное руководство, 6-е издание.
3. Джеффри Д. Ульман, Дженнифер Уидом. Основы реляционных баз данных, Лори, М, 2006 г.
4. Джен Л. Харрингтон. Проектирование реляционных баз данных Лори, 2006 г.
5. Кен Хендерсон. Профессиональное руководство по SQL Server. Структура и реализация (+ CD-ROM), Вильямс, М, 2006 г.
6. Павел Пушкарев. Web script.ru. Управление сайтом. http://webscript.ru/stories/02/01/03/3584690
7. Ачагу Р.М. Характеристика программного продукта. http://synopsis.kubsu.ru/informatic/operator/lecture/theme3_1_1.htm
8. Вендров А.М. Проектирование программного обеспечения экономических информационных систем, Финансы и статистика, М, 2002
9. Министерство здравоохранения Российской Федерации. Гигиенические требования к вычислительной технике, условиям и организации работы, М, 2002 г.
10. Министерство здравоохранения Российской Федерации. Гигиенические требования к вычислительной технике, условиям и организации работы, М, 2002 г.
Вопрос-ответ:
Какие информационные потоки существуют в службе технической поддержки пользователей?
В службе технической поддержки пользователей существуют различные информационные потоки. Один из основных потоков - это поток заявок от пользователей, которые могут поступать по телефону, по электронной почте или через веб-формы. Также существует поток информации от специалистов поддержки к пользователям, где передается решение проблемы или ответ на вопрос. Кроме того, существует поток информации от пользователя к пользователю, когда пользователи делятся опытом и помогают друг другу.
Какая задача ставится перед разработкой информационно-справочной системы технической поддержки?
Основной задачей разработки информационно-справочной системы технической поддержки является улучшение качества и эффективности работы службы технической поддержки пользователей. Система должна предоставлять информацию и решения наиболее часто встречающихся проблем и вопросов пользователей, а также позволять быстро и удобно организовывать обмен информацией между специалистами поддержки и пользователями.
Какие принципы лежат в основе разработки информационно-справочной системы технической поддержки?
При разработке информационно-справочной системы технической поддержки используются следующие принципы. Во-первых, система должна быть удобной и легкой в использовании для пользователей, чтобы они могли быстро найти нужную информацию или решение проблемы. Во-вторых, система должна быть гибкой и масштабируемой, чтобы ее можно было адаптировать под различные потребности и изменения в работе службы поддержки. В-третьих, система должна быть надежной и безопасной, чтобы предотвращать несанкционированный доступ к информации и сохранять конфиденциальность данных пользователей.
Каким образом реализовано веб-приложение информационной системы технической поддержки?
Веб-приложение информационной системы технической поддержки реализовано с использованием современных технологий веб-разработки. Для создания пользовательского интерфейса используются HTML, CSS и JavaScript. Для обработки запросов и взаимодействия с базой данных используется серверный язык программирования, например, PHP или Python. Веб-приложение может быть развернуто на веб-сервере и доступно для пользователей через интернет.
Какие информационные потоки присутствуют в службе технической поддержки пользователей?
В службе технической поддержки пользователей присутствуют различные информационные потоки. Это может быть информация о проблемах и запросах от пользователей, информация о решениях и обновлениях программного обеспечения, а также отчеты и статистика о работе службы.
Какие задачи ставятся перед разработкой информационно-справочной системы технической поддержки пользователей?
Задачи перед разработкой информационно-справочной системы технической поддержки пользователей могут быть различными. Например, это может быть автоматизация процесса приема и обработки запросов от пользователей, улучшение эффективности работы службы, обеспечение более быстрого и качественного доступа к справочной информации и решениям проблем.
Какая архитектура приложения используется при разработке информационной системы технической поддержки пользователей?
При разработке информационной системы технической поддержки пользователей может быть использована различная архитектура приложения. Обычно используется клиент-серверная архитектура, где клиентское приложение предоставляет пользователю доступ к функционалу системы, а серверная часть обрабатывает запросы и хранит информацию.
Какие инструментальные средства могут быть выбраны при разработке информационной системы технической поддержки пользователей?
При разработке информационной системы технической поддержки пользователей могут быть выбраны различные инструментальные средства. Например, для разработки веб-приложения может быть использован фреймворк Django, а для хранения данных - база данных PostgreSQL. Также может быть использовано программное обеспечение для автоматизации тестирования, отладки и внедрения системы.
Как происходит реализация информационной системы технической поддержки пользователей?
Реализация информационной системы технической поддержки пользователей происходит поэтапно. Сначала разрабатывается веб-приложение, которое обеспечивает интерфейс для пользователя. Затем выбирается хостинг и приложение выкладывается на веб-сервер. После этого проводится тестирование, отладка и внедрение системы.
Какие информационные потоки существуют в службе технической поддержки пользователей?
В службе технической поддержки пользователей существуют различные информационные потоки. Основные из них включают получение заявок от пользователей, передачу информации о заявке специалистам, обработку заявок, а также передачу готовых решений пользователю. Также может существовать поток информации о новых технических решениях, обновлениях и других изменениях в системе.
Какая задача стоит перед разработкой информационно-справочной системы технической поддержки пользователей сети телефонной сети?
Основная задача разработки информационно-справочной системы технической поддержки пользователей сети телефонной сети - обеспечить пользователям доступ к необходимой информации для решения их проблем с телефонной сетью. Это может включать вопросы по настройке, ремонту, особенностям использования и другим техническим вопросам. Система должна быть удобной и понятной в использовании, чтобы пользователи могли быстро находить нужную информацию.
Какие инструментальные средства были выбраны при разработке информационной системы?
При разработке информационной системы были выбраны следующие инструментальные средства: язык программирования, фреймворк для разработки веб-приложений, база данных, система управления версиями кода, инструменты тестирования и отладки. В качестве языка программирования был выбран Python, фреймворком для разработки веб-приложений - Django, базой данных - PostgreSQL, системой управления версиями кода - Git. Для тестирования и отладки использовались стандартные инструменты, предоставляемые выбранными инструментами разработки.