Mittwoch, 29. März 2017

März 2017 - Multimedia (Fotografie)

Das Modul 152 - "Multimedia-Inhalte in Webauftritt integrieren" ist eines der letzten Module, das ich in der Schule absolvieren muss. Wie der Name schon sagt, geht es in einem Teil darum, eine ansprechende Website zu erstellen, in der Multimedia-Inhalte wie Fotos, Videos etc. eingebunden werden.
Die Website an sich ist grundsätzlich keine so grosse Herausforderung, da kaum etwas Neues dazukommt. Jedoch müssen die Inhalte selber erstellt werden. Das bedeutet, wir müssen in Teams eigene Fotos und Videos aufnehmen sowie diese dann bearbeiten. Da dies für mich eher neu ist, schreibe ich in diesem Blogeintrag ein wenig über die Fotografie.


Allgemeines

Die Fotografie ist ein Medium, dass in sehr verschiedene Zusammenhänge gebracht wird. Sie kann unter anderem nach künstlerischen, technischen, ökonomischen, gesellschaftlichen oder sozialen Aspekte betrachtet werden. Grundsätzlich geht es in der Fotografie darum, etwas - z.B. ein Objekt oder eine Landschaft - fotografisch abzubilden.
Die analoge Fotografie wurde zu Beginn des 21. Jahrhunderts durch technologische Weiterentwicklungen von der Digitalfotografie allmählich abgelöst. Das war ein Auslöser, dass die Fotografie immer mehr aus kulturwissenschaftlicher sowie kulturhistorischer Sicht erforscht wurde, da die Industrie für analoge Fotografie zusammenbrach.

Fototechnik

Eine Fotografie ensteht im Prinzip dadurch, dass mit Hilfe eines optischen Systems, etwa einem Objektiv, das Licht eingefangen wird. Dieses Licht wird dann auf die lichtempfindliche Schicht der Kamera weitergeleitet, zum Beispiel auf eine Fotoplatte, einen Film oder einen fotoelektrischen Wandler (Bildsensor). Zur Aufnahme von Fotos wird natürlich eine Kamera eingesetzt. Je nach Kamera kann der Fotograf das optische System so manipulieren, dass ihm unterschiedliche Gestaltungsmöglichkeiten zur Verfügung stehen. Das ist unter anderem die Einstellung der Blende, Belichtungszeit etc., später mehr dazu. Die am weitest verbreitete Kamera ist die Spiegelreflexkamera (analog sowie digital).
Die Entwicklung erfolgt bei der analogen Fotografie auf chemischem Wege. Bei der digitalen Fotografie ist eine Entwicklung grundsätzlich nicht nötig, da die Daten elektronisch gespeichert werden. Eine Ausnahme sind hierbei jedoch Fotos im Rohdatenformat (.raw-Dateien). Diese müssen zuerst mit einer Entwicklungssoftware (z.B. Adobe Lightroom) oder RAW-Konvertern in nutzbare Formate gebracht werden, JPG, PNG etc. Diese Umwandlung wird als digitale Entwicklung bezeichnet.
Ein weiterer Begriff, der vor allem in der analogen Fotografie Verwendung findet, ist der Abzug. Der Abzug ist das Ergebnis einer Kontaktkopie, Vergrösserung oder einer Ausbelichtung. Abzüge sind also aus der Vorlage bearbeitete Kopien. Sie können aus einem Film (Negativ oder Dia) oder von digitalen Dateien erstellt werden.


Belichtungsdreieck

Das Belichtungsdreieck beschreibt den Zusammenhang zwischen Blende, Verschlusszeit und Empfindlichkeitseinstellung. Folgende Begriffe sind wichtig, damit man die Zusammenhänge besser erkennen kann:

ISO-Wert:
Der ISO-Wert gibt die Empfindlichkeit an. Das bedeutet, er definiert, wie Lichtempfindlich ein Medium, Filmmaterial oder Sensor ist. Je höher der ISO-Wert, desto weniger Licht benötigt der Bildsensor. Häufig vorkommende Werte sind etwa 25, 50, 100, 200, 400, ... 12'800 usw.

Verschlusszeit:
Mit der Verschlusszeit kann definiert werden, wie lange ein Medium dem Licht ausgesetzt wird. Es wird hier auch von der Belichtungszeit gesprochen. Gängige Verschlusszeiten (in Sekunden) sind 30, 15, 8, 4, 2, 1/2, 1/4, ... 1/2000 usw.


Blende:
Die Blende befindet sich im Objektiv. Mit dem Blendenwert wird eingestellt, wie weit die Blende geöffnet ist. Je weiter sie geöffnet ist, desto mehr Licht fällt auf das Medium. Ist die Blende nur wenig geöffnet, fällt in der gleichen Zeit auch weniger Licht auf das Medium. Die Blendenwerte sind folgendermassen definiert: f/1, f/1.4, f/2, f/2.8, f/4,... f/32 usw. Wobei ein tiefer Wert (f/1) bedeutet, dass die Blende weit geöffnet ist und ein grosser Wert (f/32), dass die Blende nur ganz klein ist.



Blendenöffnung


Macht man ein einfaches Foto, reicht es aus, bei der Kamera den Automatikmodus zu wählen. Will man hingegen qualitativ hochwertige Fotos erzielen, ist es einen Versuch wert, an den eben genannten Einstellungen zu schrauben, um das bestmögliche Resultat erzielen zu können.

Ist der ISO-Wert, also die Empfindlichkeit, tief, erhält man eine bessere Bildqualität. 
Der ISO-Wert muss aber unter Umständen erhöht werden, falls die Belichtungszeit für ein Foto zu hoch sein sollte, man aber lieber eine kurze Belichtungszeit haben möchte. Die Belichtungszeit kann sich unter Umständen verlängern, wenn z.B. das Objekt schlecht beleuchtet sein sollte.
Hat man einen tiefen ISO-Wert eingestellt, so sind die Farben grundsätzlich kräftiger und das Bild wird schärfer.

Die Verschlusszeit bestimmt die Zeit, in welcher Licht auf das Medium einfällt. Eine kurze Verschlusszeit lässt den Verschluss nur kurz offen, was bedeutet, das weniger Licht einfallen kann, als wenn der Verschluss länger offen und somit die Verschlusszeit höher ist. Eine kurze Verschlusszeit sorgt dafür, dass sich Objekte in Bewegung einfacher scharf stellen lassen. Beispielsweise bei einem vorbeifahrenden Auto wird etwa eine Verschlusszeit von 1/2000s verwendet. Möchte man das Fliessen eines Bachs festhalten, bietet sich eine längere Verschlusszeit an (z.B. 1/15s). Wendet man eine kurze Verschlusszeit an, wird das Wasser auf dem Foto sehr starr aussehen.

Mittels Blendenöffnung wird das Licht, das auf das Medium fällt, reguliert. Bei einem kleinen Blendenwert (z.B. f/1.4 -> Blende weit offen) können Motive isoliert werden. Dadurch werden Vorder - und Hintergrund unscharf und nur das Motiv scharf. Mit einem grossen Blendenwert (f/22 -> Blende wenig offen) wird eine grössere Schärfentiefe erreicht, was sich bei Landschaftsaufnahmen gut eignet, da so Vorder- und Hintergrund scharf abgebildet werden.

Je nachdem, wie die Lichtverhältnisse sind, können die eben genannten Einstellungen manipuliert werden, um bessere Ergebnisse zu erzielen. Wenn wenig Licht vorhanden ist, hat man die Möglichkeit, die Verschlusszeit zu verlängern, die Blende weiter zu öffnen oder den ISO-Wert zu erhöhen. Wie vorhin beschrieben, bringt jede dieser Einstellungen noch andere Vor- bzw. Nachteile mit sich. Es kommt daher immer darauf an, was und wie man etwas fotografieren will, um die richtige Einstellung vorzunehmen.

Nachfolgend wird mit dem Belichtungsdreieck grafisch festgehalten, wie sich die drei Werte zueinander verhalten.



