miércoles, 13 de agosto de 2014

Banner con contador de clics sin programación

Ya se que este es un blog de programación con PHP (bueno casi), pero todo programador debería tener en cuenta dos importantes reglas para no perder la cordura a lo largo de su vida:

1.- No todo se resuelve programando.
2.- Lo importante siempre será la solución del problema, no lo elegante ni avanzado de tu código para solucionarlo.

Justificada mi pereza, ahora les doy un truco para hacer un pequeño banner con contador de clics sin programación, ni logs, ni tablas de bases de datos, sólo una imagen, la url a monitorear y un servicio web: https://bitly.com/

Bit.ly es un acortador de direcciones web que era muy usado para escribir URLs muy largas en Twitter. Es muy usado aunque ya esto no es necesario (actualmente Twitter sólo cuenta 20 caracteres para cada dirección web dentro de un tweet sin importar la longitud de la misma), pero sigue siendo muy útil para generar direcciones web personalizadas. Lo interesante de este servicio es que si te registras y creas una dirección corta podrás saber cuentos clics ha recibido cualquier enlace donde pongas la dirección corta generada por Bit.ly 

Lo primero que debes hacer es registrate en https://bitly.com/, lo puedes hacer con tu cuenta de Twitter e iniciar sesión con ella. Una vez que hayas iniciado sesión, copia la dirección web con la que deseas contar los clics en tu banner y pégala en el recuadro que dice "Paste a long URL here to shorten" y esto generará una dirección corta de tipo "http://bit.ly/urlcorta". 


Finalmente, introduce una etiqueta de imagen en tu HTML y coloca un enlace en tu imagen con la URL corta que te ha generado Bit.ly. Si tienes un blog puedes hacerlo sin necesidad de conocimientos en HTML con el widget de imagen en el caso de Blogger o una imagen con vínculo en el caso de Wordpress.

Un detalle curioso es que si abres varias veces una dirección de Bit.ly con el mismo navegador, sólo contará un (1) clic lo que permite tener una cantidad aproximada no de clics sino de personas que han hecho clics en tu banner.

Otro detalle importante es que no sólo te dice la cantidad de clics, tambien puedes ver las estadísticas de clics por día, si fue accedido desde twitter o la distribución geográfica de los clics, algo super útil para ver desde que países llegan los clics de tu banner.


miércoles, 6 de agosto de 2014

Ver la velocidad de tu conexión a internet en tiempo real en tu PC y en tu móvil o tablet Android

Cuando estoy realizando varias tareas online como administración de servidores, descargar archivos de la web, bajando actualizaciones de sistema o simplemente mirando vídeos de Youtube, me interesa saber cuanto estoy consumiendo del ancho de banda total de la conexión. Sobre todo cuando estoy en una red de trabajo y me interesa saber si lo que estoy haciendo no pone lenta la conexión para las demás personas que están trabajando online.

Para esto suelo usar dos aplicaciones las cuales les recomiendo:

NetSpeedMonitor para Windows 7

NetSpeedMonitor es una aplicación muy ligera que se ejecuta en segundo plano desde la barra de tareas de Windows 7 y permite saber en tiempo real que ancho de banda estas usando actualmente con tus descargas. Tiene la ventaja que no sólo permite ver tu consumo en tiempo real, además puede llevar un registro de tu consumo e indicarte cuantos MB o GB han pasado por la conexión de tu computador. Es gratuito.



Net Speed Icon en Android

En el caso de Android hay muchas aplicaciones para llevar un registro del consumo de datos de tu móvil por 3G o Wi-Fi, incluso desde la versión 4 de Android el mismo sistema operativo permite hacer esta tarea. Sin embargo echaba de menos una aplicación como NetSpeedMonitor para móviles que me permitiera ver el consumo de ancho de banda en tiempo real, hasta que encontré Net Speed Icon

