Es un problema con el que cualquier persona que utilice PHP y MySQL se encuentra muy a menudo. Hasta que PHP no trate directamente esos datos y se sobrecarguen internamente los operadores de comparación para que todo sea directo, tendremos que valernos de métodos como el que os muestro para poder comparar dos fechas en formato MySQL con PHP (formato MySQL, es decir fecha en formato inglés con guiones y el orden invertido respecto al nuestro).

La siguiente función devuelve:

  • 1 si la fecha a es mayor que la fecha b
  • 0 si son iguales
  • -1 si la fecha a es menor que la fecha b
function comparar_fechas_mysql($a, $b)
	{
		$a_v=explode("-",$a);
		$anyo_a = $a_v[0];
		$mes_a = $a_v[1];
		$dia_a = $a_v[2];

		$b_v=explode("-",$b);
		$anyo_b = $b_v[0];
		$mes_b = $b_v[1];
		$dia_b = $b_v[2];

		if($anyo_a > $anyo_b)
			return 1;
		else
		{
			if($anyo_a < $anyo_b)
				return -1;
			else
			{
				if($mes_a > $mes_b)
					return 1;
				else
				{
					if($mes_a < $mes_b)
						return -1;
					else
					{
						if($dia_a > $dia_b)
							return 1;
						else
						{
							if($dia_a < $dia_b)
								return -1;
							else
								return 0;
						}
					}
				}
			}
		}
	}

Esperamos vuestras sugerencias, mejoras y rectificaciones de este y todos los tips de programación que vayamos incorporando.

editor

Cada vez avanzamos más hacia “la nube”, es decir, hacia la aparición de herramientas web que sustituyan paulatinamente a todas las herramientas que usamos en “local” en nuestro equipo de escritorio.

Aunque ya conozco varios editores de código en línea, ninguno que sea tan específico y a la vez versátil como phpAnyWhere. Aunque yo soy de los que prefiero seguir haciendo este tipo de cosas en local, es cierto que cuando estas de viaje o con un equipo sin las herramientas necesarias, si tienes que tocar algo de algún proyecto tuyo, esta herramienta te da una solución potente y práctica.

Entre sus características destacar:

  • Resaltado de código
  • Pestañas
  • Explorador de ficheros del proyecto
  • Herramientas de búsqueda, sustitución…

Lo dicho, una buena solución para momentos en los que estás literalmente “en precario”. Me he enterado de su existencia a través de Kabytes.

Antes de leer esta entrada os recomiendo daros un paseo por la primera parte, en la que os argumento el porqué de cURL además de unos ejemplos para empezar. Bien, continuaremos con un par de ejemplos algo más complejos, vamos a usar cURL para buscar palabras en el diccionario:

$ curl dict://dict.org/d:stalwart
220 miranda.org dictd 1.9.15/rf on Linux 2.6.26-bpo.1-686
<400549.18119.1238445667@miranda.org>
250 ok
150 1 definitions retrieved
151 “Stalwart” gcide “The Collaborative International Dictionary of English v.0.48″
Stalwart \Stal”wart\ (st[o^]l”w[~e]rt or st[add]l”-; 277),
Stalworth \Stal”worth\ (-w[~e]rth), a. [OE. stalworth, AS.
staelwyr[eth] serviceable, probably originally, good at
stealing, or worth stealing or taking, and afterwards
extended to other causes of estimation. See {Steal}, v. t.,
{Worth}, a.]
Brave; bold; strong; redoubted; daring; vehement; violent. “A
stalwart tiller of the soil.” –Prof. Wilson.
[1913 Webster]

Fair man he was and wise, stalworth and bold. –R. of
Brunne.
[1913 Webster]

Note: Stalworth is now disused, or but little used, stalwart
having taken its place.
[1913 Webster]
.
250 ok [d/m/c = 1/0/20; 0.000r 0.000u 0.000s]
221 bye [d/m/c = 0/0/0; 0.000r 0.000u 0.000s]

Con lo que podemos reemplazar la palabra ‘stalwart‘ por la que deseemos definir. Además del uso bajo línea de comandos, todas las capacidades de cURL están disponibles en la librería libcurl. Muchos lenguajes de programación incluyen una interfaz de conexión con cURL (libcurl) para automatizar tareas tales como la transmisión de un archivo a través de FTP. Por ejemplo, este fragmento de código PHP usa libcurl para colgar un archivo cargado por un formulario en un servidor FTP:

<?php

$ch = curl_init();
$localfile = $_FILES['upload']['tmp_name'];
$fp = fopen($localfile, ‘r’);
curl_setopt($ch, CURLOPT_URL,
‘ftp://ftp_login:password@ftp.domain.com/’.$_FILES['upload']['name']);
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localfile));
curl_exec ($ch);
$error_no = curl_errno($ch);
curl_close ($ch);

?>

¿Alguna otra utilidad? ¿Le das otro uso a cURL?

“Security, speed, compliance, and flexibility”, estas son las keywords de lighttpd (pronunciado “lighty”), se trata de una pequeña (en tamaño) y muy eficiente alternativa al archiconocido Apache. Quizás lo mejor de todo, su simpleza, el archivo de configuración de lighttpd no es tan complejo como el de Apache.

Construir lighttpd desde cero es un poco más complicado, ya que depende de otras bibliotecas. Como mínimo, necesita la versión de desarrollo (la versión que incluye los archivos de cabecera) de expresiones regulares compatibles con la biblioteca de Perl (PCRE) y la herramienta de compresión zlib. Después de haber instalado estas bibliotecas, la compilación de lighttpd es sencilla:

$ # Lighttpd requires libpcre3-dev and zlib1g-dev
$ wget http://www.lighttpd.net/download/lighttpd-1.4.24.tar.gz
$ tar xzf lighttpd-1.4.22.tar.gz
$ cd lighttpd-1.4.22
$ ./configure && make && sudo make install

Una vez compilado, hemos de crear nuestro archivo de configuración. La configuración más minimalista posible establece la raíz del documento (document root), el puerto del servidor (server port), algunos tipos MIME (Multipurpose Internet Mail Extension), el usuario por defecto (default user) y un grupo para el demonio (daemon):

server.document-root = “/var/www/lighttpd/miDirectorioHost”
server.groupname = “www”
server.port = 80
server.username = “www”

mimetype.assign = (
“.html” => “text/html”,
“.txt” => “text/plain”,
“.jpg” => “image/jpeg”,
“.png” => “image/png”
)

static-file.exclude-extensions = ( “.fcgi”, “.php”, “.rb”, “~”, “.inc” )
index-file.names = ( “index.html” )

Considerando que hemos guardado nuestro archivo de texto como /opt/etc/lighttpd.conf, para lanzar lighttpd bastará con invocarlo y pasarle dicho archivo de configuración:

lighttpd -D -f /opt/etc/lighttpd.conf.

Al igual que Apache, lighttpd puede servir servidores vituales (virtual hosts). Y en solo tres líneas y usando un condicional:

$HTTP["host"] == “www2.linuxhispano-ejemplo.net” {
server.document-root = “/var/www/lighttpd/miDirectorioHostVirtual
}

De esta manera, si accedemos www2.linuxhispano-ejemplo.net, usaremos la alternativa planteada.

Lighttpd es especialmente hábil en el manejo de un gran número de peticiones en paralelo. Y al igual que Apache, podemos usarlo conjuntamente con Ruby on Rails (RoR), PHP, etc.

Artículos relacionados.
Artículo original en  IBM Developer Works.

Muchas de las aplicaciones Web, incluso algunas de las que hemos podido construir usan un campo de email que hemos de rellenar para poder continuar. Nos encontramos con el caso de que al proporcionar ese correo basta con especificar el usuario y el dominio separado por una arroba para que se verifique como correcto. En muchos casos, y la evidencia lo refleja, esto no es suficiente, ya que podemos proporcionar un usuario o dominio inventado; es aquí donde aparace PHP Mail Tester.

Esta útil y a la vez sencilla utilidad nos permite comprobar si 1) el servidor existe y si 2) el usuario es válido, para ello, realiza los siguientes pasos:

  • Obtiene los registros MX para el dominio dado.
  • Se conecta a los servidores de correo.
  • Intercambia datos con el servidor utilizando el protocolo SMTP.
  • Obtiene el código de respuesta para comprobar si es una dirección de email válida.

Os recomiendo que os deis una vuelta y lo probéis, merece la pena, y podemos descargarlo para integrarlo en nuestras aplicaciones.

Ya os comenté con anterioridad, a través del último artículo publicado sobre Task Freak! la necesidad de proteger el contenido del mismo, en tal caso usamos .htaccess, pero en ocasiones nos puede resultar más factible usar la autenticación HTTP mediante PHP. Ya sea por comodidad o por restricciones del servidor para incluir modificaciones en subdirectorios con .htaccess.

