Samstag, 28. Juli 2018

Die Errichtung des Moskauer Patriarchats

Höhlenkloster Kyiv, Quelle: Wikipedia, Lizenz: Creative Commons
Aktuell wird ja eine mögliche Autokephalie der ukrainischen Orthodoxen Kirche diskutiert und auch von manchen als realistisch betrachtet, nachdem der Ökumenische Patriarch Bartholomäus von Konstantinopel erklärt hatte, dieses Ansinnen wohlwollend zu betrachten.

Die orthodoxe Kirche des Kyiver Patriarchats war im Jahr 1686 aus der Zuständigkeit Konstantinopels gelöst und dem Moskauer Patriarchat - also der russischen Staatskirche - untergeordnet worden [1]. Mit der Unabhängigkeit der Ukraine entstanden in der Ukraine zwei von Moskau unabhängige orthodoxe Kirchen [2], [3], die beide als nicht kanonisch anerkannt sind - weswegen man sich eben um die Erteilung des Status der Autokephalie bemüht.

Aus der Richtung russischer Kirchen- und Regierungskreise wird gegen diese Bemühungen aus allen Rohren geschossen - das Moskauer Patriarchat sei die einzig legitime Kirche für die Ukraine, und das müsse und könne auch nur so bleiben.

Bei all den kirchenrechtlichen Verwicklungen, über die gern die Experten entscheiden sollen (oder auch nicht), ist es dennoch interessant, wie eigentlich damals die Kirche des damals eher provinziellen Moskau zu ihrem Patriarchen kam.

Hier sind einige Quellen, die das ein wenig beleuchten.

Aus: Makarii (Bulgakov), Geschichte der Russischen Kirche. Verlag des Klosters Walaam, 1994-1996

[Том 5. Отдел 1, russischer Originaltext weiter unten, vollständige Fassung hier]

Bis Ende Juni 1588 erhielt Zar Fjodor Iwanowitsch plötzlich aus Smolensk eine Nachricht des Gouverneurs, dass dort am 24. Juni der Patriarch Jeremias II von Konstantinopel angekommen sei sowie ein Schreiben des Patriarchen, in dem er um Erlaubnis ersuchte, nach Moskau zu kommen, wo bisher noch nichts der Änderung der Patriarchen in Konstantinopel bekannt war.

Mit Jeremia taten sie das gleiche wie gewöhnlich mit ausländischen Botschaftern, denen sie nicht vertrauten; im Haus des Botschafters wurden Beamte zu einem Spalier bestellt, die niemandem erlaubten, mit ihm oder seinen Dienern zu kommunizieren, alle seine Handlungen und Worte beobachteten, versuchten seine Gedanken zu erraten und den Bojaren alles zu berichten, und erst, als die Regierung von den Vorteilen der Vorschläge überzeugt war, durch den Botschafter mit ihm vertrauensvolle Verhandlungen zu beginnen.

Jeremiah segnete den König, drückte ihm seine besten Wünsche aus und brachte Geschenke: eine goldene Panagia, die ein Stück des Lebensspendenden Kreuzes, Blut Christi, ein Stück von den Kleidern Christi Kleider etc. enthielt, eine silberne Ikonenschatulle mit einem Handknochen des Kaisers Konstantin und die linke Hand bis zum Ellenbogen des Heiligen Jakob von Sebastien usw. und für Zarin Irina - eine goldene Panagia mit einem Edelstein, auf dem die Heilige Marina abgebildet war, den kleinen Finger der Hand des heiligen Johannes Chrysostomus und der anderen Reliquien enthielt. Gnädig die heiligen Gaben akzeptierend saß der König auf dem Thron, wies den Patriarch an, auf der Bank zu seiner rechten Seite neben ihm zu sitzen und zeigte ihm durch den Kassier Trahaniotov seinem königlichen Lohn: ein silberner Kelch zwei [???] Samt auf [???] Satin und Damast, zweimal vierzig Zobel, einer von 60 Rubel, der andere 30 und 300 Rubel in Geld. Königliche Geschenke wurden auch dem Metropoliten Hierotheos gewährt.

Hierotheos von Monemvasia, der mit ihm nach Griechenland zurückkehrte, sprach zwar kurz, aber mit völliger Offenheit darüber, was geschah. Zunächst bestätigt wird die Nachricht, dass Jeremias mit seinem Gefolge auf bei Hof in Moskau gleichsam gefangen war, dass man „keiner der Einheimischen zu ihm gehen oder ihn sehen ließ, noch dass er das Anwesen verlassen kann, und selbst wenn die Mönche des Patriarch auf den Markt gingen, wurden sie von den Männern des Königs begleitet und bewacht, bis sie nach Hause zurückkehren” und dass die Beamten, die beim Patriarchen waren, “unfreundliche und unehrliche Menschen waren, die alles, was sie hörten, an die Dragomanen weitergaben, die es dem Zaren selbst meldeten."

„Sie sagten dem Patriarchen Jeremia, - sagt Hierotheos - er möge ihnen einen Patriarchen einsetzen.“ Und Jeremia sagte zunächst: Das kann nicht sein, wir werden Ihnen vielleicht einen Erzbischof einsetzen, den in Ahrida“, d.h. authokephal. Dies war die erste Entscheidung des Jeremias. Den Russen gefällt das verständlicherweise nicht, und es gefiel auch nicht einem Freund von Jeremiah, Hierotheos von Monemvasia, der ihm, als er mit dem Patriarchen allein war, sagte: „O mein Herr, das ist unmöglich; Konstantin der Große gründete das Patriarchat mit dem Ökumenischen Rat und der Große Justinian gründete mit dem fünften Ökumenischen Konzil die Erzdioziöse Ahrid... Wir sind hier nur drei (Bischöfe), und außerdem: Meister, wir kamen (eigentlich) für die Liebe zu dem König und für Schulden, die in unseren Tagen gemacht worden sind".

[...] Ein Treffen der Patriarchen oder zumindest eine Entscheidung, über die Errichtung eines Patriarchats in Russland zu sprechen, hat es absolut nicht gegeben, wie der Freund von Jeremiah Hierotheos Monemvasiysky behauptet. Und wenn es ein solches Gespräch gegeben hätte, so hätte Jeremia keinen Grund gehabt, das vor ihm zu verbergen und weiter die Gefangenschaft bei Hof zu ertragen. Im Gegenteil, er sagte im Hof ​​deutlich, dass die Errichtung eines russischen Patriarchen unmöglich sei, und er weigerte sich sogar, ihnen einen autokephalen Erzbischof zu geben. Zudem konnte Jeremia nicht sagen, ob er den Patriarchen von Jerusalem Nifont konsultiert hatte, er konnte nicht wissen, dass der damalige Patriarch von Jerusalem Sophronius war (von 1608 bis 1579).

Am Ende der Mahlzeit wurden die reichen Geschenke enthüllt, vom Zaren zuerst, dann von der Zarin - den beiden Patriarchen, dem griechischen Metropoliten und dem Erzbischof und alle anderen Personen, die im Gefolge von Jeremiah waren.

