Customized WordPress-Template for Category-Subtree

For the Advent calendar categories I wanted to have a custom template that applies to all categories below the Adventskalender category (that one included).

WordPress has a great Template system, using inheritance between templates, as shown in the Codex. Utilizing this system it is possible to customize all category pages or one category page in particular – but there seems to be no way to customize a set of categories based on the category hierarchy.

On the other hand WordPress contains a function to get a Breadcrumb trail from the root to the current category. For this function, get_category_parents() no non-grapical equivalent seems to exist unfortunately.

On the other hand the code is quite simple: Start at the category of your choice and recursively get the parent category up to the root.

My current solution is based on a fixed „root“ category, as that is what I want to have (more ideas on how the template system could be extended nicely see below).

My solution utilizes the action hook  ‚category_template‘ which is not documented unfortunately in the codex (although listed in the filter reference). The following is the code listing of the function:

function get_advent_category_template( $archive_template )
{
  // get the category:
  $catId = get_query_var('cat');
  $found = false;

  $yourcat = get_category($catId);
  do {
    if ($yourcat->slug == 'adventskalender')
    {
      return dirname(__FILE__).'/category-adventskalender.php';
    }
    $yourcat = get_category($yourcat->parent);
  } while (true);

  // not found in the parent hierarchy, return the default template:
  return $archive_template;
}

The parameter of this function is the default template that would be applied without the hook implemented here. We have to detect if we’re in a matching category and if so, overwrite that template by returning our customized one. Therefore the loop from the current category up to the root category and search for our anchor category which is the root for the categories we want to apply the custom template for.

If found, we return the custom template file, otherwise we return the default one.

Now this function has to be registered, and that’s it:

add_filter( 'category_template', 'get_advent_category_template' ) ;

How the WordPress Template system could be extended

When I stumbled over this issue I asked in the WordPress IRC channel after not seeing a proper solution, where I was told that it is a quite common problem, and more people asked for a solution in the past.

In fact it would be quite easy to extend the WordPress template system by another template „class“ in the second line of the graphical overview. Inserting another variant between category-$id.php and category.php would fit nicely from a logical point of view.

A Category archive that is defined for a single category is preferred (left of the new one), but the tree-based category template (the new one) is preferred over the generic category template.

Zahlen formatieren im Web

Anfang der Woche stolperte ich über eine Auswertung zu OSM-Adressen von Simon Poole. Wie das bei statistischen Auswertungen so üblich ist, dominieren dabei Tabellen und Zahlen.

Gerade große Zahlen sind aber schnell schwer zu lesen. Wie viele Nullen hat 1000000 genau? In der Typographie werden Zahlen deshalb nicht einfach Ziffer für Ziffer mit identischem Zeichenabstand gesetzt, sondern gesondert behandelt. Ein paar Beispiele für eine Million:

  • 1000000
  • 1.000.000
  • 1 000 000
  • 1’000’000
  • 1,000,000

Dies direkt so anzugeben hat jedoch diverse Nachteile.

  1. Beim Kopieren von Tabellen wird der Inhalt insgesamt kopiert. Kopiert man insbesondere aus dem Web in Tabellenkalkulationsprogramme wie Calc oder Excel, so werden da aufwendige Algorithmen oder Handarbeit notwendig, um Zahlen deutlich als solche zu erkennen. Insbesondere sind 1,001 sowie 1.001 je nach Herkunft ungefähr eins oder knapp über tausend.
  2. Auch beim Lesen ist die Verwendung von Punkt oder Komma schwierig, weil nicht eindeutig.
  3. ungeschützte Leerzeichen wären notwendig, um einen Zeilenumbruch innerhalb der Zahl zu verhindern.
  4. Gerade bei großen Tabellen ist die durchgängige Formatierung aufwändig.

Betrachtet man Zahlen mit Nachkommastellen, tauchen zusätzliche Herausforderungen auf. Um untereinander stehende Zahlen schnell vergleichen zu können, wäre eine Ausrichtung wünschenswert, bei der das Komma aller Zeilen an der gleichen Stelle steht. In Tabellenkalkulationsprogrammen wird dies üblicherweise erreicht, indem die Anzeige auf eine feste Anzahl von Nachkommastellen konfiguriert wird: zusätzliche Ziffern werden abgeschnitten, fehlende Ziffern in Form von Nullen angehängt.

