VirtualBox & Parallels – brigded Network mit IPv6 Problemen

UPDATED: Ursprünglich befasste sich dieser Artikel nur mit einem Fehler der auf VirtualBox auftrat. Da er aber mit der Virtualisierungssoftware Parallels in der gleichen Form auftritt, wurde er überarbeitet und mit einer genauerer Analyse versehen.

VirtualBox & Parallels – brigded Network mit IPv6 Problemen weiterlesen

lifetime von kerberos tickets

Manchmal könnte es passieren, das bspw. der NFSv4 Zugriff nicht mehr klappt, da das authorisierende kerberos ticket nicht mehr gültig ist. Mittels dem Kommando

klist

würde man dann eine Expiration erkennen.

Die grundsätzliche maximale Lebensdauer, sowie die maximale Zeit, in der der Client eine Erneuerung selbstständig durchführen kann, ist serverseitig in der Datei /etc/krb5kdc/kdc.conf festgelegt.

max_life = 1d
max_renewable_life = 14d 0h 0m 0s

wäre ein Beispiel, wobei der zweite Einträg extra die möglichen syntaktischen Möglichkeiten darstellt.

lifetime von kerberos tickets weiterlesen

unliebsame Überraschungen beim NFS Export

Wenn im heimischen LAN IPv4 und IPv6 zum Einsatz kommt, müssen Dienste auch beide Verbindungsarten unterstützen. Gerade bei einem NFS Server wird traditionell in der Datei

/etc/exports

gerne ein IPv4 Subnetz bei den erlaubten Hostzugriffen angegeben. Dies führt aber dazu, dass host-Anfragen mittels IPv6 Verbindungen dann abgelehnt werden, obwohl die IPv4 Adresse des anfragenden hosts für einen Zugriff freigeben wäre. Abhilfe schafft da die Angabe von domain-Namen. Dies wiederum bedingt aber einen funktionierenden DNS der sowohl IPv4 als auch IPv6 Adressen – auch reverse – auflösen kann. Im Falle einer kerberos Sicherung von NFSv4 muss dies aber eh der Fall sein.

PDF Dateien von MS Word und die falsche Schriftarten

Text_if_Arial_is_installed_on_Linux

Seitdem MS Word die Option anbietet Dateien auch als .pdf Datei zu speichern, treten vermehrt Anzeigeprobleme zu Tage. Um genau zu sein: Auf Plattformen, welche die typischen MS FontsArial und Times New Roman nicht installiert haben.

Text_if_no_Arial_is_installed_on_Linux

So ergibt sich in diesen Fällen aus einem einfachen Text, der in der Schriftart Arial geschrieben wurde, ein ziemlich anderes Erscheinungsbild auf dem Adobe Reader unter Linux oder Solaris

ActualFont in Adobe Reader if no Arial is installed

Der Grund dafür ist, dass die Speichern unter.. Funktion von MS Word diese Schriftarten nicht einbettet, sondern nur darauf referenziert. Das Anzeigeprogramm muss dann eine Ersetzungstabelle anwenden, bei der die Originalschriftart durch eine – möglichst ähnliche – ersetzt wird. Das dies mit Adobe Sans MM nicht unbedingt gelingt, dürfte bei der obigen Darstellung klar sichtbar sein.

Wir reden übrigens von Einsparung von 50kB. Das ist marginal, vor allem angesichts der Tatsache, dass gerade Microsoft eher als Ressourcenfresser bekannt ist.

Der Grund liegt eher darin, dass die Tradition sich der Interoperabilität zu verschließen, auch heutzutage weitergeführt wird. Glücklicherweise lässt sich das Einbinden der Schriften erzwingen wenn man in den Optionen des Speichern unter.. Dialog den Modus ISO 19005 – PDF/A anwählt. Dieser Standard zur Langzeitarchivierung von pdf Dateien schreibt das Einbetten der Schriften vor.

ActualFont in Adobe Reader on OS X

Unter Mac OS X tritt das Problem nicht auf. Der Grund hierfür ist, dass zwar die Original Truetype Schriftart Arial auch nicht installiert ist, aber sehr wohl die Type 1 Schriftart ArialMT, die Zeichenkompatibel zu der originalen Arial Schriftart ist.

CalibriFont is embedded as a subset

Interessanterweise tritt das Phänomen wirklich nur mit den klassichen MS Fonts auf. Ist der Text mit einem von den neueren, von Microsoft progragierten, Fonts, wie Calibri formatiert wird die Schriftart eingebetten. Zumindest alle Gylphen (Zeichen) die im Text vorkommen, daher Embedded Subset.

Punkt oder Komma

Wenn ein Program dass Gleitkommazahlen von einer oder in eine Textdatei liest, bzw. schreibt nicht mehr funktioniert, dann sollte man sich genauer mit LC_NUMERIC befassen. Dieser Artikel behandelt die Auswirkungen auf Qt- und reine C-Programme.

