Archiv Dezember 2014

Dienstag, 16. Dezember 2014

YCombinator Hacker News Evergreen-Artikel automatisiert zu Instapaper senden

Im November 2014 publizierte Ben Autrey auf Contextly eine Liste der am höchsten bewerteten Hacker News-Artikel aller Zeiten.

Da er in seinem Blog-Post nicht direkt auf die eigentlichen Artikel, sondern nur auf die Hacker News-Kommentarseite verwies, investierte ich gestern einige Zeit, um die eigentlichen Artikel automatisiert meinem Instapaper-Konto hinzuzufügen.

Das Ergebnis inklusive einer Textdatei mit allen Links auf die eigentlichen Artikel (urls-articles.txt) finden interessierte Zeitgenossen in meinem Github-Repository.

Tags: , , , , , , , ,
Labels: Programmierung

Keine Kommentare | neuen Kommentar verfassen

Montag, 15. Dezember 2014

Wenn man das SWISS-Osterei partout nicht im Adventskalender 2014 finden kann …

… ja dann hilft nur die gute, alte Web-Entwickler-Konsole:

Swiss Adventskalender 2014

Tags: , , , , , , , ,
Labels: Web

Keine Kommentare | neuen Kommentar verfassen

Montag, 15. Dezember 2014

Wieder einmal: Wie ich Video-Streams von News-Sendungen herunterlade

Mittels eines Cron-Scripts lade ich jede Stunde alle YouTube-Links in meinen Remember The Milk-Taskliste auf mein NAS, damit ich diese dann zu Hause mit Air Video auf meinen Apple TV (und somit 55″ Plasma) streamen kann.

Manchmal komme ich aber auch an News-Beiträgen von Fernsehanstalten vorbei, welche nicht auf YouTube angeboten werden und mit youtube-dl nicht heruntergeladen werden können.

Um dieser Videos trotzdem habhaft zu werden ist (leider) noch einiges an Handarbeit nötig. In der Regel streamen Fernsehanstalten solche Inhalte als f4f („F4F is Adobe’s fragmented MP4 or FLV file format for HTTP Dynamic Streaming“).

Als Beispiel nehmen wir ABC’s David Muir Exclusive Backstage Interview With Apple CEO Tim Cook.

Nachdem man die Web-Site im Browser der Wahl geöffnet hat, startet man die Web Developer-Konsole, schaltet auf die Ansicht der HTTP-Requests und startet anschliessend das Video. Im Chaos der aufgerufenen Assets suchen wir das sogenannte f4m-Manifest — eine XML-Datei, die dem Videoplayer sagt, wo er die Fragmente des Video-Streams findet.

Obwowhl ich Firefox längst totgeschrieben habe — ich habe die Erfahrung gemacht, dass dieser Browser die Netzwerkrequests am intuitivsten aufbereitet, um am schnellsten zum Ziel zu kommen. Nicht zuletzt, weil es eine Spalte mit dem Typ des Requests gibt, die es äusserst einfach macht, nach dem Typ f4m Ausschau zu halten.

Hier die Datei für obiges Video vom September 2014:

/tmp/temp_textmate.DgGpNM:2: warning: variable $KCODE is no longer effective; ignored
<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns="http://ns.adobe.com/f4m/1.0" xmlns:akamai="uri:akamai.com/f4m/1.0">
  <akamai:version>2.0</akamai:version>
  <akamai:bw>5000</akamai:bw>
  <id>/abcnews/2014/09/140909_wn_muir7_1837_,500,700,900,1200,1600,2000,2500,.mp4.csmil_0</id>
  <streamType>recorded</streamType>
  <akamai:streamType>vod</akamai:streamType>
  <duration>200.968</duration>
  <streamBaseTime>0.000</streamBaseTime>
  <bootstrapInfo profile="named" id="bootstrap_0">AAAAi2Fic3QAAAAAAAAAAQAAAAPoAAAAAAADEQgAAAAAAAAAAAAAAAAAAQAAABlhc3J0AAAAAAAAAAABAAAAAQAAACEBAAAARmFmcnQAAAAAAAAD6AAAAAADAAAAAQAAAAAAAAAAAAAXcAAAACEAAAAAAALuAAAAIwgAAAAAAAAAAAAAAAAAAAAAAA==</bootstrapInfo>
  <bootstrapInfo profile="named" id="bootstrap_1">AAAAi2Fic3QAAAAAAAAAAQAAAAPoAAAAAAADEQgAAAAAAAAAAAAAAAAAAQAAABlhc3J0AAAAAAAAAAABAAAAAQAAACEBAAAARmFmcnQAAAAAAAAD6AAAAAADAAAAAQAAAAAAAAAAAAAXcAAAACEAAAAAAALuAAAAIwgAAAAAAAAAAAAAAAAAAAAAAA==</bootstrapInfo>
  <bootstrapInfo profile="named" id="bootstrap_2">AAAAi2Fic3QAAAAAAAAAAQAAAAPoAAAAAAADEQgAAAAAAAAAAAAAAAAAAQAAABlhc3J0AAAAAAAAAAABAAAAAQAAACEBAAAARmFmcnQAAAAAAAAD6AAAAAADAAAAAQAAAAAAAAAAAAAXcAAAACEAAAAAAALuAAAAIwgAAAAAAAAAAAAAAAAAAAAAAA==</bootstrapInfo>
  <bootstrapInfo profile="named" id="bootstrap_3">AAAAi2Fic3QAAAAAAAAAAQAAAAPoAAAAAAADEQgAAAAAAAAAAAAAAAAAAQAAABlhc3J0AAAAAAAAAAABAAAAAQAAACEBAAAARmFmcnQAAAAAAAAD6AAAAAADAAAAAQAAAAAAAAAAAAAXcAAAACEAAAAAAALuAAAAIwgAAAAAAAAAAAAAAAAAAAAAAA==</bootstrapInfo>
  <bootstrapInfo profile="named" id="bootstrap_4">AAAAi2Fic3QAAAAAAAAAAQAAAAPoAAAAAAADEQgAAAAAAAAAAAAAAAAAAQAAABlhc3J0AAAAAAAAAAABAAAAAQAAACEBAAAARmFmcnQAAAAAAAAD6AAAAAADAAAAAQAAAAAAAAAAAAAXcAAAACEAAAAAAALuAAAAIwgAAAAAAAAAAAAAAAAAAAAAAA==</bootstrapInfo>
  <bootstrapInfo profile="named" id="bootstrap_5">AAAAi2Fic3QAAAAAAAAAAQAAAAPoAAAAAAADEQgAAAAAAAAAAAAAAAAAAQAAABlhc3J0AAAAAAAAAAABAAAAAQAAACEBAAAARmFmcnQAAAAAAAAD6AAAAAADAAAAAQAAAAAAAAAAAAAXcAAAACEAAAAAAALuAAAAIwgAAAAAAAAAAAAAAAAAAAAAAA==</bootstrapInfo>
  <bootstrapInfo profile="named" id="bootstrap_6">AAAAi2Fic3QAAAAAAAAAAQAAAAPoAAAAAAADEQgAAAAAAAAAAAAAAAAAAQAAABlhc3J0AAAAAAAAAAABAAAAAQAAACEBAAAARmFmcnQAAAAAAAAD6AAAAAADAAAAAQAAAAAAAAAAAAAXcAAAACEAAAAAAALuAAAAIwgAAAAAAAAAAAAAAAAAAAAAAA==</bootstrapInfo>
  <media bitrate="495" url="0_a3ed2f8d8e5b9694_" bootstrapInfoId="bootstrap_0">
    <metadata>AgAKb25NZXRhRGF0YQgAAAAMAAhkdXJhdGlvbgBAaR752yLQ5QAFd2lkdGgAQIAAAAAAAAAABmhlaWdodABAcgAAAAAAAAANdmlkZW9kYXRhcmF0ZQBAeSO4tL3p2AAJZnJhbWVyYXRlAEA99wg+h62+AAx2aWRlb2NvZGVjaWQAQBwAAAAAAAAADWF1ZGlvZGF0YXJhdGUAQFdnYcJYreUAD2F1ZGlvc2FtcGxlcmF0ZQBA5YiAAAAAAAAPYXVkaW9zYW1wbGVzaXplAEAwAAAAAAAAAAZzdGVyZW8BAQAMYXVkaW9jb2RlY2lkAEAkAAAAAAAAAAhmaWxlc2l6ZQBBZ8IggAAAAAAACQ==</metadata>
  </media>
  <media bitrate="694" url="1_a3ed2f8d8e5b9694_" bootstrapInfoId="bootstrap_1">
    <metadata>AgAKb25NZXRhRGF0YQgAAAAMAAhkdXJhdGlvbgBAaR752yLQ5QAFd2lkdGgAQIQAAAAAAAAABmhlaWdodABAdoAAAAAAAAANdmlkZW9kYXRhcmF0ZQBAgs/By82odgAJZnJhbWVyYXRlAEA99wg+h62+AAx2aWRlb2NvZGVjaWQAQBwAAAAAAAAADWF1ZGlvZGF0YXJhdGUAQFdnYcJYreUAD2F1ZGlvc2FtcGxlcmF0ZQBA5YiAAAAAAAAPYXVkaW9zYW1wbGVzaXplAEAwAAAAAAAAAAZzdGVyZW8BAQAMYXVkaW9jb2RlY2lkAEAkAAAAAAAAAAhmaWxlc2l6ZQBBcKoP4AAAAAAACQ==</metadata>
  </media>
  <media bitrate="894" url="2_a3ed2f8d8e5b9694_" bootstrapInfoId="bootstrap_2">
    <metadata>AgAKb25NZXRhRGF0YQgAAAAMAAhkdXJhdGlvbgBAaR752yLQ5QAFd2lkdGgAQIQAAAAAAAAABmhlaWdodABAdoAAAAAAAAANdmlkZW9kYXRhcmF0ZQBAiQ24xGUM/gAJZnJhbWVyYXRlAEA99wg+h62+AAx2aWRlb2NvZGVjaWQAQBwAAAAAAAAADWF1ZGlvZGF0YXJhdGUAQFdnYcJYreUAD2F1ZGlvc2FtcGxlcmF0ZQBA5YiAAAAAAAAPYXVkaW9zYW1wbGVzaXplAEAwAAAAAAAAAAZzdGVyZW8BAQAMYXVkaW9jb2RlY2lkAEAkAAAAAAAAAAhmaWxlc2l6ZQBBdXMc8AAAAAAACQ==</metadata>
  </media>
  <media bitrate="1194" url="3_a3ed2f8d8e5b9694_" bootstrapInfoId="bootstrap_3">
    <metadata>AgAKb25NZXRhRGF0YQgAAAAMAAhkdXJhdGlvbgBAaR752yLQ5QAFd2lkdGgAQIQAAAAAAAAABmhlaWdodABAdoAAAAAAAAANdmlkZW9kYXRhcmF0ZQBAkTU4pmS0SwAJZnJhbWVyYXRlAEA99wg+h62+AAx2aWRlb2NvZGVjaWQAQBwAAAAAAAAADWF1ZGlvZGF0YXJhdGUAQFdnYcJYreUAD2F1ZGlvc2FtcGxlcmF0ZQBA5YiAAAAAAAAPYXVkaW9zYW1wbGVzaXplAEAwAAAAAAAAAAZzdGVyZW8BAQAMYXVkaW9jb2RlY2lkAEAkAAAAAAAAAAhmaWxlc2l6ZQBBfKCEIAAAAAAACQ==</metadata>
  </media>
  <media bitrate="1593" url="4_a3ed2f8d8e5b9694_" bootstrapInfoId="bootstrap_4">
    <metadata>AgAKb25NZXRhRGF0YQgAAAAMAAhkdXJhdGlvbgBAaR752yLQ5QAFd2lkdGgAQIQAAAAAAAAABmhlaWdodABAdoAAAAAAAAANdmlkZW9kYXRhcmF0ZQBAl3KVnpj2SgAJZnJhbWVyYXRlAEA99wg+h62+AAx2aWRlb2NvZGVjaWQAQBwAAAAAAAAADWF1ZGlvZGF0YXJhdGUAQFdnYcJYreUAD2F1ZGlvc2FtcGxlcmF0ZQBA5YiAAAAAAAAPYXVkaW9zYW1wbGVzaXplAEAwAAAAAAAAAAZzdGVyZW8BAQAMYXVkaW9jb2RlY2lkAEAkAAAAAAAAAAhmaWxlc2l6ZQBBgxjZEAAAAAAACQ==</metadata>
  </media>
  <media bitrate="1993" url="5_a3ed2f8d8e5b9694_" bootstrapInfoId="bootstrap_5">
    <metadata>AgAKb25NZXRhRGF0YQgAAAAMAAhkdXJhdGlvbgBAaR752yLQ5QAFd2lkdGgAQJAAAAAAAAAABmhlaWdodABAggAAAAAAAAANdmlkZW9kYXRhcmF0ZQBAnbA4DHkwAgAJZnJhbWVyYXRlAEA99wg+h62+AAx2aWRlb2NvZGVjaWQAQBwAAAAAAAAADWF1ZGlvZGF0YXJhdGUAQFdnYcJYreUAD2F1ZGlvc2FtcGxlcmF0ZQBA5YiAAAAAAAAPYXVkaW9zYW1wbGVzaXplAEAwAAAAAAAAAAZzdGVyZW8BAQAMYXVkaW9jb2RlY2lkAEAkAAAAAAAAAAhmaWxlc2l6ZQBBh+GlUAAAAAAACQ==</metadata>
  </media>
  <media bitrate="2491" url="6_a3ed2f8d8e5b9694_" bootstrapInfoId="bootstrap_6">
    <metadata>AgAKb25NZXRhRGF0YQgAAAAMAAhkdXJhdGlvbgBAaR752yLQ5QAFd2lkdGgAQJQAAAAAAAAABmhlaWdodABAhoAAAAAAAAANdmlkZW9kYXRhcmF0ZQBAor16mqIiOAAJZnJhbWVyYXRlAEA99wg+h62+AAx2aWRlb2NvZGVjaWQAQBwAAAAAAAAADWF1ZGlvZGF0YXJhdGUAQFdnYcJYreUAD2F1ZGlvc2FtcGxlcmF0ZQBA5YiAAAAAAAAPYXVkaW9zYW1wbGVzaXplAEAwAAAAAAAAAAZzdGVyZW8BAQAMYXVkaW9jb2RlY2lkAEAkAAAAAAAAAAhmaWxlc2l6ZQBBjdrgaAAAAAAACQ==</metadata>
  </media>
