wtfcfh - Kundenzentriertes Frontend-Framework
Für die Frontendentwickler
will byers stan first human second
One Nice Bug Per Day

#extradirty
Claire Keane
sheepfilms
Show & Tell
Three Goblin Art
hello vonnie
h

@theartofmadeline
I'd rather be in outer space 🛸
almost home
Mike Driver
macklin celebrini has autism

JBB: An Artblog!
RMH
wallacepolsom

ellievsbear
todays bird
Cosmic Funnies
seen from United States

seen from United States

seen from United States
seen from United States

seen from United States

seen from United States
seen from United States
seen from United States

seen from United States
seen from United States
seen from United States
seen from United States
seen from United States
seen from United States

seen from United States

seen from United States
seen from Netherlands
seen from United States

seen from Malaysia

seen from United States
@fachinformatikerausbildung
wtfcfh - Kundenzentriertes Frontend-Framework
Für die Frontendentwickler

Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
Free to watch • No registration required • HD streaming
Neulich im Ticketsystem:
Projektmanager (vor 23 min): Kunde gibt grünes Licht, kann losgehen!
Projektmanager (vor 10 min): STOP!
Projektmanager (vor 1 min): Weitermachen!
Lehrbücher für (fast) umsonst
Ich gehe davon aus, dass das Vorgehen, das ich hier beschreibe, schon zum normalen Vorgehen für viele gehört, aber vielleicht ist es ja für manche eine neue Idee.
Mein Bluetooth Kopfhörer hat den Geist aufgegeben - von einem Tag auf den nächsten kam plötzlich kein Ton mehr aus dem linken Lautsprecher. Ich bin schwer Hörbuch- und Podcast-abhängig, und nach der ersten Woche von Entzugserscheinungen entschloss ich mich, einen neuen Kopfhörer zu kaufen.
Ich bin bequem und bestelle vieles bei Amazon (davon abgesehen, dass es dort fast alles günstiger gibt als im Elektro-Fachmarkt vor Ort). Kurz zur Auffrischung: Bücher werden bei Amazon immer versandkostenfrei verschickt, Bestellungen über 29 Euro sind ebenfalls versandkostenfrei, alles andere kostet 3 Euro Versand, oder mehr, wenn man für Premium zahlen will.
Tollerweise gibt es bei Amazon aber auch Bücher, die über den Marketplace von anderen Händlern angeboten werden, aber von Amazon versendet werden. So habe ich also ein gebrauchtes Trainingsbuch zur Sicherheit von Suse Linux gefunden, Versand über Amazon, Kosten 3,12 €
Gegenübergestellt: Kopfhörer allein: 19,99 € (16,99 € für das Produkt + 3 € Versand) Buch allein: 3,12 € (Versandkostenfrei) Kopfhörer + Buch: 20,11 € (weil jede Amazon Lieferung die ein Buch enthält versandkostenfrei ist)
Für ein paar Cent mehr kann man also mit ein wenig Glück einen echt netten Deal rausschlagen.
Geschafft
Am 29.01. habe ich die mündliche Abschlussprüfung zum Fachinformatiker abgelegt und bestanden.
Ich bin nun hochoffiziell FISI =D (und derzeit Joblos, aber das ändert sich auch bald, bin da zuversichtlich)

Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
Free to watch • No registration required • HD streaming
Vorsatz fürs neue Jahr:
Ich nehme mir vor, dieses Jahr mindestens ein Weiterbildungszertifikat zu erarbeiten. Vielleicht auch mehrere. Vielleicht auch ein Fernstudium aufzunehmen. Kurz: Ich nehme mir vor, mich auch nach der Ausbildung weiter zu bilden.
CygWin = WIN! (und curl hilft dabei)
Ich höre gerne den Security Now! Podcast. Dafür lade ich mir die low quality Versionen von der Seite. Kürzlich muss sich dort etwas geändert haben, jedenfalls kann ich nicht mehr rechts klicken und speichern unter... wählen - stattdessen bekomme ich eine 7 kB große Datei von Podtracker oder sowas.
Ich kenne den Speicherort auf dem http Server, ich weiß wie die Dateien heißen... also wie lade ich die nun runter, ohne jede einzelne Episode anzuklicken, auf Seite->Speichern unter... zu gehen und den Back-Button zu benutzen?
CygWin! CygWin stellt unter Windows eine bash-Umgebung zur Verfügung, ich kann also mit Linux Werkzeugen unter Windows arbeiten.
Also den Cygwin Installer angeschmissen, ein paar zusätzliche Pakete installiert (curl) und los geht's. In meinem Fall:
cd cygdrive/f curl https://media.grc.com/SN/sn-4[01-58]-lq.mp3 -O mit dem cd cygdrive/... Befehl wechsele ich in ein Verzeichnis auf meiner Festplatte, in meinem Fall also einfach in die Festplatte F: curl, gefolgt von der Adresse, von der heruntergeladen werden soll - und weil ich mehrere Dateien haben will, kann ich sogar reguläre Ausdrücke verwenden (hier also alle Dateien von 401 bis 458). Die Option -O gibt an, dass diese Dateien im aktuellen Verzeichnis unter ihrem ursprünglichen Namen gesichert werden sollen.
Und fertig. HIMMEL war das simpel! Hätte ich schon viel früher drauf kommen können... Merke: CygWin = WIN!
LFS reborn
Ich war superschlau! Ich habe vor ein paar Monaten einen neuen Rechner bekommen und meine alten Festplatten eingebaut, um meine ganzen Daten zu haben. Natürlich musste ich Windows neu installieren, und damit das auch problemlos klappt, habe ich meine Platte C formatiert.
Die Platte C, die unter anderem mein Benutzerverzeichnis enthielt...
In dem unter anderem meine Linux VM gespeichert war, auf der ich LFS gebaut habe...
Und das, wo ich gerade zu 80% mit dem Compilieren durch war...
Ich habe mich geärgert und fange entsprechend noch einmal an. In der nächsten Zeit geht es also mit der Doku weiter.
Kostenlose Zertifizierung VMWare VCA
VMWare bietet derzeit kostenloses Training und Zertifizierung auf Associate-Ebene (VCA) in den Bereichen Cloud, Data-Center-Virtualization und End-User-Computing an. Training und Prüfung finden online statt. Dafür ist die Registrierung auf mylearn.vmware.com nötig. Mir bekannte (aus dem Internet zusammengeklaubte) Coupon Codes für die Prüfungen: VMRT9B503121 VCA13GKN VCA13BCN VCA13ICS Diese Coupons sollen zum Teil bis Ende November 2013, zum Teil bis Ende Januar 2014 gültig sein, wer Interesse hat sollte sich also beeilen!
Edit: Die oben aufgeführten Codes scheinen entweder nicht in Deutchland zu funktionieren, oder wurden schon über 1000 Mal benutzt und sind nun ungültig. Eine Zertifizierung ist mit diesen Daten leider nicht möglich!
Linux from scratch - A New Hope
Auf meinem Schreibtisch steht eine dampfende Tasse Kaffee-Ersatzstoffes, der in einigen Teilen der Republik als "Muckefuck" bezeichnet wird. Grund genug, sich weiter mit Linux zu befassen!
Mit "mkdir -v $LFS/tools" erstelle ich ein neues Arbeitsverzeichnis, in das ich benötigte Programme compilieren werde. Dieses Verzeichnis verlinke ich auf Root, so dass ich es über /tools erreichen kann, obwohl es sich unter /mnt/lfs/tools befindet. Der Befehl ist "ln -sv $LFS/tools /" - ln erzeugt den Link, die Option -s macht den Link symbolisch. Wie immer wähle ich -v um eine Rückmeldung vom System zu bekommen, was tatsächlich gemacht wurde. Dann gebe ich das Verzeichnis an, auf das gelinkt werden soll und das Verzeichnis, wo der Link abgelegt wird (hier root).
Schon Spiderman wusste: "With great power comes great responsibility" - und ich bin einfach nicht bereit dafür, immer als superuser in meinem System unterwegs zu sein, darum lege ich mir einen neuen Benutzer an, auf dem ich von nun an arbeite. Per "groupadd lfs" erzeuge ich eine neue Benutzergruppe, speziell für linux from scratch. Mit "useradd -s /bin/bash -g lfs -mk /dev/null lfs" lege ich den Benutzer an. -s /bin/bash definiert die Standardshell dieses Users, -m erzeugt für den User ein home-Directory und -k /dev/null sorgt dafür, dass keine etwaigen Standarddateien aus einem Skeleton Verzeichnis in das neue home Verzeichnis kopiert werden (das skeleton directory wird auf /dev/null verwiesen - ein Sondergerät, das einfach alles verwirft, was ihm über den Weg läuft). Mit "passwd lfs" lege ich nun für meinen Benutzer ein Passwort an. Ich habe "123Forever!" gewählt, weil es schnell getippt ist und in den gängigen Distributionen die Voraussetzungen für ein sicheres Passwort erfüllt.
Mein neuer User "lfs" wird nun zum Eigentümer des Tools Verzeichnisses gemacht. Dafür rufe ich "chown -v lfs $LFS/tools" auf. Ausserdem gebe ich ihm das sources Verzeichnis mit "chown -v lfs $LFS/sources"
Jetzt geht's ans Eingemachte: cat > ~/.bash_profile << "EOF" exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash EOF Ich erzeuge hier ein neues bash Profil für den User lfs. In diesem Profil befinden sich keine Umgebungsvariablen, ausser HOME, TERM und PS1. Damit wird sichergestellt, dass keine unvorhergesehenen Nebenwirkungen von anderen Variablen Einfluss auf meinen Build haben.
Und weiter: cat > ~/.bashrc << "EOF" set +h umask 022 LFS=/mnt/lfs LC_ALL=POSIX LFS_TGT=$(uname -m)-lfs-linux-gnu PATH=/tools/bin:/bin:/usr/bin export LFS LC_ALL LFS_TGT PATH EOF
Mit set +h wird Hashing ausgeschaltet. So orientiert sich die Shell nur noch an der PATH Variablen und nicht mehr an gespeicherten Werten (ich will ja mit den neu compilierten Tools arbeiten, und nicht mit Programmen, die auf meiner Maschine irgendwoanders installiert sind. umask 022 setzt die Standardberechtigungen so, dass owner alles darf, group und everyone aber nur lesen und ausführen. LC_ALL=POSIX sorgt für kompatibilität mit älteren glibc Versionen auf dem Hostsystem: LFS_TGT definiert den Namen des Systems Indem das /tools/bin Verzeichnis der PATH Variablen hinzugefügt wird (vor allen anderen), sucht das System zuerst dort nach aufgerufenen Programmen - wir zwingen also die Umgebung in das neu erzeugte System und ignorieren soweit möglich das Hostsystem, auf dem wir arbeiten.
Beim nächsten Start werde ich zunächst "source ~/.bash_profile" eingeben, um das gerade erzeugte Profil in die aktuelle Arbeitsumgebung zu laden.
Mein falscher Kaffee ist nun seit bestimmt einer halben Stunde kalt. Mist.

Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
Free to watch • No registration required • HD streaming
Linux from scratch - Teil 2
Die Festplatte zum Arbeiten steht, das Dateisystem ist vorbereitet, und es existiert sogar eine Umgebungsvariable mit dem Pfad, den wir von nun an verwenden wollen. Auf ins Gefecht - Teil 2!
Um den ganzen Quellcode zu sichern, lege ich ein neues Verzeichnis unter /mnt/lfs/sources an, indem ich "mkdir $LFS/sources" aufrufe. Die Umgebungsvariable lohnt sich! Dieses Verzeichnis mache ich nun für alle Benutzer beschreibbar, lege aber fest, dass nur der Eigentümer Dateien löschen darf. Dafür gibt es das sogenannte "Sticky Bit", das am Anfang der Berechtigungen steht. Kurz mit "chmod -v a+wt $LFS/sources" die Rechte gesetzt und weiter.
Die ganzen Pakete (immerhin über 70) möchte ich nicht von Hand installieren. Zum Glück bieten die Autoren von LFS eine Liste zum Download an, so dass Linux sich gleich die Pakete selber saugen kann. Zum Download der Liste habe ich Iceweasel benutzt; das war mir über die command line dann doch zu doof. Weil das Dokument aber nun in meinem Downloads Ordner lag, konnte ich gleich mit "mv /home/cuy/Downloads/wget-list $LFS" das Dokument in meinen Projektordner schieben.
Nun rufe ich "wget -i wget-list -P $LFS/sources" auf und stelle fest, dass bash nun schwer mit dem Download beschäftigt scheint. Ich nutze die Zeit und rufe mir die man page von wget auf (ich will ja wissen, was ich da gerade abgetippt habe). Dabei finde ich heraus, dass wget "rekursiven Download" unterstützt, also das Herunterladen von mehreren Unterverzeichnissen erlaubt und die Dateien auf dem Zielsystem in der gleichen Ordnerstruktur ablegt, wie es sie auf dem Server vorgefunden hat. Ich wünsche mir ein solches Feature in Firefox... Die Option -i gibt an, dass die Quelladresse aus einer Datei gelesen werden soll. -P sorgt dafür, dass die Downloads in meinem sources Verzeichnis gesichert werden, unabhängig davon, wo ich mich gerade im Dateisystem befinde (-P steht für "prefix").
Nach fünf Minuten und 315 MB hat wget seine Aufgabe getan (danke, high-speed Internet!). LFS bietet zudem die Möglichkeit, die Pakete auf ihre md5 Summe zu prüfen. Diesen Schritt übergehe ich, weil ich dem Buch soweit vertraue (ist ja nur 'ne VM).
Damit ist auch dieses Kapitel erfolgreich abgeschlossen. In den nächsten Tagen geht es dann mit den abschließenden Vorbereitungen weiter, bevor ich mich an den Compiler setze!
Linux from scratch
Es gibt da ein tolles Buch: Linux From Scratch. Darin geht es darum, sich eine eigene Linux Distribution zusammenzubauen, und zwar selbstcompiliert vom Quellcode. Ich habe gerade angefangen dieses Buch durchzuarbeiten, und werde hier nachvollziehen, was ich gemacht habe, und welche Verständnisprobleme ich hatte. Mein Ausgangssystem ist eine Debian Installation in VirtualBox. Die VM hat zwei Festplatten (8GB für das Debian System, 10 GB zum drauf arbeiten) - natürlich hätte ich auch eine größere Festplatte nehmen und partitionieren können; damit hätte ich mir sogar ein wenig Ärger gespart. Aber ich hatte die Debian Installation eigentlich gemacht, um C zu üben, da war die Festplattengröße noch nicht so wichtig. Ich versuche, die gesamte anfallende Arbeit in bash zu erledigen.
Mein erstes Problem war, festzustellen, was nun genau die neue Platte ist. Einige Internetsuchen gingen ins Land, bis ich herausfand, dass ich mir alle eingebauten Festplatten mit dem Befehl "fdisk -l" ansehen kann. EIDE Platten heissen hier "hdx", SATA und SCSI Platten hingegen "sdx", wobei x ein fortlaufender Bezeichner ist (also sda für die erste Festplatte, sdb für die Zweite, sdc für die Dritte und so fort). Dieser Bezeichnung folgt eine fortlaufende Zahl - die Nummer der Partition auf der Platte. sda1 ist also die erste Partition auf der ersten Festplatte, sdc4 wäre demnach die vierte Partition auf Festplatte Nr. 3.
Formatieren und partitionieren einer Festplatte geht recht einfach mit "cfdisk". Weil ich die zweite Festplatte formatieren wollte, lautete der passende Befehl "cfdisk /dev/sdb" (Die Festplatte ist, auch wenn sie noch nicht gemountet ist dennoch ein Gerät, das unter "devices", also /dev, aufgezählt wird).
In cfdisk erstelle ich nun einfach durch Auswahl von [New] eine neue Partition, mache sie [Primary] und so groß wie ich sie gern hätte. Weil Debian schon eine swap Partition erstellt hat, brauche ich mich darum nicht zu kümmern und gebe der Partition die volle Festplattengröße von 10 GB. Dann setze ich die [Bootable] Flag und beende das Programm nach dem [Write] Vorgang, damit die Änderungen auf die Festplatte geschrieben werden. Das alles lässt sich auch ohne Probleme mit fdisk erledigen (fdisk /dev/sdb) - mit "m" wird die Liste der verfügbaren Optionen angezeigt.
Nun muss ich das ganze formatieren. Dafür gibt es den "Make Filesystem" Befehl "mkfs". Ich hätte die Partition gerne in ext3 formatiert (-t für "Type"), damit ist der vollständige Befehl "mkfs -t ext3 /dev/sdb1".
Mit "export LFS=/mnt/lfs" setze ich eine Variable, die den zukünftigen Einhängepunkt (mount point) enhält. Mit dem "Make Directory" Befehl (mkdir) lasse ich nun dieses Verzeichnis erzeugen. Sollte ich einen Pfad definieren, den es noch nicht gibt, so setze ich vorsichtshalber die Option -p (Parent) um etwaige übergeordnete Ordner gleich mit zu bauen. Und wenn wir schon dabei sind setzen wir auch gleich -v (Verbose), um eine Rückmeldung über die Operation zu erhalten. Damit lautet der Befehl "mkdir -pv $LFS" Abschließend noch "mount -vt ext3 /dev/sdb1 $LFS" um die Festplatte und den Einhängepunkt miteinander zu verknüpfen.
Und fertig! Wir haben eine zweite Festplatte partitioniert, formatiert und ihr einen Einhängepunkt zugewiesen. Im nächsten Eintrag geht es dann um den ganzen Quellcode, der für den Build benötigt wird.
Because the hard way is the easy way...
Klingt komisch, ist aber so! Die Tutorialreihe "Learn Code The Hard Way" zielt darauf ab, dass man programmieren nur lernen kann, wenn man es tut - also tippt man kleine Programme ab, deren Tücken dann erklärt werden. Aber weil man es selbst schreibt, lernt man es besser und versteht die Vorgänge ganz intuitiv. So zumindest die Theorie.
"Learn C The Hard Way" ist nur eines aus einer Reihe von Büchern zum Programmieren - andere Tutorials behandeln z.B. Ruby, SQL oder Reguläre Ausdrücke.
Zusammenfassung C
Dieses Posting wird voraussichtlich mit den Themen weiterer Unterrichtstage aktualisiert. Variablen Eine Variable ist ein Name für einen Speicherbereich. Bevor der Speicher verwendet werden kann, muss er für das Programm reserviert werden. Zu dieser Reservierung (Deklaration) wird der TYP der Variable und ihr name angegeben. Variablentypen sind z.B. int (Ganzzahl), float (Gleitkommazahl), char (Schriftzeichen)... Die Syntax zur Variablendeklaration ist "typ name;", also z.B. int meineVariable; Damit existiert nun ein Speicherbereich, der "meineVariable" genannt wird und den Typ Ganzzahl hat. Ich kann auch Schon bei der Deklaration der Variable einen Wert vergeben (Initialisierung). Der dafür benötigte Operator ist das Gleichheitszeichen "=". int meineVariable = 15; Wenn ich die Schritte aufteilen möchte, dann kann ich das auch getrennt voneinander tun: int meineVariable; meineVariable = 15; Sobald der Name einmal vergeben ist, muss ich den Typen nicht mehr mit angeben. VORSICHT!!!!!!!! Auch Schriftzeichen (char) können dank ASCII als Zahlen verstanden werden. So kann ich z.B. eine Zuweisung durchführen wie int meineVariable = 'a'; meineVariable enthält dann den Wert 97. Weil der Typ char nur ein einziges Zeichen lang ist, müssen Zeichenketten (strings) als ARRAYS von Zeichen gebildet werden - über Arrays werden wir uns zu einem späteren Zeitpunkt noch unterhalten. Vergleichsoperatoren Vergleiche werden mit folgenden Symbolen durchgeführt: == Gleichheitsprüfung - VORSICHT ein einfaches Gleichheitszeichen ist IMMER eine Wertzuweisung < linker Wert kleiner als rechter Wert? > größer als <= kleiner oder gleich >= größer oder gleich != Ungleich - das Ausrufezeichen ist immer eine Umkehrung des folgenden Ausdrucks
Eigentlich keine Vergleichsoperatoren aber trotzdem in diesem Kontext interessant sind UND ( && ) und ODER ( || ). So kann ich ein Ereignis von mehreren Faktoren abhängig machen. Beispiel: if(meineVariable < 10 && meineVariable > 0) {Toller Code} Der Code hinter der if Verzweigung wird nur ausgeführt, wenn meineVariable sowohl kleiner ist als 10 und auch größer ist als 0. Kontrollstrukturen - Schleifen Eine Schleife ist ein Block von Anweisungen (Code), der immer wieder durchgeführt wird, bis eine bestimmte, definierte Bedingung nicht mehr erfüllt ist. Es gibt drei wichtige Arten von Schleifen: while, do...while und for. while Schleifen werden entweder nicht, einmal oder mehrmals ausgeführt - je nachdem, wie die Bedingung definiert ist. Einige Beispiele: while(meineVariable < 100) { meineVariable = meineVariable + 1; } Solange also meineVariable den Wert 100 noch nicht erreicht hat, wird im Anweisungsblock der Wert von meineVariable bei jedem Durchlauf um 1 erhöht. Hat die Variable vor Beginn der Schleife bereits einen Wert größer oder gleich 100, dann wird die Schleife komplett übersprungen und es geht nach der schließenden geschweiften Klammer } weiter. Hat die Variable den Wert 99 wird die Schleife ausgeführt, die Variable um eins erhöht, die Bedingung erneut geprüft (der Wert ist nun 100, die Schleifenbedingung ist nicht mehr erfüllt) also wird auch nun die Schleife abgebrochen und das Programm nach der Schleife fortgesetzt. do...while Schleifen werden mindestens einmal durchgeführt - das liegt daran, dass die Schleife ausgeführt wird, bevor die Abbruchbedingung geprüft wird. Wieder ein Beispiel: do { meineVariable++ } while(meineVariable < 100); Unabhängig vom Wert von meineVariable wird nun zunächst der Wert um eins erhöht (++ ist eine Kurzschreibweise für "Dieser Wert +1"), bevor erst nach der schließenden geschweiften Klammer die Schleifenbedingung geprüft wird. Ist der Wert immer noch kleiner als 100, dann läuft die Schleife wieder durch. for Schleifen sind Zählschleifen. Sie sind in der Syntax etwas komplexer: for(Variablen-Initialisierung; Schleifenbedingung; Zähler) {Anweisungsblock} Ein Beispiel: for(meineVariable = 99; meineVariable >= 80; meineVariable -= 1) { CODE - 1337 Meg4 H4x0r SKILLZ } Solange also meineVariable größer oder gleich 80 ist wird der Code im Anweisungsblock immer wieder ausgeführt. meineVariable -= 1 ist ebenfalls eine Kurzschreibweise, in diesem Fall um die Variable um eins zu verringern. Anders als ++ oder -- kann ich hier aber beliebige Zahlen verwenden (es muss nicht 1 sein), oder auch andere Operatoren (z.B. meineVariable *= 2 multipliziert meineVariable mit 2). Kontrollstrukturen - Entscheidungen Für Entscheidungen (Verzweigungen im Programmablauf) werden hauptsächlich zwei Methoden verwendet: if und switch. if teilt das Programm in zwei Wege - Entweder, die if-Bedingung ist erfüllt, oder eben nicht. ist sie erfüllt, dann wird der Code in der if-Anweisung ausgeführt. Beispiel: if(meineVariable < 100) { meineVariable *=2; } Ich kann if auch mit einem alternativen Pfad versehen, einem else. if(meineVariable > 100) { meineVariable -= 10; } else { meineVariable += 10; } Hier wird eine Entscheidung getroffen: Ist meineVariable größer als 100? Dann zieh 10 ab. Ansonsten (ist die if Bedingung also nicht erfüllt) rechne 10 dazu.
Der switch fällt eine Entscheidung gemäß verschiedener Werte, die eine Variable annehmen kann. Es ist also nicht nur möglich, zwei Fälle zu unterscheiden, wie es mit if der Fall ist. Weil der switch nur präzise Werte und keine Wertebereiche annimmt, gibt es darüber hinaus auch einen Standardwert, der ausgegeben werden kann, für alle Variablenwerte ausserhalb der definierten cases. Beispiel: switch(meineVariable) { case 55: meineVariable += 45; break; case 66: meineVariable += 34; break; default: meineVariable = 100; } Im Fall dass meineVariable den Wert 55 hat, werden 45 dazu addiert. Sollte meineVariable den Wert 66 haben, werden 34 hinzugezählt. Ist der Wert weder 55 noch 66 (hat also irgendeinen Wert) wird meineVariable auf 100 gesetzt. Das Kennwort "break" ist nötig, damit die Ausführung des Codes in dieser Stelle abgebrochen wird. Ist kein break gesetzt, geht das Programm nach diesem Case auch noch durch alle folgenden Cases durch.
Logische Operatoren und Wahrheitstabellen Zur Entscheidung, ob ein Ausdruck wahr oder falsch ist (true or false) werden Vergleichsoperatoren verwendet, die wir weiter oben schon besprochen haben. Will ich aber den Wahrheitsgehalt einer Aussage von mehr als einem Vergleich abhängig machen, dann muss ich diese Vergleiche miteinander verbinden. Das mache ich mit den logischen Operatoren: - AND && - OR || - XOR ^ - NOT ! AND gibt nur dann wahr zurück, wenn beide Ausdrücke wahr sind. if(meineVariable >= 0 && meineVariable <= 100) {führe Code aus} Der Code in diesem Beispiel läuft nur, wenn meineVariable einen Wert zwischen 0 und 100 hat. Kleine Warnung: Ein Vergleich meineVariable > 0 && <100 ist nicht eindeutig und kann vom Compiler nicht interpretiert werden. OR gibt wahr zurück, wenn mindestens ein Ausdruck wahr ist. if(hunger >= 100 || Wochentag == Montag) {pizza_bestellen} Ich bestelle also Pizza wenn ich so RICHTIG hungrig bin. Ausserdem gibt es jeden Montag italienische Flachtorte, unabhängig davon, ob ich hungrig bin oder nicht. XOR ist mein kleiner Favorit, weil XOR super ist, um z.B. Paritätsinformationen zu basteln. XOR gibt dann wahr zurück, wenn einer von zwei Ausdrücken wahr ist, nicht aber beide! Ein Beispiel aus der Wirklichkeit: Eine Ampel an einer Straßenkreuzung soll entweder der einen, oder der anderen Straße grünes Licht geben. Es macht keinen Sinn wenn beide Straßen auf rot stehen, und die Ampel wäre ziemlich sinnlos, wenn beide Straßen grünes Licht bekämen. NOT kehrt den Wahrheitsgehalt der Aussage um. "Hiermit lehne ich ab, den Abbruch der nicht-Fortsetzung meiner Vertragskündigung wiederspruchslos zu verweigern..." Oder: if(!satt) {essen} Wahrheitstabellen stellen die Wahrheitswerte dieser Operatoren dar. 0 bedeutet falsch, 1 bedeutet wahr. AND 0 1 00 0 10 1 OR 0 1 0 0 1 1 1 1 XOR 0 1 0 0 1 1 1 0 NOT 0 1 1 0 Arrays Arrays sind eine Art Listen, in denen eine Variable mehrere Werte speichern kann. Um einen bestimmten Wert anzusprechen, gebe ich die Position dieses Wertes im Index der Variable an. Um ein Array zu definieren setze ich einfach die Zahl der zu speichernden Werte in eckige Klammern hinter den Namen: int meinArray[5]; Arrays sind NULL-terminiert. Das bedeutet, dass auf die letzte, genutzte Stelle im Array ein NULL Character (\0) folgt. Dies hat zur Folge, dass ich ein Array immer mindestens um eins größer definieren muss, als ich vorhabe zu benutzen. Um eine Position im Array anzusprechen, gebe ich in der eckigen Klammer den "Index" an. Hierbei ist wichtig, dass bei der Definition des Arrays "menschlich", also ab 1, gezählt wird. Bei der Positionierung zählt der Computer aber ab 0! Das bedeutet: meinArray[4] ist die letzte Position im Array, das ich oben mit 5 möglichen Werten definiert habe. meinArray ist bisher eindimensional, es ist also einfach nur eine Liste von Werten, die meine Variable annehmen kann. Ich kann ein Array aber auch mehrdimensional erstellen. int meinKalenderArray[52][7]; Ich hätte so ein zweidimensionales Array definiert, das genug Plätze für alle Wochen des Jahre hat, und darüber hinaus hat es in jeder Woche genug Platz für 7 Tage. Ich kann diesem Array beliebig viele Dimensionen geben, auch wenn ich bei über 3 Dimensionen Probleme damit habe, mir das ganze grafisch vorzustellen. Bitverschiebung C ist ein bisschen harwarenah; Ungefähr so, wie Fallschirmspringen ohne Schirm etwas riskant ist. Darum kann ich, ganz wie zu Zeiten von Computern die solche Kleinigkeiten wie eine Tastatur noch nicht brauchten, Rechenoperationen auf der Bit-Ebene durchführen. Left-shift: verschiebe ich das Bitmuster einer Zahl nach links führe ich eine Multiplikation durch - und zwar verdopple bzw. halbiere ich jeweils den Wert mit jedem Schritt. Die Anweisung zur Bitverschiebung ist ein doppelter Pfeil, der in die entsprechende Richtung weist, also << und >>. Beispiel: 0000 1000 << 1 ( die Zahl 8 ) ergibt 0001 0000 ( 16 ) oder: 0010 1101 << 2 ( 45 ) wird zu 1011 0100 ( 180 ) WOW!!! Right-shift Anders herum funktioniert es auch: 0000 1000 >> 1 ( 8 ) 0000 0100 ( 4 ) oder: 0011 1001 >> 2 (57) 0000 1110 (14) Zement mal! Da fehlt doch was?!? Genau! Welche Bits auch immer über die Begrenzung des Zahlentypen hinaus geschoben werden, werden einfach verworfen. Große Integer Werte werden plötzlich negativ (weil das Bit höchster Wertigkeit angibt, welches Vorzeichen die Zahl hat) und Gleitkommazahlen werden ganz unbrauchbar (in einer 32 Bit Gleitkommazahl codiert das erste Bit das Vorzeichen, 23 Bit die Ziffern der Zahl und 8 Bit den Exponenten, also praktisch die Position des Kommas - Wikipedia erklärts genauer). Diese Operationen sind also mit Vorsicht zu genießen.
Zeiger und Referenzen Kommen wir zu den Gehirnknoten! Eine Referenz gibt die Speicheradresse aus - ich könnte also z.B. mit &meineVariable den Hex-Code für die erste Speicherzelle auslesen, die von meineVariable belegt wird. Die erste Zelle deshalb, weil jede Speicherzelle ein Byte groß ist, die Variablen aber unterschiedliche Größen haben (z.B. int mit 4 Byte). So weit so gut - nun kann ich mir aber auch einen Zeiger basteln - ein Zeiger ist eine Variable, die eine Referenz enthält. z.B. meinSpeicher = &meineVariable; Wenn ich nun diese Speicheradresse verwenden möchte, um direkt in die Speicherzelle zu schreiben oder daraus zu lesen, setze ich ein * vor den Namen. z.B. int meinSpeicher = &meineVariable; *meinSpeicher = 12; Ich speichere die Adresse von meineVariable in meinSpeicher. Daraufhin gebe ich den Befehl, an die Adresse, auf die meinSpeicher verweist, eine 12 zu schreiben. Damit ist meineVariable nun mit der Zahl 12 überschrieben. Also: & = Speicheradresse, * = Wert, der an der Speicheradresse steht. Funktionen und Methoden Kommen wir zum spaßigen Teil des Abends: Den Code übersichtlich gestalten. Das können wir z.B. mit Funktionen und Methoden machen. Eine Funktion ist eine Anweisung (oder eine Sammlung von Anweisungen), die dem Hauptprogramm irgendeinen Wert übergeben. Eine Methode gibt dem Hauptprogramm keine Werte zurück, macht aber sonst das Gleiche. Ich definiere eine Funktion durch: - Angabe des Rückgabetypen (bei Methoden "void") - Den Namen der Funktion und - Die Liste der Parameter, die die Funktion von uns bekommt. z.B. int meineFunktion(int x, int y) {MAGIC} Die Namen der Variablen, die ich meiner Funktion übergebe sind nur lokal gültig, das heißt, ich kann der Funktion eine Variable char Schrunz geben, und die Funktion lernt sie nur als den Wert ihrer eigenen Variable Schrompf kennen. Oder Meier. Oder einfach x. Der Wert, den die Funktion zurückgibt, bestimmte ich mit dem Kennwort return. Also: int meineFunktion(int x, int y) { if(x < y) x = y; return x; } Ist x kleiner als y wird es auf den Wert von y gebracht und dann an das aufrufende Programm zurück gegeben. Ist x aber größer als y wird direkt der Wert von x zurück geliefert. Fragt mich nicht, welches Problem damit gelöst werden soll, es ist viertel vor zehn abends und ich sauge mir die Beispiele aus den Fingern! Stellen wir uns nun vor, ich hätte in meiner main Funktion folgenden Codeabschnitt: int Autos = 44; int Fahrraeder = 80; printf("\nWelche Zahl ist höher? %i", meineFunktion(Autos, Fahrraeder)); Es steht %i dort, weil der erwartete Rückgabetyp der Funktion ein int ist, und weil die Funktion die übergebenen Werte kopiert, verändert sich trotz der radikalen Operation von x = y nichts an den Werten der Variablen Autos und Fahrraeder. GEIL!
Martha Chumo, a 19-year-old self-taught programmer, was supposed to be in New York right now, honing her coding skills and mastering cutting-edge technologies in the company of fellow software enthusiasts.
Instead, she’s thousands of miles away, in her hometown of Nairobi, Kenya.
A few months ago, Chumo was accepted into the summer intake of Hacker School, a U.S.-based “retreat for hackers," where budding programmers come together for three months to write code, learn new languages and share industry insights.
Whereas the programming boot camp was free to attend, Chumo still needed to find a way to cover her trip costs and buy a new laptop. Excited and determined, the young developer turned to online crowdsourcing platform Indiegogo for funds. She set a target of $4,200 and managed to raise nearly $5,800. All she needed then was a visa to travel to the United States.
Alas, this was not to be. As an unmarried adult who was not enrolled at university, Chumo was not eligible for a U.S. tourist visa because she couldn’t show sufficient “social ties" to Kenya to prove that she was planning to return home after attending Hacker School.*
But the U.S. consulate’s refusal only served to slightly alter the plans of this passionate coder.
"I thought if I can’t go to the hacker school, let me try to bring the school to me," says Chumo. "(Let me see) what can I do to start a school here."
Within minutes of her second visa request denial, on June 4, Chumo was calling her friends to announce that, “I’m starting a hacker school in Kenya!’
A few days later, she launched another Indiegogo campaign asking people to help her set up her own school for developers in Nairobi.
"I was so frustrated because I had applied to go to Hacker School; I got into it, I raised funds to go there, I had all these plans to read and learn for three months and then I’m not allowed to go — that’s how the idea for the school was born."
(cont. reading)
*For those who don’t know how hard the visa struggle for those of us with African passports is, this is just one of the ways that we are systematically denied opportunities. Meanwhile, tourists from many Western nations are free to visit many African countries without a visa and stay for up to 90 consecutive days in some of them.
But MAJOR props to Martha Chumo for taking up the initiative to create her own opportunities.

Anya is live and ready to show you everything. Watch her strip, dance, and perform exclusive shows just for you. Interact in real-time and make your fantasies come true.
Free to watch • No registration required • HD streaming
R.I.P. Douglas Engelbart