miércoles, 30 de septiembre de 2009

Conozcan a Micky Vainilla!

Que grande capuzzotto! Es humor racista pero hay que tomarlo con humor. Aclaro: NO SOY RACISTA

Saludos!

Hibernate Annotations - Guia Rápida

En este post planeo explicar un poco sobre cómo utilizar hibernate annotations para proyectos Java SE. Antes que nada aclaro que se puede usar hibernate a través de la jpa, pero personalmente tengo razones para pensar que la JPA está todavía un poco chica como para Hibernate.

Para una guia de mapeo les recomiendo bajar la documentación de Hibernate-Annotations

Para los que no sepan de que estoy hablando lo pongo con palabras simples, hibernate es una librería que se encarga de "conectar" el mundo de la programación orientada a objetos con el mundo de las bases de datos relacionales. Algunos conocen esto como ORM o para los mortales, mapeo objeto-relacional.

No voy a dar mucha introducción al tema, debido a que puede ser un poco largo y espero que quien me esté leyendo lo haga porque comprende el tema y quiera ir directo al grano.

Para empezar hibernate utiliza un archivo xml de configuración

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/prueba</property>
<property name="hibernate.connection.username">prueba</property>
<property name="hibernate.connection.password">prueba</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.show_sql">true</property>
<mapping package="pruebahibernate.entidades"/>
</session-factory>
</hibernate-configuration>


Este archivo debe llamarse hibernate.cfg.xml y va ubicado en la raíz de nuestra estructura de paquetes.

Como nota recordar poner el driver jdbc de nuestra base de datos relacional entre las librerías (así como las de hibernate annotations, y core). En mi caso utilizo PostgreSQL con una base de datos "prueba" con usuario y clave también prueba.

Todas mis clases de entidad se encuentran en el paquete pruebahibernate.entidades y además de eso tengo habilitada la actualización automática y generación de las tablas en la base de datos.

¿Como se usa?

Necesitamos un objeto Session Factory, esto es lo principal para generar Sesiones de hibernate y con ellas hacer cosas locas con nuestra base de datos. La siguiente línea levanta las configuraciones de nuestro xml, las aplica y crea un session factory con ellas. (Las podemos toquetear por código antes de crear el session factory.
Notar que la diferencia con hibernate standard es que se usa el objeto AnnotationConfiguration en vez del Configuration.


SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();

...
Session sesion = sessionFactory.openSession();
Transaction t = sesion.beginTransaction();
....
List l = sesion.createQuery("FROM Persona").list(); //Generar un listado de personas por ejemplo.
....
t.commit();
....

Y eso es todo, con muy pocas líneas y un par de annotations, tenemos un sistema robusto y transaccional para trabajar con bases de datos.

Ahora muestro como está mapeada mi entidad persona:

@Entity
public class Persona implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator="system-uuid")
    @GenericGenerator(name="system-uuid", strategy="uuid")
    @Column(length=36)
    private String id;

    private String nombre;
    private String apellido;
    private int dni;
    private int edad;

    ....... // aca van los getters y setters
}



Como se verá el mapeo por annotations es mucho mas simple y compacto que con xml.Por ahí pueden parecer muchas annotations para un solo id pero es simplemente para especificarle que me genere automáticamente los UUID, es una maña mia nomas el único annotation requerido es el @Id

Espero que les haya servido, cualquier cosa postear preguntas.

Saludos!

martes, 29 de septiembre de 2009

Poster del Proyecto Final

Para los que querían ver de que se trataba mi proyecto final (y de mis compañeros de grupo) de la facultad. Acá les dejo el poster. Es software libre y todo.
Para quien quiera ver la exposición es en la UTN, FRM el día martes 10/11/2009, hora todavía sin confirmar.


Saludos!

lunes, 28 de septiembre de 2009

Con Paciencia y Con Saliva

Para todos los que no creían en el dicho, con paciencia y con saliva, pues acá tienen una prueba digna de ver, es una publicidad que yo ví cuando era muy chico y recién ahora la vengo a entender.



Saludos!

Jessica Cirio te enseña a ponerlo con la boca!!

Los frutos de nuestro pais!!



Saludos!

Windows XP en HP 530

Bueno, ahora les voy a comentar mi experiencia ultra triste de instalar Windows XP en mi notebook HP 530.

Aunque muchos no lo crean, instalar Windows XP a veces es problemático, y yo lamentablemente lo tengo que hacer porque a veces desarrollo aplicaciones para clientes que quieren que corran bien bajo Windows y no me gusta entregarles productos sin probar en el entorno de produccion.