</manifest>

Hat man die URL dieses Manifests ergattert (in diesem Fall ist es abcvod.abcnews.com/z/abcnews/2014/09/140909_wn_muir7_1837_,500,700,900,1200,1600,2000,2500,.mp4.csmil/manifest.f4m?g=SFHWHPOOGNQB&hdcore=3.5.0&plugin=aasp-3.5.0.151.81), verwendet man AdobeHDS.php, um die Stream-Fragmente automatisiert auf den lokalen Rechner herunterzuladen und danach zu einer MP4 oder FLV-Datei zusammenzuschustern:

$ php AdobeHDS.php --manifest "http://abcvod.abcnews.com/z/abcnews/2014/09/140909_wn_muir7_1837_,500,700,900,1200,1600,2000,2500,.mp4.csmil/manifest.f4m?g=SFHWHPOOGNQB&hdcore=3.5.0&plugin=aasp-3.5.0.151.81"

Tags: , , , , , , , ,
Labels: Web

1 Kommentar | neuen Kommentar verfassen

Montag, 15. Dezember 2014

Googles 2-Step-Verification funktioniert nicht mehr

Heute morgen wurde ich von einem Angehörigen zu einem Supportfall gerufen: Er könne sich auf der Arbeit nicht mehr in sein Google-Konto einloggen, weil er die SMS mit den Zwei-Faktor-Codes aus unbekannten Gründen nicht mehr auf das Telefon zugesendet erhielt.