LC_NUMERIC ist Bestandteil der sogenannte locales, der Lokalisierungen (oder auch Regionalisierungen) auf einem System. Diese Lokalisierungen lassen sich sehr fein einstellen – bspw. LC_MONETARY für die Währung oder eben LC_NUMERIC für das Zahlenformat – aber auch zusammenfassend mittels LC_ALL. Setzt man bspw. LC_ALL=de_CH.UTF-8, dann wird diese Einstellung auf alle sublocales übertragen und für LC_MONETARY ist der Franken gesetzt, wenn auch das meiste andere ziemlich deutsch ist.

Ok, nun aber zum Zahlenformat – und um die Sache ein bischen zu beschleunigen, soll eine Textdatei mit folgendem Inhalt ausgelesen werden.

#Hallöle
33.456,78
33456.78
33,456.78
33,99
33.98
33.777

Um die Zahlen besser zu verstehen muss noch einmal ausgeholt werden. LC_NUMERIC legt zwei Parameter fest.
Den Dezimaltrenner und den Tausender-Trenner. Er wird folgendermassen gesetzt:

Locale Dezimaltrenner Tausender-Trenner
en_US . ,
de_DE , .
C .

Das bedeutet, dass die deutsche Lokalisiserung genau andersherum als die US-Amerikanische ist. Die sog. C-Locale (auch POSIX-Locale genannt) kennt nur den Dezimaltrenner. Diese Locale ist als Rückfallebene gedacht.

Wie verhält sich nun ein Qt-Programm (Qt4), dass die o.g. Textdatei zeilenweise einliest und versucht den Text in Zahlen zu konvertieren? Zuerst einmal wird ein Testprogram unter der Umgebung LC_NUMERIC=de_DE.UTF-8 gestartet.

localeTest_de

Die Erklärung ist überrasch komplex. Zuerst einmal muss festgestellt werden, dass Qt Programme generell LC_NUMERIC-aware sind. Dies wird dadurch erreicht, dass QCoreApplication

setlocale(LC_ALL,"");

aufruft und damit locales aus dem Environment dem Programm zur Verfügung gestellt werden (dies wird durch die doppelten Anführungszeichen erreicht). Dennoch werten nicht alle Qt-Methoden LC_NUMERIC aus.

QByteArray::toDouble()
ignoriert die gesetzte locale und benutzt immer die C-Locale.

QString::toDouble()
verhält sich am kompliziertesten. Es wird der Dezimaltrenner der gesetzten locale ausgewertet, nicht aber der Tausender-Trenner (die Gründe liegen in der Kompatibilität zu C, siehe später). Gleichzeitig wird die C-Locale immer als Fallback mitausgewertet. Bei Qt5 verhält sich übrigens QString::toDouble wie QByteArray::toDouble

QLocale::toDouble()
hingegen orientiert sich ausschliesslich an der gesetzten locale.

Zum Vergleich nun die Ausgabe unter dem Environment LC_NUMERIC=en_US.UTF-8

localeTest_en

Interessant ist nun der Vergleich zu reinen C-Programme. Denn reine C-Programme mit ihren typischen Funktionen

printf/fprintf
scanf/fscanf
strtof

..usw. ignorieren standardmässig die gesetzte locale und stützen sich immer auf die C-Locale. Erst durch den schon oben genannten Aufruf von setlocale werden C-Programme locale-aware.
Werden allerdings C-Funktionen – bspw. aus einer Bibliothek – von einem Qt-Programm verwendet, sind sie automatisch locale-aware, da ja wie schon erwähnt QCoreApplication setlocale aufruft.

Dies ist eine große potentielle Fehlerquelle!

Um den Bogen zu QString::toDouble() nochmals zu spannen, sei erwähnt, dass C-Funktionen den Tausender-Trenner standardmässig ignorieren. Um z.B. printf zur Ausgabe des Tausender-Trenners bei Gleitkommazahlen zu zwingen, muss man

printf("Gezwungen zu %'f",myfloat);

einen Abostroph vor dem Formatierungszeichen einführen.
Zum Ausprobieren liegt das Qt Beispielprogramm sowie zwei plain C-Programme im diesem Archiv bei

Kommando in bash kann nicht starten obwohl ‚which‘ es findet

Manchmal liegen Programme in verschiedenen Versionen vor und verlangen nach einem Ansatz der es erlaubt die verschiedenen Versionen relativ einfach zu starten.
Eine Möglichkeit ist es die PATH Umgebungsvariable so zu setzen, dass mehrere Verzeichnisse die das Programm beinhalten gelistet sind, z.B.

PATH=~/binNeu:~/binAlt

Ein fikives Programm testMe ,würde nun aus ~/binNeu starten. Wenn man nun temporär dieses Verzeichnis umbenennt, sollte testMe aus ~/binAlt gestartet werden.
Tatsächlich wird das auch vom which Kommando so angezeigt. Bei der Ausführung von testMe, gibt die bash erstaunlicherweise die Fehlermeldung aus, das ~/binNeu/testMe (!) nicht gefunden wird.

Grund dafür ist eine Cache-Hashtable welche die bash am Anfang anlegt um einen Programmstart zu beschleunigen. Und genau diesen muss man in diesem Fall mit folgendem Kommando löschen.

hash -r

Alternativ könnte man auch das File sourcen, welches direkt oder indirekt die PATH Variable setzt, oder schlicht die bash schließen und neustarten.

