From b868f3289b7b447310d665299af1f30a273d2eb1 Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Mon, 9 Mar 2026 15:38:44 +0100 Subject: [PATCH 1/8] Add: Readme explaining the purpose, format and links to existing blog posts --- documents/docs/blog/README.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 documents/docs/blog/README.md diff --git a/documents/docs/blog/README.md b/documents/docs/blog/README.md new file mode 100644 index 0000000..aa92b15 --- /dev/null +++ b/documents/docs/blog/README.md @@ -0,0 +1,28 @@ +# Blog + +## Purpose +This folder contains a collection of blog posts documenting the development process of our application. These blogs serve two key purposes: + +1. **For External Audiences** + + The blogs provide insights into the internal program flow and the interaction between components without requiring readers to dive into the source code. They offer a mixed-level overview of how different parts of the system work together. + +2. **For Our Team** + + The blogs serve as a record of our decision-making process. By documenting what decisions were made and why, we can track the evolution of our design choices and understand the reasoning behind them. This is invaluable for maintaining consistency across the team. + +But keep in mind that these blogs **do not replace** the detailed source code documentation. + +## Format +All blog posts follow the naming convention: `_.md` + +## Blog Posts + +### General +*(No posts yet)* + +### Client +*(No posts yet)* + +### Server +*(No posts yet)* -- 2.52.0 From ea8ac3831f6ff43c9547bc74f8c633ab8028f684 Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer <lars.winzer@stud.unibas.ch> Date: Mon, 9 Mar 2026 16:07:18 +0100 Subject: [PATCH 2/8] Add: Subfolders in repository structure for diary and blog in main readme --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 01ffb96..59bdd50 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,9 @@ This protocol handles game state synchronization, player actions, lobby and glob │ └── test/ # Unit tests ├── documents/ # Project resources and documentation │ ├── images/ # Images for README and documentation -│ ├── docs # Documentation +│ ├── docs # Directory for diary and blog files +│ │ ├── diary # Diary files for each organizational meetup +| | └── blog # Blog files covering project-related topics │ ├── milestones/ # Milestone deliverables (6 milestones) │ └── (Other resources) # Additional project materials └── outreach/ # Public-facing content and marketing materials -- 2.52.0 From d060697aa954ffe65ca6af7d0993e9af720fa06b Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer <lars.winzer@stud.unibas.ch> Date: Mon, 9 Mar 2026 16:27:13 +0100 Subject: [PATCH 3/8] Add: Draw.io related files to .gitignore --- .gitignore | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index a1b3b23..1a83ce7 100644 --- a/.gitignore +++ b/.gitignore @@ -105,4 +105,17 @@ $RECYCLE.BIN/ .java-version ## VSCode -.vscode \ No newline at end of file +.vscode + +## diagrams.net / draw.io +# Draw.io temporary files +*.drawio.bkp +*.drawio.tmp + +# Auto-save files +*.drawio.autosave + +# Exported images (optional – nur wenn du Exporte nicht versionieren willst) +*.drawio.png +*.drawio.svg +*.drawio.pdf \ No newline at end of file -- 2.52.0 From e7b95098b2dbffd54c4aee305ac744d746446b72 Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer <lars.winzer@stud.unibas.ch> Date: Mon, 9 Mar 2026 16:28:16 +0100 Subject: [PATCH 4/8] Add: Draw.io document and exported image for the blog --- ...shared_ressouce_possible_approaches.drawio | 100 ++++++++++++++++++ .../shared_ressouce_possible_approaches.svg | 3 + 2 files changed, 103 insertions(+) create mode 100644 documents/images/docs/blog/09-03-26_Network/shared_ressouce_possible_approaches.drawio create mode 100644 documents/images/docs/blog/09-03-26_Network/shared_ressouce_possible_approaches.svg diff --git a/documents/images/docs/blog/09-03-26_Network/shared_ressouce_possible_approaches.drawio b/documents/images/docs/blog/09-03-26_Network/shared_ressouce_possible_approaches.drawio new file mode 100644 index 0000000..b6788a5 --- /dev/null +++ b/documents/images/docs/blog/09-03-26_Network/shared_ressouce_possible_approaches.drawio @@ -0,0 +1,100 @@ +<mxfile host="Electron" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/29.6.1 Chrome/142.0.7444.265 Electron/39.8.0 Safari/537.36" version="29.6.1"> + <diagram name="Seite-1" id="YJCt4VXcEaH1ZB-WJMOn"> + <mxGraphModel dx="901" dy="582" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="C29U5SLjdgufHwaoauAd-1" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Peer To Peer" vertex="1"> + <mxGeometry height="30" width="140" x="70" y="51.61" as="geometry" /> + </mxCell> + <mxCell id="C29U5SLjdgufHwaoauAd-2" parent="1" style="sketch=0;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#d79b00;fillColor=#ffe6cc;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;align=center;shape=mxgraph.office.devices.laptop;" value="" vertex="1"> + <mxGeometry height="30" width="51.18" x="70" y="160" as="geometry" /> + </mxCell> + <mxCell id="C29U5SLjdgufHwaoauAd-3" parent="1" style="sketch=0;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#d79b00;fillColor=#ffe6cc;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;align=center;shape=mxgraph.office.devices.laptop;" value="" vertex="1"> + <mxGeometry height="30" width="51.18" x="160" y="160" as="geometry" /> + </mxCell> + <mxCell id="C29U5SLjdgufHwaoauAd-4" parent="1" style="sketch=0;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#d79b00;fillColor=#ffe6cc;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;align=center;shape=mxgraph.office.devices.laptop;" value="" vertex="1"> + <mxGeometry height="30" width="51.18" x="160" y="90" as="geometry" /> + </mxCell> + <mxCell id="C29U5SLjdgufHwaoauAd-5" parent="1" style="sketch=0;pointerEvents=1;shadow=0;dashed=0;html=1;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;align=center;shape=mxgraph.office.devices.laptop;fillColor=#ffe6cc;strokeColor=#d79b00;" value="" vertex="1"> + <mxGeometry height="30" width="51.18" x="70" y="90" as="geometry" /> + </mxCell> + <mxCell id="C29U5SLjdgufHwaoauAd-6" edge="1" parent="1" style="endArrow=classic;startArrow=classic;html=1;rounded=0;" value=""> + <mxGeometry height="50" relative="1" width="50" as="geometry"> + <mxPoint x="160" y="160" as="sourcePoint" /> + <mxPoint x="120" y="120" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="C29U5SLjdgufHwaoauAd-7" edge="1" parent="1" style="endArrow=classic;startArrow=classic;html=1;rounded=0;" value=""> + <mxGeometry height="50" relative="1" width="50" as="geometry"> + <mxPoint x="120" y="160" as="sourcePoint" /> + <mxPoint x="160" y="120" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="C29U5SLjdgufHwaoauAd-8" edge="1" parent="1" style="endArrow=classic;startArrow=classic;html=1;rounded=0;" value=""> + <mxGeometry height="50" relative="1" width="50" as="geometry"> + <mxPoint x="120" y="100" as="sourcePoint" /> + <mxPoint x="160" y="100" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="C29U5SLjdgufHwaoauAd-9" edge="1" parent="1" style="endArrow=classic;startArrow=classic;html=1;rounded=0;" value=""> + <mxGeometry height="50" relative="1" width="50" as="geometry"> + <mxPoint x="120" y="180" as="sourcePoint" /> + <mxPoint x="160" y="180" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="C29U5SLjdgufHwaoauAd-10" edge="1" parent="1" style="endArrow=classic;startArrow=classic;html=1;rounded=0;startSize=6;" value=""> + <mxGeometry height="50" relative="1" width="50" as="geometry"> + <mxPoint x="90" y="120" as="sourcePoint" /> + <mxPoint x="90" y="160" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="C29U5SLjdgufHwaoauAd-12" edge="1" parent="1" style="endArrow=classic;startArrow=classic;html=1;rounded=0;startSize=6;" value=""> + <mxGeometry height="50" relative="1" width="50" as="geometry"> + <mxPoint x="190" y="120" as="sourcePoint" /> + <mxPoint x="190" y="160" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="C29U5SLjdgufHwaoauAd-14" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;rounded=0;" value=""> + <mxGeometry height="50" relative="1" width="50" as="geometry"> + <mxPoint x="240" y="200" as="sourcePoint" /> + <mxPoint x="240" y="60" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="C29U5SLjdgufHwaoauAd-15" parent="1" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#82b366;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#d5e8d4;shape=mxgraph.mscae.enterprise.server_farm" value="" vertex="1"> + <mxGeometry height="38.39" width="60" x="350" y="81.61" as="geometry" /> + </mxCell> + <mxCell id="C29U5SLjdgufHwaoauAd-16" parent="1" style="sketch=0;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#d79b00;fillColor=#ffe6cc;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;align=center;shape=mxgraph.office.devices.laptop;" value="" vertex="1"> + <mxGeometry height="30" width="51.18" x="270" y="90" as="geometry" /> + </mxCell> + <mxCell id="C29U5SLjdgufHwaoauAd-17" parent="1" style="sketch=0;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#d79b00;fillColor=#ffe6cc;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;align=center;shape=mxgraph.office.devices.laptop;" value="" vertex="1"> + <mxGeometry height="30" width="51.18" x="354.40999999999997" y="160" as="geometry" /> + </mxCell> + <mxCell id="C29U5SLjdgufHwaoauAd-18" parent="1" style="sketch=0;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#d79b00;fillColor=#ffe6cc;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;align=center;shape=mxgraph.office.devices.laptop;" value="" vertex="1"> + <mxGeometry height="30" width="51.18" x="440" y="90" as="geometry" /> + </mxCell> + <mxCell id="C29U5SLjdgufHwaoauAd-19" edge="1" parent="1" style="endArrow=classic;startArrow=classic;html=1;rounded=0;startSize=6;" value=""> + <mxGeometry height="50" relative="1" width="50" as="geometry"> + <mxPoint x="379.87" y="120" as="sourcePoint" /> + <mxPoint x="379.87" y="160" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="C29U5SLjdgufHwaoauAd-20" edge="1" parent="1" style="endArrow=classic;startArrow=classic;html=1;rounded=0;startSize=6;" value=""> + <mxGeometry height="50" relative="1" width="50" as="geometry"> + <mxPoint x="350" y="100" as="sourcePoint" /> + <mxPoint x="320" y="100" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="C29U5SLjdgufHwaoauAd-22" edge="1" parent="1" style="endArrow=classic;startArrow=classic;html=1;rounded=0;startSize=6;" value=""> + <mxGeometry height="50" relative="1" width="50" as="geometry"> + <mxPoint x="440" y="100.73" as="sourcePoint" /> + <mxPoint x="410" y="100.73" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="C29U5SLjdgufHwaoauAd-23" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Client - Server" vertex="1"> + <mxGeometry height="30" width="220" x="270" y="40" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> +</mxfile> diff --git a/documents/images/docs/blog/09-03-26_Network/shared_ressouce_possible_approaches.svg b/documents/images/docs/blog/09-03-26_Network/shared_ressouce_possible_approaches.svg new file mode 100644 index 0000000..5216099 --- /dev/null +++ b/documents/images/docs/blog/09-03-26_Network/shared_ressouce_possible_approaches.svg @@ -0,0 +1,3 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent; color-scheme: light dark;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="424px" height="163px" viewBox="0 0 424 163"><defs/><g><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="C29U5SLjdgufHwaoauAd-1"><g transform="translate(0.5,0.5)"><rect x="0" y="11.61" width="140" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 27px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Peer To Peer</div></div></div></foreignObject><image x="1" y="20.5" width="138" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-2"><g transform="translate(0.5,0.5)"><rect x="0" y="120" width="51.18" height="30" fill="none" stroke="none" pointer-events="all"/><path d="M 29.59 148.11 C 30.08 148.11 30.42 147.92 30.33 147.77 L 29.35 146.35 C 29.23 146.13 29.05 146.09 28.76 146.09 L 22.42 146.09 C 22.11 146.09 21.95 146.14 21.8 146.36 L 20.9 147.77 C 20.72 147.99 21.25 148.11 21.63 148.11 Z M 44.4 143.48 L 44.4 122.61 L 6.75 122.61 L 6.75 143.48 Z M 2.65 150 C 1.65 149.99 0.75 149.66 0.37 149.15 C 0 148.64 0.15 148.14 0.47 147.79 L 4.11 144.13 L 4.11 122.5 C 4.11 121.41 5.1 120 6.74 120 L 44.41 120 C 45.69 120 47.04 121.01 47.04 122.63 L 47.04 144.13 L 50.72 147.83 C 51.03 148.17 51.18 148.63 50.81 149.13 C 50.33 149.76 49.41 149.96 48.55 150 Z" fill="#ffe6cc" stroke="#d79b00" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(255, 230, 204), rgb(54, 33, 10)); stroke: light-dark(rgb(215, 155, 0), rgb(153, 101, 0));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-3"><g transform="translate(0.5,0.5)"><rect x="90" y="120" width="51.18" height="30" fill="none" stroke="none" pointer-events="all"/><path d="M 119.59 148.11 C 120.08 148.11 120.42 147.92 120.33 147.77 L 119.35 146.35 C 119.23 146.13 119.05 146.09 118.76 146.09 L 112.42 146.09 C 112.11 146.09 111.95 146.14 111.8 146.36 L 110.9 147.77 C 110.72 147.99 111.25 148.11 111.63 148.11 Z M 134.4 143.48 L 134.4 122.61 L 96.75 122.61 L 96.75 143.48 Z M 92.65 150 C 91.65 149.99 90.75 149.66 90.37 149.15 C 90 148.64 90.15 148.14 90.47 147.79 L 94.11 144.13 L 94.11 122.5 C 94.11 121.41 95.1 120 96.74 120 L 134.41 120 C 135.69 120 137.04 121.01 137.04 122.63 L 137.04 144.13 L 140.72 147.83 C 141.03 148.17 141.18 148.63 140.81 149.13 C 140.33 149.76 139.41 149.96 138.55 150 Z" fill="#ffe6cc" stroke="#d79b00" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(255, 230, 204), rgb(54, 33, 10)); stroke: light-dark(rgb(215, 155, 0), rgb(153, 101, 0));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-4"><g transform="translate(0.5,0.5)"><rect x="90" y="50" width="51.18" height="30" fill="none" stroke="none" pointer-events="all"/><path d="M 119.59 78.11 C 120.08 78.11 120.42 77.92 120.33 77.77 L 119.35 76.35 C 119.23 76.13 119.05 76.09 118.76 76.09 L 112.42 76.09 C 112.11 76.09 111.95 76.14 111.8 76.36 L 110.9 77.77 C 110.72 77.99 111.25 78.11 111.63 78.11 Z M 134.4 73.48 L 134.4 52.61 L 96.75 52.61 L 96.75 73.48 Z M 92.65 80 C 91.65 79.99 90.75 79.66 90.37 79.15 C 90 78.64 90.15 78.14 90.47 77.79 L 94.11 74.13 L 94.11 52.5 C 94.11 51.41 95.1 50 96.74 50 L 134.41 50 C 135.69 50 137.04 51.01 137.04 52.63 L 137.04 74.13 L 140.72 77.83 C 141.03 78.17 141.18 78.63 140.81 79.13 C 140.33 79.76 139.41 79.96 138.55 80 Z" fill="#ffe6cc" stroke="#d79b00" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(255, 230, 204), rgb(54, 33, 10)); stroke: light-dark(rgb(215, 155, 0), rgb(153, 101, 0));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-5"><g transform="translate(0.5,0.5)"><rect x="0" y="50" width="51.18" height="30" fill="none" stroke="none" pointer-events="all"/><path d="M 29.59 78.11 C 30.08 78.11 30.42 77.92 30.33 77.77 L 29.35 76.35 C 29.23 76.13 29.05 76.09 28.76 76.09 L 22.42 76.09 C 22.11 76.09 21.95 76.14 21.8 76.36 L 20.9 77.77 C 20.72 77.99 21.25 78.11 21.63 78.11 Z M 44.4 73.48 L 44.4 52.61 L 6.75 52.61 L 6.75 73.48 Z M 2.65 80 C 1.65 79.99 0.75 79.66 0.37 79.15 C 0 78.64 0.15 78.14 0.47 77.79 L 4.11 74.13 L 4.11 52.5 C 4.11 51.41 5.1 50 6.74 50 L 44.41 50 C 45.69 50 47.04 51.01 47.04 52.63 L 47.04 74.13 L 50.72 77.83 C 51.03 78.17 51.18 78.63 50.81 79.13 C 50.33 79.76 49.41 79.96 48.55 80 Z" fill="#ffe6cc" stroke="#d79b00" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(255, 230, 204), rgb(54, 33, 10)); stroke: light-dark(rgb(215, 155, 0), rgb(153, 101, 0));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-6"><g transform="translate(0.5,0.5)"><path d="M 85.5 115.5 L 54.5 84.5" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 89.21 119.21 L 81.78 116.73 L 85.5 115.5 L 86.73 111.78 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 50.79 80.79 L 58.22 83.27 L 54.5 84.5 L 53.27 88.22 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-7"><g transform="translate(0.5,0.5)"><path d="M 54.5 115.5 L 85.5 84.5" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 50.79 119.21 L 53.27 111.78 L 54.5 115.5 L 58.22 116.73 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 89.21 80.79 L 86.73 88.22 L 85.5 84.5 L 81.78 83.27 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-8"><g transform="translate(0.5,0.5)"><path d="M 56.37 60 L 83.63 60" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 51.12 60 L 58.12 56.5 L 56.37 60 L 58.12 63.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 88.88 60 L 81.88 63.5 L 83.63 60 L 81.88 56.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-9"><g transform="translate(0.5,0.5)"><path d="M 56.37 140 L 83.63 140" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 51.12 140 L 58.12 136.5 L 56.37 140 L 58.12 143.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 88.88 140 L 81.88 143.5 L 83.63 140 L 81.88 136.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-10"><g transform="translate(0.5,0.5)"><path d="M 20 86.37 L 20 113.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 20 81.12 L 23.5 88.12 L 20 86.37 L 16.5 88.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 20 118.88 L 16.5 111.88 L 20 113.63 L 23.5 111.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-12"><g transform="translate(0.5,0.5)"><path d="M 120 86.37 L 120 113.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 120 81.12 L 123.5 88.12 L 120 86.37 L 116.5 88.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 120 118.88 L 116.5 111.88 L 120 113.63 L 123.5 111.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-14"><g transform="translate(0.5,0.5)"><path d="M 170 160 L 170 20" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-15"><g transform="translate(0.5,0.5)"><rect x="280" y="41.61" width="60" height="38.39" fill="none" stroke="none" pointer-events="all"/><path d="M 280 80 L 280 43.19 C 280.11 42.33 280.82 41.67 281.69 41.62 L 296.75 41.62 C 297.24 41.62 297.71 41.82 298.05 42.17 C 298.39 42.52 298.57 43 298.55 43.49 L 298.55 80 Z M 283.25 76.73 L 295.3 76.73 L 295.3 74.43 L 283.25 74.43 Z M 295.3 72.25 L 295.3 70.07 L 283.25 70.07 L 283.25 72.37 L 295.3 72.37 Z M 295.3 49.3 L 295.3 47.06 L 283.25 47.06 L 283.25 49.3 Z M 300.72 80 L 300.72 43.19 C 300.84 42.28 301.62 41.61 302.53 41.62 L 317.53 41.62 C 318.42 41.64 319.16 42.31 319.28 43.19 L 319.28 80 Z M 303.98 76.73 L 316.02 76.73 L 316.02 74.43 L 303.98 74.43 Z M 316.02 72.37 L 316.02 70.07 L 303.98 70.07 L 303.98 72.37 Z M 303.98 49.3 L 316.02 49.3 L 316.02 47.06 L 303.98 47.06 Z M 321.51 80 L 321.51 43.19 C 321.6 42.41 322.18 41.77 322.95 41.62 L 338.31 41.62 C 339.18 41.67 339.89 42.33 340 43.19 L 340 80 Z M 324.7 76.73 L 336.81 76.73 L 336.81 74.43 L 324.7 74.43 Z M 336.81 72.37 L 336.81 70.07 L 324.7 70.07 L 324.7 72.37 Z M 324.7 49.3 L 336.81 49.3 L 336.81 47.06 L 324.7 47.06 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-16"><g transform="translate(0.5,0.5)"><rect x="200" y="50" width="51.18" height="30" fill="none" stroke="none" pointer-events="all"/><path d="M 229.59 78.11 C 230.08 78.11 230.42 77.92 230.33 77.77 L 229.35 76.35 C 229.23 76.13 229.05 76.09 228.76 76.09 L 222.42 76.09 C 222.11 76.09 221.95 76.14 221.8 76.36 L 220.9 77.77 C 220.72 77.99 221.25 78.11 221.63 78.11 Z M 244.4 73.48 L 244.4 52.61 L 206.75 52.61 L 206.75 73.48 Z M 202.65 80 C 201.65 79.99 200.75 79.66 200.37 79.15 C 200 78.64 200.15 78.14 200.47 77.79 L 204.11 74.13 L 204.11 52.5 C 204.11 51.41 205.1 50 206.74 50 L 244.41 50 C 245.69 50 247.04 51.01 247.04 52.63 L 247.04 74.13 L 250.72 77.83 C 251.03 78.17 251.18 78.63 250.81 79.13 C 250.33 79.76 249.41 79.96 248.55 80 Z" fill="#ffe6cc" stroke="#d79b00" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(255, 230, 204), rgb(54, 33, 10)); stroke: light-dark(rgb(215, 155, 0), rgb(153, 101, 0));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-17"><g transform="translate(0.5,0.5)"><rect x="284.41" y="120" width="51.18" height="30" fill="none" stroke="none" pointer-events="all"/><path d="M 314 148.11 C 314.49 148.11 314.83 147.92 314.74 147.77 L 313.76 146.35 C 313.64 146.13 313.46 146.09 313.17 146.09 L 306.83 146.09 C 306.52 146.09 306.36 146.14 306.21 146.36 L 305.31 147.77 C 305.13 147.99 305.66 148.11 306.04 148.11 Z M 328.81 143.48 L 328.81 122.61 L 291.16 122.61 L 291.16 143.48 Z M 287.06 150 C 286.06 149.99 285.16 149.66 284.78 149.15 C 284.41 148.64 284.56 148.14 284.88 147.79 L 288.52 144.13 L 288.52 122.5 C 288.52 121.41 289.51 120 291.15 120 L 328.82 120 C 330.1 120 331.45 121.01 331.45 122.63 L 331.45 144.13 L 335.13 147.83 C 335.44 148.17 335.59 148.63 335.22 149.13 C 334.74 149.76 333.82 149.96 332.96 150 Z" fill="#ffe6cc" stroke="#d79b00" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(255, 230, 204), rgb(54, 33, 10)); stroke: light-dark(rgb(215, 155, 0), rgb(153, 101, 0));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-18"><g transform="translate(0.5,0.5)"><rect x="370" y="50" width="51.18" height="30" fill="none" stroke="none" pointer-events="all"/><path d="M 399.59 78.11 C 400.08 78.11 400.42 77.92 400.33 77.77 L 399.35 76.35 C 399.23 76.13 399.05 76.09 398.76 76.09 L 392.42 76.09 C 392.11 76.09 391.95 76.14 391.8 76.36 L 390.9 77.77 C 390.72 77.99 391.25 78.11 391.63 78.11 Z M 414.4 73.48 L 414.4 52.61 L 376.75 52.61 L 376.75 73.48 Z M 372.65 80 C 371.65 79.99 370.75 79.66 370.37 79.15 C 370 78.64 370.15 78.14 370.47 77.79 L 374.11 74.13 L 374.11 52.5 C 374.11 51.41 375.1 50 376.74 50 L 414.41 50 C 415.69 50 417.04 51.01 417.04 52.63 L 417.04 74.13 L 420.72 77.83 C 421.03 78.17 421.18 78.63 420.81 79.13 C 420.33 79.76 419.41 79.96 418.55 80 Z" fill="#ffe6cc" stroke="#d79b00" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(255, 230, 204), rgb(54, 33, 10)); stroke: light-dark(rgb(215, 155, 0), rgb(153, 101, 0));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-19"><g transform="translate(0.5,0.5)"><path d="M 309.87 86.37 L 309.87 113.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 309.87 81.12 L 313.37 88.12 L 309.87 86.37 L 306.37 88.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 309.87 118.88 L 306.37 111.88 L 309.87 113.63 L 313.37 111.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-20"><g transform="translate(0.5,0.5)"><path d="M 273.63 60 L 256.37 60" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 278.88 60 L 271.88 63.5 L 273.63 60 L 271.88 56.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 251.12 60 L 258.12 56.5 L 256.37 60 L 258.12 63.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-22"><g transform="translate(0.5,0.5)"><path d="M 363.63 60.73 L 346.37 60.73" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 368.88 60.73 L 361.88 64.23 L 363.63 60.73 L 361.88 57.23 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 341.12 60.73 L 348.12 57.23 L 346.37 60.73 L 348.12 64.23 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-23"><g transform="translate(0.5,0.5)"><rect x="200" y="0" width="220" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 218px; height: 1px; padding-top: 15px; margin-left: 201px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Client - Server</div></div></div></foreignObject><image x="201" y="8.5" width="218" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file -- 2.52.0 From d346ec4f9706a854d7c4f9f7eca0e695cadcd5a1 Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer <lars.winzer@stud.unibas.ch> Date: Mon, 9 Mar 2026 18:30:08 +0100 Subject: [PATCH 5/8] Add: Blog to cover networking in its entirety --- documents/docs/blog/09-03-26_Network.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 documents/docs/blog/09-03-26_Network.md diff --git a/documents/docs/blog/09-03-26_Network.md b/documents/docs/blog/09-03-26_Network.md new file mode 100644 index 0000000..c83c7a1 --- /dev/null +++ b/documents/docs/blog/09-03-26_Network.md @@ -0,0 +1,21 @@ +# Table of Contents + + +# Basics +## Formal concepts of networking +Whenever you want to access the same data on different devices without carrying it (the data) from device to device, with, let’s say, a thumb drive, you have multiple options for achieving this. + +![Peer To Peer Versus Client-Server Architecture](/documents/images/docs/blog/09-03-26_Network/shared_ressouce_possible_approaches.svg) + +<!-- I tried to get this embeddet image to show up, but it just wouldnt +<img src="/documents/images/docs/blog/09-03-26_Network/shared_ressouce_possible_approaches.svg" alt="Peer To Peer Versus Client-Server Architecture" width="200"/> +--> + +**Peer to Peer** enables users to share content (files, messages, ...). +While it does not rely on a central server, it comes with the big trade-of that the device storing the data you want to access has to be reachable and online. +Today Peer to Peer is still widely used with VoIP and decentralized networks for censorship-resistant transactions formaly known as the blockchain. + +The **Client-Server** model evolved into the sophisticated "web-services" we know and use daily. +One central powerful computer (the server) stores data and allows external devices (clients) to access it. + +For our course "Programmierprojekt" we are required to use the Client-Server model. -- 2.52.0 From 676e24e78da6a87884659415cb4da88137792fe4 Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer <lars.winzer@stud.unibas.ch> Date: Mon, 9 Mar 2026 18:59:35 +0100 Subject: [PATCH 6/8] Add: Table of contents and 'The Language of the Network' section --- documents/docs/blog/09-03-26_Network.md | 39 +++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/documents/docs/blog/09-03-26_Network.md b/documents/docs/blog/09-03-26_Network.md index c83c7a1..e1ee3a4 100644 --- a/documents/docs/blog/09-03-26_Network.md +++ b/documents/docs/blog/09-03-26_Network.md @@ -1,4 +1,8 @@ # Table of Contents +- [Table of Contents](#table-of-contents) +- [Introduction](#introduction) + - [Formal concepts of networking](#formal-concepts-of-networking) + - [The Language of the Network](#the-language-of-the-network) # Basics @@ -19,3 +23,38 @@ The **Client-Server** model evolved into the sophisticated "web-services" we kno One central powerful computer (the server) stores data and allows external devices (clients) to access it. For our course "Programmierprojekt" we are required to use the Client-Server model. + +## The Language of the Network +To communicate over the network, we first need to establish a few rules. + +If we look at the real world, language also follows certain rules: + +* Grammar +* Meaning of Words + +In computer science, these rules are known as a "protocol." Everyone must follow these rules, because if not, the program we want to communicate with wouldn’t understand us, or in the worst case, misunderstand us. + +For our network, we’ve decided to build upon the Post Office Protocol (POP) version 3. It follows the request-response model, is synchronous, and meets our requirements. + +An example of a request and response (for our game) might look like this: + +1. Request + ```text + GET_DELTA 42 + ``` + +2. Response + ```text + +OK + PLAYER_FOLDED playerId=3 + POT 240 + NEXT_TURN playerId=1 + WHISPER from=player2 msg="hey" + CHAT_LOBBY player3="hello" + . + ``` + +The client requests the occurred actions since the 42nd state. + +The server responds with all the actions other players have made and the messages the client has received. + -- 2.52.0 From 2dd3ea256260da9836eef030cd8d8ee35699ff9f Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer <lars.winzer@stud.unibas.ch> Date: Tue, 10 Mar 2026 12:40:09 +0100 Subject: [PATCH 7/8] Docs: Delete documents related to '09-03-26_Network' post --- ...shared_ressouce_possible_approaches.drawio | 100 ------------------ .../shared_ressouce_possible_approaches.svg | 3 - 2 files changed, 103 deletions(-) delete mode 100644 documents/images/docs/blog/09-03-26_Network/shared_ressouce_possible_approaches.drawio delete mode 100644 documents/images/docs/blog/09-03-26_Network/shared_ressouce_possible_approaches.svg diff --git a/documents/images/docs/blog/09-03-26_Network/shared_ressouce_possible_approaches.drawio b/documents/images/docs/blog/09-03-26_Network/shared_ressouce_possible_approaches.drawio deleted file mode 100644 index b6788a5..0000000 --- a/documents/images/docs/blog/09-03-26_Network/shared_ressouce_possible_approaches.drawio +++ /dev/null @@ -1,100 +0,0 @@ -<mxfile host="Electron" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/29.6.1 Chrome/142.0.7444.265 Electron/39.8.0 Safari/537.36" version="29.6.1"> - <diagram name="Seite-1" id="YJCt4VXcEaH1ZB-WJMOn"> - <mxGraphModel dx="901" dy="582" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> - <root> - <mxCell id="0" /> - <mxCell id="1" parent="0" /> - <mxCell id="C29U5SLjdgufHwaoauAd-1" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Peer To Peer" vertex="1"> - <mxGeometry height="30" width="140" x="70" y="51.61" as="geometry" /> - </mxCell> - <mxCell id="C29U5SLjdgufHwaoauAd-2" parent="1" style="sketch=0;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#d79b00;fillColor=#ffe6cc;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;align=center;shape=mxgraph.office.devices.laptop;" value="" vertex="1"> - <mxGeometry height="30" width="51.18" x="70" y="160" as="geometry" /> - </mxCell> - <mxCell id="C29U5SLjdgufHwaoauAd-3" parent="1" style="sketch=0;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#d79b00;fillColor=#ffe6cc;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;align=center;shape=mxgraph.office.devices.laptop;" value="" vertex="1"> - <mxGeometry height="30" width="51.18" x="160" y="160" as="geometry" /> - </mxCell> - <mxCell id="C29U5SLjdgufHwaoauAd-4" parent="1" style="sketch=0;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#d79b00;fillColor=#ffe6cc;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;align=center;shape=mxgraph.office.devices.laptop;" value="" vertex="1"> - <mxGeometry height="30" width="51.18" x="160" y="90" as="geometry" /> - </mxCell> - <mxCell id="C29U5SLjdgufHwaoauAd-5" parent="1" style="sketch=0;pointerEvents=1;shadow=0;dashed=0;html=1;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;align=center;shape=mxgraph.office.devices.laptop;fillColor=#ffe6cc;strokeColor=#d79b00;" value="" vertex="1"> - <mxGeometry height="30" width="51.18" x="70" y="90" as="geometry" /> - </mxCell> - <mxCell id="C29U5SLjdgufHwaoauAd-6" edge="1" parent="1" style="endArrow=classic;startArrow=classic;html=1;rounded=0;" value=""> - <mxGeometry height="50" relative="1" width="50" as="geometry"> - <mxPoint x="160" y="160" as="sourcePoint" /> - <mxPoint x="120" y="120" as="targetPoint" /> - </mxGeometry> - </mxCell> - <mxCell id="C29U5SLjdgufHwaoauAd-7" edge="1" parent="1" style="endArrow=classic;startArrow=classic;html=1;rounded=0;" value=""> - <mxGeometry height="50" relative="1" width="50" as="geometry"> - <mxPoint x="120" y="160" as="sourcePoint" /> - <mxPoint x="160" y="120" as="targetPoint" /> - </mxGeometry> - </mxCell> - <mxCell id="C29U5SLjdgufHwaoauAd-8" edge="1" parent="1" style="endArrow=classic;startArrow=classic;html=1;rounded=0;" value=""> - <mxGeometry height="50" relative="1" width="50" as="geometry"> - <mxPoint x="120" y="100" as="sourcePoint" /> - <mxPoint x="160" y="100" as="targetPoint" /> - </mxGeometry> - </mxCell> - <mxCell id="C29U5SLjdgufHwaoauAd-9" edge="1" parent="1" style="endArrow=classic;startArrow=classic;html=1;rounded=0;" value=""> - <mxGeometry height="50" relative="1" width="50" as="geometry"> - <mxPoint x="120" y="180" as="sourcePoint" /> - <mxPoint x="160" y="180" as="targetPoint" /> - </mxGeometry> - </mxCell> - <mxCell id="C29U5SLjdgufHwaoauAd-10" edge="1" parent="1" style="endArrow=classic;startArrow=classic;html=1;rounded=0;startSize=6;" value=""> - <mxGeometry height="50" relative="1" width="50" as="geometry"> - <mxPoint x="90" y="120" as="sourcePoint" /> - <mxPoint x="90" y="160" as="targetPoint" /> - </mxGeometry> - </mxCell> - <mxCell id="C29U5SLjdgufHwaoauAd-12" edge="1" parent="1" style="endArrow=classic;startArrow=classic;html=1;rounded=0;startSize=6;" value=""> - <mxGeometry height="50" relative="1" width="50" as="geometry"> - <mxPoint x="190" y="120" as="sourcePoint" /> - <mxPoint x="190" y="160" as="targetPoint" /> - </mxGeometry> - </mxCell> - <mxCell id="C29U5SLjdgufHwaoauAd-14" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;rounded=0;" value=""> - <mxGeometry height="50" relative="1" width="50" as="geometry"> - <mxPoint x="240" y="200" as="sourcePoint" /> - <mxPoint x="240" y="60" as="targetPoint" /> - </mxGeometry> - </mxCell> - <mxCell id="C29U5SLjdgufHwaoauAd-15" parent="1" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#82b366;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#d5e8d4;shape=mxgraph.mscae.enterprise.server_farm" value="" vertex="1"> - <mxGeometry height="38.39" width="60" x="350" y="81.61" as="geometry" /> - </mxCell> - <mxCell id="C29U5SLjdgufHwaoauAd-16" parent="1" style="sketch=0;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#d79b00;fillColor=#ffe6cc;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;align=center;shape=mxgraph.office.devices.laptop;" value="" vertex="1"> - <mxGeometry height="30" width="51.18" x="270" y="90" as="geometry" /> - </mxCell> - <mxCell id="C29U5SLjdgufHwaoauAd-17" parent="1" style="sketch=0;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#d79b00;fillColor=#ffe6cc;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;align=center;shape=mxgraph.office.devices.laptop;" value="" vertex="1"> - <mxGeometry height="30" width="51.18" x="354.40999999999997" y="160" as="geometry" /> - </mxCell> - <mxCell id="C29U5SLjdgufHwaoauAd-18" parent="1" style="sketch=0;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#d79b00;fillColor=#ffe6cc;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;align=center;shape=mxgraph.office.devices.laptop;" value="" vertex="1"> - <mxGeometry height="30" width="51.18" x="440" y="90" as="geometry" /> - </mxCell> - <mxCell id="C29U5SLjdgufHwaoauAd-19" edge="1" parent="1" style="endArrow=classic;startArrow=classic;html=1;rounded=0;startSize=6;" value=""> - <mxGeometry height="50" relative="1" width="50" as="geometry"> - <mxPoint x="379.87" y="120" as="sourcePoint" /> - <mxPoint x="379.87" y="160" as="targetPoint" /> - </mxGeometry> - </mxCell> - <mxCell id="C29U5SLjdgufHwaoauAd-20" edge="1" parent="1" style="endArrow=classic;startArrow=classic;html=1;rounded=0;startSize=6;" value=""> - <mxGeometry height="50" relative="1" width="50" as="geometry"> - <mxPoint x="350" y="100" as="sourcePoint" /> - <mxPoint x="320" y="100" as="targetPoint" /> - </mxGeometry> - </mxCell> - <mxCell id="C29U5SLjdgufHwaoauAd-22" edge="1" parent="1" style="endArrow=classic;startArrow=classic;html=1;rounded=0;startSize=6;" value=""> - <mxGeometry height="50" relative="1" width="50" as="geometry"> - <mxPoint x="440" y="100.73" as="sourcePoint" /> - <mxPoint x="410" y="100.73" as="targetPoint" /> - </mxGeometry> - </mxCell> - <mxCell id="C29U5SLjdgufHwaoauAd-23" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Client - Server" vertex="1"> - <mxGeometry height="30" width="220" x="270" y="40" as="geometry" /> - </mxCell> - </root> - </mxGraphModel> - </diagram> -</mxfile> diff --git a/documents/images/docs/blog/09-03-26_Network/shared_ressouce_possible_approaches.svg b/documents/images/docs/blog/09-03-26_Network/shared_ressouce_possible_approaches.svg deleted file mode 100644 index 5216099..0000000 --- a/documents/images/docs/blog/09-03-26_Network/shared_ressouce_possible_approaches.svg +++ /dev/null @@ -1,3 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent; color-scheme: light dark;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="424px" height="163px" viewBox="0 0 424 163"><defs/><g><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="C29U5SLjdgufHwaoauAd-1"><g transform="translate(0.5,0.5)"><rect x="0" y="11.61" width="140" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 27px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Peer To Peer</div></div></div></foreignObject><image x="1" y="20.5" width="138" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-2"><g transform="translate(0.5,0.5)"><rect x="0" y="120" width="51.18" height="30" fill="none" stroke="none" pointer-events="all"/><path d="M 29.59 148.11 C 30.08 148.11 30.42 147.92 30.33 147.77 L 29.35 146.35 C 29.23 146.13 29.05 146.09 28.76 146.09 L 22.42 146.09 C 22.11 146.09 21.95 146.14 21.8 146.36 L 20.9 147.77 C 20.72 147.99 21.25 148.11 21.63 148.11 Z M 44.4 143.48 L 44.4 122.61 L 6.75 122.61 L 6.75 143.48 Z M 2.65 150 C 1.65 149.99 0.75 149.66 0.37 149.15 C 0 148.64 0.15 148.14 0.47 147.79 L 4.11 144.13 L 4.11 122.5 C 4.11 121.41 5.1 120 6.74 120 L 44.41 120 C 45.69 120 47.04 121.01 47.04 122.63 L 47.04 144.13 L 50.72 147.83 C 51.03 148.17 51.18 148.63 50.81 149.13 C 50.33 149.76 49.41 149.96 48.55 150 Z" fill="#ffe6cc" stroke="#d79b00" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(255, 230, 204), rgb(54, 33, 10)); stroke: light-dark(rgb(215, 155, 0), rgb(153, 101, 0));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-3"><g transform="translate(0.5,0.5)"><rect x="90" y="120" width="51.18" height="30" fill="none" stroke="none" pointer-events="all"/><path d="M 119.59 148.11 C 120.08 148.11 120.42 147.92 120.33 147.77 L 119.35 146.35 C 119.23 146.13 119.05 146.09 118.76 146.09 L 112.42 146.09 C 112.11 146.09 111.95 146.14 111.8 146.36 L 110.9 147.77 C 110.72 147.99 111.25 148.11 111.63 148.11 Z M 134.4 143.48 L 134.4 122.61 L 96.75 122.61 L 96.75 143.48 Z M 92.65 150 C 91.65 149.99 90.75 149.66 90.37 149.15 C 90 148.64 90.15 148.14 90.47 147.79 L 94.11 144.13 L 94.11 122.5 C 94.11 121.41 95.1 120 96.74 120 L 134.41 120 C 135.69 120 137.04 121.01 137.04 122.63 L 137.04 144.13 L 140.72 147.83 C 141.03 148.17 141.18 148.63 140.81 149.13 C 140.33 149.76 139.41 149.96 138.55 150 Z" fill="#ffe6cc" stroke="#d79b00" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(255, 230, 204), rgb(54, 33, 10)); stroke: light-dark(rgb(215, 155, 0), rgb(153, 101, 0));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-4"><g transform="translate(0.5,0.5)"><rect x="90" y="50" width="51.18" height="30" fill="none" stroke="none" pointer-events="all"/><path d="M 119.59 78.11 C 120.08 78.11 120.42 77.92 120.33 77.77 L 119.35 76.35 C 119.23 76.13 119.05 76.09 118.76 76.09 L 112.42 76.09 C 112.11 76.09 111.95 76.14 111.8 76.36 L 110.9 77.77 C 110.72 77.99 111.25 78.11 111.63 78.11 Z M 134.4 73.48 L 134.4 52.61 L 96.75 52.61 L 96.75 73.48 Z M 92.65 80 C 91.65 79.99 90.75 79.66 90.37 79.15 C 90 78.64 90.15 78.14 90.47 77.79 L 94.11 74.13 L 94.11 52.5 C 94.11 51.41 95.1 50 96.74 50 L 134.41 50 C 135.69 50 137.04 51.01 137.04 52.63 L 137.04 74.13 L 140.72 77.83 C 141.03 78.17 141.18 78.63 140.81 79.13 C 140.33 79.76 139.41 79.96 138.55 80 Z" fill="#ffe6cc" stroke="#d79b00" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(255, 230, 204), rgb(54, 33, 10)); stroke: light-dark(rgb(215, 155, 0), rgb(153, 101, 0));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-5"><g transform="translate(0.5,0.5)"><rect x="0" y="50" width="51.18" height="30" fill="none" stroke="none" pointer-events="all"/><path d="M 29.59 78.11 C 30.08 78.11 30.42 77.92 30.33 77.77 L 29.35 76.35 C 29.23 76.13 29.05 76.09 28.76 76.09 L 22.42 76.09 C 22.11 76.09 21.95 76.14 21.8 76.36 L 20.9 77.77 C 20.72 77.99 21.25 78.11 21.63 78.11 Z M 44.4 73.48 L 44.4 52.61 L 6.75 52.61 L 6.75 73.48 Z M 2.65 80 C 1.65 79.99 0.75 79.66 0.37 79.15 C 0 78.64 0.15 78.14 0.47 77.79 L 4.11 74.13 L 4.11 52.5 C 4.11 51.41 5.1 50 6.74 50 L 44.41 50 C 45.69 50 47.04 51.01 47.04 52.63 L 47.04 74.13 L 50.72 77.83 C 51.03 78.17 51.18 78.63 50.81 79.13 C 50.33 79.76 49.41 79.96 48.55 80 Z" fill="#ffe6cc" stroke="#d79b00" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(255, 230, 204), rgb(54, 33, 10)); stroke: light-dark(rgb(215, 155, 0), rgb(153, 101, 0));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-6"><g transform="translate(0.5,0.5)"><path d="M 85.5 115.5 L 54.5 84.5" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 89.21 119.21 L 81.78 116.73 L 85.5 115.5 L 86.73 111.78 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 50.79 80.79 L 58.22 83.27 L 54.5 84.5 L 53.27 88.22 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-7"><g transform="translate(0.5,0.5)"><path d="M 54.5 115.5 L 85.5 84.5" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 50.79 119.21 L 53.27 111.78 L 54.5 115.5 L 58.22 116.73 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 89.21 80.79 L 86.73 88.22 L 85.5 84.5 L 81.78 83.27 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-8"><g transform="translate(0.5,0.5)"><path d="M 56.37 60 L 83.63 60" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 51.12 60 L 58.12 56.5 L 56.37 60 L 58.12 63.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 88.88 60 L 81.88 63.5 L 83.63 60 L 81.88 56.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-9"><g transform="translate(0.5,0.5)"><path d="M 56.37 140 L 83.63 140" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 51.12 140 L 58.12 136.5 L 56.37 140 L 58.12 143.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 88.88 140 L 81.88 143.5 L 83.63 140 L 81.88 136.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-10"><g transform="translate(0.5,0.5)"><path d="M 20 86.37 L 20 113.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 20 81.12 L 23.5 88.12 L 20 86.37 L 16.5 88.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 20 118.88 L 16.5 111.88 L 20 113.63 L 23.5 111.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-12"><g transform="translate(0.5,0.5)"><path d="M 120 86.37 L 120 113.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 120 81.12 L 123.5 88.12 L 120 86.37 L 116.5 88.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 120 118.88 L 116.5 111.88 L 120 113.63 L 123.5 111.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-14"><g transform="translate(0.5,0.5)"><path d="M 170 160 L 170 20" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-15"><g transform="translate(0.5,0.5)"><rect x="280" y="41.61" width="60" height="38.39" fill="none" stroke="none" pointer-events="all"/><path d="M 280 80 L 280 43.19 C 280.11 42.33 280.82 41.67 281.69 41.62 L 296.75 41.62 C 297.24 41.62 297.71 41.82 298.05 42.17 C 298.39 42.52 298.57 43 298.55 43.49 L 298.55 80 Z M 283.25 76.73 L 295.3 76.73 L 295.3 74.43 L 283.25 74.43 Z M 295.3 72.25 L 295.3 70.07 L 283.25 70.07 L 283.25 72.37 L 295.3 72.37 Z M 295.3 49.3 L 295.3 47.06 L 283.25 47.06 L 283.25 49.3 Z M 300.72 80 L 300.72 43.19 C 300.84 42.28 301.62 41.61 302.53 41.62 L 317.53 41.62 C 318.42 41.64 319.16 42.31 319.28 43.19 L 319.28 80 Z M 303.98 76.73 L 316.02 76.73 L 316.02 74.43 L 303.98 74.43 Z M 316.02 72.37 L 316.02 70.07 L 303.98 70.07 L 303.98 72.37 Z M 303.98 49.3 L 316.02 49.3 L 316.02 47.06 L 303.98 47.06 Z M 321.51 80 L 321.51 43.19 C 321.6 42.41 322.18 41.77 322.95 41.62 L 338.31 41.62 C 339.18 41.67 339.89 42.33 340 43.19 L 340 80 Z M 324.7 76.73 L 336.81 76.73 L 336.81 74.43 L 324.7 74.43 Z M 336.81 72.37 L 336.81 70.07 L 324.7 70.07 L 324.7 72.37 Z M 324.7 49.3 L 336.81 49.3 L 336.81 47.06 L 324.7 47.06 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(213, 232, 212), rgb(31, 47, 30)); stroke: light-dark(rgb(130, 179, 102), rgb(68, 110, 44));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-16"><g transform="translate(0.5,0.5)"><rect x="200" y="50" width="51.18" height="30" fill="none" stroke="none" pointer-events="all"/><path d="M 229.59 78.11 C 230.08 78.11 230.42 77.92 230.33 77.77 L 229.35 76.35 C 229.23 76.13 229.05 76.09 228.76 76.09 L 222.42 76.09 C 222.11 76.09 221.95 76.14 221.8 76.36 L 220.9 77.77 C 220.72 77.99 221.25 78.11 221.63 78.11 Z M 244.4 73.48 L 244.4 52.61 L 206.75 52.61 L 206.75 73.48 Z M 202.65 80 C 201.65 79.99 200.75 79.66 200.37 79.15 C 200 78.64 200.15 78.14 200.47 77.79 L 204.11 74.13 L 204.11 52.5 C 204.11 51.41 205.1 50 206.74 50 L 244.41 50 C 245.69 50 247.04 51.01 247.04 52.63 L 247.04 74.13 L 250.72 77.83 C 251.03 78.17 251.18 78.63 250.81 79.13 C 250.33 79.76 249.41 79.96 248.55 80 Z" fill="#ffe6cc" stroke="#d79b00" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(255, 230, 204), rgb(54, 33, 10)); stroke: light-dark(rgb(215, 155, 0), rgb(153, 101, 0));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-17"><g transform="translate(0.5,0.5)"><rect x="284.41" y="120" width="51.18" height="30" fill="none" stroke="none" pointer-events="all"/><path d="M 314 148.11 C 314.49 148.11 314.83 147.92 314.74 147.77 L 313.76 146.35 C 313.64 146.13 313.46 146.09 313.17 146.09 L 306.83 146.09 C 306.52 146.09 306.36 146.14 306.21 146.36 L 305.31 147.77 C 305.13 147.99 305.66 148.11 306.04 148.11 Z M 328.81 143.48 L 328.81 122.61 L 291.16 122.61 L 291.16 143.48 Z M 287.06 150 C 286.06 149.99 285.16 149.66 284.78 149.15 C 284.41 148.64 284.56 148.14 284.88 147.79 L 288.52 144.13 L 288.52 122.5 C 288.52 121.41 289.51 120 291.15 120 L 328.82 120 C 330.1 120 331.45 121.01 331.45 122.63 L 331.45 144.13 L 335.13 147.83 C 335.44 148.17 335.59 148.63 335.22 149.13 C 334.74 149.76 333.82 149.96 332.96 150 Z" fill="#ffe6cc" stroke="#d79b00" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(255, 230, 204), rgb(54, 33, 10)); stroke: light-dark(rgb(215, 155, 0), rgb(153, 101, 0));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-18"><g transform="translate(0.5,0.5)"><rect x="370" y="50" width="51.18" height="30" fill="none" stroke="none" pointer-events="all"/><path d="M 399.59 78.11 C 400.08 78.11 400.42 77.92 400.33 77.77 L 399.35 76.35 C 399.23 76.13 399.05 76.09 398.76 76.09 L 392.42 76.09 C 392.11 76.09 391.95 76.14 391.8 76.36 L 390.9 77.77 C 390.72 77.99 391.25 78.11 391.63 78.11 Z M 414.4 73.48 L 414.4 52.61 L 376.75 52.61 L 376.75 73.48 Z M 372.65 80 C 371.65 79.99 370.75 79.66 370.37 79.15 C 370 78.64 370.15 78.14 370.47 77.79 L 374.11 74.13 L 374.11 52.5 C 374.11 51.41 375.1 50 376.74 50 L 414.41 50 C 415.69 50 417.04 51.01 417.04 52.63 L 417.04 74.13 L 420.72 77.83 C 421.03 78.17 421.18 78.63 420.81 79.13 C 420.33 79.76 419.41 79.96 418.55 80 Z" fill="#ffe6cc" stroke="#d79b00" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(255, 230, 204), rgb(54, 33, 10)); stroke: light-dark(rgb(215, 155, 0), rgb(153, 101, 0));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-19"><g transform="translate(0.5,0.5)"><path d="M 309.87 86.37 L 309.87 113.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 309.87 81.12 L 313.37 88.12 L 309.87 86.37 L 306.37 88.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 309.87 118.88 L 306.37 111.88 L 309.87 113.63 L 313.37 111.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-20"><g transform="translate(0.5,0.5)"><path d="M 273.63 60 L 256.37 60" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 278.88 60 L 271.88 63.5 L 273.63 60 L 271.88 56.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 251.12 60 L 258.12 56.5 L 256.37 60 L 258.12 63.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-22"><g transform="translate(0.5,0.5)"><path d="M 363.63 60.73 L 346.37 60.73" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 368.88 60.73 L 361.88 64.23 L 363.63 60.73 L 361.88 57.23 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/><path d="M 341.12 60.73 L 348.12 57.23 L 346.37 60.73 L 348.12 64.23 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));"/></g></g><g data-cell-id="C29U5SLjdgufHwaoauAd-23"><g transform="translate(0.5,0.5)"><rect x="200" y="0" width="220" height="30" fill="none" stroke="none" pointer-events="all"/></g><g><g><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 218px; height: 1px; padding-top: 15px; margin-left: 201px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Client - Server</div></div></div></foreignObject><image x="201" y="8.5" width="218" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file -- 2.52.0 From 86303f8b845a699d16c68f1070c62ba0fa7d725c Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer <lars.winzer@stud.unibas.ch> Date: Tue, 10 Mar 2026 12:53:38 +0100 Subject: [PATCH 8/8] Docs: Delete '09-03-26_Networking' post --- documents/docs/blog/09-03-26_Network.md | 60 ------------------------- 1 file changed, 60 deletions(-) delete mode 100644 documents/docs/blog/09-03-26_Network.md diff --git a/documents/docs/blog/09-03-26_Network.md b/documents/docs/blog/09-03-26_Network.md deleted file mode 100644 index e1ee3a4..0000000 --- a/documents/docs/blog/09-03-26_Network.md +++ /dev/null @@ -1,60 +0,0 @@ -# Table of Contents -- [Table of Contents](#table-of-contents) -- [Introduction](#introduction) - - [Formal concepts of networking](#formal-concepts-of-networking) - - [The Language of the Network](#the-language-of-the-network) - - -# Basics -## Formal concepts of networking -Whenever you want to access the same data on different devices without carrying it (the data) from device to device, with, let’s say, a thumb drive, you have multiple options for achieving this. - -![Peer To Peer Versus Client-Server Architecture](/documents/images/docs/blog/09-03-26_Network/shared_ressouce_possible_approaches.svg) - -<!-- I tried to get this embeddet image to show up, but it just wouldnt -<img src="/documents/images/docs/blog/09-03-26_Network/shared_ressouce_possible_approaches.svg" alt="Peer To Peer Versus Client-Server Architecture" width="200"/> ---> - -**Peer to Peer** enables users to share content (files, messages, ...). -While it does not rely on a central server, it comes with the big trade-of that the device storing the data you want to access has to be reachable and online. -Today Peer to Peer is still widely used with VoIP and decentralized networks for censorship-resistant transactions formaly known as the blockchain. - -The **Client-Server** model evolved into the sophisticated "web-services" we know and use daily. -One central powerful computer (the server) stores data and allows external devices (clients) to access it. - -For our course "Programmierprojekt" we are required to use the Client-Server model. - -## The Language of the Network -To communicate over the network, we first need to establish a few rules. - -If we look at the real world, language also follows certain rules: - -* Grammar -* Meaning of Words - -In computer science, these rules are known as a "protocol." Everyone must follow these rules, because if not, the program we want to communicate with wouldn’t understand us, or in the worst case, misunderstand us. - -For our network, we’ve decided to build upon the Post Office Protocol (POP) version 3. It follows the request-response model, is synchronous, and meets our requirements. - -An example of a request and response (for our game) might look like this: - -1. Request - ```text - GET_DELTA 42 - ``` - -2. Response - ```text - +OK - PLAYER_FOLDED playerId=3 - POT 240 - NEXT_TURN playerId=1 - WHISPER from=player2 msg="hey" - CHAT_LOBBY player3="hello" - . - ``` - -The client requests the occurred actions since the 42nd state. - -The server responds with all the actions other players have made and the messages the client has received. - -- 2.52.0