\documentclass{report}
\usepackage[T1] {fontenc}
\usepackage[italian]{babel}

% Per i link nell'indice
\usepackage{hyperref}

\title{OpenLab Virtual 2021}
\author{Matteo Savatteri}

\begin{document}
\maketitle
\setcounter{page}{2}


\tableofcontents

\chapter{GNU/Linux Intro, Tips \& Tricks}

\section{Introduzione}
\begin{itemize}
\item Benvenuto e ringraziamenti ad admin e pubblico
\item Chi sono?
\item Cos'è LCM?
\item Regole conferenza: come interagire
\item Outline e obbiettivi conferenza:
    \begin{itemize}
    \item Storia di \texttt{GNU/Linux}
    \item \texttt{GNU/Linux} per un fisico
    \item \texttt{GNU/Linux}: nozioni e strumenti importanti
    \item Testimonianze ospiti + domande 
    \end{itemize}
\end{itemize}

\section{Storia di \texttt{GNU/Linux}}
\begin{itemize}
\item \texttt{UNIX}
      \footnote{Video \emph{AT\&T Archives} introduzione a \texttt{UNIX} a
                \url{https://youtu.be/tc4ROCJYbm0}
      }
      (\emph{Uniplexed Information and Computing Service}, "\emph{eunuchs}"),
      '69, Ken Thompson, Dennis Ritchie, Brian Kernighan \& Co., Assembly:
    \begin{itemize}
    \item Filosofia di UNIX:
          \emph{
                "This is the Unix philosophy: Write programs that do one thing
                and do it well. Write programs to work together. Write programs
                to handle text streams, because that is a universal interface."
          }
          - Doug McIlroy
    \item AT\&T, Bell Labs
    \item '69-73, sviluppo del C, K.T. \& D.R. $\rightarrow$ Portabilità
    \item Distribuzione università (es. Berkeley, BSD) $\rightarrow$ Codice aperto
    \item '84 commercializzazione $\rightarrow$ Codice chiuso!
    \item Standard:
        \begin{itemize}
        \item '85 POSIX (Portable Operating System Interface for UNIX), IEEE
        \item '98 SUS (Single UNIX Specification), The Open Group
        \end{itemize}
    \end{itemize}
\item GNU (\emph{GNU's Not UNIX}), '84, Richard Stallman:
    \begin{itemize}
    \item Sistema operativo Libero (cosa significa?)
          \footnote{Per approfondire vai a https://www.fsf.org/it}
          clone di \texttt{UNIX}
    \item '90 Sviluppo di tutte le componenti del sistema
    \item Esempi software GNU: \texttt{gcc}, \texttt{glibc}, \texttt{bash},
          \texttt{coreutils}, \texttt{GNOME}, etc.
    \item '90 inizia sviluppo \texttt{GNU Hurd}
    \end{itemize}
\item Digressione su OS:
    \begin{itemize}
    \item OS = Insieme di programmi che consentono all'operatore
          di utilizzare un computer
    \item Kernel = Nucleo dell'OS deputato ad allocare le risorse
          della macchina e altri servizi agli altri programmi 
    \end{itemize}
\item \texttt{Linux}\footnote{Pronuncia del nome \texttt{Linux} a
              \url{https://mirrors.edge.kernel.org/pub/linux/kernel/SillySounds/}
             }
      , '91, Linus Torvalds:
          \begin{itemize}
          \item Progetto personale annunciato su
                \href{https://groups.google.com/g/comp.os.minix/c/dlNtH7RRrGA/m/SwRavCzVE7gJ}{com.os.minix}
          \item Kernel Libero (GNU GPLv2), Monolitico, Modulare, UNIX-like
          \item '92 \texttt{Linux} diventa kernel del sistema \texttt{GNU}
          \item Adozione in ambito commerciale
          \item Prima diffusione in supercomputer (
                \href{https://top500.org/statistics/list/}{Vedi TOP500 OS Family}
                )
          \item Poi leader in ambito server
                \footnote{Guarda ad esempio statistiche su web server a
                          \url{https://w3techs.com/technologies/overview/operating_system}
                         }
                (in particolare LAMP)
          \item 2000, Linux Foudation $\rightarrow$ LSB (\emph{Linux Standard Base})
                Standardizzazione OS che adottano kernel \texttt{Linux}
                (Da tempo \emph{standard de facto})
          \item Oggi diffuso in dispositivi mobili (\texttt{Android}), embedded
                (router board, wearables) e altre applicazioni (es. \emph{TESLA})
          \item Percentuale diffusione workstation, desktop, laptop e gaming
                (es. Valve Corporation, SteamOS) in crescita
          \end{itemize}
\item Concetto ed esempi di distribuzione \texttt{GNU/Linux} (Ubuntu, Mint, Fedora, Arch, Gentoo, Debian,
      CentOS, RHEL, SUSE, LFS, OpenWRT, Raspbian); cosa distingue varie distro? $\rightarrow$
      \emph{package manager}, \emph{init system}, configuarzione kernel \texttt{Linux}, etc.
\end{itemize}

\section{\texttt{GNU/Linux} per un Fisico}
Perhé un fisico dovrebbe conoscere ed utilizzare il sistema \texttt{GNU/Linux}?

\begin{itemize}
\item Cluster di computer e farm (es.
      \href{https://www.hpc.cineca.it/hardware/marconi}{MARCONI},
      \href{https://www.indaco.unimi.it/}{INDACO},
      \href{https://lcm.mi.infn.it/farm/}{LCM Farm}
      ) nel mondo sono quasi
      interamente costituite da reti di sistemi \texttt{GNU/Linux} (es. CentOS, RHEL, Debian)
\item Codice libero = adattabilità, trasparenza, riproducibilità, no interessi
\item Calcolo scientifico ha storia basata su sistemi UNIX-like da decadi
      $\rightarrow$ applicazioni vengono prevalentemente sviluppate su e per
      questa famiglia di sistemi
\item Tutte le persone dovrebbero usare un OS Libero, per ragioni etiche
\end{itemize}

\section{Presentazioni ospiti}
\begin{itemize}
\item Ospiti: Zec, Sboz, Blue, Algebrato (?)
\item 5 min a testa
\item Domande
\end{itemize}

\section{Chiusura}
\begin{itemize}
\item Repo dell'\emph{OpenLab}, cosa trovate, licenza
\item Contatti LCM: sito, gruppo community, mail
\item Saluti
\end{itemize}



\chapter{CLI Essential and Shell Programming}

\section{Nozioni e Strumenti}
\subsection{Setup}
\begin{itemize}
\item Vedete il terminale?
\item Il font è abbastanza grande?
\item Vedete il puntatore?
\item Non andare troppo veloce
\item Spiega che tasti premi, se non vengono printati
\item Non cancellare l'output del terminale
\end{itemize}

\subsection{Il concetto di \emph{Shell}}
\begin{itemize}
\item \emph{shell} è programma per computer che espone all'utente o ad
      altri programmi i servizi dell'OS
\item Si chiama così perché è strato più esterno dell'OS
\item Può essere GUI (es. \texttt{GNOME}, \texttt{KDE}) o \texttt{CLI}
      (es. \texttt{sh}, \texttt{ksh}, \texttt{bash}, \texttt{csh},
       \texttt{csh}, \texttt{COMMAND.COM})
\item Nel caso di shell CLI $\rightarrow$ \emph{interprete dei comandi}
\end{itemize}

\subsection{\emph{Interprete dei Comandi} vs \emph{Emulatore di Terminale}}
\begin{itemize}
\item \emph{emulatore di terminale} = GUI che emula una \emph{telescrivente}
      \footnote{Video interessante di \emph{telescrivente} connessa a sistema
                \texttt{GNU/Linux}:
                \url{https://www.youtube.com/watch?v=9TGQ4pnVWSQ}
               }
      \begin{itemize}
      \item Programma \emph{master} che riceve e interpreta le stringhe
            digitate dall'utente alla tastiera, le mostra in una finestra
            grafica e le passa al programma \emph{slave}
            (es. \emph{interprete dei comandi})
      \item Riceve stringhe dal pogramma \emph{slave} e le mostra all'utente
            grazie ad una finestra grafica
      \item Esempi: \texttt{xterm}, \texttt{urxvt}, \texttt{st}
      \item Quando non è un GUI si chiama \emph{console virtuale}
            (es. le \texttt{Linux tty})
      \end{itemize}
\item \emph{interprete dei comandi} = una shell di tipo CLI
      \begin{itemize}
      \item Programma \emph{slave} che riceve stringhe dal programma
            \emph{master}, le interpreta e chiede a OS di eseguire programmi
            corrispondenti
      \item Può passare stringhe al programma \emph{master} perché vengano
            mostrate a schermo
      \end{itemize}
\end{itemize}

\subsection{\texttt{bash}}
\begin{itemize}
\item Shell del progetto GNU
\item \texttt{bash} = \emph{Bourne Again SHell} (Stephen Bourne)
\item \`E interprete dei comandi e linguaggio di scripting
\item Se chiamata come \texttt{sh} o con la flag \texttt{--posix}
      comportamento conforme al POSIX (\texttt{sh})
\item Feature:
      \begin{itemize}
      \item Esecuzione di comandi $\rightarrow$ Se no slash: ricerca
            $\rightarrow$ funzioni, builtin, \texttt{PATH} (\texttt{hash})
            $\rightarrow$ Esecuzione con assegnazione argomenti
      \item Shell scripts
      \item Enviroment (\texttt{export})
      \item Simple commands $\rightarrow$ \emph{``A simple command is a sequence of optional
            variable assignments followed by blank-separated words and redirections,
            and terminated by a control operator.''}
      \item Pipeline $\rightarrow$ \texttt{|}, \texttt{|\&}, \textbf{in subshell}
      \item Liste di comandi $\rightarrow$ \texttt{;}, \texttt{\&}, \texttt{\&\&}, \texttt{||}
      \item Compound commands $\rightarrow$ \texttt{(list)}, \texttt{\{ list; \}}, \texttt{((expression))},
            \texttt{if}, \texttt{for} (due tipi), \texttt{while}, \texttt{until}, \texttt{case}
      \item Shell functions $\rightarrow$ \texttt{fname () compound-command [redirection]}
      \item Coprocesses $\rightarrow$ \texttt{coproc [NAME] command [redirections]}
      \item Commenti $\rightarrow$ \texttt{\#}
      \item Quoting
      \item Parametri $\rightarrow$ \emph{``A parameter is an entity that stores values.''},
            \emph{``A variable is a parameter denoted by a name.''},
            definizione, valutazione, parametri speciali (\texttt{*}, \texttt{@}, \texttt{\#}, \texttt{?},
            \texttt{-},\texttt{\$},\texttt{!} (job), \texttt{0})
            e variabili speciali (in particolare \texttt{PATH}), namerefs (\texttt{declare -n ref=VAR}),
            \texttt{declare} builtin
      \item Array $\rightarrow$ \texttt{name=(value1 ... valuen)}
      \item Espansione $\rightarrow$ brace expansion, tilde expansion,
            parameter and variable expansion, command substitution, arithmetic expansion,
            word splitting, and pathname expansion
      \item Redirezione $\rightarrow$ \texttt{>}, \texttt{>>}, \texttt{<}, nomi file spaciali,
            \emph{Here Documents} \texttt{[n]<<[-]word ... delim}, \emph{Here Strings}
            \texttt{[n] < < < word}, duplicating file descriptors \texttt{[n]>\&word} (analogo
            per input, moving file descriptors \texttt{[n]>\&digit-} (analogo input),
            opening file descriptors for reading and writing \texttt{[n]<>word}.
      \item \texttt{history}
      \item Tab completion
      \item Job control
      \item Builtins (Vedi man page)
      \end{itemize}
\end{itemize}

\subsection{Programmi Applicativi di \texttt{UNIX}}
\subsubsection{Il Comando Più Importante dell'Universo}
Comando \texttt{man} è più importante universo! \texttt{man man man}!
Vedi anche \texttt{apropos} o \texttt{man -k}.

Regole per documentarsi:
\begin{itemize}
\item Cercare nelle \emph{man page}, info, \texttt{--help} e solo infine sul web
\item Cercare \emph{in lingua inglese} $\rightarrow$ \`E la lingua di internet
      e dell'informatica
\item Cercare sempre dalla documentazione ufficiale $\rightarrow$ Meglio diffidare
      di guide e blog, se possibile.
      (\emph{Chi l'ha scritto, è chi meglio ti può consigliare})
\item Vai a fondo finché il tempo a tua disposizione te lo permette
\end{itemize}

\subsubsection{File System}
\begin{itemize}
\item Digressione su VFS: radice, nodi, file regolari, file speciali (?)
\item \texttt{pwd}
\item \texttt{touch} $\rightarrow$ Puoi introdurre qui, \texttt{:}
\item \texttt{cd} $\rightarrow$ No argomento, \texttt{-}
\item \texttt{ls} $\rightarrow$ \texttt{-l}, \texttt{-a}, \texttt{-t}, \texttt{-r}
\item \texttt{cat} $\rightarrow$ \texttt{-et}
\item \texttt{cp} $\rightarrow$ \texttt{-r}, \texttt{dir/.},  \texttt{-}
\item \texttt{mv} $\rightarrow$ \texttt{-i}
\item \texttt{unlink}
\item \texttt{rm} $\rightarrow$ \texttt{-r}, \texttt{-i}, \texttt{-f}
\item \texttt{mkdir} $\rightarrow$ \texttt{-p}
\item \texttt{file} $\rightarrow$ \texttt{-l}
\item \texttt{df} $\rightarrow$ \texttt{-a}, \texttt{-i}, \texttt{-h}
\item \texttt{du} $\rightarrow$ \texttt{-a}, \texttt{-h}, \texttt{s} 
\item \texttt{find} $\rightarrow$ \texttt{--name}, \texttt{--iname}, combinazione
      con \texttt{xargs}
\item \texttt{cmp} $\rightarrow$ \texttt{diff}, \texttt{diff3}
\item \texttt{dd}
\item \texttt{ln} $\rightarrow$ \texttt{-s}
\item \texttt{readlink}
\end{itemize}

\subsubsection{Text Processing}
\begin{itemize}
\item \texttt{cut} $\rightarrow$ \texttt{-f}, \texttt{-d}
\item \texttt{paste} $\rightarrow$ \texttt{-d}
\item \texttt{head} $\rightarrow$ \texttt{-N}
\item \texttt{tail} $\rightarrow$ \texttt{-N}, \texttt{-f}
\item \texttt{sort} $\rightarrow$ \texttt{-h}, (\texttt{tsort})
\item \texttt{wc} $\rightarrow$ \texttt{-l}
\item \texttt{join} $\rightarrow$ ?
\item \texttt{more}
\item \texttt{less} $\rightarrow$ keybind \texttt{v}
\item \texttt{sed} $\rightarrow$ \emph{Stream editor},  \texttt{-i},
                                 \texttt{s/pat1/pat2/g},
                                 \texttt{\{N\}d}
\item \texttt{tr} $\rightarrow$ \texttt{-d}
\item \texttt{uniq}
\item \texttt{nl} $\rightarrow$ Numera linee file argomento
\end{itemize}

\subsubsection{Misc}
\begin{itemize}
\item \texttt{uname} $\rightarrow$ \texttt{-a}
\item \texttt{date}
\item \texttt{cal} $\rightarrow$ \texttt{-y}
\item \texttt{bc}
\item \texttt{split} $\rightarrow$ \texttt{-b} (bytes)
\item \texttt{env}
\item \texttt{grep} $\rightarrow$ \texttt{-c}, \texttt{-v}
\item \texttt{id}, \texttt{whoami}, \texttt{who}, \texttt{logname}
\item \texttt{od} $\rightarrow$ \texttt{-a}, \texttt{-x}
\item \texttt{tty}
\end{itemize}

\subsubsection{Shell Porgramming}
\begin{itemize}
\item \texttt{echo} $\rightarrow$ \texttt{-e}, \texttt{-n}
\item \texttt{sleep}
\item \texttt{tee} $\rightarrow$ \texttt{-a}
\item \texttt{command}
\item \texttt{true}
\item \texttt{false}
\end{itemize}

\section{Chiusura}
\begin{itemize}
\item Repo dell'\emph{OpenLab}, cosa trovate, licenza
\item Contatti LCM: sito, gruppo community, mail
\item Saluti
\end{itemize}

\end{document}
