Videoreihe: Entwicklung einer Desktopsoftware für compow mit C++, Qt und SQLite Teil 1

Für das Projekt compow, welches ich damals 2016 entwickelt habe und jetzt gerade relaunche, nachdem es zwei Jahre abgeschaltet war, möchte ich die Desktopsoftware, die ursprünglich in wxWidgets geschrieben war, neu in Qt implementieren.

Eine Desktopanwendung für compow mit C++, Qt und SQLite
Eine Desktopanwendung für compow mit C++, Qt und SQLite

Die wxWidgets-Anwendung ist in die Jahre gekommen und das Deployment, vor allem für verschiedene Betriebssysteme, ist unglaublich aufwendig. Weiterhin habe ich eine Menge Code an compow geändert, so dass man ein größeres Refactoring durchführen müsste. Ich möchte sie also neuschreiben und dachte mir, dass ich den Vorgang aufnehme. Darum geht es hier in den Videos. Begleitet mich beim Entwickeln der neuen compow-Desktop-Version.

Und hierum handel es sich: Mit der Desktop-Version von compow hat man lokalen Zugriff auf alle in compow gespeicherten Firmenprofile und kann diese inklusive Branchen durchsuchen.

Es handelt sich um eine sehr einfach Software und im ersten Schritt soll sie auch ganz einfach entwickelt werden. Ich verzichte auf ORM und Persistensbibliotheken (hier geht es nur um ein paar wenige Queries), auf Patterns, und so weiter. Ich entwickle ganz klassisch, da es sich nur um ein Nebenprodukt handelt. So sah die alte Software aus:

Alte compow-Desktop-Software
Alte compow-Desktop-Software

Die SQLite-Datenbank nehmen wir vom alten Projekt. Dafür gibt es auch bereits ein Script, welches die notwendigen Daten aus der „echten“ Datenbank herauszieht und in der SQLite-Datenbank speichert und Indices anlegt. Darum möchte ich mich nicht kümmern.

So sieht die Software aus, die wir in diesem ersten Teil implementiert haben:

Anfang der neuen Version
Anfang der neuen Version

Nicht schlecht, oder? In den nächsten Tagen machen wir weiter.

Hier geht es zum Video.

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.

YouTube-Kurztipp: WPStatistics mit C++, wxWidgets und DSLib aus MySQL auslesen und als Website anzeigen

Ich bin krank, kann momentan nichts sinnvolles machen, weil ich mich nicht konzentrieren kann und dachte mir, ich baue mal eine Website mit C++, um meine WPStatistics in vereinfachter Form anzusehen. Auch dachte ich mir: Warum nicht aufnehmen? Das habe ich getan.

WPStatistics mit C++, wxWidgets und DSLib aus MySQL auslesen und als Website anzeigen

Ich nutze dazu:

Vielleicht interessiert es ja jemanden, wie man einfach mit C++ eine Website bauen kann. Ich würde mich sehr über Feedback freuen.

Screenshot der Website
Screenshot der Website

Hier geht es zum Video.

Und hier geht es zum zweiten Teil (App-Entwicklung).

Hier geht es zum GitHub-Projekt.

Redmine-Reihe Nachtrag 2: Git-Repository anbinden

Als Entwickler wirst du dieses Feature lieben. Es ist problemlos möglich, Versionskontrollsysteme, bspw. Git, Subversion, usw. in eine Projekte innerhalb von Redmine einzubinden.

Git-Repository einbinden
Git-Repository einbinden

In diesem Video zeige ich dir, wie es geht.

Hier noch mein Update-Script:

#!/bin/sh

BACKUPPATH="/server/redminegit"
LOGFILE="${BACKUPPATH}/update.log"

date > "${LOGFILE}"

for dir in `find "${BACKUPPATH}/" -type d -depth 1 -not -path '*/\.*'`
do
	cd $dir
	echo $dir >> "${LOGFILE}"
	git pull 2>> "${LOGFILE}" >> "${LOGFILE}"
	echo "" >> "${LOGFILE}"
done

date >> "${LOGFILE}"

Und mein Cronjob:

SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/libexec:/usr/local/sbin/
HOME=/var/log

*/15 * * * * /server/redminegit/update

Hier geht es zur Playlist.

Hier geht es zum Video.

Redmine-Reihe Nachtrag 1: Plugins installieren

Ja, auch unter Redmine gibt es Plugins. Das ist toll, denn so kann man sich das ohnehin schon geniale Redmine weiter erweitern und anpassen. Ich zeige mal am CKEditor, wie man ein Plugin installiert.

