Log In
Or create an account -> 
Imperial Library
  • Home
  • About
  • News
  • Upload
  • Forum
  • Help
  • Login/SignUp

Index
Aus dem Lektorat Inhaltsverzeichnis   Vorwort
  Vorwort zur 1. Auflage
Teil I   Grundlagen 1   Das C++-Handbuch
1.1   Neu und modern 1.2   »Dan«-Kapitel 1.3   Darstellung in diesem Buch 1.4   Verwendete Formatierungen 1.5   Sorry for my Denglish
2   Programmieren in C++
2.1   Übersetzen 2.2   Übersetzungsphasen 2.3   Aktuelle Compiler
2.3.1   Gnu C++ 2.3.2   Clang++ von LLVM 2.3.3   Microsoft Visual C++ 2.3.4   Compiler im Container
2.4   Entwicklungsumgebungen 2.5   Die Kommandozeile unter Ubuntu
2.5.1   Ein Programm erstellen 2.5.2   Automatisieren mit Makefile
2.6   Die IDE »Visual Studio Code« unter Windows 2.7   Das Beispielprogramm beschleunigen
3   C++ für Umsteiger 4   Die Grundbausteine von C++
4.1   Ein schneller Überblick
4.1.1   Kommentare 4.1.2   Die »include«-Direktive 4.1.3   Die Standardbibliothek 4.1.4   Die Funktion »main()« 4.1.5   Typen 4.1.6   Variablen 4.1.7   Initialisierung 4.1.8   Ausgabe auf der Konsole 4.1.9   Anweisungen
4.2   Ohne Eile erklärt
4.2.1   Leerräume, Bezeichner und Token 4.2.2   Kommentare 4.2.3   Funktionen und Argumente 4.2.4   Seiteneffekt-Operatoren 4.2.5   Die »main«-Funktion 4.2.6   Anweisungen 4.2.7   Ausdrücke 4.2.8   Zuweisungen 4.2.9   Typen 4.2.10   Variablen – Deklaration, Definition und Initialisierung 4.2.11   Initialisieren mit »auto« 4.2.12   Details zur »include«-Direktive und »include« direkt 4.2.13   Module 4.2.14   Eingabe und Ausgabe 4.2.15   Der Namensraum »std«
4.3   Operatoren
4.3.1   Operatoren und Operanden 4.3.2   Überblick über Operatoren 4.3.3   Arithmetische Operatoren 4.3.4   Bitweise Arithmetik 4.3.5   Zusammengesetzte Zuweisung 4.3.6   Post- und Präinkrement sowie Post- und Prädekrement 4.3.7   Relationale Operatoren 4.3.8   Logische Operatoren 4.3.9   Pointer- und Dereferenzierungsoperatoren 4.3.10   Besondere Operatoren 4.3.11   Funktionsähnliche Operatoren 4.3.12   Operatorreihenfolge
4.4   Eingebaute Datentypen
4.4.1   Übersicht 4.4.2   Eingebaute Datentypen initialisieren 4.4.3   Ganzzahlen 4.4.4   Fließkommazahlen 4.4.5   Wahrheitswerte 4.4.6   Zeichentypen 4.4.7   Komplexe Zahlen
4.5   Undefiniertes und unspezifiziertes Verhalten
5   Guter Code, 1. Dan: Lesbar programmieren
5.1   Kommentare 5.2   Dokumentation 5.3   Einrückungen und Zeilenlänge 5.4   Zeilen pro Funktion und Datei 5.5   Klammern und Leerzeichen 5.6   Namen
6   Höhere Datentypen
6.1   Der Zeichenkettentyp »string«
6.1.1   Initialisierung 6.1.2   Funktionen und Methoden 6.1.3   Andere Stringtypen 6.1.4   Nur zur Ansicht: »string_view«
6.2   Streams
6.2.1   Eingabe- und Ausgabeoperatoren 6.2.2   »getline« 6.2.3   Dateien für die Ein- und Ausgabe 6.2.4   Manipulatoren 6.2.5   Der Manipulator »endl«
6.3   Behälter und Zeiger
6.3.1   Container 6.3.2   Parametrisierte Typen
6.4   Die einfachen Sequenzcontainer
6.4.1   »array« 6.4.2   »vector«
6.5   Algorithmen 6.6   Zeiger und C-Arrays
6.6.1   Zeigertypen 6.6.2   C-Arrays
7   Funktionen
7.1   Deklaration und Definition einer Funktion 7.2   Funktionstyp 7.3   Funktionen verwenden 7.4   Eine Funktion definieren 7.5   Mehr zu Parametern
7.5.1   Call-by-Value 7.5.2   Call-by-Reference 7.5.3   Konstante Referenzen 7.5.4   Aufruf als Wert, Referenz oder konstante Referenz?
7.6   Funktionskörper 7.7   Parameter umwandeln 7.8   Funktionen überladen 7.9   Defaultparameter 7.10   Beliebig viele Argumente 7.11   Alternative Schreibweise zur Funktionsdeklaration 7.12   Spezialitäten
7.12.1   »noexcept« 7.12.2   Inline-Funktionen 7.12.3   »constexpr« 7.12.4   Gelöschte Funktionen 7.12.5   Spezialitäten bei Klassenmethoden
8   Anweisungen im Detail
8.1   Der Anweisungsblock 8.2   Die leere Anweisung 8.3   Deklarationsanweisung 8.4   Die Ausdrucksanweisung 8.5   Die »if«-Anweisung 8.6   Die »while«-Schleife 8.7   Die »do-while«-Schleife 8.8   Die »for«-Schleife 8.9   Die bereichsbasierte »for«-Schleife 8.10   Die »switch«-Verzweigung 8.11   Die »break«-Anweisung 8.12   Die »continue«-Anweisung 8.13   Die »return«-Anweisung 8.14   Die »goto«-Anweisung 8.15   Der »try-catch«-Block und »throw« 8.16   Zusammenfassung
9   Ausdrücke im Detail
9.1   Berechnungen und Seiteneffekte 9.2   Arten von Ausdrücken 9.3   Literale 9.4   Bezeichner 9.5   Klammern 9.6   Funktionsaufruf und Indexzugriff 9.7   Zuweisung 9.8   Typumwandlung
10   Fehlerbehandlung
10.1   Fehlerbehandlung mit Fehlercodes 10.2   Was ist eine Ausnahme?
10.2.1   Ausnahmen auslösen und behandeln 10.2.2   Aufrufstapel abwickeln
10.3   Kleinere Fehlerbehandlungen 10.4   Weiterwerfen – »rethrow« 10.5   Die Reihenfolge im »catch«
10.5.1   Kein »finally« 10.5.2   Exceptions der Standardbibliothek
10.6   Typen für Exceptions 10.7   Wenn eine Exception aus »main« herausfällt
11   Guter Code, 2. Dan: Modularisierung
11.1   Programm, Bibliothek, Objektdatei 11.2   Bausteine 11.3   Trennen der Funktionalitäten 11.4   Ein modulares Beispielprojekt
11.4.1   Namensräume 11.4.2   Implementierung 11.4.3   Die Bibliothek nutzen
Teil II   Objektorientierte Programmierung und mehr 12   Von der Struktur zur Klasse
12.1   Initialisierung 12.2   Rückgabe eigener Typen 12.3   Methoden statt Funktionen 12.4   Das bessere »drucke« 12.5   Eine Ausgabe wie jede andere 12.6   Methoden inline definieren 12.7   Implementierung und Definition trennen 12.8   Initialisierung per Konstruktor
12.8.1   Member-Defaultwerte in der Deklaration 12.8.2   Konstruktor-Delegation 12.8.3   Defaultwerte für die Konstruktorparameter 12.8.4   »init«-Methode nicht im Konstruktor aufrufen 12.8.5   Exceptions im Konstruktor
12.9   Struktur oder Klasse?
12.9.1   Kapselung 12.9.2   »public« und »private«, Struktur und Klasse 12.9.3   Daten mit »struct«, Verhalten mit »class« 12.9.4   Initialisierung von Typen mit privaten Daten
12.10   Zwischenergebnis 12.11   Eigene Datentypen verwenden
12.11.1   Klassen als Werte verwenden 12.11.2   Konstruktoren nutzen 12.11.3   Typumwandlungen 12.11.4   Kapseln und entkapseln 12.11.5   Typen lokal einen Namen geben
12.12   Typinferenz mit »auto« 12.13   Eigene Klassen in Standardcontainern
13   Namensräume und Qualifizierer
13.1   Der Namensraum »std« 13.2   Anonymer Namensraum 13.3   »static« macht lokal 13.4   »static« teilt gern 13.5   Ferne Initialisierung oder »static inline«-Datenfelder 13.6   Garantiert zur Compilezeit initialisiert mit »constinit« 13.7   »static« macht dauerhaft 13.8   »inline namespace« 13.9   Zusammenfassung 13.10   »const«
13.10.1   Const-Parameter 13.10.2   Const-Methoden 13.10.3   Const-Variablen 13.10.4   Const-Rückgaben 13.10.5   »const« zusammen mit »static« 13.10.6   Noch konstanter mit »constexpr« 13.10.7   »if constexpr« für Übersetzungszeit-Entscheidungen 13.10.8   C++20: »consteval« 13.10.9   »if consteval« 13.10.10   Un-Const mit »mutable« 13.10.11   Const-Korrektheit 13.10.12   Zusammenfassung
13.11   Flüchtig mit »volatile«
14   Guter Code, 3. Dan: Testen
14.1   Arten des Tests
14.1.1   Refactoring 14.1.2   Unittests 14.1.3   Sozial oder solitär 14.1.4   Doppelgänger 14.1.5   Suites
14.2   Frameworks
14.2.1   Arrange, Act, Assert 14.2.2   Frameworks zur Auswahl
14.3   Boost.Test 14.4   Hilfsmakros für Assertions 14.5   Ein Beispielprojekt mit Unittests
14.5.1   Privates und öffentliches Testen 14.5.2   Ein automatisches Testmodul 14.5.3   Test kompilieren 14.5.4   Die Testsuite selbst zusammenbauen 14.5.5   Testen von Privatem 14.5.6   Parametrisierte Tests
15   Vererbung
15.1   Beziehungen
15.1.1   Hat-ein-Komposition 15.1.2   Hat-ein-Aggregation 15.1.3   Ist-ein-Vererbung 15.1.4   Ist-Instanz-von versus Ist-ein-Beziehung
15.2   Vererbung in C++ 15.3   Hat-ein versus ist-ein 15.4   Gemeinsamkeiten finden 15.5   Abgeleitete Typen erweitern 15.6   Methoden überschreiben 15.7   Wie Methoden funktionieren 15.8   Virtuelle Methoden 15.9   Konstruktoren in Klassenhierarchien 15.10   Typumwandlung in Klassenhierarchien
15.10.1   Die Vererbungshierarchie aufwärts umwandeln 15.10.2   Die Vererbungshierarchie abwärts umwandeln 15.10.3   Referenzen behalten auch die Typinformation
15.11   Wann virtuell? 15.12   Andere Designs zur Erweiterbarkeit
16   Der Lebenszyklus von Klassen
16.1   Erzeugung und Zerstörung 16.2   Temporary: kurzlebige Werte 16.3   Der Destruktor zum Konstruktor
16.3.1   Kein Destruktor nötig 16.3.2   Ressourcen im Destruktor
16.4   Yoda-Bedingung 16.5   Konstruktion, Destruktion und Exceptions 16.6   Kopieren 16.7   Zuweisungsoperator 16.8   Streichen von Methoden 16.9   Verschiebeoperationen
16.9.1   Was der Compiler generiert
16.10   Operatoren 16.11   Eigene Operatoren in einem Datentyp 16.12   Besondere Klassenformen
16.12.1   Abstrakte Klassen und Methoden 16.12.2   Aufzählungsklassen
17   Guter Code, 4. Dan: Sicherheit, Qualität und Nachhaltigkeit
17.1   Die Nullerregel
17.1.1   Die großen Fünf 17.1.2   Hilfskonstrukt per Verbot 17.1.3   Die Nullerregel und ihr Einsatz 17.1.4   Ausnahmen von der Nullerregel 17.1.5   Nullerregel, Dreierregel, Fünferregel, Viereinhalberregel
17.2   RAII – Resource Acquisition Is Initialization
17.2.1   Ein Beispiel mit C 17.2.2   Besitzende Raw-Pointer 17.2.3   Von C nach C++ 17.2.4   Es muss nicht immer eine Exception sein 17.2.5   Mehrere Konstruktoren 17.2.6   Mehrphasige Initialisierung 17.2.7   Definieren, wo es gebraucht wird 17.2.8   Nothrow-new
18   Spezielles für Klassen
18.1   Dürfen alles sehen – »friend«-Klassen 18.2   Non-public-Vererbung
18.2.1   Auswirkungen auf die Außenwelt 18.2.2   Nicht öffentliche Vererbung in der Praxis
18.3   Signaturklassen als Interfaces 18.4   Multiple Vererbung
18.4.1   Multiple Vererbung in der Praxis 18.4.2   Achtung bei Typumwandlungen von Zeigern 18.4.3   Das Beobachter-Muster als praktisches Beispiel
18.5   Rautenförmige multiple Vererbung – »virtual« für Klassenhierarchien 18.6   Literale Datentypen – »constexpr« für Konstruktoren
19   Guter Code, 5. Dan: Klassisches objektorientiertes Design
19.1   Objekte in C++ 19.2   Objektorientiert designen
19.2.1   SOLID 19.2.2   Seien Sie nicht STUPID
Teil III   Fortgeschrittene Themen 20   Zeiger
20.1   Adressen 20.2   Zeiger 20.3   Gefahren von Aliasing 20.4   Heapspeicher und Stapelspeicher
20.4.1   Der Stapel 20.4.2   Der Heap
20.5   Smarte Pointer
20.5.1   »unique_ptr« 20.5.2   »shared_ptr«
20.6   Rohe Zeiger 20.7   C-Arrays
20.7.1   Rechnen mit Zeigern 20.7.2   Verfall von C-Arrays 20.7.3   Dynamische C-Arrays 20.7.4   Zeichenkettenliterale
20.8   Iteratoren 20.9   Zeiger als Iteratoren 20.10   Zeiger im Container 20.11   Die Ausnahme: wann das Wegräumen nicht nötig ist
21   Makros
21.1   Der Präprozessor 21.2   Vorsicht vor fehlenden Klammern 21.3   Featuremakros 21.4   Information über den Quelltext 21.5   Warnung vor Mehrfachausführung 21.6   Typvariabilität von Makros 21.7   Zusammenfassung
22   Schnittstelle zu C
22.1   Mit Bibliotheken arbeiten 22.2   C-Header 22.3   C-Ressourcen 22.4   »void«-Pointer 22.5   Daten lesen 22.6   Das Hauptprogramm 22.7   Zusammenfassung
23   Templates
23.1   Funktionstemplates
23.1.1   Überladung 23.1.2   Ein Typ als Parameter 23.1.3   Funktionskörper eines Funktionstemplates 23.1.4   Werte als Templateparameter 23.1.5   Viele Funktionen 23.1.6   Parameter mit Extras 23.1.7   Methodentemplates sind auch nur Funktionstemplates
23.2   Funktionstemplates in der Standardbibliothek
23.2.1   Ranges statt Container als Templateparameter 23.2.2   Beispiel: Informationen über Zahlen
23.3   Eine Klasse als Funktion
23.3.1   Werte für einen »function«-Parameter 23.3.2   C-Funktionspointer 23.3.3   Die etwas andere Funktion 23.3.4   Praktische Funktoren 23.3.5   Algorithmen mit Funktoren 23.3.6   Anonyme Funktionen alias Lambda-Ausdrücke 23.3.7   Templatefunktionen ohne »template«, aber mit »auto«
23.4   C++ Concepts
23.4.1   Wie Sie Concepts lesen 23.4.2   Wie Sie Concepts anwenden 23.4.3   Wie Sie Concepts schreiben 23.4.4   Semantische Einschränkungen 23.4.5   Zusammenfassung
23.5   Templateklassen
23.5.1   Klassentemplates implementieren 23.5.2   Methoden von Klassentemplates implementieren 23.5.3   Objekte aus Klassentemplates erzeugen 23.5.4   Klassentemplates mit mehreren formalen Datentypen 23.5.5   Klassentemplates mit Non-Type-Parameter 23.5.6   Klassentemplates mit Default 23.5.7   Klassentemplates spezialisieren
23.6   Templates mit variabler Argumentanzahl 23.7   Eigene Literale
23.7.1   Was sind Literale? 23.7.2   Namensregeln 23.7.3   Phasenweise 23.7.4   Überladungsvarianten 23.7.5   Benutzerdefiniertes Literal mittels Template 23.7.6   Roh oder gekocht 23.7.7   Automatisch zusammengefügt 23.7.8   Unicodeliterale
Teil IV   Die Standardbibliothek 24   Container
24.1   Grundlagen
24.1.1   Wiederkehrend 24.1.2   Abstrakt 24.1.3   Operationen 24.1.4   Komplexität 24.1.5   Container und ihre Iteratoren 24.1.6   Ranges vereinfachen Iteratoren 24.1.7   Ranges, Views, Concepts, Adapter, Generatoren und Algorithmen 24.1.8   Algorithmen
24.2   Iteratoren-Grundlagen
24.2.1   Iteratoren aus Containern 24.2.2   Mehr Funktionalität mit Iteratoren
24.3   Allokatoren: Speicherfragen 24.4   Containergemeinsamkeiten 24.5   Ein Überblick über die Standardcontainerklassen
24.5.1   Typaliase der Container
24.6   Die sequenziellen Containerklassen
24.6.1   Gemeinsamkeiten und Unterschiede 24.6.2   Methoden von Sequenzcontainern 24.6.3   »vector« 24.6.4   »array« 24.6.5   »deque« 24.6.6   »list« 24.6.7   »forward_list«
24.7   Assoziativ und geordnet
24.7.1   Gemeinsamkeiten und Unterschiede 24.7.2   Methoden der geordneten assoziativen Container 24.7.3   »set« 24.7.4   »map« 24.7.5   »multiset« 24.7.6   »multimap«
24.8   Nur assoziativ und nicht garantiert
24.8.1   Gemeinsamkeiten und Unterschiede 24.8.2   Methoden der ungeordneten assoziativen Container 24.8.3   »unordered_set« 24.8.4   »unordered_map« 24.8.5   »unordered_multiset« 24.8.6   »unordered_multimap«
24.9   Containeradapter 24.10   Sonderfälle: »string«, »basic_string« und »vector<char>« 24.11   Sonderfälle: »vector<bool>«, »array<bool,n>« und »bitset<n>«
24.11.1   Dynamisch und kompakt: »vector<bool>« 24.11.2   Statisch: »array<bool,n>« und »bitset<n>«
24.12   Sonderfall: Value-Array mit »valarray<>«
25   Containerunterstützung
25.1   Algorithmen 25.2   Iteratoren und Ranges 25.3   Iteratoradapter 25.4   Algorithmen der Standardbibliothek 25.5   Parallele Ausführung 25.6   Liste der Algorithmusfunktionen und Range-Adapter 25.7   Elemente verknüpfende Algorithmen aus »<numeric>« und »<ranges>« 25.8   Kopie statt Zuweisung – Werte in uninitialisierten Speicherbereichen 25.9   Eigene Algorithmen 25.10   Eigene Views und Range-Adapter schreiben
26   Guter Code, 6. Dan: Für jede Aufgabe der richtige Container
26.1   Alle Container nach Aspekten sortiert
26.1.1   Wann ist ein »vector« nicht die beste Wahl? 26.1.2   Immer sortiert: »set«, »map«, »multiset« und »multimap« 26.1.3   Im Speicher hintereinander: »vector«, »array« 26.1.4   Einfügung billig: »list« 26.1.5   Wenig Speicheroverhead: »vector«, »array« 26.1.6   Größe dynamisch: alle außer »array«
26.2   Rezepte für Container
26.2.1   Zwei Phasen? »vector« als guter »set«-Ersatz 26.2.2   Den Inhalt eines Containers auf einem Stream ausgeben 26.2.3   So statisch ist »array« gar nicht
26.3   Algorithmen je nach Container unterschiedlich implementieren
27   Streams, Dateien und Formatierung
27.1   Ein- und Ausgabekonzept mit Streams 27.2   Globale, vordefinierte Standardstreams 27.3   Methoden für die Aus- und Eingabe von Streams
27.3.1   Methoden für die unformatierte Ausgabe 27.3.2   Methoden für die (unformatierte) Eingabe
27.4   Fehlerbehandlung und Zustand von Streams
27.4.1   Methoden für die Behandlung von Fehlern bei Streams
27.5   Streams manipulieren und formatieren
27.5.1   Manipulatoren 27.5.2   Eigene Manipulatoren ohne Argumente erstellen 27.5.3   Eigene Manipulatoren mit Argumenten erstellen 27.5.4   Format-Flags direkt ändern
27.6   Streams für die Dateiein- und Dateiausgabe
27.6.1   Die Streams »ifstream«, »ofstream« und »fstream« 27.6.2   Verbindung zu einer Datei herstellen 27.6.3   Lesen und Schreiben 27.6.4   Wahlfreier Zugriff 27.6.5   Synchronisierte Streams für Threads
27.7   Streams für Strings 27.8   Streampuffer 27.9   »filesystem« 27.10   Formatieren
27.10.1   Einfache Formatierung 27.10.2   Eigene Typen formatieren
28   Standardbibliothek – Extras
28.1   »pair« und »tuple«
28.1.1   Mehrere Werte zurückgeben
28.2   Reguläre Ausdrücke
28.2.1   Matchen und Suchen 28.2.2   Ergebnis und Teile davon 28.2.3   Gefundenes Ersetzen 28.2.4   Reich an Varianten 28.2.5   Iteratoren 28.2.6   Matches 28.2.7   Optionen 28.2.8   Geschwindigkeit 28.2.9   Standardsyntax leicht gekürzt 28.2.10   Anmerkungen zu regulären Ausdrücken in C++
28.3   Zufall
28.3.1   Einen Würfel werfen 28.3.2   Echter Zufall 28.3.3   Andere Generatoren 28.3.4   Verteilungen
28.4   Mathematisches
28.4.1   Brüche und Zeiten – »<ratio>« und »<chrono>« 28.4.2   Vordefinierte Suffixe für benutzerdefinierte Literale
28.5   Systemfehlerbehandlung mit »system_error«
28.5.1   »error_code« und »error_condition« 28.5.2   Fehlerkategorien 28.5.3   Eigene Fehlercodes 28.5.4   »system_error«-Exception
28.6   Laufzeittypinformationen – »<typeinfo>« und »<typeindex>« 28.7   Hilfsklassen rund um Funktoren – »<functional>«
28.7.1   Funktionsobjekte 28.7.2   Funktionsgeneratoren
28.8   »optional« für einen oder keinen Wert 28.9   »variant« für einen von mehreren Typen 28.10   »any« hält jeden Typ 28.11   Spezielle mathematische Funktionen 28.12   Schnelle Umwandlung mit »<charconv>«
29   Threads – Programmieren mit Mehrläufigkeit
29.1   C++-Threading-Grundlagen
29.1.1   Einer Threadfunktion Parameter übergeben 29.1.2   Einen Thread verschieben 29.1.3   Wie viele Threads starten? 29.1.4   Welcher Thread bin ich?
29.2   Gemeinsame Daten
29.2.1   Data Races 29.2.2   Riegel 29.2.3   Barrieren 29.2.4   Mutexe 29.2.5   Interface-Design für Multithreading 29.2.6   Sperren können zum Patt führen 29.2.7   Flexibleres Sperren mit »unique_lock«
29.3   Andere Möglichkeiten zur Synchronisation
29.3.1   Nur einmal aufrufen mit »once_flag« und »call_once« 29.3.2   Sperren zählen mit »recursive_mutex«
29.4   Im eigenen Speicher mit »thread_local« 29.5   Mit »condition_variable« auf Ereignisse warten 29.6   Einmal warten mit »future«
29.6.1   Ausnahmebehandlung bei »future« 29.6.2   »promise«
29.7   Atomics 29.8   Koroutinen
29.8.1   Koroutinen im Compiler 29.8.2   Generator 29.8.3   Koroutinen mit »promise_type«
29.9   Zusammenfassung
A   Guter Code, 7. Dan: Richtlinien
A.1   Guideline Support Library A.2   C++ Core Guidelines
A.2.1   Motivation A.2.2   Typsicherheit A.2.3   Nutzen Sie RAII A.2.4   Klassenhierarchien A.2.5   Generische Programmierung A.2.6   Lassen Sie sich nicht von Anachronismen verwirren
B   Cheat Sheet Stichwortverzeichnis Rechtliche Hinweise Über den Autor
  • ← Prev
  • Back
  • Next →
  • ← Prev
  • Back
  • Next →

Chief Librarian: Las Zenow <zenow@riseup.net>
Fork the source code from gitlab
.

This is a mirror of the Tor onion service:
http://kx5thpx2olielkihfyo4jgjqfb7zx7wxr3sd4xzt26ochei4m6f7tayd.onion