BeniBela online


20. April 2016

(nicht übersetzt)

"How do you handle JSON in the XQuery world?", was a question that just arose on the XML mailing list and is quite relevant here. Two competing standards were made, the real XQuery 3.1 currently being specified by the W3C, and an earlier standard JSONiq, which exists in two versions, a standalone version and a JSONiq extension to XQuery 3.0. My Xidel is based on the JSONiq standard, but might be updated to XQuery 3.1, when it is finished.
Let $object be an object, $objects a sequence of objects, $key a key (which can be any value in XQuery 3.1, but is converted to a string in JSONiq or current Xidel), $array an object, and so on...
Object values can be accessed in the following ways:

  • The dot operator $object.key is of course the most natural to access JSON object fields and familiar to every JavaScript developer. However, if you want to use it in XQuery, you encounter a problem: XQuery variables names are XML names and thus can contain dots, as in let $ := 123 return $
    Hence this notation is neither allowed in XQuery 3.1 nor the JSONiq-XQuery-extension.
    Standalone JSONiq wants to be JavaScript-like, so it takes another approach and forbids dots in variables names, making the standard syntax legal and unambiguous. It treats . as a "dot operator" and allows computed keys as $objects.(any expression), queries for non-alphanumeric keys like $objects."special key name", or keys referenced by another variable $objects.$indirect.
    The last two cases are also supported in Xidel, as they are unambiguous. A variable name cannot contain " or $, and $objects. cannot be a single variable, as it is not followed by an operator. $objects.(any expression) is not allowed, as the variable $objects. could be a function that is called. Other unambiguous and allowed cases are after the end of parentheses, e.g. ($objects).key or {..object constructor..}.key. A long time ago, before VideLibri became XQuery compatible, I did not care about these details and just used the $objects.key syntax. From that time Xidel still has a legacy mode in which it checks, if a variable with name $objects.key exists. If it exists the expression returns the value of that variable, otherwise it searches for a variable $objects containing an object. But this mode is disabled in the default settings.
  • The functional notation $object("key"): It is perhaps the most natural syntax in XQuery, you treat the object as function that you can call with a key to read the corresponding value. Therefore it is allowed in all XQuery variants, but not in standalone JSONiq.
    In XQuery 3.1 it is an error to use this notation on non-JSON types (non-functions) or sequences of multiple objects, in the JSONiq extension or Xidel it returns an empty sequence. Those two also allow $objects() to retrieve all keys of an object.
  • A lookup operator $objects?key. The functional notation is not always easy to read, so the W3C has added the ?-lookup operator to XQuery 3.1. It can be used similar JSONiq's . operator, allowing $object?key or $objects?(calculated key). Latter form can query multiple objects and multiple keys as ($object1, $object2, ...)?("key1", "key2", ..). If the left side is omitted, the current context item is used for it. You can also use $objects?* to get all values in the object. It is an error to use it on non-JSON types.
    I have not come around to implement this in Xidel, but later versions might support it.
  • A XPath like query $objects/key or $objects!key. This was the original XPath syntax to query XML, so it seems to be a good syntax to query JSON, too. Thus I have added this syntax to Xidel, but none of the other languages support it. Like W3C's ? it can be used for multiple queries ($obj1, $obj2)/(key1, key2) or to retrieve all values in the object $objects/*. It can also recursively search for a key in all descendant objects with $objects//key. For compatibility with XQuery, it raises an error if used on non-JSON (non-XML).
  • Helper functions: All variants have a bunch of helper functions. For example JSONiq (extension/Xidel) have keys($objects) (or jn:keys($objects)) to get the keys of all objects, ignoring non-objects. They also have values($objects) (libjn:values($objects)) to get all the values. XQuery 3.1 has map:keys($object) for the keys, map:get($object, $key) to get a single value, or map:size($object) for the number of keys in an object. These functions raise an error for anything that is not a single object.
For arrays a similar number of notations exists. Surprisingly to JavaScript developers the first element in the array has the index 1.
  • The JavaScript notation $array[index]: This is already used in XQuery to get the element of a sequence, and an array is not a sequence. So this syntax is sadly not supported anywhere.
    However, standalone JSONiq has at least $arrays[] to get all values of one or more arrays, ignoring non-arrays.
  • The functional notation $array(index): Similar to objects, this syntax is allowed in all variants except standalone JSONiq. Again XQuery 3.1 raises an error on non-arrays (non-functions) or invalid indices, while JSONiq extension and Xidel return an empty sequence. Later also have $arrays() to get all values of the array.
  • The lookup operator $arrays?indices of XQuery 3.1 can also be used for arrays and returns the values with the corresponding indices. $arrays?* will return all the values in the array.
  • The $arrays[[index]] operator. Standalone JSONiq uses double brackets to get array elements, returning the empty sequence for invalid indices. This is not supported in Xidel and I see no reason to add it.
  • The helper functions: JSONiq has members($arrays) to get all values in a sequence of arrays, flatten($arrays) to get all values recursively and size($array) to get the size of a single array. In JSONiq extension or Xidel they are called jn:members, libjn:flatten and jn:size. XQuery 3.1 has similar functions array:flatten and array:size, as well as array:get($array, $index) to get a single value, which raise errors on non arrays.
Multiple notations also exist for creating objects and arrays:
  • { $key: $value, ... } is the normal JavaScript syntax to create objects and is supported in JSONiq and Xidel. $key and $value can be any value, but the key is cast to a string and raises an error, if that conversion fails. {} logically returns an empty object. {| $objects |} can be used to merge multiple objects with distinct keys to a single object. A further JSONiq syntax not yet implemented in Xidel is { $key ?: $value } which omits the key/value pair, if the value is the empty sequence. In JSONiq XML values are copied, erasing the node identity and relationship to their ancestors.
  • map { $key: $value } the special syntax of XQuery 3.1 to create an object. The key is cast to an atomic value (not a string!) and the value can have any type.
  • [$value1, $value2, ...] the standard JavaScript syntax to create an array. It is supported in any language, although with different semantics. In XQuery [$value] always creates an array of size 1, containing the single value $value, even if it is a sequence like (1,2,3). In JSONiq and Xidel [$value] contains so many elements as $value, e.g. for the previous sequence the array will have size 3.
  • array { $value1, $value2, ... } the XQuery 3.1 syntax, which creates the same array as [$value1, $value2, ...] would create in JSONiq.
