Blümchen und Insekten

Ich würde vorschlagen, wir benennen Pfingsten in Makro-Tage um – nicht nur ich habe gestern die ersten Fotos (von Löwenzahn) mit meinem neuen Sigma 105mm gezeigt, sondern auch Herr und Frau Olsen, Thomas Schwarz und mein Namensvetter Majeres waren makromäßig unterwegs…

Und so gibt’s hier jetzt 29 Fotos von Blümchen und ein paar Insekten von meinem gestrigen Spaziergang.

» Flickr-Diashow

Übrigens ist diese schwarz-gelbe Schönheit das 10000. Foto mit meiner 40D (in 2 Jahren und 2½ Monaten) – auch wenn es IMG_10001 heißt, aber Canon macht halt nach 100CANON\IMG_9999 mit 101CANON\IMG_0001 weiter…

IMG_10001

IMG_10018 IMG_10230

IMG_10234

Bienen erwischt man leider nur selten richtig gut…

IMG_10117

IMG_10119 IMG_10122

IMG_10047 IMG_10145

IMG_10034

IMG_10038 IMG_10041

IMG_10053 IMG_10065

IMG_10180

IMG_9985 IMG_10023

IMG_10171

IMG_10217 IMG_10252

IMG_10013

IMG_10163 IMG_10214a

IMG_10017 IMG_10068

IMG_10096

IMG_10101 IMG_10105

IMG_10149a

Links und Videos der Woche (2010/20)

Diesmal einen Tag später – am zweiten Sonntag des Wochenendes, sozusagen…

Dem Petrus seine Frau (2)

weingesichtVor einem Jahr habe ich schon die wahre Apostelgeschichte über die Entstehung von Pfingsten offenbart, bei der ich die verloren­gegangenen Worte der Frau von Simon Petrus ergänzt habe – allerdings fehlten da noch die letzten elf Verse in Kapitel 2, die ich hiermit nachreiche. Wer den ersten Teil noch nicht kennt bzw. ihn sich wieder in Erinnerung rufen will, ist eingeladen, ihn jetzt zu lesen, ich warte so lange.

So, wieder da? Gut, dann jetzt zur „Entstehung der Gemeinde“:

37 Als sie aber das hörten, drang es ihnen durchs Herz, und sie sprachen zu Petrus und den anderen Aposteln: „…und erstmal alle durcheinander, wa?“ warf Frau Petrus ein. „Hätt ich net für Ordnung gesorgt, dann gäb’s die nächsten Verse gar net!“ 38 Was sollen wir tun, Brüder? Petrus aber [sprach] zu ihnen: Tut Buße, und ein jeder von euch werde getauft auf den Namen Jesu Christi zur Vergebung der Sünden, und ihr werdet die Gabe des Heiligen Geistes empfangen. „Jo, was die Jungs net alles für ’n Geist des Weines machen,“ murrte Frau Petrus. „Und so heißt jetzt jeder im Viertel ‚Jesu Krischti‘, und die Stadtverwaltung kriegt graue Haare wegen diesem Durcheinander.“ 39 Denn euch ist die Verheißung und euren Kindern und allen, die in der Ferne sind, so viele irgend der Herr, unser Gott, herzurufen wird. „Ach komm, als ob die Weitergabe der Tradition des Weinanbaus so ’ne große Sache ist…“ 40 Und mit vielen anderen Worten beschwor und ermahnte er sie, indem er sagte: Laßt euch retten von diesem verkehrten Geschlecht! „So ’n Quatsch. Wissentse, meiner Kusine ihre Freundin is Arzthelferin bei ’nem Geschlechts­umwandlungs­spezialisten, und die is nur am jammern von wegen Überstunden noch und nöcher!“

41 Die nun sein Wort aufnahmen, wurden getauft; und es wurden an jenem Tage hinzugetan bei dreitausend Seelen. 42 Sie verharrten aber in der Lehre der Apostel und in der Gemeinschaft, im Brechen des Brotes und in den Gebeten. „Dat war knapp mit den Seelen, dat kann ich Ihnen sagen! Gut, dass die Jungs geteilt haben, damit jeder wenigstens ’ne halbe Schinkenseele abgekriegt hat,“ lobte Frau Petrus (ausnahmsweise). 43 Es kam aber jede Seele Furcht an, und es geschahen viele Wunder und Zeichen durch die Apostel. „Sag ich ja, dass die Jungs geteilt haben, dat war wirklich ’n Wunder!“

