<?xml version="1.0"?>
<?xml-stylesheet 
 href="http://www.w3.org/2000/08/w3c-synd/style.css" type="text/css"
?>
<rss version="0.91"><channel><title>phplogstars</title><link>http://www.phpblogstars.de</link><description>Alle wichtigen deutschsprachigen PHP-Blogs an einer Stelle</description><language>en</language><item><title>[Quicktip] Apache Ant sshexec Befehle per &amp;&amp; kombinieren - bytelude &#xBB; Coding</title><link>http://bytelude.de/2013/05/23/quicktip-apache-ant-sshexec-befehle-per-kombinieren/</link><pubDate>Thu, 23 May 2013 06:29:41 +0000</pubDate><description><![CDATA[<p>Wenn man in einem Apache Ant Build Script bei einem sshexec mehrere Befehle aneinanderreihen möchte, dann kann man nicht wie von Linux gewohnt mittels “&&” konkatinieren – Ant wirft dann einen Fehler, dass ein & nicht von einem & gefolgt werden darf. Die Lösung ist sehr banal:</p><pre><code>&lt;sshexec host=”${host.name}” trust=”true” username=”${user}” password=”${pw}” keyfile=”${optional.keypair}” command=”command1 &amp;&amp; command2  &amp; &amp; command3″/></code></pre><img
src="http://bytelude.de/?feed-stats-post-id=3578" width="1" height="1" style="display: none;" />]]></description></item><item><title>Treffen der PHP-UserGroup Erlangen-N&#xFC;rnberg - codenaschereien.de</title><link>http://www.codenaschereien.de/uncategorized/treffen-der-php-usergroup-erlangen-nurnberg-2/</link><pubDate>Fri, 17 May 2013 19:54:27 +0000</pubDate><description><![CDATA[<p>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 <a title="Coworkingspace Nürnberg" href="http://coworking-nuernberg.de/" target="_blank">Coworkingspace in Nürnberg</a>, statt. Das Thema wird diesmal das Serverkonfigurationstool Puppet sein.</p>]]></description></item><item><title>Gson &#x2013; google json library (Teil 2) - Phpmonkeys</title><link>http://www.phpmonkeys.de/2013/05/16/gson-google-json-library-teil-2/</link><pubDate>Thu, 16 May 2013 20:51:12 +0000</pubDate><description><![CDATA[<p>Im <a href="http://www.phpmonkeys.de/2013/04/15/gson-google-json-library-teil-1/" title="Gson – google json library (Teil 1)" target="_blank">ersten Teil zum Thema Gson</a> 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.<br />
<span id="more-2009"></span><br />
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:</p>
<pre class="brush: java; title: ; notranslate">
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;
    }
}
</pre>
<p>Der Enumerator stellt fasst verschiedene SocialMedia-Netzwerke zusammen und stellt Strings bereit, die im weiteren Code benutzt werden. Hat man nun einen <code>shortName</code> kann man auch das passende Enum erzeugen. </p>
<p>Nehmen wir nun an, dass wir folgendes Json-Fragment haben:</p>
<pre class="brush: jscript; title: ; notranslate">
{
    "id": "26565946",
    "network": "tw"
}
</pre>
<p>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:</p>
<pre class="brush: java; title: ; notranslate">
public class Identifier {
   private String id;
   private SocialMediaNetwork network;

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

   public SocialMediaNetwork getNetwork() {
      return this.network;
   }
}
</pre>
<p>Nach dieser Vorarbeit kommen wir zum eigentlichen Deserializer. Dieser wandelt den <code>network</code>-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:</p>
<pre class="brush: java; title: ; notranslate">
class SocialMediaNetworkDeserializer implements JsonDeserializer&lt;SocialMediaNetwork>{