Natürlich kommt einem bei all dem sofort CSS in den Sinn. Sollten Stylesheets nicht in der Lage sein, auch die Formatierung von Zahlen anzupassen? Tatsächlich stößt man bei der Suche im Netz auf einen früheren Entwurf in der Richtung: Im Wiki der CSS-Working-Group vom W3C.

Die aktuelle Liste von Standards und Entwürfen vom W3C enthält jedoch kein Modul mit entsprechenden Angaben.

Um dieses Problem anzugehen (und anstatt für meine letzte Prüfung zu lernen) habe ich ein Modul für jQuery geschrieben. Eine Beispielseite zeigt der folgende iframe:

Wie funktioniert das Plugin?

Zunächst wird mit letteringjs dafür gesorgt, dass beliebige Zeichen mit CSS-Selektoren zugänglich sind. Lettering.js kapselt dazu jeden einzelnen Buchstaben von gewünschten Elementen in ein entsprechend klassifiziertes <span>-Element. Die Klassen (char0, char1,…) werden allerdings im Folgenden gar nicht mehr genutzt. Vielmehr lassen sich die einzelnen Zeichen mit CSS über die Pseudoklassen :nth-child(n) und :nth-last-child(n) ansprechen. Durch die Möglichkeit, den Platzhalter n zu verwenden, ist dies deutlich einfacher als der Weg über die einzelnen Klassen.

Zunächst werden aber die per lettering zerlegten Zeichen klassifiziert und dann gruppiert: Als Klassen gibt es das Vorzeichen, Ziffern, das Komma und Einheitenzeichen. Heuristisch wird dabei davon ausgegangen, dass die Einheit mit der ersten nicht-Ziffer (nach dem Komma, falls nötig) beginnt.

Tausender-Gruppierung

Um jeweils drei Ziffern zu gruppieren, wird per CSS-Pseudoklasse :before das entsprechende Trennzeichen generiert. Per default ist dies ein Leerzeichen, das sich aber per Überladung der CSS-Klasse sowie durch Angabe beim Aufruf des Plugins überschreiben lässt.

Für die Zahl vor dem Komma wird :before auf :nth-last-child(3) angewandt, für die Nachkommastellen auf :nth-child(3). Hier wird dann das Trennzeichen über die CSS-Property content generiert.

Ausrichtung am Komma

Um einheitlich am Komma ausrichten zu können, wird per Javascript zunächst die maximal notwendige Breite der Nachkommastellen ermittelt. Das Ergebnis wird dann dem mit display: inline-block formatierten Block der Nachkommastellen zugewiesen. Hier entsteht jedoch ein Problem, das dexter entdeckte: Skaliert man im Browser nur den Text, aber nicht die gesamte Darstellung, so werden Absolute Werte wie solche in Pixeln nicht mitskaliert.

Um dieses Problem zu lösen muss die notwendige Breite in Schrift-relativen Größenangaben wie em angegeben werden. 1em entspricht dabei nach Spezifikation der Kantenlänge eines typographischen Gevierts in der verwendeten Schriftgröße, und  dessen Höhe wird durch die Schriftgröße bestimmt, die sich mit jQuery herausfinden lässt. Aus der berechneten Pixel-Zahl lässt sich also zur Einheit em umrechnen, so dass auch bei einer reinen Schrift-Skalierung kein Problem mehr auftritt.

Ausblick

Zunächst fehlen noch ausgiebigere Tests. Außerdem wäre die Anwendung auch außerhalb von Tabellen praktisch. Mal sehen, wozu ich in den nächsten Tagen komme.

Danach plane ich das Plugin auch „offiziell“ zu veröffentlichen.

Verändertes Konzept für den Konfirmandenjahrgang 2013-2015

Gestern gab es ein Gespräch mit Aktiven der Lukasgemeinde, bei dem die von uns (dem KU-Team des demnächst startenden Jahrgangs) geplante Verlegung des Konfirmandenunterrichts vom Dienstag Nachmittag auf Samstag Vormittag diskutiert wurde. Der „klassische“ Konfirmandenunterricht (KU) findet „traditionell“ einmal wöchentlich für eine Stunde Dienstags statt. In den meisten Städten und Gemeinden ist dies auch mit Schulen abgesprochen, die für den betreffenden Jahrgang (der Konfis) den Dienstagnachmittag unterrichtsfrei halten.

