friedliche Koexistenz: zwei Baumarten

Screenshot Blender Baumarten

Screenshot Blender Baumarten

Nachdem der letzte Screenie von einem generierten Baum ja schon ein Weilchen her ist, ist es vielleicht mal an der Zeit für ein Update zur Generierung der Umwelt :) Rechts ein gerade gemachter Screenshot aus Blender heraus, in dem ihr ein paar Bäume von zwei verschiedenen Baumarten (eine der Tanne ähnlich, die andere soll einmal Birke werden) seht. Wie ihr euch also denken könnt, habe ich in letzter Zeit einige Tests mit Bäumen verschiedener Baumarten, die um dieselben Ressourcen konkurrieren. Ach, und ein paar schöne Methoden zum Pflanzenarthandling geschrieben, die einem das Erstellen und Verwalten von verschiedenen Pflanzenarten erleichtern :)

Posted in Graphic-O-Matic. Tagged with , , .

How-To: Python Scripting in Blender: (0) Einrichtung der Blenderoberfläche

Wenn man hobbymäßig 3D Objekte erstellen und vielleicht sogar animieren möchte, ist Blender wohl die kanonische Wahl. Es ist umfangreich, es gibt viele schöne Tutorials im Netz und dank GPL ist der ganze Spaß auch noch umsonst. Mehr kann ich dazu gar nicht sagen – ich bin dann doch eher der Programmierer als der Graphiker. Und daher kommen wir gleich zu Python – eine Programmier- / Skriptsprache, mit der man solche 3D Objekte auch durch Coding erstellen kann. Und genau darum wird es in dieser Tutorialreihe gehen :)

Standardansicht von Blender

Standardansicht von Blender

In diesem nullten (warum nicht ersten? a) Programmierer dürfen mit Null anfangen zu zählen und b) in diesem Tutorial geht es nur um das Einstellen der Blenderoberfläche, noch nicht um Python – wer Blender schon einmal gesehen hat, wird hier nichts neues lernen..) Tutorial werden wir ausgehend von den Standardeinstellungen von Blender alle Schritte erklären, um ein erstes eigenes Python Script in Blender ausführen zu lassen.

Continue reading

Posted in Code-O-Matic, Graphic-O-Matic. Tagged with , , .

von Coding, Customizing und Daten

Ich habe in letzter Zeit häufiger mal das Stichwort Customizing genutzt und daher entschieden, mal einen kurzen Artikel über die Unterscheidung von Coding, Customizing und Daten einzustellen. Die Art der Unterscheidung die ich hier eben vorstellen möchte wird in der Praxis viel genutzt und hat dort ihre Eignung für komplexe Systemlandschaften  gezeigt, Systemlandschaften mit mehreren Produktivsystemen und pro Produktivsystemen zu mindestens ein Entwicklungssystem, wahrscheinlicher jedoch mit einem Entwicklungs- und einem Testsystem pro Produktivsystem. Wir unterscheiden also drei Arten von “Informationen”:

  • Coding: Ok, das ist wohl selbsterklärend. Coding ist alles, was der Entwickler in einer Programmiersprache (im Editor) schreibt und für die Ausführung compiliert wird. Coding kann (sollte) nur auf dem Entwicklungssystem geändert werden, nach Freigabe auf das Testsystem transportiert werden und erst nach erfolgreichen Tests auf das Produktivsystem übernommen werden.
  • Customizing: Customizing beinhaltet alle Informationen, die auf der Datenbank gespeichert werden und Einfluss auf die Ausführung des Programms haben. Im Normalfall werden Customizing Einstellungen auf dem Entwicklungssystem geändert und dann wie Coding gehandhabt: Die Änderungen werden auf das Testsystem transportiert, dort getestet und im Erfolgsfall auf das Produktivsystem übernommen. Beispiele für Customizingdaten sind zum Beispiel globale Einstellungen – ist ein Service aktiv? Wie hoch ist der Schwellwert für..? Oder in unserem Fall gehören pflanzenartspezifische Informationen wie in Fast ein Baum im Baum oder von Umweltfaktoren und ihren Auswirkungen angesprochen dazu.
  • Daten: Daten sind auch Information, die auf der Datenbank gespeichert werden, aber anders als Customizingdaten bedarfen diese Daten keinen Tests und werden daher nicht durch die Stufen der Entwicklungslandschaft transportiert. Zu Daten zählen alle Informtionen, die (im Betrieb) im Lifesystem entstehen. Sie werden nicht handisch vom Entwickler eingegeben, sondern im Normalfall importiert oder während des Lifebetriebs erhoben und direkt auf der Datenbank des Produktivsystems gespeichert. Beispiele sind Kundendaten, Bestellungen oder – in unserem Fall – Pflanzen, Vertices, Sprites und Werte von Umweltfaktoren.

