PostgreSQL: Entity ID GenerationType migrieren

Angenommen, man möchte die ID einer Entity von

auf

migrieren, und dazu explizit eine Sequence in der Datenbank anlegen. Ein Migrationsskript könnte dann so aussehen:

Aaaber: IDs können negativ sein:

org.postgresql.util.PSQLException: ERROR: setval: value -91 is out of bounds for sequence “foo_bar_id_sequence” (1..9223372036854775807)

😄

Naheligende Lösung wäre, das SELECT in

zu ändern. setval geht allerdings per default aber beim nächsten Wert los, im Fall “1” (wenn gar keine oder nur negative IDs vorhanden sind) also bei 2. Das ist nicht direkt schlimm, aber uncool. Eine (umständliche!) Lösung ist eine Fallunterscheidung – und falls man die Migration viele viele male durchführen muss, verpackt man die Fallunterscheidung in einer FUNCTION:

Aufruf dann per:

Deutlich einfacher ist allerdings:

FALSE sorgt dafür, dass nicht der nächste Wert genommen wird, sondern genau dieser – und “+ 1” vermeidet einen Wert von 0, der ebenfalls out of bounds wäre.

Danke an Nils für’s vereinfachen! 🙂 Die umständliche Version bleibt trotzdem online als Template für PG Functions.

Ubuntu: Notifications deaktivieren

Ich bin offen für bessere Lösungen, aber

scheint zu klappen (von).

Mikrotik hAP lite: LAN Port 1 nutzen

Port 1 ist eigentlich für’s WAN/Internet vorgesehen. Wenn man einen Client anschließt, wird man kein (nutzbares) Internetsignal bekommen. Um das zu ändern

  1. öffne man die Interfaces
  2. suche man “ether1”; das sollte auf “R” (Relay?) stehen
  3. suche man das “ether” Interface, das auf “RS” steht (bei mir “ether2”)
  4. öffne man “ether1” und setze den Master Port von “none” auf das gefundene Interface (hier “ether2”)

Um auf Port 1 wieder Internet zu haben, muss man das zurückändern, klar.

Pale Moon: User Agent setzen

Wer auf einer Webseite Probleme mit Pale Moon hat, während Firefox funktioniert, der kann den User Agent anpassen:

Ist, Beispiel:

Mozilla/5.0 (X11; Linux x86_64; rv:3.0) Gecko/20100101 Goanna/20161201 PaleMoon/27.0.1

Soll:

Mozilla/5.0 (X11; Linux x86_64; rv:3.0) Gecko/20100101 Goanna/20161201 FireFox/31.0 PaleMoon/27.0.1

Anwendung:

// about:config, new String:
general.useragent.override.some-subdomain.some-domain.tld: <user agent>

Ganz konkret hilft das zum Beispiel, die Outlook Web App nicht (automatisch und unbeeinflußbar) im “Lite”-Modus starten zu lassen.

UPDATE: In v27.0.2 ist das wieder der default, siehe Release Notes. Kommentar dazu:

people still insist on using useragent sniffing to determine “browser features” […] HTML offers plenty of ways to do proper feature detection; site owners should use them. Seriously people, it was a bad idea 20 years ago, and it’s a worse idea in 2016.

😂

Windows: Welcher Prozess blockiert eine Datei?

Wer mit Bordmitteln herausfinden will, welcher der bsplw. drölf “java.exe”-Prozesse auf eine Datei zugreift, der kann den “Resource Monitor” verwenden – “resmon.exe” im Startmenü:

  • Tab “CPU”
  • Reiter “Processes”: Alle zu untersuchenden Prozesse anwählen
  • Reiter “Associated Handles”: In das Suchfeld den Dateinamen eingeben
  • Prozess finden und direkt von hier aus beenden

via

Ubuntu: Launcher, Menü, … weg

Während eines apt-get update wurde ich auf den Login-Screen geworfen und musste mich neu einloggen. Begrüßt wurde ich von meinem Desktop-Hintergrund, dem Kram auf dem Desktop, sowie: nichts anderem.

Langes Hin und Her, letztlich sogar ein Upgrade von 14.04 auf 16.04, aber die Lösung war schließlich:

Quelle

Mikrotik hAP lite als WLAN Adapter

Mehr für’s Geld geht nicht: Für etwas über 20 Euro habe ich mir einen Mikrotik hAP lite geholt, ein WLAN-Router mit vier Ports – absolut professioneller Software (“RouterOS”, das ist quasi der Aufhänger dieses Posts). Hier gibt’s eine Demo.

