Schlagwort-Archive: Oracle

In Vorbereitung auf das baldige Ende von Windows als meinem Haupt-Betriebssystem nach mehr als 23 Jahren experimentiere ich unter anderem mit VirtualBox als Ausführungsumgebung für alte Windows-Versionen, um darin alte Spiele auch weiterhin verwenden zu können. Nachdem sich in meinem letzten Artikel zu diesem Thema PCem als PC-Emulator für Windows 98 SE zumindest im Rahmen meiner Stichprobe bereits als überraschend kompatibel und ergiebig erwiesen hat, wollte ich den Schwierigkeitsgrad nun deutlich erhöhen. Heute geht es um das Thema Virtualisierung mit der beliebten Open-Source-Lösung VirtualBox.

Die Unterstützung für Windows 95/98 unter VirtualBox ist bekanntermaßen miserabel, weil die Entwickler darauf bedauerlicherweise überhaupt keine Lust haben. Daher gibt es auch keinerlei Guest-Additions (wie etwa unter VMware), und die Hardware-Unterstützung ist bestenfalls rudimentär. Keine gute Voraussetzung, um damit Spiele testen zu wollen. Aber was wäre die Community ohne ihr Ideenreichtum, denn es gibt durchaus fundierte Anleitungen im Internet, um zum Beispiel Windows 98 einigermaßen genießbar zu machen. Wie einigermaßen genießbar das am Ende sein würde, darüber wollte ich mir nun selbst ein Bild machen, um zu sehen, ob diese Option für mich eine Zukunft haben könnte.

Google funktioniert im Jahr 2020 immer noch mit dem beliebten Internet Explorer 5

Wie bereits im Artikel zuvor möchte ich betonen, dass das hier keine Anleitung werden soll, denn für interessierte Mitleidende gibt es bereits genug Hilfestellung im Netz. Stattdessen gehe ich auf die Dinge ein, die mir aufgefallen sind. Während man bei der Konkurrenz von VMware zur Installation von Windows 98 zum Beispiel mit einer vollständigen Unattended-Installation und sehr leistungsfähigen Guest-Additions umschmeichelt wird, bekommt man unter VirtualBox nicht einmal einen Knochen hingeworfen. Windows 98 verbrennt Out-Of-The-Box unter VirtualBox mangels ACPI-Unterstützung leider CPU-Zyklen ohne Ende, was das Betriebssystem komplett unbenutzbar macht. Das Problem ist zwar lösbar, allerdings muss man dazu den Installationsvorgang etwas modifizieren.

Am Ende des recht langwierigen Prozesses hat man ein lauffähiges und auch noch relativ reaktionsschnelles Betriebssystem, aber die Grafik- und Soundtreiber bleiben leider ein Problem, und die Gast-zu-Host-Kommunikation ist minimal. Eine Internetverbindung über LAN lässt sich noch mühelos konfigurieren, und schon darf man mit dem gruselig antiquierten Internet Explorer 5 ins Netz. Selbstredend gibt es für den senilen Browser hier nicht mehr viel zu sehen, da die meisten Webseiten längst auf völlig neue Technologien setzen. Um die Grafikeinstellungen zu verbessern, ist der SciTech Display Doctor 7 heute das Non-Plus-Ultra, der einen universellen SVGA-Treiber mitbringt, mit dem man Windows 98 auf bis zu 1600×1200 Pixeln und sogar 32 Bit Farbtiefe einstellen darf. Letzteres soll angeblich die Performance unter VirtualBox deutlich verbessern. Zumindest in dieser Hinsicht bekommt man also ein ganz brauchbares, modernes Setup in angenehmer Auflösung.

