klein aber fein

Die Aufgabenstellung lautete: Wie erzeuge ich ein wechselndes Hintergrund-Bild für eine Seite?
Die Lösung war – dank der umfassenden Möglichkeiten der bash, schnell gebastelt:

[code lang="bash"]
#!/bin/sh
range=`ls *.jpg | grep -v background | wc -l`
number=$RANDOM
let "number %= $range"
if [ $number -eq 0 ]; then let "number++"; fi
name=`ls | tail -$number | head -1`
cp $name background.jpg
[/code]

Das „Programm“ geht davon aus, dass es ein Verzeichnis gibt in dem die zu wählenden Bilder lagern (so ne Art „<body background=’background/background.jpg‘>“. Dort erzeugt es die Menge der vorhandenen Bilder abzüglich des einen das später der aktuelle Background wird (range). Es wird mittels $RANDOM und dem sich anschließenden Modulo (Rest einer ganzzahligen Division) eine Zufallszahl ermittelt die innerhalb dieser Menge liegt (number). Dann wird diese Zufallszahl-Menge an Dateien angelistet und davon nehmen wir uns die erste (head -1). Das wiederum kopieren wir auf background.jpg, welches in der Seite fest verdrahtet als Hintergrund genommen wird. Und schon haben wir – vielleicht noch mit einem reload im Meta-Bereich der index.html oder index.php oder wie auch immer einen wechselnden Hintergrund. Wird natürlich angesteuert über die cron – wie sonst ;), zum Beispiel mit einem „*/15       * * * * (cd theSite/background && ./generate.sh)“, wenn das kleine Ding von oben in „generate.sh“ gespeichert wurde, womit also dann alle 15 Minuten ein anderer Hintergrund der vorliegenden Bilder erzeugt würde.

Ninja Number One

Die Ninja Physics Erweiterung der ODE ist vom Resultat her eine feine Sache. Endlich sind Gelenke möglich, zur Zeit sind lediglich zwei Arten realisiert: Ein Kugelgelenk (balljoint) und ein Scharnier (hingejoint). Die Ergebnisse sind wunderbar anzuschauen, Videos dazu auf Youtube geben nur sehr unpräzise wieder was möglich ist, daher spare ich mir hier die Einbindung.

Was die Implementation angeht, muss ich aber sagen, dass ich von den Machern enttäuscht bin, denn die Verknüpfung der Prims mittels eines Joint-Prims über Namen und Beschreibung halte ich für sehr unprofessionell. Wo bleibt die weltweit eindeutige UUID mit der man hätte arbeiten können? Sicherlich ist somit eine Konstruktion ohne Scripting möglich, aber was für ein Aufwand den man betreiben muss um erstellte Objekte funktionsfähig zu erhalten. Und das ist wirklich ein grosser Nachteil: Bastelt man an einem neuen Objekt herum und passt nicht auf mit den Namen, geschieht es leicht dass man schon existierende zerstört, was niemals sein darf.

Okay, ich gebe zu, meine recht schlampige Arbeitsweise wird hier zwangs-diszipliniert, was auch angenehm sein kann. 🙂

Ein recht mühseliger weiterer Punkt ist, dass man Gelenke die sich nicht an der Oberfläche ansiedeln sollen, auf irgendeine Art in der Luft halten muss. Auch Fortbewegungen der gebauten Figuren müssen zwangsinitiiert werden. Aber hier liegen die scheinbaren Begrenzungen sicherlich noch daran dass ich mich nicht genügend mit der Materie beschäftigt habe.

Das Resumé lautet: Wunderbar in der Wirkung, gewöhnungsbedürftig in der Anwendung. Scripting und Velocity-Einbau wird sich noch zeigen in wieweit das machbar ist.

We go OS-Grid

Nachdem es uns etwas zu dörflich war – im besten Sinne des Wortes – haben wir gemeinschaftlich beschlossen uns etwas mehr in der Anonymität der Weite zu versenken und migrieren rüber zu OSGrid. Und das natürlich auch gleich richtig mit den nötigen Auslauf (12 Regionen). Wir sind nicht kontaktscheu, aber es ist ein (für uns zumindest) nicht sehr angenehmes Gefühl wenn man 30-50% der Belegschaft stellt die abends da ist, verbunden mit der Bedeutung die es für den Rest vom Dorf hat („…. aaah, endlich ist er da …. *draufstürz* *abbussel* ….“) 😉