So weit zur Unterscheidung, aber warum der ganze Zirkus? Eine “Informationsart” Daten zu haben ist einleuchtend – die täglich anfallenden Daten, die keiner Tests bedarfen täglich, stündlich, minütlich durch die Systeme zu transportieren ist unnötig, langsam und teuer. Dass wir Coding brauchen ist wohl auch klar – wie sonst soll das System wissen, was zu tun ist? Dass Coding nicht direkt im Betrieb geändert werden sollte ist wegen der Gefahr ovn Inkonsistenzen und Bugs auch schnell ersichtlich. Aber warum brauchen wir Customizing? Wir könnten doch einfach alles hart kodieren? Oder direkt auf dem produktivsystem ändern? Letzteres entfällt eben wieder wegen der Gefahr von Inkonsistenzen und Bugs. Zur anderen Option: Einstellungen, Schwellwerte etc. in Customizing Tabellen zu speichern anstatt sie hart im Code zu hinterlegen hat viele Vorteile. Zunächst sind mögliche Änderungen um einiges einfacher – wenn ein Schwellwert doch zu hoch oder zu niedrig ist, dann ist der (sinnvoll benamste) Wert in der Tabelle schnell geändert.  Hunderte von Codezeilen zu durchforsten ist um einiges mehr Arbeit, egal wie gut der Code geschrieben und kommentiert ist. Ein zweiter Vorteil ist die bessere Wiederverwendbarkeit von Code. In der Simulation der Umwelt folgen alle Berechnungen demselben logischen Grundmuster, unabhängig von der Pflanzenart. Alle pflanzenartspezifischen Eigenheiten werden von der Datenbank gelesen und automatisch vom Coding berücksichtigt. Ohen die Verbindung mit Datenbanktabellen müsste ich für jede Spezies eine Kindklasse einführen. Die Liste der Gründe für Customizingtabllen geht noch weiter, aber ich will eure Geduld nicht mehr als nötig strapazieren. In der Zusammenfassung: Coding sollte sich auf die Logic des programms beschränken, alle notwendigen Werte (die getestet werden sollen) gehören in Customizingtabellen. Alle Daten, die nicht getestet oder von einem Entwickler geprüft werden müssen können (direkt) auf der Datenbank des Produktivsystems gespeichert werden.

Posted in Code-O-Matic. Tagged with .

Gimmick: Das Orakelirgendwas :D

