Tag: programming

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: 6 – 10 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 HTML body";
$mail->AltBody  =  "This is the text-only body";
if(!$mail->Send())
{
   echo "Message was not sent 

"; 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.

L’operador ‘===’ en PHP

Reading time: 6 – 10 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.

python: Abyss Webserver start and stop host from CLI

Reading time: 15 – 25 minutes

Petit script en python per iniciar/parar el Abyss Webserver des de la línia de comandes. Només hem de posar la URL d’on es troba la web de la consola de l’Abyss i l’ususari i el password per entrar-hi. Com que esta fet ràpid i corrents, no es suporta el pas de paràmetres per indicar si s’ha d’engegar i/o parar el servei en cada moment. Així que si algú s’anima a afegir-hi les 4 línies de codi que hi falten que me les digui, que jo encara no domino prou el python com per fer-ho en 1s i avui ja estic cansat.

import urllib2
<br>
theurl = 'http://127.0.0.1:9999'
username = 'theuser'
password = 'thepass'
<br>
passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, theurl, username, password)
authhandler = urllib2.HTTPBasicAuthHandler(passman)
opener = urllib2.build_opener(authhandler)
<br>
data_start = "%2Fhosts%2Fhost%400%2Fstart=Start"
data_stop = "%2Fhosts%2Fhost%400%2Fstop=Stop"
<br>
data = data_start
<br>
request = urllib2.Request(theurl,data)
response = opener.open(request)
<br>
print response.readlines()

python: Autenticació HTTP de tipus basic-scheme

Reading time: 14 – 23 minutes

Com accedir a un serividor HTTP amb les pàgines protegides amb usuari i password del tipus Basic Authentication Scheme.

import urllib2
<br>
theurl = 'http://host:port'
username = 'theuser'
password = 'thepass'
<br>
# this creates a password manager
passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
# because we have put None at the start it will always use this
# username/password combination
passman.add_password(None, theurl, username, password)
# create the AuthHandler
authhandler = urllib2.HTTPBasicAuthHandler(passman)
# Return an OpenerDirector instance, which chains the handlers in the
# order given Return an OpenerDirector instance, which chains the
# handlers in the order given
opener = urllib2.build_opener(authhandler)
# Install an OpenerDirector instance as the default global opener
urllib2.install_opener(opener)
# Open the URL url, which can be either a string or a Request object.
pagehandle = urllib2.urlopen(theurl)
lines =  pagehandle.readlines()
<br>
for line in lines:
    print line

L’autentació que usa l’Abyss Webserver per defecte és la del tipus explicada en aquest exemple.

python: Generar passwords d’usuaris per l’Abyss Webserver

Reading time: 15 – 24 minutes

L’Abyss Webserver guarda en un fitxer de configuració en format XML els usuaris i passwords. Doncs bé el format en que estan enmagatzemats els passwords en el fitxer XML és:

usercode = nom_usuari + ":" + plaintext_password
encoded_password = md5(base64(usercode))

Doncs bé aquí ve el petit trick de com fer això amb python:

#!/usr/bin/env python
import md5
import base64
import re
<br>
def genera_pass_abyss(usercode):
        b64usercode = base64.encodestring(usercode)
        b64usercode = re.sub('\n','',b64usercode)
        hash = md5.new(b64usercode)
        return hash.hexdigest()
<br>
user = 'usuari1'
passw = 'password1'
usercode = user + ":" + passw
print usercode
print genera_pass_abyss(usercode)

RSS 2.0 vs Atom 1.0

Reading time: 1 – 2 minutes

A IBM han escrit un article anomenat Implement news syndication using RSS and Atom (local en pdf). A part de l’interés propi del contingut de l’article pels programadors que vulguin un model UML de les classes que han de crear per exportar informació en aquests formats XML (RSS i Atom) a l’article hi ha un gràfic que m’ha ajudat molt a entendre les diferències entre RSS 2.0 i Atom. Perquè ambdós dona la sensació que són, fan i serveixen pel mateix. Doncs amb aquest gràfic podem acabar de confirmar-ho o desmentir-ho del tot.

Scroll to Top