Fortschritt:

Die Resourceklasse ist nun konventionell als Interface konstruiert – Schade, mein Ansatz wäre ziemlich cool gewesen – aber mir rennt die Zeit davon und die Lösung kommt mir nicht. Die Smart-Pointer stehen nun. Aber:

Probleme:

Garbage Collection macht nicht das was ich will: Aus irgendeinem Grund stürzt der Vorgang ab wenn ich meine MemPointer aufräumen will. Die Lösung kommt erst nach einem verlorenen Tag: Meine deadObjects-list ist eine Liste aus Pointern zu IMemObjects. Da kommen auch die SmartPointer rein. Die sind allerdings selbst keine Pointer -sondern liegen auf dem Stack. Kein Wunder also dass ich einen Assert-fail bekomme wenn ich versuche sie mittels delete zu löschen. Die Frage ist nun wie ich erkennen kann ob es sich um eine Stack- oder eine Heap-Variable handelt.

Auf die Lösung bin ich ein bisschen stolz: Ich überlade einfach den ‘new’ Operator und setze ein Flag, nun weiß ich ob ein Objekt auf dem Heap liegt. Das Flag wird beim löschen abgefragt, Objekte auf dem Stack werden NULL gesetzt die restlichen konventionell freigegeben.

ToDo:

Als nächstes ist der Settingsmanager und der Kernel dran. Ausserdem wird meine erste Resource erzeugt, eine Stringtable in die ich einige für Logging und Profiler nötige Strings ablegen kann.

Fortschritt:

Der Resourcenmanager hält nun alle Resourcen in einer Map, kann sie zurückgeben nach Adresse, Handle oder Pfad. Der Manager lagert Resourcen nach Priorität, letzer Nutzung und Größe aus, wenn die Resourcen eine vorgegebene Größe erreichen. Die Resourcen selbst sind ein Template, welches die Typspezifischen Funktionen spezialisiert.

Die ToString Funktion ist nun genauso wie die getClassName- und getSize-Funktion ein Macro. Auf diese Weise kann ich die Makroargumente zur Compilezeit festlegen und muss so keine Variablen und Funktionen nutzen, die ja während der Laufzeit mit Werten initialisiert werden müssen. Coole Sache.

Probleme:

Es geht nur sehr zögerlich voran:

Mit dem Resourcemanager gibt es Probleme. Ursprünglich hätte ich die Resourcen gerne als Templates gehabt, bei denen nur eine Load-Funktion pro genutztem Typ spezialisiert werden muss – Allerdings ist es gar nicht so leicht das ganze in eine STL-Map zu packen, dort muss ich dann nämlich mit dynamischen casts um mich werfen. Mein Ansatz für eine neue Resource nur eine (Load-)Funktion zu spezialisieren scheint nicht zu klappen – Für die dynamic_casts bräuchte ich eine Kontrollstruktur welche mir den richtigen Typ castet… die Idee einen User später in meinem fertigen Manager rumcoden zu lassen ist mir weniger lieb als wenn er Objekte ableiten muss.

Ausserdem stecke ich viele Stunden bei kryptischen Fehlern, welche nach unrelevanten Codeänderungen auftreten. Nach langem langem Suchen bemerke ich dass ein fehlendes Leerzeichen(!) am Ende einer Headerdatei schuld war. o.O

ToDo:

Das Dilema mit dem Manager lösen. Dann endlich Smart-Pointer implementieren.

Fortschritt:

  • Das Design steht soweit:
    Alle Objekte werden vom IMemObjekt abgeleitet. Dieses kümmert sich um Garbage Collection und grundsätzliche Funktionalität wie toString funktion, Zurückgeben der Objektgröße usw.

  • Davon abgeleitet werden die Manager (Ressourcen, Kernel, Logging, Sound….) sowie inGame-Objekte, welche wiederum als Interface für zeichenbare und nicht zeichenbare Objekte dienen.

  • Von den Managern werden die benötigten Objekte und Subsysteme abgeleitet (Resourcen, Streams…)

  • → das Ganze wird fast vollständig top-down programmiert.

