<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2germanfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-4097639809240086703</atom:id><lastBuildDate>Fri, 25 May 2012 18:22:22 +0000</lastBuildDate><category>windows live</category><category>mobile</category><category>Zend_Pdf</category><category>Wordpress</category><category>Allgemein</category><category>encoding</category><category>Studium</category><category>ICQ</category><category>firebug</category><category>Zend_Db</category><category>Zend Framework</category><category>AJAX</category><category>Artikel</category><category>Lazarus</category><category>flattr</category><category>CodeIgniter</category><category>Tutorial</category><category>webEdition</category><category>tinyMCE</category><category>Skype</category><category>Iron</category><category>Trillian</category><category>Doctrine</category><category>Support</category><category>excel</category><category>Chrome</category><category>typolight</category><category>browser</category><category>Delphi</category><category>handy</category><category>code smells</category><category>eclipse</category><category>Apache</category><category>JSON</category><category>Dropbox</category><category>SuMa</category><category>Programme</category><category>CakePHP</category><category>snippet</category><category>jQuery</category><category>office</category><category>dechk</category><category>MySQL</category><category>CSS</category><category>PDF</category><category>refactoring</category><category>Opera</category><category>putty</category><category>utf-8</category><category>bada</category><category>zend studio</category><category>Datentypen</category><category>NetBeans</category><category>Java</category><category>Blogger</category><category>offtopic</category><category>Google</category><category>CouchDB</category><category>PHP</category><category>editor</category><category>Firefox</category><category>Symphony</category><category>SEO</category><category>clean code</category><category>smarty</category><category>soziales</category><category>HTML</category><category>Bücher</category><category>art of code</category><category>Hardware</category><category>IE</category><category>Datenbanken</category><category>JavaScript</category><category>zend</category><category>SVN</category><category>ide</category><title>Software-Entwickler Blog</title><description>PHP, MySQL, Zend Framework, jQuery, Java, Delphi, Windows und Heavy Metal</description><link>http://softwareentwickler.blogspot.com/</link><managingEditor>noreply@blogger.com (Sascha Presnac)</managingEditor><generator>Blogger</generator><openSearch:totalResults>142</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/softwareentwicklerblog" /><feedburner:info uri="softwareentwicklerblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>softwareentwicklerblog</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/content?lg=de&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fsoftwareentwicklerblog" src="http://us.i1.yimg.com/us.yimg.com/i/de/my/addtomyyahoo4.gif">Subscribe with Mein Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsoftwareentwicklerblog" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/softwareentwicklerblog" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsoftwareentwicklerblog" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fsoftwareentwicklerblog" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsoftwareentwicklerblog" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsoftwareentwicklerblog" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2Fsoftwareentwicklerblog" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2Fsoftwareentwicklerblog" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Fsoftwareentwicklerblog" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fsoftwareentwicklerblog" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsoftwareentwicklerblog" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsoftwareentwicklerblog" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsoftwareentwicklerblog" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2Fsoftwareentwicklerblog" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4097639809240086703.post-7084520491744853577</guid><pubDate>Tue, 08 May 2012 20:55:00 +0000</pubDate><atom:updated>2012-05-08T22:55:32.625+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">art of code</category><category domain="http://www.blogger.com/atom/ns#">code smells</category><title>include oder require?</title><description>Was soll der PHP-Entwickler benutzen, &lt;a href="http://de.php.net/include" target="_blank"&gt;include&lt;/a&gt; oder &lt;a href="http://de.php.net/require" target="_blank"&gt;require&lt;/a&gt; bzw. &lt;a href="http://de.php.net/include_once" target="_blank"&gt;include_once&lt;/a&gt; oder &lt;a href="http://de.php.net/require_once" target="_blank"&gt;require_once&lt;/a&gt;?&lt;br /&gt;
Und wo liegt da eigentlich der Unterschied?&lt;br /&gt;
&lt;br /&gt;
Die Frage kommt oft, deshalb an dieser Stelle mal ganz klipp und klar und kurz:&lt;br /&gt;
&lt;br /&gt;
require bzw. &lt;b&gt;require_once benutzen&lt;/b&gt;, denn: Sowohl include wie auch require binden eine Datei ein, aber, sollte ein Fehler in der includierten Dateie sein, so bricht require mit einem &lt;a href="http://www.php.net/manual/en/errorfunc.constants.php" target="_blank"&gt;E_COMPILE_ERROR&lt;/a&gt; ab, während include fröhlich mit einer WARNING weitermacht.&lt;br /&gt;
&lt;br /&gt;
Im Sinne der Vermeidung von &lt;a href="http://de.wikipedia.org/wiki/Code_smells" target="_blank"&gt;code-smells&lt;/a&gt; fällt eure Wahl also auf require bzw. require_once.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4097639809240086703-7084520491744853577?l=softwareentwickler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/softwareentwicklerblog?a=PyFL1rXlgHo:cTFWurDFu-8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/softwareentwicklerblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/softwareentwicklerblog/~4/PyFL1rXlgHo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/softwareentwicklerblog/~3/PyFL1rXlgHo/include-oder-require.html</link><author>noreply@blogger.com (Sascha Presnac)</author><thr:total>5</thr:total><feedburner:origLink>http://softwareentwickler.blogspot.com/2012/05/include-oder-require.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4097639809240086703.post-5618397973922723964</guid><pubDate>Wed, 25 Apr 2012 15:00:00 +0000</pubDate><atom:updated>2012-04-25T17:00:07.916+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">MySQL</category><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">code smells</category><title>Schneller in PHP und MySQL mit JOIN</title><description>Mittels einfacher Kentnisse seiner Datenbank kann der Entwickler auch aus &lt;a href="http://de.wikipedia.org/wiki/Legacy" target="_blank"&gt;Legacy&lt;/a&gt;-Anwendungen sehr viel mehr Geschwindigkeit herausholen, als er vielleicht weiß.&lt;br /&gt;
Der Grund ist simpel: Meist bleibt der Code gleich, aber die Server Software wird aktualisiert. Während die Erstellung noch im guten alten PHP4 + MySQL4 von Statten ging, rennt der Code heute mit PHP5 + MySQL5 zwar immer noch, könnte aber dank kleiner Kniffe sehr viel schneller sein.&lt;br /&gt;
Ich möchte euch einen Weg dazu zeigen, die &lt;a href="http://dev.mysql.com/doc/refman/5.1/de/join.html" target="_blank"&gt;JOINs in MySQL&lt;/a&gt;. Es gibt sicherlich noch mehr Möglichkeiten, aber das sind auch andere Themen. Fangen wir heute mal mit alten Querys an.&lt;br /&gt;
&lt;br /&gt;
Zunächst versuchen wir eine Stelle zu finden, an der wir ansetzen. Bei den meisten Legacy Codes wurde mit solch einem oder einem ähnlichen Konstrukt die Daten für "Zeige neue Blogbeiträge mit Namen des Autors" abgerufen, wobei "autor" und "blog" zwei verschiedene Tabellen sind.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="php" name="code"&gt;$_res = mysql_query("SELECT * FROM blog ORDER BY datum DESC");
while ($row = mysql_fetch_array($_res)) {

&amp;nbsp; $_resAutor = mysql_query("SELECT * FROM autor WHERE autorid = ".$row['autorid']);
&amp;nbsp; $autor = mysql_fetch_array($_resAutor);
&amp;nbsp; // Stelle Blogbeitrag mit Autor dar
}
&lt;/pre&gt;
&lt;br /&gt;
Das ist nicht nur in der Hinsicht des Datenabrufes schlechter Code und vor lauter "code-smells" könnte einem glatt schlecht werden. Trotzdem gibt es sowas "da draussen" und dummerweise funktioniert das leider immer noch.&lt;br /&gt;
&lt;br /&gt;
Was kann man verbessern? Zum einen fällt auf, dass es zwei Querys sind. Das muss nicht nur nicht sein, dass ist auch noch ganz schlecht, denn jede Verbindung zur Datenbank braucht Zeit und die sollten wir uns sparen. Argumente wie "&lt;a href="http://de.php.net/mysqli" target="_blank"&gt;mysqli&lt;/a&gt; / &lt;a href="http://de.php.net/manual/en/book.pdo.php" target="_blank"&gt;PDO&lt;/a&gt; benutzen" lasse ich ganz bewusst aussen vor, es soll um Prinzip gehen (sicher wäre die Verwendung eines PDO oder &lt;a href="http://de.wikipedia.org/wiki/Objektrelationale_Abbildung" target="_blank"&gt;ORM&lt;/a&gt;&amp;nbsp;wie &lt;a href="http://www.doctrine-project.org/" target="_blank"&gt;Doctrine&lt;/a&gt; besser, ganz klar).&lt;br /&gt;
&lt;br /&gt;
Sparen wir uns also den zusätzlichen Query:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="php" name="code"&gt;$_res = mysql_query("SELECT b.*, a.* FROM blog b, autor a WHERE b.autorid = a.autorid ORDER BY b.datum DESC");
while ($row = mysql_fetch_array($_res)) {
&amp;nbsp; // Stelle Blogbeitrag mit Autor dar
}
&lt;/pre&gt;
&lt;br /&gt;
Schon viel besser, aber noch nicht gut genug. Was passiert, wenn ein Blogbeitrag existiert, aber der Autor nicht? Bei so einer Legacy-Anwendung fast schon der Normalfall.&amp;nbsp;Der ganze Beitrag fehlt. Doof, also brauchen wir eine Mechanik, die trotz fehlendem Autor den Blog Beitrag noch anzeigt.&lt;br /&gt;
Ganz kurz: Das machen JOINs - und ehe ich nun von vielen gesteinigt werde: JOINs machen noch viel mehr, aber das würde hier den Rahmen sprengen und außerdem möchte ich dazu noch mehr schreiben.&lt;br /&gt;
&lt;br /&gt;
Das ganze nun mit einem LEFT JOIN:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="php" name="code"&gt;$_res = mysql_query("SELECT b.*, a.* FROM blog b LEFT JOIN autor a ON (b.autorid = a.autorid) ORDER BY b.datum DESC");
while ($row = mysql_fetch_array($_res)) {
&amp;nbsp; // Stelle Blogbeitrag mit Autor dar
}
&lt;/pre&gt;
&lt;br /&gt;
Es ändert sich nicht viel, aber nun erscheinen auch alle Blogbeiträge ohne Autor und als kleines Extra arbeitet der letzte Query auch noch etwas schneller als der zweite; super für Legacy-Code, der schon ähnlich wie in Beispiel Zwei aufgebaut ist, denn dort muss man nicht - oder nur wenig - an den PHP Code ran und kann sich auf die reine SQL-Optimierung konzentrieren.&lt;br /&gt;
&lt;br /&gt;
Diese Art der Optimierung alter Legacy-Anwendungen macht relativ wenig Arbeit und bringt dafür recht viel. Vor allem im Bereich von SQL-Code, wo Beispiel eins mehrfach vorkommt (Grundquery, dannach werden viele Querys gestartet die Detaildaten zum Grundquery abrufen, dannach wird gerechnet und wieder neue Querys abgerufen usw.) und damit die Anwendung an dieser Stelle nur sehr langsam ist, kann ein Umstieg auf JOINs und u.a. Verlagerung von Arbeit von PHP in den Query sehr viel Geschwindigkeit herausholen.&lt;br /&gt;
&lt;br /&gt;
Allerdings - und das sollte ganz klar sein - kann dies keine schlechte Architektur ersetzen. Legacy Code kommt irgendwann an den Punkt, an dem ein Optimieren keinen Sinn mehr macht und man sich lieber auf die Neukonzeption konzentrieren sollte. Als Hilfsmittel, um z.B. langsame Bereiche zu beschleunigen, sollte man die Kentnisse allerdings auffrischen. Vor allem, da bei modernen Methoden (PDO, OML, ...) die JOINs eine zentrale Rolle spielen.&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4097639809240086703-5618397973922723964?l=softwareentwickler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/softwareentwicklerblog?a=am4YnAxlPcc:LOTnHe5x0D4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/softwareentwicklerblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/softwareentwicklerblog/~4/am4YnAxlPcc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/softwareentwicklerblog/~3/am4YnAxlPcc/schneller-in-php-und-mysql-mit-join.html</link><author>noreply@blogger.com (Sascha Presnac)</author><thr:total>1</thr:total><georss:featurename>Neukirchen-Vluyn, Deutschland</georss:featurename><georss:point>51.4423827 6.5537259</georss:point><georss:box>51.4027942 6.4747619 51.481971200000004 6.6326899</georss:box><feedburner:origLink>http://softwareentwickler.blogspot.com/2012/04/schneller-in-php-und-mysql-mit-join.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4097639809240086703.post-4010942625249565987</guid><pubDate>Sun, 15 Apr 2012 12:10:00 +0000</pubDate><atom:updated>2012-04-15T14:11:22.012+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">dechk</category><category domain="http://www.blogger.com/atom/ns#">Programme</category><title>deCHK 2.1 ist da</title><description>deCHK Version 2.1 ist erschienen.&lt;br /&gt;
&lt;br /&gt;
Ein kritischer Fehler konnte eine Wiederherstellung bekannter Dateitypen verhindern. Dies ist nun behoben, darüberhinaus wurden nur interne Verbesserungen durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Zur Homepage und zum Download:&amp;nbsp;&lt;a href="http://www.techcrawler.de/dechk/" target="_blank"&gt;http://www.techcrawler.de/dechk/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4097639809240086703-4010942625249565987?l=softwareentwickler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/softwareentwicklerblog?a=dNCuXCmXElY:oVBAxKu9hag:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/softwareentwicklerblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/softwareentwicklerblog/~4/dNCuXCmXElY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/softwareentwicklerblog/~3/dNCuXCmXElY/dechk-21-ist-da.html</link><author>noreply@blogger.com (Sascha Presnac)</author><thr:total>0</thr:total><feedburner:origLink>http://softwareentwickler.blogspot.com/2012/04/dechk-21-ist-da.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4097639809240086703.post-8327614203384377538</guid><pubDate>Mon, 05 Mar 2012 16:30:00 +0000</pubDate><atom:updated>2012-03-05T17:30:00.757+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Zend Framework</category><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">Zend_Db</category><title>No reference from table X to table Y</title><description>Referenzen der Datenbank im Zend Framework über das Model abzubilden ist ja eine gute Idee. Schnell ist das entsprechende Skelett des Model erstellt und die &lt;a href="http://framework.zend.com/manual/en/zend.db.table.relationships.html" target="_blank"&gt;Doku&lt;/a&gt; lehrt uns: "Definier die $_referenceMap und alles wird gut.". Dachte ich auch ... aber&lt;br /&gt;
&lt;br /&gt;
Wer das schon einmal ausprobiert hat, der weiß: Im aber steckt der Wurm im Apfel bzw. die Titelmeldung auf dem Schirm. Aber langsam und zum mitmachen:&lt;br /&gt;
&lt;br /&gt;
Gegeben sind 2 Datenbanktabellen "news" und "author", news hat u.a. ein Feld authorId. Den Rest könnt ihr euch vorstellen.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="php" name="code"&gt;class myApp_Model_News extends Zend_Db_Table_Abstract {

 protected $_name  = 'news';
 protected $_primary = 'id';

 protected $_referenceMap = array(

  'TrouperId' =&amp;gt; array(

   'columns' =&amp;gt; array('author_id'),
   'refTableClass' =&amp;gt; 'author',
   'refColumns' =&amp;gt; array('id')

  )

 );

}
&lt;/pre&gt;
&lt;br /&gt;
Instinktiv benutzt man das und hier meldet sich auch gleich eine Fehlermeldung:&lt;br /&gt;
"&lt;b&gt;&lt;i&gt;No reference from table myApp_Model_News to table myApp_Model_Author&lt;/i&gt;&lt;/b&gt;"&lt;br /&gt;
Aber warum? Wir haben doch alles richtig gemacht.&lt;br /&gt;
&lt;br /&gt;
Prinzipiell ja, laut Doku, aber nicht laut programmiertem Code, dafür muss man nämlich &lt;u&gt;&lt;b&gt;nicht&lt;/b&gt;&lt;/u&gt; den Tabellennamen in die $_referenceMap eintragen, sondern &lt;b&gt;den Namen des Models&lt;/b&gt;!!!&lt;br /&gt;
Also so:&lt;br /&gt;
&lt;pre class="php" name="code"&gt;class myApp_Model_News extends Zend_Db_Table_Abstract {

 protected $_name  = 'news';
 protected $_primary = 'id';

 protected $_referenceMap = array(

  'TrouperId' =&amp;gt; array(

   'columns' =&amp;gt; array('author_id'),
   'refTableClass' =&amp;gt; 'myApp_Model_Author',
   'refColumns' =&amp;gt; array('id')

  )

 );

}
&lt;/pre&gt;
Besonders mal auf "refTableClass" sehen, dort steht nun nicht mehr der Tabellenname wie er in der Datenbank steht, sondern der Name des Models, dass für diese Tabelle zuständig ist.&lt;br /&gt;
Und nun funktioniert das ganze auch mit&lt;br /&gt;
&lt;pre class="php" name="code"&gt;$news = new myApp_Model_News();
$myNews = $news-&amp;gt;fetchRow();
$newsauthor = $myNews-&amp;gt;findDependentRowset('myApp_Model_Author');
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4097639809240086703-8327614203384377538?l=softwareentwickler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/softwareentwicklerblog?a=QYyIofhRFr4:KLdIvv99c0M:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/softwareentwicklerblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/softwareentwicklerblog/~4/QYyIofhRFr4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/softwareentwicklerblog/~3/QYyIofhRFr4/no-reference-from-table-x-to-table-y.html</link><author>noreply@blogger.com (Sascha Presnac)</author><thr:total>3</thr:total><feedburner:origLink>http://softwareentwickler.blogspot.com/2012/03/no-reference-from-table-x-to-table-y.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4097639809240086703.post-4246735098806408134</guid><pubDate>Sun, 29 Jan 2012 19:47:00 +0000</pubDate><atom:updated>2012-01-29T20:47:26.334+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">dechk</category><title>deCHK 2.0.1 ist erschienen</title><description>deCHK Version 2.0.1 ist erschienen.&lt;br /&gt;
&lt;br /&gt;
deCHK beherrscht nun die beiden &lt;a href="http://www.uniplot.de/" target="_blank"&gt;Uniplot&lt;/a&gt; Dateitypen .nc und .ipw. Damit beherrscht das Tool nun 50 Dateitypen, nachlesbar auf der Homepage.&lt;br /&gt;
&lt;br /&gt;
Zur Homepage und zum Download:&amp;nbsp;&lt;a href="http://www.techcrawler.de/dechk/" target="_blank"&gt;http://www.techcrawler.de/dechk/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4097639809240086703-4246735098806408134?l=softwareentwickler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/softwareentwicklerblog?a=9NnUjcBAPw0:MPpHkEoOtF4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/softwareentwicklerblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/softwareentwicklerblog/~4/9NnUjcBAPw0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/softwareentwicklerblog/~3/9NnUjcBAPw0/dechk-201-ist-erschienen.html</link><author>noreply@blogger.com (Sascha Presnac)</author><thr:total>0</thr:total><feedburner:origLink>http://softwareentwickler.blogspot.com/2012/01/dechk-201-ist-erschienen.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4097639809240086703.post-1517530085748641176</guid><pubDate>Thu, 12 Jan 2012 10:40:00 +0000</pubDate><atom:updated>2012-01-12T11:40:01.346+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">windows live</category><category domain="http://www.blogger.com/atom/ns#">mobile</category><category domain="http://www.blogger.com/atom/ns#">bada</category><category domain="http://www.blogger.com/atom/ns#">handy</category><title>Samsung Wave s8500 (BadaOS) mit Windows Live synchronisieren</title><description>Wer auch immer wie ich ein Samsung Wave 8500 mit BadaOS und ein Windows Live Mailkonto (früher Hotmail) hat und gern die Mails mobil lesen möchte, seine Termine usw. auch im Handy haben will usw. kann das sehr komfortabel machen. Am Ende hat es was von einem Blackberry "Lite", aber der Reihe nach:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Die App "Meine Konten" öffnen&lt;/li&gt;
&lt;li&gt;Dort "Konto hinzufügen"&lt;/li&gt;
&lt;li&gt;"Exchange ActiveSync"&lt;/li&gt;
&lt;li&gt;"Mailadresse" eingeben, z.B. "xyz@live.de"&lt;/li&gt;
&lt;li&gt;"Benutzername" ist ebenfalls die Mailadresse&lt;/li&gt;
&lt;li&gt;"Passwort" solltet ihr natürlich auch wissen&lt;/li&gt;
&lt;li&gt;"Domäne" leer lassen&lt;/li&gt;
&lt;li&gt;"Weiter"&lt;/li&gt;
&lt;li&gt;"Server-URL" ist "m.hotmail.com"&lt;/li&gt;
&lt;li&gt;"SSL verwenden" -&amp;gt; Ja&lt;/li&gt;
&lt;li&gt;Fertig.&lt;/li&gt;
&lt;li&gt;Die restlichen Einstellungen nehmt ihr nach euren persönlichen Vorlieben vor.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
Nun könnt ihr mobil Mails lesen, antworten, verschieben, löschen usw. Ebenso die Kontakte und Termine synchronisieren und vieles mehr. Der neue Live-Dienst von Microsoft ist wirklich nicht schlecht und leistet vergleichbar mehr wie z.B. GMX und konsorten (dort muss ich meist für IMAP-ähnliche Funktionen Geld bezahlen).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4097639809240086703-1517530085748641176?l=softwareentwickler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/softwareentwicklerblog?a=M2fntmEkevw:r9Tudszv4WU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/softwareentwicklerblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/softwareentwicklerblog/~4/M2fntmEkevw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/softwareentwicklerblog/~3/M2fntmEkevw/samsung-wave-s8500-badaos-mit-windows.html</link><author>noreply@blogger.com (Sascha Presnac)</author><thr:total>1</thr:total><feedburner:origLink>http://softwareentwickler.blogspot.com/2012/01/samsung-wave-s8500-badaos-mit-windows.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4097639809240086703.post-8497197298932534875</guid><pubDate>Thu, 22 Dec 2011 16:30:00 +0000</pubDate><atom:updated>2011-12-22T21:28:38.072+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">CodeIgniter</category><title>$_GET in Codeigniter nutzen</title><description>&lt;p&gt;Ganz kurz: Bei Codeigniter auf URL-Parameter mit $_GET zugreifen:&lt;/p&gt;

