Java Interview: Unveränderlichkeit von Strings

Dieser Post behandelt ein interessantes Thema hinsichtlich der Verarbeitung von Zeichenketten in Java. Es geht um die Unveränderlichkeit von Strings. Auf englischen Seiten findet man dazu mehr unter dem Begriff String immutability. Nun, um was genau geht es? Anstatt das Thema theoretisch zu erläutern, möchte ich eher den praktischen Weg beschreiten.

Welche Ausgabe erzeugt das folgende Programm?

Sie würden sagen: “Machst du Witze Mann, soll das ein Scherz sein? Dies ist ein einfaches String-Verkettungs-Programm, was ist das Problem? Die Ausgabe sollte selbstverständlich “HelloWorld” zu sein. Nun sind Sie sicher? Lassen Sie uns dieses Programm ausführen und die Ausgabe, welche ich erhalte, lautet “Hello”.

Hmmm … Was ist hier passiert? Wir haben doch wir die concat-Methode auf s1 korrekt angewendet? Also warum haben wir nicht die erwartete Ausgabe “HelloWorld” erhalten?
Haben wir getan, was notwendig ist, um die verkettete Zeichenfolge als Ausgabe zu bekommen? Lassen Sie uns verstehen, was passiert, wenn wir die Variablen deklarieren und initialisieren.

Zwei String Objekte erzeugt

Zwei String Objekte erzeugt

Eine Referenzvariable s1 wird erstellt und das String-Objekt “Hello” wird zugewiesen.
Eine Referenzvariable s2 wird erstellt und das String-Objekt “World” wird zugewiesen.
Es folgt der spannende Teil, indem wir die Verkettungsoperation aufrufen mit s1.concat (s2).

  • Sobald s1.concat(s2) aufgerufen wird, entsteht ein neues String Objekt als Ergebnis dieser Konkatenation. Der Wert dieses neuen Objektes ist “HelloWorld“.
  • Man beachte, dass dies keine Auswirkungen auf das “Hello“-Objekt hat, es wird einfach ein neues “HelloWorld“-Objekt erzeugt.
  • Nachdem nun “HelloWorld” erzeugt wurde, ist es sogleich für unser Programm verloren und unerreichbar, da wir es nicht einer Variable zugewiesen haben. Die Verkettung hat stattgefunden, jedoch ist das Ergebnis für unser Programm nicht erreichbar.

Dieser Sachverhalt wird in der folgenden Abbildung dargestellt.

Ein neuer String wurde erzeugt

Ein neuer String wurde erzeugt

Nun ändern wir den Programmteil s1.concat(s2) zu s1=s1.concat() und führen das Programm erneut aus. Das Ergebnis ist ein HelloWorld.

  • s1.concat(s2) erzeugt ein neues Objekt
  • s1 = s1.concat(s2) ordnet der Referenzvariablen s1 das Objekt zu
  • Jetzt referenziert s1 auf unser “HelloWorld” und die Referenz, die Verbindung, zum “Hello”-Objekt ist nicht mehr vorhanden.
Änderung der Objektreferenz

Änderung der Objektreferenz

Kurz gesagt, Stringobjekte sind unveränderbar. Das bedeutet, dass sie nach der Konstruktion nicht mehr geändert werden können. An diesem Punkt besteht akute Verwechslungsgefahr. Es ist wichtig zwischen Referenzvariablen und deren Objekten zu unterscheiden. Eine Referenzvariable, die auf einen String verweist, kann geändert werden (sie kann geändert werden, um auf ein anderes Stringobjekt zu verweisen). Das Stringobjekt selbst, auf das sie verweist, kann NICHT geändert werden.

Eine Referenzvariable ist eine Variable die eine Referenz auf ein Objekt enthält im Gegensatz zu einer “normalen” Variable die einen primitiven Datentyp enthält.

Bewährte Praktiken in der Software Entwicklung

beitragsbild

Hier ist meine Liste von bewährten Praktiken und Faustregeln für die Softwareentwicklung, die ich im Laufe der Jahre durch Erfahrung festgestellt habe und welche sich als nützlich erwiesen haben:

Entwicklung

1. Fangen Sie klein an, und erweitern Sie schrittweise. Egal, ob die Schaffung eines neuen Systems oder das Hinzufügen einer Funktion zu einem bestehenden System, beginne ich immer, indem ich eine sehr einfache Version implementiere mit äußert geringem Umfang der geforderten Programmfunktionalität. Nun erweitert man die bisherige Lösung Schritt für Schritt bis es den vereinbarten Zweck erfüllt. Ich war noch nie in der Lage, alle Einzelheiten von Beginn an detailliert zu planen. Stattdessen, versuche ich aus den Erfahrungen und Eindrücken, auf meinem Weg zur Lösung der gestellten Aufgabe, zu lernen. Idealerweise kann man diese gemachten Erfahrungen fast immer gut gebrauchen für ein späteres Projekt.

Dieses Zitat von John Gall1) ist dahingehend sehr treffend: “Ein funktionierendes komplexes System basiert ausnahmslos auf einem einfachen aber dennoch funktionierendem System.”

2. Ändern Sie nicht mehrere Sachen zur gleichen Zeit. Während man programmiert schleichen sich gerne Fehler ein. Tests schlagen Fehl und die neu implementierte Methode von gestern erfüllte heute nicht mehr ihren Zweck. Um den Fehler zu finden ist es daher ratsam, nicht mehrere Änderungen auf einmal vorzunehmen. Oder anders ausgedrückt, entwickeln Sie in kurzen Iterationen. Ändern Sie eine Sache, vergewissern Sie sich, dass die Änderung fehlerfrei ist und wiederholen Sie diese Vorgehensweise. Dieses Arbeitsweise gilt insbesondere für Teams hinsichtlich der Commits. Wenn Sie zum Beispiel Legacy Code umgestalten (refactoring), bevor Sie die eigentliche neue Funktion implementieren, sollten Sie nach dem Refactoring einen Commit machen und erst dann die neue Funktion einbauen (und diese dann wieder committen).

