Posts Tagged ‘Praktikum’
Erstes DB2 und BS1 Praktikum

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
    1. Einfügen von zwei Datensätzen mittels SQL-DML-Befehlen in zwei Tabellen.
    2. Verändern von gespeicherten Daten, so dass ein Integritätsfehler für den Primärschlüssel auftritt.
    3. Prüfzeitpunkt eines anderen Primärschlüssels auf INITIALLY DEFERRED ändern.
    4. Mittels SQL-DML-Befehlen Testdaten erstellen und sich jeweils nach der Aktion die Tabellen ausgeben lassen.
    5. 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
    1. 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
    1. 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
    1. Es sollen dabei folgende Daten aus der Datenbank ermittelt werden:
      1. Dichter und zugehörigen Dramen, für die es keine Inszenierung gibt.
      2. Dichter für die kein Drama in der Datenbank hinterlegt ist.
    2. Die Sortierung soll aufsteigend nach dem Namen der Dichter und der Titel erfolgen.
  • 5. PL/SQL-Prozedur im Theater: Dichter mit den meisten Inszenierungen
    1. 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
    1. Es soll ein Package aus den Aufgaben 3, 4 und 5 erstellt werden.
    2. Aufgabe 3 soll eine private Prozedur im Package sein.
    3. Aufgabe 4 soll so angepasst werden, dass die private Prozedur zur Namensausgabe der Dichter verwendet wird.

Praktikum_1_DB_2

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

 

Die Praktika wurden zusammen von meinen Kommilitionen und mir bearbeitet.
Aufgabe 8 – Algorithmik Praktikum

In diesem Teil des Praktikums war es Aufgabe das Dreieckszahlen-Hashing mit der Sondierungsfolge 0, 1, 3, 6, 10,… zu implementieren. Dazu sollte das Programm eine Ausgabe mit dem momentanen Füllgrad und der Anzahl an Clustern enthalten, sowie einen Performancetest.

Die Ausgabe auf der Konsole sieht mit dem fertigem Programm folgendermaßen aus:

Hier der Programmcode dazu:

import java.util.Random;

public class Three_hashing{
 
 public static int hash(int zahl, int groesse){
  int temp;
  temp = zahl%groesse;
  return temp;
 }
 
 public static int hash2(int zahl, int cnt, int groesse){
  int temp;
  temp = (int) ((zahl+0.5*cnt+0.5*(cnt*cnt))%groesse);
  return temp;
 }
 
 public static void hashInsert(int groesse, int array[], int arrayZuf[], int fillState, int fillStatePrev){
  Random r = new Random();
  int z=groesse*4;
  
  for(int i=fillStatePrev; i<fillState; i++){
   int zahl=0;
   boolean tempend = true;
   
   //Generierung von Zufallszahlen und Überprüfung, dass keine doppelt vorkommt
   while(tempend){
    zahl = r.nextInt(z);
    if(zahl!=0 ){
     for(int x=0; x<arrayZuf.length; x++){
      if(arrayZuf[x]!=zahl){
       arrayZuf[x]=zahl;
       tempend=false;
       x=arrayZuf.length;
      }
     }
    }
   }
   
   //Berechnung der Speicherstelle im Array => Hashing
   boolean end = true;
   int cnt=0;
   int hashKey = hash(zahl, groesse);
   
   if(array[hashKey]==0){
    array[hashKey]=zahl;
   }
   else{
    while(end){
     cnt++;
     int hashKey2=hash2(hashKey, cnt, groesse);
     if(array[hashKey2]==0){
      array[hashKey2]=zahl;
      end = false;
     }
    }
   }
  }
 }
 
 public static int hashSearch(int groesse, int array[], int fillState){
  Random r = new Random();
  int zaehler=0;
  int temparray[] = new int[fillState];
  int z=groesse*4;
  
  for(int i=0; i<fillState; i++){
   int zahl=0;
   boolean tempend = true;
   
   //Generierung von Zufallszahlen und Überprüfung, dass keine doppelt vorkommt
   while(tempend){
    zahl = r.nextInt(z);
    if(zahl!=0 ){
     for(int x=0; x<temparray.length; x++){
      if(temparray[x]!=zahl){
       temparray[x]=zahl;
       tempend=false;
      }
     }
    }
   }
   
   //Berechnung der Speicherstelle im Array => Hashing
   boolean end = true;
   int cnt=0;
   int cnt2=0;
   int hashKey = hash(zahl, groesse);
   
   if(array[hashKey]==0 || array[hashKey]==zahl){
    zaehler++;
   }
   else{
    while(end){
     if(cnt2>groesse){
      end = false;
     }
     cnt++;
     int hashKey2=hash2(hashKey, cnt, groesse);
     if(array[hashKey2]==0 || array[hashKey2]==zahl){
      zaehler++;
      end = false;
     }
     else{
      zaehler++;
     }
     cnt2++;
    }
   }   
  }
  return zaehler;
 }
 
 public static void main(String[] args){
  double groesse=128;
  int counter=10;
  int counterC=0;
  double Cn=0;
  double Cn1=0;
  double a=0;
  int Hash_array[] = new int[(int) groesse];
  int Zuf_array[] = new int[(int) groesse];
  int fillStatePrevTemp=0;
  
  while(counter<=99){
   int counter2=0;
   
   int fillStateTemp=(int) Math.round((groesse/100)*counter);
   hashInsert((int) groesse, Hash_array, Zuf_array, fillStateTemp, fillStatePrevTemp);
   fillStatePrevTemp=fillStateTemp;
   
   //Performancetest
   counterC=hashSearch((int) groesse, Hash_array, 64);
   counterC=(counterC/64);
   
   //Anzeige Konsole
   System.out.print(counter+”% “);
   
   //Anzeige von befüllten Arrayfeldern!
   for(int j=0; j<Hash_array.length; j++){
    if(Hash_array[j]!=0){
     System.out.print(“|”);
    }
    else{
     System.out.print(” “);
    }
   }
   
   //Zählen der vorhandenen Cluster
   int j=0;
   while(j<Hash_array.length){
    if(Hash_array[j]!=0){
     while(j<Hash_array.length && Hash_array[j]!=0){
      j++;
     }
     counter2++;
    }
    else{
     while(j<Hash_array.length && Hash_array[j]==0){
      j++;
     }
    }
   }
   
   if(Hash_array[0]!=0 && Hash_array[(int) (groesse-1)]!=0){
    counter2- -;
   }
   
   //Cn und Cn’ Berechnung
   a=counter/100.00;
   Cn=1+Math.log(1/(1-a))-(a/2);
   Cn1=(1/(1-a))-a+Math.log(1/(1-a));
   
   System.out.print(” “+counter2);
   System.out.print(” — C=”+counterC);
   System.out.print(” Cn: “+Cn);
   System.out.print(” Cn’: “+Cn1);
   System.out.println(” “);
   if(counter!=90){
    counter=counter+10;
   }
   else{
    counter=counter+9;
   }
  } 
 }
}

4. DB Praktikum und 2. ALG Praktikum