Mediante esta aplicación puedes ver el consumo de ancho de banda por Wi-Fi de tu teléfono o mejor aún, ver que tan rápido es el 3G en algunas zonas cuando estás en la calle. Además, si lo deseas, puedes activar la aplicación como un icono en la barra de notificaciones y así podrás ver en todo momento la velocidad de la conexión de tu teléfono sin tener que abrir la aplicación. Es gratuita con algunos Ads.


Desactivar la reproducción automática de video en el muro de Facebook

Este post no es sobre programación pero estoy seguro que le servirá a más de uno. Recientemente Facebook realizó una actualización para que los vídeos que aparecen en el muro empiecen a reproducirse automáticamente cuando entran en el área visible de la pantalla. Vamos, que esta idea estoy seguro que la tomaron de Vine, la red social de vídeo que esta de moda actualmente entre los usuarios de smartphones.

Sea cual sea el motivo, si deseas desactivar la reproducción automática de vídeo, debes iniciar sesión en tu cuenta de Facebook y luego abrir este enlace: https://www.facebook.com/settings?tab=videos, aqui encontrarás la opción para desactivar esta función.


Este truco sólo funciona para la versión web de Facebook, si deseas hacerlo en la aplicación móvil en Android debes ir al menú de la aplicación, Configuración de aplicaciones > Reproducción automática de vídeos.




sábado, 2 de agosto de 2014

Concatenar un NULL o la parábola del Universo Vacio

Recuerdo que una vez estaba revisando un extraño error en un sistema que había estado funcionado correctamente durante unos meses. De repente y sin motivo aparente, el resultado de una sumatoria de números estaba arrojando valores al azar. Esto no debería pasar jamas en una sumatoria de registro, el resultado siempre debe ser el mismo siempre y cuando los registros a sumar sean los mismos. Pero en este caso la consulta SQL que ejecutaba el cálculo daba resultados extraños en cada ejecución. Para ese momento estaba trabajando en una base de datos MaxDB (SAP-DB), pero la explicación a esto es mas o menos igual para MySQL, PostgreSQL, SQL Server y posiblemente Oracle.

Después de varias horas revisando el problema decidí pedir ayuda a mi mentor de bases de datos, un ingeniero con más de 25 años de experiencia en bases de datos relacionales llamado Arturo Schotborgh. Luego de unos minutos revisando mi consulta, mi mentor encontró un pequeño detalle dentro de los registros de entrada de la sumatoria: Uno de los registros a sumar tenía un valor "NULL". Yo en ese momento había descartado que ese fuera el motivo, sin embargo ese día recibí una cátedra de bases de datos que nunca voy a olvidar.

Mi mentor inició la lección preguntando: "¿Que significa para ti que un campo de un registro tenga asignado un valor NULL?". Le dije, con la poca experiencia que tenia de programación con PHP que para mi significa que es una variable no asignada, es decir, una cadena vacía, un valor cero, un arreglo sin elementos. 

Entonces mi mentor me explicó: 
Un NULL no es un registro vacío, ni una cadena de longitud cero, ni un cero. En bases de datos un NULL significa "la ausencia de un valor". Una cadena de longitud cero es un valor y un cero es un valor. Pero un NULL jamás será un cero y jamás será una cadena vacía. Lo más parecido a un NULL en bases de datos es el Conjunto Vacío o mas bien, un Universo Vacio.
En ese momento le pregunté: "¿si es la ausencia de un valor, entonces por que en la consulta los resultados variaban sólo por la presencia de un NULL?" y me dijo:
El valor de un Universo Vacío no es cero, es infinito, por tanto, si tratas de sumar "algo" más infinito el resultado es "infinito", no es determinable. Si quieres que el resultado de tu consulta sea determinable debes asegurarte de reemplazar el valor NULL de cualquier registro por un valor, por ejemplo, cero.
Luego de esto por medio de la función "coalesce" me encargué de reemplazar los NULL de los campos de la sumatoria por cero y listo! La consulta funcionaba correctamente otra vez. La lección de mi mentor terminó de la siguiente manera:
Siempre que vayas a tratar de realizar una concatenación o una operación matemática con campos de una base de datos, asegúrate que ningún valor sea NULL.
Ahora, luego de 10 años con bases de datos y programación, pienso que esta situación probablemente se originó por la forma como el servidor de base de datos maneja los valores de la consulta en memoria al hacer la sumatoria. Sin embargo la explicación considero que es perfectamente válida. Esta explicación también me ayudo a entender que en PHP un NULL también significa la ausencia de un valor y por tanto, concatenar un NULL con una cadena o número siempre resulta en un NULL.

