oriolrius.cat

Des del 2000 compartiendo sobre…

Category: Development, Models and Methodologies

PHP: com treballar amb fitxers de sistema

Reading time: < 1 minute

No fa gaire vaig publicar un monogràfic sobre els arrays en php. Crec que aquest tipus de monogràfics són molt útil malgrat tinguis molta experiència amb un llenguatge ja que sovint serveixen com una millor manual de referència que l’oficial. Així doncs, ara li toca el torn al tractament de fitxers des de PHP, concretament el monogràfic l’han fet la gent d’IBM. El podeu trobar a The right way to read files with PHP (local html i pdf).

FireBug: complement del firefox perfecte pels programadors de webs

Reading time: 3 – 4 minutes

Pensava que la extenció web developer toolbar del firefox era la bomba, però avui l’Ernest m’ha obert els ulls. Realment el Firebug li dona mil patades. És realment impresionant. El meu no és programar web ni molt menys varallar-me sovint amb els CSS, JavaScript ni HTMLs. Però sovint quan programes aplicacions ASP una eina d’aquestes t’estalvia moltes hores de feina. Per exemple, el model de templates que usa symfony no seria precisament un model WYSIWYG. Així doncs, quan toca escriure codi pelat, el Firebug ens pot fer anar molt al gra. La veritat és que l’Oriol ho hagués agraït en algún moment en que depurava un codi JavaScript, oi Oriol?

firebug.gif

Les funcions del Firebug són tantes que fa fins hi tot mandre repassar-les, però en faré una breu llista a base de copy/paste:

  • Firebug is always just a keystroke away, but it never gets in your way. You can open Firebug in a separate window, or as a bar at the bottom of your browser. Firebug also gives you fine-grained control over which websites you want to enable it for.
  • Inspect and edit HTML Firebug makes it simple to find HTML elements buried deep in the page. Once you’ve found what you’re looking for, Firebug gives you a wealth of information, and lets you edit the HTML live.
  • Tweak CSS to perfection Firebug’s CSS tabs tell you everything you need to know about the styles in your web pages, and if you don’t like what it’s telling you, you can make changes and see them take effect instantly.
  • Visualize CSS metrics When your CSS boxes aren’t lining up correctly it can be difficult to understand why. Let Firebug be your eyes and it will measure and illustrate all the offsets, margins, borders, padding, and sizes for you.
  • Monitor network activity Your pages are taking a long time to load, but why? Did you go crazy and write too much JavaScript? Did you forget to compress your images? Are your ad partner’s servers taking a siesta? Firebug breaks it all down for you file-by-file.
  • Debug and profile JavaScript Firebug includes a powerful JavaScript debugger that lets you pause execution at any time and have look at the state of the world. If your code is a little sluggish, use the JavaScript profiler to measure performance and find bottlenecks fast.
  • Quickly find errors When things go wrong, Firebug lets you know immediately and gives you detailed and useful information about errors in JavaScript, CSS, and XML.
  • Explore the DOM The Document Object Model is a great big hierarchy of objects and functions just waiting to be tickled by JavaScript. Firebug helps you find DOM objects quickly and then edit them on the fly.
  • Execute JavaScript on the fly The command line is one of the oldest tools in the programming toolbox. Firebug gives you a good ol’ fashioned command line for JavaScript complete with very modern amenities.
  • Logging for JavaScript Having a fancy JavaScript debugger is great, but sometimes the fastest way to find bugs is just to dump as much information to the console as you can. Firebug gives you a set of powerful logging functions that help you get answers fast.

PHP: notes sobre arrays i tres classes (myCurl, barcodes, WSSoapClient)

Reading time: 2 – 3 minutes

A HowtoForge han publicat un howto (local) sobre com funcionen els arrays en PHP que esta molt bé. Realment el que més valoro són les notes sobre les funcions que menys s’acostumen a usar i per tant, les menys documentades o més mal documentades. Tot i que sovint quan les descobreixes ja no pots viure sense elles, funcions de búsqueda, de push, pop, var_dump per depurar, etc.