So to summarize the supported notations:
NotationXQuery 3.1JSONiq s.a.JSONiq ext.Xidel
Object access
$object.key, $object."key"noyesnoyes
$objects/keys, $objects!keysnononoyes
Array access
Object/array creation
{key: value, key2: value2, ...}noyesyesyes
map {key: value, key2: value2, ...}yesnonono
[value1, value2, ...]yesyesyesyes
array {value1, value2, ...}yesnonono

Btw, another advantage of my new webpage backend is that Xidel can dump all these crappy news in an RSS feed .

21. März 2016

Die Webseite ist nun von meiner JAXMLP Sprache zu Xidels XQuery migriert. Ein bisschen absurd, da ich VideLibri/Xidel dafür programmiert habe, die Daten von Büchereiwebseiten auszulesen, und jetzt erstellt es stattdessen Webseiten. Aber das zeigt die Mächtigkeit von XQuery.
Und es war schon wieder fast die Hälfte meiner Links tot. Da brauch ich mal ein besseres System, nur leider haben "Social Bookmarks" ( mit ihrer Abhängigkeit von fremden Servern auch nichts gebracht. Völlig überraschend ist das Spotlight-Forum jetzt wieder aktiv geworden. Damit hätte ich nicht gerechnet. Allerdings mit einem neuen Betreiber, nachdem der alte gestorben ist. Auch absurd, wenn ich nach alten Foren mit tausenden Nutzern google, und alles, was ich finde, ist die Linkliste auf meiner eigenen Seite.

18. März 2016

Jetzt habe ich die format-*-Funktionen doch zuerst implementiert, was nahezu 99% XQTS-Konformanz auch für XPath/XQuery 3.0 ergibt...
Typisch für XQuery sind die Funktionen viel zu overengineered, zum Beispiel:
("0", "٠", "𝟘", "𝟎", "߀", "೦", "꧐", "༠", "i", "a", "w", "w;t", "w;o", "W", "W", "w;o", "w;o(-er)", "#,0") 
! format-integer(position(), ., if (position() >= last() - 2) then "de" else ())

7. Februar 2016

Endlich ist es geschafft: Mein XPath 2.0 Interpreter besteht alle Testfälle der XQuery Test Suite, selbst eine Silversterparty im Zwilling des Restaurants am Ende des Universums am -25252734927766554-12-31 verwirrt den Interpreter nicht mehr.abgesehen von 0.1% der Testfälle, bei denen die Test Suite selbst falsch ist, oder ich einen Bugreport an die zugrunde liegende Bibliotheken geschrieben habe. . Die Fertigstellung von XQuery 1.0 geht jetzt auch schnell ( nur Zyklen in Variablen/Funktionsdeklarationen werden noch nicht richtig aufgelöst ) und dann kommt XQuery 3.0 (viel zu umständliche Zahlenformatierung).
Es wird jetzt die FLRE-Bibliothek benötigt, da die Standard regexpr Unit die regulären Ausdrücke der Test Suite nicht verarbeiten kann. Aber es gibt weiterhin eine Option, um Sorokins regexpr zu verwenden.

11. November 2015

Die neuste Version der Internet Tools hat nun ein verkettbares, funktionales Interface auf der Pascalseite. Zum Beispiel

query('1 to $_1', ['100']).filter('. mod 2 = 0').query('sum($_)')
berechnet die Summe aller geraden Zahlen bis 100.

Und TeXstudio hat SourceForges Staff-Pick Projekt-des-Monats-Preis gewonnen. Jetzt ist es eines der wenigen Open-Source-Projekt, das den Preis zweimal bekommen hat. Nur leider nicht den Community-Projekt-des-Monats-Preis von der Umfrage.

16. August 2015

Hier sind zwei Abstimmungen:

  • Ob Xidel's Standardsprache XPath oder XQuery sein soll. (auf Google Forms, weshalb nach es dem Passwort fragt). XQuery hätte den Nachteil, dass es & als Escapezeichen verwendet, so dass die meisten URLs keine gültigen XQuery Strings sind. XPath hat den Nachteil, dass es gar kein Escapezeichen gibt, so dass Leute es nicht schaffen, Anführungszeichen zu verwenden. Wobei es in Bash trivial ist, also ist die Umfrage im Grunde darüber, ob Xidel mehr unter Windows oder Linux verwendet wird.
  • Und wichtiger: ob TeXstudio wieder ein SourceForge Project of the Month wird.

4. Juli 2015

VideLibri hat nun eine eigene Domain. Nachdem SourceForge angefangen hat, auch ungefragt Mal/adware in die Installer zu packen, ist eine SourceForge-Subdomain wohl untragbar geworden. Der Quellcode von VideLibri und Xidel ist nun wie meine anderen Projekte (außer TeXstudio) dreifach gehostet (hier, Github, Bitbucket. Fehlen noch welche? Gitlabs?).

Es gibt nun das schon etwas lange überfällige Xidel-Release (auf der VideLibri-Seite), welches den Großteil der XQuery 3.0-Syntax unterstützt und die Auswertung der neuen XQuery Test Suite berücksichtigt. Die Internet Tools sind ebenfalls entsprechend aktualisiert.

8. Februar 2015

Es hat viel zu lange gedauert (über ein Jahr), aber an Silvester habe ich es endlich geschafft, sämtliche Tests der neuen XQuery Test Suite in meinem Interpreter auszuführen, von XPath 2 bis XQuery 3 inklusive Fehlertests, ohne dass die Auswertung wegen einer unerwarteten Exception abgebrochen wird.
In der neuen Internet Tools Version gibt es nun für jede dieser Exceptions den passenden XQuery-Error-Code. Was leider auch heißt, dass viele Ausdrücke, die es bisher ausgeführt hat, nun als ungültig zurückgewiesen werden.
Außerdem unterstützt es jetzt weitere XPath/XQuery 3 Syntax, nämlich anonyme und higher order Funktionen, sowie die Q{}-Notation.

13. Oktober 2014

Meine kleineren Open-Source-Projektrepositories gibt es nun auch hier und auf Bitbucket, anstatt nur auf GitHub. Aber die beiden größeren bleiben ausschließlich auf Sourceforge, wie große Projekte es nun mal tun.

23. August 2014

Falls sich jemand gewundert hat, wo ich letzten Monat war: Auf Konferenzen im Amerika, um zwei Paper vorzustellen. Eines über Kausalität (Achtung: pdf) für meine Doktorarbeit und eines über VideLibri/XQuery. Es gab auch jeweils einen "best student (paper) award" dafür, was beim VideLibri-Paper wohl zeigt, dass damals in der Jugend Forscht Jury wirklich nur Idioten saßen, die nicht verstanden haben, um was es eigentlich geht, sonst hätte ich zumindest eine Runde weiterkommen müssen...

30. November 2013

Hier ist, was ich bisher so von meinen alten oder neuen Programmen gefunden habe; viele Spiele und Schulsachen:

  • Ein uraltes Mathelernspiel für Kopfrechentraining
  • Die vollständige Version von Mausitanien
  • Ein Kampf-Simulator für das "Stadt der Diebe"-Buch, damit man bei Monsterbegegnungen nicht selbst würfeln und rechnen muss
  • Defendrix, ein Spiel für die Windowskonsole mit einem ASCII Raumschiff. Sieht am ältesten aus, ist aber das neueste dieser Spiele. In alter Tradition ist es extrem schwer zu spielen
  • Ein Farbratespiel ähnlich wie Mastermind
  • Mein altes Chemieheft. Interessant nur, weil ich dafür ein eigenes Dateiformat geschrieben habe (aber html wäre besser gewesen)
  • Ein unvollständiger Chiffren-Decoder. Für die letzten Übungsblätter wäre er trotzdem nützlich gewesen.
  • Ein Referat über Euglena. Mit einem Java-Applet für eine virtuelle "Simulation" von dem Einzeller.

Das ist aber noch nicht alles.

19. November 2013

There was a bug in the string conversion of the big decimal math. It is fixed now. (very surprising since I had a test for this case. Seems like I forgot to run all the tests)

Also the bbutils now work with Delphi (4), since there was a feature request for that...

18. November 2013

Eine überraschende Konsequenz davon, dass jetzt plötzlich so viele versuchen VideLibri nachzuprogrammieren, ist, dass ich dadurch einen neuen Webhoster gefunden habe. Zwar scbon im Mindestpreis zehnmal so teuer wie der alte Tarif beim alten Hoster, aber dafür kriegt man Shellzugriff und 10 GB statt wie bisher 30 MB Speicherplatz. (so dass es keine Speicherüberschreitung gibt und es im Endeffekt doch billiger ist...)

Das heißt, ich kann jetzt mal ein paar neuere Sachen hochladen, die also nicht 10 Jahre alt sind wie der Großteil der bisherigen Daten hier und für die es bisher einfach nicht genug Speicher gab. Mal angefangen mit meiner Masterarbeit.

Unabhängig davon gibt es auch eine neue Version der Internet Tools. Die wichtigste Neuerung ist die Unterstützung für das Rechnen mit Dezimalzahlen beliebiger Genauigkeit, was meine alte 65-Bit Arithmetik ersetzt und den vollen Umfang von xs:decimal realisiert. Des Weiteren habe ich die neueste Version des JSONiq-Standard implementiert, das Typsystem vollständig umgeschrieben als Vorbereitung für XML Schema-Unterstützung (heißt, es unterstützt keine XML Schema, aber man kann sie vermutlich pluginmäßig implementieren, ohne etwas am bisher existierenden Code ändern zu müssen) und angefangen, ein paar Sachen von XQuery/XPath 3 einzubauen.
Die arbitrary-precision Funktionen gibt es auch als Einzelunit, unabhängig von den Internet Tools.

Und Anmerkung zur letzten News: TeXstudio hat die Abstimmung von SourceForge tatsächlich gewonnen! (wobei, eigentlich ist es auf Platz 2 gelandet, aber das Projekt von Platz 1 wurde wegen Voting-Fraud (von dritter Seite?) disqualifiziert...)

13. Juli 2013

Seit einer Weile gibt es nun VideLibri auch als Android-App. Zudem habe ich mal eine Liste, der Bibliotheken erstellt, welche von VideLibri unterstützte Systeme verwenden. Schon beinahe 170 Büchereien. Dauert ewig, sie alle anzuschreiben.

Für die Internet Tools gibt es ein Update mit ein paar trivialen Änderungen/Bugfixes. Z.B.: <s>-Elemente (shortcut-Elemente, deren als XQuery/XPath-Statement ausgeführt wird) werden auch in Gesamttemplates unterstützt, und es gibt mehr Funktionen in der XQuery-Engine, um Werte in url-encoded Daten zu verändert.

Eine neue TeXstudio-Version (Bugfix-Release) wird es auch bald geben. In der Zwischenzeit läuft eine Abstimmung für das Sourceforge Projekt des Monats und TeXstudio hat gute Chancen zu gewinnen.

16. Juni 2013

Meine Open-Source-Projekte sind jetzt auch auf GitHub gelistet, abgesehen von denen, die schon auf Sourceforge sind, und denen, die ich in der Mittelstufe geschrieben habe. Auch wenn es nicht viel Sinn macht, ein Mercurialrepository auf github zu haben, und ich finde, dass die Webpage alleine eigentlich völlig ausreichend ist, zumal sie sowieso viel älter als GitHub ist...

Und wir haben diese Woche eine neue TeXstudio version veröffentlicht.

16. Mai 2013

Zuerst eine alte News, die ich vergaß zu posten: Vor ein paar Monaten gab es einen Blogpost, dass die GBV-Bibliotheken nun eine API für Ausleihendaten namens PAIA entwickeln. Leider ist es eine JSON-API und VideLibri hatte noch keine Unterstützung für JSON, da ich meine ganze Zeit dafür verwendet habe, eine XQuery-Engine zu schreiben, um HTML/XML-APIs optimal zu verarbeiten.
Also, mit Overkill wie üblich, hatte ich dann vor ein paar Monaten den gesamten JSONiq-Standard in den Internet Tools und VideLibri implementiert. Seitdem kann VideLibri nun auf die Daten aller Bibliotheken zugreifen, die PAIA unterstützen.
Leider scheint es, dass es immer noch keine PAIA-Büchereien gibt. Nicht einmal im GBV ist die serverseitige Implementierung fertiggestellt...

Die neue Version der Internet Tools läuft nun auch unter arm/x86-Android, indem sie die Apache HttpComponents durch JNI aufrufen. Außerdem wurde berichtet, dass sie unter MacOSX funktioniert, wenn man es mit der neuesten Synapselibrary kompiliert hat. Und jemand anders wollte es unter arm-WinCE verwenden, und nachdem ich ein paar Kompatibilitätsprobleme gelöst habe, kompiliert es auch dort (aber es gab leider kein Feedback, ob es zur Laufzeit funktioniert).

13. Dezember 2012

Mein altes mathSys ist wieder da! Nur heißt es jetzt BBMultiPlot.
Noch immer das bester freie, mathematischer Plotter für Funktionsscharen, das ich kenne.
Vor ein paar Jahren hatte ich im Internet ein anderes, noch älteres Programm namens "mathSys" gesehen, und mein mathSys von der Webseite genommen, damit es keine Namenskonflikte gibt. Leider bin ich dann vor lauter Zeitverschwendung mit VideLibri und dessen XQuery-Backend nie dazu gekommen, es umbenannt wieder zu veröffentlichen. Und damals habe ich auch noch keine Versionskontrolle verwendet, so dass ich nicht mehr feststellen kann, welche Kopie des Quellcodes eigentlich die richtige ist. Und mit dem Lazarus, das ich nun statt Delphi verwende, lässt es sich sowieso nicht kompilern...
Deshalb gibt es auch kein neues Release, sondern nur wieder das alte Binary, mit einer readme, die sagt, dass es jetzt BBMultiPlot heißt. Im alten Sourceverzeichnis habe ich zwar auch ein neues Binary gefunden, das auch moderner aussah, aber beim Testen mehr Bugs hatte. (und ein seltsames Testfenster anzeigt. Es scheint, ich wollte auch mal einen BigInteger mit fast-fourier-Transformation-Multiplikation für es schreiben.) Ich habe dann noch versucht, den Titel vom alten Binary in einem Hexeditor zu ändern, aber es ist mit upx 0.8 (oder so) komprimiert, und das lässt sich nicht entpacken. Ollydbg mit Ollydump hat auch nicht weiter geholfen..
Den gefundenen Quellcode habe ich auch mit hochgeladen, vielleicht gibt es noch Leute, die Delphi benutzen, und ausprobieren wollen, ob es tatsächlich der richtige ist.
Übrigens läuft die exe mit WINE auch prima unter Linux.

6. November 2012

Die Internet Tools unterstützen nun XQuery, statt nur XPath 2!
Und die variant-Klassen in der API wurden durch Interfaces ersetzt, so dass sie jetzt ref-counted sind.

26. September 2012

Mal wieder ein Update:

  • Internet Tools: Sie unterstützen nun CSS 3 Selektoren, direkt und innerhalb von XPath-Ausdrücken. Und es gibt eine XPath-Funktion form, die das HTTP-Request für eine HTML-Form berechnet und als Objekt zurückgibt. Die Internetaccess-Klasse gibt einem Zugriff auf die HTTP-Header, und der Htmltreeparser erkennt die Zeichenkodierung auch dann, wenn die Angabe im http-equiv meta-Tag falsch ist und einem korrekten Content-Type Header widerspricht (Da hat die Münchener Stadtbücherei wirklich einen super programmierten Katalog).
    Die Internet Tools enthalten nun auch die Klasse für Mehrseitenabfrageskripts von VideLibri, und es gibt ein Commandlinetool Xidel als Wrapper um die Internet Tools mit dem man Templates und XPathausdrücke auf Webseiten anwenden kann, ohne Pascal zu kennen oder Büchereien zu stören.
    Und es gibt nun ein Greasemonkey-Skript, das die Templates für VideLibri/Xidel automatisch erstellen kann, wenn man die entsprechenden Werte in Firefox markiert.
    Nun soll ich den XPathparser zu XQuery ausbauen, oder nicht? So groß ist der Unterschied nicht...
  • TCommandLineReader: mein Kommandozeilenparser funktioniert nun auch unter Linux. (er hat früher nicht funktioniert, weil die fpc RTL-Funktion zum gesamten Kommandozeilenauslesen unter Linux keine einfachen Anführungszeichen unterstützt! Und umgekehrt funktioniert die RTL-Funktion zum Lesen der aufgeteilten Argumente unter Windows nicht mit einfachen Anführungszeichen! Weshalb ich den Kommandozeilenparser überhaupt erst geschrieben hatte...)
    Und es gibt jetzt eine Unterklasse, die als cgi-Service läuft und die Argumente von GET/POST-Requests liest anstatt von der Kommandozeile.
  • TeXstudio: da gibt es immer neue Features...

3. Mai 2012

Mal wieder was neues, auch wenn es nicht so wirklich neu ist: Der Internet-Tools-Parser ist noch mehr erweitert und nun eine fast Standard-konforme XPath 2-Implementierung. Zusätzlich unterstützt er jetzt auch eine Art Objekte und die übergeordnete Templatesprache erlaubt auch Abkürzungen für häufige Befehle, wie {...} für <template:read/>.

10. Juli 2011

Ich habe den Internet-Tools-Parser ein wenig erweitert, und nun ist er fast Standard-konforme XPath 2-Implementierung (im wesentlichen gibt es alles bis auf namespaces und das ganze Datenmodellzeugs).
Und hier ist ein Kryptographieseminarpaper

25. März 2011

Das SIRDSlets-Spiel hat jetzt einen Regenbogenfarbenmodus, obwohl ich den Modus eigentlich weglassen wollte, da er zu leicht ist und in einem Stereogramm-Spiel der Stereogrammmodus am einfachsten sein sollte, aber er sieht hübsch bunt aus.

26. Februar 2011

Da ja jetzt fast alles auf SF mit öffentlichen Commitlogs ist, habe ich in letzter Zeit keine News mehr darüber geschrieben.
Aber dies sind die Änderungen der letzten Monate:

  • regexgen: Ist neues kleines Programm um alle Strings zu finden, die einen regulären Ausdruck erfüllen. (d.h. es arbeitet genau umgekehrt zu allen anderen Regexengines)
  • bbutils: ein paar behobene Fehler, sehr viel mehr Array-Funktionen, die ganze Unit wird automatisch aus einem Pascal-Template erstellt.
  • Internet Tools: Das Interface wurde leicht geändert, und ein paar low-level html-Parsingfehler sind behoben. PXPath: Die Variablen sind nun Teil der PXPath-Syntax und werden nachträglich ersetzt, so dass man sie nicht mehr in Gänsefüßchen schreiben soll (darf!). Und es ist noch ähnlicher zum echten XPath (mehr Selektoren und mehr Funktionen).
  • TreeListView: Die Scrollbargröße wird nicht mehr auf einen negativen Wert gesetzt, wenn die View-Größe 0 ist. (weil sonst Lazarus die Form nicht mehr lädt!)
  • VideLibri funktioniert nun auch in Berlin; dank Leonid, der mir seine Kontodaten geschickt hat.
  • SIRDSlets: Neue Hintergründe. (Ich vermute, das Bild muss die Autokorrelation der Helligkeit von mittelgroßen Flecken minimieren, um den besten 3D-Effekt zu erzeugen)

11. Oktober 2010

Huch, was ist denn mit VideLibri los? In den vier Jahren, die es auf dieser Seite lag, wurde es praktisch kein einziges Mal heruntergeladen, nun ist es drei Tage auf SourceForge und wurde schon 778 mal runtergeladen. Weitaus öfter als TexMakerX in der gleichen Zeit, obwohl es keine fremden Links darauf gibt, außer mehreren aus Japan (Und wen interessiert es in Japan?). Am Quellcode kann es nicht liegen, der wurde nämlich nicht heruntergeladen.

9. Oktober 2010

VideLibri habe ich jetzt auf SourceForge verschoben; hier findet es ja niemand und mittlerweile ist es so groß geworden, dass die Webseite nicht genug Speicher dafür hat.

24. September 2010

Es gibt jetzt eine neue Videlibri Version (0.998). Ich weiß gar nicht, ob man einen Unterschied zur vorherigen Version bemerken kann, auf jeden Fall habe ich die Templates für die Büchereien mit dem neuen Html-Parser vereinfacht.
Und eigentlich hatte ich gehofft, dass jemand es von selbst entdeckt, aber da es immer noch niemand verwendet, verrate ich es mal hier: Im Infodialog von VideLibri, kann man und konnte man schon immer -- wenn man richtig klickt -- Snake spielen!
Ansonsten habe ich noch ein paar Sachen geändert, zum Beispiel, das sich eine Unit der Internet Tools nicht unter Windows compilern ließ.

9. September 2010

Heute habe ich noch eine Seminararbeit über Bildsegmentierung vom letzten Semester hochgeladen. Die Bilder musste ich allerdings stark komprimieren, damit der Text noch so gerade auf die Seite passt (obwohl sie sowieso schon 10 mb größer ist als erlaubt), eigentlich sehen sie also schöner aus.

5. September 2010

Ups, jetzt habe ich tatsächlich im letzten bbutils/internettools-Update &szlig; vermasselt, ich dachte das wäre ein ascii-Zeichen. Mit dem neuen Bugfix unterstützt es nun aber wirklich alle Entities aus dem Standard, selbst die von MathML.

29. August 2010

Jetzt gibt es einen neue Version vom HTML-Templatematcher. Er läuft jetzt tausendmal langsamer mit tausendmal höherem Speicherverbrauch.
Die alte Version hat einen NFA mit einer cleveren Heuristik verwendet, um das Template mit der Textdarstellung einer HTML-Datei in O(1) zusätzlichem Speicher und Linearzeit zu vergleichen, die neue Version verwendet wie alle anderen HTML-Parser eine Baumdarstellungen, die O(n) Speicher erfordert und darauf Backtracking mit einer Laufzeit von vielleicht O(k^n).
Das ist genau das, was ich eigentlich nicht machen wollte, aber es hat sich herausgestellt, dass die Templates dadurch sehr viel leichter zu verstehen und zu schreiben sind, weil es keinerlei Seiteneffekte mehr gibt. Außerdem benötigt es immer noch nicht mehr als ein paar Millisekunden für das Verarbeiten einer Datei (schneller als das Runterladen der Datei), und der Matcher beweist nun, ob das Template der HTML-Datei entspricht oder nicht. Er ist jetzt auch in drei unabhängige Klassen zerlegt, die sich separat verwenden und leichter testen lassen.
Ansonsten haben sich dabei auch die bbutils (Funktionen umbenannt oder entfernt), das TreeListView und die Suchleiste (eine Methode entfernt, um LCL 27190 kompatibel zu sein) geändert.

26. August 2010

Als ich gerade den vorherigen Artikel auf "unübersetzt" setzen wollte (was ich dann aber doch nicht gemacht habe, da die Textfarbe dadurch grau wird, und das nicht zu den bunten Tabellen passt), habe ich gemerkt, dass JAXMLP überhaupt keine Klammern in den If-Bedingungen erlaubt hat, warum auch immer, vielleicht weil es den Schwierigkeitsgrad fürs Parsen von trivial auf einfach erhöht. Die neue Version unterstützt sie jetzt aber.

26. August 2010

I just started to rewrite my fpc html template parser (which of course involves hours of debugging and patching Lazarus, before I can start to program anything else) and found two bugs due to an invalid string->pchar conversion. And although this is an absolutely trivial conversion, no one seems to have examined and described, how to do it best. So, here is a detailed analysis:

Converting ansistring to pchar

Converting a ansistring to pchar should be pretty simple, because the text itself is stored in almost the same way in both cases. If you have a variable str: string, there are three popular ways to convert it to a pchar: pchar(str), @str[1] and pchar(pointer(str)), but it is not obvious which is the best way to do the conversion.

If you don't want to bother with the technical details, you can always use pchar(str) and treat the result as a read-only pchar. But this is not the most efficient way to convert the string, and the following table summarizes the advantages (always green) and disadvantages (always red) of the other methods:

ExampleNo copyBranch freeNil awareRange safe$H- safe
Explicit p := pchar(str) yes no yes yes yes
Array like p := @str[1] yes without $Rno no no
Indirect p := pchar(pointer(str)) yesyes no yes yes

The meaning of the columns is:

  • No copy: None of the methods above copies the content of the string.
  • Branch free: yes, iff the conversion works without branching instructions (hidden ifs). Branching is always very slow and even if modern computers are fast enough that it usually does not matter, you sometimes have/want to make something as fast as possible.
  • Nil aware: yes, if it works if str=nil.
  • Range safe: no, iff the conversion can fail if you enable range checking with the $R+ or -Cr option.
    @str[1] will raise a range checking error if the string is empty, because s[1] doesn't exist then.
  • $H- safe: no, if it also compiles with shortstrings. This section is only about conversion of ansistrings to pchars and none of the methods supports shortstrings. However, sometimes you forget to enable the $H+ option and every string becomes a shortstring. If you then use @str[1], it can randomly crash, because shortstrings are not null-terminated. The other two methods are safe, because they will not compile.

So you should never use @str[1] to convert it to a pchar, and pchar(pointer(str)) only if you understand what nil aware means.
It is said that every ansistring is null-terminated, but this is not exactly true. There is one (and only one!) case in which a ansistring str is not null-terminated: If str is empty (str = ''). Then str is nil.
pchar(str) will detect this case and returns a pointer to a global #0 character, but pchar(pointer(str)) will return nil. So you can always use pchar(str), and pchar(pointer(str)) only if your string is not empty and you can prove this.
(and as a remark: if you ever get a string which is not '' and not null-terminated, you probably forget to enable $H+ or - less probably - something wrote to a wrong pointer. )

So why should you not always use pchar(str)?
Because it is much slower than the two other methods, since pchar(str) checks for the nil-case, and this is often unnecessary.

Some people also say pchar(str) calls UniqueString to reset the reference count of the string, but this is wrong. pchar(str) does not call any function.

To see how worse the check is, you have to look at the assembly of the program (generated with fpc2.4 on amd64, not affected by optimization levels (which is strange because the assignment to rax was duplicated)):


1    mov    rax,QWORD PTR string variable
2    test   rax,rax
3    jne    to 5
4    mov    rax, global #0 address
5    mov    QWORD PTR pchar variable,rax
p := pchar(pointer(str)) or p := @str[1] with $R-:
1    mov    rax,QWORD PTR string variable
2    mov    QWORD PTR pchar variable,rax
So the check requires three additional instructions, and one is a jump instruction which will be executed iff the string is not empty.

Benchmarking (100000000 * 8 times repeated) results in:
non-empty stringempty string
pchar(str)894 ms496 ms
pchar(pointer(str))325 ms325 ms, but wrong result
@str[1]325 ms4616 ms325 ms, but wrong resultcrash

This shows pchar(pointer(str)) is more than twice as fast than pchar(str) in the more common use case of non-empty strings.

And for completeness, also the $R+ @s[1] assembly:

1    mov    rbx, string variable
2    mov    rdi,rbx
3    call   0x421668 <fpc_ansistr_checkzero>
4    mov    rsi,0x1
5    mov    rdi, string variable
6    call   0x421680 <fpc_ansistr_checkrange>
7    mov    pchar variable,rbx
In all cases is possible to modify the resulting pchar, but if you do that you will modify all copies of the string (unless you call UniqueString before):
var s,t:string;
So only modify the pchar of an converted string if you created that string or have modified it before with string functions (so reference count = 1).

20. August 2010

Langsam sterben alle Seiten weg, die ich im Internet kenne. Heute habe ich gemerkt, dass mit der TRegExpr-Klasse verschwunden ist, die früher als bester Delphi regexp-Parser galt. (die alten Delphiforen, in denen sie bewundert wurde, finde ich auch nicht mehr...)
Da man die Klasse für meine Internettools braucht, gibt es hier jetzt einen TRegExpr-Mirror.

10. August 2010

Und weiter geht es mit den SIRDSlets: Es gibt jetzt drei neue Level, Übersetzungen, Beschleuniger und Anaglyphenrendering. Die Beschleuniger sind wie schwarze Löcher, aber unabhängig von der Schiffsposition. Mit dem Anaglyphenrendering kann man es nun auch dreidimensional sehen, wenn man nicht schielen kann. Damit ist allerdings verwirrender, da die meisten 3D-Brillen eine miserabel Kanaltrennung haben.
Und falls es jemand noch nicht mitgekriegt hat: Deolalikar hat einen Beweis für P!=NP mit graphischen Modellen, FO(LFP)-Logik und theoretischer Physik veröffentlicht. Wenn der Beweis stimmt, wurden drei der berühmtesten Probleme in nur fünfzehn Jahren gelöst, mal sehen, wann Riemann drankommt.

28. Mai 2010

Heute habe ich mein neues SIRDSlets Spiel hochgeladen, dass eines der wenigen Spiele ist, die man in echtem 3D spielen/sehen kann. Es ist außerdem das erste Browserspiel auf dieser Seite und muss nicht wie die anderen explizit heruntergeladen werden. Allerdings ist es noch nicht ganz fertig, aber es ist schon seit Monaten spielbar und ich habe im Moment zu wenig Zeit, es zu vollenden. So fehlt zum Beispiel eine deutsche Übersetzung, mehr als sechs Level, und der Hardware-beschleunigte SIRDS-Renderer aus der vorherigen News (wobei es aber zweifelhaft ist, ob ich den jemals einbaue, da der Softwarerenderer schnell genug zu sein scheint, und es Applets nicht leicht fällt OpenGL zu verwenden).

16. Februar 2010

Heute gibt es abermals ein Videlibri-Update, das die unten erwähnten Probleme mit der FHB Düsseldorf und den beiden Aachener Bibliotheken löst. Außerdem läuft es jetzt wieder unter Windows (und weiterhin unter Linux).
Dazu habe ich auch meine Internettools aktualisiert: Der Wininet-Wrapper unterstützt nun auch Cookies ohne Attribute und http-Verbindungen über andere Ports als 80. Außerdem gibt es ein globales Logging (was man insbesondere für https braucht). Die Parserklasse ist ebenfalls flexibler geworden und man kann in den Pseudo-XPath-Ausdrücken nun auch Regex-Filter vor dem Ausführen anderer Funktionen anwenden, statt nur nachträglich wie bisher. (echte XPath-Ausdrücke können es dagegen übrigens gar nicht)
Zudem habe ich ein paar News ins Archiv und einige unfertige Tools auf die Demoseite verschoben.

7. Februar 2010

Ab jetzt gibt es eine extra Demo-Unterseite für kleine Programme, die eigentlich nutzlos sind, aber interessante Techniken oder hübsche Filme zeigen. Dazu habe ich zum einen ein paar Programme verschoben, zum anderen gibt es zwei neue, die ich an der Uni aus den Übungsprogrammen der VR- und Computergrafikvorlesungen programmiert habe.
Beide zeigen eine echte 3D-Darstellung, das eine rendert hardware beschleunigte Single Image (Random Dot) Stereograms, also Bilder, in denen man ein 3D-Bild durch Schielen sehen kann. Das andere "Webcam-UCP" Programm verwendet die klassische rot/cyan-Trennung, um Bilder für 3D-Brillen zu erstellen. Zusätzlich wird aber mittels einer Webcam, die Brillenposition getrackt und die Szene betrachterzentriert gerendert.
Außerdem funktioniert in Videlibri jetzt wieder die StB Aachen (FHB Düsseldorf vermutlich auch), ich lade die neue Version aber erst hoch, wenn ich die FHB noch getestet habe, da es ja sowieso niemand nutzt.

27. Januar 2010

Von VideLibri gibt es nun eine neue Version, die auch die Hochschulbibliothekk der RWTH Aachen unterstützt und vollständig Linux-kompatible ist, inklusive Menüeinträge und integrierte Autostartkonfiguration.
Nun die schlechten Nachrichten: Bei der BTH Aachen gibt es noch keine integrierte Verlängerung, da man nicht gleich nach einer Ausleihe verlängern darf, und ich somit weiß nicht feststellen kann, wie es funktioniert. Außerden haben alle Libero-Büchereien mal wieder eine neue Software installiert. Das heißt:
Sowohl die Aachener Stadtbibliothek wie auch die FHB Düsseldorf gehen vermutlich nicht mehr. Testen kann ich es nicht, weil ich momentan nicht in die Bibliothek kann. (und genau DAS ist der Grund, warum mal endlich jemand die Software benutzen sollte. Wenn mich jemand darauf hinweist und die neue Seite per Mail schickt, kann ich solche Fehler nämlich in einer Viertelstunde beseitigen, statt in zwei Wochen!)
Zumindest in der alten Windowsversion funktionieren die beiden definitiv nicht (Stb Aachen war da nie drin und die FHB ist umgezogen). Sollten sie in der Linuxversion funktionieren, kann man aber einfach die Dateien der Linuxversion in das Installationverzeichnis in Windows kopieren, dann läuft es dort genauso gut/schlecht.
Zudem habe ich die FHB Bochum gestrichen, da sie nicht mehr unter ihrer alten Internetadresse zu finden ist, ich die neue nirgends finden kann und sie sowieso nur im Programm war, weil sie einen gemeinsamen Server mit der FHB Düsseldorf hatte.

6. Januar 2010

So jetzt gibt es eine neue Version von allen in der letzten News erwähnten Paketen, hauptsächlich, weil ich vergessen hatte, die Unittest auszuschalten. Beim TreeListView gab es noch einige andere Änderungen: Beim horizontalen Scrollen flackert es nicht mehr unter GTK (früher hat es das auch nicht, aber bei der Änderung letzter Woche gab es wohl irgendwelche Kompatibilitätsprobleme) und die Icons im Baum werden nun geclippt, wenn die Spalte zu klein ist.
Außerdem gibt es jetzt eine neue Version von meinem Büchereiverwaltungsprogramm Videlibri (das übrigens auf allen diesen anderen Paketen basiert). Zur Abwechslung setzt es diesmal nicht Windows sondern Debian 64-Bit voraus und kann auch die Bücher der Aachener Stadtbibliothek verwalten. Die Windowsversion kommt später, wenn ich sichergestellt habe, dass das Crosscompiling zuverlässig funktioniert. Das Programm verwendet allerdings immer noch ein Windowsverzeichnislayout (alle Dateien in einem Programmordner statt wie unter Linux üblich überall verstreut) und der Autostart muss manuell unter der gnome/KDE-Konfiguration eingetragen werden (videlibri-Pfad mit --autostart als Parameter), wenn man die Autostartfunktionalität benutzen will.

31. Dezember 2009

Und weiter geht's. Ich habe jetzt drei der bisherigen Packages mit HTML-Templateparser, Autoupdate und Wininetwrapper zu einem Internet Tools-Package zusammengefügt und platform-unabhängig gemacht (der Hauptunterschied ist, dass der Wininetwrapper nun auch Synapse unterstützt). Das Package benötigt/enthält auch meine bbutils, bei denen ich noch einen Absturz unter 64-Bit beseitigt habe (und vermutlich seit dem letzten Release auch einige Funktionen umbenannt).
Außerdem gibt es jetzt für alle der geänderten Pascalkomponenten eine Onlinedokumentation, für die ich einfach nur die sowieso in den zip-Dateien vorhandenen pasdoc-Dateien unkomprimiert hochgeladen habe.

28. Dezember 2009

So nun bin ich von Windows 32-Bit auf Linux 64-Bit gewechselt, und jetzt geht das große Updaten los. Die alten Programme dieser Seite waren zwar theoretisch schon alle platform-unabhängig, praktisch gab es aber noch einige Macken.
Mein TreeListView läuft in der neuen Version unter LCL-GTK sehr viel schneller/flüssiger als früher, da mehrere Benutzereingaben hintereinander zusammengefasst angezeigt werden (wobei es eigentlich ein gemeldeter LCL-Bug ist, dass so viele überflüssige Nachrichten überhaupt weitergeleitet werden), außerdem kann jetzt in jedem Item ein Datenwert mit 64-Bit gespeichert werden und die Komponente steht in einem Designzeitpackage zur Verfügung. Die dazugehörige Suchleiste passt sich nun der Schriftgröße an und hat ebenfalls ein Package bekommen. Zudem kann mein JAXML-Parser jetzt auch Dateien mit unterschiedlichen Zeichensätzen erstellen und die \\-Form funktioniert wieder richtig.

5. Oktober 2009

Ich habe jetzt mal meine Bachelorarbeit hochgeladen. Im Wesentlichen geht es darum, wie man aus mehreren gegebenen, sortierten Listen von gleichen Ereignissen herausfinden kann, welches dieselben sind.

16. September 2009

Diese Woche habe ich meine Bachelorarbeit/prüfung abgelegt, so dass ich mich wieder etwas um meine Homepage kümmern kann.
Heute gibt es ein neues Java-Script, mit dem man das gaußsche Eliminationsverfahren auf eine Matrix anwenden kann. Es gibt zwar schon hunderte solche Programme im Internet, aber alle, die ich finden konnte, waren für mein Gleichungssystem unbrauchbar, da sie verlangen, dass die Matrix quadratisch ist und Elemente eines Körpers statt eines Ringes enthält.
Übrigens ist interessante Tatsache, die ich bei der Implementierung festgestellt habe, dass man den euklidischen Algorithmus zur ggT-Berechnung als Spezialfall des gaußschen Eliminationsverfahren auf einer 2x1-Matrix der natürlichen Zahlen betrachten kann.

15. April 2009

Es gibt nun wieder ein neues Programm: Einen Sonnensimulator, der die Helligkeit und den Farbton des Monitors zeitlich ändert, so dass dessen Licht dem Sonnenlicht entspricht.
Außerdem habe ich dafür eine Diagrammkomponente geschrieben, die Gleitkommazahlen-Reihen unterschiedlich darstellen kann. Sie benutzt ein Model/View-System (da ich mich viel mit QT beschäftigt habe), das im ersten Moment ziemlich verblüffend wirkt. Z.B.: Kann man in zwei unterschiedlichen Fenstern immer dieselben Punkte synchronisiert anzeigen und in einem noch eine weitere Reihe hinzufügen.

9. April 2009

Ein Problem, wenn man Opensource-Software schreibt ist, dass man häufig Patches erhält, die ziemlich unbrauchbar sind, weil sie zu 95% aus Whitspaceänderungen bestehen. Daher habe ich ein (unter Linux und Windows laufendes) Kommandozeilentool namens Simplifydiff geschrieben, welches alle unnötigen Daten entfernt.
Außerdem werden ab jetzt alle Gästebucheintrag, welche von der Heuristik als Spam erkannt werden ohne Backup gelöscht. Bisher habe ich zur Sicherheit immer noch eine Kopie per Mail erhalten, aber da unter den letzten tausend Einträgen sowieso kein echter Beitrag war, ist das wohl unnötig. (Ebenfalls unnötig sind übrigens die Spameinträge, das Gästebuch hat nämlich schon immer noindex, nofollow gesetzt!)

1. März 2009

Vor einiger Zeit habe ich angefangen Texte und ein Buch mit LaTeX zu schreiben und habe dafür den Editor Texmaker genommen, da es der einzige platform-unabhängige, open-source Editor war, den ich finde konnte. Da der einige Fehler enthält, habe ich in einige kleine Patch erstellt, die dann immer größer wurden, bis sie schließlich zu dem Fork TexMakerX (auf Sourceforge) geführt haben. Zu den wichtigsten Feature, die ich hinzugefügt habe, gehört interaktive Rechtschreibprüfung, Codefaltung und eine Textanalyse.
Auf dieser Seite hier habe ich dagegen nur den Übersichtstext unten mal wieder aktualisiert und, dank eines Versionskontrollsystems, das Datum der Newsnachricht vor dieser richtig gestellt. (da stand nämlich noch 18. Okt) (Korrektur: Das VCS lag falsch, aber glücklicherweise hatte ich noch mein CMS)

Ältere Neurigkeiten...


Auf dieser Seite kann man einige von mir programmierte Spiele und Tools herunterladen.
Zudem gibt es nützliche Quellcodes und Komponenten, vorwiegend für Delphi und FreePascal.

Ein paar Informationen über mich: Ich programmiere, seit ich acht bin (weshalb viele der Downloads auf dieser Seite sehr alt sind), mittlerweile bin ich 20 und studiere Informatik an der Heinrich-Heine-Universität Düsseldorf.(Stand 2009)
Ich habe mehrmals am Bundeswettbewerb Informatik teilgenommen, wo ich Preisträger und Bundessieger wurde, außerdem war ich im deutschen Team bei mehreren internationalen Informatikolympiaden (auch bei der International Olympiad of Informatics) und habe dort (leider nicht bei der) auch einige Medaillen gewonnen.

Es wäre schön, wenn ihr ins Gästebuch schreibt wie euch diese Seite und die Programme hier gefallen haben. Bei sonstigen Fragen könnte ihr mir auch gerne eine Mail schreiben.
Maus mit Käse
Für G+ Autorenanerkennung:
Homepage von