<?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>ProgTips &#187; PHP</title>
	<atom:link href="http://tips.naivist.net/category/timeklis/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://tips.naivist.net</link>
	<description>Kodējot radušās domeles</description>
	<lastBuildDate>Fri, 08 Jul 2011 11:17:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Spell the word</title>
		<link>http://tips.naivist.net/2005/09/22/spell_the_word/</link>
		<comments>http://tips.naivist.net/2005/09/22/spell_the_word/#comments</comments>
		<pubDate>Thu, 22 Sep 2005 12:02:25 +0000</pubDate>
		<dc:creator>Krišs Rauhvargers</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://naivist.net/tips/index.php/2005/09/22/spell-the-word/</guid>
		<description><![CDATA[A tiny solution for the common English spell-by-letter problem. Written by me, plain PHP. Sources available on demand. My favourite word, mississippi.]]></description>
			<content:encoded><![CDATA[<p><a href="http://naivist.net/stufi/spell.php" onclick="pageTracker._trackPageview('/outgoing/naivist.net/stufi/spell.php?referer=');">A tiny solution</a> for the common English spell-by-letter problem. 
Written by me, plain PHP. Sources available on demand.</p>

<p>My favourite word, <a href="http://naivist.net/stufi/spell.php?inp=mississippi" onclick="pageTracker._trackPageview('/outgoing/naivist.net/stufi/spell.php?inp=mississippi&amp;referer=');">mississippi</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://tips.naivist.net/2005/09/22/spell_the_word/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Modulus</title>
		<link>http://tips.naivist.net/2005/06/06/modulus/</link>
		<comments>http://tips.naivist.net/2005/06/06/modulus/#comments</comments>
		<pubDate>Mon, 06 Jun 2005 07:54:48 +0000</pubDate>
		<dc:creator>Krišs Rauhvargers</dc:creator>
				<category><![CDATA[Datorlietas]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://naivist.net/tips/index.php/2005/06/06/modulus/</guid>
		<description><![CDATA[Rakstot par nesmukajiem datumiem, biju izmantojis šādu izteiksmi: $sundayEveningSpan = ((($now["wday"]-1)%7)*24*60*60);. Rezultātā mainīgais $sundayEveningSpan tiek uzstādīts (tam vajadzētu tikt uzstādītam) uz sekunžu skaitu starp šodienas plkst. 00:00 un šīs pirmdienas 00:00. Vārdu sakot, tiek aprēķināts, cik sekundes pagājušas šajā nedēļā. Kā redzams, izteiksmē parādās operators %, kas atgriež izteiksmes $now["wday"]-1 vērtību pēc moduļa 7. Tas [...]]]></description>
			<content:encoded><![CDATA[<p>Rakstot par <a href="http://naivist.net/tips/index.php/2005/06/03/nesmukie_laiki/" title="Cilvēkam saprotami datumi" onclick="pageTracker._trackPageview('/outgoing/naivist.net/tips/index.php/2005/06/03/nesmukie_laiki/?referer=');">nesmukajiem datumiem</a>, biju izmantojis šādu izteiksmi:  <code>$sundayEveningSpan = ((($now["wday"]-1)%7)*24*60*60);</code>. Rezultātā mainīgais <code>$sundayEveningSpan</code> tiek uzstādīts (tam vajadzētu tikt uzstādītam) uz sekunžu skaitu starp šodienas plkst. 00:00 un šīs pirmdienas 00:00. Vārdu sakot, tiek aprēķināts, cik sekundes pagājušas šajā nedēļā. </p>

<p>Kā redzams, izteiksmē parādās operators %, kas atgriež izteiksmes <code>$now["wday"]-1</code> vērtību pēc moduļa 7. Tas darīts tāpēc, ka PHP <a href="http://lv.php.net/getdate" title="Par GetDate() no php.net" onclick="pageTracker._trackPageview('/outgoing/lv.php.net/getdate?referer=');">funkcijas GetDate()</a> atgrieztajā masīvā <code>wday</code> lauks atgriež &#8220;Numeric representation of the day of the week: 0 (for Sunday) through 6 (for Saturday)&#8221;. Tātad svētdiena ir 0-tā diena, sestiena ir 6. diena. Tā kā man (un arī daudziem citiem latviešiem) nedēļa sākas ar pirmdienu, no dienas numura bija jāatņem vieninieks pēc moduļa 7, lai iegūtu pareizo piekārtojumu: pirmdienai 0, svētdienai <code>(0-1) mod 7</code>, kas vienāds ar 6 <a href="http://en.wikipedia.org/wiki/Modular_arithmetic" title="Par moduļu aritmētiku no wikipedia.org" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Modular_arithmetic?referer=');">klasiskajā moduļu aritmētikā</a>.</p>

<p>Tomēr izrādījās, ka šādi mana funkcija darbojas nekorekti. Izpētot tuvāk, secināju, ka PHP valodai arī ir savas īpatnības &#8211; modulis no negatīva skaitļa ir negatīvs. Tas arī oficiāli ir dokumentēts <a href="http://lv.php.net/manual/en/language.operators.arithmetic.php" title="Par aritmētiskajiem operatoriem" onclick="pageTracker._trackPageview('/outgoing/lv.php.net/manual/en/language.operators.arithmetic.php?referer=');">modulus operatora aprakstā</a>. Tādēļ <code>-1 % 7==-6</code>, nevis 6, kā bija sagaidāms.</p>

<p>Lai novērstu šīs PHP īpatnības sekas, aizstājam -1 ar +6 (kas ir kongruenti pēc moduļa 7) un turpmāk nedēļas sākumu aprēķinām šādi: <code>$sundayEveningSpan = ((($now["wday"]+6)%7)*24*60*60);</code>.</p>

<p>Kā rāda testi, šāda pat problēma novērojama arī <em>Visual Basic.Net</em> un, ļoti iespējams, arī citās <em>.Net</em> valodās. Kā sacīts MSDN, &#8220;The result of x Mod y is the value produced by x – (x \ y) * y&#8221;. Tas nozīmē, ka gadījumā, kad pats <code>x</code> ir negatīvs, arī atgrieztais rezultāts būs negatīvs. </p>

<p>Tā, lūk. Atliek vien secināt, ka programmēšanas valodu veidotājiem ir vienalga, vai tiek saglabāta <a href="http://en.wikipedia.org/wiki/Multiplicative_group_of_integers_modulo_n" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Multiplicative_group_of_integers_modulo_n?referer=');">multiplikatīvās grupas pēc moduļa N</a> un <a href="http://en.wikipedia.org/wiki/Ring_%28algebra%29" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Ring_28algebra_29?referer=');">gredzena</a> īpašība, kas tik svarīga ir matemātiķiem. Un tas, protams, ir tikai normāli &#8211; ja vajadzēs, vienmēr varēsim pieskaitīt 6 tā vietā, lai atņemtu 1.</p>
]]></content:encoded>
			<wfw:commentRss>http://tips.naivist.net/2005/06/06/modulus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nesmukie laiki</title>
		<link>http://tips.naivist.net/2005/06/03/nesmukie_laiki/</link>
		<comments>http://tips.naivist.net/2005/06/03/nesmukie_laiki/#comments</comments>
		<pubDate>Fri, 03 Jun 2005 09:03:55 +0000</pubDate>
		<dc:creator>Krišs Rauhvargers</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://naivist.net/tips/index.php/2005/06/03/nesmukie-laiki/</guid>
		<description><![CDATA[Šodien mani kaunināja, ka es nesmuki datumus rakstot. Ka &#8220;02.06.2005. 07:21:22&#8243; patiesībā cilvēkam neko neizsaka. Cita lieta, ja paziņotu vienkārši &#8220;vakar&#8221; &#8211; tas jau daudz labāk izklausoties. Taisnība jau arī ir &#8211; cilvēks nav dators, cilvēkam BIOS-ā nav iešūts kalendārs. Tāpēc funkcija, kas UNIX timestampam atgriež elementāros vārdiskos aprakstus. Tā sacīt, izkrāso pati, ja gribi [...]]]></description>
			<content:encoded><![CDATA[<p>Šodien mani kaunināja, ka es nesmuki datumus rakstot. Ka &#8220;02.06.2005. 07:21:22&#8243; patiesībā cilvēkam neko neizsaka. Cita lieta, ja paziņotu vienkārši &#8220;vakar&#8221; &#8211; tas jau daudz labāk izklausoties. Taisnība jau arī ir &#8211; cilvēks nav dators, cilvēkam BIOS-ā nav iešūts kalendārs.</p>

<p>Tāpēc funkcija, kas UNIX timestampam atgriež elementāros vārdiskos aprakstus. Tā sacīt, izkrāso pati, ja gribi citādi:</p>

<pre><code>function TextInfo($spTime){
    $todayMidNight = mktime(0, 0, 0, date("m"), date("d"), date("y"));
    $yesterdayMidNight = $todayMidNight - 24*60*60;


    $nowTime = mktime();        //brīdis, pret kuru rēķinās
    $now = getdate($nowTime); //aprēķina brīža dati sadalīti pa "detaļām"

    //timestamp pagājušās svētdienas beigām
    $sundayEveningSpan = ((($now["wday"]+6)%7)*24*60*60); 

    $then = getdate($spTime); //laiks, pret kuru rēķinās sadalīts pa "detaļām"

    //vai sakrīt ar šodienu
    if ( ($now["mday"]==$then["mday"]) &amp;&amp; 
        ($now["mon"]==$then["mon"]) &amp;&amp; 
        ($now["year"]==$then["year"])) {
    if ($then["hours"] &amp;lt; 6) return "šonakt"; //noticis šajā naktī
    if ($then["hours"] &amp;lt; 10) return "šorīt"; //noticis rīta pusē
    return "šodien";  //citādi vienkārši informējam, ka šodien 
    }

    //ir noticis vakardien
    if ( ($todayMidNight &amp;gt; $spTime) &amp;&amp; ($spTime &gt;= $yesterdayMidNight)) {
    if ( abs( $now["hours"] - $then["hours"] ) &amp;lt; 3) return "vakar ap šo laiku";  //ja stundas līdzīgas pašreizējām
    if ($then["hours"] &amp;lt; 6) return "vakar naktī"; //noticis vakar no rīta agri
    if ($then["hours"] &amp;lt; 10) return "vakar no rīta"; 
    if ($then["hours"] &amp;lt; 12) return "vakar priekšpusdienā"; 
    return "vakar";
    }

    //ir noticis šonedēļ
    if (( $todayMidNight &gt; $spTime) &amp;&amp;  ($todayMidNight- $sundayEveningSpan &lt; $spTime )) {
    return "šonedēļ";
    }

    //ir noticis pagājušajā nedēļā
    if (( $todayMidNight- $sundayEveningSpan &gt; $spTime) &amp;&amp; 
        ( $todayMidNight- $sundayEveningSpan - 24*60*60*7 &amp;lt; $spTime )) {
    return "pagājušajā nedēļā";
    }

    //ja senāk par pagājušo nedēļu, vai nav senāk par gadu?
    $tSpan = $nowTime - $spTime;
    if (floor($tspan /(24*60*60*365) )&gt;0) return " pirms vairāk nekā gada";

    //aizmirstam īsos un garos mēnešus
    $tSpanMonths = floor( $tSpan / (24*60*60*30) );     
    if ($tSpanMonths &amp;gt; 0) {
    //starp 1 un 2 mēnešiem
    if ($tSpanMonths == 1) {
        $days = floor(($tSpan-24*60*60*30)/(24*60*60));
        if ( ($days!=1) &amp;&amp; ($days!=21) &amp;&amp; ($days!=31)) 
        return "pirms mēneša un ".$days." dienām";
                            Else
        return "pirms mēneša un ".$days." dienas";
        }
    return "pirms vairāk nekā ".$tSpanMonths." mēnešiem";
    } else {
    //jāskatās, vai bija tas pats mēnesis, vai iepriekšējais
    if ($then["mon"]==$now["mon"]) return "šajā mēnesī"; else return "pagājušajā mēnesī";
    }
}
</code></pre>

<p>Parametros Unix timestamps.</p>
]]></content:encoded>
			<wfw:commentRss>http://tips.naivist.net/2005/06/03/nesmukie_laiki/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>FrontPage markup</title>
		<link>http://tips.naivist.net/2003/10/21/fp_markup/</link>
		<comments>http://tips.naivist.net/2003/10/21/fp_markup/#comments</comments>
		<pubDate>Tue, 21 Oct 2003 23:16:00 +0000</pubDate>
		<dc:creator>Krišs Rauhvargers</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Īss veids, kā tikt vaļā no FrontPage radītajām sliktajām lietām html kodā, ja &#8220;tāpat jau nāksies tam visam iet ar roku cauri&#8221;. Darām apmēram tā: $dati=$_POST["dati"]; $dati=strip_tags($dati, &#38;quot;&#38;lt;a&#38;gt;&#38;lt;b&#38;gt;&#38;lt;i&#38;gt;&#38;lt;p&#38;gt;&#38;lt;br&#38;gt;&#38;quot;); $dati=preg_replace(&#38;quot;/(class&#124;style&#124;align)=\"[^\"]+\"/i&#38;quot;, &#38;quot;&#38;quot;, $dati); Tādējādi no formas (vai vienalga kādā veidā) saņemtais mainīgais $dati tiek iztīrīts un tālāk ir cilvēkam lietojams. Līdz ar to tekstā nedrīkst parādīties substringi [...]]]></description>
			<content:encoded><![CDATA[<p>Īss veids, kā tikt vaļā no FrontPage radītajām sliktajām lietām html kodā, ja &#8220;tāpat jau nāksies tam visam iet ar roku cauri&#8221;.
Darām apmēram tā:</p>

<pre><code>$dati=$_POST["dati"];
$dati=strip_tags($dati, &amp;quot;&amp;lt;a&amp;gt;&amp;lt;b&amp;gt;&amp;lt;i&amp;gt;&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;quot;);
$dati=preg_replace(&amp;quot;/(class|style|align)=\"[^\"]+\"/i&amp;quot;, &amp;quot;&amp;quot;, $dati);
</code></pre>

<p>Tādējādi no formas (vai vienalga kādā veidā) saņemtais mainīgais $dati tiek iztīrīts un tālāk ir cilvēkam lietojams. Līdz ar to tekstā nedrīkst parādīties substringi kā <code>class="kautkas"</code>, bet par to jau FrontPage parūpēsies, aizvietojot tos ar attiecīgiem html entities.</p>
]]></content:encoded>
			<wfw:commentRss>http://tips.naivist.net/2003/10/21/fp_markup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mazliet par elementāro objektorientāciju</title>
		<link>http://tips.naivist.net/2003/07/16/elementara_oo/</link>
		<comments>http://tips.naivist.net/2003/07/16/elementara_oo/#comments</comments>
		<pubDate>Wed, 16 Jul 2003 14:25:05 +0000</pubDate>
		<dc:creator>Krišs Rauhvargers</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Mazliet par elementāro objektorientāciju PHP (tālāk rakstītais uz PHP 4.x, bet, ļoti iespējams, attieksies arī uz PHP 5.x)PHP izveidot klasi ir pavisam vienkārši. Rakstām class TestKlase{} un ir deklarēta jauna klase TestKlase. Līdz ar to turpmāk PHP kodā var rakstīt $TesVar = new TestKlase(); un būs zināms pavisam droši, ka $TestVar ir klases TestKlase objekta [...]]]></description>
			<content:encoded><![CDATA[<p>Mazliet par elementāro objektorientāciju PHP (tālāk rakstītais uz PHP 4.x, bet, ļoti iespējams, attieksies arī uz PHP 5.x)<br />PHP izveidot klasi ir pavisam vienkārši. Rakstām <div class="mpre">class TestKlase{}</div> un ir deklarēta jauna klase TestKlase. Līdz ar to turpmāk PHP kodā var rakstīt <div class="mpre">$TesVar = new TestKlase();</div> un būs zināms pavisam droši, ka $TestVar ir klases TestKlase objekta instance. Klasē var definēt arī iekšējos mainīgos, sauktus par atribūtiem. To dara šādi &#8211; tūlīt aiz klases nosaukuma deklarāciajs raksta atsevišķas rindas, kas sākas ar <em>var</em> un turpinās ar atribūta vārdu (un, iespējams, sākumvērtības definīciju). Tas ir, <div class="mpre">class TestKlase{<br />var $TestAtt1;<br />var $TestAtt2 = &#8217;1&#8242;;}</div> Līdz ar to, veidojot jaunu klases instanci, atribūts TestAtt2 iegūs vērtību &#8217;1&#8242;,bet TestAtt1 vērtību neiegūs vis. Vērtību inicializatori var būt tikai konstantes, ne dinamiski aprēķinātas vērtības (piemēram, datums). Par klases konstruktoru tiek uzskatīta funkcija, kuras nosaukums sakrīt ar klases vārdu. <div class="mpre">class TestKlase{<br />function TestKlase(){<br />&nbsp;&nbsp; $this->TestAtt1=&#8221;lalala&#8221;;<br />}<br />}</div> Kā redzams, šīs klases konstruktors uzstāda atribūta TestAtt1 vērtību uz string tipa mainīgo &#8220;lalala&#8221;. <br />Klases iekšpusē, lai piekļūtu dotās instances atribūtu vērtībām, jālieto mainīgais $this, kas vienmēr norāda uz doto klases instanci (tieši tāpat kā valodā C++).<br />Klases metodes rakstāmas tieši tāpat kā parastas PHP funkcijas (kas tās pēc būtības arī ir), ieskaitot mainīgo redzamības apgabalu lietojumu, tas ir, lai piekļūtu globāliem mainīgajiem metodē jādeklarē mainīgais kā globāls, piemēram <div class="mpre">function TestMethod(){<br />global $TABULAS<em>NOSAUKUMS;<br />}</div>. Klases, kas ir objektu kolekcijas, ir viegli veidot, izmantojot array objektu un array</em>push() metodi, bet tos pēc tam apstaigāt, izmantojot <div class="mpre">foreach ($this->TestVars as $test){<br />print<em>r($test);<br />}</div> Ērta funkcija klases instances apskatīšanai ir print</em>r().</p>
]]></content:encoded>
			<wfw:commentRss>http://tips.naivist.net/2003/07/16/elementara_oo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

