\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}
\usetikzlibrary{mindmap,trees}

\titlelabel{\thetitle. \quad}
\setcounter{tocdepth}{1}

\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}
\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}


\begin{document}
\maketitle
\tableofcontents
\pagestyle{plain}

\chapter{Java Core}

\section{Платформа: история и окружение}
\subsection*{Конспект лекции}
\subsubsection{Краткая история (причины возникновения)}
\begin{itemize}
\item Язык создавали для разработки встраиваемых систем, сетевых приложений и прикладного ПО;
\item Популярен из-за скорости исполнения и полного абстрагирования от исполнителя кода;
\item Часто используется для программирования бэк-энда веб-приложений из-за изначальной нацеленности на сетевые приложения.
\end{itemize}
\begin{figure}[H]
  \centering
  \includegraphics[width=17cm]{jc-01-tiobe.png}
  \caption{График популярности языков программирования TIOBE}
  \label{pic:java-in-tiobe}
\end{figure}

\subsubsection{Базовый инструментарий, который понадобится (выбор IDE)}
\begin{itemize}
\item NetBeans - хороший, добротный инструмент с лёгким ностальгическим оттенком;
\item Eclipse - для поклонников Eclipse Foundation и швейцарских ножей с полусотней лезвий;
\item IntelliJ IDEA - стандарт де-факто, используется на курсе и в большинстве современных компаний;
\item Android Studio - если заниматься мобильной разработкой.
\end{itemize}

\subsubsection{Что нужно скачать, откуда (как выбрать вендора, выбор версии)}
Для разработки понадобится среда разработки (IDE) и инструментарий разработчика (JDK). JDK выпускается несколькими поставщиками, большинство из них бесплатны и полнофункциональны, то есть поддерживают весь функционал языка и платформы.

В последнее время, с развитием контейнеризации приложений, часто устанавливают инструментарий в Docker-контейнер и ведут разработку прямо в контейнере, это позволяет не захламлять компьютер разработчика разными версиями инструментария и быстро разворачивать свои приложения в CI или на целевом сервере.
\begin{frm}
  В общем случае, для разработки на любом языке программирования нужны так называемые SDK (Software Development Kit, англ. - инструментарий разработчика приложений или инструментарий для разработки приложений). Частный случай такого SDK - инструментарий разработчика на языке Java - Java Development Kit.
\end{frm}
На курсе будет использоваться BellSoft Liberica JDK 11, но возможно использовать и других производителей, например, самую распространённую Oracle JDK. Производителя следует выбирать из требований по лицензированию, так, например, Oracle JDK можно использовать бесплатно только в личных целях, за коммерческую разработку с использованием этого инструментария придётся заплатить.

Также возможно использовать и другие версии, но не старше 1.8. Это обосновано тем, что основные разработки на данный момент только начинают обновлять инструментарий до более новых версий (часто 11 или 13) или вовсе переходят на другие JVM-языки, такие как Scala, Groovy или Kotlin.

Для решения некоторых несложных задач курса мы будем писать простые приложения, не содержащие ООП, сложных взаимосвязей и проверок, в этом случае нам понадобится Jupyter notebook с установленным ядром (kernel) IJava.

\subsubsection{Из чего всё состоит (JDK, JRE, JVM и их друзья)}
TL;DR:
\begin{itemize}
\item JDK = JRE + инструменты разработчика; 
\item JRE = JVM + библиотеки классов; 
\item JVM = Native API + механизм исполнения + управление памятью.
\end{itemize}

Как именно всё работает? Если коротко, то слой за слоем накладывая абстракции. Программы на любом языке программирования исполняются на компьютере, то есть, так или иначе, задействуют процессор, оперативную память и прочие аппаратурные компоненты. Эти аппаратурные компоненты предоставляют для доступа к себе низкоуровневые интерфейсы, которые задействует операционная система, предоставляя в свою очередь интерфейс чуть проще программам, взаимодействующим с ней. Этот интерфейс взаимодействия с ОС мы для простоты будем называть Native API.

