Frustblogging #3: Ich sitze grad in der Bahn fest

Thu, 30 Apr 2009 19:16:00 +0000

Ich sitze grad in der Bahn… Die so ca. eine Minute vom Hauptbahnhof weggefahren ist… Und jetzt seit ner halben Stunde hier steht… An einer Stelle wo die Gleise schräg sind – der Zug neigt sich nach rechts, besonders bequem… Denn die Strecke direkt vor uns ist gesperrt. Ich fände es logisch, wenn der Zug zurückfahren würde, dass man sich vielleicht noch was zum Essen kaufen kann oder die Beine vertreten. Aber Logik bei der Bahn, soweit kommts noch.

Die Begründung: Kinder auf den Gleisen.

Ich sehe ein, dass man Kinder nicht überfahren darf. Man darf zwar jegliche Art von Wild in Waldgebieten überfahren, aber Kinder nicht. Wie auch immer. Aber ich verstehe nicht, wieso es fünfundzwanzig Minuten dauert, ein paar Kinder von den Gleisen zu holen?

Mein Akku geht zur Neige. Wie schön, ich hatte mir erhofft, die Bahnfahrt mit Internet zu verkürzen. Aber das geht natürlich nicht.

Reicht es nicht, dass mich quängelnde Kinder in der U-Bahn nerven? Müssen sie auch noch den Zug blockieren?

Egal. Inzwischen fahren wir wieder. Fünfundvierzig Minuten Verspätung. Wenigstens muss ich nicht auf den Anschlusszug warten – da kann ich dann gleich den eine Stunde später nehmen. Hoffentlich kriegen die Kinder dafür eine heftige Standpauke. Echt mal!


Überwachungs-Marx

Thu, 30 Apr 2009 17:14:00 +0000

Heute hatte ich in der überfüllten U-Bahn das Glück, in einem der videoüberwachten Wagons fahren zu dürfen. Nunja, aus lauter langeweile habe ich ein paar Fotos gemacht. Hier mal ein Foto der zentralen zwei Kameras (oder zumindest das was ich dafür halte):

ueberwachungskameraDas sieht von der Seite garnicht so toll aus, die Frontalanscht ist viel besser (leider ist meine Handykamera schlecht):

ueberwachungskamerafrontal

Hm. Geniales Design! Das habe ich doch irgendwo schon mal gesehen. Ja, klar. In einem Videospiel. Die Videospielfigur heißt Marx, und stammt aus einem Kirby-Spiel:

marxUnd ja, es passt wie angegossen zueinander:

ueberwachungsmarxWas für ein Zufall, dass dieser Charakter „Marx“ heißt. Ein Zufall? Oder eine weitere Verschwörung?


Frustblogging #2: Salat ohne Fleisch? Wie bitte?

Wed, 29 Apr 2009 23:34:53 +0000

Mir ist heute vielleicht was peinliches passiert. In der Universitätsnahen Bäckerei haben die meistens auch Salate, und ich wollte – der Gesundheit wegen – mir heute mal nen Salat kaufen.

Ich meine, alleine das ist ja schon peinlich genug. Ich meine, Salate sind ja eigentlich nur für die ganzen Öko-Zippen gedacht, die meinen, auf ihre Linie achten zu müssen, Rastasträhnchen tragen, und Vergleichende Konsistenzsinologie studieren. Aber darüber kann man gerade noch hinweg sehen, freilich ist die Frage nach einem Salat, wo es eigentlich Käsebrezen gäbe, nicht ganz unpeinlich, aber es ist erträglich.

Doch dabei blieb es ja nicht. Ich hatte die seltsame Idee, an der Salattheke nach einem Salat ohne Fleisch zu fragen. Mir war in dem Moment garnicht bewusst, wie abstrus die Frage nach einem Salat ohne Fleisch eigentlich ist. Die Arme Verkäuferin. Musste auch noch freundlich bleiben. Aber ich kann es ihr nicht verübeln, dass sie ihre Entgeisternug nicht gänzlich zurückhalten konnte, und mich erstaunt nochmals fragte „Einen Salat OHNE Fleisch?“. Klar, dass man bei so einem abstrusen Kundenwunsch schon mal davon ausgeht, dass man sich verhört hat. Nun, sie hatte sich nicht verhört. Eine äußerst peinliche Situation.

