tss lab-01
|
@ -14,9 +14,31 @@
|
|||
\tableofcontents
|
||||
\newpage
|
||||
\section{Введение}
|
||||
DevOps -- стратегия разработки ПО, призванная устранить разрыв между разработчиками, и другими командами.
|
||||
DevOps -- стратегия разработки ПО, призванная устранить разрыв между разработчиками, и другими командами. Методология автомтизации технологических процессов сборки, настройки и развёртывания программного обеспечения. Методология предполагает активное взаимодействие специалистов по разработке со специалистами по информационно-технологическому обсулуживанию и взаимную интеграцию их технологических процессов друг в друга, для обеспечения высокого качества программного продукта.
|
||||
|
||||
Методологии разработки - waterfall (последовательный переход от одного этапа к другому), agile (scrum, lean) -- гибкая методология, система идей. Ключевой принцип - разработка через короткие итерации.
|
||||
|
||||
Водопадная модель разработки (Waterfall-разработка):
|
||||
Системные и программные требования: закрепляются в PRD (product requirements documents, документ требований к продукту).
|
||||
Анализ: воплощается в моделях, схемах и бизнес-правилах.
|
||||
Дизайн: разрабатывается внутренняя архитектура ПО, способы реализации требований; си внешний вид ПО, ной
|
||||
его внутренняя структурная логи
|
||||
|
||||
. Кодинг: непосредственно пишется код программы, идёт интеграция ПО.
|
||||
|
||||
'Нетолько интерф
|
||||
|
||||
- Тестирование: баг-тестеры (т
|
||||
продукт, занося в трекеры сведения о дефектах кода програм
|
||||
функционала. В случае ошибок и наличия времени финансов происходит
|
||||
исправление багов.
|
||||
|
||||
Операции: продукт эдаптируется под разные операционные системы,
|
||||
регулярно обновляется для исправления обнаруженных пользователями
|
||||
бэгов и добавления функционала. В рамках стадии также осуществляется
|
||||
|
||||
техническая поддержка клиентов:
|
||||
|
||||
Методологии разработки - waterfall, agile (scrum, lean)
|
||||
|
||||
Обычно ИТ-команда это разработчики(Dev), тестировщики(QA), группа эксплуатации(Ops). Толчком к появлению девопс стало появление микросервисов.
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
\makeBMSTUHeader
|
||||
|
||||
% ... работе, номер, тема, предмет, ?а, кто
|
||||
\makeReportTitle{лабораторной}{1}{Введение}{Программное обеспечение телекоммуникационных систем}{}{И.М.Сидякин}
|
||||
\makeReportTitle{лабораторной}{№ 1}{Введение}{Программное обеспечение телекоммуникационных систем}{}{И.М.Сидякин}
|
||||
\newpage
|
||||
\sloppy
|
||||
\thispagestyle{empty}
|
||||
|
@ -38,10 +38,10 @@ Debian 11:
|
|||
- ErlangPlugin 0.11.1162.
|
||||
- Erlang/OTP 23 [erts-11.1.8] [64-bit]
|
||||
|
||||
Mac OS X (уточнить):
|
||||
- IDEA 2022.3.1 CE
|
||||
Ubuntu 22.04:
|
||||
- IDEA 2022.3.2 CE
|
||||
- ErlangPlugin 0.11.1162.
|
||||
- Erlang/OTP 23 [erts-11.1.8] [64-bit]
|
||||
- Erlang/OTP 25 [erts-13.0.4] [64-bit]
|
||||
\end{verbatim}
|
||||
|
||||
Основные синтаксические конструкции, использованные при написании функций взяты из материалов к лабораторной работе, со слайда 1-27 презентации. Код написанного модуля, вычисляющего число Фибоначчи приведён в листинге \hrf{lst:fib-p}, код юнит-теста написанного модуля в листинге \hrf{lst:fib-p-test}, а снимок экрана, демонстрирующий успешность пройденных тестов на рисунке \hrf{pic:fib-p-pow}.
|
||||
|
@ -263,9 +263,158 @@ start_time_chack() ->
|
|||
\item Если функция находит \code{Count} чисел подряд, делящихся на квадрат простого числа в диапазоне \code{[2, MaxN]}, она должна вернуть первое число из этой последовательности.
|
||||
\item Если функция не находит серию из \code{Count} чисел делящихся на квадрат простого числа в этом диапазоне, она должна вернуть атом fail.
|
||||
\end{itemize}
|
||||
\item Найдите первый ряд из чисел делящихся на квадрат простого числа длиной 4, длиной 5, и длиной 6. Нужно выбрать значение \code{MaxN} равное 30000. Программа должна завершить вычисления в пределах одной минуты.
|
||||
\item \label{item:task-work} Найдите первый ряд из чисел делящихся на квадрат простого числа длиной 4, длиной 5, и длиной 6. Нужно выбрать значение \code{MaxN} равное 30000. Программа должна завершить вычисления в пределах одной минуты.
|
||||
\end{enumerate}
|
||||
|
||||
\section{Выполнение}
|
||||
\subsection{Функция вычисления простого числа}
|
||||
Функция последовательно перебирает все числа от «корня из искомого + 1» до 2, возвращая ложь при $N < 2$. Если найдено число, остаток от деления на которое искомого даёт 0 -- искомое не считается простым. В работе используется встроенная в язык функция \code{trunc()}, отсекающая дробную часть передаваемого в аргументе числа.
|
||||
|
||||
Код функции приведён в листинге \hrf{lst:is-prime}, сниок экрана, демонстрирующий корректность выполнения функции (с использованием тестов) на рисунке \hrf{pic:is-prime}. Во время работы также была написана функция для проведения ручного тестирования, представленная на рисунке \hrf{pic:say-prime}, демонстрирующем, что число 1111 не является простым..
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=10cm]{04-tss-01-lab-say-prime.png}
|
||||
\caption{Ручная проверка работы фукнции}
|
||||
\label{pic:say-prime}
|
||||
\end{figure}
|
||||
|
||||
\begin{lstlisting}[language=Erlang, style=CCodeStyle, caption={Код функции}, label={lst:is-prime}]
|
||||
%% region is_prime
|
||||
is_prime(N) when N < 2 ->
|
||||
false;
|
||||
is_prime(N) ->
|
||||
is_prime(N, 2, trunc(math:sqrt(N)) + 1).
|
||||
|
||||
is_prime(_, Max, Max) ->
|
||||
true;
|
||||
is_prime(N, I, Max) ->
|
||||
if
|
||||
N rem I =:= 0 ->
|
||||
false;
|
||||
true ->
|
||||
is_prime(N, I + 1, Max)
|
||||
end.
|
||||
%% endregion
|
||||
\end{lstlisting}
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=10cm]{04-tss-01-lab-is-prime.png}
|
||||
\caption{Запуск и успешное выполнение тестов}
|
||||
\label{pic:is-prime}
|
||||
\end{figure}
|
||||
|
||||
\subsection{Вычисление сомножителей}
|
||||
Функция имеет ограничение и выполняется только для тех чисел, на которые делится без остатка исходное (\code{when X rem N == 0}) с 2 до искомого, складывая в список все значения, меньшие, чем «корень из искомого + 1». Код функции приведён в листинге \hrf{lst:prime-factors}, сниок экрана, демонстрирующий корректность выполнения функции на рисунке \hrf{pic:prime-factors}.
|
||||
|
||||
\begin{lstlisting}[language=Erlang, style=CCodeStyle, caption={Код функции}, label={lst:prime-factors}]
|
||||
%region factor
|
||||
prime_factors(N) ->
|
||||
prime_factors(N, 2, []).
|
||||
|
||||
prime_factors(X, N, Primes) when X rem N == 0 ->
|
||||
prime_factors(trunc(X / N), 2, [N | Primes]);
|
||||
prime_factors(X, N, Primes) ->
|
||||
case N < math:sqrt(X) + 1 of
|
||||
true ->
|
||||
prime_factors(X, N + 1, Primes);
|
||||
false ->
|
||||
[X | Primes]
|
||||
end.
|
||||
%endregion
|
||||
\end{lstlisting}
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=15cm]{04-tss-01-lab-prime-factors.png}
|
||||
\caption{Демонстрация работы функции}
|
||||
\label{pic:prime-factors}
|
||||
\end{figure}
|
||||
|
||||
\subsection{Функция вычисления делимости на квадрат простого числа}
|
||||
Функция перебирает список полученных функцией \code{prime_factors} множителей на наличие повторений, последовательно выделяя головной элемент списка и вызывая функцию \code{lists:member}\footnote{\href{https://www.tutorialspoint.com/erlang/erlang_member.htm}{примеры использования функции}}. Для пустого списка функция возвращает ложь. Например, для числа 111 (\hrf{is-sq-mul1}) функция возвращает ложь, а для 10000 (\hrf{is-sq-mul2}) истину. Код функции представлен в листинге \hrf{lst:is-sq-mul}, а результаты проверки представлены на рисунке \hrf{pic:is-sq-mul}
|
||||
|
||||
\begin{lstlisting}[language=Erlang, style=CCodeStyle, caption={Код функции}, label={lst:is-sq-mul}]
|
||||
%% region is_square_multiple
|
||||
is_square_multiple(N)->
|
||||
is_square_multiple_fun(prime_factors(N)).
|
||||
|
||||
is_square_multiple_fun([H | T]) ->
|
||||
case lists:member(H, T) of
|
||||
true -> true;
|
||||
false -> is_square_multiple_fun(T)
|
||||
end;
|
||||
|
||||
is_square_multiple_fun([]) ->
|
||||
false.
|
||||
%% endregion is_square_multiple
|
||||
\end{lstlisting}
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\begin{subfigure}[b]{0.47\textwidth}
|
||||
\centering
|
||||
\includegraphics[width=\textwidth]{04-tss-01-lab-mul1.png}
|
||||
\caption{}
|
||||
\label{pic:is-sq-mul1}
|
||||
\end{subfigure}
|
||||
\hfill
|
||||
\begin{subfigure}[b]{0.47\textwidth}
|
||||
\centering
|
||||
\includegraphics[width=\textwidth]{04-tss-01-lab-mul2.png}
|
||||
\caption{}
|
||||
\label{pic:is-sq-mul2}
|
||||
\end{subfigure}
|
||||
\caption{}
|
||||
\label{pic:is-sq-mul}
|
||||
\end{figure}
|
||||
|
||||
\subsection[Функция-обёртка \code{find\_square\_multiples}]{Функция-обёртка \code{find_square_multiples}}
|
||||
Функция работает с ограничением по длине найденных значений в списке (\code{when length(FoundSquareMultipleNumber) == Count}) и последовательно уменьшает максимальное число до которого нужно выполнять поиск (ищет не с начала, а с конца). Для максимального значения 2 -- нужно прекратить поиск, в этом случае функция выводит атом \code{fail}. Если проверка \code{is_square_multiple(TestNumber)} возвращает истину, число прибавляется (конкатенируется) к списку уже найденных. Код функции представлен в листинге \hrf{lst:find-sq-mul}. Для проверки работы был написан тест с предложенными в методическом пособии значениями (листинг \hrf{lst:sq-mul-test}). Тест пройден успешно (рисунок \hrf{pic:sq-mul-test}).
|
||||
|
||||
\begin{lstlisting}[language=Erlang, style=CCodeStyle, caption={Код тестов}, label={lst:sq-mul-test}]
|
||||
test_find_square_multiples() ->
|
||||
?assertEqual(fail, mobius:find_square_multiples(3, 20)),
|
||||
?assertEqual(48, mobius:find_square_multiples(3, 50)).
|
||||
\end{lstlisting}
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=12cm]{04-tss-01-lab-sq-mul-test.png}
|
||||
\caption{Результат прохождения теста}
|
||||
\label{pic:sq-mul-test}
|
||||
\end{figure}
|
||||
|
||||
|
||||
\begin{lstlisting}[language=Erlang, style=CCodeStyle, caption={Код функции}, label={lst:find-sq-mul}]
|
||||
%% region find_square_multiples
|
||||
find_square_multiples(Count, MaxN) ->
|
||||
find_square_multiples_fun(Count, MaxN, []).
|
||||
|
||||
find_square_multiples_fun(Count, CurrentNumber, FoundSquareMultipleNumber)
|
||||
when length(FoundSquareMultipleNumber) == Count ->
|
||||
CurrentNumber + 1;
|
||||
|
||||
find_square_multiples_fun(_, 2, _) ->
|
||||
fail;
|
||||
|
||||
find_square_multiples_fun(Count, TestNumber, FoundSquareMultipleNumber) ->
|
||||
case is_square_multiple(TestNumber) of
|
||||
true -> FoundsNumber = FoundSquareMultipleNumber ++ [TestNumber];
|
||||
false -> FoundsNumber = []
|
||||
end,
|
||||
find_square_multiples_fun(Count, TestNumber - 1, FoundsNumber).
|
||||
%% endregion find_square_multiples
|
||||
\end{lstlisting}
|
||||
|
||||
Для выполнения п. \hrf{item:task-work} был описан цикл, последовательно увеличивающий число находимых множителей. Результат работы цикла с замерами времени приведён на рис. \hrf{pic:final}
|
||||
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\includegraphics[width=17cm]{04-tss-01-lab-final.png}
|
||||
\caption{Результат выполнения задания}
|
||||
\label{pic:final}
|
||||
\end{figure}
|
||||
|
||||
\end{document}
|
||||
|
||||
|
|
After Width: | Height: | Size: 64 KiB |
After Width: | Height: | Size: 99 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 30 KiB |
|
@ -154,10 +154,11 @@ sorting=ntvy,
|
|||
\end{center}
|
||||
\vspace*{4em}
|
||||
\begin{flushright}
|
||||
Выполнили\\
|
||||
Выполнил\\
|
||||
% cтудент группы ИУ3-11М \\
|
||||
% cтудент группы ИУ3-21М \\
|
||||
cтудент группы ИУ3-31М \\
|
||||
% cтудент группы ИУ3-31М \\
|
||||
cтудент группы ИУ3-41М \\
|
||||
Овчинников И.И. \\
|
||||
\vspace*{0.5em}
|
||||
Проверил#5\\
|
||||
|
|