Author Archive

Nordwind-DB mit Python abfragen (Python, pandas, MySQL)

Hier ein einfaches Beispiel, wie man die Daten aus der Nordwind-Datenbank in einen pandas Dataframe bekommt. Der originale Code stammt von https://pythontic.com/pandas/serialization/mysql und wurde auf meine Datenbank angepasst.

# -*- coding: utf-8 -*-
 
from sqlalchemy import create_engine
import pymysql
import pandas as pd
 
sqlEngine       = create_engine('mysql+pymysql://nwread:northwind@192.168.0.60/northwind', pool_recycle=3600)
dbConnection    = sqlEngine.connect()
frame           = pd.read_sql("select * from products", dbConnection);
 
pd.set_option('display.expand_frame_repr', False)
print(frame)
 
frame.to_excel('r:/abc.xlsx')
 
dbConnection.close()

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Getting jitsi into retirement homes

Together with friends from Dingfabrik Koeln (Thanks for the idea, Marian!) I am currently developing an solution for retirement homes to allow simple access to jitsi video sessions.

We know that many old people currently cannot receive visitors due to Corona. So our idea is to give them access to a simple Linux-based notebook and allow them to easily create a jitsi video session. Based on a predefined list of servers (that is to be updated from remote) and a text file with names, that can be edited by a nurse with a text editor, we simply create a url that can be shared among relatives.

The application was made using Python and tkinter, all code was pretty much copied from SO and other sources, I just had to put it together. (Thank you giants, that I could „stand on your shoulders“)

Using a Linux laptop with installed Python (and additional python3-tk package), Chrome/Chromium and git we have the tool run on startup. On the first start a text file with names is created, that can be edited easily.

If you find it useful, see the code in my github: https://github.com/UweZiegenhagen/pyJitsiopen.

Future updates shall include:

  • Automated updates
  • Logging for error tracking
  • Using local server lists that are not overwritten during updates

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

PS/2 Mäuse und Tastaturen unter Windows 10 nutzen

Ich habe noch einige alte PS/2 Mäuse und Tastaturen, unter ihnen ein Logitech TrackMan Marble FX. Mein Mainboard hat noch entsprechende Anschlüsse, nach dem Anschließen (und Neustart, da kein Plug&Play) tat sich jedoch nichts. Die Lösung fand sich dann bei https://www.wilflingseder.work/de/2018/05/14/how-to-use-a-ps2-keyboard-or-mouse-in-windows-8-and-10/.

Es reicht, mittels regedit im Schlüssel HKEY_LOCAL_MACHINE > SYSTEM > CurrentControlSet > Services > i8042prt den Wert „Start“ von 3 auf 1 zu ändern.

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Zugriff aus dem lokalen Netz auf die Nordwind-DB

Um aus dem lokalen Netz Zugriff auf die Nordwind-DB zu erhalten, muss man folgendes tun:

  • die Datei 50-server.cnf in /etc/mysql/mariadb.conf.d bearbeiten. Hier statt 127.0.0.1 die IP-Adresse des Servers eingeben. An dieses Interface wird MariaDB gebunden.
  • einen neuen Nutzer anlegen:

    CREATE USER 'nwread' IDENTIFIED BY 'northwind';

  • Zugriff aus dem Netz für diesen User erteilen:

    GRANT USAGE ON *.* TO 'nwread'@'%' IDENTIFIED BY 'northwind';

    Kann sein, dass dieses Statement schon ausreichend ist, das werde ich noch überprüfen. Ich habe aber zusätzlich noch ausgeführt:

  • Zugriff auf die Datenbank geben:

    GRANT ALL privileges ON `northwind`.* TO 'nwread'@'%';

Nach dem Neustarts des MariaDB-Servers klappt der Zugriff, beispielsweise über HeidiSQL, das ich sehr empfehlen kann.

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Die Nordwind-Datenbank für MySQL nutzen

Mit der Nordwind (Northwind) Datenbank gibt es eine ursprünglich für MS Access entwickelte Datenbank, an der sich viele SQL-Konstrukte üben lassen. Die Datenbank gibt es auch für MySQL, unter anderem unter https://github.com/dalers/mywind.