In anderen Gemeinden ist diese Terminierung (monatlich Samstags) durchaus seit längerem bereits üblich, so ist es prinzipiell z.B. auch in den Konzeptbüchern von Kessler/Nolte so vorgeschlagen. Wir als Team haben in Warburg und rund um das Konficamp des Kirchenkreises Paderborn sowie aus Minden damit gute Erfahrungen gemacht.

Insofern hatte ich objektiv auch in Bezug auf das Gespräch keine großen Bedenken. Einige Knackpunkte der Argumentation waren uns zuvor durchaus bekannt:

Ängste

Da ist die Angst, der Stundenumfang in unserem Konzept sei geringer als im „alten“ Modell – was abzählbar nicht stimmt.

Da ist die Angst, Konfis verpassten zu viel, wenn sie einen Samstag fehlen, verglichen mit einem Fehltermin am Dienstag. Das ist auf den ersten Blick richtig, stimmt aber schon nicht mehr, wenn zwei Dienstagstermine (im 2-Stunden-Modell, vier Termine bei einer Stunde wöchentlich) verpasst werden. Und während der eine Dienstag schonmal „ja nicht so schlimm“ ist und als regelmäßiger Termin im Kalender steht, hat der ungefähr monatliche Samstagstermin mehr den Charakter eines nennenswerten, eigenständigen Einzeltermins. Wohlgemerkt: Das hat nichts mit inhaltlicher Wertung zu tun, sondern bezieht sich rein auf die Wahrnehmung im Terminkalender.

Spätestens gegenüber dem Modell mit einer Stunde pro Woche geht zudem weniger Zeit für Ankommen, Ruhigwerden und Schon-wieder-aufgeregt-sein drauf; denn die Jugendlichen unterhalten sich beim Ankommen nicht länger, nur weil sie danach länger zusammen sind. Nach etwa 10 Minuten sind die üblichen Infos meist ausgetauscht, die Begrüßung erledigt. Mehr muss nicht mehr unbedingt sein oder hat Zeit bis zur nächsten Pause, in der das nicht stört.

Der Unterricht

Den oben erwähnten „klassischen“ Unterricht mit wöchentlichen Terminen habe ich selbst nie erlebt. Als Konfi habe ich eine Mischung aus monatlichen Samstagen und 14-tägigen Doppelstunden mitgemacht, als Teamer ebenso.

Vergleichen kann ich vor allem die Doppelstunden mit den 4-fach-Stunden. Für den jetzt kurz vor der Konfirmation stehenden Jahrgang haben wir von den Expedition-Gottsuche-Einheiten einige zerteilen und viele Einzelabschnitte kürzen müssen.

Die Ergebnisse haben darunter, so vermute ich, gelitten. Vielleicht war die Gruppe natürlich auch einfach relativ unkreativ. Vielleicht sind deshalb in anderen Jahrgängen bei gleicher Themenstellung kreativere, aufwändigere, durchdachtere Ergebnisse herausgekommen. Aber ehrlich gesagt glaube ich das nicht.
Kreative und mentale Prozesse sind sich in vielerlei Hinsicht ähnlich. Das erneute Durchdenken, überarbeiten, verfeinern und manchmal auch verwerfen einer Idee gehört zu einem Reifungsprozess hin zu einem immer besseren Ergebnis, hin zu bewusster formulierten Gedanken, verfeinerteren Symboliken.
Eine Kreativeinheit, in der innerhalb von 45 Minuten ein Thema erarbeitet und als Gruppe umgesetzt werden muss, ist möglich. Zeit für Experimente und Fehlschläge bleibt dabei jedoch oft nicht.
Nicht, dass Konfis normalerweise bewusst erstmal experimentieren würden. Aber gezielte „Langeweile“ fördert das Nachdenken über das Getane und weckt den Wunsch, dabei gefundene Schwächen der Darstellung zu beheben oder weitere Ideen hinzuzufügen.

Dabei kommt es auch vor, dass trotzdem nicht mehr viel passiert. In diesem Fall lässt sich auch spontan mit einem Überblick über die Gesamtgruppe ein Programmpunkt abkürzen – oder andererseits auch verlängern, wenn die Konfis überwiegend noch ins Thema vertieft sind.

