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.

Apache Wicket – Der Einstieg

Seit nun fast 15 Monaten beschäftige ich mich in meinem Projektumfeld mit Spring und Hibernate. Langsam meldet sich mit Innerstes und schreit nach mehr Input. Andere lernen Sprachen oder versuchen neue Kunststückchen mit ihren Fingern zu vollführen, aber der allgemeine Informatiker…nunja…macht das nicht.

Der Informatiker erweitert sein Repertoire um Technologien und Erfahrungen. Ich habe mir nun Apache Wicket vorgenommen. Bei Wicket kommt mit Wissen zu Java und HTML vollkommen aus. Ich werde versuchen, einige der wichtigsten Fragestellungen, die beim Einarbeiten in dieses Framework auftreten, nieder zu schreiben und natürlich auch zu beantworten.

Nachdem wir das Warum? geklärt haben, kommen wir zu einem schweren Schritt, wie anfangen? O_o

  1. Apache Tomcat 7 mit JDK 7 (bspw. OpenJDK 7) sollte als Grundlage vorhanden sein
  2. Eine brauchbare IDE: https://www.jetbrains.com/idea/ – die meiner Meinung nach beste IDE (Netbeans und Eclipse wurden abgelöst)
  3. Ich empfehle die Verwendung von Maven als Dependency Manager

Okay, sobald wir das alles eingerichtet haben…sind schon gut und gerne mal 60 Minuten vergangen ;-).

Das war die Einrichtung der Entwicklungsumgebung, kommen wir nun zum ersten lauffähigen Projekt mit Wicket. Aber was nun? Na gut, keine Ahnung, besorgen wir uns Hilfe bei Leuten die Apache Wicket entwickeln und uns grandiose Hilfen anbieten. Maven Archtypes…Neues Projekt –> Maven –> **gnampf** Wicket in Version 1.3.2 als Archtype vorhanden…Version 7 ist doch aktuell….gerade gelesen :-/ na gut wicket.apache.org *such* Quickstart –> Boah fett *.*

Hier gibt es einen generierten Befehl, mit dessen Hilfe wir ein Wicketprojekt erstellen können:

Ich habe mal die interessanten Parameter des Befehls in rot markiert, diese können bspw. in IDEA als neuer Archtype angegeben und gespeichert werden. Sobald das Projekt erfolgreich erstellt worden ist, haben wir eine lauffähige WebApplicationentwickelt …. *yey*

Aber was genau ist hier nun passiert? Mit dem MavenArchtype wurde eine POM erzeugt, diese lädt alle Dinge automatisch aus dem angegebenen Repository herunter, wenn dort nicht verfügbar, ggf. auch von anderer Stelle (Dependency Management). Zusätzlich können in der POM Informationen zur Applikation hinterlegt werden, wie Author, Applikationsname oder Verison eurer Applikation. Die Version kann bspw. bei Verwendung von Releasezyklen automatisiert durch einen Jenkins verwaltet werden….doch dazu später mehr….vielleicht ;-).

Also was jetzt? Genau, ein Container in dem die Webapplikation (WebApp) laufen kann, muss her. Oben in den Bedingungen schon gesehen…Tomcat 7.  In der Pom ist auch ein alternativer Servelet-Container als Dependency vorhanden, der natürlich auch problemlos verwendet werden kann:

Es ist wichtig, dass Java 7 verwendet wird, wie es hier auch steht:

 

 

Nach Konfiguration des Tomcat 7 in der IDE sollte einem Start der Applikation nichts mehr im Wege stehen. Bereits nach 453ms öffnet such ein Browserfenster und die „Quickstart“ erscheint.

Glück auf! Später mehr 😉

Linux Server mit RAID 5 – Umstellung auf RAID 6

Nach 7 Monaten tadellosem Betrieb ist eine der Festplatten kaputt gegangen. Fehlerhafte Sektoren sagt das Analysetool. Die Festplatte wurde eingeschickt und gegen eine Ersatzfestplatte aus dem Bestand ausgetauscht. Eine vom System automatisch verschickte Email hat über die aus dem RAID Verbund entfernte Festplatte informiert.