Einiges ist anders dort, so ist die Grundkonfiguration eine, die – wahrscheinlich auch dank der 0.7.1 – sehr viel im Grid selbst speichert, wenn auch die lokale Standard-DB noch sämtliche Estate-Angelegenheiten vorhält. Auch Prim-Informationen werden dort abgelegt, so weit ich das bisher sehen konnte wird jedoch die Asset-DB zentral geführt. Es ist noch einiges an Feinarbeit notwendig bis dort alles geschmeidig läuft, aber ein Wohlfühl-Faktor konnte schon diagnostiziert werden.

Anwendungs-Gedanken

Jetzt haben wir also eine Möglichkeit, Bilder aus dem Web im Simulator darstellen zu können. Eine feine Sache muss ich zugeben. Da die Wünsche stets mit der Realisierung wachsen bei den Menschen ^^ möchten wir auch gerne HTML-Seiten zeigen können. Die eine Variante ist es, OpenSim wiederum aufzubohren und sozusagen das vollständige „WebOnAPrim“ zu implementieren, aber zunächst hab ich mich an einer anderen Variante ausgetobt.

Anwendungs-Gedanken weiterlesen

Gar nicht so übel

Erste Impressionen von – na wie sollen wir es nennen? Da fällt sicherlich jemandem was zu ein. Das Bild spricht jedenfalls für sich, oder? Es ist noch große Vorsicht geboten, da die Timer wohl nicht sauber implementiert sind. Aber das können wir ja über LSL-Timer realisieren. EDIT: Es baut auf der 0.7.1er (GIT, DEV) mit einer eigenen Funktion da die dort originär implementierten Versionen noch nicht klappen. Name zur Zeit zur Verwendung in Scripten: wbDisplayWebimage. Und es bekommt als Parameter lediglich die URL. Zurück liefert es den String der UUID des erzeugten Images. Und im Moment arbeitet es auf allen „Faces“ (Oberflächen), werde ich wahrscheinlich noch ändern aber im Moment reicht es mal so.

Und hier nun der notwendige Minimal-Code ohne Refresh, das ja bei normalen statischen Bildern nicht notwendig ist :):

[code lang="c"]
string rc;
default {
    state_entry() {
        rc = wbDisplayWebimage("http://wolfsbone.de/download/public/xsyonNomadsSigns/snake.png");
    }
}
[/code]

Nicht denken, testen!

Nun ja, manches ist so einfach. Und manchmal spielt einem die Erfahrung auch einen Streich. Viele Optionen werden dadurch deaktiviert, dass sie auf 0 gesetzt werden statt eines höheren Wertes, nach dem Motto: Ist es grösser als 0 dann bildet es eine Grenze, ist es gleich 0, dann ist diese Option nicht wirksam.

Es ist – wie gesagt – oft so. Bei der absoluten non-physischen Primgrösse in einer Region ist es auch so. Nicht jedoch bei der physischen maximalen Grösse. Und so bedurfte es erweiterten Debuggens um festzustellen, dass der simple Parameter in den regions-XMLs „physical_prim_max“ – wenn 0 – tatsächlich 0 bedeutet: Die Option einen Prim physisch zu machen wird damit also abgeschaltet.

Und was ist das Ergebnis? Nun, wir haben jetzt Physics. 😀 Aber natürlich werden wir sparsam damit umgehen, denn wie bekannt gibt es kaum ein leichteres Mittel eine Region lahm zu legen als etwas gesteigerte Verwendung davon. Da ich aber Robotics mag und Vehicles und das Basteln damit, und auch Bewegungen mit Physis und dem dann möglichen „moveTo“ viel eleganter sind als explizites Setzen der Positionen, machen wir es grundsätzlich möglich und ich darf mich über den nächsten erreichten Punkt freuen. 🙂 Yeah.

Was zum Spielen, was zum Basteln …

… und was zum Lachen mal in diesem Fall. Einen kleinen Einblick in die Vielfalt eines OpenSource-Projektes liefert folgender Schnipsel:

[code lang="csharp"]public void ResetChildPrimPhysicsPositions()
{
AbsolutePosition = AbsolutePosition; // could someone in the know please explain how this works?

// teravus: AbsolutePosition is NOT a normal property!
// the code in the getter of AbsolutePosition is significantly different then the code in the setter!
}[/code]