En fin, los materiales:
  • Un cd de Windows XP.
  • Una Notebook HP 530.
  • Los drivers descargados desde el sitio de hp.
  • Y ultimo pero lo más importante, una bolsa de hielo, o 2 comprimidos de "Gel Pack" (si, los que usan los deportistas).

Como muchos saben Windows Xp necesita una disketera para instalar sobre un disco sata (re nuevo), entonces a falta de disketera le desactivé el sata nativo desde el bios de la notebook.

Muchos me preguntaran, ¿Por que el gel pack? Es simple, el Windows Xp es tan genial que no tiene administración de energía en su instalador, entonces, sube un poco la temperatura de la notebook mientras se está instalando y la bios decide que es mejor apagarla para que no se rompa, entonces, bueno, a ponerle hielo abajo!


Bueno, he ahí la solución del problema de que la notebook se apague sola al instalar Windows Xp, yo lo tomo como un signo de rebeldía, pero simplemente es que tiene que descansar en hielo.

Yo estuve googleando mucho tiempo hasta que me di cuenta de esto, asíque lo dejo plasmado acá por si alguien tiene el mismo problema que yo.

Saludos!

Instalando Glassfish en Archlinux

Hace relativamente poco he empezado mi vida como desarrollador JavaEE, como servidor de desarrollo utilizo GlassFish simplemente porque es de sun y es el que viene con Netbeans, el cual también utilizo.
En mi pc habitual de desarrollo de JavaEE me he encontrado que correr el IDE y el servidor en el mismo lugar es contraproducente para la velocidad de desarrollo, digamos, todo se tarda muchísimo, por lo cual he instalado Glassfish en una pc aparte y acá comento mi experiencia.

Primero que nada, quiero decir que glassfish no viene en los repos asíque hay que instalarlo usando yaourt.
#yaourt -S glassfish
Hay que correrlo como root porque sino el script de instalación falla y nos quedamos con el servidor a medias.

Luego de instalarlo se puede arrancar. Los dominios de glassfish se colocan en el directorio domains de la instalación (yaourt lo pone en /opt/glassfish), estoy usando el dominio por defecto ya que trae todos los servicios en los puertos estándar asíque prácticamente sale corriendo "out of the box".
Algo que extrañé es un script en /etc/rc.d para controlarlo, igual nada me impide hacerlo y lo hice.

Glassfish tiene un workaround para que funcionen las conexiones al servicio jndi y es que el nombre de host debe resolver a la ip externa de la pc, por lo cual hay que manipular el archivo /etc/hosts para que quede similar a esto:
127.0.0.1 localhost.localdomain localhost
192.168.1.8 juan-desktop
Para Controlarlo se utiliza el binario asadmin que se encuentra en el directorio bin, entonces por ejemplo mi dominio se llama domain1 (el que viene por defecto, y estas son las opciones para controlarlo):

asadmin start-domain domain1 # Arrancar el domain1 y si dado el caso, servidor también
asadmin stop-domain domain1 # Parar el dominio1 en el servidor y dado el caso, el servidor tb.

Si le añandimos la opción --debug, podemos arrancar el servidor en modo debug (lo cual sirve para los ides, entoces acá les presento mi script de shell para controlar a glassfish.

#!/bin/bash


case "$1" in

start)
/opt/glassfish/bin/asadmin start-domain domain1
;;
stop)
/opt/glassfish/bin/asadmin stop-domain domain1
;;
debug)
/opt/glassfish/bin/asadmin start-domain --debug domain1
;;

debug-restart)
$0 stop
sleep 5
$0 debug
;;
restart)
$0 stop
sleep 5
$0 start
;;
*)
echo "usage $0 {start, stop, debug, restart, debug-restart}"
;;
esac


Los sleep se los pongo simplemente para darle un descanso a la pc entre parada y arrancada.

Conexión con Netbeans

La conexión con netbeans es ultra facil, uno se dirige a la pestaña de servicios, en el item de servidores, le da click derecho y le pone agregar nuevo servidor, aparecerá un asistente y hay que colocar los siguientes datos, aclarando que 4848 es el puerto de adminsitración por http de mi glassfish standalone.




Espero que les sirva, saludos!

lunes, 14 de septiembre de 2009

Java versus C#, ¿por qué aprender y cual?

El objetivo de este post es explicar un poco mi discutible visión sobre estos lenguajes de bytecodes de propósito general, anticipando que soy una persona partidaria de java y argumentando un poco por qué elijo Java.

En primera instancia voy a explicar por qué comparo java con c# y no con otros lenguajes de bytecodes como Ruby o Python.

Nota para el que está leyendo: Lo que sigue hasta el próximo título importante no hace al agrumento del tema asíque se puede saltear sin perderse nada.

Principalmente Ruby y Python quedan fuera de alcance son de tipos dinámicos; (y tirando un pequeño agite) personalmente elijo Python simplemente porque ya el nombre Ruby me suena a marica, y por lo poco que he visto de como se escribe, lo veo muy poco masculino a mi gusto.

Antes de seguir con Java y C# voy a explicar a qué me refiero por código masculino. No es una comparación sexista sino que si colocaramos una escala graduada con masculino de un extremo y femenino en el otro extremo y aclarando que mientras más uno se tiene que ensuciar las manos más se acerca uno al lado "masculino" o sea a nivel MACHO se encuentra el assembler un poquito mas abajo C, java se encuentra en la mitad y Ruby se encuentra del lado femenino.

Máquina Virtual

Java tiene una máquina virtual que corre en muchas plataformas y sistemas operativos, inclusive la mayoría de los teléfonos celulares y microcontroladores. En cambio la plataforma .net sólo corre bajo Windows, ocasionalmente corre en "Mono" (implementación libre y para linux de .net) pero ésta depende de la volundad de que Microsoft quiera exigir aplicar las leyes de patentes de soft o no. Otro tema es que me he topado con casos en que las máquinas virtuales más nuevas de .net no corren aplicaciones anteriores al ser actualizadas.

Estructura de las Bibliotecas.

Las bibliotecas de Java y la arquitectura sugerida para las aplicaciones se encuentran Diseñadas siguiendo los patrones de diseño para soft orientado a objetos y las mejores prácticas de diseño que pueden aprenderse de los libros y la experiencia, de esta forma un programador formado correctamente no tiene que introducir cochinadas en su soft para lidiar con las fallas de diseño de la plataforma.

En contraste la biblioteca de la plataforma .NET se encuentra pensada para ser intuitiva sólo para alguien que no tiene la mas mínima idea de programación, lo cual le genera dependencia hacia la plataforma, imposibilita el entendimiento de lo que se está haciendo y quien comienza con ésto sólo puede trabajar en la programación utilizando esta plataforma porque posiblemente no entienda otras. Evidentemente esta forma de hacer las cosas no sólo es cochina sino que posee un alto acoplamiento, baja cohesión, y posiblemente haya que tapar demasiadas cochinadas para dejar una aplicación bien diseñada.

Bibliotecas externas disponibles

Java posee una gran comunidad por lo que podemos encontrarnos con bibliotecas que aceleran nuestro trabajo en todas las formas, colores y sabores. En contraste la comunidad de C# no es tan amplia por lo tanto no existen tantas herramientas.

Entornos de Desarrollo

Al ser Java un lenguaje libre y abierto, podemos encontrarnos con IDEs multi plataforma y de gran utilidad como Netbeans o Eclipse, (y muchos muchos otros) de gran poder y sin costo de compra de licencias. Gracias a mono, C# ha ganado lugar en linux con IDEs como MonoDevelop, pero principalmente quien desarrolle en Windows tendrá su copia pirateada de Visual Studio (el cual cuesta sus buenos dólares de licencia para el que piense uaslo en serio), o la versión poco poderosa y gratuita.

Legibilidad del Código
Para quien se encuentre acostumbrado a programar en C++, seguro que encontrará mas legible a C#, pero, C++ es en sí MUY poco legible para quien no lo conoce, por lo cual desde mi punto de vista, ésto no es más que un defecto. Para quien se encuentre acostumbrado a leer código c, Java será muy fácil de comprender. Igualmente éste punto es medio subjetivo, pero pienso que convenciones como iniciar nombres de atributo con un guion bajo (no obligatorio, pero buena práctica en C#) o denotar la herencia con ':' por decir algo, solo "ennegrece" el código.

Interfaces de Usuario

El tema de la "belleza" de las interfaces de usuario es el punto fuerte de C#, en efecto dicho lenguaje trae todo tipo de herramientas para hacer pantallas bien agradables, Java tiene nativamente a Swing (y al viejo y peludo AWT) pero Swing no satisface 100% las necesidades de una apariencia "nativa" y un Look and Feel uniforme que es lo que principalmente atrae al usuario final, sin embargo vienen frameworks externos para solucionar estos problemas.

