Archive for the ‘3. Semester Bc’ Category
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;
   }
  } 
 }
}

Semesterendspurt

Das 3. Semester nähert sich seinem Ende und daher gibt es wieder viel zu tun. Die letzten Aufgaben für die Praktika müssen fertig gestellt werden. Die Klausuren rücken näher, daher wird auch hierfür gelernt. Dann steht noch die 5. Jahreszeit ins Haus! Denn bei uns im Rheinland herrscht wieder Prinz Karneval. :D
Neben diesen Aufgaben und dem Vergnügen Karneval, habe ich noch 2 Workshops vorbereitet. Der erste Workshop findet am 19.01.2010 am Campus Gummersbach statt und befasst sich mit dem Thema “Booten von VHD mit Windows 7 und Windows Server 2008 R2”. Der zweite Workshop dagegen findet aller Voraussicht nach am 22.01.2010 an der Uni Bonn statt und behandelt das Thema “Grundlagen der Windows Server Administration”.

Außerdem steht wie jedes Jahr im März die CeBIT auf dem Programm, hier dürft ihr auch wieder Einträge zu den neusten vorgestellten Technologien und Produkten erwarten.

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.

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.

Studienverlauf 3. Semester

Nachdem die ersten zwei Wochen des 3. Semesters rum sind, ein kurzer Bericht was einem im dritten Semester alles erwartet:

Paradigmen der Programmierung:
Die objektorientierte Programmierung mit JAVA wird weiter vertieft. Generics, Multithreading, Threadsicherheit usw..

Softwaretechnik 1:
Hier wird in diesem Semester die Modellierungssprache UML behandelt und dementsprechend Softwaremodelle entworfen.

Datenbanken 1:
Die Vorlesung Datenbanken 1 beinhaltet das Erstellen von ER-Modellen, Objektrelationale Aspekte, Theoretische Grundlagen von relationalen Datenbanken, die Implementierung von Datenbanken mittels SQL, sowie den Mehrbenutzerbetrieb und Transaktionen.

Algorithmik:
Vorbereitend für die Vorlesung Künstliche Intelligenz, wird in der Veranstaltung Algorithmik alles rund um das Entwickeln, Anwenden, Programmieren, Verstehen und das Laufzeitverhalten von Algorithmen gelehrt.

Kommunikationstechnik:
Wie der Name schon sagt, beschäftigt sich die Kommunikationstechnik mit Netzwerken, TCP/IP, OSI-Modell und weiteren dazu gehörigen Themenbereichen.

Diskrete Mathematik:
Gegenüber den Studiengängen der TI, MI und WI, haben die Studenten der AI ein weiteres Semester Mathematik mit den folgenden Themenschwerpunkten:

  • Primzahlen und Primfaktoren
  • Modulare Kongruenz
  • Diophantische Gleichungen
  • Algebraische Strukturen
  • Kryptographie
  • Fehler korrigierende Codes
Kick off!

Nachdem ich nun meine letzten drei Klausuren aus dem Grundstudium hinter mich gebracht habe, geht es am Montag mit den Vorlesungen im Hauptstudium (3. Semester) los. Jetzt werden noch die restlichen Tage der Semesterferien genossen. :D