A més a través de phpClasses he trobat tres classes que els hi he de donar un bon cop d’ull ja que tenen molt bona pinta:

  • MyCurl This class provides an alternative implementation of the cURL extension functions in pure PHP. It automatically detects whether the cURL library is available. If it is not available, it defines several functions with the same names of the cURL extension that use the class to emulate part the original functionality. Currently it implements the functions: curl_init, curl_exec, curl_setopt and curl_close. Several of the most important options can be set with the curl_setopt function.
  • HTML Bar Codes This package can be used to display bar codes using only HTML with CSS styles. It takes a code to represent and generates CSS style definitions and HTML tags to render that code in an HTML page. There are two classes that can render bar codes using the Code39 and Interleave 2 of 5 standards respectively.
  • WSSoapClient This class can add WSSecurity authentication support to SOAP clients implemented with the PHP 5 SOAP extension. It extends the PHP 5 SOAP client support to add the necessary XML tags to the SOAP client requests in order to authenticate on behalf of a given user with a given password. This class was tested with Axis and WSS4J servers.

SOAP amb Symfony

Reading time: 2 – 3 minutes

symfony.gif

Fa uns mesos vaig implementar una aplicació amb força connexions SOAP tan a nivell de client, com de servidor contra aplicacions .NET i aplicacions SOAP fetes en Symfony mateix. Malgrat funcionen prou bé, he de reconeixer que la implementació SOAP de PHP fins a la versió 5.2.0 que és la última que he provat dona alguns problemes. Ja no quan es comunica amb .NET sinó quan parlo amb ella mateixa. Puc assegurar que no és culpa del codi, perquè l’estructura client servidor de la que parlo feia més de 200 transaccions diaries de les quals unes 10 o 20 fallaben, per errors de l’estil Error Fetching http headers. De fet, investigant vaig trobar algún que altre BUG intern de PHP que comentava el problema, però segons deien a PHP ja estava solucionat. Doncs a mi em continuaven donant. Finalment el que vaig fer per solucionar-ho va ser eliminar SOAP a tot arreu d’on vaig poder, ara mateix no tinc ni un error d’aquest estil i es continuen fent unes 200 transacions diaries o més.

Malgrat aquesta no massa bona experiència, continuo pensant que la idea és boníssima i que cal seguir treballant amb ella. Doncs bé, quan vaig implementar el servidor SOAP via Symfony no vaig trobar cap tipus de documentació que parles de com fer-ho bé. Així doncs vaig improvisar i vaig repartir el codi entre les actions i els templates amb tan bon criteri com vaig saber, tan per publicar el fitxer WSDL com per publicar el servei SOAP. Ara esta apunt de sortir la versió 1.0 de Symfony i curiosament també s’ha publicat un snippet on es parla de com publicar un servei SOAP desde Symfony. Així doncs, he de reconeixer que la implementació que es fa de la idea en aquest snippet és molt millor que la meva. Per tant, el recomano: Code Snippets: Soap server (local).

HttpClient – PHP Web Client Class

Reading time: 1 – 2 minutes

Aquesta classe ens permet implementar de forma senzillissima un client HTTP 1.0 i 1.1 tan per peticions GET com POST. De fet, fa algo semblant al que que comentava de la classe de perl WWW:Mechanize tot i que amb molt menys detalls. Malgrat això pot ser molt útil per interactuar amb altres webs des del nostre codi en PHP. A més és senzillissim usar aquesta classe. HttpClient implementa les següent funcionalitats.

  • Implements a useful subset of the HTTP 1.0 and 1.1 protocols.
  • Includes cookie support.
  • Ability to set the user agent and referal fields.
  • Can automatically handle redirected pages.
  • Can be used for multiple requests, with any cookies sent by the server resent for each additional request.
  • Support for gzip encoded content, which can dramatically reduce the amount of bandwidth used in a transaction.
  • Object oriented, with static methods providing a useful shortcut for simple requests.
  • The ability to only read the page headers – useful for implementing tools such as link checkers.
  • Support for file uploads.

Per més informació recomano que mireu els exemples que hi ha a la web de la classe és realment simple d’usar.

phpMailer – una classe de PHP per enviar emails

Reading time: 5 – 8 minutes