Wie kam ich nur auf eine so abstruse Idee, einen Salat ohne Fleisch zu wollen. Salat ohne Fleisch – nein, das geht nun wirklich nicht. Da wird mir ja schon vom dran denken schlecht. Von den gesundheitlichen Folgen eines solchen kulinarischen Experiments ganz abgesehen – der Mensch braucht Fett um Vitamine zu verarbeiten, ohne Fleisch kann man den Salat ja garnicht verdauen. Wie konnte meinem Mund nur eine solche Abartigkeit entgleiten?

Salat ohne Fleisch. Naja, vielleicht etwas für linksradikale langhaarige Langzeitstudenten mit Taxischein, die schon in der Früh so zugedröhnt sind dass ihnen selbst ein Blatt Papier schmecken würde. Ja, die essen sowas, die ganzen Körnerfresser.

Nein, aber eine solche Idee zu haben ist keine Lapalie. Und ich möchte mich hiermit bei der Welt auch dafür entschuldigen. Salat ohne Fleisch – soweit kommts noch!


Simple Thoughts on Multiprocessing and Distributed Computing with Functional Languages

Tue, 28 Apr 2009 23:53:56 +0000

In this thread on lispforum.com (which is a good forum for lisp-related stuff – and the only forum I know of)the topic of multiprocessing and distributed computing came up, and how functional languages could be used for this. The problem is to find good heuristics and a good possibility to split calculations into multiple threads.

The code I am posting now was a one-night-experiment by me, trying to create something like that, using a thread-pool and a processing-queue. Basically, the threads always read something from the processing queue, calculate it, and then write anything that still has to be calculated into that queue. To do this they are using the atomic instructions gcc provides (hence, afaik this code is not portable).

It is almost like saving continuations into a queue. And in fact, I am wondering whether this would be a good thing to do, i.e. saving the whole stack into one object in the queue.

Anyway. Here is my C-Code. I split it into two files. The first file is the header-file atomic_fifo.h:
#ifndef ATOMIC_FIFO_H
#define ATOMIC_FIFO_H

inline void debug (const char* x, void* y) {
#ifdef DEBUG
printf (x, y);
#else
#endif
}

typedef struct {
void** content;
int maxlen;
int read_optimistic;
int read_pessimistic;
int write_optimistic;
int write_pessimistic;

/* how much elements are in the buffer that are ready to be read */
int can_be_read;

/* how much elements are in the buffer that cannot be written
(i.e. are written at the moment, etc.). we must always have
cannot_be_written >= can_be_read */
int cannot_be_written;
} atomic_fifo;

void initialize_atomic_fifo (atomic_fifo *blubb, int length) {
/* note: you MUST allocate content yourself */
blubb->maxlen = length;
blubb->read_optimistic = 0;
blubb->read_pessimistic = 0;
blubb->write_optimistic = 0;
blubb->write_pessimistic = 0;
blubb->can_be_read = 0;
blubb->cannot_be_written = 0;
}

