[Linux] tar-archive: So schließen Sie Dateien und Verzeichnisse aus

Wie immer im Leben, wenn man etwas herausgefunden hat, sei es durch ausprobieren, stackoverflow oder ChatGPT, egal wie man zu dem Wissen gekommen ist, es kostet Zeit, meistens Nerven, man muss sich irgendwo registrieren, es ist alles in Englisch… ein Krampf. Aus diesem Grund, schreibe ich immer wieder einen Blog-Eintrag, wenn ich etwas neues ausprobiert habe, gescheitert bin, es anders lösen habe können oder einfach nur die Reihenfolge der Argumente falsch angegeben habe…

So in diesem Fall, bin ich über tar gestolpert, –exclude war mein Nemesis, ich habe versucht, mehrere Dateiendungen auf einmal auszuschließen, jedesmal hat er mir trotzdem die Dateien hineingepackt, annoying!

tar -czvf usr_backup.bz2 /usr –exclude=*.zip,*.sql

ganz falsch

tar -czvf usr_backup.bz2 /usr –exclude={*.zip,*.sql}

fast richtig, leider auch falsch, warum? Weil das Verzeichnis ganz zum Schluss kommt

Richtig ist:

tar -czvf usr_backup.bz2 --exclude={*.zip,*.sql} /usr

Überall wird der Befehl mit tar -czvf usr_backup.bz2 --exclude={'*.zip','*.sql'} /usr angegeben, aber man sieht, es geht auch ohne! Vermutlich, wenn man ein Space im Dateinamen hätte, sollte man den Dateinamen unter ‚ ‚ stellen, so wie in Windows mit “ „.

Also wie immer „100 Jahre Garantie“, nee war ein Scherz, wie immer, alle Angaben ohne Gewähr, Anwendung auf eigene Gefahr und Verantwortung, ich übernehme keinerlei Haftung für Ausfälle, Datenverlust oder andere finanzielle Schäden.

Externe und auch Interne Links werden nicht überprüft und ich übernehme keine Haftung für deren Inhalt.

Happy coding!

[WDM & AS-IDE] Android Debug über WLAN

Ich schreibe wieder einmal über das, was ich gerade herausgefunden habe:

Wie kann man über Android über WLAN debuggen? Also mit WinDev for Mobile oder Android Studio mit Java oder Kotlin?

Ich zeige euch anhand meines Google Pixel 8 wie ich das angestellt habe:

Wofür ist das USB Debugging (WLAN aka WiFi Debugging)?

Das USB Debugging (WLAN Debugging) wird in der Software Entwicklung verwendet um in der laufenden Android APP Entwicklung Programme auf Android ohne Installation laufen lassen zu können und im Quellcode Schritt für Schritt (Step by Step) die Ergebnisse der Ausführung ansehen zu können.

Auch sind manche Backups darauf angewiesen, das das USB Debugging eingeschaltet ist.

Normalerweise ist das USB Debugging kein Problem, aber wenn Sie das Handy z.B. am Flughafen per Kabel aufladen, kann der USB Debug Modus ein Sicherheitsproblem darstellen, daher wird empfohlen, den USB Debug (WLAN Debug) Modus abzuschalten, wenn man ausser Haus geht!

Anleitung: den Entwicklermodus aktivieren

zuerst müssen wir den Entwicklermodus aktivieren, einmal die Einstellungen öffnen und ganz nach unten und auf „über das Telefon“ drücken:

Dann drücken wir 5x auf „Build-Nummer“

Es wird Ihnen angezeigt, wie oft Sie noch Build-Nummer drücken müssen um ein Entwickler zu werden:

Nun geben wir das Passwort ein (Sorry für die Bildqualität, die PIN Eingabe lässt keinen Screenshot zu, daher habe ich ein Foto gemacht und nachbearbeitet, daher ist das Bild so schlecht!)

Dann sind wir Entwickler:

Ähnlich funktioniert es auf Samsung und Co. dieser Link https://www.hardreset.info/de/devices/samsung/samsung-galaxy-s23-fe/entwickler-optionen/ hilft weiter.

Anleitung: das USB Debugging aktivieren und WLAN Debugging einrichten!

Gehen wir zurück und drücken „System“

Dann drücken wir auf „{} Entwickleroptionen“

Dann gehen wir etwas weiter runter und aktivieren USB-Debugging:

Bestätigen Sie, dass Sie Debugging zulassen möchten:

Anleitung: WLAN Debugging aktivieren

Dann aktivieren wir darunter Debugging über WLAN

Dann lassen wir zu, dass das Handy über das WLAN erreichbar ist

Nun noch die Verbindung mit dem WLAN zulassen:

Dann drücken wir links daneben auf Debugging über WLAN direkt (nicht auf die Checkbox !!)

Dann wählen wir Gerät über einen Kopplungscode koppeln

Dann erscheint folgender Dialog:

Mit diesen Zugangsdaten können wir das Telefon verbinden, öffnen wir dazu ein CMD  Fenster (WIN + R dann cmd eingeben und CTRL + SHIFT und <enter> bzw. im Menü suchen und als Administrator ausführen) oder eine Powershell (als Administrator ausführen!) und tippen:

