Die Prämisse

Bevor man einzelne, spezielle Aspekte des Lebens des Menschen auf der Erde beleuchten und diskutieren kann, sollten wir erst einmal versuchen, die Bühne zu bereiten, den Kontext zu etablieren, den Gesamtzusammenhang zu schaffen, in den dann später einzelne Themen eingeordnet oder „eingehängt“ werden können. Es sind die Grundlagen, bei denen ich davon ausgehe, dass eine Übereinstimmung besteht. Bevor das der Fall ist, erscheint mir eine tiefergehende Diskussion über darauf aufbauende Dinge unsinnvoll, dann sollten wir uns ersteinmal hierüber unterhalten. Es ist der „common ground„, die Gesprächs- und Diskussionsgrundlage, die gemeinsame stabile, nicht in Frage gestellte Plattform, auf der beide Diskutantinnen stehen, von der aus sie argumentieren und ihre Logik-Gebäude errichten, an dem sie sich emporhangeln und schauen, bis wohin die Stockwerke verbunden sind und ab wann sie sich auseinanderentwickeln oder wo Brücken geschlagen werden können. Die Prämisse, die grundsätzliche Ziel- und Problemstellung:

Die Menschheit muss mit ihrem Planeten „nachhaltig“ umgehen, im ursprünglichen Sinne des Begriffes aus der Forstwirtschaft: Nicht mehr Ressourcen pro Zeit nutzen (vulgo „verbrauchen“), als zur Verfügung stehen bzw. sich nachbilden, so dass die Bedingungen, unter denen der Mensch leben kann (Temperatur, Atmosphäre, Wasser, Nahrung, Lebensraum etc.), über einen langen Zeitraum gewährleistet bleiben. Äußere Einflüsse wie Meteoriteneinschläge lassen wir mal außen vor, und nach Außen strebende Aktivitäten wie Besiedelung anderer Planeten auch, ebenso wie Interaktionen mit außerirdischen intelligenten Spezies von anderen Planeten. Beobachtungsobjekt ist also die Menschheit mit ihrem Planeten Erde über einen längeren, aber absehbaren Zeitraum, sagen wir 200 Jahre.

Momentan sieht das aus verschiedenerlei Gründen schlecht aus: Die Temperatur steigt, das Wasser wird verschmutzt, die Luft wird verschmutzt, das Land wird sowohl verschmutzt als auch anderweitig stark in Mitleidenschaft gezogen (Oberflächenversiegelung, Waldrodung etc.), andere Lebewesen auf dem Planeten werden beeinträchtigt oder sogar ausgerottet. Da der Planet eben ein zusammenhängendes, komplexes Ökosystem ist, ist schwer abzusehen wie ganz genau die einzelnen Auswirkungen zusammenhängen und sich gegenseitig beeinflussen. Sicher festzuhalten ist aber, dass sie zusammenhängen und sich gegenseitig aber auch den Gesamtzustand des Planeten beeinflussen, und dass einzelne Einflüsse teilweise gravierende Auswirkungen haben. Ebenfalls ist klar, dass die Menschheit durch ihr Handeln viele solcher Einflüsse ausübt
=> Menschengemachter Klimawandel existiert und die Menschheit hat in den letzten Jahrzehnten und Jahrhunderten, insbesondere seit der Industrialisierung, den allergrößten Einfluss auf die Ressourcennutzung und den Zustand des Planeten.

Wenn der Schaden einmal angerichtet ist, ist es sehr schwer und aufwändig, ihn wieder auszugleichen oder zu reparieren: Bäume wachsen nur langsam nach, ausgerottete Tiere sind dann halt weg, Schwermetalle oder andere Gift-/Abfallstoffe sind nur schwer aus Erde, Wasser oder Luft zu entfernen, dazu zähle ich hier einmal auch Kunststoff und CO2.

Forschung und Entwicklung gehen langsam aber stetig vonstatten, wenn Anstrengungen fokussiert werden, können auch in kurzer Zeit erstaunliche Leistungen vollbracht werden. Eine Krankheit, die die reichen Industrienationen betrifft, bringt auf einmal innerhalb 3-12 Monaten um die 20 wirksame Impfstoffe hervor. Plötzliche Heureka-Entdeckungen gibt es dabei eher nicht, stattdessen schrittweise, aufeinander aufbauende Erkenntnisse und Umsetzungen, die davon leben, dass viele unterschiedliche Menschen sich aus vielen unterschiedlichen Perspektiven und mit vielen unterschiedlichen Kontexten mit einem Thema auseinandersetzen und darüber austauschen; dass Thesen überprüft, Experimente nachvollzogen und so eine Mehrheitsmeinung („Wahrheit“) gebildet wird, die auf reproduzierbaren Fakten beruht
=> Wissenschaft funktioniert.

Jetzt ist die Menschheit eben alles andere als homogen, sondern sehr unterschiedlich und vielfältig: Aussehen, Kulturen, Religionen, Sprachen, Lebensweisen; auf der anderen Seite gelten einige Dinge für alle Menschen gleichermaßen, nämlich was zum Leben benötigt, wonach gestrebt wird: Getränke/Wasser, Nahrung, Kleidung, Unterkunft, Sicherheit (also Absehbarkeit der Zukunft), Verbesserung der Lebensumstände, Faulheit/Luxus, Liebe. Letzteres heißt Aufmerksamkeit und Wertschätzung durch andere Menschen. Letztlich können diese, vor allem letztere Dinge in unangenehme Situationen münden: Hochmut, Neid, Missgunst, Gier, Machtstreben und und -Ausübung etc.; in letzter Konsequenz Ausbeutung, Sklaverei, Krieg.

Ein einzelner Mensch allein kann wenig erreichen, aber was den Menschen ausmacht ist die Möglichkeit zur intensiven Kommunikation untereinander, voneinander zu lernen und Wissen auch in formalisierter Art zu speichern und an andere Menschen und Generationen weitergeben zu können, dafür haben wir gerade in den letzten Jahrzehnten erstaunliche und ausgeklügelte Werkzeuge und Kommunikationsmittel entwickelt. Im Prinzip kann sich jeder Mensch in Echtzeit mit jedem anderen über alles austauschen, asynchron und unidirektional sogar mit Menschen anderer Zeiten. Kommunikation gibt uns auch die Möglichkeit zur Arbeitsteilung und damit der Spezialisierung und Hierarchisierung. Zusammen mit der Fähigkeit, Werkzeuge zu nutzen, zu entwickeln und zu verbessern eröffnet dies der Menschheit quasi unbegrenzte Möglichkeiten, jedenfalls im Rahmen der physikalischen Gesetzmäßigkeiten. Die können durch eben die menschlichen Möglichkeiten oft genug von Hindernissen zu Wegen umgemünzt, oder durch z.B. Alternativ-Wege kompensiert werden.
=> Vielfalt und Diversität ist wichtig und positiv, gemeinsam ist man stark.

Ein einzelner Mensch steht so immer auf den Schultern von Giganten, hat einzeln an sich kaum Einflussmöglichkeiten auf das Weltgeschehen, kann aber durchaus wichtige Beiträge beisteuern, die in der Summe und im Produkt Forstschritt ergeben. Gleichzeitig können Werkzeuge und soziale Konstrukte einem einzelnen Menschen eben doch einen großen Einfluss geben, das ist dann Macht: Die Möglichkeit, die Geschicke anderer Menschen zu bestimmen.

Weiterhin bestimmt werden die Geschicke von Menschen durch äußere, kaum beeinflussbare Begebenheiten: Wann und Wo und in welche gesellschaftliche Position sie hineingeboren werden. Und hier kommen wir zu Ungerechtigkeiten: Die Chancen für Menschen sind sehr ungleich verteilt, ein weißer Sohn in einer deutschen Akademiker-Familie hat viel mehr Möglichkeiten als ein Mädchen in einem indischen Slum. Solche situative Gefälle erzeugen Spannungen, ganz so wie Ladungsgefälle elektrische Spannungen bedeuten: Arm und Reich, Machtvoll und unterdrückt, privilegiert und gewöhnlich.
Wenn also der Zugang zu den Mitteln, die die Grundbedürfnisse befriedigen, ungerecht auf Menschen aufgeteilt ist, entstehen Konflikte bis hin zu Kriegen: Um Lebensraum, Nahrung, Wasser und Energie.

Energie ist die eine paradoxe Schlüssel-Ressource: Sie steht uns aus menschlicher Perspektive unbegrenzt zur Verfügung, die Sonne scheint seit Jahrmillionen und wird es weitere Jahrmillionen tun, die abgegebene Energiemenge ist nahezu unermesslich und übersteigt die vom Planeten Erde und der Menschheit benötigte Menge um viele Größenordnungen. Aufgrund des als E = mc² sehr simpel erscheinend beschrieben Naturgesetzes der Äquivalenz von Masse und Energie könnten materielle Probleme auf der Erde theoretisch durch die Umwandlung aus Energie gelöst werden: Saubere Luft, Wasser, Nahrung, Boden herzustellen, so wie der Replikator aus Star Trek. Das Wissen der Menschheit und die bisherigen Werkzeuge reichen dafür aber noch nicht aus. Es geht also weniger um die Verfügbarkeit von Energie, sondern um die Zugänglichkeit zu nutzbaren Formen von Energie und dem notwendigen Wissen und Werkzeugen zur Umwandlung von Energie. Denn auch ohne bis auf das subatomare Level herunterzugehen, kann man natürlich mit Energie Masse oder Materie beeinflussen, am ehesten erkennbar bei mechanischer Energie.

