Installing Windows 11 on older hardware (no TPM2) and installing Ubuntu WSL2 with ZSH in it

Create Windows 11 media with Microsoft’s media creation kit.
Image the resulting ISO-file to an USB stick with e.g. Rufus.

Create bypass.reg.
Windows Registry Editor Version 5.00


Copy bypass.reg to the stick.

Install Windows 11
In Setup hit shift-f10 to enter a cmd prompt
There startup notepad.exe
Use the open dialog from Notepad to navigate to the stick.
Change file types to all and right-click on the bypass.reg.
Choose merge.

Now continue to install Windows 11

After installation login with wrong credentials intentionally.
So you will get the option to use a local user only.

Where you can choose now within the OOBE setup.

Check if your Windows edition is the right one.
Maybe change in Windows settings.
Note: You might need a corresponding product key and valid license to do so.

Download and install Brave.
Download and install OpenVPN.

After finishing the setup, open up an Explorer and set options to:
– show extensions
– show hidden files and system files
– startup with This Computer
– do now show recent files
– clear recent file

Download W11ClassicMenu1.1 and start it up.
When SmartScreen is complaining – click on more information – then choose run anyway.
Then reactivate „classic context menu“.

Install chocolatey.
Open up an admin powershell and paste
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString(‚‘))

Install some software.
choco install 7zip -y
choco install notepadplusplus -y
choco install adobereader -y
choco install kitty -y
choco install -y
choco install owncloud-client -y
choco install screentogif -y
choco install networkmonitor -y
choco install wireshark -y
choco install keepass -y
choco install treesizefree -y
choco install sysinternals -y

Check for latest updates and drivers

Setup Bitlocker (when changed edition to minimum Professional)
Might be you have to enable a local Group Policy via gpedit.msc
Computer -> Administrative Cemplate -> Windows Components -> Bitlocker -> OS Drives -> Require additional authentication on startup



Bring up WSL2

wsl –install
Note: This seems pretty easy under Windows 11. Saw also installation of GUI support with this installation command. Will try if it can display X application.
After wsl –install finished please reboot the system.

The system will come up with the Ubuntu installation dialog after login automaticalls.
It sets also the WSL version to 2:
wsl –list -v
* Ubuntu Running 2

Enable root login then in Ubuntu
sudo passwd

Set default user to root in Windows Powershell
ubuntu config –default-user root

Update Ubuntu
apt update -y && apt dist-upgrade -y && apt autoremove –purge

Working X11 apps
Start Ubuntu
apt install x11-apps

Enable shift+insert paste in Windows Terminal
Start up wt
Choose Settings
{ „command“: „paste“, „keys“: „shift+insert“ }
right behind the „ctrl+v“ line
Save and restart the Windows Terminal

Choose Ubuntu as default profile for Windows Terminal
Start up wt
Choose Settings
Change the Default GUID to the desired profile’s GUID below
Save and restart the Windows Terminal

