Damit ich das nächste Mal nicht suchen muss:
SELECT
vorname,
name,
to_char(geburtstag, 'DD.MM.YYYY') as geburtstag
FROM personen;
oder auch ausführlich mit Zeit
TO_CHAR(datum,'DD.MM.YYYY HH24:MI') datum
Damit ich das nächste Mal nicht suchen muss:
SELECT
vorname,
name,
to_char(geburtstag, 'DD.MM.YYYY') as geburtstag
FROM personen;
oder auch ausführlich mit Zeit
TO_CHAR(datum,'DD.MM.YYYY HH24:MI') datum
Vor kurzem muste ich mehrere mp3 Dateien zusammen verbinden. Die Dateien waren ab CD und enthielten einen Vortrag der in mehrere Tracks aufgespittet war.
Mit Audacity wird das wie folgt gemacht:
Manchmal kann es vorkommen, dass eine Citrix *.ica Datei nicht mit Citrix sondern z.B. mit dem Word geöffnet wird.
Um das zu korrigieren ist wie folgt vorzugehen: Klicke mit der rechten Maustaste auf die *.ica Datei und wähle Eigenschaften.
Danach klicke auf Ändern.
Nun an das Ende der Liste scrollen und auf Wählen Sie eine App auf Ihrem PC aus klicken.
Wechsle in den Pfad C:\Programme (x86)\Citrix\ICA Client\ und selektiere die Anwendung wfcrun32.exe und drücken anschliessend auf Öffnen.
Die *.ica Dateien starten nun wieder standardmässig mit der installierten Citrix Workspace App.
In Windows 11 hat Microsoft in die Suche der Taskleiste Bing integriert. Erkennbar ist es am «B» in der Sprechblase rechts im Suchfeld.
Sucht man nun etwas, wird gleichzeitig über Bing nach dem Suchbegriff gesucht. Will man keine automatische Bing-Suche, so kann diese wie folgt deaktiviert werden:
Will man ein E-Book auf der «Bücher»-App (ehemals iBook) von Apple wieder exportieren, muss wie folgt vorgegangen werden.
Für den Vorgang ist ein Mac mit der Bücher-App Voraussetzung. Das gewünschte E-Book mit der Maus aus der Bücher-App auf den Desktop ziehen.
Die nun auf dem Desktop befindliche .epub Datei kann in keiner anderen App wie z.B. Calibre geöffnet werden, da Apple ein eigenes Format mit weiteren Metadaten verwendet. Um das E-Book wieder nutzbar zu machen, muss der Paketinhalt angezeigt werden.
Dazu mit der rechten Maustaste auf die Datei klicken und «Paketinhalt anzeigen» wählen.
Nun werden in der Regel mehrere Ordner angezeigt:
Für uns interessant sind die Daten im Ordner OEBPS. Diesen Ordner öffnen und den Inhalt mit CMD + A markieren und komprimieren:
Unter Umständen kann das E-Book auch anders aussehen:
In diesem Fall die hier markierten Bereiche selektieren und komprimieren.
Danach die erstelle Archive.zip an einen anderen Ort auf dem Mac kopieren. Nun kann die Datei beliebig umbenannt und mit der Endung *.epub versehen werden. Also z.B. «Buchname.epub».
Die Datei kann nun in Calibre wieder problemlos geöffnet werden.
Sollte es dennoch ein Problem mit der Datei geben, kann versucht werden diese mit Sigil zu reparieren.
Vor längerem habe ich ein Backup-Script geschrieben mit dem ich Webseiten über rsync sichern und wiederherstellen kann.
Die hier publizierten Scripts sind ohne jegliches Gewähr.
# Backup
backup.sh /pfad/zu/credentials.txt
# Restore
restore.sh /pfad/zu/credentials.txt /pfad/zu/backup/daily/2023.11.01
name=domain.ch
email=vorname@domain.ch
server=domain.ch
ssh_user=username
ssh_privkey=/home/username/.ssh/bak_id_rsa
ssh_port=22
rsync_source=/home/domain/public_html/
basedir=/home/username/backup/domain.ch
mysql_server=localhost
mysql_user=database_username
mysql_pw='database_pw'
mysql_db=database_name
keep_backup_hours=48
keep_backup_days=14
keep_backup_weeks=8
keep_backup_months=12
name
– Name der Webseite die gesichert werden sollemail
– E-Mailadresse an welche Fehler gesendet werden sollenserver
– in der Regel die Domain der Webseite oder eine IP des Servers.ssh_user
– Benutzername mit dem man sich per SSH auf dem Server der Webseite einloggen kannssh_privkey
– Pfad zum SSH Private Keyssh_port
– (optional) – Default: 22 – SSH-Portrsync_source
– Pfad auf dem Webserver. Wichtig, muss einen Slash am Ende enthalten, damit der direkte Inhalt des angegebenen Ordners synchronisiert wird.basedir
– Ordner auf dem lokalen Backup-Server in dem das Backup abgelegt wirdmysql_server
– (optional) – Host des MySQL/MariaDB Serversmysql_user
– (optional) – Datenbank Benutzermysql_pw
– (optional) – Passwort des Datenbank Benutzersmysql_db
– (optional) – Datenbankmysql_port
– (optional) – Default: 3306 – Port über den die Datenbank angesprochen wirdmysql_direct
– (optional) – Default=false
– bei true
wird die Datenbank direkt verbunden und nicht über die SSH Verbindungkeep_backup_hours
– (optional) – Default 48
– Anzahl Stunden in denen jedes Backup aufbewart wirdkeep_backup_days
– (optional) – Default: 14
– Anzahl Tage in denen das letzte Backup des Tages aufbewahrt wirdkeep_backup_weeks
– (optional) – Default: 8
– Anzahl Wochen an denen das sonntägliche Backup aufbewahrt wird – sollte es kein Backup am Sonntag geben, so wird das nächste danach erstellte Backup aufbewahrtkeep_backup_months
– (optional) – Default:12
– Anzahl Monate an denen das Backup am ersten Tag des Monats aufbewahrt wird – sollte es kein Backup am am ersten Tag des Monats geben, so wird das nächste danach erstellte Backup aufbewahrt├── domain.ch
│ ├── credentials.txt
│ ├── backup.log
│ ├── current
│ │ ├── backup.log
│ │ ├── database
│ │ │ └── database.sql.gz
│ │ ├── files
│ │ │ ├── Datei 1
│ │ │ ├── Datei 2
│ │ │ └── etc...
│ ├── daily
│ │ ├── 2011.01.01
│ │ │ ├── backup.log
│ │ │ ├── database
│ │ │ │ └── database.sql.gz
│ │ │ ├── files
│ │ │ │ ├── Datei 1
│ │ │ │ ├── Datei 2
│ │ │ │ └── etc...
│ │ ├── 2011.01.02
│ │ │ ├── ....
│ ├── hourly
│ │ ├── 2023.11.01_22.00.20
│ │ │ ├── ...
│ │ ├── 2023.11.01_23.00.10
│ ├── monthly
│ │ ├── 2023.10.01
│ │ │ ├── ...
│ │ ├── 2023.11.01
│ ├── weekly
│ │ ├── 2023.10.29
│ │ │ ├── ...
│ │ ├── 2023.11.05
#!/bin/bash
# ------------------------
# Backup Script
# Variablen:
# name
# email
# server
# ssh_user
# ssh_privkey
# ssh_port
# rsync_source
# rsync_dest
# mysql_server
# mysql_user
# mysql_pw
# mysql_db
# mysql_port
# mysql_direct=false
# ------------------------
# load
name=''
email='info@blattertech.ch'
server=''
ssh_user=''
ssh_privkey=''
ssh_port=''
rsync_source=''
mysql_server=localhost
mysql_user=''
mysql_pw=''
mysql_db=''
mysql_port=''
mysql_direct=false
basedir=''
if [ $# -eq 0 ]; then
echo "No configuration file defined"
exit 1
fi
if [ ! -f $1 ]; then
echo "Configuration file $1 does not exist"
exit 1
fi
# load configuration
source $1
# check if basedir exist
if [ ! -d ${basedir} ]; then
echo "Basedir ${basedir} does not exist"
exit 1
fi
# Check if private ssh key exist
if [ ! -f ${ssh_privkey} ]; then
echo "SSH private key ${ssh_privkey} does not exist"
exit 1
fi
lockfile=${basedir}/backup.lock
# Check is Lock File exists, if not create it and set trap on exit
if { set -C; 2>/dev/null >${lockfile}; }; then
trap "rm -f ${lockfile}" EXIT
else
echo "Lock file exists… exiting"
exit
fi
# set directorys
current=$basedir/current
hourly=$basedir/hourly
daily=$basedir/daily
weekly=$basedir/weekly
monthly=$basedir/monthly
# set default values
keep_backup_hours=${keep_backup_hours:-'72'}
keep_backup_days=${keep_backup_days:-'14'}
keep_backup_weeks=${keep_backup_weeks:-'8'}
keep_backup_months=${keep_backup_months:-'15'}
ssh_port=${ssh_port:-'22'}
mysql_port=${mysql_port:-'3306'}
mysql_server=${mysql_server:-$server}
rsync_dest=$current/files
mysql_dest=$current/database
mysql_dest_file=$mysql_dest/database.sql.gz
logfile=$current/backup.log
logfile_basic=$basedir/backup.log
# delete existing logfile
if [ -f "$logfile" ] ; then
rm "$logfile"
fi
log () {
if [ -z "$1" ]; then
cat
else
printf '%s\n' "$@"
fi | tee -a "$logfile" "$logfile_basic"
}
senderror () {
tail -1000 "$logfile" | mail -s "Backup $name failed" $email
}
# create folders if not exist
mkdir -p $rsync_dest
mkdir -p $hourly
mkdir -p $daily
mkdir -p $weekly
mkdir -p $monthly
# sync files
log "-------------------------- start backup $name --------------------------"
log ' '
log "Date: $(date)"
log ' '
log 'Start rsync'
rsync -e "ssh -p $ssh_port -i $ssh_privkey" --links --recursive --times --out-format="%n" --human-readable --partial --delete --compress --stats $ssh_user@$server:$rsync_source $rsync_dest 2> >(tee -a $logfile $logfile_basic >&2) | log
if [ $? -eq 0 ]; then
log 'Rsync finished'
else
log 'An error has occurred during rsync'
log '================= ERROR ================='
senderror
exit 1
fi
log ' '
# backup remote database
if [ $mysql_db != '' ]; then
log 'Start database backup'
mkdir -p $mysql_dest
rm -rv $mysql_dest/* | log
# Forward Port dynamisch nach Minute und Sekunde definieren, damit parallel laufende Scripts nicht den gleichen Port nutzen -> liesse sich mit Milisekunden allenfalls noch verbessern
# on Mac and BSD: jot -r 1 2000 65000
# other way: seq 2000 65000 | sort -R | head -n 1
# https://stackoverflow.com/questions/2556190/random-number-from-a-range-in-a-bash-script
if [ "$mysql_direct" = true ]; then
mysqldump -h $mysql_server -P ${mysql_port} --max_allowed_packet=512M --no-tablespaces --extended-insert --compress --quote-names --single-transaction --routines --triggers --opt -u $mysql_user --password="$mysql_pw" $mysql_db 2> >(tee -a $logfile $logfile_basic >&2) | gzip -c > $mysql_dest_file
else
forward_port=$(shuf -i 2000-65000 -n 1)
#ssh -p $ssh_port -i $ssh_privkey $ssh_user@$server "mysqldump -h '$mysql_server' --extended-insert --compress --quote-names --single-transaction --routines --triggers --opt -u $mysql_user --password='$mysql_pw' $mysql_db || exit 42;" | gzip -c > $mysql_dest_file
ssh -C -f -L${forward_port}:$mysql_server:$mysql_port -p $ssh_port -i $ssh_privkey $ssh_user@$server sleep 5
# weitere Optionen: --events
mysqldump -h 127.0.0.1 -P ${forward_port} --max_allowed_packet=512M --no-tablespaces --extended-insert --compress --quote-names --single-transaction --routines --triggers --opt -u $mysql_user --password="$mysql_pw" $mysql_db 2> >(tee -a $logfile $logfile_basic >&2) | gzip -c > $mysql_dest_file
fi
mysql_retval=${PIPESTATUS[0]}
if [ ${mysql_retval} -ne 0 ]; then
log 'Database backup FAILED'
log '================= ERROR ================='
senderror
exit 1
else
#file_size_kb=`du -k "$mysql_dest_file" | cut -f1`
file_size=$(ls -lh $mysql_dest_file | awk '{print $5}')
log "Database backup created successfully with $file_size"
fi
log ' '
fi
log "start carousel"
#calculate backup days
let keep_backup_hours*=60
let keep_backup_weeks*=7
let keep_backup_months*=30
#https://nicaw.wordpress.com/2013/04/18/bash-backup-rotation-script/
# destination file names
date_hourly=`date +"%Y.%m.%d_%H.%M.%S"`
date_daily=`date +"%Y.%m.%d"`
#date_weekly=`date +"%V sav. %m-%Y"`
#date_monthly=`date +"%m-%Y"`
# Get current month and week day number
month_day=`date +"%d"`
week_day=`date +"%u"`
# It is logical to run this script daily. We take files from source folder and move them to
# appropriate destination folder
# On first month day do
if [ "$month_day" -eq 1 ] ; then
destination=$monthly/$date_daily
mkdir -p $destination
cp -al $current/* $destination
log "monthly backup first day to $destination"
else # if there is no folder in the last 31 days, create a month backup
hasMonthlyFolder=$(find $monthly -maxdepth 1 -mtime -31 -type d -printf '.' | wc -c)
if [ $hasMonthlyFolder -le 1 ] ; then
destination=$monthly/$date_daily
mkdir -p $destination
cp -al $current/* $destination
log "monthly backup other day to $destination"
fi
fi
# copy weekly on sundays
if [ "$week_day" -eq 7 ] ; then
destination=$weekly/$date_daily
mkdir -p $destination
cp -al $current/* $destination
log "weekly backup on day 7 to $destination"
else # if there is no folder in the last 7 days, create a week backup
hasWeeklyFolder=$(find $weekly -maxdepth 1 -mtime -7 -type d -printf '.' | wc -c)
if [ $hasWeeklyFolder -le 1 ] ; then
destination=$weekly/$date_daily
mkdir -p $destination
cp -al $current/* $destination
log "weekly backup other day to $destination"
fi
fi
#cron hourly
destination=$hourly/$date_hourly
mkdir -p $destination
cp -al $current/* $destination
log "hourly backup to $destination"
# copy daily
destination=$daily/$date_daily
# copy files with hardlinks
mkdir -p $destination
cp -al $current/* $destination
log "daily backup to $destination"
log "end carousel"
log ' '
log "Endtime: $(date)"
log ' '
log "------------------------- end backup $name -----------------------------"
log ' '
echo "start cleaning carousel"
# hourly - keep for defined hours
find $hourly/ -maxdepth 1 -cmin +$keep_backup_hours -type d -exec rm -rf {} \;
# daily - keep for defined days
find $daily/ -maxdepth 1 -mtime +$keep_backup_days -type d -exec rm -rf {} \;
# weekly - keep for defined weeks
find $weekly/ -maxdepth 1 -mtime +$keep_backup_weeks -type d -exec rm -rf {} \;
# monthly - keep for defined yearss
find $monthly/ -maxdepth 1 -mtime +$keep_backup_months -type d -exec rm -rf {} \;
echo "end cleaning carousel"
#!/bin/bash
# ------------------------
# Backup Script
# Variablen:
# server
# ssh_user
# ssh_privkey
# ssh_port
# rsync_source
# rsync_dest
# mysql_server
# mysql_user
# mysql_pw
# mysql_db
# ------------------------
# load
server=''
ssh_user=''
ssh_privkey=''
rsync_source=''
mysql_server=$server
mysql_user=''
mysql_pw=''
mysql_db=''
mysql_port=''
ssh_port=''
basedir=''
if [ $# -eq 0 ]; then
echo "No configuration file defined"
exit 1
fi
# Check if configuration file exist
if [ ! -f $1 ]; then
echo "Conficuration file '$1' not found!"
exit 1
fi
# check if source directory exist
if [[ ! -d "$2" ]]; then
echo "The source directory '$2' not found!"
exit 1
fi
# load configuration
source $1
current=$2
rsync_restore_dest=$rsync_source
rsync_restore_source=$current/files/
mysql_source_file=$current/database/database.sql.gz
ssh_port=${ssh_port:-'22'}
mysql_port=${mysql_port:-'3306'}
mysql_server=${mysql_server:-$server}
success=1
logfile_basic=$basedir/restore.log
log () {
if [ -z "$1" ]; then
cat
else
printf '%s\n' "$@"
fi | tee -a "$logfile_basic"
}
# sync files
log '-------------------------- start restore data --------------------------'
log ' '
log "Date: $(date)"
log ' '
log 'Start rsync'
{
rsync -e "ssh -p $ssh_port -i $ssh_privkey" --recursive --times --progress --partial --delete --stats $rsync_restore_source $ssh_user@$server:$rsync_restore_dest
} | log
if [ $? = 0 ]; then
log 'Rsync restore files finished'
else
log 'An error has occurred during rsync'
success=0
fi
log ' '
# backup remote database
log 'Start database restore'
{
gunzip -c $mysql_source_file | ssh -p $ssh_port -i $ssh_privkey $ssh_user@$server "mysql -h $mysql_server -P $mysql_port -u $mysql_user --password='$mysql_pw' $mysql_db"
} | log
if [ $? = 0 ]; then
log 'Database restore successfully'
else
log 'Database restore FAILED'
success=0
fi
log ' '
log "Endtime: $(date)"
log ' '
log '------------------------- end restore -----------------------------'
log ' '
Im Kioskbetrieb eines Raspberry Pi mit Touchpad möchte ich das Zoomen per Hand unterdrücken. Dazu müssen folgende zwei Parameter beim Starten von Chromium mitgegeben werden:
--disable-pinch
– deaktiviert die pinch-to-zoom Funktionalität
--overscroll-history-navigation=0
– deaktiviert die swipe-to-navigate Funktionalität
Hier mein Beispiel wie ich den Chromium im Kiosk-Modus starte:
/usr/bin/chromium-browser --disable-session-crashed-bubble --disable-infobars --kiosk --no-first-run --incognito --disable-pinch --overcroll-history-navigation=0 'https://web.page'
Um eine SMTP Verbindung ab Powershell zu testen braucht es zwei Befehle die ausgeführt werden müssen:
$creds = get-credential
Nun erscheint die Aufforderung den Benutzernamen und das Passwort einzugeben. Dieser Werte werden in die Variable $creds gespeichert.
Sobald diese Anmeldeinformationen in der Variablen gespeichert sind, kann der nächste Befehl ausgeführt werden.
Send-MailMessage -From <Absenderadresse> -To <Empfänger> -Subject "Test Email" -Body "Test SMTP Service from Powershell on Port 587" -SmtpServer smtp.servername.ch -Credential $creds -UseSsl -Port 587
Gibt es keine Fehlermeldung, konnte das E-Mail ohne Probleme versandt werden.
Um eine SMTP Verbindung zu testen, kann unter Mac das Programm swaks
genutzt werden. Dieses ist auch für Linux / BSD verfügbar.
brew install swaks
swaks -tls --to lb@blattertech.ch --from btsrv@blattertech.com --server mail.cyon.ch --auth-user btsrv@blattertech.com
Die Ausgabe:
user@mac ~ % swaks -tls --to lb@blattertech.ch --from btsrv@blattertech.com --server mail.cyon.ch --auth-user btsrv@blattertech.com
Password:
=== Trying mail.cyon.ch:25...
=== Connected to mail.cyon.ch.
<- 220 mail.cyon.ch ESMTP ready
-> EHLO btmb02.local
<- 250-mail.cyon.ch
<- 250-SIZE 52428800
<- 250-8BITMIME
<- 250-PIPELINING
<- 250-HELP
<- 250 STARTTLS
-> STARTTLS
<- 220 2.0.0 Start TLS
=== TLS started with cipher TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128
=== TLS no local certificate set
=== TLS peer DN="/CN=*.cyon.ch"
~> EHLO btmb02.local
<~ 250-mail.cyon.ch
<~ 250-SIZE 52428800
<~ 250-8BITMIME
<~ 250-PIPELINING
<~ 250-HELP
<~ 250 AUTH LOGIN
~> AUTH LOGIN
<~ 334 VXNlcm5hbWU6
~> YnRzcnZAYmxhdHRlcnRlY2guY29t
<~ 334 UGFzc3dvcmQ6
~> NHlDRlR0UWpkNno=
<~ 235 2.0.0 OK
~> MAIL FROM:<btsrv@blattertech.com>
<~ 250 OK
~> RCPT TO:<lb@blattertech.ch>
<~ 250 Accepted
~> DATA
<~ 354 Enter message, ending with "." on a line by itself
~> Date: Tue, 18 Jul 2023 08:09:44 +0200
~> To: lb@blattertech.ch
~> From: btsrv@blattertech.com
~> Subject: test Tue, 18 Jul 2023 08:09:44 +0200
~> Message-Id: <20230718080944.016976@btmb02.local>
~> X-Mailer: swaks v20201014.0 jetmore.org/john/code/swaks/
~>
~> This is a test mailing
~>
~>
~> .
<~ 250 OK id=1qLdu8-007MqM-2t
~> QUIT
<~ 221 s078.cyon.net closing connection
=== Connection closed with remote host.
Um den unter Linux genutzen ip
Befehl im Terminal von Mac OS zu nutzen, kann das Paket über brew instaliert werden:
user@mac ~ % brew install iproute2mac
==> Fetching iproute2mac
==> Downloading https://ghcr.io/v2/homebrew/core/iproute2mac/manifests/1.4.1-1
############################################################################################################################################################################################################################################### 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/iproute2mac/blobs/sha256:eb6014521de7f35e1b16bb7465d9541355d981befff05dfe044291b234cf15a7
############################################################################################################################################################################################################################################### 100.0%
==> Pouring iproute2mac--1.4.1.all.bottle.1.tar.gz
🍺 /opt/homebrew/Cellar/iproute2mac/1.4.1: 6 files, 29.5KB
==> Running `brew cleanup iproute2mac`...
user@mac ~ % ip addr show en0
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether 54:46:12:fc:45:12
inet6 fe80::3636:3bff:fecf:1294/64 scopeid 0x4
inet 192.168.1.5/24 brd 192.168.1.255 en0
https://github.com/brona/iproute2mac
https://www.policyrouting.org/iproute2.doc.html
https://lartc.org/howto/