Das Thema Sound ist unter VirtualBox leider ein gewaltiger Hemmschuh. Die Virtualisierungssoftware bringt wahlweise eine virtuelle SoundBlaster 16 oder einen RealTek AC’97-Chip mit. Der geneigte Retrogamer bekommt natürlich feuchte Augen, wenn er nur die SoundBlaster 16-Option sieht, denn die wäre ja vollkommen ausreichend in 99% der Fällen. Aber leider haben die Flachzangen bei Oracle wohl an der Implementierung gespart. Die Leistung ist selbst mit dem offiziellen Creative-Treiber nur schwer zu ertragen, und MIDI-Unterstützung sucht man vergeblich, womit man in vielen Spielen von vor 1998 eben gänzlich ohne Musik auskommen muss. Aber es gibt Hoffnung, denn technikversierte Community-Mitglieder haben stattdessen einen obskuren Windows 95-Treiber für den AC’97-Chip aufgetan, der schließlich sogar MIDI ermöglicht. Dies ist heute offenbar das Mittel der Wahl, wenn man Windows 98 verwenden möchte. Das Umkonfigurieren der VM ist zum Glück nur eine Angelegenheit von Sekunden, und schon hat man eine andere Soundkarte drin.

Noch ist wenig los am Ballermann, in Holiday Island von 1996 in VirtualBox

Nun war es also an der Zeit, ein paar wirklich alte Spiele auf meine Installation loszulassen, darunter das von mir geschätzte und heutzutage kaum noch bekannte „Holiday Island“ von der Firma Sunflowers Interactive. Hierbei handelt es sich um ein witziges Aufbauspiel für ein Urlaubs-Resort auf einer tropischen Insel, ähnlich wie das neuere Rollercoaster Tycoon. Holiday Island ist berüchtigt dafür, bereits ab Windows 2000/XP nicht mehr problemlos lauffähig zu sein. Es lässt sich oft mit Hilfe von Registry-Tricks und anderen technischen Kniffen starten, zeigt dann aber während des Spielens unterschiedlichste Probleme, ist also nur noch bedingt spielbar. Das fällt natürlich nicht auf, wenn man immer nur die ersten 5 Minuten vom Spiel sehen will, um zu beweisen, dass es läuft.

Die Installation von Holiday Island verlief noch beinahe ohne Zwischenfälle, aber der CD-Kopierschutz machte daraufhin Schwierigkeiten, und die SVGA-Autoerkennung schlug bei mir fehl. Der erste erfolgreiche Start des Spiels nach einiger Bastelarbeit im Installationsverzeichnis machte Hoffnung und die Videos liefen einwandfrei. Nachdem ich die ersten Gebäude platziert hatte, erhielt ich einen Bluescreen in der VM, das Spiel lief aber weiter. Soundeffekte und Musik funktionierten mit dem AC’97-Soundchip ganz passabel. Die Performance war im großen und ganzen halbwegs brauchbar, wenn auch nicht optimal. Die Tonausgabe stotterte gelegentlich. Das Optionsmenü zeigte teilweise keine Beschriftungen. Nach etwa 15 Minuten fiel der Sound plötzlich grundlos aus. Fazit: Das Spiel ist spielbar, aber ein wenig leidensfähig muss man mindestens sein.

Zweites Spiel auf meiner Liste war Sim City 2000. Dieses ließ sich ganz einfach installieren und starten. Die Animation im Hauptmenü funktionierte nicht (benötigt wohl 256 Farben), und im Spiel gab es bei mir keine Soundeffekte, aber die MIDI-Musik läuft immerhin. Die Spielperformance sah soweit gut aus. Das Soundproblem ist natürlich eine gewaltige Einschränkung, die ich nicht lösen konnte, aber spielbar ist es irgendwie. Anschließend wollte ich Theme Hospital kurz testen, aber auch hier hat der CD-Kopierschutz den Start verhindert, und ich wollte keine Zeit damit vergeuden, noch mühsam eine lauffähige Version zusammenzupatchen.

Ein Weltraum-Monster greift Atlanta an, in Sim City 2000 aus dem Jahr 1993 in VirtualBox