Sooo.. Neben den ganzen ernsten (wenn auch hoffentlich coolen) Features, die man gerne in so einem Spiel umsetzen möchte, gibt ja noch eine weitere Klasse von Features, die in keinem guten Spiel fehlen dürfen und (in meiner Vorstellung) noch mehr Spaß zu entwickeln und umzusetzen machen als die großen, coolen, echten Features: Gimmicks :D In einer langen, arbeitsintensiven Session *hust* hatten wir dazu ein paar Ideen, von denen ich eine nun teilen möchte: Die Orakelkluft / -klippe / -höhle ist ein Ort auf der Spielwelt, nicht zu einfach zu erreichen. Wenn man die richtigen Fragen in die Orakelirgendwas ruft, kommt nicht das Echo zurück, sondern eine passende oder eben nicht passende Antwort :) Am besten mit viele schönen Seitenverweisen :) Die Fragen mit Blödsinnsantworten müssen schwer zu finden sein, während man gerne auch spielrelevante ernsthafte Fragen fragen kann. Beispiele für Blödsinn:

  • Yo, my son, which of these is the most stylish thing to wear? – Hey, whatever I select. (Terry Pratchett, the Monks of Cool).
  • Hast Du schon mal jemanden getroffen, den Du noch nicht getötet hast? – DICH habe ich noch nicht getötet.. (Lethal Weapon)
  • Aber was, wenn es kein Morgen gibt? – Heute gab es nämlich auch keinen.. (Täglich grüßt das Murmeltier)

Beispiele für mögliche sinnvolle Fragen:

  • Wer ist der mächtigste Magier/Kämpfer / der beste Schmied / Koch /..? – Antwort: Charaktername, der das entsprechende Talent am höchsten hat. Dies wäre ein schöner, nicht spielrelevanter Anreiz, der beste, der allerbeste zu werden / zu bleiben und einmal vom Orakel genannt zu werden.
  • Fragen zur Geschichte / zur Welt: Wie heißt das Land, aus dem wir kommen? Wie heißt die Magie der blabla?

Vor allem bei den spielrelevanten Fragen müssen wir aufpassen, dass das Orakel ein Gimmick bleibt und nicht zu einem wichtigen Teil des Spieles wird.. Aber ich fände es lustig :)

Posted in Inspiration-O-Matic. Tagged with .

Wo gehört der Himmel hin?

Ich möchte heute mal ein Problemchen ansprechen, das sicher viele von uns kennen und sich auch in meiner neueren Erfahrung als dankbares (Party-) Gesprächsthema erwiesen hat – zumindestens unter Informatikern ;) Die Situation ist folgende: Man proggt (oder konzeptioniert) fröhlich vor sich hin und im aktuellen Konzept gibt es eine Variable, vielleicht ein Customizingwert oder aber auch die Instanz einer Handlerklasse *hust*, die an unglaublich vielen Stellen verfügbar sein muss. An uuuunglaublich vielen Stellen. So, und was nu? Da gibt es doch einiges, was man tun könnte, spontan fallen mir ein:

  • Die Variable durchreichen, von Objekt zu Objekt, von Methode zu Methode, auf dass sie überall verfügbar ist, wo es notwendig ist.
  • Eine global genutzte Vaterklasse mit entsprechender Instanzvariablen erstellen, von der alle anderen genutzten Klassen (oder zumindestens alle, in denen die Variable benötigt wird), erben.
  • Eine globale Variable erstellen.

Wie finden wir das? Das kommt ganz drauf an, wen man fragt und für welche Situation :) Ich persönlich nutze die erste Variante, solange es genügend Programmzweige / Klassen / Methoden gibt, in denen die Variable nicht genutzt wird und in denen das vor allem auch nicht geplant ist. In der Umweltsimulation ist vor Kurzem der Zeitpunkt gekommen, in dem ich diese Variante unschön geworden ist. Da der Datenbankhandler auch sämtliche gepufferten Daten verwaltet, kann es nun vorkommen, dass auf recht niedriger Ebene Änderungen auftreten, durch die die Kenntnis der Handlerklasse notwendig wird. Dadurch wird eine Änderung von allen Methoden in der Aufrufhistorie notwendig, bis man zu einer ersten Methode gekommen ist, die die entsprechende Instanz kennt. Dann bleiben also noch zwei Möglichkeiten übrig. Tendenziell, wenn die Variable tatsächlich im gesamten Programm verfügbar sein darf und muss, gefällt mir die Möglichkeit einer globalen Variable besser. In der Simulation der Umwelt habe ich mich auch für diesen Teil entschieden. Der Programmieraufwand, diese beiden Möglichkeiten ineinander zu überführen ist glücklicherweise gering, da die Änderung sich beschränkt auf die Headerdateien der vorhandenen Vaterklassen und eben die globals.cpp beziehungsweise die (sehr kurze) neue Vaterklasse, von der alle erben sollen. Warum sich für eine Variante entscheiden um direkt im Anschluss über einen Übergang zur anderen Variante nachzudenken? Die Variante über die Vererbung hat den Vorteil, dass man die Kenntnis auf Programmteile beschränken kann. Momentan ist nicht geplant, dass andere Teile der Offtime Berechnungen in das Programm zur Simulation der Umwelt aufgenommen werden. Wenn wir uns doch dafür entscheiden sollten und die neu hinzukommenen Programmteile die Instanz der Handlerklasse nicht benötigen, würde ich einen Wechsel zur Vererbungsvariante in Erwägung ziehen.

