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

Im Linden-Dschungel Teil 2

Immer noch geht es um die Linked Prims, aber möglicherweise fangen wir gerade erst an, wollen also nicht so lamentieren zu Beginn ;).

Um das Logging zum Einsatz zu bringen waren noch zwei Includes (using bei c#) notwendig und das Anlegen einer statischen Variable. Erstes Modul auf das ich mich stürze ist MySQLRegionData.cs in Region/Framework/Scenes. Kein Erfolg ist feststellbar dass das Loggen irgendein hilfreiches Protokoll bringt. Die else-Zweige bei der Prozedur StoreObject die beschritten werden wenn kein „persistent“ gegeben ist das zum Speichern führen soll werden entkommentiert und mit Leben gefüllt, aber nichts zu bemerken. Es kommen aber schon interessante Erkenntnisse darüber was da wann geschieht, der eine else-Zweig dient nämlich dazu im Modus „selected“ noch nicht zu speichern, klingt vernünftig. Auch Anpassungen im neuen MySQLLegacyRegionData.cs – das in der 0.6.6er noch gar nicht vorhanden war – bringen nichts.

Der nächste Bereich ist, dass ständig – und zwar im 20-Sekunden-Abstand – von diesem Modul versucht wird auf Speicherfähigkeit zu prüfen, ehrlich gesagt halte ich die Last die hier erzeugt wird für ziemlich schlecht. Man merkt das ja gar nicht da im else-Zweig keine Ausgabe erfolgt, mit den debugging-Infos kommt alle paar Sekunden – und das schon für nur 3 Prims „did not update persistance“. Der interessante Punkt ist der, dass nur gespeichert wird wenn „HasGroupChanged“ wahr ist. Ich suche eine Art „HasPositionChanged“ das aber nicht aufzutreiben ist.

In der 0.6.9er wird das in Vorgängerversionen verwendete Setzen von HasGroupChanged an etlichen Stellen auskommentiert. Da mir das verdächtig erscheint nehme ich es mal wieder rein, jedoch ohne dass dies Auswirkungen auf das Speichern von Links hätte.

Nach einigen Tests bekomme ich schließlich eine Erleuchtung: Wir suchen ja einen Trigger der ausgelöst wird noch bevor überhaupt in den Speicherbereich eingestiegen wird, denn selbst VOR dem Speichern müsste ein Wechsel vom Fokus beim Select ja schon das Erhaltenbleiben des Links signalisieren, was definitiv nicht geschieht. Bisher also die komplett falsche Baustelle – die aber einige nette Erkenntnisse gebracht hat die wir sicherlich irgendwann gebrauchen können 😉

Mit vollständig neuer Herangehensweise steige ich in den ClientStack ein, nach einiger Suche werde ich fündig: Es gibt einen LinkHandler neben etlichen anderen – nämlich für all das was im Client ausgelöst werden soll – in LLClientView.cs im Bereich Region/ClientStack/LindenUDP. Und Heureka: Dort ein Logging eingebaut bringt sofort nach dem versuchten Linken eine Protokoll-Meldung auf der Konsole: Ich habe soeben den Hebel an der richtigen Stelle angesetzt.

Aus gegebenem Anlass: Ein Bewegungs-Script ohne Physics für OpenSim

[code lang=“c“]
integer alpha = 0;
vector basepos;
vector newpos;
integer timerset = 0;
float meterProSec = 3;
float offsetX = 0.0;
float offsetY = 0.2;
float offsetZ = 0.0;
integer i = 0;
integer timerSec = 1;
float grenzeYL = 100.0;
float grenzeYH = 110.0;
float grenzeXL = 100.0;
float grenzeXH = 110.0;
default
{
state_entry() {
llSay(0, „ready“);
llSleep(0.1);
basepos = llGetPos();
}

timer() {
vector pos = llGetPos();
float miniOffsetY = offsetY / 10;
float miniOffsetX = offsetX / 10;
for (i = 1; i <= 20; i++) { newpos = pos + ;
llSetPrimitiveParams([PRIM_POSITION, newpos]);
llSleep(0.1);
}
//llOwnerSay(“ am at : “ + (string)newpos);
//llOwnerSay(“ offsets : “ + (string)offsetX + „/“ + (string)offsetY);

// die randsteine
if ((newpos.x <= grenzeXL) && (newpos.y >= grenzeYH)) {
offsetX = meterProSec;
offsetY = 0;
llSetRot(llEuler2Rot(<0.0, 0.0, -PI_BY_TWO>) * llGetRot());
//llOwnerSay(„c1“);
} else if ((newpos.x >= grenzeXH) && (newpos.y >= grenzeYH)) {
offsetX = 0;
offsetY = -meterProSec;
llSetRot(llEuler2Rot(<0.0, 0.0, -PI_BY_TWO>) * llGetRot());
//llOwnerSay(„c2“);
} else if ((newpos.x >= grenzeXH) && (newpos.y <= grenzeYL)) { offsetX = -meterProSec; offsetY = 0; llSetRot(llEuler2Rot(<0.0, 0.0, -PI_BY_TWO>) * llGetRot());
//llOwnerSay(„c3“);
} else if ((newpos.x <= grenzeXL) && (newpos.y <= grenzeYL)) { offsetX = 0; offsetY = meterProSec; llSetRot(llEuler2Rot(<0.0, 0.0, -PI_BY_TWO>) * llGetRot());
//llOwnerSay(„c4“);
}

// die notfallbremsen
else if ((newpos.y > grenzeYH) && (offsetY != 0)) {
offsetY = 0;
offsetX = meterProSec;
llSetRot(llEuler2Rot(<0.0, 0.0, -PI_BY_TWO>) * llGetRot());
//llOwnerSay(„c5“);
} else if ((newpos.x > grenzeXH) && (offsetX != 0)) {
offsetX = 0;
offsetY = meterProSec;
llSetRot(llEuler2Rot(<0.0, 0.0, -PI_BY_TWO>) * llGetRot());
//llOwnerSay(„c6“);
} else if ((newpos.y < grenzeYL) && (offsetY != 0)) { offsetY = 0; offsetX = meterProSec; llSetRot(llEuler2Rot(<0.0, 0.0, -PI_BY_TWO>) * llGetRot());
//llOwnerSay(„c7“);
} else if ((newpos.x < grenzeXL) && (offsetX != 0)) { offsetX = 0; offsetY = meterProSec; llSetRot(llEuler2Rot(<0.0, 0.0, -PI_BY_TWO>) * llGetRot());
//llOwnerSay(„c8“);
}
}
touch_start(integer total_number) {
if (timerset) {
llOwnerSay(„stopping timer“);
timerset = 0;
llSetTimerEvent(0);
} else {
llOwnerSay(„starting timer“);
timerset = 1;
llSetTimerEvent(timerSec);
}
}
}
[/code]

des Programmierers Fundgrube: Wiederholungen

Es geht doch nichts darüber, wenn man gelegentlich Dinge findet die sich einfach kopieren lassen. Sei es von anderen (Programmierer klauen bekanntermassen wie die sprichwörtlichen Raben ^^) oder eben von einem selbst. Und es gab schon bei der mittlerweile schön laufenden 0.6.6 Probleme beim Speichern, die schon erwähnte GroupPosition lief gelegentlich auf einen kapitalen Fehler da sie nicht speicherbare Werte enthielt. Und damals – es ist witzigerweise fast genau ein Jahr her – ergänzte ich die Routine MySQLRegionData.cs um folgenden Schnipsel, der mir gute Dienste leistet immer noch:
[code lang=“csharp“]// bert@wolfsbone.de START 20091018
m_log.DebugFormat(„[DATA]: [BTRACE]: we will now inspect GroupPosition-Value Z“);
double tempGroupPositionZ = prim.GroupPosition.Z;
string tempString = tempGroupPositionZ.ToString(„0.00“);
string tempMessage = „[DATA]: [BTRACE]: it is: <“ + tempString + „>“;
m_log.DebugFormat(tempMessage);
if (tempString == „NaN“) {
m_log.DebugFormat(„[DATA]: [BTRACE]: now setting to 30, should be okay.“);
tempGroupPositionZ = 30;
}
// bert@wolfsbone.de END 20091018

cmd.Parameters.AddWithValue(„GroupPositionX“, (double)prim.GroupPosition.X);
cmd.Parameters.AddWithValue(„GroupPositionY“, (double)prim.GroupPosition.Y);
cmd.Parameters.AddWithValue(„GroupPositionZ“, (double)tempGroupPositionZ);[/code]

Etwas Ähnliches wollen wir dann doch mal wieder einbauen in die 0.6.9er, zunächst nur mit Meldecharakter um zu sehen was wann geschieht.

erste Annäherung

Nun, es gilt eine Aufgabe zu bewältigen, und diese heißt: Verlinken soll funktionieren. Wesentlich – wie immer im Bereich des (manchmal lästigen ;)) Reverse-Engineerings – ist, dass man langsam genug voranschreitet um einzelne Effekte auch klar einer bestimmten Ursache zuzuordnen.