apt install zsh*
sh -c „$(curl -fsSL“
cd .oh-my-zsh/plugins
git clone
git clone
git clone

vi /root/.zshrc
plugins (git zsh-autosuggestions zsh-syntax-highlighting zsh-vim-mode)

Change default template in .zshrc

Add vars in zsh-vim-mode plugin for changing the cursor according to vi or edit mode

Kubuntu 21.10 on Asus Transformer T100TA with Touchscreen, Sound, Wi-Fi working

Main information based on:

Added/removed some information based on my experience.

Grab 32bit efi boot loader from:

Download Kubuntu 21.10 ISO-file from Ubuntu homepage.

Use for example Rufus to write the ISO-file to an USB stick.

Copy over the bootia32.efi to the stick /EFI/boot.

Start from the stick.
Press ESC few times at boot time for one time boot menu.

Boot up the Kubuntu stick and choose try Kubuntu.

Open a terminal and start installation with sudo ubiquity -b.
Note: -b: So ubiquity installer won’t write a boot loader automatically.


Leave the 100mb efi partition.

Delete the windows partition.

Create a new ext4 partition and mount it to /

Install the system

After installation choose continue testing.

Fresh installation root partition is now mounted into /target

Mount also the 100mb efi partition to /target/boot/efi

Mount some local dirs to /target:
for dir in /dev /dev/pts /proc /sys /run; do mount –bind „$dir“ /target/“$dir“; done

Change root into the target root directory.
chroot /target /bin/bash

Install boot loader:
apt update
apt install grub-efi-ia32
grub-install –efi-directory=/boot/efi

Set cstate parameter correctly.
Note: Otherwise system will halt randomly after approx. 30min runtime.
vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT=“intel_idle.max_cstate=1 quiet splash“

Exit chroot.

Unmount /target/boot/efi


Install onboard:
sudo apt isntall onboard

Install evdev-rce:
Note: Change order of cc commands – move flags to the end of line. After make you just have to start the compiled binary for tap-and-hold-for-right-click capability.
Note: I’m rarely using this, because in practice I do not need the right click function for the touchscreen very often. So when needed I just run the binary, use the right-click and then exit the binary again. Letting it run in background can bring up problems with other touchscreen operations e.g. Onboard on screen keyboard.

Replace Pulseaudio with Pipewire:
Note: The default audio server Pulseaudio will let the sound crash after few minutes. Only a high frequent sinus tone is then emitted – will also bring problems with video playback then.
Note: When you want to stick with Pulseaudio you can recover from the crash with the pulseaudio -k command. I changed to Pipewire, as I could not find any permanent solution for Pulseaudio. A good starting point for further research could be:
sudo apt install pipewire*
sudo apt install libspa-0.2-bluetooth
Note: This lib is needed for Bluetooth audio working properly.

Disable powersaving function for Wi-Fi adapter:
cd /etc/NetworkManager/conf.d
mv default-wifi-powersave-on.conf default-wifi-powersave-off.conf
vi /etc/NetworkManager/conf.d/default-wifi-powersave-off.conf
wifi.powersave = 2


when you experience issues with not remembering tap to click on your touchpad on reattach, add to /usr/share/X11/
Note: Remember to restart libinput by at minimum relogon.
Section „InputClass“
Identifier „Asus TouchPad“
MatchDriver „libinput“
MatchIsTouchpad „on“
Option „Tapping“ „true“
Option „NaturalScrolling“ „True“

Google location history in Elastisearch

Thanks to Kevin Dwyer for the script, which demonstrates the usage of the Elasticsearch bulk API in a simple way.

See his Github repository tracky – !

Navigate to Google Maps Timeline with a desktop browser.

Bottom right you find a gear to access your settings.

Choose download a copy of all my data.

You will be faced to a menu, where you can download data from all the Google services.

There untick everything but the location history and confirm the download.

Have patience as it can take several hours until the export hast been created.

You will be notified via mail – download the archive then.

Extract the archive to a desktop pc and you will find one big json-file containig you whole location history (beside subfolders with daily details). It is named like „Location-History.json“ in German exactly „Standortverlauf.json“.

Beside the json-files you will also find a good explanation of the data you got. See the html-file, that is contained in the archive.

Copy this „Locationhistory.json“ respectively „Standortverlauf.json“ file over to your Elasticsearch box.

Navigate to
At least copy over the script and adjust it to your individual settings (Elasticsearch instance, index names, index mapping – mostly self-explanatory). See the code also below the pictures.

Then run the with your json-filename „Locationhistory.json“ respectively „Standortverlauf.json“ as parameter.

Attention: Importing a huge amount of geo point can take a while. For about millions of entries you’ll have to wait some minutes or so.

After that you can start to visualize.

Some sample data from my last ten years:

Our trip to the sea with slightly decreasing altitude ; )

import ujson as json
from argparse import ArgumentParser
from datetime import datetime

from elasticsearch import Elasticsearch
import elasticsearch.helpers as helpers
elastic_url = 'localhost:9200'
es = Elasticsearch(elastic_url)