Ach, was der Titel hiermit zu tun hat? In der Simulation der Umwelt hat fast jede Klasse eine 1-1 Entsprechung in der realen Welt, die ich auch so wenig wie möglich zu verletzen versuche. Auch dies war ein Grund für die Entscheidung für eine globale Variable. Die Handlerklasse ist – finde ich – wie der Himmel oder die Luft in dieser Entsprechung – immer da, wird von überall genutzt und ist überall bekannt. Den Himmel im Methodenaufruf weiterzureichen oder ihn als Attribut zu vererben stört diese Realwelt-Entsprechungen.

Posted in Code-O-Matic. Tagged with , .

von Umweltfaktoren und ihren Auswirkungen

Als ich zum ersten Mal über die Auswertung der Umweltfaktoren in der Simulation der Umwelt erzählt habe (zum nochmal Nachlesen: Fast ein Baum im Baum), habe ich mich auf die Reihenfolge der Umweltfaktoren in der Auswertung konzentriert und die dort angesprochene zweite Frage (2. Wie bildet man alle möglichen Beeinflussungsarten wie “beeinflusst die Photosyntheserate” oder “setzt eine obere Grenze” ab?) auf später vertagt – jetzt ist später :) Noch einmal kurz die Ausgangslage: Pflanzen werden von verschiedenen Umweltfaktoren auf die eine oder andere Art beeinflusst. Die Beeinflussung kann abhängig von anderen Umweltfaktoren und deren Konzentration in der die Pflanze umgebenen Umwelt und von der Größe der Pflanze sein und kann verschiedenen Auswirkungen haben, so zum Beispiel Veränderung der der Pflanze zur Verfügung stehenden Energiemenge durch eine feste obere Grenze oder prozentuale Verringerung haben. Welche Umweltfaktoren die Pflanze auf welche Art beeinflussen ist abhängig von der Pflanzenart und muss dementsprechend vom Coding flexibel gehandhabt werden.

Welche Anforderungen stellen sich also?

  • Die Berechnung der Beeinflussung muss an die Pflanzenart angepasst werden können.
  • Änderung und Neuanlage von Pflanzenarten muss ohne Änderung des Codings (Stichwort Customizing) möglich sein.
  • Die Aufnahme eines Umweltfaktors kann von mehreren anderen Umweltfaktoren und auch von Produkten anderer Umweltfaktoren beeinflusst werden.
  • Die Beeinflussungsart kann aus einer Liste von Beeinflussungsarten gewählt werden.
  • Die Beeinflussung kann zeitabhängig oder zeitunabhängig sein.