3. Frühes Einbinden von Logging (Protokollierung) und Error-Handling (Fehlerbehandlung). Bei der Neuentwicklung eines Systems, ist es eines der ersten und wichtigsten Dinge, welche man umsetzen sollte, das Einbinden einer (Fehler)-Protokollierung (Logging) als auch einer Fehlerbehandlung (error handling). Für alle Systeme, die größer als eine handvoll Zeilen Code sind, müssen Sie einen Weg kennen, um in Erfahrung zu bringen was in ihrem Programm geschieht. Vielleicht nicht unbedingt dann, wenn die Software wie erwartet arbeitet, aber spätestens dann, wenn unerwartetes Verhalten auftritt. Das gleiche gilt auch für die Fehlerbehandlung. Programmfehler (Programmierfehler) sind bereits in der Frühphase der Implementierung vorhanden. Je früher diese Fehler auf eine systematische Weise behandelt werden, desto besser.

4. Jeder neue Code muss mindestens einmal ausgeführt werden. Bevor eine neue Funktion oder Feature tatsächlich als abgeschlossen gelten kann, muss es getestet werden. Ansonsten können Sie nicht wissen, ob die neue Methode oder das neue Feature wirklich funktioniert. Automatische Test sind häufig das Mittel der Wahl, jedoch nicht immer. Wichtig ist nur, dass jeder neue Code auch ausgeführt wird, mindestens einmal.

Manchmal ist es auch etwas knifflig, die richtigen Testbedingungen zu schaffen. Glücklicherweise ist es hier einfach, etwas zu tricksen. Ein Beispiel gefällig? Um zu testen, ob die Fehlerbehandlung bei Datenbankabfragen funktioniert, würde es schon ausreichen, die Spalte einer Datenbanktabelle umzubenennen. Oder eine If-Anweisung wird vorübergehend invertiert (“if” wird zu “if not”), um etwas auszulösen, das nur selten passiert, um sicherzugehen, dass der Code ausgeführt werden kann und korrekt funktioniert.

Manchmal sehe ich Fehler, die zeigen, das der Entwickler den betroffene Code niemals ausgeführt hat. Solcher Code mag sogar ein Review überstanden haben, aber immer noch nicht funktionsfähig sein. Zur Vermeidung peinlicher Situationen, sollten Sie es sich angewöhnen, jeden neuen (oder auch veränderten) Code auszuführen.

5. Testen Sie vom ganz Kleinen zum ganz Großen. Gut getestete Bestandteile ihrer Software sparen Zeit. Nicht selten entstehen Probleme im Zusammenspiel von Programmteilen / Modulen ihrer Applikation. Zum Beispiel fehlerhafte Schnittstellen zwischen den Modulen. Sobald Sie mit Sicherheit wissen, das die einzelnen Programmteile erwartungsgemäß und korrekt funktionieren, wird es für Sie sehr viel einfacher sein, möglichen Integrationsproblemen auf die Spur zu kommen. Ein kleiner Test hat keine externen Abhängigkeiten, ist sehr schnell in der Ausführung und testet nur eine oder wenige Funkionen. Ein mittlerer Test kann mehrere Minuten dauern und auf Datenbank, Dateisystem oder localhost zugreifen. Ein grosser Test kann lange dauern und die Zusammenarbeit mit externen Systemen testen.

6. Alles dauert immer länger, als zunächst erwartet. Dies gilt im Besonderen für die Programmierung. Es ist tatsächlich schwierig, vorherzusagen, wie viel Zeit für die Implementierung eines bestimmten Programmfeatures benötigt wird, selbst wenn alles glatt laufen sollte. Bei der Softwareentwicklung ist es durchaus üblich, auf unerwartete Probleme zu stoßen. Sei es ein einfacher und routinemäßiger Merge von Sourcecode, welcher zu einem subtilen Fehler führt. Oder das Update eines genutzten Frameworks führt dazu, dass bestehende Methoden angepasst werden müssen oder ein API-Aufruf funktioniert nicht wie erwartet.

