Mit gphoto2 Kameradaten auslesen

Vielleicht für viele Fotofreunde ein alter Hut – ich entdeckte allerdings erst gestern, dass man mit der gphoto2 Applikation unter Linux (auch Mac OS X) einige Daten der digitalen Spiegelreflexkamera auslesen kann, an die man anderweitig nicht so einfach (sprich ohne spezialisierte Tools) herankommt.

Der Befehl

gphoto2 --list-config

lisstet für die angeschlossene (und aktivierte) Kamera alle auslesbaren Optionen an (in einer Art Filestruktur-Nomenklatur). Hier sind 2 Beispiele um die Anzahl der Auslösungen, bzw. die Geräteversion auszulesen

gphoto2 --get-config /main/status/shuttercounter

gphoto2 --get-config /main/status/deviceversion

OpenJDK vs. Oracle Java auf Ubuntu Applikationen

Seltene spontane Abstürze des X.org servers während der Anwendung eines Java Programms, lassen sich unter Ubuntu (12.04 als auch 14.04) auf die standardmässige verwendete Java Virtual Machine OpenJDK zurückführen.
Zumindest deuten dies mehrfach durchgeführte Tests an, die wahlweise OpenJDK und Oracle Java nutzten

Am einfachsten lässt sich Oracle Java über das PPA von webupd8team installieren.

sudo apt-add-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer

Mit der Installation wird auch das sog. alternative-framework unter

/etc/alternatives/

angepasst, so dass sofort der Befehl

java -version

die neuinstallierte Version, bspw.

java version "1.8.0_51"
Java(TM) SE Runtime Environment (build 1.8.0_51-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode)

ausgibt.

Machen Programmen – allen voran freemind – ist das aber nicht genug. Dessen Startskript startet nicht einfach das java Programm, sondert wertet u.a. die Umgebungsvariable $JAVA_HOME aus. Eine pragmatische Lösung lautet daher in ~/.profile

export JAVA_HOME=/usr

einzutragen. Seit dem kompletten Swicht auf Oracle Java 8 hatte ich keinen X-Crash mehr im Zusammenhang mit Java Programmen.

Immer noch kein Open-Document Format für MS-Office auf Mac OS X

Seit MS-Office 2007 SP2 unterstützt MS-Office die Open-Document Formate (OASIS) der freien Office-Welt. Allerdings gilt diese Aussage nicht pauschal. Ausgerechnet die einzige MS-Office Version auf einer UNIX Plattform (MS-Office 2011 für Mac OS X) hat bis heute, trotz einiger Patches (z.B. HDPI/Retina Support) keine Unterstützung für diese Dateiformate – weder lesend noch schreibend.

Ein Armutszeugnis und ganz sicher nicht im Sinne der europäischen Forderungen nach Unterstützung der offenen Dateiformate. Ein weiteres Armutszeugnis daher auch für die europäischen Organisationen – allen voran der EU Kommision – die nichts gegen diesen Zustand unternehmen.

GRUB2 grafischer Bootmanager

GRUB2 reicht mittlerweile aus, wenn man ein neues MacBook Pro entweder mit standardmässig vorhandenen Mac OS X oder mit Linux booten möchte. Die Hilfe von rEFIt oder dessen Nachfolger benötigt man nicht mehr.
Sehr ansprechend ist der Bootmodus von GRUB2 allerdings nicht – speziell auf einem High-DPI MacBook Pro erscheint die textuelle Auswahl winzig.

Daher entschied ich mich eine – möglichst einfache – grafische Konfiguration zu erstellen. Eine perfekte Quelle um damit anzufangen sind die GRUB2 Seiten auf dem Wiki Ubuntuusers.

Gestartet wird mit einem Thema – ich nenne es mal dualboot – und dem Anlegen eines gleichnamigen Verzeichnis in


/boot/grub/themes/dualboot

Maßgeben dort ist das grafische Layout – bei dem übrigens die Einträge nur vertikal angeordnet werden können. Ohne weitere Erklärung sieht dieses File folgendermaßen aus:


# thema dualbook
# speziell für die mobile workstation myHost entworfen
# Basis war das Thema "ubuntuusers.de"

# globale Einstellungen:
# ----------------------

# Notwendig um den Standardtext zu deaktivieren
title-text: "welcome on myHost - mobile workstation"
title-font: "Ubuntu Regular 72"

# Notwendig für Standardschrift im Terminal
terminal-font: "Unknown Regular 16"

# Hintergrundbild
desktop-color:"#9ba9bf"

# Beginn Komponentenliste:
#-------------------------

+ boot_menu{
# Position des ersten Menüeintrags
top = 400
left = 800
height = 1200
width = 1000

# Schrift der Menüeinträge
selected_item_color = "black"
item_color = "#888888"
item_font = "Ubuntu Regular 40"
selected_item_font = "Ubuntu Regular 40"

item_height = 314
item_width = 800
item_spacing = 20

icon_height = 314
icon_width = 265
item_icon_space = 40
}

