Nachdem mein Endspurt sowie einige Klausuren des 4. Semesters hinter mir liegen, habe ich nun wieder mehr Zeit um neue Artikel zu schreiben. Also demnächst gibt es wieder mehr an dieser Stelle.
Am Dienstag fand die Abgabe des dritten DB2 Praktikums statt. Die 3 Aufgaben behandelten die Anbindung von Java an die Oracle Datenbank mittels JDBC. Es war nichts besonderes, außer das die UPDATE und SELECT Befehle entsprechend eingebunden werden mussten. Hier der Link zu den Lösungen: Praktikum_3_DB_2
Leider etwas verspätet, aber besser spät als nie. Hier die Lösungen zum dritten BS1 Praktikum:
In Aufgabe 2 sollte der folgende Programmcode mit den dazu vorgegebenen Befehlen ausgeführt werden:
#include <stdio.h>
#include <unistd.h>
int main () {
printf(“Textausgabe vor dem Fork\n”);
fork();
printf(“Textausgabe nach dem Fork\n”);
return 0;
}Befehle:
./a.out
./a.out | cat
Es galt dann die Problemstellung zu lösen, wie für beide Befehle dieselbe Ausgabe zu realisieren sei. Die Lösung ist dabei ziemlich simpel, in dem man einfach eine Pufferentleerung vor dem fork() durchführt.
#include <stdio.h>
#include <unistd.h>
int main () {
printf(“Textausgabe vor dem Fork\n”);
fflush(stdout);
fork();
printf(“Textausgabe nach dem Fork\n”);
return 0;
}
Die Lösung zu Aufgabe 3 sieht wie folgt aus:
#include<stdio.h>
#include<sys/wait.h>
#include<unistd.h>void ausgabe(int x){
int i;
for(i=0; i<20; i++){
printf(“%d”, x);
usleep(1000);
fflush(stdout);
}
}int main() {
if(fork()==0){
ausgabe(0);
}
else if(fork()==0){
ausgabe(1);
}
else if(fork()==0){
ausgabe(2);
}
else{
waitpid(-1, NULL, 0);
waitpid(-1, NULL, 0);
waitpid(-1, NULL, 0);
printf(“\nfertig\n”);
}
return 0;
}
Hier sollten jeweils 3 Kindprozesse erzeugt werden, die zwanzig mal eine 1, 2 und 3 ausgeben. Nach jedem Durchlauf der Schleife wird 1 ms gewartet und eine Pufferentleerung durchgeführt. Der Vaterprozess wartet mittels waitpid() auf das Ende der Kindprozesse.
Zuletzt wurde eine Prozess-Synchronisation mittels pipe programmiert. Das Programm soll nur zwei Parameter als Übergabe zulassen und ansonsten eine Fehlermeldung ausgeben!
#include<stdio.h>
int main(int argc, char *argv[]){
int pipe_connect[2];
if(pipe(pipe_connect)==-1){
printf(“Fehler beim Erzeugen der Pipe”);
return -1;
}
if(argc>3){
printf(“Zu viele Parameter!\n”);
return -1;
}
if(fork()==0){
dup2(pipe_connect[1], 1);
close(pipe_connect[0]);
execlp(argv[1], argv[1], 0);printf(“Der Aufruf 1 ist fehlgeschlagen!”);
return -1;
}
else if(fork()==0){
dup2(pipe_connect[0], 0);
close(pipe_connect[1]);
execlp(argv[2], argv[2], 0);printf(“Der Aufruf 2 ist fehlgeschlagen!”);
return -1;
}
else{
close(pipe_connect[0]);
close(pipe_connect[1]);
wait(0);
wait(0);
}
return 0;
}
Hier nun die Lösungen zu den Aufgaben 2-4 aus dem zweiten BS1 Praktikum!
In Aufgabe 2 sollte man die Anzahl der Parameter in der Argumentenliste und die Argumentenliste, die bei dem Programmaufruf angegeben wird, mittels des Programms ausgeben. Die Ausgabe erfolgt, wie gefordert, dabei über die Pointerschreibweise. Werden keine Parameter angegeben, so wird eine Fehlermeldung ausgegeben und ein Fehlercode an die Shell zurück gegeben.
#include<stdio.h>
#include<stdlib.h>int main(int argc, char *argv[]) {
int i = 0;
if (argc==1){
printf(“ERROR: Kein Parameter!\n”);
return 1;
}
else {
printf(“Anzahl der Kommandozeilenparameter: %d \n”, argc);
printf(“Die Eingabeparameter sind:\n”);
while(*argv != 0) {
printf(“argv[%d] = %s \n”, i++, *argv++);
}
}
return 0;
}
Die Aufgabenstellung Nummer drei lässt sich schnell und unkompliziert zusammenfassen. Gefordert war die Ausgabe der Umgebungsvariablen, das Setzen einer Umgebungsvariable und das Suchen nach Umgebungsvariablen, ob diese vorhanden sind!
#include<stdio.h>
#include<stdlib.h>void main(int argc, char* argv[], char* envp[]) {
printf(“Liste der Umgebungsvariablen:\n”);
while(*envp != 0) {
printf(“%s \n”, *envp++);
}setenv (“HUGO”, “Hugo”, 1);
char search[50];
printf(“Geben Sie die zusuchende Umgebungsvariable an:\n”);
scanf(“%s”, &search);
if(getenv(search)){
printf(“%s = %s\n”, search, getenv(search));
}
else{
printf(“Die gesuchte Umgebungsvariable existiert nicht!\n”);
}
}
Das Programm für Ausgabe 4 ersetzt einen vorhandenen Prozess durch einen anderen mittels einem Befehl aus der exec-Familie. Der fork()-Aufruf durfte laut Aufgabenstellung nicht verwendet werden.
#include <stdio.h>
#include <unistd.h>int main() {
printf(“Eigene Prozess-ID: %i\n\n”, getpid());
execlp(“ps”, “ps-Test”, 0);
printf(“Ein Problem ist während dem Ersetzen des Prozesses aufgetreten!”);
return -1;
}
Wie zu jedem Beginn eines neuen Semesters erfolgt ein kurzer Überblick über den weiteren Studienverlauf. Leider etwas später als sonst, denn das 4. Semester hat vor 3 Wochen begonnen und ist richtig voll gepackt.
Datenbanken 2:
Aufbauend auf den Stoff der Veranstaltung Datenbanken 1 behandelt die Veranstaltung Datenbanken 2 die folgenden Themen:
- Datenbankprogrammierung mittels PL/SQL
- Datenbanktrigger
- Datenbankanbindung mittels JDBC
Softwaretechnik 2:
In Softwaretechnik 2 werden die Kenntnisse aus der vorherigen Veranstaltung in einem prakitschem Projekt weiter vertieft. In dem Projekt soll ein Architekturentwurf für ein System zur Planung, Durchführung und Meldung von Lehrveranstaltungen realisiert werden.
Mensch-Computer-Interaktion:
Selbes Projekt allerdings ein anderes Fach. In MCI wird der Themenbereich Usability behandelt. Wie kreiert man eine Software möglichst anwenderfreundlich? Ziel der Veranstaltung ist es für das Projekt aus ST2 die grafische Benutzeroberfläche zu gestalten und zu programmieren.
Betriebssysteme und verteilte Systeme:
Hauptthemengebiete in diesem Fach sind:
- die C- und Shellprogrammierung unter Unix
- Prozesse unter Unix
- das Unix-Dateisystem
- Verteilte Systeme
- Scheduling und Speicherverwaltung
Künstliche Intelligenz 1:
In KI1 werden die Grundlagen für die Veranstaltung KI2 gelehrt. Denn in KI2 steht wieder ein Projekt an, welches sich mit einem Software-Framework für logische Agenten und den Lego Mindstorm NXT Robotern beschäftigen wird.
Informationsmanagement:
IM befasst sich mit der Gestaltung von computergestützter Informationsverarbeitung und Kommunikation in sozitechnischen Systemen. Im Vordergrund steht das Business Process Management auf Basis des Business Engineering. Auch diese Veranstaltung dient als Vorbereitung für ein Projekt im nächsten Semester.
Die ersten Praktikaabnahmen in den Fächern DB2 und BS1 liegen erfolgreich hinter mir. Die Aufgaben der Praktika und die entsprechenden Lösungen präsentiere ich euch in diesem Artikel.
Das erste Datenbank 2 Praktikum beinhaltete insgesamt 6 Aufgaben, die jeweils wieder Teilaufgaben enthielten. Die erste Aufgabe in diesem Zusammenhang bezog sich noch auf den Themeninhalt der im letzten Semester statt gefundenen Vorlesung Datenbanken 1.
- 1. Transaktionen
- Einfügen von zwei Datensätzen mittels SQL-DML-Befehlen in zwei Tabellen.
- Verändern von gespeicherten Daten, so dass ein Integritätsfehler für den Primärschlüssel auftritt.
- Prüfzeitpunkt eines anderen Primärschlüssels auf INITIALLY DEFERRED ändern.
- Mittels SQL-DML-Befehlen Testdaten erstellen und sich jeweils nach der Aktion die Tabellen ausgeben lassen.
- Datensätze in der Reihenfolge Subtyp dann Supertyp hinzufügen / Datensätze in der Reihenfolge Supertyp dann Subtyp löschen.
Die Zusammenhänge und die jeweiligen Reaktionen/Aktionen des Systems/der Befehle müssen dabei erklärt werden können
- 2. PL/SQL-Funktion: Datumsfunktion
- Das aktuelle Tagesdatum soll entweder in deutscher oder amerikanischer Schreibweise ausgegeben werden. Das Kennzeichen wird dabei an die Funktion beim Aufruf übergeben.
- 3. PL/SQL-Prozedur im Theater: Namen trennen
- Ein an die Prozedur übergebener Name soll getrennt nach Vorname, 2. Vorname und Nachname zurückgegeben werden. (Der Name besteht wenigstens aus zwei Teilen und maximal aus drei Teilen.)
- 4. PL/SQL-Prozedur im Theater: Dichter ohne Inszenierung
- Es sollen dabei folgende Daten aus der Datenbank ermittelt werden:
- Dichter und zugehörigen Dramen, für die es keine Inszenierung gibt.
- Dichter für die kein Drama in der Datenbank hinterlegt ist.
- Die Sortierung soll aufsteigend nach dem Namen der Dichter und der Titel erfolgen.
- Es sollen dabei folgende Daten aus der Datenbank ermittelt werden:
- 5. PL/SQL-Prozedur im Theater: Dichter mit den meisten Inszenierungen
- Die Dichter mit den meisten Inszenierungen in dem angegebenen Suchintervall (z.B. 2008-2009) sollen ausgegeben werden. Fehlt die erste Jahreszahl, so wird automatisch die kleinste Jahreszahl einer Inszenierung gesetzt. Genau umgekehrt verhält es sich für die letzte Jahreszahl.
- 6. PL/SQL-Prozedur im Theater: Package-Prozeduren
- Es soll ein Package aus den Aufgaben 3, 4 und 5 erstellt werden.
- Aufgabe 3 soll eine private Prozedur im Package sein.
- Aufgabe 4 soll so angepasst werden, dass die private Prozedur zur Namensausgabe der Dichter verwendet wird.
Das Praktikum in Betriebssysteme und verteilte Systeme 1 bestand im Gegensatz zum Datenbank 2 Praktikum nur aus 4 Aufgaben. Zu der ersten Aufgabe existieren einige Lösungen im Internet, so dass ich auf diese schriftliche Ausarbeitung nicht weiter eingehen werde. Sondern mich direkt den Aufgaben 2, 3 und 4 widme.
Aufgabe 2:
Hier sollte ein Shell-Script und ein C-Programm implementiert werden. Das C-Programm soll dabei nach einer bestimmten Anzahl Sekunden folgenden Text ausgeben: “./p1 nach der 1. Schlafzeit” und nochmals “./p1 nach der 2. Schlafzeit”. Dabei werden der Name des C-Programms (p1) und die Anzahl der Sekunden über das Shell-Script eingelesen und dann an das Programm übergeben. Mittels symbolischen Link soll der zweite Aufrufname p2 erzeugt werden. Beide Programmaufrufe sollen durch die Shell in den Hintergrund geschickt und zusätzlich eine ausführliche Prozessliste ausgegeben werden.
C-Programm: p1
#include<stdio.h>
#include<stdlib.h>void main(int argc, char* argv[]) {
int x = 0,
i = 1;
if (argc==1)
printf(“ERROR: Kein Paramter!\n”);
else {
x = atoi(argv[1]);
while(i<3) {
sleep(x);
printf(“%s nach der %d. Schlafzeit. \n”, argv[0], i++);
}
}
}
Der symbolische Link wird mittels ln –s ./p1 ./p2 auf der Konsole erzeugt.
Shell-Script:
#! /usr/bin/sh
echo “Programm?”
read progr
echo “Zeit?”
read zeit
./$progr $zeit &
jobs -l
ps -ef | grep $USER
Aufgabe 3:
Bei Aufgabe 3 sollte ein Shell-Script implementiert werden, welches Dateien aus einem Verzeichnis löscht. Die zu löschenden Dateien werden als Parameter an das Script übergeben. Das Script fragt bei jeder Datei, ob diese gelöscht werden soll oder nicht. Eine entsprechende Rückmeldung sowie Fehlermeldungen, wenn die Datei nicht exitiert, müssen auch implementiert werden. Die Verarbeitung der Parameterliste soll dabei nicht unterbrochen werden.
#! /usr/bin/sh
for i in $*
do if test -r $i
then echo “Delete $i? (y/n)”
read a
if [$a == y]
then rm $i
echo –Datei $i wurde geloescht.–
else echo –Datei $i nicht geloescht.–
fi
else echo –Datei $i nicht gefunden.–
fi
done
echo DONE.
Aufgabe 4:
Hier erfolgt die Ausgabe der 10 häufigsten Vornamen der Benutzer auf dem Rechner advbs08.
#! /usr/bin/sh
ypcat passwd |
cut -d : -f 5 |
cut -d ‘ ‘ -f 1 |
sort |
uniq -c |
sort |
grep -v Samba |
grep -v Dr. |
sort -r |
head
Heute habe ich erfahren, dass ich Mathematik 2 bestanden habe. Im gleichen Zug ist somit auch mein Grundstudium abgeschlossen. Besser kann man gar nicht in das 4. Semester starten.