Hier zwei Lösungen für das vierte Datenbank Praktikum und das zweite Algorithmik Praktikum.

Das vierte Datenbank Praktikum handelte über die Erstellung einer Datenbank heraus aus einem ERM-Diagramm. Mittels dem Modellierungstool ERwin wurde der dazu nötige SQL-Code erstellt. Desweiteren wurden weitere SQL-Skripte für die restlichen Aufgabenteile erstellt. Dort sollten dann Benutzerrechte gesetzt , Constraints hinzugefügt und als Test in jede Tabelle mindestens eine Zeile eingefügt werden.

Create: CREATE

Constraints: ALTER

Insert: INSERT

Im zweiten Algorithmik Praktikum wurden AVL-Bäume behandelt. Aufgabe war es ein einfaches Konsolen-Interface zu programmieren, welches die entsprechenden Operationen für AVL-Bäume anspricht. Die Operationen mussten selbstverständlich auch programmiert werden.

AVLNode.java:

public class AVLNode{
 protected AVLNode left;
 protected AVLNode right;
 protected int balance;
 public int value;
 
 //Konstruktoren
 
 public AVLNode(int value){
  this(value, null, null);
 }
 
 public AVLNode(int value, AVLNode left, AVLNode right){
  this.value=value;
  this.left=left;
  this.right=right;
  balance=0;
 }
 
 /**
  * Liefert die Höhe eines Teilbaumes
  * @return Gibt die Höhe eines Teilbaumes zurück
  */
 
 public int hoehe(){
  int l=0;
  int r=0;
  
  if(left!=null) l=left.hoehe();
  if(right!=null) r=right.hoehe();
  return Math.max(l, r)+1;
 }
}

 AVLTree.java:

public class AVLTree{
 
 private AVLNode root;
 
 /**
  * Konstruktor
  */
 
 public AVLTree(){
  root = null;
 }
 
 /**
  * Aufruf um einen Knoten hinzu zu fügen
  * @param value hinzu zu fügender Knoten
  */
 
 public void insert(int value){
  root = insert(value, root);
 }
 
 /**
  * Aufruf um einen Knoten zu löschen
  * @param value zu löschender Knoten
  */
 
 public void remove(int value){
  if(isEmpty()){
   System.out.println(“Leerer Baum”);
  }
  else{
   root = remove(value, root);
  }
 }
 
 /**
  * Löscht den kompletten Baum
  */
 
 public void delete(){
  root = null;
 }
 
 /**
  * Prüft ob der Baum leer ist
  * @return true oder false
  */
 
 public boolean isEmpty(){
  return root==null;
 }
 
 /**
  * Aufruf der versetzten Ausgabe
  */
 
 public void ausgBinaerBaum(){
  if(isEmpty()){
   System.out.println(“Leerer Baum”);
  }
  else{
   ausgBinaerBaum(root,0);
  }
 }
//——————————————————————
 /**
  * Gibt den Baum ab dem angegebenen Knoten versetzt aus
  */
 
 public void ausgBinaerBaum(AVLNode node, int step){
  if(node != null){
   ausgBinaerBaum(node.right, step + 1);
   for (int i=0; i < step; i++){
    System.out.print(“-”);
   }
   System.out.println(node.value+”  (“+node.balance+”)”);
   ausgBinaerBaum(node.left, step + 1);
  }
 }
 
 /**
  * Berechnet die Balance des jeweiligen Knotens
  */
 
 private static int bal(AVLNode p){
  AVLNode r=p.right;
  AVLNode l=p.left;
  int bal=0;
  
  if(r!=null && l!=null){
   bal=r.hoehe()-l.hoehe();
  }
  else if(r!=null && l==null){
   bal=r.hoehe();
  }
  else if(r==null && l!=null){
   bal=0-l.hoehe();
  }
  return bal;
 }
 
 /**
  * Fügt einen Knoten in den angegebenen Teilbaum ein
  */
 
 private AVLNode insert(int value, AVLNode node){
  if(node == null){
   node = new AVLNode(value, null, null);
  }
  else if (value < node.value){
   node.left = insert(value, node.left);
   node=upin(node);
  }
  else if(value > node.value){
   node.right = insert(value, node.right);
   node=upin(node);
  }
  else{
    System.out.println(“Der Knoten ist schon vorhanden!”);
  }
  return node;
 }
 
 private AVLNode upin(AVLNode node){
  node.balance=bal(node);
  if(node.balance==-2){
   if(node.left.balance!=1){
    node = rotationRight(node);
   }
   else{
    node = doublerotationLeftRight(node);
   }
  }
  else if(node.balance==2){
   if(node.right.balance!=-1){
    node = rotationLeft(node);
   }
   else{
    node = doublerotationRightLeft(node);
   }
  }
  return node;
 }
 
 //Rechtsrotation
 
 private static AVLNode rotationRight(AVLNode node){
  AVLNode temp = node.left;
   node.left = temp.right;  
   temp.right = node;
   
   node.balance = bal(node);
   temp.balance = bal(node);
   
  return temp;
 }
 
 //doppelt: Links-Rechts-Rotation
 
 private static AVLNode doublerotationLeftRight(AVLNode node){
  node.left = rotationLeft(node.left);
  return rotationRight(node);
 }
 
 //Linksrotation
 
 private static AVLNode rotationLeft(AVLNode node){
  AVLNode temp = node.right;
   node.right = temp.left;
   temp.left = node;
   
   node.balance = bal(node);
   temp.balance = bal(node);
   
  return temp;
 }
 
 //doppelt: Rechts-Links-Rotation
 
 private static AVLNode doublerotationRightLeft(AVLNode node){
  node.right = rotationRight(node.right);
  return rotationLeft(node);
 }
 
 /**
  * Entfernt einen Knoten aus dem angegebenen Teilbaum
  */
 
 private AVLNode remove(int value, AVLNode node){
  if(node == null){
    System.out.println(“Wert nicht vorhanden”);
  }
  else if (value == node.value){
   if(node.left == null){
    return node.right;
   }
   else if(node.right == null){
    return node.left;
   }
   else{
    if(node==root){
     node=rootRemove(node);
     return node;
    }
    else{
     AVLNode temp=Successor(node);
     remove(temp.value, node);
     node.value=temp.value;
     return node;
    }
   }
  }
  else if (value < node.value){
   node.left = remove(value, node.left);
   node=upout(node);
  }
  else if(value > node.value){
   node.right = remove(value, node.right);
   node=upout(node);
  }
  return node;
 }
 
 private AVLNode rootRemove(AVLNode node){
  AVLNode prev=null;
  AVLNode temp=node.right;
  while(temp.left != null){
   prev=temp;
   temp=temp.left;
  }
  if(prev!=null){
   prev.left=temp.right;
   temp.right=node.right;
   prev.balance=bal(prev);
  }
  temp.left=node.left;
  node=temp;
  if(node.right!=null){
   node.right=upout(node.right);
  }
  node=upout(node);
  return node;
 }

