codenaschereien.deTreffen der PHP-UserGroup Erlangen-Nürnberg (17.5.2013, 19:54 UTC)

Hiermit lade ich wieder all meine Blogleser herzlich zum nächsten Treffen der PHP UserGroup Erlangen-Nürnberg ein. Es findet am Donnerstag, den  23.05.13, wie immer im Coworkingspace in Nürnberg, statt. Das Thema wird diesmal das Serverkonfigurationstool Puppet sein.

Link
PhpmonkeysGson – google json library (Teil 2) (16.5.2013, 20:51 UTC)

Im ersten Teil zum Thema Gson gab es ja bereits einen kurzen Überblick, wie man Gson grundsätzlich nutzt. Im heutigen zwiten Teil gehen wir einen Schritt weiter und schauen uns die Deserializer genauer an. Diese sind vor allem dann sehr interessant, wenn man eine Fremd-Rest-API nutzen möchte. Die Json Struktur und die daraus direkt resultierenden Java-Objekte können nämlich nicht der Vorstellung entsprechen, die man von einer schönen API hat.

Normalerweise wandelt Gson ein Json in die Objekte um, die ausgehend von der Eingangsklasse definiert sind. Dort findet man üblicherweise Objekte wie String, Integer, Boolean etc und natürlich auch weitere Java Klassen. Möchte man beispielsweise statt eines String ein Enumerator erhalten, so muss man Gson etwas unterstützen. Angenommen wir haben folgenden Enumerator:

public enum SocialMediaNetwork {
    
    TWITTER("tw", "twitter"), 
    GOOGLE_PLUS("gp","googleplus"),
    UNKNOWN("","");
    
    // network short name
    private final String shortName;
    
    // network long name
    private final String longName;

    private SocialMediaNetwork(String shortName, String longName) {
        this.shortName = shortName;
        this.longName = longName;
    }

    public String getShortName() {
        return shortName;
    }

   public String getLongName() {
        return longName;
    }
    
    public static SocialMediaNetwork getEnumFromShortName(String shortName) {
        for(SocialMediaNetwork network: SocialMediaNetwork.values()) {
            if (network.getShortName().equals(shortName)) {
                return network;
            }
        }
        
        return UNKNOWN;
    }
}

Der Enumerator stellt fasst verschiedene SocialMedia-Netzwerke zusammen und stellt Strings bereit, die im weiteren Code benutzt werden. Hat man nun einen shortName kann man auch das passende Enum erzeugen.

Nehmen wir nun an, dass wir folgendes Json-Fragment haben:

{
    "id": "26565946",
    "network": "tw"
}

Dieses Objekt hat eine id, die wir durch einen String repräsentieren können und ein network, dass normalerweise ebenfalls ein String ist. Wir wandeln aber das network-Attribut in ein SocialMediaNetwork Enum um. Zuerst werfen wir noch einen kurzen Blick auf das Java-Objekt:

public class Identifier {
   private String id;
   private SocialMediaNetwork network;

   public String getId() {
      return this.id;
   }

   public SocialMediaNetwork getNetwork() {
      return this.network;
   }
}

Nach dieser Vorarbeit kommen wir zum eigentlichen Deserializer. Dieser wandelt den network-String in unser Enum um. In weiser Voraussicht gibt es im Enum eine statische Methode, die man im Deserializer gleich nutzen kann und somit sieht der Code folgendermaßen aus:

class SocialMediaNetworkDeserializer implements JsonDeserializer<SocialMediaNetwork>{

    public SocialMediaNetwork deserialize(JsonElement json, Type type, JsonDeserializationContext jdc) throws JsonParseException {
        return SocialMediaNetwork.getEnumFromShortName(json.getAsString());
    }
    
}

Der Deserializer implementiert immer den JsonDeserializer. Dieser bekommt als Generic noch den Typ des Objekts mitgegeben, in welchen das vorliegende Json deserialisiert werden soll. Das entspricht dann eben dem Rückgabewert der deserialize-Methode. In dieser Methode müssen wir die Logik implementieren, die dazu notwendig ist das Json-Artefakt in ein Java-Objekt zu deserialisieren. Wir nehmen dazu das JsonElement und stecken dieses als String in die statische Methode des Enums. Und erhalten schon unser Enum, oder wenn etwas schief geht den Fallback-Wert UNKNOWN.