In der Umsetzung habe ich mich für die Speicherung der Beeinflussung in einer Customizingtabelle entschieden. Im Coding gibt es eine Methode, die die Datensätze aus dieser Customizingtabelle interpretiert und die Berechnung durchführt. Jeder Datensatz enthält die Pflanzenart, den Umweltfaktor, dessen Beeinflussung berechnet werden soll, die Beeinflussungsart, ein Flag, ob die Beeinflussung zeitahängig ist und natürlich alle notwendigen Informationen zu Abhängigkeiten von anderen Umweltfaktoren, dazu zählen bis zu zwei IDs anderer Umweltfaktoren und ein Zahlenwert. In allen bisher angedachten Pflanzenarten hängt kein Umweltfaktor von einem Produkt von mehr als zwei anderen Umweltfaktoren ab. Wenn dieser Fall dennoch eintritt, muss ein Umweg über einen Dummy-Umweltfaktor gewählt werden: Gilt beispielsweise Umweltfaktor1 = Umweltfaktor1 – Zahlwert * Umweltfaktor2 * Umweltfaktor3 * Umweltfaktor4, kann dies umgesetzt werden über DummyUmweltfaktor1 = Umweltfaktor2 * Umweltfaktor3 und Umweltfaktor1 = Umweltfaktor1 – Zahlwert * DummyUmweltfaktor1 * Umweltfaktor4. Auch die Energie wird als Pseudoumweltfaktor umgesetzt, ebenso die Reserveenergie und die Fortpflanzungsenergie. So können alle Werte nach demselben Vorgehen berechnet werden.

In der angesprochenen Methode in der Simulation wird in einer Schleife dann der Einfluss aller Umweltfaktoren in der (mit der im obigen Artikel erklärten topologischen Sortierung) Reihenfolge berechnet. Die ermittelten Werte werden gespeichert und können dann von den anderen Methoden der Simulation ausgelesen werden. Momentan werden nur die genannten Pseudoumweltfaktoren von anderen Programmteilen genutzt, aber es ist aufgrund der gewählten Speicherung der Ergebnisse ohne weiteres möglich, dies auch auf andere Umweltfaktoren auszuweiten. So könnten Pflanzen einer bestimmten Art aufgenommenes Wasser speichern, dies könnte sich in der Wuchsform niederschlagen und letzten Endes auch vom Spieler genutzt werden. :)

Posted in Code-O-Matic. Tagged with , .

Episode IV – A new hope

tracert 216.81.59.173

Ausführen – cmd – tracert 216.81.59.173 – Enter – Spaß haben :)

Posted in Off-Topic-O-Matic.

Was war. was wird: repost.it

Kurz vor dem Release bleibt immer ein klein wenig Zeit darüber zu resümieren was bereits vorhanden ist und was alles noch geplant ist. Und dies lässt sich immer schön in Listenform präsentieren.

Was wird also zum Release von repost.it bereits alles verfügbar sein:

  • Scrollen was die Datenbank hergibt. Endloses Scrollen auf allen Seiten mit Reposts wurden erfolgreich implementiert. Hierzu gibt es auch ein Artikel im Blog.
  • Die Registrierung ist so einfach wie möglich und kommt lediglich mit einem Minimum an Informationen aus.
  • Unter “Repostastic” findest du momentan alles was es über das Mittelmass geschafft hat (noch unabhängig der Anzahl an Bewertungen)
  • Auf “Neu” dagegen findest du dagegen zeitlich absteigend sortiert alle Reposts.
  • Unter “Upload” kann jeder Benutzer eigene Reposts einstellen, sowohl anonym als auch registriert. Dazu braucht man nur ein Link zum Bild und einen Titel. Idealerweise auch gleich einen Link zum Anbieter für eine Bestellung. Die Kommentarfunktion ist momentan nur registrierten Benutzer vorbehalten. Zudem müssen anonyme Benutzer bis zu 15 Minuten warten bevor sie einen neuen Repost einstellen können.
  • Jeder Repost hat eine Detailansicht, erreichbar über das Produktbild. Hier kann jeder seine Stimme abgeben, den Repost liken, plusen oder tweeten oder registrierte Benutzer auch Kommentare hinzufügen.
  • Zusätzlich hat jeder registrierte Benutzer eine Profilseite mit einer kurzen Info zu seiner Person und darunter alle bisherigen Reposts.
  • Zuletzt noch eine “Bug/FAQ” Seite, welche gerade auch zu Beginn jeden Benutzer die Möglichkeit gibt Bugs zu melden.