44 Alle aber, welche glaubten, waren beisammen und hatten alles gemein; 45 und sie verkauften die Güter und die Habe und verteilten sie an alle, jenachdem einer irgend Bedürfnis hatte. „Jepp, echt ’n Glück, wie gut der Flohmarkt geklappt hat. So hamse jetzt genug, um ihr Bedürfnis nach dem nächsten Fass Wein zu stillen.“ 46 Und indem sie täglich einmütig im Tempel verharrten und zu Hause das Brot brachen, nahmen sie Speise mit Frohlocken und Einfalt des Herzens, „Wat bin ich froh, dass die neue Weinschenke namens „Tempel“ eröffnet hat, da hockt der Petrus mit seinen Kumpels nicht ständig daheim rum – grad wo noch so viele neue Kumpels dazugekommen sind.“ 47 lobten Gott und hatten Gunst bei dem ganzen Volke. Der Herr aber tat täglich [zu der Versammlung] hinzu, die gerettet werden sollten. „Klar, hier und da mal ’ne Lokalrunde schmeißen, und schon haste viele neue Freunde – oder zumindest Typen, die so tun. Aber genug für heute, ich muss noch ’n paar Kästen Leergut wegbringen, tschüssikowski!“

» Fortsetzung (2011)


Originaltext: Elberfelder Bibel 1905; Foto: tiano69/sxc

Der Löwe zahnt

Seit ein paar Wochen hab ich für meine Canon 40D das 105mm-Makro-Objektiv von Sigma – das einen maximalen Abbildungsmaßstab von 1:1 bietet, verglichen mit dem Reisezoom-Nebenjob-Makro (dem Tamron 28-300) mit max. 1:3 natürlich „etwas“ besser und spezialisierter –, und (wetterbedingt erst) heute hab ich damit den ersten richtigen Fotospaziergang gemacht – die Fotos werde ich in den nächsten Tagen in drei Beiträgen präsentieren, in diesem ersten gibt’s nur 9x 10x Löwenzahn.

Wie ich gemerkt habe, ist es mitunter hilfreich, die schnelle Serienbildfunktion zu wählen und ein paar Bilder auf einmal zu schießen, denn sowohl der Fotograf als auch der Wind sorgt gerne für Verwacklungen…

» Zur Flickr-Diashow

Außer bei den letzten beiden (in der Reihenfolge hier im Blog) handelt es sich übrigens um die unbearbeiten JPGs direkt aus der Kamera.

IMG_10199

IMG_9991 IMG_10155

IMG_10203

IMG_10175

IMG_10167 IMG_10004

IMG_10198

IMG_10134

IMG_10221

WordPress: Hinweis bei Spam-Falscherkennung

Papierspam ?! Und wieder eine kleine Code-für-das-Blog-Lösung von mir, die zwar nicht unbedingt perfekt ist, aber doch hilfreich sein kann…

Viele sind dem Problem schon begegnet, dass ein Kommentar fälschlicherweise im Spam landet, weil der Spamfilter – sei es das bekannte Akismet (wie bei meinem Blog), sei es ein anderes Plugin oder einfach eine versehentlich zu scharf eingestellte Blacklist – übereifrig ist. Auf meinem Blog kommt so ein false positive im Schnitt alle drei Wochen einmal vor.

Der erfahrene Blogger oder Blogkommentierer weiß, dass er dann i.d.R. einfach darauf warten muss, dass der Blogbetreiber den Kommentar (hoffentlich) herausfischt und freigibt. Der unerfahrenere Kommentierende steht aber nicht selten wie der (Pfingst-)Ochse vor dem Berg, wenn er nach dem Absenden des Kommentars oben auf der Seite landet und auch beim Runterscrollen seinen Kommentar nicht findet; manche versuchen es dann auch erneut, manche kommen vielleicht gar nicht wieder.

Ein Hinweis könnte da helfen – doch WordPress bietet da (anders als bei noch zu moderierenden Kommentaren) keinen. Die normale Schleife, die die Kommentare ausgibt, weiß auch nicht direkt, welcher Kommentar aktuell vom Aufrufenden ist, denn der Teil der URL, in der das steht – #comment-123, was ja insbesondere für die Positionierung der Ansicht im Browser sorgt1 – ist nicht Teil der Anforderung, die der Server sieht, sondern bleibt im Browser.

Nun könnte man vielleicht die Kommentarnummer bei der Weiterleitung nach dem Abschicken auch als &-Parameter in die URL einbauen (und dann in der Ausgabeschleife mit abfragen), doch finde ich das irgendwie unschön – wer weiß, ob dadurch nicht mehrere solche URLs durch die Suchmaschinen geistern. Mir kamen zwei andere Ideen, die ich hier vorstellen will:

Lösung 1: Spam-Kommentar von derselben IP-Adresse?

