Java: JAR-Klassen-Versionsproblematik

Ja, nach langer langer Pause musste ich mich wieder einmal mit Java auseinander setzen. Dabei stieß ich auf ein Problem: Ich wollte JDBC-Treiber in einer bereits vorhandenen Version eines Programms einbinden. Soweit kein Problem, doch nicht alle Treiber funktionierten. Ich bekam keine (sinnvolle) Fehlermeldung, sondern Dinge funktionierten einfach nicht.

Ich fand dann heraus, dass mein JDK mitunter zu alt war, um mit den Klassendateien im JAR zu laufen. hier hätte ich mir eine vernünftige Fehlermeldung gewünscht, es kam aber keine.

Da ich für das Deploying (und nur für das Deploying) diese Problematik testen und Fehler werfen wollte, überlegte ich, wie ich vorzugehen habe. Zuerst dachte ich naiv, dass JAR-Dateien versioniert sein könnten. Natürlich völliger Quatsch, sind das ja einfach nur Archive, in denen alles Mögliche drin sein kann. So ist es auch: die darin enthaltenen Klassen-Dateien (.class) können für unterschiedliche JRE-Versionen kompiliert worden sein.

Allerdings kann man recht einfach herausfinden, für welche Version die Klassendateien kompiliert wurden: Im fünften und sechsten Byte der class-Datei steht die Minor-Version (also Byte-Offset 4 und 5), im siebten und achten Byte steht die Major-Version: s. Wikipedia.

Ich schrieb also ein Programm in C, welches die libzip nutzt, um an die Dateien im JAR zu kommen, las dann Byte 7 und 8 aus (Offset 6 und 7) (auf Endianess achten!) und fand somit die höchste und niedrigste Version des JDKs heraus. Eigentlich recht einfach.

Vielleicht hilft dem ein oder anderen das.

Hier noch die Versionsnummern bis 19 (kopiert von hier):

Java SE 19 = 63 (0x3F hex)
Java SE 18 = 62 (0x3E hex)
Java SE 17 = 61 (0x3D hex)
Java SE 16 = 60 (0x3C hex)
Java SE 15 = 59 (0x3B hex)
Java SE 14 = 58 (0x3A hex)
Java SE 13 = 57 (0x39 hex)
Java SE 12 = 56 (0x38 hex)
Java SE 11 = 55 (0x37 hex)
Java SE 10 = 54 (0x36 hex)
Java SE 9 = 53 (0x35 hex)
Java SE 8 = 52 (0x34 hex)
Java SE 7 = 51 (0x33 hex)
Java SE 6.0 = 50 (0x32 hex),
Java SE 5.0 = 49 (0x31 hex)
JDK 1.4 = 48 (0x30 hex)
JDK 1.3 = 47 (0x2F hex)
JDK 1.2 = 46 (0x2E hex)
JDK 1.1 = 45 (0x2D hex)

Ein DOS im kleinen Freizeitpark

Ich war mit meinen Kindern vor ein paar Tagen im Indoor-Park Pippolino in Frechen. Die haben dort tatsächlich noch einige recht alte Systeme stehen, beispielsweise ein altes Rennspiel mit Motorrädern, Flipper und ähnliche Dinge. Eines davon ist ein Flugsimulator.

Flugsimulator
Flugsimulator

Flugsimulator-ComputerVor dem Flugsimulator, auf dem Boden, steht ein alter Computer, der ein DOS startet und darin gibt es eine Auswahloberfläche, in der man den zu startenden Film auswählen kann. Das System kann mehrere verschiedene Filme abspielen und steuert vermutlich dann auch die Maschine.

Leider ist die Fahrt mit dem Simulator – meiner Meinung nach – alles andere als angenehm. Ich war mit meiner kleinen Tochter darauf und wir wurden wie wild hin- und hergeschleudert, ich dachte mir, ich veröffentliche es dennoch einmal hier um zu Zeiten, dass selbst so alte Systeme noch in Betrieb sein können. Das Copyright des Films, der bei uns abgespielt wurde, hatte übrigens 1996 als Datum.

Meine IT-Laufbahn

Oftmals interessiert es Menschen, warum andere Menschen das tun, was sie nun mal tun und auch, warum. Ich möchte hier einmal meinen Werdegang niederschreiben, der mich beruflich und privat sehr geprägt hat. Es geht um meine IT-Laufbahn.

Alles begann, als ich ungefähr sechs Jahre alt war. Vielleicht auch schon ein wenig früher. Ich interessierte mich sehr für elektronisches Spielzeug, allem voran für Spielzeugroboter. Ich hatte eine ganze Menge. Sie konnten blinken, herumfahren, sprechen (entweder durch ein Sprachmodul oder durch ein kabelgebundenes Handsprechgerät) und manche konnten sogar dampfen. Die Zeit war großartig, und während andere ihre Kuscheltiere und Puppen mit ins Bett nahmen, nahm ich meine Roboter mit. Von meiner Mutter wurde das kritisch gesehen, wachte ich nicht nur einmal mit großen Schmerzen auf. Das nahm ich in Kauf.