Ich denke, es steckt eine Menge Wahrheit im folgenden Zitat von Douglas Hofstadter (Hofstadter’s Law2)): “Es dauert immer länger als zunächst erwartet, selbst dann, wenn man das Hofstadter Gesetz beachtet. (Welches besagt, dass es immer länger dauert als zunächst erwartet, selbst dann, wenn man das Hofstadter Gesetzt beachtet (Welches wiederum besagt, dass…).

7. Man muss zunächst den bestehenden Code verstehen. Große Teile der Programmierung befassen sich mit der Manipulation von bereits vorhandenem Programmcode (Legacy Code). Auch wenn Sie eine komplett neue Funktion entwickeln, müssen Sie sicherstellen, dass diese in das vorhandene Programm integriert wird. Und nun die Herausforderung: bevor sie eine neue Funktion integrieren können, müssen Sie den aktuellen Programmcode verstehen. Ansonsten könnten Sie bereits vorhandene Funktionalität beschädigen. Dies bedeutet, dass das Lesen von Quellcode eine ebenso wichtige Eigenschaft ist, wie das Schreiben von Programmcode. Dies ist auch einer der Gründe, warum das entwickeln, scheinbar kleiner Änderungen, länger dauern kann als geplant. Denn Sie müssen den Kontext verstehen, indem Sie die Änderung durchführen wollen.

8. Code lesen und Code ausführen. Wie oben bereits erwähnt, steht man als Entwickler häufig vor der Aufgabe Legacy Code zu manipulieren. Glücklicherweise können Sie immer zwei Wege gehen, um den fremden Quellcode zu verstehen. Sie können den Code lesen, und Sie können den Code ausführen. Letzterer Weg ist ideal um ein besseres Verständnis für den Programmcode zu bekommen. Achten Sie darauf, den Einsatz beider Methoden zu machen.

 

Fehlerbehebung

9. Es wird immer Fehler geben. Die Einstellung oder gar der Anspruch, das in der Softwareentwicklung alles sofort und gleich beim ersten Mal funktionieren muss, kann ich nicht teilen. Unabhängig ihrer Bemühungen, die sie bei der Entwicklung einbringen, wird Ihr Programm weiterhin Fehler enthalten. Ein besserer Ansatz wäre, ein Softwaresystem zu haben, welches einem die Fehlersuche und Fehlerbehebung erleichtert sowie eine elegante Möglichkeit, die korrigierten Bestandteile in das aktuelle System einzupflegen.

10. Achten Sie auf die Fehlerberichte. Ein nicht unwesentlicher Teil der Arbeit eines Entwicklers widmet sich der Lösung von Fehlerberichten. Ob diese nun von der internen QS oder direkt vom Kunden erstellt wurden, ist zweitrangig. Fehlerberichte von Kunden geben Ihnen ein besseres Verständnis dafür wie der Kunde mit dem System arbeitet und wie er es benutzt. Darüber hinaus sind Fehlerberichte immer ein gutes Mittel zur selbstkritischen Auseinandersetzung mit dem System. Man erhält einen Eindruck darüber wie einfach oder kompliziert die Fehlersuche sein kann und ob das Produkt intelligent aufgebaut ist. Es ist auch eine gute Gelegenheit, dem Kunden gegenüber Verantwortung für das eigene System zu zeigen. Aus diesen Gründen heraus, sollten Sie Fehlerberichten positiv gegenüberstehen.

11. Bauen Sie den Fehler nach. Einer der ersten Schritte in der Fehlerbehebung ist die kontrollierte Reproduzierbarkeit des Fehlers. Somit können Sie sicher sein, dass wenn Sie ihre Lösung integriert haben, der Fehler nicht mehr auftaucht. Diese simple Vorgehensweise stellt sicher, dass Sie keine Vermutungen über die Ursache des Fehlers anstellen müssen, sondern gezielt das Problem angehen.

12. Lösen Sie erst die bekannten Fehler, und schauen Sie was noch übrig bleibt. Manchmal sieht man sich mit mehreren Problemen oder Fehlern gleichzeitig konfrontiert. Gut möglich, das einige der Fehler zusammenhängen und ein merkwürdiges Verhalten Ihrer Software verursachen. Anstatt sich nun durch dieses merkwürdige Verhalten ablenken zu lassen, sollten Sie sich auf die bereits erfassten und dokumentieren Fehler konzentrieren und diese gezielt lösen. Und erst dann bleiben vielleicht noch irgendwelche Symptome zurück, unter denen Ihre Software leidet.

13. Unterstellen Sie keine Zufälle. Während des Testens und der Fehlerbehebung, sollten Sie niemals an Zufälle glauben. Sie haben kürzlich eine Datums- oder Zeitvariable verändert und nun beendet sich ihre Anwendung unerwartet von selbst. Sie haben kürzlich eine neue Funktion integriert, und ein ältere und davon unabhängige Funktion wird plötzlich langsam. Kein Zufall; stellen Sie Nachforschungen an.

 

Zusammenarbeit

14. Von Angesicht zu Angesicht bietet das größte Spektrum. Bei der Diskussion mit Kollegen, wie ein bestimmtes Problem gelöst werden kann, greift man gerne zum Telefon oder schreibt eine kurze Email. Dagegen bin ich sehr darüber erstaunt, wie eine direkte und persönliche Erörterung mit einem Kollegen zu einer schnelleren und häufig besseren Lösung beiträgt.

15. Rubber ducking3). Immer wenn Sie nicht weiterkommen, gehen Sie zu einem Kollegen, und erklären Ihm das Problem. Es kommt nicht selten vor, dass man einem Kollegen das Problem mündlich vorträgt, und während dessen, selbst auf die Lösung kommt. Auch nicht selten, kommt der Kollege gar nicht zur Wort. Klingt wie Zauberei, aber es funktioniert erstaunlich oft.

16. Frage. Das Lesen und Ausführen von Programmcode ist prima, um selbst herauszufinden, wie etwas funktioniert. Sollten Sie jedoch die Option haben, jemanden direkt zu Fragen (möglicherweise sogar den ursprünglichen Autor), dann nutzen Sie diese sich bietende Gelegenheit. Die Möglichkeit spezifische Fragen zu stellen, sowie Folgefragen, können einem die nötigen Informationen innerhalb von Minuten liefern.

Verschiedenes

17. Versuchen Sie es. Wenn Sie unsicher sind, wie es bestimmtes Sprachfeature funktioniert, dann schreiben Sie einfach ein kleines Beispielprogramm. Das gleiche gilt auch für das Programm welches Sie entwickeln. Was passiert, wenn ein bestimmter Parameter auf -1 gesetzt wird? Was passiert mit einem bestimmten Dienst, wenn das System neu gestartet wird? Finden Sie heraus, wie es funktioniert. Gezieltes hantieren führt häufig zur Aufdeckung von Fehlern und nebenbei vertiefen Sie ihr Wissen um die Funktionsweise des Systems.

