5 Alben für die Insel

Fünf Alben "für die einsame Insel", ohne besondere oder wertende Reihenfolge. "In a nutshell" ist jeweils eine Spotify-Playlist mit fünf ausgewählten Songs des Albums (deren Skripte dürfen dazu nicht geblockt sein, Google Analytics leider auch nicht).

Johnny Cash – Unearthed

Die 5 (!) CDs sind grob stilistisch sortiert: Eine mit Duetten, eine mit Covern, ... Die CDs haben dadurch durchaus unterschiedliche Qualität, aber dafür "muss" man nicht "immer" alle hören, sondern kann sich mit einem Griff auf eine Richtung beschränken. Elektrische Songs wie zum Beispiel vom Folsom Konzert sucht man vergeblich, die Box bezieht sich auf sein Spätwerk.

Ich kenne das Album aus Kopenhagen, Danke an Svend!

Flash and the Pan – Collection

Hinter Flash and the Pan stehen Harry Vanda und George Young. "Young"? Genau, wie in Malcolm und Angus. George ist der ältere Bruder der AC/DC-Gitarristen, und auch deren (zeitweiser) Produzent.

Ich kenne das Album noch aus Schulzeiten, Danke an Bastian!

Fiona Apple – Tidal

Das erste Album von ihr – und das erste einer Trilogie fantastischer Alben: Tidal, When the Pawn..., Extraordinary Machine. Alle absolut empfehlenswert. Umso entäuschender dann The Idler Wheel von 2012 🙁 When the Pawn... war bei Release übrigens das Album mit dem längsten Titel, der normalerweise aber so abgekürzt wird.

Ich kenne das Album ebenfalls aus Kopenhagen, Danke an Matthes!

John Lee Hooker – Don't Look Back

Leider nicht auf Spotify, und auch auf Youtube nur vereinzelt zu finden, deshalb exemplarisch Rainy Days:

Direktlink

Mein erstes Hooker-Album war Boom Boom aus der örtlichen Bücherei. Darauf klang der entspannte Orgel-Sound bereits an, der von Don't Look Back perfektioniert wurde. Beides tolle Alben, was soll ich sagen?

System of a Down – Mezmerize

"In a nutshell" ist schwer und begrenzt aussagekräftig, weil die Songs ineinander übergehen:

Die erste Hälfte eines Doppelalbums; die zweite Hälfte ist Hypnotize. Aber Mezmerize ist besser, fast jeder Song ein Hit. Muss man allerdings laut hören, und sich drauf konzentrieren – in dieser Kombination selten möglich. Insgesamt ist SOAD vermutlich das härteste, was ich so höre. Aber die Songs sind schön komplex: Zwei sehr unterschiedliche Sänger, plus unterschiedlichste Musikstile in jedem Song. Witzigerweise von Rick Rubin produziert, wie auch Johnny Cashs Unearthed – außerdem ebenfalls ein Tipp von Matthes. Und so schließt sich der Kreis für heute.

In eigener Sache

Hallo und guten Tag.

