jueves, 11 de octubre de 2018

La historia The Die Is Cast

En ocasiones nos perdemos a nosotros mismos, dejamos de lado nuestros sueños y deseos, esos sueños que teníamos de niños. dejamos de luchar por ellos, como dijo Mahatma Gandhi, cuida tus pensamientos... porque de ahí se deriva todo.


Luces de neón reflejadas sobre el asfalto mojado
Coches que pasan con luces que parecen ojos
Vuelves la vista porque notas que te siguen
Y justo delante de ti,  sale de un portal
Un grupo de monjes se te acercan
Con sus sotanas rojas bordadas
Te rodean y te impiden el paso
Quieren saber Que piensas
Quieren saber Que sientes
Quieren saber Quien eres
No tienes respuestas
¿Que les dices?
No estas seguro de lo que piensas
No crees en lo que sientes
Has olvidado quien eres
Los monjes se sienten,  no se molestan
Sabemos lo que te pasa por la cabeza
También que tienes un agujero en el corazón
No te equivoques
Estás siendo controlando
Y entonces te dejan seguir
Corres, corres rápido, ¿Te están siguiendo?
No, alguien te llama
Algo intangible como luces sobre las aguas negras
Como a esa estrella fugaz que hace mucho tiempo pediste un deseo
Y te preguntas si alguna vez conseguirás atraparla
Los coches que pasan parecen vacíos
Pero saben  a donde van
Tu también estas vacío, pero avanzas sin destino
Corre, da igual a donde.
Corre, una cosa es seguro
No se puede volver del octavo circulo...

La historia The Die Is Cast
Enigma

Resultado de imagen para estrella fugaz
https://educacion.uncomo.com/articulo/que-es-una-estrella-fugaz-descubre-aqui-la-respuesta-44305.html

jueves, 27 de septiembre de 2018

Openbravo POS con Java POS en Suse

He tenido la oportunidad de integrar la impresora IBM 4610 con Openbravo POS en el Sistema Operativo Suse.
Gracias al estándar Java POS podemos rápidamente integrar nuestra impresora IBM 4610 a nuestro sistema de punto Openbravo POS.

Escribo esta entrada para documentar mis conocimientos adquiridos y que sea útil para el resto.

Precondiciones

SUSE Linux Enterprise Point of Service 11 SP3
Tener Instalado los Drivers de los Dispositivos
Tener Instalado la versión Java POS del fabricante Toshiba

Integración con Openbravo POS

1.- Editar el archivo jpos.xml
Si tienes más de un driver Java POS instalado en tu equipo entonces vas a tener más de un archivo jpos.xml, identifica cual es el que está usando Openbravo POS.

La aplicación POSControlCenter que proporciona Toshiba cuenta con una funcionalidad para detectar los dispositivos que están conectados en nuestro equipo, esta funcionalidad genera un archivo jpos.xml con la configuración de cada uno de los dispositivos detectados.

Posteriormente debes hacer un merge(unificar) entre el archivo jpos.xml detectado por la aplicación POSControlCenter y el archivo jpos.xml que usa Openbravo POS.

2.- Editar el archivo start.sh
Debes editar el archivo start.sh de Openbravo POS, lo que haremos será actualizar las variables CLASSPATH y LIB_PATH

Identifica la ultima linea que hace referencia a la variable CLASSPATH y agregar las siguientes lineas.



Como ya has notado, estoy agregando el valor de la variable PATH a la variable CLASSPATH, algunos directorios que se encuentran en PATH son requeridos, no he dedicado tiempo para determinar con exactitud cuales son, lo haré más adelante, por ahora agrego la variable PATH.

Identifica la ultima linea que hace referencia a la variable LIB_PATH y agregar la siguiente linea.


La variable LD_LIBRARY_PATH es seteada por algun servicio de los drivers de Toshiba, en el se encuentran los directorios donde se encuentran las librerías nativas requeridas por los clases del driver Java POS.

Y eso es todo, ahora queda configurar en Openbravo POS el nombre lógico del dispositivo a usar.


domingo, 23 de septiembre de 2018

Guia esencial de Entrada/Salida en Java


Esta guía cubre las clases de la plataforma Java que son necesarias para operaciones básicas de entrada/salida. Primero se enfoca en los Streams (flujos de información) de entrada/salida, un poderoso concepto que simplifica enormemente las operaciones de entrada/salida. La lección también analiza la serialización, que permite que un programa escriba objetos completos en flujos y los vuelva a leer. Luego, la lección analiza las operaciones de entrada/salida de archivos y del sistema de archivos, incluidos los archivos de acceso aleatorio.

La mayoría de las clases Streams de entrada/salida cubiertas en esta guía están en el paquete java.io mientras que la mayoría de las clases entrada/salida de archivos cubiertas en esta guía  están en el paquete java.nio.file.

Guia de clases esenciales de Java

Esta guía ha sido escrita tomando como referencia la guía oficial de Oracle, en ella encontrarás lecciones sobre excepciones, entrada/salida básica, concurrencia, expresiones regulares y fundamentos del entorno de la plataforma Java.
En esta guía conocerás todas aquellas clases de la plataforma Java que son esenciales para la mayoría de programadores.

Excepciones

Está guía explica el funcionamiento de las excepciones y como estas son usadas para el manejo de errores y otras condiciones excepcionales. Explicaremos que es una excepción, como lanzar y atrapar excepciones, que hacer con una excepción una vez que ha sido atrapada, y como usa la jerarquía de clases de las excepciones.

Lo básico de Entrada/Salida

Esta guía cubre las clases de plataforma Java utilizadas para entrada y salida básica. Se enfoca principalmente en los Streams, un poderoso concepto que simplifica enormemente las operaciones de entrada/salida. Con los Streams podemos leer y escribir información desde nuestro programa java a una fuente externa de datos, tal como un archivo, un socket, otro programa en la red, etc,. La lección también analiza la serialización, que permite que un programa escriba objetos completos en flujos y los vuelva a leer. Luego, la lección analiza algunas operaciones del sistema de archivos, incluidos los archivos de acceso aleatorio. Finalmente, toca brevemente las características avanzadas de la nueva API de entrada/salida.

Concurrencia


El entorno de la plataforma

Expresiones Regulares

Las expresiones regulares son una forma de describir un conjunto de Strings o cadenas basadas en características comunes (o patrones) compartidas por cada cadena en el conjunto o grupo. Las expresiones regulares se pueden usar para buscar, editar o manipular texto y datos. Las expresiones regulares varían en complejidad, pero una vez que entiendes la base de como están construidos, estarás capacitado para descifrar o crear cualquier expresión regular. Esta lección te enseña la sintaxis de las expresiones regulares soportado por la API java.util.regex, y presenta varios ejemplos prácticos para ilustrarte como interactúan los diferentes objetos.

miércoles, 5 de septiembre de 2018

Deja de ser un hombre débil

Recuerdo que ella me dijo -"Ya no quiero estar contigo, quiero a un hombre a mi lado, no a un niño, no quiero un hombre débil como tu, quiero con carácter, un hombre de mundo, un hombre ambicioso,. Un hombre que tenga objetivos en la vida y que sepa lo que quiere". Yo tenía en ese entonces unos 19 años, y no comprendí lo de ser un hombre débil.
La vida se encargó de hacerme fuerte a golpes, me hubiese gustado haber tenido una charla con mi padre y que me dijese lo peligroso y  hostil que es el mundo. Un mundo en el que si no tienes carácter los demás te pisotearan.

No es mi culpa no haber forjado mi carácter, la ausencia de mi padre y el entorno donde crecí me convirtieron en un hombre débil, pero tenemos el poder de cambiar, de crecer y desarrollarnos, de forjar nuestro carácter para ser un hombre fuerte.

En esta entrada voy a compartir una lista de principios y hábitos que he desarrollado para dejar de ser ese hombre débil y forjar mi carácter.

Primero estás TU, segundo tu Familia luego el resto

No tengas miedo a decir lo que piensas

Si no estás cómodo con tu situación, cámbiala.

Aprende a decir NO con criterio

Practica artes marciales

Levanta pesas, cuida tu salud, haz deporte

Desarrolla tu filosofía de Vida

