<?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; Tanači</title>
	<atom:link href="http://www.internet-solutions.si/category/nasveti/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>Enostavno je težje</title>
		<link>http://www.internet-solutions.si/2008/09/16/enostavno-je-tezje/</link>
		<comments>http://www.internet-solutions.si/2008/09/16/enostavno-je-tezje/#comments</comments>
		<pubDate>Tue, 16 Sep 2008 10:24:38 +0000</pubDate>
		<dc:creator>alesl</dc:creator>
				<category><![CDATA[Tanači]]></category>
		<category><![CDATA[Tehnologija]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[scalability]]></category>

		<guid isPermaLink="false">http://www.internet-solutions.si/?p=84</guid>
		<description><![CDATA[Simple Is Hard
Med pucanjem pošte sem naletel na link, ki me je pripeljal do slidov Rasmusa Lerdorfa. Prezentacija je iz avgustovske Drupal konference, ki je potekala pri naših sosedih.
Programerji smo baje čudna bitja. :) Odvisni smo od kompleksnosti in dostikrat ne znamo poiskati enostavno in očitno rešitev danega problema. To potem škodi performansi, skalabilnosti in [...]]]></description>
			<content:encoded><![CDATA[<h2>Simple Is Hard</h2>
<p>Med pucanjem pošte sem naletel na <a href="http://talks.php.net/show/drupal08/0" class="liexternal">link</a>, ki me je pripeljal do slidov <a href="http://lerdorf.com/" class="liexternal">Rasmusa Lerdorfa</a>. Prezentacija je iz avgustovske <a href="http://szeged2008.drupalcon.org/" class="liexternal">Drupal konference</a>, ki je potekala pri naših sosedih.<br />
Programerji smo baje čudna bitja. :) Odvisni smo od kompleksnosti in dostikrat ne znamo poiskati enostavno in očitno rešitev danega problema. To potem škodi performansi, skalabilnosti in varnosti aplikacij.<sup>[1]</sup></p>
<p>Avtor nam na primeru <a href="http://laconi.ca/trac/" class="liexternal">Laconice</a><sup>[2]</sup> nazorno pokaže kako z enostavnimi, preprostimi prijemi izboljšamo performans aplikacije.<br />
<span id="more-84"></span><br />
<embed src="http://www.archive.org/flow/FlowPlayerLight.swf?config=%7Bembedded%3Atrue%2CshowFullScreenButton%3Atrue%2CshowMuteVolumeButton%3Atrue%2CshowMenu%3Atrue%2CautoBuffering%3Atrue%2CautoPlay%3Afalse%2CinitialScale%3A%27fit%27%2CmenuItems%3A%5Bfalse%2Cfalse%2Cfalse%2Cfalse%2Ctrue%2Ctrue%2Cfalse%5D%2CusePlayOverlay%3Afalse%2CshowPlayListButtons%3Atrue%2CplayList%3A%5B%7Burl%3A%27simple%5Fis%5Fhard%2FDrupalcon%5F2008%5FSzeged%5Faug%5F27%5F3%5FAcquia%5F512kb%2Emp4%27%7D%5D%2CcontrolBarGloss%3A%27high%27%2CshowVolumeSlider%3Atrue%2CbaseURL%3A%27http%3A%2F%2Fwww%2Earchive%2Eorg%2Fdownload%2F%27%2Cloop%3Afalse%2CcontrolBarBackgroundColor%3A%270x000000%27%7D" width="500" height="450" scale="noscale" bgcolor="111111" type="application/x-shockwave-flash" allowFullScreen="true" allowScriptAccess="always" allowNetworking="all" pluginspage="http://www.macromedia.com/go/getflashplayer"></embed><br />
<br />
<a href="http://www.archive.org/details/simple_is_hard" class="liexternal">Internet Archive: Details: Drupalcon 2008 Szeged: Simple is hard</a></p>
<p>A must see vsakega developerja.</p>
<p> Happy blogging(coding)! </p>
<ol class="footnotes"><li id="footnote_0_84" class="footnote">največ pa živcem nadrejenih</li><li id="footnote_1_84" class="footnote">odprto kodna platforma za mikrobloging</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.internet-solutions.si/2008/09/16/enostavno-je-tezje/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>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>PHP tanač: pretvorba obvestil in opozoril v izjeme</title>
		<link>http://www.internet-solutions.si/2007/10/10/php-tanac-pretvorba-obvestil-in-opozoril-v-izjeme/</link>
		<comments>http://www.internet-solutions.si/2007/10/10/php-tanac-pretvorba-obvestil-in-opozoril-v-izjeme/#comments</comments>
		<pubDate>Wed, 10 Oct 2007 20:00:05 +0000</pubDate>
		<dc:creator>alesl</dc:creator>
				<category><![CDATA[Code snippets]]></category>
		<category><![CDATA[Tanači]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php exceptions]]></category>
		<category><![CDATA[php warnings]]></category>

		<guid isPermaLink="false">http://www.internet-solutions.si/2007/10/10/php-tanac-pretvorba-obvestil-in-opozoril-v-izjeme/</guid>
		<description><![CDATA[Obvestila, opozorila !?
Prav čudno zveni ta naslov v prevodu ;) Bom kar po domače povedal: pretvorba PHP &#8220;notices&#8221; in &#8220;warnings&#8221; v &#8220;Exceptions&#8221;. Najverjetneje je sedaj slika malce bolj jasna. Po planu nisem imel namena objavit tega prispevka, ker pa ravno delam &#8220;skeleton&#8221; za eno aplikacijo sem izkoristil priložnost. Namig o konvertiranju opozoril in obvestil sem [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Obvestila, opozorila !?</strong><br />
Prav čudno zveni ta naslov v prevodu ;) Bom kar po domače povedal: pretvorba PHP &#8220;notices&#8221; in &#8220;warnings&#8221; v &#8220;Exceptions&#8221;. Najverjetneje je sedaj slika malce bolj jasna. Po planu nisem imel namena objavit tega prispevka, ker pa ravno delam &#8220;skeleton&#8221; za eno aplikacijo sem izkoristil priložnost. Namig o konvertiranju opozoril in obvestil sem zasledil na <a href="http://www.alexatnet.com/node/23" class="liexternal">netu</a> že kar nekaj časa nazaj. Pred dnevi  sem med arhiviranje starih mailov naletel na &#8220;reminder&#8221; in sem na brzino pokukal na omenjeni post. Dobil sem idejo, da lahko zadevo uporabim s svojo <a href="http://en.wikipedia.org/wiki/Debug" rel="nofollow" class="liwikipedia">&#8220;debug&#8221;</a> funkcijo za &#8220;handlanje&#8221; <a href="http://www.php.net/manual/en/language.exceptions.php" class="liexternal">izjem &#8211; Exceptions</a>.<br />
<span id="more-4"></span><br />
Prednastavljen error reporting v PHP 4 in PHP 5 je E_ALL &amp; ~E_NOTICE, kar pomeni da ta nastavitev med izvajanjem ne prikazuje obvestil. Pametno je, da prikazovanje obvestil pri razvoju aplikacij vključimo.<br />
PHP 5 prinaša nov error level E_STRICT. Ker E_STRICT ni vključen v E_ALL error level, ga moremo vključiti eksplicitno. Vključitev E_STRICT levela pri razvoju prinaša nekaj koristi. PHP bo izpisoval run-time obvestila in sugestiral na potrebne popravke v kodi.  Z upoštevanjem obvestil si predvsem zagotovimo kompatibilnost kode za prihajajoče verzije PHP-ja.<br />
V PHP 5 programiram že kar nekaj časa. Držim se &#8220;strict coding standarda&#8221;, ki ga predpisuje <a href="http://framework.zend.com/manual/en/coding-standard.html" class="liexternal">Zend Framework</a><sup>[1]</sup>.  Tako pri vseh aplikacijah nastavim error reporting level na E_ALL|E_STRICT.</p>
<pre class="brush: php;">
error_reporting(E_ALL|E_STRICT);
</pre>
<p></p>
<pre class="brush: php;">
echo $x;
</pre>
<p>S tem error reporting levelom vsaka nedefinirana spremenljivka<sup>[2]</sup> sproži obvestilo<sup>[3]</sup><br />
<a href="http://www.internet-solutions.si/wp-content/uploads/2007/10/notice.png" rel="lightbox" title='PHP Notice - obvestilo'><img src='http://www.internet-solutions.si/wp-content/uploads/2007/10/notice.thumbnail.png' alt='PHP Notice - obvestilo' /></a></p>
<pre class="brush: php;">
/**
 * Foo Bar application
 *
 * @category	Foo
 * @package    	Foo_Static
 * @copyright  	Copyright (c) 2007 Ales Loncar
 * @license 	GNU Public License
 * @link    http://www.internet-solutions.si
 */
