<?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; Tutorials</title>
	<atom:link href="http://www.internet-solutions.si/category/tutorials/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>Tue, 07 Sep 2010 13:17:52 +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>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>Ločevanje Apache log datotek z uporabo vlogger-ja</title>
		<link>http://www.internet-solutions.si/2008/06/12/locevanje-apache-log-datotek-z-uporabo-vlogger-ja/</link>
		<comments>http://www.internet-solutions.si/2008/06/12/locevanje-apache-log-datotek-z-uporabo-vlogger-ja/#comments</comments>
		<pubDate>Thu, 12 Jun 2008 12:01:12 +0000</pubDate>
		<dc:creator>alesl</dc:creator>
				<category><![CDATA[Tanači]]></category>
		<category><![CDATA[Tehnologija]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[logfile]]></category>
		<category><![CDATA[rotater/parser]]></category>

		<guid isPermaLink="false">http://www.internet-solutions.si/?p=59</guid>
		<description><![CDATA[Long time no see
Po dolgem času spet nekaj za narodov blagor. Od zadnje objave je minilo kar nekaj časa. Delavniki so še vedno enaki: sestanki, ideje, realizacija, skratka ena velika &#8220;gužva&#8221; :)
Doma in v službi sem dokončno prešaltal na linux. Svojemu profilu na LinkedIn lahko počasi dodam napredno znanje in administracija Debian/Ubuntu based linux distribucij.
Še [...]]]></description>
			<content:encoded><![CDATA[<h2>Long time no see</h2>
<p>Po dolgem času spet nekaj za narodov blagor. Od zadnje objave je minilo kar nekaj časa. Delavniki so še vedno enaki: sestanki, ideje, realizacija, skratka ena velika &#8220;gužva&#8221; :)<br />
Doma in v službi sem dokončno prešaltal na linux. Svojemu profilu na <a href="http://www.linkedin.com/in/alesl" class="liexternal">LinkedIn</a> lahko počasi dodam napredno znanje in administracija Debian/Ubuntu based linux distribucij.<br />
Še vedno veliko raziskujem in testiram. Med zadnjimi uspešnimi eksperimenti je inštalacija <a href="http://www.internet-solutions.si/wp-content/uploads/2008/06/macosx.jpg" rel="lightbox" title="Mac Os X 10.5.2" class="liexternal">Leoparda (Mac Os X 10.5.2)</a> na zunanjem USB disku na dve leti starem PC-ju z AMD Athlon 64 procesorjem. Kako mi je to uspelo, vam ne morem razkriti, saj je celotna stvar namenjena testiranju in ni ravno legalna ;) Koga zanima kaj več si naj ogleda <strong><a href="http://www.osx86project.org/" class="liexternal">OSx86 Project</a></strong>. Vsekakor je <a href="http://www.apple.com/macpro/" class="liexternal">Mac Pro</a> moj developer dream machine, saj mi kljub n-odprtim aplikacijam:</p>
<ul>
<li>Firefox z cca 50 odprtimi tabi</li>
<li>Opera z cca 20 odprtimi tabi</li>
<li>Safari z cca 10 odprtimi tabi</li>
<li>Zend Studio for Eclipse</li>
<li>Aptana Studio</li>
<li>in še eno 20 raznoraznih programčkov</li>
</ul>
<p>na PC-ju ni uspelo preobremenit procesor in s tem OS X, da bi ta vsaj malo počepnil. Kako celotna zadeva deluje na originalnem Macu pa si lahko le zamišljam.<br />
<br/><br />
<span id="more-59"></span></p>
<h2>Vlogger</h2>
<p><a href="http://n0rp.chemlab.org/vlogger/" class="liexternal">Vlogger</a> je majhen programček napisan v perlu s katerim zapisujemo Apache log datoteke razbite na mape virtual hostov. V posameznih mapah se nahajajo dostopi (access.log) po dnevih. Z malenkostnim popravkom skripte pa lahko v istih mapah shranjujemo tudi napake (error.log). Zadeva je zelo podobna <a href="http://www.cronolog.org/" class="liexternal">cronolog-u</a>, le da ne rabimo za vsak virtual host pisat svojo<br />
direktivo, kar posledično zmanjša število dostop in s tem &#8220;file handlov&#8221;. Zakaj je to pomembo?<br />
Recimo da ima vsak Virtual Host svoje log datoteke in nimamo nobene posebnosti pri zapisovanju logov (ne uporabljamo rotatorja/parserja ampak pustimo da Apache sam skrbi za log datoteke) bomo pri nekaj več sto Virtualnih Hostov kmalu naleteli na težave. Apache-ju bo kaj kmalu zmanjkalo tako imenovanih &#8220;<a href="http://httpd.apache.org/docs/2.0/vhosts/fd-limits.html" class="liexternal">file deskriptorjev</a>&#8220;, ki jih ima na voljo.<br />
Tukaj pridejo na pomoč razni &#8220;virtual web logfile rotater/parser&#8221; programčki. Med njimi je tudi vlogger. Sam sem stestiral vlogger na Debian/Ubuntu linuxu, Mac Os X ter FreeBSD-ju. Na vseh sistemih sem pred tem Apache2 že inštaliral in vlogger je na vseh deloval kot namazan.</p>
<h3>Inštalacija</h3>
<p> <b>Linux:</b></p>
<pre class="brush: bash;">sudo apt-get install vlogger</pre>
<p><b>Mac Os X, FreeBSD:</b><br />
Prenesi datoteko <a href="http://n0rp.chemlab.org/vlogger/vlogger-1.3.tar.gz" class="lizip">vlogger-1.3</a>, odpakiraj in prekopiraj vlogger v /usr/sbin/ direktorij.</p>
<h3>Konfiguracija</h3>
<p>Vse kar moremo narediti, da bo vlogger špilal je da v globalno konfiguracijsko datoteko od Apache strežnika postavimo eno &#8220;CustomLog&#8221; direktivo in ta bo zapisoval dostopne loge za vsak Virtual Host in dan posebej.<br />
Še prej pa popravimo &#8220;LogFormat&#8221; vrstico (tisto z imenom combined). Dodamo string %v na začetek le te. Odprimo apache konfiguracijsko datoteko<sup>[1]</sup>:</p>
<pre class="brush: bash;">
[...]
#LogFormat &quot;%h %V/%v %l %u %t \&quot;%r\&quot; %&gt;s %b \&quot;%{Referer}i\&quot; \&quot;%{User-Agent}i\&quot;&quot; combined
LogFormat &quot;%v %h %l %u %t \&quot;%r\&quot; %&gt;s %b \&quot;%{Referer}i\&quot; \&quot;%{User-Agent}i\&quot;&quot; combined
[...]
</pre>
<p>Popravimo še &#8220;CustomLog&#8221; vrstico</p>
<pre class="brush: bash;">
[...]
#CustomLog /var/log/apache2/access.log combined
CustomLog &quot;| /usr/sbin/vlogger -t \&quot;access.log.%Y-%m-%d\&quot; -s access.log /var/log/apache2&quot; combined
[...]
</pre>
<p>Tako bomo zapisovali vse log datoteke v poddirektorije<sup>[2]</sup>  v &#8220;/var/log/apache2&#8243; z imenom access.log.yyyy-mm-dd z simbolicnim linkom &#8220;access.log&#8221;<br />
Kot sem že omenil potrebujemo samo eno &#8220;CustomLog&#8221; direktivo za celotno konfiguracijo Apache-ja.<br/><br />
<span style="color:red;">NE POZABITE izključit ostale &#8220;CustomLog&#8221; direktive, še posebej v Virtual Host konfiguracijah!</span><br/><br />
Dodatna prednost v eni sami dostopni datoteki, poleg že omenjenega limita &#8220;file deskriptorjev&#8221;, je seveda zmanjšanje server loada še posebej na straneh z veliko prometa.<br />
<a href="http://www.internet-solutions.si/wp-content/uploads/2008/06/access_log.png" rel="lightbox"><img src="http://www.internet-solutions.si/wp-content/uploads/2008/06/access_log-150x150.png" alt="Vlogger access.log na Ubuntu 6.06" title="Vlogger access.log na Ubuntu 6.06" width="150" height="150" class="alignleft size-thumbnail wp-image-61" /></a><br />
Primer zapisa access logov na Ubuntu 6.06</p>
<h3>ErrorLog mode</h3>
<p>Z vlogger-jem lahko parsamo tudi napake. V tem modu je parsanje host-a izključeno in datoteka se zapiše z uporabo template datoteke v podani LOGDIR<sup>[3]</sup>.</p>
<pre class="brush: bash;">
[...]
#ErrorLog &quot;/var/logs/apache2/error.log&quot;
ErrorLog  &quot;| /usr/sbin/vlogger -e -t \&quot;error.log.%Y-%m-%d\&quot; -s error.log /var/log/apache2/errors&quot;
[...]
</pre>
<p>Prav tako nastavimo level napak, ki se naj shranjujejo v ErrorLog. Za produkcijo je priporočljiv vsaj level <a href="http://httpd.apache.org/docs/2.0/mod/core.html#loglevel" class="liexternal">Critital Conditions</a>.</p>
<pre class="brush: bash;">
[...]
#
# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel crit
[...]
</pre>
<p>Če želimo v error log ujeti še PHP napake v php.ini-ju nastavimo naslednje:</p>
<pre class="brush: bash;">
[...]
;Log errors into a log file (server-specific log, stderr, or error_log (below))
; As stated above, you're strongly advised to use error logging in place of
; error displaying on production web sites.
log_errors = On
[...]
</pre>
<p><a href="http://www.internet-solutions.si/wp-content/uploads/2008/06/error_log.png" rel="lightbox"><img src="http://www.internet-solutions.si/wp-content/uploads/2008/06/error_log-150x150.png" alt="Vlogger error.log na Ubuntu 6.06" title="Vlogger error.log na Ubuntu 6.06" width="150" height="150" class="alignleft size-thumbnail wp-image-62" /></a><br/><br />
Primer zapisa error loga na Ubuntu 6.06</p>
<h3>Tip</h3>
<p>Z malim popravkom vlogger skripte lahko error.log datoteke zapisujete v Virtual Host mape, kjer se že nahajajo access.log datoteke. <b>Ne priporočam tega v produkciji, saj lahko spet naletimo na problem limita &#8220;file deskriptorjev&#8221;</b><br />
Gre bolj za pomoč programerjem, saj opažam da nemalokateri razvijalec kliče na pomoč ob prvi napaki.<br />
Odprimo vlogger skripto in spremenimo<sup>[4]</sup>:</p>
<pre class="brush: perl;">
#!/usr/bin/perl - T v
#!/usr/bin/perl
[...]
        mkdir(&quot;$ARGV[0]&quot;);
        #print STDERR
        #  &quot;[vlogger] target directory $ARGV[0] does not exist - exiting.\n\n&quot;;
        #exit;
[...]
</pre>
<p>S tem najprej disablom da bi perl preverjal tako imenovane &#8220;tainting checks&#8221;, ter kreiramo mapo za error.log če ta ne obstaja. Ker se target direktorij za error log preverja takoj ob zagonu Apache-ja, bi se v nasprotnem primeru skripta ustavila in bi se zapisoval samo access.log.<br />
<br />
Sedaj samo še dodamo direktivo v Virtual Host konfiguracijo</p>
<pre class="brush: bash;">
[...]
&lt;VirtualHost *&gt;
    DocumentRoot &quot;/opt/local/apache2/htdocs/virtualhost&quot;
    ServerName virtualhost
    ErrorLog  &quot;| /usr/sbin/vlogger -e -t \&quot;error.log.%Y-%m-%d\&quot; -s error.log /var/log/apache2/virtualhost&quot;
&lt;/VirtualHost&gt;
[...]
</pre>
<p><a href="http://www.internet-solutions.si/wp-content/uploads/2008/06/access_error.png" rel="lightbox"><img src="http://www.internet-solutions.si/wp-content/uploads/2008/06/access_error-150x150.png" alt="Access in Error Log v isti mapi od Virtual Hosta" title="Access in Error Log v isti mapi od Virtual Hosta" width="150" height="150" class="alignleft size-thumbnail wp-image-63" /></a><br/><br />
Access in Error Log v isti mapi od Virtual Hosta.<br/><br />
<br />
Happy blogging(coding)!</p>
<ol class="footnotes"><li id="footnote_0_59" class="footnote">linux: /etc/apache2/apache2.conf; mac os x: /opt/local/apache2/conf/httpd.conf; freeBSD: /usr/local/etc/apache22/httpd.conf</li><li id="footnote_1_59" class="footnote">virtualhost.com, virtualhost1.com, &#8230;</li><li id="footnote_2_59" class="footnote">npr: kreiramo mapo /errors v /var/log/apache2</li><li id="footnote_3_59" class="footnote">v vrsticah 1 in 174 </li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.internet-solutions.si/2008/06/12/locevanje-apache-log-datotek-z-uporabo-vlogger-ja/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kako iz nule inštalirati Apache 2.2.8,  MySQL 5.0.51 in PHP 5.2.5 na Ubuntu Dapper (6.06)</title>
		<link>http://www.internet-solutions.si/2008/01/28/kako-iz-nule-instalirati-apache-228-mysql-5051-in-php-525-na-ubuntu-dapper-606/</link>
		<comments>http://www.internet-solutions.si/2008/01/28/kako-iz-nule-instalirati-apache-228-mysql-5051-in-php-525-na-ubuntu-dapper-606/#comments</comments>
		<pubDate>Sun, 27 Jan 2008 22:26:56 +0000</pubDate>
		<dc:creator>alesl</dc:creator>
				<category><![CDATA[Code snippets]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Ubuntu Dapper]]></category>

		<guid isPermaLink="false">http://www.internet-solutions.si/2008/01/28/kako-iz-nule-instalirati-apache-228-mysql-5051-in-php-525-na-ubuntu-dapper-606/</guid>
		<description><![CDATA[Pred dobrim tednom sem si omislil VPS (virtual private server). Potreba po VPS-ju izhaja predvsem po želji izboljšati znanje Linux-a in administracije strežnikov.
Izbira ponudnika spletnega gostovanja je kar teška odločitev, saj jih je kot gob po dežju. Izbral sem Host Europe, prvensteveno zaradi nizke cene 20 EUR. 
V drugem planu pa me je pritegnila dodatna [...]]]></description>
			<content:encoded><![CDATA[<p>Pred dobrim tednom sem si omislil <a href="http://en.wikipedia.org/wiki/Virtual_private_server" rel="nofollow" class="liwikipedia">VPS</a> (virtual private server). Potreba po VPS-ju izhaja predvsem po želji izboljšati znanje <a href="http://en.wikipedia.org/wiki/Linux" rel="nofollow" class="liwikipedia">Linux</a>-a in administracije strežnikov.<br />
Izbira ponudnika spletnega gostovanja je kar teška odločitev, saj jih je kot gob po dežju. Izbral sem <a href="http://www.hosteurope.de/" class="liexternal">Host Europe</a>, prvensteveno zaradi nizke cene <a href="http://www.hosteurope.de/produkt/Virtual-Server-Linux-XL" class="liexternal">20 EUR</a>. <br />
V drugem planu pa me je pritegnila dodatna ponudba: Hardware, lastna izbira operacijskega sistema (Debian, Ubuntu,  SUSE).  Do sedaj sem imel opravka z <a href="http://www.debian.org/" class="liexternal">Debianom</a> in <a href="http://www.ubuntu.com/" class="liexternal">Ubuntujem</a>.<br />
Ker sem slednjega malenkost več uporabljal, sem se odločil za <strong>Ubuntu brez <a href="http://www.swsoft.com/plesk/" class="liexternal">Pleska</a></strong>. Prvotno veselje je malce popustilo, ko sem pogruntal da je distribucija Ubuntuja, ki je inštalirana na VPS-ju trenutno še verzija 6.06  iz junija 2006, kar dejansko pomeni da so <a href="http://packages.ubuntu.com/dapper/" class="liexternal">softverski paketi</a> že malce zastareli. Next time read <a href="http://www.hosteurope.de/faq/index.php?cpid=11861" class="liexternal">FAQ</a>! :)<br />
<span id="more-57"></span><br />
<br />
Za povprečnega uporabnika je to zadovoljivo, saj  lahko z orodjem <strong><a href="http://www.webopedia.com/TERM/A/apt.html" class="liexternal">apt</a></strong> inštaliramo:</p>
<ul>
<li>Apache: 2.0.55</li>
<li>PHP HP 4.4.2 in 5.1.2</li>
<li>MySQL 5.0.22</li>
</ul>
<p>Zadnji moji projekti močno bazirajo na knjižicah <strong>Zend Frameworka</strong>, ki pa rabijo verzijo  PHP-ja vsaj <a href="http://framework.zend.com/manual/en/requirements.html" class="liexternal">5.1.4</a>  (priporočljiva je uporaba 5.2.3 naprej). Kar pomeni, da bi se lahko pod nosom obrisal, da bi VPS uporabljal kot platformo za razvoj, z samo predpripravljenimi paketi seveda.</p>
<p>Ostali sta mi dve opciji:</p>
<ul>
<li>building in compiling iz nule</li>
<li>download in usposobitev <a href="http://www.apachefriends.org/en/xampp-linux.html" class="liexternal">XAMPP</a>-a<sup>[1]</sup></li>
</ul>
<p><strong>Predvsem zaradi varnosti</strong> in dejstvu, da imam rad vajeti vedno v rokah, sem se odločil, da bom inštaliral veliko trojico iz nule. Pljunil sem v roke, ter zavihal rokave &#8230;  ./configure, make in make install so bili dva dni moji hardcore spremljevalci. Ker je bil to moj prvi podvig inštalacije apache, mysql in php-ja iz source datotek, je bilo veselje ko je vse skupaj zalaufalo brez napak toliko večje.</p>
<p>Za vse, ki bi kdaj želeli  ubosti podoben podvig, pa sem pripravil nekaj skript, da vam bo stvar lažje šla od rok.</p>
<p><a href="http://www.internet-solutions.si/wp-content/uploads/2008/01/apache_mysql_php.zip" title='How to build Apache 2.2.8, MySQL 5.0.51, PHP 5.2.5 on Ubuntu Dapper (6.06)' class="lizip">How to Build Apache 2.2.8,  MySQL 5.0.51, PHP 5.2.5 on Ubuntu Dapper (6.06)</a></p>
<p>Poglejmo <a href="http://www.celavi.org/info.php" class="liexternal">konfiguracijo</a>:</p>
<ul>
<li>Apache/2.2.8 mod_ssl/2.2.8 OpenSSL/0.9.7m DAV/2</li>
<li>MySQL 5.0.51 z SSL podporo</li>
<li>PHP 5.2.5 v večino dodatkov ki jih rabim pri razvoju: cURL, OpenSSL, PDO MySQL, IMAP, &#8230;</li>
</ul>
<p>Na kakšne večje težave nisem naletel. OpenSSL verzija 0.9.8 se nikakor ni hotela skompajlirat z MySQL-om, tako da sem potem ubodel eno minor verzijo niže. Nekatere skripte (imap, PDO_MySQL) so v configuracijskih datotekah narobe referencirale nekatere knjižice. To se najlažje reši z simboličnim linkanjem na zahtevane knjižice.</p>
<p><strong>Še kratka navodila.</strong> Skripte, ki jih najdete v zip-u prebirajte in zaganjajate v tem vrstem redu<sup>[2]</sup>:</p>
<ul>
<li>preberi apache2-pre-install.txt</li>
<li>zaženi apache2-download.sh</li>
<li>zaženi apache2-install.sh</li>
<li>preberi apache2-post-install.txt</li>
<li>enako storitze še za mysql ter php</li>
</ul>
<p>Apache laufa pod svojim userjem, prav tako MySQL. Ne pozabite še nastavit root gesla za MySQL uporabnika. V primeru da se compiler ustavi  in ne boste vedeli, kaj je narobe, sem vam na voljo :)</p>
<p>Še vpogled v  eno od shell skript &#8211; <strong>apache2-download.sh</strong></p>
<pre class="brush: bash;">
#!/bin/sh