Erste Aktion war, die mit dem Fehler behaftete Version standalone zum Laufen zu bringen. Das ist soweit geglückt, es sind einige Parameter in der OpenSim.ini und eine Standalone-Common.ini im config-include Bereich zu bestücken. Aktuelle Version an der ich bastele ist ja die 0.6.9er. Der standalone-Test ergibt – und in diesem Fall glücklicherweise – dass der Fehler auch dort auftritt. Das ist beruhigend, somit liegt es an der Grundversion und nicht an der falschen Implementierung ins Grid.
erste Annäherung weiterlesen

Basteln, basteln, basteln

Nun, es wird allmählich etwas belebt auf meinem Stück Land mit Namen ‚Vanaltens Restplace‘. Diese Parzelle erstreckt sich ja hier – anders als in unterteilten Regionen üblich – auf die gesamte Region ‚Vanalten‘. Erste Bäume hab ich heute ‚gepflanzt‘ und zwei Treppen an das Grundgerüst vom Haus angeflanscht. Ich mag diese Technik mit den cut-path-Zylindern die dann einen angenehmen Zugang ermöglichen aus jeder Richtung. Bin ja nicht so der Typ der Enge mag wie bekannt 😉

Apropos Bäume, wenn wir das Problem mit den Links in den Griff bekommen haben – das hat zunächst Priorität – dann möchte ich auch gerne die geliebten Copses wieder implementieren, so nenn ich sie immer: Es handelt sich um selbst wachsende und sich vermehrende Bäume, ein nettes Feature. Man sollte allerdings darauf achten das Ganze etwas zu begrenzen, sonst hat man schnell ein nahezu undurchdringliches Dickicht (gut, es ist alles phantom, insofern ^^). Diese sich selbst fortpflanzenden Teile sind tatsächlich nett, denn es kehrt etwas virtuelles Leben ein und die Situation die man vorfindet ist nicht immer dieselbe. Es kann sehr erstaunlich sein was es bedeutet wenn manchmal 100 unerwartete Bäume irgendwo rumstehen, ganz abgesehen davon dass man auch unter Umständen damit konfrontiert wird zumindest temporär im Wohnzimmer die Äste einer Eiche durch die Wände kommen zu sehen.