Das letzte Mal vor der Abfahrt Jeremias empfing der Souverän ihn noch feierlicher als beim ersten; wieder beschenkte er ihn und seine Familie und alle mit ihm sehr großzügig und, nebenbei bemerkt, überreichte ihm persönlich eine kostbare Mitra mit Perlen und Edelsteinen und einem Kruzifix an der Spitze und einer Perlen-Inschrift: „Vom König dem Patriarchen“ Und als Jeremia nach Litauen aufbrach und mit allen Ehren des ganzen Weg durch Russland begleitet, die russische Grenze überquerte, erreichte ihn in Orscha der Bote des Zaren und gab ihm den Namen des Zaren tausend Rubel für die Errichtung des Patriarchats in Konstantinopel und mit den Briefen des Zaren und Godunov an Jeremiah selbst auch ein Schreiben an den türkischen Sultan Murat, wo Fjodor Iwanowitsch Murat darum bat, dass er seine Paschas anwiese „Patriarch Jeremias zu beschützen.“


Aus: Russland und die orthodoxe Universalkirche in der Patriarchatsperiode 1589-1721

[Wolfram von Scheliha, Seite 41ff, online hier]

Die Verhandlungen um die Einrichtung des Moskauer Patriarchats standen unter einem anderen Vorzeichen. Als Patriarch Joakeim auf seine fehlende Befugnis hingewiesen hatte, ging Boris Godunov bereitwillig auf den Vorschlag ein, erst einen Synodalbeschluss herbeizuführen, bevor die Patriarchenweihe vollzogen würde. Erst als dieser Weg keinen Erfolg brachte, wurde der überraschende Besuch von Jeremias dazu benutzt, Tatsachen zu schaffen. Bedeutsam ist dabei die Frage, warum Jeremias überhaupt nach Moskau gereist ist. Die Quellen geben als Grund Almosensammeln an. Diese Angabe ist sicherlich zutreffend, erklärt jedoch nicht, warum Jeremias persönlich nach Moskau kam. Almosenreisen von amtierenden Patriarchen in das Moskauer Reich waren unüblich und fanden, wenn überhaupt, nur aus besonderen Anlässen statt.

[...]

Diese Episode legt die Grenzen und Möglichkeiten der russischen und der griechischen Verhandlungspositionen offen: Moskau erhob zwar grundsätzlich Anspruch auf das ökumenische Patriarchat, wollte es aber nicht um jeden Preis bekommen. In erster Linie ging es darum, im Moskauer Reich ein von der orthodoxen Universalkirche anerkanntes Patriarchat zu installieren. Einen Griechen wie vor 1448 zum Oberhaupt der russischen Kirche zu machen und ihn von Moskau aus Einfluss auf die russische Politik und Kultur ausüben zu lassen, war hingegen für die Moskauer Führung nicht akzeptabel. Godunov hielt deshalb auch Jeremias entgegen, der könne nicht in Moskau residieren, weil er weder die russische Sprache noch die russischen Landessitten kenne. Patriarchat Jeremias versuchte seinerseits, für die universalklirchliche Anerkennung des Moskauer Patriarchats einen möglichst hohen Preis zu erzielen. Dabei ging es nicht nur um einmalige finanzielle Zuwendungen, mit denen er und seine östlichen Amtsbrüder reich bedacht würden, sondern auch um eine grundsätzliche Neuordnung der russisch-griechischen Beziehungen.


Aus: Union der ruthenischen Kirche mit Rom

[1881, Dr. Julian Pelesz, Seite 469f, online hier]

Seit dem Fall Konstantinopels sind oft verschiedene griechische Prälaten und sonstige Würdenträger nach Russland um Almosen gekommen. So war 1586 in Moskau der Patriarch von Antiochien, Joachim, welchem ein reiches Almosen gegeben wurde, und im Jahre 1588 kam zu gleichem Zwecke der Patriarch von Konstantinopel, Jeremias II., im Gefolge von zwei Metropoliten. Der Patriarch wurde seiner hohen Würde entsprechend aufgenommen, und es wurden ihm reiche Geschenke zugesagt, aber unter der Bedingung, dass er den russischen Metropoliten zum Range eines Patriarchen erheben wird. Unter anderen Umständen wäre der griechische Patriarch darauf gewiss nicht eingegangen; jetzt aber, wo Konstantinopel sich in türkischen Händen befunden hat, und wo die Moskauer Metropolie seit 1451 von dem Patriarchen ohnedem ganz unabhängig war, es sich also eigentlich nur um eine Namensänderung handelte, trug Jeremias kein Bedenken, die gewünschte Rangerhöhung gegen eine gute Bezahlung zu bewilligen, ja er belobte sogar diesem Wunsch der Moskauer Herrscher. Man schritt also zur aufstellung der Kandidatenliste, obwohl die Wahl des bisherigen Moskauer Metropoliten Job, der sich in Allem sehr gefügig und dienstfertig erwiesen hat, keinem Zweifel unterlag. Man stellte dem Zar drei Kandidaten vor, nämlich Job, Alexander, Erzbischof von Nowhorod, und Warlaam und Rostow, und Zar Theodor erwählte den Job, welcher dann zum Patriarchen eingeweiht und vom Zar durch Übergabe der Insignien in die Patriarchenwürde (1589) eingesetzt wurde. Dann verfasste man die Erektionsurkunde, in welcher es heißt, dass das alte Rom durch die Häresie der Apollinaristen gefallen sei, das neue Rom aber, oder Konstantinopel sich in den Händen der Ungläubigen befinde, daher trete nun Moskau als das dritte Rom auf. Dann wird dekretiert, dass anstatt des falschen Hirten der abendländischen Kirche nun der erste ökumenische Patriarch der von Konstantinopel, der zweite der von Alexandrien, der dritte der von Moskau, der vierte der von Antiochien und der fünfte der von Jerusalem sei. Dann werden die Ehrenrechte des neuen Moskauer Patriarchen bestimmt, und schließlich wird verordnet, dass zu dem Moskauer Patriarchat vier Metropoliten, sechs Erzbischöfe und acht Bischöfe Russland gehören. Der Konstantinopler Patriarch, Jeremias II, welcher zu dieser Errichtung des Moskauer Patriarchats seinen Namen hergegeben hat, aber dabei sonst nicht mitwirken konnte, unterschrieb das Dekret, und als die ausbedungene Summe Geldes in Konstantinopel richtig eingezahlt wurde, schickte er dem Zar Theodor im Jahre 1591 durch den Metropoliten von Ternowo in Bulgarien auf die schriftliche Bestätigung des Moskauer Patriarchats von Seite der Konstantinopler Patriarchalsynode.



Aus: м. Макарий. История Русской церкви 

[Original des übersetzten Textes oben, vollständige Fassung hier]

К концу июня 1588 г. царь Федор Иванович внезапно получил известие из Смоленска от воевод, что туда приехал 24 июня Цареградский патриарх Иеремия II, и вместе грамоту от самого патриарха, которою он испрашивал позволения прибыть в Москву, где еще вовсе не знали о происшедшей в Царь-граде перемене патриархов.

С Иеремиею поступили так же, как обыкновенно поступали у нас с иноземными послами, которым не доверяли; к дому посла ставились приставы с почетною стражею, которые не дозволяли никому сноситься с ним и с самою его прислугою, следили за его действиями и словами, выведывали его мысли и о всем доносили боярам и только тогда, когда правительство убеждалось в пользе предложений, привезенных послом, к нему становились доверчивее, с ним начинали переговоры.

