Autor: mRohner.ch

  • eibwm-server

    eibwm-server

    externe IP-Adresse bei Wechsel mailen


    Was tut er?

    Sendet bei Änderung die neue externe IP-Adresse per E-Mail.

    Wie tut er es?

    Ein Bash-Skript läuft alle 15 Minuten per Cronjob in einem Alpine-LXC-Container.
    Es prüft die externe IP über ifconfig.me, speichert sie in eine .txt Datei und vergleicht sie mit der letzten.
    Bei Änderung erfolgt der Versand per sendmail / ssmtp.

    ssmtp

    per „apk add ssmtp“ installieren
    config file anpassen unter „/etc/ssmtp/ssmtp.conf“

    root=asdf@asdf.ch
    mailhub=mail.provider.com:465
    AuthUser=asdf@asdf.ch
    AuthPass=asdf
    UseTLS=YES
    FromLineOverride=YES
    • root: E-Mail-Adresse, an die System-Mails (z.B. von root) weitergeleitet werden
    • mailhub: SMTP-Server-Adresse mit Port (465 = SMTPS, verschlüsselt)
    • AuthUser: Benutzername für die SMTP-Authentifizierung
    • AuthPass: Passwort für die SMTP-Authentifizierung
    • UseTLS: Aktiviert TLS/SSL-Verschlüsselung
    • FromLineOverride: Erlaubt das Überschreiben der Absenderadresse beim Senden

    Script

    #!/bin/bash
    
    # Pfad zur Datei, in der die letzte IP-Adresse gespeichert wird
    IP_FILE="/home/ipchange/last_ip.txt"
    # E-Mail-Empfänger
    EMAIL_RECIPIENT="asdf@asdf.ch"
    # Absender-E-Mail
    EMAIL_SENDER="asdf@asdf.ch"
    
    # Aktuelle externe IP-Adresse abfragen
    CURRENT_IP=$(curl -s ifconfig.me)
    
    # Prüfen, ob die Datei mit der letzten IP existiert
    if [ -f "$IP_FILE" ]; then
        LAST_IP=$(cat "$IP_FILE")
    else
        LAST_IP=""
    fi
    
    # Vergleich der IP-Adressen
    if [ "$CURRENT_IP" != "$LAST_IP" ]; then
        echo "IP-Adresse hat sich geändert:"
        echo "Alte IP: $LAST_IP"
        echo "Neue IP: $CURRENT_IP"
    
        # E-Mail-Inhalt erstellen (mit Headern)
        (
            echo "To: $EMAIL_RECIPIENT"
            echo "From: $EMAIL_SENDER"
            echo "Subject: Externe IP-Adresse hat sich geändert"
            echo ""
            echo "Die externe IP-Adresse hat sich geändert."
            echo ""
            echo "Alte IP: $LAST_IP"
            echo "Neue IP: $CURRENT_IP"
        ) | sendmail "$EMAIL_RECIPIENT"
    
        # Neue IP-Adresse speichern
        echo "$CURRENT_IP" > "$IP_FILE"
    else
        echo "IP-Adresse unverändert: $CURRENT_IP"
    fi

    Script ausführbar machen (chmod +x)

    Script in cronjob legen

    crontab -e

    */5 * * * * /pfad/tollesscript.sh

    (für alle 5min)

    0 * * * * /pfad/tollesscript.sh

    (jede stunde)

  • meine Probleme mit InfluxDB 2.7

    meine Probleme mit InfluxDB 2.7

    Ich nutze InfluxDB 2.7 zusammen mit OpenHAB, beide laufen in separaten Docker-Containern. OpenHAB schreibt fleissig Messwerte, aber manchmal möchte man nachträglich historische Daten hinzufügen, korrigieren oder löschen. In der „neuen tollen GUI“ von 2.7 gibt es jedoch keine direkte Möglichkeit, Messwerte zu löschen oder zu bearbeiten.

    Ein Downgrade auf InfluxDB1.* und Chronograf habe ich zwar versucht (dort hat das damals nämlich „einfach so“ funktioniert) aber klappte schlussendlich nicht wegen den Daten die ich nicht migrieren konnte sowie der Chronograf der einfach nicht starten wollte.

    Einen halben Tag damit versauert und entnervt aufgegeben mit dem Gedanken, den Scheiss nie mehr anzufassen.

    New Day, New Trys…

    Aber, am nächsten Tag: nächster Versuch gestartet. Diesmal Daten per CSV eintragen (das hab ich nämlich damals mit 1.8 und Chronograf einfach so gemacht). Jetzt mit einer neueren Version von Influx sollte das ja noch viel einfacher sein! Doch egal was ich tat – immer Fehlermeldungen. Immer mit dem Hinweis, man solle doch den Raw-Import versuchen. „Ja wiedenn?!?“ Kein Button, keine Infos, nichts was dir hilft. Ich dachte, die müssen die CLI meinen, also hab ich mich darauf ausgerichtet.
    Kurz gesagt: der Scheiss hat auch nicht funktioniert, immer Probleme mit dem Zeitstempel: Weder Epoch noch ISO noch RFC3339 wollten so wie ich. Am ehesten noch Epoch (Unix nanoseconds), aber auch da stimmten die Werte/Zeitstempel nie. Auch jede Zeile einzeln – keine Chance.

    Line Protocol habe ich natürlich ebenfalls getestet, exakt nach Doku mit Headern und Metadaten – Fehlanzeige. Auch abgespeckte Varianten mit minimalen Headern funktionierten nicht. Also weiter mit CSV probiert, in der Annahme, das sei doch „einfacher“. War es nicht.

    Nach einigen weiteren Stunden gab ich auf. Mein letzter Versuch war, in der GUI eine LineProtocol-Datei hochzuladen. Schlug natürlich fehl – trotz UTF-8 und LF (alle drei Varianten getestet) als Zeilenende.
    Doch dann, die Wendung die alles veränderte: „Enter manually“
    Ausprobiert:

    <measurement> value=123 <19stelligerZeitstempel>

    SIMPLE AS FUCKING THAT

    Enter. Akzeptiert. Korrekt drin. Bier aufgemacht.
    Rest der Daten genauso eingegeben. (Export aus LibreOffice Calc mit der Zellenformatierung *“value=“#* als CSV mit Leerzeichen-Trenner, in Notepad++ geöffnet, alles kopiert, im GUI eingefügt, Enter → alle Einträge drin.)

    Natürlich…

    habe ich hier nicht alles dokumentiert – ursprünglich wollte ich über den ganzen Frust noch ausführlicher ranten, inklusive meiner Abstecher in Python-Skripte, die einem den Import erleichtern würden, die API mit der das auch geht, und warum ich das alles dann doch nicht nutzte. Früher™ in InfluxDB 1.* war das in meiner Erinnerung einfacher.

    Ich frage mich schon, warum die Entwickler von Influx sich nicht ein Beispiel an eben diesen Scripten nehmen und das direkt in ihr Produkt einbauen… Dann wäre doch allen geholfen?

    Aber: Ich habe meinen Weg gefunden – und das wollte ich hier festhalten, vielleicht hilft es ja irgendwem der einfach nicht weiterkommt.


    TL;DR

    Um einige historische Daten in influxDB2.7 zu bekommen würde ich die GUI -> Load Data -> Lineprotocol -> Enter Manually verwenden.

    <measurement> value=123 <19stelligerZeitstempel>
    <measurement> value=124 <19stelligerZeitstempel>
    <measurement> value=125 <19stelligerZeitstempel>
    <measurement> value=126 <19stelligerZeitstempel>

    CLI Befehle

    Docker

    Datei in Docker-Container schieben:

    docker cp <lokale Datei> <containername>:/pfad/im/container/

    Datei aus Container auf Host

    docker cp <container>:/pfad/zur/datei ./  

    Docker Container interaktiv (Shell) ausführen (auch wenn euch die KI sagt, man solle hintendran anstatt /bin/bash -> influx schreiben, funktioniert nur in influx1.* richtig)

    docker exec -it <containername> /bin/bash

    Login in die InfluxDB GUI

    Falls Benutzer/Passwort unbekannt sind: in der docker-compose.yml oder den ENV-Variablen nachschauen.
    In der GUI anmelden → oben links auf den Namen klicken → About.

    • Org: manchmal funktioniert die ID, bei mir brauchte ich den Klartext-Namen.
    • Token: unter Load Data → API Tokens abrufbar. Bei Bedarf neuen Token anlegen und später wieder löschen.

    alte InfluxDB v1 shell

    influx v1 shell \
    --host http://localhost:8086 \
    --org <name der organisation> \
    --token <api token>

    Influx Bucket-Namen

    influx bucket list --org <name der organisation> --token <api token>

    CSV importieren

    influx write \
      --org <name der organisation> \
      --token <api token> \
      --bucket <bucket name> \
      --file xyz.csv \
      --format csv
      --log-level debug

    Anhängen falls gewünscht, dann nur Logoutput, hat mir aber nichts gebracht da unzureichende „Fehlerbeschreibung“.

    Komplettes measurement löschen

    influx delete \
    --bucket <bucket name> \
    --org <name der organisation> \
    --token <api token> \
    --start 1970-01-01T00:00:00Z \
    --stop 2100-01-01T00:00:00Z \
    --predicate '_measurement="<name des measurements>"'

    Für was ich die v1 Shell brauchte

    dort drin konnte ich schnell überprüfen ob die Werte reingeschrieben wurden. Zuerst mit „use <db>“ die Datenbank/Bucket auswählen, dann mit „SELECT * FROM _measurement“ anzeigen lassen (aktualisiert sich nicht von selbst, mit q raus und Pfeil nach oben, Enter = neue Daten), oder mit drop eben das ganze measurement löschen.

  • Linux – meine Erfahrungen

    Linux – meine Erfahrungen

    Als Server

    Linux läuft als Server bei mir tipptopp: stabil, zuverlässig und spannend. Besonders als Smarthome-Zentrale auf dem Raspberry Pi sind die Möglichkeiten nahezu unbegrenzt. Terminal-Kenntnisse sind dabei klar von Vorteil aber kein muss.

    Aktuell nutze ich OpenHAB mit eigenen Rules, angebundene Datenbanken (InfluxDB u.a.) und grafische Aufbereitung über Grafana.

    Als Medienplayer

    Auch als Medienplayer überzeugt Linux vollständig. Egal ob Debian, openSUSE, Mint oder andere Distributionen – alles läuft schnell, flüssig und ohne weitere Probleme. Zurzeit setze ich auf openSUSE Tumbleweed, möchte aber bald CachyOS ausprobieren. Ich bin gespannt auf die Erfahrungen.

    Als Arbeitsstation

    Noch ist Linux bei mir nicht die Haupt-Workstation. Wie viele habe auch ich die bekannte Ausrede: „Ich brauche Software X, die nur unter Windows oder macOS läuft.“

    Mein Plan: genau diese Software künftig in einer Windows-VM unter Linux nutzen – und damit den letzten Schritt machen.

    Als Windows-Ersatz auf Altgeräten

    Viele meiner Kunden möchten nicht gezwungen werden, ihren PC zu ersetzen, nur weil Microsoft sagt, Windows 11 läuft sonst nicht.

    Meine Empfehlung: Linux Mint (oder eine andere, gängige Distri) installieren. Läuft stabil und hatte bisher keine Probleme. Die Umstellung ist gering im Vergleich zu den Umstellungen, die wir erfahren durften – von Windows XP auf 8, auf 10 und von 10 auf 11, oder all die spannenden „Featureupdates“ die uns Microsoft in den Arsch bläst.

    Gerade wenn man ohnehin schon Firefox, Thunderbird und LibreOffice als Büro-Anwendungen verwendet, ist der Wechsel problemlos. Natürlich läuft auch Chrome unter Linux, also ist man überall gut versorgt.

    Gaming unter Linux

    Das Steam Deck hat gezeigt: Linux kann Gaming. Dank Proton laufen mittlerweile die meisten Windows-Spiele problemlos unter Linux. Steam macht die Installation kinderleicht – einfach installieren und spielen. Viele native Linux-Spiele laufen sogar besser als unter Windows.

    Einzig Anti-Cheat-Systeme machen noch Probleme, aber auch hier tut sich einiges. Für Gelegenheitsspieler ist Linux längst gaming-tauglich.

    Hardware-Unterstützung

    Früher war Hardware-Support unter Linux ein Glücksspiel. Heute? Die meiste Hardware läuft out-of-the-box. Drucker, WLAN, Grafikkarten – alles wird meist automatisch erkannt.

    Besonders praktisch: Alte Hardware bekommt unter Linux ein zweites Leben. Während Windows 11 moderne Hardware voraussetzt, läuft Linux flott auf 10 Jahre alten Rechnern.

    Kosten

    Linux ist kostenlos. Punkt. Keine Lizenzgebühren, keine Zwangs-Updates, keine geplante Obsoleszenz. Ein 500-Franken-Laptop mit Linux kann jahre- oder jahrzehntelang genutzt werden.

  • Windows 11 ohne Microsoft-Account

    Windows 11 ohne Microsoft-Account

    Shift+F10 -> WinJS.Application.restart(„ms-cxh://localonly“)
    Beitrag bei Deskmodder


    Shift+F10 -> CMD -> OOBE\BYPASSNRO
    -> Einrichtungsassistent/Computer startet neu

    Später: „Ich habe kein Internet“ auswählen (ist ein Text-„Button“)
    Die Tastenkombi für den Backslash wäre: Alt+92


    Ich bin mir noch nicht ganz sicher, wie die Zukunft betreffend Betriebssystem aussieht. Ich weiss auch nicht wie sehr sich Windows 11 noch verändern wird, aber der aktuelle Kurs von Microsoft ist für mich schon eher fragwürdig.


    Da hats McKay ganz treffend gesagt in Stargate Atlantis, Staffel 3 Episode 1…

  • Lenovo, ich bin enttäuscht

    Lenovo, ich bin enttäuscht

    Das Problem

    Vor rund drei Monaten habe ich einem Kunden den Lenovo M70t Gen 5 verkauft und das System eingerichtet. Alles lief zunächst problemlos.

    Doch seit etwa fünf Tagen gab es massive Startprobleme: Noch bevor das Lenovo-Logo erscheint, vergehen bis zu 40 Sekunden. Danach dauert es gefühlt ewig, bis der PC überhaupt einsatzbereit ist. Der Windows-Start selbst geht zwar schnell (5–10 Sekunden), aber das BIOS/UEFI scheint teilweise komplett zu hängen.

    Bootversuche über USB-Stick halfen nicht – das Problem liegt klar vor dem OS. Teilweise wurde keine Hardware erkannt, der Start brach mit „No OS found“ ab. Warum er trotz deaktiviertem Network-Stack im Netzwerk nach einem OS sucht ist ein weiteres Mysterium.

    Ein Firmware-Update wurde versucht, schlug aber fehl, da die Datei nach dem Neustart nicht mehr gefunden wurde. Kein Wunder wenn das Teil nicht das macht, was es will. Zurücksetzen der UEFI-Einstellungen brachte keine Verbesserung. Auch andere Anpassungen blieben wirkungslos.

    Ich bin enttäuscht – von einem Business-PC hätte ich mehr erwartet.

    Problemlösung

    Ich habe dann noch eine Funktion im UEFI gefunden: „Zurückstellen auf Werkseinstellung“ – nicht zu verwechseln mit „Defaults laden“, das war ein eigener Unterpunkt. Klang erstmal klug. Beim Auslösen kam eine Warnung: TPM und das „Absolute Persistence® Module“ werden nicht zurückgesetzt. Dachte mir, passt schon – TPM sollte eh erhalten bleiben, und von APM hatte ich bisher nie gehört, und wenns ja eh nicht verändert wird dann isses ja Wurscht.

    Also weiter. Der PC startete neu, und sofort merkte ich: Es geht schneller. Aber nicht etwa zum Lenovo-Logo – nein, er piepste zweimal und machte gleich nochmal einen Neustart. Das Ganze liess ich viermal zu und dachte: „dat mus so“.

    Aber dann kam die Ernüchterung: Ich hatte den PC erfolgreich kaputt-repariert.

    Die Seriennummer und der Machine-Type fehlten „plötzlich“ im BIOS. Und offenbar kann der PC ohne diese Infos nicht mehr starten.

    Wie wäre es Lenovo: DIESER FUCKING HINWEIS könnte man doch auch noch in die vorigen Warnung schreiben können?! Herrgottnochmal.

    Natürlich kann man die Seriennummer nicht einfach eingeben, nein… PC Schrott? Garantieeinsendung? Ich brach den Kundenbesuch ab, gönnte mir ein Bierli und nahm die Kiste mit zurück in die Werkstatt. Dort stand sie nun. Und ich verbrachte die Nacht damit, über mögliche Lösungswege nachzudenken.

    Problemlösung, die zweite

    Wie ich herausfand, muss man einen bootbaren Datenträger erstellen, darauf das Flash-Utility (für BIOS-Updates z. B.) bereithalten, und kann dann im richtigen Moment die passenden Befehle eingeben, um Seriennummer und Machine-Type zu aktualisieren. Hier ein Link zur Lenovo-Seite, die das beschreibt:
    Link

    Da ich sowieso ein Firmwareupdate machen wollte, nutzte ich gleich diese Gelegenheit. Firmware geladen, USB-Stick erstellt, TPM im BIOS deaktiviert (sonst läufts nicht), vom Stick gebootet und das Update gestartet.

    Zu meiner Erleichterung fragt das Tool direkt, ob man Seriennummer und Machine-Type anpassen will – hab ich natürlich gemacht. Die Seriennummer fand ich auf der Lieferantenrechnung (9-stellig, fast die gleiche die physisch auf dme Gerät aufgeklebt ist, aber mit „S“ davor). Als Machine-Type trug ich „ThinkCentre M70t Gen 5“ ein.

    Update lief durch, PC startete wieder normal. Danach ins BIOS, TPM wieder aktiviert, Bootreihenfolge und Einstellungen angepasst – und:

    Juhuu, PC läuft.

    Etliche Tests weiter, Stresstest CPU, RAM und GPU sowie HDD I/O und einige male Standby und wieder zurück, das Teil läuft immer noch wie es sollte. Bin gespannt ob sich das Problem nun erledigt hat, oder ob ich in ein paar Monaten wieder wegen so einem Mist ausrücken muss.

    TL;DR

    Lenovo M70t Gen 5, nach 3 Monaten plötzlich massive UEFI-Probleme. Boot dauerte ewig, teilweise kein OS erkannt. Firmware-Update schlug fehl, UEFI-Reset machte alles schlimmer – Seriennummer und Machine-Type gelöscht, PC startete gar nicht mehr. Lösung: BIOS-Tool auf Stick, Infos manuell nachgetragen, Firmware erfolgreich geflasht. Jetzt läuft er wieder.

    Lenovo, get your shit together.

    Auszug der Problemlösung wegen SN/MachineType der Lenovo Seite, falls die das mal löschen oder der Link nicht mehr aktuell ist:

    The system machine type and model (MTM), serial number, or system brand ID in the BIOS menu can be corrected through a command line program in the system BIOS flash utility. Refer to the instructions below.
    
    From the Lenovo support site, search for the applicable system BIOS Package for the system, and download the USB Drive/DOS flash program (.zip file).
    
    If using the USB Flash Package with the amidedos.exe tool:
            Create the DOS bootable memory key and unzip the contents of the USB BIOS Flash package to the key.
            Power on the system and make sure the device with the flash program is selected as a boot device.
            Use the below commands to flash the machine type and model, serial number, or system brand ID in BIOS:
            To flash machine type and model: amidedos.exe /sp “String”
            To flash serial number: amidedos.exe /ss “String”
            To flash system brand ID: amidedos.exe /sv “String”
        “String” is the target MTM, SN and System Brand ID.
        The following command line shows how to update the machine type and model number to 1234567:
            amidedos.exe /sp “1234567” Note: The MTM is typically ten characters in length.
        To update the System Brand ID for ThinkCentre M900, for example:
            amidedos.exe /sv "ThinkCentre M900"
        Reboot the system after the update is complete.
    
    
    
    If using the USB Flash Package with the amideefix64.efi tool:
            Format a USB key FAT32 and unzip the contents of the USB BIOS Flash package to the key.
            Boot to the key and press Esc immediately when the message Press ESC in 5 seconds to skip startup.nsh or any other key to continue appears onscreen.
            Once the Shell> prompt appears, run the commands below to flash the machine type and model, serial number, or system brand ID in BIOS.
            To flash machine type and model: amideefix64.efi /sp “String”
            To flash serial number: amideefix64.efi /ss “String”
            To flash system brand ID: amideefix64.efi /sv “String”
    
        “String” is the target MTM, SN and System Brand ID.
        The following command line shows how to update the machine type and model number to 1234567:
            amideefix64.efi /sp “1234567” Note: The MTM is typically ten characters in length.
    
        For System Brand ID for ThinkCentre M900:
            amideefix64.efi /sv "ThinkCentre M900"
    
        3. Reboot the system after the update is complete.
    
  • Überarbeitung Kundenhomepage

    Überarbeitung Kundenhomepage

    Mit Freude berichte ich über die erfolgreiche Modernisierung eines besonderen Webprojekts. Vor über sechs Jahren durfte ich für die Forensik Praxis Bern erstmals ihre bestehende Homepage überarbeiten. Nun, fast ein Jahrzehnt später, stand eine weitere umfassende Überarbeitung an, da die bisherige Version nicht mehr zeitgemäss war und sich einige Anforderungen geändert haben.

    Die grösste Herausforderung lag für mich in der Branchenthematik, die mir nicht vertraut war. Trotz dieser Hürde gelang es, alle bestehenden Texte zu optimieren und mit relevantem Content zu ergänzen.

    Besonders erfreulich war die schnelle und unkomplizierte Kommunikation, die einen effizienten Arbeitsprozess ermöglichte. Die Website präsentiert sich nun in einem zeitgemässen Design, ohne dabei ihre bewährte Grundstruktur zu verlieren.
    Es erfüllt mich mit Stolz, dass ich nach so vielen Jahren erneut das Vertrauen erhielt, die digitale Präsenz weiterzuentwickeln.

    Diese langfristige Kundenbeziehung bestätigt meine Arbeitsweise und motiviert mich für zukünftige Projekte.
    Herzlichen Dank für diese bereichernde Zusammenarbeit!

    Aus alt:

    Wird neu :)

  • Die Windows-Zwangs-Spirale

    Die Windows-Zwangs-Spirale

    Die zunehmende Bevormundung durch Windows: Ein kritischer Blick

    In der Welt der Betriebssysteme vollzieht sich ein besorgniserregender Wandel. Was einst mit Windows XP als benutzerfreundliches System begann und sich über Windows 7 fortsetzte, hat sich zu einem regelrechten Datenhunger-Monster entwickelt. Microsoft zwingt seine Nutzer von Update zu Update, von Windows 10 zu Windows 11, ohne Rücksicht auf individuelle Bedürfnisse oder Präferenzen.

    Die permanente Veränderung als Geschäftsmodell

    Das neue Windows 11 verändert sich ständig. Updates bringen nicht nur Sicherheitsverbesserungen, sondern auch unerwünschte Funktionen und Werbung. Die Benutzeroberfläche wird regelmässig umgestaltet, was besonders für langjährige Nutzer frustrierend ist. Bemerkenswert ist, dass Windows 10 ursprünglich als „letztes Windows“ beworben wurde – heute wissen wir, dass dem nicht so ist.

    Der Zwang zur Cloud

    Microsoft drängt seine Nutzer regelrecht in die Cloud. Beim ersten Start werden wir mit Aufforderungen zur Account-Erstellung und Cloud-Nutzung bombardiert. Die lokale Nutzung wird zunehmend erschwert, obwohl viele Nutzer ihre Daten lieber lokal speichern möchten. Auch nach der normalen Nutzung des Systems kommen immer wieder PopUps und Bildschirmfüllende Aufforderungen doch noch die Cloud zu nutzen.

    KI um jeden Preis

    Der neueste Trend ist die Integration von künstlicher Intelligenz. Selbst wenn man einen Laptop mit spezieller NPU (Neural Processing Unit) erwirbt, lässt sich diese nicht ohne Online-Zwang und Microsoft-Account nutzen. Die beworbene „lokale KI“ bleibt immer noch unerreichbar. Ohne Abo und Account gehts halt trotzdem nicht.

    Fazit

    Windows entwickelt sich immer mehr von einem Werkzeug zu einem Datensammler. Die Bedürfnisse der Nutzer nach Privatsphäre, Kontrolle und Offline-Nutzung werden systematisch ignoriert. Statt auf Änderungen von Microsoft zu hoffen, liegt es an jedem Einzelnen, bewusste Entscheidungen zu treffen. Es sollte jedem Nutzer wichtig sein, was mit seinen persönlichen Daten geschieht. Als Alternative bieten sich Open-Source-Betriebssysteme wie Linux an, die ohne Datensammelei und Zwangsanbindung auskommen. Die Macht liegt bei den Nutzern – sie können und sollten durch ihre Systemwahl ein Zeichen setzen.

    Die versteckten Kosten

    Unerwähnt bleiben oft die wahren Kosten. Nicht nur die Lizenzgebühren belasten Nutzer und Unternehmen, sondern auch die enormen Umweltauswirkungen durch das Training der KI-Modelle. Die grossen Sprachmodelle zu trainieren fressen eine riesige Menge an Strom/Energie, aber darüber macht sich offenbar niemand Gedanken.

    Noch gravierender sind die versteckten Produktivitätskosten: Studien zeigen (z.B. von Forrester Research), dass sich durch die stetige Änderungen auf OS-Ebene, gelernte und angewandte Arbeitsschritte unnötig verkomplizieren. Dies führt zu erheblichen Mehraufwendungen von Arbeitsstunden, sich neu einarbeiten, etc. nur um im Endeffekt endlich wieder auf dem Stand von vorher zu sein, ohne eine Effizienzsteigerung erfahren zu haben.

  • Warum Open Source statt proprietärer Software?

    Warum Open Source statt proprietärer Software?

    Digitale Freiheit oder goldener Käfig?

    Täglich nutzen wir Computer – für Arbeit, Freizeit und Kommunikation. Doch während wir uns an proprietäre Software wie Windows gewöhnt haben, zahlen wir dafür nicht nur mit Geld, sondern auch mit unserer digitalen Selbstbestimmung. Es gibt jedoch eine Alternative, die beides bietet: Kontrolle und Kosteneinsparung. Open Source Software zeigt, dass moderne Computerwelt auch anders funktioniert.

    Kosten:

    Proprietäre Systeme wie Windows & Office:

    • Lizenzkosten für Betriebssystem
    • mittlerweile Jährliche Gebühren für Office-Programme
    • erzwungene Updates und Upgrades

    Open Source:

    • Komplett kostenlos
    • Keine versteckten Gebühren
    • Kostenlose Updates und Programme

    Kontrolle über Ihr System:

    Windows:

    • Erzwungene Updates
    • Unerwünschte Änderungen der Oberfläche
    • Aufgedrängte Werbung und Browser
    • Automatische Datensammlung
    • Penetrantes Cloud-Nutzung-Angebot

    Linux & Open Source:

    • Updates nur nach Ihren Wünschen
    • Stabile, gleichbleibende Oberfläche
    • Keine Datensammlung
    • Volle Kontrolle über Ihr System

    Mit einer einmaligen professionellen Einrichtung nutzen Sie sofort alle wichtigen Programme – von Office bis Bildbearbeitung. Alles kostenlos und werbefrei.

    Persönlicher Umstieg in die digitale Freiheit

    Als selbstständiger IT-Berater unterstütze ich Sie gerne bei Ihrem Weg zu Open Source. Ich komme zu Ihnen nach Hause, richte alles individuell ein und zeige Ihnen in Ruhe die wichtigsten Funktionen. Ihre Daten und Dokumente übertrage ich dabei sicher auf das neue System. Kontaktieren Sie mich an – gemeinsam machen wir Ihren Computer wieder zu dem, was er sein sollte: Ihr persönliches Werkzeug.

  • Programm: YTDL

    Programm: YTDL

    Von Zeit zu Zeit entwickle ich massgeschneiderte Softwarelösungen, um den Alltag meiner Kunden zu erleichtern. Ein Kunde stand vor der Herausforderung, MP3-Dateien von YouTube herunterzuladen. Bisher hat er dies über verschiedene Drittanbieter-Websites getan. Da sich diese Seiten jedoch ständig ändern (oftmals, um mehr Werbung zu schalten), war dieser Prozess nicht mehr reibungslos.

    Um dieses Problem zu lösen, habe ich ein einfaches Skript entwickelt, das den Download-Prozess vereinfacht und meinen Kunden von der Notwendigkeit befreit, sich auf Drittanbieter-Websites zu verlassen.

    In der ersten Version des Programms versuchte ich, mit möglichst wenigen Bibliotheken auszukommen, um das Programm so schlank wie möglich zu halten. Der Benutzer musste den Browser öffnen, ein Video auf YouTube auswählen, die Adresse des Videos in mein Programm kopieren, auf Herunterladen klicken und den Speicherort der MP3-Datei auswählen. Nach dem Download war das Programm bereit für den nächsten Download.

    Mir wurde schnell klar, dass dies nicht zielführend ist. Der Prozess war zu kompliziert. Benutzer, die in der Lage waren, diese Schritte auszuführen, konnten wahrscheinlich auch ohne mein Programm MP3-Dateien von YouTube herunterladen.

    Daher habe ich das Skript weiterentwickelt, um den Prozess zu vereinfachen und benutzerfreundlicher zu gestalten. In der nächsten Iteration meines Programms konnte man es öffnen, ein Klick weiter öffnete direkt den Browser mit der youtube.com Domain und überwachte ab dann die Zwischenablage. Sobald erkannt wurde, dass es sich um eine korrekte Video-URL von Youtube handelt wurde diese weiter überprüft um zu sehen, ob sich eine mp3-Datei herunterladen lässt. Falls dies auch klappte wurde die Datei direkt heruntergeladen und im selben Verzeichnis, wo sich mein Programm befand, gespeichert. Firefox wurde automatisch geschlossen, nach erfolgreichem Download auch mein Programm um danach direkt ein Fenster zu öffnen, in welchem sich die mp3-Datei befand.


    Grösste Unterschiede?

    Erste Version (11-Schritte):

    • Programm öffnen
    • Firefox öffnen
    • Youtube öffnen
    • Video suchen
    • URL kopieren
    • Firefox schliessen
    • URL einfügen
    • herunterladen klicken
    • Speicherort auswählen
    • OK drücken
    • Programm schliessen
    • (suchen wo die mp3-Datei gelanden sein könnte…)

    Zweite Version (4-Schritte):

    • Programm öffnen
    • Youtube klicken
    • Video suchen
    • URL kopieren

    Kunde zufrieden, ich zufrieden und viel dazu gelernt, alles in allem wunderbar. Seither verstehe ich viel besser, warum Entwickler meistens am User vorbeiprogrammieren. Vieles, was aus meiner Sicht ja ganz klar und einfach ist sowie Möglichkeiten für Weiteres bieten würde, ist einfach nicht zielführend.
    Auf einem Windows-PC bei solch einem kleinen Programm auf Effizienz achten zu wollen ist zum Beispiel überhaupt nicht notwendig, da die Rechenpower der allermeisten Computer heutzutage gross genug ist auch „Murksprogramme“ wie meines auszuführen.
    Auch macht es keinen Sinn, weitere mp3’s herunterladen zu können, wenn er doch nur ein File will…


    Script

    import yt_dlp
    import os
    import tkinter as tk
    import tkinter.filedialog as fd
    import webbrowser
    import pyperclip
    import re
    import subprocess
    import psutil
    import time
    import sys
    
    # globale Variablen
    video_title = ""
    filename = ""
    
    # Funktion Youtube-öffnen
    def open_website():
        webbrowser.open_new("https://www.youtube.com/")
        yt_open_status.config(text="\u2713", fg="light grey")
        yt_linkcheck_status.config(text="\u2713", fg="orange")
        yt_open.config(text="")
        check_clipboard(counter_label)
        open_website_button.config(state="disabled")
    
    # Funktion zur Überwachung der Zwischenablage
    def check_clipboard(counter_label):
        current_clipboard = pyperclip.paste()
        # Überprüfen, ob die Zwischenablage eine YouTube-URL enthält
        if "youtube.com" in current_clipboard:
            # Zwischenablage löschen
            pyperclip.copy("")
            # Video-Info abrufen (ist video? ist kürzer als 20min?)
            youtube_url_regex = r"https?://(www\.)?youtube\.com/watch\?v=[\w-]+(&\S*)?"
            if re.match(youtube_url_regex, current_clipboard):
                with yt_dlp.YoutubeDL() as ydl:
                    try:
                        video_info = ydl.extract_info(current_clipboard, download=False)
                    except yt_dlp.utils.DownloadError:
                        # URL ist ungültig oder das Video ist privat/gelöscht
                        return
                    # Überprüfen, ob das Video kürzer als 20 Minuten ist
                    if "duration" in video_info and video_info["duration"] <= 1200: # = 20min x 60s
                        close_button.config(state="disabled")
                        global video_title
                        with yt_dlp.YoutubeDL() as ydl:
                            video_info = ydl.extract_info(current_clipboard, download=False)
                            try:
                                video_info = ydl.extract_info(current_clipboard, download=False)
                                video_title = video_info["title"]
                            except yt_dlp.utils.DownloadError:
                                return
                        # URL in das Benutzereingabefeld einfügen
                        url_entry2.delete(0, tk.END)
                        url_entry2.insert(0, current_clipboard)
                        counter_label.config(text="Bitte warten!", fg="green")
                        yt_linkcheck_status.config(text="\u2713", fg="green")
                        url_entry2.config(state="disabled")
                        close_firefox()
                        download_audio()
                        return
        # Vorherige Zwischenablage speichern
        previous_clipboard = current_clipboard
        # Zähler aktualisieren
        counter_label.config(text="Überwache Zwischenablage seit {} Sekunden.".format(counter_label.counter))
        counter_label.counter += 1
        # Zwischenablage jede Sekunde prüfen.
        root.after(1000, check_clipboard, counter_label)
    
    
    
    # Funktion zum Herunterladen der Audio-Datei
    def download_audio():
        global video_title
        global filename
        filename = fd.asksaveasfilename(filetypes=[("MP3 Dateien", "*.mp3")], initialfile=video_title)
        url = url_entry2.get()
        ydl_opts = {
            'format': 'bestaudio/best',
            'postprocessors': [{
                'key': 'FFmpegExtractAudio',
                'preferredcodec': 'mp3',
                'preferredquality': '320'
            }],
            'outtmpl': filename,
        }
        with yt_dlp.YoutubeDL(ydl_opts) as ydl:
            ydl.download([url])
        # Löschen der .webm-Datei
        for file in os.listdir():
            if file.endswith(".webm"):
                os.remove(file)
        close_button.config(text="Fertig")
    
        if not filename.endswith(".mp3"):
            filename += ".mp3"
        exit_program()
    
    # Funktion: firefox.exe beenden
    def close_firefox():
        while True:
            firefox_procs = [proc.info['pid'] for proc in psutil.process_iter(['pid', 'name']) if proc.info['name'] == 'firefox.exe']
            if not firefox_procs:
                break
            for pid in firefox_procs:
                subprocess.run(['taskkill', '/T', '/F', '/PID', str(pid)])
            time.sleep(1)
    
    # Funktion eigenes Programm beenden
    def exit_program():
        global filename
        if filename == "":
            root.after(1000, root.quit())
        else: 
            subprocess.Popen(r'explorer /select,"{0}"'.format(filename.replace("/", "\\")))
            root.quit()
    
    
    
    # __ ___________ ___________ ___________ ___________ ___________ ___________ ___________ ___________ __________
    
    # GUI-Hauptfenster-Fenster erstellen
    root = tk.Tk()
    root.title("YouTubeDL")
    # root.geometry("400x350+1300+10")
    root.resizable(False, False)
    
    
    # Reihe 1, Positionsnummer
    label_1 = tk.Label(root, text="1.")
    label_1.grid(row=1, column=0)
    
    # Haken
    yt_open_status = tk.Label(root, text="\u2713", fg="orange", font=("Arial", 16))
    yt_open_status.grid(row=1, column=1)
    
    # Button: Youtube öffnen
    open_website_button = tk.Button(root, text="Youtube öffnen", command=open_website)
    open_website_button.grid(row=1, column=2, pady=20)
    
    # Beschreibung
    yt_open = tk.Label(root, text="Lied suchen & Adresse kopieren")
    yt_open.grid(row=1, column=3)
    
    # Reihe 2, Positionsnummer
    url_label = tk.Label(root, text="2:")
    url_label.grid(row=2, column=0)
    
    # Haken
    yt_linkcheck_status = tk.Label(root, text="\u2717", font=("Arial", 16))
    yt_linkcheck_status.grid(row=2, column=1)
    
    
    # Eingabefeld Youtube-URL
    url_entry2 = tk.Entry(root)
    url_entry2.grid(row=2, column=2, columnspan=2, sticky="ew")
    
    # Label für die Anzeige der Zwischenablage-Überwachung
    counter_label = tk.Label(root, text="")
    counter_label.grid(row=3, column=0, columnspan=4, sticky="ew")
    counter_label.counter = 0
    
    # Schließen-Button hinzufügen
    close_button = tk.Button(root, text="Schließen", command=exit_program)
    close_button.grid(row=6, column=0, columnspan=4, sticky="ew", pady=30)
    
    
    
    # GUI ausführen
    root.mainloop()

    verwendete Bibliotheken

    yt_dlp

    Dies ist eine Bibliothek, die zum Herunterladen von Videos und Audiodateien von YouTube und anderen Video-Hosting-Websites verwendet wird. Sie bietet eine Vielzahl von Funktionen, einschliesslich der Möglichkeit, Metadaten zu extrahieren und Videos in verschiedene Formate zu konvertieren.

    os

    Diese Bibliothek bietet Funktionen für die Interaktion mit dem Betriebssystem. Sie wird in einer Vielzahl von Fällen verwendet, einschliesslich der Arbeit mit Dateien und Verzeichnissen.

    tkinter

    Dies ist eine Standardbibliothek für die Erstellung von grafischen Benutzeroberflächen (GUIs) in Python. Sie bietet eine Vielzahl von Widgets, einschliesslich Schaltflächen, Menüs und Textfelder.

    tkinter.filedialog

    Dies ist ein Modul innerhalb von tkinter, das Dialoge zur Dateiauswahl bereitstellt. Es ermöglicht Benutzern, Dateien und Verzeichnisse über ein GUI auszuwählen.

    webbrowser

    Diese Bibliothek bietet eine Schnittstelle zur Anzeige von Webdokumenten. Sie kann verwendet werden, um einen Webbrowser zu öffnen und eine bestimmte URL anzuzeigen.

    pyperclip

    Pyperclip ist eine plattformübergreifende Python-Bibliothek zum Kopieren und Einfügen von Text in die Zwischenablage.

    re

    Die re-Bibliothek in Python wird verwendet, um reguläre Ausdrücke zu verarbeiten. Mit regulären Ausdrücken können Sie Text auf komplexe Weise durchsuchen und manipulieren.

    subprocess

    Diese Bibliothek ermöglicht es Ihnen, neue Prozesse zu starten, mit ihren Eingabe-/Ausgabefehlern zu interagieren und ihre Rückgabecodes zu erhalten.

    psutil

    Diese Bibliothek wird verwendet, um Zugriff auf Systeminformationen wie CPU-Auslastung, Speicher, Festplatten, Netzwerk, etc. zu erhalten.

    time

    Die time-Bibliothek bietet Funktionen zur Arbeit mit Zeit, einschliesslich Funktionen zur Manipulation von Zeit und zur Umwandlung zwischen verschiedenen Zeitformaten.

    sys

    Diese Bibliothek bietet Zugriff auf einige Variablen, die vom Python-Interpreter verwendet werden, und auf Funktionen, die stark mit diesem interagieren. Sie wird oft für die Interaktion mit dem Python-Laufzeitsystem verwendet.


    Das ganze habe ich dann per pyinstaller kompiliert und mit der ffmpeg.exe beim Kunden eingerichtet. Damit das Progrämmli nicht lange gesucht werden musste noch eine Verknüpfung auf dem Desktop und Tadaa!

    so sahs aus.

    Weiterentwicklung?

    Leider nein. Ich denke für den Anfang habe ich hier genug rumgebastelt. Das Script funktioniert mittlerweile auch nicht mehr so wie gewünscht, ich nehme an dass es mit der yt_dlp-Bibliothek zusammenhängt. Ich mein, es hat noch nicht mal einen richtigen Namen ;)

    RIP Werner
    Danke für deine jahrelange Freundschaft.

  • Wlan – einfach erklärt

    Wlan – einfach erklärt

    WLAN-Router

    Erstellt das WLAN-Netzwerk und sendet das Signal direkt an die Geräte, wird meist vom Provider (Internet Service Provider wie Swisscom, Breitband, Quickline, etc.) bereitgestellt.


    WLAN-Extender

    Erweitert das WLAN-Signal indem ein neues generiert wird. SSID und Passwort können das selbe sein, sodass es den Anschein hat, es wäre nur ein WLAN. Das Endgerät wird sich trotzdem nur mit einem Verbinden. Gut dort, wo das bestehende WLAN gar nicht erst hinkommt und mit einem Kabel am best. Router/Switch verbunden werden kann. Ansonsten ist diese Variante nicht empfehlenswert, mag funktionieren, muss nicht.

    Extender können auch AP (Access Point) oder Repeater genannt werden.


    WLAN-Mesh-System

    Besteht aus mehreren Komponenten die „intelligent“ miteinander kommunizieren und das Endgerät im WLAN von einer Station zur nächsten führen können.

    Nachteil: man ist meist Herstellergebunden, da die es nicht gebacken kriegen Herstellerunabhängig miteinander eine intelligente Verbindung zu erstellen. In den neueren WiFi-Standards wären die Spezifikation dafür vorgegeben, nur will das keiner so implementieren. Sogar bei der freien Alternativen Firmware „OpenWRT“ ist es nicht einfach möglich einzurichten.

    Beim WLAN-Mesh werden die Komponenten meist Satelliten genannt. Aber auch hier könnte man von AP oder Extender sprechen, machen ja genau das…


    Spannende Frage

    Aber aber… Die spannende Frage ist und bleibt unbeantwortet: Was soll ich denn nun tun/kaufen?

    Wer „überall“ im Haus, Garten und in der Werkstatt gutes WLAN haben will und man sich auch des öfteren vom Büro in die Werkstatt bewegt, dabei auf dem Handy etwas streamt und partout keinen Ruckler will, dann braucht man ein gescheites Mesh-System. Ubiquiti nein, TP-Link (Deco-Reihe) ja. Andere Hersteller kenne ich noch nicht aus eigener Erfahrung. Fritz/AVM ist in meinen Augen zu teuer, daher auch nein, ausser man verwendet noch andere Funktionen der Fritze.

    Bei mir ist eine Variante mit Fritz!Box am laufen. Zuerst nur das Modem, dann ein AP per Kabel, da das nicht gereicht hat ist jetzt dazwischen noch ein zusätzlicher Satellit per WLAN eingebunden, das deckt so ziemlich all meine Bedürfnisse ab. Allerdings, muss ich dazu sagen, musste ich erst das 5Ghz WLAN ausschalten, damit das Roaming gut genug funktionierte.

    Dieser Artikel bei digitec.ch finde ich sehr gut geschrieben und erklärt das Thema WLAN genauer.