Montag, 5. Dezember 2016

November 2016 - Zwei-Faktor-Authentifizierung (SMS-Authentifizierung)



2FA - Allgemein

Die Zwei-Faktor-Authentifizierung, kurz 2FA, wird verwendet, um einen Nutzer mittels Kombination zweier unabhängiger und in ihrer Art unterschiedlicher Komponenten zu identifizieren. Die beiden Komponenten bestehen meist aus etwas, das der Benutzer weiss, etwas, das er besitzt oder etwas, das zu ihm gehört.
Bereits die Kombination aus Bankkarte und PIN ist als 2FA anzusehen, da der Kunde den PIN weiss und die Bankkarte besitzt. Bei einem Login auf einer Website o.ä. ist nicht von 2FA zu sprechen, weil Benutzername und Passwort beides Dinge sind, die der Benutzer wissen muss, beides sind Komponenten die einer Art angehören.
Die Zwei-Faktor-Authentifizierung ist nur dann erfolgreich, wenn beide Faktoren eingesetzt werden und korrekt sind. Fehlt eine Komponente oder ist eine falsch, lässt sich der Benutzer nicht "zweifelsfrei identifizieren" und bekommt folglich auch keinen Zugriff zum System.

Beispiele für Faktoren:

- etwas, das der Benutzer besitzt: Hardware-Token, Bankkarte, Schlüssel, Smartphone, etc.

- etwas, das der Benutzer weiss: Benutzername, Kennwort, Einmalkennwort, PIN, etc.

- etwas, das zum Benutzer untrennbar gehört: Fingerabdruck, Iris, Stimme etc.


Am häufigsten werden die beiden Faktoren durch etwas, das der Benutzer besitzt (Token) und etwas, das er weiss (Kennwort) zusammengesetzt. Bei diesen Komponenten ist es aber zwingend notwendig, dass der Benutzer den jeweiligen Token immer mitführt. Wird er verloren, gestohlen oder der Benutzer hat ihn nicht dabei, ist eine Authentifizierung nicht möglich. Hinzu kommen Erstanschaffungs- sowie Ersatzbeschaffungskosten. Das sind die Nachteile dieser Methode.

SMS-Authentifizierung

Eine Gegenmassnahme, um diesen Nachteilen ein Stück weit aus dem Weg zu gehen, ist die tokenlose Zwei-Faktor-Authentifizierung, die als Alternative geschaffen wurde. Die Rede ist hier von der SMS-Authentifizierung. Hier wird, wie aus dem Namen hervorgeht, zur Authentifizierung vom Server eine SMS an den Benutzer verschickt. Das bedeutet, das Smartphone oder Mobiltelefon des Benutzers dient als Hardware-Token, also etwas, das der Benutzer besitzt.
Wenn der Benutzer sich also an einem Server anmelden will, gibt er zunächst seine Zugangsdaten, die nur er kennt, meist bestehend aus Benutzername und Passwort, ein (erster Faktor). Der Server generiert dann einen Code und schickt diesen per SMS (zweiter Faktor) an den Benutzer. Durch korrekte Eingabe dieses Codes kann sich der Benutzer am Server zweifelsfrei identifizieren lassen.
Der Vorteil dieser Methode ist, dass kein zusätzlicher Hardware-Token mitgeführt werden muss, da die meisten Leute das Smartphone sowieso immer dabei haben. Zwar kann auch ein Smartphone gestohlen oder verloren gehen, jedoch ist die Wahrscheinlichkeit hier etwas geringer. Zudem kann das Smartphone bei vielen Diensten auch gebraucht werden, um sich z.B. über einen Browser anzumelden, folglich muss kein zusätzlicher PC verwendet werden. Weiterhin ist die Sicherheit auch dadurch erhöht, dass Smartphones meist mit PINs gesperrt sind und dass professionelle Systeme dafür sorgen, dass bereits verwendete Codes nicht beim Empfänger verbleiben, sondern gelöscht werden.

Praxis

Es existieren einige Unternehmen, die einem den allgemeinen SMS-Versand abnehmen möchten. Daneben werben sie natürlich auch für die Möglichkeit, den Kunden eine 2FA via SMS zu bieten.
In der Schweiz agierende Unternehmen sind zum Beispiel folgende:

- aspsms.ch
- websms.ch

Von letzerem Anbieter stammt auch die folgende Grafik, welche etwas besser veranschaulicht, wie die SMS-Authentifizierung praktisch abläuft.


(Klicken zum vergrössern)


Für das E-Banking setzen die Banken schon lange auf die 2FA per SMS Methode.
Vor allem bei sensiblen Daten werden solche 2FA-Methoden eingesetzt, daher kommt es immer häufiger vor, dass Unternehmen die 2FA einsetzten.


Umsetzung

Die meisten Anwendungen, die die 2FA benutzen, sind Web-Anwendungen. Für Web-Anwendungen wird immer öfter das ASP.NET Framework, welches von Microsoft entwickelt wurde, verwendet. Daher findet man im Internet am häufigsten Beispiele in ASP.NET-Anwendungen mit dem MVC-Modell (Model, View, Control).  
ASP.NET-Anwendungen können, da es von Microsoft entwickelt wurde, mit C# programmiert werden. 
Eine andere Möglichkeit neben Web-Anwendungen sind Desktop-Applikation z.B. mit dem .NET Framework entwickelt. Diese müssen aber zusätzlich auch eine spezielle API zum Versenden von SMS einbinden.
Bei beiden Möglichkeiten wird ein SMS-Gateway (wie oben in der Grafik ersichtlich) benötigt.
Dieses wird dann meist bei einem Anbieter (siehe Obengenannte) bezogen, der teilweise auch noch die benötigten APIs zur Verfügung stellt.


Freitag, 28. Oktober 2016

Oktober 2016 - Xamarin

In der  Schule mussten wir in Teams verschiedene Themen bearbeiten, um dann später darüber eine Präsentation halten zu können. Unser Team bekam das Thema "Xamarin" zugeteilt, was vergleichsweise ein recht schwieriges Thema ist.


Was ist Xamarin?

Xamarin ist allen voran eine Software Firma aus San Francisco. Gegründet wurde die Firma im Jahre 2011 von den Mono*-Entwicklern. Anfangs 2016 wurde die Firma allerdings von Microsoft übernommen.

Spricht man von Xamarin, meint man meistens die gleichnamige Software. Es gibt mehrere Produkte, die den Namen Xamarin beinhalten, später mehr dazu.
Grundsätzlich dient Xamarin dazu, mit der Programmiersprache C# oder anderen .NET-Sprachen iOS-, Android- und Windows-Apps zu entwickeln.
Der grosse Vorteil von Xamarin ist, dass für alle drei Plattformen nahezu derselbe Quellcode verwendet werden kann.

* Mono ist eine opensource Implementierung von Microsofts .NET Framework, mit der die Entwicklung von plattformunabhängiger Software ermöglicht wird.

Produkte

Xamarin ist in folgenden Produkten verfügbar:

Xamarin Platform

Bis zu der Version 3 war die Kernkomponente "Xamarin Platform" auch als "klassisches Xamarin" bezeichnet. In diesem Produkt sind unter anderem die beiden Komponenten "Xamarin.iOS" und "Xamarin.Android" enthalten. Mit diesen wird es möglich, native Apps für iOS und Android in C# zu entwickeln, für Windows selbstverständlich auch.
Mit "Xamarin Platform" ist es nur möglich, überall denselben Quellcode zu benutzen. Das heisst, die grafische Benutzeroberfläche muss nach wie vor für jede Plattform unabhängig designt werden, weil nicht jedes Betriebssystem gleich aussieht und es daher auch unterschiedliche Controls sowie Navigationsparadigmen gibt.
Hauptvorteil von "Xamarin Platform" ist also nur der Code in einheitlicher Programmiersprache.