Also der Befehl lautet adb pair 10.0.0.15:35941 und <Enter> (die IP 10.0.0.15 und der Port 35941 sind von meinem Handy, bitte selbst schauen auf das Handy die IP-Adresse und Port sind auf Ihrem Handy!!)

Falls die adb.exe nicht gefunden wird unter WinDev for Mobile ist adb.exe unter C:\WINDEV Mobile 28\Personal\Android\AndroidSDK\platform-tools zu finden und unter Android Studio unter C:\Program Files (x86)\Android\android-sdk\platform-tools! Am Besten gleich in den Path aufnehmen! Anleitung unter https://www.thewindowsclub.com/adb-is-not-recognized-in-windows-11

Danach den Code eingeben: 894684 (Code vom eigenen Handy verwenden!!) wie am Android Handy nun steht, das Fenster schließt automatisch.

Nun haben wir den Debugging über WLAN vor uns da steht die IP + Port für die ADB Verbindung:

Dann verbinden wir uns mit ADB damit:

Dann geben wir adb connect 10.0.0.15:34135 ein und drücken <Enter> Die Daten stehen am Handy unter Gerätename (siehe ein Bild darüber!!)

So wir sind verbunden, wir können das Handy nun in Android Studio und WinDev for Mobile über WLAN finden!

Also wie immer „100 Jahre Garantie“, nee war ein Scherz, wie immer, alle Angaben ohne Gewähr, Anwendung auf eigene Gefahr und Verantwortung, ich übernehme keinerlei Haftung für Ausfälle, Datenverlust oder andere finanzielle Schäden.

Externe und auch Interne Links werden nicht überprüft und ich übernehme keine Haftung für deren Inhalt.

Happy coding!

[PHP8+] Mit einer Funktion eine GUID erzeugen

In PHP suche ich immer wieder die Funktion create_guid, jetzt veröffentliche ich mal eine universelle create_guid Funktion die ich bestens getestet habe:

use Ramsey\Uuid\Uuid;

function create_guid() {
    if (function_exists('com_create_guid')) {
       //Only on Windows 7+ OS
       //Credits to "Thoughtful Tapir" on Grepper
       return trim(com_create_guid(), '{}');
    } elseif (class_exists('Ramsey\Uuid\Uuid')) {
        //Linux/Windows/MacOS: composer require ramsey/uuid
        //Credits on ChatGPT 3.5 (2022)
        //ramsey/uuid is a library from Ben Ramsey MIT license
        $uuid4 = Uuid::uuid4();
        $guid = strtolower($uuid4->toString());
        return $guid;
    } else {
        //OS is not Windows and ramsey/uuid is not installed
        //Try alternate (working) solution
        //Credits to "Pleasant Platypus" on Grepper/php.net as comment
        $guid = '';
        $namespace = rand(11111, 99999);
        $uid = uniqid('', true);
        $data = $namespace;
        $data .= $_SERVER['REQUEST_TIME'];
        $data .= $_SERVER['HTTP_USER_AGENT'];
        $data .= $_SERVER['REMOTE_ADDR'];
        $data .= $_SERVER['REMOTE_PORT'];
        $hash = strtolower(hash('ripemd128', $uid . $guid . md5($data)));
        $guid = $hash;
        return $guid;
    }
}

Diese Funktion gibt einen 32 Byte String GUID zurück, alles in Kleinbuchstaben. Dieser Code ist Größtenteils entweder aus php.net entnommen oder ChatGPT hat mir einige Tipps gegeben, die ich sorgfältig getestet habe.

PS: irgendwann werde ich auch bei ChatGPT einen Code erwischen, den ich geschrieben habe, aber so ist das Leben.
PS2: Ich war schon immer der Meinung Open-Source ist gut, nur leben muss man davon können…

Wer die 36 Bytes Version lieber möchte und Großbuchstaben, dann:

statt:
return trim(com_create_guid(), '{}');
ersetzen mit:
return strtoupper(trim(com_create_guid(), '{}'));

statt:
$guid = strtolower($uuid4->toString());
ersetzen mit:
$guid = strtoupper($uuid4->toString('-'));

statt:
$hash = strtolower(hash('ripemd128', $uid . $guid . md5($data)));
ersetzen mit:
$hash = strtoupper(hash('ripemd128', $uid . $guid . md5($data)));

statt:
        $guid = $hash;
ersetzen mit:
        $guid = substr($hash,  0,  8) . '-' .
                substr($hash,  8,  4) . '-' .
                substr($hash, 12,  4) . '-' .
                substr($hash, 16,  4) . '-' .
                substr($hash, 20, 12);

Getestet unter Ubuntu 22.04 und Windows 10/11

Wie immer, alle Angaben ohne Gewähr, Anwendung auf eigene Gefahr und Verantwortung, ich übernehme keinerlei Haftung für Ausfälle, Datenverlust oder andere finanzielle Schäden.

Ich nehme gerne Ratschläge und Hinweise entgegen, hier als Kommentar oder per Email an office[add]predl.cc!

