2019-08-11 20:14:06 +02:00
% $Header$
% use lualatex for compilation
2019-08-28 16:27:46 +02:00
\documentclass [aspectratio=169,navbar=false] { beamer}
2019-08-11 20:14:06 +02:00
% This file is a solution template for:
% - Talk at a conference/colloquium.
% - Talk length is about 20min.
% - Style is ornate.
% Copyright 2004 by Till Tantau <tantau@users.sourceforge.net>.
%
% In principle, this file can be redistributed and/or modified under
% the terms of the GNU Public License, version 2.
%
% However, this file is supposed to be a template to be modified
% for your own needs. For this reason, if you use this file as a
% template and not specifically distribute it as part of a another
% package/program, I grant the extra permission to freely copy and
% modify this file as you see fit and even to delete this copyright
% notice.
\mode <presentation>
{
2019-08-28 16:27:46 +02:00
\usetheme [cd2018,noddc,darktitlepage] { tud}
2019-08-11 20:14:06 +02:00
\usecolortheme { tud}
% or ...
%\setbeamercovered{transparent}
% or whatever (possibly just delete it)
}
% notes on 2nd screen:
\usepackage { pgfpages}
2019-08-28 16:27:46 +02:00
\setbeameroption { show notes on second screen}
2019-08-11 20:14:06 +02:00
\usepackage [british] { babel}
% or whatever
\usepackage [backend=biber, sorting=none] { biblatex}
2019-09-05 15:38:36 +02:00
\addbibresource { literature.bib}
2019-08-11 20:14:06 +02:00
2019-08-28 16:27:46 +02:00
\usepackage { ccicons}
2019-09-01 16:54:28 +02:00
\usepackage { wrapfig}
2019-08-28 16:27:46 +02:00
2019-08-11 20:14:06 +02:00
\usepackage { ifluatex}
\ifluatex
2019-08-29 15:41:02 +02:00
\usepackage { fontspec}
2019-08-30 01:55:44 +02:00
%\setmainfont{TeX Gyre Pagella}
%\RequirePackage{unicode-math}
%\setmathfont{XITS Math}
%\setmainfont{Open Sans}
%\setsansfont{Open Sans}
%\setmathfont[range={it}]{Open Sans:style=Italic}
%\setmathfont[range={it}]{Open Sans}
2019-08-11 20:14:06 +02:00
\else
\usepackage [T1] { fontenc}
\usepackage [utf8] { inputenc}
% Or whatever. Note that the encoding and the font should match. If T1
% does not look nice, try deleting the line with the fontenc.
\fi
\title [Decentralised Hashtag Federation] % (optional, use only with long paper titles)
{ Decentralised Hashtag Search and Subscription
for Federated Social Networks}
\author
{ Trolli Schmittlauch}
% - Give the names in the same order as the appear in the paper.
% - Use the \inst{?} command only if the authors have different
% affiliation.
\institute [] % (optional, but mostly needed)
{
Department of Computer Science\\
Technical University Dresden
}
\date [APConf 2019] % (optional, should be abbreviation of conference name)
{ ActivityPubConf 2019}
\datecity { Prague}
% - Either use conference name or its abbreviation.
% - Not really informative to the audience, more for people (including
% yourself) who are reading the slides online
%\subject{Privacy}
% This is only inserted into the PDF information catalog. Can be left
% out.
% If you have a file called "university-logo-filename.xxx", where xxx
% is a graphic format that can be processed by latex or pdflatex,
% resp., then you can add a logo as follows:
% \pgfdeclareimage[height=0.5cm]{university-logo}{university-logo-filename}
% \logo{\pgfuseimage{university-logo}}
% Delete this, if you do not want the table of contents to pop up at
% the beginning of each subsection:
%\AtBeginSubsection[]
%{
% \begin{frame}<beamer>{Outline}
% \tableofcontents[currentsection,currentsubsection]
% \end{frame}
%}
% If you wish to uncover everything in a step-wise fashion, uncomment
% the following command:
%\beamerdefaultoverlayspecification{<+->}
\begin { document}
\maketitle
2019-08-28 16:27:46 +02:00
\note { introduce myself:\\
2019-09-05 15:38:36 +02:00
usually go by schmittlauch on the Internet\\
2019-08-28 16:27:46 +02:00
student of Computer Science @ TU Dresden\\
interest in federated systems and unusual social networks\\
2019-09-05 15:38:36 +02:00
presenting my work on a student research paper from this year}
2019-08-28 16:27:46 +02:00
2019-08-11 20:14:06 +02:00
\begin { frame} { Outline}
\tableofcontents
% You might wish to add the option [pausesections]
\end { frame}
% Structuring a talk is a difficult task and the following structure
% may not be suitable. Here are some rules that apply for this
% solution:
% - Exactly two or three sections (other than the summary).
% - At *most* three subsections per section.
% - Talk about 30s to 2min per frame. So there should be between about
% 15 and 30 frames, all told.
% - A conference audience is likely to know very little of what you
% are going to talk about. So *simplify*!
% - In a 20min talk, getting the main ideas across is hard
% enough. Leave out details, even if it means being less precise than
% you think necessary.
% - If you omit details that are vital to the proof/implementation,
% just say so once. Everybody will be happy with that.
\section { Motivation}
2019-08-28 16:27:46 +02:00
\begin { frame} { Welcome to ActivityPubConf!} { Motivation}
2019-08-11 20:14:06 +02:00
2019-08-28 16:27:46 +02:00
\only <1>{
\includegraphics [width=\textwidth] { figures/toot_ nohashtags.png}
\note { Who has been posting about this Conference?}
}
\only <2>{
\includegraphics [width=\textwidth] { figures/toot_ hashtags.png}
\note { And who used \# ActivityPubConf?}
}
\end { frame}
\subsection { Importance of \# Hashtags}
2019-08-11 20:14:06 +02:00
\begin { frame} { Importance of \# Hashtags} { }
2019-08-28 16:27:46 +02:00
Hashtags are used for marking posts about certain topics or events:
2019-09-05 15:38:36 +02:00
\note { mark topics of posts, make them discoverable by content. No decentralised full text search in Fediverse (centralised search engines)}
2019-08-11 20:14:06 +02:00
\begin { columns}
\begin { column} { 0.47\textwidth }
\begin { itemize}
2019-08-28 16:27:46 +02:00
\item <1-> \textbf { events} : \# ActivityPubConf, \# CCCamp19
\item <2-> \textbf { political topics} : \# SaveTheInternet
\item <3-> \textbf { general topics} : \# mastoadmin, \# Tusky
\item <4-> \textbf { ongoing demonstrations} : \# GeziPark, \# WomensMarch
\item <5-> \textbf { social movements} : \# MeToo
2019-08-11 20:14:06 +02:00
\end { itemize}
\end { column}
\begin { column} { 0.5\textwidth }
2019-08-28 16:42:54 +02:00
\begin { overlayarea} { \textwidth } { 0.6\paperheight }
2019-08-28 16:27:46 +02:00
\center
\only <1>{
\includegraphics [width=\textwidth] { figures/APConfLogo.png}
}
\only <2>{
\includegraphics [height=0.58\paperheight] { figures/hashtag_ savetheinternet.jpg} \\
\tiny { \href { https://www.flickr.com/photos/8183946@N05/14733648892} { "Obama in the Backseat: Rally to Save the Internet"} by \href { https://www.flickr.com/photos/8183946@N05} { Free Press Pics} is licensed under \href { https://creativecommons.org/licenses/by-sa/2.0/?ref=ccsearch& atype=rich} { CC BY-SA 2.0} \ccbysa }
}
\only <3>{
\includegraphics [height=0.6\paperheight] { figures/Elephant_ Friend_ (Greeting).png}
}
\only <4>{
2019-09-05 15:38:36 +02:00
\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} }
2019-08-28 16:27:46 +02:00
}
\only <5>{
\includegraphics [height=0.6\paperheight] { figures/hashtag_ metoo.jpg} \\
\tiny { \href { https://www.flickr.com/photos/50612692@N04/28039368079} { "IMG\_ 4263"} by \href { https://www.flickr.com/photos/50612692@N04} { GGAADD} is licensed under \href { https://creativecommons.org/licenses/by-sa/2.0/?ref=ccsearch& atype=rich} { CC BY-SA 2.0} \ccbysa }
}
2019-08-28 16:42:54 +02:00
\end { overlayarea}
2019-08-11 20:14:06 +02:00
\end { column}
\end { columns}
\end { frame}
2019-08-28 16:27:46 +02:00
\subsection { State of Hashtags in the Fediverse}
\begin { frame} { State of Hashtags on the Fediverse} { }
2019-09-05 15:38:36 +02:00
{ \center \Large Hashtags are used in the Fediverse}
2019-08-28 16:27:46 +02:00
\pause
\vspace { 2em}
{ \large But do they behave as expected?}
\end { frame}
\begin { frame}
\begin { columns}
\begin { column} { 0.5\textwidth }
\begin { figure}
\includegraphics [height=0.65\paperheight] { figures/{ activitypubconf_ toot.matereal.eu} .png}
\caption { \# activitypubconf on the single-user instance \textit { toot.matereal.eu} }
\end { figure}
\end { column}
\begin { column} { 0.5\textwidth }
\begin { figure}
\includegraphics [height=0.65\paperheight] { figures/{ activitypubconf_ mastodon.social} .png}
\caption { \# activitypubconf on the large instance \textit { mastodon.social} }
\end { figure}
\end { column}
\end { columns}
\end { frame}
\begin { frame} { State of Hashtags on the Fediverse} { Fragmentation}
\begin { itemize}
\item fragmented view on hashtag posts depending on user's instance
2019-08-29 14:10:27 +02:00
\item hashtag search only on locally known posts
2019-08-28 16:27:46 +02:00
\item Result: incentive to cluster on large nodes \( \Leftarrow \) centralisation
\end { itemize}
\end { frame}
\begin { frame} { Reason} { Push-Federation}
2019-08-29 15:41:02 +02:00
\begin { columns}
\begin { column} { 0.55\textwidth }
\includegraphics [height=0.6\paperheight] { figures/push_ federation.pdf}
\end { column}
2019-09-05 15:38:36 +02:00
\note { example scenario with 4 instances}
2019-08-29 15:41:02 +02:00
\begin { column} { 0.45\textwidth }
2019-08-28 16:27:46 +02:00
\begin { itemize}
2019-08-29 15:41:02 +02:00
\only <1>{ \item subscription to \texttt { @alice@cyber.space} by contacting instance \texttt { cyber.space} }
2019-09-05 15:38:36 +02:00
\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} }
2019-08-28 16:27:46 +02:00
\end { itemize}
2019-08-29 15:41:02 +02:00
\end { column}
\end { columns}
2019-08-28 16:27:46 +02:00
\end { frame}
2019-08-29 00:25:51 +02:00
\begin { frame} { Current Solutions}
\begin { itemize}
2019-08-30 01:55:44 +02:00
\item Mastodon PubRelay or Pleroma lite-pub relay:
\begin { itemize}
\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
2019-09-05 15:38:36 +02:00
\item only access to posts sent after initial subscription
2019-08-30 01:55:44 +02:00
\end { itemize}
\item Diaspora* SocialRelay
\begin { itemize}
\item similar, but allows subscribing to certain tags only
\end { itemize}
2019-08-29 00:25:51 +02:00
\end { itemize}
\end { frame}
2019-08-28 16:27:46 +02:00
\section { System Architecture}
2019-08-30 01:55:44 +02:00
\begin { frame} { System Architecture} { Goals}
\begin { itemize}
\item \textbf { relay \& subscribe} : instances can subscribe to all public posts of a hashtag
\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}
\end { frame}
2019-09-01 16:54:28 +02:00
\begin { frame} { System Architecture} { adding a DHT backend to the fediverse}
2019-08-28 16:27:46 +02:00
2019-09-05 15:38:36 +02:00
\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}
2019-09-01 16:54:28 +02:00
2019-09-05 15:38:36 +02:00
based on Chord \cite { stoicaChordScalablePeertopeer2003}
%ToDo for Kolloquium: reason for Chord
2019-09-01 16:54:28 +02:00
2019-09-05 15:38:36 +02:00
\note [item] { DHT: structured P2P networks, self-organising, no central authority}
\note [item] { provides efficient (log N) key-value storage and lookup}
2019-09-01 16:54:28 +02:00
\end { frame}
\begin { frame} { System Architecture} { adding a DHT backend to the fediverse}
\begin { columns}
\begin { column} { 0.4\textwidth }
\begin { itemize}
\item calculate hash value of keys and node IDs
2019-09-05 15:38:36 +02:00
\item place these hashes onto the same circular name space
2019-09-01 16:54:28 +02:00
\item each node keeps routing table of \( \log \# number \_ nodes \) entries\note [item] { joining and leaving covered in paper}
\end { itemize}
\end { column}
\begin { column} { 0.6\textwidth }
\includegraphics [height=0.62\paperheight] { figures/finger_ table_ routing_ 1.pdf}
\end { column}
\end { columns}
\end { frame}
\begin { frame} { System Architecture} { adding a DHT backend to the fediverse}
\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 DHT used for iterative lookup of responsible relay/ storage node
2019-09-05 15:38:36 +02:00
\item my architecture: namespace = \( 2 ^ { 256 } \) with 256bit-long IDs
2019-09-01 16:54:28 +02:00
\end { itemize}
\end { column}
\begin { column} { 0.45\textwidth }
\includegraphics [height=0.62\paperheight] { figures/finger_ table_ routing_ 2.pdf}
\end { column}
\end { columns}
\end { frame}
\begin { frame} { Publishing, Relaying and Storage} { lifecycle of posts}
\begin { enumerate}
2019-09-05 15:38:36 +02:00
\item publishing instance looks up responsible relay instance on DHT for each included hashtag\note [item] { calculate hashum of hashtag -> lookup key for DHT}
2019-09-01 16:54:28 +02:00
\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}
\item subscribing instances can now retrieve the full authenticated post from received post URI
\end { enumerate}
2019-09-02 16:45:41 +02:00
\note [item] { for joining and leaving the DHT see paper}
2019-09-01 16:54:28 +02:00
\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}
2019-08-30 01:55:44 +02:00
2019-08-28 16:27:46 +02:00
\end { frame}
2019-09-01 16:54:28 +02:00
\begin { frame}
2019-09-05 15:38:36 +02:00
\note { so far so easy.\\
what hashtags does a certain instance handle?\\
can it bear the load?}
2019-09-01 16:54:28 +02:00
\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
\item Can instances be overloaded by their assigned hashtag posts?
\end { itemize}
\end { frame}
\begin { frame} { Distribution of Posts per Tag}
\includegraphics [width=0.49\textwidth] { statistics/twitter_ hashtags_ total.png}
~
\includegraphics [width=0.49\textwidth] { statistics/geraspora_ hashtags_ total.png}
\note { analysis of a 1 month dump of Twitter, Geraspora (Diaspora) and Friendica posts\\
2019-09-05 15:38:36 +02:00
Twitter: 70\% of hashtags used just once\\
2019-09-01 16:54:28 +02:00
note the logarithmic axis!}
distribution of posts per hashtag follows a steep power law
\note { So what if a small node gets several large hashtags? => need for load balancing}
\end { frame}
\begin { frame} { Load Balancing} { of hashtags between nodes}
\begin { itemize}
2019-09-05 15:38:36 +02:00
%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 \} \)
2019-09-01 16:54:28 +02:00
\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
2019-09-05 15:38:36 +02:00
\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}
2019-09-02 16:45:41 +02:00
\note [item] { a simple simulation on the effectivity of the balancing algorithm can be found in the paper}
2019-09-01 16:54:28 +02:00
\end { itemize}
% for Kolloquium, add simulation result
\end { frame}
\begin { frame} { Redundancy}
\begin { columns}
\begin { column} { 0.55\textwidth }
\begin { itemize}
2019-09-05 15:38:36 +02:00
\item store redundant copies of hashtag data at equal distances on Chord ring, inspired by Harvesf and Blough \cite { harvesfEffectReplicaPlacement2006} \note { resilience against node failure, allows data validation through cross-checking}
2019-09-01 16:54:28 +02:00
\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
\end { itemize}
\end { column}
\begin { column} { 0.45\textwidth }
\includegraphics [width=\textwidth] { figures/redundancy_ ring.pdf}
\end { column}
\end { columns}
\end { frame}
2019-08-28 16:27:46 +02:00
\section { Discussion}
\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} .
2019-09-05 15:38:36 +02:00
\note { architecture just a concept so far\\
before implementations: several open questions}
2019-08-28 16:27:46 +02:00
\end { frame}
\subsection { Social Considerations}
2019-08-11 20:14:06 +02:00
2019-09-02 16:45:41 +02:00
\begin { frame} { Social Considerations}
Do we even want global hashtags in the Fediverse?
\begin { itemize}
2019-09-05 15:38:36 +02:00
\item positive potential (conversation, coordination) vs. negative potential (spam, harrassment)
2019-09-02 16:45:41 +02:00
\item visibility level: public posts only, unlisted, new level necessary?
2019-09-05 15:38:36 +02:00
\item relaying post URI only should provide plausible deniability and retractability
2019-09-02 16:45:41 +02:00
\end { itemize}
\end { frame}
2019-08-29 00:25:51 +02:00
\subsection { Technical Considerations}
2019-09-02 16:45:41 +02:00
\begin { frame} { Technical Considerations} { instance admins}
\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
\item performance: Can this be implemented efficiently enough to not DDoS popular hashtag nodes?
\begin { itemize}
\item batched retrieval of posts from same source
\item exponential backoff retries
\end { itemize}
\end { itemize}
\end { frame}
\begin { frame} { Technical Considerations} { integration into the ActivityPub Fediverse}
\begin { itemize}
\item This architecture is an unimplemented concept so far!
\item integration into ActivityPub ecosystem\note [item] { disclaimer: I'm new to ActivityPub and have no implementation experience}
\begin { itemize}
\item hashtags may be represented as relay actors with own in- \& outbox, addressed in cc
\item relaying to subscribers via SharedInbox
2019-09-05 15:38:36 +02:00
\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?}
2019-09-02 16:45:41 +02:00
\item signalling of error codes and redundancy factors is needed
\end { itemize}
\item DHT routing communication does not use ActivityPub
\end { itemize}
\end { frame}
\begin { frame} { Technical Considerations} { node ID assignment}
2019-08-29 00:25:51 +02:00
2019-09-02 16:45:41 +02:00
\note [item] { Let's talk about the elephant in the room of ``federated services''}
\centering
\includegraphics <1>[height=0.59\paperheight ]{ figures/Elephant_ Friend_ (Greeting).png}
\includegraphics <2,4>[height=0.59\paperheight ]{ figures/hist_ num_ single_ vs.png}
2019-08-29 00:25:51 +02:00
2019-09-05 15:38:36 +02:00
\note [item] { common DHT attack: Sybil-… = 1 attacker introduces large number of nodes}
2019-09-02 16:45:41 +02:00
\note [item] { sorry to all instance admins, but: CloudFlare behaves like a MITM/ Sybil attacker}
2019-09-05 15:38:36 +02:00
\note [item] { node ID derivation: first 64 bits of IPv6}
2019-09-02 16:45:41 +02:00
\only <2,4>{ 1st peak: Masto.host, 2nd peak: Cloudflare}
\only <3>{ { \ttfamily
\( h _ n = \) hash(IPv6\_ addr[0,63] ++ vserver)[0,63] \\
++ hash(domain ++ vserver)[0,127] \\
++ hash(IPv6\_ addr[0,63] ++ vserver)[64,127]
}
\vspace { 2em}
node ID derivation}
\end { frame}
\subsection { Security Considerations}
\begin { frame} { Security Considerations}
\begin { itemize}
\item attacker shall not be able to deliberately gain responsibility for certain hashtags
\begin { itemize}
\item node ID mainly dependant on IPv6 subnet
\end { itemize}
\item attacker shall not introduce arbitrary number of nodes
\begin { itemize}
\item valid domain required for node ID derivation, assumption: domains cost money
\end { itemize}
2019-09-05 15:38:36 +02:00
\note { not perfectly secure, but the best I could think of. Better ideas welcome}
2019-09-02 16:45:41 +02:00
\end { itemize}
\end { frame}
2019-09-01 16:54:28 +02:00
2019-08-11 20:14:06 +02:00
\section { Summary}
\begin { frame} { Summary}
% Keep the summary *very short*.
\begin { itemize}
\item
2019-09-02 16:45:41 +02:00
decentralised architecture for handling posts of the same hashtag:
\begin { itemize}
\item \alert { subscribe to hashtag} and get posts \alert { relay} ed
\item \alert { query stored posts} of a certain hashtag without subscription
\end { itemize}
\item responsibility for hashtag divided among instances using a DHT
\item architecture \alert { balances the load} between nodes and maintains \alert { redundancy}
\item several open questions before implementation
2019-08-11 20:14:06 +02:00
\end { itemize}
% The following outlook is optional.
2019-09-02 16:45:41 +02:00
%\vskip0pt plus.5fill
2019-08-11 20:14:06 +02:00
\end { frame}
% All of the following is optional and typically not needed.
\appendix
\section <presentation>*{ \appendixname }
\subsection <presentation>*{ For Further Reading}
2019-09-02 16:45:41 +02:00
\begin { frame}
\center \huge { Questions, comments, feedback?}
\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}
2019-08-29 00:25:51 +02:00
\end { frame}
2019-09-05 15:38:36 +02:00
\begin { frame} [allowframebreaks]
\frametitle { References}
\printbibliography
2019-08-11 20:14:06 +02:00
\end { frame}
2019-09-05 15:38:36 +02:00
%\includegraphics[height=0.5\textheight]{figures/nomnompingu.png}\tiny\footnote{CC-BY-SA 3.0 by Elektroll}
2019-08-11 20:14:06 +02:00
\end { document}