    public SocialMediaNetwork deserialize(JsonElement json, Type type, JsonDeserializationContext jdc) throws JsonParseException {
        return SocialMediaNetwork.getEnumFromShortName(json.getAsString());
    }
    
}
</pre>
<p>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 <code>deserialize</code>-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 <code>String</code> in die statische Methode des <code>Enums</code>. Und erhalten schon unser Enum, oder wenn etwas schief geht den Fallback-Wert <code>UNKNOWN</code>.</p>]]></description></item><item><title>WordPress Kategorien &amp; Taxonomy Terms sortieren - der-webentwickler.net</title><link>http://feedproxy.google.com/~r/CodeReneDesign/~3/90ATNHFdijE/</link><pubDate>Wed, 15 May 2013 17:06:31 +0000</pubDate><description><![CDATA[<p>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:</p>
<p>- <strong><a href="http://www.nsp-code.com/wordpress-plugins/category-order-and-taxonomy-terms-order/" target="_blank">Plugin (Category Order and Taxonomy Terms Order)</a></strong></p>
<img src="http://feeds.feedburner.com/~r/CodeReneDesign/~4/90ATNHFdijE" height="1" width="1"/>]]></description></item><item><title>[Symfony2] Wie kann man bei einem Repository findAll eine Sortierung setzen? - bytelude &#xBB; Coding</title><link>http://bytelude.de/2013/05/13/symfony2-wie-kann-man-bei-einem-repository-findall-eine-sortierung-setzen/</link><pubDate>Mon, 13 May 2013 20:13:43 +0000</pubDate><description><![CDATA[<p>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:</p><p>Möchte man ein findAll umsetzen, sieht der Code so aus:</p><p><code><pre>$repository->findBy(array(), array('name' => 'asc'));</pre><p></code></p><p>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:</p><p><code><pre>$repository->findBy(array('active' => 1), array('name' => 'asc'));</pre><p></code></p> <img
src="http://bytelude.de/?feed-stats-post-id=3571" width="1" height="1" style="display: none;" />]]></description></item><item><title>Open Source Online Video Platform - Codejungle.org RSS Feed PHP</title><link>http://codejungle.org/site/Open+Source+Online+Video+Platform.html</link><pubDate>Wed, 08 May 2013 14:31:52 +0000</pubDate><description><![CDATA[<p>
	Hello World,</p>
<p>
	i proudly present one of my latest Open Source solutions.</p>
<p>
	 </p>
<p>
	<a href="http://video.codejungle.org"><img alt="" height="491" src="http://codejungle.org/upload/videostream.jpg" width="850" /></a></p>
<p>
	A Video Platform written in PHP:</p>
<p>
	Demo: <a href="http://video.codejungle.org">http://video.codejungle.org</a></p>
<p>
	Download: svn co svn://codejungle.org/videostream</p>
<p>
	Bug Tracker: <a href="http://codejungle.org/redmine/projects/videstream">http://codejungle.org/redmine/projects/videstream</a></p>
<p>
	 </p>
<p>
	Happy Hacking</p>
<p>
	Andreas</p>]]></description></item><item><title>Zig Wege, die eigene &#xF6;ffentliche IP Adresse herauszufinden - PHP Gangsta - Der PHP Blog mit Prax ...</title><link>http://www.phpgangsta.de/zig-wege-die-eigene-offentliche-ip-adresse-herauszufinden</link><pubDate>Mon, 06 May 2013 09:59:40 +0000</pubDate><description><![CDATA[<p><img class="alignright size-full wp-image-6179" style="border: 0px none;" alt="IP" src="http://www.phpgangsta.de/wp-content/uploads/ip.png" width="120" height="120" />Desö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.</p>
<p>Auf der Konsole geht das am schnellsten so:</p>
<pre class="brush: bash; title: ; notranslate">$ curl ifconfig.me
123.124.125.126</pre>
<p>Erweiterte Informationen erhält man mit:</p>
<pre class="brush: bash; title: ; notranslate">$ 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:</pre>
<p>Es ist auch möglich <a href="http://ifconfig.me/" target="_blank">mit einem Browser auf die Seite</a> zu gehen, dort erhält man dann Informationen was alles abfragbar ist.</p>
<p>Möchte man die eigene IPv6 Adresse wissen helfen diese Befehle:</p>
<p><span id="more-6159"></span></p>
<pre class="brush: bash; title: ; notranslate">$ curl icanhazip.com
2001:1608:xx:xx::31
$ curl v6.ident.me
2001:1608:xx:xx::31</pre>
<p>Einige weitere Möglichkeiten per Konsole:</p>
<pre class="brush: bash; title: ; notranslate">$ 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/&lt;.*$//'
123.124.125.126
 $ curl -s checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/&lt;.*$//'
