Clase para generar claves en PHP

Generar claves aleatoriamente puede ser necesario cuando en nuestra aplicación web tengamos que dar claves a los nuevos usuarios (por ejemplo como hace WordPress cuando instalamos).

Por ello esta clase nos puede venir muy bien, ya que de forma sencilla podemos crear claves de una longitud dada y pudiendo indicar si es en mayúsculas, minúsculas o mezcladas.

CreatePwd

URL routing con PHP

Un excelente tutorial que nos enseña como crear URL amigables y tratarlas para crear nuestras aplicaciones. Son URLs del tipo http://servidor/funcion/param1/param2, y gracias a ellas podemos hacer URLs más entendibles de forma sencilla. CodeIgniter las trata de la misma manera salvo que en vez de /funcion se trata de /clase/metodo, pero al final el tratamiento depende del que nosotros queramos darle.

Resumiendo un poco su funcionamiento, todas las llamadas deben pasar por un mismo script (normalmente index.php), mediante el .htaccess se redirecciona todo lo que llega al servidor al archivo index:

Options +FollowSymLinks
IndexIgnore */*
# Turn on the RewriteEngine
RewriteEngine On
#  Rules
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

Una vez todas las llamadas nos llegan al mismo script debemos obtener la función y los parámetro:

$requestURI = explode('/', $_SERVER['REQUEST_URI']);

El resto es sencillo y nos ofrece muchas posibilidades.

Url Routing with PHP, 2

Lista de recursos para desarrollar aplicaciones para Facebook

Facebook es una aplicación que está muy de moda en estos momentos (no entiendo por qué) y aunque su desarrollo no es muy complicado, obtener la información de cómo hacer las cosas y encontrar algo en su documentación puede ser algo difícil. Su Wiki es un horror, los ejemplos escasos y los foros no muy útiles. Por ello, quien necesite encontrar ejemplos y tutoriales puede venirle bien esta lista:

Vía / Got Ads?

FancyBox: zoom de imágenes mediante Javascript

Buen script creado en jQuery que permite añadir zoom a imágenes. Está testado en IE6, IE7 y Firefox. Entre las características muestra en una ventana lightbox la imagen en un tamaño mayor, pudiendo ajustarse al tamaño de la ventana y mostrando un marco alrededor de la imagen. Además permite mostrar un grupo de imágenes de forma común.

fancybox.png

Un ejemplo de uso sería el siguiente:

$(function() {
$("div#test_zone a").fancybox();
});

FancyBox

Bug en el método UTC del objeto Date de Javascript

O al menos en Firefox. Se trata de que si quiero obtener el timestamp de una fecha usando el método Date.UTC me devuelve datos incorrectos.
Por ejemplo, en esta llamada Date.UTC(2008, 3, 2, 18, 33, 32) (el mes es abril porque empieza desde 0), se verá que da un el timestamp 1207161212000, mientras que si creamos un objeto Date y obtenemos su timestamp (new Date(2008, 3, 2, 18, 33, 32)).getTime() obtenemos el timestamp 1207154012000, habiendo 2 horas de diferencia.
Habrá que tener cuidado

Método sencillo para leer feeds mediante PHP

Leer feeds no es algo que se deba limitar a aplicaciones lectoras de feeds, ya que actualmente muchas webs ofrecen sus datos mediante este formato. Hacer un lector de feeds puede ser algo complicado, o más bien laborioso, ya que hay varios formatos y versiones, a parte de que no todo el mundo publica feeds válidados.

Se puede realizar un sencillo lector de feeds con PHP gracias a la librería SimpleXML (se necesita PHP5). Tan solo habrá que leer el feed y parsearlo, y luego acceder a sus elementos. Algo así como:

$data = @simplexml_load_string(file_get_contents($url));
if ($data) {
// Obtiene el los elementos <item>
$items = $data->xpath('//item');
}

Pero hay que tener en cuenta que el existen etiquetas como <content:encoded> que la librería no las leerá y recuperará tan fácilmente. Para ello deberemos mirar el xmlns correspondiente:

xmlns:content="http://purl.org/rss/1.0/modules/content/"

y leer la etiqueta de la siguiente manera:

foreach ($data as $item) {
$content = $item->children('http://purl.org/rss/1.0/modules/content/');
echo (string) trim($content->encoded);
}

Con este código se puede empezar a leer feeds, pero aún así, si necesitáis más, podéis mirar este post, que es donde he encontrado la solución al <content:encoded>.

|

Geoposicionamiento con Yahoo en PHP

No solo de Google vive el programador, y en ese caso se trata de Yahoo y la posibilidad de jugar con el geoposicionamiento gracias a su API.

Los ejemplos que muestra el enlace al que referencio son bastante sencillos y se basan en una llamada HTTP, que puede devolver distintos formatos.

La base de la aplicación sería este script:

<?php
function request_cache($url, $dest_file, $timeout=43200) {
if(!file_exists($dest_file) || filemtime($dest_file) < (time()-$timeout)) {
$stream = fopen($url,'r');
$tmpf = tempnam('/tmp','YWS');
file_put_contents($tmpf, $stream);
fclose($stream);
rename($tmpf, $dest_file);
}
}
function yahoo_geo($location) {
$q = 'http://api.local.yahoo.com/MapsService/V1/geocode';
$q .= '?appid=rlerdorf&location='.rawurlencode($location);
$tmp = '/tmp/yws_geo_'.md5($q);
request_cache($q, $tmp, 43200);
libxml_use_internal_errors(true);
$xml = simplexml_load_file($tmp);
$ret['precision'] = (string)$xml->Result['precision'];
foreach($xml->Result->children() as $key=>$val) {
if(strlen($val)) $ret[(string)$key] =  (string)$val;
}
return $ret;
}
?>

El resto de los ejemplos son muy sencillos de seguir.

GeoCool!

Asido: librería PHP para transformar imágenes

Asido es una libería PHP que nos permite modificar imágenes usando diferentes librerías. Actualmente está disponible únicamente para PHP5, pero aún es posible descargarse la versión anterior de la librería para PHP4.
Entre las librerías que admite encontramos a GD2, Magick Wand, Image Magick (vía shell) y Image Magick (vía extensión). Y entre las opciones que nos permite está añadir marcas de agua, redimensionar, cambiar ancho y alto, stretch, fit, enmarcar, convertir a otro formato, girar, flip vertical y horizontal, crop, copiar y pegar, y escala de grises.
Asido
Gracias Innovación Web por el aviso

Consejos para trabajar con el código de otros

Cuando se trabaja en una empresa de desarrollo de software es muy común que entres en un proyecto que ya está empezado, por lo que deberás tratar con un código que no es el tuyo, y que da igual que sea bueno o malo, deberás adaptarte a él, algo que siempre puede dar algún problema. Más problemático es cuando sustituyes al único encargado del código y el traspaso de conocimientos se realiza en un par de horas (algo muy frecuente en las grandes empresas de consultoría).

Para aquellos que se encuentren en esas circunstancias, espero que los consejos que os voy a comentar, sacados de mi propia experiencia en el desarrollo web, os sean de utilidad.

Echa un vistazo preliminar

Aún no sabes cómo es el código, si es bueno o es malo, pero un vistazo preliminar a la estructura de directorios y a los nombres de los ficheros suele darte una idea aproximada de la funcionalidad que pueden tener.

Por muy malo que sea un programador, éste tiene su propia lógica para la nomenclatura, échale un rato a intentar adivinarla y así podrás localizar ficheros de forma más sencilla en futuras modificaciones.

No esperes un diseño MVC claro, quizás ni exista y esté todo mezclado. Tú tienes tu forma de programar, pero aunque para ti sea perfecta, ni quizás lo sea, ni todo el mundo la comparte.

No intentes entenderlo todo de golpe

Lo más seguro es que no debas cambiar toda la aplicación de golpe, por lo que de poco te va a servir empezar a estudiarla completamente y entender todo su significado. Ve por partes, si tienes que hacer un cambio en una parte céntrate en esa parte del código y olvídate del resto.

Cuando te hayas pegado con una parte del código no se te olvidará fácilmente, por lo que si en otra ocasión tienes que volver a tocar esa parte te será más sencillo.

Empieza por el final para llegar al origen

Afortunadamente el resultado del desarrollo web es visible para todos, tan solo debes ver el código HTML para ver qué se ha generado con la aplicación.

Normalmente, las modificaciones que se suelen realizar son del tipo “en tal página falla tal cosa”. Mira el HTML de esa página y encuentra algo que pueda ser exclusivo de ella.

Busca nombres de clases de etiquetas, las cabeceras de las páginas (<h1>..<h6>), textos explicativos. Una vez creas que tienes un texto más o menos exclusivo de esa página busca entre todo el código, por ejemplo en Windows puedes usar GlobalFind.

Debes tener cuidado porque a veces el código no aparece exactamente como lo buscas. Por ejemplo un texto largo puede estar dividido en varias líneas:

$texto = 'Texto largo que el desarrollador ';
$texto .= 'a cortado en líneas para verlo más claro, ';
$texto .= 'aunque sea menos eficiente por tener que ';
$texto .= 'concatenar strings.';

O también puede darse la circunstancia de que el texto se forme por la unión de un texto y una variable:

$clase = array('empleados', 'facturas', 'resumen');
// Algo de código por aquí
echo '<div class="'.$clase[$tipo].'">...</div>';
// Más código

Quizás te encuentres con ficheros de idiomas, y verás que el texto que buscas está asociado a un código, céntrate en ese código y búscalo.

Usa trazas

La lógica del código es de todo menos lógica. Te vas a encontrar con partes de código que no vas a entender por mucho que lo estudies. No es bueno perder el tiempo intentando entender el código al 100%, ya tendrás tiempo para ello.

Cuando te encuentres con un trozo de código que no entiendas, métele trazas a todos los bloques para saber por dónde pasa:

echo 'Empezamos';
if ($condicion1 && $condicion7) {
echo 'Paso por aquí 1';
// código
if ($condicion3 || !$condicion4) {
echo 'Paso por aquí 2';
// código
} else {
echo 'Paso por aquí 3';
// codigo
if ($condicion5) {
echo 'Paso por aquí 4';
}
}
} else {
echo 'Paso por aquí 5';
// código
}
echo 'FIN';

Fijándote en las trazas que devuelva verás que código se ejecuta y así podrás encontrar mejor el error.

Ten en cuenta la base de datos

La BD es muy importante a la hora de localizar información. Mucha gente usa la BD para almacenar los mensajes de error o de información, que serán fundamentales para comprender el funcionamiento de la aplicación.

Localiza dónde se ejecutan las consultas, si hay suerte estarán separadas del resto de código (normalmente a las clases que tratan con la BD se le llama modelos). Si tienes que modificar los datos que devuelve una consulta, aunque no sepas cómo se obtienen esos datos (la sentencia SQL exacta), si que puedes hacerte una idea de las tablas a las que accede. Busca entre los modelos el nombre de esas tablas y filtra por los campos que muestra en la página. Claro que el select * from puede ser nuestro mayor enemigo.

Examina los datos de la tabla para ver si coincide con los datos que se muestran. Un ejemplo sencillo es insertar un registro mediante la aplicación y ver qué se ha guardado en la BD, así entenderás más facilmente qué se guarda en cada campo.

No olvides los ficheros de configuración

En ellos está mucha de la lógica de la aplicación, estudiarlos durante un rato puede aclararnos muchas cosas, como por ejemplo rutas de ficheros, conexiones a la BD, sistema de trazas, clases auto-ejecutables…

Cuidado con las aplicaciones externas

Si programas en Java es posible que no encuentres el por qué de un problema porque quizás la ejecución dependa de un JAR externo. Localízalos y tenlos siempre presentes. Si trabajas con Linux o Unix puede que haya llamadas a la shell. Pasará algo parecido a los JAR, deberás saber dónde están y qué hacen.

Empieza por los cambios sencillos

No intentes poner la aplicación del revés o cambiarla radicalmente nada más empezar con ella. Ve poco a poco, con cambios sencillos, que te hagan enfrentarte con el código y empezar a conocerlo.

Los cambios que puedas realizar en una parte no sabes donde van a poder afectar, por eso debes ir con cuidado y empezando con cosas sencillas, que tendrán menos posibilidades de estropear otras cosas.

Un cambio en varios lugares

Reutilizar código no siempre es una norma para los desarrolladores. Aunque creas que has localizado el lugar dónde debes cambiar el código, no pienses que es el único lugar. Sigue buscando a ver si hay más lugares donde se deba cambiar.

Testea constantemente

No conoces la aplicación y no sabes que puedes estropear cuando tocas algo. Un cambio sin importancia puede hacer que todo falle, ten cuidado si arreglas algo de no estropear otra cosa.