Autonomie den Entwicklern

Im Studium beginnt es bereits, das Doktrinat der Oberschicht – naja gut, vielleicht übertreibe ich etwas, aber dennoch ist es so. Wenn ich mich zurückerinnere, mit welchen IDEs welche Sprachen entwickelt wurden…Assembler wurde immer in der IDE des jeweiligen Chipherstellers entwickelt…okay, das sehe ich ein. Aber ab dem Sprachenlevel, den C einnimmt, sollte lediglich das Ergebnis von Interesse sein, dies impliziert Codequalität und Algorithmen, genauso wie die Lauffähigkeit des Codes, egal, ob es mit Emacs, Eclipse CDT oder Visual Studio (oder was auch immer) geschieht, denn jede IDE hat Vor- und Nachteile. An der Universität  haben wir Java mit Eclipse entwickelt und plötzlich wurde uns im Master ein Environment mit Netbeans vorgeschrieben und schon war die heile Java Welt dahin. Alles funktioniert anders, Shortcuts sind unterschiedlich, die Performance leidet, der Frust steigt und alles nur, weil die Oberschicht, hier des Professors Assi meint, etwas so überflüssiges vorgeben zu müssen.

Meine restlichen Ausflüchte werde ich nun einfach mal überspringen und kurzerhand in die nahe Vergangenheit meiner beruflichen Laufbahn gehen. Ich bin aktuell in einem Projekt tätig, wo Windows als OS und ortsgebundene Arbeitsplätze durch die Firmenkultur vorgegeben sind. Als IDE wird Eclipse eingesetzt. Das verwendete SCM ist SVN. Ich fühle mich unglaublich wohl mit einem Macbook, IntelliJ IDEA und Git, somit war das ganze für mich eine riesige Umstellung und häufig auch gar nicht ganz einfach.

Doch warum sollte man (die Oberschicht) das persönliche Ökosystem eines Entwicklers nicht vorgeben, beziehungsweise die Zwänge so gering halten, wie möglich? Der typische Entwickler ist ein mündiger, intelligenter (oftmals zumindest ;-)) und freiheitsliebender Mensch. Beginnen wir zuerst einmal mit dem Freiheitsgedanken, hierbei ist es das OS und die IDE, die besonders wichtig sind. Scripte, Shortcuts, Profile, Markup, etc. ändern sich mit der Betriebssystemwahl, so sinkt die Produktivität, selbst wenn man sich Mühe gibt, mit anderen Rahmenbedingungen klar zu kommen und über diese Vorgabe hinweg zu sehen.
Wer hat Schuld, wenn ein Mitarbeiter nicht mit seiner Hardware klar kommt? Hat er sie selbst ausgewählt – der Entwickler! Und wenn ihm diese vorgeschrieben wurde? Die vorschreibende Person. Und wenn es der zweite Fall ist,  wird jeder Fehler, jede Zeiteinbuße, einfach alles der falschen Hardware, IDE oder dem Betriebssystem zugeschrieben. Das mag mal ganz nett sein, aber befriedigt, keine der beiden Parteien. Bei komplexen Programmen wie IntelliJ IDEA beziehungsweise Eclipse ist es unabdingbar möglichst viele Shortcuts zu kennen, da diese häufig die Arbeitsschritte drastisch beschleunigen, man denke an das „F5“ im Browser – wer hat schon Lust das kleine Icon mit der Maus zu betätigen 😉

Und nun, warum sollten gegebenenfalls einige hundert Euro mehr für Hardware ausgegeben werden, als es notwenidg ist? Für jeden der es noch nicht gemerkt hat – die teuerste Ressource ist in unserer Branche defintiv der Entwickler und so sollte mit dieser Ressourcen auch defintiv am vorsichtigsten umgegangen werden, also mein Appell an alle Entscheidungsträger:

„Überlasst die Entscheidung nach Hardware, IDE und Betriebssystem dem Mitarbeiter, sofern dieses irgendwie möglich ist.“

