No todo lo grátis es bueno!

Desde que trabajo de manera independiente he tenido que ser más paciente e incisivo sobre las preferencias de los clientes, sobre todo cuando hay diseño gráfico involucrado, la mayoría de las veces no saben por cual muestra decidirse o escogen la que menos me gusta, irónico pero cierto. Aveces llega lo que defino como “clientes celestiales” estos ya saben lo que quieren, tienen bastante tiempo con el concepto en su cabeza y son muy decididos, la mayoría del tiempo ya poseen algunas muestras de lo que quieren o intentos hechos por otros freelancers que han fallado en completar el proyecto.

Hace semanas me contactaron para diseñar/desarrollar un sitio web completo, lastimosamente no puedo divulgar mucho sobre la finalidad del mismo, solo puedo decir que si todo va bien podría ser Trend Topic en twitter muy pronto, lo curioso es que fue uno de esos “clientes celestiales”, decidido y bien centrado en lo que quiere, tan atento que me proporciono algunas plantillas a modo de inspiración, estas plantillas para WordPress las había descargado de un sitio famoso, lo mejor de todo es que como el refirió, la plantilla “es gratis”.

Luego de examinar la plantilla en cuestión, me encontré con una linea bastante “diferente”, check this out:

La linea que me llamo la atención
Linea malvada!


WTF!, eso no parece un código común de una plantilla de WordPress, luego de decodificar varias veces esa linea me encuentro con esto:

Código Verdadero
Lo que escondia la linea en base64


Examinando el código observamos que no es tan grave, no están tratando de explotar una vulnerabilidad o algo parecido, solo están colocando publicidad, pero creo que a mi cliente no le hubiese gustado tener esa publicidad en su sitio. Moraleja… no todo lo gratis es bueno, siempre debemos al menos pasarle un antivirus al contenido que descargamos por la web, saludos.

Manejando Fechas al Programar (PHP)

La manera más facil y efectiva de manejar las fechas cuando estas desarrollando una aplicación (en este caso usando PHP) es usar fechas en formato “UNIX timestamp“. Podemos definir a las fechas en formato UNIX timestamp como la cantidad de segundos que han pasado desde 1 Enero, 1970 a las 00:00:00 GMT, lo que nos permite facilmente ejecutar calculos para transformar valores de fecha y tiempo.

Pero este formato no es perfecto, tiene características que pueden afectar tanto su uso como el funcionamiento, una de ellas es que no es leible por humanos normales (a menos de que seas Sheldon Cooper), por ejemplo si me preguntaras ¿Qué día es hoy? y te respondo 1309666385 ¿Estarías en capacidad de interpretar el numero y obtener la fecha en que necesitas?, seriamente lo dudo.

El otro inconveniente es que este formato solo puede usarse en un rango limitado dependiendo del Sistema Operativo. En sistemas basados en GNU/Linux puedes retroceder hasta el año 1902 y avanzar hasta el año 2037. En Windows el limite menor es “Enero 1, 1970” debido al tamaño del numero en UNIX timestamp. Cualquier Sistema Operativo puede manejar enteros hasta un tamaño especifico (2 levado a la 32, o 4.249.967.296 para 32 bits) despues de esta cifra se necesita más trabajo para manejar numeros grandes. Por materia de eficiencia este “maximo” es impuesto para valores importantes como horas y fechas. Linux permite tener valores negativos para ambos y por ende puedes obtener fechas anteriores al limite menor. Algunos se preocupan por estos limites, inclusive acuñan al problema como un segundo Y2K, yo tengo la confianza de que para el 2038 ya todos los Sistemas Operativos de 32 bits habran sido reemplazados y no esto no será un problema.

Lo anterior deberia preocuparte si estas pensando desarrollar una aplicación que necesite planificar tanto para el futuro como para el pasado o que simplemente permita el registro de personas donde uno de sus campos sea la fecha de nacimiento, pero para todo existe una solución. Existe otra razón para estar pendientes y es debido a la presentación de las fechas en numeros enteros, por ejemplo si tenemos la fecha Enero 2, 1970 en formato UNIX sera mucho mas corta en digitos que Mayo 13, 2009. Si vas a almacenar fechas o horas en formato UNIX timestamp en una base de datos asegúrate de que el campo tenga una longitud de 10 digitos y eso bastara para almacenar fechas lo suficientemente largas para mantener tu sistema ejecutandose unos cuantos años.