Implementiert sind jetzt ein Singleton, das „Über-Objekt“, ein einfaches to-String Makro, sowie ein Macro zum Zurückgeben der Größe. Für die Bestimmung von Engpässen und Performancefressern gibt es jetzt einen selbstgeschriebenen Profiler.

Probleme:

In C++ ist Vererbung sehr unterschiedlich zu Java implementiert. Während in Java eine abhängige Instanz von allen Parent-Klassen erzeugt wird ist dem in C++ nicht so: im Grunde besteh keine Abhängigkeit zwischen abgeleitetem und ableitendem Objekt – Das macht die Implementierung einer toString-Funktion sehr schwierig. Fürs Erste gebe ich mich damit zufrieden nur einen Default-toString auszuführen, dem man zusätzliche Attribute für jede abgeleitete Klasse mitgeben kann – eine doppelt abgeleitete Klasse erbt also nur die toString Funktionalität des IMemObjects, nicht die der unmittelebaren Parent-Klasse.

ToDo:

Ein Resourcenmanager ist der nächste Schritt, mit dem ich String-Tables laden kann, welche ich dringend für meinen Profiler brauche. Ausserdem wäre ein Smart-Pointer toll, damit ich einen Garbage-Collector implementieren kann.

Unsere Tastatur

Als ich mich heute auf mein Projekt einstellen wollte, mich reflektierend in meiner mitgenommenen schwarzen Cherry Tastatur verlor und nachsinnend in einer Welt von Templates, Makros und Funktionspointern zu driften drohte, fiel mein Blick auf einige unauffällige Tasten auf eben jener Tastatur. Wie wunderlich, waren diese doch nahezu unberührt von der vielzahl von Ablagerungen, welche sich doch sonst überall auf den Tasten breit machten. Nur eine dezente Staubschicht hatte sich sanft um die Objekte meiner Aufmerksamkeit gelegt:

Das man mit der PRINT-Taste unter Windows Screenshots erzeugt gilt als Common Knowledge, aber wusstet ihr dass die Kombination [ALT]+[PRINT] einen Screenshot des aktiven Fensters erzeugt? Sehr geschickt für Blogger.

Die SCROLL-LOCK-Taste, (oder einfach Rollen) erfüllte in längst vergangenen Zeiten die Funktion des Scroll-Rades, man konnte also den Bildausschnitt mit [ROLLEN]+[PFEIL OBEN/UNTEN] bewegen ohne den Cursor verschieben zu müssen. Die gleiche Funktion unterstützt das Visual Studio, allerdings nicht mehr mit der ROLLEN-Taste, sondern mit [STRG], sehr geschickt wenn man beim Programmieren keine Lust hat immer zwischen Tastatur und Maus zu wechseln.

Heute ist diese Taste unter Windows im Grunde völlig unsinnig geworden.  Mit [STRG]+2x[ROLLEN] lässt sich unter Windows XP zwar noch ein Memory Dump generieren, allerdings ist dies nur für Fehleranalysen nötig und die Funktion standardmäßig deaktiviert, in Vista soll diese Funktion gar nicht mehr existieren.

Jemand sollte sich die Mühe machen auszurechnen wieviel Geld gespart würde wenn die Taste mitsamt der damit verbundenen LED von den Tastaturen verbannt würde.

Die PAUSE/UNTBR-Taste war einmal dafür da das laufende Programm abzuschießen.

Ich erinnere mich an meine VB-Zeit (hach ja, als Programmierung noch so einfach war…), damals ließ sich mit [STRG]+[PAUSE] die Ausführung abbrechen, ein Relikt aus der DOS-Basic Zeit. Heute funktioniert das nur noch bei der Ausführung von Batches.
Gemeinerweise wird diese Abschießen-Funktion unter Linux durch die Kombination [STRG]+[C] erfüllt, ein hinterhältiger Kniff um Windows-User zu verwirren.

Für alle interessant: der BIOS-Start lässt sich noch heute mit einem Druck auf [PAUSE] pausieren und mit erneutem Druck wieder fortgesetzt werden.

Damit ist auch dieses Thema abgehandelt und der geneigte Leser hoffentlich wieder ein wenig klüger geworden :)

