La excelente respuesta de Wil Wheaton

Hace poco que retome el blog, vi que entre mis borradores estaba esta espectacular respuesta de Wil Wheaton, quien es famoso por interpretar a Wesley Crusher en Star Trek por allá en los años 90, y ahora por interpretarse a si mismo en la famosa serie The Big Bang Theory donde se interpreta a si mismo.

En una conferencia Comic Con en el año 2014, una niña le pregunta si cuando era pequeño lo llamaban nerd, su respuesta es algo que todos los niños y sus padres deberían ver, les dejo en video.


MapUtils de Apache Commons

Muchas veces nos toca obtener valores de una map por diversos motivos que no son objetivo de esta entrada, pero lo que si es cierto, que la lectura de estos datos pueden generar piezas de código complejas que se repiten por toda la aplicación como por ejemplo:

...
Object obj = map.get("key");
String keyValue = "default-value";
if(obj != null){
    keyValue = (String) obj;
}
...
...
String keyValue = (String) map.get("key");
if(keyValue == null){
    keyValue = "default-value";
}
...

pero con MapsUtils, podemos resumir todo ese código en:

...
String keyValue = MapUtils.getString(map, "key", "default-value");
...

corto, sencillo, sin repetir mucho código, menos código que probar ademas.

Entro otros métodos tenemos:

  • MapUtils.getBoolean();
  • MapUtils.getDouble();
  • MapUtils.getInteger();
  • MapUtils.isEmpty();

Anexo enlace a la librería: MapUtils de Apache Commons


Manejo de conversión de números en java – Apache Commons NumberUtils

Para retomar el blog, luego de varios de años, quería compartir un poco de mi aventura con java, iniciamos con la librería Apache Commons NumberUtils.

Muchas veces en nuestros proyectos nos encontramos con código de este estilo:

String tienda_id = "25";
Integer tiendaId = Integer.parseInt(tienda_id);

para el escenario anterior esta bien, no tendremos problemas, pero que pasa cuando tenemos un escenario como este:

String tienda_id = "25";
Integer tiendaId = Integer.parseInt(tienda_id);

tendríamos que manejar la excepción, con un código similar a este:

Integer tiendaId = null;
try {
    tiendaId = Integer.parseInt(tienda_id); //lanzará una excepción
} catch (NumberFormatException nfe) {
    tiendaId = 0;
}

imaginate que debes hacer esto en muchas partes de tu aplicación, te enfrentarias al escenario de tener código duplicado o de crear un método con propio que debes  mantener, hacer pruebas, etc, etc.

Pero con Apache Commons NumberUtils, esto esta solucionado, solo tienes que importar la librería (con maven o gradle o lo que uses) y al final se vería un código como este:

// en este caso devuelve default=0
Integer prodId = NumberUtils.toInt(tienda_id);
// si queremos devolver 25 o x
Integer prodId = NumberUtils.toInt(tienda_id, 25);

la librería ofrece otros métodos como:

  • toDouble
  • toFloat
  • toLong
  • muchos mas

solo te queda revisarla

referencias: Apache Commons NumberUtils


Implementar JQuery Gantt en nuestros proyectos

Hace poco en un proyecto me toco trabajar con un sistema de gestión de proyectos y era necesario mostrar un gráfico Gantt para mostrar las actividades del mismo, luego de una búsqueda intensiva en la web, encontramos la librería JQuery Gantt desarrollada por Roberto Bicchierai, aunque había opciones mas interesantes la mayoría son privativas, mientras que esta es Open Source.

img-jquery-gantt-view

Muestra de como se ve el Gráfico Gantt.

En mi caso me toco integrarlo con CodeIgniter (PHP), necesitaba persistir la misma en MySQL aquí que genere unos script SQL a partir de la documentación oficial, la cual aunque no es del todo clara funciona y permite realizar tus ajustes.

Los fuentes de este proyecto puedes encontrarlos en Github.

Para mostrar el gráfico, ejecuta el controlador Gantt la url debería ser algo así como: http//TUBASEURL/Gantt o   http//TUBASEURL/index.php/Gantt.

Si tienes problemas para visualizar algunas imágenes dentro de la vista gantt.php se encuentra la variable Javascript – GANTT_URL_RESOURCE ; colocar tu url, por defecto tiene base_url().

Si te gusta comparte, si necesitas ayuda con gusto puedo ayudarte.