123.124.125.126</pre>
<p>Weitere Möglichkeiten siehe <a href="http://api.ident.me/" target="_blank">http://api.ident.me</a> (JSON, XML…)</p>
<p>Webseiten mit Informationen zu eigenen IP-Adressen und weiteren Infos gibt es zuhauf:</p>
<p><a href="http://www.whatismyip.com/" target="_blank">http://www.whatismyip.com</a><br />
<a href="http://www.wieistmeineip.de/" target="_blank">http://www.wieistmeineip.de</a><br />
<a href="http://myipaddress.com/" target="_blank">http://myipaddress.com</a><br />
<a href="http://www.ipchicken.com/" target="_blank">http://www.ipchicken.com</a><br />
<a href="http://myip.dk/" target="_blank">http://myip.dk</a><br />
<a href="http://www.moanmyip.com/" target="_blank">http://www.moanmyip.com</a><br />
<a href="http://www.geobytes.com/IpLocator.htm" target="_blank">http://www.geobytes.com/IpLocator.htm</a><br />
<a href="http://www.wieistmeineip.eu/" target="_blank">http://www.wieistmeineip.eu</a><br />
<a href="http://www.speedreport.de/wie-ist-meine-ip/" target="_blank">http://www.speedreport.de/wie-ist-meine-ip</a></p>
<p>Einige davon zeigen auch direkt eine Karte an mit der ungefähren Position der IP-Adresse.</p>
<div class='yarpp-related-rss'>
<br/><br/><p>Ähnliche Artikel:</p><ol>
<li><a href='http://www.phpgangsta.de/wo-ungefahr-ist-eine-ip-adresse-beheimatet-geoip-in-php' rel='bookmark' title='Wo ungefähr ist eine IP Adresse beheimatet? GeoIP in PHP'>Wo ungefähr ist eine IP Adresse beheimatet? GeoIP in PHP</a></li>
<li><a href='http://www.phpgangsta.de/die-eigene-suchmaschine-in-php-leicht-gemacht-lucene' rel='bookmark' title='Die eigene Suchmaschine in PHP leicht gemacht: Lucene'>Die eigene Suchmaschine in PHP leicht gemacht: Lucene</a></li>
<li><a href='http://www.phpgangsta.de/linkpool-nummer-23' rel='bookmark' title='Linkpool Nummer 23'>Linkpool Nummer 23</a></li>
</ol>
</div>]]></description></item><item><title>Element vertikal und horizontal zentrieren mit jQuery - der-webentwickler.net</title><link>http://feedproxy.google.com/~r/CodeReneDesign/~3/ioa6FUyCslM/</link><pubDate>Thu, 02 May 2013 08:24:29 +0000</pubDate><description><![CDATA[<p>Möchte man ein Element vertikal und horizontal zentrieren, gibt es hiefür mehrere Möglichkeiten. Hier eine Lösung mit jQuery.</p>
<pre class="brush: jscript; title: ; notranslate">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();</pre>
<img src="http://feeds.feedburner.com/~r/CodeReneDesign/~4/ioa6FUyCslM" height="1" width="1"/>]]></description></item><item><title>Automatisches Backup f&#xFC;r All-Inkl Webspace - Tobias Zeising Website &#xBB; PHP</title><link>http://www.aditu.de/2013/05/01/automatisches-backup-fur-all-inkl-webspace/</link><pubDate>Wed, 01 May 2013 16:01:15 +0000</pubDate><description><![CDATA[<p>Seit vielen Jahren habe ich meine ganzen Webgeschichten bei <a title="All Inkl" href="http://www.all-inkl.com">All-Inkl</a> 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.</p><p>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.</p><p>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.</p><p>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 <a title="phpseclib" href="http://phpseclib.sourceforge.net/">phpseclib</a>. 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:</p><pre class="brush: php; title: ; notranslate">
&lt;?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');
?>
</pre><p>Über die phpseclib habe ich bereits an <a title="Einmalpasswörter mit PHP und phpseclib" href="http://www.aditu.de/2009/12/24/einmalpasswoerter-mit-php-und-openkubus/">anderer Stelle</a> schon einmal etwas geschrieben.</p><p>Nun aber zum Backup-Skript, dass wie folgt aussieht:</p><pre class="brush: php; title: ; notranslate">
&lt;?PHP

$sshUser = 'youruser';
$sshPassword = 'yourpass';
$sshHost = 'yourhost';
$base = "/www/htdocs/&lt;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"] . "&lt;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 . " -C / " . $dir . " " . $sql);
    if(strlen(trim($result))>0)
      </pre><p><i>Artikel gek: Lesen Sie den Rest <a href="http://www.aditu.de/2013/05/01/automatisches-backup-fur-all-inkl-webspace/">hier</a> (weitere 2123 Bytes)</i></p>]]></description></item><item><title>Einladung zum April-Treffen - PHPUG W&#xFC;rzburg</title><link>http://www.phpug-wuerzburg.de/2013/04/28/einladung-zum-april-treffen/</link><pubDate>Sun, 28 Apr 2013 14:45:14 +0000</pubDate><description><![CDATA[<p>Hallo alle zusammen!</p>
<p>Wir treffen uns am 30. April um 19 Uhr im</p>
<p>Café Klug<br />
Peterstraße 12<br />
97070 Würzburg</p>
<p>Parkplätze sind in der näheren Umgebung ausreichend vorhanden, Straßenbahn-Haltestelle: Neubaustraße.</p>
<p>Ich freue mich auf viele Teilnehmer und rege Diskussionen!</p>
<p>Viele Grüße<br />
Jason</p>]]></description></item></channel></rss>