Soweit zu den Features, die es bereits mit Release gibt. Nun zu dem was noch geplant ist:

  • Reposts, Reposts und Reposts uploaden. Zumindestens werde ich weiterhin versuchen so viel wie möglich Produkte täglich uploaden, um die Datenbank zu füllen ;)
  • Kritische Bugs so schnell wie möglich ausbessern.
  • Benutzer sollen ein eigenes Profilbild einstellen können.
  • Die Anbieter können kommentiert und bewertet werden.
  • Eine Smartphonetaugliche Webseite bzw. dann später auch eine eigene App für iPhone und Androids. Darüber soll es möglich sein mit der Kamera on-the-fly neue Reposts upzuloaden.

Und natürlich alle weiteren Ideen in naher Zukunft, die uns einfallen bzw. wir eventuell auch als Feedback erhalten.

Posted in News-O-Matic. Tagged with .

repost.it Release

Science-O-Matics freut sich über den Release von repost.it am 24.02.2018

Posted in News-O-Matic. Tagged with , .

So weit, so gut – der aktuelle Stand der Datenbank Handlerklasse

Nachdem eine gemeine Erkältung zuerst Chro und dann mich außer Gefecht gesetzt hat, hat die Umsetzung der Datenbank Handlerklasse leider länger gedauert als gedacht. Aber nun steht sie, zumindestens soweit wie geplant. Sämtliche Datenbankzugriffe laufen über sie, die Pufferfunktionalitäten sind implementiert. Der Rahmen für die Berechtigungsprüfungen ist fertig, doch mangels Berechtigungskonzept werden momentan alle Zugriffe erlaubt. Ähnliches gilt für die Logfunktionalitäten – noch wurde nicht entschieden, was ich alles mitloggen möchte. Aber mit dem momentanen Stand kann man leben und – noch viel wichtiger – weiter arbeiten. Ab morgen werde ich mich also wieder dem eigentlichen Thema, dem Feinschliff der Simulation widmen.

Posted in Code-O-Matic. Tagged with , .

JavaScript debuggen

Man mag nicht viel vom Internet Explorer halten, aber momentan ist mein liebster Browser zum Debuggen. In der neusten Version findet man bei dem Zahnrad die “Internetoptionen”, “Erweitert” und “Browsen” folgende drei Checkboxen:

  • “Sktipdebugging deaktivieren (Andere)”,
  • “Skriptdebugging deaktivieren (Internet Explorer)” und
  • “Skriptfehler anzeigen”.

Deaktiviert man die ersten beiden Checkboxen und aktiviert die letzte Checkbox, dann meldet der Internet Explorer sofort Skriptfehler und bietet ein Debugging an.

Posted in Code-O-Matic. Tagged with .

Hauszeichen

Hauszeichen - Wappen

Hauszeichen – Wappen

Beim Stöbern in den Urlaubsfotos von unserem Pragurlaub im letzten Jahr bin ich wieder bei den Hauszeichen hängen geblieben und dachte mir, ich teil das mal mit euch :) Ein Hauszeichen ist das Zeichen einer Familie außen an einem Haus oder Gegenstand. Es zeigte nicht nur den Besitz an, sondern erlaubte auch das eindeutige Erkennen von Häusern ohne Straßennamen und Straßennummern, ohne Lesen können zu müssen. Im Anhang sind Beispiele aus Prag zu sehen, hier sind diese Hauszeichen noch aus dem 14. – 18. Jahrhundert erhalten. Die Häuser sind heute noch bekannt als “Haus zu den Geigen / zum Löwen / zu den Herzen / zu den Straußen / zum Einhorn” (letzteres hatte als Hauszeichen eine einhornige Ziege). Das fände ich auch in einem Spiel (wenn es denn Houing gibt) eine sehr elegante Möglichkeit, um Besitz eines Spielers anzuzeigen :)

Posted in Inspiration-O-Matic. Tagged with , .

