Icon – drei Irrwege

Unsere Oberfläche muss in ihrer Auflösung den modernen Bildschirmen anpassen!

Die ganz wichtigen Kunden haben Bildschirme mit nahezu Apple Auflösung. Da kommen die kleinen 16 mal 16 Pixel großen Button nicht gut. Wenn Windows das automatisch anpasst, sieht das eckig und verschwommen aus. Ohne Anpassung sind die Schaltflächen so klein, dass kein Kunde sie findet.

Deswegen gilt es auf zu hübschen!

Der UX Designer hat schon skalierbare Icons für alle Button Bitmaps entworfen. Entscheidungsträger haben sich darüber versammelt und endgültige Versionen beschlossen.

Ich brauchte sie nur noch einzubauen. Das muss Pillepalle sein und ich wollte es nebenher erledigen.

Da wir Win32 API verwenden, muss ich die Icons zu Bitmaps im BMP Format konvertieren. Der UX Designer hat aus den Icons Bitmaps im PNG-Format in verschiedenen Auflösungen erzeugt.

Das einzige Problem war die Toolbar API. Hier kommen Imagelists zum Einsatz. Es galt die Bitmaps zu „Bitmapstripes“ zu verknüpfen.

Das sollte doch einfach sein. Was konnte da schiefgehen?

„Icon – drei Irrwege“ weiterlesen

Dreimal C++ – lambdas in legacy code

Wie schon zuletzt beschrieben, galt es C++ Software aus einem Nachbarprojekt zu übernehmen. Die dort tätigen Kollegen verwendeten begeistert die Features von C++ 2014. Vor allem der Datentyp „auto“ und die Initialisierung mit geschweiften Klammern hatte es ihnen angetan. Auch setzten sie shared_ptr und unique_ptr ein. Falls diese dann doch mit traditionellen Pointer darunter mischen, startet unter Umständen eine interessante Fehlersuche.

Aber mich interessierte die Art und Weise wie sie lambdas einbauten. Ich suchte nach eckigen Klammer gefolgt von einer geöffneten Klammer und konnte drei Sorten identifizieren:

  1. lokale Subroutinen (hätte man auch mit #defines machen können)
  2. Abräumer von von Windows handles (scope guard, geht kaum ohne lambdas)
  3. zur Initialisierung von static Variablen (das fand ich cool)

„Dreimal C++ – lambdas in legacy code“ weiterlesen

c++ im Jahr 2019: lambda und diskette

Was ich neulich im Job sah, warf mich förmlich um. Zum ersten Mal sah ich C++ lambda Ausdrücke in einem in die Jahre gekommen Softwarestapel. Es war sogar eine richtig praktische Anwendung, an die die Erfinder dieser neuen Sprachfeatures nicht gedacht hatten:


auto const fDoEvents = [&]()
     ProcessMessagesForCurrentProcessMainWindow();
     ProcessAfxMessagePump();
};
fDoEvents();

// vollen Refresh auslösen
xy->AddChanges(CTRL_NAV_RESULT);
z->Refresh(CTRL_NAV_CURR, true);
fDoEvents();

Das lambda fasste Statements zusammen, die in einem Spaghetticode immer wieder zu wiederholen sind. Hier war es immer mal wieder Messages zu bearbeiten. In der guten(?), alten Zeit hätten #define macros herhalten müssen.

In unmittelbarer Nähe, ein paar Zeilen unter dem zweiten Aufruf von fDoEvent()  befand sich ein Kommentar mit der Diskette:

// TODO: OFL aktualisieren (Dirtyflag / Diskette zurücksetzen)

Nach dem ersten Lachen stellte sich die Frage, wie dieser Kommentar in den Source kam.

Die Datei wurde laut tfs um 2015 geschrieben.

Die zweite Frage, war die, wie lambda Ausdrücke in den neuen C++ Standards funktioneren?

Das lud mich dann ein hierzu etwas zu schreiben.

„c++ im Jahr 2019: lambda und diskette“ weiterlesen

const char * und CString — täglich grüßt das Murmeltier

Ich fühlte mich wie in besagtem Film. Es ging um die Frage, warum die Software so lange braucht, obwohl nur wenig Daten zu verarbeiten waren. Zwar hatten sich die Kunden bestimmt schon an die Zwangspause gewöhnt, aber trotzdem sollte das doch mal schneller gehen. Wir könnten einen guten Eindruck machen, wenn es ein wenig schneller ginge mit der Erstellung einer Ausgabedatei.

Es gab eine ältere Fehlermeldung die etwas von einer ganz langen Erstellung einer solchen Ausgabe beschrieb. Die Datenbank lief auf einem eigenen Server. Die Anwendungssoftware auf einem Clientrechner.  Für mich deutete das auf ein Problem im Netz hin. Vermutlich war der merkwürdige Datenzugriff schuld. Die Anwendung war auf C-Isam zugeschnitten und nutzte SQL nur zum atomaren Zugriff auf Datensätze.

Das wollte ich zeigen. Es sollte einfach sein. War aber dann ganz anders.

„const char * und CString — täglich grüßt das Murmeltier“ weiterlesen

Legacy Code — Exe schläft nach Kaltstart

Endlich kam eine interessante Aufgabe. Eine Aufgabe, die typisch für Legacy Code war. Die schon in die Jahre gekommene Anwendung zeigte mit jeder neuen Version einen schlechteren Kaltstart. Wenn sie zum ersten Mal gestartet wurde, fror sie für einige Zeit ein. Diese Zeit wurde von Version zu Version immer länger. In der aktuellen Version konnten es mehrere Minuten sein.

Zwar hatten sich die Anwender schon an einen Verzug gewöhnt. Nun sollte wenigstens ein Grund für diesen Verzug gefunden werden. Eine Behebung sollte anschließend geplant werden.