18. Schlafen Sie drüber. Wenn Sie an der Lösung für ein hartnäckiges Problem arbeiten, kann es ratsam sein, eine Nacht darüber zu schlafen, bevor Sie sich entscheiden. Dann beschäftigt sich ihr Unterbewusstsein mit dem Problem, auch wenn Sie nicht aktiv daran denken. Das Ergebnis ist häufig, dass ihnen am nächsten Tag die Lösung als offensichtlich erscheint.

19. Veränderung. Fürchten Sie sich nicht, ab und zu mal die berufliche Rolle zu wechseln. Es ist inspirierend mit verschiedenen und neuen Leuten zu arbeiten, ein neues Produkt zu entwickeln oder auch mal das Unternehmen zu wechseln. Mein Ansicht, verbleiben viele Menschen zu passiv in ihrer aktuellen beruflichen Rolle, und dass Jahr für Jahr. Eine Änderung wird meistens nur durch äußere Umstände forciert.

20. Lassen Sie sich nicht vom Lernen abhalten. Eine wirklich tolle Sache in der Softwareentwicklung ist, dass es immer Raum für Neues gibt. Versuchen Sie sich eine neue Programmiersprache anzueignen, lesen Sie Bücher über Softwareentwicklung oder absolvieren Sie einen MOOC-Kurs4). Viele kleine Schritte erweitern ihr Wissen und ihre Fähigkeiten und machen in der Summe einen wirklichen Unterschied aus.

 

Fußnoten und Verweise   [ + ]

1. http://en.wikiquote.org/wiki/John_Gall
2. http://en.wikipedia.org/wiki/Hofstadter%27s_law
3. http://en.wikipedia.org/wiki/Rubber_duck_debugging
4. http://de.wikipedia.org/wiki/Massive_Open_Online_Course

Zufallstextgenerator

Ein Bekannter sprach mich vor einiger Zeit mal an und wollte wissen, wie er einen Textgenerator in seine kleine Vereinswebsite einbinden kann. Der Textgenerator soll bei jedem neuen Laden der Website einen neuen und zufälligen Text (in seinem Fall sollten das Bibelstellen sein) darstellen. Der erste Gedanke, die einzelnen Texte in eine Datenbank zu hinterlegen wurde sofort wieder verworfen. Um die gewünschten Texte dauerhaft abzulegen, genügte eine einfache Textdatei. Für die Programmierung des Textgenerators kam mir als erstes JavaScript in den Sinn. Die Anforderungen kurz zusammengefasst:

Generator 1

  •  Anzeige von Bibelstellen / kurze Textauszüge aus der Bibel aus dem neuen Testament inklusive Bibelstelle
  • Jedes neue Laden der Website lässt einen anderen Text erscheinen, d.h. sobald die Seite geladen wird, wechselt der Bibelvers
  • Insgesamt wenig administrativer Aufwand um neue, weitere Texte einzubinden
  • Insgesamt wurden 365 Bibelstellen aufgenommen
Der hier angezeigte Quelltext ist in verkürzter Form wiedergegeben und ist nicht lauffähig. Den ausführbaren ‘Generator 1’ finden Sie weiter unten zum herunterladen und ausprobieren.

Generator 1 JavaScript Source-Code

 

 Generator 2

  • Anzeige von Bibelstellen / kurze Textauszüge aus der Bibel
  • Der angezeigte Text ist abhängig vom Datum
  • Je aktuellem Kalendertag ein Text
  • Insgesamt wenig administrativer Aufwand um neue Texte einzubinden
Der hier angezeigte Quelltext ist in verkürzter Form wiedergegeben und ist nicht lauffähig. Den ausführbaren ‘Generator 1’ finden Sie weiter unten zum herunterladen und ausprobieren.

Generator 2 JavaScript Source-Code

BoxCryptor – Das Kondom für die Cloud

Nein, es geht hier nicht um Safer Cybersex! Und der eigentliche Titel dieses Posts sollte eher nach “BoxCrypter – Sicherheit für die Cloud” klingen, oder so ähnlich. Zahlreiche Cloud-Speicherdienste1) verschlüsseln die abgelegten Daten, jedoch sind diese auch in der Lage, wenn nötig, diese Daten wieder zu entschlüsseln. BoxCryptor ist eine großartige Lösung, um sicherzustellen, das Ihre Onlinedaten privat bleiben, unabhängig davon, wie sie gespeichert sind.

Eines der verstecken Probleme von Online-Speicherdiensten ist das der Privatsphäre. Genauer gesagt, fast alle Speicherdienste haben die Möglichkeit, ihre gespeicherten Daten zu überprüfen oder gegebenenfalls an Strafverfolgungsbehörden zu übergeben. Unabhängig davon, ob der Anbieter die Daten selbst verschlüsselt. Dabei handelt es sich vornehmlich um Dienste, welche in den USA ansässig sind.

Ich hoffe, die meisten von uns werden nie jemals mit den Strafverfolgungsbehörden zu tun haben. Doch was ist mit den Mitarbeitern dieser Online-Speicherdienste? Die Erkenntnis, dass hinter all der Technik immer noch Menschen arbeiten und der Verlockung des Ausspähens nicht widerstehen, können da einem schon Sorgen bereiten. Dieser Gedanke an einen kriminellen Mitarbeiter, lässt viele potenzielle Nutzer einen großen Bogen um die vermeintlich sicheren Cloudanbieter machen.

Dabei ist die Lösung des Problems sehr naheliegend: verschlüsseln Sie Ihre Daten selbst!