Die Geschichte mit den linked-Prims ist wirklich lästig, nun ich hab das Verzeichnis mal kopiert und eingefroren, werde übersichtliche Versionen der Config-Files erzeugen und dann in einen exakten Vergleich einsteigen um festzustellen, was da jetzt so anders ist im Vergleich zu unserer sauberen 0.6.6er (die übrigens immer noch stabil läuft, siehe hier). Im Moment müssen wir halt zur Not auf die Sandbox ausweichen, denn wie Roland mir erzählt hat klappt das Übertragen dort verlinkter Objekte zu unseren Regionen einwandfrei und der Verbund bleibt auch erhalten.

Neue Version geplant bei Metropolis

Wie aus Insider-Kreisen bekannt wurde, ist geplant am kommenden Sonntag auf die 0.7er Version von OpenSim umzustellen. Wir werden sehen inwieweit das die bestehenden Regionen beeinflußt und ob es dann Empfehlungen für die Konfiguration geben wird. Wie schon früher berichtet ist man mit der Standard-Config der 0.7.0.2er ja nicht in der Lage sich dort anzubinden. Hier mögen spezifische Anpassungen notwendig sein, die dann sicherlich publiziert werden.

„Einige Nachbarn sind vorbei gekommen …

… um dich zu begrüssen.“ So heißt es doch immer so nett bei den Sims. Und so war es denn auch heute, und es gab schon Gastgeschenke: Baumstämme zum sitzen, ein Planierscript (das ich nicht wirklich brauche, aber es ist ja gut gemeint) und einen Prim mit einer Status-Seite. Letzteres ist wirklich nett, da man damit eine Übersicht gewinnt wer gerade online ist. Die Gemeinde ist noch sehr klein von Metropolis, aber ich bin beeindruckt von ihrer Freundlichkeit. Dass es sich um überwiegend Deutsche handelt ist nicht nur nicht schlimm, sondern tatsächlich ganz angenehm. Man erspart sich die Zwischentöne in anderer Sprache die man nicht beherrscht. 🙂