&lt;pre class="php" name="code"&gt;
parse_str(substr($_SERVER['REQUEST_URI'],strpos($_SERVER['REQUEST_URI'],'?')+1,strlen($_SERVER['REQUEST_URI'])-strpos($_SERVER['REQUEST_URI'],'?')),$_GET);
&lt;/pre&gt;

&lt;p&gt;Dann kann auch $_GET benutzt werden&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4097639809240086703-8497197298932534875?l=softwareentwickler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/softwareentwicklerblog?a=nIiLCAn6xew:0rk7185W7wY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/softwareentwicklerblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/softwareentwicklerblog/~4/nIiLCAn6xew" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/softwareentwicklerblog/~3/nIiLCAn6xew/get-in-codeigniter-nutzen.html</link><author>noreply@blogger.com (Sascha Presnac)</author><thr:total>0</thr:total><feedburner:origLink>http://softwareentwickler.blogspot.com/2011/12/get-in-codeigniter-nutzen.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4097639809240086703.post-6406155923125480661</guid><pubDate>Tue, 22 Nov 2011 16:30:00 +0000</pubDate><atom:updated>2011-11-22T17:30:01.878+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">zend studio</category><category domain="http://www.blogger.com/atom/ns#">ide</category><category domain="http://www.blogger.com/atom/ns#">eclipse</category><category domain="http://www.blogger.com/atom/ns#">zend</category><category domain="http://www.blogger.com/atom/ns#">SVN</category><title>SVN 1.7 mit Zend Studio 9</title><description>Zend Studio 9 (und meines Wissen die Version 8 auch) beherrscht das noch recht neue SVN 1.7 als einziges nicht. Netbeans und PHPStorm unterstützen das ganze bereits ... eclipse, auf dem das Zend Studio basiert, bekommt den offiziellen Support wohl nicht mehr dieses Jahr.&lt;br /&gt;
&lt;br /&gt;
Dass wir Entwickler nicht so lange warten können und wollen liegt auf der Hand, hier also meine Schritt-für-Schritt Anleitung für SVN 1.7+ und Zend Studio 9:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Welcome Screen öffnen ("Help" -&amp;gt; "Welcome")&lt;/li&gt;
&lt;li&gt;Dort dann rechts "SVN" abwählen, IDE neu starten lassen&lt;/li&gt;
&lt;li&gt;"Help" -&amp;gt; "Install new Software"&lt;/li&gt;
&lt;li&gt;"Work with:" eintragen "http://subclipse.tigris.org/update_1.8.x"&lt;/li&gt;
&lt;li&gt;Mindestens die "required" markierten anhaken&lt;/li&gt;
&lt;li&gt;Mit "Finish" installieren, den Lizenzen entsprechend zustimmen, usw.&lt;/li&gt;
&lt;li&gt;IDE neustarten&lt;/li&gt;
&lt;li&gt;Fertig&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
Nun habt ihr volle SVN 1.7+ Support in Zend Studio und könnt wieder mit den Repos arbeiten wie gewohnt.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Viel Erfolg...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4097639809240086703-6406155923125480661?l=softwareentwickler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/softwareentwicklerblog?a=faUReGwGvnw:BIb1uw8YBqc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/softwareentwicklerblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/softwareentwicklerblog/~4/faUReGwGvnw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/softwareentwicklerblog/~3/faUReGwGvnw/svn-17-mit-zend-studio-9.html</link><author>noreply@blogger.com (Sascha Presnac)</author><thr:total>2</thr:total><feedburner:origLink>http://softwareentwickler.blogspot.com/2011/11/svn-17-mit-zend-studio-9.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4097639809240086703.post-4326060391311106722</guid><pubDate>Fri, 18 Nov 2011 16:30:00 +0000</pubDate><atom:updated>2011-11-18T17:30:01.121+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Zend Framework</category><category domain="http://www.blogger.com/atom/ns#">PDF</category><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">Zend_Pdf</category><title>Mehrzeiliger Text mit Zend_Pdf</title><description>Mehrzeiligen Text erstellen muss man auch mit &lt;a href="http://framework.zend.com/manual/de/zend.pdf.html" target="_blank"&gt;Zend_Pdf&lt;/a&gt; noch manuell ... leider&lt;br /&gt;
Ich möchte an dieser Stelle allen, die mehrzeiligen Text in einem PDF mit Hilfe von Zend_Pdf ausgeben wollen, einen Denkanstoß geben.&lt;br /&gt;
&lt;br /&gt;
Ich habe das Problem wie folgt gelöst:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Verfügbare Breite ermitteln. Diese Breite in einer Variable merken.&lt;/li&gt;
&lt;li&gt;Verfügbare Zeilen ermitteln.&amp;nbsp;Diese Info auch speichern, da das für den späteren Seitenumbruch nötig wird. Nicht, dass euer Text plötzlich endet, nur weil die Seite zu Ende ist.&lt;/li&gt;
&lt;li&gt;Den Text mittels &lt;a href="http://de.php.net/wordwrap" target="_blank"&gt;wordwrap&lt;/a&gt; umbrechen.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Diesen dann per &lt;a href="http://de.php.net/explode" target="_blank"&gt;explode&lt;/a&gt; in ein array bekommen.&lt;/li&gt;
&lt;li&gt;Das dann per foreach und &lt;a href="http://de.php.net/array_shift" target="_blank"&gt;array_shift&lt;/a&gt; solange ausgelesen wird, bis das Seitenende erreicht ist.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Dannach &lt;a href="http://framework.zend.com/manual/de/zend.pdf.pages.html" target="_blank"&gt;eine neue Seite&lt;/a&gt; beginnen und den Rest des arrays abarbeiten.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
Ich hoffe, ich kann euch zumindest auf die richtige Spur bringen, dass das ganze gar nicht schwer ist. Am Ende könnt ihr beliebig großen Text in einem PDF darstellen und das sogar über mehrere Seiten.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Viel Erfolg.&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4097639809240086703-4326060391311106722?l=softwareentwickler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/softwareentwicklerblog?a=dd2MMU59XlM:yeASvHboPPQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/softwareentwicklerblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/softwareentwicklerblog/~4/dd2MMU59XlM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/softwareentwicklerblog/~3/dd2MMU59XlM/mehrzeiliger-text-mit-zendpdf.html</link><author>noreply@blogger.com (Sascha Presnac)</author><thr:total>4</thr:total><feedburner:origLink>http://softwareentwickler.blogspot.com/2011/11/mehrzeiliger-text-mit-zendpdf.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4097639809240086703.post-378803376166716445</guid><pubDate>Sun, 30 Oct 2011 18:12:00 +0000</pubDate><atom:updated>2011-10-30T19:12:44.860+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">dechk</category><category domain="http://www.blogger.com/atom/ns#">Programme</category><title>deCHK Version 2 ist da</title><description>Endlich. Ich freue mich, euch &lt;a href="http://www.techcrawler.de/dechk/" target="_blank"&gt;deCHK&lt;/a&gt;2 endlich doch noch vorstellen zu können.&lt;br /&gt;
&lt;br /&gt;
Nachdem ich lange kein Delphi zur&amp;nbsp;Verfügung&amp;nbsp;hatte konnte ich leider nicht an dem Projekt weiter arbeiten, so dass viele Wünsche liegen bleiben mussten.&lt;br /&gt;
&lt;br /&gt;
Letztlich habe ich mich dann doch daran gemacht, deCHK komplett in Lazarus neu zu schreiben. Lazarus ist eine freie IDE für Free-Pascal, ganz ähnlich Delphi. Da es kostenfrei ist kann ich auch deCHK weiterhin kostenfrei anbieten.&lt;br /&gt;
&lt;br /&gt;
Wer deCHK noch nicht kennt: deCHK versucht, aus den CHK-Dateien von scandisk unter Windows wieder lesbare Dateien zu machen. Bei mir konnte ich meinen ganzen Familienfotos nach einem Festplattencrash wieder herstellen, dazu noch viele weitere Dateien, die andere Tools nicht wieder herstellen konnten. deCHK könnt ihr kostenfrei benutzen - über eine kleine Spende oder so würde ich mich natürlich trotzdem freuen, kommt alles der Familienkasse zugute ;-)&lt;br /&gt;
&lt;br /&gt;
In der Version 2 ist nun der Support für Office 2007/2010 Dateien dabei sowie die lange gewünschte Unterstützung für mp4 Dateien. Insgesamt beherrscht deCHK nun 48 Dateitypen, diese sind:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;span class="Apple-style-span" style="background-color: white; font-family: Tahoma; font-size: 12px;"&gt;3gp 7z ace avi bdsproj bmp cab chm class clp db dcu dfm (dll*) doc dsk dsm eps (exe*) fpx gif htm java jpg mid mp3 ocx odt pas pdf png ppt psd psp rar rtf tif ttf wav wri wpg xls zip&lt;/span&gt;&lt;/blockquote&gt;
&amp;nbsp;Ich finde, deCHK sollte auf keinem USB Stick fehlen (die entpacke .exe nimmt nur 860kb ein).&lt;br /&gt;
&lt;br /&gt;
Zur deCHK Homepage:&amp;nbsp;&lt;a href="http://www.techcrawler.de/dechk/" target="_blank"&gt;http://www.techcrawler.de/dechk/&lt;/a&gt;&lt;br /&gt;
English Homepage:&amp;nbsp;&lt;a href="http://www.techcrawler.de/dechk/index_en.html" target="_blank"&gt;http://www.techcrawler.de/dechk/index_en.html&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4097639809240086703-378803376166716445?l=softwareentwickler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/softwareentwicklerblog?a=7ogEynB3vxg:KgKOM9GvJ9I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/softwareentwicklerblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/softwareentwicklerblog/~4/7ogEynB3vxg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/softwareentwicklerblog/~3/7ogEynB3vxg/dechk-version-2-ist-da.html</link><author>noreply@blogger.com (Sascha Presnac)</author><thr:total>0</thr:total><feedburner:origLink>http://softwareentwickler.blogspot.com/2011/10/dechk-version-2-ist-da.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4097639809240086703.post-5283010793973166934</guid><pubDate>Wed, 19 Oct 2011 12:38:00 +0000</pubDate><atom:updated>2011-10-19T14:38:11.860+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SVN</category><category domain="http://www.blogger.com/atom/ns#">NetBeans</category><title>Netbeans und Subversion 1.7 zusammenarbeiten lassen</title><description>Du benutzt &lt;a href="http://netbeans.org/" target="_blank"&gt;Netbeans&lt;/a&gt; mit SVN und erhälst die Fehlermeldung&lt;br /&gt;
&lt;i&gt;"Please upgrade your Subversion client to use this working copy."&lt;/i&gt;&lt;br /&gt;
und nun kannst du nichts mehr mit dem SVN machen.&lt;br /&gt;
&lt;br /&gt;
Kein Thema, besorg dir die aktuellen 1.7 command-line Clients (z.b. &lt;a href="http://www.open.collab.net/products/subversion/getit.html" target="_blank"&gt;von Collab.net hier&lt;/a&gt;), stell Netbeans darauf ein ("Extras"-&amp;gt;"Optionen"-&amp;gt;"Verschiedenes"-&amp;gt;"Versionsverwaltung"-&amp;gt;"Subversion"-&amp;gt;"Pfad zu SVN:")&lt;br /&gt;
Dann Netbeans schließen und mit folgenden Startparametern starten:&lt;br /&gt;
&lt;i&gt;"&amp;nbsp;-J-DsvnClientAdapterFactory=commandline"&lt;/i&gt;&lt;br /&gt;
also zum Beispiel:&lt;br /&gt;
&lt;i&gt;"C:\Program Files\NetBeans 7.0.1\bin\netbeans.exe" -J-DsvnClientAdapterFactory=commandline&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Dannach funktioniert wieder alles und wir hoffen auf baldiges update von Netbeans ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4097639809240086703-5283010793973166934?l=softwareentwickler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/softwareentwicklerblog?a=gohxChBnqno:XHwlGR5Ig4s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/softwareentwicklerblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/softwareentwicklerblog/~4/gohxChBnqno" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/softwareentwicklerblog/~3/gohxChBnqno/netbeans-und-subversion-17.html</link><author>noreply@blogger.com (Sascha Presnac)</author><thr:total>2</thr:total><feedburner:origLink>http://softwareentwickler.blogspot.com/2011/10/netbeans-und-subversion-17.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4097639809240086703.post-1723077991810324413</guid><pubDate>Wed, 21 Sep 2011 17:38:00 +0000</pubDate><atom:updated>2011-09-21T19:40:03.239+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">flattr</category><title>Flattr Shirts werden verlost</title><description>Bei&amp;nbsp;&lt;a href="http://skaverat.net/" target="_blank"&gt;Skaverat&lt;/a&gt; könnt ihr &lt;a href="http://skaverat.net/allgemein/verlosung-tausche-flattr-t-shirts-gegen-meinung-zu-flattr.html" target="_blank"&gt;T-Shirts von flattr gewinnen&lt;/a&gt; ... ihr müsst nur Eure Meinung zu dem &lt;a href="https://flattr.com/profile/Paladin" target="_blank"&gt;Micropayment-Dienst&lt;/a&gt; loswerden und schon landet ihr in der Lostrommel.&lt;br /&gt;
&lt;br /&gt;
Die Aktion geht noch knapp 2 Tage und es machen derzeit noch viel zu wenig Leute mit. Ich denke, ihr könnt mit wenig Aufwand einen wirklich "alltagstauglichen" Preis gewinnen, der auch offline und im "Real-Life" benutzbar ist ... worauf wartet ihr noch?&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://skaverat.net/allgemein/verlosung-tausche-flattr-t-shirts-gegen-meinung-zu-flattr.html" target="_blank"&gt;http://skaverat.net/allgemein/verlosung-tausche-flattr-t-shirts-gegen-meinung-zu-flattr.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4097639809240086703-1723077991810324413?l=softwareentwickler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/softwareentwicklerblog?a=8FvBxF6VmLs:LiQ2p9PYvm8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/softwareentwicklerblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/softwareentwicklerblog/~4/8FvBxF6VmLs" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/softwareentwicklerblog/~3/8FvBxF6VmLs/flattr-shirts-werden-verlost.html</link><author>noreply@blogger.com (Sascha Presnac)</author><thr:total>0</thr:total><feedburner:origLink>http://softwareentwickler.blogspot.com/2011/09/flattr-shirts-werden-verlost.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4097639809240086703.post-4880544862710421939</guid><pubDate>Mon, 19 Sep 2011 13:26:00 +0000</pubDate><atom:updated>2011-09-20T21:26:28.418+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">snippet</category><category domain="http://www.blogger.com/atom/ns#">PHP</category><title>PHP-Snippet: stripArrayKey</title><description>&lt;p&gt;Aus einem QueryString (z.B. dem $_GET) nicht gewollte Parameter löschen:&lt;/p&gt;
&lt;pre class="php" name="code"&gt;
	function stripArrayKey($sInput, $arrKeysToStrip = array()) {

		if (count($arrKeysToStrip)&lt;=0) {
			return $sInput;
		}

		$arrResult = array();
		parse_str($sInput, $arrResult);

		foreach ($arrKeysToStrip AS $keyName) {
			if (array_key_exists($keyName, $arrResult)) {
				unset($arrResult[$keyName]);
			}
		}

		return http_build_query($arrResult);
	}
&lt;/pre&gt;
&lt;p&gt;Vorher:&lt;/p&gt;
&lt;p&gt;param1=value&amp;amp;param2=otherValue&amp;amp;myParam=unwanted&amp;amp;param3=moreValue&lt;/p&gt;

&lt;pre class="php" name="code"&gt;
return stripArrayKey($sQuerystring, array('myParam','param2'));
&lt;/pre&gt;

&lt;p&gt;Nachher:&lt;/p&gt;
&lt;p&gt;param1=value&amp;amp;param3=moreValue&lt;/p&gt;

&lt;p&gt;Wahlweise auch gleich viele Parameter auf einen Rutsch.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4097639809240086703-4880544862710421939?l=softwareentwickler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/softwareentwicklerblog?a=l7znP-h0wk8:lhIKBC0dp9k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/softwareentwicklerblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/softwareentwicklerblog/~4/l7znP-h0wk8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/softwareentwicklerblog/~3/l7znP-h0wk8/php-snippet-striparraykey.html</link><author>noreply@blogger.com (Sascha Presnac)</author><thr:total>3</thr:total><feedburner:origLink>http://softwareentwickler.blogspot.com/2011/09/php-snippet-striparraykey.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4097639809240086703.post-5401124943637900959</guid><pubDate>Tue, 30 Aug 2011 21:02:00 +0000</pubDate><atom:updated>2011-08-31T09:07:33.030+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Zend Framework</category><category domain="http://www.blogger.com/atom/ns#">CakePHP</category><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">CodeIgniter</category><category domain="http://www.blogger.com/atom/ns#">Doctrine</category><category domain="http://www.blogger.com/atom/ns#">Symphony</category><title>Das Framework updaten</title><description>&lt;p&gt;Wer kennt das nicht? Man betreut eine Vielzahl unterschiedlicher Projekte. Im Idealfall betreut man nur wenige und kennt diese fast auswendig ... aber wer von uns lebt schon im Idealfall? Eben ...&lt;/p&gt;

&lt;p&gt;So ein PHP-Projekt ist eine komplizierte Sache und auch die "kleinen" bestehen aus einer Vielzahl unterschiedlicher Technologien. Zum einen (meist) ein Framework als Basis, sei es das Zend Framework oder Symphony oder CakePHP oder CodeIgniter oder oder oder, dann - bei den neueren und "cooleren" Projekten - eine Datenbankabtraktionsschicht (ich kenne das z.B. Doctrine, aber es gibt da auch ein paar mehr) und dann kommt die Schicht Code, die uns dann die grauen Haare machen, die Anwendungsschicht, so nenne ich nun mal den Teil des Codes, den man bei einem Projekt mit Framework-Basis selbst schreibt.&lt;/p&gt;

&lt;p&gt;Nach vielen Tagen ist der Code fertig, alle Tests zeigen "Grün", das Deployment war (außnahmsweise mal) angenehm einfach und alles ist perfekt. Der Kunde ist zufrieden, der Zeit- und Projektplan eingehalten, der Chef spendiert ne Pizza und nach vielen Wochen hat man endlich mal wieder einen der wenigen "Geschafft"-Momente, die einem wieder Rückenwind geben. Toll.&lt;/p&gt;

&lt;p&gt;Nach ein paar Wochen kommt dann aber schon die erste Verbesserung, der erste Bugfix, der erste neue Kundenwunsch. Die perfekte Anwendung muss aktualisiert werden. Im Bereich der Anwendungsschicht meist ein leichtes. Käfer erschlagen, Feature eincoden, Test, VCS, Deploy, "der nächste bitte"; das war einfach.&lt;/p&gt;

&lt;p&gt;Allerdings kommt es irgendwann und du kannst dich nicht davor verstecken. "You can run, but you can't hide!" (gibt es so ein YCRBYCH-Prinzip eigentlich irgendwo? Ich habe da nichts finden können.). Das Framework, die Basis der Anwendung wird (meist von extern) aktualisiert. Und nun?&lt;/p&gt;

&lt;p&gt;Meistens hält man sich ja auf dem Laufenden und schaut nach, was es denn neues gibt. "Ah ja, Aha, soso, benutzen wir ja gar nicht, brauchen wir nicht updaten." Okay, kann passieren, aber, wie schon gesagt, YCRBYCH - das Changelog zeigt nun sehr viele Änderungen, Bugfixes, Performance-Improvements usw. genau in den Klassen und Bereichen an, die in der Kundenanwendung benutzt werden. Und nun der Worst-Case: Bugfixes zu Exploits sind auch dabei. Es heißt also: &lt;b&gt;Das Framework updaten&lt;/b&gt;!&lt;/p&gt;

&lt;p&gt;Und nun? Nun, sicher, Framework auf dem lokalen System updaten, testen, Testsystem updaten, testen usw. Aber eines musst du zugeben: Du hast ein mulmiges Gefühl dabei! Es könnte was schiefgehen. Klar, eigentlich &lt;i&gt;kann&lt;/i&gt; nichts schiefgehen, aber es &lt;i&gt;könnte&lt;/i&gt; doch sein ... und dann?&lt;/p&gt;

&lt;p&gt;An dem Punkt dachte ich dann über folgendes nach: Warum können wir mit einem Framework nicht machen, was ein Browser heute schon kann (und andere  Software eigentlich auch können sollte): Silent-Update! Also, ein Update installieren ohne dass was schiefgeht? Ganz einfach: Weil dann etwas schiefgehen &lt;u&gt;wird&lt;/u&gt;, Murphy's Law, kennt jeder.&lt;/p&gt;

&lt;p&gt;Nach tausend "ja, aber..." Gedanken machte es dann bei mir *klick* (ich möchte jetzt keinen "Schnellmerker" Kommentar hören!) ... sowas wie "Silent-Updates" machen wir doch ... nur eben nicht wir Entwickler bei uns selbst, sondern wir Entwickler beim Kunden. Sobald die Anwendung getestet und für gut befunden ist wird diese meist auch deployed (und ich hoffe mal, dass die Anwendung dann immer noch funktioniert) und dies in der Regel ohne das der Kunden nochmal dazu extra ein "Ja, updaten" Knopf drücken muss.&lt;/p&gt;

&lt;p&gt;Aber kann man einen PHP-Code nicht auch so schreiben, dass man das zugrunde liegende Framework jederzeit gegen eine neuere Version eintauschen könnte? Ich setze vorraus, dass keine Architektonischen Änderungen am Framework vorgenommen werden, dass also das Framework "manual-compatible" ist. Wie ist deine Meinung dazu? Wie müsste der Code dazu aussehen? Kann man solchen Code überhaupt schreiben? Oder ist das Utopie?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4097639809240086703-5401124943637900959?l=softwareentwickler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/softwareentwicklerblog?a=E5_FfOMX0cg:o32ejrR10hw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/softwareentwicklerblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/softwareentwicklerblog/~4/E5_FfOMX0cg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/softwareentwicklerblog/~3/E5_FfOMX0cg/das-framework-updaten.html</link><author>noreply@blogger.com (Sascha Presnac)</author><thr:total>4</thr:total><feedburner:origLink>http://softwareentwickler.blogspot.com/2011/08/das-framework-updaten.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4097639809240086703.post-7096704146836276182</guid><pubDate>Thu, 14 Jul 2011 18:43:00 +0000</pubDate><atom:updated>2011-07-14T23:27:14.043+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Programme</category><category domain="http://www.blogger.com/atom/ns#">Allgemein</category><title>Werkzeugkasten 2011</title><description>Nils von &lt;a href="http://www.phphatesme.com/blog/tools/mein-werkzeugkasten-2011/"&gt;phphatesme.com&lt;/a&gt; hatte eine tolle Idee: Warum schreiben wir nicht jährlich unsere Tools und Programme auf, die wir so verwenden und können uns dann im Rückblick über uns selbst freuen, was wir vor x Jahren doch alles für Steinwerkzeuge benutzt haben und dass es ja früher alles ja eh entweder viel besser war (wenn es mal wieder schlecht läuft) oder viel härter war (wenn dem Kollegen die Loorbeeren zu schnell zufallen).&lt;br /&gt;
&lt;br /&gt;
Und weil ich das auch für eine gute Idee halte und Selbstironie nie verkehrt ist, mache ich da mit. Hier also die Tools, Programme, Helferlein die ich 2011 benutze, allerdings ohne spezielle Reihenfolge, dafür bin ich derzeit einfach zu faul.&lt;br /&gt;
&lt;br /&gt;
Schwerpunkt dieses Jahr: &lt;b&gt;PHP &lt;/b&gt;und &lt;b&gt;MySQL&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Zend Studio&lt;/b&gt;&lt;br /&gt;Meine IDE für PHP und alles, was damit einhergeht. Besonders den Debugger und den Profiler möchte ich nicht mehr missen. Die IDE kann alles, was ich täglich brauche und es gibt immer noch Dinge und Features, die ich noch entdecken kann. Dieses Jahr trübt ein kleiner (aber für mich umso schwerer wiegender) Encoding-Bug das Erlebnis, aber lt. Zend Support wird diesem im nächsten Release (wieder) gefixed.&lt;br /&gt;Einziger Zusatz ist die SVN Unterstützung von CollabNet; die&amp;nbsp;standardmäßige&amp;nbsp;SVN Unterstützung ist wirklich nicht so toll ;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Zend Server&lt;/b&gt; (Community Edition)&lt;br /&gt;Apache, PHP und MySQL "out-of-the-box" und absolut&amp;nbsp;update-fähig&amp;nbsp;auf Knopfdruck, so stelle ich mir einen modernen Webserver vor. Ebenso positiv: Die Administration via Webinterface. Kostenlos und als PHP 5.2 und PHP 5.3 Version, derzeit schwerpunktmäßig im Einsatz: PHP 5.2&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SVN &lt;/b&gt;und &lt;b&gt;Vercue &lt;/b&gt;(SVN Monitor)&lt;br /&gt;Ohne kommt man nicht mehr hin. Versionskontrollsysteme (VCS) sollten in keinem professionellen Umfeld fehlen und bei der Menge an verschiedenen Kundensystemen und -seiten brauche ich auch eine schnelle Übersicht über alle SVN Projekte auf dem Server (wer hat was wann eingecheckt in der Systray) und bekomme bei ganz wichtigen Projekten sogar eine Mail, sobald eine Änderung eingeht. Sehr nützliches Werkzeug. Derzeit beim Test von &lt;b&gt;SubversionEdge&lt;/b&gt;, mal sehen...&lt;/li&gt;
&lt;li&gt;&lt;b&gt;FileZilla&lt;/b&gt;&lt;br /&gt;Irgendwie müssen die neuen Daten ja auf den Kundenserver, oder? Und die Auftritte der Neukunden müssen auch zu mir kommen. Filezilla macht das alles und zur Not sogar gleichzeitig auf mehreren Kundenservern. Dank Filterlisten, Serververwaltung und Warteschlange.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Outlook&lt;/b&gt; (ja, &lt;b&gt;MS Office&lt;/b&gt;)&lt;br /&gt;Outlook hilft mir, meine Mails, meine Termine usw. zu organisieren, so dass ich den Kopf frei habe, mich um die Programmierprobleme zu kümmern. Ich weiß, es gibt andere &lt;strike&gt;Götter &lt;/strike&gt;Mailprogramme, aber ich komme im "Buisness" am besten mit Outlook klar.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Firefox&lt;/b&gt; mit &lt;b&gt;Firebug&lt;/b&gt;&lt;br /&gt;Muss ich dazu noch irgendwas sagen?&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Zend Toolbar&lt;/b&gt;&lt;br /&gt;Nützliches AddOn, für Firefox, für Chrome und IE&lt;/li&gt;
&lt;li&gt;&lt;b&gt;WebDeveloperTools&lt;/b&gt;&lt;br /&gt;Sehr nützliche Erweiterung für den Firefox.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Chrome&lt;/b&gt;, &lt;b&gt;Opera&lt;/b&gt;, &lt;b&gt;IE9&lt;/b&gt;&lt;br /&gt;Alle nennenswerten Browser zum testen der Seiten; ich favorisiere eigentlich keinen, aber Chrome läuft gefühlt am flüssigsten, gefolgt von IE9. Opera nehme ich nur zum testen.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;devart MySQL Studio&lt;/b&gt;&lt;br /&gt;DAS Tool für MySQL und die erstellung an Analyse komplexer Querys. Irgendwann schreibe ich mal einen längeren Beitrag dazu. Auf jeden Fall solltet ihr euch das Programm mal ansehen, wenn ihr vorhabt, komplexe Querys zu erstellen oder vorhandene Querys zu optimieren. Die Express Version ist kostenlos zum reinschnuppern ;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Notepad2&lt;/b&gt;&lt;br /&gt;So schnell wie das original, aber zusätzlich noch Sytax Coloring und Zeilennummern. Für schnelle Sachen ("kannste-mal-eben-...") super.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Notepad++&lt;/b&gt;&lt;br /&gt;Sollte mittlerweile auch jeder auf dem System haben, also keine weiteren Worte.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Sysinternals Suite&lt;/b&gt; (WSCC - Windows System Control Center)&lt;br /&gt;Aus der Sysinternals Suite nutze ich vor allem den Process Explorer und "autoruns", das WSCC hält mir dabei alles up-to-date, ohne dass ich immer nachsehen muss.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;VirtualBox&lt;/b&gt;&lt;br /&gt;Einmal Linux blau, einmal Windows 98, einmal MacOS in der Dose ... Virtualisierung ist toll.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;KeePass&lt;/b&gt;&lt;br /&gt;Passwörter sollte man gut wählen. Dabei werden die so komplex, dass die sich kein normaler Mensch merken kann. Aber dazu gibt es ja KeePass. Keine Angst vor 30-stelligen Kundenpasswörtern ;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Screenpresso&lt;/b&gt;&lt;br /&gt;Klein, nützlich und im SysTray, so könnte man Screenpresso bei 99% seiner Zeit beschreiben. Das restliche Prozent hat es in sich. Screenshots kennt jeder, muss jeder ab und zu mal machen, der Druck zur "Druck" Taste ist nicht weit ... und dann? Bildbearbeitung auf (dauert gefühlte 2 Tassen Kaffee) nur um ein paar lästige kanten und den Desktop zu entfernen. Screenpresso nimmt nur einen Teil des Bildschirms auf. "Druck" drücken, Bereich entweder auswählen (Programm-Box Wahl) oder per Bereichsauswahl markieren, LMT drücken und schon kann man den Screenshot sogar nochmal - grob -&amp;nbsp;Nachbearbeiten&amp;nbsp;und speichern. Wer oft Screenshots machen muss, der wird begeistert sein.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Launchy&lt;/b&gt;&lt;br /&gt;Kennt jeder Windows User: Start-Programme und das große Suchen, wo denn nun der Shortcut ist. Den Desktop mit allen Verknüpfungen auf alle Programme voll zu pflastern kann es aber auch nicht sein. Mit Lanchy kein Thema, das Tool scannt das Programme Menü (und auch Verzeichnisse eurer Wahl) und legt einen Index an. Dann startet man das Tool per Tastatur-Shortcut (STRG+ALT+BACKSPACE bei mir) und gibt z.B. "wor" ein und schon erscheint im Auswahlmenü "Word 2007", einmal ENTER und das Programm startet. Launchy lernt sogar hinzu. Wenn du W7 eingibt und Word aus der Liste suchst, wird beim nächsten mal schon Word vorgeschlagen. Die restliche Zeit verbringt Launchy nur im RAM und taucht sonst nirgends auf.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;iTunes&amp;nbsp;&lt;/b&gt;&lt;br /&gt;#Uuaaaa, und schon schreien wieder alle: Apple-Fanboy, ist was mit Windows... Nein, iTunes ist aus 2 Gründen drauf: SongBird schmiert mir ständig ab und ruiniert unter Windows7 mein Theme (will immer auf das sehr schnörkellose Theme wechseln) und zum anderen läuft es flüssig und spielt ab, was ich ihm serviere, vor allem Podcasts kommen automatisch. Einkaufen würde ich aber im Apple Store nicht ;)&lt;br /&gt;Ach ja: Falls irgendwann mal SongBird mit Windows7 Unterstützung da ist, bitte einen Hinweis an mich.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;TweetDeck&lt;/b&gt;&lt;br /&gt;Zum Twittern und "Twitter-Übersicht-behalten" reicht es mir völlig.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Windows7&lt;/b&gt;&lt;br /&gt;Kein konfigurieren, kein "apt-get irgendwas", kein "sudo kramp config --install-doch-bitte-endlich", kein "man warumgehtdasnicht" ... einfach problemlos arbeiten!&lt;br /&gt;Man merkt schon: Ich komme mit Windows einfach besser klar. Zum arbeiten ungeschlagen, der Rest ist gut für Webserver und Pinselschwinger ;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Selenium&lt;/b&gt;&lt;br /&gt;Steht mit Absicht unten. Das Tool ist mir bekannt, habe es bisher aber nur selten eingesetzt, da der Suppport für moderne Firefox Versionen nicht da war. Mit der neuen 2.0 ist das Ding nun wieder in der Gegenwart und ich plane, es häufiger einzusetzen.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
So, ich hoffe, ich habe nichts vergessen.&lt;br /&gt;
Und wie sieht deine Entwickler-Werkzeugkiste für 2011 aus?&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4097639809240086703-7096704146836276182?l=softwareentwickler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/softwareentwicklerblog?a=mVFjlyyF6C4:tqJQzEWNoYc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/softwareentwicklerblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/softwareentwicklerblog/~4/mVFjlyyF6C4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/softwareentwicklerblog/~3/mVFjlyyF6C4/werkzeugkasten-2011.html</link><author>noreply@blogger.com (Sascha Presnac)</author><thr:total>9</thr:total><feedburner:origLink>http://softwareentwickler.blogspot.com/2011/07/werkzeugkasten-2011.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4097639809240086703.post-4036809384151281964</guid><pubDate>Tue, 12 Jul 2011 14:45:00 +0000</pubDate><atom:updated>2011-07-12T16:45:01.643+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">zend</category><category domain="http://www.blogger.com/atom/ns#">Firefox</category><title>Zend Toolbar 2.5 für Firefox 5</title><description>&lt;div style="font-family: inherit;"&gt;
Kurz notiert: Es ist zwar noch nicht ganz offiziell, aber für alle, die auf die Zend Toolbar für Zend Studio angewiesen sind oder nicht mehr ohne dieses tolle AddOn arbeiten können gibt es &lt;a href="http://forums.zend.com/viewtopic.php?f=59&amp;amp;t=15403" target="_blank"&gt;im Zendforum die Toolbar 2.5 als Betaversion zum download&lt;/a&gt;.&lt;/div&gt;
Bei mir funktioniert diese ohne Probleme:&lt;br /&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-zuXtjDI9XcY/ThwHHAj93bI/AAAAAAAAAQ4/yMnL8qQ4-OI/s1600/firefox5-zendtoolbar2-5.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="356" src="http://2.bp.blogspot.com/-zuXtjDI9XcY/ThwHHAj93bI/AAAAAAAAAQ4/yMnL8qQ4-OI/s400/firefox5-zendtoolbar2-5.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;i&gt;Die Zend Toolbar 2.5 im Firefox 5&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4097639809240086703-4036809384151281964?l=softwareentwickler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/softwareentwicklerblog?a=eRxLjPdFiMM:WHRpPccMsc8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/softwareentwicklerblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/softwareentwicklerblog/~4/eRxLjPdFiMM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/softwareentwicklerblog/~3/eRxLjPdFiMM/zend-toolbar-25-fur-firefox-5.html</link><author>noreply@blogger.com (Sascha Presnac)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-zuXtjDI9XcY/ThwHHAj93bI/AAAAAAAAAQ4/yMnL8qQ4-OI/s72-c/firefox5-zendtoolbar2-5.png" height="72" width="72" /><thr:total>0</thr:total><georss:featurename>Unbekannter Ort.</georss:featurename><georss:point>51.43517639096306 6.529526710510254</georss:point><georss:box>51.43270189096306 6.524591210510254 51.437650890963056 6.534462210510254</georss:box><feedburner:origLink>http://softwareentwickler.blogspot.com/2011/07/zend-toolbar-25-fur-firefox-5.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4097639809240086703.post-7037403113058893916</guid><pubDate>Mon, 11 Jul 2011 16:00:00 +0000</pubDate><atom:updated>2011-07-12T06:58:49.153+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PHP</category><title>substr_compare und die Länge der Parameter</title><description>&lt;p&gt;Also, bei sowas:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;substr_compare() [&lt;a href="http://de.php.net/function.substr-compare"&gt;function.substr-compare&lt;/a&gt;]: The length must be greater than zero&lt;/pre&gt;&lt;/blockquote&gt;Hilft sowas:&lt;br /&gt;
&lt;pre class="php" name="code"&gt;if (strlen($param1)&amp;gt;0 &amp;amp;&amp;amp; strlen($param2)&amp;gt;0) {
 // irgendwas mit substr_compare($param1, $param2, 5, 15, ...)
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4097639809240086703-7037403113058893916?l=softwareentwickler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/softwareentwicklerblog?a=zhrmJIyzkGw:eWSAEKWo8HU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/softwareentwicklerblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/softwareentwicklerblog/~4/zhrmJIyzkGw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/softwareentwicklerblog/~3/zhrmJIyzkGw/substrcompare-und-die-lange-der.html</link><author>noreply@blogger.com (Sascha Presnac)</author><thr:total>5</thr:total><feedburner:origLink>http://softwareentwickler.blogspot.com/2011/07/substrcompare-und-die-lange-der.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4097639809240086703.post-6771293800812691332</guid><pubDate>Tue, 28 Jun 2011 18:43:00 +0000</pubDate><atom:updated>2011-06-28T20:45:12.550+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Zend Framework</category><category domain="http://www.blogger.com/atom/ns#">PHP</category><title>Fatal Error im neuen Zend Framework Projekt</title><description>&lt;p&gt;Ich setze grad eine neues Zend Framework Projekt im Zend Studio auf, vergebe Namen und Ort, Zend Studio macht auch einiges und *plop* ein neues Projekt ist geboren.&lt;/p&gt;

&lt;p&gt;Zend Server und hosts noch einstellen und ein kleiner Test im Browser sagt mir: "Ja, alles okay, Projekt kann starten!"&lt;/p&gt;

&lt;p&gt;Aber schon nach den ersten paar Zeilen im index Controller gehts los:&lt;/p&gt;

&lt;blockquote&gt;&lt;b&gt;Fatal error&lt;/b&gt;:  Cannot redeclare class zend_loader. If this code 
worked without the Zend Optimizer+, please set 
zend_optimizerplus.dups_fix=1 in your php.ini in &lt;b&gt;C:\zend\Apache2\htdocs\blahblah\library\Zend\Loader\PluginLoader.php&lt;/b&gt; on line &lt;b&gt;27&lt;/b&gt;&lt;/blockquote&gt;

&lt;p&gt;Nach langem Suchen: Die Lösung findet sich in der /public/index.php, dort diese Zeilen auskommentieren:&lt;/p&gt;

&lt;pre class="php" name="code"&gt;// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));&lt;/pre&gt;

&lt;p&gt;Dann funktionieren auch wieder alle Aufrufe ;)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4097639809240086703-6771293800812691332?l=softwareentwickler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/softwareentwicklerblog?a=0hlBd4GDaco:8S4RPcFvIKM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/softwareentwicklerblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/softwareentwicklerblog/~4/0hlBd4GDaco" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/softwareentwicklerblog/~3/0hlBd4GDaco/zf-fehlermeldungen.html</link><author>noreply@blogger.com (Sascha Presnac)</author><thr:total>0</thr:total><feedburner:origLink>http://softwareentwickler.blogspot.com/2011/06/zf-fehlermeldungen.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4097639809240086703.post-4476366740576232703</guid><pubDate>Tue, 21 Jun 2011 20:14:00 +0000</pubDate><atom:updated>2011-06-21T22:14:22.597+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Zend Framework</category><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">clean code</category><category domain="http://www.blogger.com/atom/ns#">art of code</category><category domain="http://www.blogger.com/atom/ns#">CodeIgniter</category><category domain="http://www.blogger.com/atom/ns#">refactoring</category><title>Method-Chaining in eigenen PHP-Projekten einsetzen</title><description>&lt;p&gt;Klassen und Objekte kennt ja nun mittlerweile fast jeder, ein PHP-Framework wie ZendFramework oder CodeIgniter haben sich sicherlich auch schon viele zumindest mal angesehen … will ich hoffen. Nun, auch wenn man die Frameworks nicht direkt einsetzt, so kann man doch viel von ihnen lernen. Viele der Techniken, die in bekannten PHP-Frameworks eingesetzt werden, entstanden entweder aus dem großen Ästhetischen Faible, den nun mar jeder Entwickler hat oder schlicht aus Faulheit der Programmierer ;)&lt;/p&gt;

&lt;p&gt;Egal, eines der – wie ich finde – tollen Features in vielen Frameworks ist die Möglichkeit, mehrere Funktionen eines Objektes hintereinander aufrufen zu können, ja, es sieht schon fast wie ein normaler Satz aus, was dann im Editor steht und seinen Dienst verrichtet. Diese Möglichkeit der sog. “Fluent Interfaces” nennt man “Method-Chaining” (und wieder im Bullshot-Bingo gewonnen, *strike*).&lt;/p&gt;

&lt;p&gt;Kleines Beispiel, kennen wir alle, unsere Basisklasse:&lt;/p&gt;

&lt;pre class="php" name="code"&gt;class Base1 {
 function macheEins() {
  // some magic here
 }
 function macheZwei($parameter) {
  // more magic here
 }
}&lt;/pre&gt;

&lt;p&gt;Das ganze rufe ich nun auf:&lt;/p&gt;

&lt;pre class="php" name="code"&gt;$myBaseClass = new Base1();
$result1 = $myBaseClass-&amp;gt;macheEins();
$result2 = $myBaseClass-&amp;gt;macheZwei($result1);&lt;/pre&gt;

&lt;p&gt;Was passiert? Das Ergebnis des Aufrufs von “macheEins” ist der Parameter für “macheZwei”. Das ganze sieht strukturiert aus und ist lesbar, was also soll man besser machen können? Nein! Bitte jetzt nicht sagen, man könne doch sowas machen:&lt;/p&gt;

&lt;pre class="php" name="code"&gt;$myBaseClass = new Base1();
$result2 = $myBaseClass-&amp;gt;macheZwei($myBaseClass-&amp;gt;macheEins());&lt;/pre&gt;

&lt;p&gt;Sicher, es funktioniert, aber: NEIN! Macht das nicht! Warum? Ganz einfach: Debugge das mal, viel Spaß. Denn wenn man erst einmal mit so einem falschen Verhalten anfängt, dann verschachteln sich schnell auch mal 5 oder 8 Funktionen ineinander und finde dann mal den Fehler, viel Spaß! Also: Ganz klares “So nicht!”.&lt;/p&gt;

&lt;p&gt;Aber wie dann?&lt;/p&gt;

&lt;p&gt;Zunächst müssen uns im klaren sein, was die Klasse macht. Offenbar braucht “macheZwei” ein Ergebnis einer Berechnung einer anderen Funktion der Klasse. Dieses Ergebnis könnte man doch genauso innerhalb der Klasse speichern und dann benutzen.&lt;/p&gt;
&lt;pre class="php" name="code"&gt;class Base2 {
 private $valueHolder;
 function macheEins() {
  $this-&amp;gt;valueHolder = someMagic;
  return $this-&amp;gt;valueHolder;
 }
 function macheZwei() {
  return $this-&amp;gt;valueHolder * someMoreMagic;
 }
}&lt;/pre&gt;

&lt;p&gt;Schon erfüllt die Klasse auch die Anforderungen, aber … so richtig “fluent” will das ganze nicht werden, obwohl ja nun im Aufruf von “macheZwei” der Übergabeparameter fehlt. Was nun? Und wie sieht denn so ein “Fluent Interface” mit “Method-Chaining” nun aus? Der Aufruf sähe in unserem Beispiel in etwa so aus:&lt;/p&gt;
&lt;pre class="php" name="code"&gt;$myBaseClass = new BaseFluent();
$result2 = $myBaseClass-&amp;gt;macheEins()-&amp;gt;macheZwei();&lt;/pre&gt;

&lt;p&gt;Aber unsere derzeitige Klasse unterstützt das nicht! Wie bekommen wir unsere Klasse nun “Fluent”?&lt;/p&gt;

&lt;p&gt;Nun, dazu müssen wir diese massiv umbauen. Der größte Umbau ist, dass die einzelnen Methoden nicht mehr direkt die Ergebnisse liefern, sondern “nur” das Objekt selbst zurückgeben … und darin liegt auch schon der ganze Trick. Den Methodenaufruf kann ich immer nur auf einem Objekt machen. Eine Methode, die mir einen Basisdatentypen zurück liefert, kann ich dafür nicht gebrauchen, da ich auf diesem Basistypen (int, String, array, …) keine weiteren Methoden meiner Klasse aufrufen kann.&lt;/p&gt;

&lt;p&gt;Nehmen wir mal an, im letzten Code stünde statt “new BaseFluent” ein “new Base2”. Dann würde der Aufruf:&lt;/p&gt;

&lt;pre class="php" name="code"&gt;$result2 = $myBaseClass-&amp;gt;macheEins()-&amp;gt;macheZwei();&lt;/pre&gt;

&lt;p&gt;folgendes bedeuten: Rufe die Methode “macheEins” auf dem Objekt “myBaseClass” auf, diese gibt den Datentyp von valueHolder zurück (nehmen wir mal an, es wäre ein integer mit dem rein zufälligen Wert 42), rufe dann auf dem Objekt 42 die Methode “macheZwei” auf … *meep* Fehlermeldung, “42” ist kein Objekt, hat daher generell keine Methoden und erst recht keine spezielle Methode mit dem Namen “macheZwei” also Fehler und Script Abbruch.&lt;/p&gt;

&lt;p&gt;Der Trick besteht nun darin, dass die Methoden des Objektes nicht mehr die eigentlichen Ergebnisse zurückgeben, sondern das Objekt der Klasse selbst; darauf darf man ja dann auch wieder Methoden derselben Klasse aufrufen, also bauen wir flugs die Klasse um:&lt;/p&gt;

&lt;pre class="php" name="code"&gt;class BaseFluent {
 private $valueHolder;
 function macheEins() {
  $this-&amp;gt;valueHolder = someMagic;
  return $this;
 }
 function macheZwei() {
  $this-&amp;gt;valueHolder *= someMoreMagic;
  return $this;
 }
 function getValueHolder() {
  return $this-&amp;gt;valueHolder;
 }
}&lt;/pre&gt;

&lt;p&gt;Man erkennt nun, wohin die Reise geht. Getter und Setter werden implementiert, um die Daten zu holen, die Methoden geben uns $this zurück, worauf wir weiterhin Klassenmethoden aufrufen können und wir haben nun unser “&lt;a href="http://de.wikipedia.org/wiki/Fluent_Interface" target="_blank"&gt;Fluent Interface&lt;/a&gt;” für “Method-Chaining” in PHP realisiert; war doch gar nicht schwer und hat auch gar nicht weh getan, oder?&lt;/p&gt;

&lt;p&gt;In der freien Wildbahn trefft ihr auf diese Art des Codens übrigens ganz stark beim ZendFramework an, bei CodeIgniter geht es wohl auch, denke ich (ich mache mich da erst seit kurzem fit und bitte alle CI-Fans, meine Unwissenheit zu entschuldigen). Es macht aber auch Spaß, dass bei eigenen Klassen umzusetzen, die sowieso umgearbeitet werden sollen. Sieht einfach viel übersichtlicher aus. Und noch ein Tipp: Mehr als zwei Verkettungen sollten untereinander stehen, also so:&lt;/p&gt;

&lt;pre class="php" name="code"&gt;
$myBaseClass-&gt;macheEins()
   -&gt;macheZwei()
   -&gt;macheDrei()
   -&gt;undNochMehr();
&lt;/pre&gt;

&lt;p&gt;Viel Erfolg damit …&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4097639809240086703-4476366740576232703?l=softwareentwickler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/softwareentwicklerblog?a=KXmnEZ_el-g:c9g3gBYwAIU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/softwareentwicklerblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/softwareentwicklerblog/~4/KXmnEZ_el-g" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/softwareentwicklerblog/~3/KXmnEZ_el-g/method-chaining-in-eigenen-php.html</link><author>noreply@blogger.com (Sascha Presnac)</author><thr:total>3</thr:total><feedburner:origLink>http://softwareentwickler.blogspot.com/2011/06/method-chaining-in-eigenen-php.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4097639809240086703.post-1530110780004922405</guid><pubDate>Tue, 07 Jun 2011 20:01:00 +0000</pubDate><atom:updated>2011-06-07T22:12:04.985+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">art of code</category><title>10 Regeln für Entwickler</title><description>Es gibt viele "Regeln" zum Programmieren, viele "Goldene Regeln"; das hier sind meine.&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;Glaube nicht, wisse!&lt;/b&gt;&lt;br /&gt;Glauben heißt, nicht zu wissen. Sei kein Gläubiger, sei ein Wissender! Hebe dich von der Schar derer ab, die nur Oberflächliches kennen, jene, die nur auswendig lernen, was in den "xyz for dummies" Büchern steht. Du bist anders, du bist smart: Du verstehst, was da steht!&lt;br /&gt;&amp;nbsp; &lt;/li&gt;
&lt;li&gt;&lt;b&gt;"Know your Enemy"&lt;/b&gt;&lt;br /&gt;”Kenne deinen Feind”; lerne Sachen, die du hasst; verdamme nicht einfach Dinge, die neu oder anders sind: Lerne Sie, verstehe, warum diese Dinge so sind, warum ein Autor das auf diese Weise gelöst hat und wieso nicht anders. Verinnerliche neues, sei bereit für die Änderung, wiege alle Optionen ab: Und dann nimm die am besten passende!&lt;br /&gt;&amp;nbsp; &lt;/li&gt;
&lt;li&gt;&lt;b&gt;Notepad? Benutz eine IDE!&lt;/b&gt;&lt;br /&gt;Benutze eine IDE; Lerne die Features “deiner” IDE kennen und nutze diese Gnadenlos aus! Verstehe, dass jeder "seine" IDE braucht und das keine IDE wirklich besser ist als eine andere: Es kommt nur auf den Entwickler an, der den Code schreibt!&lt;br /&gt;&amp;nbsp; &lt;/li&gt;
&lt;li&gt;&lt;b&gt;Benutze Standards&lt;/b&gt;&lt;br /&gt;Standards wurden von schlauen Menschen entwickelt, damit diese auch mit Code zurecht kommen, den weniger schlaue Hacker schrieben; du benutzt deinen eigenen Standard nicht, weil du ein guter Entwickler bist; Du benutzt deinen eigenen Stil, weil du die Standards bisher nicht verstanden hast! (siehe 1,2)&lt;br /&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Object to go&lt;/b&gt;&lt;br /&gt;Klassen erleichtern dir das Leben: Sie lösen eine Aufgabe und das machen Sie effizient; ist die Klasse gut, macht Sie das sogar auf einer abstrakten Ebene und du kannst die Klasse nicht nur für dieses Problem einsetzen, sondern für alle ähnlichen Probleme. Aus (1) erkennst du, wie toll das ist, du nimmst die Klasse mit und bist fast am Ziel.&amp;nbsp;Klassen und Objekte sind dein Freund: Benutze Sie auch!&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Kommentiere weise&lt;/b&gt;&lt;br /&gt;Kommentiere deine Funktionen, deine Klassen, eine extrem schwer zu verstehende Stelle im Code oder eine Stelle, in der du mal von der internen Norm abweichen musstest;&amp;nbsp;Kommentiere nichts triviales; Kommentiere keine Kommentare -&amp;gt; das ist Code, kein Chat!&lt;br /&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Hacke nicht, komponiere&lt;/b&gt;&lt;br /&gt;Programmier kann jeder, wahrhaft entwickeln ist eine Kunst. Die richtige Wahl der Werkzeuge, das Arrangement der Funktionen, die Sitzordnung des Frameworks, die kurze Ruhe vor dem Beginn des Deployments ... Du programmierst nicht, du komponierst Code und diese Kunst kann keiner Würdigen ... außer ein anderer Codeponist.&lt;br /&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Bleib auf dem Teppich&lt;/b&gt;&lt;br /&gt;Ja, du bist der tollste Coder der Welt, aber keiner nimmt es zur Kenntnis? Liegt daran, dass keiner deinen Code lesen kann. Lesbarkeit ist wichtig, vor allem für dich selbst. Lies dich mal nach 12 Monaten und 4 Zwischenprojekten wieder in deinen "hochoptimierten", "perfekten" und "commentless" Code ein ... und dann weißt du, dass du (3),(4),(5) und (6) nicht verstanden hast. Sechs, setzen ... Anfänger!&lt;br /&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Teile und herrsche&lt;/b&gt;&lt;br /&gt;Wussten schon die Römer, nur du weisst es wieder nicht. Teile dein Wissen, denn wenn du nicht fähig bist zu lehren, dann hast du es nicht richtig verstanden (siehe 1 und 2). Bringe dein Team auf deinen Wissenstand und messe dich regelmäßig mit stärkeren, mit schlaueren, mit "Wissenden" ... denn nur im direkten "Code-Wettkampf", sei es nun mündlich oder als Code-Kata, kannst du erst über dich hinaus wachsen, deine Schwächen erkennen (und die hast du, glaube mir) und damit erst bist du in der Lage, dich zu verbessern. Wisse, dass du nichts weist; Plato wusste das auch ... und du lernst das auch noch vom Kollegen nebenan!&lt;br /&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Don't Panic&lt;/b&gt;&lt;br /&gt;Die wichtigste Regel und ich hoffe, ich muss dazu nichts mehr sagen!&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
"&lt;i&gt;Dies sind meine Regeln,&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;es gibt viele Regeln, aber diese sind meine...&lt;/i&gt;"&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Wie sehen deine aus???&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4097639809240086703-1530110780004922405?l=softwareentwickler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/softwareentwicklerblog?a=QTkLae2_ncw:hqQH3awxXDs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/softwareentwicklerblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/softwareentwicklerblog/~4/QTkLae2_ncw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/softwareentwicklerblog/~3/QTkLae2_ncw/10-regeln-fur-entwickler.html</link><author>noreply@blogger.com (Sascha Presnac)</author><thr:total>0</thr:total><feedburner:origLink>http://softwareentwickler.blogspot.com/2011/06/10-regeln-fur-entwickler.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4097639809240086703.post-7557542114938010626</guid><pubDate>Mon, 30 May 2011 15:45:00 +0000</pubDate><atom:updated>2011-05-30T17:45:00.639+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Zend Framework</category><category domain="http://www.blogger.com/atom/ns#">PHP</category><title>ISO 3166 Code für eine Benutzereingaben finden ... mit dem Zend Framework</title><description>&lt;p&gt;Stichwort Benutzer-Regisitrierung mit Angabe des Landes: Der User gibt ein "Deutschland", ist ja auch okay so, aber eure Anwendung (oder eine Drittanwendung) braucht den ISO Code dazu. Und was ist mit Schweiz oder einem Land wie Mexico?&lt;/p&gt;
&lt;p&gt;Was nun? Eine lange Tabelle pflegen, womöglich noch selber? Das geht heute viel einfacher, zumindest, wenn man das Zend Framework benutzt:&lt;/p&gt;

&lt;pre name="code" class="php"&gt;
$locale = new Zend_Locale('DE');
$list = $locale-&gt;getTranslationList('territory', 'de_de');
$filterlist = array_search('Deutschland', $list);
echo $filterlist;
&lt;/pre&gt;

&lt;p&gt;Der Trick ist nun, dass wir uns eine Liste aller Länder mit den Codes ausgeben lassen, diese Liste ist in der Sprache, in der die Besucher auch die Daten eingeben (hier Deutsch). Nun suchen wir mit &lt;a href="http://de.php.net/array_search" target="_blank"&gt;array_search()&lt;/a&gt; einfach den richtigen Wert raus (oder reagieren mit einem Fehler auf nicht gefunden, das ist hier nicht mit drin).&lt;/p&gt;

&lt;p&gt;Die Ausgabe lautet richtigigerweise DE.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4097639809240086703-7557542114938010626?l=softwareentwickler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/softwareentwicklerblog?a=wmdBDlDTYn8:qHchvV1nFp4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/softwareentwicklerblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/softwareentwicklerblog/~4/wmdBDlDTYn8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/softwareentwicklerblog/~3/wmdBDlDTYn8/iso-3166-code-fur-eine-benutzereingaben.html</link><author>noreply@blogger.com (Sascha Presnac)</author><thr:total>0</thr:total><feedburner:origLink>http://softwareentwickler.blogspot.com/2011/05/iso-3166-code-fur-eine-benutzereingaben.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4097639809240086703.post-337326136373647945</guid><pubDate>Wed, 25 May 2011 14:30:00 +0000</pubDate><atom:updated>2011-05-25T16:30:02.740+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">JavaScript</category><category domain="http://www.blogger.com/atom/ns#">JSON</category><category domain="http://www.blogger.com/atom/ns#">jQuery</category><title>JSONP mit jQuery</title><description>&lt;p&gt;&lt;a href="http://de.wikipedia.org/wiki/JSON" target="_blank"&gt;JSON&lt;/a&gt; Daten mit &lt;a href="http://jquery.com" target="_blank"&gt;jQuery&lt;/a&gt; zu senden sollte ja kein Problem mehr sein.&lt;/p&gt;
&lt;p&gt;Allerdings: Möchte ich die Daten nicht an "mich" selbst, sondern an eine andere Domain senden, dann funktioniert das nicht mit &lt;a href="http://api.jquery.com/jQuery.post/" target="_blank"&gt;jQuery.post()&lt;/a&gt;, da JSON unter die "Single Domain" Policy fällt ... die ja auch eine sinnvolle Einrichtung ist.&lt;/p&gt;
&lt;p&gt;Allerdings wird es in Zeiten immer engerer Vernetzung mitunter nötig, Daten vom Kundenserver A beim Dienstleister B abzufragen. Dazu braucht man dann &lt;a href="http://de.wikipedia.org/wiki/JavaScript_Object_Notation#JSONP_.28JSON_mit_Padding.29" target="_blank"&gt;JSONP&lt;/a&gt; - JSON mit &lt;u&gt;P&lt;/u&gt;adding.&lt;/p&gt;
&lt;p&gt;Wie bereits erwähnt, unterstützt jQuery.post() das ganze &lt;u&gt;nicht&lt;/u&gt;, hauptsächlich darum, weil es nur JSON, HTML, XML oder Script verarbeitet (siehe Doku) ... leider :(&lt;/p&gt;
&lt;p&gt;Doch jQuery's AJAX Funktionen bieten ja auch die &lt;a href="http://api.jquery.com/jQuery.ajax/" target="_blank"&gt;jQuery.ajax()&lt;/a&gt;-Methode selbst an, die wir beliebig konfigurieren können.&lt;/p&gt;
&lt;p&gt;Heraus kommt dann solch ein Konstrukt, welches in der Lage ist, die JSON Daten auch an andere Domains zu senden. Leider werden diese nicht im "reinen" JSON Format gesendet, sondern als "data" Parameter in JSON Format ... das Serverscript sollte da etwas tolerant sein ;)&lt;/p&gt;
&lt;p&gt;myJSONObject sollte natürlich vorher korrekt initialisiert worden sein.&lt;/p&gt;
&lt;pre name="code" class="js"&gt;
 $.ajax({
     type:    'POST',
     url:    'http://example.com/subfolder/script.php',
     contentType :  'application/x-www-form-urlencoded',
     data:  {data: JSON.stringify(myJSONObject)},
     success:   function(data){
      console.log('succ');
      console.log(data);
     },
     dataType: 'jsonp'
   });
&lt;/pre&gt;
&lt;p&gt;Viel Erfolg damit ;)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4097639809240086703-337326136373647945?l=softwareentwickler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/softwareentwicklerblog?a=hO1CtQNHIJk:IcSuxgWhHiw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/softwareentwicklerblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/softwareentwicklerblog/~4/hO1CtQNHIJk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/softwareentwicklerblog/~3/hO1CtQNHIJk/jsonp-mit-jquery.html</link><author>noreply@blogger.com (Sascha Presnac)</author><thr:total>0</thr:total><georss:featurename>Vluyn, Neukirchen, Deutschland</georss:featurename><georss:point>51.438512 6.532387999999969</georss:point><georss:box>51.42362 6.509103499999969 51.453404000000006 6.555672499999969</georss:box><feedburner:origLink>http://softwareentwickler.blogspot.com/2011/05/jsonp-mit-jquery.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4097639809240086703.post-9094452714310651037</guid><pubDate>Wed, 11 May 2011 20:08:00 +0000</pubDate><atom:updated>2011-05-11T22:08:40.543+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">offtopic</category><title>Offtopic: Verbesserungsvorchlag zur Erhöhung der Reichweite von Elektroautos</title><description>&lt;p&gt;Offtopic: Was mir schon länger im Kopf rumgeht, ist eine Idee von mir, die die Reichweite von Elektroautos erhöhen könnte - und ich möchte bitte gesagt bekommen: "Du Sascha, deine Idee ist schmarrn, weil ...".&lt;/p&gt;

&lt;p&gt;Also, die Idee: So ein Elektroauto bewegt sich ja und dafür ist in aller Regel ja in irgendeiner Form eine Welle verantwortlich. Überhaupt bewegen sich an so einem Auto im allgemeinen eine Menge Sachen. Mich interessieren nun nur die Teile, die rotieren, also Wellen usw.&lt;/p&gt;

&lt;p&gt;Legt man nun um die Wellen einen &lt;a href="http://de.wikipedia.org/wiki/Elektrischer_Generator" target="_blank"&gt;elektrischen Generator&lt;/a&gt; (&lt;a href="http://de.wikipedia.org/w/index.php?title=Datei:Generator.png&amp;filetimestamp=20091106135019" target="_blank"&gt;schematische Darstellung&lt;/a&gt;) in der Form, dass man die Induktionsspulen an einer Hülle an der Karosserie befestigt und die Rotoren um die Welle - so wird die Welle zur Antriebsachse - dann sollte diese Konstruktion Strom erzeugen. Diesen Strom kann man nun nutzen, um die Batterie wieder aufzuladen, solange das Auto fährt. Befestigt man mehrere dieser Generatoren um die verschiedenen Achsen, und berücksichtigt man, dass man eine ausgewogene Balance zwischen Brems- und Stromerzeugungswirkung herausfinden muss, dann dürfte sich die Reichweite dieses E-Cars wohl signifikant erhöhen ... ich kann nicht sagen, um welchen Faktor, aber es sollte schon spürbar mehr Reichweite "drin" sein, als wie es derzeit ist.&lt;/p&gt;

&lt;p&gt;Und nun, wie schon gesagt, möchte ich bitte, dass mit einer Erklärt, warum das nicht. Sollte sich ein Autohersteller finden, der das einbaut, dann bitte ich, dass ich das Auto mal sehen/fahren darf.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4097639809240086703-9094452714310651037?l=softwareentwickler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/softwareentwicklerblog?a=T2_89fSAE58:F5AmQw-DJ0s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/softwareentwicklerblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/softwareentwicklerblog/~4/T2_89fSAE58" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/softwareentwicklerblog/~3/T2_89fSAE58/offtopic-verbesserungsvorchlag-zur.html</link><author>noreply@blogger.com (Sascha Presnac)</author><thr:total>3</thr:total><feedburner:origLink>http://softwareentwickler.blogspot.com/2011/05/offtopic-verbesserungsvorchlag-zur.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4097639809240086703.post-7096709028480144072</guid><pubDate>Mon, 02 May 2011 07:00:00 +0000</pubDate><atom:updated>2011-05-02T09:00:26.590+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">zend</category><category domain="http://www.blogger.com/atom/ns#">Firefox</category><title>Zend Toolbar 2.4 für Firefox 4 released</title><description>&lt;p&gt;Zend hat seine Toolbar in der Version 2.4 veröffentlicht. Endlich funktioniert das ganze auch im Firefox4, wie man an diesem Screen sieht.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_foHji-1aPXQ/Tb5Whw4S65I/AAAAAAAAAO0/w-HMTRlQ7RY/s1600-h/firefox4_zendtoolbar%5B4%5D.png" target="_blank"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="firefox4_zendtoolbar" border="0" alt="Zend Toolbar 2.4 im Firefox 4" src="http://lh4.ggpht.com/_foHji-1aPXQ/Tb5WiS24_qI/AAAAAAAAAO4/dEnKX9UHTA8/firefox4_zendtoolbar_thumb%5B2%5D.png?imgmax=800" width="489" height="329"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Danke Zend, was lange währt …&lt;/p&gt; &lt;p&gt;Die neue Toolbar bekommt ihr entweder über das AddOn-Update. Auf den &lt;a href="http://www.zend.com/de/products/studio/downloads" target="_blank"&gt;Downloadseiten&lt;/a&gt; steht noch die alte Version 2.3.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4097639809240086703-7096709028480144072?l=softwareentwickler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/softwareentwicklerblog?a=PNBGvDo1gf4:BgeXEDxRU3I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/softwareentwicklerblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/softwareentwicklerblog/~4/PNBGvDo1gf4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/softwareentwicklerblog/~3/PNBGvDo1gf4/zend-toolbar-24-fur-firefox-4-released.html</link><author>noreply@blogger.com (Sascha Presnac)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_foHji-1aPXQ/Tb5WiS24_qI/AAAAAAAAAO4/dEnKX9UHTA8/s72-c/firefox4_zendtoolbar_thumb%5B2%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://softwareentwickler.blogspot.com/2011/05/zend-toolbar-24-fur-firefox-4-released.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4097639809240086703.post-7846681128540363892</guid><pubDate>Thu, 28 Apr 2011 14:45:00 +0000</pubDate><atom:updated>2011-04-29T10:46:43.652+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Chrome</category><category domain="http://www.blogger.com/atom/ns#">Firefox</category><category domain="http://www.blogger.com/atom/ns#">firebug</category><category domain="http://www.blogger.com/atom/ns#">browser</category><title>Verbesserte Suche in Chromes Omnibar einschalten</title><description>&lt;p&gt;Wer wie in Firefox gern verschiedene Suchwörter eintippt, um dann auf die richtige URL zu kommen, der ist bei Chrome schwer enttäuscht, dass das bisher nicht ging. Eine Suche wie "frame zend man de" zeigt zum Beispiel auf die de-Seite des Zend Frameworks, ähnliche Suchen führe ich täglich mehrere dutzend mal durch; "da war doch letztens so eine Seite, da ging es um x und y und irgendwas mit z ... aha, eintrag 3".&lt;/p&gt;

&lt;p&gt;Das geht aber auch mit Chrome und zwar so (danke an &lt;a href="http://skaverat.net" target="_blank"&gt;@skaverat&lt;/a&gt; für den Tip):
&lt;ul&gt;
&lt;li&gt;Chrome 11 öffnen; ggf. vorher updaten&lt;/li&gt;
&lt;li&gt;about:flags eingeben&lt;/li&gt;
&lt;li&gt;ziemlich weit unten "Besseren Abgleich mit dem Omnibox-Verlauf ermöglichen" aktivieren&lt;/li&gt;
&lt;li&gt;Chrome neu starten&lt;/li&gt;
&lt;li&gt;keywords wie in Firefox eingeben&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;Nun fehlt mir nur noch ein nativer Firebug in Chrome und ich schmeiße Firefox weit weg ;)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4097639809240086703-7846681128540363892?l=softwareentwickler.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/softwareentwicklerblog?a=fp5xgMkDmBY:XYGYw2AWd38:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/softwareentwicklerblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/softwareentwicklerblog/~4/fp5xgMkDmBY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/softwareentwicklerblog/~3/fp5xgMkDmBY/verbesserte-suche-in-chromes-omnibar.html</link><author>noreply@blogger.com (Sascha Presnac)</author><thr:total>3</thr:total><feedburner:origLink>http://softwareentwickler.blogspot.com/2011/04/verbesserte-suche-in-chromes-omnibar.html</feedburner:origLink></item></channel></rss>