Das dritte getestete Spiel war Myst von 1993, ein ebenfalls von mir sehr geschätztes Rätselspiel. Auch hier lief die Installation zunächst rund, bis der Installer mir mitteilte, dass er nun Apple Quicktime installieren wolle, woraufhin aber die Installation plötzlich beendet war, und nichts mehr passierte. Ein wenig verdutzt startete ich das Spiel, was auch funktionierte, aber es gab kein Introvideo zu sehen. Stattdessen lag direkt das mysteriöse Buch vor mir. Mit zwei Mausklicks konnte ich es öffnen um zum Pier der Myst-Insel katapultiert zu werden, aber das Spiel hing sich an dieser Stelle auf. Die Transition funktionierte nicht. Ein Neustart der VM war nötig. Das Experiment war für mich hier beendet.

Spiele unter Windows 98 in VirtualBox? Leider nein. Naja, einiges funktioniert natürlich, manchmal sogar erfreulich gut. Anderes dagegen klappt nur mit Einschränkungen oder überhaupt nicht. Die Spielekompatibilität ist hölzern und unkomfortabel, die Performance ok – wenn man Glück hat -, aber gern auch ruckelig und eher langsam, der Sound geht entweder nicht oder stottert. Videos funktionieren mal prächtig unter Holiday Island, aber in Myst leider wieder nicht. Selbstverständlich kann ich nicht ausschließen, dass meine Windows 98-Installation und meine VM-Konfiguration sich noch verbessern lassen, aber zumindest mit Hilfe der üblichen Anleitungen von Fans im Internet lässt sich meines Erachtens nicht viel mehr herausholen. Daher betrachte ich mein Setup dahingehend als nahe am Optimum. Und dieses ist unglücklicherweise wenig optimal um damit meine kleine (wenig repräsentative) Auswahl von Spielen zu spielen. Ich fürchte also, dieses Thema brauche ich künftig nicht mehr weiterverfolgen.

Eine gesunde Portion Selbstbeweihräucherung ist wohl nötig, nach dem Lern-Martyrium der vergangenen Wochen: Seit Donnerstag bin ich offiziell ein von Oracle zertifizierter professioneller(!) Java-Programmierer – endlich! Die hierzu nötige zweieinhalbstündige, umgerechnet 215 Euro teure Prüfung habe ich mit sagenhaften 91% glorreich bestanden. Zum Bestehen waren 65% richtige Antworten unter den insgesamt 65 Fragen nötig. Seit geschlagenen vier Jahren schon prokrastiniere ich dieses Thema vor mir her, weil ich genau wusste, was für ein Kraftakt das werden würde. Doch nun habe ich Nägel mit objektorientierten Köpfen gemacht. Ab jetzt bin ich nachweislich ein echter Java-Profi.

Wo die Vorgängerzertifizierung zum OCAJP meist noch ganz essentielle Sprachmechanismen, Konstruktoren, Operatoren, primitive Datentypen und Objekte und ihre Relationen zueinander, Vererbungshierarchien uvm. behandelt, besteht der OCPJP schon zum größten Teil daraus, dass man die halbe Java API auswendig kennen muss. Man sollte wissen welche Klassen und Methoden es gibt, in welchen Packages sie liegen, die dazugehörigen Parameterlisten, Rückgabetypen, welche Checked Exceptions diese werfen können, und das alles zu solch umfangreichen Themengebieten wie Collections/Generics, JDBC, Threads/Concurrency, Input-/OutputStreams, File IO/NIO.2, String-Verarbeitung und diverse andere. Außerdem werden einige Basis-Entwurfsmuster, Abstraktion und professionelles Klassendesign mit allen Fallen und Schikanen thematisiert, was alleine schon Stoff für eine ganze Prüfung gewesen wäre.

Bei allem Stolz auf das tolle Ergebnis, kam es für mich doch eher unerwartet, denn die schiere Menge an Themen, die man für die Prüfung vollständig verinnerlicht haben sollte, konnte einen schon sehr leicht erschlagen. Mein Prüfungsvorbereitungsbuch umfasst knapp 800 Seiten, dazu habe ich gleich zwei offizielle Online-Trainings von Oracle mitgemacht. Insgesamt fand ich den Lernaufwand mit grob geschätzt etwa 90 Nettostunden für meine Verhältnisse bereits enorm – und das obwohl laut Buch 200 Stunden empfohlen werden. Die offiziellen Oracle-Trainings grenzen meiner Meinung nach an Betrug, so behandeln sie nur einen Bruchteil des abgefragten Wissens, und selbst das auch nur oberflächlich, und kosten dazu noch unverschämt viel Geld. Hätte ich mich direkt nach dem Online-Training gutgläubig in die Prüfung gesetzt, wäre ich chancenlos durchgefallen.