Leider ist für viele Nutzer, beim Thema Verschlüsselung, der Horizont des technischen Verständnisses überschritten und eine weitere Schicht an Komplexität bringt viele zur Resignation, ohne sich weitere Gedanken für die Sicherheit der eigenen, privaten Daten zu machen.

BoxCryptor ist dagegen eine schön unauffällige Verschlüsselungslösung und in der Basisversion kostenlos für den persönlichen Gebrauch.

Versteckte Probleme

Online-Speicherdienste sind leistungsfähig und nützlich, wenn man sie richtig verwendet. Mit “richtig” meine, dass der Onlinedienst bzw. das entsprechende Benutzerkonto nach bestimmten Sicherheitsaspekten (z.B. ein sicheres Anmeldepasswort) eingerichtet ist und das die Daten, welche beim Speicherdienst hinterlegt sind, auch woanders angemessen gespeichert sein sollten. Die Nichtbeachtung einer dieser Punkte kann zu dauerhaften Datenverlust oder Schlimmeren führen.

Sind die abgelegten Onlinedaten selbst mit Beachtung dieser Sicherheitsaspekte einigermaßen geschützt, existiert weiterhin ein massives Datenschutzproblem.

  • Ihre online abgelegten Daten können nicht verschlüsselt werden und befinden sich somit im vollen Zugriff für jeden der Zugang zum Server des Online-Speicherdienstes hat. Möglicherweise jemand, der Ihre Anmeldedaten hat oder wieder ein Schurke von Mitarbeiter.
  • Ihre Daten können durch den Dienstanbieter verschlüsselt werden, aber, da es durch den Dienstanbieter verschlüsselt ist, kann es auch durch den Dienstanbieter entschlüsselt werden. Mit dem Ergebnis, dass Personen mit administrativen Zugriff, immer noch die Möglichkeit haben, Ihre Daten einzusehen und gegebenenfalls manipulieren.

In Wirklichkeit sind die Mitarbeiter bei großen und namhaften Speicherdiensten Profis und haben kein Interesse an der Schnüffelei in Ihren Daten. Fälle von “Schurken-Mitarbeitern” sind wirklich selten. Aber natürlich ist es immer noch möglich.

Eher wahrscheinlich und sogar rechtmäßig2), kann der Anbieter verpflichtet werden, Ihre Daten, für die Behörden freizugeben.

Natürlich sind das alles Dinge, welche das Speichern von Daten auf einem Onlinedienst eher zum Problem werden lassen. Glücklicherweise hat diese Problem eine Lösung: Verschlüsselung.

Und wo ist der Haken?

Es gibt eigentlich nur einen einzigen guten Grund, dass Ihr Speicherdienst die Möglichkeit hat ihre Daten zu entschlüsseln: der direkte online Zugang (via Browser) zu Ihren Daten. Und zwar in einer für Sie lesbaren Form (also unverschlüsselt).

Wenn Ihr genutzter Online-Speicherdienst, die auf dem Server gespeicherten Daten, verschlüsselt, muss dieser auch in der Lage sein, diese Daten wieder zu entschlüsseln. Nur somit haben sie die Möglich, auf ihre Daten über einen Browser direkt zuzugreifen. Beim Anbieter Dropbox zum Beispiel, können Sie auf ihr Benutzerkonto von einem beliebigen Computer aus sich anmelden und auf Ihre im Internet gespeicherten Daten direkt zugreifen.

Wenn Sie Ihre Daten mit BoxCryptor selbst verschlüsseln und dann erst beim Speicherdienst ablegen, liegen Ihre Daten ausschließlich in verschlüsselter Form ihrem Dienstanbieter vor. Sie benötigen BoxCryptor auf Ihrem Computer, und natürlich alle korrekten Anmeldedaten zu Ihrem Benutzerkonto, um Ihre verschlüsselten Daten zu entschlüsseln, bevor Sie in der Lage sind, diese Daten zu verwenden.

 Traditionelle Lösungen

Die Idee dahinter ist einfach, bevor Sie Ihre Daten bei einem Speicherdienst hochladen, werden diese Daten von Ihnen verschlüsselt. Somit hat der Speicherdienst keinerlei Möglichkeit, Ihre Daten einzusehen. Sie, und nur Sie3), steuern den Zugriff auf Ihre Daten.

Der traditionelle Weg:

  • Sie haben eine oder auch mehrere Dateien, die Sie bei Ihrem Speicherdienst ablegen wollen
  • Sie nutzen Programme wie z.B. 7-Zip, Axcrypt oder TrueCrypt um Dateien zu verschlüsseln
  • Sie legen ihre Daten Speicherdienst ab

Natürlich wollen Sie wieder auf diese Dateien zugreifen, auch von jedem anderen Computer. Dazu sind folgende Schritte zu machen:

  • Abrufen der verschlüsselten Dateien vom Speicherdienst
  • Entschlüsselung der Datei/en
  • Gewünschte Änderungen vornehmen

Schließlich müssen Sie ihren Speicherdienst wieder auf den neuesten Stand bringen (sollten Sie bestehende Dateien verändert haben), dazu:

  • Erneutes verschlüsseln der betroffenen Datei/ein
  • Hochladen der verschlüsselten Dateien in den Onlinespeicher

Wie Sie sehen können, ist das eine Menge Arbeit, um nur, beispielsweise, eine einzelne Datei zu ändern. An dieser Stelle kommt BoxCryptor ins Spiel.

BoxCryptor

Vielen dürfte TrueCrypt ein Begriff sein und im weitesten Sinne arbeitet BoxCryptor ähnlich. Hier ein kurzer Abschnitt über die Arbeitsweise von Truecrypt.

