Ist mein BytesIO leer oder nicht (Python)?

Um herauszufinden, ob eine BytesIO-Instanz leer ist oder nicht, rufe die Größe des Bytes IO auf und überprüfe, ob diese > 0 ist:

mein_bytesio.getbuffer().nbytes > 0:

Das Folgende Beispiel zeigt, wie man in einer if-Abfrage überprüft, ob ein BytesIO-Objekt leer ist:

if mein_bytesio.getbuffer().nbytes > 0:
    print("mein_bytesio ist leer")
else:
    print("mein_bytesio ist NICHT leer")

 

Posted by Uli Köhler in Python

Wieviele Pins hat ein PCIe-Stecker/Buchse?

Ein PCIe x1-Steckverbinder hat 36 pins (18 pins pro Seite)

Ein PCIe x4-Steckverbinder hat 64 pins (32 pins pro Seite)

Ein PCIe x8-Steckverbinder hat 98 pins (49 pins pro Seite)

Ein PCIe x16-Steckverbinder hat 164 pins (82 pins pro Seite)

Ein PCIe x24-Steckverbinder hat 230 pins (115 pins pro Seite)

Quelle: Samtec-Katalog, Amphenol-Datasheet (x24)

 

Posted by Uli Köhler in Electronics, Elektronik

Komplette AWG zu mm² Fläche / mm Durchmesser-Tabelle

Diese Tabelle zeigt alle AWG-Werte von 0000 AWG bis AWG41

AWGmm² areamm diameter
4/0 or 0000 AWG10711.68 mm
3/0 or 000 AWG8510.40384 mm
2/0 or 00 AWG67.4 mm²9.26592 mm
0 AWG53.5 mm²8.25246 mm
1 AWG42.4 mm²7.35 mm
2 AWG33.6 mm²6.54 mm
3 AWG26.7 mm²5.83 mm
4 AWG21.2 mm²5.19 mm
5 AWG16.8 mm²4.62 mm
6 AWG13.3 mm²4.11 mm
7 AWG10.6 mm²3.67 mm
8 AWG8.35 mm²3.26 mm
9 AWG6.62 mm²2.91 mm
10 AWG5.27 mm²2.59 mm
11 AWG4.15 mm²2.3 mm
12 AWG3.31 mm²2.05 mm
13 AWG2.63 mm²1.83 mm
14 AWG2.08 mm²1.63 mm
15 AWG1.65 mm²1.45 mm
16 AWG1.31 mm²1.29 mm
17 AWG1.04 mm²1.15 mm
18 AWG0.823 mm²1.024 mm
19 AWG0.653 mm²0.912 mm
20 AWG0.519 mm²0.812 mm
21 AWG0.412 mm²0.723 mm
22 AWG0.325 mm²0.644 mm
23 AWG0.259 mm²0.573 mm
24 AWG0.205 mm²0.511 mm
25 AWG0.163 mm²0.455 mm
26 AWG0.128 mm²0.405 mm
27 AWG0.102 mm²0.361 mm
28 AWG0.0804 mm²0.321 mm
29 AWG0.0646 mm²0.286 mm
30 AWG0.0503 mm²0.255 mm
31 AWG0.0404 mm²0.16002 mm
32 AWG0.0320 mm²0.2032 mm
33 AWG0.0254 mm²0.18034 mm
34 AWG0.0201 mm²0.16002 mm
35 AWG0.0160 mm²0.14224 mm
36 AWG0.0127 mm²0.12700 mm
37 AWG0.0100 mm²0.11430 mm
38 AWG0.00797 mm²0.10160 mm
39 AWG0.00632 mm²0.08890 mm
40 AWG0.00501 mm²0.07874 mm
Posted by Uli Köhler in Electronics, Elektronik

Wie kann man in Python eine E-Mail mit Anhang per SMTP versenden?

Dieses Bespiel zeigt, wie man in Python eine E-Mail mit Anhang versenden kann. Der Anhang wird direkt aus einer Datei gelesen.

#!/usr/bin/env python3
import smtplib
import mimetypes
from email.message import EmailMessage

