VMware – config-Datei nach Kernel-Update

In einem Beitrag zur VMware Workstation habe ich beschrieben, was man tun muss, wenn man ein Update des Kernels durchführt. In noch früheren Beiträgen standen Rezepte zur manuellen Vorgabe der CPU-Taktung für VMware in der Datei /etc/vmware/config. (Dies ist für den ordentlichen Betrieb auf manchen Prozessoren wichtig).

Ich vergaß, in beiden Beiträgen Folgendes zu erwähnen: Ein Durchführen der Prozedur “vmware-config.pl”

  • nach einem Kernel-Update
  • oder wenn man Veränderungen an den VMware-Basiseinstellungen wie dem virtuellen Netzwerk vornehmen will

führt zu einer Neuerzeugung der Datei “/etc/vmware/config”. Dabei verliert man i.d.R. alle schönen und mühsam erarbeiteten Einträge der Art

host.cpukHz = 2412359
host.noTSC = TRUE
ptsc.noTSC = TRUE.

Daher nun nachträglich der Hinweis:

Immer eine eigene Sicherung der “/etc/vmware/config” mit allen erarbeiteten eigenen Parametern anlegen. Nach der Durchführung von “vmware-config.pl” den Stand der “config”-Datei prüfen und die Parameter ggf. wieder nachtragen.

Das ist zugegebenermaßen unangenehm. Ich kenne aber keinen Weg, das zu vermeiden. Es liegt nahe, ein kleines Script zu schreiben, das wenigstens die Editierarbeit für einen erledigt.

PHP5 – dynamische Variable – superglobale Arrays

Gestern bin ich an einem kleinen aber interessanten Problem in der PHP-Programmierung hängen geblieben. Manchmal gibt es Situationen, in denen man mit einer dynamisch erzeugten Variablen – also einer Variablen, deren Bezeichnung erst zur Laufzeit festgelegt wird – eine Aufgabe schnell in den Griff bekommt. In meinem Fall versuchte ich, in einem Objekt eine dynamische Variable zu verwenden, die sich situationsbedingt entweder auf das _GET oder das _POST – Array beziehen sollte. Dies misslang zunächst – das Thema ist daher vielleicht auch für andere interessant. Es geht also um die Kombination von dynamischen Variablen mit superglobalen Arrays. Der Reihe nach:

Voraussetzung – Erzeugung von dynamischen Variablen

Einfache dynamische Variable
erzeugt man über folgenden Mechanismus

$dyn = “anracon”;
$$dyn = “anracona”;
echo ” \$dyn hat den Wert: ” . $dyn . “<br>”;
echo ” \$anracon hat den Wert: ” . $anracon . ” ( = identisch mit \$\$dyn : ” . $$dyn . ” ) <br>”;

Dynamische Array-Variable
sind etwas anders zu behandeln. Man beachte die geschweiften Klammern:

$dyna = “ay_anracon”;
${$dyna}[0] = “anracona”;
echo “\$dyna hat den Wert: ” . $dyna . “<br>”;
echo “\$ay_anracon[0] hat den Wert: ” . $ay_anracon[0] . ” ( = identisch mit \${\$dyna}[0] : ” . ${$dyna}[0] . ” ) <br>”;

(Das Ganze geht natürlich auch mit assoziativen Arrays).

Hinweis: Man könnte bei der Erzeugung dynamischer Variable zur Not auch mit der “eval”-Funktion arbeiten – das ist aber wirklich umständlich, total unsicher und wir lassen das der Übersichtlichkeit halber einfach weg.

Dynamische Bezugnahme auf “Superglobale Arrays”

Man übergibt einem Programm die GET-Variable “snr” – Bsp.: get_parameter.php5?snr=100

Enthält das Programm auf oberster Ebene (also nicht in einer Subfunktion oder einer Methode eines Objekts) folgenden Code:

$b = true;
$ind = ‘snr’;
echo ” get_parameter = ” . $_GET[$ind] . “<br>”;
if($b) { $sgv = “_GET”; }
else { $sgv = “_POST”; }
echo ” get_parameter = ” . ${$sgv}[$ind] .”<br>” ;

so erhält man zwei identische Outputzeilen mit dem Inhalt “getparameter = 100”. Die Bezugnahme der dynamischen Array-Variablen ${$sgv} auf das “_GET”-Array funktioniert also wie erwartet.

