SucheBlog abonnierenVerwaltung des BlogsKategorienKontaktMarkus Brückner |
Sonntag, 23. Juli 2006Wenn's mal wieder länger dauert......mit dem öffnen eines Verzeichnisses im Konqueror, dann kann das unter Umständen daran liegen, daß sich kio_file nicht auf /tmp/fam-<username> verbinden kann. Sieht man sehr schön im strace, wenn als letzte Meldungen da steht:
socket(PF_FILE, SOCK_STREAM, 0) = 16
connect(16, {sa_family=AF_FILE, path=@/tmp/fam-<username>-}, 110 <unfinished ...>
Abhilfe schafft ein Neustart des fam-Daemon (unter Ubuntu heißt der gam_server. Den einfach killen, der wird neu gestartet). Danach rennt wieder alles wie gewohnt. Jetzt muss ich nur noch rausfinden, wieso der blöde gam_server alle paar Wochen mal abschmiert... Dienstag, 18. Juli 2006In den Fuß schießen mit C++Die letzten drei Tage hab ich einen Fehler aus der Kategorie "In den Fuß schießen mit C++" gesucht. Da gibt man sich nun schon alle Mühe, verwendet die gut getesteten Datenstrukturen der STL und trotzdem grinst einen ein ums andere Mal ein Segmentation Fault an. *gnaa* Folgender Code (vereinfacht, das Original ist in eine Klasse eingebettet):
#include <iostream>
#include <list>
std::list<int> bla;
std::list<int> const getBla() {
return bla;
}
int main() {
bla.push_back(10);
for (std::list<int>::const_iterator i=getBla().begin(); i!=getBla().end(); ++i) {
std::cerr << *i << std::endl;
}
}
getBla() ist im Original ein Getter für ein Klassenmember. Eigentlich ein gängiges Konstrukt. Der Crash passiert in der Schleife bei der Dereferenzierung des Iterators i. (Im Original war das etwas komplizierter, aber das ist hier nebensächlich.). Nach einigem Rumprobieren stelle ich fest, daß die Schleife zweimal durchlaufen wird, obwohl bla ja eigentlich nur ein Element enthält. Die Dereferenzierung des Iterators knallt im zweiten Durchlauf der Schleife (logisch, der zeigt dann ja irgendwo ins Nirvana). Die Ursache des Fehlers liegt in einem fehlenden Zeichen in der Deklaration von getBla(). Eigentlich müßte das wie folgt aussehen (der Unterschied ist der Einfachheit halber rot markiert):
[...]
std::list<int> const &getBla() {
[...]
Standardmäßig übergibt C++ Parameter und Rückgabewerte by value, d.h. es wird eine Kopie des Wertes auf dem Stack gemacht. Das ganze ist von C geerbt. Mit der Einführung von abstrakten Datentypen kann so eine Kopie natürlich richtig teuer werden, weswegen zusätzlich die Möglichkeit der Übergabe by reference eingeführt wurde. Gekennzeichnet wird solch eine Referenz durch ein & hinter dem Datentyp. Dann wird eben statt der Kopie nur ein Verweis übergeben. Kann ungeheuer Zeit und Speicherplatz sparen. Wie führt das nun in dem Code zum Crash? Nun dafür muss man sich mal den Kopf der for-Schleife näher anschauen:
[...]
for (std::list<int>::const_iterator i=getBla().begin(); i!=getBla().end(); ++i) {
[...]
Im rot markierten Teil wird der Iterator i initialisiert und zeigt auf das erste Element der von getBla() zurückgelieferten Liste – einer Kopie der Originalliste, die durch die Rückgabe angefertigt wird. Im blau markierten Teil wird der Iterator vor jedem Schleifendurchlauf mit dem Endezeiger der von getBla() zurückgelieferten Liste verglichen – einer anderen Kopie, die ebenfalls wieder durch die Rückgabe by value entsteht. Nun, da der Iterator ursprünglich von der ersten Kopie an hochzählt, kann er nie den Endezeiger der zweiten erreichen, der komplett woanders liegt. Also bricht die Schleife nicht ab, wie es korrekt wäre, sondern läuft ein zweites mal durch. Durch das Hochzählen zeigt der Iterator nun hinter das Ende der ersten Kopie, per Definition also ins Nichts. *BUMM* Ändert man den Rückgabetype von getBla() auf eine Referenz, so bekommt man bei jedem Aufruf dieselbe Liste (nämlich bla selbst). Und siehe da, dann funktioniert's! Also merke: Der Rückgabewert eines Getters ist grundsätzlich eine konstante Referenz!*grmpf* (Konstant übrigens deswegen, damit einem nicht irgendein Genie plötzlich die eigenen Daten unterm Hintern wegändert.) Samstag, 15. Juli 2006Camera ObscuraAngeregt durch ein Posting in de.rec.fotografie bin ich auf www.die-lochkamera.de gestoßen. Diese Seite enthält recht viele Informationen rund um die sogenannte "Camera Obscura" oder Lochkamera. Der Witz bei dieser ist, daß statt eines Linsensystems zur Erzeugung eines Abbildes einfach ein kleines Loch benutzt wird. Das Prinzip ist schon ewig bekannt und wurde lange Zeit auch zur Bilderzeugung verwendet. Nachdem ich ein wenig auf der genannten Seite rumgestöbert habe, wollte ich das ganze natürlich mal ausprobieren. Wozu hat man schließlich eine teure digitale Spiegelreflex, bei der man das Objektiv entfernen kann? Also, flugs das Teil runter und eine Alufolie mit einem kleinen Loch in der Mitte davorgeklebt. Ein Blick durch den Sucher: alles dunkel. Ähem... Womit wir auch gleich bei dem größten Nachteil einer Lochkamera gegenüber einem Linsensystem wären: um eine scharfe Abbildung zu erhalten muss das Loch möglichst klein sein. Dummerweise läßt es dann nur noch sehr wenig Licht durch, so daß man richtig viel davon braucht, um ein brauchbares Bild zu erhalten. Also erstmal einen externen Blitz auf die Kamera geschraubt, auf volle Leistung gestellt und ein wenig experimentiert. Das Anvisieren von Gegenständen gestaltet sich ohne Sucherbild erstaunlich schwierig. Letztlich habe ich mir damit beholfen, über den Blitzschuh zu peilen. Klappt einermaßen gut. Den Bildausschnitt kann man allerdings nur erraten. Etwas Glück ist also dabei und bewegte Sachen möchte man eigentlich nicht fotografieren. Über die Ergebnisse der Übung war ich einigermaßen erstaunt. Besser sind viele Familiendias aus den 70ern auch nicht. Der Kontrast der Bilder ist etwas niedrig, weil doch noch einiges an Streulicht an der aufgeklebten Alufolie vorbei kommt (hier könnte man mit einem umgebauten Gehäusedeckel sicherlich noch einiges reißen). Die Bilder enthalten einen ganzen Haufen schwarze Flecke, was mich daran erinnert, daß ich meinen Sensor mal wieder reinigen sollte. Naja, letztlich sind natürlich die Bilder nicht ansatzweise so scharf, wie mit einem vernünftigen Objektiv. Hätte mich allerdings auch verwundert. Dafür haben sie ein wenig den Charme von 70er-Jahre-Familiendias. Ich sollte mir einen langhaarigen Hippie zum fotografieren suchen... Schließlich noch vier ausgewählte Ergebnisse: ![]() Bewegte Motive sind alles andere als einfach. Dafür hab ich mehrere Anläufe gebraucht. Ich glaube, das Tier hasst mich jetzt. ![]() Meine bessere Hälfte, die meine Basteleien mit einiger Belustigung verfolgt hat. Das Bild ist recht dunkel, trotz Blitz. Man merkt, daß man wirklich richtig viel Licht braucht. ![]() Mal eine Aufnahme ohne Blitz. Sehr schön zu erkennen ist hier das Geisterbild (die unteren beiden Leuchtpunkte sind eigentlich gar nicht da). Problem ist hier: ich hatte dummerweise ein zweites, kleineres Loch in der Folie, so daß ein leicht verschobenen Geisterbild entsteht. ![]() Zuletzt noch eine Nahaufnahme. Blitz auf 17mm und die Pflanze anvisiert. Ich wette, die wundert sich jetzt noch, wieso es nur so kurz Tag war. :) Montag, 3. Juli 2006Die spinnen, die Finnen...Auch wenn mein Arbeitgeber einen finnischen Mutterkonzern hat, der Titel trifft's: http://thatsrainergras.blogg.de/eintrag.php?id=197. Der raingergras (einst Mitglied der legendäre Ilmenau Block-N-Burgbesatzung) ist neuerdings in Finnland unterwegs und hat dort eine Geschichte seines Profs. ausgegraben. Kurzform: Prof. will Teich, mietet Bagger und buddelt. Vermessungsamt kommt und guckt und ändert die Karten. Die Langform ist besser. :)
(Seite 1 von 1, insgesamt 4 Einträge)
|