# E-Mail-Objekt initialisieren und Nachrichtentext setzen:
msg = EmailMessage()
msg['Subject'] = 'Diese E-mail enthält einen Anhang'
msg['From'] = '[email protected]'
msg['To'] = '[email protected]'
# Set text content
msg.set_content('Please see attached file')

def attach_file_to_email(email, filename):
    """Attach a file identified by filename, to an email message"""
    with open(filename, 'rb') as fp:
        file_data = fp.read()
        maintype, _, subtype = (mimetypes.guess_type(filename)[0] or 'application/octet-stream').partition("/")
        email.add_attachment(file_data, maintype=maintype, subtype=subtype, filename=filename)

# Anhang anhängen
attach_file_to_email(msg, "myfile.pdf")

def send_mail_smtp(mail, host, username, password):
    s = smtplib.SMTP(host)
    s.starttls()
    s.login(username, password)
    s.send_message(msg)
    s.quit()

# E-Mail per SMTP senden
send_mail_smtp(msg, 'smtp.domain.com', '[email protected]', 'sae7ooka0S')

Das oben gezeigte Skript benutzt die Folgenden Funktionen:

import smtplib
import mimetypes

def attach_file_to_email(email, filename):
    """Attach a file identified by filename, to an email message"""
    with open(filename, 'rb') as fp:
        file_data = fp.read()
        maintype, _, subtype = (mimetypes.guess_type(filename)[0] or 'application/octet-stream').partition("/")
        email.add_attachment(file_data, maintype=maintype, subtype=subtype, filename=filename)

def send_mail_smtp(mail, host, username, password):
    s = smtplib.SMTP(host)
    s.starttls()
    s.login(username, password)
    s.send_message(msg)
    s.quit()

Initalisiere das E-Mail-Object wie Folgt:

# E-Mail-Objekt initialisieren und Nachrichtentext setzen:
msg = EmailMessage()
msg['Subject'] = 'This email contains an attachment'
msg['From'] = '[email protected]'
msg['To'] = '[email protected]'
# Set text content
msg.set_content('Please see attached file')

und hänge dann die Datei so an:

attach_file_to_email(msg, "myfile.pdf")

Danach kannst du die E-Mail so per SMTP versenden:

send_mail_smtp(msg, 'smtp.my-domain.com', '[email protected]', 'sae7ooka0S')
Posted by Uli Köhler in E-Mail, Python

Wo kann ich mich bei WordPress anmelden / einloggen?

Bei WordPress kann man sich unter /wp-admin einloggen.

Falls euer WordPress unter https://meinedomain.de installiert ist, könnt ihr euch also unter https://meinedomain.de/wp-admin einloggen.

Ist euer WordPress unter https://wordpress.meinedomain.de installiert, könnt ihr euch unter https://wordpress.meinedomain.de einloggen.

Ist euer WordPress in einem Unterverzeichnis installiert, z.B. unter https://meinedomain.de/wordpress, könnt ihr euch typischerweise unter https://meinedomain.de/wordpress/wp-admin anmelden. Sollte das nicht funktionieren (je nach Konfiguration des Webservers), versucht auch /wp-admin ohne das Unterverzeichnis, z.B: https://meinedomain.de/wp-admin .

Posted by Uli Köhler in Wordpress

Was bedeutet „DOM“ bei Glasfaser-Transceiver-Modulen (SFP/SFP+)?

Viele neue und gebrauchte Glasfasermodule werden mit DOM-Unterstützung beworben.

DOM bedeutet Digital Optics Monitoring. Das bedeutet, dass die Elektronik im Glasfaser-Modul die Verbindung überwacht und über eine digitale Schnittstelle Diagnosewerte zur Verfügung stellt.

Die DOM-Schnittstelle ist ein Industriestandard und wird daher von zahlreichen Geräteherstellern unterstützt. Dennoch ist die DOM-Funktionalität nur dann nutzbar, wenn das entsprechende Gerät (Switch, Router, PCIe-Karte, …). DOM-Transceiver können auch in Geräten ohne DOM-Unterstützung verwendet werden.

Früher war DOM ein Zusatzfeature, für das man bei jedem Glasfasermodul extra zahlen musste. Heutzutage haben fast alle modernen Transceiver DOM eingebaut.