Xamarin (klassisch)
Gemeinsamer Quellcode (C#)
Getrenntes GUI



Xamarin.Forms

Seit der dritten Xamarin Version ist "Xamarin.Forms" integriert. Mit dieser Komponente wurde nun auch eine Lösung für plattformunabhängige Benutzeroberflächen eingeführt.
Das UI wird zunächst plattformunabhängig in C# definiert und anschliessend je nach Plattform in die entsprechenden Controls übersetzt. 
Durch die Abstraktion steht natürlich nur der grösste gemeinsame Nenner aller Plattformen zur Verfügung. Steuerelemente, die plattformspezifisch sind, können daher nicht verwendet werden.
Neben den Standardcontrols wie Buttons, Textfelder etc. gibt es auch noch komplexere Elemente wie etwa DatePickers, ListViews usw. Die Deklaration der Oberfläche geschieht entweder im Code selber oder erfolgt in XAML (eine von Microsoft entwickelte allgemeine Beschreibungssprache für die Oberflächengestaltung von Anwendungen).
Die Namensgebung ist in Xamarin etwas verwirrend. Man spricht von vier verschiedenen Kategorien:

Pages: Die oberste Hierarchie in der Gestaltung. Die eigentlichen App-Seiten, hier befinden sich alle anderen Elemente.
Views: Standardcontrols - Buttons, Textfelder etc.
Layouts: Containerelemente - GridLayout, StackLayout usw. 
Cells: Spezielle Elemente zum Beschreiben, wie Elemente (z.B. in einer Tabelle) gezeichnet werden.



Xamarin.Forms:
Gemeinsamer Quellcode (C#)
Gemeinsames GUI (C#)


In der folgenden Grafik ist zu sehen, wie unterschiedlich die einzelnen Benutzeroberflächen auf den verschiedenen Plattformen schlussendlich aussehen:



von links: iOS, Android & Windows Phone




Xamarin für Visual Studio

Um Applikationen mit Xamarin entwickeln zu können, gibt es eine Erweiterung für Visual Studio.
Man kann so zwar in der gewohnten IDE entwickeln, jedoch gibt es bei Xamarin.Forms noch keinen richtigen Designer, das heisst man muss das GUI mit XAML beschreiben.
Für das klassische Xamarin gibt es bereits eine Art Designer, der aber nicht so umfangreich ist, wie der von Visual Studio gewohnte Designer.

Xamarin Studio

Xamarin Studio ist eine eigenständige IDE für die mobile-App-Entwicklung. Es enthält einen Debugger, einen C#-Compiler, und Werkzeuge für die Programmierung grafischer Benutzeroberflächen für iOS und Android.
Xamarin Studio war früher für beide, nun nur noch für Mac-Geräte verfügbar, da Windows-Benutzer die Visual Studio Version benutzen sollen.

Xamarin Test Cloud

Ein Problem, das bei der Entwicklung von mobilen Apps fast zwangsläufig vorkommt, ist das Testen auf den verschiedenen Endgeräten. Insbesondere bei plattformunabhängigen Apps ergibt sich in Kombination mit den verschiedenen Geräten und den verschiedenen Plattformen (inklusive der verschiedenen Versionen) eine ziemlich grosse Anzahl an Testfällen. Mit den integrierten Emulatoren in Xamarin werden zwar schon einige Geräte abgedeckt, aber es ist hier immer noch von einer sehr kleinen Menge die Rede. Und hier kommt die "Xamarin Test Cloud" ins Spiel.
Die Test Cloud ermöglicht, automatisierte UI-Tests zu schreiben, die sich dann auf physikalischen, von der Cloud zur Verfügung gestellten Testgeräten ausführen lassen. Die "Xamarin Test Cloud" bietet über 1'800 solcher Testgeräte an.



Fazit

Da wir in der Schule nur wenige Lektionen in unserem Team Zeit hatten, konnten wir leider nicht so viele praktische Erfahrung mit der Software sammeln. Dazu kommt, dass es vergleichsweise ein recht grosser Aufwand ist, bis Xamarin vollständig installiert ist und problemlos läuft.
Grundsätzlich finde ich die Idee von Xamarin sehr gut, da so praktisch jeder Windows-Entwickler für alle wichtigen Plattformen mit relativ wenig Aufwand entwickeln kann.





Dienstag, 27. September 2016

September 2016 - Projektmethode Scrum

Im 7. Semester bearbeiten wir in der Schule das Modul "223 - Applikationen objektorientiert realisieren". Wir lernen dort nicht nur, wie man eine Anwendung auf Basis von C# schreibt, sondern auch, wie man mit dem Vorgehensmodell Scrum arbeitet.


Scrum ist eine Projektmethode oder auch Vorgehensmodell genannt zur agilen Softwareentwicklung. Agile Softwareentwicklung bedeutet, dass die Software flexibel ist, dass die Funktionstüchtigkeit sowie die Zusammenarbeit mit dem Kunden im Vordergrund stehen, Dokumentationen und Befolgung des ursprünglichen Plans aber zugunsten funktionierender Software eher in den Hintergrund rücken. Aus diesem Grund besteht Scrum nur aus wenigen Regeln. Diese definieren die Begriffe Aktivitäten, Artefakte und Rollen, später mehr dazu.

Der Ansatz von Scrum beruht darauf, dass viele Entwicklungsprojekte viel zu komplex sind, um schon im Voraus in einem vollumfänglichen Plan definiert zu werden. Ein wesentlicher Teil der Anforderungen und der Lösungsansätze ist zu Beginn meist unklar. Solche Unklarheiten lassen sich beseitigen, indem Zwischenergebnisse erzeugt werden. Anhand dieser lassen sich die fehlenden Anforderungen einfacher und effizienter finden und umsetzen.
Ein langfristiger Plan existiert dennoch und nennt sich Product Backlog. Dieser wird permanent verfeinert und verbessert. Der Detailplan wird Sprint Backlog genannt. Für jeden Zyklus (Sprint) wird ein neuer erstellt, damit die Projektplanung auf das Wesentliche konzentriert wird.
Scrum ist eine empirische Methode, das heisst es sind folgende drei Grundsätze zu beachten: Transparenz, Überprüfung und Anpassung. Transparenz bedeutet, dass alle Fortschritte und Hindernisse regelmässig für alle sichtbar gemacht werden. Die Überprüfung definiert, dass in regelmässigen Abständen Produktfunktionalitäten geliefert und das Produkt wie auch das Vorgehen beurteilt werden. Die Anpassung hält offen, dass Anforderungen an das Produkt, Pläne und Vorgehen nicht ein für alle Mal festgelegt, sondern kontinuierlich detailliert und angepasst werden können. Durch ein solches Vorgehen wird die Komplexität der Aufgabe natürlich nicht reduziert, aber sie wird in kleinere und weniger komplexe Bestandteile zerlegt, in die Inkremente.
Das Hauptziel von Scrum besteht darin, eine schnelle und kostengünstige Entwicklung von hochwertigen Produkten zu ermöglichen. Dabei werden keine Lasten- oder Pflichtenhefter geführt. Anforderungen werden stattdessen in Form von Eigenschaften aus Anwendersicht formuliert. Die Liste der Anforderungen ergibt das Product Backlog. Diese Anforderungen werden Stück für Stück in zwei bis vier Wochen langen Intervallen (Sprints) umgesetzt.
Scrum ist für Teams einer geringen Grösse bis etwa maximal zehn Personen geeignet. Grössere Entwicklungsprojekte benötigen ein weitergehendes Vorgehen, das die Koordination mehrerer Teams organisieren kann.


Rollen

In Scrum sind drei verschiedene Rollen definiert: Der Product Owner, das Entwicklungsteam und der Scrum Master. Alle Beteiligten dieser Rollen ergeben zusammen das Scrum Team. Neben diesen Rollen, die für die Software zuständig sind, gibt es noch die Stakeholder. Diese sind Beteiligte wie z.B. der Auftraggeber und können den Fortschritt und die Zwischenergebnisse einsehen, da diese transparent sind. Stakeholder dürfen bei den meisten Aktivitäten zuhören.

Der Product Owner ist verantwortlich für die Eigenschaften und den wirtschaftlichen Erfolg des Produkts. Er legt fest, welche Eigenschaften das Produkt am Ende eines Sprints haben muss. Er allein entscheidet über das Produkt, seine Eigenschaften und die Reihenfolge der Implementierung und muss somit die Balance zwischen Eigenschaften, Kosten und Auslieferungszeitpunkt im Blick behalten.
Der Product Owner hält regelmässig Rücksprache mit den Stakeholdern, um auf deren Wünsche eingehen zu können.

Das Entwicklungsteam ist für die Lieferung der Produktfunktionalitäten (Eigenschaften) in der vom Product Owner gewünschten Reihenfolge zuständig. Es muss die vereinbarten Qualitätsstandards einhalten, ist aber frei in der Umsetzung der gewünschten Funktionalitäten. Das Entwicklungsteam sollte in der Lage sein, die Ziele der jeweiligen Sprints möglichst ohne äussere Abhängigkeiten zu erreichen. Deshalb ist es von grossem Vorteil, wenn das Team interdisziplinär besetzt ist. Das Entwicklungsteam besteht aus drei bis neun Mitglieder. Es muss gross genug sein, um alle benötigten Kompetenzen zu vereinigen. Je grösser das Team, desto grösser der Koordinierungsaufwand.

Der Scrum Master ist dafür verantwortlich, dass das Vorgehensmodell Scrum gelingt. Er führt die Regeln von Scrum ein und überprüft deren Einhaltung.  Er gehört zwar meist nicht dem Entwicklungsteam an, arbeitet aber mit diesem zusammen. Er leitet die Treffen und muss sich um die Behebung von Störungen und Hindernissen kümmern. Hindernisse können von mangelnder Infrastruktur über schlechte Kommunikation und Zusammenarbeit bis hin zu persönlichen Konflikten im Entwicklungsteam reichen. Der Scrum Master ist eine dienende Führungskraft, der keine Arbeitsanweisungen an einzelne Teammitglieder vergibt, sondern für den Prozess und die Beseitigung von Hindernissen verantwortlich ist.

Folgende Personen sind als Stakeholder definiert:

- Kunde/Auftraggeber
- Anwender
- Management


Artefakte

In Scrum existieren drei verschiedene Artefakte:

Product Backlog:
Das Product Backlog ist eine Auflistung der Anforderungen an das Produkt. Es ist dynamisch und wird permanent weiterentwickelt. Verantwortlich für das Product Backlog ist der Product Owner. Er muss das Product Backlog pflegen und sich die Priorisierung der Eigenschaften vornehmen.
Das Product Backlog ist nicht vollständig, da zu Beginn eines Projekts meist nicht alle Anforderungen bekannt sind. Die Priorisierung erfolgt unter Gesichtspunkten wie wirtschaftlicher Nutzen, Risiko und Notwendigkeit.
Anforderungen im Product Backlog werden fachlich und anwenderorientiert definiert. Die Formulierung der Produkteigenschaften wird meist in User Stories umgesetzt und diese werden dann Product Backlog Item (PBI) genannt.

Sprint Backlog:
Im Sprint Backlog sind die zu erledigenden Aufgaben eines Sprints aufgeführt. Es umfasst einige der PBI's aus dem Product Backlog und unterteilt diese in Tasks.
Um es für alle Teammitglieder sichtbar zu machen, wird meist ein Taskboard genutzt.

Product Increment
Das Produktinkrement ist das Ergebnis aller PBI's, die während des aktuellen und allen vorangegangenen Sprints fertiggestellt wurden. Am Ende jedes Sprints muss sich das neue Produktinkrement in einem nutzbaren Zustand befinden.


Sprint

Der Sprint ist ein Arbeitsabschnitt, bei dem ein Inkrement einer Produktanforderung implementiert wird. Die Dauer eines Sprints umfasst ein bis vier Wochen. Alle Sprints haben idealerweise die gleiche Länge, um so dem Projekt einen Takt zu geben. Der Sprint ist zu Ende, wenn die Zeit um ist und wird nie verlängert. Des Weiteren sind keine Änderungen während eines Sprints erlaubt, die das Sprintziel beeinflussen. Der Sprint kann jedoch jederzeit durch den Product-Owner abgebrochen werden.

Aktivitäten 

Ein Sprint setzt sich aus folgenden Aktivitäten zusammen: 

Sprint Planning:
Am Anfang des Sprints wird definiert, was entwickelt wird und wie die Arbeit erledigt wird. Die Sprint Planung dauert maximal zwei Stunden pro Sprint-Woche.

Daily Scrum:
Zu Beginn jedes Arbeitstages trifft sich bei einem maximal 15-minütigen Daily Scrum das Entwicklerteam. Zweck des Daily Scrums ist der Informationsaustausch, um einen Überblick des aktuellen Stands der Arbeiten zu bekommen und dient nicht zur Lösung von Problemen.
Der Scrum Master und der Product Owner nehmen häufig an der Sitzung teil, sind jedoch nicht aktiv beteiligt.

Sprint-Review:
Am Ende eines Sprints steht das Sprint-Review. Hier wird vom Scrum Team das Inkrement überprüft und das Product Backlog bei Bedarf angepasst. Das Ergebnis wird vom Entwicklungsteam präsentiert und es wird geprüft, ob das Ziel erreicht wurde. Das Scrum Team bespricht mit den Stakeholdern die Ergebnisse und was es als Nächstes zu tun gibt.

Sprint-Retroperspektive:
Auch ein Teil der nach Beendigung eines Sprints ausgeführt wird. Hierbei überprüft das Scrum Team seine bisherige Arbeitsweise, um sie in Zukunft effizienter machen zu können. Der Scrum Master unterstützt das Team dabei, gute Praktiken und Verbesserungen zu finden, die im nächsten Sprint umgesetzt werden sollen.

Product Backlog Refinement (Backlog Grooming):
Das Product Backlog Refinement ist ein fortlaufender Prozess, bei dem der Product Owner zusammen mit dem Entwicklungsteam das Product Backlog weiterentwickelt.
Oft gibt es auch solche Treffen mit ausgewählten Stakeholdern, um die Anforderungen im Product Backlog besser beschreiben zu können.

Donnerstag, 8. September 2016

August 2016 - Raspberry Pi

Allgemeines

Raspberry Pi -Logo
Raspberry Pi ist der Name einer Serie von Einplatinencomputern im Kreditkartenformat. Ein Einplatinencomputer (manchmal auch Entwicklerboard genannt) ist im Grundsatz ein meist sehr kleines Mainboard mit allen benötigten Hardwareteilen direkt daraufgelötet, um einen vollwertigen PC darzustellen.
Entwickelt wurde der Computer von der britischen "Raspberry Pi Foundation". Der im Vergleich zu normalen Personal Computern sehr einfach aufgebaute Rechner wurde mit dem Ziel entwickelt, jungen Menschen Programmier- und Hardwarekenntnisse auf eine einfachere Weise näher zu bringen. Daher wurde auch der Verkaufspreis niedrig gehalten, der je nach Modell um die 40 - 50 CHF beträgt.

Den Raspberry Pi gibt es mittlerweile in der 3. regulären Version, daneben gibt es noch andere Varianten, welche meist performantere oder aber nur abgespecktere Versionen sind.
Es existiert ein grosses Angebot an verschiedenem Zubehör sowie auch an verfügbarer Software. Das reicht von Kameramodulen über verschiedene Sensoren bis hin zu kapazitiven Multi-Touch-Touchscreens. Aufgrund dieses vielfältigen Angebots gibt es viele verschiedene Einsatzmöglichkeiten für den Einplatinencomputer. Häufig wird er als Mediacenter genutzt, da seit der ersten Version eine HDMI-Schnittstelle mit einer Videoausgabe von 1080p inbegriffen ist. Als Betriebssystem kommt meist eine Linux-Distribution teils mit und teils ohne grafische Oberfläche - je nach Verwendung - zum Einsatz.
Als internes Boot-Medium wird eine wechselbare (Micro)SD-Karte verwendet. Direkte Schnittstellen für Festplattenlaufwerke sind zwar keine vorhanden es zwar keine, jedoch gibt es auch seit der ersten Version mindestens einen USB-Anschluss, worüber problemlos Speichermedien angeschlossen werden können.




Hardware

Raspberry Pi 3

Den Raspberry Pi gibt es in verschiedenen Versionen, die hier aufgeführt sind:

-Compute Module
-Zero
-Modell A
-Modell A+
-Modell B
-Modell B+
- Raspberry Pi 2 Modell B
- Raspberry Pi 3 Modell B



Die Hardware des Raspberry Pi's wurde im Laufe der Zeit immer weiter verbessert. Angefangen mit dem Prozessor: In den frühen Versionen des Computers war der Prozessor mit 700 MHz getaktet und hatte nur einen einzigen Kern. In der zweiten Version arbeitete er mit 900 MHz und vier Kernen. Aktuell, mit dem Raspberry Pi 3, ist ein 4-Kern 1,2 GHz Prozessor verbaut. Allen Versionen gleich ist die Architektur des Prozessors, hier wurde ARM verwendet.
Ähnlich wie der Prozessor wurde der Arbeitsspeicher immer besser. Anfänglich hatte der Computer 256 MB DDR2-SDRAM verbaut. Bei der neusten Version ist es bereits 1 GB desselben Speichers.
Wie schon erwähnt, wird als nichtflüchtiger Speicher eine SD-Karte verwendet. Bei früheren Versionen wurde ein normaler SD-Kartenleser verbaut, heute sind aber oftmals (nur noch) MicroSD-Kartenleser verfügbar.
Um externe Hardware anzuschliessen, stellt der Raspberry Pi herkömmliche USB-2.0-Schnittstellen zur Verfügung. Seit der zweiten Version sind es zwei und ab der dritten Version vier nicht unabhängige USB-Schnittstellen.
In den früheren Versionen des Computers hatte er noch keine Netzwerkanschlüsse verbaut, erst seit dem "Modell B" der ersten Version ist ein LAN-Anschluss dazugekommen. Seit der dritten Version sind zudem eine 2,4GHz-WLAN und eine Bluetooth 4.1 Schnittstelle verbaut.
Bereits seit den Anfängen des Raspberrys ist eine GPIO-Schnittstelle verbaut. GPIO-Schnittstellen sind frei programmierbare Ein- und Ausgabeanschlüsse. Viele der Zubehörteile werden über diese Schnittstelle mit dem Computer verbunden.
Das Audiosignal wird grundsätzlich über den HDMI-Port ausgegeben. Die regulären Versionen besitzen aber auch einen 3,5mm-Klinkenanschluss.



Betriebssystem


Das Betriebssystem des Raspberry Pi befindet sich auf der (Micro)SD-Karte. Empfohlen wird das auf Debian-Linux basierende Raspbian. Diese Distribution wurde speziell für das Raspberry Pi entwickelt. Die Raspberry Pi Foundation erstellt immer auf Basis der neusten Version dieser Distribution ein eigenes Image mit passender Firmware für die Raspberry-Pi-Modelle.
Verschiedene weitere Linux Distributionen wie Ubuntu, Kali Linux, CentOS etc., die auf ARM-Prozessoren lauffähig sind, können auf den Rechner installiert werden. Auch befindet sich die Portierung von Android im Gange. Eine lauffähige Beta-Version ist bereits verfügbar. 

Windows ist grundsätzlich nicht für das Raspberry Pi verfügbar, da die einzige auf ARM-basierte Version (Windows 8 RT) mindestens 1 GB Arbeitsspeicher benötigt. Zwar hätte das neuste Raspberry nun genügend Arbeitsspeicher, da Microsoft aber schon vor dessen Entwicklung eine Windows 10 Variante für das Raspberry ankündigte, wäre eine Windows 8 RT Version nicht mehr sehr sinnvoll gewesen. Zu beachten gilt, dass die Windows Version für das Raspberry Pi, Windows 10 IoT (Internet of  Things) momentan noch nicht über einen klassischen Desktop verfügt und auch die gewohnten Desktop-Anwendungen nicht kompatibel sein werden.


Die Installation des Betriebssystems gestaltet sich je nachdem sehr einfach. Entscheidet man sich für z.B. Raspbian, kann man praktischerweise auf einen Bootloader namens NOOBS zurückgreifen. Mit NOOBS kann das gewünschte Betriebssystem (falls verfügbar) ausgewählt und mit nur einem Kick installiert werden. Alternativ kann natürlich auch manuell ein Betriebssystem installiert werden, was aber umständlicher ist.



Desktop - Aktuelle Version von Raspbian (Jessie)



Übertaktung

Da der Raspberry Pi im Vergleich zu herkömmlichen PCs nicht sehr viel Leistung aufbringt, ist es manchmal von Vorteil, ihn zu übertakten. Da die Raspberry Pi Foundation eine Verringerung der Lebensdauer bei Übertaktung fürchtete, wurde der Prozessor zunächst mit einem speziellen Bit ausgestattet, welches bei Übertaktung unwiderruflich gesetzt wird. Sobald der Prozessor übertaktet wurde, erlosch die Garantie.
Nachdem jedoch ausführliche Tests gezeigt hatten, dass sich ein Übertakten bis zu 1GHz kaum auf die Lebensdauer auswirkt, wurde mit einem Treiber-Update die Möglichkeit erschaffen, sowohl Prozessor sowie Speicher und GPU ohne Garantieverlust zu übertakten. Frequenz und Spannung wird nur dann erhöht, wenn die Leistung gebraucht wird und die Temperatur unter 85°Celsius liegt.
Das vorhin genannte Bit wird immer noch gesetzt, sobald stärker als empfohlen übertaktet wird.






Montag, 15. August 2016

Juli 2016 - Apache Guacamole

Apache Guacamole


Apache Guacamole ist eine HTML5 Webapplikation mit der es möglich ist, mit Standardprotokollen wie VNC, RDP und SSH über einen Browser auf beliebige vorkonfigurierte Desktops zuzugreifen.
Da die Applikation auf der Clientseite nur mit HTML5 und JavaScript auskommt, braucht der Benutzer dabei auch keine zusätzlichen Programme oder Plugins installiert zu haben, sondern nur einen aktuelleren Web-Browser, der bereits HTML5 unterstützt.

Früher als eigenständiges Projekt nur Guacamole genannt, ist es nun ein Projekt im Apache Incubator.
Der Apache Incubator ist ein Projekt der Apache Software Foundation (ASF). Jedes Apache Projekt startet in diesem sogenannten Incubator, um dann später einmal zu einem Top-Level-Projekt der Apache Software Foundation werden zu können.


Entwicklungsgeschichte


Am Anfang der Entwicklung, war Guacamole zunächst einmal ein JavaScript-Telnet-Client, der per Terminal bedient wurde und als "RealMint" bekannt war. Später wurde er dann zu einem HTML5-VNC-Client weiterentwickelt. Nun ist es ein Gateway, welcher viele gängige Remote-Desktop-Protokolle unterstützt. Ursprünglich nur ein Proof-of-Concept, ist Apache Guacamole heute performant genug für den täglichen Gebrauch und könnte die verschiedenen Desktopapplikationen für die Fernzugänge ersetzen.

Als Guacamole noch "RealMint" war, wurde der Tunnel für die Kommunikation in PHP geschrieben. Im Gegensatz zum heutigen in Guacamole implementierten HTTP-Tunnel, war der damalige RealMint-Tunnel ziemlich ineffizient. Wenige Teile der damaligen Applikation, wie etwa Codeteile der virtuellen Tastatur, sind bis heute noch im Guacamole Code vorhanden.

Als sich dann die Entwickler mit HMTL5 auseinandergesetzt haben, startete nicht viel später die Entwicklung eines Proof-of-Concept-JavaScript-VNC-Client.
Der Client wurde nur mit JavaScript und Javakomponenten auf der Serverseite umgesetzt. Die Ausgaben des VNC-Servers wurden in eine XML-basierte Version übersetzt. Der Umfang der Applikation war damals sehr begrenzt und es standen auch nur die minimalsten VNC-Funktionen zur Verfügung. Obwohl die Applikation damals noch sehr langsam war, aber dennoch funktionierte, wurde das Proof-Of-Concept zu einem richtigen Online-Projekt.
Zu dieser Zeit funktionierten WebSockets noch nicht zuverlässig genug, und Java hatte auch noch keinen WebSocket Standard für Servlets. Daher wurde ein HTTP-basierter Tunnel entwickelt. Dieser Tunnel kann heute noch verwendet werden, falls aus irgendeinem Grund keine WebSockets genutzt werden könnten.


Später wurde dann ein schnelleres textbasiertes Protokoll entwickelt, welches ermöglicht, mit anderen Protokollen - nicht nur VNC - zu kommunizieren. Dazu wurde die gesamte Architektur neu aufgebaut. Das Ziel des Projekts wurde von einem angemessenen VNC-Client zu einem performanten HTML5-Remote-Desktop-Gateway erweitert. Nun kann Apache Guacamole als zentraler Gateway für den Fernzugriff auf die verschiedensten Betriebssysteme mit unterschiedlichen Fernzugangsprotokollen verwendet werden.


Grundsätzliches & Funktionsweise


Guacamole muss auf einem Webserver installiert und konfiguriert werden, damit man per Fernzugangsprotokoll auf die gewünschten PCs zugreifen kann.

Die Architektur sieht folgendermassen aus:


Bildquelle



Guacamole ist keine eigenständige Web-Applikation, sondern besteht aus vielen Teilen.
Die Web-Anwendung ist jedoch eher simpel gehalten. Auf dem Webserver läuft natürlich unter anderem das Backend (Guacamole) der Web-Applikation.
Möchte der Benutzer einen entfernten PC fernsteuern, schickt er zuerst eine Anfrage an den Webserver.

Neben dem Backend der Web-Applikation, die auf dem Webserver läuft, gibt es noch das sogenannte "guacd", das ebenfalls auf derselben Maschine wie der Webserver laufen muss. Guacd ist eine Java-Applikation und kennt die verschiedenen Remote-Desktop-Protokolle. Es kann sich also mit den verschiedenen Remote-Desktop-Servern in Verbindung setzen und mit diesen problemlos kommunizieren.

Damit das Ganze später auch dem Benutzer angezeigt werden kann, wurde ein neues Protokoll entwickelt: Das Guacamole-Protokoll. Mit diesem wird es möglich, dass das Backend der Web-Applikation (Guacamole) mit der Java-Applikation (guacd) kommunizieren kann. Durch das Protokoll werden die Ausgaben der Remote-Desktop-Server HTTP kompatibel gemacht.

Der Server kann nun dem Client die Ausgabe des Remote-Desktop-Servers im HTTP-Format präsentieren.

Damit der Benutzer den fernbedienten PC auch steuern kann, werden die Benutzereingaben wie Maus und Tastatur auf gleichem Wege wieder zurück an den Remote-Desktop-Server gesendet.

Als Webserver wird ein Apache Tomcat empfohlen, das auf einer Linux-Distribution wie Ubuntu installiert wird.

Folgende Protokolle werden von Apache Guacamole unterstützt.

-VNC
-RDP
-SSH
-Telnet

Die Webapplikation kann von jedem Browser mit HTML5 erreicht werden - sofern der Server öffentlich im Internet verfügbar ist.
Hat man mit dem Browser seiner Wahl auf die Seite navigiert, muss man sich zuerst einloggen. Standardmässig sieht das folgendermassen aus:




Es gilt anzumerken, dass theoretisch die gesamte Web-Applikation an die eigenen Bedürfnisse angepasst werden kann, da es sich bei Apache Guacamole um ein Open-Source Projekt handelt.

Nachdem der Benutzer sich eingeloggt hat, präsentiert sich ihm folgende Seite:




Hier sieht der Benutzer die Verbindungen, die für ihn freigegeben sind, welche er zuletzt benutzt hat und kann sich oben rechts entweder ausloggen oder weitere Einstellungen vornehmen.


Die komplette Benutzerverwaltung wie Benutzernamen, Passwörter, verfügbare Verbindungen etc. können entweder in eine XML-Datei geschrieben oder mithilfe einer Datenbank realisiert werden.
Die Datenbank bietet neben der einfacheren Verwaltung auch die Möglichkeit, einen Administrator zu bestimmen, der via Webinterface die Verwaltung der Benutzer vornehmen kann.
Die Installation des Guacamole-Servers ist ein wenig aufwändig, da er selbst neu erstellt werden muss. Das heisst, es müssen zuerst einige Libraries auf dem (Linux-)Server installiert werden. Danach wird der Server neu erstellt. 
Der Client muss eigentlich nicht selbst neu erstellt werden, da er in Java geschrieben ist, welches plattformübergreifend ist.


Das gesamte System ist mit eigenen APIs erstellt worden. Da es ein Open-Source Projekt ist, können online die Dokumentationen zu diesen APIs eingesehen werden. Mit diesen APIs könnte Guacamole unter anderem in eigene Applikationen eingebaut werden, ob diese nun frei oder proprietär sind.




Donnerstag, 30. Juni 2016

Juni 2016 - Schulprojekt - Bilderdatenbank

Dieses Semester mussten wir in der Schule im Modul 151 - Datenbanken in Webauftritt einbinden - eine Bilderdatenbank entwickeln. Im vorangegangenen Semester (im Modul 133) mussten wir schon einmal ein ähnlich umfangreiches Projekt machen. Dabei handelte es sich um einen selbst entwickelten Blog. Mehr dazu habe ich in einem früheren Blogeintrag geschrieben.



Das Projekt

Der Auftrag bestand darin, eine Online-Bilderdatenbank zu entwickeln. Wir arbeiteten mit dem Programm XAMPP, das bereits eine MySQL-Datenbank und einen Webserver mit integrierter PHP-Funktionalität bereitstellt. 
Damit man sich das Projekt besser vorstellen kann, sind nachfolgend einige der wichtigsten Anforderungen beschrieben:

Der Besucher der Website soll sich auf der Startseite einloggen bzw. registrieren können. Wenn der Benutzer eingeloggt ist, kann er ein neues Album erstellen. In einem Album können beliebig viele Bilder gespeichert werden. Benutzer, die auf der Website angemeldet sind, können nur ihre eigenen Alben sehen. Bilder können mit sogenannten "Tags" versehen werden, um später über eine
Suchfunktion danach zu suchen/filtern.

Es gab noch optionale sowie einige weitere Pflichtvorgaben.
Auch hier wurde, wie schon beim letzten Projekt, vor allem die Funktionalität bewertet, wir mussten uns deshalb auch nicht grossartig mit dem Design der Website auseinandersetzen. Wir bekamen für dieses Projekt eine Vorlage, welche nach "MVC" strukturiert sein sollte.

MVC ist der Begriff für "Model View Controller", welcher ein Muster zur Strukturierung von Software-Entwicklung beschreibt. Ziel eines solchen Musters ist ein flexibler Programmentwurf, der eine spätere Änderung bzw. Erweiterung vereinfacht.

Im Folgenden werde ich das Resultat meiner Arbeit kurz beschreiben und einige Funktionen erklären.

Registration/Login

Besucht man die Seite zum ersten Mal, landet man automatisch auf der Startseite bzw. der Loginseite:





Hat man noch kein Benutzerkonto, muss dieses über den Punkt Registration erstellt werden. Dazu müssen alle Formularfelder ausgefüllt werden.






Als Benutzername wird hier die E-Mail-Adresse verwendet, was bedeutet, dass die E-Mail-Adresse nur an ein Benutzerkonto gebunden sein darf.
Die Benutzerdaten werden, wie in einer MySQL-Datenbank gespeichert. Bevor die Daten gespeichert werden können, werden sie erstmals vor dem Absenden des Formulars clientseitig per JavaScript und nach dem Absenden serverseitig mit PHP validiert. Für die serverseitige Validierung muss zuerst die Datenbank abgefragt werden, ob ein Eintrag mit der angegebenen E-Mail-Adresse bereits existiert. Ist dies nicht der Fall, können die Daten, nachdem das Passwort "gehashed" wurde, mittels einem Prepared-Statement eingefügt werden.

Prepared-Statements werden gebraucht, um die SQL-Queries als Vorlage auf dem Server zu speichern. Die SQL-Queries werden dann bei Bedarf mit den Formulareingaben als Parameter ausgeführt. Dadurch wird für das Ausführen einer SQL-Query Zeit gespart, da die Queries bereits vorbereitet sind. Weiterhin wird auch weniger Bandbreite benutzt, da nur Parameter statt dem ganzen Query zum Server gesendet werden muss. Prepared-Statements sind vor allem aber ein guter Schutz gegen SQL-Injection.

Wenn man bereits ein Benutzerkonto hat, kann man sich, unter dem Menüpunkt "Login",  mittels Eingabe von E-Mail-Adresse und Passwort einloggen.

Member-Bereich

Hat man sich eingeloggt, befindet man sich im sogenannten "Member-Bereich". Dieser unterscheidet sich vom Login-Bereich insofern, als es andere und auch mehr Navigationsbuttons gibt. Wenn man sich eingeloggt hat, ist man direkt auf der Album-Seite, auf welcher man alle eigenen Alben mit den Bildern als Thumbnail sieht:




Da man sich zum ersten Mal eingeloggt hat, sind noch keine Alben für den Benutzer verfügbar.
Um ein neues Album zu erstellen, muss man rechts in der Navigation auf "Neues Album erstellen" klicken.

Man gelangt zu folgender Seite:




Im Textfeld kann der Name für das neue Album eingegeben werden. Mit einem Klick auf "Album erstellen" wird der Eintrag in die Datenbank gespeichert. Für die Alben gibt es eine eigene Tabelle, in der auch die ID des Benutzers, welcher das Album erstellt hat, gespeichert wird, um es später wieder dem richtigen Benutzer zuordnen zu können.

Geht man nun zurück auf den Tab "Fotoalben", sieht man das eben erstellte Album, mit dem Hinweis, dass es noch keine Bilder beinhaltet.



Um nun ein Bild in das eben erstellte Album hochladen zu können, muss zuerst auf "Bilder hochladen" geklickt werden.
Auf der Seite kann nun mit Datei auswählen ein Bild geöffnet werden, das lokal gespeichert ist.
Im ersten Textfeld wird ein Bildname eingegeben, im nächsten dann der Albumname, in welches das Bild hochgeladen werden soll. In der grossen Textbox können dann die Tags für das Bild eingegeben werden, nach denen später gesucht werden kann.




Mit einem Klick auf hochladen wird das Bild hochgeladen und dem entsprechenden Album hinzugefügt.
Für das Hochladen muss zuerst überprüft werden, ob ein Bild mit gleichem Namen bereits auf dem Server existiert. Ist dies der Fall, wird dem Bild eine Zahl angehängt (z.B. "Koala.jpg_1"). Das Bild wurde nun auf dem Server gespeichert. Damit man später eine bessere Vorschau bei den Alben erhält, wird zusätzlich ein Thumbnail mit einer Höhe von 100 Pixeln erstellt und auch auf dem Server in einem separaten Ordner gespeichert. Hat alles bis hierher geklappt, muss noch ein Eintrag in die Bildtabelle eingefügt werden. Hier werden neben dem Namen und den Tags natürlich auch die Album-ID sowie der Pfad zum Thumbnail und dem Originalbild gespeichert.

Geht man nun wieder auf den Tab "Fotoalben", sieht man das Album mit dem eben hochgeladenen Bild. Hier wird noch das Thumbnail angezeigt, wenn man drauf klickt, öffnet sich das Originalbild.




Hat man mehrere Alben sowie auch mehrere Bilder erfasst, kann das dann folgendermassen aussehen:




Zum Filtern nach Bildern muss man zuoberst im Textfeld den gewünschten Tag bzw. einen Teil davon eingeben und auf Filtern klicken. Es werden dann alle Alben gleichzeitig nach diesem Tag durchsucht.





Ist man mit der Arbeit in seiner Bilderdatenbank fertig, sollte auf Logout geklickt werden, um die Session zu löschen.



Sonntag, 29. Mai 2016

Mai 2016 - Schulprojekt "Vier Gewinnt"

In der Schule im Modul 306 - IT Kleinprojekt abwickeln - arbeiten wir in Gruppen an einem individuellen Projekt. Dabei geht es nicht nur rein ums Entwickeln einer Applikation, sondern auch darum, alle Arbeiten zu planen, verschiedene Berichte (Initialisierungsbericht, Konzeptbericht, Einführungsbericht etc. ...) korrekt zu verfassen und termingerecht abzugeben. Das Modul 306 soll auf die IdPA im letzten Lehrjahr vorbereiten. Wie in einem vorherigen Blogbeitrag bereits erwähnt, arbeiten wir in unserer Gruppe für das Projekt mit der Spiel-Engine Unity5.


Projekt "Vier Gewinnt"

Wir wollten in unserem Projekt den Spieleklassiker "Vier Gewinnt" als Desktopanwendung neu aufleben lassen. Wir haben uns dafür entschieden, da wir eine neue Technologie kennen lernen wollten (Unity5) und da wir als Zweiergruppe im Gegensatz zu grösseren Gruppen in der gegebenen Zeit nicht so ein umfangreiches Projekt entwickeln können. Weiterhin haben wir dort noch Möglichkeiten für Erweiterungen, falls wir doch mehr Zeit als geplant zur Verfügung gehabt hätten.
Da wir immer wieder an Dokumentationen arbeiten mussten, die wir später dann zur Bewertung abgeben sollten, konnten wir weniger Zeit als zunächst angenommen in die Realisierung des Projekts investieren. Deshalb mussten wir einige Zusatzfunktionen streichen. Die Applikation läuft nun, aber nur im Mehrspieler-Modus. Das heisst, man kann zu zweit gegeneinander "Vier gewinnt" auf einem PC spielen.
Eigentlich wollten wir anfangs noch als Zusatzfunktion einen Einzelspielermodus einbauen. Man würde dann gegen den Computer in verschiedenen Schwierigkeitsstufen antreten. Um gegen einen Computer spielen zu können, müsste man eine KI (Künstliche Intelligenz) entwickeln. Dies ist meist ein ziemlich grosses Unterfangen und hätte wohl auf keinen Fall auch noch in unser Projekt gepasst.
Auf einige kleinere Zusatzfunktionen, die eigentlich keinen wirklich grossen Nutzen gehabt hätten, haben wir verzichtet, um mehr Zeit für die Hauptfunktionen zu haben und so besser deren Funktionstüchtigkeit gewährleisten zu können.

Entwicklung

Die Entwicklung geschah wie schon erwähnt mit der Spiel-Engine Unity5 (siehe Blogeintrag Februar 2016) und der Programmiersprache C#. In Unity hätte man die Möglichkeit, Spiele in 3D zu entwickeln. Da wir aber keinen grossen Nutzen darin sahen, ein "Vier Gewinnt" in 3D zu gestalten, wollten wir es klassisch in 2D halten.
Die Anwendung besteht im Wesentlichen nur aus zwei verschiedenen Fenstern. Der Start-Screen und der Spiele-Screen. Im folgenden Bild sieht man den Spiele-Screen in der IDE:




In der Mitte des Fensters ist der Spiel-Screen zu sehen, auf der linken Seite die in dieser Szene befindlichen Objekte. Unterhalb sieht man eine Art Explorer, wo man auf seine Dateien im Projekt zugreifen kann, beispielsweise Bilder, Scripts etc. Auf der rechten Seite sieht man die Eigenschaften des Objekts.
Um Buttons verwenden zu können, wird ein sogenanntes "Canvas" über das Fenster gelegt. In diesem "Canvas" befinden sich die eigentlichen Buttons oder ähnliches wie Textboxen. Damit ein Button nun etwas macht, wenn man drauf klickt, muss man dem Button ein Script hinterlegen. Dabei wird im Script meist eine Funktion definiert die dann per Buttonklick ausgeführt wird. Hier können auch Parameter mitgegeben werden, sofern die hinterlegte Funktion das unterstützt. Scripts werden meist in Visual Studio oder dem integrierten Editor "Mono" geschrieben.
Eine Schwierigkeit, die wir hatten, da wir uns vorher noch nie mit Unity auseinander gesetzt hatten, war das Zugreifen auf Objekte (z.B. auf ein Spielstein). Da die Scripts ja eigentlich unabhängig von den einzelnen Szenen sind, kennt das Script die Objekte auch nicht einfach so. Eine Lösung für dieses Problem besteht darin, alle Objekte eindeutig zu taggen und dann mit der folgenden Unity-Funktion zu suchen::

       GameObject.FindGameObjectWithTag("objecttag")

Zusätzlich zu dieser Funktion wird dann meist eine Referenzvariable des Typs "GameObject" erstellt, die auf das mit der obenstehenden Funktion gefundene Objekt zeigt. Über diese Referenzvariable kann dann das Objekt angesprochen werden.

Eine weitere wichtige Funktion für uns war folgende:

       Instantiate(Resources.Load("path")) as GameObject

Damit kann man ein zuvor in Unity erstelltes und als sogenanntes "Prefab" gespeichertes Objekt instanziieren. Das haben wir verwendet, um jedes Mal eine neue Instanz einer der beiden zuvor erstellten Spielsteine (rot und gelb) zu erstellen, wenn ein entsprechender Spalten-Button angeklickt wird. Das bedeutet, dass dann immer bei der jeweiligen Spalte ein neuer Spielstein instanziiert wird und dann letztendlich in die gewählte Spalte fällt.

Um also seinen Stein setzen zu können, muss der Spieler auf einen der sechs Spalten-Buttons klicken. Hinter diesen Buttons befindet sich jeweils dasselbe Script mit einer Funktion, die einen Parameter erwartet - die Spaltennummer (0 bis 5).
Hat man also nun auf einen der Spalten-Buttons geklickt, wird entweder ein neuer roter oder gelber Stein instanziiert, je nachdem, wer gerade am Zug ist.
Gleichzeitig wird überprüft, ob es schon einen Sieger gibt. Falls ja wird eine Meldung ausgegeben mit dem Gewinner und die Spalten-Buttons verschwinden, damit keine neuen Steine gesetzt werden können.

Damit die Spielsteine in die Spalte fallen, haben wir den Spielstein-Objekten ein "Rigidbody" verpasst. Dem Rigidbody können dann "Gravity"-Werte gegeben werden, wodurch die Steine fallen.

Der potentielle Gewinner wird wie schon erwähnt ermittelt, nachdem einer der Spalten-Buttons geklickt wurde.
Dazu muss erwähnt werden, dass jedes Mal wenn ein neuer Stein gesetzt wird, ein Feld in einem Array entweder mit 0 oder 1 ausgefüllt wird, 0 und 1 stehen für die beiden Spieler.
Zur Überprüfung wird mit mehreren komplexen Algorithmen das Array untersucht und kontrolliert, ob vier gleiche Werte (0 oder 1) in einer Reihe vertikal, horizontal oder diagonal sind.

Endprodukt

Um die Anwendung ausführen zu können braucht es grundsätzlich keine Installation, es gibt lediglich eine .exe-Datei und einen Ordner mit Unity-Dateien, die sich beide am selben Ort befinden müssen.
Wenn man die .exe-Datei ausführt, erscheint zuerst eine Unity-Startanimation (da wir die kostenlose Unity-Version benutzen).
Danach wird man zum Start-Screen weitergeleitet. Dieser sieht folgendermassen aus:



Der Start-Screen beinhaltet im Wesentlichen zwei Buttons: Den Play-Button, um das Spiel zu starten und den Close-Button, der die Applikation schliesst.
Unten links sieht man ein Lautsprecher-Symbol, welcher dafür gedacht gewesen wäre, den Ton der Anwendung ein- und auszuschalten. Da es aber nun keinen Ton gibt, bewirkt dieser Button nichts.
Hat man den Play-Button betätigt, kommt man zum Spiel-Screen:



Der Spiel-Screen verfügt rechts über die beiden Buttons "Restart" und "Exit". Letzterer beendet auch hier wieder die ganze Applikation. Mit dem Restart-Button kommt man wieder zum Start-Screen, wo man über "Play" das Spiel neu starten kann.
Unter den sechs Spalten befinden sich die Spalten-Buttons. Die werden wie schon erwähnt verwendet, um einen Spielstein in die gewünschte Spalte fallen zu lassen.

Das folgende Bild zeigt, wie es aussieht, wenn man einen der Spalten Buttons klickt.




Wie man sieht, werden abwechslungsweise rote bzw. gelbe Steine gesetzt.
Hat einer der Spieler vier  Steine der gleichen Farbe in einer Reihe (vertikal/horizontal/diagonal) gewinnt er das Spiel:






Momentaner Stand

Zum Zeitpunkt, an dem dieser Blogeintrag verfasst wurde, ist das Projekt noch nicht ganz abgeschlossen, die Programmierarbeiten sollten jedoch fertig sein. Wenn es dennoch Probleme oder Fehler geben sollte, würden diese noch korrigiert werden.
Zum Abschluss werden wir in der Schule eine Präsentation über das Endprodukt halten müssen.
Man wird anschliessend eine Gesamtnote für das ganze Projekt erhalten und keine Modulabschlussprüfung mehr schreiben.

Donnerstag, 28. April 2016

April 2016 - MySQL

Im "Modul 151 - Datenbanken in Internetauftritten einbinden" verwenden wir als Datenbank MySQL. Ich habe bisher nur einige Male etwas mit MySQL zu tun gehabt, deshalb möchte ich in diesem Blogeintrag darüber schreiben.


MySQL

Bei MySQL handelt es sich um ein relationales Datenbankenverwaltungssystem. Da es für viele verschiedene Betriebssysteme verfügbar ist, ist es eines der am verbreitetsten Systeme und bildet die Grundlage sehr vieler dynamischer Websites. MySQL wird bereits seit 1994 entwickelt. MySQL wird vorzugsweise zur Datenspeicherung von Webdiensten verwendet und wird dabei häufig in Verbindung mit dem WebServer Apache und PHP eingesetzt, kann jedoch auch für gewöhnliche Desktopapplikationen eingesetzt werden. Die meisten bekannten Websites wie YouTube, Facebook, Twitter, Google etc. verwenden dieses System.


Plattfomen

Wie bereits erwähnt, ist MySQL für viele verschiedene Plattformen verfügbar. Diese sind unter anderem Windows, Mac OS X, Linux und viele Unix-Varianten. Weiterhin ist MySQL auch auf den Betriebssystemen OS/2 und i5/OS sowie Symbian lauffähig.


Verwendung/Struktur

Die Verwendung von MySQL sieht im Allgemeinen so aus, dass ein MySQL-Server, auf welchem die Daten abgespeichert sind, vorhanden ist. Von den Clients werden Anfragen an den Server geschickt, die dieser beantwortet. 
Im Datenbankmanagementsystem können mehrere Datenbanken erstellt und verwaltet werden. In einer Datenbank werden eine oder mehrere Tabellen angelegt. MySQL erstellt dann auf der Festplatte jeweils einen Ordner pro Datenbank, in dem Dateien für die Struktur und die Daten der einzelnen Tabellen abgelegt werden.
Die Spalten der Tabellen haben jeweils einen Datentypen zugeordnet, so dass in der jeweiligen Spalte nur Daten dieses Typs abgespeichert werden können.


Ablauf von Anfragen

Wenn ein Client eine Anfrage an den Server schickt, ist dieser dafür verantwortlich, die Anfrage so performant wie möglich abzuarbeiten.
Dazu wird als erstes der Query-Cache befragt. Der Query-Cache ist ein Zwischenspeicher, in dem die Ergebnisse von Anfragen gespeichert werden. Der Zwischenspeicher bleibt so lange erhalten, bis sich etwas an den Daten in der Datenbank ändert. Befindet sich also nun im Query-Cache eine identische Abfrage wie die, die gerade gestellt wurde, gibt der Server die Antwort aus dem Cache und muss nicht die gesamte Datenbank nochmals befragen. 
Befindet sich keine identische Abfrage im Query-Cache, wird die erhaltene Query zuerst geparst. Das heisst, sie wird zunächst mal auf die Syntax überprüft. Dazu wird sie in die einzelnen Komponenten zerlegt. Gleichzeitig werden grundlegende Informationen über die Query gesammelt, wie etwa die Art der Query (Select- , Insert-, Set-, oder Grant-Statement), sowie die betroffenen Tabellen. Am Ende kennt MySQL den vollständigen Parse-Baum, der danach optimiert wird.
Optimiert wird jede Query, die syntaktisch in Ordnung ist. Der sogenannte Optimizer sucht nach dem effizientesten Weg, die Query zu bearbeiten. In diesem Schritt geht es hauptsächlich darum, die Anzahl der zu lesenden Datensätze zu verringern. Das kann zum Beispiel erreicht werden, wenn bei Datensätzen, die aus mehreren Tabellen gelesen werden müssen, eine geschickte Abfragereihenfolge gewählt wird. Andererseits werden nicht benötigte Tabellen in Join-Anweisungen erst gar nicht gelesen. Nach dieser Prozedur stehen dem Optimizer alternative Möglichkeiten zum Finden der Daten zur Verfügung. Für jede Möglichkeit wird die Ausführungsgeschwindigkeit abgeschätzt und zum Schluss diejenige mit der kürzesten Zeit ausgewählt und durchgeführt.

Speichersubsysteme

In MySQL sind verschiedene Speichersubsysteme enthalten. Speichersubsysteme sind Engines, die sich insofern unterscheiden, als sie jeweils für andere Einsatz-Szenarien optimiert sind. Ausserdem bieten diese Engines mehr Funktionalitäten als reine Speichersubsysteme. Die einzelnen Engines bieten unterschiedliche Funktionen an und weisen je nach Einsatzgebiet auch eine unterschiedliche Performance auf. Je nachdem wozu eine Tabelle genutzt wird, z.B. mehrheitlich lesen oder hauptsächlich schreiben, sollte eine passende Speicherengine gewählt werden. Der Entscheid für oder gegen eine Engine hängt auch von den gegebenen Funktionalitäten ab.
MySQL kann auch mit eigenen Speicherengines erweitert werden.



Administration

Für die Verwaltung und Administration von MySQL-Datenbanken steht der mitgelieferte Kommandozeilen-Client zur Verfügung. Weitere Kommandozeilenwerkzeuge sind im Funktionsumfang enthalten. Beispielsweise Tools zur Anzeige von Metadaten einer Datenbank oder Tabelle, anzeigen von erweiterten Informationen zu Fehlercodes sowie Import und Export von Tabellenstrukturen.
Als grafische Benutzeroberfläche zur Verwaltung wird MySQL Workbench angeboten.


Mysqlwb-homepage.png
MySQL Workbench


Als Alternative gibt es die Open-Source-Anwendung phpMyAdmin, die beispielsweise auch zusammen mit XAMPP geliefert wird. Die Benutzeroberfläche lässt sich über den Browser bedienen. phpMyAdmin wird hauptsächlich zur Verwaltung von MySQL-Datenbanken auf WebServern verwendet.

Bildschirmfoto von phpMyAdmin
phpMyAdmin


Dienstag, 12. April 2016

März 2016 - DDoS

In der Schule beschäftigen wir uns im Modul 151 - "Datenbanken in Internetauftritt einbinden" mit der Sicherheit und den Schwachstellen bei Webservern. In Zweiergruppen bearbeiten wir jeweils ein Thema. Wir haben das Thema DoS/DDoS zugeteilt bekommen.

(D)DoS

DoS, im Allgemeinen, steht für Denial of Service, was zu Deutsch etwa "Dienstverweigerung" bedeutet. In der Informatik bezeichnet dieser Begriff die Nichtverfügbarkeit eines Dienstes, der eigentlich verfügbar sein sollte. In der Regel spricht man von DoS als Folge einer Überlastung von Infrastruktur, obwohl die Nichtverfügbarkeit eines Dienstes auch die Folge von verschiedenen anderen Gründen sein kann. Eine solche Überlastung kann natürlich unbeabsichtigt auftreten, jedoch auch durch einen absichtlichen, gezielten Angriff auf einen Server. Sofern die Überlastung oder eben der gezielte Angriff von mehreren Systemen verursacht wird, spricht man von "Distributed Denial of Service" (DDoS).

Funktionsweise

Bei einem gezielten Angriff auf ein System wird von den Angreifern versucht, ein oder mehrere Online-Dienste arbeitsunfähig zu machen. DoS-Angriffe können den Internetzugang, die Dienste des Host (z.B. HTTP) oder das ganze Betriebssystem belasten. Dies kann erreicht werden, indem eine massiv höhere Anzahl an Anfragen an den Server geschickt wird, als dieser verarbeiten kann. Dadurch kann er auf reguläre Anfragen nur mehr sehr langsam oder überhaupt nicht mehr reagieren. Wesentlich effizienter ist es jedoch, einen Programmfehler auszunutzen, um eine Fehlfunktion der Serversoftware auszulösen, die möglicherweise den gesamten Server zum Absturz bringt, worauf dieser natürlich ebenfalls auf keine Anfragen mehr reagiert. Der Unterschied zu anderen Angriffen besteht im Wesentlichen darin, dass bei einem DoS-Angriff der Angreifer normalerweise nicht in den Computer eindringen muss und deshalb auch keine Passwörter oder Ähnliches vom Zielrechner benötigt.
Es existiert ein sehr einfach zu bedienendes Tool, das man im Internet finden kann. Mit diesem ist es möglich, einen DoS-Angriff auf einen mit dem Internet verbundenen Rechner zu starten.
Da für das Tool kein grösseres Fachwissen benötigt wird, wird es häufig bei Protestaktionen eingesetzt.


Schematische Darstellung eines DDoS-Angriffs





DRDoS

Eine besondere Form, die zugleich schwieriger zurückzuverfolgen ist, ist der DRDoS-Angriff (Distributed Reflected Denial of Service). Bei dieser Form schickt der Angreifer seine Datenpakete nicht direkt an den Zielrechner, sondern an einen regulär arbeitenden Internetdienst, trägt jedoch als Absenderadresse der Datenpakete die Adresse des Ziels ein. Der Internetdienst schickt die Antworten auf die Anfragen des Angreifers also an das Ziel und verursacht somit den eigentlichen DoS-Angriff.  



Botnetze

Ein mutwilliger DDoS-Angriff wird oftmals mit Hilfe von Botnetzen durchgeführt. Ein Botnetz ist eine Gruppe von automatisierten Computerprogrammen. Diese Programme, die sogenannten Bots, laufen auf vernetzten Rechnern, deren Netzwerkanbindungen und die lokalen Ressourcen den Bots zur Verfügung stehen. Die Bots werden von einem Angreifer ohne das Wissens des Inhabers auf dessen Rechner installiert. Meist ist es sogar der Fall, dass die Bots selbstständig versuchen, weitere Rechner in einem Netzwerk zu infizieren.
Verfügt der Angreifer nun über ein solches Botnetz, kann er den infizierten Rechnern Befehle schicken, dass sie Anfragen an einen Internetdienst schicken sollen. Je grösser das Botnetz ist, desto erfolgreicher kann mit dessen Hilfe ein DDoS-Angriff durchgeführt werden.




Herkömmliche Überlastungen

Es kann auch der Fall sein, dass ein Dienst überlastet wird, weil eine grosse Anzahl Anfragen von Besuchern kommen (die nicht die Absicht haben, den Dienst zu überlasten), die der Server bis dahin nie verarbeiten können musste. Das kann dann geschehen, wenn eine eher kleinere Seite, vor allem durch Online-Newsseiten, bekannt gemacht wird, wodurch ein Teil der vielen Nutzer automatisch die neue Seite besucht. In solch einem Fall spricht man dann von einem Slashdot-Effekt.



Gegenmassnahmen

Je nachdem ob es sich um einen mutwilligen Angriff oder eine herkömmlichen Überlastung handelt, muss man entscheiden, wie man vorgeht.
Wurde die Überlastung durch eine hohe Besucheranzahl verursacht und nicht durch einen gezielten Angriff, sollte man am besten die eigene Serverhardware aufrüsten, um dem Besucherandrang gewachsen zu sein.

Will man sich jedoch vor DDoS-Attacken schützen, gibt es verschiedene Möglichkeiten, um diese abzuwehren.
Wenn der Angriff von nur wenigen Rechnern aus kommt, können einfache Sperrlisten von der Firewall eingesetzt werden. Datenpakete von IP-Adressen auf dieser Sperrliste werden automatisch verworfen. Oftmals kann eine Firewall auch simple Angriffe automatisch erkennen und diese Sperrliste dynamisch erzeugen.
Verhaltensbasierte Analyse- und Filtermassnahmen können auf dem Server und auch auf dem Router eingerichtet werden.
Falls dem Angreifer nur die IP-Adresse bekannt ist, reicht es, die Public-IP-Adresse zu ändern. Erfolgt der Angriff aber über einen öffentlichen DNS-Hostname, bringt diese Massnahme nahezu nichts.
Eine dauerhafte aber auch ziemlich teurere Möglichkeit ist die Nutzung eines Filter-Services. Solche Dienste werden von verschiedenen kommerziellen Anbietern gehostet. Jeglicher Netzwerkverkehr geht zuerst über diesen Anbieter, der unter anderem eine Anbindung von bis zu 500 GBit/s hat. Solange eine gewisse Grenze nicht überschritten wird, gehen die Daten weiter an den eigentlichen Dienst. Sollten sich die Anfragen häufen (wegen eines DDoS-Angriffes), so dass der eigentliche Dienst überlastet werden würde, werden diese Anfragen vom Filter-Service verworfen.

Sonntag, 28. Februar 2016

Februar 2016 - Spiel-Engine

Zurzeit arbeiten wir in der Schule unter anderem an dem Modul 306 - IT Kleinprojekte abwickeln. Wir müssen in Gruppen ein kleines Projekt von der Initialisierung bis hin zur Präsentation durchführen. Um was für ein Projekt es sich dabei genau handelt, steht jeder Gruppe offen, auch bei der Wahl der Technologie muss jeder selbst entscheiden. Unsere Gruppe besteht aus 2 Personen. Wir haben uns dafür entschieden, das klassische Gesellschaftsspiel "4-Gewinnt" als Desktopanwendung zu realisieren. Als Technologie haben wir uns für Unity, eine Spiel-Engine, entschieden. Was eine Spiel-Engine genau ist und was es alles für Möglichkeiten gibt, werde ich in diesem Blogeintrag erläutern.


Spiel-Engine

Eine Spiel-Engine an sich ist ein spezielles Framework, um Computerspiele zu entwickeln. Das Framework steuert dabei den Spielverlauf und ist für die visuellen Darstellungen des Spiels verantwortlich. Üblicherweise wird eine solche Engine auch als Entwicklungsumgebung genutzt.



Funktionalitäten


Eine Spiel-Engine muss viele verschieden Basisfunktionalitäten zur Verfügung stellen, damit ein vollwertiges Spiel programmiert werden kann.

Grafik-Engine
Einer der wichtigsten Vorteile einer Spiel-Engine ist die Grafik-Engine. Diese ist für die grafische Darstellung der Objekte verantwortlich, sie beinhaltet Funktionen zum Laden, Verwalten und Anzeigen von Texturen, 2D-Sprites und im Falle einer 3D-Engine auch von 3D-Modellen. Weiterhin gibt es Funktionen für Effekte wie Schnee, Nebel, Explosionen, Feuer etc. Zusätzlich ist bei 3D-Engines oft auch ein Shadder-System eingebaut. Mit diesem wird es möglich, eine realistische Darstellung der Wirkung von Licht und Schatten zu integrieren.

Physik-Engine
Ein weiterer wichtiger Vorteil bei der Spiel-Engine ist das Physiksystem. Sie wird zur Simulation von physikalischen Prozessen verwendet. Das Ziel einer solchen Physik-Engine ist unter anderem eine Vereinfachung der Programmierung. Physikalische Effekte werden komplett von der Engine übernommen, der Entwickler muss nur die Eigenschaften der Objekte festlegen. Des Weiteren soll damit eine realistische "Spielphysik" erzielt werden, indem Bewegungsabläufe in einer 3D-Ansicht sehr realistisch vermittelt werden. Da physikalische Prozesse sehr komplex sind, steht bei einer Physik-Engine nicht immer zwingend die physikalische Exaktheit sondern die Echtzeitfähigkeit der Engine im Vordergrund. Das bedeutet: Effizienz geht vor Exaktheit. Seit ca. 2005 gibt es speziell für Physik-Engines auch eine Hardwareunterstützung, sogenannte Physikbeschleuniger, welche die Berechnung der physikalischen Effekte, auf einer speziellen Physikkarte oder Grafikkarte, auslagern.

Soundsystem
Die meisten der heutigen Spiel-Engines unterstützen 5.1 oder 7.1 Surround Sound, entsprechende Hardware (Soundkarte) und Lautsprecher sind vorausgesetzt. Durch diese Technologie wird ein räumlicher Eindruck der Spielwelt verstärkt, indem ein differenzierter Raumklang entsteht. Klanglich können so auch verschiedene Räume simuliert werden, beispielsweise ein Badezimmer, eine Halle, Gänge usw.


Netzwerk-Code
Der Netzwerk-Code oder kurz Netzcode ist der Teil eines Computerprogrammes, der für die Kommunikation in Netzwerken zuständig ist. Der Netzcode bestimmt also somit die Voraussetzungen für den Mehrspielermodus eines Spiels, z.B. die Anzahl der Mitspieler oder welche Bandbreite vorhanden sein muss etc. Als Netzwerkprotokolle stehen dem Entwickler die beiden Protokolle UDP und TCP zur Verfügung. UDP ist das schnellere der beiden, jedoch kann es vorkommen, dass Pakete doppelt auftreten oder sogar verloren gehen. TCP ist in dieser Hinsicht sicherer, dass die Daten sicher und in korrekte Reihenfolge beim Client ankommen. Oft werden trotzdem beide Protokolle verwendet, bei sicheren Daten wie Anmeldungen wird TCP und bei flüchtigen Daten UDP verwendet.

Programmiersprachen
In Spiel-Engines sind meist beide - Entwicklungssprachen sowie Skriptsprachen - vorhanden. Grundsätzlich kann ein komplettes Spiel nur mit einer Entwicklungssprache wie z. B. C# geschrieben werden. Skriptsprachen bieten aber einige Vorteile, beispielsweise müssen Spieledesigner, die nicht unbedingt professionelle Programmierer sind, so nicht ganze Entwicklungssprachen sondern nur Skriptsprachen erlernen, was deutlich einfacher ist. Ein weiterer Vorteil ist, dass der Code bei Skriptsprachen oftmals während der Programmausführung geändert werden kann, was die Entwicklungszeit massiv verkürzen kann, da nicht immer eine Neukompilierung des gesamten Engine-Codes notwendig ist.



Unity

Unity ist die Spiel-Engine, welche wir für unser Projekt benutzen. Momentan ist die aktuelle Version Unity 5. Man unterscheidet zwischen Unity Personal und Unity Professional, die Personallizenz ist kostenlos, die Professional ist die Vollversion des Programmes. Die zusätzlichen Funktionen der Vollversion sind einerseits Erweiterungsmöglichkeiten durch C++-Module andererseits das Selbstgestalten des Startbildschirms. Für unser Projekt reicht die Personal-Version jedoch vollkommen aus. Die Entwicklungsumgebung (Unity Editor) ist gängigen 3D-Animationsprogrammen nachempfunden. Das Hauptfenster stellt die 3D-Szene dar, weitere Menüs und Fenster dienen zum Editieren von Kamera und Szene. Objekte können verschoben, gedreht und skaliert werden. Des Weiteren können jedem einzelnen Objekt physikalische Eigenschaften zugeordnet werden. Einige Formen (Würfel, Kugeln, Ebenen) können direkt im Editor erzeugt werden, komplexere Komponenten wie 3D-Modelle können in anderen Programmen erstellt und dann in Unity importiert werden. Neben Computerspielen können mit Unity auch Konsolenspiele und mobile Anwendungen entwickelt werden.


Unity-Editor




Programmierung
Unity stellt als Entwicklungssprache C# und C++ sowie die beiden Skriptsprachen UnityScript (ähnlich wie JavaScript) und Boo (ähnlich wie Phyton) zur Verfügung. Als IDE wird MonoDevelop verwendet. Skripte und andere Objekte (wie z.B. 3D-Modelle) können in sogenannte "Prefabs" zusammengefasst und gespeichert werden. Diese können dann in andere Teile des Projekts oder auch in komplett andere Projekte importiert werden und anschliessend wie die eingebauten Elemente verwendet werden. Die Grafik-Engine von Unity kann durch selbst geschriebene Shader-Programme erweitert werden.
Es gibt eine Reihe von kostenlosen Tools, die als Plug-ins in den Unity Editor eingebunden werden und die Engine um weitere Funktionen erweitern.


Sonntag, 31. Januar 2016

Januar 2016 - PHP Projekt

In der Schule, im Modul 133, arbeiteten wir an einem PHP-Projekt. In diesem Projekt sollte ein Online-Blog entwickelt werden. In diesem Blogeintrag möchte ich das Ergebnis meines Projekts vorstellen und erklären, wie manche Funktionen gelöst wurden.




Der Blog

Bewertet wurde in dem Projekt die Funktionalität des Blogs, deshalb habe ich keinen grossen Wert auf das Optische gelegt. Wir bekamen eine Vorlage bezüglich dem Design zur Verfügung gestellt.
Als "Server" haben wir XAMPP benutzt. Damit kann man eine Seite, die man entwickelt, auf dem localhost hosten.
Die Hauptseite für nicht eingeloggte Besucher sieht so aus:




Man sieht hier alle bisher veröffentlichten Blogs (mit Datum absteigend) jeweils mit dem Benutzername des Erstellers.
Mit den Buttons oben rechts ("Register" und "Login") kann man sich entweder registrieren oder einloggen.

Benutzerverwaltung

Um in einem Blog einen Beitrag posten zu können, benötigt man natürlich zuerst ein Konto. 
Die Benutzerdaten werden normalerweise in einer Datenbank gespeichert. Wir konnten wählen, ob wir die Daten in Tabellen (SQL-Abfragen) oder Textdateien speichern. Ich habe mich für Textdateien entschieden, da dies der eigentliche Stoff für die Modulabschlussprüfung sein wird. 
Ein Besucher der Website möchte sich also ein neues Konto erstellen. Als Benutzername muss eine gültige E-Mail-Adresse angegeben werden. Die E-Mail-Adresse darf natürlich nicht schon zu einem anderen Benutzerkonto gehören.
So sieht das Registrierungsformular aus:



Hier sind eigentlich nur die E-Mail-Adresse und das Passwort zur Benutzerregistration notwendig, die anderen Punkte könnte man später auch noch einbauen.
Wenn sich ein neuer Benutzer auf der Seite registriert, werden Benutzername und Passwort (in verschlüsselter Form) in die Benutzer-Textdatei, welche sich auf dem Server befindet, gespeichert. Sollte die E-Mail-Adresse bereits vergeben sein, wird man benachrichtigt, dass man eine andere E-Mail-Adresse eingeben muss.
Hat man bereits ein Konto, klickt man auf der Hauptseite auf "Login" und folgendes Fenster erscheint:



Hier müssen dann die bei der Registration verwendete E-Mail-Adresse und das Passwort eingegeben werden. Es wird nun wieder die Benutzer-Textdatei auf dem Server geöffnet und nach dem eingegebenen Benutzernamen gesucht. Ist dieser vorhanden, wird das eingegeben Passwort mit dem in der Datei bereits gespeicherten Passwort verglichen, stimmen diese überein, ist man eingeloggt.
Ansonsten wird man auch hier wieder benachrichtigt.

War die Registration bzw. das Anmelden erfolgreich, wird man in beiden Fällen zurück zur Hauptseite weitergeleitet und ist eingeloggt:



Sobald man eingeloggt ist, sind die Buttons oben rechts mit "Blogs" und "Logout" beschriftet.
Mit Letzterem meldet man sich wieder ab von der Seite.
Damit man auf der Seite eingeloggt bleibt, auch wenn man zu einer anderen navigiert, habe ich Sessions verwendet. Damit können im Prinzip globale Variablen gesetzt werden, auf die jede Seite zugreifen kann. Die Session-Variable "Benutzer" speichert den Benutzernamen des aktuell eingeloggten Benutzers.

Blogbeitrag erstellen

Will man einen Blogbeitrag erstellen muss man zunächst eingeloggt sein. Dann gibt es oben rechts den Button "Blogs", dieser führt zu folgender Seite:



Hier gibt es wieder ein Formular mit zwei Textfeldern und einem "Senden" Button. Im oberen Textfeld kann man nun den Titel des Blogs eingeben und im unteren den Inhalt des Blogs.
Hat man den Blog geschrieben und möchte diesen veröffentlichen, muss man auf "Senden" klicken.
Es wird nun auf dem Server die Blog-Textdatei geöffnet. In dieser befinden sich die veröffentlichten Blogs. Zum Speichern des Blogs werden natürlich Titel und Inhalt benötigt, des Weiteren ist aber auch der Benutzername sehr wichtig, da sonst der Blog nicht dem Ersteller zugeordnet werden könnte. Der Benutzername des eingeloggten Benutzers muss also auch in der Blog-Textdatei gespeichert werden.
Hat man den Blog veröffentlicht, so kommt man wieder auf die Startseite und der neue Blog ist dort zu sehen:



Der Blogeintrag, der zu oberst zu sehen ist, ist der Neuste. In der ersten Zeile steht der Blogger, in der zweiten Zeile der Titel des Blogs und ab der dritten Zeile der Inhalt des Blogeintrags.

Wenn man nun wieder auf "Blogs" klickt und dann oben links auf "Meine Blogs" gelangt man zu folgender Seite:



Hier sieht man die Titel derjenigen Blogs, deren Ersteller mit dem zurzeit eingeloggten Benutzer übereinstimmt.
Dazu wird also wieder die Blog-Textdatei auf dem Server geöffnet und jeder Eintrag überprüft, ob der Wert in der Session-Variable "Benutzer" mit einem der Einträge übereinstimmt. Ist dies der Fall, wird der Titel des Blogeintrags hier angezeigt. Aus dem Titel wird dann direkt ein Link generiert. Klickt man auf einen dieser Links, wird man zum Bearbeiten des Blogeintrags weitergeleitet.



Diese Seite ist sehr ähnlich wie die zum Erstellen eines Blogeintrags, nur kann hier der Titel nicht bearbeitet werden, der Inhalt allerdings schon.
Klickt man hier auf "Senden", sollte der gespeicherte Blogeintrag mit dem, der gerade bearbeitet wurde, überschrieben werden.



Dies sind die wichtigsten Funktionen des Projekts, man könnte sicherlich noch sehr viel Zeit investieren, um Verbesserungen/Ergänzungen vorzunehmen.