Tour review!

Endlich!

Nach längerer Arbeit habe ich unsere Fahrradtour zum Comer See in eine Google-Earth Tour umgewandelt – Umgewandelt, das heißt in diesem Fall Meter für Meter rekonstruiert und mit Bildern und Notizen gefüttert.

Dafür ist GoogleEarth ein wirklich tolles Tool.

Und dank der guten Abdeckung ist es mir ziemlich gut  gelungen den Weg nachzuvollziehen.

Wer also darüber nachdenkt einmal selbst die Alpen zu überqueren dem sei diese Tour ans Herz gelegt, schließlich weiß man hinterher immer mehr.

Für Suchende hier noch weiterführende Informationen:

Wir sind zu zweit gefahren, ein Cross-Rennrad, ein Treckingbike.
Das Gepäck wog etwa 12 kg pro Person, inklusive Zelt.
Zu beachten:

  • Am Besten eine Kreditkarte mitnehmen, die Abdeckung ist in fast ganz Europa besser als hier in Deutschland.
  • Ein Zelt ist unglaublich wichtig: Wir sind in den Bergen in schwere Gewitter geraten, ohne Zelt wären wir nie durchgekommen.
  • Kleidung: Auf jeden Fall genug Termokleidung und schwere regenfeste Klamotten. Dicke Socken mitnehmen.
  • Genug gelbe Säcke mitnehmen. Die eignen sich hervorragend zum Einpacken von Schlafsack, Isomatte etc. und wiegen fast nichts.
  • Genug Pausen machen: Den Splügenpass schafft man zwar mit durchschnittlicher Kondition, aber tagelang Bergauffahren ist kein Spass für die Gelenke: Das Ganze macht mehr Spass wenn man ab und zu Pause macht, die Gegend anguckt und ein kühles Radler trinkt. Lieber (so wie wir) einen Tag länger einplanen als nachher abbrechen zu müssen.
  • Für die Tour genügt eigentlich GoogleMaps als Kartenmaterial. Zumindest wir sind ziemlich gut damit klar gekommen. In der Schweiz sind die Routen vorbildlich ausgeschildert, in Italien gibts sowieso keine Fahrradwege.
  • Ich bin mit einem Crossrennrad gefahren, dh. bestückt mit 700 × 32 C Reifen(um einiges dicker als Rennreifen); Mit noch dünneren Reifen wäre ich allerdings nicht weit gekommen – Zu oft geht der Weg durch Kies und Geröll – Wenn es dann noch regnet rutscht man mehr als man fährt.
  • Zu guter letzt: Die Tröte. Zu Beginn noch als Gag gemeint, erwies sich diese Tröte als äusserst nützlich. Vor allem auf der Südseite (Italien) des Passes geht es durch extrem enge, unbeleuchtete Tunnels. Autos hupen beim reinfahren – und Fahrradfahrer am besten auch.

Die Tour gibts hier zum Komplettdownload(18.8MB)!

Ich hoffe das Material hilft weiter!

Ich ordne meinen Code ja sehr gerne in Definition und Implementierung, was die Lesbarkeit etwas erhöht und einfach alles ein bisschen verhübscht. Leider führt sowas aber auch leicht zu ziemlich dummem Fehlerverhalten, vergisst man beispielsweise ein Semikolon am Ende einer Klassendefinition, bekommt man kryptische Fehlermeldungen, die auf einen völlig anderen Teil des Codes verweisen.

Etwas ungleich böseres ist mir gestern passiert: Meine Ressourcendatei wollte partout nicht mehr kompilieren, die Fehlermeldung war ein EOF beim Auslesen des dazugehörigen Headers. Seltsamerweise hatte ich diesen aber schon eine längere Zeit nicht mehr verändert o.O
Nach einigem Rätseln gab ich auf und googlelte die Meldung, die Lösung des Problems war recht einfach:

ich hatte wohl aus Versehen ein Leerzeichen am Ende der Headerdatei gelöscht. Also: Leertaste, kompilieren und der Spass tut wieder.