Erste Bearbeitungen des neuen Lands liefen auch sehr problemfrei, die Maschine verhält sich trotz der zwei Sims die sie jetzt parallel betreiben muss anstandslos.

Aber zurück zum Thema: Es ist interessant, dass sich Leute in solch wachsenden Computer-Umgebungen sehr verhalten wie Pioniere im echten Leben. Man hilft sich gerne gegenseitig, ist aber auch auf gewisse Grenzen bedacht, „seine Claims abstecken“ sozusagen. Geht es um gemeinsame Probleme ist man füreinander da. Auch Zeit zum Sitzen und Reden hat eigentlich fast immer jeder. Auch sind Stippvisiten angesagt, und das nicht nur aus Freundlichkeit, sondern auch aus Neugierde, ob sich der Neue wohl richtig verhält? Tut er irgendwelche Dinge die die Gemeinschaft abschrecken könnten? Ist er brauchbar? Ist er ein Aufschneider? Unterstützt er die gemeinsame Sache?

Verständlich, dass das die Leute umtreibt die am Kern der Sache mitwirken. Und Metropolis scheint tatsächlich in den Startlöchern zu stehen als einer derjenigen, der das Erbe von SL antreten wird. Nachdem die Beschränkungen dort anfangs noch wirkten, sind sie mittlerweile nur noch albern. Und eine Gemeinschaft die daraus besteht, dass sozusagen ein „Gesellschafts-Server“ betrieben wird der den Zusammenhalt regelt, in der aber ansonsten jeder seinen eigenen Claim für sich selbst organisieren muss – keine Beschwerden über schlechte Performance bitte 😉 – könnte Zukunft haben. Die Weite des Landes macht es möglich viel toleranter zu sein, als wenn du nur 1024qm hast und neben dir jemand einen 100m hohen Wolkenkratzer hochzieht. Findet das mit 200m Distanz statt ist es schon etwas ganz anderes, mal davon zu schweigen, dass durch die Einschränkung der Sichtweite solche Gebäude eh kaum auffallen.

So muss ich zugeben, dass diese kleine Gemeinde einen gewissen Charme hat. Man lässt sich überwiegend in Ruhe („ich will dich jetzt nicht weiter stören, du hast ja noch viel zu tun“) und die bisherigen Kontakte waren ausnahmslos angenehm. Demnächst werde ich mal die Umgebung etwas erkunden und meinerseits nachbarschaftliche Besuche abstatten. Anders als Besucher bei den SIMs geht man dort glücklicherweise nicht gleich zum Kühlschrank oder benutzt ohne zu fragen die Toilette. Gut – die Auswirkungen bei den sanitären Einrichtungen im Simland sind auch unter Umständen drastischer. 😉

Gehorcht der Dackel nicht …

… dann vielleicht der Bobtail. So oder ähnlich könnte man sagen ist der Weg, den ich gerade beschreite, um zu einem konsistenten Verhalten zu kommen innerhalb von Metropolis. Aber gemach mit den Analogien, wir sind ja im Bereich ‚Technisches‘ ^^