Java 7 – try mit AutoClosables, try(Ressource res), Type Inference

Die erste Frage, die ich mir heute morgen gestellt habe, wie komme ich drauf, dass ich Ende 2015 Beiträge über Java 7 veröffentliche…naja ich komme jetzt gerade erst dazu, mich damit zu beschäftigen, leider…

AutoCloseable – ein Interface, das mit Java 7 eingeführt wurde, es fordert die Implementierung einer Methode … schrecklich überraschend … close() … ein. Zudem kann ich nun Ressourcen im Kopf des try-Blocks deklarieren, der Vorteil hier ganz klar; Egal, ob die try-Anweisung vollständig abläuft oder abrupt  endet, die close()-Methode von Ressourcen, die das Interface AutoClosable implementieren werden definitiv aufgerufen. So können Socket, Filehandles oder Reader-Ressourcen automatisch beendet werden, auch dann wenn eine Exception auftritt. Es können zudem mehrere Ressource ; separiert im try instanziiert werden, bspw.:

Hingewiesen sei auf das rot-markierte Semikolon nach der zweiten Ressourcen, dieses ist optional und kann ja nach Belieben gesetzt oder nicht gesetzt werden. Ein weiterer Vorteil ist, dass zur Laufzeit bekannt ist, welche Ressourcen bereits geschlossen worden sind. Das bedeutet, tritt ein Problem bei der Instanziierung von r2 auf, so wird nur r1 automatisch geschlossen, da dies für r2 nicht notwendig ist.

Aber in dem kurzen Codeblock ist noch mehr, das so nicht ganz so einfach mit Java 6 ging. Genau…die Exceptions…ein Pipe-Symbol/logisches ODER…Das ganze nennt sich Exception-Chaining. Wenn wie in diesem Beispiel drei Exceptions die gleiche Art der Behandlung haben, können die Blöcke auf o.g. Weise zusammengefasst werden…auch wieder sehr praktisch.

Zu guter letzt möchte ich noch weiter auf die Optimierungen beim Entwickeln eingehen. Seit Java 7 können in Variablendeklarationen von Generics die typisierenden Argumente beim Konstruktor-Aufruf weggelassen werden, also statt:

Können wir die verkürzte Schreibweise verwenden:

Die Kombination aus den beiden spitzen Klammern ‚<>‘ wird auch als Diamond bezeichnet. Zusammengefasst kann der Diamond den parametrisierten Typ des Konstruktors einer generischen Klasse ersetzen. Das Weglassen des Diamonds ist bei der Instanziierung nicht erlaubt, weil sonst (in diesem Fall) der Raw-Type der Hashmap angenommen und nicht der generische Typ angenommen wird.

Empfohlen wird zudem der Einsatz ausschließlich bei der Instanziierung von Variablen, nicht in Funktionsaufrufen, auch wenn dies theoretisch möglich ist.

Java7 – Neuerung – Danke!

Heute … gestern … und auch der Tag davor – so fühlt es sich zumindest als Java-Entwickler oftmals an, wenn man mal wieder in die Situation kommt, equals() und hashCode()-Methoden in einem Objekt zu implementieren.  So führt der traditionelle Weg am Referenzvergleich, null-Check und am Ende an diversen if() ..elseif()-Checks vorbei. Diese als „verbose“ (langatmige) Implementierung kennt jeder. Etwas schicker geht es mit den ternären Operatoren (zur Erinnerung: ‚wenn ? dann : sonst‘). Obi Ezechukwu hat uns dann mit seinem compactEquals weitergeholfen, als er seine compactEquals()-Methode vorgestellt hat; er fügt die zu vergleichenden Members der zu vergleichenden Objekte einem Array hinzu,  und nutzt Arrays.equals(Object,Object). Ein ähnlich umständliches Verfahren wird bekannterweise auch für der Überschreiben der hashCode()-Methode eingegangen, was ja notwendig ist, wenn die equals()-Methode eines Objekts überschrieben wird.