Иеремия благословил царя, выразил ему свои благожелания и поднес дары: золотую панагию, в которой находились часть Животворящего Древа, часть Крови Христовой, часть ризы Христовой и пр.; серебряный киот с ручною костию святого царя Константина и левою рукою по локоть святого Иакова Севастийского и пр., а царице Ирине - золотую панагию с камнем, на котором было изображение святой Марины, содержавшую в себе малый перст от руки святого Иоанна Златоустого и части других мощей. Приняв благосклонно священные дары, царь сел на трон, указал патриарху сесть на скамье подле себя с правой стороны и явил ему чрез казначея Траханиотова свое царское жалованье: серебряный кубок двойчатый, два портища рытого бархату, по портищу атласу и камки, два сорока соболей, один в 60 рублей, другой в 30, и 300 рублей деньгами. Были пожалованы царские дары и митрополиту Иерофею.

Иерофей Монемвасийский, возвратившийся с ним в Грецию, рассказал о происходившем тогда хотя и весьма кратко, но с полною откровенностию. Он, во-первых, подтверждает известие нашего Статейного списка, что Иеремия с своею свитою на подворье в Москве находился как бы в заключении, что "никому из местных жителей не дозволяли ходить к нему и видеть его, ни ему выходить вон с подворья, и когда даже монахи патриаршие ходили на базар, то их сопровождали царские люди и стерегли их, пока те не возвращались домой", и что приставы, находившиеся при патриархе, были "люди недобрые и нечестные и все, что слышали, передавали драгоманам, а те доносили самому царю".

"Говорили патриарху Иеремии, - повествует Иерофей, - как бы он поставил им патриарха. И Иеремия сначала сказал: "Этому нельзя быть, поставим вам, пожалуй, архиепископа, какой в Ахриде", т. е. автокефального. Таково было первое решение Иеремии. Русским, разумеется, оно не могло понравиться, не понравилось оно и другу Иеремии Иерофею Монемвасийскому, и он, оставшись наедине с патриархом, говорил ему: "Владыко мой, того сделать невозможно; Константин Великий учредил патриаршества со Вселенским Собором, и Великий Юстиниан учредил Ахридскую архиепископию с Пятым Вселенским Собором... нас же здесь только трое (архиереев), да притом, владыко, мы пришли (собственно) за милостыней к царю и ради долгов, которые наделаны в наши дни".

[…] совещания патриархов или по крайней мере решения, приговора их об учреждении патриаршества в России вовсе не было, как прямо утверждает друг Иеремии Иерофей Монемвасийский. А если б был такой приговор, Иеремии не для чего было таить его доселе и столько терпеть в своем заключении на подворье. Напротив, на подворье он ясно заявил, что поставить русским патриарха невозможно, и отказался даже от своего намерения дать им автокефального архиепископа. К тому ж Иеремия не мог сказать, будто он совещался с Иерусалимским патриархом Нифонтом, не мог не знать, что патриархом Иерусалимским был тогда Софроний (с 1579 по 1608 г.).

По окончании трапезы явлены были богатейшие дары, сперва от царя, потом от царицы, обоим патриархам, греческим митрополиту и архиепископу и всем другим лицам, находившимся в свите Иеремии.

В последний раз пред отъездом Иеремии государь принимал его у себя еще с большею торжественностию, чем в первый; вновь одарил его, и его родственников, и всех прибывших с ним весьма щедро и, между прочим, собственноручно передал ему драгоценную митру, осыпанную жемчугом и каменьями, с распятием наверху и с жемчужною надписью вокруг: "От царя патриарху". А когда Иеремия, отправившийся в Литву и провожаемый на всем пути по России со всеми почестями, переехал русскую границу, его настиг в Орше посланец царский и вручил ему от имени царя тысячу рублей на сооружение патриархии в Царьграде и вместе с грамотами от царя и от Годунова к самому Иеремии грамоту к турецкому султану Мурату, в которой Федор Иванович просил Мурата, чтобы он велел своим пашам "держать патриарха Иеремию в бережении по старине во всем".

Mittwoch, 25. Juli 2018

Wenn reboot -f versagt...

Auch Linuxe können mal komplett vermurkst sein (Zombie-Prozesse, die sich nicht beenden lassen etc.). Das kann bis zu dem Punkt gehen, wo ein reboot -f keinen Effekt hat.
Solange man noch eine Shell hat, muss man aber dennoch nicht aufstehen, um einen Neustart zu erzwingen:
echo 1 > /proc/sys/kernel/sysrq
echo b > /proc/sysrq-trigger
So. Auch das ist persistiert :)

Samstag, 9. Juni 2018

Gendern in der Sprache - demokratische Pflicht?

Kürzlich stieß ich über die sozialen Netze auf einen Artikel von Henning Lobin und Damaris Nübling in der Süddeutschen, in dem anlässlich eines am 8. Juni vom Deutschen Rechtsschreibrat diskutierten Vorschlags des Landes Berlin zur Einführung des Gendersternchens in die deutsche Rechtschreibnorm[1] die Autoren leidenschaftlich für "geschlechtergerechte Schreibung" eintraten.


Hier heißt es u.a., dass wer die Gleichstellung der Geschlechter wolle, sie auch beide [explizit] ansprechen müsse. Neben dem in diesem Kontext leider schon obligatorischen Verweis auf Vorstöße der AfD gegen das sprachliche Gendern wird anhand einiger Beispiele zu beweisen versucht, dass die Trennung von grammatischen vom biologischen Geschlecht, die dem generischen Maskulinum zugrunde liege, falsch sei und die Sprache auch in diesem speziellen Kontext die Wahrnehmung des Menschen "lenke".

Die Gegenposition hierzu finden wir in einer ebenfalls vor recht kurzer Zeit erschienenen Kolumne von Peter Eisenberg in MERTON, in dem diesen Thesen widersprochen wird: die Verwendung des generischen Maskulinum befreie vom Bezug auf das natürliche Geschlecht und sei allgemeiner; hingegen führe ein hinzugefügtes Suffix "in" immer zu einer Spezialisierung von einer geschlechtsneutralen zu einer geschlechtsspezifischen Form. Sprachen seien so gebaut, dass sie zwar grammatische Formen forderten, aber nie bestimmte Bedeutungsmerkmale erzwängen.

Ich will die Aussagen aus beiden Artikeln nicht in Länge ausbreiten, sie sind beide auf ihre Weise lesenswert. Mich überzeugt allerdings mehr die Sicht Peter Eisenbergs.

Die immer wieder vorgebrachte These, die Sprache beeinflusse das Denken, kann man sicher diskutieren. Allerdings wird sie doch überhaupt erst in dem Moment zu dieser Diskussion relevant, wenn man im Kopf das grammatische mit dem biologischen Geschlecht gleichsetzt oder zumindest stark verbindet. Diese These wird von Befürwortern des Genderns meist stillschweigend vorausgesetzt und gar nicht erst zu beweisen versucht, so dass dann der zweite, darauf aufbauende Schritt der Argumentation dann quasi zum Selbstgänger wird.

Aber genau dieser erste gedankliche Schritt, auf dem die Argumentation ja erst fußt, ist aus meiner Sicht eine Zumutung, denn er impliziert, dass ich, wenn ich die Form des generischen Maskulinums verwende, die Weiblichkeit nicht beachte. Diesen latenten Vorwurf finde ich unakzeptabel.

Die Sprache spiegelt zu einem gewissen Punkt die Art des Denkens und die Mentalität eines Volkes. Menschen, die zweisprachig aufgewachsen sind oder leben (etwa sprechen wir zu hause zur Hälfte deutsch und ukrainisch), kennen das - manche Dinge kann man in einer Sprache sehr einfach, elegant und kurz formulieren, in einer anderen aber gerade nicht. Die Entwicklung, die dahinter steht, hat sich über einen langen Zeitraum vollzogen. Und ständig kommen neue Formen und Begrifflichkeiten hinzu - ganz einfach, weil Menschen sie verwenden.