How-To: Endloses Scrollen mit jQuery

Da es nur sehr wenige How-Tos im Internet gibt, welche mal eine funktionierende Variante des endloses Scrollen zeigen, bietet sich hierzu ein Tutorial geradezu an. Basierend auf http://www.jquery4u.com/tutorials/jquery-infinite-scrolling-demos/ habe ich eine modifizierte Variante geschrieben, welche beim Scrollen einen DIV-Container an die Seite anfügt.

Zunächst benötigt man in jedem Fall die jQuery Library, welche man direkt unter der jQuery Homepage stets in einer aktuellen Version herunterladen kann.

Vorbereitungen für die Webseite. Einerseits zunächst das Einbinden der Library in den Header. Anschließend fügen wir folgenden Codeblock ein (ebenfalls JavaScript)

var n = 9;

function pageLoad() {
	$.ajax({
		url: "getReposts.php?n="+n,
		success: function(data){
					if(data){
						var html = $.parseJSON(data);
						$("#contentwrap").append(html);
					}
				}
	});
}

Und noch folgenden Aufruf in den BODY-Tag der Webseite.

onLoad="pageLoad();"

Beim Laden der Seite wird zunächste der Content initialisiert, welcher anfangs zu sehen ist. Dies geschieht mittels Ajax-Aufruf der PHP-Datei “getReposts.php” dessen zurückgegebener Inhalt an das DIV “contentwrap” hinzugefügt wird. Nun ein Blick in die PHP-Datei

$n = $_GET["n"];
	$response = ""; 

	$page_idx = ( $n / 9 ) - 1 ;
	$from = $page_idx * 10;
	$to = 9;

	$query = "SELECT * FROM repost as A ORDER BY date DESC LIMIT ".$from.", ".$to;						
	$result = $mysql->query($query);

	while($row = mysqli_fetch_assoc($result)){										
		$response = $response . '

‘; } $mysql->close(); die(json_encode(utf8_encode($response))); exit;

Im Prinzip ist das PHP ganz simpel aufgebaut. Wir bekommen den zuvor definierten Wert “n = 9″ an die PHP-Datei übergeben. Diese verwenden wir, aufbereitet, für eine “FROM…TO”-Bedingung an die Datenbank. Die Antwort fügen wir in einem LOOP-Befehl an den $response-String. Am Ende übergeben wir den String im JSON-Format. Dies ist genau der Teil, welcher per Append-Befehl an das DIV “contentwrap” gehängt wird. So hätte wir die ersten neun Tabelleneinträge als initialien Inhalt beim Seitenaufruf. Nun zum “nachfüllen” auf der eigentlichen Webseite