Gerade diese Flexibilität erfordert aber längere Termine. Bastelmaterial zehn Minuten später wegzuräumen und stattdessen einen bestimmten Aspekt des Plenums auf den nächsten Termin zu verschieben, zwei Lieder weniger zu singen oder ein Spiel weniger im Plenum zu spielen, ist meist kein Problem. Über Termingrenzen hinweg funktioniert das viel zu oft jedoch nicht. Aus einmal aufräumen wird zweimal aufräumen (denn das Gemeindehaus kann ja nicht die ganze Woche blockiert werden), und einmal raus aus dem Thema ist das Wieder-Eindenken ein oder zwei Wochen später extrem schwierig.

Das Sozialgefüge der Gruppe

Regelmäßige kurze Arbeitstreffen fördern, so ein Gegenargument in der Diskussion, die soziale Bindung in der Gruppe, das Kennenlernen ist einfacher, da ausreichend Kontinuität gegeben ist und die regelmäßigen Treffen zu einem dauerhaften Austausch führen.

Auf der anderen Seite ist aber gerade die längere ununterbrochene Beschäftigung mit dem Gegenüber, wie es in einer Kleingruppeneinheit von anderthalb Stunden Länge (mit Pause, die aber die Gruppe nicht zwingend auflöst) der Fall ist, zusätzliche Eigenheiten, die in kürzeren Einheiten nicht erreicht werden können.

Konflikte müssen eher gelöst werden, weil sie sonst direkt an dem einen Termin eskalieren, ohne dass eine deeskalierende Separation der gegnerischen Parteien das Konfliktpotential bis zur nächsten Woche dämpfen könnte. Dies kann mehr Stress bedeuten, für die Konfis wie für das Team. Es fördert jedoch auch die wichtige Fähigkeit, Konflikte zu lösen, anstatt ihnen auszuweichen, unter Anleitung eines nicht zuletzt christlich geprägten Teams, das eben nicht wie manche Elternhäuser, Cliquen oder Schulklassen auf das Recht des Stärkeren unter Einsatz aller Mittel pocht, sondern ein faires, tolerantes, nicht ignorantes Miteinander propagiert.

Trotzdem ist das Argument gültig: Kennenlernen kann man sich nur schlecht „einmal im Monat“. Deshalb sieht unser Plan vor, zwischen den Sommer- und Herbstferien mit dem Konfitreff eher spielerisch einzusteigen. In dieser ersten Phase wird nur am Rande inhaltlich gearbeitet; im Vordergrund steht das Kennenlernen; Inhalte werden diesem Ziel gleich- wenn nicht untergeordnet. So wird das Kennenlernen der Gemeinde (Gruppen, Aktive, Organisation etc) als Gemeindebrief-Rallye verpackt, das Thema Martin Luther zunächst als Filmabend mit Popcorn-Flair angegangen.

Die lokale Verankerung in der Gemeinde

Für mich sehr überraschend wurde das Argument der lokalen Verankerung des Konfiunterrichts aufgeworfen. Dies betrifft zwei völlig unterschiedliche Aspekte: Die Lokale Verankerung des Konfirmandenunterrichts (im Lukasbezirk) einerseits und die Problematik, mit anderen Bezirken (ich weigere mich, hier den Begriff Gemeinde zu nutzen) offen in Bereichen zu kooperieren, die zum Kernbereich der Gemeinde gehören.

Überraschend deshalb, weil ich – vielleicht dafür zu wenig im „normalen“ Gemeindeleben involviert – nie damit gerechnet hätte, dass es offensichtlich zumindest in einigen Köpfen einen Konkurrenzkampf der Gemeindebezirke innerhalb der Kirchengemeinde Paderborn gibt. Ob das normal ist? Ich weiß es nicht. Aber zumindest halte ich es nicht für förderlich.

Und es ist auch nicht „Programm“, denn im Bereich von Konzerten, Ausstellungen und anderen Veranstaltungen gibt es immer wieder Ankündigungen und Werbung auch für solche in anderen Bezirken, zum Beispiel im Gemeindebrief „unterwegs“ des Lukasbezirks.

