<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>thammer.info</title>
	<atom:link href="http://www.thammer.info/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.thammer.info</link>
	<description>tom&#039;s blog</description>
	<lastBuildDate>Wed, 15 Jul 2009 07:06:58 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Kleine Thumbnail-Datei</title>
		<link>http://www.thammer.info/?p=29</link>
		<comments>http://www.thammer.info/?p=29#comments</comments>
		<pubDate>Wed, 15 Jul 2009 07:03:53 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[Programmierung]]></category>

		<guid isPermaLink="false">http://www.thammer.info/?p=29</guid>
		<description><![CDATA[Um Bilder &#8220;on-the-fly&#8221; als Thumbnail zu erzeugen, habe ich mir eine Datei geschrieben, die als thumbnail.php statt der tatsächlichen JPEG-Bilddatei in den img-Tag des HTML-Codes geschrieben wird. 
Sieht dann zum Beispiel so aus: 
&#60;img src="thumbnail.php?path=images/bild.jpg&#038;height=80&#038;width=80&#038;q=70"&#62;
Der Aufruf erzeugt ein JPEG-Thumbnail mit 80 Pixel Höhe und Breite in 70% Qualität. Wird bei Höhe und Breite nur ein [...]]]></description>
			<content:encoded><![CDATA[<p>Um Bilder &#8220;on-the-fly&#8221; als Thumbnail zu erzeugen, habe ich mir eine Datei geschrieben, die als thumbnail.php statt der tatsächlichen JPEG-Bilddatei in den img-Tag des HTML-Codes geschrieben wird. </p>
<p>Sieht dann zum Beispiel so aus: </p>
<pre>&lt;img src="thumbnail.php?path=images/bild.jpg&#038;height=80&#038;width=80&#038;q=70"&gt;</pre>
<p>Der Aufruf erzeugt ein JPEG-Thumbnail mit 80 Pixel Höhe und Breite in 70% Qualität. Wird bei Höhe und Breite nur ein Wert angegeben, wird das Bild im gleichen Seitenverhältnis zum Original erzeugt.</p>
<p>Quelltext:</p>
<pre>
header("Content-type: image/jpeg");
header('Content-transfer-encoding: binary');

$Pfad = $_REQUEST["path"];
$Hoehe = 0;
$Hoehe = $_REQUEST["height"];
$Breite = 0;
$Breite = $_REQUEST["width"];
$Qual = $_REQUEST["Q"];

if (!$Qual)
    $Qual = 90;

$vpic = $Pfad;

if(!file_exists($vpic))
{
	$im = ImageCreate(1, 1);
	imagejpeg($im, '', 0);
	imagedestroy ($im);
	exit();
}

$imm = getimagesize ( $vpic );

if ($imm[0] > $Breite &#038;&#038; $Breite > 0)
    $z = $imm[0]/$Breite;
else
    $z = 1;

if ($imm[1]/$z > $Hoehe &#038;&#038; $Hoehe > 0)
    $z *= (($imm[1]/$z)/$Hoehe);

$NeueBreite = $imm[0]/$z;
$NeueHoehe =  $imm[1]/$z;

if($NeueBreite <= 1 || $NeueHoehe <= 1)
{
	$NeueBreite = $Breite;
	$NeueHoehe = $Hoehe;
}

$datei_array = split("/", urldecode($Pfad));
$datei = "";
for($i = 0; $i < sizeof($datei_array) - 1; $i++)
	$datei .= $datei_array[$i]."/";

$datei .= "thumb/";
if(!file_exists($datei))
{
	@mkdir($datei, 0777);
}

$dateiname = $datei_array[sizeof($datei_array) - 1];
$dateiname_array = explode(".", $dateiname);
$dateiname = "";
for($i = 0; $i < sizeof($dateiname_array) - 1; $i++)
	$dateiname .= $dateiname_array[$i] . ".";

$dateiname .= $NeueBreite . "_" . $NeueHoehe . ".jpg";

$datei .= $dateiname;

if(!file_exists($datei))
{
	$img = ImageCreateFromJPEG ( $vpic );
	if(!$img)
	{
		$im = ImageCreate(1, 1);
		imagejpeg($im, '', 0);
		imagedestroy ($im);
		exit();
	}

	imageinterlace($img, 1);
	$thumb = ImageCreateTrueColor($NeueBreite, $NeueHoehe);
	imageinterlace($thumb, 1);

	imagecopyresized ( $thumb, $img, 0, 0, 0, 0, $NeueBreite, $NeueHoehe, $imm[0], $imm[1] );

	if($NeueBreite >= 320)
	{
		$logopath = "./images/logo.png";
		$logosize = getimagesize($logopath);
		$logo = ImageCreateFromPNG($logopath);
		$logowidth = (int)($NeueBreite / 3);
		$logoheight = ($logowidth / $logosize[0]) * $logosize[1];

		imagecopyresampled($thumb, $logo, $NeueBreite - $logowidth, $NeueHoehe - $logoheight, 0, 0, $logowidth, $logoheight, $logosize[0], $logosize[1] ); 

		imagedestroy($logo);
	}

	imagejpeg($thumb, $datei, $Qual);
	imagejpeg($thumb, '', $Qual);

	imagedestroy ( $thumb );
	imagedestroy ( $img );
}
else
	readfile($datei);
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.thammer.info/?feed=rss2&amp;p=29</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Einrichtungsbeispiele.de &#8211; Eine Web 2.0-Community startet durch</title>
		<link>http://www.thammer.info/?p=27</link>
		<comments>http://www.thammer.info/?p=27#comments</comments>
		<pubDate>Wed, 15 Jul 2009 06:51:07 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[Einrichtungsbeispiele]]></category>

		<guid isPermaLink="false">http://www.thammer.info/?p=27</guid>
		<description><![CDATA[Die bei Aquarianern sehr beliebte Webseite www.einrichtungsbeispiele.de ist bereits seit April 2002 online und war damit ein Vorreiter des Mitmach-Internets, auch Web 2.0 genannt, als es diesen Begriff noch gar nicht gab. Im Gegensatz zu anderen Portalen steht hier nicht ein Forum, zum Austausch von Erfahrungen zur Verfügung, sondern die Vorstellung der eigenen Aquarien.
Mit Stolz [...]]]></description>
			<content:encoded><![CDATA[<p>Die bei Aquarianern sehr beliebte Webseite www.einrichtungsbeispiele.de ist bereits seit April 2002 online und war damit ein Vorreiter des Mitmach-Internets, auch Web 2.0 genannt, als es diesen Begriff noch gar nicht gab. Im Gegensatz zu anderen Portalen steht hier nicht ein Forum, zum Austausch von Erfahrungen zur Verfügung, sondern die Vorstellung der eigenen Aquarien.<br />
Mit Stolz zeigen hier erfahrene Zierfischhalter ihr perfekt eingerichtetes Becken neben den ersten Gehversuchen von begeisterten, aber oft Rat suchenden Neueinsteigern. Fast selbstverständlich entsteht so ein Austausch von Erfahrungen, Tipps und Tricks werden weiter gegeben oder auch Einrichtungsgegenstände oder eigene Nachzuchten getauscht.<br />
Dafür, dass der Spaß nicht zu kurz kommt, sorgen ein monatlicher Beckenwettbewerb, ein Chat, ein Forum, persönliche Blogs für alle User, Bildergalerien, Videoupload und zahlreiche weitere Angebote.<br />
Dass diese Angebote von inzwischen fast 10.000 Mitgliedern regelmäßig genutzt werden, zeigt sich auch in den nackten Zahlen: 4.337 Becken waren am 27.02.2009 online zu sehen. 27.295 Fotos konnten betrachtet werden und 422 Videos ermöglichen zusätzlich einen Einblick in die Unterwasserlandschaft in deutschen, österreichischen, schweizer, niederländischer und tschechischer Wohnzimmer.<br />
Tägliche Besucherzahlen zwischen 5.500 und 7.000 haben die Seite längst auch für Anbieter von aquaristischen Produkten zu einer beliebten Werbeplattform werden lassen. Zu günstigen Konditionen können Werbebanner geschaltet werden. Die Werbepakte sind so gestaffelt, dass vom Hobbyzüchter bis zum industriellen Hersteller, sämtliche Anbieter ein passendes Angebot für ihre Firmen- oder Produktwerbung finden können. Die Auslieferung der Werbebanner erfolgt für den Anbieter transparent über einen eigenen AdServer, was die Erfolgskontrolle durch vielfältige Auswertungen und Statistiken ermöglicht.<br />
Die Seite www.einrichtungsbeispiele.de basiert nicht auf einem vorgefertigten Contentmanagementsystem, sondern wurde komplett auf Basis von objektorientierten PHP, Ajax, Javascript und MySQL als Eigenentwicklung programmiert.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thammer.info/?feed=rss2&amp;p=27</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL-DB-Klasse (auch für PHP4)</title>
		<link>http://www.thammer.info/?p=21</link>
		<comments>http://www.thammer.info/?p=21#comments</comments>
		<pubDate>Tue, 14 Jul 2009 15:00:16 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[Programmierung]]></category>

		<guid isPermaLink="false">http://www.thammer.info/?p=21</guid>
		<description><![CDATA[Ein paar Codeschnipsel: diesmal eine kleine PHP-Klasse, die den Zugriff auf MySQL-Datenbanken wesentlich vereinfacht:
class CDB
{
    var $sql;
    var $erg;

    var $server;
    var $benutzer;
    var $passwort;
    var $db;
    var $verbindung;

    function CDB($server=null, [...]]]></description>
			<content:encoded><![CDATA[<p>Ein paar Codeschnipsel: diesmal eine kleine PHP-Klasse, die den Zugriff auf MySQL-Datenbanken wesentlich vereinfacht:</p>
<pre>class CDB
{
    var $sql;
    var $erg;

    var $server;
    var $benutzer;
    var $passwort;
    var $db;
    var $verbindung;

    function CDB($server=null, $benutzer=null, $passwort=null, $db=null)
    {
        $this-&gt;Init($server, $benutzer, $passwort, $db);
    }

    function Init($server=null, $benutzer=null, $passwort=null, $db=null)
    {
        if($server != null)
            $this-&gt;server = $server;
        else
            $this-&gt;server = "localhost";

        if($benutzer != null)
            $this-&gt;benutzer = $benutzer;
        else
            $this-&gt;benutzer = "DBUSER";

        if($passwort != null)
            $this-&gt;passwort = $passwort;
        else
            $this-&gt;passwort = "DBPASSWORD";

        if($db != null)
            $this-&gt;db = $db;
        else
            $this-&gt;db = "DBNAME";

        $this-&gt;erg = null;
        $this-&gt;sql = null;

        $this-&gt;verbindung = @mysql_connect($this-&gt;server, $this-&gt;benutzer, $this-&gt;passwort);
        mysql_select_db ($this-&gt;db, $this-&gt;verbindung);
    }

    function SetSQL($sql)
    {
        $this-&gt;sql = $sql;
    }

    function GetSQL()
    {
        return($this-&gt;sql);
    }

    function Query()
    {
        $this-&gt;FreeResult();

        if($this-&gt;IsConnectionValid() &amp;&amp; $this-&gt;IsQuerySet())
            $this-&gt;erg = mysql_query($this-&gt;sql, $this-&gt;verbindung);
        else
            $this-&gt;erg = null;
    }

    function SetSQLandQuery($sql)
    {
        $this-&gt;SetSQL($sql);
        $this-&gt;Query();

        return($this-&gt;GetResult());
    }

    function GetResult()
    {
        if($this-&gt;IsResultValid())
            return($this-&gt;erg);
        else
            return(null);
    }

    function GetResultObject()
    {
        if($this-&gt;IsResultValid())
            return(mysql_fetch_object($this-&gt;erg));
        else
            return(false);
    }

    function GetResultArray()
    {
        if($this-&gt;IsResultValid())
            return(mysql_fetch_array($this-&gt;erg, MYSQL_BOTH));
        else
            return(false);
    }

    function FreeResult()
    {
        if($this-&gt;IsResultValid())
            @mysql_free_result($this-&gt;erg);
    }

    function GetAffectedRows()
    {
        return(mysql_affected_rows());
    }

    function GetNumRows()
    {
        if($this-&gt;IsResultValid())
            return(mysql_num_rows($this-&gt;erg));
        else
            return(null);
    }

    function GetInsertID()
    {
        if($this-&gt;IsConnectionValid())
            return(mysql_insert_id($this-&gt;verbindung));
        else
            return(null);
    }

    function IsResultValid()
    {
        if($this-&gt;erg &amp;&amp; $this-&gt;erg != null)
            return(true);
        else
            return(false);
    }

    function IsConnectionValid()
    {
        if($this-&gt;verbindung &amp;&amp;  $this-&gt;verbindung != null)
            return(true);
        else
            return(false);
    }

    function IsQuerySet()
    {
        if($this-&gt;sql != null)
            return(true);
        else
            return(false);
    }

    function GetLastError()
    {
    	if($this-&gt;IsConnectionValid())
			return(mysql_error($this-&gt;verbindung));
		else
			return("");
	}
}</pre>
<p>Eingebunden ist das auch sehr schnell. Beispiel:</p>
<pre>$db = new CDB();
$sql = "select * from table";
if($db-&gt;SetSQLandQuery($sql))
{
	while($row = $db-&gt;GetResultObject())
	{
		...
	}
}</pre>
<p>Wenn die Einträge in der Init-Methode auf eine aktuelle DB-Konfiguration verweisen, muss im sonstigen Quellcode kein Connect oder eine andere DB-Operation durchgeführt werden. Objekt instanzieren, SQL reinschicken, abfragen. Sonst nichts.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thammer.info/?feed=rss2&amp;p=21</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ajax und wenn ja, dann mit XAjax</title>
		<link>http://www.thammer.info/?p=18</link>
		<comments>http://www.thammer.info/?p=18#comments</comments>
		<pubDate>Tue, 14 Jul 2009 12:01:48 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[Programmierung]]></category>

		<guid isPermaLink="false">http://www.thammer.info/?p=18</guid>
		<description><![CDATA[Begeistert war ich von Ajax von Anfang an. Spätestens als die ersten Artikel über den reloadlosen Datenaustausch Server-Client in diversen Fachzeitschriften aufgetaucht sind, habe ich die Technik an verschiedenen Stellen auf www.einrichtungsbeispiele.de eingebaut.
Problematisch allerdings der Aufwand, den ich bei jeder Seite betrieben habe: immer das Javascript zu Fuss oder Copy-Paste eingebaut. Getestet, Fehler gesucht, etc.
Die sympatische [...]]]></description>
			<content:encoded><![CDATA[<p>Begeistert war ich von Ajax von Anfang an. Spätestens als die ersten Artikel über den reloadlosen Datenaustausch Server-Client in diversen Fachzeitschriften aufgetaucht sind, habe ich die Technik an verschiedenen Stellen auf <a href="http://www.einrichtungsbeispiele.de">www.einrichtungsbeispiele.de</a> eingebaut.</p>
<p>Problematisch allerdings der Aufwand, den ich bei jeder Seite betrieben habe: immer das Javascript zu Fuss oder Copy-Paste eingebaut. Getestet, Fehler gesucht, etc.</p>
<p>Die sympatische Lösung: <a href="http://www.xajaxproject.org">www.xajaxproject.org</a>! Die Seite hält, was sie verspricht: &#8220;Learning xajax in 10 minutes&#8221;. Klappt wirktlich! Die in PHP geschriebenen serverseitigen Funktionen können einfach auf jeder Seite als Javascript-Aufrufe deklariert und benutzt werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thammer.info/?feed=rss2&amp;p=18</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wie vermarkte ich meine Webseite?</title>
		<link>http://www.thammer.info/?p=16</link>
		<comments>http://www.thammer.info/?p=16#comments</comments>
		<pubDate>Tue, 14 Jul 2009 11:54:02 +0000</pubDate>
		<dc:creator>tom</dc:creator>
				<category><![CDATA[Web-Marketing]]></category>

		<guid isPermaLink="false">http://www.thammer.info/?p=16</guid>
		<description><![CDATA[Als &#8221;Spielplatz&#8221; für meine Aktivitäten zur Internetvermarktung nutze ich schon seit Jahren die Seite www.einrichtungsbeispiele.de. Dort habe ich eine Aquarianer-Community programmiert und aufgebaut, die täglich von 4 &#8211; 5.000 Besuchern angesurft wird.
Man sollte also meinen, dass hier bereits ausreichend Vermarktungspotential besteht. Goldgräberillusionen vergehen aber sehr schnell, wenn man sich die nackten Ergebnisse ansieht.
Im Moment habe ich [...]]]></description>
			<content:encoded><![CDATA[<p>Als &#8221;Spielplatz&#8221; für meine Aktivitäten zur Internetvermarktung nutze ich schon seit Jahren die Seite <a href="http://www.einrichtungsbeispiele.de">www.einrichtungsbeispiele.de</a>. Dort habe ich eine Aquarianer-Community programmiert und aufgebaut, die täglich von 4 &#8211; 5.000 Besuchern angesurft wird.</p>
<p>Man sollte also meinen, dass hier bereits ausreichend Vermarktungspotential besteht. Goldgräberillusionen vergehen aber sehr schnell, wenn man sich die nackten Ergebnisse ansieht.</p>
<p>Im Moment habe ich als Restplatzvermarkter ValueClick (<a href="http://www.valueclickmedia.de">www.valueclickmedia.de</a>) im Einstatz, zusammen mit diversen Affiliateprogrammen (<a href="http://www.affili.net">www.affili.net</a> und <a href="http://www.zanox">www.zanox</a>) u.a. mit den Ebay-Relevance-Ads und dem direkten Verkauf von Werbeplätzen an Anbieter aus dem Aquaristikbereich hat sich ein Pool von Kampagnen herauskristiallisiert, der dafür sorgt, dass ich sich zumindest der Aufwand für Seite, was Servertechnik und Domainkosten angeht, getragen wird.</p>
<p>Welche Erfahrungen ich mit den verschiedenen Werbeformen und Vermarktern gemacht habe, werde ich in folgenden Blogs berichten.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thammer.info/?feed=rss2&amp;p=16</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
