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