Puedes consultar la documentación oficial aquí.


TimeStamp Javascript y PHP

Muchas veces cuando trabajamos con fechas y horas en nuestros diferentes proyectos webs, esto se vuelve un verdadero dolor de cabeza, y para complicarlo mas tenemos que manejar tiempo del lado del servidor (PHP) y por el lado del cliente (Javascript).

Resulta que Javascript maneja el timestamp en millisegundos, mientras que PHP, maneja el timestamp en segundos, ambos desde el tiempo Unix, veamos la diferencia de forma practica.

Tenemos como premisas que la hora del servidor es: 2014-03-20 18:22:51

Al ejecutar en PHP la función srttotime(‘now’); // el resultado es: 1395355971, cuando le enviamos este resultado Javascript, resulta que para el lenguaje faltan unos cuantos miles de milisegundos y para él, al ejecutar el siguiente código la fecha resultante es muy diferente, veamos: new Date(resultado); // resultado es: Fri Jan 16 1970 23:05:55 GMT-0430 (VET). Veamos el Ejemplo

Imagen

Bien, ¿Como resolvemos este comportamiento?, pues muy sencillo, podemos o multiplicar por mil (1000) el timestamp dado en javascript o en php (yo recomendaría hacerlo en PHP, ya que si estamos utilizando una librería JS de fechas, y esta recibe un JSON implicaría recorrer todo JSON en el cliente formatear y luego pasar el mismo, mientras que si lo hacemos con PHP, mientras construimos los arreglos estamos manejando los datos). Basta de texto y mas practica.

<?php

$milisegundos = strtotime(‘now’) * 1000;

$segundos = round($milisegundos/1000); //usamos round para redondear al segundo mas cercano.

?>

Imagen

Descargar el ejemplo aquí.


JQuery y elementos selects

Para muchos que utilizamos JQuery, muchas veces se nos tranca el serrucho a la hora de manejar elementos ‘selects’ en los formularios, ya que por una u otra razón necesitamos agregar o quitar valores específicos de los mismos, aunque muchos hemos resuelto este problema haciendo llamados vía ajax al servidor, esta quizás no sea la manera mas eficiente de hacerlo es allí donde una muy querida amiga me sugirió el siguiente  CheatSheet de JQuery para elementos selects. Es un archivo .pdf que cuenta con 6 paginas

JQuery-Selects-cheatsheet

Pagina 1 de JQuery-Selects-cheatsheet

Descarga el CheatSheet de JQuery para elementos selects

Si te gusto el CheatSheet compártelo con tus compañeros.

Articulo que publico el CheatSheet


SQL y Teoria de Conjuto

Muchas veces cuando estamos haciendo consultas SQL complejas olvidamos que la teoria de conjunto puede sernos muy util, es alli donde esta imagen dice mas que mil palabras

SQL Joins

SQL Joins

Estuve buscando el post original de esta imagen pero no lo encontré.

Agradecimiento es para mi pana JETTO, quien hace poco compartió esta imagen en un google+.

Los invito a compartir este post para que seamos muchos los que podamos beneficiarnos de tan gráfico ejemplo.


BD País, Estado, Municipio, Parroquia.

Buscando en la web una base de datos con información de sobre Estados, Municipios, Parroquias; en Venezuela los resultados fueron bastantes pobres, ademas del hecho de que como comprobar la veracidad de tal información, es allí donde decido apuntar a los entes oficiales, me comentaron que el INE de Venezuela tenia tal información pero en todo su web no la encontré,  así que apunte al CNE y bueno luego de un trabajo interesante (problema de estructura datos que comentare mas adelante), obtuve los script que encontraran mas adelante.

A continuación, veremos dos formas de implementar a nivel de base de datos la información de las localidades:

1. – Modelo normalizado donde encontraremos esta información divida en diferentes tablas.

Modelo Normalizado

Modelo Normalizado de varias tablas

Este modelo no necesita mayor explicación, ya que es la forma habitual como trabajamos con una tablas de BD.

2. – Modelo de una sola tabla, esto debido a que muchos en algunas ocasiones por la naturaleza de los datos, unen en una sola tabla este tipo de información, ya que básicamente estamos hablando de localidades (texto).

Tabla localidades

Modelo de una Tabla