MySQL tiene su propio formato de timestamps y es mas sencillo de usar, su formato es “YYYY-MM-DD HH:MM:SS” y normalmente es almacenado en su propio tipo de columna llamado “datetime”. Si necesitamos usar comparaciones y ordenamiento simple este formato funciona muy bien usando las funciones internas del RDBMS; adicionalmente tienen la ventaja de ser legible por humanos y su longitud es predecible lo que lo hace más fácil para validar, pero si necesitamos que nuestra aplicación sea flexible a la hora de cambiar de manejador de base de datos y no dependa tanto de funciones internas de MySQL es preferible usar UNIX timestamps.

A la hora de hacer operaciones complicadas relacionadas con fechas u horas terminaras convirtiendo todo a UNIX timestamps, haciendo tantas conversiones manejando grandes porciones de datos probablemente caigas en el uso excesivo de recursos de Hardware altamente valiosos que pueden aminorar la velocidad de tu aplicación. Yo era estricto al usar MySQL timestamps y casi todas mis aplicaciones “viejas” las usan pero luego de estudiar más el tema comprendí la ventaja de usar UNIX timestamps.

La epifania llega al momento de hacer operaciones con intervalos de tiempo, es mucho mas facil usar UNIX timestamps a la hora de hacer ordenamiento, adiciones, substraciones y comparaciones entre dos fechas, ayuda a mantener consultas mas simples y a no comprometer la compatibilidad de tu aplicación si Oracle decide cambiar alguna funcionalidad de MySQL. En PHP tal facilidad viene de mano de la función “mktime()” que nos permite construir Unix timestamps usando segundos, minutos, horas, meses, dias y años de la fecha/hora necesaria. Imaginandonos que tenemos un sistema con millones de usuarios (Facebook, twitter, etc.) y donde cada bit de información es importante yo seguiria usando UNIX timestamps dado a que los campos “date” y “datetime” ocupan más espacio que uno “INT(10)”, quizas les paresca descabellado pero cuando tenemos 500 millones de usuarios cada bit (termina acumulandose y formando petabytes) de información que se almacena o se transmite a traves de DataCenters localizados en distintas partes del mundo es muy importante que esa data sea la más depurada y liviana posible, tal principio parece innecesario para una pequeña aplicación, pero su uso ahora puede ser un salvavidas mañana.

Finalmente es tema de opinion, MySQL también ha incluido funciones internas que hacen el manejo de UNIX timestamps más sencillo y flexible, eres libre de estudiar el tema y opinar al respecto en la sección de comentarios. Saludos.

Diferencia entre Clases Abstractas e Interfaces (PHP)

Como siempre hay amigos, familia, amigos de la familia, entusiastas del SL y de la Programación que encuentran mi correo por internet o me conocen por referencia y aprovechan la oportunidad para hacerme preguntas sobre temas diversos, en esta oportunidad 3 personas diferentes que estan comenzando a programar en PHP y estan estudiando el paradigma de la Programación Orientada a Objetos se han estado confundiendo mucho con las definiciones de Clases Abastractas e Interfaces proporcionadas en la documentación oficial de php.net y esta publicación es un intento para diluir esas dudas adicionalmente aprovecho esta oportunidad para disculparme con ellos pues prometí escalercer las dudas antes, pero esta semana los problemas terrenales me alcanzaron y tuve que lidiar con las diligencias/molestias/atenciones que conlleva una operación de emergencia, dando gracias porque todo salio bien y no hubo inconvenientes mayores.

¿Qué son las Clases Abstractas?

Las clases abstractas son clases normales con super poderes capacidades especiales, dado a que sus propiedades y metodos que pueden ser implementados o no dependiendo a las reglas del juego, pero, como sucede esto?, no hay mejor manera de explicarlo que con un ejemplo extraido de la documentación de php.net


class Fruta {
private $color;

public function comer() {
//Masticar
}

public function setColor($c) {
$this->color = $c;
}
}

class Manzana extends Fruta {
public function comer() {
//Masticar hasta llegar al Centro
}
}

class Naranja extends Fruta {
public function comer() {
//Pelar la Naranja
//Masticar
}
}

Instanciamos la clase, es decir, te doy una manzana y tu te la comes.


$manzana = new Manzana();
$manzana->comer();

Al finalizar el metodo “comer()”, podrías decir a que te supo la fruta, la respuesta sería a Manzana pues fue lo que te di y si te diera una fruta de manera generica…


$fruta = new Fruta();
$fruta->comer();

A que te supo la fruta?, no tiene mucho sentido ya que no deberias haber podido comerte la fruta pues no deberia funcionar de esa manera, en algun punto deberia de existir una restricción en la implementación de metodos y propiedades, por eso es que deberia declarar la Clase Fruta como abstracta y a su vez el metodo “comer()” que esta contiene.