int write_fifo_nowait (void* data, atomic_fifo* fifo) {
/* write data into fifo, if it fits into buffer. if it doesnt fit,
dont wait, but return -1 */

debug („=====Entering write_fifo_nowait====\n“, (void*) 0);

debug („data: %d\n“, (void*) data);

/* can we write? */
int space = __sync_fetch_and_add (&(fifo->cannot_be_written), 1);

debug („space: %d\n“, (void*) space);
debug („fifo->maxlen: %d\n“, (void*) fifo->maxlen);

if (space >= fifo->maxlen) {
/* buffer is full (or almost full) */
__sync_fetch_and_sub (&(fifo->cannot_be_written), 1);
debug („leaving write_fifo_nowait…\n“, (void*) 0);
return -1;
}

/* we can write. so fetch a pointer optimistic. */
int myelement = __sync_fetch_and_add (&(fifo->write_optimistic), 1);

debug („myelement: %d\n“, (void*) myelement);
debug („myelement mod maxlen: %d\n“, (void*) (myelement % fifo->maxlen));

(fifo->content)[myelement % fifo->maxlen] = data;

debug („fifo->content: %d\n“, (void*)(fifo->content)[myelement % fifo->maxlen]);

/* now our element is inside the array. try to increment the
pessimistic pointer as soon as possible (no polling, do it
active, since we assume that this will only happen for a very
short time), i.e. wait until other processes which happen to set
elements before ours have finished. */

while (!__sync_bool_compare_and_swap(&(fifo->write_pessimistic), myelement, myelement+1));

__sync_fetch_and_add (&(fifo->can_be_read), 1);

return 0;
}

void write_fifo_active (void* data, atomic_fifo* fifo) {
/* actively try to write data */
while (write_fifo_nowait(data, fifo)!=0);
}

/*void write_fifo_polling (const void* data, atomic_fifo* fifo, int nanosec) {
}*/

int read_fifo_nowait (void** data, atomic_fifo* fifo) {
/* read data from fifo, if any. if not, return -1. */

debug („======Entering read_fifo_nowait=======\n“, (void*)0);

/* can we read? */
int available = __sync_fetch_and_sub(&(fifo->can_be_read), 1);

debug („available: %d\n“, (void*)available);

if (available <= 0) {
/* buffer is empty */
__sync_fetch_and_add(&(fifo->can_be_read), 1);
debug(„leaving … none available. \n“, (void*)0);
return -1;
}

/* yes, we can read. */
int myelement = __sync_fetch_and_add(&(fifo->read_optimistic), 1);

debug („myelement: %d\n“, (void*)myelement);
debug („myelement mod maxlen: %d\n“, (void*)(myelement % fifo->maxlen));

*data = (fifo->content)[myelement % fifo->maxlen];

debug („*data: %d\n“, (void*) *data);
debug („data: %d\n“, (void*) data);

while (!__sync_bool_compare_and_swap(&(fifo->read_pessimistic), myelement, myelement+1));

__sync_fetch_and_sub (&(fifo->cannot_be_written), 1);

return 0;
}

void read_fifo_active (void* data, atomic_fifo* fifo) {
while (read_fifo_nowait(data, fifo)!=0);
}

#endif

The second file is spamqueue.c:

#include <assert.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#define GC_THREADS
#include <gc/gc.h>

#include „atomic_fifo.h“

#define NUM_THREADS (2)
#define NUM_QUEUE (65536)

/* waits for calculation */
typedef struct {

/* how many other waiters have to be calculated until this
calculation is ready to be calculated? */
int remainingNeededCalculations;

/* Pointer to some Integer that should be decremented when this
waiter has been calculated. Should be set to some other waiter’s
remainingNeededCalculations. Passed to the calculatorFunction as
first argument. Must be decremented (using safe_decf) */
int* decfWhenCalculated;

/* Pointer which is passed to the calculatorFunction. It is the only
argument that can be passed. It should be used for return-values,
etc., too. */

void* argumentPointer;

/* function that is evaluated. decfWhenReady – see above*/
void (*calculatorFunction) (int* decfWhenCalculated, void* T);

} waiter;

void safe_decf (int* bla) {
__sync_fetch_and_sub (bla, 1);
}

void safe_incf (int* bla) {
__sync_fetch_and_add (bla, 1);
}

/* our waiting queue: */
int waiters[NUM_QUEUE];
atomic_fifo fifo;

/* our worker-threads */
pthread_t threads[NUM_THREADS];

/*int incf0r = 0;

void *blafasel() {
while (1) {
printf („%d\n“, __sync_fetch_and_add (&incf0r, 1));}
}*/