Bezugnahme auf “Superglobale Arrays” in Objektmethoden

Hat man im Programm eine Klasse und ein zugehöriges Objekt definiert, so kann man mit einer Objektmethode direkt auf das GET-Array zugreifen, da es superglobal ist und sein Geltungsbereich daher nicht mit dem “global”-Statement spezifiziert werden muss. Folgendes funktioniert also innerhalb des Programms “get_parameter.php5”:

class GetParam
{
var $gp;
function __construct()
{
$this->gp = $_GET[‘snr’];
}
}
$Ob = new GetParam;
echo ” get_parameter = ” . $Ob->gp . “<br>”;

Dynamische Bezugnahme auf “Superglobale Arrays” in Objektmethoden

Folgendes geht jedoch nicht – trotz superglobaler Gültigkeit des “_GET”-Arrays:

class GetPar
{
var $gp;
function __construct()
{
$b = true; // Nur als Beispiel
if($b) { $sgv = “_GET”; }
else { $sgv = “_POST”; }
$this->gp = ${$sgv}[‘snr’];
}
}
$Obj = new GetPar;
echo ” get_parameter = ” . $Obj->gp . “<br>”;

Denkt man etwas darüber nach, so kommt man auf folgende Vermutung: Woher soll der Interpreter wissen, dass er eine globale Variable vorsehen muss? Er wird sich schon aus Sicherheitsgründen vielmehr auf einen lokalen Gültigkeitsbereich der dynamischen Variablen zurückziehen. Dann sollte aber Folgendes helfen:

class GetP
{
var $gp;
function __construct()
{
$b = true; // Nur als Beispiel
if($b) { $sgv = “_GET”; }
else { $sgv = “_POST”; }
//
global ${$sgv};
//
$this->gp = ${$sgv}[‘snr’];
}
}
$GP = new GetP;
echo ” get_parameter = ” . $GP->gp . “<br>”;

Tatsächlich erhält man nun den gewünschten Output. Das “global”-Statement ist zwar wirklich nicht schön. Aber bei einer Bezugnahme auf ein superglobales Array kann man diese stilistische Unsauberkeit vielleicht verzeihen.

Abschließende Anmerkung

Ziel dieses Beitrags war es, darauf hinzuweisen, dass man innerhalb von Objektmethoden mit Hilfe dynamischer Variablen nicht ohne weiteres auf superglobale Arrays zugreifen kann. Scheut man das erforderliche “global” – Statement, so muss man seien Lösungen von vornherein anders konzipieren – was in der Regel sicher möglich ist.

(In meinem Fall wollte ich zu Prüfzwecken aus dem Objekt heraus einen direkten (!) Zugriff auf die Arrays ohne Zwischenvariablen gewährleisten und trotzdem die Wahl zwischen _GET und _POST haben.)

Nvidia driver 173.14.05 – Positives – Negatives

Ich habe vor kurzem den Nvidia Treiber 173.14.05 über ein rpm aus dem SuSE Repository installiert. Meine Erfahrungen sind durchaus gemischt:

Positiv: Compiz Fusion läuft gefühlsmäßig besser und spritziger, wenn die dortige “Sync to Vblank” Option aktiviert ist. Hier ist das Zusammenspiel zwischen Nvidia-Treiber und Compiz irgendwie harmonischer geworden.

Negativ: Andererseits sieht man dramatische FPS-Einbrüche für glxgears (von über 14000 Fps runter auf unter 2000 Fps). Im Nvidia Forum meinte ein User, das sei mit der Version 173.14.09 wieder besser. Wir werden sehen.

Negativ: Eine ärgerliche Kleinigkeit: Ohne Zusatzmaßnahmen zeigt die Applikation “nvidia-settings” jetzt beim Aufruf des Menüpunktes “X Server Display Configuration” folgende Fehlermeldung:

******
Unable to load X Server Display Configuration page:

Failed to parse the following modeline of display device
0x00010000 ‘Samsung SyncMaster’ connected to GPU-0 ‘GeForce 7800 GTX’:

source=edid :: “nvidia-auto-select” 154.000 1920 1968 2000 2080 1200 1203 1209 1235 +HSync -VSync

******

Man kann das beheben, indem man “nvidia-settings” jetzt mit folgendem Zusatz startet:

LANG=C nvidia-settings

FPDF und PHP – erste Erfahrungen

Ich habe vor kurzem die Aufgabe erhalten, mit PHP PDF-Dokumente zu generieren, die auf den Einträgen in einer Datenbank basieren. Möglichst kostengünstig. Der Griff zur PFDlib war wegen der relativ hohen Kosten für kommerzielle Zwecke also nicht möglich. Zudem behagte mir die PDFlib auch nicht, da sie als Modul im Webserver (Apache) integriert werden muss. Das wäre bei dem Web-Service-Provider, der die Domaine meines Kunden hostet, dann eher ein Problem geworden.

In meiner Not habe ich dann zur Opensource Bibliothek “FPDF” (http://www.fpdf.de/) gegriffen. Die dortigen (objektorientierten) Bibliotheken benötigen nur PHP und werden nicht als Apache-Module geladen. Ich muss nach ein paar Tagen produktiver Arbeit feststellen, dass ich mit der Bibliothek sehr positive Erfahrungen gemacht habe:

1) Die Installation ist sehr einfach.
2) Die Doku ist knapp bemessen, aber verständlich und letztlich ausreichend. Ein Blick in die Online-Tutorials mit den dortigen Beispielen ist sehr hilfreich.
3) Die Einbindung und Erweiterung der zu nutzenden Bibliotheks-Objekte in eigene PHP-Objekte und Methoden ist auf bequeme Art und Weise möglich.
4) Die Methodenaufrufe zur Gestaltung des PDF-Dokumentes sind zwar begrenzt, dafür aber sehr einfach zu verstehen und anzuwenden.
5) Footer und Header-Methoden sind einfach für die eigenen Zwecke zu überschreiben.
6) Tabellarische Inhalte lassen sich sehr bequem erstellen.
7) Die Geschwindigkeit bei der PDF-Erzeugung ist zumindest für einfache Zwecke ausreichend.
8) Es wird nicht zuviel versprochen – die angebotenen Methoden funktionieren.

Etwas umständlich ist die Einbindung von Truetype-Schriften und die zugehörige Erzeugung der metrischen Informationsdateien. Hier dem User etwas kompaktere Tools anzubieten, wäre nicht schlecht.

Aber alles in allem: eine empfehlenswerte Bibliothek für Leute, die PDF-Dokumente mit PHP erzeugen wollen und nicht zur PDFlib greifen können.

Thunderbird und verschlüsselte Mail-Anhänge

Als Linux-Anwender verwende ich neben Kmail manchmal Thunderbird unter Linux. Dort wird zur Verschlüsselung die Linux-OpenPGP Software herangezogen. Unter Windows hingegen kommt das Enigmail Plugin mit der OpenPGP Software im Hintergrund zum Zuge. Hier gibt es ein kleines Problemchen, dass auch für Linux Anwender als Verfasser verschlüsselter Mails interessant ist, wenn der Empfänger Windows Anwender ist.

Ein Bekannter, der Thunderbird unter MS Windows einsetzt, hatte nun das Problem, dass er Anhänge von Mails, die ich ihm verschlüsselt geschickt hatte, nicht öffnen konnte. Vielmehr erhielt er die Fehlermeldung “IMAP-Nachricht ist zu groß zum Entschlüsseln”. Man möge es mir glauben: Die Mail und der Anhang waren winzig. Unter Linux hatte ich dieses Problem nicht. Der Kollege greift tatsächlich, wie die Fehlermeldung es andeutet, auf einen IMAP-Server zu.

Als Ursache entpuppte sich eine Einstellung des Enigmail Plugins unter Windows. Klickt man in Thunderbird unter MS-Windows den Menüpunkt “OpenPGP” an, und geht man dann weiter zu “Einstellungen” und zum Reiter “Erweitert”, so findet man eine Checkbox für den Punkt

“Anhänge nur herunterladen, wenn diese geöffnet werden sollen (nur bei IMAP)”.

Dieser Punkt muss deaktiviert werden, wenn die Anhänge verschlüsselter Mails in Thunderbird geöffnet werden sollen. Ich meine, die Fehlermeldung ist wirklich irreführend. Als Versender verschlüsselter Mails sollte man daher seine Windows-Adressaten auf diesen Punkt hinweisen.