R E SILIENT T E CHNOLOGIES WHY DECADES-OLD TOOLS DEFINE THE ROOT OF MODERN RESEARCH DATA MANAGEMENT LUKAS C. BOSSERT
[email protected] �0000-0003-3076-3968 IT Center @ RWTH AACHEN UNIVERSITY Department: Research Process & Data Management Group: Technical Training & Consulting Version: 1.0.0 cba LuaHBTeX, Version 1.22.0 (TeX Live 2025) GNU Emacs 30.2 | org-mode: 9.7.34 DOI: 10.5281/zenodo.17157588 Powered by: Org mode 1#+TITLE: Resilient Technologies 2#+SUBTITLE: Why Decades-Old Tools Define the ROOT of Modern Research Data Management 3#+AUTHOR: Lukas C. Bossert 4#+DATE: [2025-10-28] 5#+EMAIL:
[email protected] 6#+LANGUAGE: en 7#+FILETAGS: poster:coding:reproducibility 8#+OPTIONS: title:nil author:nil date:nil toc:nil 9#+LATEX_COMPILER: lualatex 10 #+LATEX_CLASS: article 11 #+LATEX_CLASS_OPTIONS: [12pt] 12 #+LATEX_HEADER: \usepackage[english]{babel} 13 #+LATEX_HEADER: \usepackage[a0paper,top=0cm,bottom=20cm,left=0cm,right=0cm]{geometry} 14 #+LATEX_HEADER: \usepackage{fontspec,longtable,microtype,multicol,titlesec,caption} 15 #+LATEX_HEADER: \captionsetup{labelfont=bf,font={sf,small}} 16 #+LATEX_HEADER: \setmainfont[Numbers = {Monospaced, OldStyle}, Scale=0.90, ItalicFont = Roboto-LightItalic, BoldFont = Roboto-Medium,]{Roboto-Light} 17 #+LATEX_HEADER: \usepackage{enumitem} \setlist{nosep} 18 #+LATEX_HEADER: \usepackage[RGB]{xcolor} 19 #+LATEX_HEADER: \definecolor{rwth-blue-100}{RGB}{ 0, 84,159} 20 #+LATEX_HEADER: \definecolor{rwth-blue-25}{RGB}{199,221,242} 21 #+LATEX_HEADER: \usepackage[minted,most,skins,breakable]{tcolorbox} 22 #+LATEX_HEADER: \RenewTCBListing{minted}{O{}m}{myhbox={fonttitle=\bfseries,coltitle=rwth-blue-100,}{#2}, breakable, enhanced jigsaw, listing only, listing engine=minted, minted language=#2, boxrule=0.25pt, colframe=rwth-blue-25, colback=rwth-blue-25, opacityback=0.4, minted options = {fontsize=\small,baselinestretch=.75,breaklines,breakanywhere,autogobble,style=friendly,#1}} 23 #+LATEX_HEADER: \RenewTCBListing{verbatim}{}{listing engine=minted,opacityframe =0.1,opacityback =0.1,colback=black,colframe=black,breakable, enhanced jigsaw, listing only,minted options = {breaklines,breakanywhere,autogobble,}} 24 #+LATEX_HEADER: \AtBeginEnvironment{longtable}{\footnotesize} 25 #+LATEX_HEADER: \usepackage[norule,marginal,hang]{footmisc} 26 #+LATEX_HEADER: \setcounter{secnumdepth}{-1} \pagestyle{empty} 27 #+LATEX_HEADER: \makeatletter 28 #+LATEX_HEADER: \tcbset{myhbox/.style 2 args={enhanced,breakable,colback=white,colframe=rwth-blue-100,attach boxed title to top left={yshift*=-\tcboxedtitleheight},title={#2},boxed title size=title,boxed title style={sharp corners,rounded corners=northwest,colback=tcbcolframe,boxrule=0pt},underlay boxed title={\path[fill=tcbcolframe] (title.south west)--(title.south east) to[out=0, in=180] ([xshift=5mm]title.east)-- (title.center-|frame.east) [rounded corners=\kvtcb@arc] |- (frame.north) -| cycle;},#1}} 29 #+LATEX_HEADER: \makeatother 30 #+LATEX_HEADER: \newtcolorbox{sectitlebox}[1]{myhbox={frame empty}{#1},nobeforeafter,after=\vspace*{-1.75\baselineskip}} 31 #+LATEX_HEADER: \titleformat{\section}{\normalfont\Large\bfseries}{}{0pt}{\tcbheading} 32 #+LATEX_HEADER: \titleformat{\subsection}{\normalfont\large}{}{0pt}{\tcbheading} 33 #+LATEX_HEADER: \newcommand{\tcbheading}[1]{\begin{sectitlebox}{#1} \end{sectitlebox}} 34 #+LATEX_HEADER: \setlength{\parindent}{0pt}\setlength{\parskip}{6pt} 35 #+CITE_EXPORT: biblatex ext-alphabetic-verb 36 #+BIBLIOGRAPHY: references.bib 37 #+PROPERTY: header-args:latex :exports code :mkdirp yes :eval never :tangle "resilient-technologies-poster.tex" 38 #+PROPERTY: header-args:bash :results verbatim :exports both :mkdirp yes 39 #+PROPERTY: header-args:shell :results verbatim :exports both :mkdirp yes 40 41 #+begin_export latex 42 \begin{multicols}{5} 43 #+end_export 44 This poster demonstrates how decades-old yet robust digital tools can be combined in a /literate programming/ workflow. All content you see here — text, data, and code — has been created, executed, and rendered within a single source file. The entire poster is thus both a publication /and/ a working research object: every figure, dataset, and code snippet can be regenerated at any time, ensuring complete transparency and reproducibility [cite:@Hinsen2025Trust,@Hinsen2025Reproducibility]. 45 46 #+begin_quote 47 Documentation must be regarded as an integral part of the process of design and 48 coding. A good programming language 49 will encourage and assist the programmer to write clear, self-documenting code, 50 and even perhaps to develop and display a pleasant style of writing. [cite:@Hoare1973] 51 #+end_quote 52 53 This approach embodies the very idea of the *Resilient Technologies* concept: software and methods that persist not because of trends, but because of their clarity, openness, and lasting utility. Tools like ~Emacs~,~sed~, or ~awk~ remain essential not as relics, but as reliable companions for modern Research Data Management — stable foundations on which reproducible workflows can be built. 54 55 A small detail worth mentioning: the title font of this poster has been chosen very deliberately. It is called =Trajan= — a typeface inspired by the stone-carved capitals of the Trajan Column in Rome (2nd century AD). Its enduring elegance perfectly reflects the message of this work: that well-crafted designs, whether in stone or in code, can remain relevant for centuries. Just as ~awk~ or ~tar~ continue to serve in today’s data ecosystems, =Trajan= persists as a timeless artifact of precision and clarity. For aesthetic balance, we slightly refined the digital kerning of the font to match the harmony we seek between tradition and technology. 56 57 For this poster we follow a use case and show how to use the mentioned tools while following the research data life cycle. Going through the various tools we download a file, process it, analyze it and prepare it for proper archiving. 58 59 * Abstract :noexport: 60 The list below defines the content of the data-driven-visualization circle: 61 #+begin_src csv :tangle ddv-resilient-technologies.csv :eval never 62 category,name,description,startangle,totalangle,color 63 utility,rsync,"Sync and backup (incremental)",-90,60,passive 64 utility,LaTeX,"Typeset reports, posters, DMPs",90,180,passive 65 utility,perl,"Text processing and glue scripting",30,120,passive 66 utility,find,"Discover files (recursive search)",60,90,passive 67 utility,SQLite,"Local catalogs and metadata",30,120,passive 68 utility,cron,"Automate recurring runs",30,180,active 69 pipeline,curl,"Acquire data (HTTP, APIs, repos)",200,160,active 70 pipeline,sed,"Clean and normalize text streams",30,60,active 71 pipeline,grep,"Validate/search (regex)",30,120,active 72 pipeline,awk,"Summarize and analyze (aggregations)",30,120,active 73 pipeline,tar,"Package for archiving; add checksum",-90,60,active 74 pipeline,diff,"Verify and compare against previous/manifest",-30,60,active 75 orchestrator,make,"SOP that orchestrates steps and dependencies",30,300,active 76 hub,emacs / org-mode,"Hub for notes, code, writing; literate workflows",90,360,all 77 #+end_src 78 79 For the data-driven-visualization we need a package that has not been published, 80 yet. But it is publicly availbale 81 #+name: curl for ddv.sty 82 #+begin_src shell :results none 83 curl -L -O -C - -# "https://git.rwth-aachen.de/dl/templates/data-driven-visualization/-/raw/main/ddv.sty" 84 #+end_src 85 86 #+begin_src latex :noweb yes :tangle resilient-technologies-abstract.tex :results none :eval never 87 \documentclass{standalone} 88 \RequirePackage{fontspec} % Required for specifying fonts 89 \setmainfont{TeX Gyre Heros} % Setting the main font to TeX Gyre Heros 90 \newfontfamily\ddvHeaderFont{TeX Gyre Cursor} 91 \usepackage[RGB]{xcolor} 92 \definecolor{rwth-blue-100}{RGB}{ 0, 84,159} 93 \definecolor{rwth-blue-25}{RGB}{199,221,242} 94 \definecolor{rwth-blue-75}{RGB}{64,127,183} 95 \definecolor{rwth-bordeaux-100}{RGB}{161,16,53} 96 \colorlet{passive}{rwth-blue-25}\colorlet{active}{rwth-blue-100} 97 \colorlet{all}{rwth-bordeaux-100} 98 \usepackage[ 99 innercirclesize =5, 100 dataset ={% 101 name = {ddv-resilient-technologies.csv}, 102 sorting = {totalangle}}, 103 stages ={% 104 name = {{Planning,Production,{Analysis},Archiving,Access,Re-use}}, 105 bgcolor = {rwth-blue-100}, 106 fontsize = 50}, 107 slices ={% 108 fontcolor = {white}, 109 fontsize = 22} 110 ]{ddv} 111 \begin{document} 112 \DDV{% 113 stages = {options = {{% 114 arc data pos={\WCmidangle<180?.4:.6}, 115 radius={1.5+\thestagesRadius}{4+\thestagesRadius}, 116 gap=2}}}, 117 slices = {options = {{% 118 arc data pos={\WCmidangle<180?.4:.6}, 119 radius={1+\thestagesRadius}{2+\thestagesRadius}, 120 gap=0}}}} 121 \end{document} 122 #+end_src 123 124 * Poster Start :noexport: 125 ** Preamble 126 The preamble is the essential part of defining the outcome and the style of the 127 posteer. We document it as one block since it is of less importance than the 128 actual content. 129 #+name: preamble 130 #+begin_src latex 131 \DocumentMetadata{ pdfversion=1.7, pdfstandard=A-3b} 132 \RequirePackage{snapshot} 133 \documentclass[english,a0paper]{scrartcl} 134 \providecommand\InfoTeX{}\providecommand\InfoOrg{}\providecommand\InfoEmacs{} 135 \providecommand\restWatermark{data_life_cycle_eng_rgb.png} 136 \newcommand\restDOInumber{10.5281/zenodo.17157588} 137 \def\restVersion{1.0.0} \def\restTitle{Resilient Technologies} 138 \def\restSubtitle{Why Decades-Old Tools Define the ROOT of Modern Research Data Management} 139 \usepackage{scrbase,enumitem,adjustbox,babel} \pagestyle{empty} 140 \usepackage[style=ext-alphabetic-verb]{biblatex} 141 \addbibresource{references.bib} 142 \renewcommand\bibfont{\normalfont\footnotesize}% 143 \usepackage{csquotes} 144 \usepackage{qrcode} 145 \usepackage[RGB]{xcolor} 146 \definecolor{rwth-blue-100} {RGB}{0,84,159} 147 \definecolor{rwth-blue-50} {RGB}{142,186,229} 148 \definecolor{rwth-blue-25} {RGB}{199,221,242} 149 \definecolor{rwth-green-100} {RGB}{87,171,39} 150 \definecolor{rwth-bordeaux-100} {RGB}{161,16,53} 151 \definecolor{orcid} {RGB}{166, 206, 57} 152 \colorlet{passive}{rwth-blue-25} 153 \colorlet{active}{rwth-blue-100} 154 \colorlet{passive}{active} 155 \usepackage[final, stretch =10, shrink =10, babel]{microtype} 156 \newenvironment{optlist}[1]{% 157 \begin{labeling}[]{#1}% 158 \setlength{\itemsep}{-2pt}% 159 \setlength{\topsep}{0pt}% 160 \setlength{\parsep}{0pt}% 161 \setlength{\partopsep}{0pt}% 162 }{\end{labeling}} 163 \usepackage{graphicx} 164 \graphicspath{{img/}} 165 \usepackage{ccicons,dingbat,academicons} 166 \usepackage{fontspec} 167 \setmainfont[% 168 Numbers = {Monospaced, OldStyle}, 169 Scale = 0.90, 170 ItalicFont = Roboto-LightItalic, 171 BoldFont = Roboto-Medium, 172 ]{Roboto-Light} 173 \setkomafont{labelinglabel}{\ttfamily\bfseries} 174 \setkomafont{labelingseparator}{\normalfont} 175 \usepackage{trajan} 176 \ExplSyntaxOn 177 \NewDocumentCommand{\mytrajan}{O{\linewidth}m} 178 {\lukas_trajan:nn {#1} {#2}} 179 \tl_new:N \l__lukas_trajan_text_tl 180 \cs_new_protected:Nn \lukas_trajan:nn 181 { 182 \tl_set:Ne \l__lukas_trajan_text_tl { \text_uppercase:n {#2} ~ } 183 \tl_replace_all:Nnn \l__lukas_trajan_text_tl { ~ } { \c_space_tl } 184 \tl_replace_all:Nnn \l__lukas_trajan_text_tl { R } { R \__lukas_trajan_r: } 185 \tl_replace_all:Nnn \l__lukas_trajan_text_tl { T } { T \__lukas_trajan_t: } 186 \resizebox{#1}{!}{\texttrjn{\tl_use:N \l__lukas_trajan_text_tl\unskip}} 187 } 188 189 \cs_new_protected:Nn \__lukas_trajan_r: 190 {\peek_meaning:NF \c_space_tl { \__lukas_trajan_raise:N }} 191 \cs_new_protected:Nn \__lukas_trajan_raise:N 192 {\kern-0.3em\scan_stop: 193 \raisebox{0.25\height}{\scalebox{1}[0.8]{#1}}} 194 \cs_new_protected:Nn \__lukas_trajan_t: 195 {\peek_meaning:NF \c_space_tl { \__lukas_trajan_lower:N }} 196 \cs_new_protected:Nn \__lukas_trajan_lower:N 197 {\kern-0.2em\scan_stop: 198 \scalebox{1}[0.8]{#1}} 199 \ExplSyntaxOff 200 201 \NewDocumentCommand{\orcidIcon}{} 202 {\begingroup\sffamily\textcolor{orcid}{\aiOrcid}\endgroup} 203 \NewDocumentCommand{\orcid}{m} 204 {\raisebox{-1pt}{\orcidIcon}\,\href{https://orcid.org/#1}{#1}} 205 206 \usepackage[poster,many,skins,most,minted]{tcolorbox} 207 208 \tcbset{% 209 listing engine=minted, 210 coverbox/.style={% 211 enhanced, breakable, 212 before skip =15pt plus 4pt minus 2pt, 213 after skip =15pt plus 4pt minus 2pt, 214 left=.1em, right=.1em, bottom=.1em, top=.1em, 215 boxrule =20pt, 216 colframe={rwth-blue-100}, colback ={rwth-blue-100}, 217 coltitle={rwth-blue-100}, fontupper =\color{white}, 218 title filled =false, 219 subtitle style ={% 220 boxrule =0.0pt, opacityfill =0.4, 221 colback=white, colbacktitle ={rwth-blue-100}, 222 coltitle =white,}}} 223 \makeatletter 224 \tcbset{ myboxtitle/.style 2 args={% 225 natural height, enhanced, breakable, colback=rwth-blue-25, 226 colframe=rwth-blue-100, attach boxed title to top right={yshift*=-\tcboxedtitleheight}, 227 adjusted title={\tcbfontsize{1}\bfseries{#1}}, 228 rounded corners, right=0mm, 229 boxrule=0pt, left=12mm, 230 boxed title style={% 231 rounded corners, 232 colback=tcbcolframe, 233 boxrule=1pt,}, 234 overlay={ 235 \node[rotate=90, anchor=north west, inner sep=1mm, text=white] 236 (title@aux) at (frame.south west) { #2}; 237 \path[fill=tcbcolframe] (
[email protected] west)--(
[email protected] east) 238 to[out=90, in=270] ([yshift=5mm]
[email protected])-- 239 (
[email protected]|-frame.north) 240 [rounded corners=\kvtcb@arc] -| 241 (frame.west) |- (
[email protected])[sharp corners] -- cycle; 242 \node[rotate=90, inner sep=2mm, text=white] at (title@aux) {#2}; 243 }, 244 underlay boxed title={% 245 \path[fill=tcbcolframe] (title.south east)--(title.south west) 246 to[out=180, in=0] ([xshift=-10mm]title.west)-- 247 (title.center-|frame.west) 248 [rounded corners=\kvtcb@arc] |- 249 (frame.north) -| cycle; }}} 250 \newtcolorbox{coverbox}[1][]{coverbox,#1} 251 \tcbset{ 252 rest/base/.style={ listing only, breakable, 253 top=0.5pt, bottom=0.5pt, left=5pt, right=5pt, 254 colback=rwth-blue-25, colframe=rwth-blue-25, 255 opacityback=0.4, fonttitle=\bfseries, coltitle=rwth-blue-100, 256 sharp corners, boxrule=0pt, bottomrule=2pt, toprule=2pt, 257 enhanced jigsaw, attach boxed title to top left={yshift*=-\tcboxedtitleheight}, 258 boxed title style={ sharp corners, rounded corners=northwest, 259 colback=tcbcolframe, boxrule=0pt}, 260 underlay boxed title={ 261 \path[fill=tcbcolframe] (title.south west)--(title.south east) 262 to[out=0, in=180] ([xshift=5mm]title.east)-- 263 (title.center-|frame.east) 264 [rounded corners=\kvtcb@arc] |- 265 (frame.north) -| cycle;}, 266 minted options={ fontsize=\small, breaklines, autogobble, 267 style=friendly, breakanywhere }}} 268 \makeatother 269 \NewTCBInputListing{\restCLI}{O{} m}{% 270 rest/base, listing file={snippets/#2}, minted language=bash, 271 title={\tcbfontsize{1} CLI}, #1} 272 \NewTCBInputListing{\restSnippet}{O{} m m}{% 273 rest/base, listing engine=minted, listing file={snippets/#2}, 274 title={\tcbfontsize{1} snippet (#3)}, 275 minted language =#3, #1} 276 \usepackage{hyperref} 277 \hypersetup{ 278 pdftitle = {Resilient Technologies}, pdfsubject = {tools reproducability}, 279 pdfauthor = {Lukas C. Bossert}, pdfcopyright = {Copyright (c) \the\year}, 280 pdfhighlight = /N, pdfdisplaydoctitle = true, 281 pdfkeywords = {emacs awk orgmode curl diff sed grep make tar}, 282 pdfproducer = {LuaLaTeX}, 283 pdflicenseurl = {http://creativecommons.org/licenses/by-nc-nd/4.0/}, 284 plainpages = false, colorlinks = true, linkcolor = black, 285 citecolor = black, urlcolor = black, final= true, 286 } 287 \NewDocumentCommand{\restAdjB}{s O{} m o}{ 288 \IfBooleanTF{#1}{% Starred: text-mode defaults 289 \adjustbox{valign=c,#2}{#3}% 290 }{% Normal: graphics-mode defaults 291 \adjustbox{valign=c,#2}{\includegraphics[height=#4]{#3}}% 292 }} 293 \NewDocumentCommand{\restPosterFrame}{ O{} m m}{% 294 % #1: #2: title #3: subtitle 295 \posterbox[natural height]{name =title, column =1, span =4 296 }{\resizebox{\linewidth}{!}{\begin{coverbox}[#1] 297 \mytrajan{#2}\\[2em] 298 \resizebox{\linewidth}{!}{\sffamily\MakeUppercase{#3}} 299 \end{coverbox}}} 300 \posterbox{name=author,column=1,above=row2,yshift=-3mm,} 301 { \resizebox{\linewidth}{!}{\scshape\bfseries Lukas C. Bossert}\\ 302 \href{mailto:
[email protected]}{
[email protected]}% 303 \hfill\orcid{0000-0003-3076-3968}} 304 \posterbox{name=affiliation,column =4, above =row2} 305 {IT Center @ \textbf{\scshape RWTH Aachen University}\\ 306 Department: Research Process \& Data Management\\ 307 Group: Technical Training \& Consulting} 308 \posterbox[sidebyside, valign upper=center, righthand width = 15cm] 309 {column =1, above =bottom, name =qr} 310 {\restAdjB*{\qrcode[height=3.5cm]{https://doi.org/\restDOInumber}} 311 \tcblower 312 \restAdjB*{Version: \restVersion\space\hspace*{5cm} \ccbysa}\\ 313 \restAdjB*{\InfoTeX}\\ 314 \restAdjB*{\InfoEmacs\ | org-mode: \InfoOrg}\\ 315 \restAdjB*{DOI: \href{https://doi.org/\restDOInumber}{\restDOInumber}}} 316 \posterbox{column =2, above =bottom, name =hashtag} 317 {\restAdjB{FDM-Hashtag-FDMRWTH}[3cm]\hfill 318 \restAdjB{powered_by_emacs.png}[3.8cm]\hfill 319 \restAdjB{powered_by_org_mode.pdf}[3.8cm]} 320 \posterbox{column =3, above =bottom, name =dkz} 321 {\restAdjB{logo-dkz2r}[4cm] 322 \restAdjB{qr-dkz2r}[4cm]\hfill 323 \restAdjB{BMFTR}[2cm]\hfill 324 \restAdjB{Förderhinweis-EU_horizontal}[1.5cm]} 325 \posterbox{column =4, above =bottom, name =itc} 326 {\restAdjB[center]{rwth-itc}[5cm]} 327 \coordinate (TCBPOSTER@mybottom) at ([yshift=-1cm]
[email protected]); } 328 #+end_src 329 330 ** Body 331 First we need to set the frame: 332 #+name: document-begin 333 #+begin_src latex 334 \begin{document} 335 #+end_src 336 Then we are defining the general setup and layout of the poster 337 #+name: poster-setup 338 #+begin_src latex 339 \begin{tcbposter}[ 340 coverage = {spread, watermark opacity = 0.2, watermark graphics = {\restWatermark}}, 341 poster = { spacing =7mm, columns =4, rows=8 }, 342 boxes = {enhanced jigsaw, colframe =white, opacityframe =0.0, 343 opacityback =0.0, colback =white, boxrule =0pt}, fontsize = 24pt] 344 #+end_src 345 Let’s start with the title of the poster. 346 #+name: poster-title 347 #+begin_src latex 348 \restPosterFrame{\restTitle}{\restSubtitle} 349 #+end_src 350 351 * Tools and Technologies 352 353 This is now the main part of the document. We will show the various tools and 354 their technologies to improve numerous stages of the research data life cycle. 355 These tools are furthermore assistance along the research cycle, too (fig. [[fig:research-life-cycle]]). 356 # [[][]] HOTFIX FOR MINTED 357 358 #+name: fig:research-life-cycle 359 #+caption: Life Cycle of Research. 360 #+attr_latex: :float nil :width 0.75\linewidth 361 #+attr_org: :width 700 362 file:img/research-cycle.png 363 364 365 Overall we try to describe a nice concrete use-case on how to use the following 366 tools. As a nice example we are taking a dataset about the NFDI and analyse it 367 further. It is about how the individual NFDI consortia are collaborating with 368 each other (or not) and how it changed over time. 369 This is a common topic and has been discussed before [cite:@Strecker:834322;@Strecker:835121]. 370 371 ** Abstract-Text :noexport: 372 We also want to have the abstract on the main poster. But there is no need to 373 have it exported, too. 374 #+begin_src latex 375 \begin{posterboxenv}[colback =white,natural height] 376 {column =2, span =2,row =2, name =abstract-circle}% 377 \hfil\includegraphics[width=\linewidth]{resilient-technologies-abstract.pdf} 378 \end{posterboxenv} 379 #+end_src 380 381 #+begin_src latex 382 \begin{posterboxenv}[colback =white,natural height] 383 {column =1, span =1,row =2, name =abstract-text}% 384 \newcommand\mytext[2]{\textcolor{#1}{\bfseries #2}} 385 Research data management (RDM) today relies on a growing landscape of platforms 386 and specialized tools. While these innovations advance research, they also bring 387 risks: short life cycles, proprietary dependencies, and limited sustainability. 388 In contrast, long-established tools have proven to be remarkably resilient— 389 distinguished by openness, interoperability, and active communities. 390 391 392 This poster demonstrates how such “\textbf{resilient technologies}”— 393 despite their age—remain central to sustainable, transparent, and 394 reproducible research data management today. 395 \end{posterboxenv} 396 #+end_src 397 398 ** emacs (1976) / org-mode (2003) 399 Still Emacs is a great tool and should not be neglected despite its age 400 [cite:@Hahn2016Emacs;@Kitchin2016DataSharing;@Strobel1996Linux]. 401 The first section will discuss this and show the benefits and capabilities. 402 403 #+begin_src latex 404 \begin{posterboxenv}[myboxtitle={emacs (1976) / org-mode (2003)} 405 {planning, production, analysis, archiving, access, re-use}] 406 {column=1, row=3, name=emacs} 407 \textbf{Emacs} is not just an editor but a fully extensible research and 408 productivity environment. It can be adapted to cover the entire 409 workflow—from notes and coding to analysis and publishing—without switching 410 applications. \medskip The real strength unfolds with \textbf{org-mode}: 411 plain text enriched with \emph{semantic markup} and lightweight metadata. 412 An Org file can act simultaneously as notebook, task manager, analysis 413 script, and manuscript— a robust foundation for \textbf{reproducible 414 research}. 415 #+end_src 416 This box frames the core message of the section: Emacs + Org-mode unify the research workflow in a single, versionable, plain-text medium. In practice, that means you capture ideas, code, data, and narrative where you work, and you can export or automate without hand-offs to other tools—reducing friction and preserving provenance. 417 418 The relevance of Emacs and org-mode is evident looking at the small peak of its functional tool-set. 419 420 We start with an overview of how Org-mode structures content using simple 421 metadata lines at the beginning of each file. These simple keyword/value pairs 422 describe the context of your document and can be exported to LaTeX, HTML, Markdown, or other 423 formats without additional effort. 424 With ~org-mode~ ’s metadata system, each file is not just content but a /self-describing research object/. 425 #+name: org-mode-meta 426 #+begin_src org :eval never :tangle snippets/org-mode-meta :exports code 427 #+TITLE: Resilient Technologies 428 #+SUBTITLE: Why Decades-Old Tools Define the ROOT of Modern Research Data Management 429 #+AUTHOR: Lukas C. Bossert 430 #+DATE: [2025-10-28] 431 #+EMAIL:
[email protected] 432 #+LANGUAGE: en 433 #+FILETAGS: poster:coding:reproducibility 434 #+end_src 435 For the main poster it is sufficient to briefly discuss the metadata part. 436 #+begin_src latex 437 \tcbline Org-mode supports \textbf{structured metadata} at the top of every file, also for export/provenance tracking. 438 #+end_src 439 Beyond titles and authors, these keywords drive exports (PDF/HTML/MD), search, and project automation. Because they live in plain text, they travel with the file, enabling reproducible pipelines, consistent citation fronts, and FAIR-friendly context without external databases or GUIs. 440 441 ~org-mode~ supports semantic markup that stays readable as plain text. 442 It is similar to Markdown but more flexible and extensible. It could even serve 443 as base for a lightweight markup language of its own [cite:@VoitOrgDown]. 444 #+name: org-mode-markup 445 #+begin_src org :eval never :tangle snippets/org-mode-markup :exports code 446 ,*bold* /italics/ _underline_ +strike-through+ ~code~ footnote:[fn] 447 [[https://orgmode.org][Org website]] =verbatim= [cite:@<bibtexkey>] 448 [[file.pdf][PDF]] 449 #+end_src 450 451 #+begin_src latex 452 \tcbline Org-mode has \textbf{semantic markup}, similar but more extensible than markdown. 453 #+end_src 454 Unlike ad-hoc Markdown flavors, Org’s syntax is standardized and extensible: links have types (web, file, ID), citations integrate natively, and export backends render the same source into multiple formats without rewriting. The result is human-readable text that round-trips cleanly between editing, computation, and publication. 455 456 This tool supports research in many ways: you can manage notes and concepts, 457 and build a “second brain” that connects your ideas 458 (e.g. using ~org-roam~ for a Zettelkasten approach). 459 460 For researchers this is especially important because knowledge work rarely 461 follows a linear path. Instead, concepts, datasets, and publications are 462 interwoven (fig. [[fig:org-roam-ui]]). 463 # [[][]] HOTFIX FOR MINTED 464 ~org-roam~ helps to create a knowledge graph of papers, methods, and datasets; 465 discover hidden connections across projects and disciplines; ensure that ideas are not lost but integrated into the broader context; support reproducible writing by linking notes directly into manuscripts. 466 467 #+name: fig:org-roam-ui 468 #+caption: ~org-roam-ui~ visualizes connections as a graph, making it easier to navigate and explore your research knowledge base. Here it shows the node of ~NFDI~ and its connected nodes. 469 #+attr_latex: :float nil :width \linewidth 470 #+attr_org: :width 700 471 file:img/org-roam-ui.png 472 473 #+begin_src org :results none :eval never :exports code 474 :PROPERTIES: 475 :ID: 6225a860-4c1f-419e-9b67-ae20827f98f9 476 :ROAM_ALIASES: "RWTH Aachen University" "RWTH Aachen" 477 :END: 478 ,#+title: RWTH (Universität) 479 ,#+filetags: :affiliation: 480 481 Active participation within the [[id:537cc27f-73c2-4484-af11-e3acfc0dc932][NFDI]]. 482 #+end_src 483 # [[][]] HOTFIX FOR MINTED 484 485 #+begin_src latex 486 \tcbline \textbf{Personal knowledge management} and linking by creating a network of thoughts, snippets and information with \texttt{org-roam}. 487 #+end_src 488 Org-roam’s permanent IDs and backlinks make references robust across refactors 489 and exports. Notes become nodes in a graph you can query, visualize, and cite 490 from—so context accumulates over time and research threads stay connected across 491 projects and manuscripts. 492 493 Org-mode also allows you to keep all your writing, analysis, and results in a 494 single plain text file. This is particularly valuable for *reproducible 495 research*, since every step is documented and can be re-executed at any time. 496 Similar to a Jupyter Notebook, *org-babel* goes even further by integrating 497 multiple programming languages into one unified, version-controlled workflow 498 document. 499 500 #+begin_src org :results none :eval never :exports code 501 ,#+name: my emacs folder structure 502 ,#+begin_src bash :eval yes :exports both :results verbatim 503 ls -d ~/@mycene/00-09_system/01_emacs/* | sort | awk -F/ '{print $NF}' | head -3 504 ,#+end_src 505 506 ,#+RESULTS: my emacs folder structure 507 | 01.00_system | 508 | 01.01_attachments | 509 | 01.02_bib | 510 #+end_src 511 512 This is also the concept of /literate programming/ and is applied in creating 513 this poster. For further information about the historic context of this approach 514 see [cite:@Knuth1984LiterateProgramming] and for its modern use 515 [cite:@Schulte2012MultiLanguage;@Stanisic2014]. 516 517 #+begin_src latex 518 \tcbline With \texttt{org-babel} you have embedded, executable code blocks for transparent analyses, best way to do \textbf{literate programming}. 519 #+end_src 520 Code, parameters, outputs, and narrative live together: you can re-run one block or the entire pipeline, cache results, and export figures/tables alongside the text. Because everything is version-controlled, you get an auditable trail from raw data to conclusions—ideal for replication and peer review (fig. [[fig:org-babel-workflow]]). 521 # [[][]] HOTFIX FOR MINTED 522 523 #+name: fig:org-babel-workflow 524 #+caption: Visualization of a workflow how data can be processed using ~org-babel~ as shown by [cite:@HartmanBossert2023org]. 525 #+attr_latex: :float nil :width \linewidth 526 #+attr_org: :width 700 527 file:img/emacs-example-workflow.png 528 529 #+begin_src org :eval never :exports code 530 #+MACRO: rdlc (eval (concat "*Research Data Life Cycle* (Section: " (capitalize $1) ")")) 531 ... {{{rdlc(analysis)}}} ... 532 #+end_src 533 534 Macros give you great flexibility for content-dependent phrasing. This enables consistent 535 terminology, DRY authoring, and context-dependent phrasing (e.g.\ localized 536 labels, dynamic dates, or section names). Macros are expanded at export time, 537 so the source stays concise while the output remains explicit and auditable. 538 #+begin_src latex 539 \tcbline \texttt{org-mode} provides a lightweight macro system that 540 lets you define reusable text snippets with parameters. 541 #+end_src 542 Macros keep repeated phrases and labels consistent across a project. 543 Because they can take parameters and evaluate simple expressions, you can 544 generate context-aware text (e.g., section names, years, or localized 545 terms) without manual edits—reducing errors during revision and export. 546 547 Org tables support formulas, cell and 548 range references, and automatic recomputation. Totals, averages, and percentages 549 can be expressed directly in the document; recalculation updates values and 550 derived metrics in place. Because tables are plain text, they are diff-friendly, 551 versionable, and export cleanly to LaTeX, HTML, or CSV—ideal for transparent, 552 FAIR-aligned data summaries within manuscripts. 553 554 #+name: nfdi-datasets 555 #+begin_src org :eval never :tangle snippets/org-mode-table :exports code 556 | domain | consortia | datasets | avg | % | 557 |------------------+-----------+----------+-----+------| 558 | Life Sciences | 8 | 123 | 15 | 13.6 | 559 | Humanities | 6 | 150 | 25 | 16.6 | 560 | Engineering Sc. | 5 | 173 | 35 | 19.1 | 561 | Natural Sciences | 7 | 458 | 65 | 50.7 | 562 |------------------+-----------+----------+-----+------| 563 | TOTAL | 26 | 904 | | | 564 #+TBLFM: @>$2=vsum(@2$2..@-1$2);%.0f::@>$3=vsum(@2$3..@-1$3);%.0f 565 #+TBLFM: @2$4..@-1$4=$3/$2;%.0f::@2$5..@-1$5=100*$3/@>$3;%.1f 566 #+end_src 567 568 When the formulas are evaluated you get updated values in columns and totals, 569 making the table an active, reproducible spreadsheet within your document. 570 571 #+begin_src latex 572 \tcbline Tables are plain-text, too, however you have full control over formulas and calculations. 573 \end{posterboxenv} 574 #+end_src 575 Because formulas and data sit together, recalculation is transparent and 576 diff-friendly: reviewers can see exactly how totals and percentages arise. 577 Exporters preserve structure (CSV/LaTeX/HTML), so the same source serves 578 analysis, communication, and archiving—without hidden spreadsheets or 579 manual copy/paste. 580 581 *Summary*: Emacs and Org-mode integrate the complete research workflow— 582 metadata, analysis, documentation, and publication—into a single, 583 version-controllable plain-text ecosystem. 584 585 ** curl (1997) 586 587 When it comes to accessing online data sources, ~curl~ is one of the most 588 reliable and flexible tools available. It supports a wide range of network 589 protocols (~file://~,~https://~,~sfpt://~, etc.) and allows automation of file 590 retrieval, metadata inspection, and data publication. 591 592 It excels because it can be easily combined with other command-line tools such 593 as ~jq~,~awk~, or ~diff~ to build reproducible, scriptable 594 workflows. 595 596 #+begin_src latex 597 \begin{posterboxenv}[myboxtitle={curl (1997)}{planning, access, re-use}]% 598 {column=1, below=emacs, name=curl} 599 \texttt{curl} is one of the most universal and resilient tools for data 600 transfer. Unlike graphical or browser-based downloads, \texttt{curl} can be 601 scripted and parameterized for reproducibility, transparency, and 602 automation—core principles of \textbf{FAIR} and \textbf{Good Scientific 603 Practice}. 604 #+end_src 605 In the context of *Research Data Management* (RDM)}, ~curl~ serves 606 as a lightweight yet powerful component for: 607 608 -accessing files and metadata from repositories (e.g.\ Zenodo, Dataverse), 609 -automating REST API queries for research data and publications, 610 -validating file integrity through checksum comparison, 611 -and scripting reproducible data acquisition processes. 612 613 #+name: curl-pattern 614 #+begin_src bash :tangle snippets/curl-pattern :eval never :exports none 615 curl [OPTIONS] [URLs] 616 #+end_src 617 618 #+begin_src latex 619 \tcbline The minimal usage pattern: 620 \restSnippet{curl-pattern}{bash} 621 #+end_src 622 623 We demonstrate this with a small workflow illustrating reproducible data access 624 and validation — a common RDM use case: downloading a dataset and confirming its 625 integrity. 626 First, query Zenodo’s REST API for the file’s checksum: 627 628 #+name: curl-checksum 629 #+begin_src bash :exports both 630 curl -sL "https://zenodo.org/api/records/15880071" | 631 jq -r '.files[] | select(.key=="Collaboration_of_Consortia_2025.csv") | .checksum' | awk -F: '{print $2}' 632 #+end_src 633 634 #+RESULTS: curl-checksum 635 : aeb63d7c5fc00bf0f37c14b2f6fe8d6c 636 637 Now download the file itself. We use ~curl~ to query Zenodo’s REST API for the 638 checksum of our dataset. The following options are used: 639 640 -~-s~ Silent mode (no progress output) 641 -~-L~ Follow redirects (often necessary for Zenodo) 642 -~-O~ Save the file with the same name as on the server. 643 -~-C -~ Resume a previous download if it was interrupted. An existing file is not overwritten. 644 -~-#~ Show a progress bar instead of the default meter. 645 646 Since we don’t get feedback when the download has happened successfully we add 647 it manually -- but only after exit code 0 for the ~curl~ part. 648 #+name: curl-download 649 #+begin_src shell :exports both :dir use-case 650 curl -L -O -# "https://zenodo.org/records/15880071/files/Collaboration_of_Consortia_2025.csv" && echo "file downloaded." 651 #+end_src 652 653 #+RESULTS: curl-download 654 : file downloaded. 655 656 Once downloaded, calculate the local checksum and compare it with the remote one: 657 658 #+name:file-checksum 659 #+begin_src shell :exports both :dir use-case 660 md5sum Collaboration_of_Consortia_2025.csv | awk '{print $1}' 661 #+end_src 662 663 #+RESULTS: file-checksum 664 : aeb63d7c5fc00bf0f37c14b2f6fe8d6c 665 666 #+begin_src bash :var remote=curl-checksum :var local=file-checksum :exports both :tangle snippets/diff-match 667 [[ "$remote" == "$local" ]] && echo -n "MATCH: $local" || echo "MISMATCH" 668 #+end_src 669 670 #+RESULTS: 671 : MATCH: aeb63d7c5fc00bf0f37c14b2f6fe8d6c 672 673 Since the checksums match, we can trust the integrity of our dataset — a key 674 requirement of *Good Scientific Practice* and a simple but powerful example of 675 how resilient CLI tools enable transparent, verifiable data workflows. 676 677 #+begin_src latex 678 \end{posterboxenv} 679 #+end_src 680 681 ** sed (1974) 682 In this section we show how to manipulate the downloaded file while making sure 683 we follow Good Scientific Practice. 684 685 #+begin_src latex 686 \begin{posterboxenv}[myboxtitle={sed (1974)}{production}]% 687 {column=1, below=curl, name=sed} 688 \texttt{sed} is a stream editor for transforming text—fast, scriptable, and 689 reliable even on very large files. It excels at \emph{data cleaning} tasks: 690 normalizing metadata, harmonizing formats, and fixing systematic errors. 691 #+end_src 692 693 RDM relevance: Because transformations are declared in plain text, 694 they are transparent, auditable, and reproducible. This makes \texttt{sed} 695 a robust choice for FAIR-aligned workflows and provenance tracking. 696 697 The substitution form is the core building block: 698 -~s~ = substitute (search /pattern/, write /replacement/) 699 -~g~ (all matches per line), or use a number (only the n-th match), 700 -for a flag, e.g. ~I~ (ignore case) 701 702 The pattern shown below is very basic but in most cases enough to achieve and 703 master the tasks. 704 #+begin_src bash :tangle snippets/sed-pattern :eval never :exports none 705 sed [FLAGS] 's/pattern/replacement/g' [FILE] 706 #+end_src 707 A quick explanation how the snippet has to be read and understood. 708 709 #+begin_src latex 710 \restSnippet{sed-pattern}{bash} 711 The leading \texttt{s} stands for \emph{substitute}. It tells \texttt{sed} 712 to search for the given \emph{pattern} and replace it with the specified 713 \emph{replacement}. The trailing \verb|g| flag applies the substitution 714 \emph{globally} across the line, so every occurrence of the pattern is 715 replaced, not just the first. 716 #+end_src 717 718 There are many more prefix-flags for ~sed~, but in our showcase we limit 719 ourselves to the most useful one. Further flags can be: 720 -~p~: print only lines where a substitution occurred 721 (e.g. ~sed -n 's/foo/bar/p' file.txt~) 722 -~I~: case-insensitive matching 723 (e.g. replace ~DOI:~,~doi:~, or ~Doi:~ in one step) 724 -~[0-9]~: apply substitution only to the n-th match in a line 725 (e.g. ~s/foo/bar/2~) 726 -~w~: write all modified lines to a separate file for documentation or audit 727 728 These options make ~sed~ extremely flexible for *research data cleaning*, 729 for example when normalizing metadata, harmonizing date formats, 730 or validating identifier strings. 731 732 733 Coming back to our concrete example. We will fix a misspelling and change 734 ~NFDI-NFDI-MatWerk~ to ~NFDI-MatWerk~ and keep a backup for provenance. To 735 avoid escaping slashes and to protect whole words, use an alternate delimiter 736 and word boundaries. In the example we use an alternate delimiter to avoid escaping ~/~. 737 738 Additional prefix-flags can be added to control the behavior: 739 -~-i~ edit the file /in place/, replacing the original 740 -~.bak~ create a backup-file with the original content (suffix ~.bak~) 741 742 #+name: sed-cleaning-delimiter 743 #+begin_src shell :tangle snippets/sed-delimiter :dir use-case 744 sed -i.bak 's|NFDI-NFDI-MatWerk|NFDI-MatWerk|g' Collaboration_of_Consortia_2025.csv && echo "file cleaned." 745 #+end_src 746 747 #+RESULTS: sed-cleaning-delimiter 748 : file cleaned. 749 750 Here we show that we do have now two files on our system and they are not the same 751 #+name: sed-files-on-system 752 #+begin_src shell :exports both :dir use-case 753 ls Coll*_of_Con*_2025* 754 #+end_src 755 756 #+RESULTS: sed-files-on-system 757 : Collaboration_of_Consortia_2025.csv 758 : Collaboration_of_Consortia_2025.csv.bak 759 760 Great power comes when using /regular expressions/ in the search pattern, 761 which is activated with the flag \verb|-E| (extended regular expression). 762 #+begin_src shell :tangle snippets/sed-pattern-capture :eval never 763 sed -E 's/^([^,]+),[[:space:]]*([^,]+)$/\2, \1/' [FILE] 764 #+end_src 765 766 In this example two fields separated by \verb|,| are being swopt. 767 768 -~^ ...$~ it takes the whole line into account (from start to end). 769 -~([ ,]+)~ one or more non-comma characters (non-greedy-by-construction), it also handles optional spaces after the comma. 770 -~\2, \1~ reinsert the captured groups in the new order. 771 772 #+begin_src latex 773 \end{posterboxenv} 774 #+end_src 775 776 ** grep (1973) 777 In the following section we talk about a tool that is useful when it comes to 778 /searching and validating data/. It is one of the oldest and most resilient tools. 779 780 #+begin_src latex 781 \begin{posterboxenv}[myboxtitle={grep (1973)}{production,analysis}] 782 {column=1, below=sed, name=grep} 783 When it comes to \textbf{searching and validating data}, \texttt{grep} is 784 one of the oldest and most resilient tools. It is extremely fast, works on 785 arbitrarily large files, and supports /regular expressions/ for flexible 786 pattern matching. 787 #+end_src 788 The name ~grep~ comes from the original Unix /ed/-command *g/re/p*, meaning 789 ``globally search for a regular expression and print''. 790 791 In research data management ~grep~ helps to 792 -/Identifier validation/ (e.g.\ DOIs, ORCIDs, grant IDs) and quick conformance checks on headers or required fields. 793 -/Quality gates/ in pipelines (detect missing/forbidden values, out-of-range tokens, or schema violations) before publishing data. 794 -/Provenance & auditing/ by saving search rules and match counts alongside datasets (easy to version-control and diff). 795 -/Interoperability/ in UNIX pipelines: combine with tools like ~sed~,~awk~, or ~sort~/~uniq~ for reproducible, end-to-end checks. 796 - /Portability & longevity/ : available on all platforms, no dependencies, 797 futureproof plain-text rules. 798 799 The following snippet would not work typing it into your CLI but it shows the 800 syntax and gives a good impression how to use the tool. 801 #+begin_src bash :tangle snippets/grep-pattern :eval never :exports none 802 grep [FLAGS] PATTERN [FILE ...] 803 #+end_src 804 We load it into LaTeX for a nice display. 805 #+begin_src latex 806 \tcbline The basic syntax is: 807 \restSnippet{grep-pattern}{bash} 808 #+end_src 809 We can add various flags to specify the search pattern: 810 811 -~-i~ ignore case (match /NFDI-MatWerk/,/nfdi-matwerk/, etc.) 812 -~-v~ invert match (show lines /without/ the pattern) 813 -~-c~ count the number of matching lines 814 -~-n~ show line numbers where matches occur 815 -~-r~ search recursively through directories 816 -~-E~ use extended regular expressions 817 818 Just for the sake of doublechecking: Do we still have =NFDI-NFDI-MatWerk= in our 819 ~.csv~-file? Let’s find out: 820 #+begin_src bash :dir use-case 821 grep -ci "NFDI-NFDI-MatWerk" Collaboration_Of_Consortia_2025.csv || echo "file properly cleaned." 822 #+end_src 823 824 #+RESULTS: 825 : 0 826 : file properly cleaned. 827 828 The result is =0= entries of our search pattern are found in the file. Therefor 829 we get the echo =file properly cleaned=. Perfect nice use case for the potential 830 of ~grep~. 831 832 Like ~sed~ before the power of ~grep~ unfolds when using /regular expressions/ in the search pattern. 833 For example: 834 835 -~grep -E "10\.[0-9]{4,9}/"~: find Digital Object Identifiers (DOIs) 836 -~grep -E "[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9X]"~ : match valid ORCID identifiers 837 -~grep -E "ERROR|WARNING"~: scan log files for error /or/ warning messages 838 839 With these patterns, entire datasets can be validated or filtered 840 in seconds, even when files are gigabytes in size. 841 To give a concrete example we apply a regular expression to the dataset (and for 842 keeping it short we limit it to the first line). 843 844 #+begin_src shell :tangle snippets/grep-re :dir use-case 845 grep -E "^Event:(.+?)MatWerk(.+?);ongoing$" Collaboration_of_Consortia_2025.csv | head -1 846 #+end_src 847 848 #+RESULTS: 849 : Event: conference organisation;NFDI Berlin-Brandenburg network meeting;MaRDI,NFDI4DataScience;FAIRagro,FAIRmat,MaRDI,NFDI-MatWerk,NFDI4Biodiversity,NFDI4BIOIMAGE,NFDI4C at,NFDI4Chem,NFDI4DataScience,NFDI4Earth,NFDI4Energy,NFDI4Immuno,NFDI4Ing,NFDI4Memory,NFDI4Microbiota,NFD IxCS,PUNCH4NFDI,Text+,KonsortSWD;annually;networking;ongoing 850 851 852 We can filter our dataset for specific information: 853 854 Here the pattern ~^Event:(.+?)MatWerk(.+?);ongoing$~ means that only lines that 855 describe an /Event/ related to 856 /MatWerk/ and that are marked as /ongoing/ at the end of the line are matched. 857 This gives us a precise overview of how many such cases exist in the dataset. 858 859 #+begin_src latex 860 \end{posterboxenv} 861 #+end_src 862 863 ** diff (1974) 864 The tool ~diff~ is one of the oldest yet most crucial components for 865 *reproducible research*. It was designed to detect line-by-line differences 866 between text files—an idea that evolved into version control systems such as 867 RCS, CVS, Git, and beyond. 868 #+begin_src latex 869 \begin{posterboxenv}[myboxtitle={diff (1974)}{analysis}]% 870 {column=1, below=grep, name=diff} 871 When it comes to verifying reproducibility and provenance, \texttt{diff} is 872 one of the simplest yet most powerful verification tools. It compares files 873 line by line and reports any deviations. This allows researchers to 874 document data cleaning steps, validate outputs, or monitor versioned 875 transformations. After applying transformations (e.g.\ normalization with 876 \texttt{sed}), \texttt{diff} can confirm the expected changes and provide a 877 readable audit trail. 878 #+end_src 879 880 In the following block we cannot show in detail how ~diff~ can be used in 881 the context of Research Data Management, but it is essential for: 882 -tracking and documenting changes in datasets, code, or metadata, 883 -validating reproducibility by comparing generated outputs against references, 884 -auditing transformations (e.g. after using ~sed~ or ~awk~), 885 -and verifying the integrity of archived or published files. 886 887 Even small differences (e.g. an extra semicolon or changed date format) can 888 affect data reproducibility— ~diff~ helps to make those differences 889 transparent and reviewable. 890 891 892 #+begin_src bash :tangle snippets/diff-pattern :eval never :exports none 893 diff [FLAGS] [FILE1] [FILE2] 894 #+end_src 895 896 #+begin_src latex 897 \tcbline The basic syntax looks like: 898 \restSnippet{diff-pattern}{bash} 899 #+end_src 900 901 We dive right into our example of above and compare two files, the edited one 902 and the backup file of ~Collaboration_of_Consortia_2025.csv~. 903 904 A structured way for viewing the output of a comparison is to use the \texttt{-u} (unified) flag. 905 There are also some other flags to be used. 906 -~-u~ unified format; shows 3 lines of context for each change. 907 -~-q~ brief output; only report if files differ. 908 -~-y~ side-by-side comparison. 909 -~-U<number>~ produces a diff with <number> of lines of context. 910 Note that some flags above are only exclusively applicable. You cannot combine them. 911 912 Compare the original and cleaned dataset after processing it with ~sed~. To 913 understand the output of ~diff~ we are happy with only the first couple of lines 914 of changes. 915 #+name: diff-csv 916 #+begin_src shell :tangle snippets/diff-csv :results output :exports both :dir use-case 917 diff -u -U0 Collaboration_of_Consortia_2025.csv.bak Collaboration_of_Consortia_2025.csv | head -5 918 #+end_src 919 920 #+RESULTS: diff-csv 921 : --- Collaboration_of_Consortia_2025.csv.bak 2025-10-21 15:51:58 922 : +++ Collaboration_of_Consortia_2025.csv 2025-10-21 15:52:24 923 : @@ -11 +11 @@ 924 : -Event: conference organisation;"AI as an enabler for science; 3rd NFDI Berlin Brandenburg Meeting";NFDI4DataScience,MaRDI;NFDI4DataScience,MaRDI,FAIRmat,NFDI4Cat,NFDI4Biodiversity,NFDI-NFDI-MatWe rk,FAIRagro;single event;discussions, presentations;completed 925 : +Event: conference organisation;"AI as an enabler for science; 3rd NFDI Berlin Brandenburg Meeting";NFDI4DataScience,MaRDI;NFDI4DataScience,MaRDI,FAIRmat,NFDI4Cat,NFDI4Biodiversity,NFDI-MatWerk,FA IRagro;single event;discussions, presentations;completed 926 927 Each hunk begins with a header such as ~@@ -11 +11 @@~, meaning that one line (line 11) in the old file was replaced by one line in the new file. Lines marked with ~-~ were removed; those with ~+~ were added. 928 This clear textual provenance leaves every transformation traceable. 929 #+begin_src latex 930 \end{posterboxenv} 931 #+end_src 932 933 ** make (1976) 934 The tool ~make~ is one of the earliest and most elegant automation systems ever developed in computing. 935 Originally designed for compiling programs, it soon proved to be a *universal workflow manager*: 936 It is totally language agnostic, but a common use is within the realm of \LaTeX{} [cite:@Bossert_dtk_make]. 937 #+begin_src latex 938 \begin{posterboxenv}[myboxtitle={make (1976)}{production,analysis,archiving,access}] 939 {column=4, row=2, name=make} 940 A \textbf{Makefile} (without suffix) is an integral part of every project. 941 It serves as a \textbf{Standard Operating Procedure (SOP)} that defines how 942 individual tasks depend on each other and how they are executed. 943 \tcbline 944 In the context of research data management, \texttt{make} functions as a 945 lightweight yet powerful workflow engine. Each rule represents not just a 946 command, but a clearly defined dependency chain that transparently records 947 how results are generated from inputs. This approach ensures 948 \emph{traceability}, \emph{reusability}, and \emph{automation}—core 949 principles of Good Scientific Practice and reproducible research. 950 #+end_src 951 952 In the file you can use various variable definitions and placeholder to ease your workflow. 953 -~$<~ refers to the first prerequisite (the source CSV) 954 -~$@~ refers to the target (=$(FOLDER)/clean.csv=) 955 -~=~ /recursive (lazy)/ — RHS is stored as text and expanded when the variable is used. Later changes to referenced vars are seen. 956 -~:=~ /simple (immediate)/ — RHS is expanded now and the result is stored. Later changes elsewhere do not affect it. 957 -~?=~ /conditional default/ — Assign only if the variable is /not defined/ (defined-but-empty still counts as defined). 958 -~+=~ /append/ — Appends to the current value 959 960 The rule ~all:~ acts as the *default target* of the Makefile. 961 When you execute simply ~make~ on the command line, this rule is triggered first. 962 It typically defines the *main workflow* or entry point — here, the complete 963 data pipeline that downloads, cleans, and summarizes the dataset. 964 This ensures that each dependent step runs in the correct order and only when 965 its inputs have changed. 966 967 The declaration ~.PHONY~ defines targets that do *not* correspond to real files. 968 If a file named ~all~ or ~clean~ already existed, make would assume that the 969 target is up to date and skip its execution. 970 Declaring these targets as phony tells make that they are procedural rules, not file outputs. 971 972 #+begin_src makefile :tangle snippets/make-pattern :eval never :exports none 973 VAR =|?=|+=|:= VALUE 974 975 .PHONY: TARGET TARGET TARGET 976 977 all: TARGET 978 979 TARGET: PERREQUISITE(S) 980 COMMAND 981 #+end_src 982 983 #+begin_src latex 984 Here is the basic design of a \texttt{makefile}: 985 \restSnippet{make-pattern}{make} 986 #+end_src 987 988 Here comes a more concrete example of how to setup a ~makefile~ according to our usecase. 989 #+begin_src makefile :tangle use-case/makefile :eval never :exports code 990 CONSORTIUM = NFDI-MatWerk 991 CSV ?= Collaboration_of_Consortia_2025.csv 992 FOLDER := results-$(CONSORTIUM) 993 FLAGS += -L 994 FLAGS += -O 995 PREPARATION = $(shell mkdir -pv $(FOLDER)) 996 997 all: $(PREPARATION) summary 998 @echo "all done." 999 1000 $(CSV): 1001 @curl $(FLAGS) -C - -# "https://zenodo.org/records/15880071/files/$(CSV)" 1002 @echo "file downloaded." 1003 1004 diff: $(CSV) 1005 @( diff -u $(CSV).bak $(CSV) > $(FOLDER)/diff-result.txt ) || test $$? -le 1 1006 @echo "diff done." 1007 1008 summary: diff 1009 @grep -ci "$(CONSORTIUM)" $(CSV) > $(FOLDER)/grep-summary.txt 1010 @echo "summary done." 1011 #+end_src 1012 1013 To execute the defined targets, you mentioned it otherwise to execute the main 1014 rule (=all:=), it is enough to write in your CLI plainly 1015 #+begin_src bash :dir use-case 1016 make 1017 #+end_src 1018 1019 #+RESULTS: 1020 : diff done. 1021 : summary done. 1022 : all done. 1023 1024 and all dependencies will be considered and created if necessary. 1025 1026 #+begin_src latex 1027 \end{posterboxenv} 1028 #+end_src 1029 1030 ** cron (1975) 1031 The tool ~cron~ is one of the most reliable automation systems ever 1032 developed. It allows the scheduling of commands and scripts at specific 1033 intervals — from minutes to months — and thus provides a temporal dimension 1034 to reproducible workflows. Originally designed for system maintenance 1035 tasks, it quickly became the backbone of automation across UNIX systems. 1036 1037 In essence, ~cron~ is the *timekeeper* of reproducible research: while 1038 ~make~ manages *dependencies*,~cron~ manages *time*. Together, they ensure 1039 that tasks are executed automatically, in the correct order and at the 1040 correct time — without user intervention. 1041 1042 Typical use cases in research data management include: 1043 -periodic backups or synchronization of repositories (e.g., using 1044 ~rsync~), 1045 -scheduled data validation or checksum verification, 1046 -regular harvesting of metadata from APIs, 1047 -and the automated regeneration of reports or dashboards. 1048 1049 #+begin_src latex 1050 \begin{posterboxenv}[myboxtitle={cron (1975)}{production, analysis, archiving}] 1051 {column=4, below=make, name=cron} 1052 When reproducibility meets time, \texttt{cron} provides the temporal 1053 backbone of automated research workflows. It executes predefined tasks at 1054 regular intervals — hourly, daily, or monthly — ensuring that updates, 1055 validations, and synchronizations happen automatically. \texttt{cron} thus 1056 complements \texttt{make}: the former manages \emph{when}, the latter 1057 \emph{how}. 1058 #+end_src 1059 1060 Each user can maintain their own ~crontab~ file, defining scheduled jobs. 1061 The syntax follows a five-field pattern specifying time and frequency, followed by the command. 1062 1063 #+begin_src bash :tangle snippets/cron-pattern :eval never :exports none 1064 # |----------- 1: minute (0–59) 1065 # | |--------- 2: hour (0–23) 1066 # | | |------- 3: day of month (1–31) 1067 # | | | |----- 4: month (1–12) 1068 # | | | | |--- 5: day of week (0–6, Sunday=0) 1069 # 1 2 3 4 5 1070 * * * * * command_to_execute 1071 #+end_src 1072 1073 #+begin_src latex 1074 \tcbline Here is the explanation and a basic pattern of a cron-file. 1075 \restSnippet{cron-pattern}{bash} 1076 \end{posterboxenv} 1077 #+end_src 1078 For instance, to run a nightly validation and synchronization of research data: 1079 1080 #+begin_src bash :tangle snippets/cron-rsync-validate :eval never :exports code 1081 0 2 * * * make summary && rsync -av use-case/ backup/ 1082 #+end_src 1083 1084 This example runs every night at 2 a.m., validating the dataset using 1085 the ~make~ rule and synchronizing it afterward. The combination of 1086 ~make~ and ~cron~ thus enables a fully automated, time-aware, and 1087 reproducible research workflow. 1088 1089 ** awk (1977) 1090 When it comes to handle structered data (e.g. in columns) then *awk* is your 1091 friend. The original handbook of [cite:@awk] is still the most comprehensive 1092 book and should always be the first choice of documentation. It is continously 1093 maintained and the development goes on. 1094 #+begin_src latex 1095 \begin{posterboxenv}[myboxtitle={awk (1977)}{analysis, production}] 1096 {column=4, below=cron,name=awk} 1097 When it comes to data processing and analysis, \textbf{awk} is one of the 1098 most remarkably enduring tools in computational research. It combines the 1099 features of a \emph{streaming text processor}, a \emph{pattern matcher}, 1100 and a lightweight \emph{programming language}. Its concise syntax allows 1101 complex data operations to be written in just a few lines of code. 1102 #+end_src 1103 1104 Unlike shell pipelines that only filter text, ~awk~ can: 1105 -perform real-time calculations and aggregations, 1106 -handle column-based datasets like CSV files directly, 1107 -extract, transform, and summarize data on the fly, 1108 -and produce structured output for further analysis. 1109 1110 For researchers, awk shines when dealing with raw or tabular data: 1111 it bridges the gap between ~grep~/~sed~ filtering and high-level 1112 statistical scripting in R or Python. Because it runs in any UNIX 1113 environment and needs no dependencies, it remains ideal for *reproducible 1114 workflows*:~awk~ scripts are plain text and require no dependencies, they 1115 are fully transparent, version-controllable, and reproducible—key 1116 requirements for FAIR-compliant workflows. When embedded in Makefiles or 1117 shell pipelines, ~awk~ becomes a lightweight yet powerful component of 1118 automated and auditable RDM processes. 1119 1120 #+name: awk-pattern 1121 #+begin_src bash :tangle snippets/awk-pattern :eval never :exports none 1122 awk -F',' 'BEGIN { init } pattern { action } END { summary }' [FILE] 1123 #+end_src 1124 1125 Let’s first start with the basic pattern of ~awk~. 1126 -~-F','~ field separator (here =,= for a =.csv=) 1127 -~\$1,\$2,...~ columns/fields; =NF= = number of fields, =NR= = current record number 1128 - ~BEGIN~ initialization block, executed once before reading input 1129 (e.g., set field separators, initialize counters, print headers) 1130 - ~pattern~ condition or regex tested per input line 1131 (e.g., =$3 > 0= or =/MatWerk/=) 1132 -~action~ command executed when the pattern matches 1133 (e.g., =sum+=$3; print $1,$3=) 1134 -~END~ finalization block, executed once after all lines are processed 1135 (e.g., print summary, averages, totals) 1136 1137 #+begin_src latex 1138 \tcbline Here is the basic pattern: 1139 \restSnippet{awk-pattern}{awk} 1140 #+end_src 1141 1142 For our dataset we want to get an overview of how many times e.g. =NFDI-MatWerk= (defined as variable) is listed in /Affiliated Lead/Chair/ (3rd column). 1143 The script is saved as the file =awk-count-by-type= (in the folder =snippets=) and looks like 1144 1145 #+name: affiliation-count-by-type 1146 #+begin_src awk :in-file Collaboration_of_Consortia_2025.csv :var consortium="NFDI-MatWerk" :results verbatim :exports code :eval never :tangle use-case/affiliation-count-by-type 1147 BEGIN { FS = ";"; OFS = "\t" } 1148 function norm(s){ s=tolower(s); gsub(/[[:space:]-]+/,"",s); gsub(/\"/,"",s); return s } 1149 NR==1 { want = norm(consortium); next } 1150 index(norm($3), want) { cnt[$1]++; total++ } 1151 END{ 1152 for(t in cnt){if(length(t)>m)m=length(t); if(length(cnt[t])>w)w=length(cnt[t])} 1153 print "----"consortium"----" 1154 for(t in cnt) printf "%-*s %*d\n", m, t, w, cnt[t] 1155 } 1156 #+end_src 1157 1158 1159 In your CLI you execute the file in the following way. Here you can specify the content of the variable, too - with e.g. any other NFDI consortium’s name. 1160 1161 -~-f~ specify the path to the ~awk~-file script 1162 (e.g. =make -f affiliation-count-by-type= ) 1163 -~-v~ declare the variable and its content, see above. 1164 1165 1166 #+name: awk-affiliation 1167 #+begin_src bash :eval true :dir use-case :results verbatim :var consortium="NFDI-MatWerk" : 1168 folder="results-${consortium}" 1169 mkdir -pv ${folder} 1170 awk -f affiliation-count-by-type -v consortium=${consortium} Collaboration_of_Consortia_2025.csv \ 1171 | tee "${folder}/analysis-overview.txt" 1172 #+end_src 1173 1174 #+RESULTS: awk-affiliation 1175 : ----NFDI-MatWerk---- 1176 : Joint service 1 1177 : Project 2 1178 : Interest group 1 1179 : Event: workshop 7 1180 : Event: conference participation 2 1181 : Event: local networking 2 1182 1183 We can easily reuse the code snippet and pass a different NFDI consortium to it. 1184 1185 #+call: awk-affiliation(consortium="NFDI4ING") 1186 1187 #+RESULTS: 1188 #+begin_example 1189 results-NFDI4ING 1190 ----NFDI4ING---- 1191 Event: hackathon 1 1192 Event: conference organisation 2 1193 Joint service 4 1194 Interest group 8 1195 Event: workshop 1 1196 Event: lecture series 1 1197 Alliance 1 1198 Event: local networking 5 1199 #+end_example 1200 1201 #+begin_src latex 1202 \end{posterboxenv} 1203 #+end_src 1204 1205 ** tar (1979) 1206 We conclude our /tour de tools/ with a way to archive all necessary files. 1207 #+begin_src latex 1208 \begin{posterboxenv}[myboxtitle={tar (1979)}{archiving}] 1209 {column =4, below=awk, name =tar} 1210 The command-line tool \textbf{tar}—short for \emph{tape archive}—has been 1211 the backbone of data packaging and long-term archiving for nearly half a 1212 century. Originally designed to write sequential data streams to magnetic 1213 tape, it remains one of the most widely used and trusted archiving tools in 1214 computing today. 1215 #+end_src 1216 1217 In the context of research data management, ~tar~ provides: 1218 -platform-independent, lossless bundling of files and directories, 1219 -reproducible data snapshots for archiving and transfer, 1220 -compatibility with checksums and compression utilities 1221 -(e.g. ~gzip~,~bzip2~,~xz~), 1222 -and transparent integration in automated workflows or HPC pipelines. 1223 1224 Because ~tar~ simply concatenates files with metadata, it is robust, 1225 transparent, and /future proof/: every UNIX-like system will be able to unpack a tar archive even decades later. 1226 1227 #+begin_src shell :tangle snippets/tar-pattern :eval never :exports none 1228 tar [FLAGS] [FILEs/PATTERN] [DIRECTORY] 1229 #+end_src 1230 1231 #+begin_src latex 1232 \tcbline Here you see the basic pattern 1233 \restSnippet{tar-pattern}{bash} 1234 #+end_src 1235 1236 Let’s create an archive of cleaned datasets with a dedicated checksum file: 1237 #+begin_src bash 1238 tar -C use-case -czf NFDI-results.tar.gz . && echo "file tape-archived." 1239 sha256sum NFDI-results.tar.gz | tee NFDI-results.tar.gz.sha256 1240 #+end_src 1241 1242 #+RESULTS: 1243 : file tape-archived. 1244 : 6bcf8f4675bb7cf33fbac55a5d09e8c46cc7dd42553685ac8ee10174b6ab11c6 NFDI-results.tar.gz 1245 1246 The flags we are using here are: 1247 -~-c~: Create a new archive containing the specified items. 1248 -~-z~: Compress the resulting archive with gzip. 1249 -~-f~: Write the archive to the specified file 1250 1251 and of course we want to see if it really worked and look into the generated 1252 tape archive. 1253 #+begin_src bash :results verbatim 1254 tar --list -f NFDI-results.tar.gz | sort 1255 #+end_src 1256 1257 #+RESULTS: 1258 #+begin_example 1259 ./ 1260 ./affiliation-count-by-type 1261 ./Collaboration_of_Consortia_2025.csv 1262 ./Collaboration_of_Consortia_2025.csv.bak 1263 ./makefile 1264 ./results-NFDI-MatWerk/ 1265 ./results-NFDI-MatWerk/analysis-overview.txt 1266 ./results-NFDI-MatWerk/diff-result.txt 1267 ./results-NFDI-MatWerk/grep-summary.txt 1268 ./results-NFDI4ING/ 1269 ./results-NFDI4ING/analysis-overview.txt 1270 #+end_example 1271 1272 The resulting ~.tar.gz~ file can be deposited in a repository or sent to 1273 collaborators, along with the checksum guaranteeing data 1274 integrity and provenance. 1275 1276 #+begin_src latex 1277 \end{posterboxenv} 1278 #+end_src 1279 1280 ** Results 1281 Providing a condensed overview of tools that can also be considered as 1282 /resilient technologies/ but have not been presented in detail above. 1283 Furthermore, we introduce the term *ROOT* — a conceptual badge that can be 1284 applied to all these technologies. 1285 A tool is considered *ROOT* when it is /robust/,/open/,/ongoing/, and 1286 /time-tested/. These qualities ensure long-term usability, reproducibility, and resilience 1287 in research data management environments. 1288 1289 #+begin_src latex 1290 \begin{posterboxenv}[colback=white, natural height] 1291 {column=2, span=2, below=abstract-circle, name=result}% 1292 \vspace*{5cm} \hfil\includegraphics[width=.8\linewidth]{logo-root} 1293 \end{posterboxenv} 1294 #+end_src 1295 1296 The overview below shows the variety and bandwidth of mature, open, and stable 1297 technologies that continue to form the foundation of research infrastructures. 1298 1299 #+begin_src latex 1300 \begin{posterboxenv}[colback=white, natural height] 1301 {column=4, above=mybottom, name=result-list}% 1302 Not all tools of lasting relevance can be introduced in depth here. 1303 The following list presents additional \emph{resilient technologies} that 1304 remain fundamental to reproducible and sustainable research workflows. 1305 \begin{labeling}{XX} 1306 \item[find (1974)] \emph{BSD/GPL}; 1307 Recursively searches complex directory structures to locate files, 1308 match patterns, or filter metadata. Essential for navigating large 1309 research repositories with nested folders or evolving data versions. 1310 \item[LaTeX (1984)] \emph{LPPL}; 1311 The enduring standard for scientific writing and documentation— 1312 used for DMPs, reports, posters, and publications. Combines 1313 typographic precision with reproducibility and platform independence. 1314 \item[perl (1987)] \emph{Artistic/GPL}; 1315 A versatile scripting language for text manipulation, pattern 1316 recognition, and metadata transformation. Ideal for parsing logs, 1317 transforming XML/JSON, or validating research data. 1318 \item[rsync (1996)] \emph{GPL}; 1319 Synchronizes and mirrors directories across systems efficiently. 1320 Commonly used for backups, replication, and maintaining mirrored 1321 repositories. Transfers only differences, saving time and bandwidth. 1322 \item[SQLite (2000)] \emph{Public Domain}; 1323 A serverless SQL database stored in a single file—lightweight yet 1324 powerful. Excellent for metadata catalogs, portable archives, 1325 and small-scale analytical datasets. 1326 \end{labeling} 1327 \end{posterboxenv} 1328 #+end_src 1329 1330 #+caption: Badge for a *ROOT* technology. 1331 #+attr_latex: :float nil :width 0.75\linewidth 1332 #+attr_org: :width 700 1333 file:img/logo-root.png 1334 1335 #+print_bibliography: 1336 #+begin_export latex 1337 \end{multicols} 1338 #+end_export 1339 #+name: document-end 1340 #+begin_src latex :exports none 1341 \end{tcbposter} 1342 \end{document} 1343 #+end_src 1344 1345 * Meta and Source Poster :noexport: 1346 In this section we create a poster with the source code of this file. 1347 For this we take advantage of the ~noweb~-feature of org-mode. 1348 1349 ** Meta Poster 1350 #+begin_src latex :noweb yes :tangle resilient-technologies-poster-meta.tex :results none 1351 \DocumentMetadata{ 1352 pdfversion=1.7, 1353 pdfstandard=A-3b} 1354 <<preamble>> 1355 <<document-begin>> 1356 <<poster-setup>> 1357 <<poster-title>> 1358 \begin{posterboxenv}[enhanced jigsaw, colback=white, 1359 top=0pt, bottom=0pt, left=0pt, right=0pt, 1360 ]{column = 1, row=2,span = 4} 1361 \includegraphics[width=\linewidth]{resilient-technologies-code.pdf} 1362 \end{posterboxenv} 1363 <<document-end>> 1364 #+end_src 1365 ** Source Poster 1366 1367 #+begin_src latex :noweb yes :tangle resilient-technologies-source.tex :results none 1368 \DocumentMetadata{ pdfversion=1.7, pdfstandard=A-3b} 1369 \documentclass[8pt]{scrartcl} 1370 \usepackage[a0paper,top=0cm,bottom=19.5cm,left=0cm,right=0cm]{geometry} 1371 \usepackage[english]{babel} \usepackage[RGB]{xcolor} 1372 \definecolor{rwth-blue-100}{RGB}{ 0, 84,159} \definecolor{rwth-blue-25}{RGB}{199,221,242} 1373 \usepackage{multicol} \pagestyle{empty} 1374 \usepackage[minted,skins,breakable]{tcolorbox} 1375 \renewcommand{\theFancyVerbLine}{\ttfamily\arabic{FancyVerbLine}} 1376 \NewTCBInputListing{\restCLI}{O{}m}{% 1377 listing only, listing file={#2}, breakable, top=0pt, bottom=0pt, left=0pt, right=0pt, 1378 colback=white, opacityback=0, sharp corners, boxrule=0pt, bottomrule=0pt, toprule=0pt, 1379 enhanced jigsaw, minted language=org, minted options={ breakautoindent=false, 1380 breaksymbolleft={}, breakanywheresymbolpre={}, breakanywhere, breaklines, autogobble, 1381 style=friendly, linenos, numbersep=4pt, firstnumber=auto, stepnumber=1, 1382 numberblanklines=true, xleftmargin=2em, }, #1} 1383 \begin{document}% 1384 \begin{multicols}{5}% 1385 \restCLI{resilient-technologies-code.org} 1386 \end{multicols} 1387 \end{document} 1388 #+end_src 1389 1390 #+begin_src latex :noweb yes :tangle resilient-technologies-poster-source.tex :results none 1391 <<preamble>> 1392 <<document-begin>> 1393 <<poster-setup>> 1394 <<poster-title>> 1395 \begin{posterboxenv}[colback=white, enhanced jigsaw, top=0pt, bottom=0pt, left=0pt, right=0pt, 1396 ]{column=1, row=2, span=4, between=row1 and mybottom} 1397 \includegraphics[width=\linewidth]{resilient-technologies-source.pdf} 1398 \end{posterboxenv} 1399 <<document-end>> 1400 #+end_src 1401 1402 ** Empty Poster 1403 #+begin_src latex :noweb yes :tangle resilient-technologies-poster-empty.tex :results none 1404 <<preamble>> <<document-begin>> <<poster-setup>> <<poster-title>> <<document-end>> 1405 #+end_src 1406 ** Focus Poster 1407 #+begin_src latex :noweb yes :tangle resilient-technologies-poster-focus.tex :results none 1408 \documentclass[tikz,border=0pt]{standalone} 1409 \usepackage{graphicx,tikz}\usetikzlibrary{spy} 1410 \usepackage[RGB]{xcolor}\definecolor{rwth-bordeaux-100}{RGB}{161,16,53} 1411 \tikzset{source/.style={rwth-bordeaux-100}, 1412 meta/.style={rwth-bordeaux-100}, 1413 main/.style={rwth-bordeaux-100},} 1414 \begin{document} 1415 \begin{tikzpicture}[ 1416 spy using overlays={circle,magnification=3, size=9cm} 1417 ]\node[anchor=south west, inner sep=0] (img) at (0,0) 1418 {\includegraphics[scale=1]{resilient-technologies-allon1.pdf}}; 1419 \spy [main] on (3,94) in node at (47.5,47); 1420 \spy [main] on (21,93) in node at (57.5,47); 1421 \spy [source,magnification=4] on (1.6,43.6) in node at (67.5,47); 1422 \spy [source,magnification=5] on (34.5,8.5) in node at (78,47); 1423 %------------------------------------ 1424 \spy [meta] on (52,85) in node at (47.5,37); 1425 \spy [source,magnification=4] on (35,42) in node at (57.5,37); 1426 \spy [meta] on (44,83) in node at (67.5,37); 1427 \spy [source,magnification=5] on (31.5,38.5) in node at (78,37); 1428 %------------------------------------ 1429 \spy [meta] on (68.99,99.2) in node at (47.5,27); 1430 \spy [source,magnification=5] on (17.8,26.5) in node at (57.5,27); 1431 \spy [meta] on (43.5,88) in node at (67.5,27); 1432 \spy [source,magnification=5] on (47,75) in node at (78,27); 1433 %------------------------------------ 1434 \spy [main] on (33.5,110) in node at (47.5,17); 1435 \spy [source,magnification=4] on (10,28.5) in node at (57.5,17); 1436 \spy [source,magnification=4] on (19.5,8.5) in node at (67.5,17); 1437 \spy [meta] on (70,69.5) in node at (78,17); 1438 %------------------------------------ 1439 \spy [source,magnification=3.5] on (35.3,16) in node at (47.5,7); 1440 \spy [meta] on (61,88.2) in node at (57.5,7); 1441 \spy [main] on (33.3,70.3) in node at (67.5,7); 1442 \spy [meta] on (52.1,99.2) in node at (78,7); 1443 \end{tikzpicture} 1444 \end{document} 1445 #+end_src