Suche
Suche Menü

Audacity – mehrere MP3-Dateien verbinden

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:

  • Klicken Sie auf „Datei > Importieren > Audio“ und alle Dateien auswählen (die Dateien werden dem Namen nach sortiert importiert).
    Um alle Dateien zu markieren kann Ctrl+A gedrückt werden. aus.
  • In der Menüleiste folgendes wählen: «Spuren > Spuren ausrichten > Ende an Ende ausrichten“.
    Die Dateien werden dadurch zeitlich aneinander ausgerichtet, sind aber immer noch in mehreren Spuren.
  • Nun in der Menüleiste «Spuren > Mix > Mischen und rendern“ wählen
    Dadurch werden die Spuren zu einer Spur zusammengefügt.
  • Nun kann die Datei über die Menüleiste «Datei > Exportieren» als mp3 exportiert werden.

Citrix Receiver – ica Datei startet mit falschem Programm

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.

Win11 – Bing Suche deaktivieren

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:

  1. Mit Win+R die Eingabeauforderung öffnen und dann nach regedit suchen und den Registrier-Editor öffnen.
  2. Nun folgenden Pfad öffnen: HKEY_CURRENT_USER, Software, Microsoft, Windows, CurrentVersion und Search.
  3. Nun im Bereich Search mit der rechten Maustaste klicken.
  4. Im erscheinenden Menü klicken Sie auf Neu und DWORD-Wert (32-Bit).
  5. Den Text in BingSearchEnabled ändern.
  6. Als Wert eine «0» (Null) definieren.
  7. Nun den Registrier-Editor schliessen. Beim nächsten Klick in die Suchleiste ist das Bing-Icon weg.

E-Book aus «Bücher»-App exportieren

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.

https://sigil-ebook.com/sigil/

Carousel-Backup mit rsync

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.

Aufruf des Scripts

# Backup
backup.sh /pfad/zu/credentials.txt

# Restore
restore.sh /pfad/zu/credentials.txt /pfad/zu/backup/daily/2023.11.01

credentials.txt

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

Parameter

  • name – Name der Webseite die gesichert werden soll
  • email – E-Mailadresse an welche Fehler gesendet werden sollen
  • server – 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 kann
  • ssh_privkey – Pfad zum SSH Private Key
  • ssh_port – (optional) – Default: 22 – SSH-Port
  • rsync_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 wird
  • mysql_server – (optional) – Host des MySQL/MariaDB Servers
  • mysql_user – (optional) – Datenbank Benutzer
  • mysql_pw – (optional) – Passwort des Datenbank Benutzers
  • mysql_db – (optional) – Datenbank
  • mysql_port – (optional) – Default: 3306 – Port über den die Datenbank angesprochen wird
  • mysql_direct – (optional) – Default=false – bei true wird die Datenbank direkt verbunden und nicht über die SSH Verbindung
  • keep_backup_hours – (optional) – Default 48 – Anzahl Stunden in denen jedes Backup aufbewart wird
  • keep_backup_days – (optional) – Default: 14 – Anzahl Tage in denen das letzte Backup des Tages aufbewahrt wird
  • keep_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 aufbewahrt
  • keep_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

Aufbau Datenstruktur

├── 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

backup.sh

#!/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"

restore.sh

#!/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 ' '

Raspi: Chromium ohne Pinch to Zoom starten

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'

Windows – SMTP Testing über die Powershell

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.

Mac: SMTP Testing vom Terminal aus

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.

Examples
Dokumentation

Mac: ip Befehl in Terminal

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`...

IP Befehl nutzen

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

Dokumentation

https://github.com/brona/iproute2mac
https://www.policyrouting.org/iproute2.doc.html
https://lartc.org/howto/