<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>lescinskas.lt</title>
    <description><![CDATA[Kategorijos įrašai :: programavimas]]></description>
    <link>http://www.lescinskas.lt/lt/blog</link>
    <language>lt</language>
    <item>
      <title>MongoDB</title>
      <description><![CDATA[<p>MongoDB yra dokumentinė NoSQL tipo duomenų bazių valdymo sistema.</p>
<p>Noriu pasidalinti savo prezentacija apie MongoDB - tikiuosi bus naudinga.</p>
<div style="width:425px" id="__ss_7585083"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/plutzilla/mongodb-7585083" title="MongoDB">MongoDB</a></strong><object id="__sse7585083" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mongo-110411042650-phpapp01&stripped_title=mongodb-7585083&userName=plutzilla" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse7585083" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mongo-110411042650-phpapp01&stripped_title=mongodb-7585083&userName=plutzilla" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></div>]]></description>
      <pubDate>Mon, 11 Apr 2011 12:31:58 +0300</pubDate>
      <link>http://www.lescinskas.lt/lt/blog/entry/paulius/mongo-db</link>
    </item>
    <item>
      <title>Užklausos tarp skirtingų domenų</title>
      <description><![CDATA[<p><img height="300" width="400" src="http://lescinskas.lt/uploads/editor/image/ajax.jpg" alt="AJAX" /></p>
<h2>XMLHttpRequest (AJAX) užklausos</h2>
<p>Naršyklės įprastai neleidžia daryti <a href="http://en.wikipedia.org/wiki/XMLHttpRequest" target="_blank">XMLHttpRequest</a> (liaudyje labiau žinomo kaip AJAX) užklausų į kitą domeną, kadangi tai neatitinka <a href="http://en.wikipedia.org/wiki/Same_origin_policy" target="_blank">Same Origin Policy</a> saugumo koncepcijos.</p>
<p>Firefox 3.5 ir Safari 4 buvo įdiegta naujai sukurta naršyklių technologija <a href="http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing" target="_blank">CORS (cross-origin resource sharing)</a>, kuri leidžia daryti XMLHttpRequest užklausas į kitus domenus, kai šie patvirtina, jog leidžia konkretiems šaltiniams daryti užklausas.</p>
<p><strong>Kaip tai veikia?</strong></p>
<p>Vartotojo naršyklė, siųsdama XMLHttpRequest užklausą į kitą domeną, siunčia HTTP request header'į <strong>Origin</strong> su savo domeno reikšme.</p>
<p>Serveris siunčia atsakymą su HTTP response header'iu <strong>Access-Control-Allow-Origin</strong> su konkretaus domeno, kuriam leidžiama daryti užklausas, reikšme, arba <strong>*</strong> reikšme, kuri leidžia visiems šaltiniams daryti užklausas. HTTP response headerio formavimo pavyzdžiai PHP kalba:</p>
<p>header('Access-Control-Allow-Origin: http://www.domenas.tld');</p>
<p>header('Access-Control-Allow-Origin: *');</p>
<p>Šiuos header'ius taip pat gali siųsti ir pats HTTP serveris, pvz.: Apache, naudojant <a href="http://httpd.apache.org/docs/current/mod/mod_headers.html" target="_blank">mod_headers modulį</a>.</p>
<p>Daugeliu atveju to turėtų pakakti, tačiau <a href="http://www.w3.org/TR/cors/" target="_blank">CORS specifikacija</a> leidžia daryti sudėtingesnes užklausas, nurodant leidžiamą HTTP metodą, atitinkamus header'ius ir kt., pvz.:</p>
<p>HTTP request header'iai:</p>
<p>Origin: http://www.domenas.tld<br />
Access-Control-Request-Method: POST<br />
Access-Control-Request-Headers: belekoks-headeris</p>
<p>HTTP response header'iai</p>
<p>Access-Control-Allow-Origin: http://www.domenas.tld<br />
Access-Control-Allow-Methods: POST, GET, OPTIONS<br />
Access-Control-Allow-Headers: belekoks-headeris<br />
Access-Control-Max-Age: 1728000</p>
<p>Tam tikrais atvejais reikia nurodyti HTTP response header'į, leidžiantį XMLHttpRequest užklausas:</p>
<p>Access-Control-Allow-Headers: X-Requested-With</p>
<h2>JSONP</h2>
<p>Kitas būdas, norint gauti ir apdoroti duomenis yra naudoti &lt;script&gt; elementus, kadangi jiems negalioja Same Origin Policy, pvz.:</p>
<p>&lt;script type=&quot;text/javascript&quot; src=&quot;<strong>http://kitas-domenas.tld/skriptas.php?parametras=reiksme</strong>&quot;&gt;&lt;/script&gt;</p>
<p>Tačiau kadangi šis skriptas bus iškart įvykdytas, vien duomenų pasiimti nepavyks. Dėl to, skriptas turi grąžinti kvietimą į funkciją, kuri apdoros duomenis. Pvz. šiuo atveju skriptas.php turėtų grąžinti tokį rezultatą:</p>
<p>funkcija({&quot;jsonDuomenuStruktura&quot;: &quot;reiksme&quot;});</p>
<p>Čia <strong>funkcija</strong> - Javascript funkcija, kuri apdoroja gautus duomenis.</p>
<p>Šis metodas vadinamas JSONP (JSON with prefix).</p>
<p>Akivaizdu, kad šiuo metodu galima gauti ir perduoti duomenis tik GET metodu. Be to, serveris, kuris grąžina rezultatus turi būti pritaikytas JSONP duomenų perdavimui, t.y. turi būti galimybė parametrais nurodyti funkciją, kuri bus iškviečiama.</p>
<p>Taip pat, kadangi įterpiamas svetimas Javascript kodas, atsiranda galimų saugumo spragų, nes skriptas gali įrašyti bet kokį HTML kodą ir kitaip manipuliuoti turiniu, be to atsiranda galimybė perimti duomenis naudojant CSRF pažeidžiamumą.</p>
<h2>Vietinis proxy</h2>
<p>Dar vienas metodas yra naudoti skriptą tame pačiame domene, kuris serverio (ne naršyklės) lygyje padarytų HTTP užklausą į kitą domeną ir grąžintų rezultatus, pvz.: failas proxy.php, esantis tame pačiame domene:</p>
<p>&lt;?php<br />
echo file_get_contents('http://kitas-domenas.tld/skriptas.php'); // Geriau naudoti cURL</p>
<p>Tokiu atveju pakaks daryti užklausą į tame pačiame domene esantį proxy.php ir taip patenkinti Same Origin Policy saugumo koncepciją.</p>
<h2>Adobe Flash užklausos</h2>
<p>Adobe Flash elementai, darydami užklausą į kitą serverį (pvz.: norėdami pasiimti tam tikrus duomenis), kreipiasi į tame domene esantį <a href="http://www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html" target="_blank">crossdomain.xml </a>failą (pvz.: http://www.domenas.tld/crossdomain.xml), kuriame aprašomos taisyklės, nurodančios, kokiems šaltiniams leidžiama skaityti duomenis iš serverio.</p>
<p>crossdomain.xml failo pavyzdys:</p>
<p>&lt;?xml version=&quot;1.0&quot;?&gt;<br />
&lt;!DOCTYPE cross-domain-policy SYSTEM &quot;http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd&quot;&gt;<br />
&lt;cross-domain-policy&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;allow-access-from domain=&quot;*&quot;/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;allow-http-request-headers-from domain=&quot;*&quot; headers=&quot;X-Requested-With&quot;/&gt;<br />
&lt;/cross-domain-policy&gt;</p>
<p>Verta pastebėti, jog darydamas užklausas, Flash neperduoda slapukų (pvz.: sesijos identifikatorių), todėl juos perduoti reikia kaip atskirus Flash parametrus.</p>
<h2>Bonus tip: HTTP headeris Content-disposition</h2>
<p>Pavyzdys: failas http://www.domenas.tld/paveikslelis.php generuoja paveikslėlį, tačiau norint jį išsaugoti, siūlomas failo vardas bus paveikslelis.php.</p>
<p>Norint jį pakeisti, galime siųsti HTTP response header'į:</p>
<p>Content-disposition: inline; filename=&quot;grazus-pavasaris.jpg&quot;</p>
<p>Jei norime iškart iškviesti failo išsaugojimo langą, galime nurodyti:</p>
<p>Content-disposition: attachment; filename=&quot;grazus-pavasaris.jpg&quot;</p>]]></description>
      <pubDate>Tue, 15 Feb 2011 13:46:54 +0200</pubDate>
      <link>http://www.lescinskas.lt/lt/blog/entry/paulius/uzklausos-tarp-skirtingu-domenu</link>
    </item>
    <item>
      <title>Smarty 3 apžvalga</title>
      <description><![CDATA[<p><img width="249" height="74" alt="Smarty" src="http://lescinskas.lt/uploads/editor/image/smarty-logo.png" /></p>
<p>Po beveik 2 metus (2008-12-16 - 2010-11-12) trukusio programavimo, buvo išleista 3 PHP šablonų variklio &bdquo;Smarty&ldquo; versija.</p>
<p>Sistema buvo perrašyta iš pagrindų, pritaikyta PHP 5 versijai, buvo sukurtas naujas sintaksės nagrinėjimo variklis (parser), pagerėjo sistemos darbo našumas, šiek tiek pasikeitė šablonų sintaksė.</p>
<p>Nors egzistuoja kontraversiškos nuomonės, reikalingas PHP kalbos šablonų variklis ar ne, &bdquo;Smarty&ldquo; suteikia papildomas galimybes atskiriant prezentacijos logiką nuo programos logikos. Be to, techniniams dizaineriams, nemokantiems PHP kalbos, dirbti su &bdquo;Smarty&ldquo; gali būti patogiau, saugiau ir produktyviau.</p>
<p>Smarty 3 sintaksė šiek tiek pasikeitė nuo 2 versijos, todėl seni šablonai gali neveikti, ypač jei jie buvo parašyti su klaidomis. 3 versija į sintaksės klaidas žiūri griežčiau, tačiau turi papildomų galimybių.</p>
<p>Kas pasikeitė Smarty 3 versijos šablonų sintaksėje nuo 2 versijos:</p>
<h3>Atsisakyta {ldelim} ir {rdelim}</h3>
<p>2 versijoje norint naudoti { ir } simbolius šablone (pvz.: rašant Javascript funkcijas) juos reikdavo pakeisti {ldelim} ir {rdelim} simboliais arba rašyti tekstą tarp {literal} ir {/literal}. Dabar to daryti nebereikia, tačiau rašant kintamuosius ar funkcijas nebegalima palikti tarpų tarp skirtukų, pvz,: { $foo } ir išves tokį tekstą, o ne kintamojo reikšmę.</p>
<h3>Masyvų modifier'is</h3>
<p>2 versijoje norint modifier'iui perduoti visą masyvą, o ne atskirus jo elementus, reikdavo pridėti @ simbolį, pvz.: {$masyvas|@count}. Dabar visas masyvas perduodamas modifier'iui, pvz.: {$masyvas|count}.</p>
<h3>{php} žymės</h3>
<p>Standartiškai {php} žymės 3 versijoje yra uždraustos. Jas galima įjungti nurodant $smarty-&gt;allow_php_tag = true;</p>
<h3>Kabutės parametruose</h3>
<p>2 versijoje kabutės parametruose buvo nebūtinos, tačiau 3 versijoje jas naudoti būtina, pvz.: {include file=&quot;/kelias/iki/sablono.tpl&quot;}</p>
<p><a href="http://smarty-php.googlecode.com/svn/trunk/distribution/SMARTY2_BC_NOTES">Visi pakeitimai, nesuderinami su &bdquo;Smarty&ldquo; 2 versija</a>.</p>
<p>Taip pat buvo padaryti pakeitimai, palengvinantys darbą su duomenimis:</p>
<h3>Išplėstas {foreach} funkcionalumas</h3>
<p>3 versijoje galima naudoti tokią {foreach} sintaksę:</p>
<p>{foreach $masyvas as $reiksme}</p>
<p>{$reiksme}</p>
<p>{/foreach}</p>
<p>Taip pat palengvintas ciklo savybių gavimas, pvz.:</p>
<p>{$reiskme@key} - masyvo raktas</p>
<p>{$reiksme@iteration} - ciklo iteracija</p>
<p>{$reiksme@total} - visas masyvo elementų kiekis</p>
<p>{$reiksme@first}, {$reiksme@last} - grąžina true, jei elementas pirmas/paskutinis. Patogu naudoti sąlygos sakiniuose</p>
<p>2 &bdquo;Smarty&ldquo; versijoje šios savybės buvo pasiekiamos per {$smarty.foreach.&lt;ciklo vardas&gt;.&lt;savybė&gt;}</p>
<h3>{strip} blokas</h3>
<p>Naudojant {strip} ir {/strip} galima nurodyti, jog visas output'as šiame bloke bus rašomas vienoje eilutėje, pašalinant tarpus, naujas eilutes ir kt. whitespace simbolius.</p>
<p>&bdquo;Smarty&ldquo; 3 versijoje taip pat atsirado šablonų paveldėjimas, funkcijų kūrimas pačiuose šablonuose ir kt. Taip pat šis tas pasikeitė PHP pusėje, pvz.: dabar norint paveldėti Smarty klasę, reikia iškviesti tėvinį konstruktorių - parent::__construct();</p>
<p><a href="http://www.smarty.net/v3_overview">Pilna &bdquo;Smarty&ldquo; 3 versijos apžvalga smarty.net tinklalapyje</a>.</p>]]></description>
      <pubDate>Mon, 15 Nov 2010 14:44:25 +0200</pubDate>
      <link>http://www.lescinskas.lt/lt/blog/entry/paulius/smarty-3-apzvalga</link>
    </item>
    <item>
      <title>SQL atranka pagal kelis kriterijus</title>
      <description><![CDATA[<p>Rašinio pavadinimas gal ir neaiškus, tačiau situacija paprasta: turime straipsnių ir straipsnių žymių (tags) lenteles, sujungtas ryšiu &bdquo;1..n&ldquo;. Reikia atlikti paiešką (atrinkti straipsnius) pagal kelias žymes (kai visos nurodytos žymės priklauso straipsniui). Sprendimas žemiau.</p>
<p>Lentelių struktūra</p>
<pre>
+-------------+   +-------------+
| articles    |   | tags        |
+-------------+   +-------------+
| id          |   | id          |
|(kiti laukai)|   | articleId   |
+-------------+   | tag         |
                  +-------------+</pre>
<p>&nbsp;SQL užklausa:</p>
<pre class="brush: sql">
SELECT a.* FROM articles AS a
INNER JOIN tags AS t ON a.id=t.articleId
WHERE t.tag='Žymė 1' OR t.tag='Žymė 2'
GROUP BY a.id
HAVING COUNT(*)=2
</pre>
<p>Dinamiškai formuojant tokią užklausą HAVING dalyje reikia naudoti tokį skaičių, kiek žymių dalyvauja užklausoje.</p>]]></description>
      <pubDate>Tue, 21 Sep 2010 23:03:11 +0300</pubDate>
      <link>http://www.lescinskas.lt/lt/blog/entry/paulius/sql-atranka-pagal-kelis-kriterijus</link>
    </item>
    <item>
      <title>NetBeans patarimai (Tips And Tricks)</title>
      <description><![CDATA[<p><img width="206" height="45" src="http://www.lescinskas.lt/uploads/editor/image/NB-logo-single.jpg" alt="NetBeans" /></p>
<p>Viena populiariausių (kartu su <a href="http://www.eclipse.org">Eclipse</a> ar jos pagrindu sukurtomis) programavimo aplinkų (IDE) Java, PHP, Ruby ir kitoms programavimo kalboms yra <a href="http://www.netbeans.org">NetBeans</a>. Man, kaip ir kitiems pradedantiems programuotojams, patinka šios aplinkos paprastumas, veikimas &bdquo;out of the box&ldquo;. Įskiepius diegti ir konfigūruoti aplinką čia paprasčiau nei Eclipse, nors galimybėmis šios aplinkos labai panašios.</p>
<p>Keletas patarimų iš praktikos, kad programavimas būtų efektyvesnis.</p>
<ul>
    <li><strong>Shift+ESC</strong> - Lango padidinimas per visą ekraną</li>
    <li><strong>Ctrl+Shift+Aukštyn/Žemyn</strong> - sukuria eilutės dublikatą</li>
    <li><strong>Alt+Shift+Aukštyn/Žemyn</strong> - perkelia eilutę į viršų/apačią</li>
    <li><strong>Alt+Shift+Kairė/Dešinė</strong> - padidina arba sumažina atitraukimą (indent)</li>
    <li><strong>Ctrl+E</strong> - ištrina eilutę</li>
    <li><strong>Ctrl</strong><strong>+Space</strong> - kodo autocomplete'as (jei įmanoma).</li>
    <li>6.5 ir naujesnėse versijose kintamojo aprašymui galite naudoti kodo šabloną <strong>vdoc</strong>. Jei jūsų kintamasis yra neaiškaus tipo (pvz.: kažkurios klasės objektas), virš jo rašydami <strong>vdoc</strong> ir spausdami <strong>Tab</strong> gausite strukdūrą /* @var $kintamasis Tipas */ - taip kintamajam veiks navigacija po kodą (<strong>Ctrl+pelytės paspaudimas</strong>) bei autocomplete'as. Naviguojant po kodą atgal ir pirmyn vaikščioti galima su <strong>Alt+Dešinė</strong> bei <strong>Alt+Kairė</strong>. Kintamojo aprašymai veikia ir Eclipse IDE.</li>
</ul>
<p><img width="600" height="319" src="http://www.lescinskas.lt/uploads/editor/image/NB-vardoc-basic.gif" alt="NetBeans vardoc" /></p>
<ul>
    <li><strong>Alt+Shift+O</strong> - atidaro failo paieškos langą</li>
    <li><strong>Ctrl+Alt+Shif</strong><strong>t+O</strong> - atidaro simbolio (metodo, konstantos, kintamojo) paieškos langą. Nenaudojant kintamojo aprašymo, patogu šį trumpinį spausti ant kviečiamo metodo - taip paieškos laukelyje iškart atsiranda to metodo pavadinimas.</li>
    <li><strong>Ctrl+/</strong> - užkomentuoja ar atkomentuoja eilutę ar pažymėtas eilutes</li>
    <li><strong>Ctrl+R</strong> - pervadinimo refaktoringas</li>
    <li><strong>Ctrl+Shift+F</strong> - paieška per failus. Spaudžiant prieš tai pažymėjus direktoriją projektų ar failų lange, galima pasirinkti ieškoti toje direktorijoje.</li>
    <li><strong>Ctrl+G</strong> - eina į nurodytą eilutę faile</li>
</ul>
<p>Savo nuorodų trumpinius gali susikurti ar redaguoti per <strong>Tools -&gt; Options -&gt; Keymap</strong>. Aš naudoju trumpinius kodo iš repozitorijos atnaujinimui (update) ir įkėlimui (commit).</p>
<p>Kodo šablonus galite kurti bei redaguoti per <strong>Tools -&gt; Options -&gt; Editor -&gt; Code Templates</strong>.</p>
<p>Programuoji su NetBeans? Pasidalink savo patarimais!</p>
<p>Nuorodos: <a href="http://wiki.netbeans.org/NBCDTipsAndTricks">NetBeans bendruomenės patarimai</a> bei <a href="http://stackoverflow.com/questions/628830/netbeans-tips-and-tricks">patarimai iš Stack Overflow</a>.</p>]]></description>
      <pubDate>Tue, 17 Aug 2010 11:56:00 +0300</pubDate>
      <link>http://www.lescinskas.lt/lt/blog/entry/paulius/netbeans-patarimai-tips-and-tricks</link>
    </item>
    <item>
      <title>Sprendimas: Eclipse ar Netbeans lūžta vykdant SVN operacijas</title>
      <description><![CDATA[<p>Jei programuojant Linux aplinkoje su Eclipse ar Netbeans ir, vykdant SVN operacijas, IDE pakimba ar lūžta, problema gali būti Gnome Keyring palaikyme SVN 1.6 versijoje. Kol šis defektas nėra pašalintas, reiktų naudotis problemos apėjimu. Tam reikia <strong>~/.subversion/config</strong> faile įrašyti (pakeisti) šias eilutes:</p>
<pre>
[auth]
### Set password stores used by Subversion. They should be
### delimited by spaces or commas. The order of values determines
### the order in which password stores are used.
### Valid password stores:
###   gnome-keyring        (Unix-like systems)
###   kwallet              (Unix-like systems)
###   keychain             (Mac OS X)
###   windows-cryptoapi    (Windows)
password-stores = </pre>
<p><br />
Tuščia <strong>password-stores</strong> reikšmė išjungs Gnome Keyring palaikymą ir slaptažodžiai bus saugomi paprastu tekstu, kaip ir ankstesnėse SVN versijose.</p>
<p>Šaltinis: <a href="http://subclipse.tigris.org/wiki/JavaHL#head-3a1d2d3c54791d2d751794e5d6645f1d77d95b32">subclipse.tigris.org</a></p>]]></description>
      <pubDate>Mon, 01 Mar 2010 14:59:32 +0200</pubDate>
      <link>http://www.lescinskas.lt/lt/blog/entry/paulius/sprendimas-eclipse-ar-netbeans-luzta-vykdant-svn-operacijas</link>
    </item>
    <item>
      <title>Populiariausios 2009 m. programavimo kalbos</title>
      <description><![CDATA[<p>Kompanija &bdquo;Tiobe&ldquo; <a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html">paskelbė</a> populiariausių 2009 metų  programavimo kalbų sąrašą. Šis sąrašas sudaromas pagal <a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/tpci_definition.htm">Tiobe indeksą</a>, kuris remiasi paieškos sistemų (Google, Google Blogs, MSN, Yahoo!, Wikipedia ir YouTube) rezultatais.</p>
<p><img width="640" height="480" src="http://www.lescinskas.lt/uploads/editor/image/tiobe-indeksas-2002-2010.png" alt="Tiobe indeksas" /></p>
<p>Labiausiai (1,25%) į viršų pakilo &bdquo;Google&ldquo; programavimo kalba <a href="http://www.golang.org"><strong>&bdquo;Go&ldquo;</strong></a>, kuri, nors buvo pristatyta tik metų gale, Tiobe indekse užėmė 13 vietą. Visgi, kadangi ši programavimo kalba labai nauja, neaišku, ar šis populiarumas yra pelnytas, ar tai buvo vienkartinis susidomėjimas.</p>
<p>12 vietoje atsirado<strong> &bdquo;Objective-C&ldquo;</strong> programavimo kalba, kuria kuriamos programos iPhone. Natūralu, jog iPhone populiarumas atsispindėjo ir šiame indekse. Ši kalba pagal populiarumą pakilo 1,24%.</p>
<p>Tendencingesnių programavimo kalbų sąraše verta paminėti ir <strong>PHP</strong>, kuri pakilo 1,19% ir, aplenkusi C++ ir (Visual) Basic, atsidūrė 3 sąrašo vietoje bei <strong>Ruby</strong>, kuri pagaliau įkopė į dešimtuką, išstūmusi iš jo &bdquo;Delphi&ldquo;.</p>
<p>Lyderio pozicijas toliau išlaiko <strong>Java</strong>, nors jos populiarumas nukrito 1,54%.</p>]]></description>
      <pubDate>Tue, 12 Jan 2010 15:13:43 +0200</pubDate>
      <link>http://www.lescinskas.lt/lt/blog/entry/paulius/populiariausios-2009m-programavimo-kalbos</link>
    </item>
    <item>
      <title>Komunikacija su Iframe per Javascript bei JQuery</title>
      <description><![CDATA[<p>Iframe - HTML elementas, leidžiantis tam tikroje tinklalapio vietoje įkelti kito tinklalapio turinį.</p>
<p>Nors HTML5 buvo atsisakyta tradicinių rėmelių (frameset), tačiau Iframe yra plačiai naudojamas ir, panašu, kad ateityje šio elemento naudojimas bus dar intensyvesnis, žinant, jog tiek socialinių tinklų aplikacijų platformų (pvz.: OpenSocial), tiek ir įvairūs Interneto servisai (pvz.: Google Maps) veikimas pagrįstas Iframe pagrindu.</p>
<p>Komunikacija tarp pagrindinio tinklalapio ir Iframe'o Javascript pagalba galima tik tuo atveju, jei abu puslapiai yra užkraunami iš to paties domeno (pvz.: http://www.foo.com ir http://www.bar.com bus negalima). Netgi norint realizuoti komunikaciją tarp skirtingų 3 lygio domenų (pvz.: http://foo.example.com ir http://bar.example.com), būtina abiejuose puslapiuose nurodyti, kad šie abu tinklalapiai priklauso tam pačiam domenui. Tai galima padaryti Javascript komanda:</p>
<pre class="brush:javascript">
document.domain = 'example.com';
</pre>
<p>Norint realizuoti komunikaciją tarp skirtingų domenų, reiktų naudoti Iframe proxy. T.y. skriptas, esantis tame pačiame domene, turėtų tiesiog atvaizduoti kitame domene esančio puslapio HTML turinį.</p>
<p>Komunikaciją tarp pagrindinio puslapio ir į jį įterpto Iframe'o atspindi šie pavyzdžiai.</p>
<p>Pagrindinis puslapis (pvz.: index.html)</p>
<pre class="brush:xml">
&lt;html&gt;
&lt;head&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://www.google.com/jsapi&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
&nbsp;&nbsp;&nbsp; google.load(&quot;jquery&quot;, &quot;1.3.2&quot;);
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;iframe id=&quot;myIframe&quot; src=&quot;iframe.html&quot; width=&quot;100&quot; height=&quot;100&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot;&gt;&lt;/iframe&gt;
&lt;div id=&quot;foo&quot;&gt;FOO&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
&nbsp;&nbsp;&nbsp; // Naudojant skirtingus subdomenus, nurodome bendrą domeną:
&nbsp;&nbsp;&nbsp; document.domain = 'example.com';
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; $('#myIframe').load(function()
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // jQuery pavyzdys:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var frame = $('#myIframe').contents();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console.log('jQuery: ',frame.find('#bar').html());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Javascript pavyzdys:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame = document.getElementById('myIframe').contentDocument;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Jei neveikia contentDocument, galima naudoti contentWindow.document
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console.log('JS: ', frame.getElementById('bar').innerHTML);
&nbsp;&nbsp;&nbsp; });
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Iframe puslapis (iframe.html)</p>
<pre class="brush:xml">
&lt;html&gt;
&lt;head&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://www.google.com/jsapi&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
&nbsp;&nbsp;&nbsp; google.load(&quot;jquery&quot;, &quot;1.3.2&quot;);
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id=&quot;bar&quot;&gt;BAR&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
&nbsp;&nbsp;&nbsp; // Naudojant skirtingus subdomenus, nurodome bendrą domeną:
&nbsp;&nbsp;&nbsp; document.domain = 'example.com';
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; // jQuery pavyzdys - ieškome #foo elemento window.parent.document kontekste
&nbsp;&nbsp;&nbsp; console.log('jQuery: ', $('#foo', window.parent.document).html());
&nbsp;&nbsp;&nbsp; // Javascript pavyzdys:
&nbsp;&nbsp;&nbsp; console.log('JS: ', window.parent.document.getElementById('foo').innerHTML);
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Šie pavyzdžiai <a href="http://www.getfirebug.com">Firebug </a>konsolėje parodys atitnkamų elementų turinius.</p>]]></description>
      <pubDate>Thu, 22 Oct 2009 17:01:34 +0300</pubDate>
      <link>http://www.lescinskas.lt/lt/blog/entry/paulius/komunikacija-su-iframe-per-javascript-ir-jquery</link>
    </item>
    <item>
      <title>PHP loginiai operatoriai ir operatorių eiliškumas</title>
      <description><![CDATA[<p>Atliekant veiksmus su loginiais operatoriais ir naudojant juos sąlygos sakiniuose, dažnai tikimasi tokios sąlygos schemos:</p>
<p>if ( &lt;sąlyga&gt; [ == &lt;rezultatas&gt; ] ) &lt;atliekami veiksmai&gt;;</p>
<p>Tačiau naudojant sąlygose loginius operatorius, ši schema negalioja, kadangi operatorių eiliškume palyginimo operatoriai yra aukštesnio prioriteto nei loginiai. Dėl to gauname ne visada tikėtą rezultatą. Pvz.:</p>
<pre class="brush: php">
$a = 5;
$b = 2;
echo ($a &amp; $b == 0)?'nulis':'ne nulis'; // ne nulis
echo (($a &amp; $b) == 0)?'nulis':'ne nulis'; // nulis

$a = 1;
$b = 2;
echo ($a &amp; $b == 2)?'du':'ne du'; // du
echo (($a &amp; $b) == 2)?'du':'ne du'; // ne du
</pre>
<p>&nbsp;</p>
<p>Operatorių eiliškumas iš <a href="http://www.php.net/manual/en/language.operators.precedence.php">PHP manual'o</a>.</p>
<table class="doctable table" style="border: 1px solid #c0c0c0; border-collapse: collapse" border=1>
    <thead valign="middle">
        <tr valign="middle">
            <th>Associativity</th>
            <th>Operators</th>
            <th>Additional Information</th>
        </tr>
    </thead>
    <tbody valign="middle" class="tbody">
        <tr valign="middle">
            <td align="left">non-associative</td>
            <td align="left">clone new</td>
            <td align="left"><a href="http://www.php.net/manual/en/language.oop5.cloning.php" class="link">clone</a> and <a href="http://www.php.net/manual/en/language.oop5.basic.php#language.oop5.basic.new" class="link">new</a></td>
        </tr>
        <tr valign="middle">
            <td align="left">left</td>
            <td align="left">[</td>
            <td align="left"><a href="http://www.php.net/manual/en/function.array.php" class="function">array()</a></td>
        </tr>
        <tr valign="middle">
            <td align="left">non-associative</td>
            <td align="left">++ --</td>
            <td align="left"><a href="http://www.php.net/manual/en/language.operators.increment.php" class="link">increment/decrement</a></td>
        </tr>
        <tr valign="middle">
            <td align="left">non-associative</td>
            <td align="left">~ - (int) (float) (string) (array) (object) (bool) @</td>
            <td align="left"><a href="http://www.php.net/manual/en/language.types.php" class="link">types</a></td>
        </tr>
        <tr valign="middle">
            <td align="left">non-associative</td>
            <td align="left">instanceof</td>
            <td align="left"><a href="http://www.php.net/manual/en/language.types.php" class="link">types</a></td>
        </tr>
        <tr valign="middle">
            <td align="left">right</td>
            <td align="left">!</td>
            <td align="left"><a href="http://www.php.net/manual/en/language.operators.logical.php" class="link">logical</a></td>
        </tr>
        <tr valign="middle">
            <td align="left">left</td>
            <td align="left">* / %</td>
            <td align="left"><a href="http://www.php.net/manual/en/language.operators.arithmetic.php" class="link">arithmetic</a></td>
        </tr>
        <tr valign="middle">
            <td align="left">left</td>
            <td align="left">+ - .</td>
            <td align="left"><a href="http://www.php.net/manual/en/language.operators.arithmetic.php" class="link">arithmetic</a> and          <a href="http://www.php.net/manual/en/language.operators.string.php" class="link">string</a></td>
        </tr>
        <tr valign="middle">
            <td align="left">left</td>
            <td align="left">&lt;&lt; &gt;&gt;</td>
            <td align="left"><a href="http://www.php.net/manual/en/language.operators.bitwise.php" class="link">bitwise</a></td>
        </tr>
        <tr valign="middle">
            <td align="left">non-associative</td>
            <td align="left">&lt; &lt;= &gt; &gt;= &lt;&gt;</td>
            <td align="left"><a href="http://www.php.net/manual/en/language.operators.comparison.php" class="link">comparison</a></td>
        </tr>
        <tr valign="middle">
            <td align="left">non-associative</td>
            <td align="left">== != === !==</td>
            <td align="left"><a href="http://www.php.net/manual/en/language.operators.comparison.php" class="link">comparison</a></td>
        </tr>
        <tr valign="middle">
            <td align="left">left</td>
            <td align="left">&amp;</td>
            <td align="left"><a href="http://www.php.net/manual/en/language.operators.bitwise.php" class="link">bitwise</a> and          <a href="http://www.php.net/manual/en/language.references.php" class="link">references</a></td>
        </tr>
        <tr valign="middle">
            <td align="left">left</td>
            <td align="left">^</td>
            <td align="left"><a href="http://www.php.net/manual/en/language.operators.bitwise.php" class="link">bitwise</a></td>
        </tr>
        <tr valign="middle">
            <td align="left">left</td>
            <td align="left">|</td>
            <td align="left"><a href="http://www.php.net/manual/en/language.operators.bitwise.php" class="link">bitwise</a></td>
        </tr>
        <tr valign="middle">
            <td align="left">left</td>
            <td align="left">&amp;&amp;</td>
            <td align="left"><a href="http://www.php.net/manual/en/language.operators.logical.php" class="link">logical</a></td>
        </tr>
        <tr valign="middle">
            <td align="left">left</td>
            <td align="left">||</td>
            <td align="left"><a href="http://www.php.net/manual/en/language.operators.logical.php" class="link">logical</a></td>
        </tr>
        <tr valign="middle">
            <td align="left">left</td>
            <td align="left">? :</td>
            <td align="left"><a href="http://www.php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary" class="link">ternary</a></td>
        </tr>
        <tr valign="middle">
            <td align="left">right</td>
            <td align="left">= += -= *= /= .= %= &amp;= |= ^= &lt;&lt;= &gt;&gt;=</td>
            <td align="left"><a href="http://www.php.net/manual/en/language.operators.assignment.php" class="link">assignment</a></td>
        </tr>
        <tr valign="middle">
            <td align="left">left</td>
            <td align="left">and</td>
            <td align="left"><a href="http://www.php.net/manual/en/language.operators.logical.php" class="link">logical</a></td>
        </tr>
        <tr valign="middle">
            <td align="left">left</td>
            <td align="left">xor</td>
            <td align="left"><a href="http://www.php.net/manual/en/language.operators.logical.php" class="link">logical</a></td>
        </tr>
        <tr valign="middle">
            <td align="left">left</td>
            <td align="left">or</td>
            <td align="left"><a href="http://www.php.net/manual/en/language.operators.logical.php" class="link">logical</a></td>
        </tr>
        <tr valign="middle">
            <td align="left">left</td>
            <td align="left">,</td>
            <td align="left">many uses</td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>]]></description>
      <pubDate>Tue, 20 Oct 2009 14:52:32 +0300</pubDate>
      <link>http://www.lescinskas.lt/lt/blog/entry/paulius/php-loginiai-operatoriai-ir-operatoriu-eiliskumas</link>
    </item>
    <item>
      <title>Neversijuotų SVN failų trynimas</title>
      <description><![CDATA[<p>Dirbant su versijų kontrolės sistema Subversion (SVN) pasitaiko atvejų, kai tenka ištrinti failus, neįtrauktus į versijų kontrolę.</p>
<p>Pavyzdžiui, perjungiant (switch) į kitą šaką (branch), ar turint nereikalingų failų, juos ištrinti galima komanda (veikia Unix sistemose):</p>
<pre class="brush:bash">
svn status --no-ignore | grep '^\?' | sed 's/^\? //' | xargs rm -rf</pre>
<p>Ši komanda ištrins net ir tuos failus, kurie buvo direktorijoje su svn:ignore savybe (property), atitnkančia tuos failus.</p>]]></description>
      <pubDate>Thu, 15 Oct 2009 14:44:16 +0300</pubDate>
      <link>http://www.lescinskas.lt/lt/blog/entry/paulius/neversijuotu-svn-failu-trynimas</link>
    </item>
  </channel>
</rss>