Belichtungsdreieck



Ein letztes Beispiel soll nochmals zeigen, wie die drei Werte eingesetzt werden können. Angenommen man möchte bei eher schlechteren Lichtverhältnissen und einer windigen Umgebung eine Blume resp. deren Blüte fotografieren. Das Foto soll möglichst scharf werden, da nur die Blüte darauf zu sehen sein soll. Also wird man als erstes eine wenig geöffnete Blende wählen, das heisst einen hohen Blendenwert, etwa f/11. Weil der Wind die Blüte bewegt, muss die Belichtungszeit möglichst klein sein, z.B. 1/2000s. Da die Lichtverhältnisse nicht optimal sind und nur noch der ISO-Wert übrig bleibt, wird dieser hochgeschraubt auf z.B. 3200. Beim ISO-Wert gilt immer, so tief wie möglich und so hoch wie nötig einstellen. Mit diesen Einstellungen sollte es gelingen, eine gute Nahaufnahme mit hoher Bildqualität zu erreichen.

Diese Techniken setzten wir im Modul 152 ein, um möglichst gute Fotos zu machen. Danach werden die Fotos (im .raw-Dateiformat) noch mit Adobe Lightroom bearbeitet, um Eigenschaften wie Lichtverhältnisse, Sättigung, Kontrast, Körnung etc. anzupassen. Zum Schluss werden die fertigen Bilder dann auf einer eigens kreierten Website hochgeladen.

Mittwoch, 1. März 2017

Februar 2017 - Assembler

Wie in jedem neuen Semester haben wir in der Schule im achten und letzten Semester einige neue Module begonnen. Das Modul "121 Steuerungsaufgaben bearbeiten" behandelt vor allem das Thema Assembler, daher werde ich in diesem Blogeintrag darüber schreiben.

Assembler

Zunächst muss man unterscheiden zwischen Assembler und Assemblersprache. Beim Assembler spricht man von einem Computerprogramm, das die Assemblersprache in eine für Maschinen verständliche Maschinensprache übersetzt. Die Assemblersprache wird von Entwicklern verwendet, um die Programme für Maschinen zu schreiben. In der Praxis wird oft von Assembler gesprochen, wenn eigentlich die Assemblersprache gemeint ist.
Assembler bzw. die Assemblersprache wird dazu benötigt, um direkt auf Mikroprozessorebene zu programmieren. Das heisst, es wird kein Betriebssystem, Compiler, Interpreter etc. benötigt (was bei höheren Programmiersprachen der Fall ist), um Befehle ausführen zu können. Beispielsweise werden Ampeln mit Mikroprozessoren und folglich auch mit Assembler betrieben. 
Die Assemblersprache unterscheidet sich von der Maschinensprache insofern, als die Befehle hier immer noch in einer verständlichen Textform und nicht etwa in einer binären Schreibweise dargestellt werden. Die Assemblersprache gilt als Programmiersprache der zweiten Generation, da sie Nachfolger der direkten Programmierung mit Zahlencodes ist. Die Übersetzung mittels Assembler von Assemblersprache in Maschinensprache ist 1:1. Die Assemblersprache wird im Alltag häufig fälschlicherweise auch als Maschinensprache bezeichnet.

Programme, die mit einer Assemblersprache geschrieben sind, zeichnen sich dadurch aus, dass alle Verarbeitungsmöglichkeiten des Mikroprozessors genutzt werden. Weiterhin können solche Programme auch Hardwarekomponenten direkt ansteuern. Die Nutzung von Assemblersprachen ist heutzutage kaum mehr erforderlich, da auch die höheren Programmiersprachen sehr hardwarenah eingesetzt werden können. Je nach System macht es aber durchaus Sinn, Assembler zu verwenden. Beispielsweise bei zeitkritischen oder sehr hardwarenahen Programmen oder auch falls für die Programme nicht sehr viel Speicherplatz zur Verfügung steht. Ältere technische Anlagen werden noch häufig damit gesteuert.