Ein versuchter Umstieg auf die aktuelle 0.7.0.2 scheiterte kläglich daran, dass diese Version nicht in der Lage ist, sich vollständig mit den Metagrid-Servern zu verständigen. Im Standalone-Mode läuft sie wunderbar, und hier konnte auch schön getestet werden was die Ursache für die fehlenden Permissions ist, denn die ’serverside_permissions‘ sollten beibehalten werden, sonst ist jeder Estate-Manager, jeder kann alles erzeugen auch wenn es verboten ist. Das ist – bei aller Freude am Teilen – nicht das was man möchte. Auch nicht in virtuellen Welten 😉 Aber damit ist es im GridMode nicht getan, denn dann läuft die 0.7.0.2er auf eine Exception wegen fehlender Friends-Module, eine schnelle Recherche hierzu brachte keine Workarounds, lediglich den lapidaren Hinweis darauf, dass alles ab 0.7 nicht im Gridmode lauffähig ist, bzw. es strengstens empfohlen wird die aktuell angebotene Version zu benutzen (das ist die 0.6.8er, +räusper+ …) Schade eigentlich, denn ansonsten macht sie einen fitten und flotten Eindruck. Und schade auch, dass die viele Arbeit die beiden Konfigurationen der 0.6.8er und der 0.7er zu mischen vergeblich war, denn – hey Leute – wenn etwas dazu kommt ist das ja kein Problem, aber im Bereich von 1000 Zeilen wild Parameter hinzuzufügen, wegzulassen oder zu ersetzen … Gäbe es nicht wunderbare Unix-Tools eine von Kommentaren und Leerzeilen bereinigte Version herzustellen (danke grep, und insbesondere egrep mit seinen regulären Ausdrücken) dann käme man so schnell nicht zum Ziel.

Die 0.6.8er wird zwar offiziell empfohlen, hat aber ihre Tücken in anderer Richtung: Schaltet man nämlich die Serverside-Permissions an (will heißen, der RegionsServer, also derjenige auf dem der SIM eigentlich läuft hat noch die Kontrolle über die Rechte), dann sieht zunächst alles gut aus, weil Fremde nichts mehr dürfen. Das Problem ist aber, dass auch man selbst kaum noch etwas kann, das fängt schon dabei an die Parzelle zu benennen, und schaut man in die Land-Infos wird schnell klar warum: Noone ist der Owner, nun gut, dann ist einiges klar. Außerdem will die Region sich partout nicht anständig beim Login verständigen, so dass man immer darauf angewiesen ist zunächst irgendwo anzukommen und dann per Flug oder Teleport nach Hause zu gelangen, nicht die ideale Art. Wer will schon immer den Nachbar fragen, ob man mal gerade den Trampelpfad benutzen darf, da die Strasse zum eigenen Grundstück noch nicht fertig ist. Obwohl das natürlich zugegebenermaßen die Kontakte intensiviert (wie gehabt, danke Paul von FluffyIsland 🙂 ).

Da schon aufgefallen ist, dass einige Nachbarn die 0.6.9er am laufen haben (seltsamerweise FluffyIsland nicht, aber die 0.6.8er dort wird nicht die offizielle sein schätze ich mal ;)), obwohl diese – wie gesagt – noch nicht empfohlen wird, mal eben schnell von SourceForge diese gezogen (wget ist wirklich so genial wie simpel), ein kleines Script aufgesetzt, das es ermöglicht die Konfigurationen flott zu übertragen, und in der Standard-Config gestartet: Siehe da, sie läuft. Ein versuchter Login: Yeah, jetzt kommt man auch direkt auf die eigene Region. Es wird. Und nachdem die serverside_permissions wieder eingeschaltet wurden – oh Wunder – jetzt ist es wie es sein soll: Der Owner bleibt erhalten, andere sind keine Estate-Manager mehr und erzeugte Objekte werden geschützt. Dann noch schnell das Ganze an screen übergeben, denn es macht keine Laune den eigenen Rechner laufen lassen zu müssen damit die Konsole erhalten bleibt. Außerdem sind hiermit nächtliche automatisierte Neustarts möglich, mono bläht sich im Laufe der Zeit gerne etwas auf, aber da es sich um eine Interpretation von Windows-Bibliotheken handelt hab ich volles Verständnis für ein tägliches Frischmachen der Windeln :P. Aber das soll jetzt nicht böse klingen, die Kombination von mono und nant (Compiler) um das originär für .net-libs geschriebene Zeugs zum Rennen zu bringen ist schon sehr tauglich. Fast könnte man Lust bekommen sich in c# einzuarbeiten 🙂

Insgesamt zwar ein seltsamer aber erfolgreicher Weg zum Ziel. Bobtails find ich eh netter, wer mag schon Wadenbeisser? 😉