Straipsnis apie PDF generavimą su PHP

Webmonkey turi gana neblogą straipsniuką apie PDF generavimą su PHP. Tiesa, pusė to straipsnio yra apie įdiegimą (kuris pasirodo yra baisiai sudėtingas), o kita — apie jo vartojimą.

Skaitant tą straipsnį iškilo man mintis ar Perle irgi taip įmanoma padaryti. Trumpas apsilankymas pas CPAN, perl -MCPAN -e 'install PDF::Create' ir jau turiu modulį PDF generavimui Perle. Štai Perlinis kodas, sugeneruojantis PDF dokumentą (pavyzdį galit matyti čia):

#!/usr/bin/perl
use strict;
use PDF::Create;
my $pdf = new PDF::Create('filename' => 'out.pdf',
                          'Version'  => 1.2,
                          'PageMode' => 'UseOutlines',
                          'Author'   => 'moxliukas',
                          'Title'    => 'Testas');
my $root = $pdf->new_page('MediaBox' => [0, 0, 612, 792]);
my $page = $root->new_page;
my $f1 = $pdf->font('Subtype'  => 'Type1',
                       'Encoding' => 'WinAnsiEncoding',
                       'BaseFont' =>'Helvetica');
$page->stringc($f1, 40, 306, 426, "Petras Kudaras");
$pdf->close;

Laikinoji atmintinė su PHP

Ši svetainė šiuo metu yra generuojama visiškai dinamiškai, t.y. užduodama krūva SQL klausimų, paimamas šablonas ir pagal jį sukonstruojamas puslapis. Visa tai labai gerai, kai lankytojų skaičius nedidelis (o lankytojų skaičius čia nėra didelis – apie 100-150 unikalių lankytojų per parą. Tad sumąsčiau, kad reikėtų pasidaryti šiokią tokią laikinosios atmintinės (kešavimo) sistemą, ir bent jau RSS naujienų negeneruoti dinamiškai. Kol kas to nereikia ta prasme, kad serveris puikiai dar viską paveža (nors tą serverį sunkiai apsiverčia liežuvis serveriu vadint – mano skaičiavimo mašinėlė turbūt greitesnė yra), tačiau kaip visada šioje svetainėje viską darau tik eksperimentuodamas ;)

Kaip tik radau aprašymą kaip Simon Willison išspręndė laikinosios atminties problemą su labai paprastu PHP skriptu. Štai visas šis kodas:

<?php
$cachefile = 'cache/index-cached.html';
$cachetime = 5 * 60;
// Jei atmintyje esantis puslapis yra jaunesnis nei $cachetime, tai pateikiame jį iš atminties
if (file_exists($cachefile) && time() - $cachetime < filemtime($cachefile)) {
    include($cachefile);
    echo "<!-- Kopija iš atminties, sugeneruota ".date('H:i', filemtime($cachefile))." -->\n";
    exit;
}
ob_start(); // Įjungiame išvedimo buferį

/* Čia įdedame kodą, kuris generuoja dinaminį puslapį */

// Įrašome visa tai kas sukaupta buferyje į atmintį (į bylą)
$fp = fopen($cachefile, 'w');
fwrite($fp, ob_get_contents());
fclose($fp);
ob_end_flush(); // Siunčiame išvedimo buferį naršyklei
?>

SMTP pakaitalas

DzHiBaS atsiuntė man nuorodą į straipsnį iš joelonsoftware.com apie tai, kad reikia iš esmės pakeisti SMTP (elektroninio pašto) protokolą, nes tai būtų vienintelė efektyvi priemonė kovoje prieš „spam’ą“. Naujasis protokolas turėtų būti saugus, pagrįstas sertifikatų sistema bei mikromokesčiais, kurie padarytų masinį laiškų siuntinėjimą tiesiog nepelningu. Problema slypi tame, kad priversti žmones pereiti prie naujo protokolo bus sudėtinga. Tam turi būti perrašytos visos elektroninio pašto klientų programos, bei serveriai, o tai kainuoja daug. Be to ir patys žmonės inertiški, tad vienintelis būdas būtų tiesiog nustatyti datą, nuo kada SMTP tiesiog nebeveiktų. Kažkaip kol kas skeptiškai žiūriu į tokią galimybę.. juk kol kas ir FIDONET sistema dar veikia ir gyvos galybės kitokių liekanų iš praeito tūkstantmečio.

Plačiau apie tai ZDNet straipsnyje.

Lietuviškas Weblogas apie technologiją