Da jede Computerarchitektur unterschiedlich ist, hat auch jede Computerarchitektur ihre eigene Assemblersprache. Sie unterscheiden sich in Anzahl und Typ der Operationen.
Die grundlegenden Operationen sind bei allen alle Assemblersprachen gleich:
- Daten lesen & schreiben aus/in den Prozessor von/nach Hauptspeicher
- einfachste logische Operationen - AND/OR/NOT/SHIFT
- einfache Kontrolle des Programmflusses (durch Flags -> Sprünge, Overflow etc.)
- einfache arithmetische Operationen (Additionen, Vergleiche etc.)


Bei Steuerungsaufgaben wird nach dem EVA-Prinzip gearbeitet, Eingabe, Verarbeitung, Ausgabe.
Konkreter bedeutet dies, dass ein Sensor, für die Eingabe, ein Prozessor zur Verarbeitung, und ein Aktor für die Ausgabe verwendet werden. 

Ein einfaches Beispiel kann etwa der Taschenrechner sein. Als Eingabe wird der Tastendruck des Benutzers registriert. Der Prozessor verarbeitet diese Eingabe, indem er den entsprechenden Befehl ausführt. Zum Beispiel "Speichere die Zahl 2 und zeige sie an". Anschliessend wird der Prozessor dem Bildschirm eine 2 zurückgeben, die er anzeigen soll.






Programmierung mit Assembler

Der wohl am häufigsten genutzte Befehl in der Assemblersprache ist der mov-Befehl. Er wird verwende um den Wert des einen Operanden in den anderen Operanden zu kopieren. Der mov-Befehl sieht folgendermassen aus:


mov op1, op2

"op1" und "op2" stellen die Operanden dar und haben je nach System einen anderen Namen. Bei diesem Befehl wird der erste Operand auch als Zieloperand bezeichnet und der zweite als Quelloperand. Da der Wert kopiert wird, müssen auch beide Operanden derselben Grösse entsprechen. Hat der Quelloperand 8 Bit, so muss auch der Zieloperand 8 Bit gross sein.

Ein weiterer oft benutzter Befehl ist der xchg-Befehl. Dieser wird gebraucht, um die Werte der angegebenen Operanden zu vertauschen. Die Syntax ist gleich dem vorherigen Befehlt und sieht folgendermassen aus:

xchg op1, op2


Um einen besseren Einblick darüber zu erhalten, was es alles für Register, Flags, Pointer etc. gibt, ist nachfolgend ein Teil des Debuggers vom Assembler abgebildet.



Hier sind alle Register etc., die ein Assemblersystem verwendet, aufgelistet. Die erste Zeile stellt das Daten- sowie Stackregister dar. Je nach Aufruf unterscheidet sich der Inhalt der Register. Ausnahme ist das BX-Register, welches immer auf null gestellt ist. Das CX-Register gibt die Grösse des Programmcodes an.
Die nächste Zeile zeigt die Segmentregister an. Diese beinhalten Daten wie Programmcode, konstante Daten etc. Das IP-Segment (Instruction Pointer) zeigt an, an welcher Stelle sich das Programm im Code befindet. Dahinter kommen verschiedene Flags, Overflow Flag, Sign Flag, Interrupt Flag, Zero Flag etc.
In der letzten Zeile sieht man links zuerst die Adresse des Befehls und danach, welcher Befehl als nächstes folgt.
In diesem Beispiel sieht man, dass als Befehl "mov AX, 5522" folgen wird. Das Ergebnis sieht dann folgendermassen aus:



Man kann nun sehen, dass das Register AX,  oben links, nun den Wert 5522 angenommen hat. Man kann mit der Assemblersprache natürlich viel umfangreichere Programme erstellen, z.B. auch ein klassisches "Hello World". Dazu werden natürlich entsprechende Ausgabegeräte gebraucht (z.B. Monitor).

Freitag, 27. Januar 2017

Januar 2017 - Android Studio