Die erste Idee: Man schaut nach der Kommentarausgabe nach, ob in den letzten paar Minuten ein Spam-Kommentar von derselben IP-Adresse kam, von der die aktuelle Anfrage kommt. Das sieht dann in einer Funktion für die functions.php des Themes so aus:

function ag_spammed_comment ($gotcomments) {
    global $wpdb, $post;
    $spamcom = $wpdb->get_results ("
        SELECT * FROM $wpdb->comments
        WHERE comment_post_ID = '$post->ID'
          AND comment_author_IP = '".$_SERVER['REMOTE_ADDR']."'
          AND comment_approved = 'spam'
          AND comment_type = ''
          AND TIME_TO_SEC(TIMEDIFF(NOW(),comment_date))<120");
    if ($spamcom) {
        if (!$gotcomments) echo '<ol class="commentlist">';
        foreach ($spamcom as $sc) {
            echo '<li id="comment-'.$sc->comment_ID.'" class="comment caughtasspam">'.
            '<strong>Anscheinend wurde Ihr Kommentar von der Automatik als Spam markiert.</strong><br/>'.
            'Falls das ein Versehen war: bitte etwas Geduld, bis er manuell freigeschaltet wird.'.
            '</li>'."\n";
        }
        if (!$gotcomments) echo '</ol>';
    }
}

Aufzurufen dann in der comments.php mit ag_spammed_comment (true); (in <?php ?> eingeschlossen) nach der Ausgabe der vorhandenen Kommentare und mit false statt true im Zweig für den Fall, dass es noch keine Kommentare gibt – wobei diese Unterscheidung nur nötig ist, wenn man den Hinweis wie einen Kommentar in die ol/ul mit einbinden (und gestalten) will; wer einen separaten div-Block verwenden will, kann sich die Unterscheidung sparen.

Die Klasse .caughtasspam Ist dann natürlich noch in der style.css angemessen (z.B. mit rotem Rahmen) zu formatieren.

Allerdings gibt’s da ein…

Problem: Der Cache

Wer ein Cache-Plugin wie WP Super Cache einsetzt, das die erzeugten Seiten zwischenspeichert, steht dann vor dem Problem, dass dieses – eigentlich sinnvollerweise – den Cache der betroffenen Seite bei einem Spam-Kommentar nicht invalidiert, d.h. noch dieselbe alte Seite ausliefert, ohne dass der Code oben zur Ausführung kommt und seinen Hinweis ausgeben kann.

Eine Lösung dafür: Man ändert das Plugin so, dass Spam-Kommentare (aber nicht Spam-Trackbacks) doch die gecachete Seite löschen. Das geht bei WP Super Cache in wp-cache-phase2.php in der function wp_cache_get_postid_from_comment, wo man nach

} elseif ( $comment['comment_approved'] == 'spam' ) { 

die beiden Zeilen

if ( isset( $GLOBALS[ 'wp_super_cache_debug' ] ) && $GLOBALS[ 'wp_super_cache_debug' ] ) wp_cache_debug( "Spam comment. Don't delete any cache files.", 4 );
return $postid;

durch diese ersetzt:

//--ag: for false-positive message
if ( $comment['comment_type'] == '' ) {
    if ( isset( $GLOBALS[ 'wp_super_cache_debug' ] ) && $GLOBALS[ 'wp_super_cache_debug' ] ) wp_cache_debug( "Spam comment. But update cache for post $postid to allow for false-positive message.", 4 );
    return wp_cache_post_change($postid);
} else {
    if ( isset( $GLOBALS[ 'wp_super_cache_debug' ] ) && $GLOBALS[ 'wp_super_cache_debug' ] ) wp_cache_debug( "Spam trackback. Don't delete any cache files.", 4 );
    return $postid;
}

Dann funktioniert’s auch mit dem Hinweis. Allerdings auf Kosten der Performance, falls zufällig echte Spammer viele Spamkommentare auf eine Seite abzuladen versuchen, die auch häufig von Besuchern aufgerufen wird – was bei den meisten Blogs aber nicht so häufig sein dürfte, denke ich.

Der größere Nachteil ist m.E., dass man ein (weiteres?) Plugin hat, bei dem man bei einem Update aufpassen muss, dass man die Änderungen auch in die neue Version übernimmt. Diesen Aufwand will ich mir sparen, deshalb habe ich hier eine andere Lösung eingebaut:

Lösung 2: JavaScript (mit jQuery)

Diese Lösung funktioniert natürlich nicht, wenn der Kommentator JavaScript deaktiviert hat – ein Nachteil, den ich hier aber in Kauf nehme in der Hoffnung, dass diese Kombination selten genug auftritt – dafür funktioniert sie aber auch, wenn jemand über für jede Anfrage wechselnde Proxy-Server surft.

Hier gibt’s sogar zwei Lösungsvarianten, deren erste ich nur kurz anschneiden will: Man ändert mittels comment_post_redirect-Filter (der von wp-comments-post.php aufgerufen wird) die Ziel-URL so, dass bei einem Spam-Kommentar das #comment-123 durch etwas wie #spammed ersetzt wird, und sorgt dann per JavaScript dafür, dass ein im Theme eingebauter, anfangs auf display: none gesetzter (oder leerer) Hinweisblock eingeblendet (oder mit dem Hinweistext gefüllt) wird, wenn #spammed in der URL vorkommt – denn anders als der Server hat JavaScript auf diesen Teil Zugriff.

Variante 2, die auch hier eingebaut ist, kommt ohne einen solchen Filter aus und schaut einfach nach, ob es ein Element namens #comment-123 auf der (vollständig geladenen) Seite überhaupt gibt. Wenn nicht, wird der Hinweistext eingefügt (durch JavaScript deswegen, damit Suchmaschinen den Hinweis nicht indizieren):

<div id="spammedhint" class="comment caughtasspam" style="display:none;"></div>
<script type="text/javascript">
<!--
var theUrl = document.location.toString();
if (theUrl.match("#comment-")) {
    var theHash = theUrl.substr(theUrl.indexOf("#"));
    if (jQuery(theHash).length==0) {
        jQuery(document).ready(function() {
            jQuery("#spammedhint").html("<strong>Anscheinend wurde Dein Kommentar von der Automatik als Spam markiert.</strong><br/>"+
            "Falls das ein Versehen war: bitte etwas Geduld, bis er manuell freigeschaltet wird.").fadeIn();
            var targetOfs = jQuery("#spammedhint").offset().top;
            jQuery("html,body").animate({scrollTop: targetOfs-20}, 500);
        });
    }
}
//-->
</script>

Die Frage der Existenz wird mit if (jQuery(theHash).length==0) abgefragt, da jQuery() immer ein Objekt zurückliefert und ein ansonsten naheliegendes if (jQuery(theHash)) immer wahr ist. Mit der letzten jQuery-Zeile wird dann innerhalb 500 ms zum Hinweisblock gescrollt (bzw. knapp drüber); mit einer ganz kurzen Zeit gab’s manchmal Probleme, weil das document irgendwie doch noch nicht ganz ready war und der Browser dann an eine andere Stelle zurücksprang. (Kann aber sein, dass das nur beim Neuladen einer Seite, wie man’s beim Testen nunmal macht, passiert.)

Ich habe diesen HTML/JS-Code direkt (und natürlich nicht in <?php ?> eingeschlossen) in die comments.php eingefügt (also nicht in die functions.php ausgelagert), und zwar direkt nach <?php if ('open' == $post->comment_status) : ?> und damit direkt vor die Ausgabe der Eingabefelder.

Auch hier sollte man die Klasse .caughtasspam dann natürlich noch in der style.css angemessen formatieren.

Nun hat auch diese Methode einen Nebeneffekt, der sowohl unerwünschterweise (aber wohl sehr selten) auftritt, wenn jemand irgendwoher einen falschen Link mit einer nicht existierenden bzw. unsinnigen Kommentarnummer hat, als auch erwünschterweise, wenn jemand den Link mit seinem erstmal durchgegangenen Kommentar gebookmarkt hat und dieser nachträglich in den Spameimer geworfen wird, denn dann wird dieser Hinweis auch ausgegeben.

Was es euch auch ermöglicht, diese Funktion einfach zu testen – ich habe hier einen Link für euch vorbereitet. :) Ihr könnt aber auch einen neuen Kommentar schreiben und dort „diesisteinspamtest“ einfügen, dieses Wortkonglomerat hab ich für ebendiesen Zweck auf die Blacklist gesetzt. Aber übertreibt’s nicht, ich muss die schließlich alle freischalten…

Wer kein Cache-Plugin verwendet, kann also die erste Lösung gut verwenden, andernfalls gilt es eben Vor- und Nachteile abzuwägen; ich habe mich wie gesagt für die JavaScript-Lösung entschieden.

Meinungen, Kritik, Anregungen, Probleme, Fragen…?

  1. wer ein fehlerhaftes Theme hat, das diese ID für die Kommentare nicht erzeugt und somit alle Kommentatoren nach dem Kommentieren am Seitenanfang landen, sollte das jetzt endlich auch reparieren… ↺