Ten metas y objetivos en tu Vida

Desarrolla tu auto critica sana

No te quejes, mejor actúa

Se agradecido de la vida, de lo que tienes

Aplica la Persistencia, Disciplina, Orden y Estructura en tu Vida



lunes, 20 de agosto de 2018

Usar la metodología TDD con Criterio

Cuando aplicamos la metodología TDD (Test-Driven Development) a menudo caemos en los dos extremos, al comienzo del proyecto aplicamos TDD a casi todas nuestras clases y métodos. Luego, a medida que se acerca la fecha de entrega nos damos cuenta que estamos atrasados, nos abrumamos y dejamos de lado el TDD.

Como casi todo (o todo!!!) en la vida, la clave es el equilibrio, buscar el punto medio, y este punto medio nos lo da nuestro criterio.

¿Qué criterios aplicar?
Leyendo el blog de http://calenlegaspi.blogspot.com/ coincido con el, para encontrar el punto medio podemos hacernos las siguientes preguntas.

1.- ¿Que tan probable es que este escenario(clases y métodos) presente incidencias?

2.- ¿Qué tan critico es este escenario?

3.- Las clases son complejas, requiero retroalimentación

¿Que tan probable es que este escenario(clases y métodos) presente incidencias?
Obviamente, no deberíamos probar cosas tan simples como los getters y setters, referencias nulas, números positivos, etc. Estás validaciones se dan por hecho.

Si en una primera o en una segunda revisión (si señor, hay que hacer revisiones) del código del escenario te asegura que funcionará, entonces no necesitas una prueba unitaria.

Muy importante, tu puedes incrementar la cantidad de código que no necesiten de pruebas unitarias, esto lo consigues usando librerías de terceros de alta reputación, es código ya probado y con un madurez importante.

Es por eso que más pruebas no necesariamente significa una mejor calidad del software. De hecho, se obtiene más calidad de software si re-usas código probado a implementar tu propio código.

Las clases son complejas, requiero retroalimentación
Aplicar TDD me permite recibir retroalimentación de como trabajaría mi clase en tiempo de ejecución, que tan fácil y cómodo será su uso o integración y validar que la clase o clases cumplan con la funcionalidad esperada.

miércoles, 8 de agosto de 2018

Consejos para ser un mejor programador

En mi trayecto como desarrollador de software he ido mejorando, aprendiendo de mis errores, aprendiendo de otros programadores. Cuando vivo una experiencia que me marca, lo anoto para después repasarlo. Siempre con el espíritu de crecer profesionalmente.

Tengo tantas ideas, principios y hábitos, algunos en mi mente, otros escrito en alguna hoja guardada entre las paginas de algún libro. En esta entrada pretendo ir organizando estas ideas para compartirlas, recibir retro alimentación o consejos adicionales.

Esta entrada complementa a la entrada ¿Como ser el mejor programador?

1.- Aprende a leer la documentación
Si eres programador del lenguaje Java, generalmente las clases de las APIs más usadas están documentadas en Javadoc, Javadoc es un estandard de Java para documentar. Lo mas relevante de Javadoc es comprender como usar una clase. Cada método tiene una breve descripción, los parámetros que recibe, el objeto que retorna, las posibles excepciones y las reglas más relevantes de uso. Muchas veces usamos una clase sin leer su documentación, violamos algunas reglas de uso y esto genera errores en tiempo de ejecución. Corregir los errores en tiempo de ejecución es muy costoso por eso es mejor invertir un poco de tiempo en leer la documentación de las clases.

2.- Conoce tu herramienta
¿Netbeans o Eclipse? No importa cual sea tu IDE favorito, invierte tiempo en conocer tu IDE. Siempre pregúntate ¿Como puedo optimizar esta tarea?


3.- TDD y depuración de código
Aplica TDD cuando consideres necesario y depura tu código fuente. Aplicar TDD me permite recibir retroalimentación de como trabajaría mi clase en tiempo de ejecución, que tan fácil y cómodo será su uso o integración y validar que la clase o clases cumplan con la funcionalidad esperada. Mas sobre TDD en esta entrada Usar TDD con Criterio

4.- Enfoque, que tu mente esté en el presente.
Es común programar en automático, muchas veces no estamos enfocados al 100% en el código que estamos escribiendo. ¿Te imaginas lo que pasaría si un cirujano está distraído mientras realiza una operación? Bueno... pues hay similitud con nuestro trabajo, una condición o validación errónea puede llevar a que nuestro sistema tenga comportamientos no esperados. (complementar con el punto anterior)

5.- Prudencia y Comunicación
Cuando modificamos código existente debemos tener mucho cuidado con los cambios que introducimos, si dudamos de los cambios que deseamos aplicar es mejor consultar con el resto del equipo. No hay que guardarnos nada, conocer la opinión de otros nos ayuda a corregir o justificar nuestras decisiones.

6.- Buscar la solución más simple
Resolver un problema es un arte, es muy buena practica tener más de una solución y buscar la solución más simple. No porque sea la más simple será la menos eficiente, de hecho, encontrar la solución más simple requiere ingenio, destreza y esfuerzo mental. El tiempo usado en encontrar la solución más simple es una inversión, la solución será menos propensa a errores, fácil de modificar y fácil de depurar.

7.- Pedir Ayuda y saber pedir ayuda
Trabajamos en equipo, tenemos compañeros, apoyémonos en ellos. Muchas veces no preguntamos por no quedar como tontos y esto lo único que hace es afectar nuestra paz mental. Nadie debería juzgarte o criticarte por preguntar. Sin embargo, debes saber pedir ayuda, ordena tus ideas, usa herramientas de comunicación para expresar tus dudas, herramientas como diagramas, dibujos, tablas etc,. Debes ayudar a que los demás comprendan tus dudas para que así puedan ayudarte. Tampoco es que los demás sean más inteligentes o quizás... muchas veces es porque tienen más experiencia, llevan mas tiempo en este arte del desarrollo de software y tu debes aprovechar estos conocimientos.

8.- No Re Inventes la Rueda, Re usa código
Está bien que para practicar programes cosas 

domingo, 29 de julio de 2018

¿Como resolver una incidencia de software?

La complejidad de resolver una incidencia es relativa, depende de muchos factores y condiciones, ayuda mucho establecer en que situación nos encontramos, algunas de las razones de la complejidad son las siguientes:

  1. El desarrollador no conoce el código fuente del software, recién se está involucrando.
  2. La incidencia es muy ambigua, muchas veces esperamos que el error se haga evidente mediante un popup en la GUI, sin embargo, puede ser un error silencioso que solo se hace evidente en el resultado de la funcionalidad.
  3. La incidencia se presenta solo cuando el software es sometido a condiciones extremas, una gran cantidad de datos, muchas peticiones simultaneas o un entorno de red con mucho trafico.
  4. El desarrollador está experimentando con una tecnología nueva.
He establecido una serie de pasos que a mi me ayudan a resolver la incidencia de forma exitosa.


1.- Análisis del problema

Lo primero es comprender la incidencia desde el punto de vista del usuario, tener muy claro que es lo que el usuario percibe como incidencia, puede ser muy evidente como un popup con la descripción del error o puede ser muy difícil de comprender. Si la incidencia no es muy clara solicitaremos al usuario que nos narre en forma de historia que fue lo que pasó, hay que poner especial atención a los detalles.

Usualmente el Usuario reporta la incidencia en alguna herramienta o gestor de incidencias, debes leer detalladamente toda la información disponible, presta atención a cada detalle.
Si hay un popup con mensaje de error, este mensaje puede ser muy genérico, para obtener más detalle hay que revisar los archivos  logs de la aplicación y buscar más información sobre la incidencia.

Es importante que confirmes que la información entregada por el usuario sea coherente, que tenga sentido, muchas veces el usuario hace suposiciones sin sentido. Para ello te apoyaras en tus conocimientos sobre la aplicación, tu sentido común, tu lógica y por último, aprovechando la información de los logs.