Drei kurze Durchsagen in eigener Sache:

  1. Ich habe die Permalink-Struktur geändert. Das hatte ich seit langem vor, ursprünglich weil mich dieser SEO-"Zwang" nervt. Ich dachte an "short URLs" à la fefe, leider scheint es kein Plugin zu geben, das SEO-URLs auf zB Post-ID umbiegt (oder?), deshalb jetzt der (sehr) abgespeckte Workaround: Ich habe Tag/Monat/Jahr aus den URLs entfernt und lasse nur den Post-Namen. Dafür brauche ich dann aber auch kein Plugin, es genügt .htaccess. Geholfen hat mir dabei der Permalink-Helper von hier, der genau diesen Fall abdeckt.
  2. Ebenfalls seit langem habe ich vor, "einige" Alben vorzustellen. Initial als "10 Alben für die einsame Insel" geplant, wurden es erst 25, dann 50 Alben 😀 Die 50 habe ich dann doch noch nicht ganz zusammen; außerdem ist es ein Haufen Arbeit, zu jedem Album ein paar einleitende Worte zu sagen, sowie ein paar Anspiel-Tipps herauszusuchen. Deshalb mache ich jetzt eine neue Reihe mit dem Titel "5 Alben für die Insel" daraus – ohne besondere Reihenfolge und "open end". Hier der erste!
  3. In letzter Zeit ist die Aktivität hier im Blog (gefühlt? spürbar?) eingeschlafen. Das liegt an drei Faktoren:
    • Ich arbeite beruflich an ein und demselben Projekt, was auf Dauer weniger neue Erkenntnisse bringt, als bsplw. die abwechslungsreiche Arbeit bei JvM.
    • Ich habe jetzt ein Haus, das eine Menge Arbeit mit sich bringt. Dazu hatte ich mal eine eigene Kategorie "Heimwerkerking" angedacht, aber zu komplexen Posts komme ich zur Zeit nicht.
    • es liegen einige Artikel auf Halde (siehe oben), bzw. passen Ideen nicht in die bestehenden Kategorien

    Faktor #2 und #3 haben mich dazu bewogen, eine weitere neue Kategorie einzuführen: "NOTE". Angedacht ist eine Art "Twitter extended", also kurze Gedankenspiele, nicht notwendigerweise mit Kontext oder rotem Faden, aber mit mehr als 140 Zeichen. Inhaltlicher Freestyle.
    NOTE wird unter Apropos einsortiert.

PS: Ich werde zum 1.11. "schon wieder" den Arbeitgeber wechseln, insofern bald vielleicht doch wieder ein paar Coding-Posts mehr 😉

hf

Hibernate Envers Timestamp

Ein Envers Timestamp sieht in der Datenbank bsplw so aus: 1441090155727 (und ist ein Bigint). Das wäre der 30.04.47636, 06:02:07, und ich bezweifel, dass der Datenbankeintrag aus der Zukunft kommt. Die Lösung ist so naheliegend wie einfach: Die letzten drei Stellen stehen für die Millisekunden, der "korrekte" Timestamp lautet 1441090155, und das ist der 01.09.2015, 08:49:15.

Hibernate Interceptor mit Play 1.2.x

Update: Man beachte das PS!

Neulich wollte ich (möglichst generisch) wissen, welches Feld von einer Entity modifiziert wurde. Internet sagt, das ginge mit einem Interceptor:

Leider ist für Play nicht offensichtlich, wie man einen solchen einbindet... zumindest nicht für 1.2.x. Es gibt hibernate.ejb.interceptor, das ist es aber nicht. Tatsächlich gibt es "parallel" ("This property can not be combined with hibernate.ejb.interceptor") noch hibernate.ejb.interceptor.session_scoped – und der geht:

Good to know: Man kann die Entity als solche hier nicht mehr ändern! Man kann aber das zu ändernde Property in currentState suchen und setzen (oder ergänzen) 🙂 Dann sollte man true zurückgeben, statt super.onFlushDirty(...). Quelle.

<Update>Interceptors haben noch einige andere nette Methoden, so kann man beispielsweise zentral checken, welche Entitäten geändert, inserted oder deleted worden sind.</Update>

PS: Internet sagt außerdem, dass Play schon einen eigenen Interceptor nutzen würde... klang für mich ein wenig so, als würde es Probleme geben, wenn man den "überschreibt" – ich konnte aber keine feststellen und das ist leider auch der Fall: im play.db.jpa.JPAPlugin wird ein eigener Interceptor verwendet, der dafür sorgt, dass Entitäten nicht automatisch gespeichert werden (Hibernate Standard?). Das bloße Verwenden eines eigenen Interceptors hebelt dies aus!

PPS: tgorres hat einen Workaround gefunden, siehe Kommentare. Vielen Dank dafür!

Play Dependencies für JBoss ActiveMQ mit Zookeeper

