13. July 2012: Einmal mehr: Zertifikate

Am Mittwoch war der erfolgreiche Ziel-Einlauf meines diesjĂ€hrigen ZertifizierungsMarathon. Mit bestandener PrĂŒfung zum Microsoft Certified IT Professional: Server Administrator on Windows Server 2008 bin ich zugleich auch ein Microsoft Certified Solutions Associate geworden.

MCSA Server 2008

Zugegeben, letzteres Zertifikat wird mit Veröffentlichung des neuen Windows Server 2012 hinfĂ€llig. Dennoch eine durchaus befriedigende Leistung fĂŒr ein halbes Jahr Weiterbildung. Und sobald der Kurs fĂŒr Server 2012 fertig gestellt ist, kann man seine Zertifizierung auch mit einem einzigen Test aktualisieren.

4. June 2012: Noch ein Zertifikat

Mit freundlicher UnterstĂŒtzung des Microsoft Partner Network, die mir nicht nur einen Crash-Kurs in der Materie sondern auch einen Gutschein fĂŒr eine Gratis-PrĂŒfung haben zukommen lassen, durfte ich mich am letzten Donnerstag an einer neuerlichen Zertifizierung versuchen. Diesmal Server Virtualisierung. Sehr interessant, wenn auch – was die Details betrifft – weniger umfangreich als jene fĂŒr Active Directory.

Um ganz ehrlich zu sein bin ich mehr oder weniger davon ausgangen durch zu fallen – schließlich war die Vorbereitung wenig intensiv. Unterlagen zum lernen quasi nicht existent. Und vor allem habe ich es nicht vollbracht meine Test-Umgebung aufzusetzen. Trotzdem habe ich es irgendwie geschafft die PrĂŒfung erfolgreich zu bestehen:

Ich frage mich jedoch ob das nun gegen die PrĂŒfung oder fĂŒr das White Paper zur Virtualisierung spricht. Vermutlich beides…

1. June 2012: Amerikanische Redewendungen II

Der Redewendungen zweiter Teil, diesmal mit weniger heroischem Hintergrund. Dennoch stellte sich mir dieselbe Frage: Was soll denn dieses dauernde Dibs heißen? Auch wenn es, zugegeben, wesentlich leichter aus dem Zusammenhang heraus zu verstehen ist: Erster!

Angeblich, so zumindest eine der Theorien dazu, kommt es aus dem Viehhandel: Wer zuerst seine Initialen auf ein Vieh geschrieben hat, hatte das erste Recht es auch zu kaufen. Und warum Dibs? Nun, man musste sich mit seinen Initialen im sogenannten Dealer Identification Book registrieren.

Nun, The Big Bang Theory (ĂŒbrigens eine tolle Serie) hat auch dazu etliche Szenen parat. Mein Favorit in Bezug auf Dibs:

Sheldon: This is not your office. It hasn’t been assigned yet.
Kripke: Well, I called dibs at the Christmas party when Professor Wothman tried to have intercourse with the Toys for Tots collection box.
Sheldon: Dibs?! This is a university, not a playground. Offices are not assigned because someone called dibs.
Leonard: You just called dibs.
Sheldon: Shut it.

16. May 2012: Code schreiben, Code lesen

Denkt man an Programmieren fĂ€llt einem zunĂ€chst nur die Logik ein: Der Ablauf, den ein Programm erledigen muss um ein gewĂŒnschtes Resultat zu liefern. Hat man das erreicht stellt sich meist als nĂ€chste Frage die Effizienz: Wie kann ich das Resultat möglichst schnell oder mit möglichst wenig Ressourcen erreichen? Ein eher GrundsĂ€tzlicheres Problem stellt sich schließlich bei der Implementation: Welche Namenskonventionen verwende ich fĂŒr meine Funktionieren, Variablen und Klassenbezeichnungen? Allerdings gibt es auch noch eine weitere, eher unauffĂ€llige Fragestellung: Wie kann ich mein Programm verstĂ€ndlich schreiben? Meistens wird hier auf eine ausgiebige Dokumentation oder sinnvolle Kommentare im Quellcode verwiesen – doch in der RealitĂ€t werden diese eher spĂ€rlich umgesetzt.

