Kategorie: Anwendungen

Virtueller Webserver auf Debian-Basis

· · 0 Kommentare

Als Test- und Entwicklungssystem für Websites bietet sich ein virtueller Server auf der Basis von LAMP an: Linux, Apache, MariaDB und PHP (Perl, Python, ...). So bleibt der Server mit all seinen Komponenten vom eigentlichen Arbeitssystem getrennt, kann einzeln gesichert und ggf. auch wiederhergestellt werden und Dank Snapshots kann man eventuell fehlschlagenden Experimenten deutlich entspannter entgegensehen.

Sofern das Betriebssystem bereits entsprechende Mechanismen mitbringt, sollte für die Virtualisierung auf Bordmittel zurückgegriffen werden - unter Linux zum Beispiel auf GNOME Boxes oder den Virtual Machine Manager, unter Windows 10 Professional oder Enterprise stattdessen auf Hyper-V. Ansonsten kann auch eine alternative Lösung wie VMware Workstation Player oder Oracle VirtualBox installiert werden.

Auf Details der Virtualisierungsumgebung wird hier nicht weiter eingegangen, diese können bei Bedarf in der jeweiligen Dokumentation nachgelesen werden.

Der Server wird absichtlich "offen" als internes System konfiguriert und sollte in dieser Konfiguration auf keinen Fall aus dem Internet erreichbar sein!

Weiterlesen


ORA-01861: literal does not match format string

· · 0 Kommentare

Als jemand, der überwiegend MySQL bzw. MariaDB als Datenbank verwendet, stolpere ich mehr oder minder regelmäßig über die Aufgabe, Oracle ein Datum mitzuteilen.

Als Workaround hilft ein

ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD';

am Beginn der Session, dann funktionieren auch Angaben wie '2021-09-30'.


PuTTY-Einstellungen vereinheitlichen

· · 0 Kommentare

Innerhalb von PuTTY ist leider keine Möglichkeit vorgesehen, die Einstellungen verschiedener Sessions zu verheinheitlichen. Sich im Laufe der Benutzung ergebende Änderungen an den "Default Settings" müssen ggf. manuell in andere gespeicherte Sessions kopiert werden.

Bei mehr als einer Hand voll Sessions ist die Übertragung nervig und lästig, aber ein kleines Perl-Skript kann die Aufgabe automatisiert erledigen:

# +----------------------------------------------------------------------------+
# |  putty-settings.pl                                                         |
# |    copy settings from 'Default Settings' to all other sessions             |
# +----------------------------------------------------------------------------+
# |  Copyright (c) 2021 by Andreas Thul                                        |
# |  putty-settings.pl is published under the Perl Artistic License 2.0        |
# +----------------------------------------------------------------------------+
# |  2021-09-29 initial release                                                |
# +----------------------------------------------------------------------------+

# - import ---------------------------------------------------------------------

use strict;
use warnings;
use Win32::TieRegistry(Delimiter=>"/", ArrayValues=>0);

# -- global --------------------------------------------------------------------

my $sourceSessionName = 'Default%20Settings';

my @valuesToCopy = qw(
	ANSIColour AltF4 AltOnly AltSpace AlwaysOnTop ApplicationCursorKeys ApplicationKeypad AutoWrapMode
	BCE BackspaceIsDelete Beep BeepInd BellOverload BellOverloadN BellOverloadS BellOverloadT BellWaveFile BlinkCur BlinkText BoldAsColour BoldFont BoldFontCharSet BoldFontHeight BoldFontIsBold
	CJKAmbigWide CRImpliesLF CapsLockCyr ChangeUsername CloseOnExit Colour0 Colour1 Colour10 Colour11 Colour12 Colour13 Colour14 Colour15 Colour16 Colour17 Colour18 Colour19 Colour2 Colour20 Colour21 Colour3 Colour4 Colour5 Colour6 Colour7 Colour8 Colour9 ComposeKey CtrlAltKeys CtrlShiftCV CtrlShiftIns CurType
	DECOriginMode DisableArabicShaping DisableBidi
	Environment EraseToScrollback
	Font FontCharSet FontHeight FontIsBold FontQuality FontVTMode FullScreenOnAltEnter
	HideMousePtr
	LFImpliesCR LineCodePage LinuxFunctionKeys LocalEcho LocalEdit LockSize
	MouseAutocopy MouseIsXterm MouseOverride MousePaste
	NetHackKeypad NoAltScreen NoApplicationCursors NoApplicationKeys NoDBackspace NoMouseReporting NoPTY NoRemoteCharset NoRemoteClearScroll NoRemoteResize NoRemoteWinTitle
	PasteControls PasteRTF Present Printer
	RXVTHomeEnd RawCNP RectSelect RekeyBytes RekeyTime
	ScrollBar ScrollBarFullScreen ScrollOnDisp ScrollOnKey ScrollbackLines ScrollbarOnLeft ShadowBold ShadowBoldOffset StampUtmp SunkenEdge
	TelnetKey TelnetRet TermHeight TermWidth TerminalModes TerminalSpeed TerminalType TrueColour TryAgent TryPalette
	UTF8Override UTF8linedraw UseSystemColours
	WarnOnClose WideBoldFont WideBoldFontCharSet WideBoldFontHeight WideBoldFontIsBold WideFont WideFontCharSet WideFontHeight WideFontIsBold WinNameAlways WinTitle WindowBorder WindowClass Wordness0 Wordness128 Wordness160 Wordness192 Wordness224 Wordness32 Wordness64 Wordness96
	Xterm256Colour
);