class Foo
{
    /**
     *  Bar method
     */
    public function Bar()
    {
        // static method - not properly defined
    }
}

$fooBar = Foo::Bar();
</pre>
<p>Neupoštevanje standardov prav tako<sup>[4]</sup><br />
<a href="http://www.internet-solutions.si/wp-content/uploads/2007/10/strict_standards.png" rel="lightbox" title='PHP Strict Standards'><img src='http://www.internet-solutions.si/wp-content/uploads/2007/10/strict_standards.thumbnail.png' alt='PHP Strict Standards' /></a></p>
<p><strong>try/catch</strong><br />
PHP 5 uporablja podoben model izjem &#8211; &#8220;Exceptions&#8221; kot ostali programski jeziki. Da ne bom preveč modruval, vse je lepo opisano v PHP &#8220;<a href="http://www.php.net/manual/en/" class="liexternal">manualu</a>&#8220;. Omeniti velja le, da ko se zgodi izjema &#8211; &#8220;exception is thrown&#8221;, se koda ki sledi ne izvede, PHP bo poiskusil najti prvi ustrezen block &#8220;catch&#8221;. V primeru da izjema ni ujeta &#8211; &#8220;catch&#8221;, PHP izvede Fatal Error z sporočilom &#8220;Uncaught Exception &#8230;&#8221;<sup>[5]</sup><br />
Veselo na delo, glavna ideja je taka:</p>
<ul>
<li>definiramo error handling funkcijo, ki vrže izjemo – exception z ustreznim sporočilom in kodo<sup>[6]</sup></li>
<li>definiramo exception handling funkcijo s katero lovimo &#8211; &#8220;catch&#8221; izjeme, tudi tiste, ki niso v bloku try/catch</li>
<li>stestiramo error/exception handler na nekaj primerih</li>
</ul>
<p><strong>set_error_handler</strong><br />
Nastavimo lastno funkcijo za rokovanje z napakami v skripti.</p>
<pre class="brush: php;">
/**
 * Global Error Handler
 *
 * Global error handler class
 *
 * @author		Ales Loncar
 * @license 	GNU Public License
 * @category	App
 * @package    	App_Error
 * @copyright 	Copyright (c) 2007 Ales Loncar
 */