Einer unserer Nachbarn und Bekannten verkaufte dann seine Spielekonsole und ich musste sie haben. Ich weiß nicht mehr, wann ich sie bekam, aber es musste um das Jahr 1985 herum gewesen sein. Ich erinnere mich noch, dass es kalt war, so dass ich davon ausgehe, sie zu Weihnachten bekommen zu haben. Es handelte sich um das Atari 2600. Ich muss überglücklich gewesen sein, und so kam es, dass wir alle fleißig Pac-Man spielten und was es sonst noch so gab. Ich erinnere mich noch, wie ich versuchte, mit einem Hubschrauber in Seitenansicht durch eine Art Labyrinth geflogen zu sein. Auch an Pitfall 2 erinnere ich mich sehr gerne, wie ich mit Lianen über gefährliche Gewässer und noch gefährlichere Krokodile geschwungen bin, über Baumstämme sprang und im Dungeon den gefährlichen Monstern auswich.

Das reichte aber nicht. Ich brauchte einen Computer. Nun war es so, dass wir nicht viel Geld hatten, aber meine Eltern schafften es trotzdem, einen gebrauchten Schneider CPC464 zu organisieren. Wenn ich so zurückdenke, ein eigentlich grandioses Gerät, welches ich zu Weihnachten meines achten Lebensjahres bekam. Für die, die die alten Homecomputer nicht kennen: Computer und Tastatur bilden eine Einheit (wie auch beim C16, C64 und C128 von Commodore oder beim Amiga 500, 600 und 1200). Dazu war ein Datasettenlaufwerk eingebaut. Angeschlossen wurde diese Rechenmaschine an einen Grünmonitor. Das bedeutete, das ganze Bild war grün. Dunkelgrün, hellgrün, grün. Nach dem Einschalten startet man direkt im Basic-Prompt und kann anfangen, zu programmieren oder ein Programm oder Spiel von Kassette zu laden. Das dauerte nicht nur lange, sondern war auch recht fehleranfällig, so dass man die langen Versuche ab und an wiederholen musste. Ich mochte aber die Töne, die dabei herauskamen. Mit dem Monitor und dem Computer, an dem ich sogar meine Atari-2600-Joysticks anschließen konnte, und ein paar Spielen, kam auch ein umfangreiches Benutzerhandbuch mit, welches viele Codebeispiele in Basic bereithielt. So konnte ich … trotzdem nichts verstehen. Mit acht Jahren ist das gar nicht so einfach. Dennoch tippte ich viele Listings ab und feierte dabei einige Erfolge, wie auf einmal irgendwelche Kreise oder Vierecke auf dem Bildschirm gezeichnet wurden.

Ich wuchs und sah bei einem Freund eine völlig neue Welt. Er hatte eine Powermaschine. Ein System, was mich massiv beeindruckte und ich unbedingt auch haben wollte. Einen Amiga 500. Nicht nur konnte er Farbe (was der CPC auch konnte, hätte man den richtigen Monitor gehabt), nein, statt eines schäbigen Datasettenlaufwerks hatte er ein Diskettenlaufwerk mit einer mittleren Zugriffszeit von „wahnsinnige Geschwindigkeit“. Ich musste so ein Ding haben. Die Spiele waren eine neue Generation und auch die ganze Software interessierte mich brennend. Entweder meine Eltern erkannten meine Berufung, oder ich hatte noch mindestens so viel vom Kindchenschema, dass am nächsten Weihnachten diese Hightechwunderkiste unterm Baum lag. Es war wunderbar. Ich war in einem Alter, da wusste ich bereits, was ich bekam, so dass ich mir im Vorhinein vom Taschengeld etliche Disketten kaufte und alles von Freunden kopierte, was ich konnte. Ich startete an diesem Weihnachten mit einer schier endlosen Software- und Spielesammlung und war lange von dem System sehr begeistert, was ich auch heute wieder bin. Allerdings habe ich mit dem Computer nie wirklich versucht, zu programmieren. Was ich allerdings hatte war ein Neun-Nadeldrucker mit Farbe. Das Farbband hatte vier Farben und damit eine separate für Schwarz, so dass man „natives“ Schwarz drucken konnte, wenn man was Buntes gedruckt hat. Es gab aber auch einfache schwarze Bänder ohne Farbe, die erheblich günstiger waren. Das Gerät war laut, hatte keine Papierkassette, so dass jedes Blatt einzeln eingelegt werden musste, aber die Möglichkeit, DinA3 zu drucken und Endlospapier zu verarbeiten. Soweit ich mich noch erinnere, war es ein Star-LC 200, der via Centronics an den Parallelport des Amigas angeschlossen war. In Kombination mit meinem maximal 400dpi Handscanner war es zu der Zeit eine großartige Kombination und hat Spaß gemacht.

Die Zeit des Amigas war dann aber doch bald gezählt und schweren Herzens wünschte ich mir einen Personal Computer, denn meine Freunde hatten ja auch alle einen. So schloss ich mit meinen Eltern einen Pakt, dass wir den Amiga verkaufen wir dafür einen PC anschaffen. Wir schauten uns erneut auf dem Gebrauchtmarkt um und fanden in Köln (Weiden) ein passendes Angebot. Ein 386er sollte es werden mit 4MB RAM und 80MB Festplatte. Wir fuhren vorbei und kauften das Gerät. Schon bald interessierte es mich, wie Computer aufgebaut waren und, ich denke zum Entsetzen meiner Eltern, schraubte ich das Gerät auf und begann, Karten einzustecken, Diskettenlaufwerke zu tauschen und sogar ein CDROM einzubauen. Ich interessierte mich zuerst viel mehr für die administrative Seite der Computerei. Ich spielte viel mit DOS und Windows 3.11 herum, war von dem Zeug aber nie sonderlich begeistert.