#
# Downloads and unpacks apache2 with dependencies
#
# @author Ales Loncar &lt;ales.loncar@internet-solutions.si&gt;
# @copyright 	Copyright (c) 2008 Internet Solutions
# @license GNU Public License
# @link http://www.internet-solutions.si
# @version 1.0

echo
echo apache2-download.sh
echo - This script downloads and unpacks all prerequisite packages
echo - Run this script before apache2-install.sh
echo
read -p  &quot;(Press any key to continue)&quot; temp;
echo

# Abort on any errors
set -e

#source directory (/usr/local/src)
SRCDIR=/usr/local/src

# Set DISTDIR to somewhere persistent, if you plan to muck around with this
# script and run it several times!
DISTDIR=/usr/local/dist

# Update version information here.
# Zlib
ZLIB=&quot;zlib-1.2.3&quot;
# OpenSSL
OPENSSL=&quot;openssl-0.9.7m&quot;
# libiconv
LIBICONV=&quot;libiconv-1.12&quot;
# apache2
HTTPD=&quot;httpd-2.2.8&quot;

cd ${DISTDIR}

# Get all the required packages
echo
echo --- Downloading all required packages ---
echo

# Zlib
wget -c http://www.zlib.net/${ZLIB}.tar.gz
# OpenSSL
wget -c http://www.openssl.org/source/${OPENSSL}.tar.gz
# libiconv
wget -c http://ftp.gnu.org/pub/gnu/libiconv/${LIBICONV}.tar.gz
# apache2
wget -c http://www.apache.si/httpd/${HTTPD}.tar.gz

