<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>echo 'blog.coderportfolio.com';</title>
	
	<link>http://blog.coderportfolio.com</link>
	<description>Web izstrāde, programmēšana un vēl šis tas</description>
	<lastBuildDate>Thu, 05 Nov 2009 11:36:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/coderportfolio" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="coderportfolio" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Twitter API aplikācija ar cache funkcionalitāti</title>
		<link>http://blog.coderportfolio.com/2009/11/04/twitter-api-aplikacija-ar-cache-funkcionalitati/</link>
		<comments>http://blog.coderportfolio.com/2009/11/04/twitter-api-aplikacija-ar-cache-funkcionalitati/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 13:33:50 +0000</pubDate>
		<dc:creator>Madars Langenfelds</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Web izstrāde]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.coderportfolio.com/?p=102</guid>
		<description><![CDATA[Izveidoju nelielu pamācību, kā ar Twitter API palīdzību savākt datus no sava twitter konta. Twitter API piedāvā dažādus veidus kādā formātā iegūt datus, tai skaitā xml, json, atom un rss. Es šoreiz izmantošu json, php un curl lai nolasītu un attēlotu tvītus no lietotājiem, kuriem es sekoju un attēlotu tos lietotājam saprotamā formātā.
Kādam varbūt radīsies [...]]]></description>
			<content:encoded><![CDATA[<p>Izveidoju nelielu pamācību, kā ar Twitter API palīdzību savākt datus no sava twitter konta. Twitter API piedāvā dažādus veidus kādā formātā iegūt datus, tai skaitā xml, json, atom un rss. Es šoreiz izmantošu json, php un curl lai nolasītu un attēlotu tvītus no lietotājiem, kuriem es sekoju un attēlotu tos lietotājam saprotamā formātā.</p>
<p>Kādam varbūt radīsies jautājums kāpēc ir nepieciešams <em>kešot </em>tvītus? Atbilde ir pavisam vienkārša: Twitter no viena lietotāja konta ļauj veikt ne vairāk kā 150 pieprasījumus stundā! Ja šis limits tiek pārsniegts, tad vairs nav iespējams neko nolasīt. Un ja lapā būs 300 refreshi stundā, tad pusi no laika, aplikācija vienkārši nestrādās.</p>
<pre class="brush:[php]"> &lt;?php
 function saveCache($data){
    $cache = "coderportfolio.json";
    $fp = @fopen($cache,"w");
 if(!$fp){
    return false;
 }
  fwrite($fp,$data);
  fclose($fp);
 }
 function readCache(){
    $cache = "coderportfolio.json";
 if(!file_exists($cache)){
    return false;
 }
  $fp = @fopen($cache,"r");
  $buffer = "";
 if(!$fp) {
    return false;
 }else {
    while(!feof($fp)) {
       $buffer .= fgets($fp,4096);
    }
 }
  fclose($fp);
  return $buffer;
 }
 function LastModified(){
    $cache = "coderportfolio.json";
    return @filemtime($cache);
 }

 $login = "lietotājvārds:parole";

 $tweeters = array();
 $tweeter = array();

 $prev = LastModified();
 $now = time();

 if(!$prev || (( $now - $prev ) &gt; 60)){
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, "http://twitter.com/statuses/friends_timeline.json?count=10");
 curl_setopt($ch, CURLOPT_USERPWD, $login);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 $tweeters = curl_exec($ch);
 saveCache($tweeters);
 $tweeters = json_decode($tweeters, true);
 }else{
 $tweeters = json_decode(readCache(), true);
 }

 if(is_array($tweeters)) foreach($tweeters as $tweets){
 $tweets['text'] = preg_replace("#(^|[\n ])@([^ \"\t\n\r&lt;]*)#ise", "'\\1&lt;a href=\"http://www.twitter.com/\\2\" &gt;@\\2&lt;/a&gt;'", $tweets['text']);
 $tweets['text'] = preg_replace("#(^|[\n ])([\w]+?://[\w]+[^ \"\n\r\t&lt;]*)#ise", "'\\1&lt;a href=\"\\2\" &gt;\\2&lt;/a&gt;'", $tweets['text']);
 $tweets['text'] = preg_replace("#(^|[\n ])((www|ftp)\.[^ \"\t\n\r&lt;]*)#ise", "'\\1&lt;a href=\"http://\\2\" &gt;\\2&lt;/a&gt;'", $tweets['text']);
 ?&gt;&lt;div &gt;&lt;?
 echo '&lt;img src="'.$tweets["user"]["profile_image_url"].'" /&gt;&lt;h3&gt;'.$tweets['user']['name'].'&lt;/h3&gt;';
 echo '&lt;p&gt;'.$tweets['text'].'&lt;/p&gt;';
 echo '&lt;p&gt;From: '.$tweets['source'].'&lt;/p&gt;';
 ?&gt;&lt;/div&gt;&lt;?
 }
?&gt;</pre>
<p>Pirmais, kas jāizdara pieslēdzoties Twitter API ir jānosūta logins un parole kontam no kura ir nepieciešams iegūt datus. Nākamais solis ir norādīt kādus datus vēlies saņemt. Šajā gadījumā es izvēlējos http://twitter.com/statuses/friends_timeline.json. Bet kā jau minēju datus ir iespējams iegūt dažādos formātos, tos norādot .json vietā, piemēram, .xml!</p>
<p>Tālāk ar curl autentificējoties jau tiek iegūti dati un vienkārši apstrādāti ar php. saveCache(), readCache() un LastModified() atbild par kešosanas funkcionalitāti. 41. rindā tiek pārbaudīts vai kešotā versija jau nav vecāka par vienu minūti, ja ir tad tiek vilkta svaiga informācija no twittera.</p>
<p>Kā tas darbojas dzīvē ir iespējams apskatīt labajā pusē.</p>
<p>Ar pilnu Twitter API dokumentāciju var iepazīties <a href="http://apiwiki.twitter.com/Twitter-API-Documentation" target="_blank">šeit</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.coderportfolio.com/2009/11/04/twitter-api-aplikacija-ar-cache-funkcionalitati/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kāpēc  vienmēr unserialize() funkcija atgriež bool(false)?</title>
		<link>http://blog.coderportfolio.com/2009/10/17/kapec-vienmer-unserialize-funkcija-atgriez-boolfalse/</link>
		<comments>http://blog.coderportfolio.com/2009/10/17/kapec-vienmer-unserialize-funkcija-atgriez-boolfalse/#comments</comments>
		<pubDate>Sat, 17 Oct 2009 17:29:32 +0000</pubDate>
		<dc:creator>Madars Langenfelds</dc:creator>
				<category><![CDATA[Web izstrāde]]></category>
		<category><![CDATA[base64_decode]]></category>
		<category><![CDATA[base64_encode]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[serialize]]></category>
		<category><![CDATA[stripslashes]]></category>
		<category><![CDATA[unserialize]]></category>

		<guid isPermaLink="false">http://blog.coderportfolio.com/?p=98</guid>
		<description><![CDATA[Nesen strādājot pie jauna projekta saskāros ar problēmu, ka unserialize() man visu laiku atgriež false.  Sākumā nesapratu, kas par problēmu, līdz pamanīju php.net komentāros, ka to var novērst datus palaižot caur base64_encode.
&#60;?php
 $safe_string_to_store = base64_encode(serialize($multidimensional_array)); 

 $array_restored_from_db = unserialize(base64_decode($encoded_serialized_string));
 ?&#62;
Protams šis nebūs labākais risinājums, kā cīnīties ar šo problēmu, jo base64_encode() datu apjomu palielina par [...]]]></description>
			<content:encoded><![CDATA[<p>Nesen strādājot pie jauna projekta saskāros ar problēmu, ka unserialize() man visu laiku atgriež false.  Sākumā nesapratu, kas par problēmu, līdz pamanīju php.net komentāros, ka to var novērst datus palaižot caur base64_encode.</p>
<pre class="brush:[php]">&lt;?php
 $safe_string_to_store = base64_encode(serialize($multidimensional_array)); 

 $array_restored_from_db = unserialize(base64_decode($encoded_serialized_string));
 ?&gt;</pre>
<p>Protams šis nebūs labākais risinājums, kā cīnīties ar šo problēmu, jo base64_encode() datu apjomu palielina par apmēram 33% no sakotnējā datu garuma, bet iemesls tam ir pavisam vienkāršs: serialize() nepatīk slīpsvītras.</p>
<p>To var apiet arī pirms  serializēšanas palaižot datus caur stripslashes() funkciju, kas izravētu slīpsvītras.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.coderportfolio.com/2009/10/17/kapec-vienmer-unserialize-funkcija-atgriez-boolfalse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kā ar PHP pārbaudīt vai eksistē domēns?</title>
		<link>http://blog.coderportfolio.com/2009/09/07/ka-ar-php-parbaudit-vai-eksiste-domens/</link>
		<comments>http://blog.coderportfolio.com/2009/09/07/ka-ar-php-parbaudit-vai-eksiste-domens/#comments</comments>
		<pubDate>Mon, 07 Sep 2009 16:37:09 +0000</pubDate>
		<dc:creator>Madars Langenfelds</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web izstrāde]]></category>
		<category><![CDATA[checkdnsrr]]></category>
		<category><![CDATA[dns]]></category>

		<guid isPermaLink="false">http://blog.coderportfolio.com/?p=90</guid>
		<description><![CDATA[checkdnsrr() funkcija pārbauda vai padotais parametrs eksistē DNS ierakstos.
Piemērs:
&#60;?php
$recordexists = checkdnsrr("coderportfolio.com", "ANY");
if ($recordexists) echo "Domēna vārds jau ir aizņemts!";
else echo "Domēna vārds ir brīvs!";
?&#62;
Atgriezīs: Domēna vārds jau ir aizņemts!
Ja ieraksts eksistēs checkdnsrr() atgriezīs TRUE, pretējā gadījumā FALSE.
checkdnsrr() var izmantot arī lai pārbaudītu vai ievadītās e-pasta adreses domēns eksistē, tādā veidā atsijājot asdfghj@gnlreiu.lv tipa adreses...
&#60;?php
$email = [...]]]></description>
			<content:encoded><![CDATA[<p>checkdnsrr() funkcija pārbauda vai padotais parametrs eksistē DNS ierakstos.</p>
<p>Piemērs:</p>
<pre class="brush:[php]">&lt;?php
$recordexists = checkdnsrr("coderportfolio.com", "ANY");
if ($recordexists) echo "Domēna vārds jau ir aizņemts!";
else echo "Domēna vārds ir brīvs!";
?&gt;</pre>
<p><em>Atgriezīs: Domēna vārds jau ir aizņemts!</em></p>
<p>Ja ieraksts eksistēs checkdnsrr() atgriezīs TRUE, pretējā gadījumā FALSE.</p>
<p>checkdnsrr() var izmantot arī lai pārbaudītu vai ievadītās e-pasta adreses domēns eksistē, tādā veidā atsijājot asdfghj@gnlreiu.lv tipa adreses...</p>
<pre class="brush:[php]">&lt;?php
$email = "example@coderportfolio.com";
$domain = explode("@",$email);

$valid = checkdnsrr($domain[1], "ANY");

if($valid) echo "E-pasta adreses domēns eksistē";
else echo "$domain[1] neeksistē!";
?&gt;</pre>
<p>Bet jāpiezīmē, ka šādā veidā nevar pārbaudīt vai eksistē pati e-pasta adrese.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.coderportfolio.com/2009/09/07/ka-ar-php-parbaudit-vai-eksiste-domens/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cache! 1. daļa</title>
		<link>http://blog.coderportfolio.com/2009/09/06/cache-1-dala/</link>
		<comments>http://blog.coderportfolio.com/2009/09/06/cache-1-dala/#comments</comments>
		<pubDate>Sun, 06 Sep 2009 16:27:57 +0000</pubDate>
		<dc:creator>Madars Langenfelds</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web izstrāde]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[html meta tags]]></category>
		<category><![CDATA[http headers]]></category>

		<guid isPermaLink="false">http://blog.coderportfolio.com/?p=80</guid>
		<description><![CDATA[Labu laiku atpakaļ mājas lapas sastāvēja no pāris html failiem. Cache nebija lieta par kuru vajadzēja uztraukties, jo lapas apmeklētājam lapa ielādējās gandrīz uzreiz un automātiski tika nolādēta lapas versija, kas tika saglabāta datorā, lai nakamajā reizē apmeklējot lapu netiktu lādēta visa lapa vēlreiz, bet būtu tikai jāpārbauda vai lapā nav veiktas izmaiņas.
Mūsdienās situācija ir [...]]]></description>
			<content:encoded><![CDATA[<p>Labu laiku atpakaļ mājas lapas sastāvēja no pāris html failiem. Cache nebija lieta par kuru vajadzēja uztraukties, jo lapas apmeklētājam lapa ielādējās gandrīz uzreiz un automātiski tika nolādēta lapas versija, kas tika saglabāta datorā, lai nakamajā reizē apmeklējot lapu netiktu lādēta visa lapa vēlreiz, bet būtu tikai jāpārbauda vai lapā nav veiktas izmaiņas.</p>
<p>Mūsdienās situācija ir strauji mainījusies! Parādījās programmēšanas valodas ar kurām tika veidotas dinamiska satura lapas, līdz  ar to palielinājās arī ielādes laiks. Kad dinamiskai lapai notiek pieprasījums no servera puses, ir nepieciešams izpildīt vairākas lietas, piemēram, PHP skripta izpilde. Tas prasa zināmu laiku tāpēc rodas aizture pirms web serveris var piegādāt rezultātu pārlūkprogrammai. Vienkārša skripta izpilde neprasīs daudz laika, bet komplicētāka aplikācija PHP dzinējam var sagādāt daudz darba.</p>
<p>Vēl ir tāda lieta, ka tipiski web serveri, tādi kā Apache izmanto faila modifikācijas laiku, lai informētu pārlūkprogrammu par pieprasījās lapas vecumu, ļaujot pārlūkprogrammai izvēlēties piemērotu cache variantu. Dinamiskām lapām pats php skripts tiek mainīts reti, jo pārsvarā saturs tiek ielasīts no datubāzes! Web serverim nav iespējams noteikt kāds ir pēdējais lapas ieraksta datums un tāpēc tas neizsūta pēdējo modificēšanas datumu.. Līdz ar to pārlūkprogrammai nav pieejama informācija cik ilgi saglabāt lapas <em>kešoto </em>versiju un tas izraisa problēmu, ka pie lapas apmeklētāja nonāk veca informācija. Lai izvairītos no šīs problēmas, lielākā daļa koderu izmanto meta tagus vai HTTP header'us, lai norādītu pārlūkprogrammai, lai tā nekad neizmanto <em>kešoto </em>lapas versiju.</p>
<h2>Kā panākt lai netiktu <em>kešotas </em>lapas?</h2>
<p>Ir divi veidi kā panākt, lai pārlūkprogramma <em>nekešotu </em>lapas. Izmantojot HTML meta tagus un HTTP headerus.</p>
<ul>
<li>HTML meta tagu izmantošana</li>
</ul>
<pre class="brush:[html]">&lt;meta http-equiv="expires" content="Mon, 20 Jul 2000 02:00:00 GMT" /&gt;
&lt;meta http-equiv="pragma" content="no-cache" /&gt;</pre>
<p>Ievietojot iekš expires meta taga jau pagājušu datumu, norāda pārlūkprogrammai, ka <em>kešotā </em>lapas versija jau ir veca.<br />
Kaut gan Pragme: no-cache meta tags negarantē, ka netiks <em>kešota </em>lapa, tas tomēr tiek atbalstīts lielākajā daļā pārlūkprogrammu.</p>
<ul>
<li>HTTP headeru lietošana</li>
</ul>
<p>HTML tagu vietā var tikt izmantota PHP headeru funkcija.</p>
<pre class="brush:[html]">&lt;?php

header('Expires: Mon, 20 Jul 2000 02:00:00 GMT');
header('Pragme: no-cache');

?&gt;</pre>
<p>Varam iet vienu soli tālāk un izmantot Cache-Control headeri, kas tiek atbalstīts jau no HTTP 1.1 versijas</p>
<pre class="brush:[html]">&lt;?php

header('Expires: Mon, 20 Jul 2000 02:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', FALSE);
header('Pragme: no-cache');

?&gt;</pre>
<h2>Secinājumi</h2>
<p>Izmantot Expires meta tagu varbūt izklausās vienkārši un viegli lietojami, bet ar to ir zināmas problēmas.. Pārlūkprogrammai no sākuma ir jāielādē lapa, lai nolasītu meta tagus un ja šis meta tags nebija iekļauts html'ā, brīdī, kad lietotājs pirmo reizi atvēra lapu, tad pārlūkprogramma gluži vienkārši izmantos <em>kešoto </em>versiju!<br />
Tāpēc mans ieteikums ir izmantot HTTP headerus, jo tas garantē, ka pie lietotāja nekad nenonāks veca informācija.</p>
<p>Bet šāda veida pieeja, kad lapa vispār netiek <em>kešota </em>nav tā labākā, jo ja lapā nav veiktas izmaiņas tik un tā lietotājam tiek lādēta visa lapa no jauna un tas nav tas labākais variants.. Bet par to kā izvairīties no šīs problēmas stāstīšu citreiz.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.coderportfolio.com/2009/09/06/cache-1-dala/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Apollo.lv jauna seja!</title>
		<link>http://blog.coderportfolio.com/2009/08/20/apollo-lv-jauna-seja/</link>
		<comments>http://blog.coderportfolio.com/2009/08/20/apollo-lv-jauna-seja/#comments</comments>
		<pubDate>Thu, 20 Aug 2009 14:10:29 +0000</pubDate>
		<dc:creator>Madars Langenfelds</dc:creator>
				<category><![CDATA[Web izstrāde]]></category>
		<category><![CDATA[apollo.lv]]></category>

		<guid isPermaLink="false">http://blog.coderportfolio.com/?p=63</guid>
		<description><![CDATA[Apollo ir palaidusi testa versiju, testēšanai un viedokļu izpaušanai. Apollo ir viens no diviem ziņu portālie kuru es apmeklēju ikdienā. Zinu par pārmaiņām pameta Coolynx, kas izrādās ir apollo attīstības nodaļas vadītājs.
Tagad par pašām pārmaiņām.
Pirmais kas iekrita acīs bija nenormālais lapas garums. Apskatoties kaut vai CNN lapu nebūs grūti pamanīt, ka viņiem pirmajā lapā koncentrējas [...]]]></description>
			<content:encoded><![CDATA[<p>Apollo ir palaidusi <a href="http://www.apollo.lv/beta/" target="_blank">testa versiju</a>, testēšanai un viedokļu izpaušanai. Apollo ir viens no diviem ziņu portālie kuru es apmeklēju ikdienā. Zinu par pārmaiņām pameta <a href="http://pods.lv/2009/08/20/testejamies/" target="_blank">Coolynx</a>, kas izrādās ir apollo attīstības nodaļas vadītājs.</p>
<p>Tagad par pašām pārmaiņām.</p>
<p>Pirmais kas iekrita acīs bija nenormālais lapas garums. Apskatoties kaut vai <a href="http://edition.cnn.com/">CNN</a> lapu nebūs grūti pamanīt, ka viņiem pirmajā lapā koncentrējas svarīgākais, bet apollo šoreiz manuprāt ir aizšāvuši garām. Iespējams, ka iemesls ir vēlme informēt pēc iespējas lielāku mērķa auditoriju jau ienākot pirmajā lapā. Bet es tiešām apšaubu, ka kāds izvēlētos skrulēt lapu uz 3 metrus attālo apakšējo daļu lai izlasītu ievadtekstus 3 rakstiem par tēmu "IT&amp;T. Zinātne", nevis nospiestu lapas augšējā daļā uz attiecīgas kategorijas kur varētu atrast simtiem rakstu par attiecīgo tēmu.</p>
<p>Otrais kas iekrita acīs bija informācijas dublēšanās. Es nesaprotu kādēļ ir nepieciešams divās un vairāk vietās norādīt uz horoskopiem, vārdadienu svinētājiem un laika ziņām? Manuprāt arī šāda liekas informācijas izņemšana palīdzētu lapas saspiešanai.</p>
<p>Ok ejam tālāk.. Bildes.. Manuprāt tur to ir stipri par daudz. Vai tiešām pie katra raksta vajag ievietot mazu bildīti? Tas manuprāt ir lieki un jau atkal aizņem nevajadzīgu vietu + palielina lapas ielādes laiku. Atgriežoties pie CNN lapas, manuprāt viņiem ir lielisks risinājums jaunāko ziņu sadalīšanai pa kategorijām.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-70" title="cnn ziņu bloks" src="http://blog.coderportfolio.com/wp-content/uploads/2009/08/cnn_bloks.jpg" alt="cnn ziņu bloks" width="444" height="368" /></p>
<p>Nav nekādu milzīgu bilžu, ir tikai svarīgākie jaunumi. Šādi izkārtot ziņas nav nekāds jaunums, tikai nav skaidrs kāpēc apollo neņem, piemēru, no ārzemju kolēģiem.</p>
<p>Variants ko es ieteiktu apollo.lv ir dot lasītājam iespēju pašam sakārtot portāla sākumlapu pēc saviem ieskatiem. Atslēgt un ieslēgt konkrētus blokus. Nav pat svarīgi ļaut kārtot un mainīt bloku atrašanās vietas.. Galvenais ļaut atslēgt informācijas blokus kas lasītājam ir vienaldzīgi, tādā veidā padarot lapu personiskāku. Jāpiebilst gan, ka Latvijā šādu praksi neesmu novērojis.</p>
<p>Tikko pamanīju, ka neesmu pateicis nevienu atzīnīgu vārdu :). Katrā gadījumā žetons apollo par vēlmi kaut ko mainīt un kā vēsta veca paruna - pastāvēs kas pārvērtīsies.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.coderportfolio.com/2009/08/20/apollo-lv-jauna-seja/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP ietvari (Frameworks)! Kāpēc? Kad?</title>
		<link>http://blog.coderportfolio.com/2009/08/17/php-ietvari-frameworks-kapec-kad/</link>
		<comments>http://blog.coderportfolio.com/2009/08/17/php-ietvari-frameworks-kapec-kad/#comments</comments>
		<pubDate>Mon, 17 Aug 2009 14:50:12 +0000</pubDate>
		<dc:creator>Madars Langenfelds</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web izstrāde]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[ez components]]></category>
		<category><![CDATA[frameworks]]></category>
		<category><![CDATA[ietvars]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://blog.coderportfolio.com/?p=37</guid>
		<description><![CDATA[Šī ieraksta sakarā palūgšu ievērot to, ka katra brīva izvēle ir izvēlēties vai neizvēlēties izmantot ietvaru un ja izmantot tad kādu. Bet tagad ķeramies pie lietas..
Galvenā piekšrocība ietvaros manuprāt slēpjas tajā, ka tā  palīdz samazināt web aplikāciju izstrādes laiku, sniedzot pamata struktūru uz kuras balstīt savu aplikāciju, kā arī MVC (Model View Controller).
Kā jau [...]]]></description>
			<content:encoded><![CDATA[<p>Šī ieraksta sakarā palūgšu ievērot to, ka katra brīva izvēle ir izvēlēties vai neizvēlēties izmantot ietvaru un ja izmantot tad kādu. Bet tagad ķeramies pie lietas..</p>
<p>Galvenā piekšrocība ietvaros manuprāt slēpjas tajā, ka tā  palīdz samazināt web aplikāciju izstrādes laiku, sniedzot pamata struktūru uz kuras balstīt savu aplikāciju, kā arī MVC (<strong>Model View Controller</strong>).</p>
<p>Kā jau varētu noprast ietvari satur ļoti daudz visādu noderīgu bibliotēku. Piemēram, ja tev ir nepieciešamība novalidēt formas datus tev vairs nebūs kā ierasts jāraksta visas validācijas no nulles, pietiks ar pāris rindiņām, kas ielādēs bibliotēku un novalidēs datus.</p>
<p>MVC priekšrocība ir tāda, ka tiek izolēta lietotāja daļa no aplikācijas daļas, līdzīgi kā tas ir ar XHTML un CSS. Bet jāpiebilst, ka ne visi PHP ietvari seko MVC noteikumiem.</p>
<p>Lai labāk izprastu MVC zemāk ir, piemērs, ar mašīnu:</p>
<blockquote><p>A car is a good real-world example of MVC. With a car you have two views: the interior and the exterior. Both take input from the controller: the driver. The brakes, steering wheel and other controls represent the model: they take input from the controller (driver) and hand them off to the views (interior/exterior) for presentation.</p></blockquote>
<p>Šobrīd jau liekas, ka lielākā daļa ir sākuši strādāt ar ietvariem, vai tas būtu <em>JavaScriptā</em>, <em>Rubijā </em>vai <em>PHP</em>. Bet ar PHP veidojas problēma un tā ir tāda, ka ir pieejami tik daudz ietvari, katrs ar saviem plusiem un mīnusiem, ka paliek jau grūti izvēlēties īsto ar kuru strādāt.</p>
<p><strong>Kādi ir mīnusi izmantojot ietvarus?</strong></p>
<p>Protams monētai ir divas puses!</p>
<ol>
<li>Dažādiem ietvariem ir dažādas sintakses. Tev būs jāmācās jauna koda sintakse, atkarībā no ietvara kuru izvēlēsies. Tādēļ ietvars var likt tev mācīties visu no nulles.</li>
<li>Kodēšanas procesā izmantojot ietvaru, dažreiz var rasties situācija, kad tu nevarēsi atrast bibliotēku kura derētu tavai problēmai, tādēļ var nākties kādu laiciņu pacīnīties.</li>
<li>Ja tev nav OOP pieredzes tad PHP MVC ietvari nav domāti tev. No sākuma mans ieteikums būtu iegūt pamatzināšanas par OOP un tikai tad domāt par ietvaru izmantošanu.</li>
<li>Manā skatījumā ietvari nav domāti maziem projektiem, tādēļ ka nelielā projektā paša rakstīts kods strādās ātrāk par ietvaru. Nav nepieciešams mušas nogalināšanai izmantot lielgabalu!</li>
</ol>
<p><strong>Kad izmantot ietvaru?</strong></p>
<p>Uz šo jautājumu nav vienotas atbildes. Bēt kā jau minēju iepriekš, nebūtu prāta darbs izmantot ietvaru kalkulatora veidošanai vai tamlīdzīga tipa darbam.<br />
Nav jābūt ģēnijam lai saprastu ka ietvars samazinās gan izstrādes laiku, gan pieliktos pūliņus, tāpēc es noteikti ieteiktu izmantot ietvaru ja tuvojas <em>deadline</em>.</p>
<p><strong>Kādu ietvaru izmantot?</strong></p>
<p>Lietas kurām būtu jāpievērš uzmanība izvēloties ietvaru:</p>
<ul>
<li>Vai tas ir labi dokumentēts?</li>
</ul>
<p style="padding-left: 30px;">Es uzskatu ka dokumentācija ir būtiska ikvienam produktam - tātad tādai ir jābūt arī priekš ietvara. Iedomājies kur PHP šobrīd atrastos ja tai nebūtu lieliska dokumentācija! Kā es varētu apgūt kādu programmēšanas valodu ja tai nebūtu labas dokumentācijas? Tas būtu mokpilns process... un visdrīzāk es tādu valodu nemācītos, ja komplektā nebūtu dokumentācija no kuras ir arī jēga. Vēl nesen bija doma, izmantot <a href="http://extjs.com/" target="_blank">extjs</a> viena projekta ietvaros, bet šī doma atkrita pēc tam, kad biju mēģinājis kaut ko saprast no viņu dokumentācijas. Labi, piemēri, dokumentācijai:</p>
<ol>
<li><a href="http://framework.zend.com/manual">Zend ietvara dokumentācija</a></li>
<li><a href="http://ez.no/doc/components/overview">eZ Components dokumentācija</a></li>
<li><a href="http://codeigniter.com/user_guide/">CodeIgniter dokumentācija</a></li>
</ol>
<ul>
<li>Vai ietvaram ir kopiena?</li>
</ul>
<p style="padding-left: 30px;">Ietvars kuru neviens neizmanto ir nelietojams. Ko tu darīsi, ja tev radīsies kādas problēmas? Vai tev būs iespēja kādam pajautāt pēc padoma? Kā tas būs iespējams, ja to neviens nelietos? Nedomāju, ka kāds tērēs laiku lai meklētu risinājumu tavai problēmai, ja viņam nebūs bijusi saskare ar to ievaru kuru tu izmanto savai izstrādei. Vismaz es netērētu...</p>
<ul>
<li>Vai ietvars izmanto tev pieņemamu licenci?</li>
</ul>
<p style="padding-left: 30px;">Vienalga kādu licenci izmanto ietvars vai tā būtu MIT, BSD-Style vai LGPL, jautājums paliek tāds pats: Vai tavam darbam der viņu licence?</p>
<ul>
<li>Vai tavs serveris ir savietojams ar ietvaru?</li>
</ul>
<p style="padding-left: 30px;">Svarīgs ir arī punkts par servera savietojamību ar ietvaru. Nav jēgas no ietvara, ja tu nevari nodrošināt prasības kādas tas nosaka. Daudzi ietvari mūsdienās strādā sākot no PHP 5. Tāpēc pirms izvēlies ietvaru izpēti viņa prasības! Varbūt, ka paredzamā projekta hostinga nodrošinātājs nemaz nenodrošina minimālās ietvara prasības pēc PHP, MySQL vai Apache versijām.</p>
<p><strong>Manuprāt TOP 3, šobrīd pieejamie ietvari!</strong></p>
<ol>
<li><a href="http://www.codeigniter.com/" target="_blank">CodeIgniter</a> ir labi zināms un viegli lietojams ietvars, kas šobrīd ir arī mans favorīts. Pretēji Symfony šis PHP ietvars ir ideāls priekš šārētajiem hostingiem. Tas piedāvā vienkāršu risinājumu un tam ir milzīga video pamācību bibliotēka, forums un lietotāju rokasgrāmata. Iesācējiem noteikti vajadzētu apsvērt CodeIgniter izmantošanu.</li>
<li><a href="http://framework.zend.com/" target="_blank">The Zend Framework'am</a> ir milzīga koderu kopiena. Tas ir vērsts uz web 2.0 un web servisu stila aplikācijām. Zend ir viens no, ja ne pats populārākais ietvars kas šobrīd ir pieejams. Tam ir plašas iespējas un domāts galvenokārt lielu projektu izstrādāšanai. Lai to lietotu ir jābūt plašām PHP zināšanām.</li>
<li><a href="http://cakephp.org/" target="_blank">CakePHP</a> ir laba izvēlē gan priekš iesācējiem, gan priekš pieredzējušākiem PHP koderiem. Tas ir balstīts uz tādiem pašiem principiem kā Ruby on Rails padarot to par lielisku ietvaru priekš kodēšanas kurai nav atveltīts daudz laika. Lai gan CakePHP nav tā labākā dokumentācija tomēr tā strauji aug un vienkāršība, kas piemīt CakePHP, padara to par iekārojamu objektu daudziem koderiem.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.coderportfolio.com/2009/08/17/php-ietvari-frameworks-kapec-kad/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Namespace beidzot arī PHP</title>
		<link>http://blog.coderportfolio.com/2009/08/07/namespace-beidzot-ari-php/</link>
		<comments>http://blog.coderportfolio.com/2009/08/07/namespace-beidzot-ari-php/#comments</comments>
		<pubDate>Fri, 07 Aug 2009 00:04:40 +0000</pubDate>
		<dc:creator>Madars Langenfelds</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web izstrāde]]></category>
		<category><![CDATA[namespace]]></category>
		<category><![CDATA[namespaces]]></category>

		<guid isPermaLink="false">http://blog.coderportfolio.com/?p=16</guid>
		<description><![CDATA[Namespace ir viena no ievērojamākajām lietām, kas ir ieviesta sākot ar PHP 5.3.
Kam ir nepieciešams Namespace?
Pieaugot koda garumam pieaug arī iespējamība, ka tā ietvaros var tik atkārtoti nodefinēts tāds pats funkcijas vai klases nosaukums divas vai vairākas reizes. Tas protams nav pieļaujams, bet problēmu vēl vairāk saasināja, tas ka ja tika izmantotas trešās puses klases [...]]]></description>
			<content:encoded><![CDATA[<p><em>Namespace </em>ir viena no ievērojamākajām lietām, kas ir ieviesta sākot ar PHP 5.3.</p>
<p><strong>Kam ir nepieciešams <em>Namespace</em>?</strong></p>
<p>Pieaugot koda garumam pieaug arī iespējamība, ka tā ietvaros var tik atkārtoti nodefinēts tāds pats funkcijas vai klases nosaukums divas vai vairākas reizes. Tas protams nav pieļaujams, bet problēmu vēl vairāk saasināja, tas ka ja tika izmantotas trešās puses klases tad funkciju un klašu atkārtotā definēšana pieauga vēl vairāk.</p>
<p>Līdz šim vienīgais variants kā to atrisināt bija vai nu garu klašu un funkciju nosaukumu definēšanu vai <em>prefixu</em> pielikšana, piemēram, WordPress izmanto WP_ <em>prefixu</em>. Par to vairs nav jāuztraucas, jo PHP tas ir labots ieviešot <em>namespaces</em>.</p>
<p><strong><em>Namespace </em>lietošana citās valodās un izvēle par labu "\"<br />
</strong></p>
<pre class="brush:[php]">Java:
Attribute/Method access: foo.bar
Static method access:    Foo.bar
Package access:          foo.bar.baz

C#:
Attribute/Method access: foo.bar
Static method access:    Foo.bar
Namespace access:        foo.bar.baz

Python:
Attribute/Method access: foo.bar
Static method access:    Foo.bar
Module access:           foo.bar.baz

PHP:
Attribute/Method access: $foo-&gt;bar
Static method access:    Foo::bar
Namespace access:        foo\bar\baz</pre>
<p>Tātad kā var redzēt tad šajā ziņā PHP atšķiras ar savu dažādību :). <a href="http://wiki.php.net/rfc/namespaceseparator">Šeit </a>var sīkāk palasīt par to kādēļ tika izvēlēts tieši "\" simbols. Jāatzīst, ka sakumā es pret to attiecos nedaudz negatīvi, likās dīvaini izmantot <em>escape </em>simbolu šim nolūkam. Kā jau RFC diskusijā tika minēts, \ ir vienkārši uzrakstāms, tas satur tikai vienu simbolu un windows pasaulē tas jau ir zināms kā hierarhijas atdalītājs (C:\Mani_Faili\utt).</p>
<p>Sākumā tika apsvērta ideja arī izmantot ::, bet tā tika atmesta, jo tad rastos nesaprašanās, tādēļ ka tas jau tiek izmantots kā statisko metožu operators.</p>
<pre class="brush:[php]">class Foo {
    static function bar() { }
}

namespace Foo;
function bar() { }

Foo::bar(); // kas tad šeit tiek izsaukts? Klase Foo::bar vai namespace Foo::bar?</pre>
<p>Protams, izcēlās arī diskusijas par to, ka \ izskatās pretīgi un ir nepiemērots <em>namespaciem</em>, bet ar ko tad \ ir pretīgāks par $, /, ::, -&gt;? Tas man atgādina laiku, kad Longhorn pārsauca par Vistu, tas pats ir vērojams arī tagad, bet jo ātrāk cilvēki sapratīs, ka tas ir tikai vārds vai simbols jo labāk. <strong>lasi tālāk...</strong></p>
<p><span id="more-16"></span></p>
<p><strong>Namespace izmantošanas piemēri</strong></p>
<p>Namespace definēšana ir iespējama divos veidos:</p>
<pre class="brush:[php]">&lt;?php
//Pirmais variants
namespace MyProject1;
 //PHP kods priekš MyProject1 namespace

// Otrais variants
namespace MyProject2 {
 // PHP kods priekš MyProject2 namespace
}
?&gt;</pre>
<p>Namespace izsaukšana. Fails lib1.php satur konstanti, funkciju un klasi:</p>
<pre class="brush:[php]">&lt;?php
// application library 1
namespace App\Lib1;

const MYCONST = 'App\Lib1\MYCONST';

function MyFunction() {
	return __FUNCTION__;
}

class MyClass {
	static function WhoAmI() {
		return __METHOD__;
	}
}
?&gt;</pre>
<p>Tālāk jau var iesaukt kodu un izmantot namespace (myapp1.php):</p>
<pre class="brush:[php]">&lt;?php
header('Content-type: text/plain');
require_once('lib1.php');

echo \App\Lib1\MYCONST . "\n";
echo \App\Lib1\MyFunction() . "\n";
echo \App\Lib1\MyClass::WhoAmI() . "\n";
?&gt;</pre>
<p>Kā redzams myapp1.php kodā, tad nekur netiek definēta <em>namespace</em>, tas tāpēc, ka <em>namespace </em>ir globāla. Jebkurš mēģinājums vērsties pie MYCONST, MyFunction vai MyClass beigsies ar kļūdu, jo konstante, funkcija un klase eksistē App\Lib1 <em>namespeisā</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.coderportfolio.com/2009/08/07/namespace-beidzot-ari-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP goto operators</title>
		<link>http://blog.coderportfolio.com/2009/08/06/php-goto-operators/</link>
		<comments>http://blog.coderportfolio.com/2009/08/06/php-goto-operators/#comments</comments>
		<pubDate>Thu, 06 Aug 2009 11:38:07 +0000</pubDate>
		<dc:creator>Madars Langenfelds</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[goto]]></category>
		<category><![CDATA[programmēšana]]></category>

		<guid isPermaLink="false">http://blog.coderportfolio.com/?p=3</guid>
		<description><![CDATA[Par jauno PHP goto operatoru, kas ir ieviests ar PHP 5.3 versiju ir vairāki viedokļi. Vieni saka, ka tāds nav nepieciešams tādā programmēšanas valodā, citi atkal atbalsta goto ieviešanu.
Tad nu neliels apkopojums par goto:
Goto ir ļauns
Atceros savu pirmo pieredzi ar Basic, vairākus gadus atpakaļ, kad es vēl nezināju neko par procedūrām un funkcijām. Strādājot ar [...]]]></description>
			<content:encoded><![CDATA[<p>Par jauno <a href="http://xkcd.com/292/">PHP goto operatoru</a>, kas ir ieviests ar PHP 5.3 versiju ir vairāki viedokļi. Vieni saka, ka tāds nav nepieciešams tādā programmēšanas valodā, citi atkal atbalsta goto ieviešanu.</p>
<p>Tad nu neliels apkopojums par goto:</p>
<p><strong>Goto ir ļauns</strong></p>
<p>Atceros savu pirmo pieredzi ar Basic, vairākus gadus atpakaļ, kad es vēl nezināju neko par procedūrām un funkcijām. Strādājot ar goto (bāzētiem uz līniju numuriem) bija vienīgais veids kā kaut ko panākt. Tāda ir mana sākotnējā programmēšanas pieredze. Kods izskatījās briesmīgi un praktiski nebija lasāms (iedomājies par rindiņu pārnumurēšanu, kad tu vēlies ievietot kodu). Tad universitātē sākās Pascal laiki un goto bija velns zemes virsū...</p>
<p>Vai tagad redzi problēmu kāpēc goto tiek uzskatīts par ļaunu? Manās acīs goto ir citu iespēju nezināšanas trūkums.</p>
<p style="text-align: center;"><img class="aligncenter" title="Komiks no xkcd.com" src="http://imgs.xkcd.com/comics/goto.png" alt="" width="592" height="161" /></p>
<p><strong>Goto konfiktē ar OOP jēdzienu</strong></p>
<p>Manuprāt šis apgalvojums nav īsti pareizs. Kas man vienmēr ir paticis PHP ir tas, ka man ir iespēja izvēlēties kā atrisināt savu problēmu. OOP ir laba lieta, bet tā nav obligāta. Iespēja izvēlēties kā atrisināt kārtējo projektu ir brīvība, kas man patīk. Vēl labāk ir iespējams arī kombinēt. Tātad kur ir tā sliktā puse, tam ka tiek pievienota jauna kodēšanas tehnika un dota iespēja lietotājam izvēlēties? Vai tiešām kāds domā, ka kods tiks radīts nelietojams tikai tāpēc, ka tagad ir dota tāda iespēja?</p>
<p><strong>Switch piedāvā to pašu<br />
</strong></p>
<p>Savā ziņā tam nevar nepiekrist, bet izmantojot switch kā goto a) tas izskatās pretīgi un b) nodrošina tikai vienu lēcienu atkarībā no vērtības.</p>
<p>Manuprāt goto lietošanas iespējamība nav nekas slikts un drošības ierobežojumi priekš goto liekas pietiekami, lai neradītu problēmas:</p>
<ul>
<li>Nav iespējams lēkāt starp funkcijām</li>
<li>Nav iespējams lēkāt no vienas koda daļas vienā failā uz citu koda daļu citā failā</li>
</ul>
<p>Piemērs, kā goto strādā:</p>
<pre class="brush:[php]">&lt;?php
$counter = 0;
main: $counter++;
echo "Esmu sākumā\n";

if ( $counter &lt;= 10 ) {
goto subcat;
} else {
exit;
}

subcat:
echo "Mainam pozīciju\n";
goto main;

?&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.coderportfolio.com/2009/08/06/php-goto-operators/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

