\documentclass{beamer}
\usetheme{metropolis}
\usepackage{lmodern}
\usepackage[czech]{babel}
\usepackage[utf8x]{inputenc}
%\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{graphicx}
\usepackage{wrapfig}
\usepackage{color}
\usepackage{mathtools}
\usepackage{hyperref}
\usepackage{epstopdf}
\usepackage{svg}
\usepackage{amsmath}
\usepackage{minted}
\hypersetup{
    colorlinks,
    citecolor=black,
    filecolor=black,
    linkcolor=black,
    urlcolor=black
}
\usepackage{pdflscape}

\title{3 problémy při práci na 3 počítačích}
\author{Karel Kočí}

\begin{document}

\frame{\titlepage}

\begin{frame}
	\begin{block}{\huge Napiš si skript!}
		Přednášené skripty a více naleznete na:
		\url{https://github.com/Cynerd/myconfigs}
	\end{block}
\end{frame}

\begin{frame}
	\frametitle{3 problémy}
	\begin{itemize}
		\item Synchronizace souborů
		\item Synchronizace a správa konfigurací
		\item Správa systému
	\end{itemize}
\end{frame}

\begin{frame}
	\frametitle{Synchronizace souborů}
	\def\svgwidth{1cm}
	\input{face_sad.pdf_tex}
	\begin{itemize}
		\item Dropbox
		\item Mega
		\item Google drive
		\item \ldots
	\end{itemize}

	\def\svgwidth{1cm}
	\input{face_cry.pdf_tex}
	\begin{itemize}
		\item Owncloud/Nextcloud
	\end{itemize}

	\def\svgwidth{1cm}
	\input{face_happy.pdf_tex}
	\begin{itemize}
		\item Syncthing
	\end{itemize}
\end{frame}

\begin{frame}
	\frametitle{``Easy to use'' říkají}
	\includegraphics[width=11cm]{syncthing.png}
\end{frame}

\begin{frame}
	\frametitle{Matematický problém}
	Přidání zařízení mezi N synchronizujících M složek.

	\begin{itemize}
		\item Nastav nové zařízení
		\item $N$-krát přidej zařízení
		\item $N$-krát spáruj s novým zařízením
		\item $N \times M$ přidej k synchronizovaným složkám 
		\item $M$-krát přidej složku na novém zařízení
	\end{itemize}

	\vspace{0.4cm}
	\[
		1+\left(M+2\right)N+M
	\]
\end{frame}

\begin{frame}
	\frametitle{Moje zařízení}
	\def\svgwidth{27cm}
	\input{scheme.pdf_tex}
\end{frame}

\begin{frame}[fragile]
	\frametitle{Syncthing konfigurace hodně zjednodušeně}
	\small
	\begin{minted}{xml}
<configuration version="18">
    <folder id="a" label="A" path="/home/user/a/">
        <device id="0000000-0000000-.."></device>
        <device id="1111111-1111111-.."></device>
    </folder>
    <folder id="b" label="B" path="/home/user/b/">
        <device id="0000000-0000000-.."></device>
        <device id="1111111-1111111-.."></device>
    </folder>
    <device id="0000000-0000000-.." name="cynerd-pc">
        <address>dynamic</address>
    </device>
    <device id="1111111-1111111-.." name="server">
        <address>tcp://cynerd.cz</address>
    </device>
</configuration>
\end{minted}
\end{frame}

\begin{frame}[fragile]
	\frametitle{Napiš si skript, vstupní data}
	\begin{minted}{bash}
# Syncthing PC id
ID="0000000-0000000-0000000-0000000-.."
# Name of machine
NAME="cynerd-pc"
# Address to machine, can be tcp://address.com or dynamic
ADDRESS="dynamic"

# Directoris to be synchronized
# Format is ID:PATH
DIRS="Sync:/home/user/Sync
Sync2:/home/user/SyncIt"

# REST api key
APIKEY="bT6dCxEds9JPwiXMXavGNsXsz7ZFpSC5"
\end{minted}
\end{frame}

\begin{frame}[fragile]
	\frametitle{Napiš si skript, generuj zařízení do XML}
	\begin{minted}{bash}
# ...
for h in syncthing/*; do

. "$h" # Source host
# Set to configuration
echo "<device id=\"$ID\" name=\"$NAME\">" >>$TMPCNF
echo "<address>$ADDRESS</address>" >>$TMPCNF
echo "</device>" >>$TMPCNF
# Parse DIRS of this host
eval `echo "$DIRS" | sed -ne \
's/^\([^:]*\):.*$/ST_DIR_HOSTS_\1="$ST_DIR_HOSTS_\1 $ID"/p'`

done
# ...
\end{minted}
\end{frame}

\begin{frame}[fragile]
	\frametitle{Napiš si skript, generuj složky do XML}
	\begin{minted}{bash}
# ...
. syncthing/"$HOST"
while read -r d; do
NM="$(echo "$d" | sed 's/:.*$//')" # Directory name
PTH="$(echo "$d" | sed 's/^[^:]*://')" # Get target path
# Write folder init
echo "<f id=\"$NM\" label=\"$NM\" path=\"$PTH\">" >>$TMPCNF
# Specify every all devices
for dev in eval `echo \$ST_DIR_HOSTS_$NM`; do
	echo "<device id=\"$dev\"></device>" >>$TMPCNF
done
# ...
done <<<"$DIRS"
# ...
\end{minted}
\end{frame}

\begin{frame}
	\frametitle{Moje řešení}

	\begin{itemize}
		\item Nastav nové zařízení
		\item Přidej do sdílené konfigurace
		\item N-krát deploy konfigurace
	\end{itemize}

	\vspace{0.4cm}
	\[
		2+N < 1+\left(M+2\right)N+M
	\]
\end{frame}

\begin{frame}
	\frametitle{Synchronizace konfigurace}
	\includegraphics[width=3cm]{git.eps}

	\vspace{1cm}
	\begin{block}{\$HOME dot soubory}
		3 zařízení 3 různé požadavky
		\begin{itemize}
			\item Laptop, OpenRC, Bumblebee, 2 disky
			\item Laptop, OpenRC
			\item Desktop, Systemd
		\end{itemize}
	\end{block}
\end{frame}

\begin{frame}[fragile]
	\frametitle{Skriptujeme jednoduše}
	\begin{minted}{bash}
# install.sh
cd `dirname $0`
rsync -rlpt bashrc ~/.bashrc
rsync -rlpt profile ~/.profile


# get.sh
cd `dirname $0`
rsync -rlpt ~/.bashrc bashrc
rsync -rlpt ~/.profile profile
\end{minted}
\end{frame}

\begin{frame}[fragile]
	\frametitle{Skriptujeme s vimdiff}
	\begin{minted}{bash}
cd `dirname $0`
checkdiff()  {
	for f in `find "$1" -type f`; do
		if ! cmp "$1" "$f" >/dev/null; then
			F="${f#$1}"
			vimdiff "$1/$F" "$2/$F"
		fi
	done
}
inst() {
	[ -e "$2" ] && checkdiff "$1" "$2" \
		|| rsync -rlpt "$1" "$2"
}
inst bashrc ~/.bashrc
\end{minted}
\end{frame}

\begin{frame}[fragile]
	\frametitle{Skriptujeme skupinky}
	\begin{minted}{bash}
# ...

read -p "Install bashrc? (Y/n) "
if [[ $REPLY =~ ^[Yy]?$ ]]; then
	inst bashrc ~/.bashrc
	inst profile ~/.profile
fi

read -p "Install VIM scripts? (Y/n) "
if [[ $REPLY =~ ^[Yy]?$ ]]; then
	inst vimrc ~/.vimrc
	inst vim ~/.vim
fi

\end{minted}
\end{frame}

\begin{frame}[fragile]
	\frametitle{Balíčky jako konfigurace}
	Pro Archlinux:
	\begin{minted}{bash}
sudo pacman -D --asdeps pkg
sudo pacman -D --asexplicit pkg
\end{minted}

	\begin{minted}{bash}
m4 archlinux.pkgs | sort | uniq > /tmp/file1
pacaur -Qqe | sort > /tmp/file2
diff --supppress-common-lines -ay /tmp/file1 /tmp/file2
\end{minted}
\end{frame}

\begin{frame}
	\frametitle{Závěrem}
	\begin{itemize}
		\item Jeden git repositář s konfigurací
		\item Skript pro přesun změn v konfiguračních souborech z a do repositáře
		\item Skript porotnání explicitně nainstalovaných balíčků
		\item Skript pro generování Syncthing konfigurace
	\end{itemize}
\end{frame}

\begin{frame}
	\begin{block}{\large Děkuji za pozornost}
	\end{block}
	\url{https://github.com/Cynerd/myconfigs}
	% TODO
\end{frame}

\end{document}