# -- main ----------------------------------------------------------------------

$|=1;

# HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions

my $puttyRegistry = $Registry->{"HKEY_CURRENT_USER/Software/SimonTatham/PuTTY/Sessions/"};
my $sourceSession = $puttyRegistry->{"$sourceSessionName/"};

foreach my $currentSessionName ($puttyRegistry->SubKeyNames) {

	next if $currentSessionName eq $sourceSessionName;

	print "$currentSessionName\n";

	my $targetSession = $puttyRegistry->{"$currentSessionName/"};

	foreach my $ValueName (@valuesToCopy) {

		print ".. $ValueName\n";

		my($ValueData, $ValueType)= $sourceSession->GetValue($ValueName);
		$targetSession->SetValue($ValueName, $ValueData, $ValueType);
	}
}

# -- eof -----------------------------------------------------------------------

Im oberen Bereich des Skrips kann bei Bedarf noch der Name der Quell-Session (hier "Default%20Settings") sowie die zu übertragenden Parameter angepasst werden, anschließend überträgt das Skript bei jedem Durchlauf die Werte aller aufgelisteten Parameter aus der Quell-Session in alle anderen Sessions.


Aktualisiertes AppArmor-Profil für Sublime Text 4

· · 0 Kommentare

Nach der Aktualisierung auf Version 4 wollte Sublime Text mit dem alten AppArmor-Profil nicht mehr starten. Ein Blick ins Log half, die Problemstellen zu lokalisieren und das Profil anzupassen:

# 2020-05-11 athul/initial
# 2020-09-29 athul/replaced abstractions/evince
# 2021-07-26 athul/changed permissions for /opt/sublime_text/sublime_text from "mr" to "mrix",
#   added settings for /opt/sublime_text/plugin_host-3.3, /opt/sublime_text/plugin_host-3.8
#   chandged permissions for /opt/sublime_text/** from "r" to "mr", removed /opt/sublime_text/plugin_host
# 2021-08-19 athul/added write permission to /tmp/*

#include <tunables/global>