Wie freute ich mich auf diese Aufgabe!

„Legacy Code — Exe schläft nach Kaltstart“ weiterlesen

boolVariable = !! BoolVariable, was will der C++ Source mitteilen?

Ich staunte nicht schlecht, als ich die zwei ! Zeichen sah.  Was sollte das?

War das ein Versehen? Hat da jemand den not-Operators überladen?

Es waren immer Stellen wie diese:

bIsOpen = !!mPtr->openFile(….) ;

Nachdem ich das zum ersten Mal gesehen hatte, entdeckte ich die doppelte Verneinung an immer mehr Stellen, in dem C++-Source, den zu warten ich für dieses Jahr übernommen hatte.

Um 20005 herum war es einmal eine Art Richtlinie. Was für einen Sinn das wohl gehabt hatte?

Ich forschte nach und bekam Antworten und Ergebnisse, die mich dann doch überraschten.

„boolVariable = !! BoolVariable, was will der C++ Source mitteilen?“ weiterlesen

Religion und Informatik – zwei Überraschungen

“Also Religion, da soll nur jemand kommen”, meinte mein neuer Kollege. Es ging beim Mittag um Themen, die im Job nicht angesprochen werden sollten. Das waren eben Religion und Politik.

Ich erkannte sofort ein Exemplar des atheistischen Logikers. Logik und Glauben schliessen sich bei dieser Spezies aus.

Schade, dabei kenne ich zwei religiöse Vorstellungen und Erzählungen, die nur aus informatischer Weltsicht richtig verständlich sind.

Schade, dass das Gespräch darüber eher schwierig ist. Zumal in einem Plenum immer auch das Gesicht verteidigt werden muss. Dann muss ich das wohl beschreiben.
„Religion und Informatik – zwei Überraschungen“ weiterlesen

Drei Userstories zum Thema Webapp und WordPress 5.x

Zufällig las ich in MeWe diesen Beitrag zu react Komponenten und Gutenberg:

Sharing React Components With Gutenberg

Der Schreiber verheiratet modernste Webtechnologie mit dem guten, alten WordPress. Für mich war das ein Grund einmal nachzuforschen, wie es mit meinem Lieblingsthema, den progressiven web Apps, und der Beziehung zu WordPress, meiner neuen Blogging Plattform, steht. Ich hatte dort schon push notifications eingebaut. Andere Entwickler beschäftigen sich selbstverständlich auch mit solchen Ideen.

Nach einer Mitteilung in WordPress core Forum ist revolutionäres geplant. WordPress Blogs sollen zu richtigen web Apps werden können. Damit unterschiedliche Plugins und Themes sich ihr service worker Javascript nicht überschreiben, entwickeln sie einen Standard. Das soll dann ähnlich wie bei den Widgets mit einem Registriermechanismus funktionieren.

Diese Entwicklungen werden von Google angetrieben.  Weil mit diesen Techniken die Webseiten schneller laden, bekommen diese eine höhere Sichtbarkeit. Das ist immer gut!

Was bringt das einem Blogger noch?

Ich habe mir drei Userstories überlegt:

  1. Freizeitblogger und seine Leser
  2. Produktblogger, die bloggen um zu verkaufen
  3. Patientenblogger, die nur für ihre Ärzte bloggen

„Drei Userstories zum Thema Webapp und WordPress 5.x“ weiterlesen

Freiberuflich auf Zuruf

“Das hat geklappt!”, sagte er. Dann fügte er noch ein “auf Anhieb” hinzu.

“Bin auch überrascht”, fügte ich hinzu. Meine Finger hatten noch darauf mit den regulären Ausdrücken. Es galt eine Kontrollausgabe umzuformatieren. Das erste Tab sollte zu einem Bindestrich und das zweite Tab zu einem Semikolon werden. Dann kann die Datei von der Datenbank wieder eingelesen werden.

Als mein Einarbeiter das sah, fluchte er.

“Mit regulären Ausdrücken geht das doch”, bemerkte ich und übernahm.

Damit kam ich letzte Woche im Team an. Zunächst ging es um die Werkzeuge und um Dokumentation lesen. Danach sollte mir gezeigt werden, wie das mit den Datenbanken und dem Abgleichen funktionierte.

Wie kam ich hier eigentlich hin? So richtige, freiberufliche Projektarbeit war das doch nicht.

„Freiberuflich auf Zuruf“ weiterlesen

WordPress plugin boilerplate – Alles klar?

Ein Plugin für WordPress hatte ich schon programmiert. Dieses passte nicht so richtig in das Repository von wordpress.org hinein. Ich las die Anleitungen und versuchte gar nicht mein poor man push Plugin hineinzustellen. Plugins werden vor einer Freigabe zunächst geprüft, ob alle Vorgaben erfüllt sind.

Am besten sollten Plugins nach der Boilerplate programmiert sein!

Diese Boilerplate stellte sich als eine Sammlung von php und html Dateien mit Struktur heraus. Der Programmierer brauchte nur den Namen plugin_name durch mein_wundervolles_ding zu ersetzen und schon war die Software auf Kurs die richtige Form zu haben.

Anschließend galt es, die Rümpfe von php Klassen und Javascript Dateien mit Funktionalität anzureichern.

Das wollte ich mit einem neuen Plugin für Blog Promotionen machen. Jeder Blogger sollte sein Geschreibsel promoten:

  • Den Blog in Blog Verzeichnisse eintragen
  • Die Artikel in sozialen Medien posten
  • Kontrollieren, ob das alles irgendwie Sinn ergibt

Das sollte für etwas reichen, das mir mit meinen Blogs hilft.

Wie erging es mir mit dem Boilerplate Plugin?

„WordPress plugin boilerplate – Alles klar?“ weiterlesen