Jegliche Programmierhilfe (Whatsapp, AnyDesk Fernwartung, Email usw.) nur gegen Einwurf kleiner Münzen, ich hoffe jeder versteht das?

Happy coding!

[DOS + PS] ls emulate in cmd or PowerShell

Dear community,

I made a small adaption for Windows users, so I always type „ls“ in windows cmd and guess what? „command not found“… annoying…

so I made a small „ls.bat“ for replacement, looks alike the ls -la command and works better than ls in PowerShell. So If you use PowerShell alot instead of cmd, please rename „ls.bat“ to „ls-la.bat“ or „ls2.bat“??

https://www.predl.cc/downloads/ls.zip

https://github.com/Harveyhase68/ls

Have a nice day and always remember „100 years warranty“ ^^ just kidding, As always, all information provided without guarantee, use at your own risk and responsibility, I assume no liability for failures, loss of data or other financial damages. External and internal links are not checked and I assume no liability for their content. This program can be used freely, can also be offered for download, exchanged or modified and is MIT license. Please keep the copyright, thank you! A coffee you can donate under:

Click here:


thank you so much!

Liebe Community,

Ich habe ein kleine batch datei für Windows geschrieben, weil ich unter Linux immer ls oder ls -la schreibe, unter Windows kommt immer, ratet mal: „Der Befehl „ls“ ist entweder falsch geschrieben oder konnte nicht gefunden werden.“, nervig.

Also habe ich eine kleine Adaption von „ls -la“ geschrieben, funktioniert besser als in PowerShell eigenes ls. Also wenn Ihr öfter in PowerShell statt cmd arbeitet, dann bietet sich an, „ls.bat“ in „ls-la.bat“ oder „ls2.bat“ umzubenennen.

https://www.predl.cc/downloads/ls.zip

https://github.com/Harveyhase68/ls

Also wie immer „100 Jahre Garantie“, nee war ein Scherz, wie immer, alle Angaben ohne Gewähr, Anwendung auf eigene Gefahr und Verantwortung, ich übernehme keinerlei Haftung für Ausfälle, Datenverlust oder andere finanzielle Schäden. Externe und auch Interne Links werden nicht überprüft und ich übernehme keine Haftung für deren Inhalt. Dieses Programm kann frei verwendet werden, auch zum Download angeboten werden, getauscht oder verändert werden, bitte den Copyright Vermerk drinnen lassen und ist MIT Lizenz. Einen Kaffee kann man unter

Hier draufdücken:


spenden, vielen lieben Dank!

[WinSCP] Passwörter aus WinSCP.ini auslesen

Ja ich gebe es zu, ich habe mich ausgesperrt, aus meinem neuen Debian 12 Server bei Hetzner, aber in WinSCP und MobaXTerm habe ich ja noch das Passwort gespeichert…

Also was tun? Erst einmal Googlen, siehe da, es gibt ein Programm namens winscppwd.exe, dieses Dienstprogramm kann man herunterladen, dann die WinSCP.ini auslesen und sich die Passwörter anzeigen.

Ja mancher wird sagen, sehr unsicher, in WinSCP das Passwort zu speichern, aber das ganze Leben ist unsicher… Wenn jemand Zugriff auf meinen Computer hat, ist es sowieso zu spät, da hilft kein Linux mit Fail2Ban, kein Honeypot, keine Firewall, keine Blackbox usw. dann ist es vorbei. Der Hacker „sitzt“ vor meinem PC, ich hab nicht aufgepasst, entweder Home-Invasion oder per Fernwartung, dann ist es eh schon egal, dass er noch dazu das Passwort von meinem Server weiß, ehrlich, dann hab ich gaaanz andere Sorgen.

PS: Sooo aufgrund der Kommentare bin jetzt etwas schlauer, ich hab mir ein Master Passwort in WinSCP angelegt, ist lästig, das jedesmal einzugeben, aber ja, Ihr habt ja recht, sicher ist sicher.

Zurück zu WinSCP und das Auslesen des Passwortes: mal kurz aus Github bzw. Bitbucket das Programm herunterladen, aber oje, kein Download mehr, das Projekt wurde gelöscht. Aber ich hatte das Programm noch im Download Ordner, daher könnt Ihr von mir das Programm (mit Virustotal getestet) herunterladen:
https://www.predl.cc/downloads/winscppwd.zip

File Hash der .exe: SHA-1 ff5fbb3e02dc307f60b2e2c15277be9b45a8bcac verglichen mit HashPad kann man selbst herunterladen und mit Microsoft Visual Studio kompilieren, ist recht einfach ohne Probleme, Download der Release Binary (64-Bit) auch hier möglich: https://www.predl.cc/downloads/HashPad.zip braucht das .NET 6.0 Desktop Runtime Download bei Microsoft

Hash des Zip Files: a92c9fb11490c44c2d8047dc5c62ad143aea4515

Getestet unter Windows 10 und Windows 11

Wie immer, alle Angaben ohne Gewähr, Anwendung auf eigene Gefahr und Verantwortung, ich übernehme keinerlei Haftung für Ausfälle, Datenverlust oder andere finanzielle Schäden. Externe und auch Interne Links werden nicht überprüft und ich übernehme keine Haftung für deren Inhalt.