Užklydęs į BlogShares (kuris pats savaime yra atskiras projektas, reikalaujantis atskiro aprašymo) tarp geriausiųjų žaidėjų pamačiau ir lietuvišką pavardę – Edmundas Mišeikis. Pasirodo jis vilnietis ir netgi turi savo internetinį dienoraštį pavadinimu Whispering, kuriame rašo apie su technologija susijusius dalykus. Tiesa, liūdna, kad jis angliškas (aš pastaruoju metu pastebiu kad vis tampu kažkokiu didesniu patriotu ir esu visom keturiom už lietuviško interneto gerinimą ;). Štai pačios svetainės pateiktas apibūdinimas:

Whispering consolidates some knowledge in development of web applications. A personal notebook and a wiki based reference for friends and colleagues.

Na, kiek supratau interneto programų kūrimas čia pateikiamas iš Java programuotojo pusės. Šiaip ar taip, tai lietuviška (emmm… angliška)

Mozillos Prefbar įrankių juosta

Šiandieną gavau elektroninio pašto laišką iš Artūro Šlajaus, kuris man priminė, kad niekur savo svetainėje nesu minėjęs Mozillos PrefBar įrankių juostos. Džiugu, kai tavo svetainę pradeda lankyti ir ja domėtis ne vien tavo gerai pažįstami žmonės.

Mozilla PrefBar yra naudinga įrankių juosta, pritaikyta daugiau paprastiems naršytojams nei interneto programuotojams (kaip kad jau anksčiau aprašytas pnhToolbar). Aš pats PrefBar naudojuosi jau geras mėnuo, ir jis tikrai man pravertė. Pagrindinis PrefBar privalumas manau yra jo galimybė prisitiaikyti jį savo reikmėms. PrefBar’e galima nurodyti kiek jam suteikti funkcionalumo, o tas labai patogu, nes jei retai naudojatės kokia nors funkcija, ją galite tiesiog paslėpti, kad nesimaišytų po akimis. PrefBar atlieka su naršymu susijusias funkcijas: juo galima išvalyti laikinąją atmintinę (cache), naršymo istoriją, vienu spragtelėjimu išjungti paveiksliukus, flash, JavaScript ir iššokančius langus.

Tikrai vertas dėmesio dalykas.

PHP FAQ idėja

Su Lakūnu sugalvojom, kad reikia labai dažnai užduodamų PHP klausimų sąrašo, nes tie patys klausimai dažnai kartojasi tie patys per tą patį. Idėja paprasta: rinkti užduodamus klausimus #php kanale ir sudėti juos į duomenų bazę. Jei vėl pasikartoja toks pats klausimas, užteks tik papastinti linką (na… mes tikimės kad užteks… Turbūt nelabai). Žodžiu turėtume palengvint sau gyvenimą nebeatsakinėdami į tą patį klausimą dešimtąjį kartą. Bent jau teoriškai turėtumėm palengvint sau gyvenimą. ;)

#php susitikimas

Šios dienos #php kanalo tema:

2003 gegužės 16 d. (penktadienis) – preliminari #PHP meeto data… Vieta? Rotušėlė? Preliminarûs dalyviai: MrTenente, Nightblade, scooox, moxliukas, … Veiksmo vietos, idejos labai priimamos ;]

Va #php susitikimo jau seniai trūko. O juk pernai kiekvieną penktadienį toks vykdavo. Tikiuosi į šį susitikimą ateis daug žmonių („daug“ – tai bent kokie 8-10), nes poreikis tam kaip ir yra ;)

Tiesa, nežinau kaip dėl „Rotušėlės“. Mane jos atžvilgiu kankina dvi prieštaringos mintys: viena vertus „Rotušėlė“ yra nekoks kabakas su nekokiu aptarnavimu ir panašiai, o kita vertus – tai #php tradicija.

PHP print revisited

Paskaitęs mano rašliavas apie PHP print() funkciją, Lakūnas nurodė man atitinkamą manualo skyrių ir pasirodo, kad print() yra operatorius. Va čia tai buvo netikėta. Jau man galvoj nebesutelpa viskas :/

Nors print() ir yra operatorius, echo() yra šiaip kalbos dalis. Štai <?php print print 'foo'; ?> spausdina „foo1“ – kaip ir tikėtasi, tuo tarpu <?php print echo 'foo'; ?> meta klaidą „Parse error: parse error, unexpected T_ECHO“

Vogtos idėjos iš CGI::Application

CGI::Application yra puikus modulis Perlui, kuris leidžia išvengti ilgų „if/elsif/else“ blokų pagrindinėje web programos byloje. Pagrindinės bylos (tarkim index.pl) tikslas yra nuspręsti, kurį kodą vykdyti. Tarkime, per HTTP GET kintamąjį op perduodama informaciją, koks kodas turi būti įvykdytas. Tokiu atveju paprastas index.pl atrodytų kažkaip taip:

#!/usr/bin/perl -w
use CGI;
my $r = new CGI;
if($r->param('op') eq 'forumas') {
	# forumo kodas
} elsif($r->param('op') eq 'naujienos') {
	# naujienų kodas
} ...
...

Žodžiu po truputį viskas tampa didele koše (šios svetainės kol kas būtent taip ir atrodo). Su CGI::Application viskas daug gražiau ir paprasčiau: kiekvienam svetainės „moduliui“ sukuriamas atskiras Perlo modulis, o index.pl tik automagiškai užkrauna tą modulį ir jį paleidžia.

Ar galima kažką panašaus padaryt su PHP? Taip. Šitokį automagišką klasių užkrovimą teko matyti Flexi kode, tad tai tikrai ne nauja idėja. Tiesa, aš pats nesu nieko panašaus daręs, tad čia daugiau teoriniai pamąstymai.

Pirma reiktų apsirašyti index.php. Jo tikslas – nuspręsti, kurią klasę užkrauti, ir kam perduoti kontrolę. Tad galbūt užtektų tokio kodo:

<?php 
$galimos_klases = array('foo', 'bar');  # Čia reiktų imti iš kokio nors konfigūracinio failo.
if(isset($_GET['op']) && 
   in_array($_GET['op'], $galimos_klases) &&
   is_file($_GET['op'].'.class.php')) {
	include_once($_GET['op'].'.class.php');
	$foo =& new $_GET['op']();
	print $foo->output();
}
?>

Šis kodas faktiškai turėtų inkludint atitinkamas bylas, jei $_GET['op'] yra foo arba bar. Po inkludinimo, ji inicijuoja atitinkamą klasę (per $foo = new $_GET['op']();) ir iškviečia tos klasės funkciją output(). O šta čia kažkas panašaus į pačią foo.class.php bylą:

<?php
class foo {
	function foo() { }
	function output() {
		return "Aš iš foo klasės";
	}
}
?>

Šioje klasėje aprašome konstruktorių (kurs nieko nedaro) ir funkciją output(), kuri atspausdina vieną sakinį. Jei viskas eina pagal planą, iškvietus index.php?op=foo turėtų paleisti šią klasę. Bet tai tik teoriniai samprotavimai, šis kodas realiai nebandytas ;)

CSS rolloveriai

Kažkas #php kanale paklausė, kaip įmanoma padaryti su CSS, kad pasikeistų lentelės langelio fonas. Šiek tiek pasikrapštęs (aišku galėjau paieškot internete, bet su GPRS gyvenu) sukurpiau panašų dalyką, visai be lentelių. Kiek bandžiau, jis veikia su IE6.0, Opera 7.0 ir Phoenix0.5 (tiksliau beveik 0.6 – kažkoks naktinis buildas). Štai šio dalyko kodas:

<style type="text/css">
.list { margin: 0ex; padding: 0ex; }
.list li { 
	border: 1px solid #333; 
	background: #999; 
	color: #333;
	display: block;
	float:left;
}
.list li a {
	padding:0.0em 1em 0.0em 1em;
	color: #333;
	background: #999;
	text-decoration: none;
}
.list li a:hover { background: #ccc; color: #333; }
</style>
<ul class="list">
<li><a href="foo">foo</a></li>
<li><a href="bar">bar</a></li>
<li><a href="baz">baz</a></li>
</ul>

W3C CSS validatorius sako, kad šiame CSS klaidų nėra. Visas šis dalykas padarytas su nesunumeruotu sąrašu (<ul> ir <li>. Tai iš HTML pusės). Klasei „list“ nustatytos nulinės paraštės (nes pagal nutylėjimą <ul> yra pridedama nemaža paraštė iš kairės). Visa magija, kurios pagalba <li> neišsidėsto vertikaliai yra eilutėse display: block; ir float: left;.

Visa problema su IE yra tame, kad jis leidžia uždėti :hover tik „<a>“ elementui. Lengviausia būtų uždėti skirtingą foną elementui .list li:hover, bet tai neveiks IE (o kad ir kaip ten būtų, visgi IE naudoja apie 80% piliečių). Todėl į <li> įdedam <a> ir su CSS jį praplatinam per visą plotį padidindami „padding“. Vienintelis dalykas, kurį liko padaryti – pakeisti foną, pelei užėjus ant nuorodos. Tai aprašoma .list li a:hover elemente.

Tikiuosi bent jau kam nors buvo šiek tiek naudos ;)