Das Folgende Beispiel zeigt die DOM-Diagnostic im Webinterface eines Mikrotik CRS305-1G-4S+ mit einem FS SFP-10GSR-85 für Multimode-Fasern. Das Paar aus identischen Modulen ist mit einem 25m-Multimode-Kabel (OM3, 50/125um, LC UPC Duplex) miteinander verbunden.

Wie in diesem Screenshot zu sehen ist, zeigt das DOM neben allgemeinen Fehlern (Rx LoseTx Fault) die kritischen Werte Rx Power und Tx Power an. Hier lässt sich ablesen, ob der sendende Laser defekt ist (falls Tx Power zu gering ist) oder ob nicht genug Signal an der empfangenden Photodiode ankommt (falls Rx Power zu gering ist). So lassen sich auch Trends und schlechte Verbindungen erkennen und so reparieren, bevor sie komplett versagen.

Posted by Uli Köhler in Netzwerk

Parallele Ausführung von Prozessen mit xargs

Ein guter Startpunkt ist -P 4 -n 1 um 4 Prozesses parallel laufen zu lassen (-P 4), aber jeder Instanz des auszuführenden Prozesses nur ein Argument zu geben (-n 1)

Dies sind die xargs-Optionen für die parallele Ausführung aus der xargs-manpage:

-P, --max-procs=ANZAHL       höchstens diese ANZAHL Prozesse zugleich ausführen

-n, --max-args=ANZAHL        höchstens diese ANZAHL Argumente in der
                                 Befehlszeile verwenden

Beispiel:

cat urls.txt | xargs -P 4 -n 1 wget

Dieser Befehl führt bis zu 4 wget-Befehle parallel aus, bis jede der URLs aus urls.txt heruntergeladen wurde. Die Folgenden Prozesse würden parallel ausgeführt:

wget [URL #1]
wget [URL #2]
wget [URL #3]
wget [URL #4]

Benutzt man stattdessen die Parameter -P 4 -n 2 dann würden die Folgenden Prozesse parallel ausgeführt:

wget [URL #1] [URL #2]
wget [URL #3] [URL #4]
wget [URL #5] [URL #6]
wget [URL #7] [URL #8]

Ein größerer Wert für -n könnte die Effizienz leicht erhöhen, da nicht für jede URL ein eigener Prozess initialisiert werden muss. Allerdings funktioniert ein Wert von n > 1 für manche Befehle nicht.

Posted by Uli Köhler in Linux

Wo kann man in der Fritz!Box statische IP-Routen setzen?

Die statischen IP-Routen findet man unter

  • Heimnetz
  • Netzwerk
  • Tab Netzwerkeinstellungen
  • Ganz nach unten scrollen, dort steht Statische Routingtabelle
  • Rechts unten davon sind die beiden Buttons zum setzen von statischen IPv4-Routen und IPv6-Routen !

Sollten diese Einträge nicht vorhanden sein => Erweiterte Ansicht ganz rechts oben aktivieren.

Posted by Uli Köhler in Netzwerk

How to fix PowerShell The term ‚Remove-Service‘ is not recognized as the name of a cmdlet, …

Problem:

You want to remove a Windows service using the Remove-Service cmdlet. However, you see an error message like

Remove-Service : The term 'Remove-Service' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was
included, verify that the path is correct and try again.
At line:1 char:63
+ Remove-Service
+ ~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Remove-Service:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Solution:

The Remove-Service cmdlet was introduced in PowerShell version 6.x.

When you run

Get-Host | Select-Object Version

in your PowerShell, you will see that you are running an older PowerShell version, e.g.

Version
-------
5.1.19041.610

However, you can use this one liner in order to install PowerShell

iex "& { $(irm https://aka.ms/install-powershell.ps1) } -UseMSI"

Source for the one-liner: thomasmaurer.ch

Posted by Uli Köhler in PowerShell, Windows

Howto: PowerShell-Fehlerausgabe auf Englisch umstellen

Falls du eine PowerShell-Ausgabe für ein Kommando oder ein Cmdlet lieber in Englisch statt in Deutsch sehen möchtest, kopiere dies vor dein Kommando:

[Threading.Thread]::CurrentThread.CurrentUICulture = 'en-US';

Zum Beispiel wäre dies die Kommandozeile, um My-Cmdlet -Arg 1 mit einer Ausgabe in Englisch aufzurufen:

[Threading.Thread]::CurrentThread.CurrentUICulture = 'en-US'; My-Cmdlet -Arg 1

[Threading.Thread]::CurrentThread.CurrentUICulture betrifft ausschließlich das aktuelle Kommando und hat keinen Effekt auf weitere Kommandos. Du musst diese Zeile daher vor jedes deiner Kommandos kopieren, dessen Ausgabe du auf Englisch statt auf Deutsch sehen möchtest!

Unter Umständen musst du auch die englische Hilfe installieren um mehr Nachrichten in Englisch zu sehen, dazu führe in einer PowerShell als Administrator diese Zeile aus:

Update-Help -UICulture en-US

 

Posted by Uli Köhler in PowerShell, Windows

Problemlösung ‚Die folgenden Signaturen konnten nicht überprüft werden, weil ihr öffentlicher Schlüssel nicht verfügbar ist: NO_PUBKEY 78BD65473CB3BD13‘

Problem:

Du versuchst, die aktuellen Paketlisten unter Linux mit apt update oder apt-get update zu aktualisieren, aber siehst diese Fehlermeldung:

W: GPG-Fehler: http://dl.google.com/linux/chrome/deb stable InRelease: Die folgenden Signaturen konnten nicht überprüft werden, weil ihr öffentlicher Schlüssel nicht verfügbar ist: NO_PUBKEY 78BD65473CB3BD13

Lösung:

Importiere den öffentlichen Schlüssel mit

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 78BD65473CB3BD13

und dann versuche nochmal

sudo apt update

 

Posted by Uli Köhler in Unkategorisiert

Wie berechnet man die Anzahl der Tage in einem Jahr mit pandas?

In unserem vorigen Post haben wir gezeigt, wie man mithilfe der Pendulum-Bibliothek die Anzahl der Tage ein einem Jahr berechnen kann.

Dieser Post zeigt, wie man die Anzahl der Tage in einem Jahr mit pandas berechnet:

import pandas as pd
def number_of_days_in_year(year):
    start = pd.Timestamp(year, 1, 1)
    end = pd.Timestamp(year + 1, 1, 1)
    return (end - start).days)

Beispiel:

print(number_of_days_in_year(2020)) # Gibt 366 aus
print(number_of_days_in_year(2021)) # Gibt 365 aus

Detailierte Beschreibung:

Zuerst definieren wir das Startdatum als den 1. Januar des zu berechnenden Jahres:

start = pd.Timestamp(year, 1, 1)

Das Enddatum ist dementsprechend der erste Januar des darauf folgenden Jahres

end = pd.Timestamp(year + 1, 1, 1)

Der Rest ist einfach: Wir können die Daten voneinander subtrahieren und im resultierenden pd.Timedelta-Objekt .days aufrufen, um die Anzahl der Tage zu erhalten.

(end - start).days

 

Posted by Uli Köhler in pandas, Python

Anzahl der Tage in einem Jahr mit Python berechnen

Wir können die pendulum-Bibliothek benutzen, um die Anzahl der Tage in einem Jahr zu bestimmen:

import pendulum

def number_of_days_in_year(year):
    start = pendulum.date(year, 1, 1)
    end = start.add(years=1)
    return (end - start).in_days()

Usage example:

print(number_of_days_in_year(2020)) # Gibt 366 aus
print(number_of_days_in_year(2021)) # Gibt 365 aus

Erklärung:

Zuerst definieren wir das start-Datum als das erste Datum (1. Januar) des Jahres, für das wir die Anzahl der Tage berechnen sollen:

start = pendulum.date(year, 1, 1)

Nun können wir die add-Funktion aus pendulum verwenden, um exakt ein Jahr zu diesem Datum zu addieren. Dies resultiert immer im ersten Januar des darauf folgenden Jahres.

end = start.add(years=1)

Der Rest ist einfach: Wir benutzen in_days(), um die Anzahl der Tage in (end - start) zu erhalten:

(end - start).in_days()

 

Posted by Uli Köhler in Python

Was tun bei Angular ng Die Datei „C:\Users\…\AppData\Roaming\npm\ng.ps1“ kann nicht geladen werden, da die Ausführung von Skripts auf diesem System deaktiviert ist

Problem:

Du möchtest ein Angular-Kommando wie ng serve ausführen, aber siehst diese Fehlermeldung:

ng : Die Datei "C:\Users\myuser\AppData\Roaming\npm\ng.ps1" kann nicht geladen werden, da die Ausführung von Skripts auf diesem System    
deaktiviert ist. Weitere Informationen finden Sie unter "about_Execution_Policies" (https:/go.microsoft.com/fwlink/?LinkID=135170).      
+ ng serve
+ ~~
    + CategoryInfo          : Sicherheitsfehler: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

Lösung:

Lösche die Datei C:\Users\BENUTZERNAME\AppData\Roaming\npm\ng.ps1 ,zum Beispiel mit dem Folgenden Befehl:

rm "C:\Users\$env:username\AppData\Roaming\npm\ng.ps1"

Danach sollte ng serve etc sofort funktionieren.

Posted by Uli Köhler in Windows

TSV-Dateien (tab-separierte Werte) in C++ einlesen

Dieses minimale Beispiel zeigt, wie man tab-separierte Dateien (TSV) in C++ einlesen kann. Unser Beispiel nutzt boost::algorithm::split, um jede Zeile in ihre tab-separierten Werte aufzuspalten.

#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <boost/algorithm/string.hpp>

using namespace std;
using namespace boost::algorithm;

int main(int argc, char** argv) {
    ifstream fin("test.tsv");
    string line;
    while (getline(fin, line)) {
        // Split line into tab-separated parts
        vector<string> parts;
        split(parts, line, boost::is_any_of("\t"));
        // TODO Your code goes here!
        cout << "First of " << parts.size() << " elements: " << parts[0] << endl;
    }
    fin.close();
}

 

 

Posted by Uli Köhler in C++

C++: Datei Zeile für Zeile lesen (minimales Beispiel)

Dieses minimale Beispiel liest eine Datei mithilfe von std::getline und schreibt dann jede Zeile nach stdout.

#include <fstream>
#include <iostream>
#include <string>

using namespace std;

int main(int argc, char** argv) {
    ifstream fin("test.tsv");
    string line;
    while (getline(fin, line)) {
        // TODO Hier kannst du die Zeile weiterverarbeiten. Dies ist nur ein Beispiel:
        cout << line << endl;
    }
    fin.close();
}

 

Posted by Uli Köhler in C++

GCC-Fehler ‚Warnung: undefinierter Verweis auf »dlopen«‘ beheben

Wenn GCC beim Linken eine Fehlermeldung wie diese angezeigt wird:

/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/librocksdb.so: Warnung: undefinierter Verweis auf »dlopen«
/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/librocksdb.so: Warnung: undefinierter Verweis auf »dlclose«
/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/librocksdb.so: Warnung: undefinierter Verweis auf »dlerror«
/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/librocksdb.so: Warnung: undefinierter Verweis auf »dlsym«

dann muss zusätzlich noch die dl-Bibliothek gelinkt werden, die die Funktionen zum dynamischen Laden von Symbolen dlopen, dlclose, dlerror & dlsym enthält.

In GCC kann man die dl-Bibliothek mit dem -ldl-Flag linken.

Posted by Uli Köhler in C++

FFT-Frequenzauflösungs-Rechner

TechOverflow-Online-Rechner:
Du kannst hier auch Werte mit SI-Suffix eingeben, z.B. 12.2m (entspricht 0.012) oder 14k (14000) oder 32u (0.000032) und Werte mit Einheiten (z.B. 12V).
Die Ergebnisse werden live während der Eingabe berechnet und direkt unter dem Rechner angezeigt, also musst du nicht Return drücken oder auf einen Berechnen-Button klicken. Stelle nur sicher, dass alle Eingabefelder grün sind, indem du valide Werte einträgst.

pt

Hz


f_{Auflösung} = \frac{f_{Samplerate}}{N_{FFT}}

Posted by Uli Köhler in Calculators