Es gibt bereits ein gutes Tutorial, wie man eine MQ via Zookeeper anspricht, hier aber noch mal explizit für Play (1 und 2).

Schritt 1: Libraries hinzufügen

Play 1

Die Excludes waren für mein Setup nötig, das müssen sie aber nicht generell sein:

Damit das funktioniert, müssen die folgenden Repositories in den Ivy-Setting definiert werden:

Eine Anmerkung dazu: Das "Early Access" Repo ist meiner Einschätzung nach eigentlich nicht nötig; alle letztlich verwendeten Dependencies kommen aus dem "Releases" Repo. Aber: Offenbar gibt es irgendwelche transitiven Dependencies, die dort zu finden sind. Sie werden "später" durch andere transitive Dependecies "überschrieben", aber sie müssen trotzdem aufgelöst werden können! Andernfalls funktioniert zwar auch alles, aber es gibt unschöne Warnings. Und ich habe einige Zeit darauf verwendet, das "Early Access" Repo durch force und exclude wegzukonfigurieren – ein Fass ohne Boden 🙂

Play 2

Schritt 2: Konfiguration

Schritt 3: Im Code

HTH!

MS SQL: Aktuellen Autoincrement für bestimmte Tabelle

Man liest oft

Das funcktioniert aber nur bsplw. nach einem SELECT. Genereller funktioniert dagegen

von

Java: Object Type Mappings in Elasticsearch

Verschachtelte Strukturen in Elasticsearch zu mappen, ist strukturell gesehen eigentlich gut dokumentiert, siehe Object Type (Achtung: Nicht zu verwechseln mit Nested Type!). In Java kann dabei trotzdem einiges schiefgehen – zumindest in v0.90.x, über die aktuellen Versionen kann ich nichts sagen.

Zuerst ein Klassiker, wenn man sich die zahlreichen Tipps dazu im Internet ansieht:

Merge failed with failures {[mapper [field.innerField] has different index values, mapper [field.innerField] has different tokenize values, mapper [field.innerField] has different index_analyzer]}

Das liegt gerne mal daran, dass der Index vor dem Mapping aufgebaut wurde. Was aber nicht bedeutet, dass man das selber explizit so macht! Es kann ganz simpel daran liegen, dass die früher erzeugten (und jetzt veralteten) Dateien auf der Platte nicht mehr passen. Alle Dateien löschen und neu erzeugen lassen, dann kann der Fehler schon verschwunden sein m(

Dann, auch sehr verwirrend: Der XContentBuilder hat eine string()-Funktion (nicht zu verwechseln mit toString()). Die hilft beim Debuggen insofern, als dass man das erzeugte Mapping/JSON ausgeben kann. Allerdings "tut" string() intern irgendwas, keine Ahnung, den Stream schließen oder so. Mit einem string() im Code bekommt man eine NullPointerException in UTF8JsonGenerator.writeRaw(UTF8JsonGenerator.java:670). Tollerweise (trollerweise?) liegt die Klasse zwar unter org.elasticsearch.common.jackson.core.json.UTF8JsonGenerator, die Sourcen sind aber nicht Teil der ES-Sourcen... und der UTF8JsonGenerator hat sehr viele writeRaw()-Methoden.

Bis man darauf kommt, dass es ausschließlich an string() liegt, kann schon mal einige Zeit vergehen: Mit einem string() im Code kann man zwar das erzeugte JSON ausgeben, dieses ist aber völlig irrelevant. Es kann sogar ungültig sein, etwa durch ein überzähliges endObject() – durch string() sieht man statt des eigentlichen

 JsonGenerationException: Current context not an object but ROOT

nur den NullPointer von oben.

Trotzdem ist string() nötig, denn drölf verschachtelte endObject() und field() werden schnell unübersichtlich. Meine Empfehlung: Das JSON unter Einsatz von string() gemäß der Doku aufbauen, string() dann auskommentieren, und erst dann die auftretenden Fehlermeldungen lesen.