Auf dieser Situation aufbauend haben Robert Green und Henry Ledgard ein paar GrundsĂ€tze ĂŒber Namenskonventionen und Layout von Quellcode erstellt und in der ACM Queue veröffentlicht. Ihr Ziel war es Code so zu schreiben, dass er auch ohne Dokumentation einfach und verstĂ€ndlich nachzuvollziehen ist – nicht nur fĂŒr andere, sondern auch fĂŒr einen selbst. Wer sich jemals Jahre spĂ€ter durch den eigenen Spaghetticode wĂŒhlen musste um Modifikationen an einem Programm vorzunehmen, kann das sicherlich nur zu gut nachempfinden. Doch wie funktioniert dieser Ansatz? Ein Beispiel aus ihrer Veröffentlichung

char c1;
c1 = getChoice();
Switch(c1){
  case 'q': case 'Q':  quit();                break;
  case 'e': case 'E':  enterPerson(content);  break;
  case 'd': case 'D':  delPerson(content);    break;
  case 's': case 'S':  sortByName();          break;
  case 'l': case 'L':  showAll();             break;
  case 'f': case 'F':  searchByName(content); break;
  case default:        System.out.println("--Invalid Command!!\n"):
}

Wie zu sehen ist legen sie auf die Gestaltung des Codes wert – Anweisungen werden in logische Blöcke strukturiert so dargestellt, dass man durch einfaches betrachten erkennen unter welcher Bedingung welche Aktion ausgefĂŒhrt wird. In ihren GrundsĂ€tzen gehen sie allerdings auch auf die Benennung (und Lesbarkeit) von Variablen, Funktionen und Klassen ein. Stets mit dem Ziel den Code fĂŒr sich selbst sprechen zu lassen. Ein Artikel den sich, wie ich finde, zu lesen lohnt!

Ich persönlich gerate speziell bei den Namenskonventionen regelmĂ€ĂŸig ins Straucheln – was zu einem guten Teil auch von meiner Trial-and-Error Programmierung herrĂŒhrt: Variablen Ă€ndern durchaus öfters im Laufe der Versionen ihre Nutzung, Funktionen ihren Umfang und Klassen ihre Bestimmung (was dank Refactoring kein großes Problem mehr darstellt). Und eine wirkliche Dokumentation hat bislang noch keines meiner ohnehin eher kleineren Projekte verpasst bekommen. Daher werde ich mich bemĂŒhen bei meinen zukĂŒnftigen Projekten diese GrundsĂ€tze zu beherzigen.

13. May 2012: Arduino-Senso

Als ich im letzten Jahr endlich den Open Camera Controller fertiggestellt hatte, stellte sich die Frage: Was mache ich jetzt mit meinem Arduino Eine Antwort war schnell gefunden: Einen Senso-Klon) bauen! Leider sich das Projekt dann doch wesentlich lÀnger hingezogen als gedacht. Einen nicht unwesentlichen Teil haben meine eher rostigen Elektronik-Kenntnisse dazu beigetragen. Aber nichts desto trotz ist es nun endlich vollbracht! Auch wenn es sicherlich nicht schönsten Lösung ist, hier eine simplifizierte Version meines Schaltplans.

Zum 1:1 Nachbau möchte ich so allerdings nicht raten – Pin 13 des Arduino eignet sich nicht sonderlich gut als Input (wegen der Standard Notification-LED). Und auch sollte man fĂŒr blaue LEDs einen höheren Widerstand als fĂŒr die anderen LEDs (rot, gelb und grĂŒn in meinem Fall) benutzen – sie sind schlichtweg viel zu hell!

Die Software zur Hardware war wiederum erstaunlich schnell geschrieben – lediglich wenige Stunden (intensives Testen inklusive) hat es gedauert. Ganz in Anlehnung an das Hardware-Layout ist auch der Code nicht sonderlich ansehnlich. Dennoch sei er hier vorgestellt:

/* Arduino-Senso; v1.1
   (c)2012 by Kai Boenke
   Published under CC BY-NC-SA 3.0
 */

// Define Pins
#define ledGrn 6
#define ledRed 7
#define ledBlu 8
#define ledYel 9
#define btnGrn 10
#define btnRed 11
#define btnBlu 12
#define btnYel 13