Der konkrete Anwendungsfall: Ich möchte über die LAN-Buchsen meinen Fernseher, Receiver, Bluray-Player und ein Raspberry in’s WLAN bringen. Ja, das geht auch einfacher, aber a) nicht günstiger, und b) ist das auch ein bisschen ein Bastelprojekt. Man liest ausschließlich Gutes über RouterOS, insofern wollte ich mir das mal ansehen. Und falls das was kann, würde ich mittelfristig meinen alten Netgear-Router durch einen hAP ac ersetzen – wohl der günstigste WLAN-Router mit Gigabit-Ports. Das wird dann übrigens weitere schöne Möglichkeiten eröffnen, denn mehrere Mikrotik-Router lassen sich von einem “Master” aus verwalten; das Stichwort heißt CAPsMAN.

Aber ich schweife ab. Nur noch kurz: Die Lernkurve von RouterOS ist steil. Man liest oft “grundlegende Netzwerkkenntnisse sind nötig”, aber das ist nur die halbe Wahrheit: Man muss auch wissen, wie RouterOS aufgebaut ist, und es gibt kein Handbuch. Und es gibt ein Undo; verkonfiguriert man sich und erreicht das Webinterface nicht mehr, fängt man von vorne an (Strom trennen und bei gedrücktem Reset-Knopf wieder anschließen. Gedrückt halten, bis die LED blinkt).

Ein erstes Setup habe ich mit den beiden Büchern “RouterOS by Example” von Stephen Discher und “Learn RouterOS” von Dennis Burgess hinbekommen, schließlich brauchte ich aber diese Anleitung. Leider gibt es viele… irreführende? veraltete? How-Tos im Netz, insofern hier meine Abwandlung. Ich nutze dafür RouterOS v6.30.4.

0. Prep

  • WLAN am Notebook aus
  • hAP per Ethernet an’s Notebook anschließen. Ich habe nicht Port 1 benutzt, weil der für’s WAN vorgesehen ist. IP-Adresse automatisch beziehen!
  • hAP einschalten
  • Browser öffnen
  • zu 192.168.88.1 verbinden (nach dem Booten braucht der hAP manchmal ~10 Sekunden)
  • User admin, kein Passwort

1. Security Profil anlegen

Das meinte ich damit, dass man wissen muss, wie RouterOS funktioniert: Man wird nicht nach dem Passwort gefragt, wenn man sich zu einem WLAN verbindet, sondern man wählt ein vorher konfiguriertes Profil für das WLAN-Interface bevor man sich verbindet.

  • “Wireless” öffnen (links in der Seitennavi)
  • Tab “Security Profiles” öffnen
  • “Add new”, “Name” vergeben, “WPA” und “WPA2” Schlüssel des Ziel-WLANs hinterlegen, mit “OK” speichern und schließen.

2. WLAN-Bridge löschen

  • “Bridge” (links in der Seitennavi)
  • Tab “Ports”
  • Interface “wlan1” öffnen, löschen

3. DHCP-Client einrichten

Ich wollte eigentlich auch den Geräten am Mikrotik von meinem zentralen DHCP-Server eine IP zuweisen lassen. Das habe ich noch nicht hinbekommen (ich vermute die Einstellung aber stark unter “DHCP Relay” statt “DHCP Client”). Stattdessen bekommt der hAP eine IP aus dem WLAN, verteilt an seine Clients aber selber Adressen. Na gut, was solls.

  • “IP” (links in der Seitennavi)
  • im Submenü dann “DHCP Client”
  • bestehende Einträge rauswerfen!
  • neuen Eintrag für das Interface “wlan1” anlegen, “Apply”, “OK”

4. NAT-Einstellungen

  • “IP” -> “Firewall” (links)
  • Tab “NAT”
  • bestehenden Eintrag öffnen, “Out. Interface” auf “wlan1” ändern

5. WLAN-Mode

  • “Wireless” (links)
  • Tab “Interfaces”, “wlan1” öffnen
  • “Mode” auf “station”, unten das Security Profile auswählen, “Apply”
  • “Scan” (oben in der Tableiste) starten
  • Das Ziel-WLAN auswählen, verbinden

6. Last but not least

Zu “Quick Set” (links) wechseln, hier sollte unter “Wireless” (linker Bereich) eine bestehende WLAN-Verbindung (“Status: connected to ess”, und “ess” ist nicht der Name meines WLAN) und unter “Wireless Network” (rechter Bereich) eine IP-Adresse angezeigt werden; letzteres kann einige Sekunden dauern. Gibt es diese Bereiche nicht, steht das Dropdown oben rechts nicht auf CPE, d.h. es ist vorher schon etwas massiv falsch gelaufen.

Internet sollte jetzt erreichbar sein.

Spock: “unexpected token” in multi-line condition

Folgendes setup:

Folgender Fehler, wenn man das finale “true” weglässt:

Spec expression: 1: unexpected token:  @ line 1, column 685.

Man beachte: Der unerwartete Token ist leer 😠 Das Ganze ist eine “known limitation, namely that multi-line conditions don’t always work”, siehe.