 private AVLNode upout(AVLNode node){
  node.balance=bal(node);
  if(node.balance==2){
    if(node.right.balance!=-1){
     node = rotationLeft(node);
    }
    else{
     node = doublerotationRightLeft(node);
    }
  }
  else if(node.balance==-2){
   if(node.left.balance!=1){
    node = rotationRight(node);
   }
   else{
    node = doublerotationLeftRight(node);
   }
  }
  node.balance=bal(node);
  return node;
 }
 
 private AVLNode Successor(AVLNode node){
  AVLNode temp=node.right;
  while(temp.left != null){
   temp=temp.left;
  }
  return temp;
 }
 
 private AVLNode Predecessor(AVLNode node){
  AVLNode temp=node.left;
  while(temp.right != null){
   temp=temp.right;
  }
  return temp;
 }
 
 public boolean IsSuccessor(int node, int node2){
  AVLNode temp=IsMember(node2);
  AVLNode temp2=Successor(temp);
  if(temp2.value==node){
   return true;
  }
  return false;
 }
 
 public boolean IsPredecessor(int node, int node2){
  AVLNode temp=IsMember(node2);
  AVLNode temp2=Predecessor(temp);
  if(temp2.value==node){
   return true;
  }
  return false;
 }
 
 public AVLNode IsMember(int value){
  AVLNode node = root;
  while(node != null){
   if(value == node.value){
    return node;
   }
   else if(value<node.value){
    node = node.left;
   }
   else{
    node = node.right;
   }
  }
  return null;
 }
}

Main.java:

import java.util.Scanner;

public class Main{
 public static void main(String[] args){
 
  boolean fertig = true;
  Scanner scan = new Scanner(System.in);
  AVLTree Baum = new AVLTree();
  
  while(fertig){
   System.out.println(“———————————————————”);
   System.out.println(“1   -  Knoten hinzufuegen || 2   -  Knoten löschen”);
   System.out.println(“3   -  AVL-Baum löschen   || 4   -  Suchen”);
   System.out.println(“5   -  IsPredecessor      || 6   – IsSuccessor”);
   System.out.println(“9   -  Beenden”);
   System.out.println(“———————————————————”);
   if(!Baum.isEmpty()){
    System.out.println(“****************************************”);
    Baum.ausgBinaerBaum();
    System.out.println(“****************************************”);
   }
   //Auswahl einlesen
   int Zahl = scan.nextInt();
  
   //Menüoptionen
   switch(Zahl){
    case 1:
     int wert = scan.nextInt();
     Baum.insert(wert);
     break;
    case 2:
     int wert2 = scan.nextInt();
     Baum.remove(wert2);
     break;
    case 3:
     Baum.delete();
     break;
    case 4:
     int wert3 = scan.nextInt();
     AVLNode temp=Baum.IsMember(wert3);
     if(temp!=null&&temp.value==wert3){
      System.out.println(wert3+” ist vorhanden!”);
     }
     else{
      System.out.println(wert3+” ist nicht vorhanden!”);
     }
     break;
    case 5:
     if(!Baum.isEmpty()){
      System.out.println(“Geben Sie den Vorgängerknoten an den Sie vergleichen wollen:”);
      int wert4 = scan.nextInt();
      System.out.println(“Geben Sie Knoten an dessen Vorgänger mit ihrem angegebenen Vorgänger verglichen werden soll:”);
      int wert5 = scan.nextInt();
      if(Baum.IsPredecessor(wert4, wert5)==true){
       System.out.println(wert4+” ist der Vorgänger von “+wert5+”!”);
      }
      else{
       System.out.println(wert4+” ist nicht der Vorgänger von “+wert5+”!”);
      }
     }
     else{
      System.out.println(“Leerer Baum”);
     }
     break;
    case 6:
     if(!Baum.isEmpty()){
      System.out.println(“Geben Sie den Nachfolgerknoten an den Sie vergleichen wollen:”);
      int wert6 = scan.nextInt();
      System.out.println(“Geben Sie Knoten an dessen Nachfolger mit ihrem angegebenen Nachfolger verglichen werden soll:”);
      int wert7 = scan.nextInt();
      if(Baum.IsSuccessor(wert6, wert7)==true){
       System.out.println(wert6+” ist der Nachfolger von “+wert7+”!”);
      }
      else{
       System.out.println(wert6+” ist nicht der Nachfolger von “+wert7+”!”);
      }
     }
     else{
      System.out.println(“Leerer Baum”);
     }
     break;
    case 9:
     fertig = false;
   }
  }
 }
}

Praktikum Kommunikationstechnik: Schwerpunktaufgabe 1

Hier ist die Lösung zu der Schwerpunktaufgabe 1 des Praktikums im Fach Kommunikationstechnik. Ich rate dringend davor ab, die Lösung einfach zu kopieren. ;)

Aufgabe 1-1:

ping -c 10 www.rfc-editor.org

PING www.rfc-editor.org (128.9.160.27) 56(84) bytes of data.
64 bytes from www.rfc-editor.org (128.9.160.27): icmp_seq=1 ttl=242 time=174 ms
64 bytes from www.rfc-editor.org (128.9.160.27): icmp_seq=2 ttl=242 time=174 ms
64 bytes from www.rfc-editor.org (128.9.160.27): icmp_seq=3 ttl=242 time=174 ms
64 bytes from www.rfc-editor.org (128.9.160.27): icmp_seq=4 ttl=242 time=174 ms
64 bytes from www.rfc-editor.org (128.9.160.27): icmp_seq=5 ttl=242 time=174 ms
64 bytes from www.rfc-editor.org (128.9.160.27): icmp_seq=6 ttl=242 time=174 ms
64 bytes from www.rfc-editor.org (128.9.160.27): icmp_seq=7 ttl=242 time=174 ms
64 bytes from www.rfc-editor.org (128.9.160.27): icmp_seq=8 ttl=242 time=174 ms
64 bytes from www.rfc-editor.org (128.9.160.27): icmp_seq=9 ttl=242 time=174 ms
64 bytes from www.rfc-editor.org (128.9.160.27): icmp_seq=10 ttl=242 time=174 ms
— www.rfc-editor.org ping statistics —
10 packets transmitted, 10 received, 0% packet loss, time 9037ms
rtt min/avg/max/mdev = 174.532/174.630/174.730/0.271 ms

Die mittlere Antwortzeit wird bestimmt, in dem man die Zeiten aller Pakete addiert und durch die Anzahl der Pakete teilt. Dieses Ergebnis nochmals durch zwei geteilt, ergibt die mittlere Übertragungszeit, da hier für nur der Hin- oder Rückweg betrachtet werden muss.

In diesem Falle ergibt sich eine mittlere Antwortzeit von 174 ms und eine mittlere Übertragungszeit von 87 ms.

Aufgabe 1-2:

Um die Übertragungsrate mittels ping bestimmen zu können brauchen wir die Paketgröße und die durchschnittliche Übertragungszeit! Da wir die Übertragungszeit erst einmal in Bit/s ausrechnen wollen, sieht die Formel dafür folgender Maßen aus:

Bit/s = (Paketgröße *8)/durchschnittliche Übertragungszeit/1000

Paketgröße*8 wird verwendet, um von Byte nach Bit zu kommen
/1000 wird verwendet, um von Millisekunden auf Sekunden zu kommen.

Aufgabe 1-3:

ping -c 10 www.gm.fh-koeln.de
PING advm1.gm.fh-koeln.de (139.6.57.1) 56(84) bytes of data.
64 bytes from advm1.gm.FH-Koeln.DE (139.6.57.1): icmp_seq=1 ttl=254 time=0.936 ms
64 bytes from advm1.gm.FH-Koeln.DE (139.6.57.1): icmp_seq=2 ttl=254 time=1.09 ms
64 bytes from advm1.gm.FH-Koeln.DE (139.6.57.1): icmp_seq=3 ttl=254 time=0.984 ms
64 bytes from advm1.gm.FH-Koeln.DE (139.6.57.1): icmp_seq=4 ttl=254 time=0.881 ms
64 bytes from advm1.gm.FH-Koeln.DE (139.6.57.1): icmp_seq=5 ttl=254 time=0.779 ms
64 bytes from advm1.gm.FH-Koeln.DE (139.6.57.1): icmp_seq=6 ttl=254 time=0.932 ms
64 bytes from advm1.gm.FH-Koeln.DE (139.6.57.1): icmp_seq=7 ttl=254 time=0.705 ms
64 bytes from advm1.gm.FH-Koeln.DE (139.6.57.1): icmp_seq=8 ttl=254 time=0.854 ms
64 bytes from advm1.gm.FH-Koeln.DE (139.6.57.1): icmp_seq=9 ttl=254 time=0.877 ms
64 bytes from advm1.gm.FH-Koeln.DE (139.6.57.1): icmp_seq=10 ttl=254 time=0.908 ms
— advm1.gm.fh-koeln.de ping statistics —
10 packets transmitted, 10 received, 0% packet loss, time 9011ms
rtt min/avg/max/mdev = 0.705/0.895/1.094/0.101 ms

ping -c 10 www.lacnic.net 
PING lacnic.net (200.3.14.10) 56(84) bytes of data.
64 bytes from www.lacnic.net (200.3.14.10): icmp_seq=1 ttl=51 time=231 ms
64 bytes from www.lacnic.net (200.3.14.10): icmp_seq=2 ttl=51 time=231 ms
64 bytes from www.lacnic.net (200.3.14.10): icmp_seq=3 ttl=51 time=231 ms
64 bytes from www.lacnic.net (200.3.14.10): icmp_seq=4 ttl=51 time=231 ms
64 bytes from www.lacnic.net (200.3.14.10): icmp_seq=5 ttl=51 time=232 ms
64 bytes from www.lacnic.net (200.3.14.10): icmp_seq=6 ttl=51 time=232 ms
64 bytes from www.lacnic.net (200.3.14.10): icmp_seq=7 ttl=51 time=231 ms
64 bytes from www.lacnic.net (200.3.14.10): icmp_seq=8 ttl=51 time=232 ms
64 bytes from www.lacnic.net (200.3.14.10): icmp_seq=9 ttl=51 time=233 ms
64 bytes from www.lacnic.net (200.3.14.10): icmp_seq=10 ttl=51 time=232 ms
— lacnic.net ping statistics —
10 packets transmitted, 10 received, 0% packet loss, time 9038ms
rtt min/avg/max/mdev = 231.098/231.803/233.108/0.661 ms

ping -c 10 www.dfn.de
PING www.dfn.de (194.95.237.15) 56(84) bytes of data.
64 bytes from www.dfn.de (194.95.237.15): icmp_seq=1 ttl=58 time=10.3 ms
64 bytes from www.dfn.de (194.95.237.15): icmp_seq=2 ttl=58 time=11.3 ms
64 bytes from www.dfn.de (194.95.237.15): icmp_seq=3 ttl=58 time=11.3 ms
64 bytes from www.dfn.de (194.95.237.15): icmp_seq=4 ttl=58 time=11.3 ms
64 bytes from www.dfn.de (194.95.237.15): icmp_seq=5 ttl=58 time=11.4 ms
64 bytes from www.dfn.de (194.95.237.15): icmp_seq=6 ttl=58 time=11.3 ms
64 bytes from www.dfn.de (194.95.237.15): icmp_seq=7 ttl=58 time=11.3 ms
64 bytes from www.dfn.de (194.95.237.15): icmp_seq=8 ttl=58 time=11.3 ms
64 bytes from www.dfn.de (194.95.237.15): icmp_seq=9 ttl=58 time=10.8 ms
64 bytes from www.dfn.de (194.95.237.15): icmp_seq=10 ttl=58 time=12.0 ms
— www.dfn.de ping statistics —
10 packets transmitted, 10 received, 0% packet loss, time 9038ms
rtt min/avg/max/mdev = 10.308/11.278/12.062/0.434 ms

ping -c 10 www.omg.org
PING www.omg.org (192.67.184.5) 56(84) bytes of data.
— www.omg.org ping statistics —
10 packets transmitted, 0 received, 100% packet loss, time 9014ms

Wie schon vorab zu sehen ist, werden ICMP-Pakete von der Firewall von www.omg.org verworfen, so dass in diesem Falle keine Ermittlung der Übertragungsrate möglich ist. Für die anderen Adressen wurden folgende Übertragungsraten, nach der oben angegebenen Formel ermittelt:

Adresse Bit/s Kbit/s – Bit/s durch 1000 Mbit/s – Kbit/s durch 1000
www.gm.fh-koeln.de 1144134,08 1144,13 1,14
www.lacnic.net 4417,54 4,46 0,0044
www.dfn.de 90796,24 90,80 0,09

Aufgabe 1-4:

Ping erlaubt eine maximale Paketgröße von ca. 64 Kbyte. Der Maximalwert unter Windows ist 65500 Byte und unter Linux 65527 Byte. Allerdings sollte man darauf achten, dass die Paketgröße die MTU nicht überschreitet, denn sonst wird das Paket fragmentiert, also in mehrere kleine Pakete aufgeteilt. Außerdem erreichen große Pakete den Host des Öfteren nicht, so dass man die Meldung Zeitüberschreitung der Anforderung erhält. Ein idealer Wert sind die bei Linux standardmäßigen 64 Byte oder bei Windows die 32 Byte, da damit ein quasi Standard gegeben ist und man eine gute Vergleichbarkeit hat.

Aufgabe 1-5:

/home/kt> /usr/sbin/traceroute ktdsp18.local
traceroute to ktdsp18.local (10.20.23.18), 30 hops max, 40 byte packets
1  ktdsp18.local (10.20.23.18)  3.221 ms   0.086 ms   0.091 ms

So sieht die Route von dem Rechner (ktdsp17.local) zu ktdsp18.local aus.

Aufgabe 1-6:

/home/kt> ping -c 10 -R ktdsap1.local
PING ktdsap1.local (10.50.23.1) 56(124) bytes of data.
64 bytes from ktdsap1.local (10.50.23.1): icmp_seq=1 ttl=62 time=1.89 ms
RR:     ktdsp17.local (10.20.23.17)
        ktdsrt1.local (10.23.5.61)
        10.50.0.1
        ktdsap1.local (10.50.23.1)
        ktdsap1.local (10.50.23.1)
        ktdss05.local (10.23.5.5)
        10.20.0.1
        ktdsp17.local (10.20.23.17)
64 bytes from ktdsap1.local (10.50.23.1): icmp_seq=2 ttl=62 time=1.77 ms        (same route)
64 bytes from ktdsap1.local (10.50.23.1): icmp_seq=3 ttl=62 time=1.72 ms        (same route)
64 bytes from ktdsap1.local (10.50.23.1): icmp_seq=4 ttl=62 time=1.73 ms        (same route)
64 bytes from ktdsap1.local (10.50.23.1): icmp_seq=5 ttl=62 time=1.75 ms        (same route)
64 bytes from ktdsap1.local (10.50.23.1): icmp_seq=6 ttl=62 time=1.69 ms        (same route)
64 bytes from ktdsap1.local (10.50.23.1): icmp_seq=7 ttl=62 time=1.71 ms        (same route)
64 bytes from ktdsap1.local (10.50.23.1): icmp_seq=8 ttl=62 time=1.72 ms        (same route)
64 bytes from ktdsap1.local (10.50.23.1): icmp_seq=9 ttl=62 time=1.74 ms        (same route)
64 bytes from ktdsap1.local (10.50.23.1): icmp_seq=10 ttl=62 time=1.78 ms       (same route)
— ktdsap1.local ping statistics —
10 packets transmitted, 10 received, 0% packet loss, time 9038ms
rtt min/avg/max/mdev = 1.697/1.753/1.891/0.076 ms

/home/kt> nslookup
> 10.50.0.1
Server:         10.23.5.1
Address:        10.23.5.1#53
** server can’t find 1.0.50.10.in-addr.arpa.: NXDOMAIN
> 10.20.0.1
Server:         10.23.5.1
Address:        10.23.5.1#53
** server can’t find 1.0.20.10.in-addr.arpa.: NXDOMAIN
> exit

Wie man sehen kann sind bei allen IP-Adressen, bis auf zwei, die Namen aufgelöst worden. Da diese IP-Adressen auch nicht im DNS-Server eingetragen sind, konnten wir mittels nslookup die Namen über einen Reverse-Lookup nicht bestimmen.

Aufgabe 1-7:

/home/kt> /usr/sbin/traceroute ktdsap1.local
traceroute to ktdsap1.local (10.50.23.1), 30 hops max, 40 byte packets
1  10.20.0.1 (10.20.0.1)  0.690 ms   1.163 ms   1.200 ms
2  ktdss05.local (10.23.5.5)  0.422 ms   0.410 ms   0.404 ms
3  ktdsap1.local (10.50.23.1)(H!) 
0.570 ms (H!)  0.510 ms (H!)  0.506 ms

Traceroute zeigt nur den Hinweg zum Ziel an, im Gegensatz zu ping –R wo Hin- und Rückweg angezeigt werden. Dieses Ergebnis kommt durch die unterschiedliche Arbeitsweise zustande:

Ping:
Ping schickt, um die Erreichbarkeit eines Rechners zu überprüfen, einen ICMP-Echo-Request. Der Empfänger antwortet darauf mittels einem ICMP-Echo-Reply, vorausgesetzt das Protokoll wird unterstützt und die Firewall lässt ICMP-Verkehr zu. Daher erscheint größtenteils bei ping mit der Option –R auch die komplette Route, da jeder Knotenpunkt auf dem Weg zum Ziel mittels einem ICMP-Echo-Request auf Erreichbarkeit geprüft wird.

Traceroute:
Traceroute dagegen sendet mehrfach Pakete, um die Route zu ermitteln. Dabei wird die TTL bei jedem Paket um 1 erhöht, so dass jeder Knotenpunkt der das Paket erhält die TTL um 1 heruntersetzt. Sollte ein Router dabei ein Paket mit der TTL=1 erhalten und müsste es logischerweise vermitteln, dann wird das Paket verworfen und stattdessen ein ICMP-Reply „Time-to-live exceeded“ und „Time-to-live exceeded in transit“ an den Absender gesendet. Passiert dies allerdings bei unserem Zielhost so erhält man ein ICMP-Reply „Destination Unreachable“ oder alternativ einen ICMP-Echo-Reply. Dies stellt im Endeffekt unsere Route zum Ziel dar. Dabei kann der Rückweg identisch sein, muss es aber nicht, wenn asymmetrisches Routing zum Einsatz kommt. Allerdings stellt Traceroute nicht immer die vollständige Route dar, da Firewalls, NAT sowie andere Routen bei Netzwerküberlastung Einfluss darauf haben können.

Aufgabe 1-8:

Betrachtet man die Ergebnisse aus Aufgabe 1-6 und Aufgabe 1-7 liegen 2 Router auf dem Weg zwischen ktdsp17.local und ktdsap1.local!

ktdsp17.local 10.20.23.7 0
                   10.20.0.1 1a
ktdrt1.local 10.23.5.61 1b
ktdss05.local 10.23.5.5 2a
                   10.50.0.1 2b
ktdsap1.local 10.50.23.1 3a

Aufgabe 1-9:

/home/kt> /usr/sbin/traceroute www.lacnic.net
traceroute to www.lacnic.net (200.3.14.10), 30 hops max, 40 byte packets
1  139.6.65.1 (139.6.65.1)  0.435 ms   0.367 ms   0.358 ms
2  xr-bir1-ge9-21.x-win.dfn.de (188.1.232.125)  1.723 ms   1.691 ms   1.700 ms
3  zr-fra1-te0-7-0-5.x-win.dfn.de (188.1.145.46)  4.469 ms   4.141 ms   4.252 ms
4  64.213.78.237 (64.213.78.237)  4.105 ms   4.109 ms   4.110 ms
5  ge-1-3-0.0.gw01.registro.br (64.214.145.246)  231.019 ms   231.038 ms   231.713 ms
6  ar01.bb2.registro.br (200.160.0.244)  232.506 ms   232.935 ms   232.240 ms
7  gw01.lacnic.registro.br (200.160.0.212)  231.573 ms   231.782 ms   231.901 ms
8  www.lacnic.net (200.3.14.10)  233.220 ms   232.479 ms   232.727 ms

Sieben Knoten bzw. acht Hops liegen auf dem Weg von ktdsp17.local zu www.lacnic.net. Die Standorte der Knoten wurden mittels whois Abfragen ermittelt:

1 DE Köln/Gummersbach
2 DE Over
3 DE Over
4 US Arvada, CO
5 US nicht vorhanden
6 BR nicht vorhanden
7 BR nicht vorhanden
8 UY nicht vorhanden
US = Vereinigte Staaten von Amerika – BR = Brasilien – UY = Uruguay