Ejemplo:


abstract class Fruta {
private $color;

abstract public function comer()

public function setColor($c) {
$this->color = $c;
}
}

¿Que son las Interfaces?

Pensemos en las interfaces como declaraciones de metodos que objetos en comun pueden compartir, inclusive si esos objetos no guardan relación ninguna. Digamos que tenemos una serie de objetos que mediante la herencia no pueden conectarse o no pueden heredar metodos de un objeto padre ya que no tendria sentido, aqui es donde la interfaz juega un papel muy importante, por supuesto no hay mejor manera de explicar esto que con un ejemplo:


interface interaccion {
public function encender() {
//Procedimiento para encender
}

public function apagar() {
//Procedimiento para apagar
}
}

class lampara implements interaccion {
//Heredada de la Interfaz
public function encender() {
}
//Heredada de la Interfaz
public function apagar() {
}
}

class automobil implements interaccion {
//Heredada de la Interfaz
public function encender() {
}
//Heredada de la Interfaz
public function apagar() {
}
}

Espero que los ejemplos hallan sido suficientes para lograr su comprensión sobre el tema y en palabras finales podemos resumir que la diferencia entre las clases abstractas y las interfaces es que cada una se utiliza para disgregar y discernir limites en la estructura de la aplicacion que se quiere construir usando el paradigma de “Programación Orientada a Objeos”. Las interfaces nos permiten compartir comportamientos entre objetos no relacionados mientras que las clases abstractas nos permiten limitar y/o definir con precisión las capacidades de cada objeto.

Bienvenido Prado Labs

Me encanta dar buenas noticias y aprovecho para informar que ha visto la luz el blog Prado Labs. Partiendo de una iniciativa propia y por razones diversas decidi crear este espacio para dar a conocer a la comunidad de software libre hispana (o por lo menos para los que no tenian ni idea de que esta herramienta existe) las bondades del PHP Framework Prado, sus excelentes prestaciones, su facilidad de uso, su excelente documentación y las grandes cosas que se pueden hacer con el.

No me voy a dedicar explicar aquí para que sirve Prado, diríjanse al sitio y día a día (la cual es la frecuencia que estaré publicando Posts mientras la Familia/Trabajo me lo permita) para ir enterándose de sus amplias capacidades. La comunidad detrás de Prado es pequeña comparándose con otros Frameworks y busco incorporar nuevos usuarios hispano-parlantes a la mezcla, ayudar a este proyecto crecer es uno de mis objetivos de aquí en adelante porque para mi es importante ayudar compartiendo esta herramienta que me ha dado bastante de comer.

Prado no es un Framework nuevo, esta vivo desde el 2004 y ha sufrido muchos cambios en el camino así como ha superado muchos obstaculos, colaboremos y compartamos las herramientas que nos facilitarán el desarrollo del futuro. Si alguno de ustedes tiene conocimientos sobre Prado y lo ha utilizado en proyectos diversos y tiene el espiritu, las ganas y el tiempo para echarme una manito eres bienvenido, solo dejame un comentario y conversaremos. Gracias.

La Revolución y las Iteraciones en C++

Cuando las novedades se introducen por primera ves a un espacio con metodologías planteadas y definidas adereszandola con años y años de uso crea una revolución de la que todo el mundo quiere formar parte, muchas veces impacta tanto que se vuelve una tendencia. Hay muchos casos que puedo nombrar por ejemplo: Cuando La Escudería McLaren introdujo la primera carrocería hecha de fibra de carbono provoco una locura, las otras escuderías se quejaron ante la FIA y esta colmo con investigaciones para acallar las voces inpugnantes de los competidores, nadie creyó que la fibra de carbono pudiera reemplazar al aluminio que para la fecha era el componente principal en la construccion de los vehículos, peor aun pensaban que este bólido se destrozaria volviéndose polvo al tener un accidente y profesaban esa teoría con tanto fervor que dieron por muerto a John Watson cuando tuvo su primer accidente en el MP4/1 al salirse del circuito de Monaco, la ironía del hecho es que si hubiese estado detrás de un vehiculo construido usando los materiales tradicionales no se hubiese convertido en el anunciante principal de esta nueva tecnología.