Und doch wünschen sich jene  eigentlich (man kann nie alles machen, so ihre eigene Aussage) neben den Besuchen in Synagoge, Moschee und bei der Aidshilfe auch noch den beim Biobauern. Das inhaltliche Argument ist auch hier nicht falsch. Nachhaltigkeit und Bewahrung der Schöpfung sind wichtige Themen, genauso wie die Unterstützung von und der Kontakt mit (vermeintlich) schwächeren Mitmenschen.

Das Argument der lokalen Verankerung „…wenn wir diese Einrichtungen schon im Bezirk haben, sollte man diese Gelegenheit auch wahrnehmen“ halte ich jedoch für schwierig. Für Synagoge und Moschee gilt das Argument nicht (beide liegen im Markusbezirk). Außerdem sehe ich diese „Lokalität“ ansonsten nicht dokumentiert.

Klar: Die üblichen, oft vorkommenden Veranstaltungsorte, die im Gemeindebrief vorkommen, liegen im Lukasbezirk: Das Lukaszentrum, das Himmelszelt sowie das direkt benachbarte Gemeindezentrum auf der Lieth und die Kirche in Dahl. Aber wo fängt der Lukasbezirk an? Wo hört er auf? Ich weiß, ich könnte jemanden fragen; aber ich habe einfach erstmal gesucht, was ich so dazu finde, und; welch Wunder: nichts.

Oder: fast nichts. Abdinghof, Lukas, und  Matthäus geben außer den Standorten ihrer Kirchen und Gemeindezentren keine Ortsangaben über „ihr Gemeindeareal“ an. Martin-Luther (haben keine Webseite), Johannes (Webseite nicht erreichbar) geben online offensichtlich gar nichts von sich preis. Lediglich der Markus-Bezirk zeigt auf einer Karte (leider Google und dann auch noch lizenzwidrig rauskopiert), für welchen Bereich Paderborns er zuständig ist.

 

Was also soll die lokale Verankerung? Aktive (!) Gemeindeglieder kriegen das mit. Mit der Konfi-Radtour (oben nicht erwähnt) erfahren die Konfirmanden zumindest teilweise, welche Ortsteile außerhalb der Kernstadt Paderborn noch zum Lukasbezirk gehören. Darüber hinaus soll, so die bezirksinterne Regel, mindestens jeder zweite Pflicht-Gottesdienstbesuch der Konfirmanden im Lukaszentrum sein. Die Bindung an die Veranstaltungsorte der Gemeinde ist also bereits gesichert. Für eine nähere geographische Bindung an das, was irgendwo (noch weiß ich nicht, wo) als „der Lukasbezirk“ definiert ist, sehe ich jedoch keinen Grund. Konfis sind auf weiterführende Schulen in der ganzen Stadt verteilt, haben ihre Freunde nicht (nur) im Lukasbezirk, und auch wenn mancher sich das wünschen mag, spielt sich auch der Lebensmittelpunkt der Konfirmanden in den meisten Fällen nicht in der Kirchengemeinde ab.

Fazit

Angesichts schwindender Finanzmittel, Stellenstreichungen unter Pfarrern und Jugendreferenten, und damit aber unter Berücksichtigung des sozialen Auftrags auch über die offiziellen Gemeindeglieder hinaus halte ich Konkurrenzdenken zwischen Gemeindebezirken für Fehl am Platz.

Angesichts von in Teilen der Gesellschaft abnehmender Relevanz und abnehmender Attraktivität der Institution Kirche stellt sich die Frage, wie man diese Probleme angehen kann. Das Nonplusultra der KU-Modelle gibt es nicht; kann es nicht geben. Dafür ist die Bandbreite der Lebenssituationen von Konfis zu verschieden. Die Herausforderung besteht darin, durch Alternativen Konfis und potentiellen Konfis entgegenzukommen und gleichzeitig die bestmöglichen Erfahrungen „zu generieren“.

Windows 8 Einrichten

Habe heute einen neuen PC in der Hand gehabt, auf dem Windows 8 vorinstalliert war und sollte das einrichten.