Googles Zwei-Faktor-Authentifizierung hatte ich ihm vor einigen Wochen eingeschaltet, nachdem gerade wieder Horror-Stories mit gekaperten Gmail- und Apple-Konten die Runden machten.

Es folgte ein halbstündiger Versuch von Fernsupport per iMessage, der mich fast zur Verzweiflung brachte: Als erstes erörtete ich die Möglichkeiten, dem Hilferufenden den SMS-Code über einen anderen Weg zu übermitteln — ein automatisierter Telefonanruf anstelle des SMS-Codes scheint für Schweizer Mobilfunknummern nicht angeboten zu werden. Die Option, 3 bis 5 Arbeitstage auf eine Rücksetzung des Kontos zu warten schlug ich ebenfalls aus.

Ich wendete mich deshalb dem Mobiltelefon zu: Wieso zum Teufel erhielt es die SMS nicht zugestellt? Die SIM-Karte stammt von Coop Mobile mit Prix Garantie, d.h. der Pre-Paid-Option. Coop Mobile ist ein MVNO, welcher über das Mobilfunknetz von Orange operiert. Ich weiss von bei mir eingerichteten Kalender-Alarmen, dass Google SMS aus dem Vereinigten Königreich versendet. Könnte es sein, dass Google die SMS derart krude oder illegal versendet, dass sie von Coop Mobile geblockt werden?