Hier nun die notwendigen Schritte für das Einspielen in eine MySQL/MariaDB-Datenbank:

  • git clone https://github.com/dalers/mywind.git
  • cd mywind
  • sudo mariadb < northwind.sql
  • sudo mariadb < northwind-data.sql

Mittels SQL kann man jetzt prüfen, ob die Daten vollständig geladen wurden:

  • sudo mariadb
  • use northwind
  • select count(*) from products;

bringt eine Zeilenzahl von 45 Zeilen.

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

MariaDB installieren unter Linux

Für Apache Guacamole brauchte ich einen MySQL/MariaDB Server auf meinem Linux-Server, hier die Schritte zur Installation:

  1. sudo apt update
  2. sudo apt upgrade
  3. sudo apt install mariadb-server
  4. sudo mariadb

Standardmäßig kommt man als root sofort in die Datenbank, ohne ein Passwort einzugeben. Ich bin zwar den Hinweisen von https://kofler.info/root-login-problem-mit-mariadb/ gefolgt, um für den root-User ebenfalls ein Passwort festzulegen.

Aktuell wird aber jedes Passwort akzeptiert, wenn ich root bin, jedoch das festgelegte Passwort nicht akzeptiert, wenn ich als normaler User mysql -u root -p ausführe.

Sinnvolle mysql/mariadb-Befehle

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Holzboxen entwerfen mit OpenSCAD

Für mein Bücherregal möchte ich einige Boxen aus Holz bauen, die die Außenmaße 36x26x26 cm (Länge, Breite, Höhe) haben sollen. Um den Entwurf zu visualisieren, nutze ich OpenSCAD, eine freie CAD-Software. Die Besonderheit von OpenSCAD ist die Steuerung per Programmcode, die Maus hat nur wenig zu tun sowie die Möglichkeit, direkt STL-Dateien zu erzeugen, die dann im 3D-Drucker verarbeitet werden können.

Legen wir mal los!

Zuerst zeichnen wir mittels cube() Funktion einen Würfel, um Gewissheit über die Achsen zu bekommen.

cube([50,30,10]);

Wir erkennen anhand der Maße die Achsen: X geht nach rechts, Y nach hinten, Z nach oben. Jetzt wird es Zeit, die ersten Wände zu zeichen.

Im folgenden Bild sieht man die Vorder- und die Hinterwand. Für die Dicke der Holzplatten nutze ich eine Variable, so lässt sich das Design noch auf andere Plattendicken übertragen. Mit translate() verschiebe ich die Rückwand um die Dicke des Holzes nach hinten.

Im folgenden Bild sieht man die Seitenwand vor dem Verschieben, die Objekte gehen hier ineinander über, es ist nicht klar, wo die Vorderwand und das Seitenteil anfangen und aufhören. So etwas gilt es zu vermeiden.

Im folgenden Bild sehen wir das Ergebnis der Rotation mittels rotate(). Die Platte (und die Maße) passen noch nicht, die Seitenwände müssen sauber zwischen Vorder und Rückteil eingepasst werden.

Hier noch ein Bild von oben.

Nach dem Einfügen und Einpassen der Seitenwände (360mm – 2 * Plattendicke) haben wir das folgende Bild, zusammen mit einem der Zylinder für den Griff.

Hier noch aus einer anderen Perspektive, mit dem Zylinder schon auf der richtigen Höhe.

Im nächsten Schritt dupliziere ich den Zylinder und richte beide von der Mitte aus.

Im nächsten Schritt nutze ich die hull() Funktion, um beide Objekte mit einer Hülle zu versehen. In einem ersten Versuch hatte ich einen Quader eingepasst, die Lösung mit der Hülle ist aber wesentlich einfacher und sauberer. Das gesamte Objekt wird jetzt in die Kiste verschoben, um bei der folgenden Differenz-Funktion (Vorderseite minus umhüllte Zylinder) auf jeden Fall vorn und hinten ein sauberes Ergebnis zu liefern.