Link
der-webentwickler.netWordPress Kategorien & Taxonomy Terms sortieren (15.5.2013, 17:06 UTC)

Gibt man auf einer Seite mehrer Kategorien aus und wünscht eine bestimmte Reihenfolge dieser, kann man mit folgendem Plugin sehr einfach per Drag & Drop die Kategorien wie auch Taxonomy Terms ordnen:

- Plugin (Category Order and Taxonomy Terms Order)

Link
bytelude » Coding[Symfony2] Wie kann man bei einem Repository findAll eine Sortierung setzen? (13.5.2013, 20:13 UTC)

Mit den Magic Methoden der Symfony Repositories kann bekommt man automatisch Methoden wie findBy[Feldname] oder findAll bereitgestellt. Mit dabei ist jedoch keine direkte Möglichkeit, die Ergebnisse bereits zu sortieren. Über einen kleinen Trick geht aber auch das:

Möchte man ein findAll umsetzen, sieht der Code so aus:

$repository->findBy(array(), array('name' => 'asc'));

Jetzt werden alle Entities für dieses Repository geladen, jedoch erfolgt die entsprechende Query mit einem “ORDER BY name ASC”. Möchte man das findAll in eine spezifizierte Suche umwandeln, muss man das erste Array einfach mit dem gewünschten Feldnamen und dem zu suchenden Wert befüllen:

$repository->findBy(array('active' => 1), array('name' => 'asc'));

Link
Codejungle.org RSS Feed PHPOpen Source Online Video Platform (8.5.2013, 14:31 UTC)

Hello World,

i'm proudly present one of my latest Open Source solutions.

 

A Video Platform written in PHP:

Demo: http://video.codejungle.org

Download: svn co svn://codejungle.org/videostream

Bug Tracker: http://codejungle.org/redmine/projects/videstream

 

Happy Hacking

Andreas

Link
PHP Gangsta - Der PHP Blog mit Prax ...Zig Wege, die eigene öffentliche IP Adresse herauszufinden (6.5.2013, 09:59 UTC)

IPDesöfteren benötigt man mal die eigene öffentliche IP-Adresse, sei es um eine kurzfristige Firewall-Freischaltung zu bekommen, auf irgendeine Whitelist genommen zu werden oder um seine eigenen Logzeilen im access.log wiederzufinden. Wenn man nicht direkt mit dem Internet verbunden ist sondern mittels Router oder sonstwie geartetem Netzwerk helfen einem spezielle Webseiten und Dienste.

Auf der Konsole geht das am schnellsten so:

$ curl ifconfig.me
123.124.125.126

Erweiterte Informationen erhält man mit:

$ curl ifconfig.me/all
ip_addr: 123.124.125.126
remote_host: blfd-5dXXXX7a.pool.mediaWays.net
user_agent: curl/7.27.0
port: 58431
lang:
connection:
keep_alive:
encoding:
mime: */*
charset:
via:
forwarded:

Es ist auch möglich mit einem Browser auf die Seite zu gehen, dort erhält man dann Informationen was alles abfragbar ist.

Möchte man die eigene IPv6 Adresse wissen helfen diese Befehle:

$ curl icanhazip.com
2001:1608:xx:xx::31
$ curl v6.ident.me
2001:1608:xx:xx::31

Einige weitere Möglichkeiten per Konsole:

$ curl http://ipecho.net/plain;
123.124.125.126
$ wget -q -O - http://wgetip.com
123.124.125.126
$ curl v4.ident.me
123.124.125.126
 $ wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'
123.124.125.126
 $ curl -s checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'
123.124.125.126

Weitere Möglichkeiten siehe http://api.ident.me (JSON, XML…)

Webseiten mit Informationen zu eigenen IP-Adressen und weiteren Infos gibt es zuhauf:

http://www.whatismyip.com
http://www.wieistmeineip.de
http://myipaddress.com
http://www.ipchicken.com
http://myip.dk
http://www.moanmyip.com
http://www.geobytes.com/IpLocator.htm
http://www.wieistmeineip.eu
http://www.speedreport.de/wie-ist-meine-ip

Einige davon zeigen auch direkt eine Karte an mit der ungefähren Position der IP-Adresse.

Link
der-webentwickler.netElement vertikal und horizontal zentrieren mit jQuery (2.5.2013, 08:24 UTC)

Möchte man ein Element vertikal und horizontal zentrieren, gibt es hiefür mehrere Möglichkeiten. Hier eine Lösung mit jQuery.

jQuery.fn.centerFix = function () {
    this.css("position","absolute");
    this.css("top", ( $(window).height() - this.height() ) / 2+$(window).scrollTop() + "px");
    this.css("left", ( $(window).width() - this.width() ) / 2+$(window).scrollLeft() + "px");
    return this;
}

$('.div').centerFix();
Link
Tobis Blog » PHPAutomatisches Backup für All-Inkl Webspace (1.5.2013, 16:01 UTC)

Seit vielen Jahren habe ich meine ganzen Webgeschichten bei All-Inkl gehostet. Ich bin mit dem Anbieter ganz zufrieden. Die Server sind sehr zuverlässig, die Administrationsoberfläche ist durchdacht, der Support antwortet innerhalb von 15 Minuten und alle Funktionen und Extensions, die man so braucht, sind vorhanden. Eines fehlt aber: Eine einfache Möglichkeit Backups zu erstellen.

Mittlerweile hat sich so einiges bei meinem Webhoster angesammelt. Mein Anspruch ist es also, je nach Projekt ein Backup erstellen zu können. Sprich Verzeichnis XYZ und die dazugehörige MySQL Datenbank schön abgepackt als ZIP File, so dass ich die nur noch herunterladen und auf meinen Rechner archivieren muss. All-Inkl bietet zwar in ihren FAQs schon einige interessante Ansätze, aber entweder es betrifft nur den Backup einer MySQL Datenbank, oder man braucht gleich einen der Managed-Server Tarife.

Also habe ich selbst ein kleines Skript geschrieben, dass ein Backup erzeugt. Wichtig: Es funktioniert nur mit dem All-Inkl Premium Tarif, denn das Skript verwendet SSH und das gibt es erst ab den Premium Tarif. Eine Variante, bei der alleine mit PHP Bordmittel ein Backup durchgeführt wird, scheitert leider am begrenzten Speicher. All-Inkl gesteht PHP nur 64MB Arbeitsspeicher zu. Erstellt man also ein Backup für ein Verzeichnis und packt dieses in eine ZIP Datei, so ist bei 64MB Schluss und es kommt ein memory limit exceeded.

Nun aber zu meiner Lösung. Ich verwendet den SSH Zugang, führe damit ein mysqldump aus und packe alles mit tar in eine tar.gz Datei ein. Nachdem All-Inkl die SSH Extension von PHP nicht zur Verfügung stellt, verwende ich die phpseclib. Diese hervorragende Bibliothek rund um das Thema Verschlüsselung bietet einen rein PHP basierten SSH Client an. Die Verwendung des SSH Clients ist denkbar einfach:

<?php
include('Net/SSH2.php');

$ssh = new Net_SSH2('www.domain.tld');
if (!$ssh->login('username', 'password')) {
    exit('Login Failed');
}

echo $ssh->exec('pwd');
echo $ssh->exec('ls -la');
?>

Über die phpseclib habe ich bereits an anderer Stelle schon einmal etwas geschrieben.

Nun aber zum Backup-Skript, dass wie folgt aussieht:

<?PHP

$sshUser = 'youruser';
$sshPassword = 'yourpass';
$sshHost = 'yourhost';
$base = "/www/htdocs/<ftpuser>/";
$backupDir = "backup/";

$dbs = array(
    array(
        "name"   => "wordpress",
        "dbname" => "d1234567",
        "passwd" => "secret",
        "dir"    => "wordpress"
    ),
    array(
        "name"   => "website",
        "dbname" => "d321",
        "passwd" => "secret",
        "dir"    => "website/www"
    ),
    array(
        "name"   => "selfoss",
        "dir"    => "website/selfoss"
    ),
    array(
        "name"   => "database123",
        "dbname" => "d987324",
        "passwd" => "secret",
    )
);


// ssh connection
include('Net/SSH2.php');

$ssh = new Net_SSH2($sshHost);
if(!$ssh->login($sshUser, $sshPassword))
    die('ssh login failed');


$baseWithoutTrailingSlash = substr($base, 1);
foreach($dbs as $db) {
    echo $db["name"] . "<br />";
    ob_flush();

    // directory for backup
    $dir = "";
    if(isset($db["dir"]) && strlen(trim($db["dir"]))>0) {
        $dir = $baseWithoutTrailingSlash . $db["dir"];
    }

    // backup database
    $sql = "";
    if(isset($db["dbname"]) && strlen(trim($db["dbname"]))>0) {
        $db_name = $db["dbname"];
        $db_passwd = $db["passwd"];
        $sql_file = $db["name"] . "_" . date('Y.m.d') . ".sql";
        $sql = $baseWithoutTrailingSlash . $backupDir . $sql_file;
        echo $ssh->exec("mysqldump -u " . $db_name . " -p'" . $db_passwd . "' --allow-keywords --add-drop-table --complete-insert --quote-names " . $db_name . " > " . $base . $backupDir . $sql_file);
    }
    
    // generate tar.gz file
    $tar_file = $base . $backupDir . $db["name"] . "_" . date('Y.m.d') . ".tar.gz";
    $result = $ssh->exec("tar cfz " . $tar_file . &

Artikel gek: Lesen Sie den Rest hier (weitere 2235 Bytes)

Link
PHPUG WürzburgEinladung zum April-Treffen (28.4.2013, 14:45 UTC)

Hallo alle zusammen!

Wir treffen uns am 30. April um 19 Uhr im

Café Klug
Peterstraße 12
97070 Würzburg

Parkplätze sind in der näheren Umgebung ausreichend vorhanden, Straßenbahn-Haltestelle: Neubaustraße.

Ich freue mich auf viele Teilnehmer und rege Diskussionen!

Viele Grüße
Jason

Link
PHP Gangsta - Der PHP Blog mit Prax ...Vorsicht bei der basename() Funktion und Umlauten (25.4.2013, 05:43 UTC)

umlauteWieder ein sehr komischer Bug, diesmal in Zusammenhang mit der Funktion basename():

Die basename() Funktion wird dazu verwendet den letzten Namensteil eines Pfades zurückzugeben. Beispiele:

echo basename('/home/michael/datei.txt'); // -> datei.txt
echo basename('/home/michael/ordner'); // -> ordner
echo basename('/home/michael/ordner/'); // -> ordner

Funktioniert wunderbar. Auch mit Umlauten innerhalb eines Dateinamens kein Problem:

echo basename('/home/michael/trööööt.txt'); // -> trööööt.txt

Steht aber ein Umlaut am Anfang des Dateinamens, dann gibt basename() einen falschen Dateinamen zurück:

echo basename('/home/michael/öööhhh.txt'); // -> hhh.txt

Autsch! Warum funktioniert die Funktion mit Umlauten in der Mitte, aber nicht am Anfang des Dateinamens?

Einer der beiden Hinweise auf der Manual-Seite gibt die Lösung: basename beachtet die Spracheinstellungen (locale). Ich gucke also nach welche ich aktuell verwende:

var_dump(setlocale(LC_ALL, 0)); // -> string(1) "C"

Es kam zutage dass meine aktuelle Einstellung auf “C” stand. Stelle ich also die Locale mal mit Hilfe von setlocale() auf einen Mehrbytezeichensatz:

setlocale(LC_ALL, 'en_US.UTF8');

Auf der Konsole unter Linux kann man sich mit dem Befehl

locale -a

die installierten Locales anzeigen lassen. Es muss nur irgendein mehrbytefähiger Zeichensatz sein damit der Bug behoben ist, und en_US.UTF8 ist immer installiert im Gegensatz zu de_DE.UTF8

Und schon ist das Problem behoben, der Dateiname wird korrekt ausgegeben auch wenn ein oder mehrere Umlaute am Anfang stehen.

Link
LinksRSS 0.92   RDF 1.
RSS 2.0 Feed   RDF 1.
100% Planet PHP   PHP5 powered
PEAR powered  
Code wird von Planet-PHP zur Verfügung gestellt. Vielen Dank.