Zum Chiffrieren von Dateien und Verzeichnissen legt TrueCrypt virtuelle Laufwerke an. Diese funktionieren wie ein gewöhnliches Wechsellaufwerk. Ein neues Laufwerk, sagen wir mit dem Laufwerksbuchstaben “W”, erscheint im Dateimanager und alle darin enthaltenen Dateien und Ordner erscheinen als unverschlüsselte, also lesbare, Informationen. Beim Speichern verschlüsselt TrueCrypt die Daten automatisch in dieser Containerdatei. Beim Lesezugriff entschlüsselt es sie wieder.

Solange der TrueCrypt Container als Laufwerk eingebunden ist (gemountet*), ist dessen Inhalt direkt zugänglich. Wirft man das virtuelle Laufwerk aus (dismount), ist lediglich die Containerdatei (die Hülle) sichtbar, jedoch ohne den Inhalt einsehen zu können.

ProcessSteps_truecrypt

 

Die Funktionsweise von BoxCryptor ist ähnlich, jedoch mit dem entscheidenden Unterschied, dass der Container lediglich ein einfacher Ordner ist. Dieser Ordner wird ebenfalls gemounted und es erscheint wieder ein Wechseldatenträger, nennen wir dieses mal Laufwerk “L:”, in ihrem Dateimanager. Alle Schreibzugriffe auf dieses Laufwerk “L”, also das erzeugen neuer Dateien oder Ordner sowie das ändern bereits vorhandener Dateien, werden verschlüsselt. Die Entschlüsselung erfolgt unmittelbar beim Öffnen einer Datei (on the fly).ProcessSteps_boxcryptor

Die Dateien im ursprünglichen Quellverzeichnis sind immer verschlüsselt. Erst nachdem dieses Verzeichnis in BoxCryptor eingebunden ist, werden die Dateien unverschlüsselt im virtuellen Laufwerk angezeigt.

Beispiel für die Verwendung von BoxCryptor

Das folgende Beispiel bezieht sich auf die Verwendung von BoxCryptor mit Dropbox.
Auf diesem Computer gibt es den folgenden Ordner:

C:\Dropbox

In diesem Ordner befinden sich zahlreiche Dateien und Ordner, welche automatisch mit dem Dropbox Server synchronisiert werden. Eben die typische Funktionsweise von Dropbox.

Ein weiterer Ordner innerhalb dieses Dropboxordners ist der folgende:

C:\Dropbox\Boxcryptor

In diesen BoxCryptor Ordner werden keine Dateien hinzugefügt. Dieser Ordner ist somit völlig leer zu Beginn.

Als nächstes installiert man BoxCryptor und stellt es so ein, dass der Ordner “C:\Dropbox\Boxcryptor” als Wechseldatenträger eingebunden wird (mounten). Darüber hinaus sollte man BoxCryptor erlauben, sich das BoxCryptor-Passwort dauerhaft zu merken. Somit spart man sich die erneute Eingabe in der Zukunft.

Somit erscheint der soeben eingebundene Wechseldatenträger “Laufwerk L:” im Dateimanager.

Nun erzeugt man eine neue Datei und speichert diese im “Laufwerk L:” ab:

L:\PrivateInformationen.docx

Diese neue Datei wird nun ebenfalls im BoxCryptor-Ordner innerhalb von Dropbox angezeigt.

C:\Dropbox\Boxcryptor\PrivateInformationen.docx

Diese auf dem Laufwerk L: gespeicherte Datei wurde automatisch verschlüsselt und in den vordefinierten Zielordner für BoxCryptordateien abgelegt. Dropbox bemerkt diese Änderung, eine neue Datei wurde hinzugefügt, und die verschlüsselte Datei wird mit dem Dropbox-Server synchronisiert. Man beachte, dass ausschließlich die verschlüsselte Version der neue erzeugten Datei auf den Dropbox-Server hochgeladen wurde.

Die Datei im “Laufwerk L:” kann nach belieben weiter bearbeitet werden. Es ist nur eine Datei wie jede andere und kann dementsprechend manipuliert werden. Sobald die gemachten Änderungen gespeichert werden, wird die dazugehörige verschlüsselte Version dieser Datei entsprechend aktualisiert.

Sobald man den BoxCryptor-Ordner, unser “Laufwerk L:”, auswirft (dismountet), ist dieser Ordner nicht mehr sichtbar. Dies betrifft auch die unverschlüsselten Versionen der darin enthaltenen Dateien und Ordner. Was bleibt, sind die im BoxCryptor-Ordner verschlüsselt gespeicherten Dateien innerhalb des Dropbox-Ordners.

Um es nochmal zu betonen, ausschließlich die verschlüsselten Versionen ihrer Dateien werden zum Onlinespeicherdienst hochgeladen.

TrueCrypt oder BoxCryptor

Meiner Meinung gibt es wenige, jedoch ziemlich vernünftige Argumente, die eher für BoxCryptor sprechen als für die Nutzung von TrueCrypt.
Die im Alltag relevanten und praktischen Unterschiede lassen sich auf folgende Argumente reduzieren:

Voll- vs. inkrementelles Update: Der größte Nachteil bei der Verwendung von TrueCrypt mit einem Dienst, wie z.B. Dropbox, ist die Nutzung der Container. Alle Änderungen an einer darin enthaltenen Datei bedeutet, dass die gesamte Datei (also der gesamte Container) als verändert betrachtet wird und somit vollständig mit dem Dropbox-Server abgeglichen werden muss. BoxCryptor dagegen, hält einzelne Dateien als einzelne Dateien. Der Vorteil ist offensichtlich: bei der inkrementellen Sicherung sind nur die Dateien betroffen, welche seit der letzten Synchronisierung/Sicherung verändert wurden. Für diese Art wird am wenigsten Zeit benötigt.