Man könnte also sagen: Hätten wir unbegrenzten Zugang zu nutzbarer Energie, dem nötigen Wissen und Werkzeugen, könnten wir alle materiellen Probleme lösen. Und gölte das für alle Menschen gleichermaßen, würden sich Gefälle abbauen und damit auch alle Konflikte und sozialen Probleme lösen lassen.

Also ist die Energieversorgung der Schlüssel des 21. Jahrhunderts. Jetzt haben wir nur das Problem, dass wir uns selbst ziemlich unter Zeitdruck gesetzt haben: Im momentanen Zustand und mit der momentanen Art und Geschwindigkeit der Veränderungen und des Ressourcenverbrauchs, bleiben uns keine 80 Jahre mehr, die essentiellen materiellen Probleme zu lösen; nebenbei verschärfen die jetzt schon eingetretenen Folgen sowohl die materiellen als auch die sozialen Probleme und verkleinern damit den Lösungsraum und verkürzen die Lösungszeit.

Können wir uns auf diese Prämisse erstmal einigen?

Wie alles begann – Der Sinn des Lebens

OK, ich will also die gesammelten Gedanken vieler Jahre (nachvollziehbar!) festhalten. Irgendwo muss ich beginnen, und das scheint mir zu sein, festzustellen, was das bestimmende Element für mich ist. Das Fünfte?

Ich bin – und höchstwahrscheinlich seid auch ihr Leser – ein Exemplar der Art Homo Sapiens, des „verständigen Menschen“, daher liegt  uns der Fortbestand und das Wohl und Wehe dieser unserer Art besonders am Herzen. Ihr Wohlergehen ist automatisch der oberste Rahmen unseres Handelns. Innerhalb der Art können wir kommunizieren und uns fortpflanzen, daher bildet sie die größte, allgemeine und natürliche Menge, die zusammenhängend zu betrachten ist.

Die Menschheit lebt auf einem Planeten, auf dessen Oberfläche wir jeden Ort mit geringem Aufwand erreichen können, in dessen inneres wir nur beschwerlich und wenig eindringen können und den wir noch nicht weit oder lange verlassen können. Wir haben uns die Erde Untertan gemacht, wir beherrschen Sie, wir haben die Fähigkeit und Macht, sie zu gestalten und zu verändern und das auch schon vielfach bewiesen.

Das bedeutet keineswegs, dass die anderen Arten, seien es Pflanzen, Tiere oder z.B. Bakterien weniger lebenswert oder wichtig oder niederer wären und beliebig behandelt werden könnten. Allein aus reinem Eigennutz ist eine Ausrottung nicht angezeigt, denn wir Menschen sind schon immer auf andere Lebewesen angewiesen um unsere Ernährung, Bekleidung, Werkzeuge, Unterkünfte, Fortbewegungsmittel oder Gesunderhaltung zu gewährleisten. Allein ist der Mensch nicht überlebensfähig sondern auf andere Organismen angewiesen, er lebt innerhalb eines globalen Systems, der Biosphäre.

Aus dieser Perspektive leitet sich für mich automatisch eine Art kollektiver „Sinn des Lebens“ ab: Für die eigene Art nützlich zu sein, sie zu sichern, ihr zu helfen. Das bedeutet, der Sinn nicht nur meiner Existenz und meines Lebens, sondern jedes Menschen ist oder sollte es meiner Auffassung nach sein, ein zuträgliches Exemplar unserer Art zu sein. Ihr nicht zu schaden, sondern im Gegenteil zu nützen, sie voran zu bringen.

Im Hinblick auf welche Aspekte, mit welchen Mitteln und wie das geschehen könnte möchte ich gerne hier mit einer Reihe weiterer Artikel diskutieren. Den Auftakt machen Ziel und Problemstellung, die Prämisse.

Der individuelle Sinn hingegen, also mein ganz eigener, persönlicher Antrieb und Ziel der Existenz unterscheidet sich vom kollektiven und ist natürlich wohl von Mensch zu Mensch unterschiedlich. Ich kann nur für mich sprechen, würde aber dennoch annehmen, dass es viele Mitmenschen gibt, denen es ähnlich geht. Zumindest schadet es nicht, sich einmal selbst Gedanken zu machen, was man im Leben erreichen möchte oder wie man es verbringen möchte.

Im Bewusstsein der eigenen Sterblichkeit und damit Endlichkeit und Begrenztheit des eigenen Lebens, ist, so abgedroschen das auch klingen mag, der Weg das Ziel: Das Verbringen des Lebens an sich und weniger eine Art Aufstellung und Abrechnung an dessen Ende. Mir wohnt das Bestreben nach einer Mehrung des Glückes, also möglichst viel glücklich-sein inne. Doch ẃie ist das zu machen?

Eine Methode scheint für mich bislang gewesen zu sein, zu genießen, also eine weitere hohle Phrase, das „Carpe Diem“, „fange den Tag, genieße den Augenblick“: Das Bemühen, schöne Erlebnisse zu haben, viel zu entdecken, erfahren und zu lernen und die Essenz als gute Erinnerungen zu sammeln.

Nun sind all diese Aspekte keine wirklich bewussten Entscheidungen oder festgehaltenen Lebensmottos gewesen, sie scheinen mir stattdessen ganz automatisch und natürlich entstanden und entwickelt und ich mich unterbewusst an ihnen orientiert zu haben.

Was genau mir Freude bereitet und mich glücklich macht, ist auch nicht ganz einfach zu fassen. Eine Hauptrolle spielt auf jeden Fall das soziales Umfeld, die Eltern, Geschwister, Freunde und Bekannte, Lebenspartner. Auch hier wieder eine Phrase: „Qualität vor Quantität“ – es sind meist eher wenige, ausgesuchte Menschen und keine großen Mengen, mit denen ich die Erlebnisse teile.

Später mehr dazu.

Worum es hier eigentlich geht

Ich habe dieses Blog einstmals eingerichtet, um meine Gedanken zu ordnen und festzuhalten, sie aus dem Kopf zu bekommen und dort wieder Platz für neue Gedanken zu schaffen, aber vor Allem auch um sie anderen Menschen zugänglich zu machen, auf dass sie als Denkanstoß und Diskussionsgrundlage dienen mögen und als Aufforderung zur Entgegnung, zu einem kritischen Diskurs. Ich denke immer ziemlich viel nach, versuche mir möglichst vielseitige und umfangreiche Informations- und Meinungsquellen zu erschließen und vor Allem viel mit Menschen zu reden, sie zu fragen, von ihnen zu lernen und ihre Gedanken und Sicht zu verstehen.
Ich halte daher das, was ich hier niederschreibe für recht durchdacht und schlüssig, aber beanspruche keinesfalls die reine Wahrheit, auch nicht Originalität oder einen Gedanken das erste Mal gehabt oder geäußert zu haben. Leider kann ich nicht alle Quellen angeben, die mich zu den Überzeugungen geführt haben, also erfüllen die Texte nicht einmal einen wissenschaftlichen Anspruch.
Ich bitte euch Leserinnen daher, Gedanken, die ihr während des Lesens meiner Texte habt, mit mir zu teilen, sei es als öffentliche Kommentare darunter oder private Mails/Nachrichten. Es muss nicht besonders lang oder ausgeklügelt sein, aber es hilft jede Entgegnung oder Hinweis auf Dinge, die ich schlecht, falsch oder lückenhaft betrachtet habe oder die ihr anders seht.

Dass ich das Blog eingerichtet habe, ist schon Jahre her, und seitdem ist es überwiegend ungenutzt geblieben, abgesehen von wenigen Artikeln der gedachten Art, einigen weiteren technischen, der mittlerweile umgezogenen Startzelle des Wahl-O-Cast und von Anne Bude. Einerseits findet oder nimmt man sich keine Zeit, dann doch endlich loszuschreiben, andererseits gibt es da natürlich auch Hemmungen, seine Gedanken vor der Welt auszubreiten und die ganz banale Angst, dass es niemanden kümmert, das zu lesen und darauf noch zu reagieren – „what if they say I’m no good?“. Zumindest letzteres muss man wohl einfach überwinden und es sollte helfen, dass das Erreichen möglichst vieler Menschen ja ein sehr nachgeordnetes Ziel ist, zumindest wenn ich meiner eigenen Auflistung oben folgen. Mal schauen, ob es diesmal besser wird als bei den vorigen Versuchen.

Also los!

Mosquitto MQTT-Broker im Uberspace installieren

Vorbemerkung

Der ursprüngliche Artikel stammte vom 1. August 2015, etwas weniger als ein Jahr später hat sich die Sache allerdings weiterentwickelt, daher habe ich den Artikel umdatiert und neu veröffentlicht. Das Wichtigste zuerst: Die Sache funktioniert, sauber sicher und stabil. Der ganze nachfolgend erträumte Funktionsumfang ist noch nicht erreicht, aber daran kann man ja noch arbeiten.

Vision