waiter* add_waiter (void (*calculatorFunction) (int* decf, void* T),
void* argumentPointer, int neededCalculations,
int* decfWhenCalculated) {

waiter *bla = (waiter*) GC_MALLOC(sizeof(waiter));

bla->calculatorFunction = calculatorFunction;
bla->argumentPointer = argumentPointer;
bla->remainingNeededCalculations = neededCalculations;
bla->decfWhenCalculated = decfWhenCalculated;

while (write_fifo_nowait ((void*) bla, &fifo) != 0) {
usleep(100000);
}

return bla;
}

waiter* get_next_waiter () {

waiter* bla;

while(1) {
while ((read_fifo_nowait ((void*)&bla, &fifo) != 0)) {
usleep(100000);
}

// add again if still needs calculations
if (__sync_bool_compare_and_swap(&(bla->remainingNeededCalculations), 0, 0)) {
return bla;
} else {
while (write_fifo_nowait ((void*) bla, &fifo) != 0) {
usleep(100000);
}
}
}
}

inline void execute_some_waiter () {
/* execute a waiter from the queue */
waiter* w = get_next_waiter ();
w->calculatorFunction(w->decfWhenCalculated, w->argumentPointer);
}

inline void *executionLoop (void *bla) {
(void) bla;
while (1) {
execute_some_waiter ();
}
}

/* experiment */

int numberToPrint = 0;

int someNil = 1;

void someFunc1 (int* decf, void* T) {
(void) T;
printf („jippee: number is: %d\n“, numberToPrint);
safe_decf (decf);
}

void someFunc2 (int* decf, void* T) {
(void) T;
numberToPrint = 1;
printf („jippee. Setting number.\n“);
safe_decf(decf);
}

typedef struct {
int* x1;
int* x2;
int* ret;
} arithmetic_struct;

void calcSum (int* decf, void* fact) {
arithmetic_struct* f = (arithmetic_struct*) fact;
*(f->ret) = (*(f->x1)) + (*(f->x2));
safe_decf(decf);
printf („sum(%d %d)=%d;\n“,*(f->x1),*(f->x2),*(f->ret));
printf(„decf: %d\n“, *decf);
printf(„someNil: %d\n“, someNil);
}

void calcFib (int* decf, void* f) {
arithmetic_struct* fib = (arithmetic_struct*) f;

if (*(fib->x1) == 0) {
*(fib->ret) = 0;
safe_decf (decf);
printf(„fib(0)=0;\n“);
} else if (*(fib->x1) == 1) {
*(fib->ret) = 1;
safe_decf (decf);
printf(„fib(1)=1;\n“);
} else {
// calc the sum of partial fibonacci-numbers
// reuse fib    arithmetic_struct* cSum = (arithmetic_struct*) GC_MALLOC(sizeof(arithmetic_struct));

arithmetic_struct* fib1 = (arithmetic_struct*) GC_MALLOC(sizeof(arithmetic_struct));
arithmetic_struct* fib2 = (arithmetic_struct*) GC_MALLOC(sizeof(arithmetic_struct));

fib1->x1 = (int*) GC_MALLOC(sizeof(int));
fib2->x1 = (int*) GC_MALLOC(sizeof(int));
fib1->ret = (int*) GC_MALLOC(sizeof(int));
fib2->ret = (int*) GC_MALLOC(sizeof(int));

*(fib1->x1) = *(fib->x1) – 1;
*(fib2->x1) = *(fib->x1) – 2;
fib->x1 = fib1->ret;
fib->x2 = fib2->ret;

printf („fib(%d)=sum(fib(%d) fib(%d));\n“, *(fib->x1), *(fib1->x1), *(fib2->x1));

printf(„decf: %d\n“, *decf);
printf(„someNil: %d\n“, someNil);

waiter* summe = add_waiter (calcSum, fib, 2, decf);
add_waiter (calcFib, fib1, 0, &(summe->remainingNeededCalculations));
add_waiter (calcFib, fib2, 0, &(summe->remainingNeededCalculations));
}
}