echo
echo --- Unpacking downloaded archives. This process may take several minutes! ---
echo

cd ${SRCDIR}
# Unpack them all
# Zlib
echo Extracting ${ZLIB}...
tar xzf ${DISTDIR}/${ZLIB}.tar.gz &gt; /dev/null
echo Done.
# OpenSSL
echo Extracting ${OPENSSL}...
tar xzf ${DISTDIR}/${OPENSSL}.tar.gz &gt; /dev/null
echo Done.
# libiconv
echo Extracting ${LIBICONV}...
tar xzf ${DISTDIR}/${LIBICONV}.tar.gz &gt; /dev/null
echo Done.
# apache2
echo Extracting ${HTTPD}...
tar xzf ${DISTDIR}/${HTTPD}.tar.gz &gt; /dev/null
echo Done.

echo --------------------------------------------------
echo -- Done downloading and unpacking prerequisites --
echo --------------------------------------------------
</pre>
<p>
Happy blogging(coding)!</p>
<ol class="footnotes"><li id="footnote_0_57" class="footnote">Uporabo XAMPP-a odsvetujejo v produksijskem okolju, zaradi prešibke varnosti nekaterih procesov, ki laufajo brez gesel</li><li id="footnote_1_57" class="footnote">Za zagon shell skript rabite root privilegije. Ne pozabite jim nastavit execute pravic: chmod +x</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.internet-solutions.si/2008/01/28/kako-iz-nule-instalirati-apache-228-mysql-5051-in-php-525-na-ubuntu-dapper-606/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Skrivnost večih IIS virtualnih serverjev na Windows XP Pro</title>
		<link>http://www.internet-solutions.si/2007/09/29/skrivnost-vecih-iis-virtualnih-serverjev-na-windows-xp-pro/</link>
		<comments>http://www.internet-solutions.si/2007/09/29/skrivnost-vecih-iis-virtualnih-serverjev-na-windows-xp-pro/#comments</comments>
		<pubDate>Sat, 29 Sep 2007 01:00:50 +0000</pubDate>
		<dc:creator>alesl</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[asp]]></category>
		<category><![CDATA[iis]]></category>
		<category><![CDATA[virtual host]]></category>

		<guid isPermaLink="false">http://www.isolutions.localhost/2007/09/27/vec-iis-virtualnih-streznikov-na-xp-pro/</guid>
		<description><![CDATA[Virtual server, Virtual Host??
Apache[1], je kot web strežnik odigral ključno vlogo v razvoju World Wide Web-a. Deset let nazaj je bil najbolj popularen HTTP server na svetu. Pred dobrim letom, dve pa je počasi začel izgubljati delež trga, predvsem zaradi IIS[2] ter .NET platforme. Trenutno Apache servira 50% vseh spletnih strani, IIS pa 34%. Dost [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Virtual server, Virtual Host??</strong><br />
<a href="http://httpd.apache.org/" class="liexternal">Apache</a><sup>[1]</sup>, je kot web strežnik odigral ključno vlogo v razvoju <a href="http://en.wikipedia.org/wiki/World_wide_web" rel="nofollow" class="liwikipedia">World Wide Web-a</a>. Deset let nazaj je bil najbolj popularen HTTP server na svetu. Pred dobrim letom, dve pa je počasi začel izgubljati delež trga, predvsem zaradi IIS<sup>[2]</sup> ter .NET platforme. Trenutno Apache servira <a href="http://survey.netcraft.com/Reports/200708/byserver/" class="liexternal">50%</a> vseh spletnih strani, IIS pa <a href="http://survey.netcraft.com/Reports/200708/byserver/" class="liexternal">34%</a>. Dost je statistike, preidimo na stvar.<br />
Da na eni &#8220;mašini&#8221; laufa več spletnih strani<sup>[3]</sup> je nekaj samoumevnega. Pri razvoju &#8220;web aplikacij&#8221; želimo, da objava spletne strani na &#8220;produkcijskem&#8221; strežniku poteka s čim manj zapleti. To najlažje dosežemo tako, da razvojno okolje čimbolj približamo produkcijskemu. Ta korak od nas zahteva zagon večih spletnih aplikacij na lokalni &#8220;mašini&#8221;. Praksa ki to omogoča se v Apache-ju imenuje &#8220;<a href="http://en.wikipedia.org/wiki/Virtual_host" rel="nofollow" class="liwikipedia">Virtual Host</a>&#8220;. Kako konfiguriramo Apache za podporo virtual hostingu bom razložil kdaj drugič ;)<br />
<span id="more-5"></span><br />
Microsoftov odgovor na Apache Virtual Host je Virtual Server. Tako kot pri Apache virtual hostih ima vsak virtual server na IISu svojo domeno in IP naslov<sup>[4]</sup>. Apache-jev &#8220;named-based&#8221; virtual host IIS podpira na isti način le da se ta propagira skozi imena &#8220;host headerjev&#8221;.<br />
Ena izmed glavnih razvojnih značilnosti na katero je Microsoft pozabil pri &#8220;koraku&#8221; iz Windows 2000 Workstation na Windows XP Pro je zmožnost zagona večih virtualnih serverjev na eni mašini. Pravzaprav so fantje iz Microsofta onemogočili (skrili) element v meniju <a href="http://www.internet-solutions.si/wp-content/uploads/2007/09/virtual_servers_01.png" rel="lightbox" title='IIS Managment Console' class="liexternal">IIS Managment Console</a>, ki omogoča kreiranje novih virtualnih serverjev. Za spletnega razvijalca, ki izdeluje in skrbi za nešteto aplikacij<sup>[5]</sup> je ta omejitev precej nadležna. Čeprav lahko teoretično kreiramo novo spletno stran pod privzetim spletnim serverjem<sup>[6]</sup>, predstavlja to bolj problem kot rešitev. Nova spletna stran se mora zavedati te &#8220;kompenzacije poti&#8221; ko naslavlja sama sebe z uporabo <a href="http://en.wikipedia.org/wiki/Path_%28computing%29" rel="nofollow" class="liwikipedia">absolutnih ali relativnih poti</a>. Prednost novega in neodvisnega virtualnega serverja je v tem da sam prepozna svoj lasten virtualni &#8220;root&#8221; in poti.</p>
<p><strong>Kajti ti bo Windows XP Pro saj imamo Windows Visto!</strong><br />
Res je. Navajam le dva argumenta, ki podpirata objavo tega prispevka:</p>
<ul>
<li><a href="http://marketshare.hitslink.com/report.aspx?qprid=2" class="liexternal">Windows XP</a> so po uporabi še vedno daleč v ospredju. Samo eden od desetih razvijalcev<sup>[7]</sup>, ki uporabljajo IIS bo ta članek prezrl ;)</li>
<li>Za razvoj aplikacij v Visti potrebujemo ultra-super-duper hudo mašino, saj si bo že sam operacijski sistem rezerviral skoraj 3/4 prostega pomnilnika. Pri samem razvoju naletimo na kopico težav. Največ preglavic dela Vistin &#8220;ownership&#8221;, saj je potrebno za vsako stvar, ki ne lauafa pod IIS IUSR uporabniškim računom<sup>[8]</sup> eksplicitno prevzeti lastništvo.</li>
</ul>
<p><strong>Skrivnost</strong><br />
Kakorkoli obstaja alternativna rešitev, čeprav je rahlo nerodna. Kot sem že prej omenil je možnost kreiranja večih virtualnih serverjev le skrita, ni pa čisto odvzeta. Čeprav ne moremo ustvarit novega virtualnega serverja preko <a href="http://en.wikipedia.org/wiki/Microsoft_Management_Console" rel="nofollow" class="liwikipedia">MMC-ja</a>, lahko uporabimo administracijske skripte ki so v standardnem paketu IIS-a<sup>[9]</sup>. Virtualni serverji IIS-a so definirani v tako imenovai &#8220;IIS metabase&#8221; kot številčni vnosi pod W3SVC ključem.<sup>[10]</sup><br />
Da bi ustvarili nov virtualni server, odprite &#8220;command window&#8221;<sup>[11]</sup> in vpišite naslednje:</p>
<pre class="brush: bash;">
C:\Inetpub\AdminScripts&gt; adsutil.vbs create_vserv W3SVC/2
C:\Inetpub\AdminScripts&gt; adsutil.vbs copy W3SVC/1 W3SVC/2
</pre>
<p>Če prvič zaganjate adsutil.vbs vas bo sistem opozoril, da omenjena <a href="http://www.internet-solutions.si/wp-content/uploads/2007/09/virtual_servers_02.png" rel="lightbox" title='This script does not work with WScript' class="liexternal">skripta ne deluje v WScriptu</a>. V naslednjem pogovornem oknu pritisnite <a href="http://www.internet-solutions.si/wp-content/uploads/2007/09/virtual_servers_03.png" rel="lightbox" title='Would you like to register CScript as your default host for VBScript?' class="liexternal">Yes in zadeva je rešena</a>.</p>
<p><a href="http://www.internet-solutions.si/wp-content/uploads/2007/09/virtual_servers_04.png" rel="lightbox" title='Prvi ukaz kreira nov virtualni server v IIS metabase'><img src='http://www.internet-solutions.si/wp-content/uploads/2007/09/virtual_servers_04.thumbnail.png' alt='Prvi ukaz kreira nov virtualni server v IIS metabase' /></a><br />
Prvi ukaz kreira nov virtualni server v IIS metabase</p>
<p><a href="http://www.internet-solutions.si/wp-content/uploads/2007/09/virtual_servers_05.png" rel="lightbox" title='Drugi ukaz prekopira vse potrebne meta podatke iz prizvete spletne strani v novo spletno stran'><img src='http://www.internet-solutions.si/wp-content/uploads/2007/09/virtual_servers_05.thumbnail.png' alt='Drugi ukaz prekopira vse potrebne meta podatke iz prizvete spletne strani v novo spletno stran' /></a><br />
<br />
Drugi ukaz prekopira vse potrebne meta podatke iz prizvete spletne strani v novo spletno stran, ter s tem omogoči njeno pravilno delovanje.</p>
<p>S tem ko prekopiramo meta podatke iz stare spletne strani v novo, nova stran podeduje vse atribute stare strani, vključno z imenom. Seveda želimo da nov virtualni strežnik servira novo aplikacijo in s tem moramo poleg imena spremeniti še ostale parametre kot so &#8220;root&#8221; direktorij, host header ime, &#8230; </p>
<p><strong>Let the magic begin</strong><br />
Razvojne spletne aplikacije ponavadi poganjamo na lokalni mašini. Brskalnik moramo prepričat da web stran ne išče po spletu, ampak jo naj naloži iz domačega serverja. To storimo z vnosom &#8220;hostname&#8221; v datoteko hosts<sup>[12]</sup>. Ta datoteka mapira ime hosta na določen IP naslov<sup>[13]</sup>. </p>
<p><a href="http://www.internet-solutions.si/wp-content/uploads/2007/09/virtual_servers_07.png" rel="lightbox" title='Vpišimo ustrezen hostname v hosts datoteko'><img src='http://www.internet-solutions.si/wp-content/uploads/2007/09/virtual_servers_07.thumbnail.png' alt='Vpišimo ustrezen hostname v hosts datoteko' /></a><br />
Za naš tutorial v datoteko dodajmo: www.foo-localhost.com in www.bar-localhost.com.</p>
<p><a href="http://www.internet-solutions.si/wp-content/uploads/2007/09/virtual_servers_13.png" rel="lightbox" title='Kreiraj root direktorij za virtualni server'><img src='http://www.internet-solutions.si/wp-content/uploads/2007/09/virtual_servers_13.thumbnail.png' alt='Kreiraj root direktorij za virtualni server' /></a><br />
Na disku naredimo še dva direktorija z imenoma hostov za root direktorij posamezne spletne strani. </p>
<p><a href="http://www.internet-solutions.si/wp-content/uploads/2007/09/virtual_servers_06.png" rel="lightbox" title='MMC . kaj pa je sedaj to?'><img align="left" src='http://www.internet-solutions.si/wp-content/uploads/2007/09/virtual_servers_06.thumbnail.png' alt='MMC . kaj pa je sedaj to?' /></a>Odprimo MMC, opazili boste rdečo ikono &#8211; križec poleg novega virtualnega strežnika. To je normalno. Pomeni le da je proces <a href="http://exelib.com/exe/13" class="liexternal">inetinfo.exe</a> želel zagnati ta novi virtualni server.<br clear="all" /><br />
<br />
<strong>V čem je fora?</strong><br />
&#8220;Catch&#8221; je v tem, da kljub temu da lahko ustvarimo več virtualnih Web serverjev na eni Windows XP Pro mašini, lahko neankrat zaganjamo le eno, he he. :) Mene osebno to ne moti, saj naenkrat namenim dnevno več  ur le enemu projektu, da je čimmanj miselnih preskokov od enega problema do drugega. Vrnimo se našemu tutorialu. Za testiranje virtualnih serverjev bomo v root direktorij<sup>[14]</sup> vsake od aplikacije dodali datoteko default.asp z naslednjo vsebino:</p>
<pre class="brush: vb;">
&lt;%@ CodePage=65001 Language=&quot;VBScript&quot;%&gt;
&lt;% OPTION EXPLICIT %&gt;
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;
&lt;head&gt;
	&lt;title&gt;&lt;%Response.Write(Request.ServerVariables(&quot;server_name&quot;))%&gt;&lt;/title&gt;
	&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;div class=&quot;container&quot;&gt;
		&lt;h2&gt;Some Server ASP Variables&lt;/h2&gt;
		&lt;p&gt;
		&lt;b&gt;Your IP address is:&lt;/b&gt;
		&lt;%Response.Write(Request.ServerVariables(&quot;remote_addr&quot;))%&gt;
		&lt;/p&gt;
		&lt;p&gt;
		&lt;b&gt;The server's domain name:&lt;/b&gt;
		&lt;%Response.Write(Request.ServerVariables(&quot;server_name&quot;))%&gt;
		&lt;/p&gt;
		&lt;p&gt;
		&lt;b&gt;The http host name:&lt;/b&gt;
		&lt;%Response.Write(Request.ServerVariables(&quot;http_host&quot;))%&gt;
		&lt;/p&gt;
		&lt;p&gt;
		&lt;b&gt;Application Md path:&lt;/b&gt;
		&lt;%Response.Write(Request.ServerVariables(&quot;appl_md_path&quot;))%&gt;
		&lt;/p&gt;
		&lt;p&gt;
		&lt;b&gt;Application Physical path:&lt;/b&gt;
		&lt;%Response.Write(Request.ServerVariables(&quot;appl_physical_path&quot;))%&gt;
		&lt;/p&gt;
	&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Ostane nam še, da skonfiguriramo vsakega od virtualnih serverjev. Odprimo MMC, z miško se postavimo na ime enega od virtualnih serverjev in z desno tipko izberemo Properties:</p>
<ul>
<li><a href="http://www.internet-solutions.si/wp-content/uploads/2007/09/virtual_servers_08.png" rel="lightbox" title='vpišimo ime virtualnega serverja - Description: Foo' class="liexternal">vpišimo ime virtualnega serverja &#8211; Description: Foo</a></li>
<li><a href="http://www.internet-solutions.si/wp-content/uploads/2007/09/virtual_servers_09.png" rel ="lightbox" title='kliknemo gumb Advanced - Advanced Multiple Web Site Configuration' class="liexternal" rel="lightbox[5]">kliknemo gumb Advanced &#8211; Advanced Multiple Web Site Configuration</a></li>
<li>dvokliknemo na Default, da se odpre Advanced Web Site Identification &#8211; <a href="http://www.internet-solutions.si/wp-content/uploads/2007/09/virtual_servers_10.png" rel="lightbox" title='vpišemo Host Header Name: www.foo-localhost.com' class="liexternal">vpišemo Host Header Name: www.foo-localhost.com</a></li>
<li>izberemo zavihek Home Directory in <a href="http://www.internet-solutions.si/wp-content/uploads/2007/09/virtual_servers_11.png" rel="lightbox" title='nastavimo Local Path - F:\www\www.foo-localhost.com' class="liexternal">nastavimo Local Path &#8211; F:\www\www.foo-localhost.com</a></li>
<li><a href="http://www.internet-solutions.si/wp-content/uploads/2007/09/virtual_servers_12.png" rel="lightbox" title='preverimo samo še zavihek Documents, če vsebuje med privzetimi dokumenti default.asp' class="liexternal">preverimo samo še zavihek Documents, če vsebuje med privzetimi dokumenti default.asp</a></li>
</ul>
<p>Enako skonfiguriramo še drug virtualno strežnik. Preostane nam le da stestiramo ali vse skupaj &#8220;klapa&#8221;. Ne pozabimo da naenkrat lahko zaganjamo samo enega od obeh dveh! V MMC-cu ju ugasnemo/prižgemo<sup>[15]</sup> ustrezen virtualni strežnik ter v preiskusimo delovanje v brskalniku:</p>
<p><a href="http://www.internet-solutions.si/wp-content/uploads/2007/09/virtual_servers_14.png" rel="lightbox" title='Virtualni server Foo - www.foo-localhost.com'><img src='http://www.internet-solutions.si/wp-content/uploads/2007/09/virtual_servers_14.thumbnail.png' alt='Virtualni server Foo - www.foo-localhost.com' /></a><br />
Virtualni server Foo &#8211; www.foo-localhost.com</p>
<p><a href="http://www.internet-solutions.si/wp-content/uploads/2007/09/virtual_servers_15.png" rel="lightbox" title='Virtualni server Bar - www.bar-localhost.com'><img src='http://www.internet-solutions.si/wp-content/uploads/2007/09/virtual_servers_15.thumbnail.png' alt='Virtualni server Bar - www.bar-localhost.com' /></a><br />
Virtualni server Bar &#8211; www.bar-localhost.com</p>
<p>Omeniti velja še, da nezmožnost zaganjanja večih virtualnih serverjev neankrat velja le za IIS 5.1 na Windows XP Pro. Da ne bo kdo dobil zmotnega prepričanja da se isti problem pojavlja pri IIS 6 in Windows Server 2003 ;)<br />
Med preklapljanjem virtualnih serverjev na lokalni mašini, bodite pozorni na izgubo aktivne seje in podatkov trenutno aktivnega virtualnega serverja. Naš glavni namen ostaja isti. Čimbolj približati razvojno okolje produkcijskemu, ter razvoj večih spletnih strani, brez odvečnih skrbi o tem kako bo treba obravnavat absolutne in relativne URL poti v izvorni kodi.</p>
<p>Happy blogging(coding)!</p>
<ol class="footnotes"><li id="footnote_0_5" class="footnote">upam da mi ni treba na drobo razlagat kaj to je ;)</li><li id="footnote_1_5" class="footnote">Microsoft Internet Information Services</li><li id="footnote_2_5" class="footnote">npr. www.podjetje1.com in www.podjetje2.com</li><li id="footnote_3_5" class="footnote">lahko je tudi enak</li><li id="footnote_4_5" class="footnote">za prijatelje, kolege in podjetja</li><li id="footnote_5_5" class="footnote">kot &#8220;child path&#8221; new->Virtual Directory</li><li id="footnote_6_5" class="footnote">če zaokrožimo 6% na 10% :)</li><li id="footnote_7_5" class="footnote">če razvijamo v klasičnemu ASP-ju</li><li id="footnote_8_5" class="footnote">C:\Inetpub\AdminScripts</li><li id="footnote_9_5" class="footnote">privzeti &#8220;Web site&#8221; je poimenovan W3SVC/1, naslednji ustvarjeni bo poimenovan W3SVC/2 itd.</li><li id="footnote_10_5" class="footnote">Pritisnemo tipko Windows+R, ki odpre Run kamor vtipkamo cmd ter pritisnemo enter.</li><li id="footnote_11_5" class="footnote">V windowsih jo najdete v C:\WINDOWS\system32\drivers\etc</li><li id="footnote_12_5" class="footnote">Za localhost je to 127.0.0.1</li><li id="footnote_13_5" class="footnote">F:\www\www.bar-localhost.com in F:\www\www.foo-localhost.com</li><li id="footnote_14_5" class="footnote">desna tipka Stop/Run</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.internet-solutions.si/2007/09/29/skrivnost-vecih-iis-virtualnih-serverjev-na-windows-xp-pro/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