En la actualidad usar fibra de carbono en los autos de formula uno se ha vuelto una tendencia inexorable y dado el roll que posee la F1 de cuna tecnológica; cada vez es mayor la presencia de estos materiales en los autos comerciales o de consumo masivo ya sea de forma ornamental o como fuente principal reemplazando el uso de metales. Otro ejemplo palpable de este tipo de revolución la encontramos en el mundo del deporte, en las olimpiadas celebradas en México en el año 1968, la categoría de Salto Alto fue provista de un evento tan particular que termino creando una tendencia posibilitando el record olímpico de Javier Sotomayor que ostenta la marca de 2.45m. Dicho evento o mas bien técnica fue denominada “the flop” o “the fusbury flop” y su creador Dick Fusbury la desarrollo al verse limitado por la que le fue impuesta por sus entrenadores (Originalmente utilizaba las técnica de las tijeras) permitiéndole ganar y romper el record de la epoca. Su técnica es actualmente utilizada por la gran mayoría de saltadores profesionales revolucionando el deporte.

Pero que tiene todo esto que ver con programación y específicamente con la manera en que iteramos en C++, desde mi punto de vista y experiencia tiene amplia relación, debido a que confiamos en el conocimiento impartido por nuestros profesores y este conocimiento moldea la manera en la que evolucionamos profesionalmente, particularmente crecí con la idea de iterar a traves de ciclos usando sentencias for y/o while dependiendo de los casos que se presentaban, estas sentencias permiten recorrer los arreglos secuencialmente, uno a uno desde el comienzo hasta el final permitiendo la elección de la información que queremos obtener o simplemente ejecutar mas sentencias. La manera en que iteramos depende intrisecamente del tipo contenedor que utilicemos y aqui es donde se desarrolla lo interesante, yo veo la iteracion STL (Standard Template Library) como la iteracion rockstar, algunos al leer esto se reiran de mi pero es porque estoy acostumbrado al modelo tradicional:

using namespace std;

vector arreglo;

arreglo.push_back(10);
arreglo.push_back(24);
arreglo.push_back(13);

for(int y=0; y<arrelgo.size(); y++)
{
cout<<arreglo[y]<<" ";
}

Y desde luego nuestro modelo rockstar:

using namespace std;

vector arreglo;
vector::iterator iterArreglo;

arreglo.push_back(10);
arreglo.push_back(24);
arreglo.push_back(13);

for(iterArreglo = arreglo.begin(); iterArreglo != arreglo.end(); iterArreglo++)
{
cout<<*iterArreglo<<" ";
}

Pero, ¿Cual es la diferencia?, simple, en el primer ejemplo usamos una iteración un un ciclo “for” comun, declaramos un vector y le incluimos 3 valores, al “for” le indicamos que va a comenzar desde 0 y aumentara ese numero siempre y cuando el valor de “y” sea menor que el tamaño del arreglo.

En el segundo ejemplo es básicamente lo mismo pero trabajamos con un iterador declarado y el ciclo “for” comenzara desde el primer valor del arreglo hasta el final, aumentando la posición del mismo. No hay mucha diferencia, algunos dicen que el segundo ejemplo es la _manera_ correcta de iterar, para mi viene siendo cuestión de costumbre debido a las experiencias pasadas (qbasic, pascal, c) lo bonito de la libertad es que podemos escoger cual de los dos utilizar. Ahora bien existen ciertas ventajas al usar iteradores siendo la mas importante la abstracción que se general al usarla y la posibilidad que nos brinda de accesar distintos contenedores sin importar el tipo de datos que guarden porque se tiende a observarlos como apuntadores limitados. Por supuesto no todo puede ser bueno y perfecto, hay que tomar en cuenta que estos no proveen un mecanismo para chequear los limites de iteración y desafortunadamente pasamos sobre el limite produciremos un Segfault. Aun quedan otras consideraciones que tomar en cuenta, pero si sigo extendiéndome mas terminaremos en una clase de “C++ For dummies” que no es lo que pretendía con el post.

Saludos, Axzel.

DOM, de manera sencilla y entendible

Antes de navegar en las profundidades del objeto XMLHttpRequest hay que explicar un poco el uso de otras herramientas que probablemente utilicemos para dar un mejor aspecto a la presentación de la aplicación que queremos realizar. DOM por sus siglas en ingles (Document Object Model) es nuestra interfaz de programación básica de aplicaciones que brinda un conjunto de objetos que nos permiten representar, dibujar o esgrimir código HTML y XML a su vez dándonos la posibilidad de acceder a ellos y manipularlos.