1.1- Ponerse en Contexto (aplica con mayor relevancia si eres nuevo)
Si recién te has integrado al equipo de desarrollo y producto, lo primero será ponerte en contexto, aprender sobre la funcionalidad que presenta la incidencia, ¿Cuál es el objetivo?, ¿Qué datos de entrada se necesitan? ¿Qué resultados se esperan?
Familiarizarte con cada uno de los conceptos (jerga de palabras) que se manejan te ayudará a ser más productivo, ante la duda siempre pregunta.


2.- Replicar la incidencia
Una vez que tenemos muy claro en que consiste la incidencia, procedemos a replicarla en nuestro ambiente de desarrollo, este paso puede ser muy simple o muy complejo, puede tomar un par de minutos o incluso horas, dependerá de la complejidad de la incidencia.
Debes apoyarte del usuario que reportó la incidencia, si la complejidad es alta y tienes acceso en persona al usuario, lo mejor será que te muestre in situ como replicar el error. Si no tienes acceso en persona usa todas las herramientas disponibles a tu alcance: email, whatsapp, hangout, videos, etc,. Todo se vale.

Usualmente una incidencia se replica bajo ciertas condiciones, estás condiciones pueden ser los datos que el usuario utilizó, la forma (secuencia de pasos) en qué el usuario usó el sistema, el ambiente (configuración y hardware del sistema) donde el usuario usó el sistema.

Si la información proporcionada no es suficiente para replicar la incidencia y no podemos acceder al usuario que la reportó ni podemos acceder al ambiente donde se replica, lo único que nos queda es tratar de reconstruir los hechos mediante los logs de la aplicación. Buscaremos los datos que el usuario usó y realizaremos las actividades en la misma secuencia que el las realizó, nuestro objetivo es replicar la incidencia.

Si replicar la incidencia es complejo, te sugiero los siguientes pasos:

  1. Has una lista de todas las variables y escenarios que podrían afectar tu funcionalidad.
  2. Ordena la lista de acuerdo a la facilidad de probar
  3. Empieza por probar cada ítem de la lista del más simple al más complejo.


3.- Identificar los componentes GUI involucrados
Si la incidencia se reproduce en un ambiente GUI, debemos identificar el componente asociado a la funcionalidad de la incidencia. Usualmente el componente de partida será el botón por el que el usuario ejecuta la funcionalidad.
Sabemos que una funcionalidad puede involucrar un conjunto de componentes, debemos usar la observación, la astucia, la intuición y el sentido común para determinar que componentes son los que requieren ser revisados, así reducimos el espacio y conseguimos un mayor enfoque.

4.- Identificar las clases y métodos involucrados
Una vez identificado el botón u otro componente GUI que inicia la funcionalidad, vamos a identificar las clases y métodos involucrados.

5.- Resolver de forma aislada
Una vez que tenemos identificados las clases y métodos involucrados, vamos a debuggear de forma aislada cada uno de esos métodos, para ello como pre condición es necesario saber que hace cada método, cuales son los datos de entrada y que datos de salida se espera. Aconsejo debuggear porque así vamos leyendo cada linea de código fuente, y podemos identificar errores lógicos.
Si la incidencia no consiste en errores lógicos, debemos preguntarle al usuario que esperaba como resultado, posiblemente es un error de diseño y hay que buscar otro algoritmo.

6.- Probar la solución
Por ultimo, realizar las pruebas necesarias


sábado, 28 de julio de 2018

Que fue de Rational Software

Cuando estudiamos UML es inevitable leer sobre la empresa Rational Software, empresa que definió e impulso esta herramienta de modelado para el desarrollo de software, hasta llegar a ser un modelo estandard.
La empresa fue adquirida por IBM por la cuantiosa cifra de 2.1 billones de dolares, una cifra que  ni siquiera soy capaz de imaginar. La adquisición fue anunciada en Diciembre del 2002 y concretada el 21 de Febrero del 2003, casi dos meses duró el proceso.
Rational Software fue una empresa que desarrolló metodologías y herramientas para el desarrollo de software, pero lo mas valioso es que estás herramientas y modelos son un estandard y además son abiertas, es decir, están disponibles para el publico, al menos una parte de ellas.
Rational fue una empresa comprometida con la ingenieria de software, impulsó las mejores practicas y servicios para el desarrollo de las aplicaciones empresariales, la construcción de software y sistemas en general, incluyendo software embebido tales como software para telefonos y equipos mobiles.
Rational fue importante, IBM le puso el ojo y desembolsó tremenda cantidad de dinero. Para mi, el legado de Rational es que gracias a ellos ahora podemos desarrollar software de forma más rapida, segura, de calidad y software que está preparado para un entorno que cambia rapidamente.
Al momento de ser adquirida tenía clientes en al menos 89 ciudades, contaba con mas de 3400 empleados, y se estima que más de 600 000 desarrolladores de software usaban sus herramientas. Ahora Rational pertence a IBM y es participante de un mercado que se estima en mas de 15 billones de dolares.
La industria del desarrollo de software aun tiene para varios años más.
Se supone que Grady Booch fue fundador de Rational, pero oficialmente se reconoce a Mike Devlin, un veterano y ya retirado ingeniero en ciencias de la computación.

Referencias
https://www-03.ibm.com/press/us/en/pressrelease/314.wss


¿Como ser un mejor Líder?

Nunca fue mi intención asumir el rol de Líder Técnico, las responsabilidades de este rol son complejas y a mi me gusta la calma, la paz. Si he de enfrentar la adversidad quiero hacerlo solo, porque me conozco, se como motivarme, se como llevarme al limite, de hecho he sido mi propio líder.
Como cualquier otro apasionado por el Desarrollo de Software, tengo una visión, y quizás mi mayor anhelo es poder transmitir está visión al resto de mi equipo.

He aprendido que un líder se hace a través de sus acciones, de hechos y no de palabras, para mi en estos meses ha sido fundamental reconocer cuales son esas acciones, para redoblar esfuerzos, mejorar mi capacidad y motivar a mi equipo de trabajo.
Como siempre, escribo estás lineas, primeramente para organizar mis ideas, y para cumplir con una promesa que me hice años atrás: la de compartir mis experiencias con la nueva generación.

Mantener motivados a tu equipo de trabajo es un gran desafío, hacer que se pongan la camiseta de la empresa, que sientan cariño por la empresa y por el producto. Pero para lograrlo es necesario primeramente, ser un líder ejemplar, predicar con el ejemplo. En momentos de crisis la empresa tiene que ser guiada de forma correcta para mantener la esperanza y confianza en que tarde o temprano se logrará salir de este bache.

Un líder tiene que ser un referente para el resto del equipo, dirigir, motivar y exigir de la mejor manera para lograr un ambiente grato y alcanzar los objetivos propuestos.

Sin embargo, ocupar este puesto no es fácil, no ha sido fácil para mi, porque ante la adversidad la mayoría o todos se darán por vencidos, dirán que es muy difícil e incluso imposible y se quedarán de brazos cruzados, pero tu no, tu tienes que resolver, tu tienes que buscar la solución, tienes que confiar en ti, en tus capacidades y habilidades. Algunos días tendrás que quedarte hasta tarde, porque los problemas se tienen que solucionar, para el líder no existe la palabra imposible, ser líder requiere un enorme compromiso.

El bienestar laboral y emocional de tu equipo es una gran responsabilidad, debes cuidar que tu equipo te vea como un aliado que confíe en ti  y no como el malo del cuento, pero no debes ser tan suave como para que pasen encima de ti. Debes saber cuando ejercer presión, pero también conocer el limite de la presión que puedes ejercer.

En estos meses he aprendido mucho y puedo escribir los siguientes consejos, los escribo con el fin de no olvidarlos y echar mano de ellos cuando los necesite.

Poner el Ejemplo

El buen juez por su casa empieza, un buen líder es aquel que pone el ejemplo, un líder se compromete y cumple con sus compromisos en tiempo y forma. No se puede esperar que tu equipo sea comprometido si tu no lo eres. No se puede esperar que tu equipo aplique las buenas practicas y/o metodologías si tu no lo haces. No se puede esperar que tu equipo aplique Testing Unitario si tu no lo haces. No se puede esperar que tu equipo use las herramientas si tu las ignoras. Un primer paso es poner el ejemplo de estas y otras actividades.
El equipo tiene verte fuerte y seguro de ti mismo en aquellos momentos de adversidades, tienen que ver como tu estás seguro de que encontrarás la solución, que no hay imposibles para ti. Tienen que verte calmado y relajado aun en esas adversidades. ¿Como se consigue esto? Con experiencia y conocimientos.