// Customizations
#define maxWait 100000
#define maxMoves 30
#define inputDelay 500

// Declare Program-internal Vars
boolean waiting; //Defines Status for loop()
int waitCounter; //Used to determine Timeouts in loop()
int moveCounter; //Defines current Move in Sequence (Sequence-Replay)
int nextCounter; //Defines curent move to be made (next move to be made)
int rndSequence[maxMoves]; //Holds complete Sequence
int ledPinMin; //Define lowest Pin
int ledPinMax; //Define highest Pin


// Intial Setup
void setup() {
  // Pinmodes
  pinMode(ledGrn, OUTPUT);
  pinMode(ledRed, OUTPUT);
  pinMode(ledBlu, INPUT); //Exploits reduced voltage to dim LED
  pinMode(ledYel, OUTPUT);
  pinMode(btnGrn, INPUT);
  pinMode(btnRed, INPUT);
  pinMode(btnBlu, INPUT);
  pinMode(btnYel, INPUT);
  
  // Determine lowest/highest LED-Pins
  ledPinMin = min(min(min(ledGrn, ledRed), ledYel), ledBlu);
  ledPinMax = max(max(max(ledGrn, ledRed), ledYel), ledBlu);
  
  // Randomness
  Serial.begin(9600);
  randomSeed(analogRead(0));
  
  // Start first Game
  initGame();
}

// Main Loop
void loop() {
  // Check for Timeout
  if(waitCounter > maxWait){
    initGame();
  }else{
    waitCounter++;
  }
  
  // Show Sequence for new Move?
  if((!waiting) && (moveCounter == 0)){
    showSequence();
  }
  
  // Read Input
  int valGrn = digitalRead(btnGrn);
  int valRed = digitalRead(btnRed);
  int valBlu = digitalRead(btnBlu);
  int valYel = digitalRead(btnYel);
  
  // Evaluate Input
  if((valGrn == HIGH) || (valRed == HIGH) || (valBlu == HIGH) || (valYel == HIGH)){
    switch(rndSequence[moveCounter]){
      case ledGrn:
        if(valGrn == HIGH){
          blink(ledGrn);
          nextTry();
        }else{
          youLoose();
        }
        break;
      case ledRed:
        if(valRed == HIGH){
          blink(ledRed);
          nextTry();
        }else{
          youLoose();
        }
        break;
      case ledBlu:
        if(valBlu == HIGH){
          blink(ledBlu);
          nextTry();
        }else{
          youLoose();
        }
        break;
      case ledYel:
        if(digitalRead(btnYel) == HIGH){
          blink(ledYel);
          nextTry();
        }else{
          youLoose();
        }
        break;
    }
  }
}


/*
   Game-Logic
 */

// Setup a new Game
void initGame(){
  // Re-Initialize
  nextCounter = 0;
  moveCounter = 0;
  waiting = false;
  waitCounter = 0;
  
  // Visualize beginning of new Game
  roundBlink(5);
  
  // Generate new Sequence
  for(int i = 0; i < maxMoves; i++){
    rndSequence[i] = random(ledPinMin, ledPinMax+1);
    delay(20); //Try to increase Randomness even more
  }
}

// Visualize Sequence
void showSequence() {
  // Customize
  int blinkDelay = 500;
  int waitDelay = 100;
  
  // Show Sequence
  resetLeds();
  for(int i=0; i<=nextCounter; i++){
    blink(rndSequence[i], blinkDelay);
    delay(waitDelay);
  }
  
  // Reset Status
  waiting = true;
}

// Advance Try after successful Move
void nextTry(){
  // Next Move in Sequence or Replay?
  if(moveCounter >= nextCounter){
    delay(inputDelay);
    blinkAll(1, 10);
    nextCounter++;
    moveCounter = 0;
  }else{
    moveCounter++;
  }
  
  // Base-Case
  if(nextCounter >= maxMoves){
    // We have a Winner!
    blinkAll(10, 10);
    initGame();
  }else{
    // Move on!
    delay(inputDelay);
    waiting = false;
  }
}

// Wrong Move
void youLoose(){
  // Visualize
  blinkAll(1, 500);
  
  // New Game
  initGame();
}


/*
   LED-Controls
 */