Si visitamos la Historia de finales de los 90 acerca del desarrollo web nos daremos cuenta de que se habla mucho de DHTML, si fue el boom de la época, pero ahora no es mas que un cumulo de técnicas que no deberían usarse y que solo se ajustan a la aplicación de efectos en Navegadores desactualizados. La utilización de DHTML en estos días esta sujeta a muchos sacrificios que no se previeron en su tiempo dorado, tales como dependencia de navegadores, falta de actualización de dichos scripts que fueron masificados y puestos en páginas a disposición de muchos desarrolladores que solo se preocuparon por la manera de Usarlos y no actualizarlos, lo cual vuelve un caos la aplicación si otros desarrolladores se unen a su mantenimiento sin contar que muchas de esas pequeñas grandes cosas estaban tan mal diseñadas y escritas que terminaban haciendo la pagina mas lenta, sucia y vulnerable con la actualización de los estándares.

¿Pero qué es DOM? Y ¿Qué puedo hacer con el?

DOM, es una manera de trabajar combinando XHTML y JavaScript o mejor digamos que es la capacidad otorgada por la interactividad de los dos lenguajes para que uno pueda acceder los objetos o elementos del otro. No hay mejor manera de explicarlo que con un ejemplo.

Digamos que tenemos cierta porción de Texto encerrada en un contenedor que queremos hacer invisible al ocurrir un evento.

El enlace llama a la funcion escrita en JavaScript “Esconder()” y este busca en el documento el elemento cuya id sea “porcionTexto” que es nuestra div y le coloque el estatus de visibilidad en “escondido” y de esta manera hemos accesado directamente el elemento y hemos modificado sus propiedades.

Cada tipo de Objeto DOM es único, inclusive si dos objetos se “ven” de manera idéntica en tu navegador, es importante que tres facetas definan el objeto per se, estas facetas son: ¿como se ve?, ¿Como luce? y ¿como se comporta?.
Estas facetas en el ámbito de la programación orientada a objetos se llaman, propiedades, métodos y manejadores de eventos.

Aqui les dejo una cheat sheet sobre la mayoria de los metodos de DOM o por lo menos los más usados. Por cierto tengo muchos cheat sheets y libros relacionados con el tema almacenados en casa a su disposición solo tienen que pedirlos de manera cortes. Saludos.

Aprendiendo JAVA viendo vídeos!

No hay mejor manera que aprender viendo como alguien programa, o mejor un recibiendo la ayuda de otros y todo desde un punto de vista experimental o con ejercicios. A mi siempre me ha gustado recibir el aprendizaje por parte de un facilitador a tener que aprender por propios medios, curiosamente el 90% de mis conocimientos sobre Desarrollo, Bases de datos, Administración de Sistemas, etc. proviene de leer manuales, libros y otras fuentes. Pero cuando se aprende así resulta más difícil pues no cuentas con una persona a la que preguntar y que te de una respuesta exacta sobre la incógnita.

Bueno, lo mas cercano a aprender con un profesor es que se explique paso a paso como hacer las cosas, revisando viejos links en delicious.com (por ciero ahora forma parte de Yahoo, no lo sabía) encontré listados de vídeos de distintos usuarios que de manera concisa explican paso a paso por muchos videos cortos como aprender a programar bajo Java. Los tutoriales van desde Instalar el SDK hasta trabajar con swine y applets. Aquí abajo les dejo las direcciones, lastimosamente los videos están en ingles pero con saber un poco de OOP y tener idea de como se construyen algoritmos lo demás viene por intuición.

  • Segun el autor thenewboston más de 80 videos continuos de diferentes topicos, practicamente desde lo incial relacionado con el lenguaje hasta desarrollo de guis y dibujos con applets. Muy completos.
  • Segun dkc1657: que tiene varios playlists, Helloworld desde eclipse, Conceptos acerca de la programación orientada a objetos llevados acabo con ejemplos de cuentas bancarias, Introducción al framework Swing para crear guis y para finalizar guia paso a paso para construir juegos usando applets (la ultima vez que los vi estaba incompleta pero era prometedora.
  • Eclipse and Java for Total Beginners: Esta serie de videos en ingles nos enseñan Java desde una perspectiva de “Test Classes” desde cero conjuntamente con Eclipse, es más estilo Programación en base a Pruebas (Test Driven Programming), simplemente Excelentes.
  • Por ultimo me gustaría que le echaran un ojo a estos que están en español, no los he visto pero me los recomendó un copañero hace algun tiempo y debido a casas de tiempo no pude revisarlos.

Tengo muchos libros de Java en formato digital para los que están comenzando, si los necesitan déjenme un comentario con su e-mail y se los facilito. Saludos.