Compare commits
8 commits
activitypu
...
master
Author | SHA1 | Date | |
---|---|---|---|
Trolli Schmittlauch | 44e7d8c3cd | ||
Trolli Schmittlauch | 97b0694410 | ||
Trolli Schmittlauch | a226a3830c | ||
Trolli Schmittlauch | 04bd8c295c | ||
Trolli Schmittlauch | 058008fd1a | ||
Trolli Schmittlauch | 6127122da2 | ||
Trolli Schmittlauch | 2bb38d7603 | ||
Trolli Schmittlauch | 27806b4619 |
|
@ -1,7 +1,8 @@
|
|||
# Paper: Decentralised Hashtag Search and Subscription for Federated Social Networks
|
||||
|
||||
This paper has been written during my Computer Science studies at [TU Dresden](https://inf.tu-dresden.de/) as a *Großer Beleg*.
|
||||
A pre-compiled PDF of the paper can be found in [paper_hashtag_federation.pdf](paper_hashtag_federation.pdf).
|
||||
A pre-compiled PDF of the paper can be found in [paper_hashtag_federation.pdf](paper_hashtag_federation.pdf).
|
||||
The slides of my talk at [ActivityPub Conf](https://redaktor.me/apconf/) can be found in [talk-slides.pdf](talk-slides.pdf).
|
||||
|
||||
## Building
|
||||
|
||||
|
|
BIN
figures/fediverse_logo.pdf
(Stored with Git LFS)
Normal file
BIN
figures/fediverse_logo.pdf
(Stored with Git LFS)
Normal file
Binary file not shown.
170
figures/fediverse_logo.svg
Normal file
170
figures/fediverse_logo.svg
Normal file
|
@ -0,0 +1,170 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="196.52mm"
|
||||
height="196.52mm"
|
||||
viewBox="0 0 196.52 196.52"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="0.92.2 2405546, 2018-03-11"
|
||||
sodipodi:docname="Logo_penta_connectat-imbrincat_retallats-color.svg"
|
||||
inkscape:export-filename="/home/nestor/Pictures/Fediversal/Logo_penta_connectat-imbrincat_retallats-color-512x.png"
|
||||
inkscape:export-xdpi="66.175453"
|
||||
inkscape:export-ydpi="66.175453">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.50411932"
|
||||
inkscape:cx="-209.83484"
|
||||
inkscape:cy="399.15332"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer2"
|
||||
showgrid="false"
|
||||
inkscape:snap-smooth-nodes="true"
|
||||
inkscape:snap-midpoints="true"
|
||||
inkscape:snap-global="false"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:window-height="736"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="32"
|
||||
inkscape:window-maximized="1"
|
||||
fit-margin-top="5"
|
||||
fit-margin-left="5"
|
||||
fit-margin-right="5"
|
||||
fit-margin-bottom="5" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer2"
|
||||
inkscape:label="Linies"
|
||||
style="display:inline"
|
||||
transform="translate(6.6789703,-32.495842)">
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#a730b8;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:41.5748024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 181.13086,275.13672 a 68.892408,68.892408 0 0 1 -29.46484,29.32812 l 161.75781,162.38868 38.99805,-19.76368 z m 213.36328,214.1875 -38.99805,19.76367 81.96289,82.2832 a 68.892409,68.892409 0 0 1 29.47071,-29.33203 z"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,-6.6789703,32.495842)"
|
||||
id="path9722"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#5496be;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:41.5748024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 581.64648,339.39062 -91.57617,46.41016 6.75196,43.18945 103.61523,-52.51367 A 68.892409,68.892409 0 0 1 581.64648,339.39062 Z M 436.9082,412.74219 220.38281,522.47656 a 68.892408,68.892408 0 0 1 18.79492,37.08985 L 443.66016,455.93359 Z"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,-6.6789703,32.495842)"
|
||||
id="path9729"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ce3d1a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:41.5748024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="M 367.27539,142.4375 262.79492,346.4082 293.64258,377.375 404.26562,161.41797 A 68.892408,68.892408 0 0 1 367.27539,142.4375 Z m -131.6543,257.02148 -52.92187,103.31446 a 68.892409,68.892409 0 0 1 36.98633,18.97851 l 46.78125,-91.32812 z"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,-6.6789703,32.495842)"
|
||||
id="path9713"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#d0188f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:41.5748024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 150.76758,304.91797 a 68.892408,68.892408 0 0 1 -34.41602,7.19531 68.892408,68.892408 0 0 1 -6.65039,-0.69531 l 30.90235,197.66211 a 68.892409,68.892409 0 0 1 34.41601,-7.19531 68.892409,68.892409 0 0 1 6.64649,0.69531 z"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,-6.6789703,32.495842)"
|
||||
id="path1015"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#5b36e9;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:41.5748024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 239.3418,560.54492 a 68.892408,68.892408 0 0 1 0.7207,13.87696 68.892408,68.892408 0 0 1 -7.26758,27.17968 l 197.62891,31.71289 a 68.892409,68.892409 0 0 1 -0.72266,-13.8789 68.892409,68.892409 0 0 1 7.26953,-27.17774 z"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,-6.6789703,32.495842)"
|
||||
id="path1674"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#30b873;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:41.5748024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 601.13281,377.19922 -91.21875,178.08203 a 68.892408,68.892408 0 0 1 36.99414,18.98242 L 638.125,396.18359 a 68.892409,68.892409 0 0 1 -36.99219,-18.98437 z"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,-6.6789703,32.495842)"
|
||||
id="path1676"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ebe305;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:41.5748024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 476.72266,125.33008 a 68.892408,68.892408 0 0 1 -29.47071,29.33203 l 141.26563,141.81055 a 68.892409,68.892409 0 0 1 29.46875,-29.33204 z"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,-6.6789703,32.495842)"
|
||||
id="path1678"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#f47601;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:41.5748024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 347.78711,104.63086 -178.57617,90.49805 a 68.892409,68.892409 0 0 1 18.79297,37.08593 l 178.57421,-90.50195 a 68.892408,68.892408 0 0 1 -18.79101,-37.08203 z"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,-6.6789703,32.495842)"
|
||||
id="path1680"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#57c115;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:41.5748024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 446.92578,154.82617 a 68.892408,68.892408 0 0 1 -34.98242,7.48242 68.892408,68.892408 0 0 1 -6.0293,-0.63281 l 15.81836,101.29102 43.16211,6.92578 z m -16,167.02735 37.40039,239.48242 a 68.892409,68.892409 0 0 1 33.91406,-6.94336 68.892409,68.892409 0 0 1 7.20704,0.79101 L 474.08984,328.77734 Z"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,-6.6789703,32.495842)"
|
||||
id="path9758"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#dbb210;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:41.5748024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 188.13086,232.97461 a 68.892408,68.892408 0 0 1 0.75781,14.0957 68.892408,68.892408 0 0 1 -7.16015,26.98242 l 101.36914,16.28125 19.92382,-38.9082 z m 173.73633,27.90039 -19.92578,38.91211 239.51367,38.4668 a 68.892409,68.892409 0 0 1 -0.69531,-13.71875 68.892409,68.892409 0 0 1 7.34961,-27.32422 z"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,-6.6789703,32.495842)"
|
||||
id="path9760"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer3"
|
||||
inkscape:label="Nodes"
|
||||
style="display:inline;opacity:1"
|
||||
transform="translate(6.6789703,-32.495842)">
|
||||
<circle
|
||||
style="fill:#ffca00;fill-opacity:0.99596773;stroke:none;stroke-width:0.26458332;stroke-opacity:0.96078431"
|
||||
id="path817"
|
||||
cx="106.26596"
|
||||
cy="51.535553"
|
||||
r="16.570711"
|
||||
transform="rotate(3.1178174)" />
|
||||
<circle
|
||||
id="path819"
|
||||
style="fill:#64ff00;fill-opacity:0.99596773;stroke:none;stroke-width:0.26458332;stroke-opacity:0.96078431"
|
||||
cx="171.42836"
|
||||
cy="110.19328"
|
||||
r="16.570711"
|
||||
transform="rotate(3.1178174)" />
|
||||
<circle
|
||||
id="path823"
|
||||
style="fill:#00a3ff;fill-opacity:0.99596773;stroke:none;stroke-width:0.26458332;stroke-opacity:0.96078431"
|
||||
cx="135.76379"
|
||||
cy="190.27704"
|
||||
r="16.570711"
|
||||
transform="rotate(3.1178174)" />
|
||||
<circle
|
||||
style="fill:#9500ff;fill-opacity:0.99596773;stroke:none;stroke-width:0.26458332;stroke-opacity:0.96078431"
|
||||
id="path825"
|
||||
cx="48.559471"
|
||||
cy="181.1138"
|
||||
r="16.570711"
|
||||
transform="rotate(3.1178174)" />
|
||||
<circle
|
||||
id="path827"
|
||||
style="fill:#ff0000;fill-opacity:0.99596773;stroke:none;stroke-width:0.26458332;stroke-opacity:0.96078431"
|
||||
cx="30.328812"
|
||||
cy="95.366837"
|
||||
r="16.570711"
|
||||
transform="rotate(3.1178174)" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 19 KiB |
BIN
paper_hashtag_federation.pdf
(Stored with Git LFS)
BIN
paper_hashtag_federation.pdf
(Stored with Git LFS)
Binary file not shown.
|
@ -219,7 +219,7 @@ While the view onto the post history of a hashtag shall be consistent no matter
|
|||
\item \textbf{size of posts}:\label{ass:post_size}
|
||||
As posts are text-only objects of the content, often having a size limit of 500--1000 characters, and some additional metadata, we assume the size of each post to be \(\leq 10\) KiB.
|
||||
\item \textbf{size of post URIs}:\label{ass:url_size}
|
||||
Each post is identifiable by dereferenceable \ac{URI} and can be retrieved from there. Given the \acp{URI} in existing network server implementations, we assume them to have a size \(\leq 1\) KiB.
|
||||
Each post is identified by dereferenceable \ac{URI} and can be retrieved from there. Given the \acp{URI} in existing network server implementations, we assume them to have a size \(\leq 1\) KiB.
|
||||
\end{itemize}
|
||||
|
||||
\subsection{Security}
|
||||
|
@ -678,7 +678,7 @@ For each node, the mismatch between the actual workload of the node \(n\) and it
|
|||
|
||||
\caption[]{Average and median (absolute) mismatches between node work load and capacity for simulated DHT, with and without load balancing. \\
|
||||
total size of all posts: 34332.27 GiB \\
|
||||
total number of nodes: 1306
|
||||
total number of nodes: 1036
|
||||
}\label{tab:lb_stats}
|
||||
\end{table}
|
||||
|
||||
|
@ -697,10 +697,10 @@ The large difference in overloaded nodes clearly shows that the k-choices load b
|
|||
Adding hashtag federation to federated social network using this proposed system in most cases does not raise any serious privacy concerns: Only public posts are handled by the system, and as only the URI from where a post can be fetched is relayed to subscribers the originating instance can choose to stop providing that post at any time.
|
||||
Instances subscribe to tags on behalf of their users, they hide the interests of particular users unless the set of active users on the particular instance is too small.
|
||||
|
||||
While \ac{DHT} networks provide an efficient way of structuring a \ac{P2P} lookup network with only knowing a small subset of its nodes and no central authority, exactly these missing global view and lack of central trust anchor pose several security challenges.
|
||||
While \ac{DHT} networks provide an efficient way of structuring a \ac{P2P} lookup network with only knowing a small subset of its nodes and no central authority, exactly this missing global view and lack of central trust anchor poses several security challenges.
|
||||
|
||||
Urdaneta et al. \cite{urdanetaSurveyDHTSecurity2011} provide a broad survey of common security threats in \ac{DHT} security and attempts of solving them. \\
|
||||
\textbf{Routing attacks} try to alter or disrupt the routing process within a \ac{DHT} to prevent the resolution of keys, let them point to invalid nodes or even to relay the combined lookup requests on a popular ID to a third party server as a Distributed \ac{DoS}. Storage attacks attempt to alter or forge the stored payload data returned under a key by impersonating the responsible node or taking over the relevant key space.
|
||||
\textbf{Routing attacks} try to alter or disrupt the routing process within a \ac{DHT} to prevent the resolution of keys, let them point to invalid nodes or even to relay the combined lookup requests on a popular ID to a third party server as a Distributed \ac{DoS}. \textbf{Storage attacks} attempt to alter or forge the stored payload data returned under a key by impersonating the responsible node or taking over the relevant key space.
|
||||
In this system, controlling the data returned from a key allows taking over responsibility for the storage or relaying of certain hashtags. Such attackers can then deliberately drop or insert posts for a hashtag. \\
|
||||
An important mean or precondition for many of these targeted manipulations are \textbf{Sybil attacks}: By enabling a single attacker to join the \ac{DHT} with a large number of identities, posing as independent nodes, it can subvert mechanisms based on the assumption of one entity only controlling a low fraction of nodes, like majority voting systems. Additionally, introducing a large number of node identities increases the number of keys handled by the attacker and the likelihood of controlling a certain key or being included into a finger table, especially if node IDs are equally distributed. \\
|
||||
A similar attack scenario are the \textbf{node ID attacks} (also called \textit{node squatting}), where attackers try to control a certain keyspace or disrupt the routing by deliberately positioning a node close to or even directly at a certain ID. \\
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
#####################
|
||||
|
||||
HISTFILE="./twitter_hashtag_history.csv"
|
||||
DISTFILE="./twitter_hashtag_numbers.txt"
|
||||
|
||||
# extract hashtags and time stamp in parallel
|
||||
|
||||
|
@ -15,7 +14,3 @@ echo "$@" | parallel -d ' ' -j+0 --eta "echo \"parsing {}\"; zcat {} |jq -r 'if
|
|||
# merge all temporary history files to one
|
||||
cat tmp_twitter_history_* > ${HISTFILE}
|
||||
# rm "tmp_twitter_history_*"
|
||||
|
||||
# count hashtag occurence
|
||||
awk -F, '{print tolower($2)}' "${HISTFILE}" | sort | uniq -c > ${DISTFILE}
|
||||
# let's hope that sort can manage such huge files in memory
|
||||
|
|
BIN
talk-slides.pdf
(Stored with Git LFS)
Normal file
BIN
talk-slides.pdf
(Stored with Git LFS)
Normal file
Binary file not shown.
127
talk-slides.tex
127
talk-slides.tex
|
@ -42,6 +42,7 @@
|
|||
% or whatever
|
||||
|
||||
\usepackage[backend=biber, sorting=none]{biblatex}
|
||||
\addbibresource{literature.bib}
|
||||
|
||||
\usepackage{ccicons}
|
||||
\usepackage{wrapfig}
|
||||
|
@ -124,10 +125,10 @@ for Federated Social Networks}
|
|||
\maketitle
|
||||
|
||||
\note{introduce myself:\\
|
||||
known as schmittlauch on the Internet\\
|
||||
usually go by schmittlauch on the Internet\\
|
||||
student of Computer Science @ TU Dresden\\
|
||||
interest in federated systems and unusual social networks\\
|
||||
presenting my work on a study paper from this year}
|
||||
presenting my work on a student research paper from this year}
|
||||
|
||||
|
||||
\begin{frame}{Outline}
|
||||
|
@ -174,7 +175,7 @@ presenting my work on a study paper from this year}
|
|||
\begin{frame}{Importance of \#Hashtags}{}
|
||||
|
||||
Hashtags are used for marking posts about certain topics or events:
|
||||
\note{mark topics of posts, make them discoverable by content. No full text search in fediverse}
|
||||
\note{mark topics of posts, make them discoverable by content. No decentralised full text search in Fediverse (centralised search engines)}
|
||||
\begin{columns}
|
||||
\begin{column}{0.47\textwidth}
|
||||
|
||||
|
@ -200,7 +201,8 @@ Hashtags are used for marking posts about certain topics or events:
|
|||
\includegraphics[height=0.6\paperheight]{figures/Elephant_Friend_(Greeting).png}
|
||||
}
|
||||
\only<4>{
|
||||
\includegraphics[width=\textwidth]{figures/hashtag_gezipark.jpg}
|
||||
\includegraphics[width=\textwidth]{figures/hashtag_gezipark.jpg}\\
|
||||
\tiny{\ccby \href{https://creativecommons.org/licenses/by/4.0/}{CC BY 4.0 International} by \href{https://metronaut.de}{Metronaut}}
|
||||
}
|
||||
\only<5>{
|
||||
\includegraphics[height=0.6\paperheight]{figures/hashtag_metoo.jpg}\\
|
||||
|
@ -215,7 +217,7 @@ Hashtags are used for marking posts about certain topics or events:
|
|||
\subsection{State of Hashtags in the Fediverse}
|
||||
|
||||
\begin{frame}{State of Hashtags on the Fediverse}{}
|
||||
{\center \Large Hashtags are used in the fediverse}
|
||||
{\center \Large Hashtags are used in the Fediverse}
|
||||
\pause
|
||||
\vspace{2em}
|
||||
|
||||
|
@ -243,9 +245,9 @@ Hashtags are used for marking posts about certain topics or events:
|
|||
|
||||
\begin{frame}{State of Hashtags on the Fediverse}{Fragmentation}
|
||||
\begin{itemize}
|
||||
\item fragmented view on hashtag posts depending on user's instance
|
||||
\item hashtag search only on locally known posts
|
||||
\item Result: incentive to cluster on large nodes \(\Leftarrow\) centralisation
|
||||
\item fragmented view on hashtag posts depending on user's instance\note[item]{view depends on users instance}
|
||||
\item hashtag search only on locally known posts\note[item]{local posts}
|
||||
\item Result: incentive to cluster on large nodes \(\Leftarrow\) centralisation\note[item]{cluster incentive}
|
||||
\end{itemize}
|
||||
|
||||
\end{frame}
|
||||
|
@ -255,13 +257,14 @@ Hashtags are used for marking posts about certain topics or events:
|
|||
\begin{column}{0.55\textwidth}
|
||||
\includegraphics[height=0.6\paperheight]{figures/push_federation.pdf}
|
||||
\end{column}
|
||||
\note{example scenario with 4 instances}
|
||||
|
||||
\begin{column}{0.45\textwidth}
|
||||
\begin{itemize}
|
||||
|
||||
\only<1>{\item subscription to \texttt{@alice@cyber.space} by contacting instance \texttt{cyber.space}}
|
||||
\only<2>{\item all future posts by alice are delivered to instances of subscribers, but \textit{not} instances without any subscriber}
|
||||
\only<3>{\item other ways for posts to reach an instance:\\ boosts, thread resolution}
|
||||
\only<2>{\item all future posts by Alice are delivered to instances of subscribers, but \textit{not} instances without any subscriber\note[item]{cyber.space may not even be aware of existence of other instances}}
|
||||
\only<3>{\item other ways for posts to reach an instance:\\ boosts, thread resolution\note[item]{posts can disseminate through other means}}
|
||||
\end{itemize}
|
||||
\end{column}
|
||||
\end{columns}
|
||||
|
@ -274,13 +277,17 @@ Hashtags are used for marking posts about certain topics or events:
|
|||
\item centralised actor relaying all incoming posts
|
||||
\item single point of failure, which relay to choose?
|
||||
\item relaying all incoming posts \(\Rightarrow\) huge load on small instances
|
||||
\item only access to posts sent after initial subscribtion
|
||||
\item only access to posts sent after initial subscription
|
||||
\end{itemize}
|
||||
\item Diaspora* SocialRelay
|
||||
\begin{itemize}
|
||||
\item similar, but allows subscribing to certain tags only
|
||||
\end{itemize}
|
||||
|
||||
\note{relays\\
|
||||
centralised actors, single point\\
|
||||
which one to choose?\\
|
||||
all posts -> overload\\
|
||||
after subscription}
|
||||
|
||||
\end{itemize}
|
||||
|
||||
|
@ -297,16 +304,19 @@ Hashtags are used for marking posts about certain topics or events:
|
|||
\item \textbf{store \& query}: instances can retrieve 1 year of history for a hashtag without subscription
|
||||
\item fully decentralised, no single point of authority for all tags
|
||||
\end{itemize}
|
||||
\note{2 goals: relay \& subscribe; store \& query; fully decentralised}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}{System Architecture}{adding a DHT backend to the fediverse}
|
||||
\begin{frame}{System Architecture}{adding a DHT backend to the Fediverse}
|
||||
|
||||
core idea: distribute responsibility for tags among instances using a \textbf{D}istributed \textbf{H}ash \textbf{T}able, \note{distribute responsibility for posts of a hashtag = relaying \& storage}
|
||||
\note[item]{subscription to all posts of a user possible because there is a single responsible instance}
|
||||
core idea: distribute responsibility for tags among instances using a \textbf{D}istributed \textbf{H}ash \textbf{T}able, \note[item]{distribute responsibility for posts of a hashtag = relaying \& storage}
|
||||
|
||||
based on Chord
|
||||
based on Chord \cite{stoicaChordScalablePeertopeer2003}
|
||||
%ToDo for Kolloquium: reason for Chord
|
||||
|
||||
\note[item]{DHT: structured P2P networks providing efficient (log N) key-value storage and lookup}
|
||||
\note[item]{self-organising, no central authority}
|
||||
\note[item]{DHT: structured P2P networks, self-organising, no central authority}
|
||||
\note[item]{provides efficient (log N) key-value storage and lookup}
|
||||
|
||||
\end{frame}
|
||||
|
||||
|
@ -314,9 +324,10 @@ based on Chord
|
|||
\begin{columns}
|
||||
\begin{column}{0.4\textwidth}
|
||||
\begin{itemize}
|
||||
\item calculate hash value of keys and node IDs
|
||||
\item place these hashes onto the same circular name space
|
||||
\item each node keeps routing table of \(\log \#number\_nodes\) entries\note[item]{joining and leaving covered in paper}
|
||||
\note[item]{common namespace for nodes and lookup keys}
|
||||
\item calculate hash value of hashtags and node IDs
|
||||
\item place these hashes onto the same circular name space
|
||||
\item each node keeps routing table of \(\log \#number\_nodes\) entries\note[item]{routing table entries to distances of powers of 2}
|
||||
\end{itemize}
|
||||
\end{column}
|
||||
|
||||
|
@ -330,8 +341,11 @@ based on Chord
|
|||
\begin{columns}
|
||||
\begin{column}{0.55\textwidth}
|
||||
\begin{itemize}
|
||||
\item next nodeID \(\geq\) \texttt{hash(hashtag)} (mod keyspace size) is responsible for handling posts containing \texttt{hashtag}
|
||||
\item responsible node for a key \(k\) is node \(successor(k) = \min_i(k+i) \mod\) keyspace\_size
|
||||
\item DHT used for iterative lookup of responsible relay/ storage node
|
||||
\note[item]{iterative lookup of responsible successor node of key}
|
||||
\item my architecture: keyspace = \(2^{256}\) with 256bit-long IDs
|
||||
\note[item]{i use keyspace of \(2^{256}\)}
|
||||
\end{itemize}
|
||||
\end{column}
|
||||
|
||||
|
@ -343,7 +357,7 @@ based on Chord
|
|||
|
||||
\begin{frame}{Publishing, Relaying and Storage}{lifecycle of posts}
|
||||
\begin{enumerate}
|
||||
\item publishing instance looks up responsible relay instance on DHT for each included hashtag
|
||||
\item publishing instance looks up responsible relay instance on DHT for each included hashtag\note[item]{calculate hashum of hashtag -> lookup key for DHT}
|
||||
\item publishing instance sends post to responsible relay instance
|
||||
\item relay instance looks up responsible storage node on DHT
|
||||
\item relay instance verifies incoming post's signature, then relays post URI (ID) to all subscribers + storage node\note[item]{only post ID relayed, but not full post content. Reasons: LDSignatures not supported everywhere, deniability \& revocation}
|
||||
|
@ -353,17 +367,10 @@ based on Chord
|
|||
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}{Publishing, Relaying and Storage}
|
||||
\begin{itemize}
|
||||
\item separate DHTs for relay and storage instances
|
||||
\item all actions after DHT lookup supposed to be done using ActivityPub via HTTPS
|
||||
\item subscription to hashtags/ querying posts is done at the responsible instance
|
||||
\end{itemize}
|
||||
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\note{so far so easy. But load distribution issues}
|
||||
\note{so far so easy.\\
|
||||
what hashtags does a certain instance handle? determined by node ID\\
|
||||
can it bear the load?}
|
||||
\begin{itemize}
|
||||
\item node ID determines set of hashtags handled by instance
|
||||
\item problem: for security reasons, node \textbf{must not} choose their IDs freely
|
||||
|
@ -377,7 +384,7 @@ based on Chord
|
|||
\includegraphics[width=0.49\textwidth]{statistics/geraspora_hashtags_total.png}
|
||||
|
||||
\note{analysis of a 1 month dump of Twitter, Geraspora (Diaspora) and Friendica posts\\
|
||||
Twitter: 70\% of posts used just once\\
|
||||
Twitter: 70\% of hashtags used just once\\
|
||||
note the logarithmic axis!}
|
||||
|
||||
distribution of posts per hashtag follows a steep power law
|
||||
|
@ -387,11 +394,13 @@ distribution of posts per hashtag follows a steep power law
|
|||
|
||||
\begin{frame}{Load Balancing}{of hashtags between nodes}
|
||||
\begin{itemize}
|
||||
\item \textit{k-choices} algorithm by Ledlie and Seltzer
|
||||
\item each node can choose from \(\kappa\) possible IDs
|
||||
%ToDo for Kolloquium: reasonf or choosing that algorithm
|
||||
\item \textit{k-choices} algorithm by Ledlie and Seltzer \cite{ledlieHarvardTechnicalReport2004}
|
||||
\item a node can represent several \textit{virtual nodes} on the DHT
|
||||
\item \(\kappa\) possible virtual node IDs: \(ID =\) hash(\(ID' ++ i\))\(, i \in \{0, 1, \dots, \kappa-1\}\)
|
||||
\item nodes have a \textbf{capacity} and choose set of active IDs according to lowest mismatch of own and neighbour node capacity
|
||||
\item querying load of potential IDs before joining, periodic re-balancing
|
||||
\item independent load balancing of relay and storage nodes due to independent DHTs
|
||||
\item independent load balancing of relay and storage nodes due to independent DHTs\note[item]{enable different roles ``relay'', ``storage'' to balance independently: 2 DHTs}
|
||||
\note[item]{a simple simulation on the effectivity of the balancing algorithm can be found in the paper}
|
||||
\end{itemize}
|
||||
% for Kolloquium, add simulation result
|
||||
|
@ -401,7 +410,7 @@ distribution of posts per hashtag follows a steep power law
|
|||
\begin{columns}
|
||||
\begin{column}{0.55\textwidth}
|
||||
\begin{itemize}
|
||||
\item store redundant copies of hashtag data at equal distances on Chord ring\note{resilience against node failure, allows data validation through cross-checking}
|
||||
\item redundant assignment of responsibility for hashtag at equal distances on Chord ring, inspired by Harvesf and Blough \cite{harvesfEffectReplicaPlacement2006}\note{resilience against node failure, allows data validation through cross-checking}
|
||||
\item default redundancy: \(2^2 = 4\), scalable in powers of 2
|
||||
\item \textbf{relay nodes}: hot standby nodes take over in overload situations (load spikes)
|
||||
\item \textbf{storage nodes}: overloaded nodes can split stored posts by content hash and double redundancy set
|
||||
|
@ -420,6 +429,8 @@ distribution of posts per hashtag follows a steep power law
|
|||
\begin{frame}{Discussion}{I need YOUR feedback}
|
||||
|
||||
I want feedback from all of you, no matter whether it's from a \textit{\LARGE technical} or from a \textit{\LARGE social perspective}.
|
||||
\note{architecture just a concept so far\\
|
||||
before implementations: several open questions}
|
||||
|
||||
\end{frame}
|
||||
|
||||
|
@ -429,10 +440,12 @@ I want feedback from all of you, no matter whether it's from a \textit{\LARGE te
|
|||
Do we even want global hashtags in the Fediverse?
|
||||
|
||||
\begin{itemize}
|
||||
\item positive potential (conversation, coordination) vs. negative potential (spam, harrasment)
|
||||
\item positive potential (conversation, coordination) vs. negative potential (spam, harrassment)
|
||||
\note[item]{positive vs negative potential}
|
||||
\item visibility level: public posts only, unlisted, new level necessary?
|
||||
\item relaying post URI only should provide plausible deniability
|
||||
\item Does this circumvent instance-blocks and is this bad?
|
||||
\note[item]{visibility levels}
|
||||
\item relaying post URI only should provide plausible deniability and retractability
|
||||
\note[item]{retractability should be given}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
|
@ -443,8 +456,11 @@ Do we even want global hashtags in the Fediverse?
|
|||
|
||||
\begin{itemize}
|
||||
\item intended as opt-in, domain-based push federation still better for user subscriptions
|
||||
\item assumption: instances offer \(5.5\times\) the storage \& \(2.5\times\) the bandwith of own posts
|
||||
\note[item]{optional mechanism, let's keep C2S communication for mobile friendliness and PushFed for simplicity}
|
||||
\item assumption: instances offer \(5.5\times\) the storage \& \(2.5\times\) the bandwidth of own posts
|
||||
\note[item]{assumptions: 5.5x storage, 2.5x bandwidth}
|
||||
\item performance: Can this be implemented efficiently enough to not DDoS popular hashtag nodes?
|
||||
\note[item]{performance: fetch DDoS of popular tags}
|
||||
\begin{itemize}
|
||||
\item batched retrieval of posts from same source
|
||||
\item exponential backoff retries
|
||||
|
@ -459,7 +475,7 @@ Do we even want global hashtags in the Fediverse?
|
|||
\begin{itemize}
|
||||
\item hashtags may be represented as relay actors with own in- \& outbox, addressed in cc
|
||||
\item relaying to subscribers via SharedInbox
|
||||
\item idea for addressing: new URI scheme that gets transparently resolved to responsible node's domain via DHT\note[item]{application proxy for transparent URI scheme resolving?}
|
||||
\item idea for addressing: new URI scheme that gets transparently resolved to responsible node's domain via DHT by application proxy\note[item]{application proxy for transparent URI scheme resolving?}
|
||||
\item signalling of error codes and redundancy factors is needed
|
||||
\end{itemize}
|
||||
\item DHT routing communication does not use ActivityPub
|
||||
|
@ -473,7 +489,9 @@ Do we even want global hashtags in the Fediverse?
|
|||
\includegraphics<1>[height=0.59\paperheight]{figures/Elephant_Friend_(Greeting).png}
|
||||
\includegraphics<2,4>[height=0.59\paperheight]{figures/hist_num_single_vs.png}
|
||||
|
||||
\note[item]{common DHT attack: Sybil-… = 1 attacker introduces large number of nodes}
|
||||
\note[item]{sorry to all instance admins, but: CloudFlare behaves like a MITM/ Sybil attacker}
|
||||
\note[item]{node ID derivation: first 64 bits of IPv6}
|
||||
|
||||
\only<2,4>{1st peak: Masto.host, 2nd peak: Cloudflare}
|
||||
|
||||
|
@ -500,6 +518,7 @@ node ID derivation}
|
|||
\begin{itemize}
|
||||
\item valid domain required for node ID derivation, assumption: domains cost money
|
||||
\end{itemize}
|
||||
\note{not perfectly secure, but the best I could think of. Better ideas welcome}
|
||||
\end{itemize}
|
||||
|
||||
\end{frame}
|
||||
|
@ -533,14 +552,6 @@ node ID derivation}
|
|||
\section<presentation>*{\appendixname}
|
||||
\subsection<presentation>*{For Further Reading}
|
||||
|
||||
\begin{frame}[allowframebreaks]
|
||||
\frametitle{References}
|
||||
|
||||
|
||||
|
||||
%\bibliography{literature}
|
||||
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
|
||||
|
@ -548,16 +559,20 @@ node ID derivation}
|
|||
|
||||
\includegraphics[height=0.4\paperheight]{figures/qr_paper.png}\\
|
||||
\large\url{https://git.orlives.de/schmittlauch/paper_hashtag_federation/src/branch/master/paper_hashtag_federation.pdf}
|
||||
\vspace{2em}
|
||||
|
||||
\Large\includegraphics[height=1em]{figures/fediverse_logo.pdf} @schmittlauch@toot.matereal.eu
|
||||
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[allowframebreaks]
|
||||
\frametitle{References}
|
||||
|
||||
\printbibliography
|
||||
|
||||
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
|
||||
|
||||
%\includegraphics[height=0.5\textheight]{figures/nomnompingu.png}\tiny\footnote{CC-BY-SA 3.0 by Elektroll}
|
||||
|
||||
\end{frame}
|
||||
|
||||
|
||||
\end{document}
|
||||
|
|
Loading…
Reference in a new issue