Das ist ein lebendiger Prozess. Und wenn - wie in den 1980er Jahren - verstärkt Menschen begannen, die Verwendung des generischen Maskulinums zu vermeiden und Bezeichnungen Endungen zu geben, kann man das als genau so einen Prozess betrachten, der sicher Spuren in der Sprache hinterlässt.

Problematisch wird es aus meiner Sicht aber dann, wenn hieraus ein ideologischer Anspruch erwächst - verwendest Du nicht die weibliche Endung bei "Nichtwählern", dann schließt Du die "Nichtwählerinnen" aus. Hier geht es nicht mehr um lebendige Sprache, sondern um Deutungshoheit. Wie oben schon ausgeführt, ist aber keineswegs gesagt, dass die Mehrzahl der Sprecher das grammatische mit dem biologischen Geschlecht gleichsetzen.

Ich halte es, wenn es um die politisch / ideologisch angetriebene gezielte Änderung bis hin zur Anordnung von Sprachnormen geht, mit Orwells Konzept des "Neusprech", und wer ein Design von Sprache "von oben" legitimiert, egal wie edel in diesem Fall die Motive sein mögen, öffnet letztlich auch die Türen für das selbe aus unedlen Motiven.

Mein Vorschlag zur Güte: lasst uns sprechen, wie uns der Schnabel gewachsen ist. Schauen wir in 100 Jahren, was sich durchgesetzt hat. Aber, bitte, lassen wir die Keule der künstlichen Fixierungen in Sprachnormen doch bitte im Sack.

[1] Wie im Tagesspiegel berichtet wurde, konnte sich der Deutsche Rechtsschreibrat nicht auf die von Berlin vorgeschlagene Fixierung des Gendersternchens im Sprachregelwerk einigen. Das ist in meinen Augen erst einmal eine gute Nachricht, auch wenn mir bewusst ist, dass es weiter Vorstöße in diese Richtung geben wird.

Freitag, 18. Mai 2018

Centralised Logging with EFK and hot/warm in Kubernetes

Everybody is talking about centralised logging these days, and most seem to agree that EFK (Elasticsearch, Fluentd, Kibana) is a good combination for accomplishing this. The Kubernetes repo on github contains something to start and play with, but it is far from production-ready:
  1. The Kibana version used there is rather old
  2. Elasticsearch is not production-ready (single node instance, no decoupling of resource-hungry indexing and long-term, read-only storage)
While (1) can be overcome rather easily, (2) poses a bit more of a challenge - how can we create a production-ready Elasticsearch service using Kubernetes? The Elasticsearch folks propose the so-called "hot/warm" architecture for addressing this:
  • "hot" nodes running on fast and expensive hardware (fast CPUs, lots of memory, SSDs) do all the indexing of anything coming in. 
  • All data older than a configurable period of time is moved to so-called "warm" nodes running on potentially slower and less expensive hardware with large disks (usually HDDs). No indexing takes place here, data is kept read-only for queries only.
To my knowledge there is no ready-to-run "hot/warm" Elasticsearch setup for Kubernetes. Hence I had to roll my own. 

A good starting point for this was the more or less ready-to-run setup of Elasticsearch and Kibana by Paulo Pires (without Fluentd, but with a nice-to-have recent version of Kibana). 

Here's what I did to turn this into a centralised logging setup with Fluentd, a "hot/warm" Elasticsearch cluster and a recent version of Kibana.

1. Fluentd setup from the EFK setup "to start and play with" above.

This is straightforward.

2. Elasticsearch and Kibana from the Paulo Pires' repository.

Both namespaces and service names need to fit, otherwise Fluentd will not be able to talk to Elasticsearch. Since I want centralised logging I stick to what I found in the Fluentd setup (namespace kube-system and the term "logging" in the service names). Hence I need to adapt service names and namespaces, so that it works with the Fluentd setup.

I use the yamls from the stateful subdirectory for the Elasticsearch data nodes and set up persistent volumes as needed.

This gave me an up-to-date version of Kibana plus a client/master/data node setup for Elasticsearch - quite good for a start.

3. Tests of this setup, make necessary adaptions until it works.

Let's be realistic, this always takes a while. To keep things simple, I got everything running without "hot/warm" changes before proceeding.

4. ES setup for the "hot/warm" architecture

From the single Elasticsearch data node StatefulSet in the stateful directory, I use a template for creating two separate StatefulSet in the end: one for hot, one for warm

I found that the Elasticsearch image use by Paulo did not support passing of command line args to the elasticsearch command, so I had to extend it and create a PR. The result is quay.io/pires/docker-elasticsearch-kubernetes:6.2.3, i.e. the minimum version 6.2.3 with which my setup works. Subsequent versions will contain the necessary change, too. 

In a nutshell, this is what I had to change for my StatefulSet template:
  1. Templatize the name:
    metadata:
      name: elasticsearch-logging-data-@ES_NODE_TYPE@
  2. Change the version of the Elasticsearch image to 6.2.3:
          containers:
          - name: elasticsearch-logging-data
            image: quay.io/pires/docker-elasticsearch-kubernetes:6.2.3
  3. Add the following environment variable to the list of environment variables (ES_EXTRA_ARGS adds command line arguments):
            - name: ES_EXTRA_ARGS
              value: -Enode.attr.box_type=@ES_NODE_TYPE@
  4. Set up node labels for "hot" and "warm", and assign the ES data nodes to the respective node types:
          nodeSelector:
            node/role: elasticsearch-@ES_NODE_TYPE@
  5. Make sure that there is never more than one data pod running on a single host:
          affinity:
            podAntiAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
              - weight: 100
                podAffinityTerm:
                  labelSelector:
                    matchExpressions:
                    - key: role
                      operator: In
                      values:
                      - data
                  topologyKey: kubernetes.io/hostname
  6. You will most likely want to assign different CPU and memory resources to your hot and warm nodes respectively:
            resources:
              limits:
                cpu: @ES_CPU_LIMIT@
                memory: @ES_MEM_LIMIT@
              requests:
                cpu: @ES_CPU_REQUEST@
                memory: @ES_MEM_REQUEST@

It goes without saying that expressions like @...@ are placeholders that need to be expanded and that @ES_NODE_TYPE@ will stand for either "hot" or "warm". In the end, a simple call to sed can be used to generate the two StatefulSet yamls.

5. Configure Fluentd to deliver data to "hot" ES nodes only