Establecer Limites

Un líder tiene que reunirse periódicamente con su equipo para dejar claras las responsabilidades de cada uno y al mismo tiempo para conocer las capacidades de su equipo. Y aquí hay que ser bien detallado y preciso. ¿Cuantas horas le toma hacer cierta actividad?, ¿Que tan complejo era la tarea? ¿Que tecnologías se involucraron? ¿Que metodologías? ¿Qué se obtuvo como resultado?, etc,.  Hay que determinar de forma objetiva y verdadera la capacidad que tiene cada uno para poder alcanzar sus metas. Con esta información podrás organizarte mejor y asumir los compromisos en tiempo y forma.

Delegar Tareas

Desde luego, mas de una ocasión he pensado, mejor lo hago yo, porque me gusta que las cosas se hagan bien o un poco mejor que bien y en un dos por tres. Lo cierto es que el tiempo es escaso para nosotros los lideres. Delegar es una de las tareas más importantes, delegar implica confiar en tu equipo, pero la confianza se tiene que ir ganando, de a poco, y tu tienes que delegar paso a paso, primero tareas simples, para que tu equipo vaya cogiendo confianza y experiencia en ellos mismos, y así ir incrementando gradualmente la complejidad. Eso es lo ideal, pero sabemos que en la practica no todos es lineal, a veces hay calma y a veces hay tormentas.
Un líder que no delega no trabaja en equipo, trabajar en equipo es esencial para lograr el bienestar emocional y laboral del equipo, porque haces que se sientan parte de "algo", que sientan que también están contribuyendo en "algo".

Se un mentor
Tienes que ser alguien cercano a tu equipo, ayudarles a crecer, conocer sus fortalezas y debilidades. Poder detectar las fortalezas y debilidades de tu equipo requiere que desarrolles tu capacidad de observación. Sin embargo, si tu has crecido (profesionalmente) desde muy abajo, eso es muy bueno porque te permitirá conectar de una forma más real y sincera, tu pasaste por ahí y sabes lo que tu equipo piensa y siente.

Pida Ayuda

El desarrollo de software es complejo, no podemos abarcar todas las áreas, "nadie nace sabiendo todo " -decía mi abuela. Pedir ayuda no es malo, mostrar un poco de vulnerabilidad es bueno, así tu equipo sabrá que eres tan humano como ellos, que tienes debilidades técnicas pero que las compensas pidiendo ayuda. En ocasiones nos aturdimos y no logramos ver todo el panorama, siempre ayuda pedir la visión y/o percepción de otra persona, porque puede que ella vea ese pequeño detalle que tu estás pasando por alto.
También es bueno pedir ayuda a tu equipo cuando por falta de tiempo tu no puedes cumplir con tus compromisos, eso ayuda a fortalecer la confianza.

Seguiré escribiendo mas sobre estos temas a medida que vaya aprendiendo.




domingo, 8 de julio de 2018

Crear base de datos mysql desde linea de comandos

Siempre viene bien tener conocimientos de bajo nivel para realizar operaciones básicas en el gestor de base de datos MySQL. En esta entrada voy a compartirles como crear un nuevo usuario para crear una base de datos. Es buena practica no usar el usuario root para realizar operaciones sobre las bases de datos del usuario.

1.- Crear un usuario en MySQL
Lo primero que haremos será crear un usuario, voy a crear un usuario llamado roberto con password superpassword.

Para ello vamos abrir una linea de comandos  e ingresaremos a MySQL como usario root, ejecutamos el siguiente comando:

mysql --host=localhost --user=root --password=contrasenaroot

Una vez ingresado a MySQL como root, ejecutamos el siguiente comando:

CREATE USER 'roberto'@'localhost'  IDENTIFIED BY 'superpassword';

donde localhost indica que este usuario solo se puede conectar en modo localhost

2.- Crear la base de datos
Para crear la base de datos, en la misma ventana de linea de comandos ejecutamos el siguiente comando:
create database roberto_db;

3.- Asignar permisos al usuario para la base de datos
Por ultimo, debemos asignarle permisos al usuario roberto para que pueda realizar operaciones a la base de datos roberto_db, ejecutamos el comando:

GRANT ALL PRIVILEGES ON roberto_db. * TO 'roberto'@'localhost';

4.- Verificar base de datos y usuario
Para verificar que todo este funcionando correctamente, abrimos otra ventana de linea de comandos, e ingresamos a MySQL con nuestro usuario roberto, ejecutamos el comando:

mysql --host=localhost --user=roberto --password=superpassword

y luego el comando:

use roberto_db;

Si todo, está correctamente, veremos el mensaje "Database changed".

5.- Crear un tabla
Finalmente vamos a crear una tabla para la base de datos roberto_db;











lunes, 2 de julio de 2018

Salida al Valle Nevado y Farellones

Uno de los grandes atractivos de Chile es sin duda la cordillera de los Andes, y en invierno se cubre de nieve. Termine en tiempo y forma mi semestre universitario, así que podía relajarme. En estos días conocí a una mujer, alegre, aventurera y viajera, una mujer apasionada por la vida y que aprovecha  el tiempo al máximo, así que aproveché la ocasión y compartimos esta aventura.
Fue la primera vez que voy a la nieve, fui a sentir lo que es una nevada, a tocar la nieve y sentir ese viento frío, muy helado.

Fue una semana laboral muy intensa y estaba muy agotado, así que solo quería dormir hasta muy tarde, pero el bus que me llevaría al valle nevado salía las 8:30 am, así que no había opción, tenía que levantarme si o si.

Mientras subíamos la montaña  veía el paisaje y me recordaba a mi infancia, aquel lugar donde crecí, rodeado de la naturaleza, un tesoro invaluable, montañas, arboles, viento, sol y lluvia. Tengo que regresar pronto, definitivamente.

Finalmente llegamos a Valle Nevado, 3000 metros sobre el nivel del mar. Creo que esta salida me permitió reencontrarme con mi niño interior, y es que en este tour, iba una niña de unos 13 o 14 años. Ella era feliz revolcándose en la nieve, y creo que me contagio esa buena vibra, esa alegría, pasa que creo que uno puede ser feliz con aquellas cosas simples, la felicidad es simple pero en ocasiones nos complicamos la vida.

Definitivamente lo que más me gustó fue deslizarme por la nieve en un trineo, adrenalina y empaparme de nieve. Sin duda me hubiese quedado todo el día subiendo aquellas colinas y deslizándome una y otra vez. Pero se requiere tener buena condición física y he descuidado el deporte, definitivamente debo retomarlo... y pronto.























sábado, 19 de mayo de 2018

El fenomeno de la Tecnologia Java

Hablar de la Tecnología Java es tan común hoy día, pero ¿Que es exactamente la tecnología Java?, hay muchos conceptos y subtecnologías involucradas que muchos se confunden. He decidido escribir una serie de entradas para aquellos novatos que recién se están incorporando al mundo Java.
En esta entrada trataré de explicar como la tecnología Java se compone de un lenguaje de programación mas una plataforma.
La tecnología Java es tanto un lenguaje de programación como una plataforma.

El lenguaje de programación Java

El lenguaje de programación Java es un lenguaje de alto nivel, puede ser descrito por las siguientes palabras claves:
  • Simple
  • Orientado a objetos
  • Distribuido
  • Concurrente
  • Dinámico
  • Portable
  • Alto Redimiendo
  • Robusto
  • Seguro

Cada uno de estos conceptos se explica en The Java Language Environment, un informe redactado por James Gosling y Henry McGilton y que discutiremos más tarde.


En el lenguaje de programación Java, todo el código fuente es escrito en archivos de texto plano con extensión .java. Luego estos archivos son compilados en archivos con extensión .class por el compilador javac. Un archivo .class no contiene código nativo para el procesador, en su lugar contiene bytecodes - el lenguaje de la maquina virtual de Java (Java VM). Entonces el comando de java puede ejecutar tu aplicación en una instancia de la Maquina Virtual de Java.

Una vista general del proceso de desarrollo de software en Java

La maquina Virtual de Java esta disponible en diferentes sistemas operativos, los mismos archivos .class pueden ser ejecutados en Microsoft Windows, Solaris, Linux, o Mac OS.
Existen varias implementaciones de la Maquina Virtual, Oracle proporciona una, conocida como Java SE HotSpot, esta maquina ejecuta algunos pasos adicionales en tiempo de ejecución para darle a la aplicación mayor rendimiento. Esto incluye varias tareas como encontrar cuellos de botella que afecten el rendimiento y recompilar a código fuente nativo aquellas secciones de código usado con frecuencia.


Por medio de las maquinas virtuales, la misma aplicación puede ser ejecutada en diferentes plataformas.

La plataforma Java

Una plataforma es el entorno hardware o software en el que se ejecuta un programa. Ya hemos mencionado algunas de las plataformas más populares como Microsoft Windows, Linux, Solaris OS y Mac OS. Se puede describir a la mayoría de las plataformas como una combinación del sistema operativo y el hardware subyacente. La plataforma Java difiere de la mayoría de las demás en que es una plataforma solo-software que se ejecuta encima de otras basadas en hardware.
La plataforma Java tiene dos componentes:

  • La Máquina Virtual Java
  • La Interfaz de Programación de Aplicaciones (API)
Ya hemos presentado a la máquina virtual Java; es la base de la plataforma Java y ha sido portada a varias plataformas basadas en hardware.
El API es una gran colección de componente de software listos para usar que proporcionan muchas funcionalidades útiles. Está agrupada en bibliotecas de clases relacionadas e interfaces; estas bibliotecas se conocen como paquetes. En la siguiente sección, ¿Qué puede hacer la tecnología Java? se resaltan algunas capacidades proporcionadas por el API.
El API y la máquina virtual Java aíslan al programa del hardware subyacente.

Al ser un entorno independiente de la plataforma, la plataforma Java puede ser un poco más lenta que el código nativo. Sin embargo, los avances en las tecnologías de los compiladores y las máquinas virtuales están acercando el rendimiento al del código nativo sin amenazar la portabilidad.

¿Qué puede hacer la tecnología Java?

El lenguaje de propósito general y alto nivel Java es una potente plataforma de software. Todas las implementaciones completas de la plataforma Java le proporcionan las siguientes características:

Herramientas de desarrollo: Las herramientas de desarrollo proporcionan todo lo que necesitará para compilar, ejecutar, monitorizar, depurar y documentar sus aplicaciones. Como desarrollador novel las principales herramientas que usará son el compilador javac, el lanzador java, y la herramienta de documentación javadoc.

Interfaz de programación de aplicaciones (API): El API proporciona la funcionalidad esencial del lenguaje de programación Java. Ofrece un amplio conjunto de clases listas para usar en sus propias aplicaciones. Abarca desde objetos básicos hasta el trabajo en red y la seguridad, la generación de XML y acceso a bases de datos y más. El núcleo del API es muy grande; consulte la documentación del Java SE Development Kit 6 (JDKTM 6) para obtener una vista global de lo que contiene.

Tecnologías de distribución: El software del JDK proporciona mecanismos estándar, como con el software Java Web Start software y Java Plug-In para la distribución de sus aplicaciones a los usuarios finales.

Conjuntos de herramientas de interfaz gráfica: Los conjuntos de herramientas (toolkits) Swing y Java 2D aportan la posibilidad de crear sofisticadas interfaces gráficas de usuario (GUIs).

Bibliotecas de integración: Las bibliotecas de integración como las APIs Java IDL, JDBC, «Java Naming and Directory Interface» (JNDI), Java RMI y «Java Remote Method Invocation over Internet Inter-ORB Protocol Technology» (Java RMI-IIOP Technology) proporcionan el acceso a bases de datos y la manipulación de objetos remotos.

¿Cómo cambiará la tecnología Java mi vida?

No podemos prometerle fama, fortuna, ni siquiera un trabajo si aprende el lenguaje de programación Java. Aún así, es probable que mejorará sus programas y requiere menos esfuerzo que otros lenguajes. Creemos que la tecnología Java le ayudará a hacer lo siguiente:

Empezar rápidamente: Aunque el lenguaje de programación Java es un potente lenguaje orientado a objetos, es fácil de aprender, especialmente para programadores que ya estén familiarizados con C o C++.

Escribir menos código: Las comparaciones de métrica de programas (número de clases, número de métodos, etc.) indican que un programa escrito en el lenguaje de programación Java puede ser cuatro veces más pequeño que el mismo programa escrito en C++.

Escribir mejor código: El lenguaje de programación Java fomenta las buenas prácticas de programación y la recolección de basura automática le ayuda a evitar fugas de memoria. Su orientación a objetos, su arquitectura de componentes JavaBeans y su API extensa y fácilmente extensible le permiten reutilizar código existente y probado y generar menos erratas.

Desarrollar programas más rápidamente: El lenguaje de programación Java es más simple que C++ y, por esto mismo, su tiempo de desarrollo puede llegar a reducirse a la mitad. Sus programas también necesitarán menos líneas de código.

Evitar dependencia de la plataforma: Puede mantener su programa portable evitando el uso de bibliotecas escritas en otros lenguajes.

Escribir una vez, ejecutar en cualquier lugar: Puesto que las aplicaciones escritas en el lenguaje de programación Java se compilan hacia bytecodes independientes de la máquina, éstas se ejecutan en cualquier plataforma Java con consistencia.

Distribuir software más fácilmente: Con el software Java Web Start, los usuarios podrán lanzar su aplicación con una sola pulsación del ratón. Una comprobación automática de versión asegurará que los usuarios siempre estén al día con la última versión de su software. Si hay disponible una actualización el software Java Web Start automáticamente actualizará su instalación.


jueves, 3 de mayo de 2018

¿Que es un Lider Tecnico?

Tech Lead en ingles, hay varios nombres para roles de liderazgos en el desarrollo de software, tales como Desarrollador Senior, Arquitecto, Líder Técnico y Director de Ingeniería. Para mi, el Líder Técnico juega un rol único y esencial que otros no pueden.

En resumen, un Lider Tecnico es un desarrollador responsable de liderar un equipo de desarrollo.

Liderar un equipo de desarrollo no es una tarea fácil, muchas veces será necesario alinear intereses, inculcar nuevos hábitos e incentivar la mejora constante de habilidades personales. Un Líder Técnico efectivo establece una visión técnica con el equipo de desarrollo y trabaja junto a los desarrolladores codo a codo para convertir la visión en una realidad. Es deseable que el Líder Técnico tenga carisma, empatía, que sea  motivador y visionario. Pero estos habilidades y talentos son prescindibles.


miércoles, 18 de abril de 2018

La Plataforma Java Empresarial

He notado que existe mucha confusión, dudas e inquietudes acerca de la Plataforma Java Empresarial, la plataforma es muy extensa y algunos conceptos pueden llegar a confundir. Por ello decidí escribir esta entrada, espero poder aclarar todas las dudas.

Los desarrolladores de hoy reconocen cada vez más la necesidad de contar con aplicaciones distribuidas, transaccionales y portables que  aprovechen la velocidad, seguridad, y confiabilidad de la tecnología del lado del servidor.

Las aplicaciones empresariales proporcionan la lógica de negocio para una empresa. Estas aplicaciones son gestionadas de forma centralizada y, a menudo interactuan con otras aplicaciones empresariales.

En el mundo de las tecnologías de información, las aplicaciones deben diseñarse, construirse y entregarse con bajo presupuesto, con mayor velocidad y con menos recursos.

Con la Plataforma Java Empresarial (Java EE), el desarrollo de aplicaciones empresariales nunca había sido mas fácil o mas rápido. El objetivo de la plataforma Java EE es proporcionar a los desarrolladores un conjunto de APIs muy potentes, permitiendo reducir el tiempo de desarrollo, la complejidad de la aplicación y mejorando el rendimiento de la aplicación.

La plataforma Java EE se desarrolla a través de la Java Community Process (JCP) que es una comunidad responsable de todas las tecnologías (APIs) que forman la plataforma Java EE. Dentro de esta comunidad existen grupos de expertos que crean especificaciones para alguna tecnología en particular. A estás especificaciones se les conoce como Solicitud de Especificación de Java (JSR)

