<?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>davidsCorner.de</title>
	<atom:link href="http://davidscorner.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://davidscorner.de</link>
	<description>Ein Blog über PHP, Webentwicklung und Web 2.0, Mathematik, Fotografie und Essen</description>
	<lastBuildDate>Sat, 14 Aug 2010 17:55:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Traffic Monitoring mit vnstat</title>
		<link>http://davidscorner.de/2010/03/traffic-monitoring-mit-vnstat/</link>
		<comments>http://davidscorner.de/2010/03/traffic-monitoring-mit-vnstat/#comments</comments>
		<pubDate>Mon, 15 Mar 2010 18:05:36 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Server administration]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://davidscorner.de/?p=384</guid>
		<description><![CDATA[Viele Internetnutzer haben mittlerweile eine Trafficfla [...]]]></description>
			<content:encoded><![CDATA[<p>Viele Internetnutzer haben mittlerweile eine <strong>Trafficflatrate</strong> und müssen sich über das verbauchte Transfervolumen keine Gedanken machen, aber im Wohnheim, bei Servern oder UMTS Verträgen sind Trafficbeschränkungen noch gang und gäbe. Da ich gern informiert sein wollte, wie viel <strong>Traffic</strong> mein <strong>Server</strong> verbraucht habe ich mir <a href="http://humdi.net/vnstat/"><strong>vnstat</strong></a> installiert.</p>
<p>Unter Ubuntu kann man vnstat einfach mit dem Paketmanager installieren. Danach muss man das <strong>Netzwerkinterface</strong>, welches überwacht werden soll, hinzufügen.</p>
<pre>sudo apt-get install vnstat
sudo vnstat -u -i
</pre>
<p>Von nun an Zeichnet <strong>vnstat</strong> auf, wie viel <strong>Traffic</strong> über die angegebene Schnittstelle verschickt oder empfangen wird. Etwas später kann man sich dann den verbrauchten <strong>Traffic</strong> anzeigen lassen:</p>
<pre>david@ubuntu-server:~$ vnstat
Database updated: Mon Mar 15 18:50:01 2010

	eth0

	   received:       1.09 GB (68.7%)
	transmitted:     507.82 MB (31.3%)
	      total:       1.58 GB

	                rx     |     tx     |  total
	-----------------------+------------+-----------
	yesterday     16.37 MB |   74.81 MB |   91.19 MB
	    today      4.15 MB |   49.71 MB |   53.86 MB
	-----------------------+------------+-----------
	estimated         5 MB |      62 MB |      67 MB
</pre>
<p>Mit den Optionen &#8211;months &#8211;days &#8211;hours kann man sich dann die jeweiligen Zusammenfassungen anzeigen lassen.</p>
<p>Da ich gern eine tägliche Zusammenfassung per Mail haben wollte, habe ich mir noch ein Shellscript geschrieben, welches mir täglich eine Übersicht des verbrauchten Traffics schickt. So hat man mit <strong>vnstat</strong> ein einfaches, aber ausreichendes <strong>Traffic Monitoring</strong> installiert. Zusätzlich könnte man sich noch das <a href="http://www.sqweek.com/sqweek/index.php?p=1">vnstat PHP frontend</a> installieren.</p>
<div align="left" style="float:left;padding:0px 20px 0px 0px;"><a name="fb_share" type="button" share_url="http://davidscorner.de/2010/03/traffic-monitoring-mit-vnstat/"></a></div>]]></content:encoded>
			<wfw:commentRss>http://davidscorner.de/2010/03/traffic-monitoring-mit-vnstat/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Einstieg in GIT? Warum?</title>
		<link>http://davidscorner.de/2010/03/einstieg-in-git-warum/</link>
		<comments>http://davidscorner.de/2010/03/einstieg-in-git-warum/#comments</comments>
		<pubDate>Thu, 11 Mar 2010 13:48:06 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[GIT]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Versionsverwaltung]]></category>

		<guid isPermaLink="false">http://davidscorner.de/?p=358</guid>
		<description><![CDATA[In der Webentwicklung ist der Umstieg auf GIT ein echte [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://git-scm.com/"><img class="alignleft size-full wp-image-377" style="float: left; margin: 5px; border: 0px;" title="71px-Git-logo.svg" src="http://davidscorner.de/wp-content/uploads/2010/03/71px-Git-logo.svg_.png" alt="" width="130" /></a>In der Webentwicklung ist der Umstieg auf <strong>GIT</strong> ein echter Trend. Vor einem Monat gab Fabien Potencier den <a href="http://bakery.cakephp.org/articles/view/changes-in-cakephp-and-new-plugins">Wechsel von svn zu GIT</a> in der Entwicklung der neuen Symfony Version bekannt, <a href="http://bakery.cakephp.org/articles/view/changes-in-cakephp-and-new-plugins">CakePHP hat den Wechsel</a> genauso wie <a href="http://www.phpbb.com/community/viewtopic.php?f=14&amp;t=2015905">phpBB</a> schon vor einer ganzen Weile gemacht. Als Weitere wären da auch noch PHPUnit oder RubyOnRails. Dieser Trend hat natürlich auch mich interessiert, weshalb ich mein neues Projekt gleich mit GIT aufgesetzt habe. Am Anfang braucht man natürlich etwas Starthilfe, weil GIT vom Ansatz her anders als Subversion ist, aber diese Hilfe findet man <a href="http://www.kernel.org/pub/software/scm/git/docs/everyday.html">in</a> <a href="http://git.or.cz/course/svn.html">den</a> <a href="http://progit.org/">zahlreichen</a> <a href="http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html">Tutorials</a> <a href="http://www.spheredev.org/wiki/Git_for_the_lazy">schnell</a>.</p>
<h3>Warum nutze ich GIT:</h3>
<ul style="margin-left: 0px;">
<li><strong>Die Geschwindigkeit:<br />
</strong>Da das gesamte Repository lokal gespeichert ist, sind die üblichen Arbeitsschritte wesentlich schneller als bei vielen anderen Versionsverwaltungen.</li>
<li><strong>Offline Arbeiten</strong><br />
Durch das lokale Repository kann man wunderbar Offline arbeiten. Wenn man dann später wieder online ist, kann man alle Änderungen einfach in  ein anderes Repository schieben.</li>
<li><strong>Einfaches Taggen und Branching</strong><br />
Natürlich gibt es auch bei GIT Konflikte, aber das Erstellen von Branchs und Tags ist SEHR einfach.</li>
<li><strong>Jedes Repository ist ein Backup</strong><br />
Mit GIT macht man keinen Checkout eines neuen Repositories sondern ein Clone, so hat man mit jedem neuen Repository ein komplettes Backup/eine komplette Kopie des Repositories. Bei einem Ausfall des &#8220;Hauptrepositories&#8221; kann man so sehr schnell auf ein anderes Repository umstellen.</li>
<li><strong>Commits einfach Vorbereiten</strong><br />
Git hat eine sogenannte Staging Area der man alle Änderungen für den nächsten Commit hinzufügen kann, wenn man nicht alle Dateien oder einzelne Datei Commiten möchte.</li>
</ul>
<p>Weitere Gründe findet man <a href="http://whygitisbetterthanx.com/">hier</a>.</p>
<h3>Erste Schritte mit GIT:</h3>
<p>Nun zu meinem kleinen Tutorial</p>
<h4>Installation:</h4>
<p>Unter Linux reicht es das Paket &#8220;git-core&#8221; zu installieren. Für Mac OS gibt es <a href="http://code.google.com/p/git-osx-installer/">hier</a> einen Installer und für Windows <a href="http://code.google.com/p/msysgit">hier</a>.</p>
<h4>Einstellungen:</h4>
<p>Als erstes muss man seinen Namen und die Emailadresse einstellen:</p>
<pre>git config --global user.name "&lt;Benutzername&gt;"
git config --global user.email "&lt;Email&gt;"
</pre>
<h4>Erstes Repository:</h4>
<p>Nachdem wir uns mit GIT bekannt gemacht haben, können wir unser erstes Repository erstellen. Ich nehme einfach ein vorhandenes Projekt und führe <strong>git init</strong> aus:</p>
<pre>david@ubuntu-server:~$ cd /home/david/project/
david@ubuntu-server:~/project$ git init
Initialized empty Git repository in /home/david/project/.git/
</pre>
<p>Jetzt fügt man einfach alle Dateien hinzu und macht den ersten <strong>commit</strong>.</p>
<pre>david@ubuntu-server:~/project$ git add .
david@ubuntu-server:~/project$ git commit -m "initial commit"
[master (root-commit) 25c342d] initial commit
 5234 files changed, 502420 insertions(+), 0 deletions(-)
 create mode 100644 Readme
 create mode 100644 apps/admin/config/adminConfiguration.class.php
 create mode 100644 apps/admin/config/app.yml
...
</pre>
<p>Jetzt ändern wir etwas und zeigen an, was die Unterschiede sind:</p>
<pre>david@ubuntu-server:~/project$ vim Readme
david@ubuntu-server:~/project$ git status
# On branch master
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#	modified:   Readme
#
no changes added to commit (use "git add" and/or "git commit -a")
david@ubuntu-server:~/project$ git diff Readme
diff --git a/Readme b/Readme
index a40145f..5c72d5b 100644
--- a/Readme
+++ b/Readme
@@ -1 +1,2 @@
+
 A Readme TestFile
david@ubuntu-server:~/project$ git commit -m "Readme File" Readme
[master 15563d6] Readme File
 1 files changed, 1 insertions(+), 0 deletions(-)
</pre>
<p>Mit <strong>git status</strong> sieht man also die geänderten Dateien, mit <strong>git diff</strong> die Unterschiede und mit <strong>git commit</strong> commitet man die Änderungen. Da GIT keine Dateien sondern Inhalte verwaltet muss man jede Änderung vor einem Commit hinzufügen, sowohl bei neuen Dateien als auch von bereits verwalteten Dateien.</p>
<p>Wie geht es nun weiter? Git kann natürlich noch viel mehr als nur commits und Unterschiede anzeigen. Viele weitergehende Informationen findet ihr im opensource Buch &#8220;<a href="http://progit.org/book/">Pro GIT</a>&#8221; oder in folgenden Tutorials auf meinem Blog.</p>
<div align="left" style="float:left;padding:0px 20px 0px 0px;"><a name="fb_share" type="button" share_url="http://davidscorner.de/2010/03/einstieg-in-git-warum/"></a></div>]]></content:encoded>
			<wfw:commentRss>http://davidscorner.de/2010/03/einstieg-in-git-warum/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ein Blick auf Doctrine Core Behaviors</title>
		<link>http://davidscorner.de/2010/03/ein-blick-auf-doctrine-core-behaviors/</link>
		<comments>http://davidscorner.de/2010/03/ein-blick-auf-doctrine-core-behaviors/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 11:27:14 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Doctrine]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[Webentwicklung]]></category>

		<guid isPermaLink="false">http://davidscorner.de/?p=348</guid>
		<description><![CDATA[Beim Planen einer Datenbank/des Modells für eine Inter [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.doctrine-project.org/"><img class="alignleft size-full wp-image-353" title="Doctrine_logo_white" src="http://davidscorner.de/wp-content/uploads/2010/03/Doctrine_logo_white.png" alt="" width="191" height="53" style="float: left; margin:5px;"/></a>Beim Planen einer Datenbank/des Modells für eine Internetseite trifft man immer wieder auf Objekte (aus dem Modell) mit <strong>Gemeinsamen Eigenschaften/Verhalten</strong>. Plant man einen Blog hat man zum Beispiel ein Klasse für Artikel und eine für Kommentare, beide verfügen wahrscheinlich über Attribute wie created_at und updated_at. Für solche Gemeinsamen Eigenschaften gibt es in <strong>Doctrine</strong> so genannte <strong>Templates/Behaviors.</strong> Ich möchte hier nicht erklären wie man Templates selbst schreibt, sondern viel mehr zeigen welche <a href="http://www.doctrine-project.org/documentation/manual/1_2/en/behaviors#core-behaviors">Core Behaviors</a> Doctrine bereitstellt.</p>
<p>Das einfachste Verhalten ist wohl das <strong><a href="http://www.doctrine-project.org/documentation/manual/1_2/en/behaviors#core-behaviors:timestampable">Timestampable</a></strong> Behavior. Stellt man dieses Verhalten in seiner schema.yml ein</p>
<pre>article:
  actAs:
    Timestampable:
</pre>
<p>wird automatisch ein Feld created_at und updated_at erstellt. Wenn man nun ein Artikel erstellt speichert <strong>Doctrine automatisch</strong> das Erstellungsdatum, so wie das Datum der letzten Änderung. Mit weiteren Einstellungen kann man den Namen der Felder verändern, die Speicherung ausschalten oder das Format bestimmen.</p>
<p>Ein weiteres Verhalten ist das <strong><a href="http://www.doctrine-project.org/documentation/manual/1_2/en/behaviors#core-behaviors:versionable">Versionable</a></strong> Behavior. Mit Hilfe dieses Templates kann man zum Beispiel eine einfache Versionierung seiner Blogartikel umsetzen. Hierfür passen wir den actAs Bereich unserer schema.yml wie folgt an:</p>
<pre>article:
  actAs:
    Timestampable:
    Versionable:
      versionColumn: version
      className: %CLASS%Version
</pre>
<p>Nun erstellt Doctrine eine neue Tabelle namens article_Version. Wenn man nun einen Artikel ändert, wird das alte Artikel-Objekt in der Tabelle article_Version abgespeichert und mit einer Versionsnummer versehen. In der Anwendung kann man dann einfach auf ältere Versionen zugreifen.</p>
<p>Für unsere Blogartikel wären außerdem noch Suchmaschinen optimierte und vom Menschen lesbare URLs interessant. Dafür brauchen wir eine eindeutige Überschrift, was man aber nicht immer hat. Auch hierfür gibt es ein Behavior namens <strong><a href="http://www.doctrine-project.org/documentation/manual/1_2/en/behaviors#core-behaviors:sluggable">Sluggable</a></strong>. Sluggable erstellt aus zuvor angegebenen Feldern eindeutige Slugs (hängt notfalls Zahlen an das Ende und ersetzt Leerzeichen mit Bindestrichen) und speichert diese ab. Diese Slugs kann man dann als eindeutige Identifizierung für die Blogartikel benutzen. Wir passen also wieder unsere schema.yml an:</p>
<pre>article:
  actAs:
    Timestampable:
    Versionable:
      versionColumn: version
      className: %CLASS%Version
    Sluggable:
      fields: [title]
</pre>
<p>Auch hier legt Doctrine ein neues Feld namens Slug an und speichert dort eine Eindeutige Zeichenkette ab. Natürlich gibt es auch hier noch weitere Konfigurationsmöglichkeiten.</p>
<p>Nun möchten wir unsere Blogartikel noch einfach durchsuchbar machen, ohne weitere Bibliotheken wie Apache Lucene bzw Zend Lucene zu nutzen. Auch hierfür gibt es wieder ein Verhalten namens <strong><a href="http://www.doctrine-project.org/documentation/manual/1_2/en/searching">Searchable</a></strong>. Also passen wir wieder unsere schema.yml an:</p>
<pre>article:
  actAs:
    Timestampable:
    Versionable:
      versionColumn: version
      className: %CLASS%Version
    Sluggable:
      fields: [title]
    Searchable:
      fields: [title, article]
</pre>
<p>Nun legt Doctrine eine Tabelle article_index an und speichert dort ausgewählte Keywords ab. Indiziert werden hier Wörter die im title oder article Feld häufig vorkommen. Später kann man dann mit dem ArticleTable Objekt nach einem Eintrag suche. Dieses Behaviors bietet noch viele weitere <a href="http://www.doctrine-project.org/documentation/manual/1_2/en/searching">Konfiguartions- bzw Anpassungsmöglichkeiten</a>.</p>
<p>Es gibt noch ein paar weitere Core Behaviors, wie I18n, NestedSet, Geographical oder SoftDelete, welche sehr individuell konfiguriert werden könne. Auch die hier gezeigten Behaviors verfügen noch über viele weitere Einstellungsmöglichkeiten, welche man in der <a href="http://www.doctrine-project.org/documentation/manual/1_2/en/behaviors#core-behaviors">Doctrine Documentation</a> nachlesen kann.</p>
<p>Durch den Einsatz dieser Templates kan man beim Erstellen des DB-Layouts  und beim Arbeiten mit dem DatenObjekten viel Zeit sparen, da ein Großteil der Arbeit von Doctrin automatisch gemacht wird.</p>
<div align="left" style="float:left;padding:0px 20px 0px 0px;"><a name="fb_share" type="button" share_url="http://davidscorner.de/2010/03/ein-blick-auf-doctrine-core-behaviors/"></a></div>]]></content:encoded>
			<wfw:commentRss>http://davidscorner.de/2010/03/ein-blick-auf-doctrine-core-behaviors/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Serverumzug fast fertig</title>
		<link>http://davidscorner.de/2010/03/serverumzug-fast-fertig/</link>
		<comments>http://davidscorner.de/2010/03/serverumzug-fast-fertig/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 14:06:55 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Server administration]]></category>
		<category><![CDATA[Webentwicklung]]></category>

		<guid isPermaLink="false">http://davidscorner.de/?p=337</guid>
		<description><![CDATA[In letzter Zeit habe ich wenig von mir hören lassen. D [...]]]></description>
			<content:encoded><![CDATA[<p>In letzter Zeit habe ich wenig von mir hören lassen. Diese Zeit habe ich für meinen Serverumzug genutzt.</p>
<p>Meinen alten Server hatte ich gekündigt und einen Neuen bei <a href="http://www.hosteurope.de/">HostEurope</a> bestellt. Dort habe ich nun einen virtuellen Linux Server und ein extra Webpack für meine Emailaccounts. Meine Internetseiten laufen also auf dem Vserver und meine Mails auf einem von HostEurope verwalteten Mailserver (bleibt mir als viel Konfigurationsaufwand erspart). Ich hoffe mit dieser Wahl bleibt mir ein neuer Serverwechsel erst einmal erspart, zumindest bis jetzt bin ich sehr zufrieden mit dem Wechsel.</p>
<p>Da ich derzeit wenig Zeit habe selbst Artikel zu schreiben, versorge ich euch einfach mit ein paar interessanten Links zu anderen Blogs:</p>
<p>Zum einen wäre da der Artikel <a href="http://www.phpgangsta.de/dateidownload-via-php-mit-speedlimit-und-resume">&#8220;Dateidownload via PHP mit Speedlimit und Resume&#8221;</a> auf phpgangsta.de oder die <a href="http://www.slideshare.net/chacon/git-101-presentation">GIT 101 Präsentation</a> von Scott Chacon.<br />
Außerdem war ich auf der Suche nach einem Online Quelltext Editor, welcher Syntax Highlighting für verschiedene Sprachen kann. Gefunden habe ich <a href="http://www.cdolivet.com/index.php?page=editArea">EditArea</a>.</p>
<p>Und last but not least gab es eine neues <a href="http://www.php.net/archive/2010.php#id2010-03-04-1">PHP Update</a> und ein neues <a href="http://www.symfony-project.org/blog/2010/02/25/security-release-1-2-12-1-3-3-and-1-4-3">Symfony Update</a>.</p>
<div align="left" style="float:left;padding:0px 20px 0px 0px;"><a name="fb_share" type="button" share_url="http://davidscorner.de/2010/03/serverumzug-fast-fertig/"></a></div>]]></content:encoded>
			<wfw:commentRss>http://davidscorner.de/2010/03/serverumzug-fast-fertig/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony 2.0 Preview Release testen</title>
		<link>http://davidscorner.de/2010/02/symfony-2-0-preview-release-testen/</link>
		<comments>http://davidscorner.de/2010/02/symfony-2-0-preview-release-testen/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 15:37:27 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webentwicklung]]></category>

		<guid isPermaLink="false">http://davidscorner.de/?p=328</guid>
		<description><![CDATA[Nach dem Symfony 2.0 auf der Symfony Live 2010 vorgeste [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.symfony-project.org/"><img class="size-full wp-image-137 alignleft" style="margin-left: 0px; margin-right: 5px; margin-top: 0px; margin-bottom: 0px; border: 0px; float: left;" title="symfony" src="http://davidscorner.de/wp-content/uploads/2010/01/symfony.gif" alt="symfony logo" width="200" height="54" /></a>Nach dem Symfony 2.0 auf der Symfony Live 2010 vorgestellt wurde, kann man es sich nun auch selbst runterladen und die Preview Version testen.</p>
<p>Die Wichtigste Anforderung an den Server um Symfony 2.0 zu installieren, ist PHP 5.3, da dies nicht in den aktuellen Ubuntu Paketquellen enthalten ist. Eine gute und einfache Anleitung zum installieren von PHP 5.3 findet man auf <a href="http://www.denkeinfach.de/2009/12/04/php-5-3-1-pakete-fuer-ubuntu/">denkeinfach.de</a>.</p>
<p>Nach dem ich PHP 5.3 installiert hatte, habe ich mir einen neuen Ordner auf meinem Webserver erstellt (alle Kommandos per SSH) und per GIT die Sandbox kopiert:</p>
<pre>mkdir /var/www/sf2
cd /var/www/sf2
git clone git://github.com/symfony/symfony-sandbox.git ./</pre>
<p>Danach die Rechte für cache und logs gesetzt:</p>
<pre>chmod 777 hello/logs
chmod 777 hello/cache</pre>
<p>Dann habe ich mir einen Vhost auf das web Verzeichnis gesetzt, zum testen kann man es aber auch direkt öffnen. Als erstes sollte man die Datei check.php öffnen um zu prüfen, ob man alle Voraussetzungen erfüllt.</p>
<pre>http://&lt;server_url&gt;/&lt;web_pfad&gt;/check.php</pre>
<p>Hier sollten möglichst viele Voraussetzungen grün sein, rote Felder im Pflichtteil sollte man beseitigen. Danach kann man seine erste Symfony 2.0 Anwendung im Browser starten:</p>
<pre>http://&lt;server_url&gt;/&lt;web_pfad&gt;/hello/world

http://&lt;server_url&gt;/&lt;web_pfad&gt;/index_dev.php/hello/world</pre>
<p>Eine weitere Demoanwendung findet man <a href="http://github.com/noelg/symfony-demo">hier</a>. Und den oft zitierten Geschwindigkeitsvergleich <a href="http://symfony-reloaded.org/fast">hier</a> und einen anderen <a href="http://paul-m-jones.com/?p=1222">hier</a>.<br />
Auch wenn sich Symfony 2.0 noch in <a href="http://github.com/symfony/symfony">&#8220;HIGHLY EXPERIMENTAL&#8221;</a> Stadium befindet, kann man es in der Sandbox wenigstens testen. Bleibt also bis <a href="http://symfony-reloaded.org/learn">Late 2010</a> zu warten, dem geplanten release Zeitraum.</p>
<div align="left" style="float:left;padding:0px 20px 0px 0px;"><a name="fb_share" type="button" share_url="http://davidscorner.de/2010/02/symfony-2-0-preview-release-testen/"></a></div>]]></content:encoded>
			<wfw:commentRss>http://davidscorner.de/2010/02/symfony-2-0-preview-release-testen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony Live 2010</title>
		<link>http://davidscorner.de/2010/02/symfony-live-2010/</link>
		<comments>http://davidscorner.de/2010/02/symfony-live-2010/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 14:08:10 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://davidscorner.de/?p=322</guid>
		<description><![CDATA[Seit gestern findet in Paris Symfony live 2010 statt. I [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.symfony-project.org/"><img class="size-full wp-image-137 alignleft" style="margin-left: 0px; margin-right: 5px; margin-top: 0px; margin-bottom: 0px; border: 0px; float: left;" title="symfony" src="http://davidscorner.de/wp-content/uploads/2010/01/symfony.gif" alt="symfony logo" width="200" height="54" /></a>Seit gestern findet in Paris <a href="http://www.symfony-live.com/">Symfony live 2010 </a>statt. Ich konnte mich leider nicht auf den Weg nach Paris machen, um an der Konferenz teilzunehmen (Muss ich noch bis Oktober auf den <a href="http://www.symfonyday.com/de/">Symfony Day Cologne </a>warten). Da es vielen sicher genauso geht, habe ich mal ein paar Informationen zusammen gesammelt, welche ich euch natürlich nicht vorenthalten möchte.</p>
<p>Da wäre zum einen die Slideshow von Matthew Weier O&#8217;Phinney über <a href="http://www.slideshare.net/weierophinney/using-zend-framework-with-symfony">Zend Framework im zusammenspeil mit Symfony</a>, worüber ich auch schon <a href="http://davidscorner.de/2010/02/zend-framework-in-symfony-nutzen/">hier</a> geschrieben habe.</p>
<p>Dann gibt es noch zwei schöne Vorträge über <a href="http://www.slideshare.net/jwage/doctrine-2-not-the-same-old-php-orm">Doctrine 2</a>/<a href="http://www.slideshare.net/denderello/symfony-live-2010-using-doctrine-migrations">Doctrine Migrations</a> von Jonathan Wage und Dennis Benkert (Der einzige deutsche Redner?).</p>
<p>Im Symfony Project Blog gibt es eine <a href="http://www.symfony-project.org/blog/2010/02/17/symfony-live-day-1">Zusammenfassung des ersten Tags</a>. Und zu guter Letzt eine der besten Zusammenfassungen (auf Deutsch): <a href="http://test.ical.ly/2010/02/16/symfony-live-2010-tag-1-doctrine-1-2-training/">symfony-live-2010-tag-1-doctrine-1-2-training</a> und <a href="http://test.ical.ly/2010/02/17/symfony-live-2010-tag-2/">symfony-live-2010-tag-2</a></p>
<p>PS: Hier noch der Twitter Tag: <a href="http://twitter.com/#search?q=%23sflive2010">#sflive2010</a></p>
<div align="left" style="float:left;padding:0px 20px 0px 0px;"><a name="fb_share" type="button" share_url="http://davidscorner.de/2010/02/symfony-live-2010/"></a></div>]]></content:encoded>
			<wfw:commentRss>http://davidscorner.de/2010/02/symfony-live-2010/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Xdebug &#8211; PHP Profiler</title>
		<link>http://davidscorner.de/2010/02/xdebug-php-profiler/</link>
		<comments>http://davidscorner.de/2010/02/xdebug-php-profiler/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 16:40:58 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[Analyse]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webentwicklung]]></category>

		<guid isPermaLink="false">http://davidscorner.de/?p=296</guid>
		<description><![CDATA[Heute möchte ich euch wieder ein Tool vorstellen, mit  [...]]]></description>
			<content:encoded><![CDATA[<p>Heute möchte ich euch <a href="http://davidscorner.de/2010/02/einfache-lasttests-mit-apache-ab/">wieder ein Tool vorstellen</a>, mit dem man die <strong>Performance</strong> seiner <strong>PHP</strong> Anwendung testen kann bzw. die Performance-Engpässe in der Anwendung aufspüren kann. <a href="http://xdebug.org/">Xdebug</a> wird von vielen als Debugger in der Entwicklungsphase genutzt, bietet aber auch einen <strong>Profiler</strong>. Viele kennen Profiler nur aus Kriminalserien im Fernsehen, aber ein Entwickler sollte damit auch ein Tool zur <strong>Performance-</strong><strong>Analyse von Anwendungen</strong> in Verbindung bringen. Profiler aus dem Fernsehen erzeugen Täterprofile anhand von operativen Analysen, ähnliches macht ein Software-Profiler auch, er erzeugt Softwareprofile anhand operativer Analysen.</p>
<p>Die Funktionsweise eines Profilers lässt sich am besten anhand eines Beispiels/Tutorials erklären. Also fangen wir an:</p>
<p>Unter Ubuntu lässt sich Xdebug sehr einfach <strong>installieren</strong>:</p>
<pre>sudo apt-get install php5-xdebug</pre>
<p>Danach ist Xdebug installiert und automatisch aktiviert, nun müssen wir nur noch den <strong>Profiler in der php.ini aktivieren</strong>. Wenn man den Profiler in der globalen php.ini  aktiviert, wird jedes ausgeführt PHP Skript aufgezeichnet, deshalb kann es sinnvoll sein, die Einstellung in einer htaccess oder lokalen php.ini zu setzen, oder die Einstellung <a href="http://xdebug.org/docs/all_settings#profiler_enable_trigger">xdebug.profiler_enable_trigger</a> zu nutzen. Da ich auf einem Testserver Arbeite, aktiviere ich den Profiler in der globalen php.ini (folgendes in der php.ini hinzufügen):</p>
<pre>xdebug.profiler_enable=1
xdebug.profiler_output_dir="/tmp/xdebug"
xdebug.profiler_output_name="trace%s"</pre>
<p>Mit den Einstellungen haben wir den Profiler aktiviert, danach müssen wir natürlich den<strong> Apache neustarten </strong>(evtl. reicht auch ein reload):</p>
<pre>sudo /etc/init.d/apache2 restart</pre>
<p>Jetzt müssen wir nur noch eine Seite (natürlich von dem konfigurierten Server) im Browser öffnen und das Profiling beginnt. Nach dem Aufruf finden wir in dem oben angegebenen Verzeichnis ein Datei mit dem Namen der eben Aufgerufenen Seite (trace_name_der_datei).</p>
<p>Den Inhalt der Datei muss man natürlich nicht Zeile für Zeile lesen und einen Graphen auf Papier malen, sondern auch hierfür gibt es ein Tool. Das bekannteste ich wohl <a href="http://kcachegrind.sourceforge.net/"><strong>KCacheGrind</strong></a> (Linux KDE), oder <a href="http://www.maccallgrind.com/"><strong>MacCallGrind</strong></a> (wer hätte es gedacht: Mac OS). Betriebssystem unabhängig gibt es noch <a href="http://code.google.com/p/webgrind/">WebGrind</a>, ob man damit aber auch große CallGrinds analysieren kann weiss ich nicht. Falls ich noch ein Betriebssystem vergessen habe, solltet ihr einfach mal Google fragen (Stichwort: WinCacheGrind)! Meiner aktuellen Betriebssystemsituation geschuldet, stelle ich euch hier erstmal nur MacCallGrind vor. KCacheGrind zeige ich euch dann in einem späteren Beitrag, <a href="http://sourceforge.net/projects/wincachegrind/">WinCacheGrind</a> müsst ihr euch selbst angucken.</p>
<p>Ich habe folgendes Skript auswerten lassen:</p>
<pre><code>
&lt;?php
  test();
  test();
  test();
  test();
  test();
  test();
  test();
  test();
  test();
  function test(){
    $i = 1;
    while($i &lt; 10000) {
      $i++;
      echo "test";
      usleep(100);
    }
  }
?&gt;
</code></pre>
<p>Das ganze sieht im <strong>MacCallGrind</strong> dann so aus (Einfach die erzeugten Dateien öffnen):</p>
<p style="text-align: center;">
<p style="text-align: center;"><a href="http://davidscorner.de/wp-content/uploads/2010/02/maccallgrind.jpg"><img class="aligncenter size-medium wp-image-302" title="maccallgrind" src="http://davidscorner.de/wp-content/uploads/2010/02/maccallgrind-300x208.jpg" alt="" width="300" height="208" /></a></p>
<p style="text-align: center;"><a href="http://davidscorner.de/wp-content/uploads/2010/02/maccallgrind2.jpg"><img class="aligncenter size-medium wp-image-303" title="maccallgrind2" src="http://davidscorner.de/wp-content/uploads/2010/02/maccallgrind2-300x208.jpg" alt="" width="300" height="208" /></a></p>
<p>Nun kann man genau gucken <strong>wo die Ausführungszeit der Anwendung verschwindet</strong>, welche <strong>Funktion wie oft aufgerufen wird</strong> und <strong>wie lange die Ausführungen der einzelnen Funktionen dauern</strong>. Mit KCacheGrind kann man dann noch ein paar weitere Auswertungen anfertigen, aber dazu in einem späteren Beitrag mehr. Sonst ist MacCallGrind größtenteils selbsterklärend.</p>
<p>Meiner Meinung nach kann man so <strong>gute Analysen der eigenen Software</strong> machen, um Performance Engpässe schon bei der Entwicklung aufzuspüren und zu einer ordentlichen Softwareanalyse gehört es einfach dazu.</p>
<div align="left" style="float:left;padding:0px 20px 0px 0px;"><a name="fb_share" type="button" share_url="http://davidscorner.de/2010/02/xdebug-php-profiler/"></a></div>]]></content:encoded>
			<wfw:commentRss>http://davidscorner.de/2010/02/xdebug-php-profiler/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Zend Framework mit Symfony nutzen</title>
		<link>http://davidscorner.de/2010/02/zend-framework-in-symfony-nutzen/</link>
		<comments>http://davidscorner.de/2010/02/zend-framework-in-symfony-nutzen/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 11:55:31 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webentwicklung]]></category>

		<guid isPermaLink="false">http://davidscorner.de/?p=269</guid>
		<description><![CDATA[Im Internet wird derzeit viel über das Zend Framework  [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.symfony-project.org/"><img class="size-full wp-image-137 alignleft" style="margin-left: 0px; margin-right: 5px; margin-top: 0px; margin-bottom: 0px; border: 0px; float: left;" title="symfony" src="http://davidscorner.de/wp-content/uploads/2010/01/symfony.gif" alt="symfony logo" width="200" height="54" /></a>Im Internet wird derzeit viel über das <a href="http://framework.zend.com/">Zend Framework</a> im Zusammenhang mit <a href="http://www.symfony-project.org/">Symfony</a> geredet. Zum Einen werden beide Frameworks miteinander verglichen, zum Anderen sollen sie gemeinsam genutzt werden. Einen Vergleich finde ich nicht wirklich sinnvoll. Symfony ist meiner Meinung nach ein reines <strong>MVC Framework</strong>. Das Zend Framework ist mehr eine Ansammlung von Komponenten und deshalb mehr ein <strong>Komponenten Framework</strong>. Aber allein über dieses Thema könnte man einen eigenen Artikel schreiben.</p>
<p>Wenn man das Zend Framework als Komponenten Framework sieht, ist der Schritt nicht groß, es als <strong>Bibliothek in einer Symfony Anwendung zu nutzen</strong>. Anders rum macht es für mich aus den oben genannten Gründen wenig Sinn. Das <strong>Integrieren des ZFs</strong> ist eigentlich spielend einfach, muss man doch nur den Autoloader an geeigneter Stelle instanziieren. Ob man <a href="http://www.phphatesme.com/blog/tools/projektwerkstatt-zendfony-com/">dazu gleich ein neues Projekt starten</a> sollte weiss ich nicht so recht. Ich habe einfach mal ein kleines <strong>Tutorial</strong> dazu geschrieben (Symfony Version 1.4):</p>
<p>Ich gehe davon aus, dass ihr bereits ein Symfony Projekt angelegt habt, sonst sollte ihr euch <a href="http://www.symfony-project.org/jobeet/1_4/Doctrine/en/01">hier</a> schlau machen. Ich habe in meinen Projekten die Symfony Dateien immer als svn Checkout unter &#8220;lib/vendor/symfony&#8221;<em> </em>liegen. Das Gleiche mache ich nun mit dem Zend Framework und checke die aktuelle Version aus:</p>
<pre>svn co &lt;ZF_SVN_URL&gt; ./lib/vendor/zf</pre>
<p>Um aus dem Branch 1.10 zu verwednen, kann man <a href="http://framework.zend.com/svn/framework/standard/branches/release-1.10/">diese</a> Adresse nutzen. Wenn man die Dateien geladen hat, bearbeitet man &#8220;config/ProjectConfiguration.class.php&#8221; und fügt folgende Zeilen in der setup Funktion hinzu:</p>
<pre>public function setup()
{

  ... bereits vorhandener Quelltext ...

  // diese Zeilen hinzufügen
  //ZendFramework integration
  $zf_path = sfConfig::get('sf_lib_dir').'/vendor/zf/library';
  set_include_path($zf_path.PATH_SEPARATOR.get_include_path());
  require_once($zf_path.'/Zend/Loader/Autoloader.php');
  $loader = Zend_Loader_Autoloader::getInstance();
  $loader-&gt;registerNamespace('Namespace_');
}</pre>
<p>Als erstes wird der Pfad des ZF Verzeichnisses gespeichert und der Includepfad gesetzt. Dann wird der Autoloader geladen, instanziiert und der Namespace registriert.<br />
Man könnte diesen Quelltext auch in einer ApplicationConfiguration hinzufügen, dann könnte man das ZendFramework aber auch nur in dieser Application verwenden. Jetzt muss man nur noch einen Clear Cache machen und alles sollte funktionieren:</p>
<pre> ./symfony cc</pre>
<p>Nun kann man in seiner Anwendung einfach auf die Klassen des Zend Frameworks zugreifen.</p>
<div align="left" style="float:left;padding:0px 20px 0px 0px;"><a name="fb_share" type="button" share_url="http://davidscorner.de/2010/02/zend-framework-in-symfony-nutzen/"></a></div>]]></content:encoded>
			<wfw:commentRss>http://davidscorner.de/2010/02/zend-framework-in-symfony-nutzen/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Einfache Lasttests mit Apache ab</title>
		<link>http://davidscorner.de/2010/02/einfache-lasttests-mit-apache-ab/</link>
		<comments>http://davidscorner.de/2010/02/einfache-lasttests-mit-apache-ab/#comments</comments>
		<pubDate>Sun, 07 Feb 2010 20:48:20 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Server administration]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Webserver]]></category>

		<guid isPermaLink="false">http://davidscorner.de/?p=236</guid>
		<description><![CDATA[Heute möchte ich euch ein kleines, aber nützliches To [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://davidscorner.de/wp-content/uploads/2010/02/blog.tiff"><img class="alignleft size-full wp-image-255" style="float: left; margin-left: 5px; margin-right: 5px;" title="blog" src="http://davidscorner.de/wp-content/uploads/2010/02/blog.tiff" alt="" width="100" height="90" /></a>Heute möchte ich euch ein kleines, aber nützliches Tool vorstellen.<br />
<style type="text/css" media="screen"> .yiggbutton { float:right; padding:3px 5px 5px 5px; } </style>
<div class="yiggbutton"><script> yigg_url = 'http://davidscorner.de/2010/02/einfache-lasttests-mit-apache-ab/'; </script> <script src="http://static.yigg.de/v6/js/embed_button.js"></script></div>
<p>Um die <strong>Verfügbarkeit</strong> einer Internetseite unter hohen Belastungen zu testen, kann man einen <strong>Lastgenerator</strong> benutzen. Dieser generiert viele Anfragen gleichzeitig und simuliert so ein hohes Benutzeraufkommen. <a href="http://httpd.apache.org/docs/2.0/programs/ab.html">Apache ab</a> ist ein konstruierter Lastgenerator, welcher nicht versucht einen realistischen Nutzer vorzutäuschen, sondern viele Anfragen an eine konkrete Seite schickt.</p>
<p>Ein konkreter Test mit Apache ab ist relativ einfach und sieht wie folgt aus:</p>
<pre><code>
macbook:~ david$ ab -n 200 -c 50 http://test.webserver/
This is ApacheBench, Version 2.3 &lt;$Revision: 655654 $&gt;
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking test.webserver (be patient)
Completed 100 requests
Completed 200 requests
Finished 200 requests

Server Software:        Apache/2.2.12
Server Hostname:        test.webserver
Server Port:            80

Document Path:          /
Document Length:        927 bytes

Concurrency Level:      50
Time taken for tests:   22.955 seconds
Complete requests:      200
Failed requests:        0
Write errors:           0
Total transferred:      243400 bytes
HTML transferred:       185400 bytes
Requests per second:    8.71 [#/sec] (mean)
Time per request:       5738.652 [ms] (mean)
Time per request:       114.773 [ms] (mean, across all concurrent requests)
Transfer rate:          10.36 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    2   2.0      1       6
Processing:  1026 5446 2558.8   5007   12242
Waiting:     1025 5432 2554.1   4918   12194
Total:       1029 5448 2558.0   5013   12243

Percentage of the requests served within a certain time (ms)
  50%   5013
  66%   5494
  75%   5937
  80%   6548
  90%  10424
  95%  11114
  98%  11738
  99%  12195
 100%  12243 (longest request)
</code></pre>
<p>Dieser Befehl hat <strong>200 Anfragen</strong> ausgeführt, von denen maximal <strong>50 gleichzeitig</strong> verschickt wurden. Es wurden <strong>8.71 Anfragen pro Sekunde</strong> geschickt. Eine Anfrage dauerte ca. <strong>114.773 ms</strong>. Die Statistiken geben noch Auskunft über das übertragene Datenvolumen, Übertragungsdauer und Erreichbarkeit.</p>
<p>Mit Apache ab kann man relativ einfach und schnell Lasttests durchführen, aber einen echten Nutzer simulieren kann man damit nicht.</p>
<div align="left" style="float:left;padding:0px 20px 0px 0px;"><a name="fb_share" type="button" share_url="http://davidscorner.de/2010/02/einfache-lasttests-mit-apache-ab/"></a></div>]]></content:encoded>
			<wfw:commentRss>http://davidscorner.de/2010/02/einfache-lasttests-mit-apache-ab/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Buch: Grundlagen von Datenbanksystemen</title>
		<link>http://davidscorner.de/2010/01/buch-grundlagen-von-datenbanksystemen/</link>
		<comments>http://davidscorner.de/2010/01/buch-grundlagen-von-datenbanksystemen/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 18:01:17 +0000</pubDate>
		<dc:creator>David</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[db]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Webserver]]></category>

		<guid isPermaLink="false">http://davidscorner.de/?p=218</guid>
		<description><![CDATA[
Da ich mich derzeit auf ein paar Klausuren vorbereite [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.amazon.de/gp/product/386894012X?ie=UTF8&amp;tag=davidscorner-21&amp;linkCode=as2&amp;camp=1638&amp;creative=19454&amp;creativeASIN=386894012X"><img style="margin: 5px; margin-left: 10px; float: right; border: 0px;" src="http://davidscorner.de/wp-content/uploads/2010/01/51avXBDIS9L._SL160_.jpg" border="0" alt="" width="116" height="160" /></a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.de/e/ir?t=davidscorner-21&amp;l=as2&amp;o=3&amp;a=386894012X" border="0" alt="" width="1" height="1" /><br />
Da ich mich derzeit auf ein paar Klausuren vorbereiten muss, komme ich nicht wirklich dazu meinen Blog zu pflegen. Deshalb möchte ich euch heute ein Buch vorstellen, welches ich im letzten Semester genutzt habe um mich auf eine Informatik Klausur vorzubereiten. Gerade für Webentwickler spielen Datenbanken eine große Rolle, fundiertes theoretisches Hintergrundwissen kann deshalb nicht Schaden. Darum möchte ich euch das Buch  &#8221;<a href="http://www.amazon.de/gp/product/386894012X?ie=UTF8&amp;tag=davidscorner-21&amp;linkCode=as2&amp;camp=1638&amp;creative=19454&amp;creativeASIN=386894012X">Grundlagen von Datenbanksystemen</a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.de/e/ir?t=davidscorner-21&amp;l=as2&amp;o=3&amp;a=386894012X" border="0" alt="" width="1" height="1" />&#8221; von A. Elmasri und B. Navathe vorstellen. Inhaltlich deckt das Buch folgende Schwerpunkte ab:</p>
<ul>
<li>Grundkonzepte<br />
(Architektur, ER, EER)</li>
<li>Datenmodelle und Datenbanksprachen<br />
(RDB, relationale Algebra, OODB, SQL)</li>
<li>Entwurfsfragen<br />
(Normalisierung, Entwurf)</li>
<li>Mehrnutzerbetrieb<br />
(Transaktionen, Nebenläufigkeit, Sicherheit)</li>
</ul>
<p>Mit diesen Schwerpunkten ist es für eine Einführungsvorlesung oder die praktische Arbeit eines Webentwicklers bestens geeignet. Durch die Zusammenfassungen am Ende eines Kapitels und die vielen praxisnahen Beispiel schaffen es die Autoren einen einfachen Einstieg in das theoretische Hintergrundwissen für Datenbanksysteme zu liefern. Durch die Wiederholungsfragen und Übungen zu jedem Kapitel kann man gleichzeitig prüfen, ob man den Stoff verstanden hat. Für Praktiker ist vor allem das Kapitel Entwurfsfragen interessant, dadurch kann man schon beim nächsten Datenbankentwurf Fehler vermeiden, welche einem sonst erst später auffallen.</p>
<p>Das Buch aus dem Pearson Verlag ist ca. 560 Seiten stark und empfehlenswerte Lektüre sowohl für Studenten, als auch für Praktiker.</p>
<div align="left" style="float:left;padding:0px 20px 0px 0px;"><a name="fb_share" type="button" share_url="http://davidscorner.de/2010/01/buch-grundlagen-von-datenbanksystemen/"></a></div>]]></content:encoded>
			<wfw:commentRss>http://davidscorner.de/2010/01/buch-grundlagen-von-datenbanksystemen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