This can be accomplished by setting up a so-called "template file" for the Elasticsearch plugin in the Fluentd configuration. For this, the Fluentd configmap yaml file needs to be extended. First, I add the template code (indentation is important, because we're in yaml):

  logstash.json: |-
    {
      "index_patterns": "logstash-*",
      "settings":
        {
         "number_of_shards": 3,
         "number_of_replicas": 2,
         "index.routing.allocation.require.box_type": "hot"
        }
    }

In order to "activate" this, the following two lines are added to the "@id elasticsearch" block above:

      template_name logstash
      template_file /etc/fluent/config.d/logstash.json

Now every log line produced by Fluentd goes to the "hot" ES nodes only.

6. Set up curator job for moving old data to "warm" nodes

I use my own yaml for the CronJob and extend the curator configuration I found in Paulo Pires' repository. Like above, namespaces and service names need to be adapted.

The CronJob:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: curator
  namespace: kube-system
  labels:
    app: curator
spec:
  schedule: "0 1 * * *"
  successfulJobsHistoryLimit: 1
  failedJobsHistoryLimit: 3
  concurrencyPolicy: Forbid
  startingDeadlineSeconds: 120
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - image: bobrik/curator:5.4.0
            name: curator
            args: ["--config", "/etc/config/config.yml", "/etc/config/action_file.yml"]
            volumeMounts:
            - name: config
              mountPath: /etc/config
          volumes:
          - name: config
            configMap:
              name: curator-config
          restartPolicy: OnFailure

In the ConfigMap for curator I replaced the contents of action_file.yaml with what I found in this Graylog blog post:

  action_file.yml: |-
    ---
    # Remember, leave a key empty if there is no value.  None will be a string,
    # not a Python "NoneType"
    #
    # Also remember that all examples have 'disable_action' set to True.  If you
    # want to use this action as a template, be sure to set this to False after
    # copying it.
    actions:
      1:
        action: allocation
        description: "Apply shard allocation filtering rules to the specified indices"
        options:
          key: box_type
          value: warm
          allocation_type: require
          wait_for_completion: true
          timeout_override:
          continue_if_exception: false
          disable_action: false
        filters:
        - filtertype: pattern
          kind: prefix
          value: logstash-
        - filtertype: age
          source: name
          direction: older
          timestring: '%Y.%m.%d'
          unit: days
          unit_count: 3
      2:
        action: forcemerge
        description: "Perform a forceMerge on selected indices to 'max_num_segments' per shard"
        options:
          max_num_segments: 1
          delay:
          timeout_override: 21600 
          continue_if_exception: false
          disable_action: false
        filters:
        - filtertype: pattern
          kind: prefix
          value: logstash-
        - filtertype: age
          source: name
          direction: older
          timestring: '%Y.%m.%d'
          unit: days
          unit_count: 3

Now old data is moved from the hot to the warm nodes automatically after 3 days.

7. Finetuning #1: docker logrotate

Since I am running on bare metal using docker underneath, I need to make sure that the log files in /var/lib/docker/containers/* don't grow indefinitely. The docker daemon can take care of this just fine when you add the following lines to its command line arguments, e.g. by setting the OPTIONS variable in /etc/sysconfig/docker (or wherever else the configuration resides on all the different distros):

OPTIONS="--log-driver json-file --log-opt max-size=100m [...]

8. Finetuning #2: get detection of stack traces to run

The docker logging driver does not know Java (or whatever language) statcktraces. Hence they are split into different lines which is not nice for analysis (e.g. in Kibana) later. 

Fluentd is configured to use the detect_exceptions plugin that is supposed to join stacktrace lines and add "\n" as needed in the JSON entries sent to Elasticsearch in the end. However that plugin currently does not work with what the docker JSON log driver produces, because the latter escapes tabulators as "\u0009" which is not handled by the plugin. I filed an issue on that in which I proposed a change of the regular expression for detecting stack traces.

Because that issue has not been fixed so far, I derived my own Fluentd image from the above one in which I copy over my patched version of exception_detector.rb. Here's what I changed in the plugin (I'm dealing with Java stacktraces only, hence this is not a generic solution, and that's why I did not make this a PR to fix that issue):

--- a/lib/fluent/plugin/exception_detector.rb
+++ b/lib/fluent/plugin/exception_detector.rb
@@ -53,9 +53,9 @@ module Fluent
       rule(:start_state,
            /(?:Exception|Error|Throwable|V8 errors stack trace)[:\r\n]/,
            :java),
-      rule(:java, /^[\t ]+(?:eval )?at /, :java),
-      rule(:java, /^[\t ]*(?:Caused by|Suppressed):/, :java),
-      rule(:java, /^[\t ]*... \d+\ more/, :java)
+      rule(:java, /^(\\u0009|[\t ])+(?:eval )?at /, :java),
+      rule(:java, /^(\\u0009|[\t ])*(?:Caused by|Suppressed):/, :java),
+      rule(:java, /^(\\u0009|[\t ])*... \d+\ more/, :java)
     ].freeze
     PYTHON_RULES = [

Closing remarks

I hope this posts helps others in setting up their own centralised EFK logging environment in Kubernetes. I understand that people might be interested to look into the the full set of yamls I am using. Unfortunately they contain a lot of stuff that is rather specific for my environment and which I am not allowed to share. Looking back on that work I may say that doing all this on my own was a good invenstment of time making what I learned far more sustainable for me :)

[edit] I have now made an ansible-based version of most of what is documented  here available as part of my kubernetes installer on github.

Dienstag, 26. September 2017

JMeter-CSV, logische Transaktionen aus mehreren Requests, die Shell und ich.

Lösung:
( grep -v '^timeStamp' results.csv | awk --field-separator=';' '{ print $6";"$1";"$2";"$3 }' \
| sort | while read a; do OP=`echo "$a" | cut -d ';' -f 4`; TS=`echo "$a" | cut -d ';' -f 2`; \
TM=`echo "$a" | cut -d ';' -f 3`; if [ "$OP" = getConfiguration ]; then echo '`'; echo -n \
"$TS \`expr $TM"; else echo -n " + $TM"; fi; done | grep -v '^`' | tr -d '\n' ; echo '`' ) | \
while read b; do eval "echo $b"; done | sort >transaction-timings.dat

Versuch, das lesbar zu machen...
( grep -v '^timeStamp' results.csv \
    | awk --field-separator=';' '{ print $6";"$1";"$2";"$3 }' \
    | sort \
    | while read a; do \
        OP=`echo "$a" | cut -d ';' -f 4`; \
        TS=`echo "$a" | cut -d ';' -f 2`; \
        TM=`echo "$a" | cut -d ';' -f 3`; \
        if [ "$OP" = getConfiguration ]; then \
            echo '`'; \
            echo -n "$TS \`expr $TM"; \
        else \
            echo -n " + $TM"; \
        fi; \
    done \
        | grep -v '^`' \
        | tr -d '\n'; \
        echo '`' ) \
        | while read b; do \
            eval "echo $b"; \
          done \
              | sort >transaction-timings.dat

Freitag, 3. März 2017

Shell-Funktion des Tages: gitp

Musste gerade sein:
gitp() {
        test -n "$1" || { git; return 1; }
        ARG1=$1
        shift
        git p$ARG1 "$@"
}

Freitag, 17. Februar 2017

Noch etwas Nostalgisches: Intel 5100 "shiloh" WLAN-Karte mit OS/2

Für meine OS/2-Installation hatte ich seinerzeit ein Thinkpad t500 auf ebay erstanden. Die Installation war grundsätzlich problemlos, allerdings gelang es mir zunächst nicht, das gute Stück an den WLAN zu bekommen, weil es keinen "stabilen" Treiber für die verbaute Intel 5100 "shiloh" gibt.
Nachdem ich einen Artikel des Blonde Guy gefunden hatte, der beschrieb, wie man genau dieses Modell doch zum Laufen bringt, also machte ich mich noch einmal an die Arbeit.

Am Ende hat es - zumindest einigermaßen -  funktioniert. Wirklich stabil ist es leider nicht, hin und wieder ist mir das System mit einem TRAP C um die Ohren geflogen. Dank JFS ist das zum Glück heute kein großes Drama mehr (allerdings sollte man nicht die Gefahr einer durch beim Absturz offene INI-Dateien unterschätzen, die einem die WPS komplett unbrauchbar machen kann [1]). Das habe ich nun gemacht:

Die Treiber, die später verwendet werden, sind GenMAC und GenMU. Um sicher zu gehen, habe ich die erst einmal komplett deinstalliert und auch alle Netzwerkkarten außer der Kabel-Verbindung aus der Konfiguration gelösch. Außerdem - wie im o.g. Artikel vorgeschlagen - wird das XWLAN-Applet entfernt.

Dann habe ich das Basispaket für GenMAC heruntergeladen und installiert:

Danach folgt die Installation von GenMU, wobei ich nur für "meine" Karte den Treiber installiert habe:

Außerdem habe ich dhclient per yum installiert und nach dem Reboot im BIOS kontrolliert, dass unter Power der Batteriebetrieb auf Maximum Performance gestellt und Intel SpeedStep aktiviert ist.

Nach Abschalten und wieder Einschalten des Rechners (notwendig!) habe ich dann das XWLAN-Applet neu installiert, indem ich aus dem Installationsverzeichnis instwgt aufgerufen habe. Ich verwende die neueste XWLAN-Version. Nach der Installation habe ich eCenter neu gestartet und das Widget hinzugefügt. Dabei ist wichtig, dass die WLAN-Karte im XWLAN-Applet beim Systemstart immer deaktiviert ist, das stelle ich an dieser Stelle schon einmal ein.
Jetzt muss die Karte in der MPTS-Konfiguration eingetragen werden:


Der Laptop hat zwei Netzadapter, einen mit Kabel und einen ohne. Nachdem ich beiden das TCP/IP-Protokoll hinzugefügt habe, setze ich die Nummer auf "0" für die Kabelverbindung und "1" für die drahtlose, so dass immer zunächst versucht wird, über Kabel eine Verbindung herzustellen.

 Standardmäßig ist die Kabelverbindung auf DHCP vorkonfiguriert. Das führt dazu, dass, wenn beim Booten keine Netzwerkverbindung existiert, der Startvorgang lange blockiert ist, weil er versucht, über DHCP eine Verbindung herzustellen.

Weil ich meine Kabelverbindung immer im selben Netz zu hause verwende, habe ich die nun im TCP/IP-Applet auf "manuell" umgestellt und Adresse, Gateway und DNS-Server fest eingetragen:


Sollte ich mal von woanders eine Draht-Verbindung brauchen, kann ich die notwendigen Einstellungen auch immer noch von der Kommandozeile ohne Neustart vornehmen, die Kommandos sind ganz ähnlich wie unter Unix. 


Nach einem weiteren Neustart kann ich nun meine WLAN-Karte in Betrieb nehmen. Ich stelle dabei zunächst die wpa_supplicant-Konsole auf "sichtbar", so dass ich sehen kann, was passiert. Nachdem ich ein gültiges Profil angelegt habe, (WPA funktioniert bei mir, WPA2 nicht), aktiviere ich nun die Karte im Applet. Wenn es funktioniert hat, höre ich ein "Piep", und ein Dialog öffnet sich, und fragt mich, ob ich die primäre Netzverbindung (die kabelgebundene) deaktivieren möchte, um die drahtlose zu aktivieren. Wenn das passiert, hat es funktioniert, ich klicke auf "Ja" und bin fertig.

Wenn nun auf der Konsole der Versuch, die Verbindung aufzunehmen, in eine Schleife läuft, weiß ich, dass es nicht funktioniert und schalte die Karte über das Applet wieder ab. Das wiederhole ich 2..3 Mal, falls es nicht vorher schon funktioniert hat.

Wenn es dann immer noch nicht funktioniert hat, deaktiviere ich im Applet und schalte danach mit dem Schiebeschalter die WLAN-Karte physikalisch ab. Nach ein paar Sekunden schalte ich sie per Schiebeschalter wieder ein, warte wieder ein paar Sekunden und aktiviere sie wieder übers Applet. Das habe ich bei mir bisher nie mehr als zweimal wiederholen müssen, bis es am Ende geklappt hat.

Einmal ist mir direkt beim Herstellen der Netzwerkverbindung das System mit TRAP C um die Ohren geflogen, einmal im laufenden Betrieb danach. Ob das Ganze am Ende stabil genug ist, wird sich über die Zeit herausstellen.



[1] Erste Hilfe beim Komplettverlust der WPS besteht im Erzeugen einer neuen. Aus dem "Technical Document # - 3071019" von IBM zu diesem Thema, Abschnitt "Method 1--Rebuilding the Desktop":

4. Change to the OS/2 directory; then type the following commands, pressing Enter after each:
  CD\OS2
  MAKEINI OS2.INI INI.RC
  MAKEINI OS2SYS.INI INISYS.RC

5. Type the following and press Enter after each to delete the hidden file, WP?ROOT.?SF:
  ATTRIB -h -s -r \WP?ROOT.?SF
  DEL \WP?ROOT.?SF

Freitag, 27. Januar 2017

Früher war alles besser: Common Desktop Environment auf Linux

Rechter Monitor mit Panel und einer GTK2-App
Unter Linux bevorzuge ich Leichtes. Umgebungen wie Gnome oder KDE sind mir zu schwergewichtig und auch aus verschiedenen Gründen nicht wirklich sympathisch - die eine zu wenig auf meine Bedürfnisse anpassbar, die andere riecht zu sehr nach Redmond. Folglich bin ich seit vielen Jahren vorwiegend mit WindowMaker unterwegs (das dort verlinkte Theme "NeXT-Retro" ist übrigens immer noch in Benutzung), und in der letzten Zeit habe ich wieder verstärkt Gefallen an Enlightenment gefunden. Beide sind leicht, schnell und vollkommen konfigurierbar.

Eine dritte Option ist in der letzten Zeit aber auch noch dazu gekommen, quasi die Mutter aller Gnome und KDEs: Common Desktop Environment, kurz CDE, dessen Code vor einigen Jahren Open Source wurde und nun hinreichend alltagstauglich unter Linux ist. So kann man den zarten Retro-Charme der 90er Jahre genießen und sich sozusagen auf Augenhöhe mit Windows-Benutzern wähnen :)



Freilich ist für diesen Spaß etwas Handarbeit notwendig. Hier ist, was ich gemacht habe, um mein hier gezeigtes Setup hinzubekommen. Fangen wir an mit Build und Installation:

Rechter Monitor mit ein paar CDE-Apps
  1.  Der CDE-Quellcode muss selber übersetzt werden. Den kann man von der Projektseite bei Sourceforge herunterladen. Bei mir war das Release 2.2.4.
  1. Vor dem Übersetzen empfehle ich allen, die mehr als einen Bildschirm benutzen, noch einen Xinerama-Patch des Fenstermanagers dtwm einzuspielen, damit Fensterpositionierung und Maximieren von Fenstern normal funktioniert. 
  2. Danach funktioniert die Build-Anweisung auf Sourceforge ganz prima. Wer wie ich auf Redhat und 64bit unterwegs ist, sollte zusätzlich noch diesen Wiki-Artikel lesen. 
  3. Bei mir wurden die manpages nicht mit installiert. Das habe ich dann per Hand gemacht: cd cde-<VERSION>/doc/C/; sudo cp -r man/* /usr/dt/man/
  4. Ein bekanntes Problem des Common Desktop Environment auf Linux ist, dass sie manchmal aufgrund von Problemen mit dem rpcbind-Service nicht startet. Bei mir (ein RHEL7-Derivat) hilft es, einmal nach Start des Rechners als root den Dienst per Hand neu zu starten: systemctl restart rpcbind.service - warum das nötig ist, und warum gerade das hilft, ist mir schleierhaft, aber ohne geht es nicht. 



Linker Monitor mit Systray und einer GTK3-App
Das hier sind nun meine Einstellungen und Anpassungen:
  1. Um GTK- und QT-Anwendungen das richtige Aussehen zu geben, benutze ich das GTK3-Theme Solaris Colours, allerdings in einer von mir leicht modifizierten Form, um mit meinem CDE-Farbschema besser zu harmonieren.
  2. Für den System Tray oben links benutze ich stalonetray, und zum Umschalten der Tastaturbelegng xxkb.
  3. Zum Starten der Umgebung benutze ich den gdm und habe dafür eine Datei cde.desktop erzeugt, die in /usr/share/xsessions liegt.
  4. Die verweist wiederum auf ein Startskript cdesession.sh, das in /usr/local/bin liegt. 
  5. Den System Tray und xxkb starte ich über ein Skript $HOME/bin/CDEInit.sh, das ich über $HOME/.dt/sessions/sessionetc aufrufe. Es ist etwas hakelig, dafür zu sorgen, dass das oben links in der richtigen Anordnung erscheinen zu lassen, daher enthält das Skript ein paar Kniffe. 
  6. In der Konfiguration des Fenstermanagers, .dt/dtwmrc, kann man einiges an Tastaturabkürzungen einstellen, wovon ich ausgiebig Gebrauch gemacht habe. Interessanterweise muss man, um das Fenstermenü (Alt-Space) zu konfigurieren, eine entsprechende X-Ressource in $HOME/.Xdefaults setzen, das ist schon etwas merkwürdig, funktioniert aber. 
  7. Ich wollte auf Ctrl-Esc eine Art Fensterliste haben. Mit Bordmitteln ging das nicht, ich habe aber ein nettes Programm gefunden, das ich auf diese Kombination gelegt habe: find_window.
  8. Die Icons, die man im Panel sieht, sind letztlich CDE-"Apps", die man sich im CDE-Appmanager zusammenbasteln muss. Blöderweise braucht man Icons im .bm Format in verschiedenen Größen. Ich habe dazu ein paar wenige Sachen im Netz gefunden und den Rest selber gebastelt.
  9. Die ganzen oben genannten Konfigurationsdateien für xxkb, dtwm, die Icons sowie die Desktop-Datei und Hilfsskripte gibt es hier in einem tar-Archiv zum Herunterladen.
  10. Der Rest ist die übliche Spielerei mit den mitgelieferten Tools. Ärgerlich ist, dass man Änderungen am Farbschema erst nach Logout und wieder Login zu sehen bekommt. Zum Glück geht das auf moderner Hardware ziemlich schnell.
Fazit: CDE hat etwas. Ich mag dieses etwas altmodische Design. Da ich ohnehin meist auf der Kommandozeile oder mit Tastatur-Abkürzungen untewegs bin, funktioniert das auch leidlich gut. Es gibt einiges, was man nicht einstellen kann, z.B. Verschieben von Fenstern auf andere Desktops per Tastaturabkürzung, horizontal und vertikal maximieren etc., und der Fenster-Fokus beim Wechseln zwischen den Desktops ist eher so naja, aber dafür hat man so ziemlich alles von Stirnrunzeln bis Bewunderung bei den Kollegen sicher, die einem über die Schulter schauen :)

Sonntag, 10. April 2016

Und abermals und erneut: DHL lässt uns zum Postamt rennen



Wieder einmal mussten wir einen Beschwerdebrief an DHL schreiben. Vielleicht wird uns eine arme Sau anrufen und sich entschuldigen, ändern wird aber so ein bemitleidenswerter Callcenter-Mitarbeiter nichts an dem, was die dort offenbar nicht in den Griff kriegen.

Dieses Mal ging es um Handzettel für unsere Veranstaltung nächste Woche. Die Vorlagen wurden nicht rechtzeitig fertig, und die Druckerei (empfehlenswert: WirMachenDruck) nannte uns einen Termin, der noch rechtzeitig war, aber eben auch nur knapp.

Ich war diese Woche auf Geschäftsreise, also ging die Sendung an N., die ohnehin auf der Türklingel vor mir genannt ist :)

Als ich gestern wieder hier war, war die Ware immer noch nicht eingetroffen. Wir bekamen dann mit der Post die Karte, aus der hervor ging, dass der Bote drei Tage vorher um die Mittagszeit einen Zustellversuch gemacht haben soll. Wie der ausgesehen hat, kann ich mir schwer vorstellen, da aufgrund der Wichtigkeit der Sendung N. den ganzen Tag zu hause wartete, dass der Bote klingelte. Aber er klingelte nicht.

Wir habe zwei Dinge getan: Die Druckerei wurde von uns informiert, dass es erneut Probleme mit DHL gab und dass wir in Zukunft auf keinen Fall wieder Ware durch DHL geliefert bekommen wollen. DHL hat nun - auch wenn ich mir wenig Illusionen dazu mache, welche Wirkung so ein Schreiben hat, einen weiteren Beschwerdebrief erhalten:
Mein Paket wurde nicht ins Haus zugestellt, obwohl ich zu dem auf der Benachrichtigungskarte genannten Zeitpunkt (wie auch überhaupt den ganzen Tag über) zu hause war, um auf diese für uns wichtige Sendung zu warten. Stattdessen hatte ich 3 (!) Tage später die Benachrichtigungskarte im Briefkasten und musste die Sendung von der Postfiliale abholen.

Dies ist nicht das erste Mal. Mein Mann und ich haben uns schon mehrere Male hierüber beschwert. Es hat sich nicht gebessert, wie man nun wieder einmal sieht.

Wir empfinden dieses Verhalten als eine Unverschämtheit und vollkommen unakzeptabel. Wir bezahlen für den Transport der Ware ins Haus, nicht ins Postamt (welches weit entfernt ist). Wenn Sie diese Dienstleistung, die wir in Anspruch nehmen, nicht leisten können, dann sind Sie im falschen Geschäft.

Sie haben ein Qualitätsproblem. Tun Sie etwas dagegen. Die Anzahl der Beschwerden über die Praxis, Ware einfach nicht abzuliefern und stattdessen zum Postamt zurückzunehmen, steigt, man kann das im Netz überall finden.

Auch die großen Versender erhalten diese Art von Rückmeldung. Es ist nur eine Frage der Zeit, dass sie sich einen anderen Paketdienst suchen.

Ich finde überhaupt keine Worte dafür, wie sauer ich bin. Durch diesen Quatsch haben wir Handzettel für eine Veranstaltung, die nächste Woche stattfindet, 3 (!!!) Tage zu spät erhalten. Ihre Schlampigkeit ist eine Zumutung.
Harren wir der Dinge. Leider arbeiten einige große Versender, wie z.B. Amazon (noch!) exklusiv mit DHL. Ich werde in Zukunft diversifizieren und nach Versendern suchen, die eine Sendung über einen anderen Paketdienst anbieten. 

Dienstag, 24. November 2015

My best shell script bug so far :)

Consider this Bourne shell script code:
if "$NEW_STATE" = "false"; then
    echo "Current failed."
fi
What's wrong with it?

I had this in a script and spent quite some time figuring out what was wrong as it kept writing "Current failed." though indeed nothing had failed. Having stared on it for several minutes, that piece of code seemed perfectly fine.

Again after some time and several trace and debug statements later I knew that the "$NEW_STATE" variable's value was indeed "true". So what was wrong?

Well, I had meant to write this:
if [ "$NEW_STATE" = "false" ]; then
    echo "Current failed."
fi
The shell does not evaluate expressions itself. It just calls commands, such like "test" (for which "[" is simply a copy, symlink or alias), but also "grep", "ls", "cp", whatever  you like. "true" is whatever returns 0.

Having forgotten the "[" I produced code that ran perfectly well - while just doing the opposite of what I had intended. Why did I not even get a syntax error, as the shell itself cannot handle string comparison itself?

The answer is simple: both "true" and "false" are commands themselves. Both take no arguments but don't complain either if any are given - arguments are just being ignored. My "$NEW_STATE" variable had a value of "true" because everything was fine. So my broken comparison expanded to this here:
if "true" = "false"; then
    echo "Current failed."
fi
The shell happily executes "true" which yields 0 (which is true for the shell) and does not bother to look at its arguments "= "false"". Good fun.

Mittwoch, 19. August 2015

DHL strikes again...

Wenn man denkt, es geht kaum noch schlimmer, wird man dann oft doch eines Besseren belehrt. Aus "Postamt" wurde "Empfänger unbekannt". Nachdem ich heute Morgen mit dem Versender telefoniert habe und der mir versicherte, die Adresse auf den Paket sei identisch mit der in der Auftragsbestätigung (und die ist korrekt), ging ein weiteres Schreiben an DHL heraus. Es spricht für sich:
Es ist erneut eine Sendung an mich nicht abgeliefert worden. Dieses Mal ist sie sogar an den Versender zurückgesandt worden. Meine Anschrift ist auf der Auftragsbestätigung korrekt, außerdem hat die Firma uns in der Vergangenheit schon einmal erfolgreich ein Paket zugesandt.

Ich war schon vorher äußerst unzufrieden, da wiederholt DHL-Boten, obwohl die ganze Zeit über jemand zu hause war, nicht klingelten und Sendungen in der Postfiliale zum Abholen ablieferten, was ich absolut unakzeptabel finde.

Nun bin ich stinksauer. Ich brauche die o.g. Sendung dringend bis zum Wochenende. Ich habe Ende vorletzter Woche bestellt, um ganz sicher zu gehen, dass ich sie rechtzeitig erhalte.

Ganz besonders, weil es nicht das erste Mal ist, dass Probleme bei der Zustellung auftreten und ich mich bereits mehr als deutlich beschwert habe, bin ich absolut erschüttert, dass es nicht nur wieder passiert, sondern auch mit viel gravierenderen Auswirkungen.

Sie werden für eine Dienstleistung bezahlt, also sorgen Sie dafür, dass die Leistung erbracht wird. Sie haben ein erhebliches Qualitätsproblem. Andere Anbieter, die ehemals einen schlechteren Ruf hatten, haben ihre Hausaufgaben gemacht, z.B. habe ich derartige Probleme wie mit Ihnen mit Hermes nie gehabt.

Ich kann zum aktuellen Zeitpunkt nur allen meinem Bekannten davon abraten, DHL zu verwenden, und ich werde in Zukunft darauf achten, dass, wenn ich online bestelle o.ä., ein anderer Versanddienstleister als DHL eingesetzt wird.

Wie schon letztes Mal geschrieben: Lieber zahle ich für den Versand ein wenig mehr, kann mich dann aber darauf verlassen, dass ich eine Sendung schnell und auch wirklich ins Haus erhalte, als am Ende meine Zeit zu verlieren, um Sendungen hinterher zu laufen bzw. zu telefonieren.

Bringen Sie Ihr Qualitätsproblem in Ordnung. DHL hat sich in den letzten Jahren einen zweifelhaften Ruf "erarbeitet", man braucht nur einmal google bemühen und findet oben gelistet reichlich Treffer, die genau die Probleme beschreiben, um die es hier geht. Peinlich ist dann, wenn, obwohl das bekannt ist, sich genau diese Dinge dann wieder bewahrheiten.

So sieht es aus. DHL ist bei mir nun wieder auf der schwarzen Liste - nicht grundsätzlich, aber so lange, bis sie mich überzeugt haben, dass sie ihr Qualitätsproblem gelöst haben. 

Ich frage mich dennoch, wie es dazu kommen kann. Bezahlen die ihre Boten so schlecht, dass es denen egal ist, oder setzen sie sie unter einen solchen Zeitdruck, dass sie nicht einmal auf unübersichtlichen (und das ist die elektronische Klingeltafel an unserer Haustür) Klingeltafeln ruhig die Namen abklappern, bis sie den jeweiligen Empfänger gefunden haben?

Wenn das bei einem Boten passiert, dann liegt es vermutlich am Boten. Wenn es beim selben Dienstleister immer wieder vorkommt, dann scheint mir das Problem woanders zu liegen.

Sei's drum. Wenn es hierzu neues gibt, werde ich das hier veröffentlichen.

Dienstag, 23. Dezember 2014

OS/2 lebt, aber es riecht manchmal schon nicht mehr so richtig gut

Alle Jahre wieder, in der Vorweihnachtszeit, wird mein OS/2-Laptop herausgeholt und uralte Software gepflegt. Leider gibt es auch ein Jahr nach der letzten Runde immer noch keinen funktionierenden Treiber für meinen Intel 5100 AGN (Shiloh) WLAN-Chip, aber es liegt ja auch schon seit einem Jahr ein LAN-Kabel bereit.

Nachdem in den letzten Monaten einiges an Patches in mein Elvis-Repository auf github eingeflossen ist und der letzte von Steve Kirkendall eingestellte Code-Stand almost-2.2_1.tar.gz dadurch einiges an Reife gewonnen hat, gibt es nun also - tada! - einen neuen Elvis-Release für OS/2:
Jedes Jahr ist wieder spannend, was denn nun dieses Mal nicht funktioniert. Ich hatte in der Zwischenzeit eine neuere gcc-Version (die von Innotek) installiert. Leider funktioniert der elvis-Build nur mit einem echten emx-Build-System, das will erst einmal herausgefunden sein. Der ipfc von IBM knallt beim Übersetzen der aus dem HTML generierten Dokumentation, zum Glück gibt es den wipfc von Watcom-C.

Elvis mit X11-Oberfläche unter OS/2

Es ist leider nicht mehr zu übersehen, dass OS/2 langsam verhungert. Eine lobenswerte Initiative ist Arca Noae, aber ich bin doch skeptisch, ob sie das, was sie aktuell versprechen, wirklich werden halten können. Firefox-Builds für OS/2 gibt es nur noch von dritten, nachdem im Februar dieses Jahres der OS/2-Code aufgrund des Mangels an Pflege aus den offiziellen Repos geworfen wurde. Aktuell gibt es eine stabile Version 10.0.7 und eine Beta 24.8.1 von bitwise, erschienen im September dieses Jahres, die leider nicht alltagstauglich ist.

Aber ich mag ja die klassischen Desktops, und so erfreue ich mich für ein paar Tage an meinem OS/2 und schwelge in Erinnerungen, bevor mich nächstes Jahr wieder die (nicht wirklich so) graue Realität des Broterwerbs einholt :)