Google-Recherchen förderten ein älteres Problem mit einem rumänischen Mobilfunkanbieter zu Tage, bezüglich Coop Mobile/Orange fand ich aber keinen einzigen Beitrag.

Oder war die SMSC (SMS-Center-Konfiguration) des Handys etwa am Arsch?

Als erstes googelte ich nach Möglichkeiten, die SMSC-Konfiguration des iPhones anzuzeigen. Ich stiess dabei auf den Knowledgebase-Artikel Change or add the SMSC number to apple iPhone, welcher dem interessierten Frickler folgenden Code anbot:

*#5005*7672#

Ich probierte den Code auf meinem Gerät aus, erstellte Screenshots und versendete diese per iMessage an den Hilfesuchenden. Ich forderte meinen Angehörigen auf, diese Nummer einzugeben und anrufen. Als Antwort erschien auf dessen Display:

Abfrage der Einstellung fehlgeschlagen. Für Dienstcenter

Er fragte mich daraufhin, ob „mobile netz“ eingeschalten sein müsste. Ich klarifizierte, dass Mobile Daten für den Empfang und Versand von SMS nicht benötigt würden. Doch diese Frage regte meine Gehirnwindungen an: „Wird oben links eigentlich Orange CH angezeigt?“ — „Nein, nur VPN“ — „Ja, schon klar, du bist auf der Arbeit, aber … links davon, steht da Orange CH?“ — „Nein, dort steht SIM gesperrt“.

Ich nahm deshalb mein iPhone zur Hand und rief auf dessen Nummer an. Und tatsächlich erhielt ich die Meldung: „Der Teilnehmer ist momentan nicht erreichbar“. Voilà, kein Wunder kommen keine SMS an!

Wie sich herausstellte hatte die Person letzte Woche iOS 8.1.2 auf seinem Gerät installiert. Nach dem Neustart des iPhones wurde er zwar aufgefordert, die SIM-Karte zu entsperren, da er den Code aber nicht zur Hand hatte, vernachlässigte er die Meldung. Da er offenbar selten Telefonanrufe und SMS-Nachrichten erhält und im heimischen Netzwerk und im WLAN auf der Arbeit iMessage und alle anderen Internetdienste funktionierten, wurde die Person nicht misstrauisch.

Diese Anekdote ist wieder einmal eine Mahnung an uns Generation Internet und Smartphone: Die mobilen Technologien bringen eine ungeheure Komplexität mit sich, welche die älteren Benutzer weiterhin stark überfordert. Wenn das nur gut ausgeht …

Tags: , , , , , , , ,
Labels: Leben

1 Kommentar | neuen Kommentar verfassen

Sonntag, 14. Dezember 2014

MySQL-Query auf Dev blitzschnell, in Prod extrem langsam

Am Freitag habe ich mich entschieden, eine bisher nur auf meinem lokalen Mac mini in einem Vagrant-Container laufende Web-Applikation auf meinen „produktiven“ Web-Server bei der Cyon GmbH zu verschieben.

Es handelt sich um eine Applikation, mit welcher Fragen einer Zertifizierungsprüfung mittels Multiple Choice beantwortet werden können. Eine Unterseite der Applikation berechnet aus dem Log der bisher getätigten Antworten Statistiken.

