%% 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