Das Buch war schon deutlich hilfreicher, aber dazu musste man den fetten Wälzer erst einmal komplett gelesen haben, was mir schwerfiel. Das Werk scheint zwar bekannt und anerkannt zu sein, jedoch ist es – besonders in der zweiten Hälfte – voller Fehler. Offenbar hatte die Autorin keine Lust mehr, oder hat die Themen selbst nur noch so halb verstanden, über die sie schreiben sollte. Jedenfalls sind nicht wenige ihrer Antworten auf ihre eigenen Übungsfragen schlichtweg falsch, die Aufgaben mitunter fahrlässig missverständlich formuliert, oder sie lässt wichtige Fakten aus den Kapiteln einfach raus, um den Leser dann gezielt bei den darauf folgenden Übungsfragen auf die Schnauze fallen zu lassen. Am Ende habe ich mich über das Buch nur noch geärgert. Trotzdem war es allemal eine passable Vorbereitungsgrundlage.

Schließlich habe ich noch vier unabhängige Mock Exams (mit Erklärungen) absolviert, und ich bin sicher, diese haben mein Prüfungsergebnis am stärksten beeinflusst. Zunächst war ich über den sehr hohen Schwierigkeitsgrad entsetzt, und gleich unter den ersten paar Fragen waren Themen, von denen ich bisher noch nie gehört hatte, wo ich eigentlich nur raten konnte. Allerdings bestätigte mir das Ergebnis am Ende doch, dass es zum Bestehen locker reichen sollte. Dadurch lernte ich, was denn so die typischen Fragestellungen sind, und konnte bei meinen falschen Antworten auch gleich sehen, wo der Fehler lag. Die eigentliche Prüfung kam mir schließlich sogar irgendwie einfacher vor als die Mock Exams – was aber auch daran liegen könnte, dass ich alle Aufgabentypen und die häufigsten Fehler schon kannte, und oft wusste, auf welche Details ich besonders achten musste.

Dummerweise habe ich mir ausgerechnet in der Prüfungswoche die für 2018 längst überfällige Herbst-Erkältung eingefangen, so dass ich, statt mich mit einer Wärmflasche ins Bett zu legen, leider mit Halsschmerzen, dröhnendem Schädel, Triefnase und Husten die Java API pauken und dann sogar die Prüfung mit Handicap ablegen musste. Hätte ich die Prüfung denn nicht kurzfristig verschieben können? Nur theoretisch. Leider war das keine praktikable Option, schon da mein Zertifizierungspfad von Oracle nach Ablauf des Jahres nicht mehr angeboten wird. Hätte ich im Dezember keinen Prüfungstermin mehr bekommen, auf Grund welcher Umstände auch immer, dann hätte ich den OCPJP nicht mehr machen können. Dann hätte ich mit dem OCA Java 8 wieder von vorne anfangen müssen. So gesehen habe ich das Zertifikat also quasi in letzter Minute erlangt.

Ich bin sehr froh, dass das Thema hiermit ein erfolgreiches Ende hat, und ich fürchte, ich kann jetzt erst einmal kein Java mehr sehen. Das war einfach zuviel des Guten. Ist ja zum Glück auch bald Weihnachten, Zeit, mich auf meinen Lorbeeren auszuruhen, und vor allem mich auszukurieren. Und so schnell folgt nun keine nächsthöhere Zertifizierung, was auch gut so ist. Obwohl … ich KÖNNTE natürlich irgendwann die Upgrade-Zertifizierung für Java 8 machen. Naja… nein. Lieber nicht.

Da mir im Moment der Sinn nicht ganz nach irgendeinem Politikum steht, worüber ich meinen Senf ausgießen müsste, werde ich vorerst noch mehr Softwareentwickler-Kram posten, mit dem ich die geneigten, aber uninteressierten Leser erfolgreich abschrecken kann. Wir danken für Ihr Verständnis.