Es kam die Zeit der Mofas und Mopeds und ich verlies ein wenig die Computerei. Nicht viel, ich blieb ihr immer treu, aber mein Fokus war für eine gewisse Zeit auf etwas anderes gerichtet. Ich kam aber wieder zurück und stellte fest, dass so ein 386er nicht mehr das Mittel der Wahl war, um vernünftig zu arbeiten … oder zu spielen. Also bat ich meine Eltern um Hilfe und sie, immer noch nicht reich, kratzten alles Geld zusammen und kauften mir einen Pentium mit 133MHz, 4MB RAM (keine Ahnung, warum so wenig), die ich später auf 8MB aufrüstete und dann auf 16MB, und einer Festplatte mit einer Kapazität von 1GB. Ich dachte, die bekomme ich niemals voll. So schnell hatte ich mich noch nie geirrt. Ich spielte weiter mit DOS und Windows 3.11, später dann mit Windows 95 und Windows 98. Es war interessant, doch hauten mich die Systeme nie aus den Socken. Ich probierte, neben MSDOS, noch andere DOS-Derivate, unter anderem DRDOS und PTS-DOS, spielte mit OS/2 Warp 3 herum und arbeitete an administrativen Kleinkram. Wenig später, ich hatte zusätzlich noch meinen 386er, kaufte ich mir meine ersten Netzwerkkarten. Zwei an der Zahl, bei denen man die IRQs noch selbst jumpern musste. Schon war man in der schönen neuen Welt des Datenaustausch in Netzwerk hausintern, mit Koaxialkabeln, T-Stücken, Terminatoren, 10Mbit und einer hohen Fehleranfälligkeit. Spaß hat es allemal gemacht, zumal man beginnen konnte, Computerspiele im Netzwerk zu spielen, und zwar mit mehr als nur einer weiteren Person, wie es mit Nullmodem- oder Parallelkabel möglich war. Diese Form von Netzwerk hat mich tatsächlich einige Zeit begleitet, bis ich auf ein 100Mbit-Netzwerk mit Hub umgestiegen bin. Die (theoretische) Verzehnfachung der Geschwindigkeit war bahnbrechend für mich und durch die Nutzung eines alten 486er als Router mit 56k-Modem konnten erstmals mehrere Rechner über einen SOCKS5Proxy ins weltweite, kaum bezahlbare Internet gehen. Ich weiß noch, wie meine Mutter immer schrie: „Bist du schon wieder im Internet? Ich will telefonieren!“

Nach den Rechnern von der Stange begann ich dann, meine Computer selbst zusammenzustellen und zusammenzubauen. Das habe ich über Jahre hinweg getan, den letzten vor ungefähr vier Jahren. Schnell, als armer Schüler, wechselte ich von Intel zu AMD, K5, K6, K6 II, K6 III, Duron und wie sie alle heißen und ich arbeitete mich in Linux ein. Immer wieder kurz, dann brachte es mich zurück zum verhassten Windows.

Aus persönlichen Gründen schmiss ich in der elften Klasse die Schule, lungerte ein oder zwei Monate zu Hause herum, bis meine Mutter mich zwang, aushilfsweise in einem Lager für Textilien auszuhelfen. Täglich zuerst eine Stunde für mehrere Wochen, dann wurde mir gesagt: „Hey, du bist zuverlässig, schnell und gut, warum willst du nicht länger, nämlich den ganzen Tag, hier arbeiten?“ Wie sehr ich es hasste. Aber ich musste die Zeit zum Zivildienst irgendwie herumbekommen und so arbeitete ich hart im Lager. Ich habe dann, mit meinen Kollegen, 40-Fuß-Container, teils mit Säcken mit 50kg, händisch ausgeladen. Ich arbeitete dort ein dreiviertel Jahr und, obwohl das eine schwere Arbeit war, die ich nie wieder machen möchte, möchte ich die Zeit nicht missen. Ich habe gutes Geld verdient und gelernt: „Körperliche Arbeit ist nichts für mich.“

Ich absolvierte also mein Jahr Zivildienst und mir war bereits seit meinem achten Lebensjahr klar, dass ich etwas mit Computer machen wollte. Ohne Abitur kein Studium, und da ich eh immer eher der Praktiker als der Theoretiker war, entschloss ich mich, mich für die Ausbildung zum Fachinformatiker mit Fachrichtung Anwendungsentwicklung zu bewerben. Ich weiß noch, dass ich bei einem Freund in Köln war, als meine Mutter gegen 18 Uhr anrief und meinte, dass ein Unternehmen, bei dem ich mich bewarb, anrief und sie mich gerne nehmen würden. Ich war außer mir vor Freude. Dort blieb ich dann 1,5 Jahre, ich hatte aber Gründe, zu wechseln und wechselte so in eine andere Firma, in der ich die Ausbildung abschloss.

Dann war ich einen Monat arbeitssuchend.