En este modelo manejamos 2 ordenes, uno superior que es la tabla localidades en si misma y uno de menor nivel que  indica el tipo localidad que estamos manejando, que esta representado por campo tabla, el cual debería contener algo como los siguientes valores: país, estado, municipio, parroquia, posiblemente región, entre otros. Algunos podrían comentar que el campo no hace falta, pero en mi caso yo lo agrego para tener una información mas consistente del dato que estamos manejando y facilitar algunas consultas SQL. Otro tema a tener en cuenta es que MySQL no implementa cheks de campos como lo hace PosgreSQL, en ese sentido, tal vez es necesario el uso de un trigger (no implementado en estos scritps) para garantizar que el campo tabla, contenga solo los valores permitidos.

Los scripts fueron migrado a github, aquí el enlace: https://github.com/josearodrigueze/localidad-ve

Para finalizar, me gustaría hacer crecer estos scripts con la información de mas naciones, al menos en primera instancia latinoamerica. Quienes deseen colaborar pueden dejar un comentario o escribirme a josearodrigueze@gmail.com o por twitter @josearodrigueze. Otra forma simple de colaborar es compartiendo el post para así sumar la mayor cantidad de colaboradores posibles. Gracias.

Entrada Original: Jose A. Rodriguez E.


Registro de Auditoria/logs de sistema.

Actualmente estoy un sistema web empleando CodeIgniter (CI), PostgreSQL, JQuery y Bootstrap. Como todo sistema es necesario llevar un registro de las operaciones realizadas por los usuarios.

Imagen-auditoria-shutterstock

Busque alguna librería de CI que permitiera llevar este registro, pero no conseguí.

Así que me pregunte ¿qué datos de la operación en curso necesito almacenar?:
¿Cuál? URL.
¿Cuándo? Timestamp.
¿Quién? Usuario.
¿Desde dónde? Dirección IP.

Esos serian los datos más básicos, también podríamos almacenar: Navegador, Versión de Navegador, Sistema Operativo, entre otros.

En mi caso, es extremadamente necesario guardar los datos manejados en la operación y el resultado de la misma (ACCESS, SUCCESS y FAILURE).

Nota: para este post se tomo en cuenta que los lectores ya tiene un conocimiento previo sobre CI.

Me decidí crear una librería el cual pudiera llamar desde cualquier parte del sistema y así almacenar esta info. Identifique que CI posee dos librerías de las cuales podemos sacar la mayoría de la información, las cuales son: Input Class y User Agent Class.

Librería audit para CI.

Librería de CI para registro de Auditoria/Logs

Librería de CI para registro de Auditoria/Logs

Modelo para librería audit

Clase que provee el acceso a datos de la librería de CI Audit

Clase que provee el acceso a datos de la librería de CI Audit

Para implementar la librería, cárgala en tu controlador y en cada método donde necesites registrar la auditoria pega esta línea

$this->audit->register();

Para registrar el ID del usuario, utiliza la siguiente linea:

$this->session->set_userdata('user_id', IDUSUARIO); Si ya tienes registrado tu ID de usuario en session, pues cámbialo en la librería.

Si tu operación trabaja con datos recuerda llamar antes del método register() a:

$this->audit->setResult($result);
$this->audit->setData($data);

Con esas dos líneas registra los datos y el resultado de la operación.

En el caso del método setResult(),  recibe un Boolean, para indicar si el almacenamiento fue exitoso o no.

En mi caso yo centralice la salida de CI con el callback de controlador _output($output), allí coloque mi método register() y solo me preocupo por llamar los métodos setResult() y setData() donde es estrictamente necesario.

Descarga todo el código mas ejemplo aquí

Instrucciones copia el contenido de la carpeta application en tu carpeta application de CI (Ojo verifica bien no vayas a sobre escribir tu trabajo). Ejecuta los script en tu BD y listo.

Nota: Esto no es un log de los errores cometidos dentro del sistema, sino el registro de las paginas y que datos utilizo el usuario dentro del sistema.

Entrada Original: José Rodríguez


Cheat Sheet de Diferentes lenguajes de Programación

 

Acabo de encontrar una entrada de blog que agrupa diferentes Cheat Sheets de lenguajes programación, librerías, htaccess, apache mod_rewrite, herramientas como wordpress,  entre otros. La entrada es un poco antigua pero igual nos puede ser util

[Enlace] 57 Estupendas Chuletas (Cheat Sheets) … para nuestros proyectos web y otros lenguajes.