In diesem Video geht es um Storage Classes in C und C++.
Monat: November 2022
FreeBSD-Grundkurs 031: Virtualisierung mit bhyve und vm-bhyve
Wer mit FreeBSD Virtualisierung durchführen möchte, hat mehrere Möglichkeiten: Jails, VirtualBox und QEmu. Mit bhyve bietet FreeBSD aber ein eigenes Virtualisierungsprogramm an, welches sehr einfach mit vm-byhve zu benutzen ist. Wie das geht, zeigt dieses Video.
In diesem Beispiel zeige ich, wie man vm-byhve und grub2-bhyve installiert, konfiguriert und ein Debian darin installiert.
Hier einige Kommandos:
# SSH-Verbindung, falls nötig, zum Host aufbauen und darauf achten, dass Escape-Sequenzen von SSH ignoriert werden, da diese sonst nicht an die Console von bhyve geschickt werden können (cu)
ssh -e none $servername
# Installation der benötigten Pakete
pkg install vm-bhyve grub2-bhyve
# ZFS-Dataset erstellen
zfs create storage/bhyve
# /etc/rc.conf bearbeiten
sysrc vm_enable="YES"
sysrc vm_dir="zfs:server/bhyve"
# vm-byhve initialisieren
vm init
# Template kopieren und bearbeiten
cp /usr/local/share/examples/vm-bhyve/debian.conf /server/bhyve/.templates/mydebian.conf
# Switch erstellen und Netzwerk-Interface hinzufügen
vm switch create public
vm switch add public bge0
# ISO-Datei für die Installation von Debian herunterladen
vm iso https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-11.5.0-amd64-netinst.iso
# Virtuelle Maschine erstellen, Festplattengröße auf 16GB setzen
vm create -t mydebian -s 16g mydebian
# Virtuelle Maschine installieren
vm install -f mydebian debian-11.5.0-amd64-netinst.iso
# Virtuelle Maschinen auflisten (inkl. Status)
vm list
# Vorhandene ISO-Dateien ansehen
vm iso
# Automatischer Start der virtuellen Maschinen
vm_list="vm1 vm2"
vm_delay="5"
wxWidgets-Tutorial 008 – Das erste Programm: Netto-Brutto-Rechner
Um uns zu motivieren, schreiben wir in diesem Video unser erstes eigenes kleines Programm. Ihr könnt mal schauen, ob wxWidgets das Richtige für euch ist und schon, nach dem ersten Erfolgserlebnis, damit ein wenig herumspielen.
Und so sieht das Programm aus:
Hier noch der Quelltext:
#include <wx/wx.h>
class BruttoNettoApp : public wxApp {
public:
bool OnInit();
};
class BruttoNettoFrame : public wxFrame {
public:
BruttoNettoFrame();
private:
wxPanel *mainPanel;
wxBoxSizer *mainBoxSizer;
wxTextCtrl *priceTextCtrl;
wxStaticText *multiplicatorStaticText;
wxComboBox *taxComboBox;
wxButton *calculateButton;
wxTextCtrl *resultTextCtrl;
};
IMPLEMENT_APP(BruttoNettoApp)
bool BruttoNettoApp::OnInit() {
BruttoNettoFrame *bruttoNettoFrame = new BruttoNettoFrame;
bruttoNettoFrame->Show();
SetTopWindow(bruttoNettoFrame);
return true;
}
BruttoNettoFrame::BruttoNettoFrame() : wxFrame(nullptr, wxID_ANY, "Brutto-Netto-Rechner") {
mainPanel = new wxPanel(this, wxID_ANY);
mainBoxSizer = new wxBoxSizer(wxHORIZONTAL);
priceTextCtrl = new wxTextCtrl(mainPanel, wxID_ANY);
mainBoxSizer->Add(priceTextCtrl, 1);
multiplicatorStaticText = new wxStaticText(mainPanel, wxID_ANY, "x");
mainBoxSizer->Add(multiplicatorStaticText);
taxComboBox = new wxComboBox(mainPanel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
taxComboBox->Append("7%");
taxComboBox->Append("19%");
taxComboBox->SetSelection(0);
mainBoxSizer->Add(taxComboBox);
calculateButton = new wxButton(mainPanel, wxID_ANY, "=");
calculateButton->Bind(wxEVT_BUTTON, [this](wxCommandEvent &event) {
double price = 0.f;
if(priceTextCtrl->GetValue().ToDouble(&price)) {
price *= taxComboBox->GetSelection() == 0 ? 1.07 : 1.19;
resultTextCtrl->SetValue(wxString::Format(_("%lf"), price));
} else {
wxMessageBox("Wrong price", "Error");
}
});
mainBoxSizer->Add(calculateButton);
resultTextCtrl = new wxTextCtrl(mainPanel, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxTE_READONLY);
mainBoxSizer->Add(resultTextCtrl, 1);
mainPanel->SetSizer(mainBoxSizer);
mainBoxSizer->SetSizeHints(this);
SetSize(500, -1);
priceTextCtrl->SetFocus();
calculateButton->SetDefault();
}
Wer Windows und VisualStudio benutzt, kann auf den Play-Button klicken. Unter anderen Systemen könnte die Kompilierung so aussehen:
c++ NettoBruttoRechner.cpp -o NettoBruttoRechner -std=c++11 `wx-config --libs --cppflags`
Auf die einzelnen Komponenten gehe ich dann Stück für Stück in den nächsten Videos ein. Also keine Angst, falls Ihr hier etwas nicht verstehen solltet, das kommt bald.
FreeBSD-Grundkurs 030: Boot-Delay im Bootmanager ändern
Nutzt man FreeBSD als Desktopsystem, möchte man vielleicht, dass das System schneller bootet. Dazu kann man das Delay von 10 Sekunden im Bootmanager umzustellen. Wie das geht, zeigt dieses Video.
Beispiel: Delay auf 2 Sekunden einstellen -> Datei: /boot/loader.conf
autoboot_delay="2"
FreeBSD-Grundkurs 029: RAID1 mit GMIRROR
Datenredundanz ist mitunter ein sehr wichtiges Theman. Wie man ein (Software-) RAID1 mit FreeBSD und GMIRROR aufbaut, zeigt dieses Video.
Die Erstellung eines einfach RAID1 funktioniert so:
# Erste Festplatte labeln
gmirror label -b round-robin $name $device1
# gmirror laden (für den Boot 'geom_mirror_load="YES"' in /boot/loader.conf eintragen
gmirror load
# Zweite Festplatte einbinden
gmirror insert $name $device2
# Status ansehen
gmirror status
Alle wichtigen Dinge und auch Beispiele stehen in der Manpage. Bitte immer lesen!
Qt-Tutorial 041: Settings (Konfigurationsdateien speichern und laden)
Dieses Video zeigt, wie einfach es ist, mit Qt Konfigurationsdateien zu speichern und zu laden. Dazu benutze ich QSettings.
Hier der Beispielcode:
#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QSettings>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QCoreApplication::setApplicationName("YouTube-Tutorial");
QCoreApplication::setOrganizationName("DynSoft");
QCoreApplication::setOrganizationDomain("dynsoft.com");
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::log()
{
ui->logPlainTextEdit->appendPlainText("");
}
void MainWindow::log(const QString &message)
{
ui->logPlainTextEdit->appendPlainText(message);
}
void MainWindow::log(const QString &prefix, const QString &message)
{
ui->logPlainTextEdit->appendPlainText(prefix + ": " + message);
}
void MainWindow::on_savePushButton_clicked()
{
//QSettings settings("C:\\Users\\thorsten\\Desktop\\Tutorial.ini", QSettings::IniFormat);
//QSettings settings("DynSoft", "QtTutorialSettings");
QSettings settings;
settings.setValue("Window/PositionX", pos().x());
settings.setValue("Window/PositionY", pos().y());
settings.setValue("Window/Width", size().width());
settings.setValue("Window/Height", size().height());
settings.setValue("Window/Size", size());
settings.beginGroup("UserSettings");
settings.setValue("Username", "Thorsten");
settings.endGroup();
}
void MainWindow::on_loadPushButton_clicked()
{
//QSettings settings("C:\\Users\\thorsten\\Desktop\\Tutorial.ini", QSettings::IniFormat);
//QSettings settings("DynSoft", "QtTutorialSettings");
QSettings settings;
log("Window");
log("PositionX", settings.value("Window/PositionX").toString());
log("PositionY", settings.value("Window/PositionY").toString());
log("Width", settings.value("Window/Width").toString());
log("Height", settings.value("Window/Height").toString());
qDebug() << settings.value("Window/Size").toSize();
log();
log("UserSettings");
settings.beginGroup("UserSettings");
log("Username", settings.value("Username").toString());
settings.endGroup();
}
FreeBSD-Grundkurs 028: Festplattenverschlüsselung mit GELI
Datenverschlüsselung ist sehr wichtig. Wie einfach das mit FreeBSD und GELI funktioniert, zeigt dieses Video.
Das Vorgehen ist relativ einfach. Wir verschlüsseln eine Festplatte mit AES-XTS 256 mit Passphrase (Kennwort) und einer Sektorgröße von 4096:
geli init -s 4096 -e aes -l 256 $device
Das Einhängen ist dann ebenfalls leicht:
geli attach $device
Wenn man die Festplatte (oder Partition oder das Device) beim Starten des Computers entschlüsselt wird, dann reicht ein Eintrag in der /etc/rc.conf:
geli_devices="$device"
Mitunter ist es sinnvoll, das Auto-Detaching abzuschalten, weswegen noch ein Eintrag in die rc.conf muss:
geli_autodetach="NO"
Bitte lest dazu aber alle Dokus durch, da es da um einen sicherheitsrelevanten Teil geht!
Nicht vergessen, dass in der /boot/loader.conf folgender Eintrag bei der Benutzung von GELI stehen muss:
geom_eli_load="YES"
Es gibt noch weitere Möglichkeiten. Es ist zum Beispiel möglich, bestimmte Parameter (z.B. geli_autodetauch) auf einzelne Devices zu konfigurieren, so dass diese dann nicht global gelten. Hier gibt es noch weiteführende Informationen, die unbedingt gelesen werden sollten.
Als Nachtrag: Wenn der Computer das kann, Hardware-Encryption einschalten (/boot/loader.conf):
aesni_load="YES"
FreeBSD-Grundkurs 027: Die Befehle truncate und mdconfig
Für die nächsten Videos brauchen wir zwei Befehle, auf die ich in diesem Video einmal ganz kurz eingehen möchte: truncate und mdconfig.
Mit truncate ist es möglich, Dateien zu vergrößern und zu verkleinern. Es kann aber auch Dateien mit bestimmter Größe erstellen. Wir benutzen truncate so:
truncate -s 1g Dateiname
Dieser Befehl erstellt eine Datei mit der Größe von einem Gigabyte.
Mit mdconfig können wir Dateien als Devices einbinden:
# Datei einbinden
mdconfig -a -f Dateiname
# Eingebundene Datei wieder entfernen (X steht für die Device-Nummer)
mdconfig -d -uX
# Devices anzeigen lassen
mdconfig -l -v
Qt-Tutorial 040: Resources
Wie man problemlos mehrere Dateien mit seiner Software im Binary mitliefert, zeigt dieses Video. Ich gehe zusätzlich darauf ein, wie man Mehrsprachresources benutzt.
Qt-Tutorial 039: Multisprachanwendungen / Mehrsprachanwendungen
Dieses Video zeigt, wie einfach es mit Qt ist, Software in mehreren Sprachen auszuliefern.
So sieht unsere Beispielanwendung aus: