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

<channel>
	<title>Internet Solutions &#187; Modrüvanje</title>
	<atom:link href="http://www.internet-solutions.si/category/bluzenje/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.internet-solutions.si</link>
	<description>Web development na sto in en način</description>
	<lastBuildDate>Fri, 03 Sep 2010 13:26:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Mala šola testiranja z PHPUnit in Selenium</title>
		<link>http://www.internet-solutions.si/2010/06/16/mala-sola-testiranja-z-phpunit-in-selenium/</link>
		<comments>http://www.internet-solutions.si/2010/06/16/mala-sola-testiranja-z-phpunit-in-selenium/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 12:40:07 +0000</pubDate>
		<dc:creator>alesl</dc:creator>
				<category><![CDATA[Modrüvanje]]></category>
		<category><![CDATA[Tehnologija]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[phpunit]]></category>
		<category><![CDATA[selenium]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[xdebug]]></category>

		<guid isPermaLink="false">http://www.internet-solutions.si/?p=81</guid>
		<description><![CDATA[Debugging Sucks! Testing Rocks!
Tale članek sem se spravil pisat že dobro leto nazaj. Vmes sem tudi sformatiral disk in so šle stvari v tri &#8230; Kljub temu da je članek še vedno nedokončan sem se odločil da ga objavim, saj bo marsikomu v pomoč pri prvih korakih TDD-ja.
Prvi odziv programerjev ob omembi Test-Driven Developmenta je [...]]]></description>
			<content:encoded><![CDATA[<h2>Debugging Sucks! Testing Rocks!</h2>
<p><em><strong>Tale članek sem se spravil pisat že dobro leto nazaj. Vmes sem tudi sformatiral disk in so šle stvari v tri &#8230; Kljub temu da je članek še vedno nedokončan sem se odločil da ga objavim, saj bo marsikomu v pomoč pri prvih korakih TDD-ja.</strong></em></p>
<p>Prvi odziv programerjev ob omembi <a href="http://en.wikipedia.org/wiki/Test-driven_development" rel="nofollow" class="liwikipedia">Test-Driven Developmenta</a> je ponavadi negativen, saj pomislijo le na eno: &#8220;<strong>Tole mi bo pa vzelo dodatnih 50% več časa pri razvoju aplikacij.</strong>&#8221; Podoben odziv sem pred kratkim doživel pri &#8220;naših&#8221; programerjih, ko sem jim kazal kako naredimo &#8220;<a href="http://en.wikipedia.org/wiki/Acceptance_test" rel="nofollow" class="liwikipedia">Acceptance Test</a>&#8221; z uporabo <a href="http://selenium.openqa.org/" class="liexternal">Selenium RC</a>-ja.<sup>[1]</sup><br />
Zgornja trditev bi načeloma veljala samo če bi se življenski cikel aplikacije zaključil z prvo produkcijsko verzijo, ter ob klasičnem razvoju Dizajn-Implementacija-Testiranje<sup>[2]</sup>. To zgodbo najverjetneje vsi poznamo:<br />
&#8220;Imamo dva programerja, ki vsak zase nadgrajujeta svoj del že žive aplikacije. Ob združitvi kode, zgleda kot, da je vse ok. Čez čas dobita klic<sup>[3]</sup>, da določene stvari ne delajo, čeprav so prej delale. Vsak posebej za iskanje in razhroščevanje kode porabita polovico dneva.&#8221;<br />
Take in podobne zgodbe so lahko preteklost. Rešitev je <strong>TDD</strong>.</p>
<h3>Kaj je TDD</h3>
<p>Test-Triven Development (TDD) je razvojna tehnika za softver. Z TDD tehniko stvari postavimo malce na &#8220;glavo&#8221;. <strong>Teste pišemo preden začnemo pisat implementacijsko kodo!</strong>. Test pelje oziroma diktira kodo ki se razvija.<sup>[4]</sup><br />
TDD cikel pri razvoju aplikacij izgleda nekako takole:</p>
<ul>
<li>Dizajn: Pogruntamo kaj želimo narediti</li>
<li>Test: Napišemo test, ki izraža naš dizajn.
<ul>
<li>Test ne bi smel uspeti   &#8211; <font color="red">FAIL</font></li>
</ul>
</li>
<li>Implementacija: Napišemo kodo</li>
<li>Test: ponovno
<ul>
<li>Test bi moral uspeti &#8211; <font color="green">PASS</font></li>
</ul>
</li>
<li>Refactoring po potrebi</li>
<li>Ponavljaj</li>
</ul>
<p>Še vedno vas je strah da bo več dela. Malce pa res. :)<br />
Tri različne študije (Microsoft, IBM, John Deere / Ericsson) so pokazale:</p>
<ul>
<li>TDD projekti imajo dva krat večjo kvaliteto kode.</li>
<li>Pisanje testov vzame le 15% več časa &#8211; dolgoročno gledano.</li>
<li>Število hroščev in defektov je manjše za 40%.</li>
<li>Skupinska produktivnost se poveča za 16%.</li>
</ul>
<h3>Testiranje</h3>
<p><strong>Kaj potrebuje testiranje?</strong><br />
<strong>- Backend</strong>: programska logika in ponovno uporabljene komponente<br />
<strong>- Frontend</strong>: procesiranje form, templatov, bogata vsebina z uporabo &#8220;AJAX-a#, JSON, RSS Feed, Web Servisi</p>
<p><strong>Kako testiramo?</strong><br />
<strong>- Backend</strong>: test funkcionalnosti programske logike z <a href="http://en.wikipedia.org/wiki/Unit_testing" rel="nofollow" class="liwikipedia">Unit Testi</a><br />
<strong>- Frontend</strong>: &#8220;<a href="http://en.wikipedia.org/wiki/Acceptance_test" rel="nofollow" class="liwikipedia">Acceptance</a>&#8221; in <a href="http://en.wikipedia.org/wiki/System_testing" rel="nofollow" class="liwikipedia">Sistemski testi</a>, ki se izvajajo na brskalniku, Testiranje RSS Feedov, Web servisov z Unit Testi, Kompatibilnostni testi &#8230;<br/><br />
</p>
<h2>Acceptance testing</h2>
<p>je testiranje na določenem sistemu po principu &#8220;<a href="http://en.wikipedia.org/wiki/Black-box_testing" rel="nofollow" class="liwikipedia">črne škatle</a>&#8220;. Acceptance test zagotavlja da koda počna to kar želi &#8220;stranka&#8221;<sup>[5]</sup>, ne pa pričakovanj razvijalca! Temu testiranja bi lahko preprosto rekli tudi testiranje funkcionalnosti. Pa poglejmo kako implementirati Acceptance Test z &#8220;ubijalsko kombinacijo&#8221; PHPUnit in Selenium.<br />
</p>
<h3>Priprave na testiranje</h3>
<p><strong>Zahteve</strong>:</p>
<ul>
<li>PHPUnit <a href="http://www.phpunit.de" class="liexternal">http://www.phpunit.de</a></li>
<li>Testing_Selenium <a href="http://pear.php.net/package/Testing_Selenium" class="liexternal">http://pear.php.net/package/Testing_Selenium</a></li>
<li>Java 5 (1.5.0) je potrebna za Selenium RC <a href="http://java.sun.com" class="liexternal">http://java.sun.com</a></li>
<li>Selenium Remote Control (RC) <a href="http://selenium.openqa.org/" class="liexternal">http://selenium.openqa.org/</a></li>
<li>Xdebug<sup>[6]</sup> če želimo informacije o &#8220;Code Coverage&#8221; <a href="http://www.xdebug.org" class="liexternal">http://www.xdebug.org</a></li>
</ul>
<p>V tem članku uporabljamo PHPUnit, kateri od verzije 3.0 naprej, vsebuje PHPUnit_Extensions_SeleniumTestCase razred, katerega lahko uporabljamo za definicijo Acceptance testov. Sam razred pa za opravljanje testov potrebuje Selenium Core. Zelo pomembno je, da ne pozabimo da to <strong>NI Unit testiranje</strong>. PHPUnit je knjižnica za &#8220;Unit Testing&#8221;, med drugim pa je framework prav tako uporaben za <a href="http://en.wikipedia.org/wiki/Integration_testing" rel="nofollow" class="liwikipedia">integracijske</a> ter acceptance teste.</p>
<p><strong>Inštalacija PHPUnit</strong>:<br />
<a href="http://www.phpunit.de/manual/3.3/en/installation.html" class="liexternal">Priročnik PHPUnit-a</a> priporoča inštalacijo frameworka z uporabo<a href="http://pear.php.net/" class="liexternal"> PEAR Installer-ja</a>. PEAR kanal (pear.phpunit.de), kateri se uporablja za distribucijo PHPUnit-a bora biti registriran z lokalnim PEAR okoljem.<sup>[7]</sup> Ko to enkrat naredimo, uporabimo PEAR za inštalacijo paketa od PHPUnit kanala.<br />
<a href="http://www.internet-solutions.si/wp-content/uploads/2008/09/phpunit_install.gif" rel="lightbox"><img src="http://www.internet-solutions.si/wp-content/uploads/2010/06/phpunit_install-150x150.gif" alt="Inštalacija PHPUnita" title="Inštalacija PHPUnita" width="150" height="150" class="alignleft size-thumbnail wp-image-82" /></a><br />
Inštalacija PHPUnita<br />
PHPUnit dokumentacijo za Selenium najdete na <a href="http://www.phpunit.de/pocket_guide/3.2/en/selenium.html" class="liexternal">http://www.phpunit.de/pocket_guide/3.2/en/selenium.html</a>. Sedaj nam preostane še da iz PEAR kanala inštaliramo Testing_Selenium paket, ki ga potrebuje PHPUnit Selenium podaljšek.<br />
<br clear="all" /><br />
<a href="http://www.internet-solutions.si/wp-content/uploads/2008/09/testing_selenium.gif" rel="lightbox"><img src="http://www.internet-solutions.si/wp-content/uploads/2010/06/testing_selenium-150x150.gif" alt="Inštalacija paketa Testing_Selenium" title="Inštalacija paketa Testing_Selenium" width="150" height="150" class="alignleft size-thumbnail wp-image-83" /></a><br />
Inštalacija paketa Testing_Selenium</p>
<p><strong><a href="http://selenium.openqa.org/" class="liexternal">Selenium</a></strong>:<br />
je paket orodij za avtomatsko testiranje spletnih aplikacij. Vsebuje kar nekaj paketov, med drugim Selenium Core, Selenium RC, Selenium IDE, &#8230; Selenium Core opravlja aktivnosti uporabnika, izvaja test in obvešča o rezultatih testa. Selenium RC je dodatni serverski proces, ki ga rabimo, če želimo izvajati teste z PHPUnit podaljškom za Selenium. Njegov glavni namen je da omogoča izbranemu programskemu jeziku interakcijo z Selenium Core ki laufa na brskalniku z uporabo preprostega HTTP GET klica do RC strežnika. Komplicirano?!<br />
Najnovejši Selenium RC dobite na <a href="http://selenium-rc.openqa.org/download.html" class="liexternal">http://selenium-rc.openqa.org/download.html</a>. Po tem ko raspakiramo paket v njem najdemo kar nekaj map.  V eni izmed njih je Selenium server, ostali so client driverji za različne programske jezike. Mi smo ga za PHP že inštalirali preko PEAR instalerja. Selenium RC zaženemo preprosto iz command lina:</p>
<pre class="brush: bash;">
java -jar selenium-server.jar -interactive
</pre>
<p>Še prej pa smo seveda inštalirali Javo. :)</p>
<p><strong>Inštalacija Xdebug-a</strong>:<br />
Xdebug je podaljšek za PHP, ki primarno služi za &#8220;debugging&#8221; &#8211; razhroščevanje kode, pri čemer je sposoben navrčt celo paleto koristnih informacij. Zna pa še narediti profil &#8211; &#8220;profiling&#8221; skripte in analizo pokritosti kode &#8211; &#8220;code coverage analysis&#8221;. Prav slednjo zadevo bomo pokazali v našem članku. Velja si zapomniti, da Xdebug <strong>ni potreben</strong> za izvajanje testov in da ga ne morete imeti naloženega skupaj z <a href="http://www.internet-solutions.si/2008/07/01/zend-studio-601-installer-na-ubuntu-ju-804-ga-biksa/" class="liexternal">Zend Debuggerjem</a>.<br />
Najlažje je Xdebug inštalirati preko PEAR/PECL kanala.</p>
<pre class="brush: bash;">
pecl install xdebug
</pre>
<p>V php.ini dodamo tole klobaso<sup>[8]</sup> za temeljit izpis informacij, remote debugging ter profiling na triger:</p>
<pre class="brush: bash;">
[Xdebug]
zend_extension=&amp;quot;/opt/local/lib/php/extensions/no-debug-non-zts-20060613/xdebug.so&amp;quot;
;General
xdebug.default_enable=On
xdebug.show_exception_trace=Off
xdebug.show_local_vars=1
xdebug.max_nesting_level=50
xdebug.var_display_max_data=3072
xdebug.var_display_max_depth=12
xdebug.dump_once=On
xdebug.dump_globals=On
xdebug.dump_undefined=On
xdebug.dump.REQUEST=*
xdebug.dump.SERVER=REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT
xdebug.collect_params=4
xdebug.collect_includes=On
xdebug.collect_return=On
xdebug.show_mem_delta=On

;Remote debugging
xdebug.remote_enable=On
xdebug.remote_host=&amp;quot;localhost&amp;quot;
xdebug.remote_port=9000
xdebug.remote_handler=&amp;quot;dbgp&amp;quot;

;Profiling
; Turns it off by default
xdebug.profiler_enable=0
; Turns xdebug on when ?XDEBUG_PROFILE=true is in GET or POST
xdebug.profiler_enable_trigger=1
; Your output directory - you'll eventually point webgrind at this
xdebug.profiler_output_dir=&amp;quot;/tmp&amp;quot;
</pre>
<p>O samem orodju podrobno kdaj drugič. Gremo nazaj na testiranje.</p>
<h2>Pisanje in zagon acceptance testov</h2>
<p>Osnovna forma za acceptance test z PHPUnit in Selenium RC je zelo preprosta.</p>
<pre class="brush: php;">
/** PHPUnit_Extensions_SeleniumTestCase */
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';

class MonetaOrderTest extends PHPUnit_Extensions_SeleniumTestCase
{
    protected function setUp()
    {
        /**
         * '*firefox' =&amp;gt; Firefox 1 or 2
         * '*iexplore' =&amp;gt; Internet Explorer (all)
         * '*custom /path/to/browser/binary =&amp;gt; Other browsers (incl. Firefox on Linux)
         * '*iehta' =&amp;gt; Experimental Embedded IE
         * '*chrome' =&amp;gt; Experimental Firefox profile
         */
        $this-&amp;gt;setBrowser(*firefox /Applications/Firefox2.app/Contents/MacOS/firefox-bin);
        $this-&amp;gt;setBrowserUrl(http://gateway.home.internet-solutions.si);
    }

    /**
     * Test if
     * label First Name exists
     * element firstName exists
     *
     */
    public function testFirstNameExists()
    {
        //open test/moneta
  	$this-&amp;gt;open(http://gateway.home.internet-solutions.si/test/moneta');
  	/** First Name */
  	//label exist
        try {
            $this-&amp;gt;assertEquals(&amp;quot;First Name&amp;quot;, $this-&amp;gt;getText(&amp;quot;//form[@id='moneta']/dl/dt[1]/label&amp;quot;));
        } catch (PHPUnit_Framework_AssertionFailedError $e) {
            array_push($this-&amp;gt;verificationErrors, $e-&amp;gt;toString());
        }
        //element present
        $this-&amp;gt;assertTrue($this-&amp;gt;isElementPresent(&amp;quot;firstName&amp;quot;));
    }
}
</pre>
<p>Metoda setUp() se uporablja za &#8220;zagon&#8221; testa. Tukaj definiramo kateri brskalnik se naj koristi. Firefox je le ena od možnih opcij. V primeru da Selenium RC ne vsebuje privzete reference za vaš priljubljeni brskalnik<sup>[9]</sup> lahko uporabite prefix &#8220;*custom&#8221; pri kateremu določite pot do vašega izbranega brskalnika. Metoda setBrowserUrl() nastavi URL iz katerega potekajo vsi testi.</p>
<div align="center">
﻿﻿﻿﻿﻿<p><a href="http://www.internet-solutions.si/2010/06/16/mala-sola-testiranja-z-phpunit-in-selenium/"><em>Click here to view the embedded video.</em></a></p>
</div>
<div align="center">
﻿﻿﻿﻿﻿<p><a href="http://www.internet-solutions.si/2010/06/16/mala-sola-testiranja-z-phpunit-in-selenium/"><em>Click here to view the embedded video.</em></a></p>
</div>
<p>Če vas zanima še kaj o test driven developmentu me <a href="/contact/" class="liinternal">kontaktirajte</a>.</p>
<p>Happy blogging(coding)!</p>
<ol class="footnotes"><li id="footnote_0_81" class="footnote">podrobno bom predtavil testiranje z Selenium RC v današnjem članku</li><li id="footnote_1_81" class="footnote">če je sploh kaj testiranja pred produkcijo</li><li id="footnote_2_81" class="footnote">ponavadi od stranke, katero pa opozorijo uporabniki</li><li id="footnote_3_81" class="footnote">Sedaj vemo od kod ime Test-Driven Development</li><li id="footnote_4_81" class="footnote">uporabnik, brskalnik</li><li id="footnote_5_81" class="footnote">opcijsko &#8211; ni pogoj za izvajanje testov</li><li id="footnote_6_81" class="footnote">predvidevajmo da imate PEAR že inštaliran</li><li id="footnote_7_81" class="footnote">v njej prilagodite pot do podaljška</li><li id="footnote_8_81" class="footnote">v kar dvomim ;)</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.internet-solutions.si/2010/06/16/mala-sola-testiranja-z-phpunit-in-selenium/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend Studio 6.0.1 installer na Ubuntu-ju 8.04 ga biksa</title>
		<link>http://www.internet-solutions.si/2008/07/01/zend-studio-601-installer-na-ubuntu-ju-804-ga-biksa/</link>
		<comments>http://www.internet-solutions.si/2008/07/01/zend-studio-601-installer-na-ubuntu-ju-804-ga-biksa/#comments</comments>
		<pubDate>Tue, 01 Jul 2008 21:18:10 +0000</pubDate>
		<dc:creator>alesl</dc:creator>
				<category><![CDATA[Modrüvanje]]></category>
		<category><![CDATA[Tanači]]></category>
		<category><![CDATA[Tehnologija]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Zend Debugger]]></category>
		<category><![CDATA[Zend Studio]]></category>

		<guid isPermaLink="false">http://www.internet-solutions.si/?p=66</guid>
		<description><![CDATA[Zend Studio
Pred nekaj dnevi sem želel preizkusiti nov Zend Studio For Eclipse 6.0.1. O samem PHP IDE-ju ne bi preveč razglabljal. Profesionalno orodje za bolj zahtevne uporabnike. Meni osebno je najbolj  všeč Code Assist, integriran Debuging, Source Control z lokalno zgodovino, ter podpora za PHPUnit testing. 
Beseda, dve o debugerju. Zend Studio omogoča lokalno [...]]]></description>
			<content:encoded><![CDATA[<h2>Zend Studio</h2>
<p>Pred nekaj dnevi sem želel preizkusiti nov <a href="http://www.zend.com/en/products/studio/" class="liexternal">Zend Studio For Eclipse 6.0.1</a>. O samem PHP <a href="http://en.wikipedia.org/wiki/Integrated_Development_Environment" rel="nofollow" class="liwikipedia">IDE-ju</a> ne bi preveč razglabljal. Profesionalno orodje za bolj zahtevne uporabnike. Meni osebno je najbolj  všeč <a href="http://www.internet-solutions.si/wp-content/uploads/2008/06/zse-code-assist.gif" rel="lightbox" title="Code Assist" class="liexternal">Code Assist</a>, integriran <a href="http://www.internet-solutions.si/wp-content/uploads/2008/06/zse-debug.gif" rel="lightbox" title="Debugging" class="liexternal">Debuging</a>, <a href="http://www.internet-solutions.si/wp-content/uploads/2008/06/zse-source-control.gif" rel="lightbox" title="Source Control" class="liexternal">Source Control</a> z lokalno zgodovino, ter podpora za <a href="http://www.internet-solutions.si/wp-content/uploads/2008/06/zse-unit-testing-code-coverage.gif" rel="lightbox" title="PHPUnit Testing" class="liexternal">PHPUnit</a> testing. <br />
Beseda, dve o debugerju. Zend Studio omogoča lokalno in oddaljeno (na serverju) debugiranje. Za remote debugging rabite &#8220;Web Server Debugger&#8221;, kar je za <a href="http://en.wikipedia.org/wiki/Client-server" rel="nofollow" class="liwikipedia">Server-Client</a> arhitekturo nekaj samoumevnega. Obstajata dva načina za to:</p>
<ul>
<li>inštalirate si <a href="http://www.zend.com/en/products/platform/" class="liexternal">Zend Platformo</a> ali</li>
<li>uporabite <a href="http://downloads.zend.com/pdt/server-debugger/" class="liexternal">&#8220;Zend Debugger extension&#8221; za PHP</a></li>
</ul>
<p>Inštalacija slednjega je elegantnejša in manj boleča za Apache in PHP :)</p>
<p><span id="more-66"></span> </p>
<h3>Inštalacija in konfiguracija Zend Debugerja</h3>
<p>Izberite ustrezen debuger (Windows<sup>[1]</sup>, Mac OS X, Linux<sup>[2]</sup>) ter verzijo PHP-ja (4.3.x, 4.4.x, 5.1.x ali 5.2.x) ter ga skopirajte v  php direktorij kjer imate PHP podaljške<sup>[3]</sup> :D<br />
Dodajte naslednje vrstice v php.ini:</p>
<pre class="brush: plain;">
[Zend Debugger]
zend_extension=/usr/lib/php5/20060613/ZendDebugger.so #replace with your path
zend_debugger.allow_hosts=127.0.0.1
zend_debugger.expose_remotely=always
</pre>
<p>Skopirajte priloženo datoteko dummy.php v dokument root direktorij od Apache-ja. Ne pozabite reštartat web strežnik.<br />
Če ste vse pravilno naredili vam bo to razkril phpinfo().<a href="http://www.internet-solutions.si/wp-content/uploads/2008/06/zend_debugger.png" rel="lightbox"><img src="http://www.internet-solutions.si/wp-content/uploads/2008/06/zend_debugger-150x150.png" alt="phpinfo() output about Zend Debugger " title="phpinfo() output about Zend Debugger" width="150" height="150" class="alignleft size-thumbnail wp-image-71" /></a><br />
Da se vrnem nazaj na sam Zend Studio. ;)</p>
<h3>!?*#?!</h3>
<p>Po tem ko sem uspešno pretočil in razpakiral najnovejšo verzijo Zend Studia,  zaženem installer. Po nekaj sekundah se le ta ustavi in izpiše da je prišlo do notranje napake v aplikaciji. Stack Trace navrže: java.lang.IllegalArgumentException: <strong>Malformed \uxxx encoding</strong><br />
<a href="http://www.internet-solutions.si/wp-content/uploads/2008/07/installer_error.png" rel="lightbox"><img src="http://www.internet-solutions.si/wp-content/uploads/2008/07/installer_error-150x150.png" alt="Mallformed encoding" title="Mallformed encoding" width="150" height="150" class="alignleft size-thumbnail wp-image-72" /></a><br />Po tem ko je že kazalo, da ne bo iz mojega testiranja nič, sem le pogruntal, kaj ga tare&#8230;<sup>[4]</sup> Če imamo v katerih od  <a href="http://en.wikipedia.org/wiki/Environment_variable" rel="nofollow" class="liwikipedia">env</a> spremenljivkah string &#8216;\u&#8217;, ki prikazuje trenutno prijavljenega uporabnika, ga bo installer zamešal za unicode znak in sam inštalacijski postopek se bo prekinil :D <br />
Pri meni je šlo za PS1 spremenljivko, saj rad upurabljam ta. &#8220;fancy prompt&#8221;:</p>
<pre class="brush: plain;">
[...]
NM=&quot;\[&#92;&#48;33[0;38m\]&quot; #means no background and white lines
HI=&quot;\[&#92;&#48;33[0;37m\]&quot; #change this for letter colors
HII=&quot;\[&#92;&#48;33[0;31m\]&quot; #change this for letter colors
SI=&quot;\[&#92;&#48;33[0;33m\]&quot; #this is for the current directory
IN=&quot;\[&#92;&#48;33[0m\]&quot;

export PS1=&quot;$NM[ $HI\$(date +%H:%M:%S)$NM ]$IN$NM[ $HII\u@\h $SI\w$NM ]$ $IN&quot;
[...]
</pre>
<p><a href="http://www.internet-solutions.si/wp-content/uploads/2008/07/fancy_prompt.png" rel="lightbox"><img src="http://www.internet-solutions.si/wp-content/uploads/2008/07/fancy_prompt-150x150.png" alt="Fancy prompt" title="Fancy prompt" width="150" height="150" class="alignleft size-thumbnail wp-image-73" /></a><br />
Fancy prompt</p>
<p>Sedaj mi je samo ostalo, da zakomentiram PS1 spremenljivko v .profile datoteki in problem je bil odpravljen. Installer dela kot namazan:<br />
<a href="http://www.internet-solutions.si/wp-content/uploads/2008/07/installer_passes_ok.png" rel="lightbox"><img src="http://www.internet-solutions.si/wp-content/uploads/2008/07/installer_passes_ok-150x150.png" alt="After some hard time installer will work" title="After some hard time installer will work" width="150" height="150" class="alignleft size-thumbnail wp-image-74" /></a></p>
<p>Da še ne pozabim. Tale problem mi je uspelo reproducirati na Linux <a href="http://www.ubuntu.com/" class="liexternal">Ubuntu</a> 8.0.4 platformi.</p>
<p>Happy blogging(coding)!</p>
<ol class="footnotes"><li id="footnote_0_66" class="footnote">ZendDebugger.dll</li><li id="footnote_1_66" class="footnote">ZendDebugger.so</li><li id="footnote_2_66" class="footnote">extensions</li><li id="footnote_3_66" class="footnote">Stric Google mi je malce pomagal</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.internet-solutions.si/2008/07/01/zend-studio-601-installer-na-ubuntu-ju-804-ga-biksa/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Dobra vila za SQL</title>
		<link>http://www.internet-solutions.si/2008/06/25/dobra-vila-za-sql/</link>
		<comments>http://www.internet-solutions.si/2008/06/25/dobra-vila-za-sql/#comments</comments>
		<pubDate>Wed, 25 Jun 2008 11:49:58 +0000</pubDate>
		<dc:creator>alesl</dc:creator>
				<category><![CDATA[Modrüvanje]]></category>
		<category><![CDATA[Tanači]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[YAML]]></category>

		<guid isPermaLink="false">http://www.internet-solutions.si/?p=64</guid>
		<description><![CDATA[Naključje &#8230;
Perl module z imenom SQLFairy (SQL::Translator) sem odkril čisto po naključju med tem ko sem se spoznaval z Doctrine. Ta ORM za PHP do verzije 0.11 ne omogoča da bi mu preprečili avtomatsko &#8220;singularizacijo&#8221; &#8220;podatkovnih modelov&#8221; ki jih generiramo iz trenutne baze. Da ponazorim: če imamo tabelo z imenom &#8220;files&#8221;, bo Doctrine generiral model [...]]]></description>
			<content:encoded><![CDATA[<h2>Naključje &#8230;</h2>
<p>Perl module z imenom <a href="http://sqlfairy.sourceforge.net/" class="liexternal">SQLFairy</a> (<a href="http://search.cpan.org/dist/SQL-Translator/" class="liexternal">SQL::Translator</a>) sem odkril čisto po naključju med tem ko sem se spoznaval z <a href="http://www.phpdoctrine.org/" class="liexternal">Doctrine</a>. Ta <a href="http://en.wikipedia.org/wiki/Object-relational_mapping" rel="nofollow" class="liwikipedia">ORM</a> za PHP do verzije 0.11 ne omogoča da bi mu preprečili avtomatsko &#8220;singularizacijo&#8221; <a href="http://en.wikipedia.org/wiki/Data_model" rel="nofollow" class="liwikipedia">&#8220;podatkovnih modelov&#8221;</a> ki jih generiramo iz trenutne baze. Da ponazorim: če imamo tabelo z imenom &#8220;files&#8221;, bo Doctrine generiral model z imenom &#8220;File&#8221; in ne &#8220;Files&#8221;. Čeprav mi ni ravno jasno kako<sup>[1]</sup>, določeni modeli dobijo kar čudna imena ;)<sup>[2]</sup> .<br />
Da ne bi vedno znova popravljal <a href="http://www.yaml.org/" class="liexternal">YAML</a> datoteko, ki opisuje shemo podatkovne baze, sem se lotil malega raziskovanja. Naletel sem na &#8230;<br />
<br/><br />
<span id="more-64"></span></p>
<h2>SQLFairy &#8230;</h2>
<p>ali z drugim imenom SQL::Translator. To orodje za <a href="http://en.wikipedia.org/wiki/SQL" rel="nofollow" class="liwikipedia">SQL</a>, je trenutno najbolj enostavni način za manipulacijo z &#8220;podatkovnimi strukturami&#8221;<sup>[3]</sup> na vse mogoče načine. Služi nam lahko za konvertiranje med različnimi &#8220;dialekti&#8221; CREATE sintaks (npr: iz MySQL v PostgreSQL), za virtualizacijo shem (pseudo-ER diagrami z uporabo: <a href="http://www.graphviz.org/" class="liexternal">GraphViz</a> ali <a href="http://www.boutell.com/gd/" class="liexternal">GD</a>-ja),  za konvertiranje ne-<a href="http://en.wikipedia.org/wiki/RDBMS" rel="nofollow" class="liwikipedia">RDMBS</a> datotek v SQL sheme (Excelove preglednice), ter še kaj bi se našlo.<br />
Z razbitjem kode v &#8220;parserje&#8221;<sup>[4]</sup> in &#8220;izdelovalce&#8221;<sup>[5]</sup>, je zmožen kombinacije kateregakoli parserja z izbranim izdelovalcem. Trenutno pa je SQLFairy sposoben uporabljati le definicijski del SQL-a<sup>[6]</sup>, ne pa same manipulacije s podatki<sup>[7]</sup>.</p>
<h3>Namestitev in konfiguracija</h3>
<p>Za začetek si prenesite <a href="http://purl.org/net/sqlfairy/download" class="liexternal">SQL::Translator</a> na disk. Ker gre za standardne Perl module, je inštalacija sila preprosta, sledite le navodilam v README fajlu.<sup>[8]</sup><br />
Po razpakiranju paketa sledimo navodilom:</p>
<pre class="brush: bash;">
$ perl Build.PL
$ ./Build
$ ./Build test
$ su
# ./Build install
</pre>
<p>V primeru da nimate inštaliranih vseh ustreznih modulov, ki jih rabi SQL::Translator se bo skripta Build.PL ustavila. Če do sedaj niste kaj prida uporabljali Perl bo vam najverjetneje manjkal modul z imenom&#8217;<a href="http://search.cpan.org/~kwilliams/Module-Build-0.2808/lib/Module/Build.pm" class="liexternal">Module::Build</a>&#8216;, ki je potreben za grajenje in inštalacijo Perl modulov. Najenostavnejši način, da si inštaliramo manjkajoče zadeve, je z uporabo <a href="http://www.cpan.org/" class="liexternal">CPAN</a>-a. Ukaze lahko vnašamo direktno v konzolo ali pa preko <a href="http://www.shlomifish.org/lecture/Perl/Newbies/lecture4/cpan/mcpan.html" class="liexternal">-MCPAN vmesnika</a>.<sup>[9]</sup><br />
Primer vnosa direktno v konzolo:</p>
<pre class="brush: bash;"># sudo perl -MCPAN -e 'install Module::Build'</pre>
<p>Sledila bo konfiguracija CPAN modula, ter inštalacija Module::Build. Konfiguracija se ustavi, če nimate vseh ustreznih programčkov, ki jih CPAN rabi. Meni sta manjkala: <a href="http://www.ncftpd.com/ncftp/" class="liexternal">NcFtp klient</a> ter  <a href="http://www.gnupg.org/" class="liexternal">GnuPG</a>. Po cca. 15 minutah v pričakovanju vtipkamo nesrečni &#8220;./Build install&#8221; :)</p>
<h3>Sqlt</h3>
<p>Če ste se uspešno prebili do te točke bi sedaj morali imeti na voljo ukaz &#8220;sqlt&#8221;. Ukaz konvertira SQL sheme z uporabo SQL::Translator-ja. Tipičen primer uporabe je:</p>
<pre class="brush: bash;">sqlt -f MySQL -t PostgreSQL  dump_mysql.sql &gt; dump_postgresql.sql</pre>
<p>Končni rezultat je opis tabel v datoteki dump_postgresql.sql v sintaksi PostgreSQL-a, ki smo ga konvertirali iz MySQL sintakse.<br />
Spisek vseh možnih parserjev in izdelovalcev dobimo:</p>
<pre class="brush: bash;">sqlt -l</pre>
<p><a href="http://www.internet-solutions.si/wp-content/uploads/2008/06/sqlt_l.png" rel="lightbox"><img src="http://www.internet-solutions.si/wp-content/uploads/2008/06/sqlt_l-150x150.png" alt="Spisek vseh možnih parserjev in izdelovalcev" title="Spisek vseh možnih parserjev in izdelovalcev" width="150" height="150" class="alignleft size-thumbnail wp-image-65" /></a><br />
Spisek vseh možnih parserjev in izdelovalcev.</p>
<h3>Use cases</h3>
<p>Kot primer bomo vzeli SQL <a href="http://en.wikipedia.org/wiki/Drop_(SQL)" rel="nofollow" class="liwikipedia">DDL</a> psevdokodo, ki jo bomo iz MySQL sintakse konvertirali v različne formate.<br />
Psevdokoda:</p>
<pre class="brush: sql;">
CREATE TABLE bugs (
  bug_id            INTEGER NOT NULL PRIMARY KEY,
  bug_description   VARCHAR(100),
  bug_status        VARCHAR(20),
  reported_by       VARCHAR(100),
  assigned_to       VARCHAR(100),
  verified_by       VARCHAR(100)
);
</pre>
<p>MySQL sintaksa:</p>
<pre class="brush: sql;">
CREATE TABLE `bugs` (
  `bug_id` int(11) NOT NULL,
  `bug_description` varchar(100) default NULL,
  `bug_status` varchar(20) default NULL,
  `reported_by` varchar(100) default NULL,
  `assigned_to` varchar(100) default NULL,
  `verified_by` varchar(100) default NULL,
  PRIMARY KEY  (`bug_id`)
) ENGINE=MyISAM;
</pre>
<p>Konverzija v PostgreSQL:</p>
<pre class="brush: bash;">sqlt -f MySQL -t PostgreSQL bugs_mysql.sql &gt; bugs_postgresql.sql</pre>
<p>PostgreSQL sintaksa:</p>
<pre class="brush: sql;">
CREATE TABLE &quot;bugs&quot; (
  &quot;bug_id&quot; bigint NOT NULL,
  &quot;bug_description&quot; character varying(100) DEFAULT NULL,
  &quot;bug_status&quot; character varying(20) DEFAULT NULL,
  &quot;reported_by&quot; character varying(100) DEFAULT NULL,
  &quot;assigned_to&quot; character varying(100) DEFAULT NULL,
  &quot;verified_by&quot; character varying(100) DEFAULT NULL,
  PRIMARY KEY (&quot;bug_id&quot;)
);
</pre>
<p>Konverzija v YAML:</p>
<pre class="brush: bash;">sqlt -f MySQL -t YAML bugs_mysql.sql &gt; bugs.yaml</pre>
<p>YAML sintaksa:</p>
<pre class="brush: plain;">
schema:
  procedures: {}
  tables:
    bugs:
      constraints:
        - deferrable: 1
          expression: ''
          fields:
            - bug_id
          match_type: ''
          name: ''
          on_delete: ''
          on_update: ''
          options: []
          reference_fields: []
          reference_table: ''
          type: PRIMARY KEY
      fields:
        assigned_to:
          data_type: varchar
          default_value: NULL
          extra: {}
          is_nullable: 1
          is_primary_key: 0
          is_unique: 0
          name: assigned_to
          order: 5
          size:
            - 100
        bug_description:
          data_type: varchar
          default_value: NULL
          extra: {}
          is_nullable: 1
          is_primary_key: 0
          is_unique: 0
          name: bug_description
          order: 2
          size:
            - 100
        bug_id:
          data_type: int
          default_value: ~
          extra: {}
          is_nullable: 0
          is_primary_key: 1
          is_unique: 0
          name: bug_id
          order: 1
          size:
            - 11
        bug_status:
          data_type: varchar
          default_value: NULL
          extra: {}
          is_nullable: 1
          is_primary_key: 0
          is_unique: 0
          name: bug_status
          order: 3
          size:
            - 20
        reported_by:
          data_type: varchar
          default_value: NULL
          extra: {}
          is_nullable: 1
          is_primary_key: 0
          is_unique: 0
          name: reported_by
          order: 4
          size:
            - 100
        verified_by:
          data_type: varchar
          default_value: NULL
          extra: {}
          is_nullable: 1
          is_primary_key: 0
          is_unique: 0
          name: verified_by
          order: 6
          size:
            - 100
      indices: []
      name: bugs
      options:
        - ENGINE: MyISAM
      order: 1
  triggers: {}
  views: {}
translator:
  add_drop_table: 0
  filename: bugs_mysql.sql
  no_comments: 0
  parser_args:
    db_password: ~
    db_user: ~
    dsn: ~
    field_separator: ~
    mysql_parser_version: ~
    record_separator: ~
    scan_fields: 1
    trim_fields: 1
  parser_type: SQL::Translator::Parser::MySQL
  producer_args:
    add_prefix: ~
    add_truncate: ~
    db_password: ~
    db_user: ~
    dsn: ~
    imap_file: ~
    imap_url: ~
    indent: ~
    newlines: ~
    package_name: ~
    prefix: ~
    pretty: ~
    skip: ~
    skiplike: ~
    title: ~
    tt_conf: {}
    tt_vars: {}
    ttfile: ~
  producer_type: SQL::Translator::Producer::YAML
  show_warnings: 0
  trace: 0
  version: 0.09000
</pre>
<p>Konverzija v XML:</p>
<pre class="brush: bash;">sqlt -f MySQL -t XML bugs_mysql.sql &gt; bugs.xml</pre>
<p>XML sintaksa:</p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!--
Created by SQL::Translator::Producer::XML::SQLFairy
Created on Wed Jun 25 13:40:31 2008
 --&gt;
&lt;schema name=&quot;&quot; database=&quot;&quot; xmlns=&quot;http://sqlfairy.sourceforge.net/sqlfairy.xml&quot;&gt;
  &lt;extra /&gt;
  &lt;tables&gt;
    &lt;table name=&quot;bugs&quot; order=&quot;1&quot;&gt;
      &lt;extra /&gt;
      &lt;fields&gt;
        &lt;field name=&quot;bug_id&quot; data_type=&quot;int&quot; size=&quot;11&quot; is_nullable=&quot;0&quot; is_auto_increment=&quot;0&quot; is_primary_key=&quot;1&quot; is_foreign_key=&quot;0&quot; order=&quot;1&quot;&gt;
          &lt;extra /&gt;
          &lt;comments&gt;&lt;/comments&gt;
        &lt;/field&gt;
        &lt;field name=&quot;bug_description&quot; data_type=&quot;varchar&quot; size=&quot;100&quot; is_nullable=&quot;1&quot; default_value=&quot;NULL&quot; is_auto_increment=&quot;0&quot; is_primary_key=&quot;0&quot; is_foreign_key=&quot;0&quot; order=&quot;2&quot;&gt;
          &lt;extra /&gt;
          &lt;comments&gt;&lt;/comments&gt;
        &lt;/field&gt;
        &lt;field name=&quot;bug_status&quot; data_type=&quot;varchar&quot; size=&quot;20&quot; is_nullable=&quot;1&quot; default_value=&quot;NULL&quot; is_auto_increment=&quot;0&quot; is_primary_key=&quot;0&quot; is_foreign_key=&quot;0&quot; order=&quot;3&quot;&gt;
          &lt;extra /&gt;
          &lt;comments&gt;&lt;/comments&gt;
        &lt;/field&gt;
        &lt;field name=&quot;reported_by&quot; data_type=&quot;varchar&quot; size=&quot;100&quot; is_nullable=&quot;1&quot; default_value=&quot;NULL&quot; is_auto_increment=&quot;0&quot; is_primary_key=&quot;0&quot; is_foreign_key=&quot;0&quot; order=&quot;4&quot;&gt;
          &lt;extra /&gt;
          &lt;comments&gt;&lt;/comments&gt;
        &lt;/field&gt;
        &lt;field name=&quot;assigned_to&quot; data_type=&quot;varchar&quot; size=&quot;100&quot; is_nullable=&quot;1&quot; default_value=&quot;NULL&quot; is_auto_increment=&quot;0&quot; is_primary_key=&quot;0&quot; is_foreign_key=&quot;0&quot; order=&quot;5&quot;&gt;
          &lt;extra /&gt;
          &lt;comments&gt;&lt;/comments&gt;
        &lt;/field&gt;
        &lt;field name=&quot;verified_by&quot; data_type=&quot;varchar&quot; size=&quot;100&quot; is_nullable=&quot;1&quot; default_value=&quot;NULL&quot; is_auto_increment=&quot;0&quot; is_primary_key=&quot;0&quot; is_foreign_key=&quot;0&quot; order=&quot;6&quot;&gt;
          &lt;extra /&gt;
          &lt;comments&gt;&lt;/comments&gt;
        &lt;/field&gt;
      &lt;/fields&gt;
      &lt;indices&gt;&lt;/indices&gt;
      &lt;constraints&gt;
        &lt;constraint name=&quot;&quot; type=&quot;PRIMARY KEY&quot; fields=&quot;bug_id&quot; reference_table=&quot;&quot; reference_fields=&quot;&quot; on_delete=&quot;&quot; on_update=&quot;&quot; match_type=&quot;&quot; expression=&quot;&quot; options=&quot;&quot; deferrable=&quot;1&quot;&gt;
          &lt;extra /&gt;
        &lt;/constraint&gt;
      &lt;/constraints&gt;
      &lt;comments&gt;&lt;/comments&gt;
    &lt;/table&gt;
  &lt;/tables&gt;
  &lt;views&gt;&lt;/views&gt;
  &lt;triggers&gt;&lt;/triggers&gt;
  &lt;procedures&gt;&lt;/procedures&gt;
&lt;/schema&gt;
</pre>
<p>Happy blogging(coding)!</p>
<ol class="footnotes"><li id="footnote_0_64" class="footnote">Nisem se poglabljal v kodo ki generira imena modelov</li><li id="footnote_1_64" class="footnote">moneta je postala &#8220;Monetum&#8221;</li><li id="footnote_2_64" class="footnote">structured data definitions &#8211; schemes</li><li id="footnote_3_64" class="footnote">parsers</li><li id="footnote_4_64" class="footnote">producers</li><li id="footnote_5_64" class="footnote">CREATE, ALTER</li><li id="footnote_6_64" class="footnote">INSERT, UPDATE, DELETE</li><li id="footnote_7_64" class="footnote">Tukaj predvidevamo da imate Perl ustrezno inštaliran na vašem računalniku</li><li id="footnote_8_64" class="footnote">kot super-user</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.internet-solutions.si/2008/06/25/dobra-vila-za-sql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zakaj obožujem Zend Framework?</title>
		<link>http://www.internet-solutions.si/2007/11/13/zakaj-obozujem-zend-framework/</link>
		<comments>http://www.internet-solutions.si/2007/11/13/zakaj-obozujem-zend-framework/#comments</comments>
		<pubDate>Tue, 13 Nov 2007 21:26:08 +0000</pubDate>
		<dc:creator>alesl</dc:creator>
				<category><![CDATA[Code snippets]]></category>
		<category><![CDATA[Modrüvanje]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.internet-solutions.si/2007/11/13/zakaj-obozujem-zend-framework/</guid>
		<description><![CDATA[A je to framework?
Pred kratkim sem web programerjem iz podjetja Creatoor, predaval o Zend Frameworku. Prva stvar ki jo najprej izpostavim, ko govorim o Zend Frameworku je ta, da za mene to ni &#8220;framework&#8221;, vsaj ne po tistem kar pravi definicija. To najprej povzroči zmedenost in nerazumevanje kaj sploh Zend Framework je. Za mene je [...]]]></description>
			<content:encoded><![CDATA[<p><strong>A je to framework?</strong><br />
Pred kratkim sem web programerjem iz podjetja <a href="http://www.creatoor.com/" class="liexternal">Creatoor</a>, predaval o <a href="http://framework.zend.com/" class="liexternal">Zend Frameworku</a>. Prva stvar ki jo najprej izpostavim, ko govorim o Zend Frameworku je ta, da za mene to ni &#8220;framework&#8221;, vsaj ne po tistem kar pravi <a href="http://en.wikipedia.org/wiki/Software_framework" rel="nofollow" class="liwikipedia">definicija</a>. To najprej povzroči zmedenost in nerazumevanje kaj sploh Zend Framework je. Za mene je to le &#8220;knjižica&#8221;<sup>[1]</sup> skript. Med množico modulov, lahko enostavno izberemo in uporabimo le tistega, ki ga rabimo. Čeprav so določeni moduli med sabo odvisni, se da ta lastnost v večini primerih povoziti.<sup>[2]</sup> Zadevi, ki sta mene najbolj pritegnili oziroma &#8220;prisilili&#8221; da sem upokojil lastne napisane knjižice sta:</p>
<ul>
<li><a href="http://framework.zend.com/community/contributors/" class="liexternal">ekipa sodelujočih</a> pri razvoju iz vrst <a href="http://www.zend.com/" class="liexternal">Zend-a</a>, <a href="http://www.ibm.com/" class="liexternal">IBM-a</a>, <a href="http://www.omniti.com/" class="liexternal">OmniTI</a>, &#8230;</li>
<li>kvaliteta in testiranje &#8211; čez 4.000 unit testov. Vse knjižice so testirane z uporabo <a href="http://www.phpunit.de/" class="liexternal">PHPUnit</a>.</li>
</ul>
<p><span id="more-44"></span><br />
<strong>MVC &#8211; Model View Controller</strong><br />
Velika večina &#8220;frameworkov&#8221; se vedno znova vrti okrog lastne implementacije <a href="http://en.wikipedia.org/wiki/Model-view-controller" rel="nofollow" class="liwikipedia">MVC</a>-ja. Če želite uiti iz tega začaranega kroga, je boljše, da tak framework me uporabite. Seveda tudi Zend Framework vključuje module, ki vam pomagajo pri postavitvi MVC-ja in načinov kako to dosežemo je kar nekaj. Z malce programerskega znanja boste lahko vključili že obstoječe &#8220;third-party&#8221; knjižice kot so <a href="http://www.swiftmailer.org/" class="liexternal">SwiftMailer</a>, <a href="http://www.smarty.net/" class="liexternal">Smarty</a>, <a href="http://propel.phpdb.org/trac/" class="liexternal">Propel</a>, <a href="http://adodb.sourceforge.net/" class="liexternal">ADOdb</a>, &#8230; ali pa svoje knjižice zamenjali z Zendovimi:</p>
<ul>
<li>za delo z sejami &#8211; <a href="http://framework.zend.com/manual/en/zend.session.html" class="liexternal">Zend_Session</a></li>
<li>za keširanje podatkov, objektov, spletnih strani &#8211; <a href="http://framework.zend.com/manual/en/zend.cache.html" class="liexternal">Zend_Cache</a></li>
<li>&#8230;</li>
</ul>
<p><strong>A je za začetnike?</strong><br />
Možno, je da si bom s to izjavo nakopal kakšnega &#8220;sovražnika&#8221;, ampak Zend Framewok je profesionalen izdelek in ni ravno namenjen začetnikom, ki se šele spoznavajo s PHP-jem. Čeprav je glavna filozofija in moto frameworka &#8220;Extreme simplicity&#8221;, so določeni pogledi MVC-ja in ostalih modulov precej bolj kompleksni od ostalih frameworkov (<a href="http://codeigniter.com/" class="liexternal">CodeIgniter</a>, <a href="http://www.cakephp.org/" class="liexternal">CakePHP</a>, &#8230;). Če niste ravno naklonjeni, da občasno več ur namenite brskanju po izvorni kodi ali pa vam je uporaba <a href="http://en.wikipedia.org/wiki/API" rel="nofollow" class="liwikipedia">API</a>-ja tuja, vam svetujem da si omislite kaj drugega!</p>
<p><strong>Primer uporabe Zend Framework knjižic</strong><br />
Ostane nam še demo primer uporabe. Test case je vzet iz vsakdanjika. Preko URL-ja preberemo parameter id, če id ni nastavljen ali pa ni tipa int ga nastavimo na nulo. Če slučajno zaznamo metodo POST ustavimo skripto.</p>
<p><em>Stari način</em>:</p>
<pre class="brush: php;">
if (isset($_GET['id']) and $_GET['id'] != &quot;&quot;) {
	$id = (int) $_GET['id'];
} else {
	$id = 0;
}

if (strtolower($_SERVER['REQUEST_METHOD']) == 'post')
	die('POST detected');
</pre>
<p><em>Zend Framework</em>:</p>
<pre class="brush: php;">
/** Zend/Validate.php */
require_once 'Zend/Validate.php';

/** Zend/Controller/Request/Http.php */
require_once 'Zend/Controller/Request/Http.php';

/** request object */
$request = new Zend_Controller_Request_Http();

/** id */
$id = ( Zend_Validate::is($request-&gt;getQuery('id'), 'Int') ) ? (int) $request-&gt;getQuery('id') : 0;

if ($request-&gt;isPost())
	die('POST detected');
</pre>
<p>
Kakor vam drago :)</p>
<p>Happy blogging(coding)! </p>
<ol class="footnotes"><li id="footnote_0_44" class="footnote">Library</li><li id="footnote_1_44" class="footnote">overriding, subclassing</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.internet-solutions.si/2007/11/13/zakaj-obozujem-zend-framework/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>404 Error &#8211; Not Found, 500 Error &#8211; Internal Server Error</title>
		<link>http://www.internet-solutions.si/2007/11/06/404-error-not-found-500-error-internal-server-error/</link>
		<comments>http://www.internet-solutions.si/2007/11/06/404-error-not-found-500-error-internal-server-error/#comments</comments>
		<pubDate>Mon, 05 Nov 2007 22:03:14 +0000</pubDate>
		<dc:creator>alesl</dc:creator>
				<category><![CDATA[Modrüvanje]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Error Handler]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.internet-solutions.si/2007/11/06/404-error-not-found-500-error-internal-server-error/</guid>
		<description><![CDATA[Napake 404, 403, 500 &#8230;
Del vsadanjika, ki ga preživim za računalnikom, med drugim namenim izdelavi &#8220;skeleton&#8221; web aplikaciji, ki jo bom v prihodnje uporabljal pri vseh mojih spletnih projektih. V želji, da bi bil izdelek čim bolj robusten in uporabniku prijazen, sem že v začetku precej razmišljal o morebitnih napakah, ki se lahko pojavijo, ter [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Napake 404, 403, 500 &#8230;</strong><br />
Del vsadanjika, ki ga preživim za računalnikom, med drugim namenim izdelavi &#8220;skeleton&#8221; web aplikaciji, ki jo bom v prihodnje uporabljal pri vseh mojih spletnih projektih. V želji, da bi bil izdelek čim bolj robusten in uporabniku prijazen, sem že v začetku precej razmišljal o morebitnih napakah, ki se lahko pojavijo, ter ustreznemu reagiranju na njih. Nastal je &#8220;Error Handler&#8221; ki skrbi za dve<sup>[1]</sup> najbolj pogosti napaki spletnega protokola <a href="http://en.wikipedia.org/wiki/HTTP" rel="nofollow" class="liwikipedia">HTTP</a>.<br />
<span id="more-45"></span><br />
<br/><br />
<strong>Napaka <a href="http://en.wikipedia.org/wiki/HTTP_404" rel="nofollow" class="liwikipedia">404</a></strong><br />
ali strani ni mogoče najti je standardna napaka spletnega protokola HTTP, ki jo spletni strežnik javi brskalniku, ko zahtevanega spletnega dokumenta ne najde. Ta napaka je ponavadi posledica &#8220;zatipkanja&#8221; naslova spletnega mesta, ali pa nastane če iščemo stran ki je bila premaknjena oziroma izbrisana. Privzeta stran, ki jo prikaže brskalnik, pri tej napaki je bolj skopa.</p>
<p><a href="http://www.internet-solutions.si/wp-content/uploads/2007/11/404_apache.png" rel="lightbox" title='404 Error - Apache'><img src='http://www.internet-solutions.si/wp-content/uploads/2007/11/404_apache.thumbnail.png' alt='404 Error - Apache' /></a><br />
&#8220;404 Not Found&#8221; v naslovu če gre za Apache.</p>
<p><a href="http://www.internet-solutions.si/wp-content/uploads/2007/11/404_iis.png" rel="lightbox" title='404 IIS'><img src='http://www.internet-solutions.si/wp-content/uploads/2007/11/404_iis.thumbnail.png' alt='404 IIS' /></a><br />
&#8220;Page cannot be found&#8221; v pimeru IIS-ja.</p>
<p>Čeprav ni nobenega security riska<sup>[2]</sup>, je vse skupaj grdo, ter uporabniku neprijazno.<br />
Z veliko žalostjo opažam, da večina razvijalcev in webmasterjev še vedno &#8220;prezira&#8221; 404 napako. Kmica<sup>[3]</sup> mi je pa padla na oči, ob ugotovitvi, da so tudi podjetja, ki se ukvarjajo z izdelavo spletnih strani enako ignorantska.</p>
<ul>
<li><a href="http://www.mojsplet.net/404" class="liexternal">http://www.mojsplet.net/404</a></li>
<li><a href="http://www.modronebo.net/404" class="liexternal">http://www.modronebo.net/404</a></li>
<li><a href="http://www.red-orbit.com/404" class="liexternal">http://www.red-orbit.com/404</a></li>
<li><a href="http://www.portal.si/404" class="liexternal">http://www.portal.si/404</a></li>
<li><a href="http://www.ewrs.net/404" class="liexternal">http://www.ewrs.net/404</a></li>
<li><a href="http://www.g-server.com/404" class="liexternal">http://www.g-server.com/404</a></li>
</ul>
<p>Osebno kot razvijalcu in skrbniku spletnih strani, se mi zdi pomembno, da dobim obvestilo<sup>[4]</sup>, ko pride do napake v spletni aplikaciji, da lahko na njo ustrezno reagiram.</p>
<p><strong>Napaka <a href="http://www.checkupdown.com/status/E500.html" class="liexternal">500</a></strong><br />
<a href="http://www.internet-solutions.si/wp-content/uploads/2007/11/500_apache.png" rel="lightbox" title='500 Internal Server Error - Apache'><img align="left" src='http://www.internet-solutions.si/wp-content/uploads/2007/11/500_apache.thumbnail.png' alt='500 Internal Server Error - Apache' /></a>ali interna napaka na strežniku je standardna napaka spletnega protokola HTTP, ki pove da je šlo nekaj narobe na strežniku na katerem se nahaja spletna stran, ampak strežnik ne ve natančno za kakšen problem gre. Napaka je tipa &#8220;server-side&#8221;, kar pomeni, da ni nič narobe z našim računalnikom ali internetno povezavo, temveč je kriv spletni strežnik. Web strežnik bi moral generirati interni error log v katerem se nahaja podroben opis napake. Za skrbnika spletne strani je toliko bolj pomembno da na tako napako čimprej reagira. Sistem dodatnega obveščanja po elektronski pošti postane nujno zlo.</p>
<p><strong>Moč &#8220;Error Handlerja&#8221;</strong><br /> <br />
Na večini spletnih strežnikov je možno te napake prirediti tako, da prikažejo stran, ki je v večjo pomoč kot privzete. V popularnem spletnem strežniku Apache to storimo na preprosti način tako, da postavimo datoteko .htaccess na spletni strežnik.</p>
<pre class="brush: bash;">
ErrorDocument 404 /404.php
ErrorDocument 500 /500.php
</pre>
<p>Moj &#8220;Error Handler&#8221; ni tako prepost, saj je vkomponiran v web aplikacijo in lovi naslednje errorje<sup>[5]</sup>:</p>
<p><a href="http://www.internet-solutions.si/wp-content/uploads/2007/11/404-error-not-found.png" rel="lightbox" title='404 Error - Not Found'><img src='http://www.internet-solutions.si/wp-content/uploads/2007/11/404-error-not-found.thumbnail.png' alt='404 Error - Not Found' /></a><br />
404 Error &#8211; Not Found</p>
<p><a href="http://www.internet-solutions.si/wp-content/uploads/2007/11/500-error-internal-server-error.png" rel="lightbox" title='500 Error - Internal Server Error'><img src='http://www.internet-solutions.si/wp-content/uploads/2007/11/500-error-internal-server-error.thumbnail.png' alt='500 Error - Internal Server Error' /></a><br />
500 Error &#8211; Internal Server Error : &#8220;pohendla&#8221; tudi vse Exceptione, ki jih &#8220;vrže&#8221; spletna aplikacija</p>
<p><a href="http://www.internet-solutions.si/wp-content/uploads/2007/11/403-error-forbidden.png" rel="lightbox" title='403 Error - Forbidden'><img src='http://www.internet-solutions.si/wp-content/uploads/2007/11/403-error-forbidden.thumbnail.png' alt='403 Error - Forbidden' /></a><br />
403 Error &#8211; Forbidden : v aplikacijo je vkomponiran <a href="http://en.wikipedia.org/wiki/Access_control_list" rel="nofollow" class="liwikipedia">Acl</a>, ki skrbi za avtorizacijo uporabnikov. V primeru, da uporabnik hoče dostopat do neavtoriziranega dela, aplikacija vrže 403 napako.</p>
<p>V bližnji prihodnosti bom obelodanil še &#8220;code snippet&#8221; za preprost error handler za PHP na Apache-ju<sup>[6]</sup>.</p>
<p>Happy blogging(coding)!</p>
<ol class="footnotes"><li id="footnote_0_45" class="footnote">v bistvu handlam tri</li><li id="footnote_1_45" class="footnote">Pri Apacheju se ponavadi izpiše tudi verzija. Če ta ni vsaj verzija 1.3.37, je strežnik lahko kar hitro tarča hekerskega napada.</li><li id="footnote_2_45" class="footnote">prekmursko: tema</li><li id="footnote_3_45" class="footnote">mail, RSS, &#8230;</li><li id="footnote_4_45" class="footnote">z malce sarkazma, obenem pa pošlje še obvestilo o napaki po elektronski pošti</li><li id="footnote_5_45" class="footnote">če bo želja tudi za ASP na IIS-u</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.internet-solutions.si/2007/11/06/404-error-not-found-500-error-internal-server-error/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>O Kovaču in njegovi bosi kobili</title>
		<link>http://www.internet-solutions.si/2007/09/22/o-kovacu-in-njegovi-bosi-kobili/</link>
		<comments>http://www.internet-solutions.si/2007/09/22/o-kovacu-in-njegovi-bosi-kobili/#comments</comments>
		<pubDate>Sat, 22 Sep 2007 12:46:22 +0000</pubDate>
		<dc:creator>alesl</dc:creator>
				<category><![CDATA[Modrüvanje]]></category>
		<category><![CDATA[Tanači]]></category>
		<category><![CDATA[asp]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[wordpress plugins]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Prolog
Lahko bi se tolažil z nam vsem znanim latinskim pregovorom da je vsak začetek težak, le da meni začetki nikoli niso delali preveč težav. Prav nasprotno. Rad imam zečetke, nove stvari, izzive, naloge, saj le tako lahko nahranim male sive celice, ki vedno hrepenijo po svežem znanju. V moji situaciji gre za primer &#8220;čevljarjeve babe&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Prolog</strong><br />
Lahko bi se tolažil z nam vsem znanim latinskim pregovorom da je vsak začetek težak, le da meni začetki nikoli niso delali preveč težav. Prav nasprotno. Rad imam zečetke, nove stvari, izzive, naloge, saj le tako lahko nahranim male sive celice, ki vedno hrepenijo po svežem znanju. V moji situaciji gre za primer &#8220;čevljarjeve babe&#8221; in &#8220;kovačeve kobile&#8221;, ki sta vedno bosi. ;) Že dva meseca, tistih nekaj prostih ur na teden, ki jih imam med projekti, porabim za &#8220;krpanje&#8221; bloga. Odločil sem se, da bom blog objavil, čeprav še ni stoodstotno pripravljen in preveden.</p>
<p><strong>Blog! O čem?</strong><br />
Predvsem seveda &#8220;reklamiranju moje dejavnosti&#8221;. Vsi prispevki na blogu pa bodo imeli skupno nit oziroma slogan &#8211; <strong>Human knowledge belongs to the world.</strong> :) Našli boste kakšen pameten tanač<sup>[1]</sup>, <a href="http://en.wikipedia.org/wiki/Snippet_%28programming%29" rel="nofollow" class="liwikipedia">&#8220;code snippet&#8221;</a>, <a href="http://en.wikipedia.org/wiki/Tutorial" rel="nofollow" class="liwikipedia">tutorial</a>, &#8230; Če drugega ne se boste lahko kratkočasili nad mojim modrüvanjon<sup>[2]</sup>. Zapisi na blogu so zanimi in privlačni predvsem za &#8220;web developerje&#8221;, ki si svoje znanje in izkušnje šele nabirajo. Ne bom se trudil pisati v popolni slovnično pravilni slovenščini, vmes bo padla kakšna angleška skovanka, za posladek še prekmurska rejč<sup>[3]</sup>.<br />
<span id="more-1"></span><br />
<br />
<strong>Prvi post</strong><br />
Kot je glava polna idej, bo ta prvi prispevek ena velika mešanica &#8211; en mindenfele<sup>[4]</sup> izlivov in razmišljanj. Dobra dva meseca nazaj sem zaključil z delom v <a href="http://www.av-studio.si/" class="liexternal">AV studiu</a> in se odločil za meni ugodnejšo opcijo &#8211; delo doma. Kar naenkrat se je pojavila potreba po predstavitveni spletni strani. Klasične spletne strani so &#8220;pase&#8221;, torej je bila edina pametna izbira blog. Odločil sem se, da bom &#8220;hvatal krivine&#8221;, in uporabil <a href="http://en.wikipedia.org/wiki/Open_source" rel="nofollow" class="liwikipedia">&#8220;open source&#8221;</a>, saj mi že časa za redne projekte skorajda primanjkuje. Vprašanje izbire je bila trivialna odločitev, saj sem bil iz vseh strani bombardiran s slavospevi <a href="http://www.wordpress.org/" class="liwp">Wordpressu</a> in malem morju več ali manj (ne)uporabnih <a href="http://wordpress.org/extend/plugins/" class="liwp">pluginov</a>.<br />
Nemudoma sem to &#8220;čudo tehnike&#8221; potegnil dol z neta. Programerska žilica mi ni dala miru in pogledal sem v php &#8220;source fajle&#8221;. Sledilo je veliko razočaranje! Kje je PHP 5 in tri leta razvoja? Trezna glava je počasi prevladala poklicno deformacijo in odgovor je bil na dlani. Na več kot <a href="http://www.nexen.net/chiffres_cles/phpversion/17504-php_statistics_for_august_2007.php#majeure" class="liexternal">77%</a> vseh strežnikov, ki imajo inštaliran PHP še vedno kraljuje verzija 4, kar pomeni za WP velik delež pogače. Dejstvo je, da je v PHP 4 lažje programirat<sup>[5]</sup>, kar prinaša kvantiteto pluginov ki jih pišejo uporabniki stari od 10 do 90 let. Wordpress &#8211; zagotovljena zgodba o uspehu.<br />
PHP 5 je hiter in stabilen, v razvoju je že verzija 6, in ni prav nič pretresljivega, da se je <a href="http://www.php.net/index.php#2007-07-13-1" class="liexternal">PHP</a> odločil da bo &#8220;pokopal&#8221; verzijo 4. Poskrbeli bodo samo za kritične &#8220;security&#8221; flajštre<sup>[6]</sup>. A to dejansko pomeni konec verzije 4? A bodo sedaj vsi naenkrat na vrat na nos presedlali na 5-tko? Dvomim! Poglejmo na primer samo stari dobri <a href="http://en.wikipedia.org/wiki/Classic_ASP" rel="nofollow" class="liwikipedia">ASP</a>. Zadnja verzija 3.0 je ugledala  luč sveta <strong>novembra 2000</strong>, od takrat naprej ni bilo sprememb. <a href="http://www.microsoft.com/en/us/default.aspx" class="liexternal">Microsoft</a> ne nudi več tehnične podpore, ampak pod taktirko <a href="http://en.wikipedia.org/wiki/IIS_7" rel="nofollow" class="liwikipedia">IIS7</a> še vedno lepo laufa. Precej programerjev danes razvija web aplikacije v klasičnem ASP-ju. Zakaj ne gredo enostavno na <a href="http://en.wikipedia.org/wiki/ASP.NET" rel="nofollow" class="liwikipedia">ASP.NET</a> ki je naslednik starine? Odgovor leži v arhitekturi frameworka. ASP.NET je tako imenovani &#8220;<a href="http://en.wikipedia.org/wiki/Event-driven_programming" rel="nofollow" class="liwikipedia">event-driven</a>&#8221; framework in programerja vzpodbuja da razvija aplikacije po &#8220;event-driven&#8221; <a href="http://en.wikipedia.org/wiki/GUI" rel="nofollow" class="liwikipedia">GUI</a> vzorcu z razliko od ASP in PHP, ki sta klasična &#8220;web-skriptna&#8221; jezika. Za prehod na novejšo različico je potrebno drugačno razmišljanje.<br /> <br />
Podoben vzorec lahko najdemo v PHP-ju. Proceduralno programiranje v 4-ki zahteva drugačne pristope kot pa objektno programiranje 5-ke z vsemi njenimi čari<sup>[7]</sup>. Ta miselni preskok je za marsikaterega programerja pretrd oreh in se rajši držijo &#8220;starih&#8221; (ra)(na)z(v)ad.<br />
PHP 5 se prepočasi prebija na strežnike<sup>[8]</sup>. A to pomeni smrt 6-ki še preden se je rodila? :) <br />
Upajmo da ne, he, he. V izogib tega so se združili posamezniki iz nekaterih glavnih &#8220;open source&#8221; projektov in nastal je <a href="http://gophp5.org/" class="liexternal">GoPHP 5</a>. Projekt so med drugim podprli: <a href="http://drupal.org/gophp5" class="liexternal">Drupal</a>, <a href="http://gallery.menalto.com/gallery_2_and_php5" class="liexternal">Gallery</a>, <a href="http://pear.php.net/gophp5.php" class="liexternal">PEAR</a>, <a href="http://www.phpunit.de/wiki/GoPHP5" class="liexternal">PHPUnit</a>, <a href="http://www.phpmyadmin.net/home_page/gophp5.php" class="liexternal">PHPMyAdmin</a>, <a href="http://gophp5.org/projects" class="liexternal">&#8230;</a> in kopica ponudnikov &#8220;<a href="http://gophp5.org/hosts" class="liexternal">web hostinga</a>&#8220;. Preden so nekateri pristopili k projektu, so se na netu prirejale prave borbe in verbalna klanja okrog PHP verzij in katera je &#8220;Über Alles&#8221;. Več ali manj se je vse odvijalo po načelu &#8220;svaki cigo svoga konja hvali&#8221;. Seveda diskusija ni prizanesla niti WordPressu oziroma njenemu &#8220;očetu&#8221; <a href="http://en.wikipedia.org/wiki/Matt_Mullenweg" rel="nofollow" class="liwikipedia">Mattu Mullenwegu</a>, ki na svojem blogu piše: <em><a href="http://photomatt.net/2007/07/13/on-php/" class="liexternal">Fast forward 3 more years and PHP 5 has been, from an adoption point of view, a complete flop</a>.</em><br />
He, he, pravi komedijant tale Matt, ni kaj. :) No, kakorkoli že se bo Matt odločil, Wordpress nima problemov z PHP 5, le njegovih potencialov ne izkorišča, kar je prav škoda.<br />
Nazaj k blogu. Naslednji korak je bil oblačenje in okinčanje<sup>[9]</sup>. Web design mi nikoli ni šel preveč od roke, na srečo pa je na netu cela armada &#8220;<a href="http://codex.wordpress.org/Using_Themes" class="liwp">Wordpress Themes</a>&#8220;. Iskal sem nekaj prepostega in bog ne daj kockastega. :) Navdušil me je <a href="http://www.ndesign-studio.com/resources/wp-themes/itheme/" class="liexternal">iTheme</a>, čeprav domači računalnik poganja Linux. Z malce &#8220;šaranja&#8221; po kodi sem dodal še en stolpec in spremenil glavo dokumenta. <a href="http://www.internet-solutions.si/wp-content/uploads/2007/09/sgml_parser_error.png" rel="lightbox" title='SGML Parser Error'><img align="right" src='http://www.internet-solutions.si/wp-content/uploads/2007/09/sgml_parser_error.png' alt='SGML Parser Error' /></a>Kot web developer uporabljam trenutne standarde in včasih že malce pretiravam. Čeprav večina templatov zagotavlja, da so <a href="http://en.wikipedia.org/wiki/XHTML" rel="nofollow" class="liwikipedia">XHTML Valid</a> mi je rdeč križec <a href="http://users.skynet.be/mgueury/mozilla/" class="liexternal">HTML Validatorja</a> govoril ravno obratno. Pridem do spoznanja, da po kodi rovari Wordpressov WYSIWYG editor in ker že skoraj desetletje kucam HTML na roke, je izklop le tega edina prava rešitev. Kljub temu Wordpress še naprej avtomatično formatira poste in ne zaključuje pravilno paragraph tagov? Ko že obupam in se spravim popravljat kodo, se vseeno spomnim na strica Googla, ki najde plugin z imenom <a href="http://urbangiraffe.com/plugins/disable-wpautop/" class="liexternal">Disable wpautop</a>. Vsebuje le dve vrstici:</p>
<pre class="brush: php;">
remove_filter ('the_content',  'wpautop');
remove_filter ('comment_text', 'wpautop');
</pre>
<p>Ti odstranita &#8220;buggy&#8221; funkcijo wpatuop iz &#8220;hooka&#8221; in s tem preprečita avtomatsko formatiranje teksta. Tisti, ki malce bolje poznate Wordpress veste da filtri &#8211; &#8220;Filters&#8221; in akcije &#8211; &#8220;Actions&#8221; skupaj tvorijo tako imenovane &#8220;Hooks&#8221;, ki enostavno omogočijo pluginu da se priklopi v WordPress.<br />
Res, vse zveni tako enostavno. Kot primer podajam najbolj preprosti Foo Bar plugin, ki na koncu posta doda tekst:</p>
<pre class="brush: php;">
/** add foo bar filter on content */
add_filter('the_content', 'addfooBar');

/**
 * Add foo bar at end of the content
 *
 * @param string $content
 * @return string
 */
function addFooBar($content) {
	$foo = 'Foo Bar';

	return  $content . &quot; $foo&quot;;
}
</pre>
<p>Za komentarje v  kodi uporabljam Documentation block oziroma DocBlock ampak o tem kdaj drugič. ;) Vrnimo se k pluginih. Niso vsi tako nedolžni kot izgledajo, zato previdnost pri njihovi uporabi ni odveč. Do pred kratkim je bil <a href="http://www.neato.co.nz/ultimate-tag-warrior" class="liexternal">Ultimate Tag Warrior</a> ranljiv na <a href="http://en.wikipedia.org/wiki/SQL_injection" rel="nofollow" class="liwikipedia">SQL injection</a>. Kaj to za čuda je v kakem prihodnjem postu, je pa ta vrsta varnostne luknje zelo pogosta pri programerjih, saj enostavno pozabijo, da je potrebno vsak uporabniški vnos preverjati in filtrirati. Na varnostno luknjo sem opozoril tudi avtorico plugina, ki je sicer že popravila napako. Še screen: <a href="http://www.internet-solutions.si/wp-content/uploads/2007/09/sql_injection_utw.png" rel="lightbox" title='SQL injection UTW - PoC' class="liexternal">SQL injection UTW &#8211; PoC</a>. No Matt, če bi bil Wordpress napisan za PHP 5 bi naprimer lahko uporabil PDO exstension, ter parameteriziran SQL vnos in bi zadeva bila s tem zaključena ;)<br />
Hrošči v aplikacijah so čisto nekaj običajnega, to bo potrdil vsak, ki je napisal vsaj eno vrstico kode. Ni aplikacije, ki bi bila stoodstotno brez napak. Da bi programer imel čimmanj poznejšega &#8220;debuggiranja&#8221;<sup>[10]</sup> mora dobro poznati okolje v katerem programira. Poznavanje robnih pogojev določenega problema, vsako preverjanje in filtriranje vnosnih podatkov, ustrezno reagiranje na napake, lahko že prepreči nepričakovano obnašanje programa oziroma aplikacije, ki se v najbolj nežni obliki pokaže kot &#8220;sesuvanje&#8221;, da pa o črnih scenarijih nite ne bomo razmišljali. Tudi sam Wordpress ni nobena izjema kar se tiče &#8220;luknjavosti&#8221;, o tem se lahko prepričate na spletni strani od <a href="http://nvd.nist.gov/nvd.cfm" class="liexternal">NVD-ja (National Vulnerability Database)</a>.</p>
<p><strong>Epilog</strong><br />
Treba bo zaključiti, ker bom drugače pisal še tri dni ;) Upam, da vam s tem prispevkom nisem odvrnil želje od bloganja in uporabe Wordpress-a. ;) Če imate željo po &#8220;izlivih&#8221; v elektronski obliki je Wordpress pravo orodje za to<sup>[11]</sup>, saj ga obdaja ogromen &#8220;cummunity&#8221;, ki skrbi da nikoli ne zmanjka oblekic in priboljškov za njega. Poskrbite za to, da boste imeli na strežniku inštalirano karseda &#8220;friško&#8221;<sup>[12]</sup> verzijo. Po vsaki posodobitvi preverite vaše plugine, obstaja velika verjetnost da ne bodo več delovali. :) Za sledenje verzij pluginov, ki jih imate nameščene na vašem blogu priporočam <a href="http://wp-plugins-db.org/wp-plugins-tracker" class="liexternal">WP Plugins Tracker</a>. Ne uporabljajte tiste, katerega zadnja posodobitev je bila pred več kot pol leta, definitifno obstaja boljša ekvivalenca. In nabolj važno: <strong>redno skrbite za backup</strong>!</p>
<p>Happy blogging(coding)!</p>
<ol class="footnotes"><li id="footnote_0_1" class="footnote">nasvet; Dala mi je že ene par dobrih tanačof.</li><li id="footnote_1_1" class="footnote">gostobesedno in nesmiselno govoriti; Ne modrüj telko.</li><li id="footnote_2_1" class="footnote">beseda; Tak se guči, tao je rejč!</li><li id="footnote_3_1" class="footnote">mindenfele: raznorazne</li><li id="footnote_4_1" class="footnote">če izvzamemo da ne programiramo objektno v PHP 5 &#8211; a ima potem  sploh smisel preiti na petko :) </li><li id="footnote_5_1" class="footnote">flajšter: obliž</li><li id="footnote_6_1" class="footnote">konstruktor, dedovanje, polimorfizem, statične metode, php design paterni &#8230;</li><li id="footnote_7_1" class="footnote">le dobrih 20% ga je na vseh svetovnih inštalacijah</li><li id="footnote_8_1" class="footnote">okrasiti; Krispan so inda okinčali z oreji pa s süjon sadjon.</li><li id="footnote_9_1" class="footnote">razhroščevanja &#8211; postopek iskanja in odpravljanja softverskih hroščev</li><li id="footnote_10_1" class="footnote">pustimo programsko kodo v ozadju, he, he</li><li id="footnote_11_1" class="footnote">sveže: Pobrao san friško šalato.</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.internet-solutions.si/2007/09/22/o-kovacu-in-njegovi-bosi-kobili/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