Die benötigten Schriften (hier Ubuntu Regular), muss man pro Größe einzeln als .pf2 Datei mittels dem Kommando grub-mkfont erzeugen.

Die Icons müssen im ordern dualboot/icons abgelegt werden. Ich habe hier jeweils ein transparentes Icon für Linux und für Mac OS X mit der vertikalen Größe von 314px abgelegt. Der Dateiname (ohne Suffix) entspricht dabei dem class Namen des sog. menuentry in der Datei /boot/grub/grub.cfg welche allerdings generiert wird.
Daher muss bspw. die Datei /etc/grub.d/40_custom folgendermaßen angepasst werden:

menuentry "Mac OS X" --class MacOS {
exit
}

In /boot/grub/themes/dualboot/icons/ liegt die Datei MacOS.png

Zuletzt muss die globale GRUB2 Konfigurationsdatei noch angewiesen werden, dieses Thema auch zu benutzen, daher gibt es in der Datei /etc/default/grub folgende Einträge:


GRUB_GFXMODE=2560x1600
GRUB_THEME=/boot/grub/themes/acrux/theme.txt

Zudem habe ich noch die sinnlosen auto-detection Einträge von GRUB2 für Mac OS X (32- und 64-bit) entfernt:


# prevent GRUB internal Mac entries
GRUB_DISABLE_OS_PROBER=true

Mit diesen Anpassungen erscheint der Bootmanager grafisch ansprechend auf dem Niveau von rEFIt, welches jahrelang zuvor den Standard gesetzt hat.

Posix Threads unter Linux und deren ID’s

Nach ein paar Monaten Abstinenz von der Welt der POSIX Threads fällt es immer wieder schwer, die ID’s in den richtigen Kontext zu bringen. Deshalb räumt dieser Beitrag nochmal auf.

  • PID/TGID
    Die Process Identification Number ist im Falle von gethreadeden Programmen auch gleichzeitig die Thread Group Identifcation Number. Pro Executable gibt es nur eine solche Nummer, die alle Threads zurückliefern können
  • TID
    Da Linux alle Threads als eigenständige Prozesse (LWP=Lightweight Processes) ansieht, verwaltet der Kernel eine eigene Prozessnummer – die Thread Identication Number. Um den Balanceakt der Unterscheidung zwischen Prozessen und Threads besser zu meistern, kann der Begriff der Kernel Scheduling Entity (KSE) benutzt werden.
  • (Posix) Thread ID
    Diese 32bit Nummer stellt eine eindeutigen POSIX-konformen thread Identifier her. Neben der eigentliche pthreads Verwaltung wird auch in der SW Entwicklung mit den gängigen Tools diese ID gerne benutzt.

Das Einprägen dieser o.g. Definitionen wird einem allerdings durch zahlreiche Monitoring Tools – die sich auf das virtuelle Filesystem proc stützen – nicht gerade erleichert. So zeigen Tools wie htop unter PID eigentlich die TID an. Dafür gibt es einen extra Spalte TGID (welche natürlich das gleiche darstellen sollte als PID). Posix Thread ID fehlt dafür gänzlich.

Eine anschauliche Illustration der Thematik bietet folgendes Programm an:


/*
* gcc -o pthreads_id pthreads_id.c -lpthread
*
* This programs shows the difference of
* 1. The PID (Process ID of the kernel, aka TGID Thread Group ID)
* 2. The TID (Thread ID of the kernel, subsequent number of main threads PID)
* 3. The Posix Thread ID
*/
#include #include
#include
#include
#include

pthread_t ntid;

void printids(const char *s){
pid_t pid;
pid_t tid;
pthread_t ptid;

pid = getpid();
tid = syscall(SYS_gettid);
ptid = pthread_self();
printf("%s pid %u tid %u thread_id %u (0x%x)\n",s,(unsigned int)pid,(unsigned int)tid,(unsigned int)ptid,(unsigned int)ptid);
}

void* thr_fn(void* arg){
printids(" new thread: ");
return((void*)0);
}

int main(void){
int err;
err = pthread_create(&ntid,NULL,thr_fn,NULL);
if(err!=0) printf("can't create thread: %i\n",strerror(err));
printids("main thread: ");
sleep(1);
exit(0);
}

Fallgrube bei truecrypt Eintrag mittels visudo

Immerwiederkehrende Eingabeaufforderungen des Administratorpasswortes bei Benutzung von truecrypt als User ohne Adminrechte sind ein Ärgernis. Um diese loszuweren, muss ein Eintrag im sudoers file erzeugt werden, der dem Program das mounten von Filesystemem erlaubt.

$USER ALL=NOPASSWD:/usr/bin/truecrypt

Dieser kann natürlich direkt im sudoers file mittels

sudo visudo

eingetragen werden. Allerdings ist dann die Platzierung des Eintrag essentiell. Wird er nicht ziemlich am Ende eingetragen, könnte eine andere Regel (bspw. diejeniege der sudo Gruppe) die o.g. ausser Kraft setzen. Eine noch elegantere Lösung bieten Ubuntu (LTS) Syteme an. Diese lesen nämlich am Ende der Datei mittels der #includedir Direktive das Verzeichnis /etc/sudoers.d aus.

Wenn man dort die o.g. sudoers Anweisung in eine beliebige Datei einträgt (ich habe einfach die Datei truecrypt genannt) und diese mit den Rechten 0440 ausstattet (siehe /etc/sudoers.d/README) ist alles paletti und man muss sich auch bei ev. updates des sudoers package keine Sorgen machen.

core file handling unter Ubuntu

Wer sich als SW Entwickler auf einer Ubuntu LTS Plattform wundert, wo den die core files geblieben sind, welche das OS erstellt wenn Programme bestimmte Signale (SIGSEGV,SIGABRT,SIGQUIT,….) empfangen, der sollte mal den Inhalt von

/proc/sys/kernel/core_pattern

anschauen. Der Inhalt

|/usr/share/apport/apport %p %s %c

mit dem einleitenden pipe character, legt fest das entstehende core files direkt als stdin stream dem frontend Programm apport zur Verfügung stehen. Auf der Ubuntu Wiki Seite über das Programm apport ist erklärt, wie das Programm die core Informationen dem User präsentiert. Das Programm führt unter

/var/log/apport.log

alle events. Dort klärt sich auf das Phänomen auf, das core’s von bestimmten Programmen (z.B. im Home-Bereich) ignoriert werden. Prinzipiell werden nur core’s von packetierten Programme oder von Launchpad Applikationen ausgewertete und somit unter /var/crash abgelegt.

Bei eigenen Programmen gibt es die Möglichkeit die Einstellungen von apport in

/etc/apport/crashdb.conf

mit bspw. hooks zu erweitern, oder das Program unterhalb der /opt Struktur abzulegen. Eine Diskussion über das Thema in Bezug auf eigene Programme findet man auf dieser askubuntu Seite.
Die von apport mit weiteren Informationen angereicherten core files, werden zu sog. crash files unterhalb von /var/crash, welche bspw. mit dem Programm apport-retrace untersucht werden können (backtraces ,etc..)

Downgrade eines SW Pakets unter Ubuntu

Ein Downgrade eines Paketes unter Ubuntu geht prinzipiell sehr einfach. Der Befehl

sudo apt-get install <PACKAGE>=<VERSION>

würde das Paket auf die gewünschte downgraden. Die Frage ist allerdings wie genau die Version heisst und ob sie überhaupt noch von den offiziellen Servern bereitgestellt wird.
Um das herauzubekommen wird der Befehl

apt-cache show <PACKAGE>

ausgeführt. Dieser zeigt blockweise die verfügbaren Versionen auf – der Versionsstring ist daher eher opulent, bspw. Version: 4.9.1.1-1ubuntu0.1
Falls sich die gewünschte Version hier allerdings nicht mehr befindet, so kommt man um ein manuelles de- und reinstallieren des/der Paket(e) nicht herum.

Qt Delegate’s und QDialog

Dieser Artikel beschreibt ein Problem beim Aufruf eines QDialog’s durch den Delegate Mechanismus von Qt 4.
Beim Schliessen eines QDialog’s durch einen Accept oder Reject Button wird ab
qdialog.cpp:577f.

hide();
setResult(r);

ausgeführt. Das Problem ist hier die Reihenfolge – denn
QItemDelegate::eventFilter
prozessiert das hideEvent() und leitet via commitData()
auf qabstractview.cpp:2765

delegate->setModelData()

über, der in einem Nachlauf des eigenen Codes den Result-Wert des Dialogs kennen muß, um Werte des Dialogs entweder zu übernehmen oder zu verwerfen.

Ein schneller und valider Workaround ist das Schliessen des Dialogs abzufangen und setResult() als erstes zu setzen.

UTF-8 Dateinamen: Linux vs. Mac OS X (Stand 2014)

Wie schon vor 8 Jahren beschrieben gibt es auch heute immer noch Probleme beim Austausch von Dateien, deren Dateinamen Buchstaben jenseits des ASCII Zeichensatzes beinhalten.

Die Situation hat sich bis heute in 2 Punkten geändert.

  1. die UTF-8 Form D unterstützung in Linux ist beinahe perfekt. Die Dateimanager zeigen die Dateien mit den zusammengesetzen Buchstaben richtig an
  2. Mac OS X Mavericks geht jetzt bei NFS mounts davon aus, dass die Dateinamen Form C dekodiert sind (was bei Linux NFS Server ja richtig ist).

Leider gibt es immer noch eine Menge Lücken, bspw. der Austausch von ext3 Datenträgern zu Mac OS X via Paragon ExtFS for Mac OS X, welches keine Konvertierung vornimmt und daher Form C Dateien direkt an Mac OS X weitergibt, deren Programme dann mit diesen Dateien nicht umgehen können.