started merging 1-2

This commit is contained in:
Ivan I. Ovchinnikov 2022-08-19 00:30:29 +03:00
parent 23fbc91b2e
commit 630a5efc29
5 changed files with 249 additions and 75 deletions

Binary file not shown.

View File

@ -1,79 +1,17 @@
%\immediate\write18{texcount -sum -1 j-spec.tex > /tmp/wordcount.tex}
\immediate\write18{texcount -sum -1 j-spec.tex > /tmp/wordcount.tex}
%\immediate\write18{texcount -sum -1 scenarios/jc-1-c.tex > /tmp/wordcount.tex}
\documentclass[12pt, a4paper]{report}
\usepackage[english,russian]{babel} % локализация и переносы
\usepackage{fancyhdr}
\usepackage{graphicx}
\usepackage{titlesec}
\usepackage{tikz}
\usepackage{indentfirst}
\usepackage{datetime2}
\usepackage{geometry,lscape}
\usepackage{enumitem}
\usepackage{multicol,multirow}
\usepackage{float,adjustbox}
%\usepackage{fontawesome}
\usepackage{longtable}
\usepackage{tikz}
\usepackage{hyperref}
\usepackage{forest}
\usepackage{nomencl,imakeidx}
\usetikzlibrary{mindmap,trees}
\input{main-style-preamble}
\input{fancy-listings-preamble}
\titlelabel{\thetitle. \quad}
\setcounter{tocdepth}{1}
\renewcommand{\nomname}{Термины, определения и сокращения}
\makeindex
\makenomenclature
\babelfont{rm}{PT Astra Serif}
\babelfont{sf}{PT Astra Serif}
\babelfont{tt}{PT Mono}
\graphicspath{{./pics/}}
\newcounter{slidenum}
\setcounter{slidenum}{1} % set to 2 if want to exclude title page of presentation
\newcommand{\showslide}[1]{
\noindent\makebox[\linewidth]{\rule{.90\paperwidth}{1.4pt}}
\begin{center}
\framebox{\includegraphics[page=\arabic{slidenum},width=.85\textwidth]{#1}}
\stepcounter{slidenum}
\end{center}
}
\newcommand\hrf[1]{\hyperref[#1]{\ref{#1}}}
\newcommand\hRf[1]{\hyperref[#1]{\nameref{#1}}}
\newcommand{\wordcount}{\input{/tmp/wordcount.tex}}
\newcommand{\code}[1]{\small{\texttt{\detokenize{#1}}}\normalsize}
\newcommand*{\nom}[2]{#1\nomenclature{#1}{#2}}
\renewcommand\labelitemi{\textemdash}
\newenvironment{frm}
{ \begin{center} \begin{tabular}{|p{0.9\textwidth}|} \hline\\ }
{ \\\\\hline \end{tabular} \end{center} }
\fancypagestyle{plain}{
\setlength{\headheight}{33pt}
\fancyhf{}
\lhead{\includegraphics[height=5mm]{logo.png}}
\rhead{И.И. Овчинников \\ \href{https://t.me/ivanigorevichfeed}{Telegram: ivanigorevichfeed}}
\chead{\thepage}
% \cfoot{\faRocket}
% \rfoot{Всего слов: \wordcount}
}
\geometry{
left=2cm,
right=1cm,
top=2cm,
bottom=2cm
}
\title{Специализация Java}
\author{Иван Игоревич Овчинников}
\date{\today{} (\DTMcurrenttime)}
\setlist{nolistsep}
\setlist[itemize]{leftmargin=10mm}
\setlist[enumerate]{leftmargin=10mm}
\usepackage{subfiles}
@ -97,8 +35,7 @@
\item \nom{CLI}{(англ. Command line interface, Интерфейс командной строки) — разновидность текстового интерфейса между человеком и компьютером, в котором инструкции компьютеру даются в основном путём ввода с клавиатуры текстовых строк (команд). Также известен под названиями «консоль» и «терминал».}
\end{itemize}
\subsection{Теория}
\subsubsection{Краткая история (причины возникновения)}
\subsection{Краткая история (причины возникновения)}
\begin{itemize}
\item Язык создавали для разработки встраиваемых систем, сетевых приложений и прикладного \nom{ПО}{программное обеспечение};
\item Популярен из-за скорости исполнения и полного абстрагирования от исполнителя кода;
@ -121,7 +58,7 @@
\end{itemize}
\end{enumerate}
\subsubsection{Базовый инструментарий, который понадобится (выбор IDE)}
\subsection{Базовый инструментарий, который понадобится (выбор IDE)}
\begin{itemize}
\item NetBeans - хороший, добротный инструмент с лёгким ностальгическим оттенком;
\item Eclipse - для поклонников Eclipse Foundation и швейцарских ножей с полусотней лезвий;
@ -140,7 +77,7 @@
\end{itemize}
\end{enumerate}
\subsubsection{Что нужно скачать, откуда (как выбрать вендора, версии)}
\subsection{Что нужно скачать, откуда (как выбрать вендора, версии)}
Для разработки понадобится среда разработки (\nom{IDE}{(от англ. Integrated Development Environment) это интегрированная, единая среда разработки, которая используется разработчиками для создания различного программного обеспечения. IDE представляет собой комплекс из нескольких инструментов, а именно: текстового редактора, компилятора или интерпретатора, средств автоматизации сборки и отладчика.}) и инструментарий разработчика (JDK). JDK выпускается несколькими поставщиками, большинство из них бесплатны и полнофункциональны, то есть поддерживают весь функционал языка и платформы.
В последнее время, с развитием контейнеризации приложений, часто устанавливают инструментарий в Docker-контейнер и ведут разработку прямо в контейнере, это позволяет не захламлять компьютер разработчика разными версиями инструментария и быстро разворачивать свои приложения в \nom{CI}{(англ. Continious Integration) практика разработки программного обеспечения, которая заключается в постоянном слиянии рабочих копий в общую основную ветвь разработки и выполнении частых автоматизированных сборок проекта для скорейшего выявления потенциальных дефектов и решения интеграционных проблем.} или на целевом сервере.
@ -152,7 +89,7 @@
\begin{frm}
Для корректной работы самого инструментария и сторонних приложений, использующих инструментарий, проследите, пожалуйста, что установлены следующие переменные среды ОС:
\begin{itemize}
\item в системную \code{PATH} добавить путь до исполняемых файлов JDK, например, для UNIX-подобных систем: \code{PATH=$PATH:/usr/lib/jvm/jdk1.8.0_221/bin}
\item в системную \code{PATH} добавить путь до исполняемых файлов JDK, например, для UNIX-подобных систем: \verb|PATH=$PATH:/usr/lib/jvm/jdk1.8.0_221/bin|
\item \code{JAVA_HOME} путь до корня JDK, например, для UNIX-подобных систем: \code{JAVA_HOME=/usr/lib/jvm/jdk1.8.0_221/}
\item \code{JRE_HOME} путь до файлов JRE из состава установленной JDK, например, для UNIX-подобных систем: \code{JRE_HOME=/usr/lib/jvm/jdk1.8.0_221/jre/}
\item \code{J2SDKDIR} устаревшая переменная для JDK, используется некоторыми старыми приложениями, например, для UNIX-подобных систем: \code{J2SDKDIR=/usr/lib/jvm/jdk1.8.0_221/}
@ -171,7 +108,7 @@
\item Какие ещё JVM языки существуют?
\end{enumerate}
\subsubsection{Из чего всё состоит (JDK, JRE, JVM и их друзья)}
\subsection{Из чего всё состоит (JDK, JRE, JVM и их друзья)}
TL;DR:
\begin{itemize}
\item JDK = JRE + инструменты разработчика;
@ -253,7 +190,7 @@ Java Development Kit является изрядно дополненным сп
\end{itemize}
\end{enumerate}
\subsubsection{Структура проекта (пакеты, классы, метод main, комментарии)}
\subsection{Структура проекта (пакеты, классы, метод main, комментарии)}
Проекты могут быть любой сложности. Часто структуру проекта задаёт сборщик проекта, предписывая в каких папках будут храниться исходные коды, исполняемые файлы, ресурсы и документация. Без их использования необходимо задать структуру самостоятельно.
\textbf{Простейший проект} чаще всего состоит из одного файла исходного кода, который возможно скомпилировать и запустить как самостоятельный объект. Отличительная особенность в том, что чаще всего это один или несколько статических методов в одном классе.
@ -367,7 +304,7 @@ public class OtherClass {
\end{itemize}
\end{enumerate}
\subsubsection{Отложим мышки в сторону (CLI: сборка, пакеты, запуск)}
\subsection{Отложим мышки в сторону (CLI: сборка, пакеты, запуск)}
Простейший проект возможно скомпилировать и запустить без использования тяжеловесных сред разработки, введя в командной строке ОС две команды:
\begin{itemize}
\item javac <Name.java> скомпилирует файл исходников и создаст в этой же папке файл с байт-кодом;
@ -426,7 +363,7 @@ Here is your number: 4.
\end{itemize}
\end{enumerate}
\subsubsection{Документирование (Javadoc)}
\subsection{Документирование (Javadoc)}
Документирование конкретных методов и классов всегда ложится на плечи программиста, потому что никто не знает программу и алгоритмы в ней лучше, чем программист. Утилита Javadoc избавляет программиста от необходимости осваивать инструменты создания веб-страниц и записывать туда свою документацию. Достаточно писать хорошо отформатированные комментарии, а остальное Javadoc возьмёт на себя.
\begin{figure}[H]
\centering
@ -461,7 +398,7 @@ Here is your number: 4.
\item \code{{@code "public"}} вставка кода в описание
\end{itemize}
\subsection{Домашнее задание}
\subsection*{Домашнее задание}
\begin{itemize}
\item Создать проект из трёх классов (основной с точкой входа и два класса в другом пакете), которые вместе должны составлять одну программу, позволяющую производить четыре основных математических действия и осуществлять форматированный вывод результатов пользователю.
\item Скомпилировать проект, а также создать для этого проекта стандартную веб-страницу с документацией ко всем пакетам.

68
main-style-preamble.tex Normal file
View File

@ -0,0 +1,68 @@
\usepackage{fancyhdr}
\usepackage{graphicx}
\usepackage{titlesec}
\usepackage{tikz}
\usepackage{indentfirst}
\usepackage{datetime2}
\usepackage{geometry,lscape}
\usepackage{enumitem}
\usepackage{multicol,multirow}
\usepackage{float,adjustbox}
\usepackage{fontawesome}
\usepackage{longtable}
\usepackage{tikz}
\usepackage{hyperref}
\usepackage{forest}
\usepackage{nomencl,imakeidx}
\usetikzlibrary{mindmap,trees}
\usepackage{booktabs}% http://ctan.org/pkg/booktabs
\newcommand{\tabitem}{~~\llap{\textbullet}~~}
\titlelabel{\thetitle. \quad}
\setcounter{tocdepth}{1}
\renewcommand{\nomname}{Термины, определения и сокращения}
\makeindex
\makenomenclature
\babelfont{rm}{PT Astra Serif}
\babelfont{sf}{PT Astra Serif}
\babelfont{tt}{PT Mono}
\newcounter{slidenum}
\setcounter{slidenum}{1} % set to 2 if want to exclude title page of presentation
\newcommand{\showslide}[1]{
\noindent\makebox[\linewidth]{\rule{.90\paperwidth}{1.4pt}}
\begin{center}
\framebox{\includegraphics[page=\arabic{slidenum},width=.85\textwidth]{#1}}
\stepcounter{slidenum}
\end{center}
}
\newcommand\hrf[1]{\hyperref[#1]{\ref{#1}}}
\newcommand\hRf[1]{\hyperref[#1]{\nameref{#1}}}
\newcommand{\wordcount}{\input{/tmp/wordcount.tex}}
\newcommand{\code}[1]{\small{\texttt{\detokenize{#1}}}\normalsize}
\newcommand*{\nom}[2]{#1\nomenclature{#1}{#2}}
\renewcommand\labelitemi{\textemdash}
\newenvironment{frm}
{ \begin{center} \begin{tabular}{|p{0.9\textwidth}|} \hline\\ }
{ \\\\\hline \end{tabular} \end{center} }
\fancypagestyle{plain}{
\setlength{\headheight}{33pt}
\fancyhf{}
\lhead{\includegraphics[height=5mm]{logo.png}}
\rhead{И.И. Овчинников \\ \href{https://t.me/ivanigorevichfeed}{Telegram: ivanigorevichfeed}}
\chead{\thepage}
\cfoot{\faRocket}
\rfoot{Всего слов: \wordcount}
}
\geometry{
left=2cm,
right=1cm,
top=2cm,
bottom=2cm
}
\setlist{nolistsep}
\setlist[itemize]{leftmargin=10mm}
\setlist[enumerate]{leftmargin=10mm}

BIN
scenarios/build/jc-2-a.pdf Normal file

Binary file not shown.

169
scenarios/jc-2-a.tex Normal file
View File

@ -0,0 +1,169 @@
\documentclass[../j-spec.tex]{subfiles}
\begin{document}
\subsection{В предыдущих сериях...}
краткой истории и причинах возникновения язка
что нужно скачать, откуда и как это всё выбирать
из чего всё состоит
изучим простую структуру проекта и способы его запуска
коротко рассмотрим утилиту джавадок
Рассмотрели примитивный инструментарий и базовые возможности платформы для разработки приложений на языке Java.
\subsection{На этом уроке}
Мотивация
Ant, Ivy
Репозитории, артефакты, конфигурации
Maven
Gradle
Собственные прокси, хостинг и закрытая сеть
Немного экзотики: Bazel
\subsection{Понятия и термины урока}
Системы сборки
Ant, Ivy
Maven
Gradle
bazel
Артефакт
Репозиторий
прокси
\subsection{Мотивация}
Зачем собирать проект без IDE и что такое система сборки?
(на предыдущем уроке я говорю, цитирую "для этого достаточно через пробел написать соответствующие ключи компиляции и запуска. Конечно, писать каждый раз эти ключи довольно утомительно и для автоматизации этого процесса придумали сборщики проектов, но всегда круто знать и уметь делать вещи в отсутствие сложного инструментария") эту мысль как раз можно и нужно развить
Теперь, научившись выполнять компиляцию и запуск с использованием большого количества ключей, можно приступить к изучению сложного инструментария, который в свою очередь может скрывать очень обширный объем работы, который ручном подходе требует значительных затрат.
Можно было бы задать вопрос: "Зачем знать команды, если в IDE всё есть?". Здесь есть несколько нюансов:
Как мы упоминали на прошлом уроке существует огромное количество IDE, которые отличаются расположением управляющих кнопок и в принципе своим внешним видом. Если в проекте несколько участников, они все должны использовать одну и ту же IDE и синхронизировать настройки при каждом изменении. То есть, можно запускать приложения в IDE, которую нужно будет поставить на все ПК, разложить исходные коды по нужным папкам, установить все требуемые библиотеки и т.д.;
У сред разработки постоянно меняется интерфейс, с каждым обновлением. Помимо этого, тыкать мышкой в кучу разных диалогов долго и неудобно;
Уметь собирать код без среды разработки — суровая необходимость. Настолько суровая, что для решения этой задачи существует особый класс программного обеспечения, называемого системами сборки.
Система сборки это программа, которая собирает другие программы. На вход система сборки получает исходный код, написанный разработчиком, а на выход выдаёт программу, которую уже можно запустить. Отличается она от компилятора тем, что вызывает его при своей работе, а компилятор о системе сборке и её существовании ничего не знает. Если чуть конкретнее, то сборка, помимо компиляции, содержит в себе ещё целый спектр задач, для решения которых компилятор не предусмотрен. Небольшой список задач для понимания:
загрузить зависимые библиотеки для вашего проекта из сети (репозитория);
скомпилировать классы модуля или всего проекта;
сгенерировать дополнительные файлы: SQL-скрипты, XML-конфиги и т.п.;
удалять/создавать директории и копировать в них указанные файлы;
упаковка скомпилированных классов проекта в архивы различных форматов: zip, rar, rpm, jar, ear, war и др.;
компиляция и запуск модульных тестов (unit-test) вашего проекта с результатами выполнения тестов и расчетом процента покрытия;
установка (deploy) файлов проекта на удаленный сервер;
генерация документации и отчетов.
В конце концов они могут даже вообще код не компилировать, но делать автоматическую рутинную работу: генерация, архивация, операции с файлами, установка на сервер — что позволяет разработчикам эффективнее тратить своё время.
\subsection{Ant, Ivy}
\subsection{Репозитории, артефакты, конфигурации}
\subsection{Maven}
\subsection{Gradle}
\subsection{Собственные прокси, хостинг и закрытая сеть}
\subsection{Немного экзотики: Bazel}
Так же, все системы сборок имеют схожую верхнеуровневую архитектура, которая сводится к следующему:
Конфигурации
собственная конфигурация, где хранятся «личные» настройки системы. Например, такие как информация о месте установки или окружении, информация о репозиториях и прочее;
конфигурация модуля, где описывается место расположения проекта, его зависимости и задачи, которые требуется выполнять для проекта;
Парсеры конфигураций
парсер способный «прочитать» конфигурацию самой системы, для её настройки соответствующим образом;
парсер конфигурации модуля, где некоторыми «понятными человеку» терминами описываются задачи для системы сборки;
Сама система — некоторая утилита + скрипт для её запуска в вашей ОС, которая после чтения всех конфигураций начнет выполнять тот или иной алгоритм, необходимый для реализации запущенной задачи;
Система плагинов — дополнительные подключаемые надстройки для системы, в которых описаны алгоритмы реализации типовых задач;
Локальный репозиторий — репозиторий (некоторое структурированное хранилище некоторых данных), расположенный на локальной машине, для кэширования запрашиваемых файлов на удаленных репозиториях.
Какие есть системы сборки
(чисто обзор и возможно по два предложения с особенностями)
Для Java систем сборок по большому счёту три:
Ant или Ant в сочетании с инструментов по управлению зависимостями Ivy;
Maven;
Gradle и Gradle Wrapper;
Нестандартная для Java система сборки Bazel.
Ant, Ant+Ivy
Первым для автоматизации этих задач появился Ant. Это аналог make-файла, а по сути набор скриптов (которые называются tasks). В отличие от make, утилита Ant полностью независима от платформы, требуется лишь наличие на применяемой системе установленной рабочей среды Java — JRE. Отказ от использования команд операционной системы и формат XML обеспечивают переносимость сценариев.
Управление процессом сборки происходит посредством XML-сценария, также называемого Build-файлом. В первую очередь этот файл содержит определение проекта, состоящего из отдельных целей (Targets). Цели сравнимы с процедурами в языках программирования и содержат вызовы команд-заданий (Tasks). Каждое задание представляет собой неделимую, атомарную команду, выполняющую некоторое элементарное действие.
Между целями могут быть определены зависимости — каждая цель выполняется только после того, как выполнены все цели, от которых она зависит (если они уже были выполнены ранее, повторного выполнения не производится). Типичными примерами целей являются clean (удаление промежуточных файлов), compile (компиляция всех классов), deploy (развёртывание приложения на сервере).
Скачивание и установка, в случае каких-то неисправностей, ant для Linux выполняется командой вроде sudo apt-get install ant, а для Windows можно перейти на сайте ant.apache.org и скачать архив.
Проверить версию можно командой ant -version
Теперь можно написать простой сценарий HelloWorld
<?xml version="1.0"?>
<project name="HelloWorld" default="hello">
<target name="hello">
<echo>Hello, World!</echo>
</target>
</project>
Затем, нужно создать подкаталог hello и сохранить туда файл с именем build.xml, который содержит сценарий. Далее надо перейти в каталог и вызвать ant. Полный перечень команд:
\begin{lstlisting}[language=C,style=CCodeStyle]
$ mkdir hello
$ cd hello
$ ant
Buildfile: /home/hello/build.xml
hello:
[echo] Hello, World!
BUILD SUCCESSFULL
\end{lstlisting}
Теперь нужно бы пояснить, что произошло: система сборки нашла файл сценария с указанным по умолчанию именем build и выполнила цель с именем hello, который указан в теге проекта, с помощью атрибута default со значением hello, а также имя проекта, с помощью атрибута name.
В стандартной версии ant присутствует более 100 заданий, такие как: удаление файлов и директорий (delete), компиляция java-кода (javac), вывод сообщений в консоль (echo) и т.д. Вот пример реализации удаления временных файлов, используя задание delete:
\begin{lstlisting}[language=C,style=CCodeStyle]
<!-- Очистка -->
<target name="clean" description="Removes all temporary files">
<!-- Удаление файлов -->
<delete dir="${build.classes}"/>
</target>
\end{lstlisting}
На данный момент Ant используют в связке с Ivy, которая является гибким, настраиваемым инструментом для управления (записи, отслеживания, разрешения и отчетности) зависимостями Java проекта.
Некоторые достоинства Ivy:
гибкость и конфигурируемость Ivy по существу не зависит от процесса и не привязан к какой-либо методологии или структуре;
тесная интеграция с Apache Ant Ivy доступна как автономный инструмент, однако он особенно хорошо работает с Apache Ant, предоставляя ряд мощных задач от разрешения до создания отчетов и публикации зависимостей;
транзитивность возможность использовать зависимости других зависимостей.
Немного о функциях Ivy:
управление проектными зависимостями;
отчеты о зависимостях. Ivy производит два основных типа отчетов: отчеты HTML и графические отчеты;
Ivy наиболее часто используется для разрешения зависимостей и копирует их в директории проекта. После копирования зависимостей, сборка больше не зависит от Apache Ivy;
расширяемость. Если настроек по умолчанию недостаточно, вы можете расширить конфигурацию для решения вашей проблемы. Например, вы можете подключить свой собственный репозиторий, свой собственный менеджер конфликтов;
XML-управляемая декларация зависимостей проекта и хранилищ JAR;
настраиваемые определения состояний проекта, которые позволяют определить несколько наборов зависимостей.
Apache Ivy обязана быть сконфигурирована, чтобы выполнять поставленные задачи. Конфигурация задается специальным файлом, в котором содержится информация об организации, модуле, ревизии, имени артефакта и его расширении.
Некоторые модули могут использоваться по разному и эти различные пути использования могут требовать своих, конкретных артефактов для работы программы. Кроме того, модуль может требовать одни зависимости во время компиляции и сборки, и другие во время выполнения.
Конфигурация модуля определяется в Ivy файле в формате .xml, он будет использоваться, чтобы обнаружить все зависимости для дальнейшей загрузки артефактов. Понятие «загрузка» артефакта имеет различные варианты выполнения, в зависимости от расположения артефакта: артефакт может находиться на веб-сайте или в локальной файловой системе вашего компьютера. В целом, загрузкой считается передача файла из хранилища в кеш Ivy.
Пример конфигурации зависимостей с библиотекой Lombok:
<ivy-module version="2.0">
<info organisation="org.apache" module="hello-ivy"/>
<dependencies>
<dependency org="org.projectlombok" name="lombok" rev="1.18.24" conf="build->master"/>
</dependencies>
</ivy-module>
Его структура довольно проста, первый корневой элемент <ivy-module version="2.0"> указывает на версию Ivy, с которой данный файл совместим. Следующий тег <info organisation="org.apache" module="hello-ivy"/> содержит информацию о программном модуле, для которого указаны зависимости, здесь определяются название организации разработчика и название модуля, хотя можно написать в данный тег что угодно. Наконец, сегмент <dependencies> позволяет определить зависимости. В данной примере модулю необходимо одна сторонняя библиотека: lombok.
Однако, у такой системы, как Ant есть и свои минусы: Ant-файлы могут разрастаться до нескольких десятков мегабайт по мере увеличения проекта. На маленьких проектах выглядит всё достаточно неплохо, но на больших они длинные и неструктурированные, а потому сложны для понимания.
Что привело к появлению новой системы - Maven.
\end{document}