int main (void) {

int i = 0;
GC_INIT();

initialize_atomic_fifo (&fifo, NUM_QUEUE);

fifo.content = (void*) &waiters;

for (i=0; i < NUM_THREADS; ++i)
pthread_create(&threads[i], NULL, *executionLoop, NULL);

//int* someNil = (int*) GC_MALLOC(sizeof(int));
//  *someNil = 1;

/*    add_waiter (someFunc2, NULL, 0,
&(add_waiter(someFunc1, NULL, 1, &someNil)->remainingNeededCalculations));*/

arithmetic_struct* as = (arithmetic_struct*) GC_MALLOC(sizeof(arithmetic_struct));
as->x1 = (int*) GC_MALLOC(sizeof(int));
as->ret = (int*) GC_MALLOC(sizeof(int));

*(as->x1) = 20;

add_waiter (calcFib, as, 0, &someNil);

while (__sync_bool_compare_and_swap (&someNil, 1, 1)) {
// wait till we finish
usleep (1000000);
}

for (i=0; i < NUM_THREADS; ++i) {
printf(„cancelling %d\n“, i);
pthread_cancel(threads[i]);}

printf („\naftermath: %d\n“, *(as->ret));

}

This calculates the fibonacci-number 20 per recursion distributed into two threads. Calculating fibonacci-numbers recursively is not efficient at all, but I couldnt find a comparably easy-to-check algorithm which has that high complexity.

On my 2-processor-architecture, the 2-threaded version is even slower than the 1-threaded one – but I think the threads are always executed on the same processor.

Anyway. I am sure there are already Compilers working in a similar way. If somebody knows, I would like to know.


Frustblogging #1: Ohrenschmalzschokolade

Tue, 28 Apr 2009 11:32:36 +0000

Ich nummeriere ab jetzt meine Frustbloggings durch, habe ich mir gedacht. Dies hier ist Frustblogging Nummer 1. Also dann: Fangen wir an.

Es gibt das Phänomen, dass einem Menschen eine vergleichsweise kurze Periode der Langeweile sehr lang vorkommt, bei der Erinnerung daran allerdings, aufgrund der Detailschwäche der Geschehnisse, und der damit ausbleibenden Erinnerungen, die Zeit als sehr kurz erscheint. Dieses Phänomen bezeichnet man meines Wissens als subjektives Zeitparadoxon.

Jedenfalls ist dieses Phänomen einer meiner momentanen Grundpfeiler. Wie sonst soll man 45 Minuten Weg zur Uni aushalten, und sich diese Erfahrung fast jeden Tag geben, wenn man nicht am Ende des Weges die Zeit wenigstens vergessen kann?

Und so kommt es, dass es mich besonders stört, wenn in den öffentlichen Verkehrsmitteln irgendetwas passiert, was aus den sonstigen monotonen Fahrten, in denen ich im Halbschlaf oder wenigstens unter maximaler Zerstreuung mein Dasein friste, heraussticht. An monoton quängelnde Kleinkinder habe ich mich derweil gewöhnt, genauso an hiphophörende Großkinder, und an mehrlachendalsredende blassblauhaarige Senioren, die sind so alltäglich dass mein interner Filter, den ich mir notgedrungen durch meinen Besuch eines sozialwissenschaftlichen Gymnasiums aneignen musste, und den ich inzwischen perfektioniert habe, sie fast komplett aussortiert, sodass ich wenig bis nichts davon mitbekomme.

Eine solche herausstechende Situation fand heute statt, direkt neben mir unterhielt sich eine Mutter mit ihrem Kind. Fairerweise sage ich vorweg, dass dieses Gespräch nur deshalb mein inneres Gleichgewicht perturbierte, weil es direkt neben mir stattfand, anders als viele Mutter-Kind-Konversationen zwang sich die Kinderstimme wohl nicht in die entzündeten Ohren jedes einzelnen Wagonmitgliedes.

