PHP

Publicaciones sobre programación en PHP

PHP rapido, sencillo y pontente: CodeIgniter

Justo nada más empezar a trabajar en el Reino Unido me llamó la atención un framework (entorno de desarrollo) que muchos compañeros de mi trabajo solían utilizar a menudo cuando llegaban proyectos que requerían el uso intensivo de patrones, templates o como queramos llamarlos. Dicho entorno tiene el nombre de CodeIgniter y sí, para mi gusto es lo mejor que me he encontrado en muchísimo tiempo cuando quieres aprender a usar un entorno basado en MVC (Modelo Vista Controlador https://es.wikipedia.org/wiki/Modelo_Vista_Controlador) pero no se tiene demasiado tiempo libre para aprender a usarlo.

Muchos puristas y frikis de la materia me podrán decir: “Ya tenemos Symfony”, a lo que yo respondería: “por desgracia tenemos Symfony”. Symfony es grande, demasiado grande para mi gusto la verdad. Quizás su mayor baza sea que es genial para proyectos enormes que requieran de un sistema tremendamente dinámico que cree formularios en un abrir y cerrar de ojos con un sistema muy orientado a las tablas, pero en mi caso esto no ocurre. Dicho esto, vayamos al kit de la cuestión.

CodeIgniter es genial por varias cosas, pero destacaría las siguientes:

  • Es muy sencillo de aprender; sí, más que Symfony, por mucho que les pese a más de uno
  • Aunque permite el uso de templates no es necesario usarlos si uno no lo desea, es muy poco restrictivo
  • Requiere configuración cero para empezar a utilizarlo, es decir, lo descargas, descomprimes y a trabajar.
  • No necesita de lineas de comandos para configurar nada, todo lo contrario que Symfony
  • Y sobretodo… es raaaaaapidoooooo. A penas tiene impacto sobre un código en PHP puro.

De todas formas, lo que realmente hace interesante a este Framework es que, al igual que Symfony, permite el uso de algo tan de moda como es la programación en modelo Vista-Controlador. Para el que aún no tenga ni idea de qué va el asunto les resumiré que es algo así como tener dos partes en el código fuente. Por un lado tendríamos la parte visual, es decir, archivos semiestáticos en html o php y otra parte, más orientada al backend, en el que viene toda la lógica interna de la página web: Llamadas a la base de datos, rutinas internas a nivel de servidor, control de variables, etc. De esta manera conseguimos algo realmente interesante en un equipo de desarrollo: Podemos poner a un desarrollador especializado en html+css a hacer la parte visual y otro desarrollador únicamente entretenido en la parte interna. El resultado se fusiona, manteniendo unas reglas obvias para no machacarse uno con otro y ¡¡listo!!

Si os sigue picando la curiosidad: https://ellislab.com/codeigniter

 

Eclipse y Ubuntu [Mal matrimonio]

Desde hace ya bastante tiempo uso Ubuntu en casa como sistema operativo principal, de hecho a Windows solo le veo en el portátil de la empresa y porque pos desgracia no me queda más remedio. A pesar de mi devoción por Ubuntu ha habido una cosa que siempre me ha tocado literalmente las narices y es Eclipse. Hace tiempo me costó lo suyo hacerlo andar en Ubuntu (corría entonces la versión 9.04) y desde entonces he andando con ese “paquetito” hecho a medida que iba viajando conmigo en cada actualización.

Hace pocos días me dio por instalarme la última versión en el ordenador del trabajo y .. ¡¡ooohhh!! ¡cuánta cosa bonita! Pues en cuanto llegue el fin de semana me lo instalo, me dije para mí mismo. Lo primero que hice fue aparcar la “carpetita” en cuestión e intentar instalar Eclipse desde el repositorio que tiene Ubuntu, sin acordarme que en su día eso fue lo que me volvió completamente loco e hizo plantearme el bajar y configurar a mi manera todo.

Aunque al principio todo fue como la seda no tardaron demasiado tiempo en aparecer los primeros problemas. Yo evidentemente uso Eclipse, como mucha otra gente, para programar en Java, pero no es en lo único que programo. Ni corto ni perezoso intenté descargar los paquetes que hacen que Eclipse hable Java y… PEEEKKK! Error.. ¿Cómo? ¿Esto que eeessss? Bueno, pues vamos a intentar ponerlo en “Cristiano” (por defecto sale en inglés) con el paquete Babel del repositorio para Eclipse Indigo.. PEEEKKK!!! Su put……e!!!

Finalmente mi memoria hizo lo que tenía que hacer, recordar que usar el paquete hecho para Ubuntu no iba a servir así queeee.. como hace  3 años.

Pasos a seguir:

  • Descargar el paquete para tu versión de Linux (Es un TGZ) de la página Oficial de Eclipse. Hay muchos paquetes, con descargar el Eclipse Classic será suficiente: 179Mb.
  • Descomprimimos el archivo y ejecutamos Eclipse.
  • Ahora sí, si nos vamos al menú Help->Install New Software ya podemos instalar cosas. Lo primero de todo es dentro del repositorio de Indigo buscar dentro de Programming Languages a PHP y tooooodo lo que nos haga falta e instalarlo.
  • Lo siguiente es añadir al repositorio la dirección https://download.eclipse.org/technology/babel/update-site/R0.9.1/indigo
  • Al hacer esto último podremos instalar los paquetes de idiomas del “Proyecto Babel”. Buscamos el correspondiente a Spanish y lo instalamos, con lo que en el siguiente reinicio del programa nuestro Eclipse aparecerá en un lenguaje que seguramente entenderemos mejor

Poco más. ¡A disfrutar de Eclipse en Ubuntu!

 

 

Clases y objetos en PHP5. Flexibilidad para el programador

Desde prácticamente mis tiempos universitarios he sido un fiel seguidor de las tendencias en lo que a programación orientada a objetos se refiere, sin embargo, debido a mis labores como currante perdí el hilo durante unos años y cuando de nuevo me tuve que poner a programar después de todos estos años dedicándome únicamente a a la administración de sistemas me encontré con que mi cabeza estaba oxidada en cuanto a los buen haceres de una programación bien estructurada, por no hablar de la correcta utilización de los patrones de la programación orientada a objetos. El resultado podía haber sido peor de lo que yo me hubiera imaginado. Mis scripts en PHP realmente funcionaban bien (utilizaba el estándard PHP4 aunque ya corría PHP5 en mis servidores) pero la estructura interna de los mismos era de ese tipo que cuando un programador medianamente experimentado los ve se hubeira caído de espaldas del susto.

En fin, para los siguientes proyectos intenté organizarme mejor y la verdad es que todo empezó de maravilla hasta que lo de siempre, la fecha objetivo se acercaba y el sprint final hace que tengas que tomar una decisión salomónica, sacrificar la estructura y buen hacer en detrimento de acabar el proyecto “como sea”. Sin embargo por fin las cosas han cambiado, y he conseguido empezar a hacer un proyecto desde el principio utilizando clases y objetos en PHP para la casi totalidad de mis scripts y sinceramente ¡¡qué gozada!! Tras ver cómo van evolucionando mis clases y objetos, y sobretodo que interrelacionan entre sí en un código limpio y de fácil comprensión me pregunto, ¿pero cómo es posible que te pase siempre lo mismo?

Bromas a parte, a continuación os muestro un par de ejemplos de cómo crear objetos y clases en PHP5, que PHP5 incluso permite crear clases estáticas y llamarlas desde cualquier parte del programa. En fin… que después de ver esto me pregunto ¿realmente hace falta Java/JSP para crear webs dinámicas existiendo PHP5? ¿¿¿Cómo es posible que haya aún gente que se interese por ASP/ASPX???

Ejemplo de una clase en PHP:

class miClase {
private $miVariable;
function __construct($param) { /* el constructor en PHP5 se define como __construct */
$this->setVariable($param);
}
function setVariable($param) {
$miVariable = $param;
}
function getVariable() {
return $miVariable;
}
}

Ya tenemos creada una fantástica clase donde guardaremos, y de forma privada, un atributo (variable) que será accedido mediante los métodos que sí que serán públicos. Con esto conseguimos cumplir una de las premisas de la programación orientada a objetos, la encapsulación.

¿Y se puede hacer herencia? Y tanto…

class miOtraClase extends miClase {
function otraFuncion() {
print “Esto se imprime desde otra funcion”;
}
}

¿¿Y cómo creamos objetos?? Tan sencillo como esto…

$miObjeto = new miClase(“Pepito”);
echo $miObjeto->getVariable();
$miObjeto->setVariable(“Joselito”);
echo $miObjeto->getVariable();
$miOtroObjeto = new miOtraClase(“Pepote”);
echo $miOtroObjeto->getVariable();
$miOtroObjeto->otraFuncion();

Y el resultado sería…

Pepito
Joselito
Pepote
Esto se imprime desde otra funcion

Evidentemente este es un ejemplo sencillísimo, pero en cuatro líneas como se suele decir se puede ver que a este lenguaje no le hace falta ¡¡de nada!!

Los primeros pasos con Lucene bajo PHP. Al final funcionará y todo

Ayer, y tal como ponía en mi anterior publicación me empeñé en echar a andar el motor de búsqueda Lucene sobre PHP. Mi intención era clara, tengo una base de datos en MySQL un poco “toqueteada internamente por mí” para que funcione mejor a nivel de consultas Full-Text que no me termina de convencer, por lo tanto manos a la obra…

Tras “googlear” un poco en busca de información (malos hábitos que creo que ya tiene el 99.9% de los mortales que se dedican a esta nombre y malpagada profesión) encuentro varios documentos en “cristiano” sobre cómo implementar en Ubuntu (sistema que uso como servidor en la empresa) el motor Lucene bajo PHP. La primera sorpresa es que Lucene en PHP tira de Zend, pero tampoco me preocupa demasiado, a pesar de que no soy muy amigo de utilizar Frameworks. En fin, que lo peor de todo es que la información que encuentro es ANTIGUA DE NARICES, muy muy obsoleta, pero por suerte hay una página que prácticamente explica todo lo que me hace falta: https://www.phpriot.com/articles/zend-search-lucene.

Vamos allá… instalamos Zend:

$ sudo apt-get install libzend-framework-php

Y parece que todo va bien.. Ubuntu no se queja así que vamos a hacer nuestro primer código fuente con los ejemplos modificados que hay en la página que hemos mencionado anteriormente..

$path = “/mi_path/a_un_lugar/para_el_indice”;

if(!is_dir($path)){
    echo “Creando Path…<br>”;
       $index = Zend_Search_Lucene::create($path);
}
else{
   $index = Zend_Search_Lucene::open($path);
}

y primera castaña… el script arroja un error de que no reconoce la clase Zend_Search_Lucene….. Perooooo… ¿no la acabo de instalar? Mmmmm… a lo mejor hay que reiniciar Apache.. Procedemos..

$ sudo /etc/init.d/apache restart

Probamos otra vez… ¡¡PEEEEEKK!! Error…. ¡¡arrrghh!! En fin, revisemos nuevamente la documentación a ver qué se me está olvidando…..

5 minutos más tarde

Las prisas, o la agonía, vete tú a saber. Si no se le dice al script que use la librería Zend, ¿cómo va a funcionar? Solución, al principio del script se pone:

require_once(“Zend/Search/Lucene.php”);

Pero como se ve que ayer tuve muy mala suerte me vuelve a dar unos bonitos mensajes de error diciendo que no se puede insertar la librería… Vuelta a “San Google”…. y nada… así que me armo de valor y empiezo a mirar qué archivos ha modificado el sistema y veo que Zend crea un archivo de configuración dentro del arbol de PHP llamado  /etc/php5/conf.d/zend-framework.ini. Lo edito y veo que el path donde va a buscar los archivos está ¡¡¡COMENTADO CON UN PUNTO Y COMA!!! Perooooo… en fin, quito el dichoso “punto y coma”, recargo la configuración de Apache por si las moscas y… ¡¡ahora sí!! Ni un error y en el path que he definido del sistema se ha creado una bonita carpeta con varios archivos dentro que según leo en la documentación de Lucene son los índices. Primer paso dado, vamos a darle caña a hacer algo añadiendo las siguientes líneas a nuestro script:

    $doc = new Zend_Search_Lucene_Document();
    $doc->addField(Zend_Search_Lucene_Field::UnIndexed(‘dia’, ‘2011-12-29’));
    $doc->addField(Zend_Search_Lucene_Field::UnIndexed(‘pagina’, ‘3’));
    $doc->addField(Zend_Search_Lucene_Field::UnStored(‘texto’, ‘Manolito es una persona que ha hecho muchas cosas’));
    $index->addDocument($doc);

Ejecutamos y…parece que todo ha ido bien…. ¿Funcionará la búsqueda?

Realizamos el siguiente script y lo ejecutamos:

require_once(“Zend/Search/Lucene.php”);

$path = “/mi_path/a_un_lugar/para_el_indice”;
Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding(‘utf-8’);
Zend_Search_Lucene_Analysis_Analyzer::setDefault(new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive());
if(!is_dir($path)){
    die(“El indice no existe”);
}
else{
   $index = Zend_Search_Lucene::open($path);
}

$patron = “manolito”;

echo “Buscando “$patron”…<br>”;
echo “Documentos Totales:”.$index->numDocs().”<br>”;
$hits  = $index->find($patron);
$numHits = count($hits);
echo “Encontradas $numHits coincidencias<br>”;
foreach($hits as $hit){
    echo $hit->dia.”<br>”;
    echo $hit->pagina.”<br>”;    
    echo $hit->score.”<br>”;
}

¡¡¡¡Oooohhhhh!!!!! ¡¡Alegría por todo mi ser!! Me dice que ha encontrado una coincidencia (estoy buscando la palabra “manolito) y que el número total de documentos almacenados es 1.

Conclusión, PHP también parece que se entiende con Lucene, y para los que nos tenemos que pelear con buscadores de palabras parece que se nos abre el cielo. Próximamente intentaré implementarlo de verdad con unas cuantas cosas que tengo en mente, pero eso será “más adelante”…

Buscar o no buscar, el caso es que sea rápido

Hace unos cuantos meses terminé de desarrollar un proyecto de Hemeroteca digital para el medio de publicación para el que trabajo que sinceramente, me dejó más que satisfecho porque por una vez en la vida he podido programar a mis anchas, sin grandes presiones de tiempo. Muchas veces esas dichosas presiones hacen que uno empiece a volverse loco y tu código fuente, sea cual sea el lenguaje que en el que uno esté programando, se convierta más en un cutreprograma tipo Basic de los que solíamos hacer al principio de los tiempos cuando nadie nos había explicado lo que era la programación estructurada. Este proyecto unificaba lo mejor de mis conocimientos en PHP5 y amplió hasta nuevos horizontes cosas muy peculiares que he descubierto que se pueden hacer en JavaScript y por supuesto añadir una dimensión desconocida a JQuery, una maravilla que cada día me sorprende más.

Y sin embargo todo tiene un “pero”… El sistema de búsquedas basado en MySQL parecía ir a las mil maravillas cuando en las primeras pruebas solo teníamos 5 o 6 años de publicaciones hechas, pero cuando se hizo la indexación de todo nuestro fondo editorial (65 años) la cosa ya no era lo que parecía. Descubrí que las búsquedas Full-Text de MySQL no eran nada del otro mundo, de hecho funcionan muy pero que muy bien usando una o dos palabras, pero como se nos ocurra hacer una búsqueda “tipo Google”.. en fin… puede ser que tengamos suerte y tarde 3 segundos la búsqueda o que tarde perfectamente un minuto. ¿Cómo es posible? Mi gozo en un pozo… pero como hay remedio para todo, o eso espero hoy me he propuesto intentar hacer pruebas con Lucene.

Lucene es un motor realizado por Apache Group y que como todo lo que sale de esta gente es lo más de lo más. El primer problema con el que me he encontrado es que está originalmente hecho para Java, ¡pero tranquilidad! ¡Hay versiones ya para todo! Ruby, PHP, Python, etc…

Probemos pues y veamos en qué acaba el asunto….