Steck rein

Plugins sind in der Regel Module oder Packages die in einem (oder mehreren) Unterverzeichnissen hinterlegt sind.
Das Hauptscript muss diese laden und bestimmte Funktionen in diesen aufrufen, damit diese dann Daten verarbeiten können.
Eventuell möchte man das die Plugins selbst bestimmte Funktionen registrieren für bestimmte Ereignisse im Hauptprogramm (Hooks).

Eine einfache Variante wie man all das realisieren kann könnte so aussehen:

Hauptscript
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import importlib
import glob
import lib.register

for module in glob.glob("lib/plugins/*.py"):
    module = module.replace("/", ".")[:-3]
    importlib.import_module(module)

for module in lib.register._processors:
    print(f"Would call {module}")

Read more…

Vom rechten Pfad abgekommen

Wegen einer Race Condition auf einem meiner Systeme kommen einige Netzwerkinterfaces nicht up wenn das System neustartet.
Da das System relativ kritisch ist (arbeitet als Ethernet-Switch) muss es auch nach einem Stromausfall automatisch wieder sauber starten. Aus diesem Grund habe ich einen Cron-Job installiert der ein Script ausführt was im Prinzip einfach nur ifconfig [Interface] up aufruft mit einer Verzögerung nach dem booten des Systems.

@reboot root sleep 20;/home/pi/bring_up.sh

Leider änderte der Job an der Situation nichts, egal wie hoch ich die Verzögerung konfigurierte, führte ich den Befehl manuell aus funktionierte alles wie gewünscht

Read more…

Wiederholung

Manchmal möchte man einzelne Zeichen oder Zeichenketten in vim mehr als einmal eingeben - mehrfach hintereinander.

Zum Beispiel in Markup wie AsciiDoc "#"um eine Überschrift zu definieren:

### 3. Ebene ###

Davon ausgehend das wir im Insert-Mode sind geht das durch folgende Abfolge:

  • Ctrl+o → Verlasse Insert-Mode (Wechsel in Normal-Mode) für einen einzigen Befehl (kehrt danach in Insert zurück); Wenn schon im Normal-Mode → weglassen (Ctrl-o hat eine andere Bedeutung im Normal-Mode)

  • [Anzahl Wiederholungen] → wie oft das Zeichen, die Zeichenkette wiederholt werden soll; natürlich ohne [] eingeben

  • i → Wechsel in Insert-Mode

  • [gewünschte Zeichenkette] → gewünschtes Zeichen oder Zeichenkette eingeben die wiederholt werden soll;natürlich ohne [] eingeben

  • Esc → Escap zum verlassen des Insert-Modes

  • jetzt wird das Zeichen/die Zeichenkette wiederholt eingefügt

Um 3 "#" zu erzeugen (während wir im Insert-Mode sind) wäre es also: "Ctrl+o 3 i # Esc"

Um "HaHaHa" zu schreiben wäre es: "Ctrl+o 3 i Ha Esc"

Frag mich

10:00 Peter trifft ein
11:00 Claudio schminken
11:30 Kuchen anschneiden
12:00 Besprechung mit Peter
12:30 Haareschneiden Peter
13:00 Petra Haare machen

Peter sitzt links neben Hildegard

Will man in oben stehendem bei einigen, aber nicht allen Vorkommen "Peter" durch "Franz" ersetzen, kann aber keinen zusammenhängenden Bereich auswählen oder weiß auch gar nicht wo überall man ersetzen müsste (große Datei), kann man folgendes in vim machen:

0,$ s/Peter/Franz/c
  • 0,$ → normale Bereichsauswahl auf den der folgende Befehl angewendet werden soll → 0=Beginn Dokument; $=Ende Dokument

  • s/Peter/Franz/ → Ersetze Peter durch Franz

  • c → Frage bei jedem auffinden von Peter ob es ersetzt werden soll

Alle Register gezogen

Heute ist schönes Wetter.
Wir sollten baden gehen.

Will man nach "Heute" suchen kann man das machen in dem man den Kursor auf "Heute" platziert und "*" oder "#" drückt (vorwärts oder rückwärts suchen).
Will man aber nach "schönes Wetter" suchen geht das nicht, denn "*" oder "#" nehmen jeweils nur das Wort unter dem Cursor.
Man kann naütlich "/" (im Normal-Mode) verwenden, müsste die Wortgruppe aber dann tippen.

Einfacher ist es die Wortgruppe zu kopieren (yank) und dann in der Suche das Register auswählen:

  • ggf. in Normal-Mode wechseln (Esc)

  • y → yank (ggf. vorher im Visual Mode auswählen oder z.B. per 2yW mehere Wörter kopieren)

  • / → Suche

  • Ctrl+r → Liste alle Register auf; geht nur in der Suche, und im Insert-Mode, im Normal-Mode hat es eine andere Bedeutung)

  • Buchstabe/Zahl des gewünschten Registers drücken

  • Inhalt des Registers ist jetzt hinter "/" eingefügt und es kann danach gesucht werden

CSS für AsciiDoc in Nikola

Das Problem