Redmine - Plugins installieren
Redmine – Plugins installieren

Beim CKEditor handelt es sich um einen WYSIWYG-Editor für nahezu alle Textareas von Redmine. Normal sterbliche Benutzer sind damit einfach in der Lage, Texte direkt zu formatieren und die Formatierungen auch zu sehen.

Und wie das funktioniert, sehen wir in diesem Video.

Letztlich ist es einfach. Wir gehen auf unseren Server, auf dem Redmine installiert ist (übrigens: für dieses Plugin braucht man Git (FreeBSD: pkg install git)), wechselt ins Redmine-Plugin-Verzeichnis (FreeBSD: cd /usr/local/www/redmine/plugins) und zieht das zip-Package herunter (FreeBSD: fetch https://github.com/a-ono/redmine_ckeditor/archive/master.zip). Dann wird es entpackt (unzip master.zip) und richtig benannt (mv redmine_ckeditor-master redmine_ckeditor).

Wir wechseln ein Verzeichnis nach oben (cd ..) und führen dann folgende Befehle aus:

bundle install
rake redmine:plugins:migrate RAILS_ENV=production

Dann starten wir Apache einmal durch (FreeBSD: service apache24 restart) und aktivieren noch den Texteditor unter Administration -> Konfiguration -> Textformatierung = Ckeditor:

Textformatierung auf Ckeditor gesetzt
Textformatierung auf Ckeditor gesetzt

Fertig sind wir.

Hier geht es zum Video.

Hier geht es zur Playlist.

Redmine-Reihe 3 von 3: Redmine für Benutzer

Willkommen zum dreiteiligen Workshop: Redmine 4. In diesem zweiten Teil geht es um „Redmine für Bentuzer“.

Das Video erklärt einige grundsätzliche Informationen auf der administrativen Seite im Backend von Redmine.

Redmine für Benutzer
Redmine für Benutzer

Wir gehen in diesem Video folgende Bereiche durch:

  • Eigenes Konto
  • Meine Seite
  • Projektseite
  • Filter
  • Suche
  • Projektliste
  • Übersicht
  • Aktivität
  • Tickets
  • Aufgewendete Zeit
  • Zeiten buchen
  • Gantt-Diagramm
  • Kalender
  • News
  • Dokumente
  • Wiki
  • Dateien
  • Repository (am Beispiel von Git)

Hier geht es zur Playlist.

Hier geht es zum Video.

Redmine-Reihe 2 von 3: Redmine für Administratoren

Willkommen zum dreiteiligen Workshop: Redmine 4. In diesem zweiten Teil geht es um „Redmine für Administratoren“.

Das Video erklärt einige grundsätzliche Informationen auf der administrativen Seite im Backend von Redmine.

Redmine für Administratoren

Folgende Dinge werden erklärt:

  • Adminkonto bearbeiten
  • Projekte erstellen, konfigurieren und verwalten
  • Benutzerverwaltung
  • Gruppenverwaltung
  • Rollen und Rechte
  • Trackerverwaltung
  • Ticket-Status-Verwaltung
  • Workflow
  • Benutzerdefinierte Felder
  • Aufzählungen
  • Redmine konfigurieren

Hier geht es zum Video.

Hier geht es zur Playlist.

Hier geht es zu Redmine installieren.

Redmine-Reihe 1 von 3: Redmine 4 installieren (auf FreeBSD 13)

Willkommen zum dreiteiligen Workshop: Redmine 4. Ich habe mir überlegt, ich mache einen kleinen Redmine-Einsteigerkurs. Dieser geht über drei Kapitel:

  • Redmine 4 installieren (in meinem Fall auf FreeBSD 13)
  • Redmine 4 für Administratoren (GUI)
  • Redmine 4 für Benutzer (GUI)
Redmine - Installation
Redmine – Installation

In diesem Video und Blog-Artikel geht es darum, wie man Redmine einfach installieren kann. Ich setze dafür folgendes voraus:

  • Du hast ein lauffähiges und vollständig gepatchtes FreeBSD 13 (oder neuer)
  • Du hast einen lauffähigen PostgreSQL-Server (wie das geht, erfährst du hier und hier)
  • Nameservereinträge sind bereits vorhanden (in meinem Fall heißt mein Host redmine.gug-it.gg, welchen ich hier auch in der Beschreibung überall nutze. Das musst du natürlich anpassen!)

So wird es gemacht

Erstelle einen Datenbankbenutzer. Wie das bei deiner PostgreSQL-Version geht, entnimmst du den Manuals. Achte darauf, dem Benutzer ein verschlüsseltes Kennwort zu geben. Ich habe noch ein (uraltes) PostgreSQL 9.5 auf meiner Testmaschine laufen (du solltest hoffentlich was neueres haben), und da geht es so:

createuser -E -P redmine

Dann erstellst du noch die Datenbank, was bei mir so geht:

createdb -E unicode -O redmine redmine

und vergisst natürlich nicht den Eintrag in der pg_hba.conf

host redmine redmine 192.168.0.168/24 password

Denke daran, Datenbanknamen, Datenbankbenutzer und IP anzupassen!

Ich nutze Apache in der Version 2.4. Wenn du was anderes benutzt, dann musst du leider schauen, wie du es ans Rennen bekommst. Ich installiere also alle benötigten Pakete:

pkg install redmine4 apache24 ap24-mod_fastcgi fcgi-devkit postgresql14-client

In der httpd.conf (/usr/local/etc/apache24) setzt du, wenn du es noch nicht getan hast, den Servernamen sowie die E-Mail-Adresse (wobei die auch im VHost eingerichtet wird). Weiterhin entfernst du bei den Zeilen:

LoadModule rewrite_module libexec/apache24/mod_rewrite.so
LoadModule fastcgi_module libexec/apache24/mod_fastcgi.so
Include etc/apache24/extra/httpd-vhosts.conf

die Raute (#) vorne, so dass die Zeilen genutzt werden innerhalb der Konfiguation. Und der aufmerksame Leser weiß es: ich nutze hier jetzt im Beispiel kein SSL! Bitte mache das, und mache das auf jeden Fall, wenn Redmine im Internet hängt! Das wäre jetzt einfach nur zu aufwendig für das Tutorial.

Server-Kram liegt bei mir unter /server. Web-Kram dementsprechend unter /server/web/<sld>/<t(hird)ld>. Passe die Konfiguration bei dir an. Dementsprechend richte ich das Verzeichnis folgendermaßen ein:

mkdir -p /server/web/gug-it && chown -R www:www /server/web/gug-it
ln -s /usr/local/www/redmine /server/web/gug-it/

Dann bearbeite ich die Datei /usr/local/etc/apache24/extra/httpd-vhosts.conf (du hoffentlich /usr/local/etc/apache24/extra/httpd-ssl.conf). Da füge ich folgenden Eintrag hinzu:

<VirtualHost *:80>
        ServerName redmine.gug-it.gg
        ServerAdmin thorsten@tgeppert.de

        DocumentRoot "/server/web/gug-it/redmine/public"

        FastCgiServer /server/web/gug-it/redmine/public/dispatch.fcgi -idle-timeout 120 -initial-env RAILS_ENV=production -initial-env PATH=/usr/local/bin -processes 2

        <Directory /server/web/gug-it/redmine/public>
                AddHandler fastcgi-script fcgi
                Require all granted
                AllowOverride all
                Options +FollowSymLinks +ExecCGI
                RewriteEngine On
                RewriteCond %{REQUEST_FILENAME} !-f
                RewriteRule ^(.*)$ dispatch.fcgi
        </Directory>

        ErrorLog "/var/log/redmine.gug-it.gg-error_log"
        CustomLog "/var/log/redmine.gug-it.gg-access_log" common
</VirtualHost>

Dann kopiere ich noch die dispatch.fcgi (wir nutzen FastCGI) an die richtige Stelle und mache sie ausführbar:

cp /usr/local/www/redmine/public/dispatch.fcgi.example /usr/local/www/redmine/public/dispatch.fcgi
chmod +x /usr/local/www/redmine/public/dispatch.fcgi

Jetzt geht es an die Netzwerkkonfiguration. Die Daten dazu liegen dir hoffentlich vor.

cp /usr/local/www/redmine/config/database.yml.sample /usr/local/www/redmine/config/database.yml

Die bearbeiten wir dann mit dem Editor unserer Wahl und geben die richtigen Daten ein:

production:
  adapter: postgresql
  database: redmine
  host: thorsten.jails.gug-it.gg
  username: redmine
  password: "redmine"
  # Use "utf8" instead of "utfmb4" for MySQL prior to 5.7.7
  encoding: utf8

Nicht vergessen, ich nutze PostgreSQL. Wenn du MySQL oder anderes nutzt, musst du das natürlich beachten! Mein Datenbankserver liegt auf „thorsten.jails.gug-it.gg“.

Als nächstes müssen wir noch ein paar Module zu unserem Redmine hinzufügen. Wir erstellen im Verzeichnis /usr/local/www/redmine die Datei Gemfile.local mit folgendem Inhalt:

gem 'pg'
gem 'fcgi'

und führen dann folgende Befehle aus:

bundle install
rake generate_secret_token
setenv RAILS_ENV production
rake db:migrate
rake redmine:load_default_data

Um Dateiuploads durchführen zu können, müssen wir noch die Datei configuration.yml anlegen. Dazu kopieren wir die Example-Datei einfach:

cp /usr/local/www/redmine/config/configuration.yml.example /usr/local/www/redmine/config/configuration.yml

und setzen dort den attachments_storage_path auf ein sinnvolles Verzeichnis, in meinem Fall „/server/files/redmine“. Ich lege das Verzeichnis an:

mkdir -p /server/files/redmine
chown -R www:www /server/files/redmine

und trage dann in usr/local/www/redmine/config/configuration.yml folgendes ein:

attachments_storage_path: /server/files/redmin

Ich lasse an dieser Stelle die E-Mail-Konfiguration mal aus, weil das recht spezifisch ist. Kommt ganz darauf an, was du brauchst, aber schau dir die Konfigurationsdatei einmal an und du wirst schnell verstehen, wie das funktioniert.

Wenn wir dann Apache starten (oder neustarten), können wir auf Redmine zugreifen. Die Standardzugangsdaten lauten:

Benutzername: admin, Kennwort: admin

Du wirst direkt aufgefordert, dein Kennwort zu ändern. Jetzt kannst du direkt loslegen.

Hier geht es zum Video.

Hier geht es zur Playlist.

Hier geht es zu Redmine für Administratoren.

Warum ich Redmine mittlerweile sehr gerne benutze

Es ist tatsächlich so, dass ich nie wirklich Software eingesetzt habe, um meine Projekte zu managen. Dabei ging es teils um Projekte, die groß waren, an denen bis zu fünf Personen gearbeitet haben und die über Jahr hinweg liefen.

Das KooKooK-Projekt in Redmine
Das KooKooK-Projekt in Redmine

Ich hatte immer alles im Blick, ich hatte maximal einen selbstgeschriebenen Bug-Tracker im Einsatz und Aufgaben haben wir analog auf Karten verteilt oder mündlich kommuniziert. Komischerweise und im Gegenzug zu vielen anderen, war das nie problematisch. Aufgaben wurden erledigt, Übersicht über Bugs und Features hatten wir und es lief, wie es laufen sollte.

Doch bin ich seit vier Jahren dazu übergegangen, ein Projektmanagementprogramm einzusetzen. Ich hatte damals viel überlegt, recherchiert, was ich so brauche und wurde bei CGM dazu gezwungen, Jira zu benutzen, was ich zwar schon kannte, aber immer (für mich) unübersichtlich hielt, mit einem dazu geschalteten Confluence, was aber nie vernünftig gepflegt wurde.

Ich stieß dann, eines Tages, auf Redmine. Ich sah mir Videos an und wagte mich an die Installation auf FreeBSD. Mit viel Geschrei bekam ich es auch installiert und ich war: begeistert. Genau so habe ich mir ein Tool für mich vorgestellt. Zu Beginn war es ein wenig unübersichtlich, aber man kommt innerhalb weniger Tage rein und dann wird es von unübersichtlich zu übersichtlich.

Redmine bringt etliches mit. Was es nicht mitbringt, lässt sich zumeist als Plug-In herunterladen und installieren. Mit dabei sind eine multiple Projektverwaltung (man kann mehrere Projekte anlegen und mit Unterprojekten gliedern), ein Ticketsystem (was meiner Meinung aber eher für intern ist und nicht für die Kommunikation mit externen Kunden, wo ich OTRS für besser geeignet halte), Aufwandmanagement (man kann für Tickets, die übrigens auch verknüpfte Tickets haben dürfen, Zeiten schätzen und Aufwände buchen, wodurch dann Abrechnungen beim Kunden zum Kinderspiel werden), ein GANTT-Diagramm (Tickets können terminiert werden), Foren, ein Wiki, eine Roadmap mit Versionierung, Repository-Einbindung (es ist problemfrei möglich, vorhandene Git und SubVersion-Repos einzubinden und sogar innerhalb von bspw. Tickets auf Commits zu verweisen), Dokumente, Dateien, News und ein Rechte-Rollen-Management.

Das GitHub-Repository in Redmine eingebunden
Das GitHub-Repository in Redmine eingebunden

Als unterliegende Plattform benutze ich zurzeit ein FreeBSD 13 mit einer PostgreSQL-Datenbank. Redmine selbst ist in Ruby (Ruby on Rails) geschrieben.

Als einziges Plugin benutze ich einen visuellen Editor, da ich Redmine auch mit Menschen benutze, die sich nicht in irgendeine Markup-Sprache einarbeiten möchten. Somit ist es einfach, überall mit Überschriften, Listen oder Bildern zu arbeiten.

Redmine erleichtert meinen Alltag ungemein. Aufgaben und Ideen werfe ich direkt ins Ticketsystem, Dokumentieren erledige ich im Wiki. Wichtige Dateien kann man überall anhägen (in Tickets sowie in Wikieinträgen und überall sonst), wobei es für allgemeinen Kram auch eine Dateienverwaltung gibt.

Aktivitätsübersicht in Redmine
Aktivitätsübersicht in Redmine

Was Redmine nicht hat ist die Einbindung von Microsoft Office, so wie man es beispielsweise von Confluence kennt. Ich kann nicht direkt eine Excel-Datei bearbeiten. Hier müsste man sie herunterladen, bearbeiten, hochladen. Dafür ist das System nicht ausgelegt.

Redmine ist kostenlos, OpenSource und läuft letztlich auf allen unixoiden Plattformen. Es unterstützt unterschiedliche Datenbanken und es gibt sogar kommerziellen Support (EasyRedmine), wenn man ihn benötigt.

Alle in allem kann ich sagen: Wenn ihr auf der Suche nach einem Projektmanagementprogramm seid, dann probiert Redmine einfach einmal aus.

Mein neues (und erstes) Live-Projekt: KooKooK

Da ich jetzt ja mit YouTube begonnen und aufgrund meiner jetzigen Situation ein wenig Zeit habe, habe ich mir überlegt, an einem neuen privaten Projekt zu arbeiten, um nicht aus der Übung zu kommen. Und genau deswegen dachte ich: warum nicht aufzeichnen und auf YouTube veröffentlichen?

KooKooK.org
KooKooK.org

Genau das möchte ich jetzt mit KooKooK versuchen. Es hat mehrere Hintergründe. Ein Ziel ist es auf jeden Fall, mein Portfolio weiter auszubauen, denn ich bin ja auf Jobsuche. Dann dachte ich mir, ich kann sicher noch einiges dazulernen und du vielleicht auch.

Dabei gibt es aber folgende Vorstellung meinerseits. Ich werde die Videos nicht scripten. Ich werde einfach loslegen, Fehler bleiben drin, damit wir was daraus lernen, Versprecher ebenso und alles, was so schief geht. Weiterhin möchte ich mich bei den Videos aber auch nicht nur auf das Coding konzentrieren. Ich möchte euch bei allen Dingen mitnehmen. Natürlich wird ein großer Teil die Programmierung sein, aber ich zeige euch auch, was ich als Projektverwaltung benutze, wir richten die Website ein, scribbeln, malen/zeichnen und machen all das, was man ebenso macht, um eine kleine Software zu entwickeln.

Worum soll es gehen? Ich habe lange überlegt. Soll ich was mit Datenbanken machen? Soll ich was mit Netzwerkprogrammierung machen? Soll ich Websitekram machen? Soll ich ein Spiel programmieren? Die Antwort war einfach: Ja. Mein Ziel ist es, einen grafischen Chat zu entwickeln, der mit Avataren in einer künstlichen Welt funktioniert. Da haben wir Spieleentwicklung, Netzwerkentwicklung, Datenbankentwicklung, Protokollentwicklung, eine Website soll es auch geben, es wird spannend. Und da ich mir vor vielen Jahren bereits die Domain KooKooK.org gesichert habe, wird das Projekt jetzt einfach mal so heißen.

Welche Tools eingesetzt werden, kann ich jetzt noch nicht sagen. Es wird auf jeden Fall C++-lastig, wahrscheinlich Qt, weil ich auch mobile Plattformen wie iPhoneOS, iOS und Android unterstützen möchte. Den Code werde ich auf GitHub lagern, so dass ihr mit daran entwickeln könnt.

Und jetzt geht es los. Ich wünsche euch und auch mir viel Spaß dabei.

Hier geht es zur Playlist.

Und hier zum ersten Video.

Hier geht es zur Website.

Hier geht es zum GitHub-Repository.

Hier geht es zum Redmine-Projekt.