Wer sich im Internet gezielt über aktives Rendering mittels Canvas in Java informiert, also etwas, das direkt im Zusammenhang mit Java-Spieleentwicklung steht, der wird wahrscheinlich irgendwann über die Methode sync() in java.awt.Toolkit stolpern, also meistens in der Form Toolkit.getDefaultToolkit().sync(). Nun gehe ich stark davon aus, dass die meisten Entwickler diese Codeschnipsel als gegeben ansehen und 1:1 in ihre eigene Klasse einfügen, da sie wahrscheinlich vielfach erprobt sind. So war das bei mir anfangs leider auch. In einem eigenen Render-Thread habe ich Bilder gerendert und anschließend brav das Toolkit „synchronisiert“, was laut Dokumentation irgendwie „gut für Animationen“ ist.

Seit der Umstellung auf aktives Rendering jedoch hatte ich plötzlich Schwierigkeiten damit, den Render-Thread mittels interrupt() vorzeitig zu stoppen, also etwa wenn der Nutzer das Rendering über das Menü beendet oder wenn ein bestimmtes Ereignis auftritt. Zuvor war das nie ein Problem gewesen. Neuerdings läuft der Thread in drei von vier Fällen einfach weiter, sobald ich ihn gezielt unterbrechen will. Das war eine mittlere Katastrophe, denn ich konnte mich jetzt nicht mehr darauf verlassen, dass das Programm das macht, was ich davon erwartete. Mein Programm funktionierte so nicht mehr, und ich wusste nicht, was ich falsch gemacht haben könnte.

Etwa einen halben Tag hat es gedauert, bis ich den Fehler gefunden hatte: java.awt.Toolkit.sync() verschluckt ganz frech das Interrupted-Flag. Es scheint leider wirklich so zu sein. Die Implementation der Java Virtual Machine von Oracle ist hier offenbar fehlerhaft, denn alles funktioniert einwandfrei wenn ich auf sync() verzichte. Sobald ich die Zeile verwende, klappt das Unterbrechen des Threads nicht mehr. Meine Vermutung ist daher, dass das blockierende sync() das Interrupted-Flag mittels interrupted() abfragt (und dadurch löscht!), und dann leider nicht mehr setzt und leider auch keine Exception wirft. Es verschluckt die Thread-Unterbrechung völlig. So wird dieser Mechanismus sogar ganz offiziell in der Java-Doku erklärt:

if (Thread.interrupted()) // Clears interrupted status!

Nun hält sich Oracle selbst nicht daran. Ich habe anschließend in meinem Code keine Möglichkeit mehr, diese Unterbrechung zu erkennen und gegebenenfalls selbst eine InterruptedException auszulösen. Oracle hat hier eindeutig Scheiße gebaut, denn eigentlich ist das Konsens, das Interrupted-Flag nach dem Löschen erneut zu setzen, damit die Unterbrechung nach oben eskaliert werden kann, so dass auch andere Programmteile auf die Unterbrechung korrekt reagieren können. Hier wurde ganz einfach geschlampt.

Und was macht sync() eigentlich? Tja, keine Ahnung. So ganz scheint das nämlich niemand zu wissen. Ich liebe es, wenn die Java-Dokumentation von Oracle so explizit ist, dass man trotzdem keine Ahnung hat, was genau vor sich geht. So auch zur Methode sync() der Klasse Toolkit:

void java.awt.Toolkit.sync()

Synchronizes this toolkit’s graphics state. Some window systems may do buffering of graphics events.

This method ensures that the display is up-to-date. It is useful for animation.

Wenn jemand mal im Internet in einschlägigen Entwicklerforen versucht danach zu fragen, was das genau bedeutet, wird die Frage mit „synchronizes the graphics state“ „beantwortet“, und anschließend als Off-Topic geschlossen. Zurecht wurde wenigstens noch darauf hingewiesen, dass das die Frage kaum beantwortet.