Von den sieben Knoten liegen, laut Angaben der whois Abfragen, drei Knoten in Deutschland.

Aufgabe 1-10:

/home/kt> nslookup -type=SOA fh-koeln.de
Server:         10.23.5.1
Address:        10.23.5.1#53
fh-koeln.de
        origin = ns-iwz.nz.fh-koeln.de
        mail addr = dns.fh-koeln.de
        serial = 2009102602
        refresh = 10800
        retry = 1800
        expire = 604800
        minimum = 86400
 

Der Primary Nameserver ist unter dem Punkt origin zu finden und trägt folgenden Namen:
ns-iwz.nz.fh-koeln.de
Die Seriennummer der Zone lautet 2009102602. Der TTL-Wert ist unter dem Punkt minimum zu finden und dürfte wie es standardmäßig der Fall ist in Sekunden angegeben sein: 86400. Die Mailadresse des Zonenverwalters findet man unter mail addr, nach dem DNS-Standard entsprechend, muss der erste Punkt in dns.fh-koeln.de als @ interpretiert werden, demzufolge lautet die Mailadresse dns@fh-koeln.de . Um die letzte Änderung der Zone herausfinden zu können betrachtet man die ersten 8 Stellen der Seriennummer. Diese haben folgendes Format YYYYMMDD. Daraus ergibt sich, dass die Zone das letzte Mal am 26.10.2009 geändert worden ist.

Aufgabe 1-11:

/home/kt> nslookup www.gm.fh-koeln.de
Server:         10.23.5.1
Address:        10.23.5.1#53
www.gm.fh-koeln.de      canonical name = advm1.gm.fh-koeln.de.
Name:   advm1.gm.fh-koeln.de
Address: 139.6.57.1
 

Aus dieser nslookup Abfrage kann man gut erkennen welcher Eintrag vom Typ A und welcher vom Typ CNAME (canonical name) in der Zone gm.fh-koeln.de sein muss.

www.gm.fh-koeln.de CNAME advm1.gm.fh-koeln.de
advm1.gm.fh-koeln.de A 139.6.57.1

Aufgabe 1-12:

/home/kt> nslookup -type=MX fh-koeln.de
Server:         10.23.5.1
Address:        10.23.5.1#53
fh-koeln.de     mail exchanger = 10 smtp.intranet.fh-koeln.de.
 

/home/kt> nslookup smtp.intranet.fh-koeln.de
Server:         10.23.5.1
Address:        10.23.5.1#53
Name:   smtp.intranet.fh-koeln.de
Address: 139.6.1.61
 

Laut nslookup Abfrage nach dem MX-Record, der für die Mailservereinträge im DNS verwendet wird, existiert in der Zone fh-koeln.de nur ein Server für die Mailweiterleitung. Vermutlich steckt hinter der IP-Adresse ein redundantes Cluster welches von außen nur über diese eine IP-Adresse angesprochen wird.

Aufgabe 1-13:

/home/kt> telnet www.f10.fh-koeln.de 80
Trying 139.6.138.92…
Connected to www.f10.fh-koeln.de.
Escape character is ‘^]’.
GET http://www.f10.fh-koeln.de

<html>
<head>
<meta name=”GENERATOR” content=”IMPERIA 7.5.1″ />
<meta http-equiv=”content-type” content=”text/html; charset=iso-8859-1″>
        <meta name=”Content-Language” content=”de”>
        <meta http-equiv=”Content-Style-Type” content=”text/css”>
        <meta name=”robots” content=”index”>
        <meta name=”pragma” content=”no-cache”>
        <meta name=”keywords” content=”FH Koeln, Fachhochschule Koeln, Fakultaet 10, Fakult&auml;t f&uuml;r Informatik, Ingenieurwissenschaften”>
  <meta name=”X-Imperia-Live-Info” content=”283e9061-5c8e-8f8e-ffb3-cd250ef7b0f4/188/17″ />
  <link rel=”stylesheet” type=”text/css” href=”/styles.css”><link rel=”stylesheet” href=”/styles.css”>
  <link rel=”alternate” type=”application/rss+xml” title=”Nachrichten der Fakult&auml;t als RSS-Feed” href=”http://www.zi.fh-koeln.de/rss_f10.php”>
  <title>Fachhochschule Koeln</title>
</head>
<body bgcolor=”white”>
<input type=”hidden” name=”directory” value=”/sa”>
<input type=”hidden” name=”filename” value=”Startseite_sa.htms”>
<table width=”765″ border=”0″ cellspacing=”0″ cellpadding=”0″ align=”left”>
<script language=”JavaScript”>
function ImperiaSearch() {
        search_win=open(‘/inc/loading.html’, ‘search’, ‘resizable=1,resize=yes,scrollbars=yes,height=500,width=650′);
        document.forms.search.target=’search’;
        document.search.submit()
}
</script>
……..

Es wurde sich mittels telnet auf den Webserver www.f10.fh-koeln.de auf Port 80 verbunden und mittels GET http://www.f10.fh-koeln.de der Inhalt der index.html abgefragt. Die Ausgabe geht noch weiter wurde aber abgeschnitten, um die Seitenanzahl nicht unnötig aufzublähen.

telnet www.f10.fh-koeln.de 80
Trying…
Connected to imperia-live.zam.fh-koeln.de.
Escape character is ‘^]’.
HEAD /index.html HTTP/1.0

HTTP/1.1 200 OK
Date: Sat, 14 Nov 2009 15:04:57 GMT
Server: Apache/2.0.54 (Debian GNU/Linux) mod_jk2/2.0.4 PHP/4.3.10-22 mod_ssl/2.0.54 OpenSSL/0.9.7e
Accept-Ranges: bytes
Connection: close
Content-Type: text/html

Connection closed.

Die Abfrage des Protokollkopfes muss mittels der Option HTTP/1.0 erfolgen. Versucht man es standardmäßig mittels HTTP/1.1 erhält man die Fehlermeldung: Bad request.

/home/kt> telnet www.neumanndaniel.de 80
Trying 82.165.115.240…
Connected to www.neumanndaniel.de.
Escape character is ‘^]’.
GET http://www.neumanndaniel.de
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
      <meta http-equiv=”refresh” content=”0; URL=http://www.necron.mcseboard.de”>
      <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
      <meta name=”Description” content=”Offizielle Homepage von Daniel Neumann! Hier finden Sie alle Infos …”>
      <meta name=”publisher” content=”Daniel Neumann”>
      <meta name=”author” content=”Daniel Neumann”>
      <meta name=”robots” content=”index, follow”>
      <meta name=”date” content=”2006-2008″>
      <meta http-equiv=”pragma” content=”no cache”>
      <meta http-equiv=”Expires” content=”0″>
      <meta http-equiv=”Language” content=”de”>
      <link rel=”shortcut icon” href=”favicon.ico”>
<!– TemplateBeginEditable name=”doctitle” –>
<title>NeumannDaniel.de (c) by Daniel Neumann</title>
</head>
<body>
</body>
</html>
Connection closed by foreign host.
 

