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.2 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.2} \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 This poster demonstrates how such “\textbf{resilient technologies}”— 392 despite their age—remain central to sustainable, transparent, and 393 reproducible research data management today. 394 \end{posterboxenv} 395 #+end_src 396 397 ** emacs (1976) / org-mode (2003) 398 Still Emacs is a great tool and should not be neglected despite its age 399 [cite:@Hahn2016Emacs;@Kitchin2016DataSharing;@Strobel1996Linux]. 400 The first section will discuss this and show the benefits and capabilities. 401 402 #+begin_src latex 403 \begin{posterboxenv}[myboxtitle={emacs (1976) / org-mode (2003)} 404 {planning, production, analysis, archiving, access, re-use}] 405 {column=1, row=3, name=emacs} 406 \textbf{Emacs} is not just an editor but a fully extensible research and 407 productivity environment. It can be adapted to cover the entire 408 workflow—from notes and coding to analysis and publishing—without switching 409 applications. \medskip The real strength unfolds with \textbf{org-mode}: 410 plain text enriched with \emph{semantic markup} and lightweight metadata. 411 An Org file can act simultaneously as notebook, task manager, analysis 412 script, and manuscript— a robust foundation for \textbf{reproducible 413 research}. 414 #+end_src 415 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. 416 417 The relevance of Emacs and org-mode is evident looking at the small peak of its functional tool-set. 418 419 We start with an overview of how Org-mode structures content using simple 420 metadata lines at the beginning of each file. These simple keyword/value pairs 421 describe the context of your document and can be exported to LaTeX, HTML, Markdown, or other 422 formats without additional effort. 423 With ~org-mode~ ’s metadata system, each file is not just content but a /self-describing research object/. 424 #+name: org-mode-meta 425 #+begin_src org :eval never :tangle snippets/org-mode-meta :exports code 426 #+TITLE: Resilient Technologies 427 #+SUBTITLE: Why Decades-Old Tools Define the ROOT of Modern Research Data Management 428 #+AUTHOR: Lukas C. Bossert 429 #+DATE: [2025-10-28] 430 #+EMAIL:
[email protected] 431 #+LANGUAGE: en 432 #+FILETAGS: poster:coding:reproducibility 433 #+end_src 434 For the main poster it is sufficient to briefly discuss the metadata part. 435 #+begin_src latex 436 \tcbline Org-mode supports \textbf{structured metadata} at the top of every file, also for export/provenance tracking. 437 #+end_src 438 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. 439 440 ~org-mode~ supports semantic markup that stays readable as plain text. 441 It is similar to Markdown but more flexible and extensible. It could even serve 442 as base for a lightweight markup language of its own [cite:@VoitOrgDown]. 443 #+name: org-mode-markup 444 #+begin_src org :eval never :tangle snippets/org-mode-markup :exports code 445 ,*bold* /italics/ _underline_ +strike-through+ ~code~ footnote:[fn] 446 [[https://orgmode.org][Org website]] =verbatim= [cite:@<bibtexkey>] 447 [[file.pdf][PDF]] 448 #+end_src 449 450 #+begin_src latex 451 \tcbline Org-mode has \textbf{semantic markup}, similar but more extensible than markdown. 452 #+end_src 453 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. 454 455 This tool supports research in many ways: you can manage notes and concepts, 456 and build a “second brain” that connects your ideas 457 (e.g. using ~org-roam~ for a Zettelkasten approach). 458 459 For researchers this is especially important because knowledge work rarely 460 follows a linear path. Instead, concepts, datasets, and publications are 461 interwoven (fig. [[fig:org-roam-ui]]). 462 # [[][]] HOTFIX FOR MINTED 463 ~org-roam~ helps to create a knowledge graph of papers, methods, and datasets; 464 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. 465 466 #+name: fig:org-roam-ui 467 #+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. 468 #+attr_latex: :float nil :width \linewidth 469 #+attr_org: :width 700 470 file:img/org-roam-ui.png 471 472 #+begin_src org :results none :eval never :exports code 473 :PROPERTIES: 474 :ID: 6225a860-4c1f-419e-9b67-ae20827f98f9 475 :ROAM_ALIASES: "RWTH Aachen University" "RWTH Aachen" 476 :END: 477 ,#+title: RWTH (Universität) 478 ,#+filetags: :affiliation: 479 480 Active participation within the [[id:537cc27f-73c2-4484-af11-e3acfc0dc932][NFDI]]. 481 #+end_src 482 # [[][]] HOTFIX FOR MINTED 483 484 #+begin_src latex 485 \tcbline \textbf{Personal knowledge management} and linking by creating a network of thoughts, snippets and information with \texttt{org-roam}. 486 #+end_src 487 Org-roam’s permanent IDs and backlinks make references robust across refactors 488 and exports. Notes become nodes in a graph you can query, visualize, and cite 489 from—so context accumulates over time and research threads stay connected across 490 projects and manuscripts. 491 492 Org-mode also allows you to keep all your writing, analysis, and results in a 493 single plain text file. This is particularly valuable for *reproducible 494 research*, since every step is documented and can be re-executed at any time. 495 Similar to a Jupyter Notebook, *org-babel* goes even further by integrating 496 multiple programming languages into one unified, version-controlled workflow 497 document. 498 499 #+begin_src org :results none :eval never :exports code 500 ,#+name: my emacs folder structure 501 ,#+begin_src bash :eval yes :exports both :results verbatim 502 ls -d ~/@mycene/00-09_system/01_emacs/* | sort | awk -F/ '{print $NF}' | head -3 503 ,#+end_src 504 505 ,#+RESULTS: my emacs folder structure 506 | 01.00_system | 507 | 01.01_attachments | 508 | 01.02_bib | 509 #+end_src 510 511 This is also the concept of /literate programming/ and is applied in creating 512 this poster. For further information about the historic context of this approach 513 see [cite:@Knuth1984LiterateProgramming] and for its modern use 514 [cite:@Schulte2012MultiLanguage;@Stanisic2014]. 515 516 #+begin_src latex 517 \tcbline With \texttt{org-babel} you have embedded, executable code blocks for transparent analyses, best way to do \textbf{literate programming}. 518 #+end_src 519 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]]). 520 # [[][]] HOTFIX FOR MINTED 521 522 #+name: fig:org-babel-workflow 523 #+caption: Visualization of a workflow how data can be processed using ~org-babel~ as shown by [cite:@HartmanBossert2023org]. 524 #+attr_latex: :float nil :width \linewidth 525 #+attr_org: :width 700 526 file:img/emacs-example-workflow.png 527 528 #+begin_src org :eval never :exports code 529 #+MACRO: rdlc (eval (concat "*Research Data Life Cycle* (Section: " (capitalize $1) ")")) 530 ... {{{rdlc(analysis)}}} ... 531 #+end_src 532 533 Macros give you great flexibility for content-dependent phrasing. This enables consistent 534 terminology, DRY authoring, and context-dependent phrasing (e.g.\ localized 535 labels, dynamic dates, or section names). Macros are expanded at export time, 536 so the source stays concise while the output remains explicit and auditable. 537 #+begin_src latex 538 \tcbline \texttt{org-mode} provides a lightweight macro system that 539 lets you define reusable text snippets with parameters. 540 #+end_src 541 Macros keep repeated phrases and labels consistent across a project. 542 Because they can take parameters and evaluate simple expressions, you can 543 generate context-aware text (e.g., section names, years, or localized 544 terms) without manual edits—reducing errors during revision and export. 545 546 Org tables support formulas, cell and 547 range references, and automatic recomputation. Totals, averages, and percentages 548 can be expressed directly in the document; recalculation updates values and 549 derived metrics in place. Because tables are plain text, they are diff-friendly, 550 versionable, and export cleanly to LaTeX, HTML, or CSV—ideal for transparent, 551 FAIR-aligned data summaries within manuscripts. 552 553 #+name: nfdi-datasets 554 #+begin_src org :eval never :tangle snippets/org-mode-table :exports code 555 | domain | consortia | datasets | avg | % | 556 |------------------+-----------+----------+-----+------| 557 | Life Sciences | 8 | 123 | 15 | 13.6 | 558 | Humanities | 6 | 150 | 25 | 16.6 | 559 | Engineering Sc. | 5 | 173 | 35 | 19.1 | 560 | Natural Sciences | 7 | 458 | 65 | 50.7 | 561 |------------------+-----------+----------+-----+------| 562 | TOTAL | 26 | 904 | | | 563 #+TBLFM: @>$2=vsum(@2$2..@-1$2);%.0f::@>$3=vsum(@2$3..@-1$3);%.0f 564 #+TBLFM: @2$4..@-1$4=$3/$2;%.0f::@2$5..@-1$5=100*$3/@>$3;%.1f 565 #+end_src 566 567 When the formulas are evaluated you get updated values in columns and totals, 568 making the table an active, reproducible spreadsheet within your document. 569 570 #+begin_src latex 571 \tcbline Tables are plain-text, too, however you have full control over formulas and calculations. 572 \end{posterboxenv} 573 #+end_src 574 Because formulas and data sit together, recalculation is transparent and 575 diff-friendly: reviewers can see exactly how totals and percentages arise. 576 Exporters preserve structure (CSV/LaTeX/HTML), so the same source serves 577 analysis, communication, and archiving—without hidden spreadsheets or 578 manual copy/paste. 579 580 *Summary*: Emacs and Org-mode integrate the complete research workflow— 581 metadata, analysis, documentation, and publication—into a single, 582 version-controllable plain-text ecosystem. 583 584 ** curl (1997) 585 586 When it comes to accessing online data sources, ~curl~ is one of the most 587 reliable and flexible tools available. It supports a wide range of network 588 protocols (~file://~,~https://~,~sfpt://~, etc.) and allows automation of file 589 retrieval, metadata inspection, and data publication. 590 591 It excels because it can be easily combined with other command-line tools such 592 as ~jq~,~awk~, or ~diff~ to build reproducible, scriptable 593 workflows. 594 595 #+begin_src latex 596 \begin{posterboxenv}[myboxtitle={curl (1997)}{planning, access, re-use}]% 597 {column=1, below=emacs, name=curl} 598 \texttt{curl} is one of the most universal and resilient tools for data 599 transfer. Unlike graphical or browser-based downloads, \texttt{curl} can be 600 scripted and parameterized for reproducibility, transparency, and 601 automation—core principles of \textbf{FAIR} and \textbf{Good Scientific 602 Practice}. 603 #+end_src 604 In the context of *Research Data Management* (RDM)}, ~curl~ serves 605 as a lightweight yet powerful component for: 606 607 -accessing files and metadata from repositories (e.g.\ Zenodo, Dataverse), 608 -automating REST API queries for research data and publications, 609 -validating file integrity through checksum comparison, 610 -and scripting reproducible data acquisition processes. 611 612 #+name: curl-pattern 613 #+begin_src bash :tangle snippets/curl-pattern :eval never :exports none 614 curl [OPTIONS] [URLs] 615 #+end_src 616 617 #+begin_src latex 618 \tcbline The minimal usage pattern: 619 \restSnippet{curl-pattern}{bash} 620 #+end_src 621 622 We demonstrate this with a small workflow illustrating reproducible data access 623 and validation — a common RDM use case: downloading a dataset and confirming its 624 integrity. 625 First, query Zenodo’s REST API for the file’s checksum: 626 627 #+name: curl-checksum 628 #+begin_src bash :exports both 629 curl -sL "https://zenodo.org/api/records/15880071" | 630 jq -r '.files[] | select(.key=="Collaboration_of_Consortia_2025.csv") | .checksum' | awk -F: '{print $2}' 631 #+end_src 632 633 #+RESULTS: curl-checksum 634 : aeb63d7c5fc00bf0f37c14b2f6fe8d6c 635 636 Now download the file itself. We use ~curl~ to query Zenodo’s REST API for the 637 checksum of our dataset. The following options are used: 638 639 -~-s~ Silent mode (no progress output) 640 -~-L~ Follow redirects (often necessary for Zenodo) 641 -~-O~ Save the file with the same name as on the server. 642 -~-C -~ Resume a previous download if it was interrupted. An existing file is not overwritten. 643 -~-#~ Show a progress bar instead of the default meter. 644 645 Since we don’t get feedback when the download has happened successfully we add 646 it manually -- but only after exit code 0 for the ~curl~ part. 647 #+name: curl-download 648 #+begin_src shell :exports both :dir use-case 649 curl -L -O -# "https://zenodo.org/records/15880071/files/Collaboration_of_Consortia_2025.csv" && echo "file downloaded." 650 #+end_src 651 652 #+RESULTS: curl-download 653 : file downloaded. 654 655 Once downloaded, calculate the local checksum and compare it with the remote one: 656 657 #+name:file-checksum 658 #+begin_src shell :exports both :dir use-case 659 md5sum Collaboration_of_Consortia_2025.csv | awk '{print $1}' 660 #+end_src 661 662 #+RESULTS: file-checksum 663 : aeb63d7c5fc00bf0f37c14b2f6fe8d6c 664 665 #+begin_src bash :var remote=curl-checksum :var local=file-checksum :exports both :tangle snippets/diff-match 666 [[ "$remote" == "$local" ]] && echo -n "MATCH: $local" || echo "MISMATCH" 667 #+end_src 668 669 #+RESULTS: 670 : MATCH: aeb63d7c5fc00bf0f37c14b2f6fe8d6c 671 672 Since the checksums match, we can trust the integrity of our dataset — a key 673 requirement of *Good Scientific Practice* and a simple but powerful example of 674 how resilient CLI tools enable transparent, verifiable data workflows. 675 676 #+begin_src latex 677 \end{posterboxenv} 678 #+end_src 679 680 ** sed (1974) 681 In this section we show how to manipulate the downloaded file while making sure 682 we follow Good Scientific Practice. 683 684 #+begin_src latex 685 \begin{posterboxenv}[myboxtitle={sed (1974)}{production}]% 686 {column=1, below=curl, name=sed} 687 \texttt{sed} is a stream editor for transforming text—fast, scriptable, and 688 reliable even on very large files. It excels at \emph{data cleaning} tasks: 689 normalizing metadata, harmonizing formats, and fixing systematic errors. 690 #+end_src 691 692 RDM relevance: Because transformations are declared in plain text, 693 they are transparent, auditable, and reproducible. This makes \texttt{sed} 694 a robust choice for FAIR-aligned workflows and provenance tracking. 695 696 The substitution form is the core building block: 697 -~s~ = substitute (search /pattern/, write /replacement/) 698 -~g~ (all matches per line), or use a number (only the n-th match), 699 -for a flag, e.g. ~I~ (ignore case) 700 701 The pattern shown below is very basic but in most cases enough to achieve and 702 master the tasks. 703 #+begin_src bash :tangle snippets/sed-pattern :eval never :exports none 704 sed [FLAGS] 's/pattern/replacement/g' [FILE] 705 #+end_src 706 A quick explanation how the snippet has to be read and understood. 707 708 #+begin_src latex 709 \restSnippet{sed-pattern}{bash} 710 The leading \texttt{s} stands for \emph{substitute}. It tells \texttt{sed} 711 to search for the given \emph{pattern} and replace it with the specified 712 \emph{replacement}. The trailing \verb|g| flag applies the substitution 713 \emph{globally} across the line, so every occurrence of the pattern is 714 replaced, not just the first. 715 #+end_src 716 717 There are many more prefix-flags for ~sed~, but in our showcase we limit 718 ourselves to the most useful one. Further flags can be: 719 -~p~: print only lines where a substitution occurred 720 (e.g. ~sed -n 's/foo/bar/p' file.txt~) 721 -~I~: case-insensitive matching 722 (e.g. replace ~DOI:~,~doi:~, or ~Doi:~ in one step) 723 -~[0-9]~: apply substitution only to the n-th match in a line 724 (e.g. ~s/foo/bar/2~) 725 -~w~: write all modified lines to a separate file for documentation or audit 726 727 These options make ~sed~ extremely flexible for *research data cleaning*, 728 for example when normalizing metadata, harmonizing date formats, 729 or validating identifier strings. 730 731 732 Coming back to our concrete example. We will fix a misspelling and change 733 ~NFDI-NFDI-MatWerk~ to ~NFDI-MatWerk~ and keep a backup for provenance. To 734 avoid escaping slashes and to protect whole words, use an alternate delimiter 735 and word boundaries. In the example we use an alternate delimiter to avoid escaping ~/~. 736 737 Additional prefix-flags can be added to control the behavior: 738 -~-i~ edit the file /in place/, replacing the original 739 -~.bak~ create a backup-file with the original content (suffix ~.bak~) 740 741 #+name: sed-cleaning-delimiter 742 #+begin_src shell :tangle snippets/sed-delimiter :dir use-case 743 sed -i.bak 's|NFDI-NFDI-MatWerk|NFDI-MatWerk|g' Collaboration_of_Consortia_2025.csv && echo "file cleaned." 744 #+end_src 745 746 #+RESULTS: sed-cleaning-delimiter 747 : file cleaned. 748 749 Here we show that we do have now two files on our system and they are not the same 750 #+name: sed-files-on-system 751 #+begin_src shell :exports both :dir use-case 752 ls Coll*_of_Con*_2025* 753 #+end_src 754 755 #+RESULTS: sed-files-on-system 756 : Collaboration_of_Consortia_2025.csv 757 : Collaboration_of_Consortia_2025.csv.bak 758 759 Great power comes when using /regular expressions/ in the search pattern, 760 which is activated with the flag \verb|-E| (extended regular expression). 761 #+begin_src shell :tangle snippets/sed-pattern-capture :eval never 762 sed -E 's/^([^,]+),[[:space:]]*([^,]+)$/\2, \1/' [FILE] 763 #+end_src 764 765 In this example two fields separated by \verb|,| are being swopt. 766 767 -~^ ...$~ it takes the whole line into account (from start to end). 768 -~([ ,]+)~ one or more non-comma characters (non-greedy-by-construction), it also handles optional spaces after the comma. 769 -~\2, \1~ reinsert the captured groups in the new order. 770 771 #+begin_src latex 772 \end{posterboxenv} 773 #+end_src 774 775 ** grep (1973) 776 In the following section we talk about a tool that is useful when it comes to 777 /searching and validating data/. It is one of the oldest and most resilient tools. 778 779 #+begin_src latex 780 \begin{posterboxenv}[myboxtitle={grep (1973)}{production, analysis}] 781 {column=1, below=sed, name=grep} 782 When it comes to \textbf{searching and validating data}, \texttt{grep} is 783 one of the oldest and most resilient tools. It is extremely fast, works on 784 arbitrarily large files, and supports /regular expressions/ for flexible 785 pattern matching. 786 #+end_src 787 The name ~grep~ comes from the original Unix /ed/-command *g/re/p*, meaning 788 ``globally search for a regular expression and print''. 789 790 In research data management ~grep~ helps to 791 -/Identifier validation/ (e.g.\ DOIs, ORCIDs, grant IDs) and quick conformance checks on headers or required fields. 792 -/Quality gates/ in pipelines (detect missing/forbidden values, out-of-range tokens, or schema violations) before publishing data. 793 -/Provenance & auditing/ by saving search rules and match counts alongside datasets (easy to version-control and diff). 794 -/Interoperability/ in UNIX pipelines: combine with tools like ~sed~,~awk~, or ~sort~/~uniq~ for reproducible, end-to-end checks. 795 - /Portability & longevity/ : available on all platforms, no dependencies, 796 futureproof plain-text rules. 797 798 The following snippet would not work typing it into your CLI but it shows the 799 syntax and gives a good impression how to use the tool. 800 #+begin_src bash :tangle snippets/grep-pattern :eval never :exports none 801 grep [FLAGS] PATTERN [FILE ...] 802 #+end_src 803 We load it into LaTeX for a nice display. 804 #+begin_src latex 805 \tcbline The basic syntax is: 806 \restSnippet{grep-pattern}{bash} 807 #+end_src 808 We can add various flags to specify the search pattern: 809 810 -~-i~ ignore case (match /NFDI-MatWerk/,/nfdi-matwerk/, etc.) 811 -~-v~ invert match (show lines /without/ the pattern) 812 -~-c~ count the number of matching lines 813 -~-n~ show line numbers where matches occur 814 -~-r~ search recursively through directories 815 -~-E~ use extended regular expressions 816 817 Just for the sake of doublechecking: Do we still have =NFDI-NFDI-MatWerk= in our 818 ~.csv~-file? Let’s find out: 819 #+begin_src bash :dir use-case 820 grep -ci "NFDI-NFDI-MatWerk" Collaboration_Of_Consortia_2025.csv || echo "file properly cleaned." 821 #+end_src 822 823 #+RESULTS: 824 : 0 825 : file properly cleaned. 826 827 The result is =0= entries of our search pattern are found in the file. Therefor 828 we get the echo =file properly cleaned=. Perfect nice use case for the potential 829 of ~grep~. 830 831 Like ~sed~ before the power of ~grep~ unfolds when using /regular expressions/ in the search pattern. 832 For example: 833 834 -~grep -E "10\.[0-9]{4,9}/"~: find Digital Object Identifiers (DOIs) 835 -~grep -E "[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9X]"~ : match valid ORCID identifiers 836 -~grep -E "ERROR|WARNING"~: scan log files for error /or/ warning messages 837 838 With these patterns, entire datasets can be validated or filtered 839 in seconds, even when files are gigabytes in size. 840 To give a concrete example we apply a regular expression to the dataset (and for 841 keeping it short we limit it to the first line). 842 843 #+begin_src shell :tangle snippets/grep-re :dir use-case 844 grep -E "^Event:(.+?)MatWerk(.+?);ongoing$" Collaboration_of_Consortia_2025.csv | head -1 845 #+end_src 846 847 #+RESULTS: 848 : 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 849 850 851 We can filter our dataset for specific information: 852 853 Here the pattern ~^Event:(.+?)MatWerk(.+?);ongoing$~ means that only lines that 854 describe an /Event/ related to 855 /MatWerk/ and that are marked as /ongoing/ at the end of the line are matched. 856 This gives us a precise overview of how many such cases exist in the dataset. 857 858 #+begin_src latex 859 \end{posterboxenv} 860 #+end_src 861 862 ** diff (1974) 863 The tool ~diff~ is one of the oldest yet most crucial components for 864 *reproducible research*. It was designed to detect line-by-line differences 865 between text files—an idea that evolved into version control systems such as 866 RCS, CVS, Git, and beyond. 867 #+begin_src latex 868 \begin{posterboxenv}[myboxtitle={diff (1974)}{analysis}]% 869 {column=1, below=grep, name=diff} 870 When it comes to verifying reproducibility and provenance, \texttt{diff} is 871 one of the simplest yet most powerful verification tools. It compares files 872 line by line and reports any deviations. This allows researchers to 873 document data cleaning steps, validate outputs, or monitor versioned 874 transformations. After applying transformations (e.g.\ normalization with 875 \texttt{sed}), \texttt{diff} can confirm the expected changes and provide a 876 readable audit trail. 877 #+end_src 878 879 In the following block we cannot show in detail how ~diff~ can be used in 880 the context of Research Data Management, but it is essential for: 881 -tracking and documenting changes in datasets, code, or metadata, 882 -validating reproducibility by comparing generated outputs against references, 883 -auditing transformations (e.g. after using ~sed~ or ~awk~), 884 -and verifying the integrity of archived or published files. 885 886 Even small differences (e.g. an extra semicolon or changed date format) can 887 affect data reproducibility— ~diff~ helps to make those differences 888 transparent and reviewable. 889 890 891 #+begin_src bash :tangle snippets/diff-pattern :eval never :exports none 892 diff [FLAGS] [FILE1] [FILE2] 893 #+end_src 894 895 #+begin_src latex 896 \tcbline The basic syntax looks like: 897 \restSnippet{diff-pattern}{bash} 898 #+end_src 899 900 We dive right into our example of above and compare two files, the edited one 901 and the backup file of ~Collaboration_of_Consortia_2025.csv~. 902 903 A structured way for viewing the output of a comparison is to use the \texttt{-u} (unified) flag. 904 There are also some other flags to be used. 905 -~-u~ unified format; shows 3 lines of context for each change. 906 -~-q~ brief output; only report if files differ. 907 -~-y~ side-by-side comparison. 908 -~-U<number>~ produces a diff with <number> of lines of context. 909 Note that some flags above are only exclusively applicable. You cannot combine them. 910 911 Compare the original and cleaned dataset after processing it with ~sed~. To 912 understand the output of ~diff~ we are happy with only the first couple of lines 913 of changes. 914 #+name: diff-csv 915 #+begin_src shell :tangle snippets/diff-csv :results output :exports both :dir use-case 916 diff -u -U0 Collaboration_of_Consortia_2025.csv.bak Collaboration_of_Consortia_2025.csv | head -5 917 #+end_src 918 919 #+RESULTS: diff-csv 920 : --- Collaboration_of_Consortia_2025.csv.bak 2025-10-21 15:51:58 921 : +++ Collaboration_of_Consortia_2025.csv 2025-10-21 15:52:24 922 : @@ -11 +11 @@ 923 : -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 924 : +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 925 926 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. 927 This clear textual provenance leaves every transformation traceable. 928 #+begin_src latex 929 \end{posterboxenv} 930 #+end_src 931 932 ** make (1976) 933 The tool ~make~ is one of the earliest and most elegant automation systems ever developed in computing. 934 Originally designed for compiling programs, it soon proved to be a *universal workflow manager*: 935 It is totally language agnostic, but a common use is within the realm of \LaTeX{} [cite:@Bossert_dtk_make]. 936 #+begin_src latex 937 \begin{posterboxenv}[myboxtitle={make (1976)}{production,analysis,archiving,access}] 938 {column=4, row=2, name=make} 939 A \textbf{Makefile} (without suffix) is an integral part of every project. 940 It serves as a \textbf{Standard Operating Procedure (SOP)} that defines how 941 individual tasks depend on each other and how they are executed. 942 \tcbline 943 In the context of research data management, \texttt{make} functions as a 944 lightweight yet powerful workflow engine. Each rule represents not just a 945 command, but a clearly defined dependency chain that transparently records 946 how results are generated from inputs. This approach ensures 947 \emph{traceability}, \emph{reusability}, and \emph{automation}—core 948 principles of Good Scientific Practice and reproducible research. 949 #+end_src 950 951 In the file you can use various variable definitions and placeholder to ease your workflow. 952 -~$<~ refers to the first prerequisite (the source CSV) 953 -~$@~ refers to the target (=$(FOLDER)/clean.csv=) 954 -~=~ /recursive (lazy)/ — RHS is stored as text and expanded when the variable is used. Later changes to referenced vars are seen. 955 -~:=~ /simple (immediate)/ — RHS is expanded now and the result is stored. Later changes elsewhere do not affect it. 956 -~?=~ /conditional default/ — Assign only if the variable is /not defined/ (defined-but-empty still counts as defined). 957 -~+=~ /append/ — Appends to the current value 958 959 The rule ~all:~ acts as the *default target* of the Makefile. 960 When you execute simply ~make~ on the command line, this rule is triggered first. 961 It typically defines the *main workflow* or entry point — here, the complete 962 data pipeline that downloads, cleans, and summarizes the dataset. 963 This ensures that each dependent step runs in the correct order and only when 964 its inputs have changed. 965 966 The declaration ~.PHONY~ defines targets that do *not* correspond to real files. 967 If a file named ~all~ or ~clean~ already existed, make would assume that the 968 target is up to date and skip its execution. 969 Declaring these targets as phony tells make that they are procedural rules, not file outputs. 970 971 #+begin_src makefile :tangle snippets/make-pattern :eval never :exports none 972 VAR =|?=|+=|:= VALUE 973 974 .PHONY: TARGET TARGET TARGET 975 976 all: TARGET 977 978 TARGET: PERREQUISITE(S) 979 COMMAND 980 #+end_src 981 982 #+begin_src latex 983 Here is the basic design of a \texttt{makefile}: 984 \restSnippet{make-pattern}{make} 985 #+end_src 986 987 Here comes a more concrete example of how to setup a ~makefile~ according to our usecase. 988 #+begin_src makefile :tangle use-case/makefile :eval never :exports code 989 CONSORTIUM = NFDI-MatWerk 990 CSV ?= Collaboration_of_Consortia_2025.csv 991 FOLDER := results-$(CONSORTIUM) 992 FLAGS += -L 993 FLAGS += -O 994 PREPARATION = $(shell mkdir -pv $(FOLDER)) 995 996 all: $(PREPARATION) summary 997 @echo "all done." 998 999 $(CSV): 1000 @curl $(FLAGS) -C - -# "https://zenodo.org/records/15880071/files/$(CSV)" 1001 @echo "file downloaded." 1002 1003 diff: $(CSV) 1004 @( diff -u $(CSV).bak $(CSV) > $(FOLDER)/diff-result.txt ) || test $$? -le 1 1005 @echo "diff done." 1006 1007 summary: diff 1008 @grep -ci "$(CONSORTIUM)" $(CSV) > $(FOLDER)/grep-summary.txt 1009 @echo "summary done." 1010 #+end_src 1011 1012 To execute the defined targets, you mentioned it otherwise to execute the main 1013 rule (=all:=), it is enough to write in your CLI plainly 1014 #+begin_src bash :dir use-case 1015 make 1016 #+end_src 1017 1018 #+RESULTS: 1019 : diff done. 1020 : summary done. 1021 : all done. 1022 1023 and all dependencies will be considered and created if necessary. 1024 1025 #+begin_src latex 1026 \end{posterboxenv} 1027 #+end_src 1028 1029 ** cron (1975) 1030 The tool ~cron~ is one of the most reliable automation systems ever 1031 developed. It allows the scheduling of commands and scripts at specific 1032 intervals — from minutes to months — and thus provides a temporal dimension 1033 to reproducible workflows. Originally designed for system maintenance 1034 tasks, it quickly became the backbone of automation across UNIX systems. 1035 1036 In essence, ~cron~ is the *timekeeper* of reproducible research: while 1037 ~make~ manages *dependencies*,~cron~ manages *time*. Together, they ensure 1038 that tasks are executed automatically, in the correct order and at the 1039 correct time — without user intervention. 1040 1041 Typical use cases in research data management include: 1042 -periodic backups or synchronization of repositories (e.g., using 1043 ~rsync~), 1044 -scheduled data validation or checksum verification, 1045 -regular harvesting of metadata from APIs, 1046 -and the automated regeneration of reports or dashboards. 1047 1048 #+begin_src latex 1049 \begin{posterboxenv}[myboxtitle={cron (1975)}{production, analysis, archiving}] 1050 {column=4, below=make, name=cron} 1051 When reproducibility meets time, \texttt{cron} provides the temporal 1052 backbone of automated research workflows. It executes predefined tasks at 1053 regular intervals — hourly, daily, or monthly — ensuring that updates, 1054 validations, and synchronizations happen automatically. \texttt{cron} thus 1055 complements \texttt{make}: the former manages \emph{when}, the latter 1056 \emph{how}. 1057 #+end_src 1058 1059 Each user can maintain their own ~crontab~ file, defining scheduled jobs. 1060 The syntax follows a five-field pattern specifying time and frequency, followed by the command. 1061 1062 #+begin_src bash :tangle snippets/cron-pattern :eval never :exports none 1063 # |----------- 1: minute (0–59) 1064 # | |--------- 2: hour (0–23) 1065 # | | |------- 3: day of month (1–31) 1066 # | | | |----- 4: month (1–12) 1067 # | | | | |--- 5: day of week (0–6, Sunday=0) 1068 # 1 2 3 4 5 1069 * * * * * command_to_execute 1070 #+end_src 1071 1072 #+begin_src latex 1073 \tcbline Here is the explanation and a basic pattern of a cron-file. 1074 \restSnippet{cron-pattern}{bash} 1075 \end{posterboxenv} 1076 #+end_src 1077 For instance, to run a nightly validation and synchronization of research data: 1078 1079 #+begin_src bash :tangle snippets/cron-rsync-validate :eval never :exports code 1080 0 2 * * * make summary && rsync -av use-case/ backup/ 1081 #+end_src 1082 1083 This example runs every night at 2 a.m., validating the dataset using 1084 the ~make~ rule and synchronizing it afterward. The combination of 1085 ~make~ and ~cron~ thus enables a fully automated, time-aware, and 1086 reproducible research workflow. 1087 1088 ** awk (1977) 1089 When it comes to handle structered data (e.g. in columns) then *awk* is your 1090 friend. The original handbook of [cite:@awk] is still the most comprehensive 1091 book and should always be the first choice of documentation. It is continously 1092 maintained and the development goes on. 1093 #+begin_src latex 1094 \begin{posterboxenv}[myboxtitle={awk (1977)}{analysis, production}] 1095 {column=4, below=cron,name=awk} 1096 When it comes to data processing and analysis, \textbf{awk} is one of the 1097 most remarkably enduring tools in computational research. It combines the 1098 features of a \emph{streaming text processor}, a \emph{pattern matcher}, 1099 and a lightweight \emph{programming language}. Its concise syntax allows 1100 complex data operations to be written in just a few lines of code. 1101 #+end_src 1102 1103 Unlike shell pipelines that only filter text, ~awk~ can: 1104 -perform real-time calculations and aggregations, 1105 -handle column-based datasets like CSV files directly, 1106 -extract, transform, and summarize data on the fly, 1107 -and produce structured output for further analysis. 1108 1109 For researchers, awk shines when dealing with raw or tabular data: 1110 it bridges the gap between ~grep~/~sed~ filtering and high-level 1111 statistical scripting in R or Python. Because it runs in any UNIX 1112 environment and needs no dependencies, it remains ideal for *reproducible 1113 workflows*:~awk~ scripts are plain text and require no dependencies, they 1114 are fully transparent, version-controllable, and reproducible—key 1115 requirements for FAIR-compliant workflows. When embedded in Makefiles or 1116 shell pipelines, ~awk~ becomes a lightweight yet powerful component of 1117 automated and auditable RDM processes. 1118 1119 #+name: awk-pattern 1120 #+begin_src bash :tangle snippets/awk-pattern :eval never :exports none 1121 awk -F',' 'BEGIN { init } pattern { action } END { summary }' [FILE] 1122 #+end_src 1123 1124 Let’s first start with the basic pattern of ~awk~. 1125 -~-F','~ field separator (here =,= for a =.csv=) 1126 -~\$1,\$2,...~ columns/fields; =NF= = number of fields, =NR= = current record number 1127 - ~BEGIN~ initialization block, executed once before reading input 1128 (e.g., set field separators, initialize counters, print headers) 1129 - ~pattern~ condition or regex tested per input line 1130 (e.g., =$3 > 0= or =/MatWerk/=) 1131 -~action~ command executed when the pattern matches 1132 (e.g., =sum+=$3; print $1,$3=) 1133 -~END~ finalization block, executed once after all lines are processed 1134 (e.g., print summary, averages, totals) 1135 1136 #+begin_src latex 1137 \tcbline Here is the basic pattern: 1138 \restSnippet{awk-pattern}{awk} 1139 #+end_src 1140 1141 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). 1142 The script is saved as the file =awk-count-by-type= (in the folder =snippets=) and looks like 1143 1144 #+name: affiliation-count-by-type 1145 #+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 1146 BEGIN { FS = ";"; OFS = "\t" } 1147 function norm(s){ s=tolower(s); gsub(/[[:space:]-]+/,"",s); gsub(/\"/,"",s); return s } 1148 NR==1 { want = norm(consortium); next } 1149 index(norm($3), want) { cnt[$1]++; total++ } 1150 END{ 1151 for(t in cnt){if(length(t)>m)m=length(t); if(length(cnt[t])>w)w=length(cnt[t])} 1152 print "----"consortium"----" 1153 for(t in cnt) printf "%-*s %*d\n", m, t, w, cnt[t] 1154 } 1155 #+end_src 1156 1157 1158 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. 1159 1160 -~-f~ specify the path to the ~awk~-file script 1161 (e.g. =make -f affiliation-count-by-type= ) 1162 -~-v~ declare the variable and its content, see above. 1163 1164 1165 #+name: awk-affiliation 1166 #+begin_src bash :eval true :dir use-case :results verbatim :var consortium="NFDI-MatWerk" : 1167 folder="results-${consortium}" 1168 mkdir -pv ${folder} 1169 awk -f affiliation-count-by-type -v consortium=${consortium} Collaboration_of_Consortia_2025.csv \ 1170 | tee "${folder}/analysis-overview.txt" 1171 #+end_src 1172 1173 #+RESULTS: awk-affiliation 1174 : ----NFDI-MatWerk---- 1175 : Joint service 1 1176 : Project 2 1177 : Interest group 1 1178 : Event: workshop 7 1179 : Event: conference participation 2 1180 : Event: local networking 2 1181 1182 We can easily reuse the code snippet and pass a different NFDI consortium to it. 1183 1184 #+call: awk-affiliation(consortium="NFDI4ING") 1185 1186 #+RESULTS: 1187 #+begin_example 1188 results-NFDI4ING 1189 ----NFDI4ING---- 1190 Event: hackathon 1 1191 Event: conference organisation 2 1192 Joint service 4 1193 Interest group 8 1194 Event: workshop 1 1195 Event: lecture series 1 1196 Alliance 1 1197 Event: local networking 5 1198 #+end_example 1199 1200 #+begin_src latex 1201 \end{posterboxenv} 1202 #+end_src 1203 1204 ** tar (1979) 1205 We conclude our /tour de tools/ with a way to archive all necessary files. 1206 #+begin_src latex 1207 \begin{posterboxenv}[myboxtitle={tar (1979)}{archiving}] 1208 {column =4, below=awk, name =tar} 1209 The command-line tool \textbf{tar}—short for \emph{tape archive}—has been 1210 the backbone of data packaging and long-term archiving for nearly half a 1211 century. Originally designed to write sequential data streams to magnetic 1212 tape, it remains one of the most widely used and trusted archiving tools in 1213 computing today. 1214 #+end_src 1215 1216 In the context of research data management, ~tar~ provides: 1217 -platform-independent, lossless bundling of files and directories, 1218 -reproducible data snapshots for archiving and transfer, 1219 -compatibility with checksums and compression utilities 1220 -(e.g. ~gzip~,~bzip2~,~xz~), 1221 -and transparent integration in automated workflows or HPC pipelines. 1222 1223 Because ~tar~ simply concatenates files with metadata, it is robust, 1224 transparent, and /future proof/: every UNIX-like system will be able to unpack a tar archive even decades later. 1225 1226 #+begin_src shell :tangle snippets/tar-pattern :eval never :exports none 1227 tar [FLAGS] [FILEs/PATTERN] [DIRECTORY] 1228 #+end_src 1229 1230 #+begin_src latex 1231 \tcbline Here you see the basic pattern 1232 \restSnippet{tar-pattern}{bash} 1233 #+end_src 1234 1235 Let’s create an archive of cleaned datasets with a dedicated checksum file: 1236 #+begin_src bash 1237 tar -C use-case -czf NFDI-results.tar.gz . && echo "file tape-archived." 1238 sha256sum NFDI-results.tar.gz | tee NFDI-results.tar.gz.sha256 1239 #+end_src 1240 1241 #+RESULTS: 1242 : file tape-archived. 1243 : 6bcf8f4675bb7cf33fbac55a5d09e8c46cc7dd42553685ac8ee10174b6ab11c6 NFDI-results.tar.gz 1244 1245 The flags we are using here are: 1246 -~-c~: Create a new archive containing the specified items. 1247 -~-z~: Compress the resulting archive with gzip. 1248 -~-f~: Write the archive to the specified file 1249 1250 and of course we want to see if it really worked and look into the generated 1251 tape archive. 1252 #+begin_src bash :results verbatim 1253 tar --list -f NFDI-results.tar.gz | sort 1254 #+end_src 1255 1256 #+RESULTS: 1257 #+begin_example 1258 ./ 1259 ./affiliation-count-by-type 1260 ./Collaboration_of_Consortia_2025.csv 1261 ./Collaboration_of_Consortia_2025.csv.bak 1262 ./makefile 1263 ./results-NFDI-MatWerk/ 1264 ./results-NFDI-MatWerk/analysis-overview.txt 1265 ./results-NFDI-MatWerk/diff-result.txt 1266 ./results-NFDI-MatWerk/grep-summary.txt 1267 ./results-NFDI4ING/ 1268 ./results-NFDI4ING/analysis-overview.txt 1269 #+end_example 1270 1271 The resulting ~.tar.gz~ file can be deposited in a repository or sent to 1272 collaborators, along with the checksum guaranteeing data 1273 integrity and provenance. 1274 1275 #+begin_src latex 1276 \end{posterboxenv} 1277 #+end_src 1278 1279 ** Results 1280 Providing a condensed overview of tools that can also be considered as 1281 /resilient technologies/ but have not been presented in detail above. 1282 Furthermore, we introduce the term *ROOT* — a conceptual badge that can be 1283 applied to all these technologies. 1284 A tool is considered *ROOT* when it is /robust/,/open/,/ongoing/, and 1285 /time-tested/. These qualities ensure long-term usability, reproducibility, and resilience 1286 in research data management environments. 1287 1288 #+begin_src latex 1289 \begin{posterboxenv}[colback=white, natural height] 1290 {column=2, span=2, below=abstract-circle, name=result}% 1291 \vspace*{5cm} \hfil\includegraphics[width=.8\linewidth]{logo-root} 1292 \end{posterboxenv} 1293 #+end_src 1294 1295 The overview below shows the variety and bandwidth of mature, open, and stable 1296 technologies that continue to form the foundation of research infrastructures. 1297 1298 #+begin_src latex 1299 \begin{posterboxenv}[colback=white, natural height] 1300 {column=4, above=mybottom, name=result-list}% 1301 Not all tools of lasting relevance can be introduced in depth here. 1302 The following list presents additional \emph{resilient technologies} that 1303 remain fundamental to reproducible and sustainable research workflows. 1304 \begin{labeling}{XX} 1305 \item[find (1974)] \emph{BSD/GPL}; 1306 Recursively searches complex directory structures to locate files, 1307 match patterns, or filter metadata. Essential for navigating large 1308 research repositories with nested folders or evolving data versions. 1309 \item[LaTeX (1984)] \emph{LPPL}; 1310 The enduring standard for scientific writing and documentation— 1311 used for DMPs, reports, posters, and publications. Combines 1312 typographic precision with reproducibility and platform independence. 1313 \item[perl (1987)] \emph{Artistic/GPL}; 1314 A versatile scripting language for text manipulation, pattern 1315 recognition, and metadata transformation. Ideal for parsing logs, 1316 transforming XML/JSON, or validating research data. 1317 \item[rsync (1996)] \emph{GPL}; 1318 Synchronizes and mirrors directories across systems efficiently. 1319 Commonly used for backups, replication, and maintaining mirrored 1320 repositories. Transfers only differences, saving time and bandwidth. 1321 \item[SQLite (2000)] \emph{Public Domain}; 1322 A serverless SQL data\-base stored in a single file—lightweight yet 1323 powerful. Excellent for metadata catalogs, portable archives, 1324 and small-scale analytical datasets. 1325 \end{labeling} 1326 \end{posterboxenv} 1327 #+end_src 1328 1329 #+caption: Badge for a *ROOT* technology. 1330 #+attr_latex: :float nil :width 0.75\linewidth 1331 #+attr_org: :width 700 1332 file:img/logo-root.png 1333 1334 #+print_bibliography: 1335 #+begin_export latex 1336 \end{multicols} 1337 #+end_export 1338 #+name: document-end 1339 #+begin_src latex :exports none 1340 \end{tcbposter} 1341 \end{document} 1342 #+end_src 1343 1344 * Meta and Source Poster :noexport: 1345 In this section we create a poster with the source code of this file. 1346 For this we take advantage of the ~noweb~-feature of org-mode. 1347 1348 ** Meta Poster 1349 #+begin_src latex :noweb yes :tangle resilient-technologies-poster-meta.tex :results none 1350 \DocumentMetadata{ 1351 pdfversion=1.7, 1352 pdfstandard=A-3b} 1353 <<preamble>> 1354 <<document-begin>> 1355 <<poster-setup>> 1356 <<poster-title>> 1357 \begin{posterboxenv}[enhanced jigsaw, colback=white, 1358 top=0pt, bottom=0pt, left=0pt, right=0pt, 1359 ]{column = 1, row=2,span = 4} 1360 \includegraphics[width=\linewidth]{resilient-technologies-code.pdf} 1361 \end{posterboxenv} 1362 <<document-end>> 1363 #+end_src 1364 ** Source Poster 1365 1366 #+begin_src latex :noweb yes :tangle resilient-technologies-source.tex :results none 1367 \DocumentMetadata{ pdfversion=1.7, pdfstandard=A-3b} 1368 \documentclass[8pt]{scrartcl} 1369 \usepackage[a0paper,top=0cm,bottom=19.5cm,left=0cm,right=0cm]{geometry} 1370 \usepackage[english]{babel} \usepackage[RGB]{xcolor} 1371 \definecolor{rwth-blue-100}{RGB}{ 0, 84,159} \definecolor{rwth-blue-25}{RGB}{199,221,242} 1372 \usepackage{multicol} \pagestyle{empty} 1373 \usepackage[minted,skins,breakable]{tcolorbox} 1374 \renewcommand{\theFancyVerbLine}{\ttfamily\arabic{FancyVerbLine}} 1375 \NewTCBInputListing{\restCLI}{O{}m}{% 1376 listing only, listing file={#2}, breakable, top=0pt, bottom=0pt, left=0pt, right=0pt, 1377 colback=white, opacityback=0, sharp corners, boxrule=0pt, bottomrule=0pt, toprule=0pt, 1378 enhanced jigsaw, minted language=org, minted options={ breakautoindent=false, 1379 breaksymbolleft={}, breakanywheresymbolpre={}, breakanywhere, breaklines, autogobble, 1380 style=friendly, linenos, numbersep=4pt, firstnumber=auto, stepnumber=1, 1381 numberblanklines=true, xleftmargin=2em, }, #1} 1382 \begin{document}% 1383 \begin{multicols}{5}% 1384 \restCLI{resilient-technologies-code.org} 1385 \end{multicols} 1386 \end{document} 1387 #+end_src 1388 1389 #+begin_src latex :noweb yes :tangle resilient-technologies-poster-source.tex :results none 1390 <<preamble>> 1391 <<document-begin>> 1392 <<poster-setup>> 1393 <<poster-title>> 1394 \begin{posterboxenv}[colback=white, enhanced jigsaw, top=0pt, bottom=0pt, left=0pt, right=0pt, 1395 ]{column=1, row=2, span=4, between=row1 and mybottom} 1396 \includegraphics[width=\linewidth]{resilient-technologies-source.pdf} 1397 \end{posterboxenv} 1398 <<document-end>> 1399 #+end_src 1400 1401 ** Empty Poster 1402 #+begin_src latex :noweb yes :tangle resilient-technologies-poster-empty.tex :results none 1403 <<preamble>> <<document-begin>> <<poster-setup>> <<poster-title>> <<document-end>> 1404 #+end_src 1405 ** Focus Poster 1406 #+begin_src latex :noweb yes :tangle resilient-technologies-poster-focus.tex :results none 1407 \documentclass[tikz,border=0pt]{standalone} 1408 \usepackage{graphicx,tikz}\usetikzlibrary{spy} 1409 \usepackage[RGB]{xcolor}\definecolor{rwth-bordeaux-100}{RGB}{161,16,53} 1410 \tikzset{source/.style={rwth-bordeaux-100}, 1411 meta/.style={rwth-bordeaux-100}, 1412 main/.style={rwth-bordeaux-100},} 1413 \begin{document} 1414 \begin{tikzpicture}[ 1415 spy using overlays={circle,magnification=3, size=9cm} 1416 ]\node[anchor=south west, inner sep=0] (img) at (0,0) 1417 {\includegraphics[scale=1]{resilient-technologies-allon1.pdf}}; 1418 \spy [main] on (3,94) in node at (47.5,47); 1419 \spy [main] on (21,93) in node at (57.5,47); 1420 \spy [source,magnification=4] on (1.6,43.6) in node at (67.5,47); 1421 \spy [source,magnification=5] on (34.5,10) in node at (78,47); 1422 %------------------------------------ 1423 \spy [meta] on (52,85) in node at (47.5,37); 1424 \spy [source,magnification=4] on (35,38) in node at (57.5,37); 1425 \spy [meta] on (44,83) in node at (67.5,37); 1426 \spy [source,magnification=6] on (31.5,41.5) in node at (78,37); 1427 %------------------------------------ 1428 \spy [meta] on (68.99,99.2) in node at (47.5,27); 1429 \spy [source,magnification=5] on (17.8,25.5) in node at (57.5,27); 1430 \spy [meta] on (43.5,88) in node at (67.5,27); 1431 \spy [source,magnification=5] on (47,75) in node at (78,27); 1432 %------------------------------------ 1433 \spy [main] on (33.5,110) in node at (47.5,17); 1434 \spy [source,magnification=4] on (9.5,26.5) in node at (57.5,17); 1435 \spy [source,magnification=5] on (18,6) in node at (67.5,17); 1436 \spy [meta] on (70,69.5) in node at (78,17); 1437 %------------------------------------ 1438 \spy [source,magnification=3.5] on (35.3,16) in node at (47.5,7); 1439 \spy [meta] on (61,88.2) in node at (57.5,7); 1440 \spy [main] on (33.3,70.3) in node at (67.5,7); 1441 \spy [meta] on (52.1,99.2) in node at (78,7); 1442 \end{tikzpicture} 1443 \end{document} 1444 #+end_src