Im folgenden Bild sieht man das vorläufige Ergebnis, in einem folgenden Beitrag werde ich vermutlich zeigen, wie man einen Boden für die Box einpasst.

Zum Abschluss der fertige Quellcode:

/* param. Holzdicke */
holzdicke = 12;
 
// Rückseite
color([0/255, 255/255, 0/255],1)
translate([0, 360-1*holzdicke, 0]) {
 cube([260,holzdicke,260]);
}
 
 
// Seitenteil 1
translate([holzdicke,holzdicke,0]){
 rotate(a=[0,0,90]) { 
  cube([360-2*holzdicke,holzdicke,260]);
 } // rotate
} // translate
 
// Seitenteil 2
color([0/255, 0/255, 255/255],1)
translate([260,holzdicke,0]){
 rotate(a=[0,0,90]) { 
  cube([360-2*holzdicke,holzdicke,260]);
 } // rotate
} // translate
 
 
difference(){
// Vorderseite
 color([255/255, 0/255, 0/255],1) 
 cube([260,holzdicke,260]);
 
// Griffloch
 hull(){
  // Zylinder 1
  translate([260/2-30,30,200]){
   rotate(a=[90,0,0]) {
    cylinder(h = 80, r1 = 35/2, r2 = 35/2);
   } // rotate
  } //translate
 
  // Zylinder 2
  translate([260/2+30,30,200]){
   rotate(a=[90,0,0]) {
    cylinder(h = 80, r1 = 35/2, r2 = 35/2);
   } // rotate
  } // translate
 } // hull
} // difference

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Parsing Lexware Qif files with Python (and pandas)

Python has a few packages to parse Quicken files, among them:

However both packages generated errors when I used them with the file from Lexware Financial Manager 2019. Also as a programming exercise I decided to write my own parser, available under https://github.com/UweZiegenhagen/PyQIF-Parser.

As of today the code parses Quicken files and generates an Excel file with the accounts, classifications, categories and transactions it finds in the file. It supports (German) online accounts, investment accounts are not (yet) supported. I do not use my portfolio with Quicken so I probably will not implement this, feel free ask for it (with example files) or send pull requests.

Some code example is provided:

from PyQifParser import PyQifParser
 
P = PyQifParser(r'C:\Users\Uwe\Nextcloud\QIF-Parser\Quicken_h.QIF')
P.parse()
P.to_excel('r:/export.xlsx')

I plan to extend the code with repect to a) visualisation, b) sanity checks and c) statistical analyses

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Hashes von Dateien erstellen mit Powershell

Verzeichnisse lassen sich recht einfach mit Powershell abgleichen, wenn man die Hashes aller enthaltenen Dateien vergleicht. Standardmäßig nutzt Powershell SHA256, dies lässt sich jedoch recht leicht ändern.

dir c:\ | get-filehash |  export-csv -notypeinformation -delimiter  ";" -path r:\files.csv 
 
PSDefaultParameterValues.add("Get-FileHash:Algorithm","MD5")

Die erzeugten Daten lassen sich dann leicht in Excel weiterverabeiten.

"Algorithm";"Hash";"Path"
"SHA256";"C883B5D2E16D22B09B176CA0786128F8064D47EDF26186B95845AA3678868496";"C:\msdia80.dll"

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

ZIP-Dateien erstellen mit Powershell

Hier ein kleines Beispiel, wie man mit Powershell ein Verzeichnis wegsichern kann, in diesem Fall eine Minecraft-Welt. Nützlich als Backup oder wenn man auf unterschiedlichen Rechnern spielt.

$datum = Get-Date -Format "yyyy-MM-dd_HHmm"
$maschine = $env:computername
 
$quelle = "C:\Users\Uwe\AppData\Roaming\.minecraft\saves\New World"
$ziel = "C:\Users\Uwe\Nextcloud\minecraft-" + $maschine + "_" + $datum + ".zip"
 
Compress-Archive -Path $quelle -DestinationPath $ziel

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website