Fazit: Benutzerfreundlichkeit sieht anders aus. Zugegeben: Im Vergleich zu Windows 98 geht vieles besser, aber dennoch ist mir vieles aufgefallen, was ich als Useability-Bug einordnen würde.

  1. Fehlermeldungen: Die Einrichtungsroutine ist als geführter Dialog gestaltet. Auf Seite 7 oder 8 erfolgt die Einrichtung eines Benutzerkontos, was die Angabe eines Benutzernamens, eines Passwortes sowie eines Passwort-Hinweises erfordert. Weder ist hier erkennbar, dass der Passworthinweis eine Pflichtangabe sei…
  2. …noch, dass sich der Benutzername vom Rechnernamen unterscheiden muss. Dumm nur, dass das erst hier auffällt. Ich kann mir nicht vorstellen, dass es als Idee mittlerweile eine Ausnahmeerscheinung wäre, den eigenen PC einfach mit dem eigenen Vornamen zu benennen. Heißt der PC aber erst einmal (nach Seite 1 oder 2 der Einrichtungsroutine) „Anton“, so gibt es später nur eine Fehlermeldung, das Benutzerkonto dürfe nicht genauso benannt werden wie der Computer. Immerhin kann man im Dialog zurückgehen bis auf Seite 1 – aber dumm gelaufen: Hier ist der Rechnername mittlerweile festgelegt und lässt sich nicht wieder ändern.
  3. Nach der letzten Formularseite dauert die endgültige Einrichtung ein paar Minuten, die wie schon mindestens seit Windows 98 bekannt, durch „Werbung“ überbrückt werden. Dabei wird darauf hingewiesen, dass sich an der rechten Seite des Bildschirms unsichtbar ein Menü versteckt, das eingeblendet werden kann, indem man mit der Maus in die Ecke zeigt. Verpasst man dies jedoch, deutet darauf hinterher nichts mehr hin – ein typischer Fall von „Mystery Meet Navigation“ und damit eines der klassisch großen No-Gos der Useability.
  4. Es mag sein, dass Microsoft seinen Desktop in Windows 8 nach Möglichkeit vor den Nutzern verstecken will. Wie sonst wäre es zu erklären, dass es keinerlei Hinweis darauf gibt, wie der Desktop zu erreichen wäre? Gut: Nach jahrelanger Windows-Vorprägung werden „Poweruser“ eventuell schnell die altbekannte Tastenkombination Windows+D ausprobieren, aber intuitiv ist für mich was anderes.

Karten-Test

Dies ist ein Test, der erstmal Hamburg selbst zeigen soll.

Karte wird geladen - bitte warten...

53.567, 10.028

Hier findet also der Kirchentag statt, und lange ist es bis dahin nicht mehr hin.

Eine Marker-Karte ist hier zu sehen:

Programmheft-Standorte

Karte wird geladen - bitte warten...

Handelskammer Hamburg, Adolphsplatz 1: 53.549870, 9.990864

Test database instances

OSM is a big database. Postgresql/Postgis is an excellent database management system, but for local tests on my notebook I have a problem: I have only one slow harddisk that is shared by postgresql tablespace, tomcat, linux swap partition and firefox.

Even with 4 GB RAM that leads to a problem, if the database tables become too big to fit into memory. Especially for the mapnik database schema some actions require full table scans on big tables (that’s one reason why I would prefer a different database schema).

A worldwide osm database is to big for my harddisk (or at least I don’t want to give that much disk space for testing currently here), so I first tried a germany extract database (built out of the Geofabrik’s pbf Germany extract), but even that’s too big for fast processing as at least one query of the exploration page needs a full sequential table scan through the ways table. As a result the calculation of any exploration page takes several minutes, which isn’t acceptable for debugging (as it would not be acceptable for a live environment, of course).

After all I had to restrict myself to an even smaller part of the world.

To apply that I first thought about cutting a boundingbox around Paderborn by osm2pgsql directly:

osm2pgsql -s -C 768 -c -p paderborn -d lalm -U lalm -W -H 127.0.0.1 -P 5432 
          -b 8.6,51.65,8.9,51.8 --hstore --style ./default.style germany.osm.pbf

The problem here is, that osm2pgsql ignores the bounding box (parameter -b) to write the slim tables. These are written containing every node of the import file, which takes quite long and uses lot’s of disk space.

The second attempt is better: I first used osmosis to get the bounding box extract and then imported the whole resulting file using osm2pgsql. The corresponding osmosis command is