Así que ya saben, para el caso de MySQL, si tienen que hacer una sumatoria (sum), promedio (avg), o concatenacion (concat), asegúrense que los valores de entrada nunca serán NULL. Si hay posibilidad que puedan serlo, usen la función "ifnull" para reemplazar los NULL por algún valor.



viernes, 1 de agosto de 2014

Enviar un correo en PHP a través de nuestra cuenta de GMail, Outlook o Yahoo

A veces se da el caso de que necesitamos enviar un correo a través de una página web realizada en PHP, ya sea por un formulario de contacto o porque queremos que la página nos envíe una notificación (un pago recibido, un inicio de sesión fallido, etc). A pesar de que PHP cuenta con la función "mail()" la cual puede solucionarnos la vida bastante rápido, la verdad es que muchos hosting no permiten enviar correo a través de esta función. Para ello podemos hacer uso de una clase muy útil llamada PHPMailer, la cual permite enviar correos a través de casi cualquier sistema de correo que soporte SMTP.

Puedes descargar el paquete de PHPMailer directamente aquí: https://github.com/Synchro/PHPMailer/archive/master.zip

Una vez que hallamos descargado el paquete vamos descomprimir el contenido en un directorio llamado "PHPMailer" dentro de la raiz principal de nuestro sitio PHP y agregaremos mediante "includes" las librerías necesarias al principio de nuestra página PHP.

require_once('../PHPMailer/class.phpmailer.php');
include("../PHPMailer/class.smtp.php");

Ahora, crearemos un objeto y configuraremos algunos parámetros para enviar correo a través de nuestra cuente PHP:

$mail  = new PHPMailer();

//asigna a $body el contenido del correo electrónico
$body = "Contenido del cuerpo del correo"; 

// Indica que se usará SMTP para enviar el correo
$mail->IsSMTP(); 

$mail->SMTPDebug  = 2;                     
// Activar los mensajes de depuración, 
// muy útil para saber el motivo si algo sale mal
// 1 = errores y mensajes
// 2 = solo mensajes entre el servidor u la clase PHPMailer

$mail->SMTPAuth = true;
// Activar autenticación segura a traves de SMTP, necesario para gmail

$mail->SMTPSecure = "tls";
// Indica que la conexión segura se realizará mediante TLS

$mail->Host = "smtp.gmail.com";
// Asigna la dirección del servidor smtp de GMail

$mail->Port = 587;
// Asigna el puerto usado por GMail para conexion con su servidor SMTP

$mail->Username = "tucorreo@gmail.com";  
// Indica el usuario de gmail a traves del cual se enviará el correo

$mail->Password = "tu contraseña";
// GMAIL password

$mail->SetFrom('name@yourdomain.com', 'First Last'); 
//Asignar la dirección de correo y el nombre del contacto que aparecerá cuando llegue el correo

$mail->Subject = "Probando enviar un correo con PHPMailer y GMail"; 
//Asignar el asunto del correo

//$mail->MsgHTML($body); 
//Si deseas enviar un correo con formato HTML debes descomentar la linea anterior

$mail->AddAddress("jonnathang@servidorcorreo.com", "Jonnathan Gutierrez"); 
//Indica aquí la dirección que recibirá el correo que será enviado

if(!$mail->Send()) {
  echo "Error enviando correo: " . $mail->ErrorInfo;
} else {
  echo "Correo enviado!!!";
}