Jedenfalls waren drei nahe beieinanderliegende Sitzplätze frei, einen davon besetzte die Mutter, und sie bot ihrem Kind drei Alternativen an, nämlich die zwei noch freien Sitzplätze und ihren Schoß. Das Kind entschloss sich stehenzubleiben und nicht kooperativ zu sein. Trotz aller Warnungen der Mutter, dass die beiden freien Sitzplätze bald besetzt werden würden, blieb es unbelehrbar, und so kam es dass drei stationen und etliche erloschene Engramme meiner guten Laune später beide Sitzplätze tatsächlich besetzt waren, was jenen Buben dazu veranlasste jetzt doch einen dieser Sitzplätze zu wollen. Nun, das war zu erwarten, Kinder testen ihre Umwelt aus, und müssen eben noch lernen, mit den Konsequenzen ihrer Handlungen zu leben, und es ist eigentlich erfreulich, dass die Lektion für Jenen noch so milde ist, dass er zwei Sitzplatzalternativen von drei verliert. Nach einigen mehr oder weniger tiefgründigen Diskursen mit seiner Mutter akzeptierte er dann sein Schicksal und nahm die verbleibende Alternative – die Oberschenkel seiner Mutter – an, freilich nur unter Protest.

Ich als Mutter hätte wohl jenen Protest einfach als gegeben angenommen, vielleicht bin ich gemein oder zu wenig verständnisvoll, aber letztlich wurde er gewarnt, hat die Warnungen nicht ernstgenommen, und muss nun die nicht unbedingt schwerwiegenden Konsequenzen seiner Entscheidung tragen, an denen man trotz noch so viel Protest wenig ändern kann. Diese Mutter war natürlich um das Seelenheil ihres Kleinen bemüht, und begann weiterzureden. Irgendwann kamen sie dann – warum auch immer – zum Thema exotische Schokoladensorten. Nach immer abstruseren Konstruktionen des Kindes folgte von Jenem Salamischokolade. Das Kind hielt sich allerdings wenigstens an das Grundprinzip, nur Lebensmittel mit Schokolade zu vermischen. Die Mutter hingegen topte ihren Sohn, indem sie genialerweise dieses Prinzip kippte und neben anderen Stilblüten mit Ohrenschmalzschokolade konterte.

Nun, die Reaktion des Kindes war ein nasses Lachen (zum Glück habe ich glaube ich nichts davon abbekommen) und ein rapider Abstieg meines Appetits. Und ein Wort das sich in mein Unterbewusstsein gefressen hat, so dass ich es wohl nie wieder vergessen werde.


Stell dir vor es ist Wirtschaftskrise…

Sun, 26 Apr 2009 02:38:55 +0000

Stell dir vor es ist Wirtschaftskrise …

… und keiner geht hin.

(Sorry could not resist. Bild: http://de.wikipedia.org/w/index.php?title=Datei:Gedeck.jpg.JPG&filetimestamp=20060922202558)


Rosskastanienminiermotte

Sat, 25 Apr 2009 22:24:57 +0000

Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte.

Rosskastanienminiermotte Rosskastanienminiermotte

Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte.

„Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte“

Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte.

Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte

Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte. ROSSKASTANIENMINIERMOTTE!!1! ROSSKASTANIENMINIERMOTTE ROSSKASTANIENminiermotte Rosskastanienminiermotte RossKASTANIENminiermotte Rosskastanienminiermotte Rosskastanienminiermotte.

Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte

Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte:

Rosskastanienminiermotte

Rosskastanienminiermotte

Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte.

Rosskastanienminiermotte?

Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte. Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte Rosskastanienminiermotte.

⅝(Rosskastanienminiermotte)+∏Ro∬ka∫ tan (ien)min{ie, r(mot(t)), e}ℜossk∀s⊥∀⋀|ie⋀|miℕieℝmotte (Rosskastanℑenmℑnℑermotte)

Rosskastanienminiermotte: Rosskastanienminiermotte!