Schauen wir uns das mal an: Der Inhalt einer Variable wird ohne weitere Modifikation derselben zugewiesen. Und jemand schreibt dazu: Kann mir ein Wissender einmal erklären, wie das funktionieren soll? Zu Recht, glaubt man zunächst. Ich finde das „in the know“ wirklich Klasse, viel netter als im Deutschen und humorvoll. Und auch das „how“ ist nett, denn DASS es klappt ist ja eh klar, die Frage ist nur: Was soll das überhaupt?

Die Antwort dazu liefert nicht wirklich Aufschluss, ist auch ziemlich trocken, lediglich sagt sie im Prinzip: „Macht Sinn“. Sicherlich mag nicht jeder darüber schmunzeln können, ich jedoch musste herzhaft lachen als ich über diesen kleinen Ausschnitt des OpenSim-Projekts gestolpert bin.

Mein Kommentar dazu: Oh ja, es mag tatsächlich Sinn machen. Und zwar dann, wenn der Inhalt der Variable vorher nicht „sauber“ war. Wir kennen das von arithmetischen Zuweisungen im Shell-Bereich. Nehmen wir einmal folgenden Befehl:

[code lang=“bash“] zahl = “     5″[/code]

Damit steht in der Variable „zahl“ ein String der hinten nach einer Zahl riecht. Sauber ist das natürlich nicht, und das simple Statement:

[code lang=“bash“]zahl = `expr $zahl`[/code]

bereinigt die Situation. Jetzt steht tatsächlich nur noch die Ziffer 5 in der Variable zahl. Eine Art trimmen hat stattgefunden. Jetzt mag man sagen, aber das steht doch oben nicht im Code, da fehlt doch der Aufruf eines Programms wie „expr“. Dabei vergisst man aber, dass Hochsprachen-Compiler Code generieren der das sogenannte Coercion ausführt, eine Typwandlung zum möglichst Passenden. So wird ein String „5“ der durch irgendeinen dummen Zufall in einer Integer-Variable enthalten sein mag durch eine erneute Zuweisung zu einer echten Zahl. Allerdings hätte da bei der primären Zuweisung schon dasselbe passieren sollen aber das hat möglicherweise ein Dritter gebaut 😉

Und nein, ich werde meine Gedanken dazu nicht in die Quelldateien einbauen, erstens bin ich nicht Mitglied des ehrenwerten Gremiums und zweitens – bei allem Verständnis für humorvolles Arbeiten – finde ich einen chat über die Sourcen dann doch etwas mühsam. ^^

Umzugsservice von A nach B

Mit der Zeit häufen sich auch im virtuellen Dasein eine Menge Güter an. Die alte Erkenntnis aus der materiellen Welt – je größer die Wohnung, desto mehr Plunder – gilt auch, und erst recht, für die virtuelle Welt, denn das Inventar ist riesig.

Es lohnt sich, Ordnung in diesem Inventar zu halten. Nicht nur, während man sich in der virtuellen Welt aufhält („Wo waren noch einmal diese tollen Schuhe, die ich vor einem halben Jahr mal gekauft habe?“), sondern auch für den Fall, dass man mal umzieht.

Second Life ist diesbezüglich mal wieder etwas „kastriert“, denn nach den neuesten Spielregeln von Linden Lab dürfen nur solche Objekte exportiert werden, die man selbst erstellt hat. Fast könnte man meinen, die Lindens hätten sich das bei einem anderen Weltenschöpfer abgeguckt, denn bekanntermaßen nimmt man auch aus diesem ganz unvirtuellen Leben nichts mit.

Für OpenSim gelten diese Beschränkungen nicht. Einen Weg, Ländereien, Güter und Besitztümer von A nach B zu transportieren, stellt die Möglichkeit einer OAR-Datei dar. Wie das funktioniert, habe ich bereits an anderer Stelle geschildert.

Allerdings haben manche Viewer auch eingebaute Möglichkeiten, virtuelle Gegenstände zu exportieren und in einem anderen Grid wieder zu importieren. Der offizielle Linden-Viewer bietet diese Möglichkeit nicht, aber der Hippo Viewer beherrscht den Export von Objekten, ebenso der Imprudence-Viewer, der von OSGrid als Standardviewer empfohlen wird.

