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

Index
Aus dem Lektorat Inhaltsverzeichnis   Materialien zum Buch 1   Einführung
1.1   Für wen ist dieses Buch geschrieben? 1.2   Der Aufbau des Buches
1.2.1   Teil I: Grundlagen 1.2.2   Teil II: Die Sprache PL/SQL 1.2.3   Teil III: PL/SQL im Einsatz
1.3   Vorwort zur vierten Auflage
2   Verwendete Werkzeuge und Ressourcen
2.1   Oracles Online-Dokumentation
2.1.1   Wo finde ich die benötigten Informationen? 2.1.2   PL/SQL-Grundlagen 2.1.3   Oracle-Packages 2.1.4   Weiterführende Literatur
2.2   Aufsetzen einer Beispieldatenbank 2.3   SQL*Plus 2.4   SQLCL 2.5   SQL Developer 2.6   »explain plan« 2.7   Autotrace 2.8   Runstats 2.9   Trace und tkprof 2.10   Debugger 2.11   Weitere Werkzeuge 2.12   Die Beispielskripte
Teil I   Grundlagen 3   Aufbau der Datenbank aus Sicht eines Programmierers
3.1   Grundlegende Arbeitsweise der Datenbank
3.1.1   Anforderungen an ein Datenbankmanagementsystem 3.1.2   Lesekonsistenz 3.1.3   Die Begriffe »Datenbank«, »Schema« und »Tablespace« 3.1.4   Systemtabellen, Data Dictionary und Privilegien 3.1.5   Die Sicht der Anwendung auf die Datenbank
3.2   Logischer Aufbau: Schema, Tablespace und Co.
3.2.1   Schema 3.2.2   Tablespace 3.2.3   Auswirkungen auf die Architektur einer Applikation
3.3   Die physikalische Datenbank
3.3.1   Datendateien 3.3.2   Redo-Log-Dateien 3.3.3   Kontrolldatei 3.3.4   Parameterdatei 3.3.5   Passwortdatei
3.4   Instanz und Speicherstrukturen
3.4.1   Die Speicherbereiche der SGA 3.4.2   Shared Pool 3.4.3   Die Hintergrundprozesse
3.5   Containerdatenbank 3.6   Start der Datenbank 3.7   Verbindungsaufbau zur Datenbank
3.7.1   Verbindungsarten und Treiber 3.7.2   Dedicated-Server-Verbindung 3.7.3   Shared-Server-Verbindung 3.7.4   Database Resident Connection Pool 3.7.5   Und nun? Entscheidungshilfen für den Verbindungsaufbau
4   Datenbankobjekte und SQL
4.1   Tabellen
4.1.1   Heap Organized Table 4.1.2   Index Organized Table 4.1.3   Temporäre Tabellen 4.1.4   Partitionierte Tabellen
4.2   Index
4.2.1   Anmerkung zur Benutzung von Indizes 4.2.2   B*-Baum-Index 4.2.3   Reverse-Key-Index 4.2.4   Funktionsbasierter Index
4.3   Views und Materialized Views
4.3.1   Views 4.3.2   Materialized Views
4.4   PL/SQL-Programm 4.5   Sonstige Datenbankobjekte
4.5.1   Sequenzen 4.5.2   Synonym 4.5.3   Datenbanklink 4.5.4   Große Datenmengen: »CLOB«, »NCLOB«, »BLOB« und »BFile« 4.5.5   Benutzerdefinierte Typen, XML, JSON 4.5.6   Weitere Datenbankobjekte
4.6   Exkurs: Zeichensatzcodierung
4.6.1   Zeichensatzcodierung im Überblick 4.6.2   Zeichensatzcodierung bei Oracle
4.7   Mächtigkeit von SQL
4.7.1   Analytische Funktionen 4.7.2   Hierarchische Abfragen 4.7.3   Error-Logging 4.7.4   Fazit
5   Datensicherheit, -konsistenz und Transaktion
5.1   Lese- und Schreibkonsistenz
5.1.1   Lesekonsistenz 5.1.2   Schreibkonsistenz
5.2   Transaktion
5.2.1   Transaktion zum Schutz der Lesekonsistenz 5.2.2   Transaktion zur Definition eines Geschäftsfalls 5.2.3   Zusammenfassung
5.3   Datenkonsistenz und referenzielle Integrität
5.3.1   Datenintegrität 5.3.2   Performance-Überlegungen zu Datenbank-Constraints 5.3.3   Datenkonsistenz 5.3.4   Zusammenfassung
5.4   Explizites Sperren von Daten durch die Anwendung
5.4.1   Das Problem: Lost Updates 5.4.2   Das optimistische Sperren 5.4.3   Das pessimistische Sperren 5.4.4   Das vorsichtig optimistische Sperren 5.4.5   Und nun? Wann sollten Sie welche Sperrstrategie verwenden?
5.5   Verarbeitung einer SQL-Anweisung
5.5.1   Parsen und Optimierung 5.5.2   Datenlieferung über Cursor
5.6   Die Sperrmechanismen von Oracle
5.6.1   Locks 5.6.2   Latches
5.7   Datensicherheit 5.8   Workshop: Einfluss der Programmierung
5.8.1   Das Ziel unserer Programmierung 5.8.2   Implementierung des Tests
6   Programmierung der Datenbank
6.1   Erweiterung der Datenbankfunktionalität 6.2   Programmierung der Datenkonsistenz
6.2.1   Datenbanktrigger 6.2.2   Datenzugriff über PL/SQL 6.2.3   Datenkonsistenz jenseits referenzieller Integrität
6.3   Programmierung der Datensicherheit 6.4   Anwendungsprogrammierung mit PL/SQL
6.4.1   PL/SQL auf der Client-Seite
6.5   Unterstützung der Administration durch PL/SQL
6.5.1   Einsatz von PL/SQL in Skripten 6.5.2   Verwaltung wiederkehrender Aufgaben mit Scheduler und Jobs 6.5.3   Datenbanktrigger im Umfeld der Datensicherung und des Auditings
Teil II   Die Sprache PL/SQL 7   Die Blockstruktur und Syntax von PL/SQL
7.1   Das Grundgerüst: der PL/SQL-Block
7.1.1   Deklaration von Variablen 7.1.2   Schachtelung von Blöcken zur Fehlerbehandlung 7.1.3   Gültigkeitsbereich von Variablen
7.2   Prozeduren
7.2.1   Prozeduren mit Parametern 7.2.2   Formen der Parameterzuweisung 7.2.3   Optionale Parameter 7.2.4   Beliebig viele Parameter an eine Methode übergeben
7.3   Funktionen 7.4   Datenbanktrigger 7.5   Packages
7.5.1   Package-Spezifikation 7.5.2   Package-Körper 7.5.3   Aufruf von Prozeduren und Methoden in Packages
7.6   Ausführungsrechte von PL/SQL-Blöcken 7.7   Compiler-Anweisungen (Pragma)
7.7.1   Die autonome Transaktion 7.7.2   Initialisierung eigener Fehler
7.8   Best Practices
8   Kontrollstrukturen
8.1   Auswertende Anweisung 1 (»if then else«-Anweisung) 8.2   Auswertende Anweisung 2 (»case«-Anweisung)
8.2.1   Einfache »case«-Anweisung 8.2.2   Aufruf der »case«-Anweisung als SQL-Ausdruck 8.2.3   Die auswertende »case«-Anweisung
8.3   Einfache Schleifen
8.3.1   Basisschleife (Schleife) 8.3.2   Abweisende Schleife 1 (»for«-Schleife) 8.3.3   Abweisende Schleife 2 (»while«-Schleife) 8.3.4   Best Practices
8.4   Konditionale Kompilierung
8.4.1   Die Auswahldirektive (Selection Directive) 8.4.2   Die Abfragedirektive (Inquiry Directive) 8.4.3   Die Errordirektive (Error Directive)
8.5   Aus der Mottenkiste: Konzepte, die Sie nicht verwenden sollten
8.5.1   Label 8.5.2   »continue«- und »goto«-Anweisung
9   Datentypen in PL/SQL
9.1   Skalare Datentypen
9.1.1   SQL-Datentypen 9.1.2   Abweichende Größen von PL/SQL-Datentypen 9.1.3   Basistypen und Untertypen in PL/SQL 9.1.4   SQL-Datentypen, die in PL/SQL nicht existieren 9.1.5   PL/SQL-Datentypen, die in SQL nicht existieren 9.1.6   Objektorientierte Typen 9.1.7   Benutzerdefinierte Datentypen 9.1.8   Ableitung von Variablentypen aus dem Data Dictionary
9.2   Kollektionen in PL/SQL
9.2.1   Record 9.2.2   Assoziative Tabellen 9.2.3   Massenverarbeitung mit assoziativen Tabellen 9.2.4   »VARRAY« oder »NESTED_TABLE« als Alternative zu einer assoziativen Tabelle
9.3   Cursor
10   Cursor
10.1   Lebenszyklus eines Cursors
10.1.1   Deklaration eines Cursors 10.1.2   Lesen eines Datensatzes aus dem Cursor 10.1.3   Schließen des Cursors
10.2   Cursor-Attribute 10.3   Parametrisierte Cursor 10.4   Mengenverarbeitung mit »bulk collect« 10.5   Kurzform: die »cursor for«-Schleife 10.6   Implizite versus explizite Cursor
10.6.1   Implizite oder explizite Cursor 10.6.2   Implizite oder explizite Cursor-Kontrolle
10.7   Cursor-Variablen (»ref«-Cursor)
10.7.1   Starke Cursor-Variable 10.7.2   Schwache Cursor-Variable
10.8   Cursor-Ausdrücke 10.9   Gemeinsamer Zugriff auf Daten über verteilte Cursor 10.10   Tabellenfunktionen
10.10.1   Was ist eine Tabellenfunktion? 10.10.2   Workshop: Tabellenfunktion 10.10.3   Verwendung von Tabellenfunktionen 10.10.4   Workshop: Erstellung einer Tabellenfunktion 10.10.5   Polymorphe Tabellenfunktion
11   Events in der Datenbank: Programmierung von Triggern
11.1   DML-Trigger
11.1.1   Anweisungs- versus Zeilentrigger 11.1.2   Der Triggerkörper 11.1.3   Wann wird ein Trigger ausgelöst? 11.1.4   Das Mutating-Table-Problem 11.1.5   Compound Trigger 11.1.6   Workshop: Lösung des Mutating-Table-Problems mit einem Compound Trigger 11.1.7   Cross Edition Trigger 11.1.8   Benennungskonvention von Triggern
11.2   »instead of«-Trigger 11.3   Einsatzbereiche von DML-Triggern
11.3.1   Erweiterung der Datenkonsistenzprüfung über Constraints hinaus 11.3.2   Workshop: Statusänderungen in einer bestimmten Reihenfolge durchführen 11.3.3   Implementierung einfacher Geschäftsregeln 11.3.4   Historisierung, Logging und Auditing von Daten 11.3.5   Workshop: generisches Logging 11.3.6   Workshop: Historisierung von Daten mit einem »instead of«-Trigger
11.4   Wann Sie DML-Trigger nicht verwenden sollten
11.4.1   Auditing mithilfe von Triggern 11.4.2   Schutz der Datenintegrität
11.5   Datenbanktrigger
11.5.1   Ereignisattribute 11.5.2   Datenbankereignisse 11.5.3   Benutzerbezogene Ereignisse 11.5.4   DDL-Ereignisse 11.5.5   Systemereignisse
11.6   Zusammenfassung
12   Packages
12.1   Trennung von öffentlicher und privater Logik
12.1.1   Deklaration 12.1.2   Implementierung 12.1.3   Zusammenfassung
12.2   Überladung in Packages
12.2.1   Deklaration 12.2.2   Implementierung 12.2.3   Zusammenfassung
12.3   Ausführungsrechte von Packages
12.3.1   Rollen und Berechtigungskonzepte 12.3.2   Erweiterungen des Aufruferrechte-Berechtigungskonzepts 12.3.3   Steuerung des Zugriffs auf ein Package
12.4   Packages und die Dependency Chain 12.5   Verschlüsselung von Package-Code
12.5.1   Das »wrap«-Utility 12.5.2   Verwendung des Packages »dbms_ddl«
12.6   Oracle-Packages
12.6.1   Das Package »standard« 12.6.2   Wichtige Oracle-Packages
12.7   Workshop: Verwaltung von Anwendungsparametern
12.7.1   Das Problem und die Lösungsidee 12.7.2   Vorüberlegungen zur Parametertabelle 12.7.3   Die Parametertabelle 12.7.4   Einrichtung der Parametertabelle und der Zugriffsrechte 12.7.5   Das Parameter-Package 12.7.6   Das Package im Einsatz
13   Erweiterung von SQL
13.1   Wann SQL erweitert werden sollte
13.1.1   Bleiben Sie auf dem aktuellen Wissensstand 13.1.2   Voraussetzungen für die Erweiterung von SQL
13.2   SQL durch eigene Funktionen erweitern
13.2.1   Anforderungen an den PL/SQL-Block 13.2.2   Nebenwirkungsfreiheit (Purity) 13.2.3   Optimizer Hints und Klauseln 13.2.4   Das Pragma »restrict_references« 13.2.5   Workshop: deterministische Funktion
13.3   Workshop: Berechnung der Fakultät
13.3.1   Einschränkung der Fakultätsfunktion auf definierte Werte 13.3.2   Zielvorgabe 13.3.3   Und was ist mit Rekursion?
13.4   Gruppenfunktionen selbst erstellen
13.4.1   Arbeitsweise von Gruppenfunktionen 13.4.2   Workshop: Erstellung einer Gruppenfunktion 13.4.3   Test der Gruppenfunktion 13.4.4   Zusammenfassung
13.5   Workshop: Code-Generator für Gruppenfunktionen
14   Dynamisches SQL
14.1   Dynamisches SQL mittels »execute immediate«
14.1.1   Verwendung von Bindevariablen
14.2   Dynamisches SQL mit Cursor-Variablen 14.3   Workshop: Erstellung einer Prozedur als Schnittstelle zu einem externen Programm
14.3.1   Die Aufgabenstellung 14.3.2   Der Lösungsansatz 14.3.3   Vorbereitende Arbeiten 14.3.4   Die Prozedur für den Datenzugriff
14.4   DBMS_SQL-Package
14.4.1   Workshop: Code-Generator
14.5   Sicherheit bei dynamischem SQL
14.5.1   SQL-Injection über Suchparameter 14.5.2   SQL-Injection über Formatangaben 14.5.3   SQL-Injection über das Einschmuggeln zusätzlicher Anweisungen 14.5.4   Vermeidung von SQL-Injection 1: Bindevariablen 14.5.5   Vermeidung von SQL-Injection 2: »dbms_assert«
14.6   SQL-Makros
14.6.1   Skalare SQL-Makros 14.6.2   Tabellen-SQL-Makros
14.7   Polymorphe Tabellenfunktionen
14.7.1   Ein erstes Beispiel 14.7.2   Beispiel 2: Konvertierung in JSON oder XML 14.7.3   Mehrere PTF in einem Package 14.7.4   PTF zum Erzeugen neuer Zeilen 14.7.5   PTF und der Execution Store (XSTORE)
15   Exception
15.1   Oracle-Fehler
15.1.1   Benannte Fehler 15.1.2   sqlerrm- und sqlcode-Funktionen und der Fehler-Stack 15.1.3   Nicht benannte Fehler benennen
15.2   Applikationsfehler erstellen und bearbeiten
15.2.1   Fehler direkt mit »raise_application_error« erzeugen 15.2.2   Fehler aus einem Fehler-Package erstellen lassen 15.2.3   Zentralisierung der Fehlermeldungen über »lmsgen« 15.2.4   Workshop: Wrapper-Package um »utl_lms« 15.2.5   Zusammenfassung: Fehlermeldungen mit »utl_lms«
15.3   Workshop: zentralisierter Fehler-Handler mit einem Trigger 15.4   Zusammenfassung
Teil III   PL/SQL im Einsatz 16   Arbeiten mit LOBs (Large Objects)
16.1   Technische Struktur
16.1.1   Einsatz von LOB-Datentypen in der Datenbank 16.1.2   LOB als PL/SQL-Variable 16.1.3   LOB als Methodenparameter 16.1.4   SecureFiles
16.2   Die Datentypen »CLOB«, »NCLOB«, »BLOB« und »BFILE«
16.2.1   CLOB und NCLOB 16.2.2   Der binäre Datentyp »BLOB« 16.2.3   BFile
16.3   Das Package »DBMS_LOB«
16.3.1   Schreibzugriff auf temporäre oder persistente LOBs 16.3.2   Verwaltung temporärer und persistenter LOBs 16.3.3   API für BFile-LOB 16.3.4   Zugriff auf LOBs durch die Anwendung
16.4   Workshop: Hilfsfunktionen zum Arbeiten mit LOBs
17   Arbeiten mit XML
17.1   Der Datentyp »XMLType«
17.1.1   Verwendung von »XMLType« als Tabellen- oder Spaltentyp 17.1.2   »XMLType«-Member-Functions 17.1.3   Umformung von XML mittels XSLT
17.2   Die Speicherung von XML-Daten in der Datenbank 17.3   XML aus relationalen Daten erzeugen
17.3.1   Der SQL/XML-Standard 17.3.2   Das Package »DBMS_XMLGEN«
17.4   Relationale Daten aus XML extrahieren
17.4.1   Extraktion relationaler Daten mit »XMLTable« 17.4.2   Extraktion relationaler Daten mittels Objektorientierung
17.5   XML mit PL/SQL verarbeiten
17.5.1   Die Programmierung mittels DOM-Baum 17.5.2   Die XML-Packages
17.6   Die XML-Datenbank
17.6.1   Einführung in die XML-Datenbank 17.6.2   Speicherung und Veröffentlichung binärer Dokumente und XML-Dokumente 17.6.3   Dokumente über XDB verwalten 17.6.4   Zugriffsschutz und Sicherheit von XDB 17.6.5   Versionierung von Ressourcen
18   Arbeiten mit JSON
18.1   JSON
18.1.1   Überblick: Was ist JSON? 18.1.2   Der Datentyp JSON 18.1.3   Der Datentyp JSON (revisited) 18.1.4   Abfragen gegen JSON-Instanzen 18.1.5   JSON Data Guide
18.2   Programmierung von JSON mit PL/SQL
18.2.1   Übersicht über die PL/SQL-JSON-Typen 18.2.2   Objektmethoden 18.2.3   Manipulation mittels APEX-Packages
18.3   SODA (Simple Oracle Document Access)
18.3.1   SODA-Kollektion 18.3.2   SODA-Operationen 18.3.3   SODA-Dokument 18.3.4   SODA und Transaktionen
19   Objektorientierung
19.1   Einführung in die Objektorientierung
19.1.1   Alles ist ein Objekt 19.1.2   Das zweite Reizwort: Vererbung! 19.1.3   Abstrakte und finale Klassen 19.1.4   Statische Methoden 19.1.5   Objektidentität versus »Statement of Truth« 19.1.6   Klassen haben komplexe Strukturen 19.1.7   Auswirkungen auf die Datenbankprogrammierung
19.2   Objektorientierte Datentypen
19.2.1   »object« 19.2.2   »varray« 19.2.3   »nested table« 19.2.4   Vergleiche von Kollektionen 19.2.5   Methoden von Kollektionstypen 19.2.6   Workshop: Liste von Werten übergeben
19.3   Objektorientierte Datenmodelle 19.4   Workshop: der Datentyp »MoneyType«
19.4.1   Vorüberlegungen 19.4.2   Implementierung des Typs »MoneyType« 19.4.3   Der Typkörper 19.4.4   Implementierung des Packages »moneytype_pkg« 19.4.5   Der Package-Körper 19.4.6   Die Rechtesituation ab Version 11g 19.4.7   Erweiterung durch Vererbung
19.5   Objektorientierte Anwendungsentwicklung und relationale Datenbanken
19.5.1   Das Problem des Impedance Mismatch 19.5.2   Lösungsansatz 1: die Vision der generischen Datenbank 19.5.3   Lösungsansatz 2: objektrelationale Mapping-Werkzeuge 19.5.4   Lösungsansatz 3: das »Smart-Database«-Paradigma
20   Integration von Oracle in Applikationen
20.1   Sperrung von Daten bei der Datenänderung
20.1.1   Transaktionsschutz innerhalb der Datenbank 20.1.2   Erweiterter Fokus: Datensicherung im Umfeld von Anwendungen 20.1.3   Pessimistisches Locking 20.1.4   Optimistisches Sperren 20.1.5   Kombination aus optimistischem und pessimistischem Sperren 20.1.6   Database-Change-Notification-basiertes Locking
20.2   Speicherung von Session-Informationen
20.2.1   Grundlagen eines Kontextes 20.2.2   Session-Kontext 20.2.3   Globally Accessed Context 20.2.4   Workshop: Package zur Verwaltung von Kontexten
20.3   Zugriff auf Daten über PL/SQL-Packages
20.3.1   Kapselung von DML-Operationen in Packages 20.3.2   Vermeidung von Triggern durch Packages 20.3.3   Integration datenbezogener Geschäftsregeln
20.4   Workshop: Keimzelle einer sicheren Datenbankanwendung
20.4.1   Das Projekt 20.4.2   Übersicht über die Architektur 20.4.3   Die »logon«-Prozedur 20.4.4   Aufsetzen der Schemata 20.4.5   Die Packages 20.4.6   Test der Architektur 20.4.7   Zusammenfassung und Ausblick
21   Performance-Tuning und Codeanalyse
21.1   Regeln zur Performance-Optimierung
21.1.1   Nutzen Sie SQL, falls dies möglich ist 21.1.2   Betrachten Sie die Datenbank als entfernte Ressource 21.1.3   Benutzen Sie Bindevariablen 21.1.4   Arbeiten Sie mengenorientiert 21.1.5   Bereiten Sie die Daten vor der Programmierung optimal vor 21.1.6   Arbeiten Sie sich in die Grundkonzepte der Datenbank ein 21.1.7   Nutzen Sie PL/SQL bis zur Neige 21.1.8   Kontrollieren Sie den Speicherverbrauch 21.1.9   Glauben Sie nicht an Wunder 21.1.10   Salvatorische Klausel
21.2   Optimierungsmöglichkeiten von PL/SQL
21.2.1   Automatisierte Codeoptimierung 21.2.2   Subprogram-Inlining 21.2.3   Native Kompilierung 21.2.4   Caching 21.2.5   Feingranulare Abhängigkeitsverwaltung
21.3   Compiler-Warnungen 21.4   PL/Scope
21.4.1   Welche Information bietet PL/Scope? 21.4.2   Die View »USER_IDENTIFIERS« 21.4.3   Die View »USER_STATEMENTS« 21.4.4   Administration von PL/Scope
21.5   PL/SQL Hierarchical Profiler
21.5.1   Der hierarchische Profiler im SQL Developer 21.5.2   Voraussetzungen für den Einsatz des hierarchischen Profilers 21.5.3   Das Package »DBMS_HPROF« 21.5.4   Die Analyse 21.5.5   Ein etwas realitätsnäheres Beispiel 21.5.6   Umgehung der Limitierungen 21.5.7   Optionen der Funktion »dbms_hprof.analyze«
21.6   Den Speicherverbrauch von PL/SQL überwachen
21.6.1   Die Speicherverwaltung von PL/SQL 21.6.2   Überwachung des Arbeitsspeichers
22   Workshop: PL/SQL Instrumentation Toolkit (PIT)
22.1   Überblick: die Idee und die Architektur
22.1.1   Funktionsumfang 22.1.2   Anwendungsbeispiel 22.1.3   Die beteiligten Komponenten 22.1.4   Idee und Arbeitsweise
22.2   Beschreibung der einzelnen Komponenten
22.2.1   Meldung 22.2.2   Call-Stack 22.2.3   Kontext 22.2.4   Adapter 22.2.5   Das Package »MSG« 22.2.6   Ausgabemodul 22.2.7   Die PIT-API 22.2.8   Internationalisierung 22.2.9   Die zentrale Komponente »PIT_INTERNAL« 22.2.10   Ein konkretes Ausgabemodul
22.3   Implementierung des PIT-Administrations-Packages
22.3.1   Funktionsüberblick und Implementierungsstrategie 22.3.2   Implementierungsdetails
22.4   Weitere Ausgabemodule
22.4.1   Ausgabe in eigene Fehlerdateien 22.4.2   Ausgabe in APEX 22.4.3   Ausgabe in Alert-Log- oder Trace-Dateien 22.4.4   Ausgabe in Logging-Tabellen 22.4.5   Meldung als E-Mail versenden 22.4.6   Meldungen in JMS integrieren
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