\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}
dynamic
tcp://cynerd.cz
\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 "" >>$TMPCNF
echo "$ADDRESS" >>$TMPCNF
echo "" >>$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 "" >>$TMPCNF
# Specify every all devices
for dev in eval `echo \$ST_DIR_HOSTS_$NM`; do
echo "" >>$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}