Open Source vs. Closed Source: TrueCrypt ist ein Open-Source Projekt und dessen Quellcode ist somit einsehbar und kann überprüft werden. BoxCryptor ist ein kommerzielles Produkt von einem deutschen Unternehmen. Die Nutzung von BoxCryptor erfordert, dass Sie dieser Firma vertrauen.

Es ist auch mein Verständnis, dass TrueCrypt, neben den zahlreichen Verschlüsselungsoptionen, eher für leistungshungrige Prozesse optimiert ist. Mit TrueCrypt kann man ganze Festplattenpartitionen verschlüsseln.

TrueCrypt ist kostenlos, egal für welche Anwendungszwecke Sie es einsetzen wollen. BoxCryptor in der Basisversion ist ebenfalls kostenlos. Darüber hinaus gibt es unterschiedliche Lizenzierungsstufen mit entsprechenden Zusatzfunktionen. Diese Zusatzfunktionen erscheinen mir insbesondere im kommerziellen Umfeld als sehr wichtig.

Kurz gesagt, BoxCryptor ist mein klarer Favorit für die Verschlüsselung von Dateien, welche bei einem Onlinespeicherdienst, z.B. Dropbox, abgelegt werden sollen. TrueCrypt dagegen, bleibt meine erste Wahl bei der Verschlüsselung von Offline-Daten, welche nicht über einen Speicherdienst synchronisiert werden müssen. Und natürlich ist es durchaus möglich, beide Programme nebeneinander zu verwenden.

Nicht nur für den PC

Neben zahlreichen Speicherdiensten wie Dropbox, unterstützt BoxCryptor auch mehrere Plattformen:

  • Windows
  • Windows RT
  • Mac OS X
  • Android
  • iOS
  • Blackberry
  • Chrome

BoxCryptor ist kostenlos für den persönlichen Gebrauch, aber…

Ich würde ihnen jedoch empfehlen, sich die Personal-Lizenz zu spendieren.

Neben dem besseren Kundensupport, beinhaltet die Personal-Edition eine ziemlich nützliche Funktion: Dateinamenverschlüsselung.

Wie Sie weiter oben noch sehen können, unsere Beispieldatei lautete:

L:\PrivateInformationen.docx

Und wurde hier gespeichert:

C:\Dropbox\Boxcryptor\PrivateInformationen.docx

Wie man unschwer erkennen kann, der Dateiname ist weiterhin sichtbar.

Für die meisten von uns stellt das sicherlich keine großes Problem dar. Dennoch besteht die Möglichkeit, selbst bei verschlüsselten Dateien (also nur der Inhalt ist verschlüsselt), über den Dateinamen ungewollte Informationen Preis zu geben.

Sollten Sie die “Unlimited Personal” Lizenz erworben haben, gibt es die Möglichkeit, den Dateinamen ebenfalls zu verschlüsseln. In unserem Beispiel könnte das Beispieldokument auf diese Art erscheinen:

C:\Dropbox\Boxcryptor\uFrL31p9-ZTM

Sobald Sie das entsprechende “Laufwerk L:” (um dem vorangegangenen Beispiel treu zu bleiben) erneut einbinden (mounten), erscheinen die Dateinamen wieder in unverschlüsselter Form wieder.

So nutze ich BoxCryptor

Zu der Zeit, in der dieser Artikel entstand, nutzte ich BoxCryptor bereits über ein Jahr. Anfangs nur die Basisvariante. Jedoch wechselte ich ziemlich rasch zur Unlimited-Personal-Edition, um die Möglichkeit zu haben, BoxCryptor auf allen meinen Geräten zu installieren (insgesamt 7 Stück).

Wie im obigen Beispiel demonstriert, enthält mein Dropbox-Ordner einen eigenen Unterordner, welcher ausschließlich für zu verschlüsselnde Dateien vorgesehen ist. Welche somit über den Dropbox-Server mit allen meinen Geräten synchron gehalten werden.

TrueCrypt selbst nutze ich ausschließlich für die Verschlüsselung von Festplattenpartitionen.

Die Nutzung von BoxCryptor gibt mir das Gefühl meinen Speicherdienst Dropbox noch intensiver zu können, auch für Dinge, die nicht unbedingt in einen monolithischen TrueCrypt-Container gehören, aber dennoch ein Unbehagen verursachen würden, wären sie unverschlüsselt.

BoxCryptor ist ein überzeugende und komfortable Lösung mit der Gewährleistung, dass die beim Speicherdienst abgelegten Daten sicher dort bleiben und auch nur Ihnen selbst zugänglich sind.

Fußnoten und Verweise   [ + ]

1. Der überbewertet, und mittlerweile ausgelutschte, Marketing-Begriff “Cloud” ist wirklich nicht mehr als ein Ersatz für ‘online’. Das, was oft als “Cloud Storage” betitelt wird, ist eigentlich nichts anderes als Speicherplatz, welcher von einem Online-Service zur Verfügung gestellt wird.
2. Natürlich in Abhängigkeit des jeweiligen Landes
3. Oder jeder, der ebenfalls im Besitz ihrer Anmeldedaten ist.

Lokalisierung von WP Cloudy

Hintergrund

Die Wetterdaten aus dem Open Weather XML-Feed sind bereits in 23 Sprachen verfügbar. Die Wochentage werden aus einer PHP-Funktion generiert in Abhängigkeit der Spracheinstellungen des Hostservers (da, wo die WordPress-Installation liegt). Die verbleibenden Textteile / Wörter sind in bereits zwei Sprachen übersetzt, nämlich englisch und französisch. Und genau um diese  verbleibenden Textteile und Wörter geht es bei der Lokalisierung des WP Cloudy Plugins.