Über die Konsole gibt s zwar auch die (experiementelle) Möglichkeit, ein komplettes Inventar zu exportieren, beim Export über den Viewer jedoch mus das Objekt gerezzt sein. Anschließend muss das Objekt noch markiert, sein, ehe man mit dem Export beginnen kann. Die Position der jeweiligen Prims wird ebenso mitexportiert wie die Information, ob die Prims verlinkt sind. Gespeichert wird das Ganze in einer XML-Datei.

Ebenfalls mitexportiert werden die Texturen, die der Viewer jeweils in Dateien ablegt, die die bisherige UUID als Dateinamen tragen.

Beim Import hat man dann die Wahl, entweder nur das Objekt selbst oder die Texturen gleich mit zu importieren.

Nach meinem subjektiven Empfinden beherrscht der Imprudence Viewer den Im- und Export ein wenig besser als der Hippo Viewer. Zumindest erhielt ich beim Imprudence keine Fehlermeldung, während der Hippo meckerte, dass er die eine oder andere Textur nicht tranportieren konnte.

Nicht mit exportiert werden Skripte und Animationen, die in den Prims enthalten sind. Während Skripte einfach per Copy & Paste neu angelegt werden können (sofern man die notwendigen Rechte auf das Skript hat), muss man die Animation als Kopie auf der Festplatte haben und sie neu hochladen.

Wichtig zu wissen ist noch: Im Zielgrid wird der importierende Avatar auch als Creator eingetragen.

Informationen zu WordPress

Weil ich gerade etwas suchen musste um es letztlich zu finden: WordPress braucht die gd-Library um Thumbs (diese miniaturisierten Grafiken) zu erstellen, und bei Debian ist das das Package „php5-gd“, weil WordPress natürlich php und so … 😉

Und um im guten alten Brenner-Stil weiterzumachen: Aber wenn du jetzt denkst, das geht so ohne weiteres, dann Irrtum, weil:

[code lang=“dos“]dpkg: libgd2-noxpm: dependency problems, but removing anyway as you request[/code]

und da

[code lang=“dos“] webalizer depends on libgd2-noxpm (>= 2.0.36~rc1~dfsg) | libgd2-xpm (>= 2.0.36~rc1~dfsg); however:
Package libgd2-noxpm is to be removed.
Package libgd2-xpm is not installed.
(Reading database … 38287 files and directories currently installed.)
Removing libgd2-noxpm …
Selecting previously deselected package libgd2-xpm.
(Reading database … 38276 files and directories currently installed.)
Unpacking libgd2-xpm (from …/libgd2-xpm_2.0.36~rc1~dfsg-3+lenny1_amd64.deb) …
Selecting previously deselected package libt1-5.
Unpacking libt1-5 (from …/libt1-5_5.1.2-3_amd64.deb) …
Selecting previously deselected package php5-gd.
Unpacking php5-gd (from …/php5-gd_5.2.6.dfsg.1-1+lenny9_amd64.deb) …
Setting up libgd2-xpm (2.0.36~rc1~dfsg-3+lenny1) …
Setting up libt1-5 (5.1.2-3) …
Setting up php5-gd (5.2.6.dfsg.1-1+lenny9) …[/code]

könnten wir jetzt ein Problem mit WebAlyzer haben … ,) … nun, das sehen wir dann morgen nach dem nächsten Lauf. 🙂

Solution – was für ein treffender Name

„Solution“ nennt Microsoft bei ihren IDEs (Integrated Development Environment) – und davon gibt es schon bei den VisualStudio-Express-Varianten vier Stück  (Basic, C++, C# und das andere hab ich grad vergessen) – eine Sammlung von Projekten unter einem Dach. Es gibt also, anders als bei anderen Entwicklungsumgebungen noch etwas über dem „Projekt“, und bei den OpenSim-Entwicklungen wurde das hinreichend genutzt. Das Programm eignet sich sicherlich recht gut für Teamarbeiten. Eine gute Sache, dass M$ diese Express-Version kostenlos zur Verfügung stellt für private Nutzungen, so kann man reinschnuppern und erste Gehversuche damit machen. Tja, wäre es so leicht für iPhone Apps zu entwickeln … aber das ist eine andere Geschichte. 🙂 Solution – was für ein treffender Name weiterlesen