Hier wurde sich wieder mittels telnet auf den Webserver www.neumanndaniel.de auf Port 80 verbunden und mittels GET http://www.neumanndaniel.de der Inhalt der index.html abgefragt.

Aufgabe 1-14:

/home/kt> telnet ftp.isi.edu 21
Trying…
Connected to www.isi.edu.
Escape character is ‘^]’.
220 ftp.isi.edu NcFTPd Server (free educational license) ready.
USER anonymous
331 Guest login ok, send your complete e-mail address as password.
PASS ***********************************************

230-You are user #13 of 550 simultaneous users allowed.
230-
230-If you have problems downloading and are seeing “Access denied” or
230-”Permission denied”, please make sure that you started your FTP client in
230-a directory to which you have write permission.
230-
230-If your FTP client crashes or hangs shortly after login please try using
230-a dash (-) as the first character of your password. This will turn off
230-the informational messages that may be confusing your FTP client.
230-
230-All transfers and commands to and from this host are logged.
230-
230-If you experience any problems using ftp, please report them via
230-e-mail to Action@isi.edu.
230-
230 Logged in anonymously.
cwd /in-notes/std
250-”/in-notes/std” is new cwd.
250-
250-*====================================================================*
250-* *
250-* This directory is maintained by the RFC Editor. If you experience *
250-* any problems, please report them to rfc-editor@rfc-editor.org. *
250-* *
250-*====================================================================*
250
PASV
227 Entering Passive Mode (128,9,176,20,226,226)
RETR std1.txt
150 Data connection accepted from 139.6.57.1:41673; transfer starting for rfc500 0.txt (222566 bytes).
226 Transfer completed.
quit
221 Goodbye.
Connection closed.

Beim Übertragen trat der Fehler Write error: Bad file number auf, mittels Änderung des Übertragungsmodus in den passiven Modus (PASV) konnte anschließend die Datei korrekt übertragen werden. Allerdings muss man dazu ein zweites Konsolenfenster öffnen und die neue Portnummer berechnen. Dies geschieht mit den letzten zwei Zahlen bei „227 Entering Passive Mode (128,9,176,20,226,226)“. Die Formel dazu lautet dann 226*256+226=58082, die zu addierende Zahl ist die letzte Zahl bei „227 Entering Passive Mode (128,9,176,20,226,226)“. Ist man mit dem Server über die neue Portnummer verbunden, startet man die Übertragung im Hauptfenster und bekommt den Inhalt der Datei im zweiten Fenster angezeigt!

Aufgabe 1-15:

/home/kt> telnet mail.local 25
Trying 10.20.23.30…
Connected to mail.local.
Escape character is ‘^]’.
220 mail.local ESMTP Postfix
MAIL FROM: ktmailer1
250 2.1.0 Ok
RCPT TO: ktmailer2
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Hallo,
dies ist eine Testnachricht!
.

QUIT
Connection closed by foreign host.

Zum Versenden der Testmail wurde sich mittels telnet auf den Mailserver mail.local auf Port 25 verbunden. Absender ist ktmailer1 und Empfänger ktmailer2. Man sollte unbedingt darauf achten, dass die Nachricht mit einem freistehenden Punkt beendet wird. Mit dem Befehl QUIT verlässt man den Mailserver und sendet auch zeitgleich die Nachricht ab.

Aufgabe 1-16:

/home/kt> telnet mail.local 110
Trying 10.20.23.30…
Connected to mail.local.
Escape character is ‘^]’.
+OK ready <***********************************************>
USER ktmailer2
+OK Password required for ktmailer2.
PASS ***********************************************
+OK ktmailer2 has 11 visible messages (0 hidden) in 5555 octets.
STAT
+OK 11 5555
LAST
+OK 10 is the last read message.
RETR 11
+OK 585 octets
Return-Path: <ktmailer1@mail.local>
X-Original-To: ktmailer2
Delivered-To:  ktmailer2@mail.local
Received
: from ktdsp17.local (ktdsp17.local [10.20.23.17])
by mail.local (Postfix) with SMTP id 5FEE05F71B
for <ktmailer2>; Tue, 17 Nov 2009 16:04:36 +0100 (CET)
Message-Id: <20091117150502.5FEE05F71B@mail.local>
Date: Tue, 17 Nov 2009 16:04:36 +0100 (CET)
From: ktmailer1@mail.local
To: undisclosed-recipients:;
X-UIDL: ET2″!n5:!!kT]!!jZY!!

Hallo,
dies ist eine Testnachricht!
.

dele 11
+OK Message 11 has been deleted.
quit
+OK Pop server at *********************************************** signing off.
Connection closed by foreign host.

Zum Abrufen der versendeten Nachricht wurde sich mittels telnet auch den Mailserver mail.local auf Port 110 verbunden. Die Anmeldung erfolgte mit dem Benutzer ktmailer2 und der entsprechenden Eingabe des Passwortes. Mit dem Befehl LAST wurde die schon gelesenen Nachrichten aufgelistet, so dass die 11. Nachricht die Ungelesene sein muss, die dann mittels RETR 11 angezeigt wurde. Zum Abschluss wurde die Nachricht per dele 11 gelöscht und der Mailserver mittels quit verlassen.

Office 2010 Beta & j-Algo

Seit gestern steht die Beta von Office 2010 zum Download zur Verfügung. Ich werde die Beta in den nächsten Tagen testen und einen Erfahrungsbericht dazu schreiben. Welche Neuerungen gibt es? Was hat sich gegenüber Office 2007 getan? usw.

-> http://www.microsoft.com/office2010

Desweiteren bin ich vor ein paar Tagen wegen meinem Algorithmik Praktikum auf das Tool j-Algo gestoßen. Mit diesem Tool kann man sich gewisse Algorithmen visualisieren lassen. Bisher habe ich dies nur für die AVL-Bäume ausprobiert und muss sagen das ich von j-Algo begeistert bin. Ich denke das es mir im weiteren Studienverlauf der Allgemeinen Informatik nochmal von Nutzen sein wird. ;)

-> http://j-algo.binaervarianz.de/

Studium, IT und andere Neuigkeiten

Das 3. Semester ist doch anstrengender als erwartet. 5 Praktika anstatt 2 Praktika im Vergleich zum 2. Semester erfordern mehr Arbeit, vor allem, weil man jede Woche mindestens 2 Abnahmen hat. Daher bin ich in letzter Zeit auch nicht dazu gekommen einen ausführlicheren Eintrag zu schreiben.

