From 4555491b5fdb3f38c731e409c2f98b46ac675efa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Karel=20Ko=C4=8D=C3=AD?= <cynerd@email.cz>
Date: Tue, 17 Oct 2017 07:59:09 +0200
Subject: Some directory movements

---
 2017-linuxdays/pres.tex | 475 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 475 insertions(+)
 create mode 100644 2017-linuxdays/pres.tex

(limited to '2017-linuxdays/pres.tex')

diff --git a/2017-linuxdays/pres.tex b/2017-linuxdays/pres.tex
new file mode 100644
index 0000000..a2f5f87
--- /dev/null
+++ b/2017-linuxdays/pres.tex
@@ -0,0 +1,475 @@
+\documentclass{beamer}
+\usepackage{lmodern}
+\usepackage[czech]{babel}
+\usepackage[utf8x]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage{textpos}
+\usepackage{tikz,calc}
+\usepackage{graphicx}
+\usepackage{wrapfig}
+\usepackage{color}
+\usepackage{mathtools}
+\usepackage{hyperref}
+\usepackage{epstopdf}
+\usepackage{amsmath}
+\usepackage{minted}
+\hypersetup{
+	colorlinks,
+	citecolor=black,
+	filecolor=black,
+	linkcolor=black,
+	urlcolor=black
+}
+\usepackage{pdflscape}
+
+\input{theme/theme.tex}
+
+\title{Tipy a triky nejenom v shellu nejenom pro programátory}
+\author{Karel Kočí}
+\date{8.10.2017}
+
+\AtBeginSection[]{
+	\begin{frame}
+		\tableofcontents[currentsection]
+	\end{frame}
+}
+
+\begin{document}
+
+\input{theme/title.tex}
+
+\begin{frame}[fragile]{O čem to bude?}
+	\begin{minted}[frame=lines]{shell}
+sed 's/[^\;]*\;//' hist | tr ' ' '\n' | \
+	grep -vE '^(-|\||$)' | sort | uniq -c | \
+	sort -nr > notes/tatnppvl.result
+	\end{minted}
+	\begin{tabular}{r|l|r|l|r|l} \hline
+		3004 & ls & 2391 & cd & 2225 & git \\ \hline
+		1350 & v & 911 & sudo & 608 & tig \\ \hline
+		458 & emerge & 410 & push & 405 & ssh \\ \hline
+		393 & ..  & 381 & gst & 372 & ci \\ \hline
+		320 & add & 303 & vim & 285 & make  \\ \hline
+		285 & grep & 282 & rm & 247 & man \\ \hline
+		203 & . & 191 & co & 189 & sed \\ \hline
+		172 & @world & 159  & ./build\_repo.sh & 156 & omnia \\ \hline
+		150 & updater & 148 & mpv & 140 & turris/openwrt \\ \hline
+		138 & mount & 124 & cp & 120 & test \\ \hline
+		119 & pull & 112 & ip & 109 & turtetris/Makefile \\  \hline
+	\end{tabular}
+\end{frame}
+
+\section[Section]{Jen shell}
+
+\begin{frame}[fragile]{MAN MAN MAN MAN MAN}
+	\begin{minted}[frame=lines]{shell}
+man man
+man exit
+man 3 exit
+	\end{minted}
+	Z man man:
+	\begin{enumerate}
+		\item Spustitelný program nebo shell příkaz
+		\item Volání systému (funkce z kernelu)
+		\item Knihovní volání (funkce poskytované knihovnami)
+		\item Speciální soubory (obvykle soubory z /dev)
+		\item Souborové formáty a konvence (například /etc/passwd)
+		\item Hry
+		\item Různorodé (Konvence, makra a pod.)
+		\item Příkazy pro systémovou administraci (obvykle sbin)
+	\end{enumerate}
+\end{frame}
+
+\begin{frame}[fragile]{Náhled na soubory}
+	\begin{block}{ll}
+		Pro přístupová práva, vlastníky i velikost.
+	\begin{minted}[frame=lines]{shell}
+alias ll='ls -lh'
+	\end{minted}
+	\end{block}
+	\begin{block}{tree}
+		Pro stromovou strukturu.
+	\end{block}
+\end{frame}
+
+\begin{frame}[fragile]{Připisované soubory}
+	\begin{block}{tail -f}
+		\begin{minted}[frame=lines]{shell}
+sudo tail -f /var/log/messages
+		\end{minted}
+	\end{block}
+\end{frame}
+
+\begin{frame}[fragile]{Opakované spuštění}
+	\begin{block}{while true; do sleep 1; \emph{command}; done}
+		Pro sledování a pod. Například ip address.
+	\end{block}
+	\begin{block}{dorepeat}
+		\begin{minted}[frame=lines]{shell}
+dorepeat() {
+	while true; do
+		"$@"
+		sleep 1
+		echo
+	done
+}
+		\end{minted}
+	\end{block}
+\end{frame}
+
+\begin{frame}[fragile]{Hledání souborů}
+	\begin{block}{find -name -delete}
+		\begin{minted}[frame=lines]{shell}
+find -name *elf*
+find -name *.orig -delete
+		\end{minted}
+	\end{block}
+\end{frame}
+
+\begin{frame}[fragile]{Hledání souborů podle obsahu}
+	\begin{block}{grep -Rn PATTERN}
+		\begin{minted}[frame=lines]{shell}
+grep -Rn elfutils
+grep -RnE 'elf-?utils'
+		\end{minted}
+	\end{block}
+\end{frame}
+
+\begin{frame}[fragile]{Hledání podle obsahu ve specifických souborech}
+	\begin{minted}[frame=lines]{shell}
+find -name Makefile | xargs grep -Rn elfutils
+	\end{minted}
+\end{frame}
+
+\begin{frame}[fragile]{Náhodné heslo}
+	\begin{block}{genpasswd}
+		\begin{minted}[frame=lines]{shell}
+genpasswd() {
+	local l=$1
+	[ -n "$l" ] || l=16
+	tr -dc A-Za-z0-9_ < /dev/urandom \
+		| head -c "$l" | xargs
+}
+		\end{minted}
+	\end{block}
+\end{frame}
+
+\section[Section]{X server}
+
+\begin{frame}[fragile]{Clipboard}
+	\begin{block}{xclip -selection clipboard}
+		\begin{minted}[frame=lines]{shell}
+cat .ssh/id_rsa.pub | xclip -selection clipboard
+		\end{minted}
+	\end{block}
+	\begin{block}{clip}
+		\begin{minted}[frame=lines]{shell}
+clip() {
+  # Note: printf is magic to remove trailing new lines
+  printf %s "$(cat)" | xclip -selection clipboard
+}
+		\end{minted}
+	\end{block}
+\end{frame}
+
+\begin{frame}[fragile]{Screenshot}
+	\begin{block}{xshot}
+		\begin{minted}[frame=lines]{shell}
+xshot() {
+	import -window "$(xdotool selectwindow)" \
+		~/xshot_$(date +%F_%H%M%S_%N).png
+}
+		\end{minted}
+	\end{block}
+\end{frame}
+
+\section[Section]{Git}
+
+\begin{frame}[fragile]{Git aliases}
+	\begin{block}{git co ci br wt}
+		\textasciitilde/.gitconfig
+		\begin{minted}[frame=lines]{ini}
+[alias]
+	co = checkout
+	ci = commit
+	st = status
+	br = branch
+	wt = worktree
+		\end{minted}
+	\end{block}
+	\begin{block}{gst}
+		\begin{minted}[frame=lines]{shell}
+alias gst='git status'
+		\end{minted}
+	\end{block}
+\end{frame}
+
+\begin{frame}[fragile]{Verbose commits}
+	\textasciitilde/.gitconfig
+	\begin{minted}[frame=lines]{ini}
+[commit]
+	verbose = true
+	\end{minted}
+	\begin{verbatim}
+# Changes to be committed:
+#	modified:   utils/localrepo
+# ------------------------ >8 ------------------------
+diff --git a/utils/localrepo b/utils/localrepo
+ HELP_DESCRIPTION = """
+-    Local opkg repository management script.
++    Local opkg repository management tool.
+     """
+	\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]{git worktree}
+	\begin{block}{git worktree add}
+		\begin{minted}[frame=lines]{shell}
+git branch work-todo
+git worktree add ../project-work-todo work-todo
+		\end{minted}
+	\end{block}
+	\begin{block}{git worktree prune}
+		\begin{minted}[frame=lines]{shell}
+rm -rf ../project-work-done
+git worktree prune
+		\end{minted}
+	\end{block}
+\end{frame}
+
+\begin{frame}[fragile]{Git hash $\to$ clipboard}
+	\begin{block}{gitclip}
+		\begin{minted}[frame=lines]{shell}
+gitclip() {
+	[ -n "$1" ] && local CMT="$1" || local CMT=HEAD
+	git rev-parse "$CMT"| clip
+}
+		\end{minted}
+	\end{block}
+	\begin{block}{gitmclip}
+		\begin{minted}[frame=lines]{shell}
+gitmclip() {
+	[ -n "$1" ] && local CMT="$1" || local CMT=HEAD
+	git log --format=%B -n 1 "$CMT" | clip
+}
+		\end{minted}
+	\end{block}
+\end{frame}
+
+\begin{frame}[fragile]{gitbmerge}
+	\begin{minted}[frame=lines]{shell}
+gitbmerge() {
+  (
+    set -e
+    local WT="$(git worktree list \
+      | sed -nE "/\[$1\]/{s/([^ ]+) .*/\1/p}")"
+    if [ -n "$WT" ]; then
+      rm -r "$WT"
+      git worktree prune
+    fi
+    git merge --ff-only "$1" && \
+    git push && git branch -d "$1" \
+      && git push origin :"$1"
+  )
+}
+	\end{minted}
+\end{frame}
+
+\section[Section]{Stahování}
+
+\begin{frame}[fragile]{Zpracování obsahu pomocí shellu}
+	\begin{block}{curl HREF | tar -xzf -}
+		\begin{minted}[frame=lines]{shell}
+curl http://repo.turris.cz/turris/OpenWrt-SDK.tar.bz2 \
+  | tar -xzf -
+		\end{minted}
+	\end{block}
+	\begin{block}{curl -s HREF | grep -n}
+		\begin{minted}[frame=lines]{shell}
+curl -s http://repo.turris.cz/turris/lists/base.lua \
+  | grep -n updater-ng
+		\end{minted}
+	\end{block}
+	Nikdy! \begin{verbatim}curl HREF | sh -s\end{verbatim}
+\end{frame}
+
+\begin{frame}[fragile]{Stažení všeho ze serveru}
+	\begin{block}{wget -r --no-parent (-l1)}
+		\begin{minted}[frame=lines]{shell}
+wget -r --no-parent \
+  http://repo.turris.cz/turris/packages/
+		\end{minted}
+	\end{block}
+\end{frame}
+
+\section[Section]{SSH}
+
+\begin{frame}[fragile]{Spuštění příkazu na několika hostech}
+	\begin{minted}[frame=lines]{shell}
+ROUTERS="1 159 189 156 104 199 135 171 244 172"
+I=0
+for R in $ROUTERS; do
+  echo "=== Runnining on 192.168.1.$R ==="
+
+  ssh -i ~/router root@192.168.1.$R -- $@
+
+  #scp -i ~/router user.lua \
+  # root@192.168.1.$R:/etc/updater/user.lua
+
+  #ssh -i ~/router root@192.168.1.$R \
+  # -- uci set turtetris.line=$I
+  #I=$(expr $I + 1)
+done
+	\end{minted}
+\end{frame}
+
+\begin{frame}[fragile]{Port forward}
+	\begin{minted}[frame=lines]{shell}
+ssh host -L 8484:localhost:8384
+	\end{minted}
+\end{frame}
+
+\begin{frame}[fragile]{SOCKS proxy}
+	\begin{minted}[frame=lines]{shell}
+ssh host -D 8123
+	\end{minted}
+\end{frame}
+
+\begin{frame}[fragile]{Trvalé připojení}
+	\begin{block}{cmd}
+		\begin{minted}[frame=lines]{shell}
+ssh host -o ControlMaster=auto \
+  -o ControlPath=$MCNF_DIR/.ssh_access/%r@%h:%p \
+  -o ControlPersist=600
+		\end{minted}
+	\end{block}
+	\begin{block}{ssh config}
+		\begin{minted}[frame=lines]{shell}
+Host *
+	ControlMaster auto
+	ControlPath .cache/ssh/%r@%h:%p
+	ControlPersist 600
+		\end{minted}
+	\end{block}
+\end{frame}
+
+\section[Section]{Bash (Zsh) a emulátor terminálu}
+
+\begin{frame}[fragile]{Prompt a exit code}
+	\begin{minted}[frame=lines]{shell}
+PROMPT_COMMAND='
+EC=$?
+if [[ $EC < 0 ]]; then
+	echo -e "\e[1;31m"EXIT: $EC"\e[0m"
+elif [[ $EC > 0 ]]; then
+	echo -e "\e[1;33m"EXIT: $EC"\e[0m"
+fi'
+	\end{minted}
+\end{frame}
+
+\begin{frame}[fragile]{Xterm (urxvt) title}
+	\begin{minted}[frame=lines]{shell}
+function settitle {
+	echo -ne "\033]0;`whoami`@`hostname`:`pwd`\007"
+}
+case "$TERM" in
+	xterm*|*rxvt*)
+		trap 'settitle' DEBUG
+		;;
+esac
+	\end{minted}
+\end{frame}
+
+\begin{frame}[fragile]{Zsh upozornění od dlouho-běžícího procesu}
+	\tiny
+	\begin{minted}[frame=lines]{shell}
+lrbell_duration=15
+lrbell_timestamp=$EPOCHSECONDS
+lrbell_window_id=0x0
+lrbell_active_window_id() {
+	xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2
+}
+lrbell_begin() {
+	lrbell_timestamp=$EPOCHSECONDS
+	lrbell_message="`pwd`: $1"
+	if [ -n "$DISPLAY" ]; then
+		lrbell_window_id=$(lrbell_active_window_id)
+	fi
+}
+lrbell_end() {
+	(( $EPOCHSECONDS - $lrbell_timestamp < $lrbell_duration )) && return 0
+	print -n '\a'
+	if [ -n "$DISPLAY" ] && [ -n "$lrbell_window_id" ]; then
+		if [ "$(lrbell_active_window_id)" != "$lrbell_window_id" ]; then
+			notify-send "Command finished" "$lrbell_message"
+		fi
+	fi
+}
+add-zsh-hook preexec lrbell_begin
+add-zsh-hook precmd lrbell_end
+	\end{minted}
+	\url{https://github.com/rcaloras/bash-preexec}
+\end{frame}
+
+\section[Section]{Bash doplňování}
+
+\begin{frame}[fragile]{Jednoduchý příklad}
+	\scriptsize
+	\begin{minted}[frame=lines]{shell}
+_sterm() {
+  local cur prev
+  _init_completion || return
+  COMPREPLY=()
+  local ops="-h --help -c -d -e -n -r -s -v"
+  case "$prev" in
+    -d|-r)
+	  ;;
+    -s)
+	  local speeds="2400 4800 9600 19200 38400 57600 115200 230400"
+	  COMPREPLY+=($(compgen -W "${speeds}" -- ${cur}))
+	  ;;
+    *)
+	  COMPREPLY+=($(compgen -W "${ops}" -- ${cur}))
+	  ;;
+  esac
+}
+complete -o default -F _sterm sterm
+	\end{minted}
+\end{frame}
+
+\begin{frame}[fragile]{gitbmerge doplňování}
+	\scriptsize
+	\begin{minted}[frame=lines]{shell}
+_gitbmerge() {
+	local cur prev
+	_init_completion || return
+	[ $COMP_CWORD -gt 1 ] &&  return # Complete only single dependency
+	COMPREPLY=()
+	local GDIR="$(pwd)"
+	while [ ! -d "$GDIR/.git"  ]; do
+		[ -z "$GDIR" ] && return
+		GDIR="${GDIR%/*}"
+	done
+	GDIR="$GDIR/.git"
+	[ -f "$GDIR" ] && GDIR="$(cat "$GDIR")"
+	[ -d "$GDIR/refs/heads" ] || return
+	local ops=""
+	for B in "$GDIR"/refs/heads/*; do
+		ops="$ops ${B#$GDIR/refs/heads/}"
+	done
+	COMPREPLY+=($(compgen -W "${ops}" -- ${cur}))
+}
+complete -F _gitbmerge gitbmerge
+	\end{minted}
+\end{frame}
+
+
+\begin{frame}
+	\Huge A jaké tipy máte vy?
+
+	\Large Děkuji za pozornost. 
+
+	% Poznamka ze vse je take pro zsh v mem gitu
+\end{frame}
+
+\end{document}
-- 
cgit v1.2.3