Happy coding!

[Rust] mit Diesel und PostgreSql 15

Sooo, nun habe ich einen weiteren Step in meiner „Rust“ Erfahrung gemacht, ich möchte meine Reise wieder mit euch teilen:

Wie kann ich mit Rust und Diesel auf eine PostgreSQL Datenbank zugreifen? Das erkläre ich euch nachstehend:

Wie wir Diesel installieren, habe ich im Beitrag https://www.predl.cc/rust-diesel-fuer…ows-installieren/ erklärt, bitte da starten, falls Diesel noch nicht am PC ist. Die Rust Installation habe ich kurz am Anfang des Beitrages angerissen, jedoch denke ich von dem Punkt kommt jeder weiter…

Zuerst einmal erstellen wir unser erstes Projekt. Wir öffnen ein cmd Fenster und schreiben

cargo new diesel_example

Dann cd ins Verzeichnis:

cd diesel_example

So nun ist das Projekt erstellt, wir finden nun im Verzeichnis folgende Dateien (nur die Wichtigsten!):

diesel_example/
|-- Cargo.toml # Unsere Konfigurationsdatei fürs Projekt
|-- src/
|   |-- main.rs  # Das Projekt main.rs, hier startet alles

So nun können wir erstmal die Cargo.toml öffnen:

[package]
name = "diesel_example"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

Das ändern wir auf:

[package]
name = "diesel_example"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
diesel = { version = "*", features = ["postgres"] }
dotenv = "*"
diesel_codegen = "*"  # Füge diesel_codegen hinzu

Damit haben wir bereits Diesel als Abhängigkeit hinzugefügt, codegen erlaubt uns, die Schema.rs automatisch aus der Datenbank zu erstellen, sehr nützlich.
dann erstellen wir eine .env Datei und schreiben hinein:

DATABASE_URL=postgres://postgres:{password}@localhost/diesel_example

{password} bitte mit Ihrem Passwort ersetzen.
Dann müssen wir noch die main.rs aus dem src Verzeichnis ändern:

extern crate diesel;
extern crate dotenv;

use diesel::prelude::*;
use dotenv::dotenv;
use std::env;

table! {
    users (user_id) {
        user_id -> Int8,
        user_name -> Varchar,
        user_password -> Varchar,
    }
}

//use schema::users;cls

// Diesel-Verbindung initialisieren
fn establish_connection() -> PgConnection {
    dotenv().ok();

    let database_url = env::var("DATABASE_URL").expect("DATABASE_URL not found in .env");
    PgConnection::establish(&database_url)
        .expect(&format!("Error connecting to {}", database_url))
}

fn main() {
    let mut connection = establish_connection();

    // Hier verwenden wir Diesel-Abfragen, um alle Benutzer aus der Tabelle "users" abzurufen
    let all_users = users::table.load::<(i64, String, String)>(&mut connection) // mutable Verweis
        .expect("Error loading users");

    for user in all_users {
        let (user_id, user_name, user_password) = user;
        println!("User ID: {}, User Name: {}, User Password: {}", user_id, user_name, user_password);
    }

}

Damit sind wir fast fertig, nur noch in pgAdmin eine datenbank anlegen, wir benennen diese einfach „diesel_example“…

CREATE TABLE IF NOT EXISTS public.users
(
    user_id bigint NOT NULL DEFAULT nextval('users_user_id_seq'::regclass),
    user_name character varying(35) COLLATE pg_catalog."default" NOT NULL,
    user_password character varying(35) COLLATE pg_catalog."default" NOT NULL,
    CONSTRAINT users_pkey PRIMARY KEY (user_id)
)

TABLESPACE pg_default;

ALTER TABLE IF EXISTS public.users
    OWNER to postgres;

Wir können gleich ein paar Datensätze in die PostgreSQL Datenbank speichern:

insert into users (user_name, user_password) values('alex','password');
insert into users (user_name, user_password) values('admin','password');
insert into users (user_name, user_password) values('john','password');

Dann sehen wir auch eine Ausgabe vom Rust Projekt.

diesel setup

Damit wird die migration erstellt (also eine Datenbank Versions Kontrolle)

diesel migration run

Das erstellt die schema.rs im /src Verzeichnis! Das ist die Struktur der Tabellen, die brauchen wir später

cargo run