En el ejemplo, eminentemente práctico, que os muestro a continuación haremos uso de las directivas de PHP, PHP_AUTH_USER y PHP_AUTH_PW, suficientes para nuestro marco de trabajo. Podéis encontrar las especificaciones al completo y ejemplos de estas en php.net.

En primer lugar, editarmos el fichero secure.php con la siguiente información, descriptiva por sí misma:

<?php
$users = array(
'ahornero' => 'contraseña en MD5'
);


if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Linux Hispano"');
exit('Esta página requiere autenticación');
}

if (!isset($users[$_SERVER['PHP_AUTH_USER']])) {
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Linux Hispano"');
exit('Acceso denegado');
}

if ($users[$_SERVER['PHP_AUTH_USER']] != md5($_SERVER['PHP_AUTH_PW']))
{
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Linux Hispano"');
exit('Acceso denegado');
}
?>

Y simplemente nos bastará con incluirlo en los ficheros que deseemos proteger:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
[...]

Esta protección surge a raíz de la instalación de Task Freak!, del que ya hemos hablado con anterioridad y de la necesidad del mismo en:

Así y a modo de minitutorial os indicaré como evitar que una persona ajena al servicio pueda acceder a un directorio, en este caso a una aplicación sobre un directorio, que para lo que nos ocupa se procederá de la misma manera.

  1. Creamos un archivo de contraseñas (password file, .htpasswd), para ello podemos hacerlo mediante la utilidad htpasswd o con alguna herramienta Web si no la tenemos instalada, evidentemente sugiero utilizar la primera opción, siempre es bueno evitar a terceros, igualmente la Web sugerida me parece de confianza. Así:htpasswd -cmb .htpasswd ahornero estaSeraMiContraseña

    La opción “-c” crea un nuevo archivo, en este caso .htpasswd (podemos llamarlo como queramos). La otra opción, “-m” usa la encriptación MD5 para el password (por defecto en Windows, Netware y TPF), la otra alternativa es usar “-d” que usa la función “crypt()” (que no la recomiendo por compatibilidad con el demonio httpd en otros sistemas). La opción “-b” nos indica que el password se lo pasaremos en texto plano desde la consola. Podéis consultar el resto de opciones desde aquí.

  2. Un vez ya tenemos nuestro archivo de contraseñas será necesario definir qué directorios proteger y de qué manera, para ello crearemos el fichero .htaccess, así desde nuestro editor de texto preferido colocamos las siguientes líneas:AuthName “Taskfreak”
    AuthType Basic
    AuthUserFile /ruta/del/archivo/.htpasswd
    Require valid-user

    Reemplanzado /ruta/del/archivo/ por la ruta actual del archivo de contraseñas, y salvaremos el archivo .htaccess (no olvidar el “.”) en el directorio que deseemos proteger, en este caso en el directorio donde hemos instalado Task Freak!

He montado el ejemplo en ahornero.com/taskfreak y podemos comprobar cómo nos solicita los credenciales.

Llevo un par de días pensando en montar algo que me ayude a recordar mis tareas pendientes, se me suele olvidar lo que tengo que hacer con frecuencia. Sé que existen muchas posibilidades (la mayoría gratuitas) en la red a la hora de organizar nuestro horario o las cosas por hacer, entre ellas a destacar Google Calendar. Entonces, ¿qué estamos buscando? Pues básicamente un gestor de tareas algo más liviano y que dada su simpleza nos permita archivar las tareas.

Pensé en hacerme una aplicación a medida, no parece demasiado complicado, aunque hay que considerar varios puntos para que no se quede en la aplicación que hice en su día y nunca llegue a usar. Mirando por la red topé con Task Freak!, de entrada me pareció una alternativa más, de tantas que encontré, después me bajé el fuente y la verdad es que tiene bastante buena pinta, estuve probando la demo tuvo toda mi aceptación. Lo único que no me termina de gustar es que esté basado en MySQL, con lo que de ponerlo, lo modificaría para que tirara de SQLite, ¿por qué? Porque comparto el servidor con otras aplicaciones de más transcendecia y no me gustaría comprometerlas.

Así, a ver si esta semana tengo lugar y os voy comentando cómo queda al final. ¿Qué os parece?