Der Mann meiner Cousine kannte aber jemanden in einem Verlag in Remagen, der auch händeringend nach Verstärkung suchte und ich dachte mir, ich schicke da mal eine Bewerbung hin. Lust hatte ich keine. Dummerweise wurde ich zum Vorstellungsgespräch eingeladen. Ich dachte, das geht eh nach hinten los. Ich hatte meine schäbigsten Klamotten angezogen, völlig ausgewaschenes Hemd, kaputte Hose. Das Vorstellungsgespräch empfand ich nicht als gut gelaufen und ich war froh, bis mich, einige Stunden später, jemand von der Firma anrief und sagte, ich hätte den Job. Ich dachte mir: Shit. Ok, ich nahm mir dann vor, dort ein halbes Jahr zu bleiben. Daraus wurden 14 Jahre, bis die Firma leider insolvent ging.

Zuerst assistierte ich meinem Vorgesetzten bei administrativen Aufgaben. Schnell wurde bekannt, dass ich ja Programmierer bin und ich bekam die ersten programmiertechnischen Aufgaben zugeteilt. Zuerst Websites, dann Database Publishing. Mein Vorgesetzter wurde aus diversen (guten) Gründen gefeuert und ich übernahm das Steuerrad der IT. Eineinhalb Jahre habe ich geklotzt, kein Urlaub, kein krank, teils bis spät in den Abend oder die Nacht, teils an Wochenenden. Dann kam die Idee auf, einen Auszubildenden aufzunehmen, der mich unterstützt. Er war auch bis zum Schluss bei der Firma. Gemeinsam brachten wir das Netzwerk auf einen akkuraten Stand, machten mit Softwareentwicklung weiter und bildeten noch weitere aus und holten noch mehr Leute mit in die Abteilung, denn es wurde ernst, als wir das Verlagsprogramm ablösen sollten. Die Frage war: nehmen wir was von der Stange oder entwickeln wir selbst was? Wir entwickelten selbst, mit wxWidgets und C++ und PostgreSQL. Nebenher stellten wir noch das ganze Netzwerk von Windows 2000 auf Ubuntu Linux um, kümmerten uns ums Autodeployment, automatisierten einiges weg, stellten die Redaktion dann doch von Ubuntu auf macOS (damals noch Mac OS X) um, automatisierten dort auch (DeployStudio, AutoDMG, AutoPKG, Munki, eigene Software) und machten einige weitere Softwareentwicklungen, kümmerten uns um hochverfügbare Firewalls mit OpenBSD und redundante Server mit FreeBSD. Es war herrlich, wir haben sehr viel gemacht, ich war für die Abteilung zuständig und für alles, was man in eine Steckdose stecken kann. Wir haben alles inhouse gemacht, selbst um Kopiersysteme haben wir uns gekümmert, das E-Paper-System sowie Shopsysteme entwickelt, gepflegt und an die Verlagssoftware angebunden, Inventarisierungssysteme und Softwareverteilungssysteme für unsere Vielzahl an Betriebssystemen entwickelt (Windows, macOS, Linux, FreeBSD und OpenBSD war im Einsatz), das Backup auf Tape und Storage gemacht, und so weiter und sofort. Ich habe in C eine Software geschrieben, um die Website von einem Quantum SuperLoader 3 auszulesen und zu steuern, da es keine Treiber für FreeBSD für die Maschine gab, um zu schauen, was genau ist in welchem Slot drin. Wir haben sogar Platinen geätzt und mit Mikrocontrollern Schaltungen gebaut. Ich habe in der Zeit eine Menge gelernt, bis, ja bis wir alle hochgerufen wurden und uns die Kündigung gegeben wurde. Das war traurig, sehr traurig.

Ich versuchte mich dann mit meiner Frau an einer eigenen Firma. Wir entwickelten compow, eine Firmenwebsite, auf der sich Firmen vorstellen können und Benutzer nach Jobs suchen können. Programmiertechnisch recht anspruchsvoll, aber wir sind einfach keine Unternehmer. Also heuerte ich bei einer neuen Softwarefirma an. Auch da entwickelte ich in Java, C++, VisualBasic und Pascal (Delphi -> FreePascal).

Die Computerrei war aber auch immer mein Hobby, nicht nur mein Beruf. So entwickelte ich teils an freier Software, an eigener Software, probierte viel über die Dekaden aus und herum und bildete mich so weiter.

Und genau das mache ich jetzt immer noch. Natürlich bin ich zurzeit aktiv auf Jobsuche, denn leider hat das letzte Unternehmen, in dem ich beschäftigt war, auch Insolvenz angemeldet. Ich nutzte jetzt die Gelegenheit und versuche mich momentan an YouTube. Weiterhin bilde ich mich in verschiedenen Systemen weiter. Die Zeit, die ich vorher mit einem Job verbracht habe, versuche ich nun, mit Jobsuche, Weiterbildung und YouTube sinnvoll auszufüllen.