En PHP quan s’ha d’enviar un email sovint s’usa la funció mail() tot i que aquesta és una mica limitada en quan a paràmetres que se li poden passar al servidor SMTP. Per exemple, temes d’autenticació i xifrat. Via pear hi ha diverses solucions però a vegades cal que la solució que incorpori el nostre aplicatiu sigui independent d’aquest tipus de requisits de sistema. Així doncs phpMailer ens pot servir per sortir de més d’un embolic.

Suporta:

  • Can send emails with multiple TOs, CCs, BCCs and REPLY-TOs
  • Redundant SMTP servers
  • Multipart/alternative emails for mail clients that do not read HTML email
  • Support for 8bit, base64, binary, and quoted-printable encoding
  • Uses the same methods as the very popular AspEmail active server (COM) component
  • SMTP authentication
  • Word wrap
  • Address reset functions
  • HTML email
  • Tested on multiple SMTP servers: Sendmail, qmail, Postfix, Imail, Exchange, etc
  • Works on any platform
  • Flexible debugging
  • Custom mail headers
  • Multiple fs, string, and binary attachments (those from database, string, etc)
  • Embedded image support

Un petit exemple d’ús perquè vegeu el senzill que és usar-lo:

require("class.phpmailer.php");
$mail = new PHPMailer();
$mail->IsSMTP();                                   // send via SMTP
$mail->Host     = "smtp1.site.com;smtp2.site.com"; // SMTP servers
$mail->SMTPAuth = true;     // turn on SMTP authentication
$mail->Username = "jswan";  // SMTP username
$mail->Password = "secret"; // SMTP password
$mail->From     = "from@email.com";
$mail->FromName = "Mailer";
$mail->AddAddress("josh@site.com","Josh Adams");
$mail->AddAddress("ellen@site.com");               // optional name
$mail->AddReplyTo("info@site.com","Information");
$mail->WordWrap = 50;                              // set word wrap
$mail->AddAttachment("/var/tmp/file.tar.gz");      // attachment
$mail->AddAttachment("/tmp/image.jpg", "new.jpg");
$mail->IsHTML(true);                               // send as HTML
$mail->Subject  =  "Here is the subject";
$mail->Body     =  "This is the <b>HTML body</b>";
$mail->AltBody  =  "This is the text-only body";
if(!$mail->Send())
{
   echo "Message was not sent <p>";
   echo "Mailer Error: " . $mail->ErrorInfo;
   exit;
}
echo "Message has been sent";

Aquesta troballa l’he fet a través de l’article phpMailer , a great Email transfer class del blog de Moody Bahrain.

Perl: Template::Extract, Template::Generate i WWW:Mechanize

Reading time: 2 – 4 minutes

perl.png

Normalment no parlo mai de llibreries de Perl, tot i que fa una bona colla d’anys vaig estar usant-lo força. Obviament encara hi havia el PHP3 i el Python no era ni un somni. De fet, no li puc negar la súper potència al Perl simplement el problema que li trobo és que té una sintaxi tan confusa, complexe o espessa, diguem-ho com volguem que si el deixes una temporada després no recordes gairebé res. Però no volia comentar les difícultats que tinc per recordar el que sabia de Perl en aquest article.

Simplement volia aprofitar per referenciar un parell d’articles d’en BrainStorm que parlen d’unes eines que em canviaran la vida la propera vegada que hagi de programar una eina de web spidering. De fet, jo fins ara els anomenava robots, bàsicament eren eines que servien per construir-me bases de dades a partir de webs que disposaben d’informacions molt completes. Per exemple, webs amb reculls de característiques de milers de mòbils.

Les referències als articles:

Les llibreries de les que ens parla en BrainStorm:

  • Template::Extract construïm un template a al aplicar-lo sobre un document HTML ens permet obtenir-ne les dades, sense les etiquetes. De fet, si volem podem fins hi tot escollir quina informació en volem extreure, no tenim perquè extreure-ho tot. Concretament els templates es contrueixen segons la sintaxi que s’anomena TT2.
  • Template::Generate construeix templates estàndars a partir d’un HTML que li passem. Així després només ens cal modificar el template per tal d’ajustar-lo a les necessitats que poguem tenir.
  • WWW::Mechanize podem navegar a través d’una pagina web des de dintre d’un objecte de perl. És genial perquè ens permet arribar a les dades que ens interessa aconseguir de forma completmant transparent. Per exemple, connectem a una web, ens registrem, anem a la zona restringida cliquem a una secció de la web i obtenim la documentació que voliem dintre de l’objecte de perl. Ara si volem li podem aplicar un Template::Extract, per exemple.