Nach dem Einbau wurde die Festplatte partitioniert, formatiert und dem RAID Verbund als Spare hinzugefügt. Der Server hat automatisch und sofort mit der Wiederherstellung der Datenredundanzen begonnen.

Da einige der Festplatten auf einmal gekauft wurden und nahezu identische Seriennummern haben, besteht die Möglichkeit, dass zwei Platten gleichzeitig ausfallen können. Aus diesem Grund, wurde beschlossen das RAID 5 (mit aktuell 20 Terrabyte Daten) in ein RAID 6, anders gesprochen ein RAID 5 mit doppelter Redundanz, umzuwandeln. So können bis zu zwei Festplatten gleichzeitig oder sogar während der Wiederherstellung ausfallen, ohne dass Daten verloren gehen.

Dazu wurden zunächst Root-Rechte eingeholt:

Anschließend die Anzahl der im RAID-Verbund befindlichen Festplatten ermitteln:

In meinem Fall waren es 11 Festplatten zu je 2 Terrabyte.  Anschließend sollte der Zustand des RAIDs überprüft werden (gekürzte Ansicht):

Die zusätzliche Festplatte zur Erweiterung wie gehabt dem Verbund hinzufügen:

Erneut den Status prüfen:

Nun wird es heikel und es sollte mehrfach kontrolliert werden, ob die eingegebenen Daten an die eigenen Umstände angepasst worden sind, dies könnte andernfalls zum Datenverlust führen:

Das mdadm beginnt sofort mit dem reshape-Prozess, der die Daten neu anordnet und die zusätzliche Redundanz schafft. Dieser Prozess dauert mitunter sehr langeund bei meiner Konfiguration 8 Tage und 7 Stunden in Anspruch genommen. Sollte der Server in diesem Zeitraum neugestartet werden, ist der Prozess selbst idR nicht gefährdet, beginnt allerdings von vorne.

Die von mir verwendete Anleitung zur Erweiterung des RAID-Verbundes ist hier zu finden.

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*

Linux Server mit RAID 5 – Anforderungen

Die Vorgeschichte:
NAS Anbieter wie Synology und QNAP stellen super Produkte her. Doch in dem Moment, wo mehr als vier Festplatten zu einem RAID Verbund zusammengefügt werden sollen wird es richtig teuer. Die Suche nach einer Möglichkeit 20 TerraByte speichern zu können, würde bei den beiden zuvor genannten Hersteller zwischen 900€ und 1.300€ kosten.
Alternativen erwünscht. Verwendung eines PCs mit einem 8 Port Hardware-RAID-Controller, alleine dieser kostet in vernünftiger Qualität auch seine 600€, hinzu kämen die Kosten der restlichen Hardware ca. 400€-600€ (je nach Bedarf). Eine weitere Lösung bietet Linux mit einem Software-RAID. Vorteile: Keine zusätzlichen Kosten für RAID Hardware und sehr hohe Flexibilität, was die Skalierbarkeit und Kompatibiltät angeht. Die Nachteile sind allgemein bekannt: Langsamer, Ressourcen-hungrig, instabil – MOMENT, das kann ich nicht bestätigen, aber dazu im Fazit später mehr.

Als Hardware wir ein Core-I3 Prozessor mit vier Kernen, auf einem Mainboard mit 8 SATA Ports verwendet. 8 GigaByte RAM und ein zusätzlicher 4 Port SATA Controller, um weitere SATA Anschlüsse anzubieten. Die übrige Hardware in Form von Gehäuse, Netzteil Festplatten Wechselrahmen etc. ist vorhanden. Elf HDDs von Western Digital zu je 2 TerraByte werden verbaut um den Anforderungen von 20 TerraByte zu genügen. Die Kosten belaufen sich auf 380€ plus 1100€ für Festplatten (Stand 10/2012).

Als Betriebssystem wird ein Xubuntu 12.10 eingesetzt.