Wir alle bewgen uns viel durch die Welt, häufig nicht alleine. Und Karten sind ein fantastisches Medium, um solche Bewegungen auf einer sphärischen Fläche festzuhalten und darzustellen. Zwei interessante Fragen/Problemstellungen/Aufgaben tauchen dabei häufiger auf:

  1. Wo bin ich überall schon mal gewesen?
  2. Wo bin ich jetzt grade, wohin bin ich unterwegs, wie bewege ich mich fort und wann komme ich an? (Insbesondere, wenn man sich mit jemandem treffen möchte)
  3. (Spielen! Jedes Mal, wenn ich über diesen Komplex nachdenke, drängt sich der Gedanke auf, dass man daraus ein fantastisches (Gelände-/Real-)Spiel basteln könnte, etwas in der Art einer Schnitzeljagd oder Geocaching in Verwandschaft zu Scotland Yard oder Mister X, vielleicht sogar mit Carmen Sandiego. Auch Deutschlandreise oder Globetrotter kommen einem in den Sinn. Große Metropolregionen wie das Ruhrgebiet, in dem ich wohne, bieten sich dafür natürlich an, aber auch im Rahmen einer Jugendfreizeit ließe sich das sicher gut nutzen. Siedler- oder andere Segelspiele haben wir ja schonmal auch ganz offline hinbekommen. Andere haben sowas auch schon gemacht: z.B. auf dem 31C3 und vorher wurde in der Freakshow davon berichtet. Ingress trifft einen ähnlichen Nerv)

Ziel wäre also, die Position von mehreren Leuten zu erfassen, verfolgen, aufzuzeichnen und (auch im Verlauf, also als Spur) darzustellen, eventuell in Beziehung zu setzen mit einander oder anderen Daten (Wetter, Verkehr, ÖPNV), zusätzlich noch Ziel/Zwischenziele, Route, Verkehrsmittel, Voraussichtliche Ankunftszeit, passende Wikipedia-Artikel etc.
Das würde erstmal die Grundanforderungen abdecken, sich mit anderen Menschen besser absprechen zu können und auch im Nachhinein sehen zu können, wo man war.
Wenn es dann noch zusätzlich Berechtigungs-Einschränkungen gäbe (alle senden ihre Position, aber nicht jeder kann immer die Positionen aller anderen einsehen), käme man der Spiel-Nutzung näher.

Möglichkeiten

Es gab mal einen Dienst namens Google Latitude, der ungefähr in die Richtung ging, er ist mittlerweile in Google+/Maps (Timeline) aufgegangen, in Facebook, FourSquare/Swarm, Apples Find My Friends oder waze finden sich ähnliche Ansätze. Sehr nah an meine Vorstellung der Umsetzung kommt Glympse, gegenüber den anderen genannten Diensten benötigt man zum Angucken kein Konto und die Freigabe ist zeitlich beschränkt.

Aber einen Nachteil haben sie alle: Sie sind ein großer Eingriff in die Privatsphäre, man gibt Kontrolle ab, man muss (überwiegend sehr großen) Firmen trauen, die im Ausland und damit anderen Jurisdiktionen sitzen, von denen man abhängig und denen man ausgeliefert ist. Kurz: Sie sind nicht  offen, noch frei.

Also sind sie keine echte Option. Ein paar gäbe es da aber schon schon: OsMo/OsmAnd, Userhash Location Reporting, Gps Cell Phone Tracker, Trackserver. Es gibt auch eine schöne Übersicht von Diensten mit Vergleich. So recht schien mir aber keins davon zu passen. Zwischenzeitlich trug ich mich mit dem Gedanken, selbst was auf reiner Browser/Javascript-Basis zu entwickeln, was eventuell mit einem NodeJS-Server spricht: Sehr viel Aufwand, aber wäre ein Anlass zum Lernen.

Ansatz

Doch in dem Vergleich wird OwnTracks erwähnt (nicht zu verwechseln mit owntrack, dessen Idee ähnlich, Umsetzung aber nicht so nachhaltig zu sein scheint), dazu gibt es auch einen Artikel bei Cashy und einen von nullniveau. (Und noch ein paar hier und dort). Das scheint mir eine Lösung voll nach meinem Geschmack. OwnTracks selbst ist eine OpenSource-App (sowohl für iOS als auch für Android), die die Position ermittelt und per MQTT (Message Queue Telemetry Transport), einem offenen Publish-/Subscribe-Protokoll für die dezentrale Übermittlung kleiner Nachrichten wie Sensor-Messdaten über Verbindungen, die auch schonmal aussetzen können, verteilt. Passt also sehr gut, hat auch den aparten Vorteil, dass die Server-Seite unabhängig von dem Geo-Thema ist und in der Heimautomatisierungsszene (s. openHAB) Zuspruch findet, man ist also da nicht allzusehr in der Nische und läuft Gefahr, dass man sich übernimmt oder die Weiterentwicklung eingestellt wird. Es gibt einen Open Source-MQTT Message Broker (=Server) namens Mosquitto, der auch von den OwnTracks-Machern unterstützt und empfohlen wird.

Einziger Wermutstropfen: OwnTracks ist zwar OpenSource, aber (noch) nicht im F-Droid-Repository zu finden, da es auf die proprietären Google Play Services zur Ortung zurückgreift. Kein Problem, das man nicht lösen könnte! 😉 (Allerdings ist die dafür notwendige Implementierung von Geofencing in LOST zur Zeit eingeschlafen.)