Jo diria que es tracta de la trilogia perfecte per generar eines que ens permeten extreure informació de documents HTML. Una altre aplicació que és la que s’ens comenta al segon artícle que he referenciat la creació de resums RSS de pàgines que no disposen d’aquesta funcionalitat.

iCalcreator: classe de PHP per crear fitxers iCal

Reading time: 1 – 2 minutes

ical.png

iCalcreator és una implentació en PHP del RFC2445 que ens permet crear fitxers iCal/xCal. Normalment aquest tipus de fitxers s’usen en sistemes CMS, de gestió de projectes, aplicacions de calendari (p.e. google calendar), agendes, informes, llistes de tasques (ToDos), diaris i d’altres similars.

Aquest implementació de l’RFC2445 es composa només d’un sol fitxer amb una classe. Malgrat segons l’autor ha fet la classe tan senzilla com a pogut ens recomana moltíssim llegir l’RFC2445 i l’RFC2446 per tal de posar-la usar de forma adequada. De totes formes, la pàgina web de la classe també disposa d’un howto que ens serveix per com s’ha d’usar la classe.

L’operador ‘===’ en PHP

Reading time: 2 – 2 minutes

Amb el temps que fa que programo en PHP i mai m’havia trobat amb la necessitat d’usar aquest operador. De fet, el que hauria de dir és que mai m’havia imaginat que existia aquest operador. Segur que tots coneixeu el ‘==’ que simplement serveix per comparar si dos valors són iguals. Doncs bé, la diferència amb el ‘===’ és que es compara que siguin iguals i del mateix tipus. A mi m’ha servit per solucionar un problema molt senzill i que es feia molt complicat.

Per exemple, si tenim un array i fem una búsqueda d’un valor dintre de l’array amb la comanda array_search ens retornarà la clau que identifica la fila de l’array on hi ha el valor que busquem. Però si el valor no es troba en l’array ens retornarà un false. Si volem saber si s’ha trobat o no, podem fer un:

if ( $clau_retornada == false )

El problemilla d’aquest codi és que false és igual a 0 i si la busqueda retorna com a resultat la clau 0 (primera posició d’un array) aquí tindrem una resposta ambigua. Doncs bé si la condició hagués estat:

if ( $clau_retornada === false )

No haguéssim tingut aquest problema, ja que el zero retornat per la funció array_search en el cas de ser una clau hagués tingut un tipus numéric o alfanuméric, però no de tipus boleà. Així doncs, gràcies al operador del que parlem podriem evitar l’ambigüetat del valor retornat per la funció array_search.

Yahoo! bookmarks usa symfony

Reading time: 2 – 2 minutes

yahoobookmarkslogo.jpg

Fa força dies que no parlo de res relacionat amb el symfony, de fet, això és el que té la meva feina que m’he de moure molt ràpid entre tecnologies depenent del projecte. Doncs bé, ni molt menys m’he oblidat d’ell. Però ara més que PHP estic tocant temes de Python, a nivell de programació. De totes formes el que volia comentar aquí és una notícia que he trobat al blog de symfony concretament es comenta que la gent de Yahoo! bookmarks ha escollit aquest framework que l’Oriol i jo ja varem escollir fa uns mesos per un projecte de recàrrega de telèfons mòbils i venta de targetes internacionls que encara tinc pendent de comentar a la web de movilpoint.

Així doncs, notícies com aquestes són les que et fan anar a dormir amb la consciència ben tranquila per les teves decisions. Realment és un plaer veure com gent de nivell tècnic tan contrastat com és l’equip de Yahoo! ens confirmen el que nosaltres ja varem opinar fa una bona colla de mesos. Tot això fa que encara tingui més ganes de que arribi la esperada versió 1.0 d’aquest framework malgrat suposarà força canvis profunds en algunes parts importants del funcionament del mateix i potser haurem de reprogramar parts importants de les nostres aplicacions. Però segur que valdrà la pena fer-ho.