So viel zu mir. Wenn ihr Fragen habt, gerne her damit (:

Von Android wieder auf iPhone

Mein letztes iPhone war das iPhone 4 – habe ich immer noch. Danach bin ich auf Android umgestiegen. Warum? Keine Ahnung. Ich hatte das Google Nexus 4 (habe ich immer noch hier), das Blackberry Priv, das Xiaomi Mi Max 2 und zuletzt das Ulefone Armor 7. Zwischendurch hatte ich auch ein Blackberry Classic.

Ich hatte schon länger überlegt, wieder auf ein iPhone zurückzuwechseln. Der Hauptgrund war, dass meine IT-Umgebung doch eher Mac-lastig ist (MacBook Pro 16″ 2019, MacBook Pro 13″ 2020, iPad von 2018) und die Integration darein doch einfach “nett” ist. Ist sie auch.

Entschieden habe ich mich für das iPhone 13 Pro Max. Jedes andere hättes es auch getan, aber die Akkus der anderen Geräte sind noch unterirdischer und nach meinem Xiaomi Mi Max 2 und dem Ulefone Armor 7 wollte ich einfach nichts mehr, was einen miserablen Akku hat. Damit kam nur das iPhone 13 Pro Max in Frage, denn der Akku ist “ok”. Allerdings: Für ein so hochpreisiges und großes Gerät hätte man auch einen “vernünftigeren” Akku verbauen können.

Die Gründe, warum ich aber jetzt mein Smartphone gewechselt habe, obwohl ich das Ulefone sehr sehr mag, waren:

  • Keine Updates mehr. Und ja, auf dem Ulefone läuft die TAN-Software für mein Online-Banking. Keine Updates sind aber ein generelles No-Go und ich verstehe diese Politik nicht wirklich. Das letzte Update ist vom Sicherheitsupdate vom 5. Dezember 2019 (Android 9). Es gibt zwar ein Android 10 für das Gerät, das muss man aber kompliziert und umständlich selber flashen, danach ist auch alles weg und ob es funktioniert, weiß ich nicht. Aber selbst dann gibt es keine wirklichen Updates mehr. Schade, bis auf die anderen Punkte, die ich hier anspreche, ist das Gerät super.
  • Der Zugang: Ich habe als Basiszugangsmethode die Gesichtserkennung eingeschaltet. Die funktioniert so lala … allerdings: mein fünfjähriger Sohn kann mit seinem Gesicht das Handy auch entsperren. Meine dreijährige Tochter mit ihrem auch…
  • Der Fingerabdruckscanner ist unbrauchbar. Unbrauchbar. Absolut unbrauchbar. Die Positionierung ist eine wahre Katastrophe. Man kommt immer mit dem Handballen darauf beim Greifen des Geräts und dann sperrt sich der Sensor auch direkt, weil man zu oft “Fehlversuche” hatte …

Bisher gefällt mir das iPhone gut. Ob es den Preis auch wert ist? Ehrlicherweise denke ich nicht. Es hat zwar etliche Features, aber ob man die alle auch nutzt, wage ich zu bezweifeln. So ein richtiger Dauerläufer ist es nicht. Auch die 120Hz (die auch 300 Euro Android-Geräte bieten), hauen mich im Gegensatz zu den anderen Leuten nicht so aus den Socken. Ich spiele mal noch ein wenig damit herum und schreibe dann vielleicht einmal ausführlicher, was ich gut und was ich schlecht finde.

Bis dahin: Bis bald (:

Tipp: Notizenprogramm für nahezu alle Plattformen mit Synchronisierung

Wahrscheinlich werde ich noch ein Video dazu machen, aber erstmal als ein kleiner Tipp: Joplin.

Nachdem ich schon eine ganze Weile wieder auf macOS umgestiegen bin (von FreeBSD), suchte ich eine Alternative zu CherryTree, da die GTK-Anwendung unter macOS recht unzuverlässig läuft und sich auch nicht sonderlich gut benutzen lässt. Ich bin dann zufällig auf Joplin gestoßen.

Joplin
Joplin

Letztlich handelt es sich um eine Notizen-App, die via Markdown oder per WYSIWYG-Editor benutzt werden kann. Informationen können in einer Baumstruktur gespeichert werden und die Software gibt es für alle möglichen Betriebssysteme. Ich nutze sie auf

  • macOS
  • Windows
  • iPadOS
  • Android

Das Schöne an Joplin ist, dass die Software ihre Daten synchronisieren kann. Sie bietet dafür verschiedene Dienste an. Ich nutze WebDav. Damit habe ich alle Infos auf allen genutzten Geräten und kann auch per Handy mal flott was notieren und auf meiner Workstation dann weiter verarbeiten.

Zwei Dinge nerven mich allerdings:

  • Die Synchronisierung auf WebDav ist schnarch lahm. Vielleicht liegt es an NextCloud, welches wohl Probleme mit PostgreSQL hat (gibt Foreneinträge ohne Lösung dazu), vielleicht aber auch an Joplin. Ich suche noch nach einer Lösung
  • Auf den mobilen Plattformen gibt es keinen WYSIWYG-Editor

Schaut es euch einfach mal an, es ist kostenlos.

compow ist wieder online

2016 begannen, federführend unter GuG-IT GbR – Olena und Thorsten Geppert, die Arbeiten am Unternehmensportal www.compow.de. Irgendwann hatten wir das Projekt wieder eingestellt. Heute gibt es den kleinen Relaunch.

compow

Was ist neu?

Von der Usability her: nichts. Auch das Design ist gleich geblieben. Ein Problem war, dass die Website komplett über eine Art RPC-System mit dem Server kommunizierte, welches sehr langsam war. Das habe ich vollständig abgelöst. Die Website kommuniziert jetzt direkt mit dem Datenbankserver, was sie schneller macht und einfacher zu pflegen. Dafür fällt natürlich einiges an Flexibilität weg.

Man merkt, dass die Website um einiges schneller reagiert, als zuvor, allerdings ist sie in meinen Augen immer noch viel zu langsam. Daran arbeite ich.

Ansonsten gibt es erstmal nichts neues.

Was fehlt?

Einiges:

  1. Ich habe noch keine Kooperationen mit Stellenanzeigenvertreibern machen können, so dass die Stellenanzeigen leer sind. Ich arbeite aber zur Zeit daran, damit bald wieder etliche Stellen gesucht und gefunden werden können
  2. Das Desktopprogramm gibt es zur Zeit nicht. Daran arbeite ich:
    compow-Desktopsoftware

Ansonsten ist alles beim Alten. Ihr könnt eure Firma auf compow.de eintragen und damit Reichweite gewinnen. Probiert es einfach mal aus, denn es ist vollständig kostenlos.

Neues YouTube-Video – Qt-Tutorial 012: Unser erstes Programm layouten

Nachdem wir einfach ein paar Komponenten in unser Programm gezogen haben, sollten wir beginnen, mit Layouts zu arbeiten. Ich zeige kurz, wie man das bei unserem Programm macht. Dabei zeige ich auch, wie man Spacer benutzt.

Unser erstes Programm layouten
Unser erstes Programm layouten

Wir beschäftigen uns mit ganz einfachen Layouts. Die ersten Erfolge kommen schnell: der Inhalt des Formulars wächst und schrumpft beim Vergrößern oder Verkleinern des Dialogs.

Hier geht es zum Video.

Neues YouTube-Video – Qt-Tutorial 007: Meine QtCreator-Einstellungen

Im neuen Video geht es darum, wie ich meinen QtCreator eingestellt habe. Vor allem habe ich die Einrückungen im Texteditor eingestellt (Tabs statt Leerzeichen, bestimmte Einrückungen, uvm.).

Meine QtCreator-Einstellungen
Meine QtCreator-Einstellungen

Ich füge hier einmal die Screenshots der Einstellungen ein:

Environment -> Interface
Environment -> Interface
Text Editor -> Font & Colors
Text Editor -> Font & Colors
Text Editor -> Behavior
Text Editor -> Behavior
Text Editor -> Display
Text Editor -> Display
Text Editor -> Completion
Text Editor -> Completion
C++ -> Code Style
C++ -> Code Style
C++ -> Code Style -> General
C++ -> Code Style -> General
C++ -> Code Style -> Content
C++ -> Code Style -> Content
C++ -> Code Style -> Braces
C++ -> Code Style -> Braces
C++ -> Code Style -> Switch
C++ -> Code Style -> Switch
C++ -> Code Style -> Alignment
C++ -> Code Style -> Alignment
C++ -> Code Style -> Pointers and References
C++ -> Code Style -> Pointers and References
C++ -> File Naming
C++ -> File Naming

Hier geht es zum Video.

(Vor dem Import muss die Datei entpackt werden!)

Portierung eines Delphi-7-Projekts nach FreePascal und Lazarus

Hach, alte Software. Alte, gewachsene Software. Alte, gewachsene, ungepflegte Software. Ja. Wer kennt es nicht? Da gibt es ein Projekt, das hat bestimmt gut fünfundzwanzig Jahre auf dem Buckel und wurde, bis zuletzt, noch mit Delphi 7 “gepflegt”. Von gepflegt kann eigentlich nicht die Rede sein, doch wurden noch minimale Erweiterungen und, allem voran, Verschlimmbesserungen gemacht. Jeglicher Unsinn. Was aber versäumt wurde war, das Projekt, was bei hunderten von Kunden eingesetzt wird, auf eine aktuelle Plattform zu migrieren, damit eine vernünftige und saubere Weiterentwicklung überhaupt noch möglich ist.

Lazarus-IDE

Da komme ich ins Spiel. Problemlöser, Beruhiger … ja, einfach der, der das schlimme Los zog. Ich war zur falschen Zeit am falschen Ort.

Es war so, dass die Weiterentwicklung mit Delphi 7 in der Form nicht mehr möglich war. Die letzte Windowsbetriebssystemversion, auf der Delphi 7 wohl annehmbar lief, war Windows 7, welches ja bereits 2020 abgekündigt war. Ich habe Delphi 7 auf Windows 7 ausprobiert. Es war die Hölle. Stabilität war faktisch nicht vorhanden. Abgesehen von der unsinnigen Weiterentwicklung auf einer uralten, veralteten Plattform mit einem nicht unterstützten Betriebssystem war das Problem, dass Delphi 7 andauernd Fehler warf, stehen blieb, abstürzte. Abgesehen davon gab es in dem Projekt – teils absolut unnötige – Abhängigkeiten, die mitunter zwanzig (20!) Jahre alt waren.

Ich sah drei Möglichkeiten: 1. Ich kündige. Tja, Frau, Kinder und Haus …, also 2. Migration zu Delphi in einer aktuellen Version oder 3., und da war ich mir absolut nicht sicher, wie klug das war, Migration auf eine freie Plattform mittels FreePascal und Lazarus. Der Titel verrät, wofür wir uns entschieden.

Delphi in einer aktuellen Version war meinem Chef nicht nur zu teuer (?!), der Migrationsaufwand aufgrund des alten Codes und der noch schlimmeren Abhängigkeiten, wäre, so dachte ich, mindestens genau so groß gewesen, wie die Migration auf eine andere Plattform. Natürlich bin ich recht naiv an die Sache herangegangen, hatte ich doch wenig Erfahrung mit FreePascal und Lazarus, abgesehen von meinem Spieltrieb, den ich daran ab und zu mal auslebte. Aber was wusste ich? Ich fand, aufgrund meiner Tests, dass die Plattform stabil genug war und ist. Ich spiele gerne mit Technologien und ich habe mir Lazarus und FreePascal über Jahre hinweg angesehen. Die anfänglichen Probleme von vor einer Dekade waren behoben, FreePascal lief eigentlich schon immer ganz gut und Lazarus mauserte sich zu einer stabilen IDE. Ich schlug meinem Chef diese Lösung vor und ich denke, das Hauptargument war “kostenlos”. Ob er den Rest hörte, weiß ich nicht.

Also machte ich mich daran, mich tiefergehend mit FreePascal und Lazarus zu beschäftigen, Blog- und Forenartikel dazu zu lesen und ein oder zwei kleine Testprojekte damit zu schreiben, um das System und die Probleme kennenzulernen. Pascal lag bei mir bereits gut zwanzig Jahre weit weg und ich hatte das nur in zwei kleinen Projekten in meiner alten Firma eingesetzt. Ich kam immer mehr rein.

Dann schnappte ich mir eine virtuelle Maschine, warf ein Windows 7 an, schauderte mich als alter FreeBSD– und Mac-User, installierte Delphi 7 und TortoiseSVN, checkte das alte Projekt aus und installierte alle Abhängigkeiten, die mir die gut zwanzig Jahre alte Doku des Projekts preisgab. Diese elende Abhängigkeitenhölle. Abhängigkeiten, um eine “hübschere” Toolbar hinzukriegen, oder Abhängigkeiten, um eine Pfadauswahl zu implementieren. Die alten Programmierer lebten faktisch die Abhängigkeitshölle und genossen sicher, dass eines Tages ein kleiner Programmierer den Quatsch ausbaden müsse.

Nachdem ich guten Gewissens alle mir bekannten Abhängigkeiten mit teils Windows 3.11-Installationsprogrammen installiert hatte (und hey, dass das Zeug noch lief … man kann von Microsoft ja halten, was man will, aber ich war schon beeindruckt), lud ich das Projekt. Das bedeutet, ich versuchte, es zu laden. Ich weiß nicht, wie die alten Programmierer das zusammengebastelt hatten, aber man musste tatsächlich noch Projekteinstellungen an seine individuelle Entwicklungsumgebung anpassen. Normal? Nein. Stell dir mal vor: du checkst ein Projekt aus, auf irgendeinem Computer, und du musst dann noch die Projektdatei an deine Pfade usw. anpassen, weil dort der Benutzername drin steht. Das geht doch nicht! Und es war einiges und es dauerte noch viel länger, bis ich aufgrund der kargen Doku das Ding mal soweit hatte, dass nicht mehr gemeckert wurde. Ich sage das jetzt mal so: bitte, bitte, bitte, dokumentiert nicht das Offensichtliche (function SchreibeVornamen() // Diese Funktion schreibt den Vornamen…), sondern das, was eben nicht offensichtlich ist. In diesem Projekt wurde, und das mit einer solchen Begeisterung und einem solchen Arbeitsaufwand, nur das Offensichtliche dokumentiert.

Gut, es lud jetzt, es kompilierte. Naja, ab und an. Mal klickte ich auf “Play”, dann kompilierte es, mal auch nicht (ohne Code-Änderung), mal startete es, mal nicht, mal hing es sich auf und dann hing sich ganz Delphi auf. Es war nicht tragbar und wieder einmal wunderte es mich, wie man früher so arbeiten konnte (ich konnte das noch nie).

Nach dem Spruch “Man kann nicht alles haben.” durchwühlte ich den Code. Ich durchwühlte ihn nach den ganzen Abhängigkeiten, die ich ja unter FreePascal und Lazarus nicht mehr zur Verfügung haben sollte. Ich fand viele Stellen, die man einfach nicht brauchte oder für die Lazarus eigene Komponenten mitbrachte. Ich begann, auszuklammern und zu schauen, was noch lief oder was einfach nur sinnlos darin war. Ich fand so einiges. Als ich nach einigen Tagen der Pein dachte, fertig zu sein, dachte ich mir: Jetzt ist der Zeitpunkt da, an dem ich versuche, die Spaghetti … erm, den Code in Lazarus zu importieren.

Lazarus bietet einen Import von Delphi-Projekten an. Danke, liebe Lazarusentwickler. Der Dank ist ernstgemeint, denn der Import funktioniert gut. Nicht sehr gut, aber gut. Während des Imports zeigt das System bereits mögliche Probleme an, fehlende Units und so kann man sich, Notizen machend, schon einmal darauf einstellen, dass ein einfacher Import wohl sicher nicht den Segen bringt, den man so dringend bräuchte. Ich importierte, notierte, importierte erneut, notierte wieder. Sprang mit meinen Notizen wieder zurück zu Delphi und versuchte, weitere Probleme zu beheben oder zumindest zu minimieren. Commit, Checkout, Import, Notizen.

Irgendwann war ich dann soweit, dass der Import gut durchlief. Das hatte aber auch Tage gedauert. Ich war aber sehr stolz auf mich. Dann klickte ich auf “Kompilieren”. Ich musste noch einige Units entfernen, einige Funktionen und Prozeduren ausklammern, einigen Code umschreiben, aber irgendwann, recht schnell, wenn ich mich recht erinnere, kompilierte das Projekt dann durch. Nachdem ich auch Firebird inklusive Abhängigkeiten am Rennen hatte, haute es mich aus den Socken: Das Ding startete. Es startete. Es kam … tatatataaaa … die Login-Maske. Zumindeste schätzte ich, dass sie es wäre, denn sie war noch leer. Ich schloss den Tag trotzdem als erfolgreich ab. Ich fand dann recht schnell heraus, dass ich teilweise Ressourcen-Dateien ausgeklammert hatte und als ich sie wieder einklammerte und die Endung .dfm in .lfm umschrieb, die Masken (fast) 1:1 so aussahen, wie in Delphi. Ich arbeitete mich langsam vor, Maske für Maske für Maske. Ich wusste, es würde ein langer Weg werden, der noch weitere Stolpersteine haben sollte.

Einer dieser Stolpersteine war tatsächlich, dass einige Masken/Dialoge in Delphi binär und nicht in Textform abgespeichert waren. Komischerweise waren das von gut fünfzig Dialogen fünf oder sechs. Das Problem ist einfach zu lösen. In Delphi 7 öffnet man den Dialog und speichert ihn als Text, so dass man ihn in Lazarus benutzen kann. Dialoge, die per Text beschrieben werden, haben gegenüber den binären Dialogen den entscheidenden Vorteil, dass man sie mit jedem beliebigen Editor öffnen und bearbeiten kann, während sie auch mal aus Inkompatibilität eben nicht mit Lazarus GUI-Editor laden.

Es war eine Menge Tipperei, Ausklammerei, Umschreiben von Code, Entfernen von altem Code und Schreiben von neuem Code. Vor allem einiges an der Datenbankschnittstelle musste geändert werden, da wohl IB nicht hunderprozentig wie IBX funktioniert, vor allem im Transaktionsbereich.

Ich war dann aber sehr stolz, als die gesamte Basis der Software lief und fast so aussah und sich verhielt, wie sie es davor bei Delphi auch tat. Dann kam aber der Teil, der mir am meisten Bauchschmerzen bereitete. Im alten Projekt wurde QuickReport benutzt, um Reports zu generieren, das Drucken zu übernehmen und PDFs zu erzeugen. Gibt es QuickReport nicht mal mehr für ein aktuelles Delphi und ist die alte Version anscheinend nur mit Gefrickel und neueren Delphi-Versionen zum Laufen zu überreden, gibt es das Projekt gar nicht für Lazarus. Das bedeutet: Keine Reports, kein Drucken, kein PDF-Export.

Ich sah mir dann drei oder vier verschiedene kostenlose Report-Generatoren an, die sich über den Lazarus-Online-Packager installieren liessen. Alles unfertig. Der einzige Report-Generator, den ich halbwegs brauchbar fand und finde, heißt FortesReport. Dieser ist sehr nah an QuickReport und lässt sich ähnlich bedienen. Man baut die Reports mit dem Lazarus-GUI-Builder zusammen und kann sie dann aufrufen und mit Daten füllen. Ein Problem gibt es aber an FortesReport, welches nicht zu unterschätzen ist: Die Dokumentation. Diese gibt es nämlich nicht.

Wer mich kennt weiß, ich bin faul. Jemand meinte mal zu mir, alle Programmierer sind faul. Also überlegte ich nach einem Weg, wie ich das QuickReport-Zeugs zum FortesReport-Zeugs konvertiert bekomme. Und während ich so nachdachte, googlte ich und fand jemanden, der das selbe Problem hatte. Ich war nicht alleine auf dieser Welt. DACConv heißt das Programm. Die Software macht nicht viel mehr, als in den Pascal-Dateien und in den LFM-Dateien Klassennamen und Variablennamen anhand bestimmter mitgelieferter Schemata auszutauschen. Abgesehen von der echt schlechten Bedienung der Software macht sie ihren Job aber fein. Nur leider bleibt Handarbeit nicht erspart, denn teils müssen Bänder umgebaut werden, teils müssen Objekte entfernt werden, die einfach von FortesReport nicht unterstützt werden. Aber es geht allemal schneller, sehr viel schneller, als die Reports vollständig von Hand neuzubauen.

Ist das alles geschafft, kann man stolz auf sich sein. Das Projekt lässt sich reproduzierbar kompilieren und läuft und auch die Reports sehen aus, wie im Original.

Ist das alles also einfach gewesen? Nein. Man benötigt bereits einiges an Erfahrung, viel Sitzfleisch und, am Wichtigsten: Nerven wie Drahtseile.

Was ich allerdings sagen muss: Lazarus und FreePascal sind sehr stabil und sehr brauchbar, das hätte ich so nicht gedacht. In all der Zeit ist mir Lazarus vielleicht vier oder fünf Mal abgestürzt, und es war nicht einmal schlimm, da keine Daten dadurch beeinträchtigt wurden. Sie sollten noch ein wenig an der Stabilität feilen, aber ich könnte mir vorstellen, damit noch einmal zu arbeiten. Vielleicht nicht an einem großen Projekt, aber an kleinen Tools.