Damit startet man dann das Projekt, zuerst wird laaaange kompiliert und dann ausgeführt, später dauert der Vorgang nicht mehr so lange, da verwendet Cargo die bereits kompilierten Komponenten und das geht viel schneller.
Die Ausgabe:

   Compiling proc-macro2 v1.0.67
      Compiling unicode-ident v1.0.12
      Compiling unicode-xid v0.0.4
      Compiling synom v0.11.3
      Compiling regex v0.2.11
      Compiling quote v0.3.15
      Compiling quote v1.0.33
      Compiling syn v2.0.33
      Compiling lazy_static v1.4.0
      Compiling serde v1.0.188
      Compiling memchr v2.6.3
      Compiling ucd-util v0.1.10
      Compiling vcpkg v0.2.15
      Compiling pq-sys v0.4.8
      Compiling regex-syntax v0.5.6
      Compiling serde_derive v1.0.188
      Compiling aho-corasick v0.6.10
      Compiling thread_local v0.3.6
      Compiling syn v0.11.11
      Compiling byteorder v1.4.3
      Compiling itoa v1.0.9
      Compiling utf8-ranges v1.0.5
      Compiling serde_json v1.0.107
      Compiling derive-error-chain v0.10.1
      Compiling diesel_table_macro_syntax v0.1.0
      Compiling error-chain v0.10.0
      Compiling ryu v1.0.15
      Compiling dotenv v0.10.1
      Compiling diesel_derives v2.1.1
      Compiling diesel v0.16.0
      Compiling bitflags v2.4.0
      Compiling diesel_codegen v0.16.1
      Compiling dotenv v0.15.0
      Compiling diesel v2.1.1
      Compiling diesel_example v0.1.0 (C:\rust_projects\diesel_example)
    Finished dev [unoptimized + debuginfo] target(s) in 2m 02s
     Running `target\debug\diesel_example.exe`
User ID: 1, User Name: alex, User Password: password
User ID: 2, User Name: admin, User Password: password
User ID: 3, User Name: john, User Password: password

Dauert etwa 3-4 Minuten, nachdem aber das Projekt erstellt wurde, geht es wesentlich schneller:

    Finished dev [unoptimized + debuginfo] target(s) in 0.16s
     Running `target\debug\diesel_example.exe`
User ID: 1, User Name: alex, User Password: password
User ID: 2, User Name: admin, User Password: password
User ID: 3, User Name: john, User Password: password

Dann nur mehr Sekunden…

cargo build

Das Projekt wird nur kompiliert, keine Ausführung.

cargo clean

Falls sich die Importe stark ändern, es sich ein Fehler eingeschlichen hat usw. kann man wieder von vorne anfangen.

Getestet unter Windows 10 (wird unter Windows 11 sicher auch gehen!), müsste aber auch so in Linux funktionieren…

Wie immer, alle Angaben ohne Gewähr, Anwendung auf eigene Gefahr und Verantwortung, ich übernehme keinerlei Haftung für Ausfälle, Datenverlust oder andere finanzielle Schäden.

Happy coding!

[Rust] Diesel für Rust auf Windows installieren

Ich schreibe diese Anleitung, da die Installation von Diesel auf Windows 10 (11) nicht so einfach war…

Für die Installation unter Windows habe ich den Installer für Rust verwendet:

https://www.rust-lang.org/tools/install

Damit wird Rust und Cargo installiert, nicht Diesel.

Unter Linux (CentOS und Debian):

apt install curl -y bzw. yum install curl -y
curl --proto '=https' --tlsv1.3 https://sh.rustup.rs -sSf | sh

Weitere Anleitungen für die Installation von Rust:

https://wiki.crowncloud.net/?How_to_Install_Rust_on_Debian_12

Oder einfach Googlen.

Zuerst einmal, Cargo ist für Rust zuständig Module zu installieren.

Diesel ist ein Modul für Rust, Diesel erleichtert die Datenbankzugriffe.

Diesel unterstützt PostgreSQL, MySQL und SQLite, darin liegt aber der „Hund“ begraben… wir sollten alle 3 Datenbanken auf unserem PC installiert haben. Aber das ist nur die 1/2 Miete…

Wir brauchen die libpq.lib, die libmysql.lib und die sqlite3.lib. Besser gesagt, wir müssen für Cargo die Pfade über die Windows Variablen setzen.

Anmerkung: Ich verwende unter Windows Everything, das kann man von https://www.voidtools.com/ herunterladen. Ehrlich, ich wüsste nicht, was ich ohne dieses super Tool machen sollte, die Windows Dateisuche ist ja sowas von am A****… ist elendig langsam, findet nichts und noch dazu 100% CPU, wenn irgendwas WSearch nicht passt…

PostgreSQL:

C:\Program Files\PostgreSQL\15\lib\libpq.lib