Conclusiones
C# puede parecer para la persona poco experimentada como la opción "mas fácil" de aprender pero no acompaña a los programadores en su aprendizaje y eventualmente los guía hacia el "estanque" donde están metidos todos los programadores que se la jugaron por Microsoft y que todavía creen que a la computadora la mueve un duende mágico. Java provee flexibilidad y alta portabilidad y se adapta a una GRAN variedad de situaciones, sin contar que es un lenguaje libre.

Para el lector: si leyó hasta acá, espero haberlo convencido.

Saludos!

Albert King

Albert King fue un gran bluesero inspiración de figuras como Jimmy Hendrix o también Stevie Ray Vaughan; y uno de los 3 Reyes (Kings) del blues (Albert King, B.B. King y Freddie King). En particular con este video se puede apreciar la FUERTE influencia que tuvo este guitarrista en SRV. Se lo puede ver con su Gibson Flying V. Espero que lo disfruten tanto como yo, Saludos!

Un Increible editor de texto: VIM

VIM Es un editor de archivos de texto de consola basado en VI. Es increiblemente poderoso aunque puede parecer un poco tosco al principio y poco amigable.

Entre las características que mas me han impresionado se encuentra lo siguiente:

  1. Edición de multiples archivos en pestañas.
  2. Sintaxis resaltada para muchos tipos de archivos de configuración.
  3. Soporte de muchos plugins.
  4. Autocompletado de código.
  5. Code-Fold esto es, esconder código dentro de bloques de programación.
  6. Backup y recuperación de archivos que se están editando.
  7. Comodidad de realizar todo sin levantar las manos del teclado.
Realmente tiene muchas cosas, aún así tiene la ventaja/desventaja según como se lo vea que no se explicita mucho sobre cómo hacer cosas entonces el usuario nuevo realmente no puede entenderlo ni "sacarlo" intuitivamente. Es por eso que he preparado algunos tips para los que quieran aprender a usarlo.

Antes que nada, quisiera comentar que VIM viene ya para muchas plataformas, en las que se incluyen windows, linux y mac os.

Enlaces:
Página de descarga de Vim
VIM en Wikipedia
VI en wikipedia

Existe para los que lo tienen instalado un tutorial que dura 30 minutos que lo pueden hacer y con eso conocer todo lo necesario sobre el vim, para acceder al tutorial escribir el siguiente comando:
$vimtutor
Espero que les resulte de utilidad. Saludos!

lunes, 7 de septiembre de 2009

Conocer tu hardware en Linux.

Muchas veces nos encontramos ante la necesidad de conocer características de nuestro hardware. Existen distintas alternativas, por ejemplo el comando:
cat /proc/cpuinfo
Nos da informacíon sobre el microprocesador que estamos usando.
cat /proc/meminfo
Nos da información sobre el uso de la memoria.
lspci
Nos da información sobre los dispositivos conectados al bus PCI de nuestra placa madre.
lsusb
Nos da información sobre los dispositivos USB conectados.

Hoy sin embargo me he encontrado con un comando que me ha resultado de suma utilidad que es dmidecode.

De por si dmidecode sin parámetros tira información completa sobre todo lo que tenemos en la pc, pero puede filtrarse con por tipos de dispositivo. La sintaxis para usar el comando es la siguiente:
dmidecode --type [nro de tipo]
Acá dejo una tabla de los distintos tipos extraida de las propias manpages de dmidecode.

Type Information
────────────────────────────────────────
0 BIOS
1 System
2 Base Board
3 Chassis
4 Processor
5 Memory Controller
6 Memory Module
7 Cache
8 Port Connector
9 System Slots
10 On Board Devices
11 OEM Strings
12 System Configuration Options
13 BIOS Language
14 Group Associations
15 System Event Log
16 Physical Memory Array
17 Memory Device
18 32-bit Memory Error
19 Memory Array Mapped Address
20 Memory Device Mapped Address
21 Built-in Pointing Device
22 Portable Battery
23 System Reset
24 Hardware Security
25 System Power Controls
26 Voltage Probe
27 Cooling Device
28 Temperature Probe
29 Electrical Current Probe
30 Out-of-band Remote Access
31 Boot Integrity Services
32 System Boot
33 64-bit Memory Error
34 Management Device
35 Management Device Component
36 Management Device Threshold Data
37 Memory Channel
38 IPMI Device
39 Power Supply
40 Additional Information
41 Onboard Device

Espero que les sea de tanta utilidad como a mi.

Saludos!