IDEs wie IntelliJ, Netbeans und Eclipse helfen natürlich bei der automatischen Erstellung der Methoden in altertümlichem Sinne, was den Stil allerdings auch nicht schöner macht.

Mit der Einführung von Java7, können equals() und hashCode() nun recht komfortabel, objektweise erstellt werden.

 

 

Hingewiesen sei hier auch noch auf die deepEquals()-Methode der Objects-Klasse.

 

Quellen: http://docs.oracle.com/javase/7/docs/api/java/util/Objects.html

Spotify unter Debian Wheezy

Ich benutze Spotify Premium, weil ich es leid war, auf umständlichen Wegen immer wieder meine Playlists zu sortieren oder mich um die Erweiterung dieser zu kümmern.  Aber nun genug von der Werbeveranstaltung, ich will ich kurz erzählen, wie man mit Aptitude Spotify ganz einfach installieren kann:

  1. sudo apt-add-repository -y „deb http://repository.spotify.com stable non-free“
    So wird das Spotify repository als Paketquelle hinzugefügt.
  2. sudo apt-key adv –keyserver keyserver.ubuntu.com –recv-keys 94558F59
    So wird der Public Key zur Verifizierung der Korrektheit hinzugefügt.
  3. sudo apt-get update
    Interne Versionslisten aktualisieren.
  4. sudo apt-get install spotify-client
    Fehlermeldung! Der Grund hierfür beruht darauf, dass Spotify gegen eine feste Version von libssl entwickelt wird, nämlich libssl0.98. Diese ist aber seit Release von Version 1.0 nicht mehr verfügbar und deswegen  müssen wir diese Version von Hand installieren:

    1. uname -a
      Ermittlung der verwendeten Architektur des Linux
    2. Download des Paketes aus den offiziellen Debianpaketquellen.
      Hinweis:
      i386 und i686 -> 32Bit
      amd64 –> 64Bit
    3. sudo dpkg –install libssl0.9.8_0.9.8o-4squeeze14_i386.deb
      oder mit Rechtsklick und dem GDebi-Paket-Installer das Paket installieren
  5. sudo apt-get install spotify-client
    Nun kann der Spotify-Client problemlos installiert werden.

Linux Server mit RAID 5 – Inbetriebnahme

Nach dem Aufbau der Hardware werden zunächst vier Festplatten in den Server eingebaut. 1* Wester Digital Caviar Black 250 GigaByte und drei Western Digital WD20EZRX. Die Caviar Black dient als Systemplatte. Nach der Installation des Xubuntu (Ubuntu + Xfce) und den dazugehörigen Updates wird direkt mit der Installation des RAID begonnen.

Die Einrichtung des RAID kann dem Ubuntu Howto entnommen werden, darauf möchte ich nun nicht weiter eingehen.

Die Erzeugung des RAID 5-Verbundes kann durchaus einige Zeit in Anspruch nehmen. In meinem Fall dauert es etwa 14 Stunden, es resultierte eine 4 Terrabyte große Partition, die durch Eintragen in /etc/fstab automatisch gemounted wird und ab sofort zur Verfügung steht. Warum wird das RAID zunächst nur für drei Festplatten angelegt? Aufgrund begrenzter Mittel wurden zum größten Teil vorhandene Festplatten genutzt. Deswegen wurden zyklisch die Daten zweier Festplatten auf das RAID kopiert und anschließend dem RAID hinzugefügt. Auch wenn dieser Prozess durchaus einige Zeit mehr in Anspruch genommen hat (ca. 1 Woche), konnte so durch den Zukauf von lediglich zwei Festplatten einiges an Geld gespart werden.

Quelle: Ubuntu RAID HowTo

Anschließend wird das RAID mit der Vergrößerung automatisch beginnen. Je größer das RAID wird, desto länger dauert die Erweiterung. Da dieser Prozess der empfindlichste im Betrieb eines RAIDs ist, sollte hier idealerweise eine unterbrechungsfreie Stromgversorgung und ein Nicht-Abstürzen der des Servers sichergestellt werden. Die Geschwindigkeit kann durch die Unterbindung von Lese- und Schreibzugriffen gesteigert werden.