Diesen Pfad müssen wir Cargo als CMD Variable übermitteln: (Pfad selbst anpassen bitte, falls Sie PostgreSQL 16+ oder älter haben!

SET PQ_LIB_DIR=C:\Program Files\PostgreSQL\15\lib

Dann noch SQL-Lite, das ist nicht sooo einfach, dafür muss man das Windows SDK installieren, sonst muss man selbst die sqlite3.lib kompilieren… Alternativ kann man von https://github.com/buggins/ddbc das ganze Paket downloaden und entpacken, im Verzeichnis ist bei mir C:\Users\Alex\Downloads\ddbc-master\ddbc-master\libs\win64 die sqlite3.lib enthalten… aber ich hab die sqlite3.lib vom Windows-SDK genommen

SET SQLITECLIENT_LIB_DIR=C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22000.0\um\x64

Dann ist noch MySQL dran:

Cargo sucht die mysqlclient, welche natürlich nicht gefunden wurden, dafür muss man von https://cdn.mysql.com/archives/mysql-connector-c/mysql-connector-c-6.1.11-winx64.zip herunterladen und entpacken, da war die libmysql.lib enthalten:

SET MYSQLCLIENT_LIB_DIR=C:\Users\Alex\Downloads\mysql-connector-c-6.1.11-winx64\mysql-connector-c-6.1.11-winx64\lib\vs14

Die Pfade unter Anführungszeichen „“ zu setzen, wie es in Windows mit Pfaden mit Leerzeichen so üblich ist, war hier nicht notwendig!

Danach konnte ich erfolgreich Diesel mit Cargo installieren:

cargo install diesel_cli

Nachdem ich auf einer „nackten“ Windows 10 VM das Ganze noch einmal ausprobiert habe, konnte ich trotzdem ich die sqlite3.lib in der 64-bit Version habe und die SET SQLITECLIENT_LIB_DIR korrekt auf das Verzeichnis gesetzt habe, konnte ich immer noch nicht Diesel installieren, ein wenig suchen später:

cargo install diesel_cli --no-default-features --features "sqlite-bundled mysql postgres" --force

Man nimmt die in Cargo eingebaute SQ-Lite, liefert immer die aktuelle bzw. die gesuchte sqlite3.lib…

Um mehr Output und Fehlersuche für Cargo zu ermöglichen, kann man das Log aktivieren, das macht man mit:

SET CARGO_LOG=trace cargo fetch

Getestet unter Windows 10 (wird unter Windows 11 sicher auch gehen!)

Wie immer, alle Angaben ohne Gewähr, Anwendung auf eigene Gefahr und Verantwortung, ich übernehme keinerlei Haftung für Ausfälle, Datenverlust oder andere finanzielle Schäden.

Happy coding!

[Debian 12] VirtualBox 7 unter Windows die .vdi bzw. .vmdk Festplatte vergrößern und Debian 12 Partition(en) erweitern

Zuerst einmal, ich verwende Windows 10 mit VirtualBox 7.0, darauf läuft Debian 12 mit Gnome.

Ich habe unterschätzt, wieviel Speicherplatz ein Desktop BS benötigt, daher habe ich mit 100GB angefangen, aber unterschätzt, wieviel Arbeit es ist, das nachher zu erweitern…

Also zuerst schauen wir mal, wo VirtualBox liegt, einfach die VBoxManage.exe suchen, am Einfachsten habe ich gefunden, Everything zu verwenden (https://www.voidtools.com/) einfach als Dienst installieren, es durchsucht die Festplatte(n) und man kann alles schnell suchen, wer das Programm nicht mag oder sich kein neues Programm installieren möchte, dann kann man auch über die Verknüpfung sehen, wo das Programm installiert ist.

Rechte Maustaste auf Virtualbox und dann Eigenschaften:

Drücken Sie auf „Dateipfad öffnen“ und voila, wir haben das richtige Verzeichnis!

Also bei mir ist VirtualBox auf C:\Program Files\Oracle\VirtualBox installiert, das brauchen wir später, wenn bei Ihnen VirtualBox wo anders installiert ist, dann müssen Sie den Pfad bitte anpassen.

Wir öffnen auf Windows ein CMD Fenster, ich öffne den immer als Administrator, dann brauche ich nicht ständig umwechseln, falls ich mal mehr Rechte brauche, also WIN+R dann CMD eingeben und Shift + Ctrl + ENTER und bestätigen den Administrator-Zugriff.

Wechseln wir ins Verzeichnis, wo Debian installiert ist, das ist einfach, aus VirtualBox  aus, rechte Maustaste auf die Virtuelle Maschine drücken und drücken Sie auf „Im Explorer zeigen“, dann öffnet sich der richtige Pfad.

Jetzt wissen wir wo Debian installiert ist, das ist bei mir auf C:\Users\Alex\VirtualBox VMs\Linux\Debian 12.1 Gnome

So nun können wir mal sehen, ob VirtualBox etwas über die .vdi Festplatte etwas zu sagen hat: (die Festplatte ist die mit dem .vdi oder .,vmdk am Ende)

cd "C:\Users\Alex\VirtualBox VMs\Linux\Debian 12.1 Gnome"
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" showhdinfo "Debian 12.1 Gnome.vdi"

Merke: In Windows, immer dann wann ein Leerzeichen im Pfad ist, muss man die Befehle, Pfade usw. unter “ “ Anführungszeichen setzen!

Dann kommt folgendes:

UUID: c41778e5-3a2d-441f-81d3-5b8bac7fbe3f
Parent UUID: base
State: locked write
Type: normal (base)
Location: C:\Users\Alex\VirtualBox VMs\Linux\Debian 12.1 Gnome\Debian 12.1 Gnome.vdi
Storage format: VDI
Format variant: dynamic default
Capacity: 102400 MBytes
Size on disk: 19249 MBytes
Encryption: disabled
Property: AllocationBlockSize=1048576
In use by VMs: Debian 12.1 Gnome (UUID: 0068487f-6f4f-46b6-8192-6c83c7360c8a)

Somit wissen wir, das VBOXManage die Festplatte erkannt hat und die Daten ausliest.

Wir können nun die Größe, von meinen 100gb auf 200gb erweitern:

"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifyhd "Debian 12.1 Gnome.vdi" --resize 204800

Natürlich muss die Virtuelle Maschine vorher abgedreht sein!

sonst kommt:

VBOX_E_INVALID_OBJECT_STATE (0x80bb0007)

Das bedeutet, die Virtuelle Maschine läuft, das darf natürlich nicht sein!

0%…10%…20%…30%…40%…50%…60%…70%…80%…90%…100%

Bedeuet alles ok!

So nun können wir die Virtuelle Maschine wieder starten.

Sobald wir wieder eingeloggt sind, können wir die zu kleinen Partitionen identifizieren und vergrößern:

Öffnen Sie ein Terminal (Shell oder Bash) und wir listen mal die Festplatten (mounts) auf:

sudo lsblk

alex@debian12gnome-local:~$ sudo lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 200.1G 0 disk
├─sda1 8:1 0 487M 0 part /boot
├─sda2 8:2 0 1K 0 part
└─sda5 8:5 0 99.5G 0 part
├─vg_system-root 254:0 0 6G 0 lvm /
├─vg_system-usr 254:1 0 20.9G 0 lvm /usr
├─vg_system-var 254:2 0 5.4G 0 lvm /var
├─vg_system-swap_1 254:3 0 3.8G 0 lvm [SWAP]
├─vg_system-skole+tjener+home0 254:4 0 25.4G 0 lvm /srv/nfs4/home0
│ /skole/tjener/home0
├─vg_system-var+spool+squid 254:5 0 14.3G 0 lvm /var/spool/squid
└─vg_system-skole+backup 254:6 0 16.9G 0 lvm /skole/backup
sr0 11:0 1 51M 0 rom
alex@debian12gnome-local:~$

Wir sehen aktuell nicht viel, da wir ja nicht wissen wieviel Platz auf der jeweiligen Partition (mount) vorhanden ist:

sudo df -h

alex@debian12gnome-local:~$ sudo df -h
Filesystem Size Used Avail Use% Mounted on
udev 3.0G 0 3.0G 0% /dev
tmpfs 601M 2.9M 598M 1% /run
/dev/mapper/vg_system-root 5.9G 838M 4.8G 15% /
/dev/mapper/vg_system-usr 16G 15G 452M 95% /usr
tmpfs 3.0G 12K 3.0G 1% /dev/shm
tmpfs 5.0M 8.0K 5.0M 1% /run/lock
/dev/sda1 455M 135M 296M 32% /boot
/dev/mapper/vg_system-skole+tjener+home0 25G 124K 24G 1% /srv/nfs4/home0
/dev/mapper/vg_system-skole+backup 17G 24K 16G 1% /skole/backup
/dev/mapper/vg_system-var 5.2G 1.1G 3.9G 23% /var
/dev/mapper/vg_system-var+spool+squid 14G 17M 14G 1% /var/spool/squid
tmpfs 601M 168K 601M 1% /run/user/1000

Und da sehen wir unseren Schuldigen es ist /dev/mapper/vg_system-usr, diese Partition müssen wir erweitern

sudo lvextend -L +5G /dev/vg_system/usr

alex@debian12gnome-local:~$ sudo lvextend -L +5G /dev/vg_system/usr
Size of logical volume vg_system/usr changed from 16.85 GiB (5338 extents) to 20.85 GiB (6618 extents).
Logical volume vg_system/usr successfully resized.

Damit erweitern wir die Partition aber können den dazugewonnenen Platz aber noch nicht verwenden, dazu müssen wir noch das Dateisystem erweitern:

sudo resize2fs /dev/vg_system/usr

alex@debian12gnome-local:~$ sudo resize2fs /dev/vg_system/usr
resize2fs 1.47.0 (5-Feb-2023)
Filesystem at /dev/vg_system/usr is mounted on /usr; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 4
The filesystem on /dev/vg_system/usr is now 6776832 (4k) blocks long.

Damit haben wir erfolgreich die Festplatte erweitert und können nun Dateien, Programme usw. speichern. Wenn uns der Platz ausgeht, dann erweitern wir nach dieser Anleitung die Festplatte.

Getestet unter Debian 12 und Windows 10 (Windows 11 sollte ohne Probleme gehen!)

Wie immer, alle Angaben ohne Gewähr, Anwendung auf eigene Gefahr und Verantwortung, ich übernehme keinerlei Haftung für Ausfälle, Datenverlust oder andere finanzielle Schäden.

Happy coding!

[Scoriet] Quellcode Generator Vorstellung

Scoriet, ein Template gestützter Programmgenerator.

Scoriet (https://www.scoriet.com) ist in Programm dass ich vor längerer Zeit geschrieben habe.

Scoriet ist ein Template gestützter Programmgenerator, nicht wie PHPRunner oder vergleichbare Programme, kann Scoriet ganze App’s vollständig aufgrund von Vorlagen (Templates) generieren. Jede Änderung an den Templates werden registriert und die Vorlagen von Scoriet neu Kompiliert.

Zuerst mit einem einfachen PHP Klassen Generator ausgestattet, entwickelte ich das Konzept weiter und brachte einen PHP API Generator dazu, später kam sogar eine komplette Webseite mit Login usw. dazu. CRUD also create, read, update und delete. Für jede dieser Begriffe erstellt Scoriet eine Seite.

  • Eine Startseite mit Menü
  • Eine Login-Seite
  • Eine Tabelle der Daten
  • Ein Formular für die Dateneingabe
  • Eine Seite um die Daten zu drucken

Ich mache Scoriet open-source 2017. Das Projekt ist auf GitHub: https://github.com/Harveyhase68/scoriet

Zumindest konnte Scoriet bisher nur PHP generieren, jetzt habe ich Scoriet weiter verbessert und ein neues Template ist dazu gekommen:

Scoriet kann nun auch eine Python Flask REST API generieren.

Die Verbindung zur Datenbank erfolgt über die db_config.py und die eigentliche API ist die api.py. Im Verzeichnis „/tables“ stehen alle Datentabellen der Datenbank (MySQL oder PostgreSQL). api.py liest am Programmstart alle *.py aus und erstellt selbständig eine Route für jede Tabelle. In der .env Datei stehen die Zugangsdaten für die Datenbank. Die functions.py ist für die Ausgabe als JSON zuständig.

Wenn eine users.py im /tables stehen würde, würde Scoriet folgende Routen anlegen:

  • /users – GET liest alle users aus, sortiert sie nach der z.B. user_no
  • /users/query – POST, erwartet eine JSON datei, wobei query, fields oder orderby gesetzt werden können, damit wird dann das SELECT statement aufgebaut
  • /users – POST, hier werden die Daten in die Datenbank per SQL INSERT in die Datenbank geschrieben, erwartet werden Datenfelder im JSON Format.
  • /users – PUT, hier werden die Daten geändert, das UPDATE SQL Statement nimmt nur die Daten per JSON und auch nur die Felder die geändert werden sollen. Alle anderen Felder werden nicht geändert. Die ID oder die Nr. wird per URL übergeben.
  • /users – DELETE, übergeben Sie die die ID bzw. den eindeutigen Datensatz-Identifier per URL, der Datensatz wird gelöscht.

Was noch fehlt, wäre die API Sicherheit, zumindest die BASIC Authentication hätte ich schon mal gemacht, das müsste ich noch einbauen. Eine weitere Sicherheitsstufe wäre natürlich die Session-ID und ein Token. Aktuell muss ich mich leider wieder um etwas anderes kümmen, ev. kann ja ein anderer Programmierer das für mich machen?? *lieb kuck*

Getestet unter Windows 10 (11 sollte ohne Probleme gehen), die Python REST API ab Python 3.7 auf CentOS 6 und Debian 11.

Wie immer, alle Angaben ohne Gewähr, Anwendung auf eigene Gefahr und Verantwortung, ich übernehme keinerlei Haftung für Ausfälle, Datenverlust oder andere finanzielle Schäden.

Happy coding!

[Python3] PostgreSQL verwenden

Um mit einer PostgreSQL Datenbank eine Verbindung aufzubauen, Daten auszulesen, dafür kann man folgendes Skript verwenden:

Zuerst einmal installieren wir psycopg:

sudo python -m pip install psycopg
Oder suso pip install psycopg

Dann bereiten wir die Datenbank „sample“ vor:

DROP TABLE IF EXISTS `sample`;
CREATE TABLE IF NOT EXISTS `sample` (
  `id` int NOT NULL AUTO_INCREMENT,
  `record_no` int NOT NULL,
  `description` varchar(50) NOT NULL,
  `start_date` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `record_no_key` (`record_no`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
COMMIT;

Dann das Script:

sudo nano psycopg_test.py
import psycopg
from psycopg import connect as pg_connect, rows as pg_rows

connection = None

try:
    connection = pg_connect(
            user="postgres",
            password="admin",
            host="127.0.0.1",
            port="5432",
            dbname="test_py",
            row_factory=pg_rows.namedtuple_row
    )
    cursor = connection.cursor()
except (Exception, psycopg.Error) as error:
    print("Error while connecting to PostgreSQL", error)

select_Query = 'SELECT * FROM sample'

cursor.execute(select_Query)

samples = cursor.fetchall()

for sample in samples:
    print("description = ", sample.description, "\n")

if connection:
    cursor.close()
    connection.close()
    print("PostgreSQK connection is closed")

Wir verwenden nur psycopg, also genau genommen psycopg3.

Bitte das Script nicht psycopg.py benennen, da Python den Dateinamen als Objekt erachtet und es natürlich psycopg nicht findet!

sudo pythob psycopg_test.py

Getestet unter CentOs 7 und Debian 11 und Windows 10

Wie immer, alle Angaben ohne Gewähr, Anwendung auf eigene Gefahr und Verantwortung, ich übernehme keinerlei Haftung für Ausfälle, Datenverlust oder andere finanzielle Schäden.

Happy coding!

Page 1 Page 2