Es así como tenemos una especificación para cada versión de cada una de las Tecnologías (APIs) que conforman la plataforma Java EE.

Una Solicitud de Especificación de Java es es un documento formal propuesto para definir la funcionalidad y uso de la tecnología propuesta. Es decir, las clases, métodos, ciclos de vida, secuencias y como estás clases interactuan entre si. Un individuo o una organización puede convertirse en miembro de la Java Community Process (JCP) y puede desarrollar su código según las especificaciones mencionadas en JSR. La implementacion desarrollada de la especificación será revisada por los miembros del JCP y aprobarán o rechazarán. Generalmente, ademas del documento, la especificación tendrá un conjunto de interfaces java, las cuales deben ser finalmente implementadas por alguna organización interesada.

Por ejemplo, la API JPA (Java Persistence API), la especificación entrega un documento y el api que se componen de clases, interfaces, enums, y archivos xml de configuracion. Sin embargo, esta API por si sola no es útil. Tiene utilidad cuando se tiene una implementación, por ejemplo la empresa Red Hat tiene una implementación de JPA llamada Hibernate. Y así como Hibernate, existen otras implementaciones de JPA.

La gran ventaja de trabajar con especificaciones es tu puedes fácilmente cambiar de implementación y tu programa no debería requerir ningún cambio, para tu programa la implementación que estés usando es transparente.

Ahora si, vamos a ver de forma resumida cada una de las tecnologías o especificaciones que son parte de la plataforma Java EE.



lunes, 16 de abril de 2018

Java EE: EJB Enterprise Java Beans

Introducción

Los Enterprise JavaBeans (EJB), son usados para el desarrollo y despliegue de componentes que forman parte de una aplicación distribuida. aplicaciones que son escalables, transaccionales y seguras.
Los EJB están definidos como JSR 345, la especificación completa se encuentra en https://jcp.org/aboutJava/communityprocess/final/jsr345/index.html
Un EJB típicamente contiene la lógica del negocio y opera sobre los datos del negocio. La información del servicio, tal como atributos de la transacción y seguridad, pueden ser descritos usando metadatos como las anotaciones, o en un descriptor de despliegue en XML.
Una instancia de un bean es gestionado en tiempo de ejecución por un contenedor. El bean es accedido desde el cliente, siendo el contenedor en el está desplegado  un intermediario entre ellos. El cliente puede también estar en el servidor en forma de un bean, un bean CDI, o algún tipo de servlet. En cualquier caso, el contenedor de EJB proporciona todo lo requerido para una aplicación empresarial. Esto permite al desarrollador de la aplicación enfocarse en la lógica del negocio y no preocuparse sobre detalles de bajo nivel y manejo de estados, concurrencia, multihilos, pool de conexiones, u otras APIs complejas de bajo nivel.

Hay dos tipos de enterprise beans:
  • Beans de Sesión (Session beans)
  • Beans dirigidos por mensajes (Message-driven beans)
Los EJB han pasado por varias versiones, antes de la versión 3.0 teníamos exclusivamente los entity beans para poder persistir datos a nuestra base de datos. Ahora tenemos la Java Persistence Api (JPA) la cual es más recomendable de usar para la persistencia de datos.

Tipos de Beans de Sesión
Los beans de sesión se dividen en tres tipos: con estado, sin estado y singleton

Beans de Sesión con Estado (Stateful Session Beans)
Un bean con estado es un tipo de bean de sesión que está diseñado para que lo utilice un solo cliente durante su vida útil y mantiene un estado conversacional fuertemente acoplado con el cliente al que está llamando.

Beans de Sesión sin Estado
Este tipo de bean no mantiene un estado conversacional con el cliente, es por ello que no tiene variables de instancias, 

Referecia:
http://docs.oracle.com/javaee/6/tutorial/doc/gipjg.html

jueves, 12 de abril de 2018

Desafiando a la plataforma JEE

Son alrededor de las 23:00 horas, he tenido una día agotador, actualmente me encuentro desarrollando una API RESTFul. Para ello estoy usando JAX-RS, EJB, CDI,  JPA y JAXB. Ha sido desafiante porque las cosas no me salen a la primera, o me funciona pero a medida que voy incorporando más componentes deja de funcionar. La complejidad de Java EE está en la integración, hay muchos componentes involucrados y cada uno de ellos cuentan con reglas especificas que debemos conocer para asegurar el buen funcionamiento.

Mi estrategia ante una nueva plataforma o tecnología, es empezar paso a paso, si algo dejó de funcionar, volver atrás, observar mucho los logs, poner atención a cada detalle, como dice la frase "el diablo está en los detalles". Hay que ser muy astuto, tener olfato, tener colmillo, usar el sentido común, la lógica, la intuición. Si no, la frustración te consumirá.

Pero bueno, paso a paso estoy logrando los objetivos, así que... ahora sí voy enserio con JEE

lunes, 9 de abril de 2018

Maven Guia para instalar dependencias en el repositorio local de Maven

Cualquier jar que necesitemos en nuestro proyecto java construido y gestionado con Maven, será considerado como una dependencia. Estas dependencias no siempre se encontrarán en el Repositorio remoto de Maven. Algunas dependencias serán de terceros, que si bien fueron construidos con Maven, estás no se encontrarán en el repositorio Remoto. Peor aun, algunos jars ni siquiera serán construidos con Maven, ya que muchas empresas aun usan Ant, o puede que el jar sea de un proyecto legacy que fue desarrollado cuando no existía Maven.

Ya viví esta situación en la empresa, estoy iniciando un nuevo proyecto web, y para mayor comodidad estoy usando Maven para la construcción y gestión del proyecto, este proyecto usará otros proyectos desarrollados en la empresa. Proyectos que son gestionados con Ant y que por esta razón no siguen el estándar de Maven, es decir, no tienen un archivo POM, no se encuentran en un Repositorio Maven, ni local ni remoto. Y es así como surge la pregunta, como agrego estos jars a la lista de dependencias en mi POM.

Pues me puse a investigar y aquí les comparto una guía, vamos abordar los distintos escenarios. Esta guía esta probada para Windows.

1.- Instalar un jar como dependencia en el Repositorio local Maven
Desde luego, estoy asumiendo que tienes Maven instalado y configurado correctamente. Si no, te sugiero leer la entrada Instalar Maven

Abrimos una consola de comandos en Windows y vamos hasta el directorio donde se encuentra nuestro jar.

Ejecutamos lo siguiente



Donde nombre-jar será el nombre del jar a instalar, y el resto de atributos son los atributos conocidos de una dependencia Maven.

Después de ejecutar este comando, si vamos nuestro directorio .m2 dentro del directorio de nuestro usuario Windows, y luego entramos a repository, y siguiendo la ruta según el groupId, vamos a ver que tenemos instalado nuestro jar junto con el archivo pom.xml y otros archivos metadatos.


Ahora sí, ya podemos agregar esta dependencia al proyecto que lo requiera, usaremos los datos (groupId, artifactId, version y packaging) usados en la instalación de la dependencia.

Continuara...





domingo, 8 de abril de 2018

Mi novia - Fabio Fusaro

