Mein privater Server wird, neben dem Hosting einiger Webseiten/Blogs, auch für den E-Mail-Empfang und -Versand genutzt. Bisher klappte das ziemlich gut und durch diverse Anti-Spam Maßnahmen, bin ich bisher weder im Spamordner meiner Empfänger gelandet, noch bekomme ich extrem viel Spam. Nun habe ich mich gewundert, dass eine Mail an einen Bekannten (***@yahoo.com) nicht zugestellt wurde, Begründung laut log:
postfix/smtp[30458]: 93DE398058A: to=< ***@yahoo.de>, relay=mx-eu.mail.am0.yahoodns.net[188.125.69.79]:25, delay=139000, delays=138999/0.07/0.43/0, dsn=4.7.1, status=deferred (host mx-eu.mail.am0.yahoodns.net[188.125.69.79] refused to talk to me: 421 4.7.1 [TS03] All messages from 178.238.228.114 will be permanently deferred; Retrying will NOT succeed. See http://postmaster.yahoo.com/errors/421-ts03.html)

mehr… »

Ich suchte eine Zeit lang nach einem Tool, um möglichst schnell und einfach einen kompletten Ordner mit Bildern darin auf eine maximale Seitenlänge (je nach Format: Höhe oder Breite) zu beschneiden und ein Wasserzeichen (in eine der Ecken oder mittig) daraufzulegen.
mehr… »

Ihr kennt das, ihr betreibt einen eigenen E-Mail-Server und bei jedem Einrichten eines Postfachs im E-Mail-Client eures Vertrauens, dürft ihr SMTP/IMAP Adresse, sowie SSL/TLS Einstellungen von Hand vornehmen, weil Thundebird diese Daten nicht automatisch ermitteln kann (bzw. es versucht, es aber meistens nicht stimmt, spätestens beim Format des Usernames).

Thunderbird bietet die Möglichkeit, unter der Domain “autoconfig.domain.de” eine XML Datei unter dem Pfad /mail/config-v1.1.xml, für genau diese Einstellungen anzulegen. Andere Mail-Client beachten diese Datei mittlerweile auch (fragt mich bitte nicht welche).

mehr… »

Was hat das zu bedeuten?

Wenn man sich auf der Konsole befindet, ruft man ein php-Skript entweder via “php ./filename.php” auf oder fügt in der ersten Zeile eine Interpreterdefinition ein: “#!/usr/bin/php”, danach beginnt das Skript, wie gewohnt, mit < ?php.
Wenn man die Datei nun ausführbar macht (chmod +x filename.php) kann man sie direkt via ./filename.php aufrufen, genau das ist es, was ich mit normalerweise mit cron-jobs mache.
mehr… »

An sich eine einfache Aufgabe, aber da ich immer wieder damit kollidiere und mich jedes mal neu reindenken darf (ja ich weiß, es gibt Libs dafür, aber diese sind nicht in jedem Projekt verfügbar), dachte ich mir, den Code jetzt einfach mal hier festzuhalten.

In diesem speziellen Fall, geht es darum, dass ein hochgeladen wird und die Seitenverhältnisse einer “Box” angepasst werden müssen.
Es gibt zwei Faktoren, die das ein wenig komplizieren.
1. Das Bild ist in Pixeln definiert, die Box in mm, die “einfache Variante” (maxWidth und maxHeight als Input) geht also nicht
2. Die “Box” darf weder breiter noch höher, nur schmaler oder flacher werden

$imageRatio = $imageWidth / $imageHeight; //pixel
$elementRatio = $element->getWidth() / $element->getHeight(); //mm
if ($imageRatio == $elementRatio) {
    continue;
} elseif (($imageRatio > 1 && $elementRatio > 1) || ($imageRatio < 1 && $elementRatio < 1)) {
    //landscape+landscape OR portrait+portrait
    if ($imageRatio > $elementRatio) {
        $newHeight = $element->getWidth() / $imageRatio;
    } else {
        $newWidth = $element->getHeight() * $imageRatio;
    }
} elseif ($imageRatio >= 1 && $elementRatio <= 1) {
    //landscape/square + portrait/square
    $newHeight = $element->getWidth() / $imageRatio;
} elseif ($imageRatio <= 1 && $elementRatio >= 1) {
    //portrait/square + landscape/square
    $newWidth = $element->getHeight() * $imageRatio;
}
$element->setWidth($newWidth);
$element->setHeight($newHeight);

PHP hates me Autor Nils nimmt am Developers-Shame-Day 2010 teil und ich dachte mir, ich suche auch mal in den Untiefen meines alten Codes nach einem Schmuckstück. Ursprünglich kam die Idee zum DevShameDay von “Cem, dem PHP-Hacker”.
Leider ging in den Jahren einiges verloren, aber ich denke, dass hier ist schlecht genug, um sich dafür zu schämen.

Ich Schätze das ist um 2004 entstanden und lieferte Termine bzw. Events von einem bestimmten Tag, das ganze für einen Webkalender ala Google-Calendar. Was ich noch erwähnen sollte…. die Funktion wurde für jeden sichtbaren Kalendertag aufgerufen!

 function getevents($year,$month,$day){
   global $SELF;
   $month = (strlen($month) < 2) ? '0'.$month : $month;
   $day = (strlen($day) < 2) ? '0'.$day : $day;
   $str = "$year-$month-$day";
   $strx = "$month-$day";
   $sql = "
           SELECT e.name as ename,
                                                e.description as edescr,
                                                e.id as eid,
                                                t.color as tcolor,
                                                e.time_start as time_start,
                                                e.time_end as time_end,
                                                e.remember as rem,
                                        e.date_start as date_start,
                                                e.date_end as date_end,
                                                t.description as tdescription,
                                                t.showtime as showtime
           FROM cal_entry e, cal_types t
           WHERE e.types_id = t.id
             AND (e.date_start <= '$str'
                           AND ( e.date_end >= '$str' AND e.date_end IS NOT NULL OR e.date_start = '$str' AND e.date_end IS NULL )
         OR(t.id = 1 AND right(e.date_start,5) = '$strx')
                         )
                        ORDER BY e.time_start, t.prio
         ";
   $res = mysql_query($sql);
   $out = "<u><a href=\"$SELF?show=new&date=$year-$month-$day\">$day.$month.</a></u>";
   while($row = mysql_fetch_array($res)){
     $tmp = "<a href=\"$SELF?show=edit&eid=".$row["eid"]."&ym=$year-$month\">";
 
                 $tmp .= "<font class=\"entry\" color=\"".$row["tcolor"]."\"><li>";
                 $tmp .= $row["ename"];
                 $starta = explode("-",$row["date_start"]);
                 $outstart = $starta[2].".".$starta[1].".".$starta[0];
                 $enda = explode("-",$row["date_end"]);
                 $outend = $enda[2].".".$enda[1].".".$enda[0];
                 $divbody = "<table border=0 class=entry><tr>";
                 if($row["date_end"] != '' && $row["date_start"] != $row["date_end"]){
                   $divbody .= "<td>Von:</td><td>$outstart</td></tr><tr><td>Bis:</td><td>$outend</td></tr>";
                 }else{
                   $divbody .= "<td>Am:</td><td>$outstart</td></tr>";
                 }
                 if($row["showtime"]) {
                     if(($row["date_end"] == $row["date_start"] || $row["date_end"] == '') && $row["time_end"] != ''){
                       $divbody .= "<tr><td>Von:</td><td>".$row["time_start"]." Uhr</td></tr>";
                             $divbody .= "<tr><td>Bis:</td><td>".$row["time_end"]." Uhr</td></tr>";
                     }elseif($row["date_start"] < $row["date_end"] && $row["date_start"] == $str && $row["time_start"] != ''){
                           $divbody .= "<tr><td>Ab:</td><td>".$row["time_start"]." Uhr</td></tr>";
                     }elseif($row["date_start"] < $row["date_end"] && $row["date_end"] == $str && $row["time_end"] != ''){
                       $divbody .= "<tr><td>Bis:</td><td>".$row["time_end"]." Uhr</td></tr>";
                     }elseif(($row["date_end"] == $row["date_start"] || $row["date_end"] == '') && $row["time_end"] == ''){
                       $divbody .= "<tr><td>Ab:</td><td>".$row["time_start"]." Uhr</td></tr>";
                     }
                 }
                 $rem = ($row["rem"] == true) ? "<font color=green>EMail Erinnerung aktiv</font>" : "<font color=red>EMail Erinnerung inaktiv</font>";
                 $divbody .= "</table>";
                 #$div = "<div title=\"header=[".$row["ename"]."] body=[".$row["edescr"].$divbody"]\">";
                 $div = '<div title="header=['.$row["ename"].'] body=['.nl2br($row["edescr"]).$divbody.$rem.']">';
                 $tmp .= "</div></li></font></a>";
                 $out .= $div.$tmp;
         }
 
   return $out;
 }

Ich stand vor kurzem vor dem Problem, das alle Subdomains, die ein Benutzer eingeben könnte, auf www.example.com umleiten sollten.

Aus Googlesicht ist das gut, weil so doppelter Inhalt vermieden wird und für den Benutzer ist es einfach schöner.

Im Internet habe ich einige Beispiele gefunden, wie man www.example.com auf example.com und umgekehrt umleitet, aber keine generelle Lösung. Die Hostdefinition matcht *example.com und *.example.de, weitere sind ohne weiteres möglich.

mehr… »

Mal wieder auf der Suche nach einer sinnvollen HTML2PDF Lösung, bin ich auf wkhtmltopdf gestoßen.

Das Tool nutzt Webkit im internen Backend und kann sogar CSS3 rendern. Die Installation unter MaxOSX und Linux ist absolut simpel: runterladen, ablegen, fertig. Unter Windows wird hier noch ein Installationsprozess durchgeführt, über den ich aktuell leider nichts sagen kann (bisher nicht getestet).

Um das Tool auf einer Webseite zu nutzen, habe ich mir ne kleine Klasse geschrieben, die HTML-Code als Input akzeptiert und mir den Pfad der fertigen PDF-Datei zurückliefert.

mehr… »

Eigentlich war ich ziemlich begeistert, vom DateTime Objekt. Endlich richtig einfach mit Daten umgehen und das auch noch inkl Zeitzonen etc.
Seitdem ich allerdings mit einem Kollegen einen wirklich “krassen” Bug fand, bin ich nicht mehr so begeistert!

Reproduzierbar ist er folgendermaßen:
mehr… »

PHP bietet das Iterator Interface an, um Objekte direkt via foreach zu iterieren.

class MyClass implements Interator {
  private $array;
}
 
$obj = new MyClass();
foreach($obj as $key => $val){
  ...
}

mehr… »

Network-wide options by YD - Freelance Wordpress Developer