viernes, marzo 30, 2007

MundoJava se pone la gorra

Aunque soy un agradecido de todo lo que sea open-source y mis búsquedas de librerías las haga siempre en SourceForge, hoy me pongo la gorra de policía y presento una API para manejar licencias: JLicense.
Lo cierto es que siempre nos toca desarrollar una aplicación que necesita manejar licencias, generalmente para poder brindar una versión "demo" a nuestro futuro Cliente.
JLicense nos permite crear distintos tipos de licencias para empaquetar nuestra aplicación sin necesidad de crear claves y comprobaciones manualmente. Nos sirve cuando estamos apurados por completar esa parte del soft, pero por otro lado, nos perdemos toda la diversión de explorar la el paquete java.crypto y java.security (lo tengo como una materia pendiente).
Para explicar en detalle el método que utiliza JLicense para generar la licencia, debería tener una larga charla con mi amigo Dr. Crow, quien me ha avivado muchas veces con problemas de seguridad y la tiene más clara, pero en esta ocasión, me limitaré a dar las bases.

JLicense utiliza el algoritmo DSA (criptografía asimétrica) para generar 2 claves (una pública y otra privada). Para generarla podemos utilizar la aplicación createDSAKey aunque aquí aparece la primera desventaja: JLicense no es open-source. Pero, el binario se puede utilizar gratuitamente. El problema está en que deberíamos modificar un archivo de código fuente para poder utilizar nuestra clave pública.

Si queremos generar una licencia, podemos utilizar la utilidad createLicense (línea de comandos) o podemos utilizar la clase LicenseTool. Esto nos genera un archivo license.lic, que deberemos empaquetar con nuestra aplicación.

Por último, deberemos incorporar a nuestra aplicación, las librerías: com.websina.license y com.websina.util y NADA MÁS (a menos que le dejemos una backdoor a cualquier cracker).
Y en nuestro código:

LicenseManager manager = LicenseManager.getInstance();
boolean valid = manager.isValid();


Y listo, validamos. Pero, amigos, al final de todo, nunca nada es completamente seguro, sin mencionar la facilidad de decompilación del código Java. Sin embargo, es una buena herramienta para practicar y lograr resultados rápidamente.

Saludos

jueves, marzo 22, 2007

Ahora si que es más fácil jugar con el System Tray

No, no es el sucesor del Galaxy (uy, que viejo!!). Una de las novedades del JDK 1.6 en cuanto al aspecto visual de las aplicaciones es que ahora es mucho más fácil utilizar el System Tray del entorno de ventanas que estemos usando.
Ahora, esto está bueno porque antes, para poder usarlo, teníamos que acceder por medio de JNI, es decir, usando otro lenguaje compatible.
De hecho, todavía existen varias librerías que nos permitían hacerlo sin mucho trabajo, pro ejemplo:
Y había otras librerías pagas que han sido completamente hundidas por el open-source y la nueva versión.
Y si, ahora es más fácil. Simplemente tenemos dos clases: java.awt.SystemTray y java.awt.TrayIcon. La primera sirve para acceder por medio de Java a la barra de estado donde se muestran los iconos, pero ojo!!!, no significa que podemos acceder a cualquier icono, sólo a los que nuestra aplicación haya puesto ahí. Por cada aplicación que creemos, sólo habrá un objeto SystemTray y no puede ser instanciado con el operador new, sino llamando a getSystemTray(). La clase TrayIcon representa un icono, se le puede agregar un menú emergente (el tradicional Swing), un tooltip y eventos, por supuesto. De esta clase, podemos tener todas las instancias que queramos.

Les dejo este link para que vean un ejemplo: New and Updated Desktop Features in Java SE 6, Part 1

He probado un par de ejemplos, pero cuando tenga tiempo, me hago uno interesante y se los paso.

Saludos

lunes, marzo 19, 2007

Un poco de lectura de Java

Me han pedido que les recomiende algunos libros o recursos para empezar a programar en Java. Así que este corto post será una pequeña recopilación de los libros que considero como más entendibles.

Como recursos, el primero (bastante obvio) es internet. Pero para ser más preciso, recomiendo muchísimo "The Java Tutorial". Es el primer lugar a donde recurrir para aprender lo básico especialmente cuando tenemos poco tiempo. Ojo, primero está todo en inglés y además, no esperen encontrar temas de J2EE en The Java Tutorial, pero sí en "The J2EE Tutorial", aunque este último no es tan fácil de entender debo decir.
En cuanto a otros links de interés para tutoriales en castellano, Java Hispano y Java en Castellano son muy buenos lugares para empezar.

En cuanto a libros:
Ahora, el que definitivamente NO recomiendo:
Saludos

domingo, marzo 04, 2007

Empezando a medir el Software

Últimamente me he estado preocupando un poco más por los pasos previos a la programación. Me refiero a los pasos más administrativos, quizá vistos como un poco aburridos desde el punto de vista del programador, pero definitivamente tanto o más importantes que la programación (y escribo como ingeniero 8D ).
Siempre es un problema cuando en un nuevo proyecto nos preguntan: ¿Cuánto va a tardar?, ¿Cuánto va a costar?.
Bueno, lo que hacemos siempre es basarnos en la experiencia para poder aproximar, pero existen modelos de cálculo para estimar el tamaño, el esfuerzo y la planificación de los sistemas de software y no son nuevos, ya hace mucho tiempo que se conocen, el problema es aplicarlos, como ustedes saben.
Me ha tocado aplicarlo hace poco tiempo y debo decir que fue una muy buena experiencia para profundizar en el conocimiento de los requerimientos a satisfacer, además de poder presentar una planificación más matemática.
Me voy a detener en el cálculo del tamaño. He utilizado un modelo que se llama "Puntos de Función" creado por Allan Albrecht (en 1979!!!). Básicamente, lo que se propone es asignar un puntaje al sistema a desarrollar basados en la cantidad de funcionalidad que tendrá. No hablamos de líneas de código, no hablamos de cantidad de clases y objetos, ni de métodos o procedimientos, simplemente de funcionalidad.
Para poder realizar el cálculo, se deben contar aspectos tales como:
  • La cantidad e archivos lógicos (archivos y tablas de BD) que tendrá la aplicación
  • La cantidad de interfaces externas (por ejemplo, conectores para sistemas legacy)
  • Las entradas externas (por ejemplo, las interfaces de usuario)
  • Las salidas externas (por ejemplo, generación de informes o reportes)
  • Las consultas (presentación de información leída de uno o más grupos de datos, menos elaborada que la anterior)
Una vez contadas estas características (que no es un trabajo sencillo, créanme), se agrupan en una tabla y se ponderan. Los ponderadores están calculados en base al estudio de muchísimos proyectos.
El resultado final: un número. Este número positivo representa el tamaño del software. La unidad de medida es "Puntos de función ajustados".

¿Qué hacemos con ese número?

Se puede calcular la cantidad de esfuerzo (medido en [meses-hombre]), el tamaño de los recursos humanos requerido (basado en el esfuerzo) y por supuesto, la duración estimada.

Dejo una serie de recursos adicionales para los que estén interesados:
Saludos, hasta la próxima.