2019-02-21 11:07:30 +01:00
<!doctype html>
< html lang = "de" >
< meta charset = "utf-8" >
< title > Einführung in Linux< / title >
< meta name = "description" content = "YALC - Yet Another Linux Course " >
< meta name = "author" content = "Daniel Schubert" >
< meta name = "apple-mobile-web-app-capable" content = "yes" >
< meta name = "apple-mobile-web-app-status-bar-style" content = "black-translucent" >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" >
< link rel = "stylesheet" href = "css/reveal.css" >
< link rel = "stylesheet" href = "css/theme/league.css" id = "theme" >
< link rel = "icon" href = "img/openlogo-nd-25.png" type = "img/png" >
<!-- Theme used for syntax highlighting of code -->
< link rel = "stylesheet" href = "lib/css/zenburn.css" >
<!-- Printing and PDF exports -->
< script >
var link = document.createElement( 'link' );
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = window.location.search.match( /print-pdf/gi ) ? 'css/print/pdf.css' : 'css/print/paper.css';
document.getElementsByTagName( 'head' )[0].appendChild( link );
< / script >
< style type = "text/css" >
.reveal img{ max-height: 60vh}
< / style >
< / head >
< body >
< div class = "reveal" >
<!-- Any section element inside of this container is displayed as a slide -->
< div class = "slides" >
< section data-transition = "slide" data-background = "#4d7e65" data-background-transition = "zoom" >
< h1 > LINUX< / h1 >
< h3 > Das universelle Betriebssystem< / h3 >
2019-03-03 11:33:18 +01:00
< p > Eine Einführung - Teil 15
2019-02-21 11:07:30 +01:00
< p > < small > Deutsche Angestellten Akademie< / small > < / p >
< aside class = "notes" >
Frage: Fragen zur letzten Stunde?
< / aside >
< / section >
2019-02-28 12:50:27 +01:00
< section data-transition = "slide" data-background = "#b5533c" data-background-transition = "convex" > < h3 > lampp stack< / h3 > Linux & Apache & mysql & php< / section >
2019-02-21 11:07:30 +01:00
2019-02-28 09:57:43 +01:00
2019-02-21 11:07:30 +01:00
< section >
< pre > < code class = "bash" > ~$ sudo apt install apache2 mysql-server phpmyadmin< / code > < / pre >
< pre > < code class = "bash" > ~$ mysql -u root -p
MariaDB [(none)]> CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'some_very_complex_password';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost'; FLUSH PRIVILEGES;
MariaDB [(none)]> \q
< / code > < / pre >
< ul >
< li class = "fragment " > http://localhost/phpmyadmin< / li >
< li class = "fragment " > user: phpmyadmin< / li >
< li class = "fragment " > http://localhost/phpmyadmin< / li >
< / ul >
< / section >
2019-02-28 09:57:43 +01:00
< section >
< h3 > mysql< / h3 >
< / section >
< section >
mysql ist eine „relationale Datenbank”
2019-02-28 12:50:27 +01:00
< p > < blockquote > Relationale Datenbanken versuchen, die Realität in einem Datenmodell abzubilden.< / blockquote >
2019-02-28 09:57:43 +01:00
< ul >
< li > Jede Zeile einer Tabelle ist ein Datensatz< / li >
2019-02-28 12:50:27 +01:00
< li > Jede Zeile ( Tupel ) besteht aus < strong > Attributen< / strong > ( die Spalten )< / li >
< li > Über < strong > Primärschlüssel< / strong > werden Beziehungen hergestellt< / li >
2019-02-28 09:57:43 +01:00
< li > Eine Datenbank kann viele Tabellen beinhalten< / li >
2019-02-28 12:50:27 +01:00
< li > Die Tabellen stehen in Beziehung ( Relation )< / li >
2019-02-28 09:57:43 +01:00
< / ul >
2019-02-28 12:50:27 +01:00
< / section >
< section >
2019-02-28 09:57:43 +01:00
< img src = "img/relationales_datenbankmodell_beispiel.jpg" >
< p > < small style = "font-size:.4em" > Quelle: http://www.datenbanken-verstehen.de/datenbank-grundlagen/datenbankmodell/relationales-datenbankmodell/< / small >
< / section >
< section >
< h4 > Normalisierung< / h4 >
Aufteilung der Attribute (Spalten) in mehrere Relationen ( Tabellen ), so dass eine Form ohne Redundanzen entsteht.
< / section >
< section >
< img src = "img/Aufspaltung_einer_Tabelle_in_zwei_(Beispiel).svg" >
< / section >
2019-02-28 12:50:27 +01:00
< section >
< table style = "font-size: .5em" >
< tr >
< td > Rg Nr< / td >
< td > Datum< / td >
< td > Name< / td >
< td > Straße< / td >
< td > Ort< / td >
< td > Artikel< / td >
< td > Anzahl< / td >
< td > Preis< / td >
< / tr >
< tr >
< td > 143< / td >
< td > 01.04.2018< / td >
< td > Max Müller< / td >
< td > Trumstrasse 4< / td >
< td > 75179 Pforzheim< / td >
< td > Bleistift< / td >
< td > 1001< / td >
< td > 1,00€< / td >
< / tr >
< / table >
< / section >
< section >
1. Normalform
< table style = "font-size: .5em" >
< tr >
< td > Rg Nr< / td >
< td > Datum< / td >
< td > Vor Name< / td >
< td > Nach Name< / td >
< td > Straße< / td >
< td > Hausnr< / td >
< td > PLZ< / td >
< td > Ort< / td >
< td > Artikel< / td >
< td > Anzahl< / td >
< td > Preis< / td >
< / tr >
< tr >
< td > 143< / td >
< td > 01.04.2018< / td >
< td > Max< / td >
< td > Müller< / td >
< td > Trumstrasse< / td >
< td > 4< / td >
< td > 75179< / td >
< td > Pforzheim< / td >
< td > Bleistift< / td >
< td > 1001< / td >
< td > 1,00€< / td >
< / tr >
< / table >
< / section >
< section >
< table style = "font-size: .5em" >
< tr >
< td > Rg Nr< / td >
< td > Datum< / td >
< td > Vor Name< / td >
< td > Nach Name< / td >
< td > Straße< / td >
< td > Hausnr< / td >
< td > PLZ< / td >
< td > Ort< / td >
< td > Artikel< / td >
< td > Anzahl< / td >
< td > Preis< / td >
< / tr >
< tr >
< td > 144< / td >
< td > 01.04.2018< / td >
< td > Max< / td >
< td > Müller< / td >
< td > Trumstrasse< / td >
< td > 4< / td >
< td > 75179< / td >
< td > Pforzheim< / td >
< td > Bleistift< / td >
< td > 1001< / td >
< td > 1,00€< / td >
< / tr >
< tr >
< td > 145< / td >
< td > 01.04.2018< / td >
< td > Max< / td >
< td > Müller< / td >
< td > Trumstrasse< / td >
< td > 4< / td >
< td > 75179< / td >
< td > Pforzheim< / td >
< td > Tüte< / td >
< td > 1001< / td >
< td > 0,10€< / td >
< / tr >
< tr >
< td > 146< / td >
< td > 01.04.2018< / td >
< td > Max< / td >
< td > Müller< / td >
< td > Trumstrasse< / td >
< td > 4< / td >
< td > 75179< / td >
< td > Pforzheim< / td >
< td > Ratzefummel< / td >
< td > 1001< / td >
< td > 1,50€< / td >
< / tr >
< / table >
< / section >
< section >
Kunden
< table style = "font-size: .5em" >
< tr >
< td > ID< / td >
< td > Vor Name< / td >
< td > Nach Name< / td >
< td > Straße< / td >
< td > Hausnr< / td >
< td > PLZ< / td >
< td > Ort< / td >
< / tr >
< tr >
< td > 1234< / td >
< td > Max< / td >
< td > Müller< / td >
< td > Trumstrasse< / td >
< td > 4< / td >
< td > 75179< / td >
< td > Pforzheim< / td >
< / tr >
< / table >
< hr >
< div >
Rechnungen:
< table style = "font-size: .5em" >
< tr >
< td > Rg Nr< / td >
< td > Datum< / td >
< td > KundenID< / td >
< td > Artikel< / td >
< td > Anzahl< / td >
< td > Preis< / td >
< / tr >
< tr >
< td > 144< / td >
< td > 01.04.2018< / td >
< td > 1234< / td >
< td > Bleistift< / td >
< td > 1001< / td >
< td > 1,00< / td >
< / tr >
< tr >
< td > 145< / td >
< td > 01.04.2018< / td >
< td > 1234< / td >
< td > Tüte< / td >
< td > 12< / td >
< td > 0,10< / td >
< / tr >
< tr >
< td > 146< / td >
< td > 01.04.2018< / td >
< td > 1234< / td >
< td > Ratzefummel< / td >
< td > 32< / td >
< td > 1,50< / td >
< / tr >
< / table >
< / div >
< / section >
2019-02-28 09:57:43 +01:00
< section >
< img src = "img/Wp_Normal_1_301208_165800.JPG" >
< / section >
2019-02-28 12:50:27 +01:00
2019-02-28 09:57:43 +01:00
< section >
Verbindung aufnehmen:
< pre > < code class = "bash" > ~$ sudo mysql
# oder:
~$ mysql -u BENUTZERNAME -p -h localhost
2019-02-28 12:50:27 +01:00
< / code > < / pre >
< ul >
< li class = "fragment " > -u : Username< / li >
< li class = "fragment " > -p : Passwort abfragen< / li >
< li class = "fragment " > -h : Host< / li >
< / ul >
2019-02-28 09:57:43 +01:00
< / section >
< section > Datenbank erstellen
2019-02-28 12:50:27 +01:00
< pre style = "font-size:.4em" > < code class = "sql" > CREATE DATABASE IF NOT EXISTS test;
2019-02-28 09:57:43 +01:00
USE test;
CREATE TABLE IF NOT EXISTS books (
BookID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
Title VARCHAR(100) NOT NULL,
SeriesID INT, AuthorID INT);
CREATE TABLE IF NOT EXISTS authors
(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT);
CREATE TABLE IF NOT EXISTS series
(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT);
INSERT INTO books (Title,SeriesID,AuthorID)
VALUES('The Fellowship of the Ring',1,1),
('The Two Towers',1,1), ('The Return of the King',1,1),
('The Sum of All Men',2,2), ('Brotherhood of the Wolf',2,2),
('Wizardborn',2,2), ('The Hobbbit',0,1);< / code > < / pre >
< / section >
< section > Tabellen anzeigen
< pre > < code class = "sql" >
SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| authors |
| books |
| series |
+----------------+
3 rows in set (0.00 sec)
< / code > < / pre >
< / section >
< section >
< pre > < code class = "sql" > DESCRIBE books;
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| BookID | int(11) | NO | PRI | NULL | auto_increment |
| Title | varchar(100) | NO | | NULL | |
| SeriesID | int(11) | YES | | NULL | |
| AuthorID | int(11) | YES | | NULL | |
+----------+--------------+------+-----+---------+----------------+
< / code > < / pre >
< / section >
< section >
Daten anzeigen:
< pre > < code class = "sql" > SELECT * FROM books;
+--------+----------------------------+----------+----------+
| BookID | Title | SeriesID | AuthorID |
+--------+----------------------------+----------+----------+
| 1 | The Fellowship of the Ring | 1 | 1 |
| 2 | The Two Towers | 1 | 1 |
| 3 | The Return of the King | 1 | 1 |
| 4 | The Sum of All Men | 2 | 2 |
| 5 | Brotherhood of the Wolf | 2 | 2 |
| 6 | Wizardborn | 2 | 2 |
| 7 | The Hobbbit | 0 | 1 |
+--------+----------------------------+----------+----------+
7 rows in set (0.00 sec)< / code > < / pre > < / section >
< section > Daten einfügen:
< pre > < code class = "sql" > INSERT INTO books (Title, SeriesID, AuthorID)
VALUES ("Lair of Bones", 2, 2);
Query OK, 1 row affected (0.00 sec)< / code > < / pre >
< pre > < code > SELECT * FROM books;< / code > < / pre > < / section >
< section >
Daten modifizieren:
< pre > < code class = "sql" > UPDATE books
SET Title = "The Hobbit"
WHERE BookID = 7;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0< / code > < / pre >
< / section >
2019-02-28 12:50:27 +01:00
< section >
Speicherort: < pre > < code > /var/lib/mysql< / code > < / pre >
Konfiguration < pre > < code > /etc/mysql/my.cnf< / code > < / pre >
< / section >
< section >
Andere Datenbanken:
< p > < ul >
< li class = "fragment " > PostgreSql< / li >
< li class = "fragment " > SQLite< / li >
< li class = "fragment " > Redis< / li >
< li class = "fragment " > MongoDB< / li >
< / ul >
< / section >
< section data-transition = "slide" data-background = "#b5533c" data-background-transition = "convex" > < h3 > Apache Webserver< / h3 > < / section >
< section >
< ul >
< li > Apache ist der meistgenutzte (?) Webserver< / li >
< li class = "fragment " > Apache beantwortet http Requests. < / li >
< li class = "fragment " > Punkt.< / li >
< li class = "fragment " > kennt Module -> Funtionserweiterung< / li >
< li class = "fragment " > interpretiert versch. Script-Sprachen über Module< / li >
< li class = "fragment " > < a href = "https://de.wikipedia.org/wiki/Apache_HTTP_Server#Module" > Liste der Module< / a > < / li >
< li class = "fragment " > php, ruby, perl, lua, JavaScript, .net .....< / li >
< / ul >
< / section >
< section >
< ul >
< li > aktuelle Version 2.3 ( deswegen apache2 )< / li >
< li class = "fragment " > Standard Speicherort f. Webseiten: /var/www/html< / li >
< li class = "fragment " > Aufruf per Browser : < br > http://localhost/ < br > http://SERVER-IP_ODER_NAME/< / li >
< li class = "fragment " > Standardmässig wird < code > index.html< / code > ausgeliefert< / li >
< li class = "fragment " > wenn nicht vorhanden Liste des Verz. Inhalt< / li >
< li class = "fragment " > Steuerung über < br > < code > systemctl start | stop | restart | reload | force-reload apache2< / code > < / li >
< / ul >
< / section >
< section >
< h4 > Konfiguration< / h4 >
< ul >
< li class = "fragment " > < code > /etc/apache2/apache2.conf< / code > < / li >
< li class = "fragment " > Zusätzliche conf Files: < br > < code > /etc/apache2/conf-available/< / code > < / li >
< li class = "fragment " > Einzelne Webseiten ( vhosts ) < br > < code > /etc/apache2/sites-available/< / code > < / li >
< li class = "fragment " > per Verzeichnis: < code > .htaccess< / code > < / li >
< / ul >
< / section >
< section >
De-/ Aktivieren einer Zusätzlichen Konfigurationsdatei < pre > < code class = "bash" > ~$ sudo a2enconf NAME_DER_DATEI.conf
~$ sudo a2disconf NAME_DER_DATEI.conf < / code > < / pre >
De-/ Aktivieren einer Zusätzlichen Webseite < pre > < code class = "bash" > ~$ sudo a2ensite MEINE_WEBSEITE.conf
~$ sudo a2dissite MEINE_WEBSEITE.conf < / code > < / pre >
< small > Diese beiden Befehle machen Symlinks in die Ordner < br > < code > /etc/apache/[ conf | site ]-enabled< / code > < / small >
< hr >
< p > Nach Änderungen in diesen Dateien: < pre > < code class = "bash" > ~$ sudo systemctl reload apache2< / code > < / pre >
< / section >
< section >
< h4 > Virtual Hosts< / h4 >
< div > Es ist möglich, von einem Server verschiedene Domains auszuliefern mit sog. Virtual Hosts.< / div >
< p > Beispiel:: < a href = "beispiele/15/schubertdaniel.conf" > beispiele/15/schubertdaniel.conf< / a >
< / section >
< section >
< span style = "color: orange" > Aufgabe:< / span > < p > Erstellt eine Webseite namens omikron, die per < p > < code > http://localhost/omikron< / code > < br > aus dem Ordner < p > < code > /var/www/html/omikron< / code > < br > ausgeliefert wird.
< / section >
< section > < span style = "color: orange" > Aufgabe:< / span > < p > Verlegt die Wordpress Installation nach < code > /home/NUTZERNAME/www/wordpress< / code > < / section >
2019-02-21 11:07:30 +01:00
<!--
< section >
Übungen
C 11.11 [3] Besorgen Sie sich eine geeignete Datei (etwa ein größeres tar -Ar-
chiv mit Quellcode, vielleicht für den Linux-Kernel) und komprimieren Sie
sie jeweils mit gzip , bzip2 und xz . Messen Sie dabei die Ausführungszeit
durch ein vorgesetztes time . Wie verhalten die Laufzeiten und die Kompri-
mierungsraten sich zueinander?
C 11.12 [2] Experimentieren Sie mit der Datei aus der vorigen Aufgabe und
vergleichen Sie die Laufzeit und die Größe des Resultats für xz mit verschie-
denen Effizienz-Optionen. Was ist der Unterschied zwischen -1 und -6 und
zwischen -6 und -9 ?
< / section >
-->
< / div >
< / div >
< script src = "lib/js/head.min.js" > < / script >
< script src = "js/reveal.js" > < / script >
< script >
// More info https://github.com/hakimel/reveal.js#configuration
Reveal.initialize({
controls: true,
progress: true,
history: true,
center: true,
transition: 'slide', // none/fade/slide/convex/concave/zoom
// More info https://github.com/hakimel/reveal.js#dependencies
dependencies: [
{ src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } },
{ src: 'plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: 'plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
{ src: 'plugin/search/search.js', async: true },
{ src: 'plugin/zoom-js/zoom.js', async: true },
{ src: 'plugin/notes/notes.js', async: true }
]
});
< / script >
< / body >
< / html >