Por curiosidad estuve leyendo el libro "Mi Novia" del autor Fabio Fusaro. La lectura me llevo al pasado, cuando tenía alrededor de los 20 años, en esa edad tuve mi primera ruptura amorosa, sentí por primera vez el dolor que causa una ruptura. Siempre he sido una persona que no comparte sus sentimientos, sin embargo siempre he sido muy analítico. Recuerdo los típicos pensamientos "Ella es especial", "No encontraré a otra como ella", etc,. Y las típicas dudas, ¿La busco?, ¿Le pido que volvamos?, etc,. Como si fuese mi culpa de que la relación no haya funcionado, cuando no lo era. Siempre me quede con las ganas de saber que hacían otros hombres en una situación así. Mi decisión fue cortar de raíz con aquella persona, sacarla de mi vida, borrar fotos, contactos por todas las redes sociales, osea sacarla definitivamente de mi vida, incluso llegué a mudarme de ciudad.
Al momento es una decisión dolorosa, pero a mi me ha funcionado, para mi, lógicamente no tiene sentido "arreglar las cosas" y volver.
Este libro trata de las relaciones, desde el enfoque donde es la mujer la que deja de sentirse atraída, nos responde en base a experiencias ¿Por qué ella pierde el interés?, ¿Que debe hacer un hombre para mantener interesada a la mujer?, que a mi juicio es un desgaste enorme, y la conclusión a la que Fusaro llega, con la cual coincido, es que La atracción es algo que no puedes controlar, así que disfruta, disfruta de tu relación sin complicarte, y cuando el día en que se tenga que terminar llegue, asúmelo y retírate con dignidad. No hay nada más patético que ver a un hombre rogar por amor, rogar porque su ex regrese.
Fusaro también nos da una serie de consejos de que hacer una vez que la relación se terminó, lo cual es lógicamente no buscarla, y si es ella la que decide buscarte, te explica lo que te puedes esperar si aceptas regresar.
Es sorprendente enterarse de que la gran mayoría de hombres sufren una ruptura, y no, no es que seamos débiles, es solo que el hombre también ama, y ama de una manera tan intensa y genuina. Cosa que no ocurre con la mujer, la mujer no ama, la mujer se obsesiona.



viernes, 30 de marzo de 2018

Max El ingeniero de Software

La profesión de Ingeniero de Software es relativamente joven, no hay tanta información que te diga de que va el rollo. Los niños crecen soñando con ser Medico, Bombero, Militar, Astronauta, etc,. Pero casi nadie sueña con ser un Ingeniero de Software.
Tengo un amigo a quien llamaré Max, el es Ingeniero de Software y nos contará de que va el Desarrollo de Software.

Vamos por el Principio...

Max nació en un pequeño pueblo al sur de México, un pueblo donde la pobreza abunda, donde la educación y las oportunidades de desarrollarte escasean. Eran esos años donde el Internet recién se masificaba. Como cualquier niño, Max vivió la época donde no había celulares, no había redes sociales y toda esa #$&"# de hoy día. Jugaba a la pelota en canchas de tierra, a las canicas, a las guerras. Max empezó a sentir cierta admiración por los infantes de Marina, y dijo, de grande voy a ser un infante de Marina. En esa época tus sueños, y descubrir tus talentos y elegir tu profesión era una responsabilidad exclusivamente tuya, no habían programas pedagógicos para descubrirlos.
Pasaron los años y Max se dio cuenta que no contaba con los atributos físicos para ser un infante de Marina, no tenia la altura ni la masa muscular requerida. Y así, decidió abandonar ese sueño, ahora que lo piensa, quizás si no fuese por la altura si lo hubiese logrado, en fin.
Por esos años empezó a sentir curiosidad por saber como funcionan los aparatos electrónicos, coleccionaba aparatos viejos y los desarmaba, se compraba revistas electrónicas y se devoraba todo lo que tenía que ver con electrónica, ya había llegado el Internet y con ello tenía acceso a cientos de libros electrónicos y revistas.

- Seré Ingeniero en Electrónica, dijo.

Se apuntó en una de las mas prestigiosas universidades de México, el problema era que no llevaba bases solidas en el área de Físico-Matemático, sin embargo, fue aquí donde se topo con la materia de Programación de Computadores, el lenguaje C y todo ese rollo.

Max siempre fue analítico y estratégico, a medio semestre se sentó a reflexionar y se dijo así mismo que no tenía sentido seguir en la Universidad con esas deficiencias, así que renunció, se busco un trabajo que le permitiese costear sus gastos, contrato Internet, se compró libros de Matemáticas, Física y Programación.

Todas las tardes al salir del trabajo se encerraba en su cuarto a estudiar. Al principio estudiaba las tres materias, luego se fue inclinando más por el área de programación, programación estructurada, programación orientada a objetos y finalmente la ingeniería en desarrollo de software.

Mucho de lo que aprendió lo hizo de forma autodidacta, su aprendizaje estuvo lleno de noches sin dormir, de noches de frustraciones, pero de tanto insistir, llega el día en que es tan natural leer lineas de código fuente, así como en la película de Matrix.
Max está fascinado con este nuevo mundo, con la ingeniería en Desarrollo de Software, hay tanto que aprender, tanto que compartir. Aun así, no descarta la posibilidad de hacer un curso de Electrónica, porque al final de cuentas, la electrónica y la programación están muy ligadas.

Seguiré escribiendo mas historias de Max, para conocer los desafíos y la vida de un Ingeniero de Software





sábado, 10 de marzo de 2018

Openbravo POS Continua

¿Qué es Openbravo POS?
¿Qué es Openbravo POS?

Como muchos ya están enterados, Openbravo ha descontinuado el desarrollo de Openbravo POS, es una verdadera lastima.

Sin embargo, he decido darle continuidad al proyecto, actualmente se encuentra en la versión 2.3.2. Aun no tengo definido el nombre final, puede que el repositorio cambie más adelante.

RoadMap
  • Añadir Marcas de Productos
  • Usar JPA como API de persistencia
Repositorio
AutotalPOS en Git

miércoles, 7 de marzo de 2018

Responsabilidades y Habilidades de un Líder Técnico

Un día simplemente pasó, no estaba preparado para ello, la empresa atravesaba por una crisis, creo que era la primera gran crisis. De un día para otro el líder actual decidió renunciar dejando un enorme vacío, un líder nato, visionario, pragmático y proactivo. Intentar reemplazarlo, comparándome con el, no tenía ningún sentido. Yo tendría que forjar un liderazgo diferente, uno que complementara y diera continuidad a su legado. Lo cierto es que no estaba preparado, nunca estuvo en mis planes, pero tenía que adaptarme, y hacerlo pronto porque la situación lo requería.

Según mi experiencia, las actividades o responsabilidades de un Líder Técnico pueden ser las siguientes, no necesariamente están en un orden:

Estimación de Tiempo
Factibilidad Técnica
Gestión de Riesgos

Como leer una imagen en Java

Leer recursos es una tarea muy usada por cualquier aplicación Java, cuando usas un IDE como Netbeans, le delegas mucho de esta tarea, siempre llega el momento en el que necesitas escribir las lineas de código tu mismo.

En esta entrada me enfocaré unicamente en mostrar como leer una imagen y mostrarla en un JLabel, el cual estará en un JFrame.

Si deseas profundizar más te invito a leer la entrada Localizar y Leer recursos en Java

IDE
Netbeans 8.2

Precondiciones

La imagen a leer tiene que estar en algún lugar dentro de los fuentes de tu proyecto, por ejemplo en algún package diferente al de tu clase. En las siguientes imágenes te muestro la estructura de mi proyecto en NetBeans.




Pasos para leer y mostrar la imagen

Vamos a leer y mostrar la imagen en 5 pasos, lo único que tienes que cambiar es el path, según donde tengas la imagen.

//1. Obtener el objeto Class NombreClase.class
Class clazz = JFrameImageDemo.class;

//2. Crear el path "/com/unadm/swing/images/book-icon.png"
//   Ruta absoluta tomando como contexto el classpath de nuestro proyecto
//   Nuestra imagen se encuentra dentro del directorio build/classes el cual se
//   agrega al classpath
String path = "/com/unadm/swing/images/";
path = path + "book-icon.png";

//3. Obtener la url de nuestra imagen
URL url = clazz.getResource(path);

//4. Leer la imagen con la clase ImageIO
try {
BufferedImage image = ImageIO.read(url);

//5. Setear la imagen al JLabel
emptyLabel.setIcon(new ImageIcon(image));
} catch (IOException ioexception) {
System.err.println(ioexception);
}


Codigo Fuente de la Clase

A continuación el código fuente de la clase, antes de ejecutar la clase es recomendable que realices un "clean and build" a tu projecto, muchas veces NetBeans necesita compilar todo el proyecto para incluir tu imagen junto a las clases compiladas.

domingo, 4 de marzo de 2018

Swing: Como crear ventanas principales (JFrame) en Java

Este tutorial como otros tantos de este blog, es una traducción del tutorial oficial, enriquecido con comentarios y experiencia propia.