In den letzten Wochen stand einiges in den Praktika auf dem Programm. Im Softwaretechnik Praktikum wurden hauptsächlich Klassen-, Kompositionsstruktur-, Paket-, Komponenten- und Verwaltungsdiagramme in UML erstellt. Genauso beschäftigte man sich bisher in unserem Datenbank Praktikum mit der Modellierung von Datenbanken. Stichwort: ERM und EERM.
Sehr praktisch geht es dagegen in den Praktika von Paradigmen der Programmierung und Algorithmik zu. Im PP Praktikum beschäftigen wir uns zur Zeit mit JAVA Generics, Enum-Klasse, Autoboxing und Foreach Schleifen. Wie der Name schon sagte, dreht sich im Algorithmik Praktikum alles um Algorithmen. Zum Einstieg stand auf dem Plan den Quick-Select Algorithmus zu programmieren und dazu eine theoretische sowie experimentelle Laufzeitanalyse anzufertigen. Zusätzlich zu den Programmieraufgaben, müssen die Aufgaben im Algorithmik Praktikum dokumentiert werden, was einen zusätzlichen Aufwand bedeutet.
Genauso sieht das Praktikum im Fach Kommunikationstechnik aus, die abgearbeiteten Aufgaben müssen dokumentiert werden. Hier ist allerdings nur die Dokumentation aufwendig, denn das Kennenlernen der Befehle ping, tracert/traceroute, nslookup und telnet war für mich nichts Neues. Weitere Neuigkeiten dazu wird es demnächst geben. ;)

Heute ist offiziell auf der TechEd Europe 2009 in Berlin der Exchange Server 2010 RTM veröffentlicht worden. Bei der heutigen Keynote gab es dazu eine sehr coole Live-Demo!
OWA sieht jetzt richtig gut aus und kommt mit einem Messenger sowie weiteren Neuerungen daher. Desweiteren heißt OWA nicht mehr Outlook Web Access, sondern ab Exchange Server 2010: Outlook Web App. Hier könnt ihr euch die 120 tägige Testversion herunterladen: http://www.microsoft.com/exchange/2010/en/us/try-it.aspx
Desweiteren wird im November, wie man schon von einschlägigen Websites entnehmen konnte, die öffentliche Beta von Office 2010 zur Verfügung gestellt werden.

Vor zwei Wochen habe ich auch im Rahmen der Microsoft Student Partners meine Windows 7 Launch Veranstaltungen gut hinter mich gebracht und bin zur Zeit Workshops für die Studenten am Campus Gummersbach am planen. Auf dem Programm stehen erst einmal folgende Themen: “Natives Booten von VHD – Windows” und “Einführung in die PowerShell v2”. Nebenbei bereite ich mich zur Zeit auch auf meine Prüfung zum MCTS Configuring Microsoft Windows 7 vor, die ich Ende November ablegen werde.

6. AP 2 Praktikum

Die Aufgabenblätter sind hier zu finden: http://www.gm.fh-koeln.de/~ehses/ap/index.html

Aufgabe 1:

Node.java:

package search.util;

public class Node {
 public Object value;
 public Node next;

 Node (Object value, Node next) {
 this.value = value;
 this.next = next;
 } 
}

ConcatenateList.java:

package search.util;

import java.util.Comparator;
public class ConcatenateList {
 private Node first = null;

 public boolean isEmpty() {
  return first == null;
 }
  
 public Object removeFirst() {
  Object retValue = first.value;
  first = first.next;
  
  return retValue;
 }
 
 public void addLast(Object o) {
  Node newNode = new Node(o, null);
  
  if (first == null) {
   first = newNode;
  }
  else {
   Node temp = first;
   while (temp.next != null) {
    temp = temp.next;   
     
   temp.next = newNode;
  }
 }
 
 public void clear() {
  first = null;
 }

 public void add(Object o, Comparator cmp) {
  if ( isEmpty() ) {
   first = new Node(o, null);
  }
  else {

   Node temp = first;  
   Node temp_prev = null; 

   while ( temp != null && cmp.compare(o, temp.value) > 0 ) {
    temp_prev = temp;
    temp = temp.next;
   }
   
   if (temp == null) {
    temp_prev.next = new Node (o, null);
   }
   else if (temp == first){

     first = new Node (o, temp);
   }
   else{
    temp_prev.next = new Node (o, temp);
   }
  }
 }

 public Object removeLast() {

  Node temp = first;  
  Node temp_prev = null; 
  
  while (temp.next != null) {
   temp_prev = temp;
   temp = temp.next;
  }
  
  if (temp == first) {
   first = null;
   return temp.value;
  }
  else {
   temp_prev.next = null;
   return temp.value;
  }
 }
}

FIFOQueue.java:

package search.util;

import java.util.NoSuchElementException;

public final class FIFOQueue implements IQueue {

 private ConcatenateList snake = new ConcatenateList();
 
 public void clear() {
  snake.clear();  
 }

 
 public Object get() {
  if (this.isEmpty()) throw new NoSuchElementException(“Queue is empty”);
  return snake.removeFirst();
 }

 
 public boolean isEmpty() {
  return snake.isEmpty();
 }

 
 public void put(Object p) {
  snake.addLast(p);
 }
 
}

LIFOQueue.java:

package search.util;

import java.util.NoSuchElementException;

public final class LIFOQueue implements IQueue {

 private ConcatenateList stack = new ConcatenateList();
 
 public void clear() {
  stack.clear();  
 }

 
 public Object get() {
  if (this.isEmpty()) throw new NoSuchElementException(“Queue is empty”);
        return stack.removeLast();
 }

 
 public boolean isEmpty() {
  return stack.isEmpty();
 }

 
 public void put(Object p) {
  stack.addLast(p);
 }
 
}

PriorityQueue.java:

package search.util;

import java.util.Comparator;
import java.util.NoSuchElementException;

public final class PriorityQueue implements IQueue {

 private ConcatenateList prio = new ConcatenateList();
 
 private Comparator cmp;
 
 public PriorityQueue(Comparator cmp) {
  this.cmp = cmp;
 }

 public void clear() {
  prio.clear();  
 }

 
 public Object get() {
  if (this.isEmpty()) throw new NoSuchElementException(“Queue is empty”);
        return prio.removeFirst();
 }

 
 public boolean isEmpty() {
  return prio.isEmpty();
 }

 
 public void put(Object p) {
  prio.add(p, this.cmp);
 }
}

Aufgabe 3:

numberOfNodes():

public static int numberOfNodes(ITreeNode root) {
     if(root==null){
      return 0;
     } 
     else{
    
            int countNodes = 1;
            for (Iterator iter = root.getChildren().iterator(); iter.hasNext();) {
                ITreeNode child = (ITreeNode) iter.next();
                countNodes += numberOfNodes(child);
            }
            return countNodes;
     }
}

Aufgabe 4:

getPathToGoal():

public static List getPathToGoal(ITreeNode root, Object goalNode) {
        List pathList = null;
     
     if (root == null) {
      return pathList;
     }
     
     if (goalNode.equals(root.getValue())) {
      pathList = new ArrayList();
      pathList.add(goalNode.toString());
      return pathList;
     }
     
        for (Iterator iter = root.getChildren().iterator(); iter.hasNext();) {
            ITreeNode child = (ITreeNode) iter.next();           
            pathList = getPathToGoal(child, goalNode);         
            if (pathList != null) {
             pathList.add(0, root.getValue().toString());
             return pathList;
            }
        }
     
     return pathList;
}