Die OwnTracks-App sendet und empfängt die Positionen und zeigt sie auf einer Karte an.
Der MQTT-Broker verteilt nur die Positions-Nachrichten aber zeichnet sie nicht auf, dazu gibt es mittlerweile ot-recorder (zuvor gab es schon das m2s-Backend bzw. auch mit Darstellung im Web den Nachfolger Pista. Um die Vision zu Erreichen, wäre außerdem der Einbau einer Authentifikation noch wichtig.

Mosquitto möchte ich gerne nicht auf einem Raspberry Pi installieren wie in der OwnTracks-Doku und allen anderen Anleitungen, die ich finden konnte, sondern in meinem Uberspace. Denn ich möchte die Position ja von Unterwegs aufzeichnen und einsehen, und ich möchte mein Netzwerk zuhause nicht nach Außen aufmachen. Das ist insofern problematisch, als die Anleitungen alle vom praktischen Weg „sudo apt-get“ ausgehen, der im uberspace logischerweise nicht funktioniert (keine sudo-Berechtigung). Also bleibt nur die andere Möglichkeit: Selbst kompilieren.

Umsetzung

Genug der langen Vorrede, werden wir etwas konkreter und kommen zur Umsetzung: Den Mosquitto-Broker im Uberspace kompilieren und starten.

Eine der Anleitungen beinhaltet das Kompilieren, aber als root, von der bin ich ausgegangen und habe sie dann ein wenig angepasst, um der User-Umgebung Rechnung zu tragen. Außerdem werden jetzt in der zweiten Version des Artikels direkt von Anfang an Websockets mit aktiviert und in der Konfiguration TLS verwendet.

Los geht’s:

Websockets

Geholfen haben mir zwei Artikel.

libwebsockets 1.6 ist die letzte explizit von mosquitto erwähnte Version und danach haben sich ABI-Changes ereignet, also nehmen wir die und kompilieren/installieren sie:

mkdir -p ~/projekte/mosquitto
cd ~/projekte/mosquitto
wget https://github.com/warmcat/libwebsockets/archive/v1.6.3.tar.gz
tar xfv v1.6.3.tar.gz
cd libwebsockets-1.6.3/
mkdir build
cd build
cmake ..
make

Damit wird heruntergeladen, ausgepackt, das buildscript erzeugt und dann ausgeführt. Danach liegen in lib/  die nötigen libraries, die man nach ~/lib  kopieren kann:

cp lib/* ~/lib/

Jetzt geht es weiter mit  mosquitto selbst.

Mosquitto

mkdir -p ~/projekte/mosquitto
cd ~/projekte/mosquitto
wget http://mosquitto.org/files/source/mosquitto-1.4.9.tar.gz
tar xvf mosquitto-1.4.9.tar.gz 
cd mosquitto-1.4.9 
nano config.mk

Nun muss die config.mk angepasst werden, um die Websockets-Bibliothek erreichbar zu machen und zu linken

Also Folgendes jeweils an den richtigen Stellen in der Datei ändern:

WITH_WEBSOCKETS:=yes
BROKER_LIBS:=$(BROKER_LIBS) -L$(HOME)/lib -lwebsockets
prefix=${HOME}

Dann ändern, speichern und verlassen.

Es werden außerdem noch zwei header-Dateien gebraucht:

cp ../libwebsockets-1.6.3/lib/libwebsockets.h ./src/
cp ../libwebsockets-1.6.3/build/lws_config.h ./src/

Weiter mit

make all
make install

Dabei passiert folgendes: Die Dateien werden kompiliert und unter $HOME/ in  entsprechenden Verzeichnissen (~/bin, ~/include, ~/lib, ~/sbin, ~/share) abgelegt, aber am Ende des Kompilierens erscheint der Fehler

install -d /etc/mosquitto
install: kann Zugriffsrechte von „/etc/mosquitto“ nicht ändern: Datei oder Verzeichnis nicht gefunden
make: *** [install] Fehler 1

Man kann auch erkennen warum: Die Dateien, die eigentlich in /etc/mosquitto landen sollen, berücksichtigen aus unerklärlichen Gründen den Prefix nicht, und auf das systemweite /etc-Verzeichnis haben wir natürlich keinen Zugriff. Ist aber auch nicht weiter schlimm, wir legen einfach eine eigene Konfigurationsdatei an, sie wird gleich editiert:

mkdir ../etc
cp mosquitto.conf.example ../etc/mosquitto.conf

TLS

Doch zunächst müssen noch einige Vorbereitungen bezüglich des TLS getroffen werden. Der Server soll unter einer eigenen Domain erreichbar sein und es soll ein Zertifikat von Let’s Encrypt zum Einsatz kommen, das passt gut in die Uberspace-Architektur und wird auf den Mobilgeräten automatisch akzeptiert. Alternativ, insbesondere wenn man keine Domain hat oder dafür nur die normale Uberspace-Domain ($USER.$SERVER.uberspace.de) benutzen möchte, wäre es auch möglich, das Zertifikat selbst zu generieren/signieren (Weiteres dazu unter http://owntracks.org/booklet/features/tls/ und http://mosquitto.org/man/mosquitto-tls-7.html) und das dazu passende CA-Zertifikat auf den Geräten in das System zu importieren oder in der App anzugeben. Das macht die Einrichtung aber unnötig kompliziert und hat z.B. bei Android als Nebeneffekt zur Folge, dass die Bildschirmsperre mindestens per Muster deaktiviert werden muss (was ohnehin eine gute Sache wäre).

Nun also –  Im virtuellen User-Webroot wird ein Verzeichnis als Platzhalter angelegt:

mkdir /var/www/virtual/$USER/mqtt.example.com

Es ist sinnvoll, hier eine eigene, sonst nicht benutzte Subdomain zu vergeben, (der Name muss natürlich entsprechend angepasst werden) um das Let’s Encrypt-Zertifikat separat zu verwalten.

Die (Sub-)Domain muss dann im DNS angelegt werden, z.B. bei INWX, was ich nur empfehlen kann. Im Wiki von Uberspace gibt es noch genauere Informationen.

Es muss sichergestellt sein, dass die Server von Let’s Encrypt unter der Domain auch wirklich den Uberspace-Server erreichen, also am besten nochmal von außen probieren, z.B. eine Test-Datei aus dem Platzhalter-Verzeichnis herunterzuladen.

Wenn Let’s Encrypt bisher noch nicht im Einsatz war ist es an der Zeit (den Uberspace-Wiki-Eintrag zu lesen und dann) für

uberspace-letsencrypt

Jetzt, oder falls Let’s Encrypt schon im Einsatz war findet sich unter ~/config/letsencrypt/cli.ini eine Konfigurationsdatei, in der alle Domains eingetragen sind. Die wird nun kopiert, bearbeitet (also alle Domains außer der für Mosquitto entfernt) und zum Erzeugen der Zertifikate benutzt:

cp ~/.config/letsencrypt/cli.ini ~/.config/letsencrypt/cli.ini.mqtt.example.com
nano ~/.config/letsencrypt/cli.ini.mqtt.example.com
letsencrypt certonly -c ~/.config/letsencrypt/cli.ini.mqtt.example.com

Die Zertifikate werden nun für mosquitto kopiert. Im Prinzip könnten sie auch aus dem .config-Ordner heraus verwendet werden, aber so hat man alles zusammen. Geschmackssache:

cp -H ~/.config/letsencrypt/live/mqtt.example.com/fullchain.pem ~/projekte/mosquitto/
cp -H ~/.config/letsencrypt/live/mqtt.example.com/cert.pem ~/projekte/mosquitto/
cp -H ~/.config/letsencrypt/live/mqtt.example.com/privkey.pem ~/projekte/mosquitto/

Konfiguration

Es sind zwei offene Ports in der Firewall nötig, die bekommt man durch doppeltes Aufrufen von

uberspace-add-port -p tcp --firewall

Die dabei ausgegebenen Ports merken und gleich benutzen, denn jetzt geht es an’s Einstellen in der vorhin angelegten Konfigurations-Datei. Eine Hilfe dabei war ein Artikel:

nano ~/projekte/mosquitto/etc/mosquitto.conf

Hier im Beispiel ist der normale MQTT-Port (Standard 1833/8883) auf 61883 und zusätzlich ein Websockets-Port (Standard 9002) auf 61884 konfiguriert, beide geschützt mit TLS. Aufgelistet sind hier alle Änderungen im Verhältnis zur Standard-Konfiguration. Die müssen in der Datei jeweils an den entsprechenden Stellen vorgenommen werden. Also nicht einfach alles reinkopieren. Außerdem müssen die $HOME-Variablen manuell aufgelöst werden, also stattdessen direkt/home/username hinschreiben.

bind_address mqtt.example.com
port 61883
cafile $HOME/projekte/mosquitto/fullchain.pem
certfile $HOME/projekte/mosquitto/cert.pem
keyfile $HOME/projekte/mosquitto/privkey.pem
tls_version tlsv1.2

listener 61884
protocol websockets
cafile $HOME/projekte/mosquitto/fullchain.pem
certfile $HOME/projekte/mosquitto/cert.pem
keyfile $HOME/projekte/mosquitto/privkey.pem
tls_version tlsv1.2

log_dest file $HOME/projekte/mosquitto/mosquitto.log
log_type error
log_type warning
log_type notice
log_type information
log_type all

connection_messages true
log_timestamp true

Starten und Testen

Es kann fast losgehen, dazu müssen wir aber noch das Verzeichnis, in dem die frisch kompilierte Mosquitto-Bibliothek liegt, in den LD_LIBRARY_PATH aufnehmen, damit beim Ausführen des Binarys gleich auch darin nach ihr gesucht wird:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/lib/:
echo $LD_LIBRARY_PATH

$HOME/lib/ wird an den bisherigen Pfad angehängt und dann wieder in der Umgebungsvariablen gespeichert (der Doppelpunkt ist das Trennzeichen), danach wird sie ausgegeben. Damit das fortan automatisch beim Einloggen geschieht, ergänzen wir die erste Zeile in der .bashrc:

nano ~/.bashrc

Und jetzt braucht man vier Konsolen-Fenster:

1. Der Broker. Hier sollten zum Start ein paar Meldungen erscheinen:

~/sbin/mosquitto  -v -c $HOME/projekte/mosquitto/etc/mosquitto.conf
1438439447: mosquitto version 1.4.2 (build date 2015-08-01 09:52:48+0200) starting
1438439447: Config loaded from /home/$USER/mosquitto/etc/mosquitto.conf.
1438439447: Opening ipv4 listen socket on port 61883.
1438439447: Opening ipv6 listen socket on port 61883.

2. Das Log. Auch hier sollten bei den folgenden Aufrufen einige Meldungen erscheinen:

tail ~/projekte/mosquitto/mosquitto.log

3. Der Subscribe-Client. Er sollte beim nächsten Aufruf die gesendete Nachricht anzeigen:

~/bin/mosquitto_sub -h mqtt.example.com -d -v -p 61883 --cafile /etc/pki/tls/certs/ca-bundle.trust.crt --tls-version tlsv1.2 -t owntracks/+/+

4. Der Publish-Client:

~/bin/mosquitto_pub -h mqtt.example.com -d -p 61883 --cafile /etc/pki/tls/certs/ca-bundle.trust.crt --tls-version tlsv1.2 -t owntracks/user/device -m '{"_type":"location","acc":36,"batt":44,"lat":50.00000,"lon":6.000000,"tid":"xy","tst":1465234220}'

Ein uberspace-list-ports -l  zeigt außerdem die jetzt offenen Ports mit dem horchenden Mosquitto-Server:

tcp 61883: mosquitto (2395), /home/user/sbin/mosquitto-v-c/home/user/projekte/mosquitto/etc/mosquitto.conf
tcp 61884: mosquitto (2395), /home/user/sbin/mosquitto-v-c/home/user/projekte/mosquitto/etc/mosquitto.conf

Als nächsten Schritt kann man jetzt die OwnTracks-App mit dem Broker verbinden. Das sollte sich ebenfalls in den Logs und im Subscribe-Client niederschlagen, außerdem müsste in Luxembug ein User angezeigt werden.

Die Websocket-Verbindung kann man direkt hier testen: http://www.eclipse.org/paho/clients/js/utility/index.html
Oder einen dieser MQTT-Websocket-Clients klonen und konfigurieren:
https://github.com/eclipse/paho.mqtt.javascript.git
https://github.com/jpmens/simple-mqtt-websocket-example
https://github.com/owntracks/contrib

Daemontools

Zur besseren Kontrolle des Brokers übergibt man ihn in die Obhut der  deamontools (die zum Testen gestartete Instanz in der „1. Konsole“ muss natürlich vorher per Strg+C beendet werden):

uberspace-setup-svscan
mkdir ~/etc/run-mosquitto
nano ~/etc/run-mosquitto/run

In dieses Skript kommt nun (den Usernamen ersetzen):

#!/bin/sh

export USER=username
export HOME=/home/$USER

# Include the user-specific profile
. $HOME/.bash_profile

exec $HOME/sbin/mosquitto -v -c $HOME/projekte/mosquitto/etc/mosquitto.conf 2>&1

Zum Abschluss wird das Skript ausführbar gemacht, aktiviert und der Daemon gestartet:

chmod +x ~/etc/run-mosquitto/run
ln -s ~/etc/run-mosquitto ~/service/mosquitto
svc -u ~/service/mosquitto

Ein abschließendes

ps fuxwww

sollte nun den Mosquitto-Superviser und den eigentlichen Broker zeigen.

Das war’s, alles geht! 🙂

Achtung, mit dieser Konfiguration gestattet der Broker alle Verbindungen und Subscriptions! Eine ACL würde Abhilfe schaffen…

Bliebe noch,  den ot-recorder und ein Authentifikations-Backend einzurichten. Mal schauen, wann das kommt…

Update: ot-recorder

Der ot-recorder klappt auch, wegen der Nachfrage in den Kommentaren hier noch ein kleiner Hinweis dazu. Ist leider aus Zeitmangel nicht ganz so ausführlich, aber besser wie nix:

Ich habe Version 0.6.5 vom 30. Mai 2016 ans Laufen bekommen und beziehe mich daher hier auf diese, würde mich aber nicht wundern, wenn auch eine neuere Version funktionieren würde. Vielleicht einfach mal ausprobieren. Leider weiß ich nicht mehr genau den Weg, den ich damals genommen habe, und kann daher nur Hinweise geben, keine Anleitung.

Man benötigt wohl auch noch die libconfig in Version 1.5 (möglicherweise geht auch hier die neuere 1.6?). Die kann man einfach runterladen, in ein Verzeichnis entpacken (in meinem Fall /home/$USERNAME/projekte/libconfig/libconfig-1.5), dann

./configure

ausführen und hernach

make

Das reicht schon, dann ist die Bibliothek dort verfügbar.

Es sieht so aus, als wären die nötigen Änderungen im Ordner von owntracks-recorder allesamt in der config.mk und dessen Kompilieren sollte danach klappen. Würde mich freuen von jemandem, der es ausprobiert hat, eine Rückmeldung zu bekommen. Also, meine config.mk hat folgende Änderungen:

INSTALLDIR = /home/$USERNAME/projekte/owntracks-recorder
STORAGEDEFAULT = /home/$USERNAME/projekte/owntracks-recorder/store
DOCROOT = /home/$USERNAME/projekte/owntracks-recorder/htdocs
JSON_INDENT ?= yes
CONFIGFILE = /home/$USERNAME/projekte/owntracks-recorder/etc/config
MOSQUITTO_INC = -I/home/$USERNAME/projekte/mosquitto/mosquitto-1.4.9/lib -I/home/$USERNAME/projekte/libconfig/libconfig-1.5/lib
MOSQUITTO_LIB = -L/home/$USERNAME/lib
MORELIBS = -L/home/$USERNAME/projekte/libconfig/libconfig-1.5/lib/.libs -lconfig # -lssl

($USERNAME jeweils von Hand ersetzen durch den eigenen Benutzernamen, die anderen Pfade jeweils auf eigene Gegebenheiten anpassen)

Nach dem Kompilieren müsste ./owntracks-recorder funktionieren. Allerdings gab es, wenn ich mich recht erinnere, noch kleinere Probleme, die Web-Oberfläche aufzurufen, die ich nie wirklich behoben habe, weil mir die Daten in den Verzeichnissen schon gereicht haben.

Ich hoffe, das hilft schonmal?

Ein eigenes Android-App-Repsitory (F-Droid) auf dem Uberspace

Vorbemerkungen

Ein Android-Smartphone ist erst mit zusätzlichen Apps so wirklich nützlich. Wenn auf dem Gerät ein Cyanogenmod (oder ein anderes Betriebssystem ohne die Google-Apps wie den Play Store) läuft und man aus Prinzip keine Abhängigkeit zu Google schaffen möchte, dann muss man sich eine andere App-Quelle suchen. Amazon (oder ähnliche) ist da auch keine echte Alternative. Die gibt es allerdings in F-Droid. Das Projekt betreibt nicht nur einen eigenen Katalog von Apps (nur Open Source, keine Anmeldung nötig) und stellt den dazugehörigen Client bereit, sondern ebenfalls die Server-Software. Im Client kann man außer dem Standard-Repository auch weitere hinzufügen, z.B. Öffi oder GuardianProject. Oder eben sein eigenes wenn man eins hat. Darum, sein eigenes F-Droid-Repository aufzusetzen, und zwar bei uberspace, soll es in diesem Eintrag gehen.

Doch warum sollte man das tun wollen? Im „offiziellen“ F-Droid-Repository gibt es doch schon alle möglichen Apps? Eine schöne Zusammenstellung der „besten“ Apps findet man z.B. bei Droid-Break:

  1. Manche Apps sind leider nicht Open Source und daher auch nicht bei F-Droid zu finden (z.B. QuickPic, die Uni-App, die Olympus-Kamera-App etc.). Man kann sie z.B. über einen App-Downloader auch ohne Google-Konto herunterladen (in der letzten Zeit klappt es nicht mehr richtig), aber der noch etwas bessere Weg könnte ein Kommandozeilen-Play-Store-Client, evtl. auch zusammen mit Weboberfläche sein. Das könnten der 3. und 4. Schritt werden…
  2. Wenn man Android-Apps selbst entwickelt oder vorhandene verändert/erweitert kann es helfen, diese als Entwickler-Versionen per Repository auch an mehrere Leute/Geräte verteilen zu können, bevor sie es in den offiziellen Store schaffen. Konsequenterweise würde man evtl. sogar alle Apps lieber selbst automatisch und regelmäßig aus dem aktuellen Quellcode kompilieren, dazu wäre eine Art Build- oder Continuous Integration-Server wie Jenkins praktisch (Schritt 2).

Zunächst mal ist das Ziel (der 1. Schritt) aber ein „einfaches“, sogenanntes „Simple Binary Repository“, das einfach vorkompilierte (z.B. auf dem Entwicklungs-Laptop) .apk-App-Dateien verteilt.

Man könnte auf den Gedanken kommen, soetwas einfach im heimischen Netzwerk auf einem Raspberry einzurichten. Leider geht das aber nicht, da im Raspberry ein ARM-Prozessor läuft und es das Android-SDK aus irgendwelchen skurrilen Gründen nicht für ARM gibt. Skurril deshalb, weil immerhin die meisten Smartphones selber einen ARM-Prozessor haben. Apps muss man daher auf einer x86-Plattform Cross-compilen. Das Android-SDK wiederum braucht der F-Droid-Server, um die Meta-Daten aus den APK-Dateien auszulesen und im Repository bereitzustellen.

Zunächst noch zum Setup: Das Paket „fdroidserver“ ist hauptsächlich in Python geschrieben und nutzt das Java-SDK (JRE reicht nicht) und das Android-SDK als Abhängigkeiten.

Die Python-Skripte generieren die notwendigen Ordner- und Datei-Strukturen, die dann aus dem normalen Webroot eines üblichen Web-Servers wie NGinx (oder, im Falle von uberspace) Apache ausgeliefert werden.

Die anderen Anleitungen zum Einrichten des Servers gehen (wie so häufig) von root-Rechten auf dem Server aus, die hat man aber bei uberspace natürlich nicht zur Verfügung. Ein „apt install fdroidserver“ klappt also nicht, man muss ein paar Anpassungen vornehmen.

Die Dokus, die mich auf dem bisherigen Weg begleitet haben, gibt es hier:

Leider sind die nicht alle ganz konsistent, widersperchen sich ein wenig oder ergänzen jeweils nur einige kleine Hinweise. Ich habe auch auf den „virtualenv„-Aspekt verzichtet, weil er mich beim Testen eher verwirrt hat und ich keinen schlagenden Vorteil sehe.

Nun also per Hand, von Anfang an:

Ein Arbeitsverzeichnis anlegen und dahin wechseln:

$ mkdir -p ~/projekte/android && cd ~/projekte/android

Java

Das Java-SDK ist bei Uberspace nicht installiert, für diesen Anwendungsfall (Entwicklungsumgebung und Laufzeitumgebung für kleine Kommandozeilenprogramme) kann man es aber – auf eigene Quota – nachziehen.

Die Methode (Oracle macht es etwas umständlich) hat sich zwischenzeitlich schon wieder ein wenig verändert und man muss bei Oracle auf der Website zuvor die aktuelle Version nachschauen (Dateiname anpassen) :

$ wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u92-b14/jdk-8u92-linux-x64.tar.gz

Für das OpenJDK scheint es leider keinen offiziellen Tarball zu geben, sondern nur fertige Plattform-Pakete (wiesu denn blus?), die man per Paket-Verwaltung installieren müsste.

(Nebenbei: Die Uberspace-Server haben – kaum überraschend – Prozessor und Kernel mit 64 Bit Wortbreite, das kann man auch auf der Kommandozeile herausfinden)

$ tar xvfz jdk-8u92-linux-x64.tar.gz
$ rm jdk-8u92-linux-x64.tar.gz
$ mv jdk1.8.0_92 jdk

Android

Auf der offiziellen Website ganz unten den Pfad zum aktuellen SDK besorgen und herunterladen (Version anpassen):

$ wget http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz
$ tar xvfz android-sdk_r24.4.1-linux.tgz
$ rm android-sdk_r24.4.1-linux.tgz
$ mv android-sdk-linux android-sdk

Jetzt müssen ein paar Umgebungsvariablen angepasst werden:

$ nano ~/.bash_profile

und folgende Zeilen einfügen:

export JAVA_HOME=$HOME/projekte/android/jdk
export PATH=$JAVA_HOME/bin:$PATH
export ANDROID_HOME=$HOME/projekte/android/android-sdk

Nach dem Speichern (Strg+O, Strg+X) die Variablenänderungen neu einlesen mittels

$ source ~/.bash_profile

dann mit Hilfe des SDK Managers die zusätzlichen Tools und Plattformen herunterladen:

$ android-sdk/tools/android list sdk --no-ui -a

Dort die Nummern merken für die SDK Tools, die Platform-tools, die Build-tools (jeweils nur die höchste Version/Revision, abgesehen von RCs) und die SDK Platforms API 20 und 22 und diese dann an den folgenden Filter-Parameter übergeben:

$ android-sdk/tools/android update sdk --no-ui -a --filter 1,3,6,31,33

(etwas mehr Information dazu und noch vertiefende Anmerkungen)

64 Bit Build-Tools

Jetzt kommt der große Trick an diesem Setup: Zu diesem Zeitpunkt würde ein

$ ~/projekte/android/fdroid/fdroidserver/fdroid update --create-metadata

im Repository-Verzeichnis (s.u.) zum Scheitern führen:

CRITICAL: OSError while trying to execute /home/$USER/projekte/android/android-sdk/build-tools/23.0.3/aapt dump badging repo/de.danoeh.antennapod_1050200.apk: [Errno 2] No such file or directory: '/home/$USER/projekte/android/android-sdk/build-tools/23.0.3/aapt'

Das Programm aapt liegt zwar am angegebenen Ort, gibt aber bei direktem Aufrufen folgende Rückgabe:

-bash: /home/$USER/projekte/android/android-sdk/build-tools/23.0.3/aapt: /lib/ld-linux.so.2: bad ELF interpreter: Datei oder Verzeichnis nicht gefunden

Das liegt wohl daran, dass es für dieses Programm keine (offizielle) 64-Bit-Version gibt. ?!?! 32 Bit ist schon seit einer gefühlten Ewigkeit obsolet (um mal die Jungs von Uberspace zu zitieren), aber die entsprechende Issue bei Android/Google steht auf „WorkingAsIntended“. Hier ist also wenig schnelle Abhilfe zu erwarten.

Theoretisch könnte man zwar Kompatibilitäts-Bibliotheken (mit Dropdown oben rechts zu Linux wechseln) auf dem Server installieren:

sudo yum install zlib.i686 ncurses-libs.i686 bzip2-libs.i686

Aber auch mit Hundeblick ließen sich die Uberspace-Admins nicht ausnahmsweise erweichen. Was ich verstehen kann, denn man möchte sich sein Setup ja nicht mit altem Kram zukleistern, „der einen riesigen Ratenschwanz an Abhängigkeiten mit sich bringt“ (erneutes Support-Zitat). Naja, ’n Versuch war’s wert aber Prinzipien sind gut und müssen sein! 🙂

Außerdem erhöht das den Leidensdruck auf den User, die Sache doch noch irgendwie anders hinzubekommen. Da war doch beim Suchen irgendwo ein Link aufgetaucht…?

Ja! Tatsächlich gibt es ein Github-Repository, in dem sich jemand die Mühe gemacht hat, die Original Android-Build Tools so vorzubereiten, dass sie auf einem 64 Bit-System kompilieren. Welche Arbeit und Veränderungen genau das bedeutet hat, ist zwar nicht direkt ersichtlich, und die Grundlage sind die Android 4.1.2-Quellen, aber das sollte doch eigentlich keine Rolle spielen. Also los (wir befinden uns weiterhin in ~/projekte/android/):

$ git clone https://github.com/cjacker/android-utils.git
$ cd android-utils
$ ./configure
$ make

Jetzt braucht es einen kleinen Moment, bis alles fertig kompiliert ist. Danach liegt das fertige 64 Bit-aapt in seinem Ordner. Kurzer Test:

$ aapt/aapt

spuckt keine Fehlermeldung, sondern den Hilfetext aus. Juhu!

Dann packen wir es mal in das SDK-Verzeichnis:

$ cd ../android-sdk/build-tools/23.0.3/
$ mv aapt aapt-original
$ cp ../../../android-utils/aapt/aapt ./
$ cd ../../../

F-Droid Server

Und nun endlich auf zum Endspurt:

$ mkdir fdroid && cd fdroid
$ git clone https://gitlab.com/fdroid/fdroidserver.git
$ cd fdroidserver
$ pip3 install -e . --user

Dabei wird das offizielle Git-Repository geklont und mit dem Python-Paketmanager pip in Version 3 die Abhängigkeiten aufgelöst/heruntergeladen. Wichtig ist der –user-Schalter damit nicht versucht wird, die Pakete im schreibgeschützten globalen Pfad abzulegen. Nach ein bisschen warten und in der Konsolenausgabe sollte am Ende sowas stehen wie

Successfully installed ... fdroidserver ...

Also weiter mit

$ python3 setup.py install --user

das endet nach etwas Arbeiten und Ausgabe zwar mit

error: could not create '/package/host/localhost/python-3/share/doc': Permission denied

aber wer braucht schon Doku? 🙂 Offenbar beachtet hier leider das Install-Script nicht die –user -Option.

Legen wir nun im virtuellen WebRoot ein Verzeichnis „fdroid“ (eine Konvention) an, begeben uns dorthin und initialisieren ein F-Droid-Repository:

$ cd /var/www/virtual/$USER/html
$ mkdir fdroid && cd fdroid
$ ~/projekte/android/fdroid/fdroidserver/fdroid init

Es gibt zwar wieder einmal eine Fehlermeldung

CRITICAL: Unknown exception found!
[...]
KeyError: 'keytool'

aber das Wesentliche wurde erledigt, wie $ ls -lah  zeigt. Und den Fehler und seine Auswirkungen beheben wir gleich.

Repository

Jetzt legen wir zum Testen eine vorhandene .apk-Datei in das Repository

$ cd repo/
$ wget https://f-droid.org/repo/de.danoeh.antennapod_1050200.apk
$ cd ..

Dann muss eine kleine Anpassung an der config.py vorgenommen werden, damit F-Droid das JDK findet. Diese Stelle hat mich am meisten Zeit und Nerven gekostet, weil sie gut versteckt und mäßig dokumentiert ist. Macht man es nicht, bekommt man

CRITICAL: Java JDK not found! Install in standard location or set java_paths!

Also weiter:

$ nano config.py

Hier müssen oben einige Zeilen einkommentiert und verändert werden (achtet auf die richtige Zahl, nicht ‚1.8‘, das ist eine fiese Falle)

java_paths = {
     '8': "/home/$USER/projekte/android/jdk",
}

Einbiegen auf die Zielgerade, das Repository erzeugen/aktualisieren:

$ ~/projekte/android/fdroid/fdroidserver/fdroid update --create-metadata

sagt uns leider noch

CRITICAL: 'keystore.jks' does not exist!

Da ist ja der Fehler von vorhin, aber da das Repository nun fertig konfiguriert ist und das JDK findet, funktioniert die vorgeschlagene Abhilfe:

$ fdroid update --create-key

es wird ein neuer Signing Key und ein passendes Zertifikat erzeugt. Das sind Sachen, die man in Zukunft ruhig nochmal anpassen könnte, aber für’s Erste geht das schon in Ordnung. Der zweite Versuch mit

$ ~/projekte/android/fdroid/fdroidserver/fdroid update --create-metadata

bringt uns

INFO: Finished.

Das war’s! Es funktioniert. Auf dem Smartphone muss jetzt in F-Droid unter „Paketquellen“ eine neue Quelle eingerichtet werden. Als Adresse gibt man

https://$USER.$SERVER.uberspace.de/fdroid/repo

ein, aktiviert es, deaktiviert alle anderen und aktualisiert einmal die Quellen. Dann taucht es in der Liste als „My First F-Droid-Repo Demo“ auf und in der App-Liste wird die eine App (im Beispiel AntennaPod) aufgeführt.

Screenshot_20160422-132354 Screenshot_20160422-135023

Nutzung

Die Nutzung wird nun darin bestehen, fertige .apk-Dateien unter

/var/www/virtual/$USER/html/fdroid/repo

abzulegen und dann in

/var/www/virtual/$USER/html/fdroid/

das Kommando

$ ~/projekte/android/fdroid/fdroidserver/fdroid update

aufzurufen.

Weitere Konfiguration

In der Datei

/var/www/virtual/$USER/html/fdroid/config.py

sind jetzt noch einige Konfigurationsoptionen, an denen man schrauben kann, die Sache mit den Keys sollte man sich durchaus nochmal anschauen (die Apps werden neu mit einem einheitlichen Repository-Key signiert) und auch das metadata/ -Verzeichnis bietet Ansatz-Punkte.

Dazu bietet es sich an, die oben verlinkten Artikel/Handbücher zu studieren, aber das ist ab jetzt dann nur noch „Standard“. Wahrscheinlich ist es auch nicht verkehrt, von Zeit zu Zeit ein Update der fdroidserver-Skripte, des Java- und des Android-SDK zu machen.

Viel Spaß mit euren eigenen F-Droid-Repositories und der neu gewonnenen Unabhängigkeit! Sollte dies hier jemandem genützt haben, freue ich mich sehr über einen Kommentar.

Ziemlich staubig hier

Vor etwa anderthalb Jahren habe ich dieses Blog aufgesetzt. Seitdem ist unfassbar viel passiert, in der Welt, in meiner Umwelt, in mir.

Ständig habe ich mir in der Zwischenzeit vorgenommen, endlich zu schreiben, habe dazu angehoben, Entwürfe angelegt, Notizen gemacht, nachgegrübelt. Dabei scheitert man ein wenig an seinen Ansprüchen: Alles soll direkt perfekt sein, ausgearbeitet, schlüssig, überzeugend, nicht angreifbar und nicht zuletzt komplett. Das ist natürlich Blödsinn, so funktionert es nicht. Einfach mal anfangen ist jetzt der Weg, den ich gehen möchte.

Ich hoffe so wenigstens alle 2-3 Wochen einen Artikel zu schreiben. Euch bitte ich um Kommentare und Kritik und bin gespannt auf eure Meinung.

Perfekt wird es nicht sein, ich plane eher, die Artikel ab und zu auch mal zu überarbeiten

Also: Los jetzt

Digitale Emanzipation

Emanzipation ist laut Wikipedia ein Akt der Selbstbefreiung mit dem Ziel, mehr Freiheit und Gleichheit zu erlangen. Das kann man in vielerlei Hinsicht erreichen und charakterisieren. Ich befasse mich in diesem Artikel mit der „digitalen“ weil die Welt, in der wir leben, nun mal immer mehr von Systemen durchdrungen und bestimmt wird, die von Computern gesteuert werden. Computer, also Rechner, übernehmen das Berechnen, wo man es früher mit den Fingern getan hat (lat. digitus: der Finger), im englischen heißt eine Ziffer „digit“. Einerseits geht es hier also um digitale Emanzipation, weil wir in einer digitalen Welt leben. Zweitens um eine Befreiung vom digitalen Umfeld, in das wir uns verstrickt haben. Und drittens um die Wiedererlangung von Gleichheit unter den Menschen.

Uiui, was? Naja, fangen wir mal klein an.

Ich habe eine Vorstellung davon, einen Wunsch, Traum oder Vision, wie und wohin sich die Erde und die Menschheit darauf entwickeln sollte. Allein kann ich das nicht erreichen. Aber ich kann dazu mit meinem Verhalten beitragen, und meine Überlegungen dazu mit anderen Menschen teilen, in der Hoffnung, dass  Sie darüber nachdenken, mit mir diskutieren, und wir eine gemeinsame Vision und einen gemeinsamen Weg entwickeln, dorthin zu gelangen.

So ein Weg ist lang und schwer, und es hilft, wenn man andere hat, die sich auf dem gleichen Weg befinden, damit man sich gegenseitig austauschen und unterstützen kann. Man kann ihn nicht an einem Tag mit einem riesen Sprung bewältigen, sondern nur durch viele kleine Schritte.

So weit die Allgemeinplätze. Wie geht’s los? Diese vielen kleinen Schritte möchte ich, während ich sie selbst gehe, hier erzählen, um euch dazu einzuladen, darüber mit mir zu diskutieren und sie selbst zu gehen. Einen kleinen Vorsprung habe ich schon, aber ihr könnt schnell aufholen.

Einige von den Schritten bringen Kosten (also Geld), Arbeitsaufwand (also Zeit), oder Veränderungen in dem Leben, wie man es bisher gewohnt war (also Qualität), mit sich. Übellaunige Zeitgenossen könnten das „Einschränkungen“ nennen.

Doch nicht alles sind technische Vorkehrungen, die man trifft, vieles auch einfach bewusstes Nachdenken oder geändertes Verhalten. Hier geht es jetzt erstmal um das technische. Die einzelnen Punkte möchte ich demnächst noch teilweise mit eigenen Artikeln genauer erläutern.

Was also sind die Schritte? Woll’n mal sehen:

  • Eine andere Suchmachsine – Finden ohne gefunden zu werden
    Kosten: Keine, Aufwand: Gering, Veränderungen: Gering.
    Die Google-Such ist das allumfassende und beherrschende Werkzeug, um im Internet Dinge zu finden. Doch speichert Google bei der Nutzung auch Informationen über euch. Warum also nicht einfach mal eine Alternative ausprobieren? Empfehlung: startpage.com zur Suche nach deutschsprachigen Inhalten, DuckDuckGo bei englischsprachigen nutzen und direkt oben im Browser-Suchfeld einstellen
  • Ein gutes Webhosting mit eigener Domain – Grundlage für vieles Weitere.
    Kosten: 1,50€ im Monat, Aufwand: Gering, Veränderungen: Keine.
    Hier geht es darum, sich einen Brückenkopf im Internet zu schaffen. Einen sicheren Hafen, dem man vertrauen und auf den man sich verlassen kann, der Anlaufpunkt von Außen (also für andere als man selbst) und Ausgangspunkt von innen (also für einen selbst) ist. Meine Empfehlung: Ein uberspace.
  • Selbst verwaltete E-Mail-Adressen – Weg von GMX, Google, Yahoo und den anderen. Kosten: Keine, Aufwand: Gering, Veränderungen: Gering.
    E-Mail ist das wichtigste und beste Kommunikationsmedium. Hierüber laufen nicht nur Newsletter, persönliche Nachrichten oder andere Dinge, die mancher vielleicht „unwichtig“ nennen würde. Es ist auch der Kanal für wichtige Dokumente, die Daten enthalten, die die Privatsphäre berühren und vor allem Passwörter: Wer Kontrolle über das Mail-Konto hat, kann in kürzester Zeit auch auf alle anderen Konten zugreifen, die Identität übernehmen und großen persönlichen und finanziellen Schaden verursachen. Meine Empfehlung: uberspace.
  • RSS-Feeds lesen – Den „richtigen“ Nachrichtenfluss sicherstellen.
    Kosten: Keine, Aufwand: Gering, Veränderungen: Keine.
    Nur aufgrund von Informationen können wir Entscheidungen treffen und uns Meinungen bilden. Also sollten wir auch sicherstellen, dass wir die Nachrichten lesen, die uns interessieren und nicht auf die beschränkt sind, die andere uns lesen lassen möchten.
  • Podcasts hören – In die Tiefe gehen.
    Kosten: Keine, Aufwand: Gering, Veränderungen: Keine.
    Ähnlich wie beim Lesen von Feeds geht es auch hier darum, an Informationen das zu empfangen, was einen selbst interessiert und betrifft. Podcasts können da häufig sehr umfangreich sein und in die Tiefe gehen. Und sie eignen sich besonders für Zeiträume, in denen man zwar beschäftigt ist (nicht lesen kann), aber zuhören kann, z.B. beim Bahn-fahren oder bei der Hausarbeit.
  • Ein freies Betriebssystem auf dem Mobilgerät – Vertrauenswürdige Grundlage
    Kosten: Keine, Aufwand: Mittel, Veränderungen: Mittel.
    Das Leben ohne Handy oder „Smartphone“ ist heute kaum noch denkbar. Es hat zwei Kameras, mehrere Mikrophone, GPS-Ortung, Sensoren für Ausrichtung und Beschleunigung, ist die Plattform für all unsere Kommunikation, ist ständig an und im Netz und wir haben es immer und überall dabei – eine optimale Überwachungswanze. Im Laden gekauft enthält es außer dem „rohen“ Betriebssystem noch sehr viel zusätzliche Software von Betriebssystem-Hersteller, Hardware-Hersteller, Netzbetreiber und Werbe/Vertragspartnern. Das sind sehr viele Akteure, denen man vertrauen muss, dass sie mit dem Handy nicht machen, was sie wollen. Es gibt hier keine perfekte Lösung, aber man kann die Situation zumindest verbessern. Ich empfehle Android Cyanogenmod.
  • Ein freies Betriebssystems auf dem eigenen Rechner – Vertrauenswürdige Grundlage
    Kosten: Keine, Aufwand: Mittel, Veränderungen: Mittel.
    Ganz ähnlich verhält es sich eigentlich auch mit dem (zumindest einstigen) „Hauptrechner“, Stand-PC oder Laptop. Die Empfehlung hier: Linux Mint
  • Überblick über seine eigenen BewgungenWissen und zeigen, wo man war
    Kosten: Keine, Aufwand: Mittel, Veränderungen: Gering.
    Hierbei geht es weniger um Veränderungen. Die meisten von euch werden sich über das Thema bislang wenig gedanken gemacht haben. Es geht eher um Fortentwicklung und Verbesserung. Google hatte mal einen Dienst namens „Latitude“, mit dem man seinen Standort an andere weitergeben konnte, das ist ein Aspekt, ein anderer ist Darstellung von Daten und Werten, die einen betreffen und ein dritter die Erzeugung von Karten, dia als Werkzeug für etwas dienen können.
    Meine Empfehlung: uMap selbst installieren und betreiben.

Ein Wort zu Apple, Google, Facebook, Microsoft, Dropbox

Bei einigen der oben angeführten Punkte ist man leicht versucht zu sagen: „Warum der Aufwand? Geht doch auch jetzt schon super!“, etwa bei E-mails oder Handys. Wenn „jetzt schon“ bedeutet, dass man sich Apple mit einem iPhone ausliefert, Google News als Informationsquelle betrachtet oder sich auf ein Microsoft Windows als Betriebssystem verlässt, dann bin ich da kein Freund von. Man vertraut damit, meist unbewusst, großen und mächtigen Konzernen. Teilweise zahlt man diesen Konzernen nicht mal etwas dafür. Die sind aber (nur!) ihren Aktionären verpflichtet, der Dividende, also ist man nicht der Kunde, sondern die Ware. Darüber hinaus kann man an der Gesetzeslage und Rechtsprechung ihrer Herkunftsländer durchaus seine Zweifel haben, die letzten Jahre haben uns dies gezeigt.

Und da ist man wieder bei der Unabhängigkeit und Freiheit, der eingangs erwähnten Emanzipation.

Das soll für den Anfang genügen. Ein paar weitere wichtige, aber eher fortgeschrittene Punkte, hier in Kürze, ich hoffe sie in Zukunft noch zu erweitern:

  • Eigenes SSL-Zertifikat
  • E-Mail-Verschlüsselung
  • Owncloud statt Dropbox
  • Freier Browser + Plugins
  • Raspberry Pi oder anderen Einplatinencomputer
  • Der Konzern Google (Nest, Maps, Boston Dynamics, Android, Gmail)
  • Friendica, StatusNet und pump.io
  • XMPP/Jabber

Geodaten speichern und darstellen mit uMap

Ziel der ganzen Sache ist, verschiedene Karten, die mit meinem Leben zu tun haben oder die Daten visualisieren, die mich interessieren, zu speichern, sammeln und darzustellen, z.B. Urlaube, CVJM-Freizeiten, Energieinfrastruktur in Deutschland, besuchte Orte, gereiste und mitgetrackte Routen usw.

Dazu will ich uMap benutzen, eine OpenSource-Software, die Django (mit dem GeoDjango-Modul) und Leaflet nutzt und auf django-leaflet-storage und Leaflet.Storage aufbaut. Im Hintergrund soll eine PostgreSQL-Datenbank mit der Erweiterung PostGIS dienen, dazu werden noch die Bibliotheken GEOS und PROJ.4 benötigt.

Bei meinem Hoster uberspace gibt es Anleitungen für PostgreSQL und Django (Python).

Bisher ist leider noch nicht alles geschafft, bisher funktioniert

  • Python/Django
  • PostgreSQL
  • GEOS
  • PROJ.4
  • gdal
  • PostGIS

Es fehlen

  • django-leaflet-storage
  • uMap

Was bisher geschah:

Python

mkdir -p ~/bin ~/lib/python2.7
easy_install-2.7 django pip-2.7
install flup
mkdir ~/html/static
cp -a ~/lib/python2.7/Django-1.6.5-py2.7.egg/django/contrib/admin/static/admin ~/html/static/

PostgreSQL

uberspace-setup-postgresql
createdb friekiwi
createuser --interactive -P
createdb --owner=friekiwi-umap friekiwi-umap

GEOS

in $HOME/python/

wget http://download.osgeo.org/geos/geos-3.4.2.tar.bz2
tar xvjf geos-3.4.2.tar.bz2
cd geos-3.4.2/
./configure --prefix $HOME
make
make install
cd ..

PROJ.4

wget http://download.osgeo.org/proj/proj-4.8.0.tar.gz
tar xvfz proj-4.8.0.tar.gz
cd proj-4.8.0/
./configure --prefix $HOME
make
make install
cd ..

gdal

wget http://download.osgeo.org/gdal/1.11.1/gdal-1.11.1.tar.gz
tar xvazf gdal-1.11.1.tar.gz
cd gdal-1.11.1
./configure --prefix $HOME --with-geosconfig=$HOME/bin/geos-config --with-pg=/package/host/localhost/postgresql-9.2.6-1/bin/pg_config
make && make install
cd ..

PostGIS

wget http://download.osgeo.org/postgis/source/postgis-2.1.4.tar.gz
tar xzf postgis-2.1.4.tar.gz
cd postgis-2.1.4
./configure --with-projdir=$HOME --with-geosconfig=$HOME/bin/geos-config --with-gdalconfig=$HOME/bin/gdal-config
mkdir $HOME/postgis
make && make install DESTDIR=$HOME/postgis REGRESS=1
cd ..

Weitere Vorbereitungen

sed -i 's@\$libdir@$HOME\/postgis\/lib\/postgis-2.1.so@g' $HOME/postgis/share/contrib/postgis/postgis.sql

 

Jetzt muss in der Datei $HOME/service/postgresql/run an der Variablen LD_LIBRARY_PATH vorne der Pfad $HOME/lib/: angefügt werden:

export LD_LIBRARY_PATH=$HOME/lib/:/package/host/localhost/postgresql-${POSTGRESVERSION}/lib/:$LD_LIBRARY_PATH

PostgreSQL neustarten:

svc -du ~/service/postgresql

django-leaflet-storage

pip install django-leaflet-storage

 

uMap

pip install virtualenv

https://wiki.uberspace.de/development:python

https://bitbucket.org/yohanboniface/umap/wiki/Home

pip install virtualenvwrapper

in ~/.bash_profile folgende Zeile, dann entweder neues Terminal oder die Zeile auch direkt selbst im Terminal ausführen

source „$HOME/bin/virtualenvwrapper.sh“

git clone https://bitbucket.org/yohanboniface/umap.git
pip install -r requirements.txt
pip install -e .
cp umap/settings/local.py.sample umap/settings/local.py

 

 

 

Update:

Dank Rays Hinweis konnte ich PostGIS doch noch installieren und danach weitermachen. Die Problematiken, die ich damit hatte (configure: error: could not find proj_api.h you may need to specify the directory of a PROJ.4 installation using withprojdir) (und die der uberspace-Support leider auch nicht ohne weiteres lösen konnte), habe ich daher wieder aus dem Artikel entfernt.

 

Leicht Nachrichten lesen, die Dich interessieren

So, hier nun der erste echte Artikel, der die Kategorie „Anleitung“ eröffnet. Ich möchte Euch einfach, schnell und direkt nachvollziehbar zeigen, wie Ihr die Nachrichten lesen könnt, die Euch interessieren.

1 – Einleitung

rss-abo-12Dazu gibt es schon seit vielen Jahren die sogenannten RSS-Feeds. Das sind  spezielle Web-Adressen, bei denen von Website-Betreibern automatisch alle aktuellen Inhalte in einem bestimmten allgemeinen (man sagt auch „maschinenlesbaren“, im Gegensatz zum normalen nur „menschenlesbaren“) Standard-Format gesammelt werden. Das hat viele Vorteile, unter Anderem können diese Adressen von Programmen automatisch immer wieder abgerufen werden, die Euch dann darüber informieren, was es Neues gibt.

Ihr könnt natürlich auch immer selber auf die Websites gehen und dort die neuesten Nachrichten suchen, aber das ist nicht so bequem wie einfach alle interessanten Neuigkeiten zusammengefasst („aggregiert“), übersichtlich und einheitlich angezeigt zu bekommen.

 

2 – Vorteile

  • Ihr verpasst keine neuen Meldungen, insbesondere von Sites, auf denen sich vielleicht nicht so häufig etwas tut, so dass man sie nicht regelmäßig selbst besuchen würde.
  • Ihr stellt Euch selbst die Nachrichtenquellen zusammen, die zu Euch passen und müsst euch so nicht darauf verlassen, dass jemand anderes genau weiß, für was Ihr euch interessiert (was erstens unwahrscheinlich ist und zweitens auch beängstigend … aber dazu später mehr ;-)).
  • Ihr könnt Nachrichten Filtern, Durchsuchen und als „gelesen“ markieren.

3 – Vorbemerkungen

Es gibt viele Programme, mit denen Ihr RSS-Feeds „abonnieren“ (das kostet nichts!) könnt. Die werden häufig „Feed-Reader“ genannt. Einen habt Ihr aber ziemlich sicher sowieso schon: Euren Web-Browser. Ich zeige Euch jetzt hier, wie Ihr mit einem Add-On noch etwas mehr herausholen könnt und wie das im Einzelnen funktioniert.

Wie immer gilt: Das ist nicht die einzig seelig machende Lösung, sondern meine, die ich Euch empfehle und so aufbereitet habe, dass ich denke, dass sie für jeden verständlich und hilfreich ist und einen guten Start in das Thema darstellt. Bitte schaut Euch um, was es sonst noch für Möglichkeiten gibt und sucht Euch die heraus, die für Euch am besten funktioniert, denn darum geht es: um Euch!

Ich freue mich über Eure Kommentare und Hinweise, z.B. was für Programme Ihr benutzt.

4 – Erster Schritt: Plug-In installieren

rss-abo-2Ich habe in der letzten Zeit hervorragende Erfahrungen mit dem Firefox Plug-In „Digest“ gemacht, also ist das meine Empfehlung an Euch.

rss-abo-3Im Firefox-Menü oben links auf „Add-ons“ klicken, dann „Digest“ suchen und das gefundene installieren, nach Abschluss neu starten.

5 – Zweiter Schritt: Einen Feed abonnieren

rss-abo-8rss-aboNun könnt Ihr auf einer Site, die Feeds anbietet (und das sind mittlerweile sehr viele, zum Beispiel auch diese hier ;)), einen solchen abonnieren, indem Ihr oben rechts das Lesezeichen-Menü öffnet, und „Lesezeichen abonnieren“ auswählt (manchmal bietet eine Seite auch mehrere Feeds mit unterschiedlichem Inhalt an, dann müsst ihr hier den für euch passenden wählen).

Manchmal gibt es auch auf der Seite selber einen Link zum abonnieren, z.B. mit dem bekannten orangen RSS-Icon, den muss man dann nur anklicken.

6 – Dritter Schritt: Den Feed lesen

Das neue Symbol RSS-Knopf oben rechts in der Menüleiste zeigt euch immer aktuell an, wieviele neue Nachrichten es gibt. Wenn ihr es anklickt gelangt ihr in die Leseansicht:

rss-abo-9

In regelmäßigen Abständen schaut Digest nun automatisch im Hintergrund nach, ob es was Neues gibt. Falls ja, wird unten rechts kurz eine Benachrichtigung angezeigt, auch wenn Ihr den Web-Browser gerade nur im Hintergrund mitlaufen habt. So entgeht Euch keine Neuigkeit.

rss-abo-11

7 – So kann es aussehen

Hier noch eine kleine Auswahl aus den Feeds, die ich so mitlese. Insgesamt (nicht hier erkennbar) dürften es so um die hundert sein.

rss-abo-10

In der obersten Zeile, hinter „Alle Einträge“ sind noch zwei Knöpfe, die ich immer eingeschaltet habe, um die Übersicht zu wahren. Außerdem könnt Ihr sehen, dass auch Ordner und Unterordner kein Problem sind, die dann jeweils thematische Zusammenfassungen bieten.

Also surft los und abonniert Eure Lieblings-Neuigkeiten! Verein, Nachrichten, Wetter, Videos, Comics, Pressemeldungen, Fernsehprogramm, Blog-Einträge… alles kein Problem. Viel Spaß in der selbstbestimmten Meldungs-Welt!