feat: Add LaTeX Docker chapter; update metadata and previous chapters

This commit is contained in:
Payton Bates committed 2026-10-05 18:56:10 -04:00
1 parent 02189faab0
commit c9d06e0b5a
15 files changed
+211 -47

No files matched your search

+1
View File
@@ -22,5 +22,6 @@
*.lot *.lot
*.lol *.lol
*.pdf *.pdf
!figures/*.pdf
*.data.minted *.data.minted
_minted*/ _minted*/
+3
View File
@@ -11,3 +11,6 @@
development environment, physical or virtual, with an assigned role and owner}} development environment, physical or virtual, with an assigned role and owner}}
\newglossaryentry{kanban}{name={Kanban board},description={A visual board that \newglossaryentry{kanban}{name={Kanban board},description={A visual board that
represents each unit of work as a card in a column denoting its state}} represents each unit of work as a card in a column denoting its state}}
\newglossaryentry{texlive}{name={TeX Live},description={A cross-platform
distribution of the \TeX\ engines, \LaTeX\ packages, fonts, and tools; the
distribution Overleaf compiles with}}
+8 -4
View File
@@ -55,7 +55,12 @@ static public directory. Both outcomes were verified locally and on AWS.
\paragraph{Dockerfile} \paragraph{Dockerfile}
\inputminted{docker}{docker/color-buttons/Dockerfile} \inputminted{docker}{docker/color-buttons/Dockerfile}
\paragraph{.dockerignore} \paragraph{.dockerignore}
\inputminted{text}{docker/color-buttons/.dockerignore} \begin{minted}{text}
node_modules
npm-debug.log
.git
.DS_Store
\end{minted}
\section{Deployment Procedure} \section{Deployment Procedure}
The commands below reproduce the recorded setup and successful configuration. The commands below reproduce the recorded setup and successful configuration.
@@ -116,9 +121,8 @@ to all container interfaces, and the AWS security group permits public HTTP.
\section{Verification Evidence} \section{Verification Evidence}
The terminal screenshot shows container \texttt{70ed56f7fae8} running, the The terminal screenshot shows container \texttt{70ed56f7fae8} running, the
\texttt{80->3000/tcp} mapping, the server startup message, and \texttt{80->3000/tcp} mapping, the server startup message, and
\texttt{HTTP/1.1 200 OK}. Public-browser screenshots record the initial white \texttt{HTTP/1.1 200 OK}. Public-browser screenshots record the Blue and Red outcomes.
state and the Blue and Red outcomes. These figures are supplied execution These figures are supplied execution evidence, not generated illustrations.
evidence, not generated illustrations.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
+26 -30
View File
@@ -7,11 +7,11 @@
\index{Amazon EC2} \index{Amazon EC2}
\section{Purpose} \section{Purpose}
This chapter names the hosts that will make up the development environment for This chapter names the hosts that make up the development environment for
\CourseNumber\ and records the role, platform, and ownership of each. It is an \CourseNumber\ and records the role, platform, owner, and status of each.
inventory of intent: no machine listed here has been provisioned, and the chapter therefore Hosts in service are described here at inventory level; their configuration
presents no execution \gls{evidence}. It is expected to grow as later and execution \gls{evidence} are recorded in the chapter for the activity that
assignments add services to the environment. uses them. The inventory may grow or change depending on assignment requirements.
\section{Naming Convention} \section{Naming Convention}
\index{hosts!naming} \index{hosts!naming}
@@ -29,22 +29,23 @@ The \textbf{Status} column distinguishes machines already in use from those that
will be configured in a later assignment. A host is marked \emph{In service} will be configured in a later assignment. A host is marked \emph{In service}
only once it exists and is reachable. only once it exists and is reachable.
\begin{tabularx}{\linewidth}{L{3.0cm}YL{3.3cm}L{2.0cm}} \begin{tabularx}{\linewidth}{L{3.5cm}YL{3.0cm}L{2.2cm}}
\caption{Planned Host Inventory\label{Table:HostInventory}}\\ \caption{Host Inventory\label{Table:HostInventory}}\\
\toprule \textbf{Host name} & \textbf{Role} & \textbf{Platform} & \textbf{Status}\\ \midrule \toprule \textbf{Host name} & \textbf{Role} & \textbf{Platform} & \textbf{Status}\\ \midrule
\endfirsthead \endfirsthead
\multicolumn{4}{l}{\small\itshape Planned Host Inventory (continued)}\\ \multicolumn{4}{l}{\small\itshape Host Inventory (continued)}\\
\toprule \textbf{Host name} & \textbf{Role} & \textbf{Platform} & \textbf{Status}\\ \midrule \toprule \textbf{Host name} & \textbf{Role} & \textbf{Platform} & \textbf{Status}\\ \midrule
\endhead \bottomrule \endlastfoot \endhead \bottomrule \endlastfoot
\texttt{ssw590-group-web} & Group deployment target. Runs the website in \ChapterRef{CloudDockerDeployment}. & Ubuntu 26.04 LTS on Amazon EC2, \texttt{t3.micro} & In service\\
\texttt{ssw590-dev-01} & Primary Linux host for the course. Target for service configuration, deployment exercises, and command-line work. & Ubuntu Server LTS on Amazon EC2 & Planned\\ \texttt{ssw590-dev-01} & Primary Linux host for the course. Target for service configuration, deployment exercises, and command-line work. & Ubuntu Server LTS on Amazon EC2 & Planned\\
\texttt{ssw590-build-01} & Build and integration host, kept separate from the deployment target so that a failed build cannot disturb a running service. To be provisioned only if a later assignment requires it. & Ubuntu Server LTS on Amazon EC2 & Conditional\\
\end{tabularx} \end{tabularx}
\section{Access and Ownership} \section{Access and Ownership}
\index{hosts!access model} \index{hosts!access model}
\index{least privilege} \index{least privilege}
All hosts listed above are owned and administered by the author. The following \texttt{ssw590-group-web} is shared by both authors and runs under Victor's AWS account,
rules govern access to the Linux hosts once they are provisioned. where each author has a separate IAM identity. The following rules are the target access policy
for course Linux hosts:
\begin{itemize}[leftmargin=*] \begin{itemize}[leftmargin=*]
\item Interactive access is by \gls{ssh} public key only. \item Interactive access is by \gls{ssh} public key only.
@@ -55,29 +56,24 @@ rules govern access to the Linux hosts once they are provisioned.
\item Day-to-day work is performed by an unprivileged account. Administrative \item Day-to-day work is performed by an unprivileged account. Administrative
rights are granted per command rather than by general membership in the rights are granted per command rather than by general membership in the
\texttt{sudo} group. \texttt{sudo} group.
\item Should a teammate require access after teams are formalized, that person \item Teammates who require access after teams are formalized
receives a separate named account rather than a shared login, so that receive a separate named account rather than a shared login, so that
access can be revoked individually and actions remain attributable. access can be revoked individually and actions remain attributable.
\end{itemize} \end{itemize}
\section{Cost and Cleanup} \section{Cost and Cleanup}
\index{hosts!cost} \index{hosts!cost}
\index{hosts!teardown} \index{hosts!teardown}
The Linux hosts are expected to run on the smallest instance size that supports \texttt{ssw590-group-web} runs on a \texttt{t3.micro} instance and is covered
the coursework, under whatever free-tier or credit allowance the account by a monthly AWS budget alert. Compute is billed per
provides, with a billing alarm configured before the first instance is instance-hour, and attached storage and the public IPv4 address are billed as
launched. Compute is billed per instance-hour, and attached storage whether or well, so each additional host adds cost independently of how heavily it is
not the instance is running, so each additional host adds cost independently of used: provisioning \texttt{ssw590-build-01} would approximately double the
how heavily it is used: provisioning \texttt{ssw590-build-01} alongside compute cost of the environment. It is therefore left unprovisioned unless
\texttt{ssw590-dev-01} would approximately double the compute cost of the required in the future, and would be stopped between uses rather than run continuously.
environment. It is therefore left unprovisioned until an assignment requires
builds to be isolated from the deployment target, and would be stopped between
uses rather than run continuously; only \texttt{ssw590-dev-01} needs to remain
available at all times.
Each planned host is disposable. Teardown consists of terminating the instance, Course hosts are disposable. Teardown consists of terminating the instance and
deleting the attached storage volume, and releasing any static address reserved deleting its storage volume. \texttt{ssw590-group-web} uses an automatically
for it; a static address left reserved after the instance is gone continues to assigned public address rather than a reserved static address, so there is no
be billed. Because the \gls{ami} and the configuration steps are recorded, a address to release; its address changes if the instance is stopped and
terminated host can be rebuilt rather than preserved, which is why teardown is started.
treated as routine rather than exceptional.
+10 -6
View File
@@ -10,7 +10,7 @@ This document records the configuration of the development environment used for
\CourseNumber\ and the working practices followed to produce it. \CourseNumber\ and the working practices followed to produce it.
Each chapter covers one subject, and each assignment adds or revises chapters Each chapter covers one subject, and each assignment adds or revises chapters
as recorded in the document history. The latest revision for Assignment~\AssignmentNumber\ as recorded in the document history. The latest revision for Assignment~\AssignmentNumber\
adds \ChapterRef{CloudDockerDeployment} and a draft \ChapterRef{ProjectProposal}. adds \ChapterRef{CloudDockerDeployment}, \ChapterRef{LatexDocker}, and \ChapterRef{ProjectProposal}.
Earlier coursework chapters are retained. Earlier coursework chapters are retained.
\section{Scope and Constraints} \section{Scope and Constraints}
@@ -18,8 +18,8 @@ Earlier coursework chapters are retained.
The following constraints apply to this revision. The following constraints apply to this revision.
\begin{itemize}[leftmargin=*] \begin{itemize}[leftmargin=*]
\item The earlier hosts chapter records planned machines. The cloud deployment \item The hosts chapter inventories the hosts in service and those still planned.
chapter records the newly provisioned EC2 website and its actual configuration. The cloud deployment chapter records the newly provisioned EC2 website and its actual configuration.
\item Linux Commands evidence was recorded locally under WSL. Assignment 3 \item Linux Commands evidence was recorded locally under WSL. Assignment 3
deployment commands were executed on Ubuntu 26.04 on EC2. Supplied screenshots deployment commands were executed on Ubuntu 26.04 on EC2. Supplied screenshots
distinguish those environments. distinguish those environments.
@@ -29,8 +29,7 @@ The following constraints apply to this revision.
\item This is a group submission. Chapters written before teams were formed \item This is a group submission. Chapters written before teams were formed
were prepared individually and are identified as such in the document history. were prepared individually and are identified as such in the document history.
\item The document is authored in \LaTeX\ and compiled with pdf\LaTeX\ on \item The document is authored in \LaTeX\ and compiled with pdf\LaTeX\ on
Overleaf. The board is hosted in GitHub Projects. The planned environment Overleaf. The board is hosted in GitHub Projects. The group deployment runs on Amazon EC2.
targets Amazon EC2.
\end{itemize} \end{itemize}
\section{Deliverables and Due Date} \section{Deliverables and Due Date}
@@ -48,10 +47,15 @@ Team policy & Group submission\\ \bottomrule
\index{document organization} \index{document organization}
\ChapterRef{KanbanSetup} describes the tool selected for the board, the steps \ChapterRef{KanbanSetup} describes the tool selected for the board, the steps
taken to configure it, the policy governing each column, and the inventory of cards. taken to configure it, the policy governing each column, and the inventory of cards.
\ChapterRef{Hosts} names the hosts to be configured and their roles. \ChapterRef{Hosts} inventories the hosts in service and those planned, with their roles.
\ChapterRef{Passwords} defines the account and password rules for those hosts. \ChapterRef{Passwords} defines the account and password rules for those hosts.
\ChapterRef{LinuxCommands} records the Linux working-directory setup and the problem-set solutions. \ChapterRef{LinuxCommands} records the Linux working-directory setup and the problem-set solutions.
\ChapterRef{AIPromptLog} records AI assistance used in preparing this document. \ChapterRef{AIPromptLog} records AI assistance used in preparing this document.
\ChapterRef{CloudDockerDeployment} records the class-based Color Buttons website,
its container, and its deployment to Amazon EC2.
\ChapterRef{LatexDocker} records a TeX Live container that compiles \LaTeX\ documents
as Overleaf does.
\ChapterRef{ProjectProposal} proposes the course project and the DevSecOps tools it will compare.
This document is derived from the \CourseNumber\ assignment template credited on This document is derived from the \CourseNumber\ assignment template credited on
the Template Attribution page. The template's instructional example chapter and the Template Attribution page. The template's instructional example chapter and
+87
View File
@@ -0,0 +1,87 @@
\chapter{LaTeX Docker}
\ChapterLabel{LatexDocker}
\index{Docker}\index{TeX Live}\index{LaTeX Docker}
\section{Purpose and Scope}
This chapter records a Docker container that compiles a
\LaTeX\ document with \gls{texlive}, the distribution Overleaf uses to compile
projects.\footnote{\url{https://www.overleaf.com/learn/latex/Overleaf_and_TeX_Live}}
Like Overleaf, it drives pdf\LaTeX\ with \texttt{latexmk}, which reruns the
engine until cross-references settle.
The container is a command-line compiler. It reads a
\texttt{.tex} file from a mounted folder, writes the PDF back to that folder,
and exits. It opens no network ports. The image is not deployed to a course
host or published to a registry; it was built and tested locally under WSL on
Payton's workstation.
\section{Design}
\begin{tabularx}{\linewidth}{L{3.6cm}Y}
\toprule \textbf{Decision} & \textbf{Choice and rationale}\\ \midrule
Base image & \texttt{debian:trixie-slim}. Debian packages its TeX Live release, so the image needs no separate TeX Live installer or mirror.\\
TeX Live packages & \texttt{texlive-latex-base}, \texttt{texlive-latex-recommended}, \texttt{texlive-fonts-recommended}, and \texttt{lmodern}, installed without recommended extras. This covers common packages such as \texttt{amsmath}, \texttt{hyperref}, and \texttt{booktabs} while avoiding the multi-gigabyte full distribution.\\
Build driver & \texttt{latexmk} with pdf\LaTeX, nonstop mode, and halt on the first error, so a failed compile returns a nonzero exit status.\\
Interface & The entrypoint is the compiler; the default argument is \texttt{hello.tex}, and any other file name can be passed to \texttt{docker run}.\\
Source and output & The document folder is bind-mounted at \path{/work}, so sources are not baked into the image and the PDF is written to the host.\\
Privilege & The image defaults to an unprivileged \texttt{latex} user; at run time the container uses the invoking user's IDs so output files are owned by that user. The font cache is kept in \path{/tmp}, outside the mounted folder.\\
\bottomrule
\end{tabularx}
\section{Container Sources}
\paragraph{Dockerfile}
\inputminted{docker}{docker/latex-compiler/Dockerfile}
\paragraph{.dockerignore}
The sample folder is mounted at run time, so it is excluded from the build
context.
\begin{minted}{text}
sample
*.pdf
\end{minted}
\paragraph{Sample document: sample/hello.tex}
The document exercises T1 fonts, mathematics, a \texttt{booktabs} table,
hyperlinks, and a forward equation reference that resolves only on a second
pdf\LaTeX\ pass.
\inputminted{latex}{docker/latex-compiler/sample/hello.tex}
\section{Build and Run}
All commands run in a WSL shell from \path{docker/latex-compiler}.
\subsection{Build the Image}
\begin{minted}{bash}
docker build -t ssw590-latex .
docker image ls ssw590-latex
\end{minted}
\subsection{Compile the Sample Document}
\begin{minted}{bash}
docker run --rm --user "$(id -u):$(id -g)" -v "$PWD/sample:/work" ssw590-latex
ls -l sample/hello.pdf
grep "Output written" sample/hello.log
\end{minted}
\texttt{-{}-rm} deletes the container when compilation ends. \texttt{-{}-user}
makes the generated files belong to the WSL user instead of the container
user.
\section{Test Evidence}
\begin{figure}[H]
\centering
\includegraphics[width=\linewidth]{figures/latex-docker-build.png}
\caption{TeX Live image build under WSL.}
\label{fig:latex-docker-build}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=\linewidth]{figures/latex-docker-output.png}
\caption{Information about the produced PDF.}
\label{fig:latex-docker-output}
\end{figure}
\begin{figure}[H]
\centering
\fbox{\includegraphics[width=0.8\linewidth,page=1]{figures/latex-docker-hello.pdf}}
\caption{First page of the PDF produced by the container.}
\label{fig:latex-docker-hello}
\end{figure}
+4 -3
View File
@@ -38,9 +38,9 @@
\definecolor{devopsLightBlue}{RGB}{232,240,247} \definecolor{devopsLightBlue}{RGB}{232,240,247}
% Replace these values for each assignment. % Replace these values for each assignment.
\newcommand{\AssignmentTitle}{Cloud Docker Deployment and Project Proposal} \newcommand{\AssignmentTitle}{Cloud Docker Deployment, LaTeX Docker, and Project Proposal}
\newcommand{\AssignmentNumber}{3} \newcommand{\AssignmentNumber}{3}
\newcommand{\DocumentVersion}{3.0} \newcommand{\DocumentVersion}{3.1}
\newcommand{\DocumentStatus}{Group Report Draft} \newcommand{\DocumentStatus}{Group Report Draft}
\newcommand{\CourseNumber}{SSW 590} \newcommand{\CourseNumber}{SSW 590}
\newcommand{\CourseName}{DevOps} \newcommand{\CourseName}{DevOps}
@@ -56,7 +56,7 @@
pdfauthor={\Author}, pdfauthor={\Author},
pdfcreator={Darian Muresan, Ph.D., with OpenAI Codex and Anthropic Claude Code}, pdfcreator={Darian Muresan, Ph.D., with OpenAI Codex and Anthropic Claude Code},
pdfsubject={Development environment configuration record for \CourseNumber\ Assignment \AssignmentNumber\ }, pdfsubject={Development environment configuration record for \CourseNumber\ Assignment \AssignmentNumber\ },
pdfkeywords={DevOps, Kanban, password, host, development environment, Amazon EC2, GitHub Projects} pdfkeywords={DevOps, Kanban, password, host, development environment, Amazon EC2, GitHub Projects, Docker, TeX Live}
} }
\newcolumntype{Y}{>{\raggedright\arraybackslash}X} \newcolumntype{Y}{>{\raggedright\arraybackslash}X}
@@ -122,6 +122,7 @@
\include{chapters/devopsPasswords} \include{chapters/devopsPasswords}
\include{chapters/devopsLinuxCommands} \include{chapters/devopsLinuxCommands}
\include{chapters/devopsCloudDockerDeployment} \include{chapters/devopsCloudDockerDeployment}
\include{chapters/devopsLatexDocker}
\include{chapters/devopsProjectProposal} \include{chapters/devopsProjectProposal}
\appendix \appendix
+2
View File
@@ -0,0 +1,2 @@
sample
*.pdf
+20
View File
@@ -0,0 +1,20 @@
FROM debian:trixie-slim
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
texlive-latex-base \
texlive-latex-recommended \
texlive-fonts-recommended \
lmodern \
latexmk \
&& rm -rf /var/lib/apt/lists/*
# Run as an unprivileged user; keep TeX's font cache out of the mounted folder.
RUN useradd --create-home --uid 1000 latex
ENV TEXMFVAR=/tmp/texmf-var
USER latex
WORKDIR /work
ENTRYPOINT ["latexmk", "-pdf", "-interaction=nonstopmode", "-halt-on-error"]
CMD ["hello.tex"]
+44
View File
@@ -0,0 +1,44 @@
\documentclass[11pt]{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{amsmath}
\usepackage{booktabs}
\usepackage[colorlinks=true]{hyperref}
\title{SSW 590 --- LaTeX Docker Test}
\author{Payton Bates and Victor Del Rio Foces}
\date{\today}
\begin{document}
\maketitle
\section{Purpose}
This document was compiled by pdf\LaTeX\ from TeX Live inside a Docker
container. Section~\ref{sec:checks} lists its features.
\section{Checks}\label{sec:checks}
\begin{itemize}
\item Mathematics: $e^{i\pi} + 1 = 0$ and
\begin{equation}
\sum_{k=1}^{n} k = \frac{n(n+1)}{2}.
\end{equation}
\item Cross-reference: Equation~\eqref{eq:area} resolves.
\item Table:
\end{itemize}
\begin{center}
\begin{tabular}{lr}
\toprule
Item & Value \\
\midrule
Engine & pdf\LaTeX \\
Distribution & TeX Live \\
\bottomrule
\end{tabular}
\end{center}
\begin{equation}\label{eq:area}
A = \pi r^2
\end{equation}
\end{document}
Binary file not shown.

After

Width:  |  Height:  |  Size: 772 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

+5 -4
View File
@@ -2,8 +2,9 @@ This document records the development environment and working practices used
in SSW 590. It is extended with each assignment, and the document history in SSW 590. It is extended with each assignment, and the document history
identifies what each revision changed. Its chapters currently cover planning and tracking identifies what each revision changed. Its chapters currently cover planning and tracking
the work, the hosts and accounts that make up the environment, and the the work, the hosts and accounts that make up the environment, and the
command-line and operational work performed in it. Environments specified here command-line and operational work performed in it. The host inventory
are plans, and the actual provisioning will be done in the future. distinguishes machines in service from those still planned.
Assignment 3 adds the class-based Color Buttons application deployed in Docker Assignment 3 adds the class-based Color Buttons application deployed in Docker
on Amazon EC2, with public browser and terminal verification evidence, and a on Amazon EC2, with public browser and terminal verification evidence;
draft proposal to compare GitHub Actions with Jenkins. a Docker container that compiles \LaTeX\ documents as Overleaf does;
and a proposal to compare GitHub Actions with Jenkins.
+1
View File
@@ -11,6 +11,7 @@ link each entry to the changed chapter, table, figure, or controlled artifact.
\multicolumn{4}{l}{\small\itshape Document Update History (continued)}\\ \multicolumn{4}{l}{\small\itshape Document Update History (continued)}\\
\toprule \textbf{Date / Version} & \textbf{Author Initials} & \textbf{Change} & \textbf{Changed At}\\ \midrule \toprule \textbf{Date / Version} & \textbf{Author Initials} & \textbf{Change} & \textbf{Changed At}\\ \midrule
\endhead \bottomrule \endlastfoot \endhead \bottomrule \endlastfoot
October 5, 2026 / 3.1 & PCB & Added the LaTeX Docker chapter for compiling a sample document with its sources, build and run commands, and test evidence. Updated the document title, keywords, glossary, abstract, introduction, and hosts. & \ChapterRef{LatexDocker}, \ChapterRef{Hosts}, \ChapterRef{Introduction}, \ChapterRef{CloudDockerDeployment}\\
October 5, 2026 / 3.0 & VDRF & Added AWS Docker deployment, class-based website sources, execution evidence, and a draft tool-comparison proposal. Updated Assignment 3 metadata and AI log. & \ChapterRef{CloudDockerDeployment}, \ChapterRef{ProjectProposal}, \ChapterRef{AIPromptLog}\\ October 5, 2026 / 3.0 & VDRF & Added AWS Docker deployment, class-based website sources, execution evidence, and a draft tool-comparison proposal. Updated Assignment 3 metadata and AI log. & \ChapterRef{CloudDockerDeployment}, \ChapterRef{ProjectProposal}, \ChapterRef{AIPromptLog}\\
September 27, 2026 / 2.1 & VDRF & Added Victor's Q1--Q40 execution screenshots and result interpretation; distinguished the two environments and command variants. & \ChapterRef{LinuxCommands}, \ChapterRef{AIPromptLog}\\ September 27, 2026 / 2.1 & VDRF & Added Victor's Q1--Q40 execution screenshots and result interpretation; distinguished the two environments and command variants. & \ChapterRef{LinuxCommands}, \ChapterRef{AIPromptLog}\\
September 26, 2026 / 2.0 & PCB, VDRF & Added the Linux Commands chapter: working-directory setup with terminal input/output figures, command explanations and interpretation of results, and solutions to the Linux problem set. Updated document metadata and authorship for Assignment 2 and the two-person team. & \ChapterRef{LinuxCommands}, \ChapterRef{Introduction}, \ChapterRef{Hosts}, \ChapterRef{AIPromptLog}\\ September 26, 2026 / 2.0 & PCB, VDRF & Added the Linux Commands chapter: working-directory setup with terminal input/output figures, command explanations and interpretation of results, and solutions to the Linux problem set. Updated document metadata and authorship for Assignment 2 and the two-person team. & \ChapterRef{LinuxCommands}, \ChapterRef{Introduction}, \ChapterRef{Hosts}, \ChapterRef{AIPromptLog}\\