Y de esta forma ya podrás probar el envío de correos desde PHP con tu cuenta de GMail. Si deseas probar enviar desde Hotmail/Outlook o Yahoo debes usar la siguiente combinación de servidores y puertos:

Outlook/Hotmail
$mail->Host = "smtp-mail.outlook.com";
$mail->Port = 587;
$mail->Username = "tucorreo@outlook.com"; //o bien tucorreo@hotmail.com  
$mail->Password = "tu contraseña";

Yahoo:
$mail->Host = "smtp.mail.yahoo.com";
$mail->Port = 465;
$mail->Username = "tucorreo@yahoo.com";
$mail->Password = "tu contraseña";   

Algunos consejos finales:

  1. En caso de querer enviar correo a través de gmail, hotmail, outlook o yahoo, asegúrate de usar en $mail->SetFrom(correo, nombrecontacto) el mismo correo que asignas a $mail->Username, si no lo haces tu servidor de correo o el servidor de correo del destinatario podrían marcar el correo como "SPAM" o un intento de suplantación de identidad y el correo nunca llegara a la bandeja de entrada del destinatario.
  2. Si deseas enviar publicidad mediante una página PHP te recomiendo respetar los limites de correos del sistema de correos que usaras. Por ejemplo GMail permite enviar solo 100 correos diarios. Tu cuenta de correo podría ser bloqueada por uno o varios días si superas esos límites.
  3. En caso de usar gmail, outlook, hotmail o yahoo, en $mail->Username debes usar el correo completo con dominio (tucorreo@hotmail.com, tucorreo@gmail.com...), no solamente el nombre de usuario.
En otra oportunidad hablaremos sobre unos consejos para enviar correo masivo mediante PHP...

jueves, 31 de julio de 2014

Cambiar formato de fechas de ISO a Latino o viceversa

Una par de lineas útiles para cuando estas trabajando en sistemas de bases de datos que necesitan mostrar fechas en formato latino pero deben ser almacenadas en formato ISO (MySql, PostgreSQL y otros).


De ISO a Latino:
$strFechaLatina = implode('-',array_reverse(explode('-',$strFechaISO)));

De Latino a ISO:
$strFechaISO = implode('-',array_reverse(explode('-',$strFechaLatina)));


Bonus:
Para convertir fechas en donde los dígitos están separados por barras, puntos o guiones ("/",".","-") se puede reemplazar la función explode y usar en su lugar preg_split.

$strFechaISO = implode('-',array_reverse(preg_split('/[-.\/]/',$strFechaLatina


Para que estas rutinas funcionen las fechas de entrada deben estar debidamente validadas.

miércoles, 30 de julio de 2014

Ordenando un arreglo de objetos en PHP

Recientemente me tocó realizar una función para ordenar un arreglo de elementos en PHP con la particularidad de que cada elemento es un objeto definido. Cada objeto del arreglo representaba un artículo de un catálogo y se debía ordenar el arreglo por la propiedad "precio" de cada objeto, de mayor a menor.

Al principio estuve tentado a repasar el algoritmo básico Quicksort y hacerle alguna modificación para trabajar con arreglos de objetos pero luego recordé que PHP tiene una función bien práctica para esto llamada usort.

bool usort ( array &$array , callable $value_compare_func )

La funcion usort recibe como parámetros un arreglo de cualquier tipoy el nombre de una función personalizada que se encargará de realizar la comparación interna de cada posición del arreglo. Suponiendo que nuestro arreglo se llama "artículos" y cada posición del arreglo es un objeto con una propiedad llamada "precio", podemos ordenar nuestro arreglo de menor a mayor de la siguiente manera:


function compararArticulos($a, $b){
    if ($a->precio == $b->precio){
        return 0;
    }
    return ($a->precio < $b->precio) ? -1 : 1;
}

usort($articulos, "compararArticulos");


Luego de esto ya es más fácil aplicar el ejemplo para ordenar arreglos multidimensionales.