/opt/sublime_text/sublime_text {
  #include <abstractions/X>
  #include <abstractions/base>
  #include <abstractions/dbus-session-strict>
  #include <abstractions/fonts>

  deny network,

  /opt/sublime_text/ r,
  /opt/sublime_text/** mr,
  /opt/sublime_text/plugin_host-3.3 mrix,
  /opt/sublime_text/plugin_host-3.8 mrix,
  /opt/sublime_text/sublime_text mrix,
  /proc/filesystems r,
  /usr/share/** r,
  /usr/bin/perl mrix,
  /usr/bin/sassc mrix,
  owner /dev/shm/* rwl,
  owner /run/user/** rw,
  owner /tmp/* w,
  @{HOME}/** rwk,
  @{HOME} rw,
}

Es musste die Berechtigung für Sublime Text um "ix" (execute and inherit the current profile) ergänzt, die Einstellungen für den Plugin-Host geändert und die Berechtigungen für die Dateien unterhalb von "/opt/sublime_text/" um "m" (memory map executable) erweitert werden.

Versionshistorie:

2021-08-19: Fehlende Berechtigung zum Schreiben in "/tmp" ergänzt
2021-08-09: Aktualisierung für Sublime Text 4


Warum Snapshots nur temporär verwendet werden sollten

· · 0 Kommentare

Snapshots sind eine tolle Sache: einen Snapshot erstellen, etwas ausprobieren und entweder wird das Ergebnis für die Ewigkeit konserviert (indem der Snapshot dauerhaft in die virtuelle Maschine übernommen wird) oder es geht zurück auf den Stand des Snapshots, weil man die Änderung nicht behalten möchte.

Da Snapshots sowohl Speicherplatz benötigen als auch Leistung kosten sollte darauf geachtet werden, sie lediglich temporär einzusetzen.

Hier ein an manchen Stellen vereinfachter Erklärungsversuch, die verwendeten Farben bedeuten folgendes:

Ausgangsszenario

Eine virtuelle Maschine speichert ihre Festplatte in einer Datei "Festplatte" (dazu kommt noch die ein oder andere Verwaltungsdatei, diese sind aber für die Betrachtung unerheblich). Diese Festplatte ist in viele Blöcke einer festen Größe unterteilt, in der die Daten liegen.

Diese Datei hat eine maximale Größe, welche der für die Festplatte festgelegten Kapazität entspricht. Sämliche Lese- und Schreibzugriffe finden innerhalb der Datei "Festplatte" statt.

Snapshot "Snapshot 1"

Nun wird ein Snapshot "Snapshot 1" angelegt. Ab diesem Moment wird auf die Datei "Festplatte" nur noch lesend zugegriffen, alle Änderungen die Blöcke der Festplatte betreffend (neue Dateien, geänderte Dateien etc ...) werden in der Datei "Snapshot 1" gespeichert.

Nach einiger Zeit der Nutzung ergibt sich folgendes Bild:

Für jeden Lesezugriff muß die virtuelle Maschine nun schauen, ob sie einen angefragten Block aus der Datei "Festplatte" (Blöcke 2, 4 und 5) oder aus der Datei "Snapshot 1" (Blöcke 1, 3, 6, 7 und 8) nehmen muß.

Mit jedem Schreibzugang, der einen in "Snapshot 1" noch nicht geänderten Block betrifft, wächst die Datei "Snapshot 1". Im Extremfall, wenn jeder Block der Festplattte geändert wurde, wird die Datei "Snapshot 1" so groß wie die ursprüngliche Datei "Festplatte". Im Beispiel ist der benötigte Platz von ursprünglich 8 Blöcken auf 13 Blöcke angewachsen.

Snapshot "Snapshot 2"

Nun wird ein weiterer Snapshot "Snapshot 2" angelegt. In diesem Moment wird auf die Dateien "Festplatte" und "Snapshot 1" nur noch lesend zugegriffen, alle Änderungen die Blöcke der Festplatte betreffend werden in der Datei "Snapshot 2" gespeichert.

Nach einiger Zeit der Nutzung ergibt sich folgendes Bild:

Für jeden Lesezugriff muß die virtuelle Maschine nun schauen, ob sie einen angefragten Block aus der Datei "Festplatte" (Block 2), der Datei "Snapshot 1" (Block 7) oder der Datei "Snapshot 2" (Blöcke 1, 3, 4, 5, 6 und 8) nehmen muß.

Mit jedem Schreibzugang, der einen in "Snapshot 2" noch nicht geänderten Block betrifft, wächst die Datei "Snapshot 2". Im Extremfall, wenn jeder Block der Festplattte geändert wurde, wird die Datei "Snapshot 2" so groß wie die ursprüngliche Datei "Festplatte". Im Beispiel ist der benötigte Platz von ursprünglich 8 Blöcken auf 19 Blöcke angewachsen, d.h. es wird bereits mehr als der doppelte Platz der Maximalgröße von "Festplatte" verwendet.

Problematik

Wenn sich ein Block oft ändert, wird für diesen nun auch dreifach Speicherplatz belegt: in der Datei "Festplatte", in der Datei "Snapshot 1" und in der Datei "Snapshot 2".

Bei Lesevorgängen muß immer geschaut werden, in welcher der drei Dateien die aktuelle Version des Blocks zum Zurückliefern vorhanden ist.

Löschen von "Snapshot 1"

Wenn man nun sicher ist, daß alles, was zu dem Zeitpunkt, als "Snapshot 2" erstellt wurde funktioniert, kehrt man i.d.R. nie wieder zu "Snapshot 1" zurück.

Als Konsequenz daraus löscht man in der Verwaltungsoberfläche der Virtualisierungssoftware "Snapshot 1". Die Virtualisierungssoftware überträgt alle Blöcke aus "Snapshot 1" zurück an die entsprechenden Stellen von "Festplatte" (Blöcke 1, 3, 6, 7 und 8) und löscht anschließend die Datei "Snapshot 1".

Als Ergebnis ergibt sich folgendes Bild:

Die Leistung wird besser, weil bei Lesezugriffen nur noch geschaut werden muss, ob ein Block aus "Festplatte" (Blöcke 2 und 7) oder "Snapshot 2" (Blöcke 1, 3, 4, 5, 6 und 8) gelesen werden muß und der Speicherplatz, den die Datei "Snapshot 1" bisher benötigt hat, ist wieder verfügbar. Im Beispiel ist der benötigte Platz von 19 Blöcken auf 14 Blöcke geschrumpft.