aboutsummaryrefslogtreecommitdiff
path: root/presentation.tex
diff options
context:
space:
mode:
Diffstat (limited to 'presentation.tex')
-rw-r--r--presentation.tex683
1 files changed, 683 insertions, 0 deletions
diff --git a/presentation.tex b/presentation.tex
new file mode 100644
index 0000000..957f17f
--- /dev/null
+++ b/presentation.tex
@@ -0,0 +1,683 @@
+%% SPDX-License-Identifier: CC0-1.0
+%%
+%% Copyright (C) 2024, 2025 Woj. Kosior <koszko@koszko.org>
+
+\documentclass[
+ hyperref={
+ hyperfootnotes = false,
+ pdftex,
+ colorlinks = true,
+ linkbordercolor = .,
+ linkcolor = [rgb]{0,0.2,0},
+ urlcolor = [rgb]{0,0,0.5},
+ citecolor = [rgb]{0.5,0,0}
+ }
+]{beamer}
+
+\usepackage{polski}
+\usepackage{pgfpages}
+\usetheme{Rochester}
+\usecolortheme{seagull}
+\usepackage{calc}
+\usepackage{svg}
+\usepackage{graphicx}
+\usepackage[export]{adjustbox}
+\usepackage{verbatimbox}
+\usepackage{listings}
+\usepackage{seqsplit}
+\usepackage{soul}
+\usepackage{substr}
+\usepackage{colortbl}
+\usepackage{booktabs,tabularx}
+\usepackage[normalem]{ulem}
+
+\setbeamertemplate{navigation symbols}{}
+\setbeamertemplate{footline}[frame number]
+
+\IfSubStringInString{\detokenize{-handouts}}{\jobname}{
+ \mode<handout>{\setbeamercolor{background canvas}{bg=black!10}}
+ \pgfpagesuselayout{2 on 1}[letterpaper,border shrink=5mm]
+}{}
+
+\IfSubStringInString{\detokenize{-onlynotes}}{\jobname}{
+ \setbeameroption{show only notes}
+}{}
+
+\IfSubStringInString{\detokenize{-onlyslides}}{\jobname}{
+ % nothing
+}{}
+
+\IfSubStringInString{\detokenize{-pympress}}{\jobname}{
+ \usepackage{pgfpages}
+ \setbeameroption{show notes on second screen}
+}{}
+
+\IfSubStringInString{\detokenize{-slidesandnotes}}{\jobname}{
+ \setbeameroption{show notes}
+}{}
+
+% https://tex.stackexchange.com/questions/249040/scale-column-of-a-table-in-percentage-of-textwidth#answer-249043
+\newdimen\netTableWidth
+\newcommand{\columnsCount}[1]{%
+ \netTableWidth=\dimexpr
+ \linewidth
+ - #1\tabcolsep - #1\tabcolsep
+ - #1\arrayrulewidth -2\arrayrulewidth
+ \relax%
+}
+
+\usepackage{tikzpagenodes}
+\usetikzlibrary{calc}
+\tikzset{frameoverlay/.style={overlay,remember picture,shift={(current page text area.south west)},
+x={($(current page text area.south east)-(current page text area.south west)$)},
+y={($(current page text area.north west)-(current page text area.south west)$)},nodes={anchor=south west}}}
+
+\newcommand{\logosInHeading}{
+ \begin{tikzpicture}[frameoverlay]
+ \path
+ (-0.079,1.005) node{
+ \includegraphics[
+ height=0.5in
+ ]{Logo-WIET-2021.png}
+ }
+ (0.835,0.966) node{
+ \includegraphics[
+ height=0.7in
+ ]{agh_idub_pl_cmyk.pdf}
+ };
+ \end{tikzpicture}
+}
+
+\makeatletter
+\long\def\beamer@@frametitle[#1]#2{%
+ \beamer@ifempty{#2}{}{%
+ \gdef\insertframetitle{\centering{#2\ifnum\beamer@autobreakcount>0
+ \relax{}\space\usebeamertemplate*{frametitle continuation}\fi}}%
+ \gdef\beamer@frametitle{#2}%
+ \gdef\beamer@shortframetitle{#1}%
+ \logosInHeading{}%
+}%
+}
+\makeatother
+
+\newcommand{\svgframe}[2]{%
+ \begin{frame}{#1}
+ \includesvg[
+ width=\linewidth,
+ inkscapelatex=false
+ ]{#2}
+ \begin{center}
+ \textit{(na podstawie opracowania własnego)}
+ \end{center}
+ \end{frame}%
+}
+
+\newcommand{\puttitle}{Potwierdzanie autentyczności oprogramowania poprzez
+ powtarzalność kompilacji}
+
+\newcommand{\putauthorname}{Wojciech Kosior}
+
+\hypersetup{
+ pdftitle = {\puttitle},
+ pdfauthor = {\putauthorname}
+}
+
+\title{\puttitle{}}
+\date{}
+
+\begin{document}
+
+\begin{frame}{}
+ \titlepage
+
+ \vspace{-0.5in}
+
+ \renewcommand{\arraystretch}{\baselinestretch}
+ \columnsCount{2}
+
+ {\small
+ \begin{tabular}{ m{.35\netTableWidth} m{.65\netTableWidth} }
+ Autor: & \putauthorname \\
+ Opiekun pracy: & dr hab.\ inż.\ Piotr Pacyna, prof.\ AGH \\
+ Wydział: & Informatyki, Elektroniki i Telekomunikacji
+ \end{tabular}
+ }
+
+ \renewcommand{\arraystretch}{1.5}
+
+ \vspace{2in}
+ \begin{tikzpicture}[frameoverlay]
+ \path
+ (0.22,0.027) node{
+ \includegraphics[
+ height=0.85in
+ ]{Logo-WIET-2021.png}
+ }
+ (0.5,0.005) node{
+ \includegraphics[
+ height=1.05in
+ ]{agh_idub_pl_cmyk.pdf}
+ };
+ \end{tikzpicture}
+\end{frame}
+
+\note{
+ \begin{itemize}
+ \item nazywam się\ldots{}
+ \item opiekun to\ldots{}
+ \item praca o: zabezpieczenie łańcucha dostaw oprogramowania
+ \end{itemize}
+}
+
+\svgframe{Złożoność procesu kompilacji}{build-process-overview.svg}
+
+\note{
+ \begin{itemize}
+ \item kompilacja: szeroko rozumiana (pakiety, ``budowanie'')
+ \item slajd: przykład
+ \item kompilacja do norm dystrybucji: nawet setki lini skryptu-przepisu na
+ pakiet
+ \end{itemize}
+}
+
+\begin{frame}{Najważniejsze pojęcia}
+ \begin{itemize}
+ \item powtarzalność \textit{(reproducibility)}
+ \item hermetyczność
+ \item bootstrapowalność
+ \end{itemize}
+
+ \vspace{0.3in}
+
+ \includesvg[
+ width=\linewidth,
+ inkscapelatex=false
+ ]{boxes.svg}
+\end{frame}
+
+\note{
+ \begin{itemize}
+ \item przy każdym powtórzeniu tej samej kompilacji -- bit-do-bitu identyczny
+ wynik
+ \item wykorzystanie wielokrotnej kompilacji
+ \begin{itemize}
+ \item różne infrastruktury/organizacje
+ \item utrudnione zanieczyszczenie oprogramowania złośliwym kodem w procesie
+ kompilacji
+ \end{itemize}
+ \item warunek konieczny niewystarczający powtarzalności: niezależność od
+ zmiennych
+ \begin{itemize}
+ \item zainstalowane programy, zasoby sieciowe
+ \item stąd: izolowanie procesu na poziomie sieci i systemu plików
+ \end{itemize}
+ \item pakiet samozależny: pakowanie
+ \end{itemize}
+}
+
+\begin{frame}{Cel pracy}
+ \begin{itemize}
+ \item \sout{zapewnić deterministyczne działanie kompilatorów i powiązanych
+ narzędzi}
+ \item \textbf{zapewnić niezmienność elementów na wejściu procesu
+ (re)kompilacji}
+ \item \textbf{uniknąć pojedynczych punktów podatności \textit{(single points
+ of failure)} w procesie}
+ \end{itemize}
+\end{frame}
+
+\note{
+ \begin{itemize}
+ \item usuwanie źródeł niepowtarzalności w procesie kompilacji
+ \begin{itemize}
+ \item dotychczasowe prace innych osób
+ \item \textbf{nie} przedmiot tych badań
+ \end{itemize}
+ \item zamiast tego
+ \begin{itemize}
+ \item konkretne wersje zależności, narzędzi i (meta)danych w 1. kompilacji
+ \begin{itemize}
+ \item zagwarantowanie, że można je zidentyfikować
+ \item zagwarantowanie, że przy powtórzeniu kompilacji nie zostaną użyte
+ inne wersje
+ \end{itemize}
+ \item proces rozwiązywania zależności
+ \begin{itemize}
+ \item często wykonywany automatycznie
+ \item weryfikowanie powtarzalności jego wyniku
+ \end{itemize}
+ \end{itemize}
+ \end{itemize}
+}
+
+\begin{frame}{Stan dotychczasowy}
+ \vspace{-0.2in}
+
+ \begin{center}
+ Kompilacja pakietów
+ \end{center}
+
+ \renewcommand{\arraystretch}{\baselinestretch}
+ \columnsCount{2}
+
+ {\small
+ \begin{tabular}{
+ >{\centering\arraybackslash}m{.5\netTableWidth}
+ >{\centering\arraybackslash}m{.5\netTableWidth}
+ }
+ powtarzalność monitorowana & powtórzenie utrudnione
+ \end{tabular}
+ }
+
+ \vspace{-0.3in}
+
+ \includesvg[
+ width=\linewidth,
+ inkscapelatex=false
+ ]{ecosystems-state.svg}
+
+ \begin{center}
+ \textit{(na podstawie opracowania własnego, z wykorzystaniem logotypów
+ istniejących projektów)}
+ \end{center}
+\end{frame}
+
+\note{
+ \begin{itemize}
+ \item praca skupiona na: repozytoria z tysiącami pakietów
+ \item Debian, GNU Guix
+ \begin{itemize}
+ \item state of the art
+ \item zasady działania opisane w pracy
+ \end{itemize}
+ \item repozytoria specyficzne dla konkretnych ekosystemów
+ \begin{itemize}
+ \item różna higiena
+ \item zautomatyzowanie rekompilacji = wyzwanie
+ \end{itemize}
+ \end{itemize}
+}
+
+\begin{frame}{Postęp pakowania w 2025}
+ \renewcommand{\arraystretch}{1.5}
+ \columnsCount{4}
+
+ \begin{tabular}{
+ >{\raggedright\arraybackslash}p{.43\netTableWidth}
+ >{\raggedright\arraybackslash}p{.19\netTableWidth}
+ >{\raggedright\arraybackslash}p{.19\netTableWidth}
+ >{\raggedright\arraybackslash}p{.19\netTableWidth}
+ }
+ \rowcolor{gray!40}
+ \textit{\textbf{ekosystem}} &
+ \textbf{PyPI} &
+ \textbf{npm} &
+ \textbf{crates} \\
+
+ \textit{\textbf{pakiety w GNU Guix}} &
+ $3\,699$ &
+ $55$ &
+ $3\,704$ \\
+
+ \textit{\textbf{pakiety w Debianie}} &
+ $5\,312$ &
+ $998$ &
+ $1\,424$
+ \end{tabular}
+ \begin{center}
+ \textit{(na podstawie opracowania własnego)}
+ \end{center}
+\end{frame}
+
+\note{
+ \begin{itemize}
+ \item stwierdzono: powolne przedostawanie się oprogramowania npm do
+ reprodukowalnych dystrybucji
+ \item \textbf{opisane obszernie} w pracy przypuszczenia powodów: trudne
+ bootstrapowanie, niskie zainteresowanie taką formą pakietów, \textbf{duże
+ drzewa zależności}, \textbf{dopuszczanie zależności występujących w wielu
+ wersjach jednocześnie} (aka konfliktów)
+ \end{itemize}
+}
+
+\begin{frame}{Ekosystem npm}
+ \includesvg[
+ width=\linewidth,
+ inkscapelatex=false
+ ]{dependee_counts.svg}
+ \begin{center}
+ \textit{(na podstawie opracowania własnego)}
+ \end{center}
+\end{frame}
+
+\note{
+ \begin{itemize}
+ \item w pracy opisany dokładnie ekosystem npm (rodzaje zależności itd.)
+ \item popularność = ile innych pakietów używa danego pakietu
+ \item badanie Goswami'ego z 2019, porównanie, analizowane zmiany
+ \item ogółem olbrzymie drzewa zależności, po ponad 1000 pakietów do projektu
+ \item pytanie: jaka część zależności faktycznie potrzebna do kompilacji
+ pakietu?
+ \end{itemize}
+}
+
+\begin{frame}{Problem rozwiązywania zależności}
+ Dotychczasowe i zaproponowane podejścia do powtarzalności (``paradygmaty'')
+
+ \vspace{0.5\baselineskip}
+
+ \begin{itemize}
+ \setcounter{enumi}{-1}
+ \itemsep0.5\baselineskip
+ \item Brak powtarzalności \pause
+ \item Zależności ustalone, brak kroku rozwiązywania zależności (GNU Guix)
+ \item Powtarzalność kompilacji \textbf{nieobejmująca rozwiązywania
+ zależności} (pliki lockfile, Debian) \pause
+ \item Rozwiązywanie zależności powtarzane w ramach rekompilacji (nowe!)
+ \end{itemize}
+
+ \note<2>{
+ \begin{itemize}
+ \item klasyczne podejście (paradygmat 2) -- określić zestaw zależności,
+ udostępnić je dla procesu kompilacji pakietu, wykonać proces, najlepiej w
+ izolacji
+ \begin{itemize}
+ \item powtórzenia w oparciu o określone raz drzewo zależności
+ \item samo budowanie drzewa -- generalnie nie powtarzalne
+ \end{itemize}
+ \item Guix, Nix: przepis na pakiet = zdefiniowane wszystko
+ \end{itemize}
+ }
+
+ \note<3>{
+ \begin{itemize}
+ \item zależności nieustalone a priori kompilacji
+ \item odpowiednie mechanizmy $\rightarrow{}$ gwarantowanie dostępności i
+ niezmienności metadanych \textbf{potencjalnych} zależności
+ \item budowanie drzewa zależności -- powtarzalne
+ \end{itemize}
+ }
+\end{frame}
+
+\begin{frame}{Najważniejsze pytania badawcze}
+ \begin{itemize}
+ \itemsep0.5\baselineskip
+ \item Jakie są typowe rozmiary drzew zależności projektów npm?
+ \item W jakim stopniu można je zredukować?
+ \item Czy rozmiary drzew zależności i zależności w wielu wersjach jednocześnie
+ stanowią główną przeszkodę w pakowaniu oprogramowania npm?
+ \end{itemize}
+\end{frame}
+
+\note{
+ \begin{itemize}
+ \item interesują: drzewa zależności \textbf{kompilacji}
+ \item dodatkowo: eliminacja zależności bezpośrednich, pośrednich, czy
+ bezpośrednich+pośrednich?
+ \item i.e., opisane wcześniej przypuszczenia głównych problemów – czy słuszne?
+ \end{itemize}
+}
+
+\begin{frame}{Eksperyment}
+ \begin{itemize}
+ \itemsep0.5\baselineskip
+ \item Próba rekompilacji najpopularniejszych pakietów z npm Registry
+ \item Eliminacja zbędnych zależności
+ \item Określenie minimalnych drzew zależności
+ \end{itemize}
+
+ \vspace{0.3in}
+
+ \begin{center}
+ \includesvg[
+ width=0.2\linewidth,
+ inkscapelatex=false
+ ]{construction-crane.svg}
+ \end{center}
+\end{frame}
+
+\note{
+ \begin{itemize}
+ \item ok. 300 najpopularniejszych pakietów z npm Registry
+ \item sprawdzenie: czy rekompilacja wg ``standardowej'' procedury możliwa
+ \item czy usunięcie danej zależności = błąd kompilacji?
+ \item rekompilacja wielokrotna każdego pakietu
+ \end{itemize}
+}
+
+\begin{frame}{Statusy pakietów}
+ \vspace{-0.25\baselineskip}
+
+ \begin{center}
+ \includesvg[
+ width=0.95\linewidth,
+ inkscapelatex=false
+ ]{status-counts.svg}
+ \end{center}
+
+ \begin{center}
+ \textit{(na podstawie opracowania własnego)}
+ \end{center}
+\end{frame}
+
+\note{
+ \begin{itemize}
+ \item konwencjonalne procedury -- automatyczne zrekompilowanie 10-20\% pakietów
+ \item porównywalnie, jak u Goswami'ego w 2019
+ \item pakiety zrekompilowane z powodzeniem: dalsze testowanie
+ \end{itemize}
+}
+
+\begin{frame}{Rozmiary drzew zależności}
+ \includesvg[
+ width=\linewidth,
+ inkscapelatex=false
+ ]{tree-size-stats-no-bc.svg}
+
+ \vspace{-0.5\baselineskip}
+
+ \begin{center}
+ \textit{(na podstawie opracowania własnego)}
+ \end{center}
+\end{frame}
+
+\note{
+ \begin{itemize}
+ \item wykres: pierwotne i zredukowane drzewa zależności pakietów
+ \item porównanie: pakiety, które mają odpowiedniki w Debianie i pozostałe
+ \item brak spodziewanego związku ``rozmiar drzewa zależności : obecność w
+ Debianie''
+ \item nieusuwalne konflikty zależności -- również brak spodziewanego związku z
+ obecnością w Debianie
+ \end{itemize}
+}
+
+\begin{frame}{Wnioski}
+ \begin{itemize}
+ \itemsep0.5\baselineskip
+ \item Główne przeszkody w pakowaniu oprogramowania npm inne od przypuszczanych
+ \pause
+ \item Dotychczasowe paradygmaty najprawdopodobniej wystarczające do
+ zastosowania powtarzalności kompilacji do oprogramowania npm\ldots{} \pause
+ \item \ldots{}za to powtarzalnie kompilowane pakiety w dystrybucjach --
+ nieadekwatne do potrzeb developerów \pause
+ \item Poziom bezpieczeństwa wynikający z powtarzalności kompilacji trudny
+ do osiągnięcia inaczej\ldots{} \pause
+ \item \ldots{}ale rozpowszechnienie tego środka wymaga kompatybilności z
+ dominującymi narzędziami i formatami pakietów
+ \end{itemize}
+
+ \note<1>{
+ \begin{itemize}
+ \item główne przeszkody: nie wielkość drzew, nie konflikty zależności
+ \item raczej bootstrapowalność, marne zainteresowanie takimi pakietami w
+ formacie Guix'a
+ \end{itemize}
+ }
+
+ \note<2>{
+ \begin{itemize}
+ \item nowy paradygmat niekoniecznie potrzebny
+ \item Guix: trudna bootstrapowalność, ale też OK
+ \item Guix/Nix: brak SPOF jak w Debianie
+ \end{itemize}
+ }
+
+ \note<3>{
+ \begin{itemize}
+ \item zwykła, prosta komenda ``npm install''
+ \item nie pożeniona z pakietami Guix
+ \end{itemize}
+ }
+
+ \note<4>{
+ \begin{itemize}
+ \item SolarWinds 2020
+ \item pojednycza, niby dobrze zabezpieczona infra
+ \end{itemize}
+ }
+
+ \note<5>{
+ \begin{itemize}
+ \item Święty Graal: repozytorium z powtarzalnie zkompilowanymi pakietami
+ \textbf{w formacie npm}
+ \item analogicznie dla PyPI itd.
+ \end{itemize}
+ }
+\end{frame}
+
+\begin{frame}{Dziękuję za uwagę!}
+ Grafiki podmiotów trzecich wykorzystane w prezentacji:
+
+ \vspace{\baselineskip}
+
+ {\small
+ \columnsCount{3}
+ \begin{tabular}{
+ >{\raggedright\arraybackslash}p{.34\netTableWidth}
+ >{\raggedright\arraybackslash}p{.20\netTableWidth}
+ >{\raggedright\arraybackslash}p{.46\netTableWidth}
+ }
+ \href{https://en.wikipedia.org/wiki/File:Debian-OpenLogo.svg}{logo
+ Debian} &
+ \includesvg[
+ height=\baselineskip,
+ inkscapelatex=false
+ ]{Debian-OpenLogo.svg} &
+ %% -- Software in the Public Interest, Inc (na licencjach
+ %% \href{https://creativecommons.org/licenses/by-sa/3.0/legalcode.en}{CC BY-SA
+ %% 3.0 Unported} lub
+ %% \href{https://www.gnu.org/licenses/lgpl-3.0.html#license-text}{GNU LGPL
+ %% wersja 3} lub późniejsza)
+ \\
+
+ \href{https://en.wikipedia.org/wiki/File:Guix_logo.svg}{logo GNU Guix} &
+ \includesvg[
+ height=\baselineskip,
+ inkscapelatex=false
+ ]{Guix_logo.svg} &
+ %% --
+ %% Luis Felipe López Acevedo (na licencji
+ %% \href{https://creativecommons.org/licenses/by-sa/4.0/legalcode.en}{CC BY-SA
+ %% 4.0 International})
+ \\
+
+ \href{https://en.wikipedia.org/wiki/File:NixOS_logo.svg}{logo NixOS} &
+ \includesvg[
+ height=\baselineskip,
+ inkscapelatex=false
+ ]{NixOS_logo.svg} &
+ %% --
+ %% Tim Cuthbertson (na licencji
+ %% \href{https://creativecommons.org/licenses/by/4.0/legalcode.en}{CC BY 4.0
+ %% International})
+ \\
+
+ \href{https://en.wikipedia.org/wiki/File:Archlinux-logo-standard-version.svg}{logo
+ Arch Linux} &
+ \includesvg[
+ height=\baselineskip,
+ inkscapelatex=false
+ ]{Archlinux-logo-standard-version.svg} &
+ %% -- Judd Vinet, Aaron Griffin i Levente Polyák (na licencji GNU
+ %% GPL wersja 2 lub późniejsza)
+ \\
+
+ \href{https://en.wikipedia.org/wiki/File:Npm-logo.svg}{logo npm} &
+ \includesvg[
+ height=\baselineskip,
+ inkscapelatex=false
+ ]{Npm-logo.svg} &
+ %% -- npm, Inc.
+ \\
+
+ \href{https://en.wikipedia.org/wiki/File:PyPI_logo.svg}{logo PyPI} &
+ \includesvg[
+ height=\baselineskip,
+ inkscapelatex=false
+ ]{PyPI_logo.svg} &
+ %% -- Python Software Foundation (na licencji GNU GPL wersja 2 lub
+ %% późniejsza)
+ \\
+
+ \href{https://en.wikipedia.org/wiki/File:Rust_programming_language_black_logo.svg}{logo
+ Rust} &
+ \includesvg[
+ height=\baselineskip,
+ inkscapelatex=false
+ ]{Rust_programming_language_black_logo.svg} &
+ %% -- Rust Foundation (na licencji
+ %% \href{https://creativecommons.org/licenses/by/4.0/legalcode.en}{CC BY
+ %% 4.0 International})
+ \\
+
+ \href{https://en.wikipedia.org/wiki/File:Apache_Maven_logo.svg}{logo
+ Apache Maven} &
+ \includesvg[
+ height=\baselineskip,
+ inkscapelatex=false
+ ]{Apache_Maven_logo.svg} &
+ %% -- Apache Software Foundation (na licencji
+ %% \href{https://www.apache.org/licenses/LICENSE-2.0}{Apache 2.0})
+ \\
+
+ \href{https://seeklogo.com/vector-logo/272997/composer}{logo Composer} &
+ \includesvg[
+ height=\baselineskip,
+ inkscapelatex=false
+ ]{composer-seeklogo.svg} &
+ %% -- WizardCat (na licencji
+ %% \href{https://github.com/composer/composer/raw/main/LICENSE}{Expat})
+ \\
+
+ \href{https://openclipart.org/detail/202046/loupe-magnifer}{lupa} &
+ \includesvg[
+ height=\baselineskip,
+ inkscapelatex=false
+ ]{Loupe.svg} &
+ \href{https://openclipart.org/artist/spadassin}{openclipart.org/artist/spadassin}
+ \\
+
+ \href{https://openclipart.org/detail/3574/-by--3574}{kartonowe pudło} &
+ \includesvg[
+ height=\baselineskip,
+ inkscapelatex=false
+ ]{bogdanco_Simple_cardboard_box.svg} &
+ \href{https://openclipart.org/artist/bogdanco}{openclipart.org/artist/bogdanco}
+ \\
+
+ \href{https://openclipart.org/detail/168285/construction-crane}{żuraw
+ budowlany} &
+ \includesvg[
+ height=\baselineskip,
+ inkscapelatex=false
+ ]{construction-crane.svg} &
+ \href{https://openclipart.org/artist/Markacio}{openclipart.org/artist/Markacio}
+ \end{tabular}
+ }
+\end{frame}
+
+\end{document}
+
+% https://publicdomainvectors.org/en/free-clipart/Vector-image-of-closed-cardboard-box/19548.html
+% https://publicdomainvectors.org/en/free-clipart/Loupe-magnifer/73563.html