stty -a < /dev/ttyS....

hängt? Ebenso der Befehl

echo „hallo“ > /dev/ttyS…

?? Dann ist wahrscheinlich die Data Carrier Detect Line (DCD) auf High, so dass diese beiden Kommandos auf ewig warten bis die DCD auf Low schaltet.

Umgehen kann man das bei dem ersten Befehl mit

stty -a -F /dev/ttyS...

Dieser benutzt beim open den O_NDELAY Flag, welcher gleichbedeutend zum O_NONBLOCKING ist.
Prinzipiell sollte man aber bei der termios Struktur das c_cflag CLOCAL setzen, welches die Modem Status Lines ignoriert. Wird dieses Flag nicht gesetzt und schreibt die termios Struktur mittels tcsetattr an die serielle Schnittstelle zurück, hat DCD high und obiges Problem tritt auf.

Qt Creator 2.2

Die kontinuierliche Verbesserung der Qt IDE Creator bringt nun in der aktuellen Version 2.2 ein wirklich sehr nützliches Feature bzgl. Teamfähigkeit – Die Editoreinstellungen können projektweise vorgenommen werden.
Hört sich unspektakulär an, bringt Creator aber in komplexen Setups wesentlich besser ins Spiel und ist mir zumindest ein Blogeintrag wert 🙂

praxis tipps: Pfad der .icc Dateien

Die 10. Suchaktion nach den .icc files auf meinen Rechnern, ist der Anlass diese Zusammenfassung zu schreiben:

Auf Mac OS X werden die .icc’s in folgenden Pfaden abgelegt:

global:
/Library/ColorSync/Profiles/
lokal:
~/Library/ColorSync/Profiles/

ev. existiert unterhalb dieser Verzeichnisse noch ein Display directory.

Auf Linux und Solaris gibt es keine Regel, d.h. der File Hierarchy Standard gibt keine Richtlinie aus – wohl aber haben sich Standardpfade eingebürgert, welche auf der OpenIccDirectoryProposal Webseite ausführlich dargelegt sind. In Kürze sind das:

global:
das Unterverzeichnis /color/icc der Verzeichnisse aus den Systemvariablen
$XDG_DATA_DIRS
$XDG_CONFIG_DIRS

..also normalerweise..
/usr/share/color/icc
/usr/local/share/color/icc
..oder eventuell auch..
/var/lib/color/icc

lokal:
$XDG_DATA_HOME/color/icc
normalerweise: ~/.local/share/color/icc

$XDG_CONFIG_HOME/color/icc
normalerweise: ~/.config/color/icc

auch hier können sicher unterhalb dieser Verzeichnisse Subdirectories, bspw. device befinden.

Serielle Schnittstelle ohne internen UART

Im Bereich Messen, Steuern, Sensorik gibt immer noch die serielle Schnittstelle den Ton an.

Dumm nur, dass dieses Randpublikum kaum noch durch Hardwarehersteller bedient wird. Bei Laptops gibt es nur noch selten eine serielle Schnittstelle, bei Desktops teilweise auch nicht – oder zumindest wird kein D-Sub Stecker mehr von aussen zum UART (Serieller Baustein) des Mainboards verbaut.

Die Funktionalität muss daher durch andere Schnittstellen geführt werden und kaum etwas eignet sich schlechter als der Universal Serial Bus. Fast alle USB->Serial Kabel können höchstens ein paar Bytes über die Leitung kriegen. Sobald Timing oder Duplex-Verkehr gefragt ist, sind diese Kabel mit Chipsätzen von Prolific (ganz schlecht) oder FTDI überfordert.

Abhilfe schafft ein Transfer über den PCI Bus, bspw. mit einer ExpressCard.

Die DeLock 66217 ExpressCard34 arbeitet genauso so gut wie die interne Schnittstelle meines Desktop Rechners.
Die Karte benutzt die PCI-Express Verbindung der ExpressCard. In Ihr arbeitet ein Oxford Semiconductor Chip kompatibel zu 16C950 UART

Der Linux Treiber heißt 8250_pci, der aber die Kartenerkennung für diesen Chip erst seit Kernel 2.6.28 besitzt:

Vendor 1415 (Oxford Semiconductor Ltd.)
device c138

Mein openSUSE 11.0 System konnte daher nichts mit der Karte anfangen, erst ein Upgrade auf openSUSE 11.2 brachte das ganze ohne weiteres Eingreifen zum Laufen (8250_pci ist dort statisch in den Kernel einkompiliert und erfordert daher nicht die Kerneleinstellung CONFIG_EMBEDDED, siehe:
http://cateee.net/lkddb/web-lkddb/SERIAL_8250_PCI.html
Dass die Karte, die PCI Verbindung zum ExpressCard Slot benutzt sieht man schon an lspci, welcher den IRQ18 für den UART benutzt.

Die Karte hätte es übrigens in gleicher Bauform auch ein bischen billiger über die USB 2.0 Schnittstelle gegeben – DeLock 66211
Sehr wahrscheinlich mit allen gleiben Defiziten, wie die USB->Serial Kabel…