Mar 17, 2005
Skaitās varen laba filma. Par viltībām, noslēpumiem, intrigām. Nu, tā kā Infernal Affairs, tikai bez ķīniešiem. Bet nu, pēc iespaidīgās iepriekšējās filmas noskatīšanās likās - nekas pārmērīgi dižs.
Skaitās varen laba filma. Par viltībām, noslēpumiem, intrigām. Nu, tā kā Infernal Affairs, tikai bez ķīniešiem. Bet nu, pēc iespaidīgās iepriekšējās filmas noskatīšanās likās - nekas pārmērīgi dižs.
Ļauna, ļauna, ļauna. Patika atstāja iespaidu. Stanley Kubrick, kā nekā.
Drusciņ komēdija, drusciņ drāma, drusciņ romantika. Rādās, ka Džūda Lovs laikam grib Hjū Grāntam atņemt viņa ierasto tēlu - šarmanto, dīkdienīgo sieviešu magnētu. Pa laikam tās izdarības gan likās pārāk uzspēlētas. Filmas beigās nonākam pie slēdziena - vīrieši - cūkas.
http://imdb.com/title/tt0375173/
Kārtīga Ziemassvētku pasaka. Par cilvēkbērnu, kurš izaudzis pie salaveča un rūķīšiem un kļuvis par lielo vientiesīgo labsirdīgo rūķi, uzzin par savu īsto izcelsmi un dodas uz cilvēku pasauli meklēt savu īsto tēvu.
Ļoti jau bērnišķīgi, un nav arī gluži īstā sezona, bet tāpat forši.
http://imdb.com/title/tt0319343/
Ļaunās vēstis jau visi zinām. Patika pirmais Slashdot komentārs un tā vērtējums -
Tiek organizēta naudas vākšanas akcija ES Padomes piekukuļošanai - jo rādās, ka tikai tā tur kaut kas notiek.
Šorīt kaut kā neizdodas vairāk par 2,5 - 2,7 MB/s izspiest, laikam vēl kāds bez manis kaut ko velk.
Pa laikam gadās redzēt citu cilvēku rakstītus PHP skriptus, un tad parasti sanāk skrāpēt galvu. Redzot, līdz kādiem absurdiem "risinājumiem" dažkārt nonāk, domāju, jāpadalās ar to, ko pats esmu iemācījies/sapratis par PHP koda rakstīšanu. Sākumā domāju, ka varētu rakstīt apjomīgu pamācību trīs sējumos, bet tam tomēr esmu par slinku. Savu stilu un saprašanu uzspiedīšu īsos padomos un piemēros.
Vēlos pastāstīt par visu ko, bet nu sākšu ar sāpīgāko - rezultāta dokumenta formēšana, datu izvade. Ar šo domāta PHP skripta izpildes pēdējā daļa - tā, kurā skripta sagatavotie rezultāti tiek pārvērsti kaut kādā izejas dokumentā - kas visbiežāk ir html formātā.
Līdzīgi kā visapkārt runā, ka saturu jāatdala no izskata (html & css), PHP skriptos ir ļoti ieteicams rezultātu sagatavošanu strikti atdalīt no gala dokumenta formēšanas. Dokumenta formēšanai izmantot sagatavi, kas atrodas savā, atsevišķā sagatavju mapē un ir atbildīga tikai par datu attēlošanu nevis apstrādi. Lietojot šādu nodalījumu, lielākais ieguvums ir - gala dokumenta izskatu var labot, neaiztiekot skripta "loģiku", to var darīt arī cilvēks, kam nav liela saprašana no PHP. Un otrādi - datu atlasi, apstrādi var labot, nejaucoties dokumenta izskatā. Viss kārtīgi un kā pie cilvēkiem.
Datu apstrādes un dokumenta formēšanas atdalīšanai, kamēr nekas modernāks nav izgudrots, lieto sagataves. Lietošanai ar PHP ir sarakstīti daudzi sagatavju dzinēji, viens no pazīstamākajiem ir Smarty.
Der atcerēties, ka pats PHP, visā visumā, ir sagatavju dzinējs. Vismaz man dokumentu formēšanai vienmēr ir atliku likām pieticis ar PHP iespējām un nav bijis vajadzības pēc kāda papildus sagatavju dzinēja. Turpinājumā vēlos nodemonstrēt dažas ērtas, datu izvadam piemērotas PHP iespējas, kā arī dažus lielus no-no.
dokuments www_root/userlist.php:
<?php require_once('config.php'); // konstantes, celji, DB savienojums u.c. // piesleedzu konkreetajai reizei nepiecieshamaas "biblioteekas" require_once(DB.'/users.php'); // skripta galvenaa dalja - sagatavoju rezultaatus $userlist = get_userlist(); // piesleedzu sagatavi, kas saformees lapu, tajaa ieklaujot datus // no masiiva $userlist require(TEMPLATES.'/userlist.php'); ?>
dokuments templates/userlist.php
<?php include('global/header.php') ?> <?php if (isset($title)): ?> <h1><?= $title ?></h1> <?php else: ?> <h1>List of users</h1> <?php endif; ?> <table> <tr> <th>Name</th><th>E-mail</th> </tr> <?php foreach($userlist as $user): ?> <tr> <td><?= $user['name'] ?></td> <td><?= $user['email'] ?></td> </tr> <?php endforeach ?> </table> <?php include('global/footer.php') ?>
Pirmais dokuments atrodas publiski pieejamajā mapē un tas ir tas, kurš saņem pieprasījumu. Viņš sagatavo datus un tad izsauc atbilstošo sagatavi. Sagatave pati neglabājas publiski pieejamā vietā.
Kā grāmatās: Un tagad es dzirdu jūs saucam - kas tas? Un ko nozīmē šis? Kas tie par ķeburiem?
Par visu pēc kārtas! :)
Teksti lielajos burtos (DB, TEMPLATES) ir konstantes. Par php konstantēm var palasīt šeit PHP manual - constants. Abas lietotās konstantes ir nodefinētas failā config.php un tās šajā gadījumā norāda ceļus uz vietām, kur var atrast datubāzes bibliotēkas un sagataves. config.php arī izveido datubāzes savienojumu, definē dažas bieži izmantotas funkcijas u.c.
Funkcija get_userlist() manā piemērā atgriež masīvu, kura katrs elements ir asociatīvs masīvs ar datiem par lietotāju. Tā saturs izskatās apmēram šādi:
$userlist = [ ["name" => "Jānis", "email" => "j@one.lv"], ["name" => "Jānis", "email" => "j@one.lv"], ... ]
Asociatīvie masīvi ir ērti gan datubāzes atlasēs, gan vēlāk sagatavēs
Sagatave pamatā sastāv no html koda, ar šur tur iespraustiem PHP gabaliņiem, atšķirībā no galvenā skripta, kas bija viss viens PHP gabals. Interesantākais, ko varam ievērot sagatavē, ir neparastā kontroles struktūru sintakse. Par to varam palasīt šeit - PHP manual - Alternative syntax for control structures. Labums, salīdzinot ar parasto pierakstu, ir vieglāk lasāmāks izskats, ja pa vidu nāk ne-php gabali. Salīdzinām:
<?php if (isset($title)) { ?> <h1><?= $title ?></h1> <?php } else { ?> <h1>List of users</h1> <?php }; ?>
un,
<?php if (isset($title)): ?> <h1><?= $title ?></h1> <?php else: ?> <h1>List of users</h1> <?php endif; ?>
Pieraksts <?= $title ?>
pasaka - izvadiet man mainīgā $title
vērtību un ir līdzvērtīgs šādam - <?php print $title; ?>
, tikai ir īsāks un lasāmāks.
Kopš es izlasīju par foreach, liekas, vairs nav bijis vajadzības pēc parastā for
cikla. Ērti, lasāmi. Lasām šeit - PHP manual - foreach.
Lai apskatītais piemērs būtu iztirzāts visā pilnībā, vēl jāpiebilst, ka failā /templates/global/header.php
ir dokumenta sākums ar visām pienācīgajām lietām, un, attiecīgi, failā footer.php
- dokumentas beigas.
<?php if (!isset($without_close)) print "</div> <!-- closing div id=\"content\" -->\n";//FIXME uncomment as soon as ready print "<div id=\"footer\" class=\"$TEXT_DIRECTION\">"; print "\n\t<br /><div align=\"center\" style=\"width:99%;\">"; print_contact_links(); print "\n\t<br /><a href=\"http://www.phpgedview.net\" target=\"_blank\"><img src=\"".$PGV_IMAGE_DIR."/".$PGV_IMAGES["gedview"]["other"]."\" width=\"100\" height=\"45\" border=\"0\" alt=\"PhpGedView Version $VERSION $VERSION_RELEASE - $PGV_DATABASE\" title=\"PhpGedView Version $VERSION $VERSION_RELEASE - $PGV_DATABASE\" /></a><br />"; print "\n\t<br /><a href=\"$PHP_SELF?view=preview&$QUERY_STRING\">".$pgv_lang["print_preview"]."</a>"; print_help_link("preview_help", "qm"); print "<br />"; if ($SHOW_STATS) print_execution_stats(); if ($buildindex) print " ".$pgv_lang["build_error"]." <a href=\"editgedcoms.php\">".$pgv_lang["rebuild_indexes"]."</a>\n"; if ((count($pgv_changes) > 0) and (userCanAccept(getUserName()))) { print "<br />".$pgv_lang["changes_exist"]. " <a href=\"#\" onclick=\"window.open('gdbi_changes.php','','width=600,height=600,resizable=1,scrollbars=1'); return false;\">". $pgv_lang["accept_changes"]."</a>\n"; } print "</div>"; print "</div> <!-- close div id=\"footer\" -->\n"; ?>
Šausmīgākā lieta - kods tiek izvadīts ar print
operatoru. Izskatās pēc kakas, redaktors neiekrāsos html sintaksi, strādā lēnāk.
Otra lieta - šajā fragmentā pa vidu pavīd funkcijas print_contact_links()
,
print_execution_stats()
u.c. Te uzskatāmi redzams, no kā jācenšas izvairīties - datu izvade saputrota kopā ar ieguvi un apstrādi. Ar to var sadzīvot mazos, vienkāršos skriptiņos, bet lielākās sistēmās, šādi rakstot, ar laiku kods paliek nelasāms, grūti pārvaldāms, izmētāts, un kļūdas arī grūti atrast.
Pārrakstot šo fragmentu, lai izbēgtu no pirmās problēmas (un šo to izmetot), ieguvu:
<?php if (!isset($without_close)): ?> </div> <!-- closing div id="content" --> <?php endif; ?> <div id="footer_line"> </div> <div id="footer" class="<?= $TEXT_DIRECTION ?>"> <?php print_contact_links(); ?> <?php if ($SHOW_STATS) print_execution_stats(); ?> <?php if ($buildindex): ?> <?= $pgv_lang["build_error"] ?> <a href="editgedcoms.php"> <?= $pgv_lang["rebuild_indexes"] ?> </a> <?php endif; ?> <?php if ((count($pgv_changes) > 0) and (userCanAccept(getUserName()))): ?> <?= $pgv_lang["changes_exist"] ?> <a href="#" onclick="window.open('gdbi_changes.php','','width=600,height=600,resizable=1,scrollbars=1'); return false;"> <?= $pgv_lang["accept_changes"]; ?> </a> <?php endif; ?> </div> <!-- close div id="footer" -->
Necenšos mācīt dzīvot, kā arī neapgalvoju, ka veids, kā es datu TO, ir vienīgais pareizais. Gaidīšu komentārus!
Rosetta ir tiešsaistes sistēma programmatūras lokalizēšanai, tulkošanai.
Tulkoju Synaptic
- un, ļaunā priekā, nevienai terminu komisijai padomu neprasot, vārdu "Repository" visur iztulkoju kā - "Krātuvīte"!
Oriģināls. Izvācam žargonu, palabojam stilu, sanāk -
Šodien man darbā nebija ko darīt. Jaunus darbus man nedod. Šodien mans pamatuzdevums bija sakārot savu darba vietu un sagaidīt, kad kolēģis beigs darbu, lai pārinstalētu viņa datoru (sākušās problēmas ar vīrusiem).
Nolēmu paprogrammēt.
Daudzi zin laacz veidoto paste.php.lv. Laba vietiņa, kur noglabāt koda gabaliņus. Tomēr noglabāto dažkārt ir grūti atrast, un tur nepiedien glabāt ko citu, kā tikai programmu fragmentus. Tāpēc nolēmu uztaisīt savu sistēmu.
paste.php.lv datus glabā teksta failos, bet es nolēmu izmantot mysql datubāzi. Kāda atšķirība? Tikai tā, ka nu būs jācenšas izsargāties no mysql injekcijām.
Aizsardzībai izmanotoju
addslashes()
funkciju. Tā pasargā no bīstamiem vaicājumiem, kas satur visādas pēdiņas.
Lai beigās kods izskatītos kā sākumā (bez liekām slīpsvītrām), pirms izvada tiek lietota funkcijastripslashes()
.
Visbeidzot, sintakses iekrāsošanai lietoju funkcijuhighlight_string()
(laacz izmantojahighlight_file()
). Līdz ar to esmu ieguvis normālu koda un parasta teksta izvadi.Nākošais uzdevums - panākt, lai tas viss labi izskatītos. Ja katrs ieraksts tiktu rādīts jaunā lapā, tos caurskatīt būtu visai neērti, tāpēc sākumā tiek rādīti tikai ierakstu virsraksti, bez teksta. Šim nolūkam izmantoju coders.lv forumā apspriesto ideju par bloku slēpšanu - papētīju lapu, nokopēju kodu un tagad pie manis viss strādā bez lapas pārlādēšanas.
Ak jā - pats sakodētais darbs atrodams te.
P.S. Tiem, kas nemācēs uzvesties, tiks bloķētas IP adreses gan uz šo lapu, gan uz manu dienasgrāmatu.
Un vēl, pilnai laimei - salīdzinājums.
Šis ir viens piemērs. Diemžēl, latvju "blogosfērā" šādu piemēru netrūkst. Nu, ar laiku jūs novērtēsiet to, ka skolā ar varu spieda lasīt grāmatas un rakstīt domrakstus.
Mans labojums arī nebūt nav ideāls, nekāds dižais literāts no manis nesanāk. Atceros, skolā, pēc ilgi mocīta, rakstīta un pārrakstīta domraksta labošanas skolotāja man pajautāja - "tu to darbu vispār esi lasījis?"
~ mēnesi nostaigāju bez telefona un, visā visumā, lieliski jutos. Tomēr, laikam ejot, sabiedrības spiediens un tieksme uz spīgīgām rotaļlietām piespieda iegādāties jaunu sakaru līdzekli. Nopirku Nokia N-Gage - spēļu konsoli, kurai, visa kā cita starpā, ir arī iespēja to lietot kā telefonu.
Es skatījos un skatījos uz Latviešu Lokalizācijas Komandas lapu un man dikti sakārojās kaut ko lokalizēt. Domāts - darīts. Pārtulkoju Blam! - tas bija ātri. Paskatījos - izskatījās vareni. Ņēmos tulkot gFTP, bet tur ir krietni vairāk ko tulkot un, kad biju apmēram trešdaļai pāri, galīgi pieriebās. Gan jau pāries, un varēs pamazām tulkot tālāk. Skatījos pēc kaut kā, kur mazāk jātulko, un paņēmu, apstrādāju Gnome Volume Manager. Lūk, var paskatīties, kā daiļi izskatās:
Tai bildītei var spiest virsū un dabūt lielāku. Tad top redzams, ka man manā blamā ir iedabūts cibiņa cu_p draugu žurnāls. To dabūt gatavu nebija pārāk grūti, S2 stilu sistēma ir drausmīgs, ne pārāk labi dokumentēts monstrs, tomēr ar viņu var izdarīt varenas lietas.
Ja vēlies arī savu draugu žurnālu dabūt RSS barotnes veidā, - tas ir pavisam vienkārši. Iedomāsimies, ka es esmu, piemēram, cibiņš lix
. Lai tiktu pie kārotās barotnes, man nāksies uztaisīt savu stilu (joki mazi). Tātad, ejam uz SC uzlabotās pielāgošanas centru, veidojam jaunu stilu. Jaunajam stilam norādām, ka jāizmāno slānis (Layer) "Other", un ierakstām slāņa id: 2576:
Kad stils gatavs, jāuzzin, kāds id numuriņš viņam piešķirts. Eju uz "Your Styles" un ieraugu:
Mans maģiskais cipariņš ir 7876. Lieliski, tagad varu sakomponēt savu draugu RSS barotnes adresi: http://journal.bad.lv/~lix/friends?s2id=7876
Šajā adresē nevar vienkārši nomainīt to lix ar savu lietotājvārdu un gaidīt, ka nu visam jāstrādā - šādi, ar s2id parametru var norādīt tikai stilus, kas pieder attiecīgā žurnāla īpašniekam (lix'am šajā gadījumā). Uztaisi savu stilu, un varēsi to piemērot savam žurnālam.
Te jau laikam nekādus komentārus nevajag, visi redzējuši. Nav arī nekā īpaši ko piebilst, tikai tas, ka pēc šīs filmas The Day After Tomorrow izskatās pēc briesmīga plaģiāta.
Kad sakrusto Identity ar The Recruit - tad dabū Mindhunters. Treniņa nolūkos 7 topošos FBI darbiniekus izsēdina vientuļā salā - milzīgā mācību poligonā. Un tad viņus pa vienam sāk galināt nost, visi tur aizdomās visus un tā.
Ja nebūtu visai paredzami un vietām diezgan muļķīgi, būtu ļoti labi.
Uz beigām daudz kāvās. Gladiators un Troja redzēti, likās - "ā, nu viss kā parasti". Gara. Kaujas ainas būtu patiešām izdevušās, ja smuki rādītu, kā zobeni duras ādā, kaujas vāles izšķaida miesu un locekļi lido pa gaisu. Zobenu vicināšanas bija, gārdzieni bija, bet nevienu dūrienu tā kārtīgi neparādīja. Tas laikam, lai var mazus bērnus vest uz filmu.
http://imdb.com/title/tt0349683/