Der Hintergrund: Headerfiles werden im Grunde ja einfach an den Ort der Includeanweisung kopiert. Durch einen unglücklichen Zufall kann es nun passieren dass direkt auf die Include-Anweisung Code folgt, das Ergebnis: Der letzte Codeschnippsel des Headers klatscht sich an den ersten Schnippsel der cpp -.-

In meinem Fall wurde die Kompileranweisung #endif zerschossen und resultierte in einen EOF-Error.

Naja.

Muss man ja nur wissen.

Also in Zukunft: Am Ende des Headers einfach ein Leerzeichen machen, dann kann nichts passieren.

Das Urheberrecht

Es gibt kaum einen Rechtsbereich der für eine so breite Masse relevant ist und über den gleichzeitig so viel halbwissen herumschwirrt: Das deutsche Urheberrecht, kopieren von Medien und Nutzung von Tauschbörsen.

Da ich mir selbst über einige Sachen nicht klar war (und mich ein wenig von den anstehenden Klausuren ablenken musste) habe ich mir einige Zeit genommen und das Internetz nach Informationen von offizieller Seite durchsucht. Um ein wenig Klarheit in das Rechtsgewuschel zu bringen hier einige Erkenntnisse:

  • Generell
    liegt Recht liegt auf der Seite des Urhebers, das heißt: Wenn es zu irgendetwas noch keine gesetzliche Schrankenbestimmung gibt ist es verboten. Diese Schrankenbestimmungen interessieren den Bürger natürlich am meisten.
  • Privatkopie
    Da die Verbreitung von urheberrechtlich geschützten Inhalten in Haushalten irgendwann nicht mehr kontrollierbar war, wurde das Recht auf Privatkopien eingeführt, dafür allerdings die Urheberabgaben eingeführt (das heißt für euren Brenner habt ihr ca. 10€ an die Musik-, Film- und Verlagsindustrie abgegeben).  Der Bundesgerichtshof legt die Privatkopie so aus dass bis zu 7 Kopien im kleinen privaten Kreis herrumschwirren dürfen, im digitalen Umfeld jedoch weniger.
    Verboten sind Kopien aus offensichtlich rechtswidrig hergestellten Vorlagen und neuerdings auch aus offensichtlich rechtswidrig öffentlich zugänglich gemachten Vorlagen. Letzterer Zusatz wird allerdings kaum Auswirkungen haben, da sich sowas im Internet nur sehr schwer nachvollziehen lässt.
    Die Privatkopie darf sowohl analog als auch digital angefertigt werden.
  • Gemeinsam genutzter Anschluss
    Auch wenn die Medienindustrie versucht zu verunsichern:
    Es besteht keine Störhaftung. Das heißt wenn ein Mitnutzer illegal Musik verbreitet besteht in der Regel keine Haftung, auch wenn die Abmahnung an den Eigner adressiert ist.
  • Kopierschutz
    Kopiergeschützte Medien dürfen nicht kopiert werden. Das betrifft einige im Umlauf befindlichen Audio-CDs und fast alle DVDs.
    Allerdings(1): Interessanterweise gilt diese Regelung nicht für Computerprogramme(!).
    Das bedeutet: Von Computerspielen darf man trotz SecureRom und SaveDisk Sicherungen erstellen. Read the rest of this entry »

BÄM!

Da haben die Rechten sicherlich blöd geguckt, als eine komplette Spiegelung des einschlägig bekanntenten Blood & Honour-Forums im Internet auftauchte.

Komplett, das heißt mit Nutzerdaten, persönlichen Nachrichten und versteckten Foren.

Das Blood & Honour Netzwerk hat sich zur Aufgabe gemacht rechtsexteme Bands zu pushen und nationalsozialistisches Gedankengut zu verbreiten – und das keineswegs auf subtile Weise wie der geneigte Leser mit einen Blick auf die Google-Bildersuche feststellen mag (Von einem Besuch der offiziellen Seiten wird jeder halbwegs intelligente User absehen). Weshalb die Gruppierung seit 2000 vom Verfassungsschutz verboten ist. Dass sich dennoch zahlreiche Deutsche, (unter anderem Mitglieder der NPD) aktiv beteiligen gibt dem Hack eine riesen Bedeutung im Kampf gegen Neonazis in Deutschland.