index_name = 'denise-manual'
mapping = {
    "properties": {
        'accuracy': {
            "type": "integer"
        "activity": {
            "type": "nested",
            "dynamic": False,
            "properties": {
                "activity": {
                    "type": "nested",
                    "dynamic": False,
                    "properties": {
                        "confidence": {
                            "type": "integer"
                        "type": {
                            "type": "keyword"
                "timestampMs": {
                    "type": "keyword"
        "point": {
            "type": "geo_point"
        'latitude': {
            "type": "double"
        'latitudeE7': {
            "type": "double"
        'longitude': {
            "type": "double"
        'longitudeE7': {
            "type": "double"
        'timestamp': {
            "type": "date"
        'timestampMs': {
            "type": "keyword"

arg_parser = ArgumentParser()
arg_parser.add_argument("input", help="Input File (JSON)")
args = arg_parser.parse_args()
locations = json.load(open(args.input))['locations']

es.indices.delete(index=index_name, ignore=404)
es.indices.put_mapping(index=index_name, body=mapping)

actions = []
for i, location in enumerate(locations):
    location["timestamp"] = datetime.fromtimestamp(int(location["timestampMs"]) / 1000)
    location["latitude"] = location['latitudeE7'] / 10000000
    location["longitude"] = location['longitudeE7'] / 10000000
    location["point"] = [location["longitude"], location["latitude"]]
        "_index": index_name,
        "_id": i,
        "_source": location

helpers.bulk(es, actions)

Samsung Health Data in Elasticsearch

Open Samsung Health App on the mobile phone.

Go to settings.

Scroll down and tap on download all personal data.

Confirm with your Samsung account password.

On the internal storage you find the data in the subfolder „Download“.

There you find the data splitted into CSV-files.

Bring the files up to a computer and there choose your relevant files (example: heartrate or sleepdata) to open them with Excel.
Crop the first line.

Navigate to your Kibana instance in browser.

There you can import the CSV-file. Choose a unique index name.

Then you can start visualize:

Check: 3PAR Storages Physical Disk State

Geht mit SSH. Keine zusätzlichen Pakete notwendig

Kopfzeilen des Checks für Quellreferenz

# 3PAR Nagios check script v0.2
# Last update 2010/05/14
# Last update 2011/03/03
Kommando deklarieren
# ARG1: URL to get
define command {
command_name check_3par_pd
command_line /opt/omd/versions/1.20/lib/nagios/plugins/check_3par $HOSTADDRESS$ $ARG1$ check_pd

Parametrieren mit legacy-checks
legacy_checks += [
(( „check_3par_pd!3paradm“, „3PAR Physical Devices“, True), [ „“ ] ),
(( „check_3par_node!3paradm“, „3PAR Node“, True), [ „“ ] ),
(( „check_3par_ld!3paradm“, „3PAR Logical Devices“, True), [ „“ ] ),
(( „check_3par_vv!3paradm“, „3PAR Version“, True), [ „“ ] ),
(( „check_3par_cap_fc!3paradm“, „3PAR FC CAP“, True), [ „“ ] ),
(( „check_3par_cap_nl!3paradm“, „3PAR NL CAP“, True), [ „“ ] ),
(( „check_3par_port_fc!3paradm“, „3PAR FC Port“, True), [ „“ ] ),

Klingelton für SMS Kontakte beim Samsung Galaxy S10 einstellen

Die Samsuns Nachrichten (SMS) App öffen.

Dort einen Chat auswählen.

Über die 3 Punkte das Menü öffnen und einen anderen Benachrichtigungston auswählen.
Dort wird vielleicht noch nicht der gewünschte Klingelton angezeigt. Trotzdem muss hier einfach einer gewählt werden – z.B. Chaos (Standardbenachrichtigungston dar nicht ausgewählt werden).

Danach kann man unter den generellen Benachrichtigungseinstellungen von Android diese vorher gewählten Ton auch auf einen ganz eigenen Ton ändern.

Android Einstellungen öffnen.

Dann Benachrichtigungen öffnen.

Dann runterscrollen bis zur den Einstellungen der Nachrichten App (ggf. muss auf weitere anzeigen o.ä. geklickt werden).

Dort tauch nun der Kontakt als als eigene Kategorie auf und dort ist auch der Ton aus der vorherigen Einstellungen zu sehen (z.B. Chaos).

Da kann man nun endlich den Ton auf einen eigenen Stellen und dazu auch die normale Klingentonauswahl-App von Samsung nutzen.

Wird auch damit der gewünschte Ton nicht sichtbar, empfehle ich einen Blick auf die App „Zedge“ (ACHTUNG: leider sehr werbelastig).

Capture webpages to image

iptables -A INPUT -p tcp –destination-port 60000 -j DROP
masscan –rate 10 -p80 –banners -oL result.list –source-port 60000

Optional: masscan -iL target.list –rate 10 -p80 –banners -oL result.list –source-port 60000

cat result.list | cut -d \ -f 4 | sort | uniq | grep -v „^#“> list.ip.raw

python3 -m pip install selenium

import sys
from selenium import webdriver

url = sys.argv[1]

print(„capturing {}“.format(url))

chromeOptions = webdriver.ChromeOptions()

DRIVER = „chromedriver“
driver = webdriver.Chrome(DRIVER, options=chromeOptions)
screenshot = driver.save_screenshot(„pic{}.png“.format(url))

print(„finished {}“.format(url))

cat wrapper-capture-website.bash
for elem in $(cat list.ip); do
echo „starting capture „$elem
python3 $elem

bash wrapper-capture-website.bash

PRTG Skript for Monitoring Ntfs Errors in Windows Eventlog

$hostname = „hostname.domainname.tld“
$threshold = 0
$days = 2
$username = „DOMAIN\administrator“

$password = „p4ssw0rd“
$secpasswd = ConvertTo-SecureString $password -AsPlainText -Force

$credentials= New-Object System.Management.Automation.PSCredential ($username, $secpasswd)

$ErrorCount = Get-WinEvent -ComputerName $hostname -ProviderName „Microsoft-Windows-Ntfs“ -Credential $credentials | Where-Object LevelDisplayName -eq
„Fehler“ | Where-Object TimeCreated -gt $((Get-Date) – (New-TimeSpan -Day $days)) | Measure-Object | Select-Object -expand Count

if ($ErrorCount -eq $threshold) {
  Write-Host „${ErrorCount}:$Errorcount event(s) for Ntfs errors on $hostname in the last $days days – OK“
else {
  Write-Host „${ErrorCount}:$Errorcount event(s) for Ntfs errors on $hostname in the last $days days – CRIT“