Sonntag, 13. Januar 2013

NODEADKEYS mal anders

Früher war alles einfach. Man nahm die X11-Konfigurationsdatei und aktivierte die Option. Heutzutage ist es ... eigentlich immer noch einfach. Man muss nur wissen wie es geht. Nur leider findet man es bekannter maßen mit dem Alter immer lästiger, sich neue Wege für alte Ziele zu merken. Deswegen steht es hier. In /etc/default/keyboard die folgende Zeile eintragen:
XKBVARIANT="nodeadkeys"
Und danach den folgenden Befehl aufrufen:
udevadm trigger --subsystem-match=input --action=change
Steht alles in der keyboard man page. Aber das ist schon wieder so einfach, dass man nicht darauf kommt.

Freitag, 4. Januar 2013

Nach Unterstrich suchen in SQL

SQL bietet das Schlüsselwort LIKE, um Textvergleiche durchführen zu können. Die Syntax ist aber für alle, die reguläre Ausdrücke gewohnt sind, sehr gewöhnungsbedürftig. Eine beliebig lange Zeichenkette wird durch den regulären Ausdruck '.*' abgedeckt. Die Entsprechung in SQL ist das Prozentzeichen '%'. Will man nur ein einzelnes Zeichen abdecken reicht im regulären Ausdruck der Punkt '.' während man in SQL den Unterstrich '_' verwenden muss. Richtig lästig wird es aber erst beim Quoten. Typischerweise stellt sich das Problem bei regulären Ausdrücken für DNS-Namen und URLs. Der richtige reguläre Ausdruck für alle com-Domänen ist also '.*\.com'. Für jeden, der mal was C-ähnliches gelernt hat, a priori klar. Nicht so in SQL, da man in SQL mit dem Schlüsselwort ESCAPE für jeden String das passende Escape-Zeichen definieren muss. Das ist zwar flexibel aber umständlich wie man an dem folgenden Beispiel sieht, dass nach allen englischsprachigen Lokalisierungsbezeichnern sucht.
sqlite> create table locale (l10n text);
sqlite> insert into locale values ('en_US');
sqlite> select l10n from locale where l10n like 'en\_%' escape '\';
en_US

Doppelte finden mit "group by" und "having" in SQL

Das folgende Snipplet zeigt eine Art wie man doppelte in SQL finden kann:
select email, count(email) as dup
from person
group by email
having (dup > 1)