// Single Blink
void blink(int led){
  blink(led, 100);
}
void blink(int led, int blinkDelay){
  resetLeds();
  digitalWrite(led, HIGH);
  delay(blinkDelay);
  digitalWrite(led, LOW);
}

// Random Blink
void blinkRandom(){
  blinkRandom(1, 100, 0);
}
void blinkRandom(int loops){
  blinkRandom(loops, 100, 0);
}
void blinkRandom(int loops, int blinkDelay){
  blinkRandom(loops, blinkDelay, 0);
}
void blinkRandom(int loops, int blinkDelay, int wait) {
  resetLeds();
  for(int i = 0; i

Insgesamt hat mich dieses Projekt wesentlich mehr Nerven als Geld gekostet. Wenn man bereits ein Arduino zur Hand hat, benötigt man lediglich eine Platine, ein paar LEDs, WiderstĂ€nde sowie vier Schalter – den Rest kann man wiederverwenden. Stellt sich nur die Frage was ich jetzt mit dem Arduino anfange…

8. May 2012: Algorithmen und anderes Allerlei

Er hat zwar nur fĂŒnf Wochen gedauert, aber anstrengend war es dennoch. Vor allem der Teil, der die lĂ€ngst vergessenen Mathematik-Grundlagen erforderte. Dennoch habe ich ihn geschafft, den gratis Online-Kurs Design and Analysis of Algorithms I der Stanford University. Und heute gab es das auch schriftlich:

Dabei habe ich nicht nur viel dazugelernt (vor allem was Methodik und Laufzeitoptimierung von Programmen betrifft), sondern auch eine Menge Spaß gehabt! Und den Denkapparat ein wenig zu belasten kann auch nicht schaden – zumal es durchaus bemerkenswerte Nebeneffekt (z.B. bei der KonzentrationsfĂ€higkeit) mit sich bringt.

1. May 2012: Neue Gadgets

Der FrĂŒhling macht ja angeblich alles neu. Und zumindest auf meine Gadget-Ausstattung bezogen hat er dieses mal richtig zugeschlagen. So durfte ich mich in den vergangenen zwei Wochen gleich ĂŒber zwei neue Smartphone von HTC freuen: Das One V sowie das One X. Letzteres wurde mir von den freundlichen Leuten bei HTC in der AT&T-Version fĂŒr den US-Markt ĂŒberlassen.

Von der Software-Sicht aus betrachtet (dank Android 4 samt passendem Sense) sind die beiden sich noch recht Ă€hnlich. Auf der Hardware-Seite könnten die Unterschiede jedoch grösser kaum sein – was durchaus wörtlich zu verstehen ist. Denn die Abmessungen des One X grenzen schon an jene eines Tablets. Jedenfalls fĂŒr mein Empfinden. Daher hatte ich mich auch ganz bewusst (und dennoch ZĂ€hne-knirschend) fĂŒr das One V als Ersatz fĂŒr mein angeschlagenes HTC Aria entschieden – es ist schlichtweg das einzig auf dem Markt verbliebene Smartphone das noch in eine Hosentasche passt dabei ohne unangenehme Nebenwirkungen zu entfalten. Wobei man dennoch ganz Zweifelsfrei feststellen muss, dass das One X ein umwerfend tolles GerĂ€t ist – es fĂŒhlt sich genauso leicht und handlich an wie das One V (beide wiegen quasi nichts mehr) und ist ebenso flach. Und es liegt auch toll in der Hand – nur zum telefonieren ist es mir dann doch irgendwie zu groß.

Das tollste Feature an beiden Telefonen ist jedoch das neue Sense. Nach wie vor ist die UI der fĂŒr mich ausschlaggebende Grund ein HTC Smartphone zu kaufen (seit nunmehr rund sechs Jahren und Plattform-ĂŒbergreifend). Die Integration verschiedenster Quellen wie zum Beispiel flickr und Twitter in eine OberflĂ€che such selbst auf dem Desktop noch seinesgleichen. Ein Feature, das ich nicht mehr missen möchte! Und Sense 4 geht hier noch einen Schritt weiter und erlaubt es Quellen Modular hinzuzufĂŒgen (neuerdings z.B. auch LinkedIn). Doch das Beste, an beiden Telefon ĂŒbrigens, ist fĂŒr mich noch die Kamera. Nicht Hardware-seitig (obwohl sie wirklich unglaublich tolle Bilder macht!), sondern eher das Best-Shot Feature, bei dem man den Auslöser einfach gedrĂŒckt hĂ€lt und so mehrere Bilder macht. Anschließend wĂ€hlt man das Beste aus – und der Rest wird automatisch gelöscht. Auf diese Weise bekommt man auf wirklich einfachste Weise umwerfend gute Fotos – selbst von zappelnden Kindern.

Als Fazit bleibt mir nur noch zu sagen, dass ich bei meinem One V bleiben werde – es ist kleiner, handlicher und in allen fuer mich relevanten Punkten dem One X ebenbĂŒrtig. Fragt sich nur noch was ich mit dem One X anstellen werde. Vielleicht ein Kamera-Ersatz mit automatischem Dropbox-Upload?

4. April 2012: Mal wieder ein Zertifikat

Zugegeben, die Zertifizierungswelle ist bei mir eigentlich schon wieder ein wenig lĂ€nger her. Dennoch konnte ich heute meiner Sammlung ein weiteres Zertifikat hinzufĂŒgen:

Certified!

Und das zu bekommen war diesmal richtig anspruchsvoll! Nicht nur da es eine wirklich atemberaubend breites Spektrum abzudecken galt (im Laufe der Vorbereitung mussten bis zu 15 virtuelle Maschinen parallel herhalten) – gegen Ende meiner ohnehin gut drei Monate dauernden Vorbereitung habe ich in der letzten Woche dann auch noch herausgefunden das ich mit komplett (!) veralteten Unterlagen gelernt hatte. Letztes Wochenende war daher Power-Lernen angesagt. Erfolgreich!

Mal sehen wie lange Microsoft es mir gönnt. Denn immerhin steht ja der Nachfolger bereits in den Startlöchern…

Windows 8 Server Beta

23. January 2012: Digitales lesen

Das Lesen im 21. Jahrhundert wird sich ja komplett Ă€ndern. Sagt man. BĂŒcher werden nur noch in Museen ausgestellt werden, genauso wie Buchpressen. Sagt man. Die Verlagsindustrie wird dramatisch umgekrempelt und somit ganze Industriezweige insolvent werden. Sagt man. Man hat auch gesagt, dass mit dem Eroberungszug der Computer in Unternehmen das Papierlose BĂŒro Ă€hnlich dramatische Auswirkungen haben werde.

Dennoch habe ich mich immer mal wieder auch mit dieser Nischenanwendung meines kleinen Nook Color beschĂ€ftigt. Zugegeben, zuletzt ausschlaggebend war fĂŒr mich in erster Linie das kĂŒrzlich ausgelaufene Wochenend-Abo des Miami Herald und nicht etwa mein Verlangen nach einer umwerfend neuen Erfahrung im Zeitung-lesen. In dieser Hinsicht habe ich meine Hoffnungen eher auf die digitale Ausgabe des Spiegel gesetzt, doch dazu spĂ€ter mehr.

Weiterlesen?

17. January 2012: Amerikanische Redewendungen I

I call Shotgun! – wer eine Zeit lang in den USA verweilt oder sich gerne Sitcoms in der Original-Version anschaut wird diese Aussage sicherlich schon einmal gehört haben. Doch was hat es damit eigentlich auf sich?

Dazu muss man zunĂ€chst einmal wissen, dass in den USA das fahren im Beifahrersitz eines Auto auch als Riding Shotgun bekannt ist. Hat man diese HĂŒrde genommen erschließt sich auch die Aussage recht schnell: Derjenige, der Shotgun als erster ruft, sitzt im Beifahrersitz. Um das komplexe Regelwerk kurz zu halten. Doch woher kommt diese Bezeichnung? Einmal mehr handelt es sich dabei um eine – historisch nicht allzu ernst zu nehmende – Anspielung auf den Sitzplatz neben dem Kutscher in Western. Jener Beifahrer hielt, zumindest in Romanen und Filmen, eine Schrotflinte in der Hand.

Hat man dies verinnerlicht, ergeben Witze wie dieser auf einmal auch einen Sinn:

Leonard: Refresh my memory. Why didn’t I just put you in the trunk?
Sheldon: Because I called Shotgun, remember?