\documentclass[../j-spec.tex]{subfiles}

\begin{document}
\sloppy
\section{Семинар: компиляция и интерпретация кода}
\subsection{Инструментарий}
\begin{itemize}
\item \href{https://docs.google.com/presentation/d/1LPMWfXpjkJDOMR4lv7y5Ss6_ABSocZtoc7nVEVs6FQo}{Презентация для преподавателя}, ведущего семинар;
\item \href{https://drive.google.com/file/d/1LWyE8aEy4-1gsognqhXIXwDcoLviVge4/view}{Фон} GeekBrains для проведения семинара в Zoom;
\item \href{https://jupyter.org/install}{Jupyter Notebook} для практики и примеров используется Jupyter notebook (потребуется установить \href{https://www.python.org/downloads/}{Python} и ядро \href{https://github.com/SpencerPark/IJava}{IJava}) и любой терминал операционной системы (bash, zsh, cmd);
\item JDK любая 11 версии и выше;
\item \href{https://docs.docker.com/get-docker}{Docker}, \href{https://www.gnu.org/software/automake/}{make}.
\end{itemize}

\subsection{Цели семинара}
\begin{itemize}
\item Закрепить полученные на лекции знания, касающиеся компиляции, интерпретации кода и создания программной документации;
\item Получить практический навык настройки терминала ОС для компиляции и исполнения кода, установки сторонних библиотек для интерпретации;
\item Попрактиковаться в написании терминальных команд и простых проектов. Лучше понять принцип импортирования кода и сборки проекта.
\end{itemize}

\subsection{План-содержание}
\noindent
\begin{spreadtab}{{longtable}{|p{37mm}|l|l|p{90mm}|}}
\hline
 @ Что происходит         & @ Время     & @ Слайды & @ Описание \\
\hline
\endhead
 @ Организационный момент & 5 tag(beg)  & @ 1-4    & @ Преподаватель ожидает студентов, поддерживает активность и коммуникацию в чате, озвучиает цели и планы на семинар. Важно упомянуть, что выполнение домашних заданий с лекции является, фактически, подготовкой к семинару \\
\hline
 @ Quiz                   & 5           & @ 3-14   & @ Преподаватель задаёт вопросы викторины, через 30 секунд демонстрирует слайд-подсказку и ожидает ответов (4 вопроса, по минуте на ответ) \\
\hline
 @ Рассмотрение ДЗ        & 15          & @ 15-18  & @ Преподаватель демонстрирует свой вариант решения домашнего задания с лекции, возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов \\
\hline
 @ Вопросы и ответы       & 10          & @ 19     & @ Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы \\
\hline
 @ Задание 1              & 10          & @ 20-22  & @ Создать, скомпилировать, запустить и продемонстрировать простой проект без использования среды разработки. Показать выполненные терминальные команды, результат компиляции. (* отделить исходный код от скомпилированных файлов, ** сложить исходный код в пакет) \\
\hline
 @ Перерыв (если нужен)   & 5           & @ 26     & @ Преподаватель предлагает студентам перерыв на 5 минут (студенты голосуют) \\ 
\hline
 @ Задание 2              & 10          & @ 23-25  & @ Настроить окружение Jupyter Notebook с ядром Java, создать одну ячейку с переменной, а вторую с выводом значения этой переменной стандартным способом. Дополнить ячейки описанием markdown. (* осуществить форматированный вывод, ** сохранить форматирующую строку в ячейке с переменной) \\
\hline
 @ Задание 3              & 15          & @ 27-29  & @ К проекту из задания 1 добавить ещё один класс в соседнем пакете, как это было показано на лекции и комментарии в стиле Javadoc. Комментарии необходимо добавить как к методам, так и к классам. Сгенерировать программную документацию. (* создать документацию на каждый пакет по отдельности) \\
\hline
 @ Домашнее задание       & 5           & @ 39     & @ Объясните домашнее задание, подведите итоги урока \\ 
\hline
 @ Рефлексия              & 10 tag(end) & @ 40-42  & @ Преподаватель запрашивает обратную связь \\
\hline
 @ Длительность           & sum(cell(beg):cell(end)) & & \\
\hline
\end{spreadtab}

\subsection{Подробности}
\subsubsection{Организационный момент}
\begin{itemize}
\item \textbf{Цель этапа:} Позитивно начать урок, создать комфортную среду для обучения.
\item \textbf{Тайминг:} 3-5 минут.
\item \textbf{Действия преподавателя:}
  \begin{itemize}
  \item Презентует название курса (первый раз) и семинара;
  \item Рассказывает немного о себе;
  \item Запрашивает активность от аудитории в чате;
  \item Презентует цели курса и семинара;
  \item Презентует краткий план семинара и что студент научится делать.
  \end{itemize}
\end{itemize}

\subsubsection{Quiz}
\begin{itemize}
\item \textbf{Цель этапа:} Вовлечение аудитории в обратную связь.
\item \textbf{Тайминг:} 5-7 минут (4 вопроса, по минуте на ответ).
\item \textbf{Действия преподавателя:}
  \begin{itemize}
  \item Преподаватель задаёт вопросы викторины, представленные на слайдах презентации;
  \item через 30 секунд демонстрирует слайд-подсказку и ожидает ответов.
  \end{itemize}
\item \textbf{Вопросы и ответы:}
  \begin{enumerate}
  \item Какой механизм используется для непосредственного исполнения скомпилированного кода? (3)
    \begin{enumerate}
    \item JDK;
    \item JRE;
    \item JVM.
    \end{enumerate}
  \item Какая сущность только объединяет классы по смыслу? (1)
    \begin{enumerate}
    \item Пакеты;
    \item Библиотеки;
    \item Фреймворки.
    \end{enumerate}
  \item Основная единица исходного кода программы -- это? (2)
    \begin{enumerate}
    \item Функция;
    \item Класс;
    \item Файл.
    \end{enumerate}
  \item Какой ключ используется для указания папки назначения? (1)
    \begin{enumerate}
    \item \code{-d};
    \item \code{-out};
    \item \code{-to}.
    \end{enumerate}
  \end{enumerate}
\end{itemize}

\subsubsection{Рассмотрение ДЗ}
\begin{itemize}
\item \textbf{Цель этапа:} Пояснить неочевидные моменты в формулировке ДЗ с лекции, синхронизировать прочитанный на лекции материал к началу семинара.
\item \textbf{Тайминг:} 15-20 минут.
\item \textbf{Действия преподавателя:}
  \begin{itemize}
  \item Преподаватель демонстрирует свой вариант решения домашнего задания из лекции;
  \item возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов.
  \end{itemize}
\item \textbf{Домашнее задание из лекции:}
  \begin{itemize}
  \item Создать проект из трёх классов (основной с точкой входа и два класса в другом пакете), которые вместе должны составлять одну программу, позволяющую производить четыре основных математических действия и осуществлять форматированный вывод результатов пользователю.

    \textbf{Вариант решения}

    \begin{figure}[H]
      \centering
      \includegraphics[width=100mm]{sem-01-struct.png}
      \caption{Структура проекта}
    \end{figure}

    \lstinputlisting[language=Java,style=JCodeStyle,caption={Код основного класса}]{src/s01-h01-Main.java}

    \lstinputlisting[language=Java,style=JCodeStyle,caption={Код считающего класса}]{src/s01-h01-OtherClass.java}

    \lstinputlisting[language=Java,style=JCodeStyle,caption={Код декоратора}]{src/s01-h01-Decorator.java}
  \item Скомпилировать проект, а также создать для этого проекта стандартную веб-страницу с документацией ко всем пакетам.

    \textbf{Вариант решения}

    \begin{lstlisting}[language=bash,style=ASMStyle,caption={Команды компиляции}]
javac -sourcepath ./src -d out src/ru/gb/jcore/sample/Main.java
java -classpath ./out ru.gb.jcore.sample.Main
    \end{lstlisting}

    \begin{figure}[H]
      \centering
      \includegraphics[width=60mm]{sem-01-hw2-compile.png}
      \caption{Результат компиляции}
    \end{figure}

    \begin{lstlisting}[language=bash,style=ASMStyle,caption={Команда создания документации}]
javadoc -d docs -sourcepath ./src -cp ./out -subpackages ru
    \end{lstlisting}

    \begin{figure}[H]
      \centering
      \includegraphics[width=120mm]{sem-01-hw2-doc.png}
      \caption{Результат создания документации}
    \end{figure}

  \item Создать Makefile с задачами сборки, очистки и создания документации на весь проект.

    \textbf{Вариант решения}\footnote{Обратите внимание, что все отступы сделаны не пробелами, а табуляцией, иначе Makefile не работает}

    \lstinputlisting[style=CCodeStyle,caption={Makefile}]{src/s01-h03-Makefile}

    \begin{figure}[H]
      \centering
      \includegraphics[width=80mm]{sem-01-hw03.png}
      \caption{Результат выполнения тасков}
    \end{figure}

  \item *Создать два Docker-образа. Один должен компилировать Java-проект обратно в папку на компьютере пользователя, а второй забирать скомпилированные классы и исполнять их.

    \textbf{Вариант решения}

    Для упрощения был использован docker compose, вместо чистого Docker. Файлы, компилирующие и исполняющие программу представлены в листингах ниже. Оба эти файла запускаются из корня папки проекта командами

    \begin{verbatim}
docker compose -f docker-compose-class.yml up
docker compose -f docker-compose-exec.yml up
    \end{verbatim}
    соответственно.
    
    \lstinputlisting[style=CCodeStyle,caption={docker-compose-class.yml}]{src/s01-h04-docker-compose-class.yml}

    \lstinputlisting[style=CCodeStyle,caption={docker-compose-exec.yml}]{src/s01-h04-docker-compose-exec.yml}
    
  \end{itemize}
\end{itemize}

\subsubsection{Вопросы и ответы}
\begin{itemize}
\item \textbf{Ценность этапа} Вовлечение аудитории в обратную связь, пояснение неочевидных моментов в материале лекции и другой проделанной работе. 
\item \textbf{Тайминг} 5-15 минут
\item \textbf{Действия преподавателя}
  \begin{itemize}
  \item Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы;
  \item Если преподаватель затрудняется с ответом, необходимо мягко предложить студенту ответить на его вопрос на следующем семинаре (и не забыть найти ответ на вопрос студента!);
  \item Предложить и показать пути самостоятельного поиска студентом ответа на заданный вопрос;
  \item Посоветовать литературу на тему заданного вопроса;
  \item Дополнительно указать на то, что все сведения для выполнения домашнего задания, прохождения викторины и работы на семинаре были рассмотрены в методическом материале к этому или предыдущим урокам.
  \end{itemize}
\end{itemize}

\subsubsection{Задание 1}
\begin{itemize}
\item \textbf{Ценность этапа} Создание, компиляция и запуск проектов без использования среды разработки. 
\item \textbf{Тайминг} 10-20 минут.
\item \textbf{Действия преподавателя}
  \begin{itemize}
  \item Пояснить студентам ценность этого опыта (запуск приложений на сервере, в контейнерах, настройка CI/CD в пет-проектах);
  \item Выдать задание группам студентов, показать где именно следует искать терминал ОС;
  \item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
  \end{itemize}
\item \textbf{Задания}:
  \begin{itemize}
  \item Создать, скомпилировать, запустить и продемонстрировать простой проект без использования среды разработки.

    \textbf{Вариант решения}
    \begin{lstlisting}[language=Java,style=JCodeStyle,caption={Простейший проект}]
public class Main { 
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}
    \end{lstlisting}

    \begin{lstlisting}[language=bash,style=ASMStyle,caption={Команды компиляции}]
javac Main.java 
java Main        
    \end{lstlisting}
    
  \item [$*_1$] отделить исходный код от скомпилированных файлов

    \textbf{Вариант решения}
    \begin{lstlisting}[style=ASMStyle]
javac -d out Main.java
java -classpath ./out Main
    \end{lstlisting}

  \item [$*_2$] сложить исходный код в пакет с глубиной иерархии не менее 3.

    \textbf{Вариант решения}

    Вручную создать соответствующие вложенные папки, переместить в них файл с исходным кодом \code{Main.java} и написать оператор \code{package} первой строкой файла \code{Main.java}.
    \begin{lstlisting}[style=ASMStyle]
javac -d out ru/gb/jcore/Main.java
java -classpath ./out ru.gb.jcore.Main
    \end{lstlisting}
  \end{itemize}
\end{itemize}

\subsubsection{Задание 2}
\begin{itemize}
\item \textbf{Ценность этапа} Настройка и изучение дополнительного инструментария для создания проектов и описания работы фрагментов кода в виде Jupyter notebook.
\item \textbf{Тайминг} 10-15 минут.
\item \textbf{Действия преподавателя}
  \begin{itemize}
  \item Пояснить студентам ценность этого опыта (использование скриптовых возможностей среды разработки, таких как написание простых фрагментов кода без необходимости создавать большой проект в тяжеловесной среде разработки);
  \item Пояснить студентам в каком виде выполнять и сдавать задания;
  \item Выдать задание группам студентов, показать где и как скачивать необходимый инструментарий, если он ещё не установлен;
  \item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
  \end{itemize}
\item \textbf{Задания}
  \begin{itemize}
  \item Настроить окружение Jupyter Notebook с ядром IJava, создать одну ячейку с переменной, а вторую с выводом значения этой переменной стандартным способом. Дополнить ячейки описанием markdown.

    \begin{figure}[H]
      \centering
      \includegraphics[width=120mm]{sem-01-t2-1.png}
      \caption{Вариант решения}
    \end{figure}

  \item [$*_1$] осуществить форматированный вывод
    \begin{lstlisting}[language=Java,style=JCodeStyle,caption={Вариант решения (вторая ячейка)}]
System.out.print("Your number is " + a);
    \end{lstlisting}

  \item [$*_2$] сохранить форматирующую строку в ячейке с переменной
    \begin{figure}[H]
      \centering
      \includegraphics[width=120mm]{sem-01-t2-2.png}
      \caption{Вариант решения}
    \end{figure}

  \end{itemize}
\end{itemize}

\subsubsection{Задание 3}
\begin{itemize}
\item \textbf{Ценность этапа} Закрепление навыков создания стандартной программной документации. 
\item \textbf{Тайминг} 15-20 минут
\item \textbf{Действия преподавателя}
  \begin{itemize}
  \item Пояснить студентам ценность этого опыта (описание пет-проектов для потенциальных соисполнителей, создание базы знаний по проекту на случай длительных пауз в работе)
  \item Выдать задание группам студентов
  \item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдать группе задание «со звёздочкой».
  \end{itemize}
\item \textbf{Задания}
  \begin{itemize}
  \item К проекту из задания 1 добавить ещё один класс в соседнем пакете, как это было показано на лекции, и комментарии в стиле Javadoc. Комментарии необходимо добавить как к методам, так и к классам. Сгенерировать общую программную документацию.

    \textbf{Вариант решения}
    \begin{figure}[H]
      \centering
      \includegraphics[width=80mm]{sem-01-t3-1.png}
      \caption{Иерархия получившегося проекта}
    \end{figure}

    \lstinputlisting[language=Java,style=JCodeStyle,caption={Основной класс}]{src/s01-t3-Simple.java}

    \lstinputlisting[language=Java,style=JCodeStyle,caption={Вспомогательный класс}]{src/s01-t3-Complex.java}

    \begin{lstlisting}[language=bash,style=ASMStyle,caption={Команды компиляции и создания документации}]
javac -sourcepath . -d out ru/gb/Simple.java
java -classpath ./out ru.gb.Simple           
javadoc -d doc -sourcepath . -cp ./out -subpackages ru 
    \end{lstlisting}
    
  \item [$*_1$] создать документацию на каждый пакет по отдельности

    \begin{lstlisting}[language=bash,style=ASMStyle,caption={Вариант решения}]
javadoc -d doc_gb -sourcepath . -cp ./out ru.gb
javadoc -d doc_bg -sourcepath . -cp ./out ru.bg
    \end{lstlisting}
  \end{itemize}
\end{itemize}

\subsubsection{Домашнее задание}
\begin{itemize}
\item \textbf{Ценность этапа} Задать задание для самостоятельного выполнения между занятиями. 
\item \textbf{Тайминг} 5-10 минут.
\item \textbf{Действия преподавателя}
  \begin{itemize}
  \item Пояснить студентам в каком виде выполнять и сдавать задания
  \item Уточнить кто будет проверять работы (преподаватель или ревьювер)
  \item Объяснить к кому обращаться за помощью и где искать подсказки
  \item Объяснить где взять проект заготовки для дз
  \end{itemize}
\item \textbf{Задания}
  \begin{enumerate}
  \item [5-25 мин] Решить все задания (в том числе «со звёздочкой»), если они не были решены на семинаре, без ограничений по времени;

    Все варианты решения приведены в тексте семинара выше
  \item [10-15 мин] Создать docker-контейнер для формирования полной документации по проекту

    \lstinputlisting[style=CCodeStyle,caption={docker-compose-class.yml}]{src/s01-hw2-docker-compose-docs.yml}

  \end{enumerate}
\end{itemize}

\subsubsection{Рефлексия и завершение семинара}
\begin{itemize}
\item \textbf{Цель этапа:} Привести урок к логическому завершению, посмотреть что студентам удалось, что было сложно и над чем нужно еще поработать
\item \textbf{Тайминг:} 5-10 минут
\item \textbf{Действия преподавателя:}
  \begin{itemize}
  \item Запросить обратную связь от студентов.
  \item Подчеркните то, чему студенты научились на занятии. 
  \item Дайте рекомендации по решению заданий, если в этом есть необходимость
  \item Дайте краткую обратную связь студентам.
  \item Поделитесь ощущением от семинара.
  \item Поблагодарите за проделанную работу.
  \end{itemize}
\end{itemize}

\end{document}