Una venta JFrame es una ventana de nivel superior (en la jerarquía de componentes), el cual tiene un titulo y border. Un frame (traducido como marco o ventana) es una instancia de la clase JFrame, es una ventana que posee un border, un titulo y botones en la esquina superior derecha para cerrar, minimizar y restaurar la ventana. Una aplicación que usa interfaz grafica de usuario debe tener al menos un frame.

Para crear una ventana que es dependiente de otra ventana - se oculta cuando la otra ventana es minimizada, por ejemplo - debes usar una instancia de un JDialog en lugar de un JFrame. Para crear una ventana que se muestre dentro de otra ventana, debes usar un JInternalFrame.

Creando y Mostrando Ventanas


Para crear y mostrar una ventana lo haremos en 5 pasos


//1.- Crear la Ventana con el titulo "FrameDemo"
JFrame frame = new JFrame("FrameDemo");

//2.- Opcional: Que pasará al cerrar la ventana? Salir de la aplicación.
//Cuando se cierra un frame (botón 'X') la aplicación aun sigue corriendo
//con está opción también cerramos la aplicación
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//3.- Crear componentes y agregarlos a la ventana
//crear un JLabel vacio...
JLabel emptyLabel = new JLabel("");
frame.getContentPane().add(emptyLabel, BorderLayout.CENTER);

//4.- Ajustar el tamaño de la ventana de acuerdo al tamaño de los componentes agregados
frame.pack();

//5.- Mostrar la ventana
frame.setVisible(true);

Aquí algunos detalles sobre el código

1. La primera linea de código crea un frame usando un constructor que te permite definir el titulo de la ventana. Otro constructor de JFrame usado con mucha frecuencia es el constructor sin argumento.

2. El siguiente codigo define que pasará cuando el usuario cierra la ventana. La operación EXIT_ON_CLOSE cierra el programa cuando el usuario cierra la ventana. Este comportamiento es apropiado para este programa porque el programa tiene una sola ventana principal, y cerrando la ventana principal deja al programa inutilizable.

3. Las siguientes lineas de código agrega un label vacío al contenedor (content pane) del frame. Si no estás familiarizado con contenedores y como agregar componentes a ellos, escribiré una entrada más adelante.

Para frame que tienen menús, tu puedes agregar la barra de menús al frame usando el metodo setJMenuBar. También escribiré una entrada más adelante sobre Como usar Menús.

Es muy importante agregar los componentes al frame por medio del ContentPane, el LayoutManager del ContentPane es un BorderLayoutManager.

Como información adicional, un JFrame tiene un RootPane, ContentPane y GlassPane. En el futuro escribiré una entrada cobre estos Paneles.

4. El metodo pack establece el tamaño del frame en relación con el tamaño (preferredSize) de todos los componentes agregados al contenedor del frame. Una alternativa al metodo pack es establecer el tamaño del frame explicitamente llamando al metodo setSize. En general, es preferible llamar a pack sobre setSize, ya que el metodo pack delega la tarea al LayoutManager.

5. Ahora si, llamando al metodo setVisible(true) haremos que el frame se muestre en la pantalla. Las versiones anteriores usaban el metodo show para mostrar el frame, pero es mejor usar setVisible(true)

Codigo fuente del Ejemplo

package com.macrob.swing;

import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.WindowConstants;

/**
 *
 * @author Roberto Lopez <marcos.roberto.lopez@gmail.com>
 */
public class JFrameDemo {

public static void main(String args[]){
//1. Creamos el frame con un titulo
JFrame frame = new JFrame("FrameDemo");

//2.- Opcional: Que pasara al cerrar la ventana? Salir de la aplicacion.
//Cuando se cierra un frame (boton 'X') la aplicacion aun sigue corriendo
//con está opcion tambien cerramos la aplicacion
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

//3.- Crear componentes y agregarlos a la ventana
//crear un JLabel vacio...
JLabel emptyLabel = new JLabel("");
emptyLabel.setPreferredSize(new Dimension(250, 100));
frame.getContentPane().add(emptyLabel, BorderLayout.CENTER);

//4.- Ajustar el tamaño de la ventana de acuerdo al tamaño de los componentes agregados
frame.pack();

//5.- Mostrar la ventana
frame.setVisible(true);
}


}


El API del JFrame

El API para uso de frames puede caer dentro de las siguientes categorías
  • Creando y Configurando un Frame
  • Estableciendo el tamaño e ubicación del Frame
  • Metodos relacionados con el RootPane

Creando y Configurando un Frame
Método o constructorPropósito
JFrame()
JFrame(String)
Crea un frame que inicialmente no se muestra. El parámetro String proporciona un titulo para el frame. Para mostrar el frame debes invocar al método setVisible(true)
void setDefaultCloseOperation(int)
int getDefaultCloseOperation()
Establecer u obtener la operación que ocurre cuando el usuario presiona el botón cerrar del frame.
Posibles opciones son:
  • DO_NOTHING_ON_CLOSE (no hacer nada)
  • HIDE_ON_CLOSE (ocultar el frame)
  • DISPOSE_ON_CLOSE (ocultar y liberar recursos graficos usados, salir de la aplicación después de liberar el frame)
  • EXIT_ON_CLOSE (Salir de la aplicación inmediatamente)
Las primeras tres constantes están definidas en la interface WindowConstants, el cual JFrame implementa. La constante EXIT_ON_CLOSE está definida en la clase JFrame
void setIconImage(Image)
Image getIconImage()
(in Frame)
Establecer u obtener el icono que representa el frame. Observar que el parámetro es un objeto java.awt.Image y no un javax.swing.ImageIcon.
void setTitle(String)
String getTitle()
(in Frame)
Establecer u obtener el titulo del frame
void setUndecorated(boolean)
boolean isUndecorated()
(in Frame)
Set or get whether this frame should be decorated. Works only if the frame is not yet displayable (has not been packed or shown). Typically used with full-screen exclusive mode or to enable custom window decorations.
static void setDefaultLookAndFeelDecorated(boolean)
static boolean isDefaultLookAndFeelDecorated()
Determine whether subsequently created JFrames should have their Window decorations (such as borders, and widgets for closing the window) provided by the current look-and-feel. Note that this is only a hint, as some look and feels may not support this feature.

Establecer el tamaño e ubicación del Frame
MétodoPropósito
void pack()
(in Window)
Calcula y establece el tamaño según el preferred size de los componentes agregados.
void setSize(int, int)
void setSize(Dimension)
Dimension getSize()
(in Component)
Establecer y obtener el tamaño del frame. Los parámetros int para setSize especifican el ancho y altura respectivamente.
void setBounds(int, int, int, int)
void setBounds(Rectangle)
Rectangle getBounds()
(in Component)
Establecer y obtener el tamaño y ubicación del frame. Para el método con parámetros int, la esquina superior izquierda se especifica por x, y, el cual son los dos primeros parametros, los otros dos corresponden al ancho y alto.
void setLocation(int, int)
Point getLocation()
(in Component)
Establecer y obtener la ubicación de la esquina superior izquierda del frame. Los parámetros son x e y respectivamente.
void setLocationRelativeTo(Component)
(in Window)
Posiciona el frame en el centro del componente especificado. Si el argumento es null, el frame es centrado en la pantalla. Este método se debe invocar después de establecer el tamaño del frame.


Metodos relacionados con el RootPane

MethodPurpose
void setContentPane(Container)
Container getContentPane()
Set or get the frame content pane. The content pane contains the visible GUI components within the frame.
JRootPane createRootPane()
void setRootPane(JRootPane)
JRootPane getRootPane()
Create, set, or get the frame root pane. The root pane manages the interior of the frame including the content pane, the glass pane, and so on.
void setJMenuBar(JMenuBar)
JMenuBar getJMenuBar()
Set or get the frame menu bar to manage a set of menus for the frame.
void setGlassPane(Component)
Component getGlassPane()
Set or get the frame glass pane. You can use the glass pane to intercept mouse events or paint on top of your program GUI.
void setLayeredPane(JLayeredPane)
JLayeredPane getLayeredPane()
Set or get the frame layered pane. You can use the frame layered pane to put components on top of or behind other components.

Referencia

https://docs.oracle.com/javase/tutorial/uiswing/components/frame.html