Mittwoch, 26. Januar 2011

Januar 2011 / Windows Server 2008 R2

Windows Server 2008 R2

Im Modul 123 - Serverdienste in Betrieb nehmen, haben wir während des letzten Semesters einen Virtuellen Windows Server 2008 konfiguriert. Dabei lernten wir einzelne Funktionen und Rollen des Servers kennen.
Wir konfigurierten unseren Server nach einem Fallbeispiel.

In diesem Fallbeispiel teilen sich eine Arztpraxis und ein Altersheim den Server und den Internet-Anschluss. Dabei soll alles, wie Berechtigungen, Interne Website usw. auf dem Server geregelt sein. Die Arztpraxis und das Altersheim sollen jedoch nichts vom jeweils anderen "Betrieb" mitbekommen, was bedeutet, dass sie in einer Domäne getrennt gehandelt werden sollen.

Zuerst richteten wir den DNS-Server ein, damit wir anschliessend das AD installieren konnten.
Der DNS-Server dient dazu, URLs wie z.b. http://www.google.ch/ in IP-Adressen umzuwandeln.
Hier lernten wir wie das Ganze genau funktioniert, wie der Server die URLs auflöst.

Dann richteten wir das ADDS (Active Directory Domain Services) ein. Es ist der Verzeichnisdienst unter Windows Server 2008. Er ermöglicht, die Aufteilung des Netzwerks entsprechend der Struktur einer Firma, oder der räumlichen Verteilung.
Beim Installieren lernten wir viele neue Begriffe und deren Zusammenhänge kennen wie Tree, Forest, Global-Catalog usw. Diese Begriffe hier aufzuzählen und zu erklären halte ich nicht für sinnvoll.
Jedoch mussten wir uns überlegen, wie genau wir unser Netzwerk aufteilen können. Dazu lernten wir die Organisationseinheiten(OU's) kennen.
Wir teilten unsere OU's entsprechend dem Fallbeispiel in Altersheim und Arztpraxis und den jeweiligen Computern, Gruppen und Benutzern auf.

Beim Installieren erstellten wir eine neue Gesamtstruktur(Forest). Der Top-Level-Name ist dabei local, was sich für nicht-öffentliche Domänen eingebürgert hat.
Schlussendlich nannten wir unsere Domäne Sonnenhof.local.

Nachdem wir das ADDS installiert hatten, widmeten wir uns dem IIS
(Internet Information Server).
Dabei lernten wir die genaue die 4 verschiedenen Authentifications kennen:
Die Anonymous Authentification dient dazu, dass jeder Zugriff ohne Name/Passwort hat.
Mit der Basic Authentification braucht man einen Namen und ein Passwort für den Zugriff.
Die Digest Authentification hat die gleiche Funktion wie die Basic Authentification, ist jedoch sicherer.
Bei der Windows Authentification wird der Zugriff im Intranet über den Domain-Client geregelt.
Der IUSR dient dabei bei der Anonymous Authentification als Anonymer Benutzer. So kann der Administrator die Rechte des Anonymen Benutzers regeln.
Wir installierten uns einen Webserver für dir Intranet-Sites, auf welche wir den Zugriff per Windows Authentification regelten.

Nun erstellten wir noch all unsere Benutzer und Gruppen, vergaben Rechte und lernten die GPOs kennen.

Mittwoch, 15. Dezember 2010

Dezember 2010 / Normalisierung

Normalisierung


Im Modul 104 - Datenmodell erstellen und implementieren befassen wir uns mit der Planung und Erstellung von Datenbanken.
Nun haben wir uns dem Thema Normalisierung gewitmet.
Im Fachdeutsch bedeutet die Normalisierung die schrittweise Zerlegung von Relationen, um Redundanzen innerhalb eines Datenschemas zu vermeiden.
In meinen eigenen Worten würde ich die Normalisierung so beschreiben:
Die Normalisierung ist ein Vorgehen, mit welchem man überprüfen kann, ob die Tabellen und Beziehung korrekt sind. Entsprechen Sie nicht den vorgegebenen Richtlinien, werden Sie korrigiert.
Das Ziel der gesamten Normalisierung ist es, die Kosistenz der Datenbank zu erhöhen und so Fehlerquellen zu verringern.
Sie wird bei der Plangung der Datenbank durchgeführt.
Die Normalisierung besteht aus 6 Normalformen, wovon wir jedoch nur die ersten 3 benötigen.


Um die 1. Normalform zu erreichen, müssen folgende Punkte eingehalten werden:
- Es sind keine Zusammengesetzen Attributwerte vorhanden
Beispiel: Adresse muss in PLZ, Ort, Strasse, Hausnummer aufgeteilt werden.
- Es dürfen nicht mehrere Werte innerhalb eines Wertfeldes vorkommen
Beispiel: Mehrere Titel-Namen einer Audio-CD in einem Wertefeld

Hier noch das Beispiel aus Wikipedia:
Datenschema in der "0." Normalform.



Datenschema nach der Normalisierung in der 1. Normalform.


Wie man sieht, wurden die Mehrfachen Titel in einzelne Felder aufgeteilt und das Album vom Interpret getrennt.
Nun bilden CD_ID und Track einen Verbundschlüssel, welchen den Primärschlüssel repräsentiert.

Damit sich ein Datenschema in der 2. Normalform befindet, müssen folgende Punkte eingehalten werden:
- Das Datenschema muss sich in der 1. Normalform befinden
- Jedes Attribut, welches keinen Schlüssel darstellt, ist von Allen Schlüsseln(also vom gesamten Verbundschlüssel) abhängig
Beispiel: In der 1. NF sind Album von der CD_ID abhängig, nicht aber vom Track.

Um dieses Datenschema in die 2. Normalform zu bringen müssen folgende Schritte vorgenommen werden:
Da die Attribute Album, Interpret und Jahr der Gründung nicht von beidem Schlüsselteilen abhängig ist, wird die Tabelle in mehrere Tabellen aufgeteilt. Anschliessend werden die Redundanten Daten gelöscht. Daraus ergeben sich folgende Tabellen:

In der 2. Tabelle stellt CD_ID einen fremdschlüssel dar, da er auf die CD_ID der 1. Tabelle verweisst.


Damit sich ein Datenschema in der 3. Normalform befindet, müssen alle Transiven abhängigkeiten von nicht-schlüssel-Attributen auf schlüssel-Attribute aufgelöst werden. Eine Transive Abhängigkeit wird folgendermassen beschrieben:

Hängt das Attribut C vom Attribut B ab und das Attribut B vom Attribut A, hängt das Attribut C transiv(also indirekt) vom Attribut A ab.

In unserem Beispiel gibt es ebenfalls so einen Fall.
Das Jahr der Gründung hängt vom Interpreten ab, der Interpret wiederum hängt vom Album ab. Also ist das Jahr der Gründung Transiv vom Album abhängig. Das führt zu redundanten (mehrfach vorkommenden) Daten.
Um das zu verhindern, muss eine 3. Tabelle erstellt werden.

Dabei bildet Interpret den Primärschlüssel und bei der 1. Tabelle wird Interpret als Fremdschlüssel hinzugefügt:




Dieses Datenschema befindet sich nun in der 3. Normalform und kann so realisiert werden. Was in diesesm Falle etwas speziell ist, ist der Zusammengesetzte Fremdschlüssel in der 3. Tabelle. Der Titel ist immer vom Track und von der CD_ID abhängig. Das bedeutet, dass man keine Titel ohne dazugehöriges Album und der Track-Nummer erfassen kann und keine CD ohne Titel.

Montag, 8. November 2010

November 2010 / WNotificator

In der Firma

WNotificator:

In der Firma habe ich das Programm WNotificator getestet.
Dieses Programm wurde von der indico electronic AG entwickelt und war in der Test-Phase.
Ich übernahm dabei hauptsächlich die Rolle des Testers. Für mich war diese Rolle neu und wie sich herausstellte auch nicht gerade einfach: Man muss jede mögliche Situation testen, jeden Button anklicken, jedem möglichen Navigationsweg folgen usw.

Es war das erste Mal, dass ich in unserer Firma, in einem Team an einem Projekt arbeiten musste, welches möglichst schnell fertig gemacht bzw. auf einem Vertretbaren Stand gebracht werden musste.
Ich spielte also eine wesentliche Rolle in einem echten Projekt. Würde ich meine Arbeit nicht korrekt erledigen bekäme unsere Firma ein Problem. Das hat mich einerseits unter Druck gestellt, andererseits jedoch auch angespornt.
Auch dass ich nur bedingt kontrolliert wurde und dass ich anderen Mitarbeitern mitteilen musste, was sie zu tun haben, war eine neue Erfahrung. Es ist nicht gerade einfach alles richtig und für den Gegenüber verständlich auszudrücken, daher gab es auch Missverständnisse.

Mein Fazit davon ist:
Das ausführliche Testen eines Programmes ist sehr wichtig und anspruchsvoll. Es muss auf das kleinste Detail geachtet werden und wird etwas geändert, muss man den bereits getesteten und damals funktionierenden Teil anschliessend wieder testen. Ein Abschliessender Test ist auch sehr wichtig. Denn was einmal getestet wurde und korrekt funktionierte, kann nach 10 neuen Versionen möglicherweise nichtmehr funktionieren.

CPU-Testsystem - C#

Abgesehen von den Zahlreichen Tests, entwickelte ich ein weiteres Programm mit C#.
Das CPU-Testsystem dient dazu die Wettronic 1 zu testen.
An sich hatten wir bereits ein funktionierendes System, dafür benötigten wir jedoch extra einen Computer, denn es lief nicht auf Windows und es hatte keine Grafische Benutzeroberfläche.
Die Kommunikation mit dem Gerät erfolgte über die RS232-Schnittstelle.

Den Code für die Kommunikation war jedoch bereits vorhanden, also musste ich mich nicht darum kümmern, wie das genau funktionieren würde. Stattdessen musste ich bloss verschiedene Bits setzen, welche dann einen Test starteten. Bei den ersten Tests musste der Tester von Hand überprüfen, ob alles korrekt funktionierte. Das hiess für mich, dass ich bloss eine Messagebox öffnen und damit fragen musste, ob alles korrekt funktionierte. Das ganze musste anschliessend noch in einen Log geschrieben werden.

Den Log stellte ich als ListView dar, damit ich den Hintergrund der Einträge färben konnte.
Um einen Listview-Eintrag zu erstellen, nutzte ich eine Methode, damit ich nicht bei jedem Eintrag viel schreiben musste.
Hier seht ihr nun, wie man den Listview befüllt.
Mit der nächsten Zeile kann man die 1. Spalte der Listview befüllen. Wobei Log den Listview darstellt.
ListViewItem Item = Log.Items.Add();

Mit folgender Zeile kann man die 2. Spalte der Listview befüllen.
item.SubItems.Add("");

Um den Logeintrag nun noch einzufärben kann man folgendes benutzen.
item.BackColor = Color.Beliebige Farbe;

Damit man den Eingefügten Logeintrag auch immer sieht braucht es noch folgende Zeile:
item.EnsureVisible();
Der Effekt sieht so aus, als ob immer jemand mitscrollen würde.

Schlussendlich wurde mir von einem Mitarbeiter noch erklärt, dass man folgende Zeile ebenfalls einfügen soll, damit alles korrekt angezeigt wird.
Log.Refresh();
Warum genau es einen Refresh braucht weiss ich selbst nicht.

Montag, 18. Oktober 2010

Oktober 2010 / PHP

ÜK 307 + 131

Ich besuchte die ÜKs 307(Interaktive Website erstellen) und 131(Arbeitspaket aus einem IT Projekt abwickeln). Die ÜKs hatten wir im "doppelpack". Das heisst wir haben eine Website mit Datenbankanbindung erstellt und dieses Projekt für unsere Übungen aus dem Modul 131 genommen.

Wir bildeten ein 3er Team. Ich war zuständig für den Code der Website, ein anderer für das Design und noch einer für die Dokumentation. Unsere Website stellt die besten Filme aus dem Jahre 2009 vor. Wir haben 7 Filme gewählt, die ziemlich gut abgeschnitten haben, oder wir sehr gut fanden und fügten zu jedem Film einen Eintrag in unsere Datenbank mit einer kurzen Zusammenfassung des Inhalts und einem Trailer ein. Den Seiteninhalt der einzelnen Filmseiten holten wir so aus der Datenbank.

Wir fügten ebenfalls ein Gästebuch ein. Dort kann jeder Besucher etwas hineinschreiben. Jedoch werden URLs geblockt um Spam zu verhindern.
Ebenfalls fügten wir die Besucherzahl unserer Website ein, welche wir jedoch nicht in der Datenbank sondern in einem Textfile speicherten.

Dabei lernte ich natürlich PHP kennen. PHP kann eine Website mit einer Datenbank verbinden und dazu nutzten wir es auch.
Um PHP nutzen zu können, kann man ein ganz normales HTML-File nehmen und PHP Code einfügen. Jedoch muss man anschliessend noch die Dateiendung in .php ändern.

Leider versucht dieser Blog meinen PHP Code zu interpretieren und daher kann ich euch nicht die korrekte Syntax zeigen, bzw. ich kopiere die Eröffnung des PHP Codes als Bild hinein.

Es muss immer deklariert werden, sobald PHP-Code vorkommt. Das geschieht folgendermassen:


?>

Innerhalt dieser beiden Zeichen-Codes kann man php-codieren. Aufgrund des oben genannten Problems werde ich diese Eröffnung und Schliessung des PHP-Codes nichtmehr einfügen.
Das einfachste ist eigentlich einen Text auszugeben. Das funktioniert folgendermassen:

echo "Mein Text";

So erscheint auf der Website der Text "Mein Text".

Als Nächstes kann man Variablen verwenden. Sie sind sehr einfach zu verwenden und müssen nicht direkt deklariert, sondern können direkt verwendet werden. Eine Variabel wird immer mit einem $ davor verwendet. Hier ein Beispiel:

$variabel1 = "Mein Text";
echo $variabel1

Das Ergebnis ist dasselbe wie beim oberen Beispiel, jedoch wird es über eine Variabel gemacht.

Die Verbindung auf den SQL-Server war einer der wichtigsten Punkte in unserem Projekt. Und so wird es gemacht:


$link = mysql_connect("host", "user", "password") or die ("Keine Verbindung möglich");


Damit wird versucht auf den MySQL-Server zuzugreifen. Mit "or die" kann man sagen, was passieren soll, wenn die Verbindung nicht aufgebaut werden kann. Hier wird "Keine Verbindung möglich" ausgegeben.

Anschliessend muss man noch die Datenbank auswählen, auf welche man zugreifen möchte:


mysql_select_db("filme") or die ("Die Datenbank existiert nicht");

Wird die angegebene Datenbank, hier "filme", nicht gefunden wird wieder durch "or die" eine Meldung ausgegeben. Hier: "Die Datenbank existiert nicht"
Das ganze könnte man natürlich auch ohne "or die" machen, ich denke jedoch es ist nützlich wenn man eine kurze Meldung ausgibt, weshalb es nicht funktioniert.

Um an den Inhalt der Datenbank zu gelangen, muss man das Select-Statement verwenden:


$Abfrage = "SELECT * FROM film WHERE titel = 'Avatar' ";

Das übergibt der Variabel Abfrage das Select-Statement. In unserer Datenbank "filme" gibt es eine Tabelle namens "film", diese wird hier ausgewählt. Es werden alle Einträge heraus genommen, in denen im Datenfeld "titel" "Avatar" steht. Bei uns gibt es natürlich nur einen Eintrag mit diesem Namen und daher konnten wir ihn so identifizieren.
Der Inhalt aus der Datenbank ist jedoch immer noch nicht geholt. Die Variabel hat nur das Statement gespeichert, es wurde noch nicht ausgeführt. Dazu benutzen wir folgendes:

$res = mysql_query($Abfrage);
$row = mysql_fetch_assoc($res);
Der mysql-query Befehl gibt bei erfolgreichem ausführen einen Ereignis-Handler zurück. Mit diesem kann man auf die zurückgegebenen Datensätze zugreifen.
Mit dem mysql_fetch_assoc Befehl wird der Ereignis-Handler an die row Variabel übergeben und man kann die Feldnamen als Schlüssel verwenden.
Unsere Tabelle hat 3 Spalten: "titel", "trailer" und "inhalt".
Nun konnte ich auf den Inhalt des geholten Datensatzes zugreifen. Mit folgendem Code gebe ich den Inhalt des Trailer-Feldes aus:
echo $row['trailer'];
So konnte ich dann auf alle Informationen aus der Datenbank zugreifen und das Projekt realisieren.
Zum Schluss gibt es noch unser Design, welches nicht ich erstellt habe:

Dienstag, 14. September 2010

September 2010 / C#

C#

In der Firma habe ich an einigen Projekten gearbeitet und andere kleinere Aufgaben gelöst.

Leider hatte ich nichts grosses, oder etwas worüber ich hier noch nie geschrieben hätte. Deshalb schreibe ich wieder über C# da sich meine Kenntnisse in diesem Bereich stetig verbessern.



Sinn und Zweck des Auftrags:


Ich bekam den Auftrag ein Programm zu entwickeln, welches Daten aus bestimmten .csv-Files lesen, zusammenfügen und geordnet abspeichern kann. Die Files haben immer 2 Spalten. In der 1. Spalte befinden sich Zeitstempel und in der 2. Werte dazu. Mein Programm musste die Zeitstempel und Werte des "Hauptfiles" und die Werte aller im selben Ordner gespeicherten .csv-Files nehmen, zusammenfügen und abspeichern. Wo die .csv-Files liegen, welches das "Hauptfile" ist und wo und mit welchem Namen die Fertige Datei gespeichert werden soll, wird mit Hilfe von Start-Parametern mitgeteilt.


Hier sehen Sie 3 Bilder der .csv-Files. Das 1. (Value1) ist das Hauptfile, die anderen 2 befinden sich im selben Ordner.



Aus diesen 3 Files sollte nun folgendes Entstehen:




Wie man sieht haben die 3 Dateien nicht gleich viele Zeilen. Daher passen sich alle Files dem Masterfile an. Wenn eine Datei zu viele Zeilen hat, werden die überflüssigen gelöscht. Hat eine Datei zu wenig, werden in den restlichen Zeilen leere Einträge eingefügt. Auch die 1. Zeile wird vom Masterfile genommen. Allerdings sollten alle Dateien die gleichen Zeitstempel haben, ansonsten würde es keinen Sinn ergeben sie zusammenzufügen.

Ich erarbeitete mir 2 verschiedene Versionen.

Die erste entwickelte ich ohne fremde Hilfe.
Ich hatte jedoch ein Problem: Man kann nicht gleichzeitig Daten aus einem File lesen und es mit anderen Daten beschreiben. Meine Lösung las jedoch jede Datei einzeln und speicherte die gelesenen Informationen gleich Zeile für Zeile in ein .csv-File. Es gibt keine Funktion mit der ich einfach etwas ans Ende einer Zeile schreiben könnte, wie ich es gebraucht hätte, oder diese hätte ich zumindest nicht gefunden. Daher musste ich die Datei immer auslesen und gleichzeitig wieder beschreiben.
Die einzige Lösung welche mir einfiel war, die Datei nach jedem Beschrieb zu kopieren um so die Daten aus der Kopierten Datei lesen und die Originaldatei beschreiben zu können. Schlussendlich wäre die kopierte Datei gelöscht worden und alles hätte funktioniert.
Jedoch verlangsamt diesen vermehrten Dateizugriff das Programm stark und der Mitarbeiter, welcher mir den Auftrag gab war damit natürlich nicht einverstanden. Das war mir eigentlich bereits klar, jedoch viel mir keine bessere Lösung ein.

Mithilfe der Tipps des Mitarbeiters erstellte ich dann meine 2. Lösung.

Sie nutzt Listen um die Daten auszulesen und zu speichern. Zuerst wird für jede Datei eine Liste erstellt und mit den Daten abgefüllt. Anschliessend werden diese Dateien noch in einer Liste abgespeichert. So kann ich dann auf die einzelnen Einträge der Listen zugreifen und das .csv-File so beschreiben.

Code des Auftrags:

Damit man auch etwas lernt, hier noch die verwendeten Funktionen:
Der Zugriff auf die Startparameter erfolgt so:
string[] args; //damit wird args als String mit mehrere Einträgen definiert
args = Enviroment.GetCommandLineArgs(); // damit werden die Startparameter übergeben.
Die einzelnen Parameter kann ich nun mit args[1] auslesen. Die Zahl dient zur Auswahl, welchen Parameter man verwenden möchte.

Die Foreach-Schleife:
Damit ich auf jedes File im Ordner zugreifen konnte, unabhängig davon wie viele Dateien sich im Ordner befinden verwendete ich eine Foreach-Schleife. So wird sie verwendet:
DirectoryInfo variabel1 = new DirectoryInfo(Pfad); // damit weise ich der variabel1 ein Verzeichnis zu.
Mit der nächsten Zeile werden alle Befehle welche in der Foreach-Schleife vorhanden sind auf alle .csv Dateien aus dem Verzeichnis ausgeführt.
foreach (FileInfo "variabel2" in "variabel1.GetFiles("*.csv")) { Befehle; }
Das "*.csv" definiert, dass alle Dateien die am ende .csv haben in die Schlaufe genommen werden sollen. Das * steht für eine beliebige Anzahl Zeichen.


Die Split-Funktion:
Damit ich Strings in mehrere kleinere Teile unterteilen kann gibt es die Split-Funktion. Sie funktioniert Folgendermassen:

Man muss eine Variabel, hier variabel1, aufteilen. Wo genau diese aufgeteilt wird, kann man mit dem Parameter, hier ':', übergeben. Dann muss man das ganze einer anderen Variabel zuweisen, hier variabel2:
variabel2 = variabel1.Split(':');
Die Variabel1 wird hier bei allen : aufgeteilt. Wäre in variabel1 also folgender Satz gespeichert gewesen: "Hier ist die Lösung:2" wäre in Variabel2 nun folgendes gespeichert:
variabel2[0] = Hier ist die Lösung
variabel2[1] = 2
Zu beachten ist hier noch, dass die variabel2 folgendermassen deklariert werden muss:
string[] variabel2; // So kann ich wie beim Args mehrere Einträge definieren.

Dienstag, 31. August 2010

August 2010 / VB.Net & VBScript

VB.Net

Am 16.08.2010 begann für mich die Schule des 2. Lehrjahres. Nun habe ich einige Neue Fächer, unter anderem das Modul 303, objektbasiertes Programmieren mit Komponenten. In diesem Modul befassen wir uns hauptsächlich mit VB.NET, einer Sprache welche ebenfalls, wie C#, auf dem .NET-Framework basiert. Diese Sprache ist also ähnlich wie C#, über welche ich bereits letzten Monat geschrieben habe.
Was mir jedoch sofort auffiel war, dass die Syntax unter VB.NET anders ist als unter C#.

Schreibt man unter VB.NET eine Variabel gross anstatt klein, wird das automatisch vom Visual Studio kleingeschrieben. Unter C# wird das als Fehler angezeigt und nicht korrigiert. Einerseits kann das Automatische Korrigieren nützlich sein, andererseits muss man sich dabei nicht mehr so gut konzentrieren, was Fehler hervorrufen kann.

Ein weiterer Unterschied ist die Variablen-Deklaration. Unter VB.NET kann man diese Ganz einfach Deklarieren und diesen Variablen kann man dann zuweisen, was man gerade will.
Unter C# hingegen Deklariert man die Variablen immer sofort als Int, String, Double usw.

Das sieht dann so aus:
double Variabelname;
string Variabelname;

und unter VB.NET so:
Dim Variabelname As double
Dim Variabelname As string

Ausserdem finde ich den Code von C# übersichtlicher da man dank der geschwungenen Klammern immer sofort sieht, was zusammen gehört. Und die ; zeigen immer klar an wo ein Befehl fertig ist. In VB.NET ist das nicht vorhanden, dafür müsste man theoretisch einen Befehl ohne Zeilenumbruch schreiben. Unter C# werde Zeilenumbrüche nicht beachtet, unter VB.NET hingegen schon. Hat man also einen langen Befehl, kann man diesen in VB.NET nur durch _ auf mehrere Zeilen verschieben. Das sieht dann ungefähr so aus:
Test = Textteil(1) & _
Textteil(2)
In C# könnte man das so schreiben:
Test = Textteil(1) &
Textteil(2);
Es ist offensichtlich dass sich die beiden Codes ähneln.
Daher ist es auch nicht sehr einfach die beiden Sprachen auseinander zu halten.
Nachdem ich mich in VB.NET eingearbeitet hatte, wollte ich wieder etwas in C# entwickeln. Das Problem dabei war, dass ich ein Mix aus VB.NET und C# machte und daher die Syntax nichtmehr stimmte.

VBScript

Unabhängig vom VB.NET-Modul in der Schule, begann ich in der Firma mit VBScript zu programmieren.

Im Gegensatz zu "richtigen" Programmiersprachen ist es sehr einfach aufgebaut und wird von oben nach unten durchgearbeitet. Meine Scripts mussten bestimmte Informationen aus Text-Dateien lesen oder ganze Text-Dateien schreiben.
VBScript hat eine gewisse Ähnlichkeit mit VB.NET. Die Variablen werden beispielsweise gleich deklariert und auch die Syntax ist die Selbe. Daher war es kein Problem mich schnell zu Recht zu finden.

Die Schwierigkeit dabei war jedoch, dass ich für Windows CE entwickeln musste, einem Betriebssystem welches auf unseren Panels läuft. Das hatte zur Folge, dass ich mit einer Abgespeckten VBScript-Version arbeiten musste und daher fast keine Hilfe im Internet fand.

Ein wichtiger Unterschied zum normalen VBScript war, dass man nicht die gleichen Objekte und Methoden brauchte, um dasselbe zu machen. Möchte ich z.B. eine Textdatei Zeilenweise auslesen muss ich das Objekt(f) im normalen VBScript so erstellen:
Set f = CreateObject("Scripting..FileSystemObject")
Anschliessend kann ich mit einer anderen Variabel(Text) ein File öffnen und es mit ReadLine Zeilenweise lesen.
Set Text = f.OpenTextFile(Pfad, fwModeOpen)
Zeile = Text.ReadLine
In der Version für Windwos CE muss man das so machen:
Set f = CreateObject("FileCtl.File")
f.open Pfad, fwModeOpen
Text = f.LineInputString
Wie man sieht sind es nicht die gleichen Objekte und Methoden die verwendet werden müssen.
Schlussendlich musste ich das genau gleiche mit dem normalen VBScript programmieren. Da diese Codes jedoch so unterschiedlich sind, konnte ich dafür nur einzelne Bruchstücke des WindowsCE-Codes verwenden.

Freitag, 30. Juli 2010

Juli 2010 / C#

C#

In der Firma begann ich die Programmiersprache C# zu lernen. Sie basiert auf dem .NET-Framework, welches eine von Microsoft entwickelte Softwareplattform zum entwickeln und ausführen von Programmen ist. Mit dem .NET-Framework kann man jedoch nicht nur mit C# programmieren sondern auch mit anderen Sprachen wie C++, Visual Basic.Net oder J#.






Als Entwicklungsumgebung benutzte ich das Microsoft Visual Studio 2005. Es vereinfacht das Programmieren sehr stark, da man die Grafische Benutzeroberfläche gleich mit vordefinierten Objekten zusammenbauen kann.
Das Bild rechts zeigt einige dieser Objekten.
Visual Studio erstellt beim auswählen und platzieren der Objekte einen Code, welchen man theoretisch auch selbst schreiben könnte, doch das wäre mühsame Arbeit.

Der Einstieg in C# war alles andere als einfach für mich, denn ich musste zuerst lernen "Objektbasiert" zu denken. Damit meine ich, dass man nur über ein Objekt etwas ausführen kann. Sobald ich das begriffen hatte, musste ich mich mit der Syntax vertraut machen. Die Syntax könnte man auch als Schreib-Stil bezeichnen. Was man zuerst wissen muss ist, dass nach jeder Aktion ein ; kommen muss. Initialisiert man z.B. eine Variabel muss das folgendermassen erfolgen:
String Name;
Wird das ; weggelassen funktioniert das Programm nicht.
Als nächstes sollte man wissen, das Methoden mit () am Ende aufgerufen werden. Eigentlich dienen diese Klammern um Parameter mitzugeben, doch auch wenn man keine Parameter mitgeben muss, braucht es die (). Ruft man z.B. eine Selbst erstellte Methode namens "Plus" auf, erfolgt dies folgendermassen:
Plus()

Anschliessend ist noch wichtig zu wissen, dass eine Methode immer mit { anfängt und mit } abgeschlossen wird.
Hält man sich nicht an diese Regeln ergibt der Compiler eine oder mehrere Fehlermeldungen, und das Programm wird wahrscheinlich abstürzen oder nicht korrekt funktionieren, wenn sie es ausführen.










Häufig verwendet:










Das If-Statement:







Auch beim If-Statement müssen bestimmte Regeln eingehalten werden. Es wird folgendermassen aufgebaut.
If ((Bedingung 1) & (Bedingung 2))
{
Anweisung 1;
Anweisung 2;
}
Else
{
Anweisung 3;
Anweisung 4;
}
Die Bedingung kann etwas beinhalten wie "Test = 0" wobei Test eine Integer-Variabel darstellt.
Anweisungen und Bedingungen kann man so viele machen wie man möchte, wichtig ist jedoch auch hier, dass sie korrekt abgeschlossen werden. Im Anweisungs-Bereich können auch neue If-Statemants gesetzt werden. Ebenfalls kann man noch das Else If einfügen. Damit kann man genau gleich wie bei der If-Bedingung etwas überprüfen, diese Bedingung wird jedoch nur überprüft wenn die erste nicht zutrifft.
Hier nun ein If-Statement mit einem zusätzlichen If-Statement und einem Else If :
If (Bedingung)
{
If (Bedingung 1)
{Anweisung 1;}
Else {Anweisung 2;}
}
Else If (Bedingung 2)
{Anweisung 3;}
Else {Anweisung 4;}


Die Try-Catch-Anweisung








Diese Anweisung versucht die im Try-Abschnitt folgenden Anweisungen auszuführen. Kann dies das Programm nicht springt es in den Catch-Abschnitt und führt die dort aufgelisteten Anweisungen aus. Diese Anweisung kann man also Brauchen um einen möglichen Programmabsturz zu verhindern, oder um zu überprüfen ob eine Bedingung erfüllt ist. Doch hier muss man etwas aufpassen, warum erkläre ich gleich.
Die Anweisung ist so aufgebaut:
Try
{
Anweisung 1;
Anweisung 2:
}
Catch
{
Anweisung 3;
Anweisung 4;
}
Ein gutes Beispiel für die Verwendung ist, wenn man mit den Eingaben eines Benutzers in ein Textfeld etwas ausrechnen möchte. Das Programm würde abstürzen, wenn man versuchen würde mit Buchstaben zu rechnen. Man könnte nun also nun mit Try versuchen mit den eingegebenen Zahlen zu rechnen. Funktioniert das sind es Zahlen, funktioniert es nicht kann man den Benutzer per Messagebox darauf hinweisen, eine Korrekte Zahl einzugeben.
Öfters gibt man mehrere Anweisungen in eine Try-Anweisung. Macht man nur bei einer Anweisung einen Fehler, wird der ganze Abschnitt übersprungen. Daher eignet es sich nicht sehr um etwas zu überprüfen, da die Chancen erhöht sind einen Fehler zu machen.