$(window).scroll(function(){		
	if($(window).scrollTop() == $(document).height() - $(window).height()){
		n += 9;
		$('div#loadmore').show();
		$.ajax({
			url: "getReposts.php?n="+n,
			success: function(data){
						if(data){
							var html = $.parseJSON(data);
							$("#contentwrap").append(html);
							$('div#loadmore').hide();
						} else {
							$('div#loadmore').html('

No more posts to show.

');
						}
					}
		});
	}
});

Sobald wir das untere Ende erreicht haben (nach dem neunten Container) wird dieses JavaScript ausgelöst. Es erhöht die Variable “n=9″ um weitere 9 und sendet die gleiche Anfrage erneut an die PHP-Datei. Die PHP-Datei führt genau den gleichen SELECT aus, aber dieses mal mit der entsprechenden “FROM…TO”-Bedingung für die nachfolgenden 9 Einträge. Und das war es auch schon. Das DIV “loadmore” etc. wurde aus der zu Anfang genannten Quelle übernommen.

Posted in Code-O-Matic. Tagged with , .

Ordnung schaffen: eine Datenbank Handlerklasse

Eigentlich wollte ich am Wochenende dafür sorgen, dass endlich mal ein paar Screenshots von einem ganzen Wald (noch ohne schöne Texturen, aber immerhin..) online kommen. Dafür notwendig waren ein paar Änderungen, die das Langzeitverhalten der Wuchsform der Bäume betreffen. Uneigentlich.. ist mir mein stiefmütterliches Behandeln der Datenbankzugriffe auf den Kopf gefallen.. Irgendwo schreibt eine Methode Werte auf die Datenbank, die ich zu dem Zeitpunkt da noch nicht drin haben will. Aber wo? Es war immer geplant, dass ich das Coding nochmal aufräume, aber ich hatte gehofft es verschieben zu können bis alle Grundfunktionalitäten stehen. Und dann gründlich aufzuräumen, ohne die Funktionsweise zu schädigen. Aber statt mich durch den Code zu wühlen und den “schuldigen” Datenbankzugriff händisch rauszusuchen, ziehe ich zu mindestens dieses Schritt des Aufräumens vor und implementiere ein zentrales Handling der Datenbankzugriffe.

Folgende Anforderungen an das Handling habe ich mir gestellt:

  • Sämtliche Datenbankzugriffe laufen über die Methoden der Handlerklasse, außerhalb von dieser ist die Verbindung zu Datenbank nicht bekannt.
  • Die Handlerklasse ist verantwortlich für die Datenkonsistenz innerhalb des Programmaufrufs und für die Verwaltung entsprechender Sperreinträge auf der Datenbank.
  • Die Handlerklasse dient als Puffer zwischen Datenbank und Programm.
  • Programmteile brauchen die Berechtigung, um Datensätze des Puffers auslesen oder schreiben zu dürfen.
  • Alle Datenbankzugriffe werden mitgeloggt.
UML Buffer

UML Buffer

Nebenstehend ein Diagramm, das den groben Ablauf des Handlings der Datenbankabfragen zeigt. Jede Datenanfrage der Umweltsimulation wird an den Datenbankhandler gestellt. Dieser prüft, ob die Berechtigung vorhanden ist, ansonsten wird abgebrochen. Wenn diese Daten noch nicht geladen wurden, werden sie aus der Datenbank geladen. Es wird geprüft, ob die Daten einen Sperrvermerk haben, ansonsten werden die entsprechenden Datensätze ausgelesen und mit einem Sperrvermerk versehen. Die ermittelten Daten werden in die benötigten Strukturen überführt und in den Puffer geschrieben. In beiden Fällen werden die Informationen aus dem Puffer an die Simulation zurück gegeben. Jede Änderungsanfrage der Umweltsimulation wird ebenfalls an den Datenbankhandler gestellt. Dieser prüft, ob die Berechtigung vorhanden ist, ansonsten wird abgebrochen. Wenn die Berechtigung vorhanden ist, werden die Daten im Puffer geändert. Zusätzlich können aus der Simulation heraus das Committen oder Verwerfen der Änderungen angestoßen werden.

Posted in Code-O-Matic. Tagged with , , , .

Mein NSC versteht mich nicht..

Wäre das nicht imba, wenn dein Lieblings NSC dich nicht nur nett anlächeln könnte oder wortlos mit dir handeln könnte, sondern dich verstehen, dir antworten und sich vielleicht sogar an die Gamersprache gewöhnen könnte? Wenn du einen Söldner NSC ansprichst mit “Hey, LFM Torlahöhle, Interesse?” und der antwortet mit “Alles FFA?” – ich fände es toll :) Und klar, Gamersprache ist in einem RP nicht gewollt, aber auch dort gibt es genug Anwendungsfälle, in denen das nice ist: andere Namen für Orte, sprachliche Umgangsformen..

Aber ist das umsetzbar? Nach den ersten Kapiteln aus “The Handbook of Computational Linguistics and Natural Language Processing” von A. Clark, Ch. Fox, Sh. Lappin (Beute aus meinem letzten Unibib Raid) lautet meine vorläufige Antwort leider “Nein”. Aber so schnell lasse ich mich nicht entmutigen..

Posted in Theory-O-Matic. Tagged with , , .