class General_Error_Handler
{
/**
 * Global error handler.
 *
 * This should not be called by anything - only for uncaught errors.
 *
 *
 */
	public function globalErrorHandler($errno, $errstr, $errfile, $errline)
	{
		throw new Exception($errstr, $errno);
	}
}

/** set ErrorHannlder */
set_error_handler(array(new General_Error_Handler(), 'globalErrorHandler'));
</pre>
<p><strong>set_exception_handler</strong><br />
Nastavimo privzeto funkcijo za rokovanje z izjemami. S tem ujamemo izjeme katere nismo ujeli v blok try/catch. Izvajanje se ustavi takoj ko se izvede exception_handler.</p>
<pre class="brush: php;">
/**
 * Global Exception Handler
 *
 * Global exception handler class
 *
 * @author		Ales Loncar
 * @license 	GNU Public License
 * @category	App
 * @package    	App_Error
 * @copyright 	Copyright (c) 2007 Ales Loncar
 */
class General_Exception_Handler
 {
 	/**
	 * Global exception handler.
	 *
	 * This should not be called by anything - only for uncaught exceptions.
	 *
	 */
	public function globalExceptionHandler(Exception $exception)
	{
		$this-&gt;_throwException($exception);
	}

	/**
	 * Nice debugging info for Exception
	 *
	 * @param Exception $e
	 */
	private function _throwException($e)
   	{
		$o = create_function('$in','echo htmlspecialchars($in);');
                // celotno funkcijo najdete v zipu
               // totalno sjebe parser saj so v njej php tagi
        }
}

/** set Exception Handler */
set_exception_handler(array(new General_Exception_Handler(), 'globalExceptionHandler'));
</pre>
<p>Sedaj ko imamo oba handlerja, se bomo malce poigrali.<br />
Primer uporabe izjeme v bloku try/catch</p>
<pre class="brush: php;">
/** error reporting */
error_reporting(E_ALL|E_STRICT);

/** debug is true for development */
define('DEBUG', true);

/** let's try some of this stuff */
try {
    $x = 0;
    if (empty($x)) {
        throw new Exception('x is zero', 0);
    }
} catch(Exception $e) {
    if (DEBUG) {
        throw $e;
    } else {
        if ($e-&gt;getCode() == 0) {
            // notify about exception
			$errorCode	  = $e-&gt;getCode();
                        $errorMessage 	= $e-&gt;getMessage();
			// send mail or write log
			// ...
			echo &quot;&lt;b&gt;errorCode:&lt;/b&gt; $errorCode&lt;br /&gt;&quot;;
			echo &quot;&lt;b&gt;errorMessage:&lt;/b&gt; $errorMessage&lt;br /&gt;&quot;;
			echo &quot;&lt;br /&gt;&quot;;
        }
    }
}

// continue Execution
echo '&lt;b&gt;continue:&lt;/b&gt; Foo bar';