Da ich weder sagen kann, was die Methode macht, in welchen Fällen ich sie brauchen könnte, und welche Vorteile oder Nachteile damit zusammenhängen, werde ich auf sync() gerne verzichten, schon da ich mit dem Interrupt-Problem einen ziemlich schwerwiegenden Fehler entdeckt habe, den ich nicht bereit bin zu akzeptieren – ganz egal wie toll die Funktion ansonsten arbeiten möge.

ocajpKönnen Klassen in Java „protected“ oder sogar „private“ sein? Welchen Case springt ein Switch mit einem null-String an? Ist ein statischer Konstruktor ein Konstruktor mit „static“-Modifier? Werden Methoden oder Variablen dynamisch oder statisch gebunden? Können Interfaces von mehreren anderen Interfaces erben? Kompiliert eine Klasse mit der Methode „private static void main“ und ist diese startfähig? Wer solche Details nicht weiß, braucht sich über das Thema Zertifizierung noch keine Gedanken machen. Ich mache mir bereits seit Monaten Gedanken.

Seit Anfang der Woche bin ich offiziell ein von Oracle zertifizierter Java-Programmierer – endlich! Die hierzu nötige Prüfung habe ich mit 85% bestanden. Zum Bestehen brauchte man 63% der richtigen Antworten, dieser Wert variiert je nach Schwierigkeitsgrad des Aufgabenkatalogs. In meinem Fall handelte es sich um ziemlich schwere Aufgaben. Zum Vergleich: Nur wenige Jahre zuvor waren zum Bestehen stolze 77% nötig, die Aufgaben also wesentlich einfacher. Zweieinhalb Stunden hat man Zeit, sich beinahe 90 hirnverknotende Codebeispiele durchzulesen, im Kopf zu interpretieren und dann via Multiple-Choice die richtige Antwort anzuklicken – weniger als zwei Minuten pro Aufgabe. Ansatzpunkte gibt es natürlich keine. Ein paar kümmerliche Alibi-Wissensfragen zwischen den endlosen Zeilen voller Quellcode sollen wohl beruhigend wirken. Am Ende hat mir die Zeit gerade so gereicht.

Die fast 200 Euro teure Zertifizierung (Schulungsmaßnahmen nicht eingerechnet) zum sogenannten „Oracle Certified Associate, Java SE 7 Programmer“ (kurz OCAJP) ist die erste, die man als Java-Programmierer absolvieren kann, sie ist mittlerweile Voraussetzung für sämtliche weiteren. Jetzt habe ich die Möglichkeit, mich irgendwann sogar als professioneller Java-Programmierer (OCPJP) zertifizieren zu lassen, was ich definitiv plane, aber bis dahin wartet noch sehr viel mehr an Vorbereitung und Training auf mich. Das gedruckte Zertifikat sollte in den nächsten sieben Wochen bei mir eintreffen, bis dahin kann ich mich an der PDF-Version ergötzen.

Wer sich mit dem Thema noch nie befasst hat, aber neugierig auf die Prüfung ist, sollte gewarnt sein. Die Fragen sind wirklich knallhart. Es wird nie nach den allgemeinen Dingen gefragt, die jeder Java-Programmierer beantworten kann. Es werden gezielt die Schwachstellen abgeklopft, all jene Aspekte und Grenzfälle abgeprüft, die viele eben nicht kennen. Die Prüfung spekuliert darauf, dass viele etwa den einfachen Unterschied zwischen String s = „Hallo“; und String s = new String(„Hallo“); nicht kennen, und fragt dann gerne ganz genau nach, wieviele Objekte der Garbage Collector der JVM aufräumen darf.

Ich bin voller Stolz, diese Hürde erfolgreich genommen zu haben. Der OCAJP war der nächste große Schritt, mich im Bereich Softwareentwicklung bzw. Java-Programmierung zu beweisen und zu etablieren. So ein Zertifikat kann eines Tages den Unterschied zwischen Arbeitslosengeld und Gehalt ausmachen. Oder zwischen Gehalt und Gehalt++. Das muss sich alles noch herausstellen. Bis dahin werde ich weiterhin Erfahrung sammeln und Bücher wälzen.