Da ich für meine IPA (individuelle praktische Arbeit) eine Android-App entwickeln werde, schreibe ich diesen Monat in meinem Blogeintrag über die Entwicklungsumgebung, welche ich verwenden werde, und die dazugehörigen Programmiersprachen.

Android Studio

Allgemeines:

Android Studio ist die kostenlose, offizielle Entwicklungsumgebung für Android-Apps. Sie wurde von Google entwickelt und ist im Jahr 2013 erschienen. Es ersetzt unter Anderem das Android Developement Tool (ADT), welches für Eclipse als Plugin verfügbar war.
Die Systemvoraussetzungen sind recht hoch, da vor allem der integrierte Android-Emulator sehr viele Ressourcen beansprucht.

Systemvoraussetzungen:

Arbeitsspeicher:                mind. 2GB, empfohlen 8GB
Speicherkapazität:            mind. 2GB, empfohlen 4GB
Bildschirmauflösung:         mind. 1280 * 800 Pixel

Empfohlen wird ein 64 Bit Betriebssystem


Entwicklung:

Startet man die Anwendung, sieht es folgendermassen aus:


(Klicken zum Vergrössern)

Hier ist bereits ein neues Projekt, ein klassisches "Hello World", angelegt.
Auf der linken Seite ist der Projektmappen-Explorer zu sehen. Hier sind alle notwendigen Dateien vom Projekt in einer vordefinierten Ordnerstruktur abgelegt. Rechts davon kann man den Inhalt der geöffneten Datei sehen.
Die geöffnete Datei ist eine sogenannte Activity. Activities sind Java-Dateien. Hier steckt die eigentliche Logik der App drin. Meist ist eine Activity genau eine Java-Klasse, die Methoden, den Konstruktor, Variablen etc. beinhaltet. Java-Dateien befinden sich in der Ordnerstruktur unter "app/java". Von einer Activity aus kann auf die Elemente auf dem Bildschirm wie Textfelder, Eingabefelder, Buttons usw. zugegriffen werden. Startet man die Applikation mit dem mitgelieferten Android-Emulator, wird folgende Seite präsentiert:

(Klicken zum Vergrössern)

Man kann sehen, dass sich bereits ein Textfeld mit dem Text "Hello World!" auf einer ersten Seite befindet. Diese Seiten, auf denen Steuerelemente platziert sind, werden "Layouts" genannt. Layouts befinden sich in der Ordnerstruktur unter "app/res/layout". Der "res"-Ordner (Resources) ist neben dem Java-Ordner einer der wichtigsten. Hier sind vordefinierte Inhalte von Variablen (Strings, Arrays, Int,...), Bilder, Farb- und Styledefinitionen sowie andere binäre Dateien abgelegt.
Zurück zum Layout. Das Layout, wie auch die meisten anderen Dateien im "res"-Ordner, ist eine XML-Datei und sieht wie folgt aus:



(Klicken zum Vergrössern)



Die Ansicht kann zwischen Texteditor und Designer mit den Schaltflächen unten links geändert werden. Es wird häufiger der Texteditor zum Bearbeiten verwendet, da man so genauer angeben kann, wie es aussehen soll. Zur besseren Ansicht ist hier nochmal der Ausschnitt aus dem Texteditor:

(Klicken zum Vergrössern)

Zuoberst wird die XML-Version definiert. Direkt darunter fängt das eigentliche Layout an. Hier wird ein RelativeLayout definiert. Es gibt diverse Layouts,, die verwendet werden können, wie LinearLayout, TableLayout, GridLayout etc. Die Layouts definieren, wie die Elemente, die darin enthalten sind, dargestellt werden. Also entweder vertikal, horizontal, in einer Tabelle oder sonst wie.
Im RelativeLayout-Element befindet sich ein View-Element. Das View-Element hier ist eine TextView. TextViews sind ähnlich wie Labels in anderen Entwicklungsumgebungen wie z.B. VisualStudio. Der TextView werden hier drei Eigenschaften mitgegeben: Die Breite, die Höhe und der Text. Die Breite und die Höhe sind als "wrap_content" definiert. Das bedeutet, dass die View genau so breit und hoch ist, wie der Text darin Platz benötigt. Die dritte Eigenschaft, "text", wird hier direkt zugewiesen, damit die View "Hello World!" anzeigen kann. Eigentlich werden solche Texte in einer eigenen Datei (strings.xml) im res-Ordner gespeichert und dann von der TextView ein Verweis darauf gemacht. Dieser könnte dann zum Beispiel so aussehen: "android:text="@string/hello_world_text"". Das @-Zeichen sagt aus, dass sich das Gesuchte in der strings.xml-Datei befindet.
Die String Datei würde folglich so aussehen:




Der erste String ist immer automatisch der Name der Anwendung, hier "Demo Application". Der zweite ist, nun neu definiert, der Text "Hello World!".
Man könnte natürlich die Texte direkt bei den jeweiligen Views definieren, jedoch erleichtert der Umweg über die strings.xml-Datei die Umsetzung einer Applikation, die mehrsprachig sein soll.

Alle Eigenschaften eines Elements haben folgende Konvention: "android:*****", die Sterne ersetzen die jeweilige Eigenschaft. Im Relative Layout kann man noch eine der wichtigeren Eigenschaften sehen, die Id. Die Id wird immer wie folgt definiert: "android:id="@+id/*****"", die Sterne stehen hier für einen beliebigen Text, der später dann die Id wird. Allen Elementen kann optional eine Id gegeben werden, diese wird benötigt, um dann später von der Activity darauf zuzugreifen. Da die Id aber so als Eigenschaft nicht wirklich existiert, wird nach dem @-Zeichen noch ein "+" geschrieben.


Zusammenfassend: Es ist eine feste Ordnerstruktur vorgegeben, die die verschiedenen Dateien an den richtigen Orten hält. Activities sind Java-Klassen, die die Logik beinhalten und auf Elemente des Layouts zugreifen können. Layouts sind XML-Dateien und definieren, wie die Bildschirmseiten am Ende aussehen sollen. In ihnen befinden sich verschiedene Elemente wie Textfelder, Labels und Buttons. Variablen sollten im "res"-Ordner in dafür vorbestimmten XML-Dateien definiert werden, um von Layouts oder Activities darauf zugreifen zu können. (Gilt vor allem für Konstanten und Variablen, die nicht direkt in der Programmlogik verwendet werden.)


Eine essentielle Datei, die die Applikation lauffähig macht, ist eine weitere XML-Datei, das AndroidManifest. Sie befindet sich in "app/manifest". Hier sind die Eigenschaften der ganzen Applikation hinterlegt. Diese Datei muss auch bearbeitet werden wenn neue Activities hinzukommen. Diese müssen dann in der AndroidManifest.xml-Datei erfasst werden. Weiterhin ist hier definiert, welches die Startactivity ist. Standardmässig sieht eine AndroidManifest-Datei so aus:



Man kann sehen, dass hier Dinge wie das Icon, das App-Theme, der Name usw. definiert sind.


Zugriff auf res-Dateien

Da im AndroidManifest festgelegt ist, welche Activity bei Anwendungsstart gestartet werden soll, muss folglich die Activity eine Verbindung zum Layout herstellen (und nicht etwa umgekehrt).
Dies geschieht in der überschriebenen "onCreate"-Methode der Klasse:




Die erste Zeile der onCreate-Methode ruft die gleichnamige Methode der abgeleiteten Klasse "Activity" auf und übergibt dieselben Parameter, wie diese Methode bekommen hat. Dieses Szenario findet bei fast jeder überschriebenen Methode statt.
Die zweite Zeile ist schon wesentlich interessanter. Hier wird mit der Methode "setContentView" das Layout übergeben. Man erkennt hier im Übergabe-Parameter, wie genau auf Daten im "res"-Ordner zugegriffen wird. Mit dem vorangehenden "R" wird angegeben, dass es sich um eine Ressource handelt. "layout" ist der betreffende Ordners in dem die Datei gespeichert ist. Zuletzt folgt noch der Name der Datei.