Linux Server mit RAID 5 – Aufbau

Als Gehäuse wird ein vorhandenes Fractal Design Define XL genutzt. Dieses Gehäuse bietet Platz für 10 3,5″ Laufwerke und 4 5.25″ Laufwerke. Durch die Verwendung des ebenfalls vorhandenen IcyBox IB-555SSK kann sichergestellt werden, dass insgesamt 15 3,5″ Laufwerke eingebaut werden können. Der letzte freie Platz wird mit einem LG Bluray Brenner als Backup Option belegt. Da es sich um einen Server und keinen Gaming-Rechner handelt wird auf onBoard Grafik gesetzt statt dedizierter Grafik, so kann sehr viel Strom gespart werden.

Mainboard ist ein AsRock mit 7 SATA Steckplätzen. Der Sockel nimmt einen CoreI3 der dritten Generation auf. Zwei DeLock 4Port SATA-Controller erweitern die Anzahl der verfügbaren Steckplätze auf 15. Der Hauptspeicher wird mit großzügigen 8 GigaByte vermutlich niemals in Gänze genutzt, kann aber bei den Preisen großzügig ausgelegt werden, um die Last des RAIDs bei wiederholten Zugriffen auf gleiche Files weniger zu belasten. Der Prozessor ist mit maximal 3,3 GHz auf zwei nativen Cores getaktet und unterstützt Hyperthreading.

Zu diesem Zeitpunkt kann aufgrund mangelnder Informationen keine Aussage über die tatsächlich anfallende Last auf der CPU durch das Software-RAID gemacht werden. Es wird erwartet, dass beim Build/Rebuild/Resync die CPU ggf. komplett ausgelastet wird und so der Prozess erst etwas verzögert fertiggestellt wird, als mit einer potenteren CPU, wie beispielweise einem CoreI7.

*mehr im Fazit*

Beim Netzteil wurde ein Sharkoon sha350m bronze gewählt. Das einmalige Preisleistungsverhältnis hat hier überzeugt.

*auch zu diesem später mehr*

VirtualBox Festplatte nachträglich vergrößern

OS: Debian Wheezy
VirtualBox: Windows 7, 64Bit, 10 Gbyte –> 20 Gbyte

Wenn der Platz der VM beim Anlegen falsch bemessen wurde, kann die Größe der zur Verfügung stehenden Festplatte, wie nachfolgende beschrieben, vergrößert werden:

  1. Alle VirtualBox Appliances und Programmfenster schließen
  2. Öffnen der Linux Console
  3. VBoxManage modifyhd /home/<USER>/<PFAD_ZU_DEINER_VM>/<VM>.vdi –resize 20000
    (für 20.000 MByte) und mit [ENTER] bestätigen
  4. In der Console erscheint:
    0%…10%…20%…30%…40%…50%…60%…70%…80%…90%…100%
  5. Die entsprechende Virtuelle Maschine zeigt in der Übersicht nun die neue Größe an.
  6. Virtuelle Maschine starten
  7. Damit Windows auf das Mehr an Speicherplatz zugreifen kann, muss die entsprechende Partition erweitert oder eine neue angelegt werden, dazu die Datenträgerverwaltung öffnen:
    Rechtsklick auf ‚Computer‘ (bspw. im Startmenü) –> Verwalten –> Datenträgerverwaltung (warten)
  8. Nach einiger Zeit tauchen alle eingebundenen Datenträger und Laufwerk auf. Rechtsklick auf den hellen Kasten mit blauem Balken drüber und ‚Volume erweitern‘ anklicken.
  9. Entsprechende Größe angeben (sofern nicht vorausgewählt) und bestätigen. Der zusätzliche Speicherplatz ist direkt und ohne Neustart verfügbar.