Nach einigen Minuten lief die Web-Applikation und der aktuellste MySQL-Dump war ebenfalls auf dem Server eingespielt. Doch dann kam das böse Erwachen: Beim Aufruf einer neuen Frage wartete ich unzählige Sekunden auf eine Antwort des Servers, bis die Ausführung des PHP-Scripts dann mit einem Timeout abbrach.

Was zum Teufel? Rasch war klar, dass ein SQL-Query zur Berechnung von Statistiken der Übeltäter war.

Auf Dev lief das MySQL-Query folgendermassen rasch durch:

[12-Dec-2014 13:22:18 Europe/Zurich] I - mysql->query() took 0.1694 secs in /var/www/apps/%APP%/inc/%APP%.class.php:343 for URI (Referer: unknown) from IP 192.168.1.1 with User Agent "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.1.17 (KHTML, like Gecko) Version/7.1 Safari/537.85.10"

Auf Prod hingegen loggte ich diesen Zeitwert:

[12-Dec-2014 12:40:18 Europe/Zurich] I - mysql->query() took 47.8917 secs in %PATH%%APP%.class.php:343 for URI <%URI%> (Referer: %REFERER%) from IP %IP% with User Agent "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.1.17 (KHTML, like Gecko) Version/7.1 Safari/537.85.10"

Eine Verlangsamung von mehr als dem 200-fachen!

Als erstes prüfte ich die Versionen der Datenbank-Software:

Dev

-- Server version	5.6.21-1~dotdeb.1

Prod

-- Server version	5.5.40-cll

Ich verwendete also eine Zehntelsversion bessere Datenbank.

Anschliessend liess ich mir das Query sowohl in Dev als auch in der Produktion „erklären“ (EXPLAIN):

Dev

EXPLAIN-localhost

Prod

EXPLAIN-cyon

Der Unterschied: Auf Prod führte MySQL ein „Dependent Subquery“ aus, auf Dev „nur“ (?) ein „Subquery“. War das das Problem?

Da mir EXPLAIN hier nun wirklich nicht weiterhalf, wendete ich mich Google zu. Folgende zwei Stackexchange-Artikel erheischten meine Aufmerksamkeit:

Beim Lesen der Antworten kam mir plötzlich die Idee: Vielleicht sind INDEXe deine Freunde? Ich wählte die Spalte Questions-id (`Questions-id` varchar(64) NOT NULL, CLSIDs enthaltend) aus und versah sie mit einem Index.

Und siehe da, beim nächstem Aufruf der Web-Seite wurde folgender Zeitwert registriert:

[12-Dec-2014 23:33:09 Europe/Zurich] I - mysql->query() took 0.0412 secs in %PATH%%APP%.class.php:343 for URI <%URI%> (Referer: %REFERER%) from IP %IP% with User Agent "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.1.17 (KHTML, like Gecko) Version/7.1 Safari/537.85.10"

Der zusätzliche Index auf einer Spalte auf hat mein Performance-Problem zu meiner vollsten Zufriedenheit gelöst. Wieso der Index aber in Version 5.6 von MySQL nicht mehr benötigt wird, ist mir derzeit noch ein Rätsel. Wahrscheinlich haben die Entwickler die Subquery-Performance in dieser Version stark verbessert?

Tags: , , , , , , , , , , ,
Labels: Web

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 14. Dezember 2014

Welche Adobe Flash-Version verwende ich?

In den letzten Wochen haben sich die Sicherheits-Updates für Adobes Flash-Frickelware wieder gehäuft. Ob ich das neuste Plugin auf einem Rechner installieren muss, sagt mir folgende Web-Site:

What is my Flash Player version? Is it up-to-date?

Die Web-Site Flash Tester liefert zusätzlich eine Chronologie aller Updates und verlinkt zudem auf eine offizielle, von Adobe gehostete Seite, welche die Version des aktuell installierten Flash-Plugins anzeigt, an Hand derer der Benutzer in einer Tabelle selber nachschauen muss, ob er schon Up-to-date ist:

Adobe — Flash Player Version Information

Meine Besucher entscheiden bitte selber, welche der beiden Web-Seiten nun benutzerfreundlicher ist … ich persönlich habe meine Meinung gebildet, und sie bekräftigt meinen Eindruck des Bloatware-Herstellers Adobe.

Tags: , , , , ,
Labels: Web

Keine Kommentare | neuen Kommentar verfassen