С ОС взаимодействует JVM, то есть, используя Native API, нам становится всё равно, какая именно ОС установлена на компьютере, главное уметь выполняться на JVM. Это открывает простор для создания целой группы языков, они носят общее бытовое название JVM-языки, к ним относят Scala, Groovy, Kotlin и другие. Внутри JVM осуществляется управление памятью, существует механизм исполнения программ, специальный JIT\footnote{JIT, just-in-time - англ. в\'{о}время, прямо сейчас}-компилятор.

% далее тут надо подробнее расписать ЖВМ

На пользовательском уровне важно не только исполнять программы, но чтобы эти программы умели как-то взаимодействовать с другими программами и другими аспектами внешнего мира, поэтому JVM интегрирована в JRE - Java Runtime Environment. JRE - это набор из классов и интерфейсов, осуществляющих взаимодействия с 

В таблице \hrf{table:jdk-contents}, приведена примерная структура и состав JDK, а также указаны основные и наиболее часто используемые компоненты.

\begin{table}
  \centering
\begin{adjustbox}{angle=90}
\begin{tabular}{|l|ll|llllllll|}
\cline{1-1} \cline{4-11}
\multirow{15}{*}{\rotatebox[origin=c]{270}{Java Development Kit }} &                           &  & \multicolumn{8}{l|}{Language}                                                                                                                                                                                                                                                                             \\ \cline{4-11} 
 &                        &                                                                       & \multicolumn{1}{l|}{\multirow{3}{25mm}{tools + tools api}}            & \multicolumn{1}{l|}{javac}     & \multicolumn{1}{l|}{java}                & \multicolumn{1}{l|}{javadoc}  & \multicolumn{1}{l|}{javap}        & \multicolumn{1}{l|}{jar}       & \multicolumn{2}{l|}{JPDA}                        \\ \cline{5-11} 
 &                        &                                                                       & \multicolumn{1}{l|}{}                                                 & \multicolumn{1}{l|}{JConsole}  & \multicolumn{1}{p{25mm}|}{JavaVisualVM}  & \multicolumn{1}{l|}{JMC}      & \multicolumn{1}{l|}{JFR}          & \multicolumn{1}{l|}{Java DB}   & \multicolumn{1}{l|}{Int'l}         & JVM TI      \\ \cline{5-11} 
 &                        &                                                                       & \multicolumn{1}{l|}{}                                                 & \multicolumn{1}{l|}{IDL}       & \multicolumn{1}{l|}{Troubleshoot}        & \multicolumn{1}{l|}{Security} & \multicolumn{1}{l|}{Deploy}       & \multicolumn{1}{l|}{Scripting} & \multicolumn{1}{l|}{Web services}  & RMI         \\ \cline{2-2} \cline{4-11} 
 & \multicolumn{1}{l|}{\multirow{11}{*}{\rotatebox[origin=c]{270}{Java Runtime Environment }}} &  & \multicolumn{1}{l|}{deployment}                                       & \multicolumn{4}{l|}{Java Web}                                                                                                                 & \multicolumn{3}{l|}{Applet/Java plug-in}                                          \\ \cline{3-11} 
 & \multicolumn{1}{l|}{}  & \multirow{10}{*}{\rotatebox[origin=c]{270}{Java Standard Edition }}   & \multicolumn{1}{l|}{\multirow{2}{*}{UI toolkit}}                      & \multicolumn{2}{l|}{Swing}                                                & \multicolumn{2}{l|}{Java 2D}                                      & \multicolumn{1}{l|}{AWT}       & \multicolumn{2}{l|}{Accessibility}               \\ \cline{5-11} 
 & \multicolumn{1}{l|}{}  &                                                                       & \multicolumn{1}{l|}{}                                                 & \multicolumn{2}{l|}{Drag'n'Drop}                                          & \multicolumn{2}{l|}{Input Methods}                                & \multicolumn{1}{l|}{Image I/O} & \multicolumn{1}{l|}{Print Service} & Sound       \\ \cline{4-11} 
 & \multicolumn{1}{l|}{}  &                                                                       & \multicolumn{1}{p{25mm}|}{Integration libraries}                      & \multicolumn{1}{l|}{IDL}       & \multicolumn{1}{l|}{JDBC}                & \multicolumn{1}{l|}{JNDI}     & \multicolumn{1}{l|}{RMI}          & \multicolumn{1}{l|}{RMI-IIOP}  & \multicolumn{2}{l|}{Scripting}                   \\ \cline{4-11} 
 & \multicolumn{1}{l|}{}  &                                                                       & \multicolumn{1}{l|}{\multirow{3}{25mm}{Other base libraries}}         & \multicolumn{2}{l|}{Override Mechanism}                                   & \multicolumn{2}{l|}{Intl Support}                                 & \multicolumn{2}{l|}{Input/Output}                                   & JMX         \\ \cline{5-11} 
 & \multicolumn{1}{l|}{}  &                                                                       & \multicolumn{1}{l|}{}                                                 & \multicolumn{2}{l|}{XML JAXP}                                             & \multicolumn{2}{l|}{Math}                                         & \multicolumn{2}{l|}{Networking}                                     & Beans       \\ \cline{5-11} 
 & \multicolumn{1}{l|}{}  &                                                                       & \multicolumn{1}{l|}{}                                                 & \multicolumn{2}{l|}{Security}                                             & \multicolumn{2}{l|}{Serialization}                                & \multicolumn{2}{l|}{Extension Mechanism}                            & JNI         \\ \cline{4-11} 
 & \multicolumn{1}{l|}{}  &                                                                       & \multicolumn{1}{l|}{\multirow{3}{25mm}{Java lang and util base libs}} & \multicolumn{1}{l|}{JAR}       & \multicolumn{1}{l|}{Lang and util}       & \multicolumn{2}{l|}{Ref Objects}                                  & \multicolumn{2}{l|}{Preference API}                                 & Reflection  \\ \cline{5-11} 
 & \multicolumn{1}{l|}{}  &                                                                       & \multicolumn{1}{l|}{}                                                 & \multicolumn{1}{l|}{Zip}       & \multicolumn{1}{l|}{Management}          & \multicolumn{2}{l|}{Instrumentation}                              & \multicolumn{2}{l|}{Stream API}                                     & Collections \\ \cline{5-11} 
 & \multicolumn{1}{l|}{}  &                                                                       & \multicolumn{1}{l|}{}                                                 & \multicolumn{1}{l|}{Logging}   & \multicolumn{1}{p{25mm}|}{Regular Expressions} & \multicolumn{2}{l|}{Concurrency Utilities}                  & \multicolumn{2}{l|}{Datetime}                                       & Versioning  \\ \cline{4-11} 
 & \multicolumn{1}{l|}{}  &                                                                       & \multicolumn{1}{l|}{JVM}                                              & \multicolumn{7}{l|}{Java Hot Spot VM (JIT)}                                                                                                                                                                                       \\ \hline
\end{tabular}
\end{adjustbox}
\label{table:jdk-contents}
\caption{Общее представление состава JDK}
\end{table}


\subsubsection{Структура проекта (пакеты, классы, метод main, комментарии)}
\subsubsection{Отложим мышки в сторону (CLI: сборка, пакеты, запуск)}
\subsubsection{Документирование (Javadoc)}

\subsection*{Задания к семинару}
\begin{itemize}
\item Скомпилировать проект из трёх классов, находящихся в двух пакетах, а также создать для этого проекта стандартную веб-страницу с документацией
\end{itemize}
\subsection*{Сценарий лекции}
%\subfile{scenarios/jc-1-c}


\section{Управление проектом: сборщики проектов}
Управление проектом: Jar-файлы; Gradle/Maven: зависимости, выгрузка артефакта, публичные репозитории, свойства проекта, приватные репозитории (хостинг); Bazel
\subsection*{Задания к семинару}
\begin{itemize}
\item Создать загружаемый артефакт с функцией суммирования двух чисел и загрузить его в локальный кэш артефактов;
\end{itemize}

\section{Специализация: данные и функции}
Базовые функции языка: математические операторы, условия, циклы, бинарные операторы; Данные: типы, преобразование типов, константы и переменные (примитивные, ссылочные), бинарное представление, массивы (ссылочная природа массивов, индексация, манипуляция данными); Функции: параметры, возвращаемые значения, перегрузка функций;
\subsection*{Задания к семинару}
\begin{itemize}
\item Написать как можно больше вариантов функции инвертирования массива единиц и нулей за 15 минут (без ветвлений любого рода);
\item Сравнить без условий две даты, представленные в виде трёх чисел гггг-мм-дд;
\end{itemize}

\section{Специализация: ООП}
Инкапсуляция: Классы и объекты (внутренние классы, вложенные классы, static, private/public, final, интерфейс взаимодействия с объектом), перечисления (создание, конструкторы перечислений, объекты перечислений, дополнительные свойства); Наследование: extends, Object (глобальное наследование), protected, преобразование типов, final; Полиморфизм: override, abstract, final;
%\subfile{scenarios/jc-4}

\section{Специализация: Тонкости работы}
Файловая система и представление данных; Пакеты \code{java.io}, \code{java.nio}, \code{String}, \code{StringBuilder}, string pool, ?JSON/XML?


  
\chapter{Java Development Kit}
\section{Исключения}
Механизм и понятие, введение в \textbf{многопоточность}, throw; Наследование и полиморфизм в исключениях; Способы обработки исключений (try/catch, throws, finally); try-with-resources, штатные и нештатные ситуации

\section{Интерфейсы}
Понятие и принцип работы, implements; Наследование и множественное наследование интерфейсов; Значения по-умолчанию

\section{Обобщённое программирование}

\section{Коллекции}
List, Set; Хэш-код, интерфейс Comparable; Map, Object (Использование методов, Переопределение методов); Итераторы, \textbf{Многопоточные} коллекции

\section{Многопоточность}
Понятие, Принцип (реальная и псевдопараллельность); Runnable, Thread (Свойства, Особенности создания); Deadlock, Состояние гонки, Object (Ожидание/уведомление); Синхронизация (Синхронизация по монитору, Частичная, по классу)

\section{Графический интерфейс пользователя}
GUI (Swing): Окна и свойства окон, \textbf{Многопоточность} и абстргирование асинхронных вызовов; менеджеры размещений и проведение параллелей с веб-фреймворками, разделение на фронт-энд и бэк-энд; JPanel и рисование, Обработка действий пользователя


\chapter{Java Junior}
\section{JDBC}

\section{Сетевое программирование}
Socket, ServerSocket, Многопоточность, абстрагирование сетевого взаимодействия, интерфейсы

\section{Введение в архитектуры приложений на Java}
клиент-серверы, веб-приложения, сервлеты, толстые и тонкие клиенты, выделение бизнес-логики и хранения, создание общих пространств и модульность проекта

\section{Сериализация, StreamAPI, ReflectionAPI}

\section{Введение в Java EE}

\section{Введение в Spring framework}


\chapter{Java Junior+}

\end{document}