Organisiert wurde die Aktion von der Datenantifa mit Hilfe einiger internationaler Gruppen. Als dann über 30.000 Datensätze zusammenkamen überließen sie die Auswertung einfach der Öffentlichkeit.

Wer also einmal einen Einblick hinter die Kulissen der Neonazis bekommen will, dem sei Empfohlen sich das Ganze von den Rapidshare-Links auf Indymedia herunterzuladen.

Ich bin mir ziemlich sicher dass der Coup noch einiges nach sich ziehen wird :)

Vor kurzem kam ich bei einem Java-Projekt zum ersten Mal in die Situation externe Pakete einbinden zu müssen. Das sollte eigentlich auch gar kein so großes Problem sein, jedoch machten die zusätzlichen entstandenen Abhängigkeiten Probleme. Genau genommen musste ich letztendlich 4 zusätzliche Pakete finden und herunterladen, wobei innerhalb dieser Pakete wiederum probleme mit den unterschiedlichen Versionen entstanden. Man kann sich das Chaos also gut vorstellen.

Es sei X Anbieter eines freien Java-Paketes zum Automatisieren von Webseitenzugriffen. Y sei Anbieter eines extern Abhängigen Pakets zum verarbeiten der Log-Ströme. Nun stellt X die Entwicklung ein, während in Y eine revolutionäre Neuerung implementiert wird, die die Hälfte der Klassen des Pakets überflüssig macht. Ab Version 1.3.24 werden diese Klassen also einfach gelöscht. Noch besser: X nutzt in einigen seiner Klassen das com.*-package, in dem der Programmierer wohl wundersame und aufregende Klassen fand.

Fakt ist dass eben dieses Paket von Sun NICHT für den öffentlichen Gebrauch bestimmt ist, es enthält nur Klassen die sich in der Testphase befinden. Durchlaufen besagte Klassen diese Testphase erfolgreich, werden sie in die bekannten java.* bzw javax.*-Pakete geschoben. Wer das com.*-Paket nutzt kann also darauf wetten dass früher oder später die genutzte Klasse weg ist. Das selbst Entwickler wie Apache dies nicht kapieren, ist traurig.

Warum schreibe ich diesen Artikel?

  1. Wenn offene Klassen verwendet werden, bindet diese in euer fertiges Paket ein!
  2. Falls ihr doch nicht im Stande sein solltet externe Abhängigkeiten einzubinden bzw. falls lizenzielle Einschränkungen vorliegen, packt die VERSIONSNUMMER der externen Abhängigkeiten in die Dokumentation. Und betet dass der Hersteller der Abhängigkeiten ein Archiv früherer Versionen führt.
  3. Schmeißt nicht einfach eine releaste Klassenstruktur um, und wenn dann dokumentiert das richtig.
  4. Verwendet keine com.* Klassen. Falls das doch nötig sein sollte, siehe unten.

Da ich in einem anderen Projekt eben doch auf eine com.*-Klasse zurückgreifen musste (durchsichtige Fenster in AWT), hier ein Tipp falls ihr auch in so eine Situation kommt:

system.getProperty(“java.version”)

…gibt einen String mit der Version der JRE zurück. Nutzt ihr ein com.*-Paket, so checkt die Version und packt das Ganze in eine Bedingung.

Und das gilt es zu nutzen!
Anfang August geht’s mit dem Radl von Tübingen nach Italien!

Die genaue Route führt östlich am Bodensee vorbei, über den Splügen-Pass rauf auf 2000 Meter und durch die Via Mala.

Dann gibt es erstmal eine Ruhepause am Comer See.

Weiter geht’s mit der letzten Etappe ein relativ flaches Stück durch Norditalien bis zu unserem Ziel, der Palmenriviera am Mittelmeer, wo wir ein paar Tage Pause machen bevor es mit der Bahn zurückgeht.

Als GoogleMap kann man das ganze hier betrachten, insgesamt rechnen wir mit 700km Spass, Spannung und absoluter Erschöpfung :)

« Older entries § Newer entries »