Also, im ersten Schritt erkläre ich POST und GET und PHP und den Webserver, das hat damit sehr viel zu tun, ist allerdings eine allgemeine Frage. Ich verweise auf das Skript.
https://www.davidvajda.de/david2/php5.txt
Und weise daraufhin, es gibt zwei Formen von Internetusern. Es gibt welche, die das nur benutzen, ohne Server zu betreiben. Das ist seltsam, weil das Internet besteht nicht nur aus rein gehen, sondern man ist ebenso frei, etwas an zu bieten.
Ich sage gleich: Facebook ist demnach "reine Benutzung". Das wird allerdings dann scheitern - wenn sie zum Beispiel automatisierte Posts machen wollen, wie ich.
Was ist denn jetzt ein Bot?
Streng genommen, besteht ein Bot aus zwei Teilen. Im Internet gibt es immer wieder die Diskussion, was ist KI
1.) Der Bot besteht aus einer Schnittstelle zu einem sozialen Netz. Wir müssen etwas posten können, ohne ein zu greifen
2.) Die KI arbeitet im Hintergrund unseres Bots. Wir können uns die KI als Modul vorstellen, die Eingaben macht
Wer Programmieren kann, weiss "aaaaa" kann Eingabe string sein. Streng genommen, ohne KI - könnte unser Bot - immer "Hallo Welt" senden, dafür brauchen wir keine KI - dafür brauchen wir unsere Schnittstelle. Die KI ist ein Modul, wo von unserer Schnittstelle, die Daten in die KI gehen und sinnvoll ausgewertet werden, so, dass sie auf die Eingabe reagieren.
Ich habe vor ein Bot zu schreiben, aber ohne KI. Das heisst, es wird automatisch - immer Messages posten. Das ist ein sinnvolles Konzept. Ich werde auch weiterhin meine Nachrichten posten. es gibt allerdings im Netz viel Politisches. Es ist die Frage: Wie reagieren wir darauf. Ich habe bereits so ein Bot für Twitter geschrieben, als Twitter noch Twitter war.
Facebook fand ich etwas komplizierter, inzwischen wo ich es verstanden habe, sehr einfach. Es gibt allerdings ein paar Probleme. Die Antwort: Politisch: Ich sage mal so: Ich möchte keine politischen Posts bringen. Allerdings anstatt - man redet im politischen ja immer über Besitzverhältnisse. Das heisst, wenn ich alle 2h poste - ituenix.de, davidvajda.de, eine Homepage implementierung, dann würde das genügen, meine Präsenz dar zu stellen und ansonsten, gerade zu selbst verfassten Beiträgen, ausserhalb der richtigen, als mit Howtos und so weiter - kommen nur solche Beiträge. ituenix.de oder Sprichwörter und so weiter. Ich finde diese politischen Hassposts unprofessionell, wenn man daran denkt, dass man Werbung schalten kann. Es ist besser sich so dar zu stellen.
Gut: Ich schreibe ein Bot ohne KI. Und wir müssen wieder unterscheiden
1.) Der Messanger - das heisst, der Kontakt zu Leuten, die Kontakt zu dir in Form von Instant Messaging aufgenommen haben
2.) Der Feed, als die Chronik
Wenn man natürlich, wie bei SMS miteinander kommuniziert, dann sollte man fast KI nehmen, denn das Gegenüber sollte nicht merken, dass immer "Hallo Welt" kommt, sondern es sollte eine Reaktion auf das gesprochene stattfinden
Anders ist das im Feed - ich kann alle 2h posten davidvajda.de und ituenix.de und dazu das Sprichwort das Tages - das ist schon fast, wie KI nur ohne KI. Man kann sich vorstellen, mit einer Zufallszahl, wählt der eigene Bot, in einem Array von Sprichwörtern - und: Postet von 100 immer eines. Auf Twitter habe ich das gemacht.
Gut: Warum wird es schwierig ohne das Beitreiben eines Servers, da mit zu halten. Das erkläre ich gleich
Und ich verweise darauf wer programmieren lernen will, der sollte erst Mal lernen, zu programmieren, ohne dabei an Webanwendungen überhaupt nur zu denken. Denn ich verweise auch auf den MIPS, es gibt im Computer einfach, klassische Prinzipien, und die dürfen nicht übergangen werden. Es ist schwierig, wo es keine 8086er mehr gibt, richtig programmieren zu lernen. Natürlich könnte sich jeder einen 8086er kaufen, allerdings - die Anzahl ist begrenzt und irgendwann sind die Dinger kaputt. Auch fehlt es an Monitoren und Tastatur
Es gibt eine Alternative: Das ist Linux. Aber es gibt auch Windows Compiler. Was viele Computer aber nicht mehr erlauben - wenn sie nicht Linux benutzen, ist ein guter Zugriff auf die Hardware - das heisst, sie konnten ohne Speicherschutz, beim 8086er alles machen. Das lohnt sich, um etwas zu lernen. Und das ist dringend notwendig. weil ich sage: Ohne die Bits und Bytes geht es eben nicht. Dann wird das Theorie wie aus einem Chemie Buch, allerdings ohne es aus zu probieren und das Ergebnis ist oft weniger gut.
Es gibt moderne Programmiersprachen, wie PHP - auf das werden wir eingehen - darum geht es bei POST und GET - eben darum, eben nicht um Bits und Bytes - das ist keine Einführung in die Computertechnologie - trotzdem sage ich: Wird es daran scheitern. Man kann sich zwar in PHP eine Zeichenkette, einen String so vorstellen "asdhasda". Aber was genau das ist, geht ohne die Kenntnis vom Computer nicht. Das wird nicht tun
und PHP und JavaScript sind eben Programmiersprachen, die dem Programmierer, die Datentypen, wie char, int, double, boolean, float, long int, long double, ... verbergen. das heisst, wir haben gar keine Typisierung. Und ohne Typisierung wird es nichts. Wir verstehen nichts. Sie brauchen zwar keine Typisierung in PHP, aber, wissen sie eine Variable in PHP zu vertehen, ohne, dass man versteht, was eine Variable ist, wenn das was geschriebenes ist, dann wird es kompliziert. Sie können zwar PHP ohne Typisierung benützen, wenn sie wissen, was das ist, aber sie können Typisierung ohne PHP benutzen, anders herum wird es kompliziert.
PHP ist keine Sprache um was zu verstehen. PHP ist eine Sprache, die ist sehr komplex, dient aber der Anwendung. Und davor sollte man erst Mal C gelernt haben und eigentlich Assembler. Wenn sie Linux benutzen, besteht die Möglichkeit. Und es gibt die Möglichkeit, von virtuellen Maschinen.
Das gibt es sowohl unter Linux als auch unter Windows - zum Beispiel gehören: VirtualBox dazu und auch Bochs. Ich sage gleich, das macht allerdings keinen Spass, wenn man keinen PC in der Hand gehabt hat.
Jetzt was mache ich hier? Gebe ich eine gute Einführung. Auf der einen Seite ja
1.) Einführung
2.) Ich gebe sinngemäss zum Lernen wieder, was sie für den Facebook Bot brauchen
Es geht darum, etwas zu lernen. Strenggenommen ist der Facebook Bot ganz einfach. Es gibt letzten endes, nichts einfacheres. Es ist simpel.
Trotzdem entstehen wieder eine Menge systematisch sortierter Daten. Und es lohnt sich die stichwortartig sortiert auf zu schreiben, so, dass man die lernt. Wenn man die nicht lernt, obwohl man das Web verstanden hat, wird es kompliziert. Wie immer. Chemie ohne Periodensystem aus wendig zu können, funktioniert, eben trotz Tabelle nicht
Wozu erkläre ich, was POST und GET ist - wenn ich ihnen das nicht erkläre, dann sehen sie Abfragen und vorausgesetzt, sie wissen nicht, was CHAR und INTEGER ist, werden sie sagen: Da steht eine Abfrage, aber keine Ahnung was das ist. Und ich sei verrückt geworden, das hin zu schreiben
Ich schreibe das zum Lernen für Facebook für mich auf. Ich möchte das allerdings veröffentlichen. Damit sie dann wissen, was diese POST und GET Abfrage ist - muss ich ihnen erkälren was CHAR und INTEGER ist.
Die Frage, warum brauche ich das für POST und GET
Die Antwort ist einfach. Computer sind komplizierter geworden. Aber, sie speichern Daten in Form von einer länge von vielen Zeichen. Die Idee von Plaintext und ASCII Code ist bedingt richtig. Es gibt Lesbaren ASCII Code, dazu gehören
"abc...z"
"012...9"
";!%..."
Trotzdem: ASCII Code ist ASCII Code. Binärcode bedingt richtig, das ist ASCII Code. Allerdings wird alles bis hin zum Bild in ASCII Code gespeichert.
Und genau hier fängt POST und GET an
Letzten endes, macht es keinen Unterschied - ob ich eine Zeichenkette
"Hallo Welt"
über das Internet übertrage, oder auf der Festplatte speichere. Die Festplatte arbeitet mit SATA und das ist ein Protokoll. Das hat übrigens Befehle. Klingt seltsam. Es ist kein Prozessor, aber sie müssen einer Festplatte sagen:
Soll ich lesen oder schreiben
Dazu hat die Festplatte auch Befehle. Wenn ich etwas über das Netzwerk übertrage, klingt das komplex. Ist es aber nicht. Wenn an dem Computer, an irgendeiner Schnittstelle, und sagen wir: Die ist ein Byte gross - woher die Zeichenkette auch immer kommt vom mond her, das macht für den PC keinen Unterschied. Ob die Zeichenkette von der Festplatte kommt oder von der Netzwerkkarte
Hier empfehle ich ihnen dringend, kein Windows zu benutzen. Denn der Gerätemanager erklärt uns, das sind Geräte. In Wirklichkeit ist das so gar nicht, unbedingt. Alles ist ein Gerät, was nicht Arbeitsspeicher und Prozessor und BIOS ist. Und, ob sie das von SATA oder von der Netzwerkkarte kriegen ist egal.
Das merkt der Computer nicht, woher
Deswegen: Benutzen sie Linux, und wenn nicht, keine Chance.
Warum brauchen wir das für POST und GET
Weil sie sehen werden, ein HTTP-Request - überträgt Daten. Dazu gehören Texte - aber auch Bilder
Das ist der wichtigste Teil von HTTP - der Request. Der zweite wichtigste Teil, ist der Server. Ohne, den es nicht geht. Nur werden sie nicht verstehen, wie Texte und Bilder mit HTTP Request übertragen werden, wenn sie nicht: Verstehen was CHAR und INTEGER ist. Und wenn sie das nicht verstehen, verstehen sie nicht POST und GET. Und wenn sie das nicht verstehen, verstehen sie nur Bahnhof, und erklären mich für Verrückt, obwohl ich das richtige erklärt habe. Also müssen wir jetzt anfangen. Ich fange jetzt an. Ich mache jetzt noch mal eine kurze Zusammenfassung, von dem, was ich sagte - das war nur die Einführung - und: Dann mache ich jetzt eine Liste von dem, was kommen wird.
Was ich vergessen habe, zu sagen: Wenn sie mit der Netzkarte klar kommen wollen, ist es einfacher TCP/IP zu verstehen. Es gibt auf Galileo Computing, eine Seite über C - die erklärt nicht nur C, sondern sie erklärt: Wie man TCP/IP in C einbindet, über Sockets. Das ist dringend notwendig. Sie können ihren eigenen Webserver selber schreiben, dazu müssen sie C können und dann können sie mit Sockets, Funktionen von C benutzen, damit sie ihren Webserver machen. Das brauchen sie für TCP/IP. Damit sie wissen, was HTTP ist. Das ist nämlich die Anwenderschicht. Die Anwenderschicht ist gut verstanden, wenn die unteren ein bisschen klar ist. Wenn klar ist, was der HTTP-Server macht. Der überträgt nämlich Texte, aus einem Verzeichnis, dazu muss ich Netzwerzugriff in C kennen und eine Datei lesen.
0.) Einführung
1.) C-Programm
1.1.) Die Datentypen
1.2.) Das Hallo Welt Programm - printf - auf der Konsole
1.3.) Die Datentypen, näher erklärt. Anhand von Assembler, anhand von Arbeitsspeicher - RAM
1.4.) Die Überschneidung von Datentypen. Damit man weiss, es ist zwar in C nicht egal, ob man
int
oder
integer
schreibt
Das man aber weiss, bei der einen Sprache heisst es int und bei der anderen integer. Was eigentlich das gleiche ist
1.5.) der Zugriff auf Dateien in C
1.6.) der Netzwerkzugriff in C
Auch hier: Parallelen zu PHP, auch in PHP kann ich eine Datei lesen. Die Gemeinsamkeiten
2.) Die Programmiersprachen
- C
- C++
- Assembler
- PHP
- Python
- Java
- JavaScript
- Pascal
- Scheme
- Bash Programmierung
3.) Das installieren von Linux
3.1.) Was muss ich tun, um Linux zu installieren
3.2.) Was muss ich tun um in Linux programme zu installieren
- Der Netzwerkzugriff, ich installiere die nicht per Hand
- apt-get install packetname
3.3.) Die notwendigen Programme
3.3.1.) Zum Programmieren - gcc, ...
3.3.2.) Für den Webserver:
apt-get install apache2
nginx
4.) HTML, PHP und JavaScript
Und vor allem: PHP in apache2 - PHP ist das entscheidende
Das heisst, die muss ich auch einzeln als Paket installieren
apt-get install php ...
Die Pakete für die Datenbank: MySQL was soll das? Aber nicht erklären
Gut, und wenn sie sagen, sie haben alles verstanden, benutzen aber kein Linux, sondern Windows: dann sage ich nichts, verstanden. Ich fange jetzt an. Aber nicht hier.
0.) Einführung
0.1.) Das Bot
Das Bot besteht aus zwei Teilen
Wie immer
1.) Frontend
2.) Backend
a) Frontend und Backend sind zwei Module, das heisst, unterschiedliche Programme, die über definierte Schnitstelle, das heisst, ein Protokoll miteinander kommunizieren. Was ein Protokoll ist, sehen wir nachher
b) Sie sind kompatibel. Aber austauschbar.
1.) Die Schnittstelle zum Forum
2.) Die KI
Welche Foren gibt es
1.) Facebook
2.) Twitter
3.) phpBB3
4.) ...
1.) Die Schnittstelle lässt sich ohne KI verwenden. Wir können immer denselben String posten "Hallo Welt". Trotzdem arbeitet auf der Seite, wo normalerweise die KI ist, ein Programm, was entscheidet, was geschrieben wird
2.) Die KI ist blos eine besonders intelligente Möglichkeit zu entscheiden, was geschrieben wird. Zum Beispiel als Reaktion darauf, was Nutzer schreiben
Wir müssen unterscheiden
1.) Den Messenger
2.) Den Feed
1.) Den Messenger: Hier reden zwei Nutzer miteinander
2.) Den Feed: Hier posten wir unsere Beiträge
1.) Der Messanger: Macht sinn, mit KI.
a) Ein Nutzer schreibt: "Wie geht es dir".
b) Dann lautet die Antwort: "Danke gut"
a) Ein Nutzer schreibt: "Du bis nett"
b) Dann lautet die Antwort: "Ja danke, du auch"
2.) Der Feed - hier brauchen wir keine KI
Hier schreiben wir alle
1.) 10 Minuten
2.) 2h
3.) 1h
4.) 30 Minuten
5.) 24h
6.) ...
1.) Den Namen der eigenen Domains mit Bild
2.) Einen tollen Spruch
3.) Eine durch den Computer generierte Programmieraufgabe, die ohne KI generiert wurden
4.) ...
I.) C
Es gibt in C folgende Datentypen
1.) char
2.) int
3.) float
4.) double
5.) void
Dazu gibt es die Einschränkungen
1.) signed
2.) unsigned
Dazu gibt es
1.) short
2.) long
Damit kommen wir zu
1.) signed char
2.) unsigned char
3.) short int
4.) unsigned short int
5.) signed short int
6.) long int
7.) unsigned long int
8.) signed long int
9.) int
10.) signed int
11.) unsigned int
12.) float
13.) double
14.) long double
Gehen wir das der Reihe nach durch
II.2.) Die Variable
Das erste, was wir wissen müssen. Eine Variable hat
1.) Einen Namen
2.) Einen Wert
3.) Eine Addresse
4.) Einen Typ
Auf keines dieser 4 Attribute können wir verzichten. sie sind alle dringend notwendig. Eine Variable hat auch immer einen Wert. 0 ist ein Wert
Wir müssen uns merken: 0 ist ein Wert
C ist eine typisierte Sprache. Aber kein streng typisierte Sprache. Wir müssen unterscheiden
1.) Streng typisierte Sprachen
2.) Weniger streng typisierte Sprachen
3.) Sprachen ohne Datentypen
1.) Typisierte Sprachen
1.1.) Streng typisierte Sprachen
1.2.) Weniger streng typisierte Sprachen
2.) Sprachen ohne Datentypen
Eine weniger Streng typisierte Sprache, erlaubt das
cast
ein cast ist eine Typumwandlung. Das erlaubt nicht jede Sprache. Auch VHDL ist eine Sprache, sie erlaubt keine Typenumwandlung
Eine Typumwandlung, geht zum Beispiel von
1.) char nach integer
2.) float nach integer
3.) integer nach float
Um es vorher zu sagen, sind Variablen vom Typ char, Zeichen, aber Werte von 0 bis 255
0 bis 255 sind auch die ersten 256 Zahlen, die bei den ganzen Zahlen auftreten.
So können wir char nach integer konvertieren
Wir können float nach integer konvertieren, float ist eine Fliesskommazahl, in der Mathematik bekannt, als Zahl mit Komma. Wenn wir
5.002 als Ganzzahl konvertieren erhalten wir gerundet
5
Wenn wir 5 als Kommazahl konvertieren erhalten wir
5.0000
So, C ist eine typisierte Sprache. Die allerdings Typumwandlungen erlaubt. Jetzt müssen wir fragen, was ein Typ
Gut, einen Typ, alleine brauchen wir nicht, wir brauchen Variablen. Was ist eine Variable?
II.3.) Variablen
Wir müssen feststellen, was ist ein Wert. Wir müssen unterscheiden
1.) Variablen - das heisst, Speicherstellen, die beliebig Werte aufnehmen
2.) Konstante Werte
Ein Konstanter Wert, kann durch eine Konstante festgelegt werden
#define MY_CONST 128
Definiert eine Konstante MY_CONST. Diese hat auch einen Namen. sie kann überall im C Quelltext auftauchen. Und wird überall durch 128 ersetzt. Die Konstante hat auch einen Namen, allerdings lässt sich ihr Wert nicht ändern.
Der Computer selber kennt keine Konstanten. Es ist Aufgabe des Compilers, überall wo er die Konstante MY_CONST findet, sie durch 128 zu ersetzen
Konstanten können zum Beispiel sein
1.) 1
2.) 2
3.) 128
4.) 1.0
5.) 1.0002
6.) 12782.127382
7.) 'a'
8.) 'z'
9.) "hsajdd"
10.) "Hallo Welt"
und so weiter. Konstanten sind quasie Werte. Konstante Werte, Konstanten und Werte sind quasi gleich zu setzen. der Unterschied ist, dass eine Konstante ein benannter Wert ist, der ein Mal benannt wird. das ermöglicht beim Programmieren, einen Wert überall gleichzeitig zu ersetzen
Eine Variable wiederum enthält werte. Sie sind allerdings Variable. Es gibt keinen festen Wert
Einer Variable lässt sich ein Wert zuweisen. Wie das geht, werden wir gleich sehen
II.4.) Der Arbeitsspeicher und die Computerworte
Der Arbeitsspeicher ist eine lange an einander reihung, von man kann sagen Variablen, jeder Speicherplatz im Computer lässt sich mit einer variablen bezeichnen, die addressiert werden, was über aufsteigende Ganzzahlen geschieht
Gut: Jetzt müssen wir etwas prägnantens klären
Während es:
- signed
- unsigned
- char
- ...
gibt, gibt es etwas ganz anderes:
1.) Bit
2.) Nibble
3.) Byte
4.) Halbwort = Half Word
5.) Word
6.) Double Word
7.) Quad Word
8.) Ten Byte
Gewöhnlich benutzen wir:
1.) Byte
2.) Halbwort = Half Word
3.) Word
4.) Double Word
Wir werden sehen, long und short, sie werden, vielleicht etwas verwirrt sein, warum das jetzt so ist und das so, hängen damit stark zusammen. der Unterschied ist: Es sind unterschiedliche Bezeichnungen
1.) Short, Long, ... gehören zum Sprachwortschatz von C
2.) Byte, Halbwort, ... gehören zum allgemeinen Sprachwortschatz der Computerwissenschaft
Gut:
1.) Ein Bit, ist die Variable Information 0 und 1. Diese Information kann konstant sein, oder sie kann Variable sein. Eine Leitung kann immer die information 1 haben, die sich nicht ändern, oder sie kann sich ändern
2.) Ein Nibble, sind vier Bit. Jetzt müssen wir binär zählen können. Das geht ganz einfach
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
was passiert hier. Das ist ganz einfach. Schauen wir uns das zählen im Dezimalsystem an. Das geht so:
0
1
2
3
4
5
6
7
8
9
10
11
...
Gut schauen wir uns an, was passiert ist, bevor wir von 1 zu 10 kommen. Wir zählen
0
####
1
2
3
4
5
6
7
8
9
####
10
Stellen wir uns vor, wir lassen 1 bis 9 weg
Dann zählen wir
0
###
###
10
Mit den inzwischen weggelassen, 1 bis 9. Und schon können wir binär zählen
das Nibble sind 4 Bit
Gut, das heisst, es sind quasi 4 "Leitungen". Das Nibble taucht bei unserem PC normalerweise nicht auf.
3.) Das Byte sind 8 Bit
4.) Das Halbwort, das ist Variable sind entweder 8 Bit oder 16 Bit
5.) Das Wort sind entweder 16 Bit oder 32 Bit
6.) Das Long Word sind entweder 32 Bit oder 64 Bit
Gut, damit ist das wichtigste geklärt. Die Frage ist, was tut unser Arbeitsspeicher
Stellen sie sich vor, sie schreiben auf ein Papier die Zeichenfolge
"ABCD"
Aber sie machen für jedes der Zeichen ein Kästchen. Das heisst, sie erstellen, eine Tabelle. Diese Tabelle hat nur Spalten. Jedes Zeichen kommt in eine Spalte
Schon haben sie einen Arbeitsspeicher. Der Arbeitsspeicher entspricht einer geschriebenen Tabelle, mit einem Unterschied. Pro Spalte gibt es ein Zeichen.
Es gibt noch einen Unterschied
Der Arbeitsspeicher, wird addressiert. Allerdings fangen wir nicht bei 1 an zu zählen, sondern bei 0
0 1 2 3
A B C D
Oder bei "Hallo"
0 1 2 3 4
H a l l o
Gut, was wir jetzt wissen müssen, ist eine gewisse Einsicht über den Wertebereich von Zahlen im Binärcode
2^0 = 1
2^1 = 2
2^2 = 4
2^3 = 8
2^4 = 16
2^5 = 32
2^6 = 64
2^7 = 128
2^8 = 256
2^9 = 512
2^10 = 1024
Ein Arbeitsspeicher wird niemals 241 Zellen haben. Er wird immer eine Potenz von 2 Zellen haben.
Wenn wir einen Arbeitsspeicher mit 256 Byte haben - dann umfasst dieser die Addressen
0 .. 255
Das heisst, addressiert wird von
0 .. n-1
n steht als Ganzzahl für die gesamte Anzahl von addressen.
1.) Wenn wir 256 Addressen haben, dann geht der Addressbereich von 0 bis 255
2.) Wenn wir 16 Addressen haben, geht der Addressbereich von 0 bis 15
3.) Wenn wir 1024 Addressen haben, geht der Addressbereich von 0 bis 1023
....
Jede dieser Addressen im Arbeitsspeicher besteht aus den Attributen
1.) Addresse
2.) Wert
Jede Speicherzelle hat eine Addresse. Sollte sie das nicht haben, ist der Computer kaputt und das passiert in diesem Falle eigentlich nie
Jede Speicherzelle hat einen Wert. Sie hat einen zufälligen Wert, der entsteht, wenn man den Computer einschaltet. Das kann 0 sein, aber das ist auch ein Wert
Die 0 bei Bytes, würde dargestellt als
0000 0000
in Bits geschrieben
Was bedeutet nun Byte, Halbwort, Wort, Doppelwort
Ein Computer, besonders der Prozessor, aber auch der RAM, arbeitet mit Addressierung. Es ganz normal, dass jedes Byte im Arbeitsspeicher einzeln addressiert werden kann, zum Beispiel die Addresse
1.) 1
2.) 0
3.) 23
4.) 123123
5.) ...
Trotzdem gibt es Computer, da lassen sich die Speicherstellen nur Wortweise addressieren. Das heisst, wir erreichen nur die Speicherstellen
0, 2, 4, 6, 8, ...
Das bedeutet nicht, dass die Werte
1, 3, 5, 7, ...
ausgelassen werden. Aber wenn wir ein Wort vom Arbeitsspeicher in den Prozessor übertragen, dann immer Wortweise, das heisst, 16 Bit weise
Nun: Selbst, wenn wir jedes Byte addressieren, besteht die Möglichkeit ein Speicherbereich einer bestimmten grösse an zu sprechen. Und das sind eben
1.) Byte
2.) Halbwort
3.) Wort
4.) Doppelwort
Jetzt können wir jede Addresse im Arbeitsspeicher erreichen und es ist wichtig, ob diese Addresse so gelesen wird, dass ein Byte oder ein Doppelwort folgt. Das heisst, die Zellen im Arbeitsspeicher sind belegt
1.) Es ist jedes Byte belegt
2.) Es sind zwei Byte belegt
3.) Es sind 4 Byte belegt
Das betrifft nicht auf ein Mal, das gesamte System. Während die eine Variable 2 Byte belegt, im Arbeitsspeicher, belegt eine andere vier Byte
II.5.) Variablen, nächster Teil
Was ist nun eine Variable
Eine Variable ist eine benannte Speicherstelle im Arbeitsspeicher. Sie hat
1.) Einen Wert - weil jede Zelle im Arbeitsspeicher immer einen Wert
2.) Sie hat eine Addresse, weil jede Zelle im Arbeitsspeicher eine Addresse hat
3.) Sie hat einen Namen, dieser Name taucht nur in unserem C programm auf
4.) Sie hat einen Typ. Dieser Typ taucht in unserem C Programm auf, allerdings auch im Computer selber, denn der Typ legt zum Beispiel fest, ob eine Variable
a) ein Byte
b) ein Halbwort
c) ...
gross ist
Gut, wozu dienen Variablen? Variablen dienen dazu, zu rechnen. Wir müssen nun verstehen, was eine Operation ist
II.5.2.) Die Operation
a = 5 + 2; in C
a := 5+2; in Pascal
a = a+1; in C
a := a+1; in Pascal
a = a+2; in C
a := a+2; in Pascal
a = a+b-c; in C
a := a+b-c; in Pascal
a = (b+c)*2; in C
a := (b+c)*2; in Pascal
Ein Ausdruck ist eine Mathematische Vorschrift, mit Operatoren wir wie sie aus dem Alltag kennen. Wir kennen alle im Alltag
1.) Addition
2.) Subtraktion
3.) Multiplikation
4.) Division
5.) Und manche den Rest
Gut: Woher kennen wir die Addition
1.) Wenn wir einkaufen gehen, kaufen wir Produkte, mit dem Preis,
0,59 Euro; 2,79 Euro, 5,99 Euro
Diese addieren wir
2.) Wir kennen einfache Rechenvorschriften, wie
1+5
2+7
9+128
3.) Wir kennen kompliziertere Rechenvorschriften, wie
(1+2)+(8+(29+10))
7+(1+2+((8+5)))+1
Diese Rechenvorschriften verknüpfen mit dem Plus Operator '+' Konstante Werte, wie 1, 4, 9, 5, ...
Die Operatoren lauten
1.) + Addition
2.) - Subtraktion
3.) * Multiplikation
4.) / Division
5.) % Rest
Gut: Diese Operatoren lassen sich Mischen. Wir können schreiben
(1+2)*3
3*(2+1)
2*(3+1)
2*(3+2*(5*7))
2*(7+1)*(5+8)*10
usw
Nun erhalten wir durch Verknüpfung von Operatoren einen Wert. Diesen Wert erhalten beim Einkaufen, indem wir die Werte der Produkte, also die Preise addieren. Gehen wir zur Kasse, wissen wir, wie viel wir zahlen müssen.
Einer Variable wiederum lässt sich ein Wert zu weisen. Bisher hatten wir die Operatoren
+, - , *, /, %
Nun kommt allerdings ein weiterer Operator dazu. Der Zuweisungsoperator
1.) In C: =
2.) in Pascal: :=
Daneben gibt es einen weiteren Zuweisungsoperator ähnliches, der uns beim Compilerbau begegnet
3.) ::=
Dieser Operator ::= hat nichts mit einem Zuweisungsoperator zu tun. Er ist ein Operator, der einen Namen, eine Rechenvorschrift zu ordnet
1+5 ist eine Rechenvorschrift. Es ist geschriebene Mathematik
schreiben wir
a ::= 1+5
Dann steht a für die Rechenvorschrift 1+5
Das wiederum mit der Zuweisung nichts zu tun
Schreiben wir
a := 5+1; // in Pascal
a = 5+1; // in C
Haben wir der Variable a, den Wert 5+1 zugeordnet und der Wert 5+1 entspricht 6
Das heisst, die Variable hat nun den Wert 6
Welche Attribute hat eine Variable
1.) Name
2.) Addresse
3.) Typ
4.) Wert
Gut, eine Variable ist eine benannte Speicherstelle im Arbeitsspeicher. Weisen wir der Variable a den Wert 6, dann steht an der Stelle im Arbeitsspeicher mit der Addresse, für die die Variable a steht, der Wert 6
Das heisst, eigentlich existieren im Computer keine Variablen, aber in unserem C Programm, und mit a bennen wir die Speicherstelle mit der Addresse 41 im Arbeitsspeicher. Zum Beispiel
Jetzt steht an der Stelle im Arbeitsspeicher mit der Addresse 41, der Wert 6
Gut. Jetzt haben wir, das Prinzip des Arbeitsspeichers verstanden und den Begriff Speicherplatz und den Begriff Variable.
Wozu dient nun eine Variable. Es ist ein wenig komisch, einer Variablen, die eine Addresse im Arbeitsspeicher darstellt einen Wert zu zu ordnen. könnten wir das nicht so machen. Gut die Antwort jetzt ist keine Antwort. Das geht mit Addressen auch
Trotzdem:
Bisher hatten wir
1.) a = 5
2.) a = 5+1
3.) a = (5+2)*3
4.) a = ((4*2)+2(2+1))*5
5.) b = 123+1
6.) b = 1
...
Wir müssen uns nun einen Denksprung erlauben. Bisher haben wir einer Variablen Wert zu gewiesen. Dieser Denksprung ist der wohl wichtigste Denksprung im Bereich der Computer überhaupt. Es macht wohl den gesamten Computer aus
Wenn wir eine Variablen einen Wert zuweisen, dann ist die Variable, das ziel. Wir haben nicht nur ein Ziel, sondern eine Quelle
1.) Ziel
2.) Quelle
1.) Destination
2.) Source
Wir müssen unterscheiden:
1.) Eine Quelle ist ein Ausdruck, ein Ausdruck besteht aus
1.1.) Operanden
1.2.) Operatoren
1.) Die Operatoren sind
+, -, /, *, ...
2.) Die Operanden sind zunächst feste konstante Werte, wie 1, 2, 512, 1232, ...
Einem ausdruck lässt sich kein Wert zuweisen
5+1 != 4+3
Das heisst, ich kann nicht sagen, der Ausdruck 5+1 ist jetzt der Wert so und so. Der Ausdruck hat selber einen Wert. einem Konstanten Wert kann ich keinen Wert zu ordnen. Ist ein Wert ein Wert, ist der Wert fertig, und ich kann einem Wert, keinen anderen Wert zu ordnen.
Anders einer Variablen. Einer Variablen kann ich einen Wert zuordnen
a = 5+1
a = 4+3
5+1, obwohl geschrieben mit Operator und Operand, ist ein trotzdem ein Wert. Der wert ist 6
Gut, nun habe ich bei der Zuweisung eine Quelle und ein Ziel
1.) Source = Quelle
2.) Destination = Ziel
a) Das Ziel kann nur eine Variable sein, kein Ausdruck
b) Die Quelle kann ein Wert sein oder muss ein Wert sein
b.1.) Ausdruck
b.2.) ein einzelner Wert
b.3.) Ja was noch, gibt es da noch was?
Ja, natürlich. weil, eine Variable hat
1.) Eine Addresse
2.) Einen typ
3.) Einen namen
4.) Einen Wert
Und jetzt geht es um (4.) Wenn eine Variable einen Wert hat, kann ich schreiben
b := a+1; //in Pascal
b = a+1; //in C
Was bedeutet das? Die Variable hat einen Wert. Zum Beispiel 6. Da sie immer einen wert hat, kann ich den in einem Ausdruck verwendet. Hat die Variable den Wert 6, hat der Ausdruck
a+1
Den Wert 7. Und das ist, was programmieren spezifisch macht. Ausdrücke der Art
Schreiben wir in Pascal
1.) b := a+1;
2.) a := a+1;
3.) a := a+2;
4.) a := a+5;
5.) a := (a+2*(4+8));
6.) a := (a+2*(a+8));
7.) b := (a+2*(a+8));
8.) b := (a+2*(a+8+*(a+*2*b)));
Was wir nicht schreiben können
a+b !:= (2*a)
Gut, damit haben wir das fundamentale, das essentielle, das nicht weg zu denkende
Neben der Zuweisung gibt es den Vergleichsoperator
diese sind ==, <=, >= , <, >
entspricht: eq, le, ge, lt, gt
Das wollen wir nicht näher erläutern. aber vorsicht
== und = sind in C ein Unterschied. Das eine ist ein Vergleich, das andere eine Zuweisung
= und := sind in Pascal ein Unterschied. Das eine ist ein Vergleich, das andere eine Zuweisung
Im Gegensatz zur Mathematik wo jeder immer = (gleich) schreibt, müssen wir beim Programmieren aufpassen. Ein vergleich ist keine Zuweisung und umgekehrt.
Gut jetzt haben wir alles. Und jetzt kommen wir zum Datentyp
II.6.) Der Datentyp
Hier müssen uns der Mathematik zunächst bedienen.
Als allererstes müssen wir uns einen nicht mathematischen Unterschied begreiflich machen. er steht über der Mathematik
1.) In der Schule gibt es Germanistik - Sprachwissenschaft
2.) In der Schule gibt es Mathematik und zwar Algebra
1.) In der Sprachwissenschaft schreiben wir Texte. Diese könnten lauten wie: "Hallo, ich möchte sie herzlich begrüssen". Diese Texte bestehen sinngemäss, aus Zeichen, die man Buchstaben der lateinischen Sprache nennt. Der Germanist rechnet zunächst wenig. Mit den Worten der Deutschen Sprache formt er Texte. Diese kann er niederschreiben. Das tut er in Form der lateinischen Buchstaben
2.) In der Schule in der Mathematik wird gerechnet. Das heisst, wir rechnen aus
- 1+4
- 7+2+3
- (4+1)*(7*(2+3))
und so weiter
Der Mathematiker braucht zahlen, wenn er noch nicht zu den Variablen durchgedrungen ist, der Sprachwissenschaftler braucht Buchstaben
Damit haben wir zwei unterschiedliche Typen bereits im Visier
1.) Das eine sind Zeichen für den Sprachwissenschaftler ('a', 'b', 'c', ..., 'z'), aber auch Ziffern ('0', '1', '2', ... '9')
2.) Das andere sind Zahlen für die Mathematiker 1, 3812, 7123812
irgendwas
Dafür brauchen wir zwei Datentypen
1.) Ein Datentyp für Zeichen - char - char steht für Character und das ist ein sehr im englischen stark angelegtes Wort für Zeichen
2.) Datentypen vom Typ Ganzzahl. Das Englische Wort für Ganzzahl lautet Integer. Wir reden nicht von NUM sondern von INTEGER. Es gibt auch Programmiersprachen, die würden das Schlüsselwort NUM zu lassen. Das hängt von der Programmiersprache ab
Gut: Schaeun wir uns den Typ Character an.
II.6.2.) Character
1.) Der Charakter erscheint uns am Computerbildschirm als Zeichen. Wir sehen lauter 'a' und 'u' und so weiter. Das erscheint am Bildschirm. Und ist irgendwo gespeichert, dass dieses Zeichen so erscheint
2.) Der Computerwissenschaftler kennt den Unterschied so zunächst nicht. Wir könnten uns einen Code ausdenken
0 <=> 'a'
1 <=> 'b'
2 <=> 'c'
3 <=> 'd'
...
26 <=> 'z'
Jetzt wissen wir, dass die Speicherzelle, der Speicherplatz im Computer ein Byte gross ist. Und wir wissen, das binäre zählen geht so
001
010
011
100
101
110
111
Indem wir nicht 'z' speichern, sondern 26, haben wir z gespeichert. Es ist Aufgabe der Hardware das am Bildschirm richtig dar zu stellen. Dabei speichern wir für Zeichen, ledigliche ganzzahl Werte.
0 <=> 'a'
1 <=> 'b'
2 <=> 'c'
3 <=> 'd'
...
26 <=> 'z'
Der Informatiker wird keinen zwischen einer Ganzzahl und einem Zeichen finden. Ausser einem Unterschied
1.) Der Charakter ist ein Byte gross, das heisst 8 Bit
2.) Die Ganzzahl ist 16 Bit, Minimum oder 32 Bit oder 64 oder sogar 128 Bit
Gut. Es gibt allerdings einen intelligerenteren Code als
0 <=> 'a'
1 <=> 'b'
2 <=> 'c'
3 <=> 'd'
...
26 <=> 'z'
Das ist der berühmte ASCII Code. Den stelle ich hier nicht vor. Hier wurden auch ganz andere Zeichen codiert.
Typisch für den ASCII Code ist, ein Zeichen, entspricht einem Byte entspricht 8 Bit
Das macht den Unterschied, zwischen Charakter und Ganzzahl aus
Wir könnten übrigens probieren eine Gannzahl im Wert von 0 bis 255 am Bildschirm dar zu stellen und es wird uns sehr gefallen, aber es wird ein Zeichen da sein
Üblich in der Mathematik ist, dass es Wertebereiche gibt.
Was wir häufig vergessen, an zu geben sind Wertebereiche zum Beispiel von 0 bis 255
Eine Variable kann im Computer nicht jeden beliebigen Wert annehmen, den sie in der Mathematik. Gannzahlen in der Mathematik lassen sich beliebig fortsetzen. Wir können nach 1827312378123817381023103023 immer weiter zählen und wir finden kein Ende. Anders ist das mit Gannzahlen im Computer. Diese reichen von
0 bis 255
0 bis 2^16-1
0 bis 2^32-1
und so weiter
Wertebereiche müssen in der Mathematik grundsätzlich angegeben werden, wenn es sich nicht um den ganzen Wertebereich der Menge handelt. Dieser ist bei Zahlen oft unendlich. Unendlich als Zahl gibt es nicht. Aber es gibt ein Zeichen für Unedlichkeit und das betrifft einen Näherungswert, den wir allerdings nicht annäheren. Das bedeutet, wir zählen immer weiter.
Gut, sowohl, Charakter, was ein gewisser Ganzzahlenbereich ist, als auch Ganzzahlen haben einen Wertebereich
0 bis 255
0 bis 2^16-1
0 bis 2^32-1
und so weiter
In der Mathematik wiederum haben wir
1.) Die Natürlichen Zahlen
2.) Die Ganzen Zahlen
3.) Die rationalen Zahlen
4.) Die Irrationalen Zahlen
Die Reellen Zahlen sind die rationalen Zahlen und die irrationalen zusammen genommen.
Das heisst, wir haben
1.) Die Natürlichen Zahlen
2.) Die Ganzen Zahlen
3.) Die reellen
3.1.) Die rationalen Zahlen
3.2.) Die Irrationalen Zahlen
Der gewöhnliche Mensch unterscheidet gerne zwischen Ganzzahlen und Kommazahlen. Der Spruch, was steht hinter dem Komma ist üblich.
1.) Ganze Zahlen
2.) Kommazahlen
1.) Die Natürlichen Zahlen (Ganze Zahl)
2.) Die Ganzen Zahlen (Ganze Zahl)
3.) Die reellen (kommazahl)
3.1.) Die rationalen Zahlen (Kommazahl)
3.2.) Die Irrationalen Zahlen (Kommazahl)
Wir müssen noch etwas unterscheiden
Rationale Zahlen
1.) Beliebig Fortsetzbare Kommazahlen: etwa 1/3 = 0.3333....
2.) Kommazahlen mit einer Festen Ziffernfolge hinter dem Komma. Sie Währung
eine Währung wie die DM, der Euro, oder der US-$, sind gewöhlich
1.55 $
2.59 $
Gut. Bisher haben wir dargestellt
1.) Charakter: Zeichen
2.) Ganzzahlen
Nun kommen die Berühmten, Kommazahlen. Die Kommazahlen, bei der Programmierung, sind
1.) float
2.) double
Kommazahlen im Computer sind Fliesskommazahlen. Wie genau das funktioniert ist egal. Aber wir müssen uns merken
ieee-754-std
f = (-1)^s * 1.m * 2^(e-b)
32 Bit: Einfache Genauigkeit, 64 Bit: Doppelte, 80 Bit: Erweiterte
Was heisst das nun?
In der Mathematik gibt es "Kommazahlen" die nur gerundet in Form von Ziffern dargestellt werden können. Dazu gehören die Rationalen Zahlen
1.) 1/3
2.) 1/6
3.) 2/3
4.) ...
Würden wir das ausschreiben, erhielten wir beim ersten
0.3333....
Das liesse sich fortsetzen. Irrationale Zahlen sind anders. Dazu gehören
1.) SQURT (2)
2.) SQURT (3)
...
Irrationale Zahlen lassen sich als Ziffernfolge hinschreiben. Nicht fertig. Aber wir wissen 1/3 = 0.3333... wird bei 3 bleiben. Irrationale Zahlen, weisen ein sehr seltsames Muster auf
Beiden Wertebereichen ist gemein, dass sie unendlich fortsetzbar sind. Das lässt in der Informatik mit einer Funktion realisieren. Wie auch SQRT (2) in der Mathematik nur als Algorithmus formulierbar ist, zum Hinschreiben, allerdings: Das gibt irgendwann einen Stackoverflow
Gut, wir können im Computer keine Werte speichern, die sich unendlich fortsetzen. Wir können weder
1.) Beliebig grosse Werte speichern
2.) Beliebig genaue
Das heisst, die genauigkeit findet irgendwann ein Ende. Und: Deswegen müssen wir uns merken:
ieee-754-std
f = (-1)^s * 1.m * 2^(e-b)
32 Bit: Einfache Genauigkeit, 64 Bit: Doppelte, 80 Bit: Erweiterte
Und was ist der Unterschied zwischen Float und Double
Dieser Unterschied ist eben prägnant
Wir hatten es mit Speicherplätzen im Arbeitsspeicher von der grösse von
1.) 1 Byte: Byte
2.) 2 Byte: Halbwort
3.) 4 Byte: Wort
4.) 8 Byte: Doppelwort
zu tun.
ob wir float oder double verwenden, in C, bezieht sich darauf, wie genau unsere Fliesskommazahl ist
1.) float: Nicht so genau
2.) double: genauer
3.) long double: noch genauer
Wenn wir genau hinschauen entspricht diese unserem ieee-754-std für Fliesskommazahlen:
1.) float: einfache Genauigkeit: 32 Bit
2.) double: doppelte Genauigkeit: 64 Bit
3.) long double: erweiterte Genauigkeit: 80 Bit
Jetzt müssen wir einen weiter Unterschied finden
1.) Wir müssen in der Mathematik: Immer die Menge angeben: Das ist die Zielmenge und die Ausgangsmenge
2.) Wir müssen den Wertebereich nicht immer angeben, aber oft schon, wenn ihn nicht angeben, reicht er bei rationalen und irrationalen, das heisst, reellen von - undlich bis + unendlich
Gut: Das gilt auch für unsere Ganzen Zahlen
1.) float: einfache Genauigkeit: 32 Bit
2.) double: doppelte Genauigkeit: 64 Bit
3.) long double: erweiterte Genauigkeit: 80 Bit
erlauben auch einen Wertebereich. Die Fliesskommazahl wird nicht nur genauer, sondern es ist ein grösserer Bereich darstellbar. Ebenso bei Ganzzahlen
1.) 2 Byte: entspricht einem Wort oder Halbwort
2.) 4 Byte: Entsprechen einem Wort
3.) 8 Byte: Entsprechen einem Doppelwort
Dies erklärt, warum wir in C
- short int
- int
- long int haben
Wir müssen uns nicht darum sorgen, dass es in dem einen Fall ein wort in dem anderen Fall ein long int
long, short, aber auch int gehören zur Syntax C. Das heisst, zur Sprache. Im Computer sprechen wir von Byte, Halbwort, Wort, Doppelwort
C benutzt die Bezeichnung
- long
- short
- aber auch int, float, double
und so weiter.
Im Computer benutzen wir diese Bezeichnungen nicht. Wir benutzen zum Beispiel Wort und Halbwort
C:
- short int
- int
- long int
Computer:
- halbwort
- wort
- doppelwort
Dies hat nicht eine Auswirkung auf den Speicherbereich, den eine Variable in Anspruch nimmt, sondern auf den Zahlenbereich der darstellbar ist. Ein Short kann zum Beispiel Werte annehmen
- short: 0 .. 2^16-1
- int: 0 .. 2^32-1
- long: 0 .. 2^64-1
Gut. Damit haben wir den wichtigsten Teil. Und nun folgt
II.6.3.) Signend und unsigned
im Grunde genommen werden signed und unsigned nicht anders gespeicher. Aber auch float, wird nicht anders gespeichert
1.) signed: Eine Folge von Bits, zum Beispiel 16, die an einer Speicherstelle gespeichert werden
2.) unsigned: Eine Folge von Bits, zum Beispiel 16, die an einer Speicherstelle gespeichert werden
2.) float: Eine Folge von Bits, zum Beispiel 32, die an einer Speicherstelle gespeichert werden
Allerdings
- signed: steht für Integer mit Vorzeichen
- unsigned steht für Integer ohne Vorzeichen
in der Mathematik unterscheiden wir
1.) Die natürlichen Zahlen
2.) Die ganzen Zahlen
1.) Die natürlichen Zahlen reichen von 0..2^16-1 und so weiter
2.) die ganzen von -2^15 .. 0 .. 2^15-1
1.) Die Vorzeichenbehafteten Zahlen können eine - vorne dran tragen
2.) Die Zahlen ohne Vorzeichen sind nur positiv
Das heist:
-7
-5
1-8
sind Zahlen mit Vorzeichen.
1.) Ein wichtiger Teil, vergleichend für alle Programmiersprachen
2.) Ein wichtiger Teil bezüglich dem Netzwerk
3.) ein Hallo-Welt-Programm
II.7.) Vergleichen wir
- Der Operator für die Zuweisung in C lautet =
- Der Operator für die Zuweisung in PASCAL lautet :=
Ebenso was die Datentypen betrifft
- in C
- char
- int
- signed int
- unsigned
- es gibt übrigens: auch signed char und unsigned char
- long int
- unsigned long int
- ...
- lauten in PASCAL meinetwegen
- INTEGER
- NUMERIC
- FLOAT
und so weiter
Der Unterschied besteht, wie wir unsere Programmiersprache implementieren
Die einen nehmen Gross und kleinschreibung unterschiedlich
- char/CHAR
- integer/INTEGER
- numeric/NUMERIC
die anderen kürzen die Typbezeichnungen teilweise ab
- char/CHAR
- int/integer/INT/INTEGER
- num/numeric/NUM/NUMERIC
Manche verwenden den Typ NUM andere INT. Diese sind oft das gleiche. Mal sind sie so geschrieben und mal so. Das ist von der Programmiersprache abhängig und wir können unsere eigene Entwickeln. Und wir können die bestehende nehmen und einen Dialect entwickeln.
Gut.
II.8.) Jetzt, fehlt uns was
II.8.1.) Der Typ String, Zeichenkette
II.8.2.) Der Pointer, der Zeiger
II.8.1.) der Typ String
String ist immer dasselbe wie zeichenkette. Fast
Während wir bisher 'a', 'b', ..., 'z' einzeln gespeichert haben, sind wir nicht zu frieden
Wir wollen Zeichenketten speichern
"abcdefgh"
"ABCDEFGH"
"aBcDeFgH"
"abcdEFgh"
"Hallo Welt"
"Hallo dies ist ein Text"
"hasjasd"
Das sind nicht einzelne Zeichen, sondern die immer noch einzeln sind aber zusammen gehören. wir müssen unterscheiden
1.) Der Character, ein einzelnes Zeichen, mit einfachen Anführungsstriche ''
2.) Die Zeichenkette, eine Folge von Zeichen, mit doppelten Anführungsstrich " "
Gut. Eine Zeichenkette ist die Hintereinanderspeicherung von Zeichen im Arbeitsspeicher.
Aber: Eine Zeichenkette wie
"adjadsjasd"
ist immer eine konstante
II.8.2.) Der Typ Pointer
Es gibt Programmiersprachen, die erlauben Pointer als eigenen Typ. Dieser wird lauten
- POINTER
Oder C - sie sind auch quasi ein Typ
- int *
Was ist ein Pointer. Eine Variable hat
1.) Einen Wert
2.) Addresse
3.) Einen Typ
4.) einen Namen
Gut, es geht um (2.) Und darum dass eine Variable ein benannter Speicherplatz ist. Somit hat sie eine Addresse. Eine Addresse ist ein ganzzahliger wert
Gedankensprung: Kann der Computer zwischen Ganzzahlen und Addressen unterscheiden?
Antwort: Nein
Das heisst, die Addresse lässt sich speichern, wie eine ganzzahl
int * p;
Bedeutet in C, eine Variable, die, die Addresse einer Variablen von Typ int enthält
Wir wissen: eine Variable hat eine Addresse. Das heisst, eine Variable vom Typ int hat eine Addresse
schreiben wir
int a
hat a eine Addresse. Diese Addresse können wir in einem Pointer speichern. Der Pointer ist
1.) Ein Pointer vom Typ, ausgedrückt durch *
2.) Ein Pointer vom Typ Pointer, aber er zeigt auf eine Addresse, hinter der sich eine Variable von einem Typ verbirgt. Das heisst, wir müssen int mit angeben
Wir schreiben
int * p;
Sowhl int als auch * gehören zum Pointer
p ist ein Variable vom Typ Pointer auf int
Wie können wir die Addresse speichern?
int a = 5;
int *p = NULL;
p = &a;
&a ist die Addresse von a.
Wir können auch Pointer erzeugen vom Typ
int ***p3;
int **p2;
int *p;
**p2 zeigt auf Pointer die auf Variablen vom Typ int zeigen
II.8.3.) void
Da eine Addresse immer eine Addresse ist und immer gleich lang ist - spielt es keine Rolle, ob die Variable mit der Addresse 2 Byte oder 4 Byte gross ist. Eine Addresse ist immer eine Addresse.
Es gibt den Pointer Typ
void *p;
void *p bedeutet, dass p sowohl auf Variablen von Typ Integer, vom Typ float, aber auch auf Pointer, auf alles zeigen kann. Hier steht einfach eine Addresse.
void ist der leere Datentyp.
Wir hatten
1.) Charakter
2.) Ganzzahl
3.) Fliesskomma
4.) nun: void
void ist ein Datentyp, der keine bestimmte Mathematische Menge bezeichnet.
II.8.4.) Die Zeichenkette
Neben dem Pointer gibt es das Array
II.8.4.1.) Das Array
int a [4];
char c [128];
char x [8][1024]
Arrays sind nicht einzelne Speicherstellen, sondern ganze Speicherbereiche. Das heisst, belegte Speicherstellen, die hintereinander belegt wurden
Und Arrays werden Addressiert von
0 bis n-1
II.8.4.2.) Die Zeichenkette und der Pointer
was hat der Pointer damit zu tun. Ohne, dass die Programmiersprache es festlegt, kann ein Array überschritten werden. Definiere ich ein Array
int a [4];
kann ich auf
a [128132];
zugreifen. Damit lande ich im Speicher irgendwo hinten. Ein Array bedeutet, neben der arithmetik nichts anderes, als Pointer. Es ist fast das gleiche. Das bedeutet: Ein Array gibt die Anfangsaddresse eine Speicherbereichs wieder
Und dasselbe lässt sich mit einem Pointer erreichen.
Ich kann ein Pointer auf ein Array zeigen lassen
char *p;
char str [] = "Hallo Welt"
p = str;
Das & entfällt in dem Falle
Eine Zeichenkette ist nichts anderes, als ein belegter Speicherbereich mit einer Anfangsaddresse vom Typ char, wenn es kein Konstante ist
Nun haben wir die Zeichenketten
char *str1 = "Hallo Welt";
char str2 [] = "Hallo Welt";
char str3 [1024] = "Hallo Welt";
Gut. Gedankensprung
1.) Addresse
2.) Grösse der Variable, des Datums
3.) Speicherbereich
Es geht um (3.) Speicherbereich
Damit haben wir
- Datentypen
- Zeichenketten
- Speicherbereich
alles geklärt. Und Kapitel (II.) ist fertig.
Nur noch eines
II.9.) Unser einziges und erstes C-Programm
#include <stdio.h>
int main (void) {
printf ("Hallo Welt\n");
return 0;
}
Dieses Programm ist als solches geschrieben, lässt sich aber nicht ausführen.
Der Computer führt keinen solchen Programme aus. Dazu müssen wir das übersetzen. Wir speichern es als
hallo.c
Dann führen wir gcc aus. Den wir hoffentlich installiert haben. Das geht unter Linux mit
apt-get install gcc
gut, dann ist der Installiert. Und wir geben in der Konsole ein
gcc hallo.c
./a.out
Das Programm, was in C geschrieben wurde, wird in hallo.c gespeichert. Es wird in ein Computer ausführbares Programm a.out übersetzt. Man sagt Binary. Und es ausgeführt, mit
./a.out
Als Ausgabe erhalten wir
hallo welt
Wichtig ist, dass wir die Zeichenkette
"Hallo Welt"
und die Funktion
printf ()
Was eine Funktion ist, ist jetzt nicht in diesem Teil von dem ganzen hier.
Aber wir müssen wissen, es gibt funktionen für den Gerätezugriff
Dazu gehören:
1.) Tastatur: stdin - Standard Eingabe
2.) Bildschirm - stdout - standard ausgabe - aber auch stderr - Standardfehlerausgabe
3.) Datei Ein und Ausgabe - fprint - und fscanf - das heisst, eine Datei auf der Platte
4.) Netzwerk
...
Dieser Zugriff entsteht über die Systemaufrufe im Betriebssystem und BIOS
und ist das wichtigste überhaupt.
1.) Wir übertragen generell ASCII Code über das Internet, übere unsere Leitung. ASCII Code, eigentlich ist alles Text , auch Bilder, aber gleichzeitig sind sie Binär. Text und Bild variiert. Text enthält einige Zeichen nicht.
Es gibt die Möglichkeit Bilder als Code zu übertragen, oder als die lesbaren Ziffern vom Code
2.) Wir speichern Serverseitig, nicht in unserem Browser die Seite, die Daten, die der Nutzer abfragt und speichert, in Form von Dateien
III.) Das Linux
Das Linux holen, muss jeder gucken, wie er das hinkriegt.
Dazu sage ich nur: Geben sie in google ein im Browser
debian download iso images
dann laden sie diese Images. Die können sie auf CD brennen, oder DVD oder: Sie können die auf einen Stick richtig unterbringen. Der Heisst, der Stick ist mit einem ISO Image so voll, wie es die DVD wäre. Moderne Computer starten vom Stick. Die Linux Installationsroutine beginnt und sie können Linux installieren. Ich gebe keine Garantie, dass Windows bleibt, aber das ist auch nicht nötig. Daten vorher retten, falls man die behalten will
III.2.) Die Repositorys und der Netzwerkzugriff
Das wichtigste, bei Linux, ist keine Programme aus irgendwelchen Quellen installieren
Linux ist ein Quelloffenes Betriebssystem. Das bedeutet man bekommt keine Ausführbares Programme, sondern, die Quelltexte, die man selber übersetzen muss.
Gut: Trotzdem ist das viel arbeit und es gibt einfach Programme, die will jeder in Linux haben. Sie gehören zum Standard. Eine Distribution, wie
- debian
- Ubuntu
- SuSE
sind ein fertiges Linux, mit Installationsroutine. aber es sind auch alle Programme dabei, die man haben will. Wie geht das? Das sind viele.
Ganz einfach: Diese sind auf einem oder mehreren Servern gespeichert. Der Server enthält nicht nur alle bereits übersetzten Programme, sondern eine Liste.
Diese Liste wird von ihrem Linux Rechner abgefragt. Also:
Linux ohne Internet - vergessen sie es. Mobilfunk - vergessen sie es. Sie brauchen eine statische Internet anbindung. Das Repository enthält alle Pakete und die Liste, die sie bei Linux installieren können. Eigentlich alle.
Wenn ihre Netzwerkverbindung besteht und das tut sie hoffentlich, müssen sie eingeben
apt-get install gcc
apt-get install apache2
apt-get install postfix
apt-get install php7.0
und so weiter
apt-get install sucht auf dem Server, der Distribution und mit der aktuellen Version. Nach den Pakete. Diese Pakete müssen sie vom Namen. Geben sie etwas abweichendes ein, werden sie nicht gefunden
Ist der Paketname richtig, wird das Paket geladen und installiert. Das ist alles.
III.) Der Webserver
Jetzt müssen sie folgendes tun:
apt-get install apache2
oder
apt-get install nginx
Jetzt ist der Webserver installiert. Von der Konfiguration unterscheiden die sich nicht besonders.
Um einen Server zu konfigurieren müssen sie normalerweise
in
/etc/apache2
gucken, oder
/etc/postfix
oder
/etc/ngix
In dieser Ordnern gucken sie nach den Config Files.
Der apache2 hat in /etc einen Ordner
/etc/apache2
da gucken sie rein. Da ist alles mögliche. Hier konfigurieren sie ihren Webserver. Sie müssen in google gucken, welche Dateien für ihre Konfiguration gucken und nach den Einstellungen in der Konfiguration
Die Syntax weicht von Server zu Server ab.
postfix ist ein Mailserver und apache2 ein Webserver.
Aber: Wichtig, für apache2 ist etwas ganz entscheidendes:
Die Konfigurationsdateien alle nutzen uns nichts. Sondern wir wollen HTML-Dokumente sagen wir mal ins Netz übertragen.
Wie geht das? Unser Webserver hat eine IP-Addresse
37.24.242.146
Diese ist
1.) Einmalig und eindeutig
2.) Im Netz sichtbar
Das unkenntlich machen von IP-Addressen ist ein Irrtum. Eine IP-Addresse kein KFZ-Kennzeichen. Ihre Auto würde auch ohne Fahren, so sehr die Polizei das anders sehen möchte. Ein Datenaustausch, im Internet ohne IP-Addressen ist dagegen nicht möglich. Es gibt die Möglich von Proxys und Tor, die dem Server verheimlichen, wer sie sind. Trotzdem haben auch sie am Ende - an der Endstelle, eine eindeutige IP-Addresse.
Sonst gibt es keinen Verkehr. Es ist die aufgabe des Proxys und des Tor - die Endstelle entsprechend richtig um zu setzen
Der Server hat ausser bei Tor auf jeden Fall eine eindeutige IP-addresse, sonst ist er nicht erreichbar.
Gut, geben wir den Domainnamen
https://www.ituenix.de
im Browser ein. wir die Homepage angezeigt. Was das bedeutet das:
1.) Unser Client fragt nach der IP-Addresse, die sich hinter der URL www.ituenix.de verbirgt. Dazu fragt er einen DNS-Server. Woher kennt er den jetzt schon wieder. Im Gegensatz zu anderen Servern, muss der DNS-Server im System hinterlegt sein. Es gibt vielleicht viele DNS Server aber es gibt einige, die gelten als etabliert. Im System ist ein etablierter hinterlegt. Das fällt niemanden auf. Aber das OS ist so konfiguriert, dass er bereits enthalten ist
Wenn wir unsere URL angeben, wird eine Anfrage, an den DNS-Server getätigt und er gibt die IP-Addresse hinter der URL An den Browser weiter
2.) Der Browser verbindet sich, anderes Protokoll HTTP mit dem Webserver, von der URL. Er wendet sich an die IP-Addresse. An den Server findet eine Anfrage statt. Nach einem Dokument. Nach welchem denn
es gibt
https://www.ituenix.de
https://www.ituenix.de/index.php
und vielleicht
https://www.ituenix.de/index.html
Wenn ich https://www.ituenix.de abrufe, wird eigentlich immer index.php übertragen, wenn nicht index.html
Das geschieht über eine Abfrage, des Browser an der Server.
Während index.php PHP Code enthält überträgt nun der Server ein HTML Dokument an den Client. PHP ist für den Client nicht sichtbar.
Gut: Wie sieht ein HTML Dokumement aus
1.) Es ist eine Plain-Textdatei
2.) Es ist in HTML formatiert
3.) Das sieht etwa aus, wie das hier
<html>
<head><title></title></head>
<body>
</body>
</html>
Gut, das wird auf die Anfrage in Form einer Antwort, die eine ähnliche Syntax hat wie die Anfrage beantwortet, die Antwort enthält neben Ausdrücken, die die Syntax wie in der Anfrage haben, einen Anhang, nämlich die HTML Datei
Was muss ich unter diesem Anhang verstehen
Das erste ist: Dass die Daten alle in ASCII übertragen werden. Das heisst, wir können Anfrage und Antwort lesen.
Und der Anhang ist nicht etwas, mit ---- Bindestrich so dran hängt, dass er geöffnet werden, mit Ordner dran, sondern er steht als Text drunter. Oder nicht drunter, sondern das ist ein Text
Jetzt lautet die erste Frage: Wie kommt die HTML Datei zustande
Diese HTML Datei oder PHP Datei ist auf unserem Server gespeichert.
Und zwar in
/var/www/html
in
/var/www/html/
sind alle unsere Dateien unserer Homepage. Dazu gehört die index.php
Also
/var/www/html/index.php
und vielleicht
/var/www/html/index.html
Wenn wir in der Addressleiste aufrufen
https://www.einenichtexistierendedomain12342.de/xyz/dir123/html.html
Dann gibt es eine Datei
/var/www/html/xyz/dir123/html.html
auf dem Server. Gut. Wir können das Root Verzeichnis von apache2 konfigurieren.
<VirtualHost *:80>
ServerName www.ituenix.de
ServerAdmin david@ituenix.de
DocumentRoot /var/www/html/
</VirtualHost>
In der
/etc/apache2/sites-available/000-default.conf
In dieser Datei
/etc/apache2/sites-available/000-default.conf
eben in
/etc/apache2
werden die allernotwendigsten Konfigurationen eingestellt
Zum Beispiel das DocumentRoot-Verzeichnis
/var/www/html/
Es ist das Root-Verzeichnis des Webservers
Anders als das des Linux-OS
Das ist da Wurzelverzeichnis
/
Sie können auch eintragen:
<VirtualHost *:80>
ServerName www.ituenix.de
ServerAdmin david@ituenix.de
DocumentRoot /var/www/xyz/
</VirtualHost>
Gut. Jetzt ist die Frage, was zu tun ist. Ändern sie Einstellung in den Konfigurationskripten, müssen sie eingeben
/usr/sbin/service apache2 restart
Das ist notwendig. Sonst läuft apache2 weiter und nimmt von der neuen Konfiguration nichts an.
Es geht jetzt darum, wie sieht so eine Abfrage aus. Eine Abfrage sieht so aus:
GET ./index.html HTTP/1.1
host: www.ituenix.de
Das ist eine GET Abfrage. Es gibt
1.) Die GET Abfrage
2.) Die POST Abfrage
Diese Abfrage wird als ein Text, als Block vom Client zum Server übertragen
GET ./index.html HTTP/1.1
host: www.ituenix.de
Bedeutet, das sendet der Client, ohne, dass wir es merken. Der Client möchte die index.html haben
Die Antwort lautet
HTTP/1.1 200 OK
oder
HTTP/1.1 200 OK
Date:
Server:
X-Powerd-By:
Transfer-Encoding:
Content-Type:
Dahinter folgt das HTML Dokument. Das heisst wir kriegen etwas, wie:
HTTP/1.1 200 OK
<html>
<head><title></title></head>
<body>
</body>
</html>
Und erhalten das HTML-Dokument. Woher kommt das?
Dieses liegt in
/var/www/html/index.html
und enthält:
<html>
<head><title></title></head>
<body>
</body>
</html>
Jetzt wäre es an der Zeit, dass wir wieder zu C wechseln
IV.) Ich verweise auf eine Quelle
nämlich Galileo Computing. Sie finden auch Bücher, die sie kaufen können. Zufälligerweise entspricht das C und Linux. Hier werden die Funktionen für den Zugriff, auf das Internet in C dargestellt.
Gut. Ich gebe weder den Link ein, sie haben google. Noch erkläre ich das genauer
Was dort auch erklärt steht, ist der Dateizugriff unter Linux oder aber auch anderen Betriebssystemen in C.
Schauen wir uns, unser Hallo-Welt-Programm an. Das sieht aus, wie folgt:
#include <stdio.h>
int main (void) {
printf ("Hallo Welt\n");
return 0;
}
printf gibt die Zeichenkette "Hallo Welt" auf der Standard und Ausgabe aus
Es gibt auch die Möglichkeiten
1.) Zeichenketten in Dateien zu speichern
2.) Zeichenketten aus Dateien zu lesen
3.) Dateien in Verzeichnissen an zu legen
Um eine Datei zu lesen, bzw. in sie zu schreiben. Brauchen wir einen File Handler oder zumindest irgendeine Struktur, die auf die Datei selber verweist
Im Dateisystem haben Dateien einen Namen. Doch in C lässt sich eine Datei nicht über den Namen lesen
1.) Eine Datei muss geöffnet werden und es entsteht ein File Handler
2.) Der File Handler steht nun für die Datei und muss bei jedem Lese und Schreibezugriff angegeben werden
Eine Datei wird über einen Namen identifiziert
Zum Beispiel
"/var/www/html/index.php"
Also erstes öffnen wir die Datei mit fopen. Das geht wie folgt:
#include <stdio.h>
int main (void) {
FILE * fp = NULL;
char str [32];
if ((fp = fopen ("/var/www/html/index.php", "r")) == NULL) {
perror ("Datei liess sich nicht zum lesen oeffnen");
return 1;
}
fgets(str, 32, fp);
printf ("%s\n", str);
fclose (fp);
return 0;
}
Gut, das kann man auch ander schreiben:
#include <stdio.h>
int main (void) {
FILE * fp = fopen ("/var/www/html/index.php", "r");
char str [32];
fgets(str, 32, fp);
printf ("%s\n", str);
fclose (fp);
return 0;
}
Hier entfällt die Abfrage, ob die Datei richtig geöffnet wurde, das ist nicht gut
Ausser fgets gibt es fscanf
Das sieht wie folgt aus:
#include <stdio.h>
int main (void) {
FILE * fp = NULL;
char str [32];
if ((fp = fopen ("/var/www/html/index.php", "r")) == NULL) {
perror ("Datei liess sich nicht zum lesen oeffnen");
return 1;
}
fscanf(fp, "%s", str);
printf ("%s\n", str);
fclose (fp);
return 0;
}
Wichtig
- fopen
- fclose
fopen kann folgende Parameter haben:
1.) Der Dateiname ist zwingend
2.) "r" für lesend, "rw" für lesen und schreiben, "w", "r+", "w+"
Neben fscanf gibt es:
- fgets
- fscanf
- fwrite
- fread
- fprintf
- fputs
Das sind die wesentlichen Funktionen zum lesen und schreiben einer Datei.
Wir müssen eine Datei öffnen
1.) fopen
2.) Eine Datei schliessen: fclose
Der Unterschied besteht drin, bei fopen wird die Datei über den Dateinamen angesprochen.
Desweiteren im folgenden C-Programm wird die Datei über einen Dateihandler, vom Typ FILE angesprochen und zwar einen Pointer darauf FILE*
FILE ist eine Struktur, ein besonderer Datentyp.
Was wir feststellen werden, ist wir können jede Datei lesen und schreiben. Ob sie binär ist, oder vom Typ, ASCII-Plaintext
Genau, das tut unser apache2 auch. Dieser wurde in C geschrieben, bzw. lässt sich in C schreiben und er öffnet die Datei
"/var/www/html/index.php"
über die entsprechenden Funktionen. Liesst sie ein. Und überträgt sie genauso in das Netz. Genauso? Nein, mit dem Vorspann
HTTP/1.1 200 OK
...
Und zwar als
HTTP/1.1 200 OK
...
<html>
<head><title></title></head>
<body>
</body>
</html>
Die Übertragung über das Netz, findet eigentlich genauso statt, wie die Funktionen für Datei Zugriff.
Nicht ganz.
Es gibt andere Funktionen für den Dateizugriff, wie für das Netzwerk
1.) Dateizugriff
2.) Netzwerk
Der Unterschied besteht darin
1.) Eine Datei wird über einen Dateinamen identifiziert:
"/var/www/html/index.php"
2.) Eine Domain wird über den Domainnamen oder eine IP-Addresse identifiziert:
37.24.242.146
Wir haben es also mit einem unterschiedlichen vorgehen zu tun
Desweiteren heissen die Funktionen für den eigentlichen Zugriff, das heisst, für die eigentlichen Daten, bei der Datei
1.) Bei der Datei: lesen und schreiben
2.) Im Netzwerk: Senden und Empfangen
Wir müssen strikt unterscheiden
1.) Öffnen bzw. Netzwerkverbindung herstellen
2.) Lesen und schreiben bzw. senden und empfangen
3.) Die Datei schliessen bzw. die Netzwerkverbindung beenden
Es ist immer dieselbe Folge: Bei der Datei
1.) Öffnen der Datei
2.) Lesen und schreiben der Datei
3.) Die Datei schliessen
Im Netzwerkverkehr:
1.) Netzwerkverbindung herstellen
2.) senden und empfangen
3.) Netzwerkverbindung beenden
Die typischen Funktionen für das Datei lesen und schreiben sind
1.) schreiben: fprintf, fputs, fwrite
2.) lesen: fscanf, fgets, fread
1.) Datei öffnen: fopen
2.) Datei schliessen: fclose
Im Netzwerkverkehr gibt es kein Lesen und schreiben, sondern ein
1.) send
2.) recv
Eine Netzwerkverbindung muss anders aufgebaut werden. Im Gegensatz zu einer Datei, gibt es zwei Partner
1.) Den Server
2.) Den Client
1.) Der Server hat die Funktionen: Listen, Bind, ...
2.) Der Client so weit ich weiss, connect
Während wir bei einer Datei einen File Handler haben, haben wir im Netzwerkverkehr Sockets
Der Unterschied zwischen Server und Client ist folgender
1.) Server muss warten und lauschen. Wenn der Server immer angeht, wenn der Client angeht, ist das ein Wunder
2.) Der Client sendet eine Anfrage und erwartet, der Server läuft
Allerdings muss der Server viele Clients bedienen. Etwas ähnliches geht mit Dateien. Man kann viele gleichzeitig öffnen. Trotzdem: Der Server muss lauschen. Er muss warten.
Das macht den Unterschied, zwischen Dateizugriff und Netzwerkzugriff in C aus. Die Funktionen nicht die gleichen.
Was allerdings das gleiche ist:
Ist die Art, wie Daten übertragen werden. Schauen wir uns das TCP/IP-Netzwerkprotokoll an
1.) Bitübertragungsschicht
2.) Addressierungsschicht IP
3.) Paketschicht TCP
4.) Anwendungsschicht
Gut: Während IP und TCP für das Übertragen der Pakete zuständig sind.
Wir können wir uns merken. Dass die Zerlegung in Pakete näher an der Hardware ist. Ganz einfach. Wir zerlegen unseren Datenstrom in Pakete. Wäre der Datenstrom bereits addressiert, hätten die einzelnen Pakete keine Addressen.
Der Datenstrom wird in Pakete zerlegt und addressiert. das bietet sich technisch an. Doch, was ist der Datenstrom
Zum Beispiel HTTP.
Und HTTP bedeutet letzten Endes, nichts anderes, als die Übertragung eines textes in form von Zeichen eines Datenstrom. auf der Ebene der Anwendungsschicht, merken wir nichts von Paketen oder Addressen
In der Anwenderschicht ist alles zu einem Datenstrom zusammengeflochten.
Was macht das HTTP-Protokoll aus.
Das ist kein besonders kompliziertes Protokoll
Das wichtigste ist die Übertragung einer Text-Datei oder HTML-Datei. Das könnte auch so aussehen:
<html>
<head><title></title></head>
<body>
</body>
</html>
Das reicht uns aber nicht, wir haben ein Protokoll
HTTP/1.1 200 OK
...
<html>
<head><title></title></head>
<body>
</body>
</html>
Die Befehle des Protokoll
GET
POST
HEAD
PUT
DELETE
TRACE
OPTIONS
CONNECT
auf der Seite des Clients auf der Seite des Servers:
HTTP/1.1 200 OK
Daneben können wir Variablen mitübertragen:
HTTP/1.1 200 OK
Date:
Server:
X-Powerd-By:
Transfer-Encoding:
Content-Type:
<html>
<head><title></title></head>
<body>
</body>
</html>
So, was macht dieses Protokoll. die eigentlichen Daten, kommen nicht etwa, in Form eines Bildes, eines angehängten Ordners zu uns, sondern sie sind Teil der Übertragung.
HTTP/1.1 200 OK
steht am Anfang der Antwort. Sie ist teil des Protokolls. Ebenso:
GET
POST
HEAD
PUT
DELETE
TRACE
OPTIONS
CONNECT
Auf Seiten des Clients. Diese man könnte Befehle des Protokolls, sagen der anderen Seite, was zu tun ist.
Der Server selber liesst die Datei
/var/www/html/index.php
und überträgt sie so an den Client weiter.
Aber jetzt erst kommt PHP
V.) PHP und andere Programmiersprachen
Es gibt folgende wichtige Programmiersprachen für uns:
- ruby
- python
- javascript
- C
- PHP
und viele weitere.
Was ist unser Ziel?
1.) Wir brauchen eine Programmiersprache die als Programmiersprache unserer Internetseite dient. Das heisst, wir bauen sie in die Homepage ein. Sie läuft auf den Datein auf dem server, in
/var/www/html
2.) In die HTML-Dateien können wir eine Programmiersprache einbauen. PHP wird vom Server interpretiert. Es taucht in den übertragenen Dateien nicht mehr auf. Es erzeugt eine statische Ausgabe. Diese kann lauten:
<html>
<head><title></title></head>
<body>
</body>
</html>
Obwohl sie aus
index.php
stamm und dynamisch erzeugt wurde, etwa mit dem Inhalt
<?php
echo "<html>";
echo "<head><title></title></head>";
echo "<body>";
echo "</body>";
</html>
Von dem echo ist nichts mehr zu sehen. das interpretiert der Server, und wenn zur Laufzeit. trotzdem möchten wir in unsere HTML-Dateien JavaScript einbinden, damit diese Programmiersprache haben, die dann "sichtbar" ist
Speichern wir die Datei auf unserem. Bleibt das JavaScript erhalten
Ein JavaScript Code kann wie folgt aussehen:
<script>
alert ("Hallo Welt");
</script>
Gut.
V.II.) Die Installation von PHP
Haben wir apache2 installiert mit
apt-get install apache2
müssen wir php trotzdem gesondert installieren. php ist ein Modul von apache2. Aber es muss getrennt installiert werden. Das geht mit:
apt-get install php8.2
Es gibt viele weitere Pakete. Während php unabhängig von apache2 laufen kann, wird es trotzdem bei der Installation automatisch in apache2 integriert und ist verwenbar nach
/usr/sbin/service apache2 restart
Trotzdem könnte man es als Teil von apache2 auffassen. Es gibt Teile von PHP, die nachinstalliert werden können, die als Teil von PHP aufgefasst werden
dazu gehört:
php-gd
gd dient der graphischen Bearbeitung von Bildern und Graphiken. PHP selber stellt viele Funktionen zur verfügung, allerdings gibt es weit mehrere Funktionen.
Sie befinden in einer art Bibliothek und müssen nachinstalliert werden. Das als ein Paket.
php-gd
dient der graphischen Bearbeitung von Bildern. Ebenso lässt sich die Integration von MySQL in PHP bewerkstelligen.
apt install php-common libapache2-mod-php php-cli
apt install mysql
apt install php-mysql php-curl
Während MySQL ein Datenbank Server ist, brauchen wir Zugriff von PHP auf MySQL. Und MySQL muss zunächst installiert werden und dazu, die Schnittstelle zwischen PHP und MySQL
Gut? Die Frage ist, was tut PHP?
V.3.) PHP, POST, GET
Das Ziel von PHP ist der aufbau einer dynamischen Homepage
eine statische Homepage sieht wie folgt aus:
<html>
<head><title></title></head>
<body>
</body>
</html>
Ist eine Homepage dynamisch gibt der Nutzer Daten ein. Wenn er Daten eingibt, müssen diese an den Server übertragen werden.
Zunächst stellt sich die Frage: Wie sieht die HTML-Datei bzw. PHP Datei aus, die dem Nutzer erlaubt, Daten ein zu geben
<form method="POST" action="./form1.php">
<input type="text" name="text1"></input>
<input type="submit">
</form>
Wird diese Datei an den Browser übertragen, vom Server etwa so:
HTTP/1.1 200 OK
<html>
<head><title></title></head>
<body>
<form method="POST" action="./form1.php">
<input type="text" name="text1"></input>
<input type="submit">
</form>
</body>
</html>
Dann wird die Datei im Browser gleich richtig dargestellt. Es entsteht ein Button und eine Eingabebox. Hier können wir rein schreiben und den Button drücken
Jetzt kommen wir zum eigentlichen Teil.
Wie werden nun die Daten der Eingabebox an den Server übertragen.
Wir müssen unterscheiden.
1.) Die eigentlichen Daten, die der Benutzer eingibt, sie in der Programmierung, der Wert, was unsere Variablen betrifft, der Wert
2.) Die Variable hat wieder einen Namen. Sie enthält den Wert
Gut: In dem wir an den Server die eingeben Daten zurück übertragen, wird vom Client folgende Anfrage gestartet
GET /index.php?text1=UserText HTTP/1.1
host: ituenix.de
bei der GET Abfrage und bei der POST Abfrage sieht das so aus:
POST /index.php HTTP/1.1
host: ituenix.de
Content-Type: application/x-www-form-urlencoded
Content-Length: 14
text1:UserText
Der Unterschied zwischen der GET-Abfrage und der POST-Abfrage ist der, wie die Variablen kodiert in der Anfrage vorliegen
Gut, im Browser haben wir eine Addressleiste. Geben wir hier ein
https://www.ituenix.de/index.php?text1=UserText
Dann hat das mit dem Server nichts zu tun. Wir haben es in der Addresseleiste eingeben, aber das genügt nicht. Was passiert. In Wirklichkeit ist unser Browser ein Programm, was die Eingabe in eine Anfrage umwandelt. Der Browser erzeugt mit dem in der Addressleiste folgendes:
GET /index.php?text1=UserText HTTP/1.1
host: ituenix.de
Als Anfrage.
Wir können statt einer Variablen auch 2 oder mehr angeben:
GET /index.php?text1=UserText&text2=HalloWelt HTTP/1.1
host: ituenix.de
Ob wir eine GET oder POST Anfrage starten, hängt davon ab, was in unserem Formular steht. Wo steht das Formular. Das Formular ist Teil der Dateien des Servers,
HTTP/1.1 200 OK
<html>
<head><title></title></head>
<body>
<form method="POST" action="./form1.php">
<input type="text" name="text1"></input>
<input type="submit">
</form>
</body>
</html>
Hier erzeugt der Server eine POST-Anfrage vom Client. Hier eine GET:
HTTP/1.1 200 OK
<html>
<head><title></title></head>
<body>
<form method="GET" action="./form1.php">
<input type="text" name="text1"></input>
<input type="submit">
</form>
</body>
</html>
POST /index.php HTTP/1.1
host: ituenix.de
Content-Type: application/x-www-form-urlencoded
Content-Length: 14
text1:UserText
in der POST-Abfrage wird unten die Variable übertragen
Die Frage ist, was tun wir mit dem auf dem Server erhaltenen Wert.
V.4.) Die Programmiersprachen PHP, JavaScript, Python, C, ...
zunächst müssen wir wissen, wie in C und PHP Variablen behandelt werden
In C werden Variablen so behandelt
int x = 123;
char a = 'z';
PHP ist längst nicht streng typisiert. Ausdrücke können wir folgt lauten
$x = 5+1;
$x = "Hallo Welt"
Wir müssen streng genommen, eine Variable nicht unbedingt deklarieren, um sie zu verwenden. Ausser es geschieht in einem Ausdruck. Mit der Zuweisung eines Werte an eine Variable, entsteht in PHP die Variable.
Eigentlich sollte man die trotzdem deklarieren, aber es geht auch so.
Es gibt ebenso strenge Typenregeln. Versuche zu einem String 5 zu addieren, mag die Sprache das zu lassen, weil sich dahinter ein Überladen von Operatoren verbirgt, trotzdem geht das im Allgemeinen nicht.
Allerdings müssen Variablen, selbst, wenn man das tun sollte nicht deklariert werden. Das Typ konzept gilt immer noch. Ich kann einem String keine Zahl addieren. Aber Variablen müssen nicht deklariert werden.
In C geht es nicht anders.
1.) Typvorschriften
2.) Keine Typvorschriften
3.) Variablendeklaration
Wir wollen keine grossen Programme schreiben.
Was in C geht, geht in PHP auch. Das lesen und schreiben von Dateien mittels funktionen. Aber anders.
1.) Datei lesen, in PHP, zum Beispiel:
<?php
$str = file_get_contents ("/var/www/html/index.php");
echo $str;
?>
2.) Datei schreiben in PHP
<?php
$str = "Hallo Welt";
file_put_contents ("/var/www/html/index2.php", $str);
?>
Gut. Die Frage ist, was ist zu tun, mit unseren Variablen vom Browser. Diese wollen wir sinnvoll verwenden, zum Beispiel vergleichen oder in einer Datei speichern.
Dazu müssen wir wissen, wie kommen wir an die Variablen werte ran.
in C lauten Arrays wie folgt
int a [4];
a [0] = 100;
a [1] = 200;
a [2] = 20;
a [3] = 40;
Der Index ist ganzzahl. In PHP kann das anders sein. Das heisst, lässt sich über Werte indizieren, die keine Ganzzahl sind. Zum Beispiel
$a ["Hallo"];
$a ["super"];
$a ["richtig"];
Starten wir eine Frage, mit einer übertragenen Variable, sieht das wie folgt aus:
POST /index.php HTTP/1.1
host: ituenix.de
Content-Type: application/x-www-form-urlencoded
Content-Length: 14
text1:UserText
Wenn wir POST verwenden. Oder entsprechend mit GET.
Wir können wir in PHP diese Werte abfragen und speichern. Nun, jetzt kommen mehrere Variablennamen
Die Eingabe vom Nutzer ist "UnserText". Doch die Variable trägt den Namen "text1"
Eine Variable in PHP trägt den Namen
$a
Für die Globalen Variablen, die der Server pro Seite für sich merkt, gibt es die Bezeichnungen
$_GET []
$_POST []
$_COOKIE []
Nun heisst, der Wert der Variablen
$_POST ["text1"];
In dieser Variablen ist nach der Abfrage, auf der Seite des Servers, er Wert "UserText". wir können den nun in einer Datei speichern:
<?php
$str = "Hallo Welt";
file_put_contents ("/var/www/html/index2.php", $_POST["text1"]);
?>
Gut. Damit ist der wichtigste Teil geschafft. POST und GET
POST und GET tauchen innerhalb PHP auf mit den Variablen
1.) $_POST ["string"];
2.) $_GET ["string"];
Der String entspricht den Namen der Eingabebox im Formular zum Beispiel.
POST und GET tauchen in der Anfrage des Clients auf:
POST /index.php HTTP/1.1
host: ituenix.de
Content-Type: application/x-www-form-urlencoded
Content-Length: 14
text1:UserText
Wie wir jetzt erkennen müssen wir dringend, verstehen, wieso beim Computer zeichen in Form von Speicherbereichen übertragen werden.
Und:
V.5.) Wieder vergleiche
Java Script
Java Script verwendet wieder eine andere Syntax als C und PHP, allerdings wieder nur ein wenig anders.
Variablen werden definiert mit
var x = 123;
Entscheidet ist das var. Während wir in C verwenden
- int
- char
- ..
verwenden wir in JavaScript
- var
var x = 123;
var ch = 'a';
var z = 324;
...
Wir können unsere Schlüssel nun zu:
VAR, NUM, INT, INTEGER, REAL, FLOAT, BOOL, NUMERIC, DOUBLE, CHAR, UNSIGNED, var, num, int, integer, real, float, boolean, ...
Zusammenfassen.
Der Unterschied: JavaScript wird immer auf dem Client ausführbar sein. Speichern wir die Seite: Dann bleibt der JavaScript Code erhalten
Aber: Was ist das Problem. JavaScript erlaubt nicht - Gedankensprung - Dateien zu speichern, schreiben ...
Besonders nicht auf dem Server.
Wie soll JavaScript auf dem Server eine Datei schreiben - wie PHP - es landet auf dem Client. Doch der Client kann auf dem Server keine Datei schreiben.
Java Script Programme können wie folgt aussehen
<script>
var x = "Hallo";
alert (x);
if (x == "Hallo) {
alert (x);
}
</script>
VI.) node
wozu dient node
1.) Der Unterschied besteht darin, dass JavaScript nicht für Server geeignet ist.
2.) Ausserdem muss der Webserver apache2 mitinstalliert werden, zu PHP so zu sagen.
node ist ein Mittel
1.) Wie ein Webserver ohne Webserver funktioniert, wird node verwendet, kann ich das gleich mit den richtigen Funktionen als Webserver benutzen
2.) Java Script auf diesem Server ausgeführt wird.
Ich sage gleich: Das kommt als nächstes: Hooks sind für Facebook Bots nicht unbedingt notwendig. Geschehen tut das Speichern von Beiträgen im Facebook Feed nicht mit Hooks.
Es gibt folgende Möglichkeiten:
- node.JS, das JavaScript ausführt um auf Facebook ohne den Browser zu bedienen zu posten
- python
- HTTP-Anfragen - ich kann das ganze auch ohne jede Programmiersprache in die HTTP-Anfrage verpacken
- PHP
- ..
Hooks sind nicht notwendig. sie werden mittels node.JS realisiert. Wie das ganze geht, sehen wir morgen.