//$x = $y;
</pre>
<p>Mali komentarček:<br />
Celotna koda je v bloku &#8220;try/catch&#8221;. Če ne bi definirali exception handlerja in ima konstanta DEBUG vrednost true<sup>[7]</sup> bo PHP navrgel <a href="http://www.internet-solutions.si/wp-content/uploads/2007/10/exception_thrown.png" rel="lightbox" title='Fatal error: Uncaught exception ‘Exception’ with message ‘x is zero’' class="liexternal">Fatal Error</a><br />
Z vključenim exception handlerjem se izvede metoda _throwException() z zelo uporabnim &#8220;Stacktracom&#8221;, celotnim naborom &#8220;Request&#8221; metod  in &#8220;Response&#8221; headerjem. <strong>Izvajanje skripte se prekine</strong>.<br />
<a href="http://www.internet-solutions.si/wp-content/uploads/2007/10/exception_development.png" rel="lightbox" title='Exception making GET request to /test/'><img src='http://www.internet-solutions.si/wp-content/uploads/2007/10/exception_development.thumbnail.png' alt='Exception making GET request to /test/' /></a><br />
Npr. da aplikacijo objavimo in nastavimo DEBUG vrednost na false<sup>[8]</sup>. Sedaj v primeru izjeme le te ne vržemo &#8211; &#8220;thrown&#8221;, ampak pogledamo do kakšne napake je prišlo ter obvestimo skrbnika aplikacije oziroma zapišemo vsebino izjeme v log.<sup>[9]</sup>. <strong>Skripta se izvaja normalno naprej.</strong><br />
<a href="http://www.internet-solutions.si/wp-content/uploads/2007/10/exception_production.png" rel="lightbox" title='Konstanta DEBUG je nastavljena na true. Skripta se izvede normalno.'><img src='http://www.internet-solutions.si/wp-content/uploads/2007/10/exception_production.png' alt='Konstanta DEBUG je nastavljena na true. Skripta se izvede normalno.' /></a><br />
Če podamo še primer error handlerja, ki pretvori obvestila in opozorila v izjeme. Izven bloka &#8220;try/catch&#8221; naredimo eno amatersko:</p>
<pre class="brush: php;">
$x = $y;
</pre>
<p>Ker imamo definiran exception handler se bo koda ustavila na mestu, kjer PHP izpiše obvestilo o nedefinirani spremenljivki.<br />
<a href="http://www.internet-solutions.si/wp-content/uploads/2007/10/exception_caught_outside.png" rel="lightbox" title='Exception making … 8 Undefined variable: y'><img src='http://www.internet-solutions.si/wp-content/uploads/2007/10/exception_caught_outside.thumbnail.png' alt='Exception making … 8 Undefined variable: y' /></a><br />
Poglejmo še samo, kaj se zgodi takrat če ne bi imeli definiran error handler. Skripta se izvede naprej, PHP pa izpiše obvestilo &#8220;Notice: Undefined variable: y in &#8230;&#8221; saj imamo nastavljen error_reporting na E_ALL|E_STRICT.<br />
<a href="http://www.internet-solutions.si/wp-content/uploads/2007/10/notice_variable.png" rel="lightbox" title='Notice: Undefined variable: y in …'><img src='http://www.internet-solutions.si/wp-content/uploads/2007/10/notice_variable.png' alt='Notice: Undefined variable: y in …' /></a></p>
<p>Vse skupaj sem zapakiral in lahko po mili volji &#8220;dol vlačite&#8221;: <a href="http://www.internet-solutions.si/wp-content/uploads/2007/10/error_exception_test.zip" title='Error &amp; Exception Handler' class="lizip">Error &amp; Exception Handler</a></p>
<p>Happy blogging(coding)!</p>
<ol class="footnotes"><li id="footnote_0_4" class="footnote">o samem frameworku in kupu uporabnih knjižic enkrat v prihodnosti</li><li id="footnote_1_4" class="footnote">kot primer</li><li id="footnote_2_4" class="footnote">Za ta čuden izpis je kriv <a href="http://www.xdebug.org/" class="liexternal">Xdebug</a> &#8211; PHP extension for debugging and profiling. Otom potom :)</li><li id="footnote_3_4" class="footnote">kot primer</li><li id="footnote_4_4" class="footnote">le v primeru da nimamo definiranega &#8220;custom handlerja&#8221; s funkcijo set_exception_handler()</li><li id="footnote_5_4" class="footnote">tukaj dejansko pretvorimo obvestila in opozorila v izjeme</li><li id="footnote_6_4" class="footnote">development</li><li id="footnote_7_4" class="footnote">production</li><li id="footnote_8_4" class="footnote">z karseda večimi informacijami &#8211; stacktrace &#8230;</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.internet-solutions.si/2007/10/10/php-tanac-pretvorba-obvestil-in-opozoril-v-izjeme/feed/</wfw:commentRss>
		<slash:comments>0</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>