Werkzeuge

Poedit ist ein GNU gettext Editor (Spezifikation), welcher für Windows als auch für Mac verfügbar ist. Es gibt eine Free-Version als auch eine kostenpflichtige Pro-Version.

Poedit download

Lokalisierung WP Cloudy

Ein weiteres nützliches Werkzeug ist natürlich ein FTP-Client um an die WP Cloudy Plugindateien zu kommen. Bei mir kommt FileZilla zum Einsatz. Mit dem FTP-Programm, geht man dann über das Stammverzeichnis der WordPress-Installation (zB: http://deineSeite.de/wp-content/plugins/wp-cloudy/) in den WP Cloudy PlugIn-Order und öffnet den Ordner lang. Darin befinden sich 4 Dateien, jeweils ein Paar für die englischen bzw. französischen Texte. Das entspricht den Einstellungen ab Werk.

wordpress_wpCloudy_lang

WP Cloudy Verzeichnis

Um weitere Sprachen bzw. Übersetzungen anzulegen, kopiert man zunächst die Datei wpcloudy.po in das gleiche Verzeichnis. Man kann natürlich auch die Datei woanders hin kopieren und bearbeiten. Wichtig ist nur, dass die neue Datei wieder im lang-Order landet. Die neue, also kopierte Datei wird nach dem folgenden Schema unbenannt:

wpcloudy-deinSprachCode_deinLaenderCode

Für eine deutsche Lokalisierung würde der Dateiname nun lauten: wpcloudy-de_DE.po

Die Sprach- bzw. Länderspezifischen Code findet man auf den Seiten der GNU gettext Spezifikation. Hier die Sprachcodes und hier die Ländercodes.

Bisher haben wir lediglich eine Kopie der Quelldatei der englische Texte erstellt. Nun kommt das Tool Poedit ins Spiel (sollte natürlich vorher installiert worden sein). Die *.po Dateien sind automatisch mit Poedit verknüpft und somit wird das Tool direkt gestartet. Wir bearbeiten jetzt die Datei wpcloudy-de_DE.po.

In Poedit nehmen wir zunächst eine kleine Anpassung im sogenannten Katalog vor.

wordpress_wpCloudy_lang_2

Hier noch die Katalogeinstellungen der Quelldatei für englische Texte

Wir ändern die Einstellung auf unsere gewünschte Sprache. In unserem Fall auf deutsch. Dazu unter Katalog den Menü-Eintrag Eigenschaften… auswählen.

wordpress_wpCloudy_lang_4

Katalog-Eigenschaften der Quelldatei auf deutsch umstellen.

 

Die eigentliche Arbeit der Übersetzung kann jetzt beginnen. Man wählt/markiert eine gewünschte Zeile und schreibt die Übersetzung in das entsprechende Eingabefeld. Dass macht man dann für alle gewünschten Textstellen. Damit die ganze Arbeit nicht verloren geht, unbedingt die gemachten Änderungen speichern. Die *.po-Dateien sind die Quelldateien und als solche auch in einem normalen Texteditor lesbar bzw. veränderbar. Eleganter und sicherer ist es natürlich die Übersetzung in Poedit zu machen. Insbesondere auch deshalb, weil man die *.po-Datei noch kompilieren muss.

 

wordpress_wpCloudy_lang_7

*.po-Datei in einfachen Texteditor

 

Dazu geht man in den Menüeintrag MO-Datei erstellen… (unter Datei) und speichert diese entsprechend ab. Idealerweise unterscheidet sich die Datei lediglich in der Dateiendung. Wir haben jetzt also zwei Dateien. Eine Quelldatei der Übersetzung wpcloudy-de_DE.po und eine kompilierte Übersetzung als wpcloudy-de_DE.mo.

wordpress_wpCloudy_lang_6

Kompilierte Übersetzung erzeugen

Beide Dateien werden auf den Server geladen. Das Zielverzeichnis ist wieder der lang-Order des Plugins WP Cloudy.

Kompilierte Übersetzung einbinden

Um nun die Dateien in WordPress einzubinden bedarf es eines weiteren Plugins. Eine Empfehlung ist das Plugin CodeStyling Localization. Im weitesten Sinne würde dieses Plugin sogar das zuvor verwendete Programm Poedit überflüssig machen, da damit alle gettext Übersetzungsdateien (*.po & *.mo) direkt im WordPress Admin Center bearbeitet werden können. Darin editierte oder gar vollständig erstellte Übersetzungsdateien sind 100% kompatibel zu Poedit.

Das installierte Plugin befindet sich dann im WordPress Menü unter Werkzeuge.

 

wordpress_wpCloudy_lang_8

 

 

Um die Auswahl der angezeigten Möglichkeiten etwas zu reduzieren, kann man auf den Filter Plugin klicken.

wordpress_wpCloudy_lang_9

Ergebnis eingrenzen mit Filter für Plugin

Anschließend navigiert man zum entsprechenden Plugin WP Cloudy.

wordpress_wpCloudy_lang_10

Übersetzung für WP Cloudy

Sobald man auf bearbeiten klickt hat man wieder die Möglichkeit die bereits übersetzten Texte einzusehen bzw. neue Übersetzungen hinzufügen. Ein ganz wichtiger Schritt, damit die Übersetzung überhaupt aktiv werden kann, muss der Kompiliervorgang gestartet werden. Dazu gibt es die bereits im Plugin integrierte Funktion zur Erstellung einer aktuellen mo-Datei.