osmosis --read-pbf file="germany.osm.pbf" 
        --bounding-box top=51.8 left=8.6 bottom=51.65 right=8.9 
        --write-pbf file="paderborn.osm.pbf" compress=none

I decided not to compress the paderborn.osm.pbf file as that speeds up reading the file for osm2pgsql afterwards. The osm2pgsql import then is again the same as above except the -b parameter as now the bbox corresponds to the whole file already.

How to „register“ a new Describer

Adding Describer Classes should be easy, as I suggest that to be the most agile part in Lalm development for a long time. Generating descriptions is different between languages and there are a lot of strategies to implement the generator, starting from string substitutions up to highly complex Natural Language Generation engines with highly sophisticated grammar assemblers, sentence planning stuff and so on.

Unfortunately Tapestry is developed following a strong mantra: Static Structure, Dynamic Behavior.

In fact that means that a Tapestry template is static, even a component’s template is static and cannot change substantially. It’s possible to hardcode alternatives and use a parameter or some other data source to choose one of them, but every alternative again has to be hardcoded in that template and (!) in the corresponding components java class.

Therefore adding a new describer component involves the following steps:

  1. implement the describer component’s class.
  2. add it to the ConfigurableDescriberComponent.java source:
    1. put it into the describerMap hashmap by extending the initDescriberMap() method.
    2. inject the block like it’s done with the other blocks
  3. add the new block to the ConfigurableDescriberComponent.tml

Using the Describer afterwards simply involves setting the configuration value in the lalm.properties file.

Configuration

In the last days I worked on configuration capabilities of the Lalm. Configuration is necessary for several reasons.

Technical reasons include different database backends, different java setups, different describers and so on. Some of them are planned, others are already realized. Let’s dive a little bit into the available options.

Options for Data Sources

Initially I didn’t think about supporting different data sources, but there’s one big problem with OSM data: it’s a really big bunch of bits and bytes. Even importing the database takes many hours and needs lots of processing power on the server – once initially and then to keep up to date.

While I didn’t care about the update process, yet, I have to get a server where I can run the development snapshot of the Look-and-Listen-Map. Thanks to Wikimedia (Deutschland) I’m able to run it on the toolserver, but there’s not enough spare capacity to use „my own“ dedicated osm database. I have to share the Mapnik scheme database used by the wikipedia map projects for rendering. These databases contain everything I need – but sometimes in a horrible schema, so that queries might take incredibly long. For my local test setup here, a pretty common page request to navigate one way takes several minutes as it needs one full sequential table scan over the ways table for every node of the way currently. Of course the database schema could be changed to speed up that, but that would break the other projects on toolserver, so I’m happy at least the storage behind the postgresql-server at the toolserver is fast enough.

For local testing a separate set of tables using the snapshot scheme created by osmosis is possible to use, too.

Which one to use is possible to configure in the file lalm.properties, including table prefixes, authorization data and – of course – the DatabaseService-Implementation to use. Here currently MapnikDatabaseAPI (using the mapnik hstore schema), SnapshotDatabaseAPI (for the snapshot schema) and last but not least OverpassAPI, using the Overpass API as a web service combined with a local memory cache are implemented (not finished, yet).

Options for Describers

How to describe the geodata as text? I have a lot of ideas, and I think it should be possible to change that according to the users needs, the lalm providers decisions or for testing purposes.

Describers are Tapestry components and it’s possible to choose different implementations by configuring them.

More Ideas

Debugging options: it should be possible to show or hide debugging data, run in productionMode (or not) and more

 

Routing Engine

There are several routing engines. PGRouting looks very nice for several reasons:

  • pg routing is written in pure SQL (requiring Postgis/PostgreSQL).
  • routing network configurable: can route over streets as well as over waterways or powerlines
  • costs of routing networks can be stored in a fixed table or otherwise attatched by an SQL query.
    That should allow to provide many different profiles.
  • costs can be direction dependent
  • support of node and way weigths

The database schema of PGRouting is not well documented, but exposed in the source of the class Export2DB.

The schema stores OSM ids. For ways these IDs are stored explicitely in the table „ways“, as ways are not stored in their original form, but sliced to routing segments. IDs of nodes and relations are stored in their original form.

Using only this routing database will not be sufficient as it lacks all tags not relevant for routing, Usage in combination with other modules of the portal could be completely separated (e.g. in a different postgres schema)