In diesem Video zeige ich, wie man mit der Statusbar (QStatusBar) umgehen kann.
Viele Fenster des benutzten Fenstermanagers haben am unteren Rand eine Leiste, die manchmal einfach nur da ist, manchmal Informationen anzeigt, manchmal aber auch Interaktionen anbietet. Dieses Video zeigt, wie man Informationen dauerhaft oder für eine gewisse Zeit anzeigt oder Widgets hinzufügt.
Ich gebe es zu: Ich habe meinen Server, der online steht und, unter anderem, dieses Blog betreibt, ziemlich und auch lange vernachlässigt. Installiert war ein FreeBSD13.3 amd64. Die aktuelle Version aus der 13er-Reihe war 13.4. So weit zurück war ich nicht, was aber das größere Problem war, waren die installierten Packages, allen voran PostgreSQL, MySQL und PHP.
Ich dachte mir, ich ziehe mein FreeBSD 13.3 direkt auf 14.2, damit zumindest das Grundsystem mal aktuell ist und Dienste wie SSH und ähnliche mit Sicherheitsupdates versorgt werden. Die Packages wollte ich dann irgendwann später nachziehen.
Also begann ich, das Upgrade durchzuführen. Das lief auch gut, bis zum ersten Reboot. Der Server kam nicht mehr hoch. Zumindest dachte ich das. Von Hetzner ließ ich mir eine KVM anschließen und war doch erstaunt: Der Server ist hochgefahren und der erste Schritt des Upgrades war erfolgreich. Jedoch hatte der Server kein Netzwerk mehr. Warum, weiß ich nicht, ich konnte es aber schnell lösen, indem ich von meiner statischen Netzwerkonfiguration auf DHCP umgestellt habe. Also weiter mit dem Upgrade.
Der zweite Reboot ging dann leider in die Hose. Ich habe mir wieder eine KVM von Hetzner anschließen lassen (die erste hatte ich nur für eine Stunde geliehen) und sah, dass ich beim Mergen der Konfigurationen irgendwo zwei Zeilen „wegoptmiert“ hatte und so ein Script, welches zum Booten benötigt wird, fehlschlug. Reboot. Die Maschine kam hoch, schmiss aber ein paar Fehlermeldungen. Problematisch war, dass ich mich mit keinem meiner Accounts anmelden konnte. Irgendwelche anderen Scripte waren auch kaputt.
Anscheinend habe ich es entweder geschafft, ein paar Dinge kaputt zu machen (was mir zuvor noch nie passiert war), oder es gab irgendwelche anderen Probleme. Durch den Boot in den Single-User-Mode konnte ich mich umsehen und habe versucht, die Probleme zu fixen. Vergeblich. Dann hatte ich aber auch keine Lust mehr und die KVM war ja auch nur für drei Stunden geliehen, es musste eine Lösung her. Fakt war, dass im etc-Verzeichnis einiges kaputt war.
Also kopierte ich das etc-Verzeichnis von einer funktionsfähigen Installation von FreeBSD 14.2, schob meine Konfigurationen hinein und kopierte alles per „scp“ auf meinen Server. Zumindest das Grundsystem funktionierte dann wieder und ich brauchte die KVM nicht mehr.
Doch kaum ein Dienst funktionierte. Wir (meine Familie und ich) sind allerdings auf ein paar Dienste angewiesen: Mail, Card– und CalDav, mein Blog, NextCloud, meine Projekte, Git, usw.
Es blieb mir nichts übrig, als alles hochzuziehen. Wieder einmal dachte ich mir, wie sinnvoll es wäre, verschiedene Dienste in verschiedenen Jails zu organisieren und regelmäßiger Updates und Upgrades durchzuführen. Es war gut ein Tag Arbeit, alles wieder ans Rennen zu bekommen, zumal auch Packages wegfielen (wxWidgets 2.8, welches ich für compow.de benötige).
https://youtu.be/o7JoKRrQDkQIch möchte bald ein paar Videos machen, für die wir ein DMBS benötigen. In diesem Video zeige ich, wie man eine einfache (unsichere und für Produktivumgebungen nicht zu verwendende!) MySQL-Datenbank unter FreeBSD (14.2) installieren kann.
Die Vorgehensweise
# pkg install mysql90-server
/etc/rc.conf bearbeiten
mysql_enable=“YES“
mysql_dbdir=“/server/database/mysql“
Verzeichnis erstellen
# mkdir -p /server/database/mysql
# chown -R mysql:mysql /server/database/mysql
MySQL starten
service mysql-server start
Datenbank anlegen
mysqladmin create youtube
Benutzer und Berechtigungen erstellen
# mysql mysql
> CREATE USER ‚youtube’@’%‘ IDENTIFIED BY ‚youtube‘;
Ich möchte bald ein paar Videos machen, für die wir ein DMBS benötigen. In diesem Video zeige ich, wie man eine einfache (unsichere und für Produktivumgebungen nicht zu verwendende!) PostgreSQL-Datenbank (17) unter FreeBSD (14.2) installieren kann.
Als ich bei der Pleodat GmbH war, sollten sich mein neuer Kollege und ich vorstellen. Ich habe gerade die Präsentation gefunden und möchte sie hier veröffentlichen.
Apple selbst sagt, dass der erste Apple Pencil mit dem aktuellen iPad Air M2 inkompatibel ist. Man könnte meinen, dass diese Aussage eher daher kommt, weil Apple vielleicht doch lieber neue Hardware verkaufen möchte, denn mit ein wenig Trickserei funktioniert dieser auch immer noch, wenn auch nicht so angenehm, wie ein neuer.
Da das aktuelle iPad keinen Lightning-Anschluss mehr hat und stattdessen auf USB-C setzt, kann der Stift nicht direkt am Gerät geladen werden. Abhilfe schaffen hier Adapter, die man für ein paar Euro kaufen kann.
Ist der Stift geladen, benötigt man noch eine Software auf dem iPad: LightBlue. Mit dieser ist es möglich, den Stift via Bluetooth zu finden und zu koppeln. Wichtig: Der Stift wurde bei mir nicht erkannt bzw. gekoppelt, wenn er eingesteckt war.
Also:
Stift ausstecken
LightBlue starten
Stift aus der Liste aussuchen
Auf „connect“ klicken (der Kopplungscode lautet 1234)
Stift funktioniert
Allerdings gibt es bei mir ein Problem: Immer, wenn ich den Stift lade, ist die Bluetooth-Verbindung „weg“. Der Stift wird, manchmal, dann noch über LightBlue angezeigt, eine Koppelung ist aber nicht möglich. Manchmal erscheint der Stift aber auch überhaupt nicht. Die Lösung, die bei mir funktioniert:
Einstellungen -> Bluetooth -> Apple Pencil entkoppeln
LightBlue starten
Stift aus der Liste aussuchen
Auf „connect“ klicken (der Kopplungscode lautet 1234)
Stift funktioniert
Das ist natürlich nervig, aber für jemanden, der den Stift nur selten nutzt, ein gangbarer Weg, ohne 100 Euro oder mehr für einen neuen Stift auszugeben.
Jeder weiß: Globale Variablen sind böse. Mir fiel jetzt auf, dass viele funktionsglobale Variablen, also Variablen, die zu Beginn einer Funktion deklariert werden, nutzen. Diese sind dann nicht im jeweiligen Scope, sondern von überall in der Funktion änderbar.
Ist dies bei Programmiersprachen wie Pascal so üblich, sollte man überlegen, ob solche Konstrukte wirklich sinnvoll sind:
#include <stdio.h>
int do_something() {
int a;
int b;
if (1 == 1) {
a = 3;
b = 4;
return a + b;
}
return 0;
}
oder man lieber im Scope bleibt (der Einfachheit wurde jetzt auf Konstanten usw. verzichtet):
#include <stdio.h>
int do_something() {
if (1 == 1) {
int a = 3;
int b = 4;
return a + b;
}
return 0;
}
Das kann natürlich zu ähnlichen Problemen und Seiteneffekten führen, wie globale Variablen. Es ist also möglich, den Wert von funktionsglobalen Variablen an jeder Stelle im Code zu überschreiben, was fehleranfällig ist und das Debugging schwieriger macht.
Go und C++ bieten mittlerweile auch Konstrukte, in denen bereits im If-Kontrollstrukturheader Variablen deklariert und definiert werden können, die für die gesamte If-Kontrollstruktur funktionieren:
if (auto x = obj.methode(); x == 3) { ... }
Ich würde dringend empfehlen, auf funktionsglobale Variablen zu verzichten.
Ein weiteres Problem innerhalb verschiedener Programmiersprachen wie C ist, dass viele dann Variablen keinen Initialwert zuordnen. Es sollte also nicht so aussehen:
int a;
sondern besser:
int a = 0;
Dies vermindert Fehler und Debugging unter Umständen erheblich.
Obwohl es bereits Redmine 6.0.1 zum jetzigen Zeitpunkt gibt, haben wir unter FreeBSD bisher leider „nur“ Version 5.1 zur Verfügung. Allerdings gab es auch eine ganze Weile lang keine lauffähige Redmine-Version für FreeBSD in den Packages und Ports.
Ich habe Version 5.1 testweise in einer VM installiert und es funktionierte problemlos. Letztlich kann man nach dieser Anleitung vorgehen:
Ich freue mich darüber, dass es funktioniert und wir Redmine weiterhin unter FreeBSD nutzen können und hoffe, dass es bald auch eine aktuellere Version gibt.
Da es in einem meiner letzten Projekte vorkam und sich jetzt auch öfter wiederholt hat, möchte ich einmal dazu etwas schreiben. Das Thema ist „Programmieren“.
Beim Programmieren in einer der meisten gängigen Programmier- oder Scriptsprachen schreibt man Quellcode. Dieser Quellcode ruft oftmals Prozeduren oder Funktionen auf, die mit den Bibliotheken beim Compiler mitkommen. Der Programmierer schreibt aber auch eigene. Dabei geht es mir um diese Themen:
Verzeichnis- und Dateihierarchie
Benamung von Dateien
Benamung von Codebestandteilen
Funktionen
Prozeduren
Klassen/Interfaces
Variablen
Konstanten
Mir ist oft aufgefallen, dass diesen Themen oftmals nur ungenügend Aufmerksamkeit geschenkt wird, dabei ist das, meiner Meinung nach, unglaublich wichtig, wenn
Der Code gewartet werden soll über Jahre oder Dekaden
Andere den Code verstehen sollen
Andere den Code ändern oder erweitern sollen
Andere den Code portieren sollen
Es keine ausreichende Dokumentation gibt
Ein Beispiel. Wir haben eine Funktion, die sieht selbst so aus und hat folgenden Inhalt:
int ab_ad_nmb_re(int pab, int p_ab, bool ab) {
int pab_list;
char *pa;
…
}
Da gibt es mehrere Probleme:
Der Funktionsname besteht aus etlichen Abkürzungen, die ein anderer nicht kennt, nachschlagen und sich merken muss. Oder immer wieder nachschlagen muss. Dementsprechend nichtssagend ist der Name
Die Variablen heißen alle fast gleich, sind nichtssagend und unglaublich verwirrend
Oftmals, von mehreren unterschiedlichen Leuten, höre ich dann folgende Argumente:
Ich weiß ja, was das alles heißt
Du kommst da schon irgendwann rein
Wir können doch keine aussagekräftigen Namen nehmen, da das dann zu lang ist und dann bringt das auch keinem was
Ehrlicherweise muss ich da sagen: Nein. Ich nehme (s. GitHub) halbwegs aussagekräftige Namen (manchmal, selten, auch mal nicht, das sollte so aber nicht sein). Sie sagen aus, was sie machen, man braucht keine oder wenig Dokumentation und auch andere sind schnell eingearbeitet und können Änderungen vornehmen.
Bezüglich langer Namen: Jeder halbwegs taugliche Editor zum Programmieren bietet Autovervollständigung. Selbst VIM bringt im Standard bereits eine kontextlose Autovervollständigung mit, die ich gerne benutze: [Strg]+[p/n]. Damit sind längere Namen kein Problem mehr, da nur der oder ein paar Anfangsbuchstaben getippt werden müssen.
Das hat viele Vorteile:
Der Code wird lesbarer
Andere können sich viel schneller einarbeiten
Der Code selbst ist Dokumentation
Mein altes Projekte Warehouse nutzt solche Namen an den meisten Stellen. Das Projekt ist von 2009 und wurde mit VIM umgesetzt. Aber schaut euch auch Frameworks an, die Methodennamen mit vernünftiger Benamung haben wie Qt, wxWidgets, Java-SDK, uvm.
Ich kann nur empfehlen, lieber den Code etwas aussagekräftiger zu gestalten, denn meiner Meinung nach zahlt sich das schnell aus. Speicher ist günstig, da machen die paar Bytes den Kohl auch nicht fett.
In diesem Video zeige ich das Grundgerüst einer wxWidgets-Anwendung. Wir implementieren unsere eigene wxApp und schreiben die main-Funktion einmal via wx-Makro und einmal händisch.