Das AsciiDoc-Plugin von Nikola nimmt (Quellcode: https://github.com/getnikola/plugins/blob/master/v7/asciidoc/asciidoc.py) im Prinzip den Seitencode und übergibt ihn mit den Parametern "-b html5 -s -o" an asciidoc bzw. asciidoctor.
Asciidoctor generiert daraus HTML und gibt es an Nikola zurück.

Die Parameter haben dabei folgende Bedeutung:

  • -b → Ausgabeformat (HTML 5 hier)

  • -s → es wird ohne Header und Footer geschrieben

  • -o → wo die Ausgabedatei hingeschrieben wird

Read more…

To be or not to be

In Python gibt es diese schöne Möglichkeit:

if not a:
    do something

Das kommt in verschiedenen Geschmacksrichtungen wie:

a = a or self.default

oder

a = a if a else self.default

Man schreibt also nicht was a (eine Variable) nicht ist (nicht True, nicht 0 usw.) bzw. was sie ist, sondern einfach das sie nicht ist bzw. ist.

Read more…

Kitty hat zu viel Baldrian gefressen

Da denkt man sich nichts böses… macht einfach ein Linux-Update und startet neu und anschließend geht eines der wichtigsten Werkzeuge nicht mehr… Neovim :)
Neeeein…

Also an sich ging es schon noch, es ging auf und zeigte Text an, aber Enter und Backspace (wahrscheinlich noch andere Tasten) wurden alle mehrfach registriert.
Statt also einen Zeilenumbruch hatte man gleich 3 oder löschte gleich 3 Zeichen.

IPU (Invisible Pink Unicorn) sei Dank bin ich immer etwas langsam ;) und andere sind auch schon über das Problem gestolpert.
Und tatsächlich besteht das Problem nicht nur bei Kitty, sondern auch bei foot, und Alacritty (und ist auch dort in den neueren Versionen gefixt). Ein Treffen der coolen Terminals und alle haben das gleiche Problem.

Wahrscheinlich eine Änderung auf Seiten Neovim, aber ein Fehlverhalten all dieser Terminals, hier ist der Bugreport bei Neovim:
https://github.com/neovim/neovim/issues/31806

Lösung: Update des Terminals auf eine neue Version (Kitty funktioniert mit spätestens 0.42.1).
Hier die Anleitung für Kitty: https://sw.kovidgoyal.net/kitty/binary/

Brücken bauen mit Hindernissen

Einrichten einer Bridge unter Debian-Linux.

/etc/network/interfaces editieren
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# Setting all being part of the bridge to manual to avoid configuration conflicts

iface enp1s0 inet manual
iface enp2s0 inet manual
iface enp3s0 inet manual
iface enp4s0 inet manual
iface enp5s0 inet manual
iface enp6s0 inet manual

# Bridge config
auto br0
iface br0 inet static
	bridge_ports enp1s0 enp2s0 enp3s0 enp4s0 enp5s0 enp6s0
	address 192.168.178.183
	broadcast 192.168.178.255
	gateway 192.168.178.1
	netmask 255.255.255.0

# The primary network interface
#allow-hotplug enp1s0
#iface enp1s0 inet dhcp
  • Zeile 3-8 verhindern das die Interfaces durch irgendeinen Dienst aktiviert werden

  • Zeile 11 definiert das br0 (das Bridge-Interface) automatisch aktiviert wird

  • Zeile 12-17 definiert die Netzwerkschnittstellen die Teil der Bridge werden und die IP-Adresse die die br0 bekommen soll

    • br0 ist im Prinzip das virtuelle Netzwerkinterface über welchen der Host (also das System selbst) Zugang zum Netzwerk bekommt

  • Zeile 19 ist die ursprüngliche (kommentierte) Netzwerkkonfiguration des Systems

Danach hat man wahrscheinlich das Problem das man zwar das System erreichen kann, aber die Bridge nicht funktioniert.
Das liegt daran das für Bridge-Interfaces per Default in neueren Kernel-Versionen Netfilter (die Firewall in Linux) aktiv ist und das weiterleiten verhindert.

/etc/sysctl.conf hinzufügen
net.bridge.bridge-nf-call-arptables = 0
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0

Danach wird es wahrscheinlich immer noch nicht funktionieren und man wird folgendes im syslog finden:

Mar 12 20:05:34 vp-2 systemd-sysctl[273]: Couldn't write '0' to 'net/bridge/bridge-nf-call-arptables', ignoring: No such file or directory
Mar 12 20:05:34 vp-2 systemd-sysctl[273]: Couldn't write '0' to 'net/bridge/bridge-nf-call-ip6tables', ignoring: No such file or directory
Mar 12 20:05:34 vp-2 systemd-sysctl[273]: Couldn't write '0' to 'net/bridge/bridge-nf-call-iptables', ignoring: No such file or directory

Der Grund ist das zum Zeitpunkt wo sysctl aufgerufen wird um die Parameter zu setzen das Netzwerk noch nicht gestartet wurde.
Dadurch sind die Module bridge und br_netfilter noch nicht geladen und daher existieren die Dateien (in /proc/net/bridge-nf-call usw.) nicht.

/etc/modules hinzufügen
bridge
br_netfilter

Obiges lädt die Module bridge und br_netfilter beim Systemstart und damit vor sysctl und damit sind die entsprechenden Dateien beim Aufruf von sysctl vorhanden.