Programando en JavaFX: Enlaces recomendados, libros y un poco de Alpha Geeks

Bueno, esta semana he estado tratando es escribir código en serio con JavaFX en vez de pedazos de código; El resultado ha sido una combinación de alegría (la plataforma promete mucho) y frustración (debido a que la documentación y ejemplos están rotos debido a que el API está cambiando).

JavaFX en este momento es una herramienta para Alpha Geeks. En serio. Pese a estar en su versión 1.3 aún hay cosas importantes por mejorar, ademas de que el API pareciera estar cambiando. Si a eso se le suma el hecho de que ningún vendedor le está dando soporte serio en los teléfonos celulares (a diferencia de Android) no creo que nadie lo tome en serio para un proyecto empresarial.

¿Está todo perdido? Yo creo que el primer lugar en donde JavaFX va a tener precedencia va a ser en el escritorio, antes que los celulares. Sin embargo una mejor integración con Java y Swing (hay muchísimo código que no se va a evaporar de la noche a la mañana) además de mejoras en el soporte de Eclipse y NetBeans son necesarias. Con todo y eso, un lenguaje fresco para hacer interfaces gráficas era necesario y JavaFX parece ser un paso en la dirección correcta.

Pero bueno, no me extiendo más y los dejo con lo que en mi opinión son los mejores enlaces y libros sobre el lenguaje:

  • JavaFX layout secrets (Amy Fowlert). En mi opinión lectura obligada para entender como funcionan, en especial si usted hace aplicaciones empresariales.
  • JavaFX in Action: Muy buenos ejemplos, buena cobertura del API. No es un libro de principantes, aunque es increíblemente fácil de digerir.
  • Sitio oficial de JavaFX: Es la referencia obligada, sin embargo desde que sacaron la versión 1.3 retiraron un montón de ejemplos debido a que el API cambió. Un fastidio 🙁
  • El blog de Jim Weaver: Tuve la suerte de estar en una clase con Jim en JavaOne del 2008. Es un evangelista del lenguaje, tiene mucha experiencia práctica (y un libro para respaldarlo, Pro JavaFX 1.2 Book). Mucha información útil en su blog.

¿Y usted, tiene algún recurso interesante que quiera compartir?

–Jose

OSX Postfix Relay – envio de correos usando OSX y Postfix

Todo este lío comenzó cuando me tocó configurar a mi Mac Mini (la cual es mi servidor headless estos días) para que poder enviar correos desde PHP:

< ?php $to = "josevnz@mydomain.com"; $subject = "Test from tepuyes server!"; $body = "Hi,\n\nHow are you?"; if (mail($to, $subject, $body)) { echo("

Message successfully sent!");
} else {
echo("

Message delivery failed...

");
}
?>

Odio a PHP. En Windows se puede especificar un servidor SMTP pero en UNIX este lenguaje utiliza Sendmail o lo que haya por debajo. Se puede utilizar Pear PHP mail pero eso implica que tengo que cambiar mi código.

Ahhh, nada como JavaMail para estos casos 😀

Bueno, volviendo al tema que nos interesa, los correos nunca salían de la cola. Y es que mi proveedor de Internet, Cablevision, bloquea cualquier conexión a servidores de correo en los puertos 25 en un intento por detener el SPAM.

Intenté utilizar el servidor de correo que ellos sugieren (mail.optonline.net) pero este se quejaba que mi maquina no tenia un registro A en DNS que pudiera ser resuelto (sorpresa, es una máquina detrás del firewall). Traté de utilizar el servidor de correo de la compañia que hospeda a mi dominio en DNS usando autenticación, y para ello configuré lo siguiente en el archivo /etc/postfix/main.conf:

relayhost = smtpout.secureserver.net:3535
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = may
smtp_tls_CApath = /etc/postfix/certs
smtp_tls_session_cache_database = btree:/etc/postfix/smtp_scache
smtp_tls_session_cache_timeout = 3600s
smtp_tls_loglevel = 1
tls_random_source = dev:/dev/urandom

Y en el archivo /etc/postfix/sasl_passwd pusé mi usuario y clave con el cual voy a hacer el relay:


smtpout.secureserver.net: josevnz@mydomain.com:mycoolpassword

Necesitamos usar un certificado digital. La gente de Verisign ofrece uno el cual podemos bajar desde aqui: https://www.verisign.com/support/roots.html (en este caso yo lo copié en /private/tmp/roots.zip)

Luego un poco de carpintería ya que hay que decirle a Postfix que use los nuevos parámetros:


sudo mv /private/tmp/roots.zip /etc/postfix/certs
sudo unzip -j roots.zip
sudo openssl x509 -inform der -in thawte\ Primary\ Root\ CA\ -\ G2_ECC.cer -out thawte\ Primary\ Root\ CA\ -\ G2_ECC.pem
sudo c_rehash /etc/postfix/certs
sudo postmap /etc/postfix/sasl_passwd
sudo postfix stop
sudo postfix start

Sin embargo el servidor de ‘relay’ que decidí utilizar tiene problemas de DNS:

Tepuyes-Server:certs josevnz$ sudo mailq
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
41D3C1201BB 348 Mon Feb 15 18:12:43 josevnz@Tepuyes-Server.local
(Host or domain name not found. Name service error for name=smtpout.secureserver.net type=MX: Host not found, try again)
josevnz@mydomain.com

¡Que vaina!. Sin darme por vencido decidí utilizar a Gmail como relay, cambiando lo siguiente en /etc/postfix/main.cf:

relayhost = smtp.gmail.com:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = may
smtp_tls_CApath = /etc/postfix/certs
smtp_tls_session_cache_database = btree:/etc/postfix/smtp_scache
smtp_tls_session_cache_timeout = 3600s
smtp_tls_loglevel = 1
tls_random_source = dev:/dev/urandom

Y además en etc/postfix/sasl_passwd:

smtp.gmail.com micuentaengmail@gmail.com:UltraSuperDuperPassword

Reiniciamos a Postfix una vez mas:

sudo postmap /etc/postfix/sasl_passwd
sudo postfix stop
sudo postfix start

Esto me permitió resolver el problema. Comparto este truco el cual funciona al menos en OSX Leopard y ahora me permite mandar correos desde PHP 🙂

Pervasive computing: Sentilla once again

Ya ha pasado un rato laaaargo desde que juegue con mis motes de Sentilla Lab. La última aplicación que escribí (AguaYFuego) requiere un poco de maquillaje (en aquel entonces lo hice con Swing y JFreeChart). Esta vez voy a probar una nueva dirección.

Ahora que tengo mi servidor Mac mini ocioso creo que es hora de poner a trabajar ese equipo. Por ahora me estoy bajando las actualizaciones para OSX y poniéndole las pilas a los sensores 🙂

Swing + String.intern() = New Garbage collection settings

Y después de todo este tiempo de andar jugando con Java uno descubre nuevas cosas; En estos días una aplicación que escribí la cual muestra aproximadamente medio millón de filas (con por lo menos 70 columnas) se empezó a quedar sin memoria con el siguiente error:


java.lang.OutOfMemoryError: PermGen

Una de las cosas que yo hice en mi aplicación para conservar memoria fué utilizar String.intern() para tener un “cache” de las cadenas de caracteres que se repetian más en mi aplicación (lo cual es seguro cuando se usa en múltiples hilos de ejecución también ya que el objeto String no se puede modificar).

¿Pero porqué esto? Bueno, resulta que yo le estaba dando bastante memoria al area de heap de la máquina virtual, la cual esta destinada a objetos de corta duración, pero la sección que contiene las clases y en este caso objetos que nunca son reciclados por la máquina virtual seguía creciendo:


java -Xms512m -Xmx1024m com.kodegeek.app.MyBigApp

La solución: Permitirle a la máquina virtual que descargue cosas que no utiliza y sobre todo darle más espació para poner otras cosas, como objetos ‘String’. Después de correr Jconsole y darme cuenta la que sección de ‘PermGen’ se estaba llenando entonces comencé a probar distintos parámetros, hasta que esta combinación me dio los resultados deseados:


java -Xms512m -Xmx1024m
-XX:MaxPermSize=256m -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled com.kodegeek.app.MyBigApp

Hay muchos tutoriales interesantes en la red sobre como entonar la máquina virtual, le recomiendo que los lea primero antes de optimizar o copiar lo que vean por allí.

StupidZombie y Java store: La historia un mes después

StupidZombie @ Java Warehouse¿Que pasó un mes después?

Hace ya más de un mes me decidí a poner a StupidZombie en la tienda de Java de Sun (Java Warehouse). La idea era probar esta nueva tecnología de distribución de Sun mientras esta maduraba (al tiempo que me decidía si quería pagar los $50 dolares anuales por tener a StupidZombie allí). Sin embargo, después de ser aceptada esta se encuentra en modo de revisión desde hace un mes.

¡Un mes!. No estoy seguro que tan complicado es revisar la aplicación pero un mes para saber si la aplicación fué aceptada o cancelada me parece bastante. Por varias manera he intentado contactar a Sun para ver que ocurre (sobre todo si se trata de un problema de indole técnica) pero no he obtenido ninguna respuesta.

Es dificil saber como está progresando el beta de Java Warehouse, pero los foros tienen poca actividad (solamente 48 mensajes al momento de escribir esto). De verdad espero que las cosas tomen otro color, pero por los momentos las noticias no son alentadoras.

¡Vamos Sun (Oracle), todos están esperando que la tienda termine de despegar!

Actualización: Parece ser que Sun está trabajando duro en resolver ciertos problemas técnicos:

Hi Jose Vicente Nunez Zuleta,

Thank you for contacting us. We have an issue in the app wrapper; therefore, the approval process is delayed. We have done some testing with your app and is waiting for addressing the app wrapper issue. We will contact you once we have more update. Sorry about the delay.

Regards,
Roger

Amanecerá y veremos 🙂

Localización en Java (II): El caso de StupidZombie

StupidZombie localization issues¿Qué tiene de malo la imagen?. Pista: ¡Llámame p’atras!

Bueno, ya casi está listo. Pero cuando digo ya casi es porque aún tengo componentes de Swing los cuales no se portan muy bien en cuanto le cambio el lenguaje y la región al programa.

¿Qué hacer? Parece que es una cucaracha común, en especial con JFileChooser:

Hay soluciones, voy a probarlas y después les digo como me fué. Sin embargo con Swing es irritante ver como la promesa de Java “Run anywhere” se quiebra un poquito 😉

Veneblogs: , , , , ,

Blogalaxia: , , , , ,

To2Blogs: , , , , ,

Technorati: , , , , ,

Del.icio.us: , , , , ,

Localización en Java (I): El caso de StupidZombie

Bueno, ya trabajando en la versión 1.1 de StupidZombie. En este caso una de las cosas que dejé fuera de la versión 1.0 fué el soporte del lenguaje Español.

Si el usuario ya tiene a su sistema operativo con localización en Español entonces no hay problema, sin embargo ¿que pasa si no es así? Pienso resolver eso permitiendo al usuario agregar esto como una propiedad más en la interfaz gráfica de SZ:

package com.stupidzombie.ping;

import java.util.Locale;


/**
 * Manages the access to the StupidZombie localized resources
 * @author undead@stupidzombie.com
 */
public class LocaleManager {

	private static PreferenceManager pref;
	
	private LocaleManager() {
		// EMPTY
	}
	
	/**
	 * Return the desired locale. First check user preferences and if not there check system default.
	 * Once the a locale is found make it the default locale and return it. 
	 * @return locale
	 */
	public static Locale getZombieLocale(String variant) {
		pref = new PreferenceManager();
		String languaje = pref.getPref().get("languaje", System.getProperty("user.language", "en"));
		String country = pref.getPref().get("country", System.getProperty("user.region", "US"));
		Locale.setDefault(new Locale(languaje, country, variant == null? "": variant));
		return Locale.getDefault();
	}	
}

La idea es buscar en las preferencias (PreferenceManager es una clase que escribí la cual maneja las preferencias de SZ), si no está allí entonces revizar las propiedades del sistema y si hay nada definido entonces agregamos valores por omisión.

Usandolo desde Java:

	static {
		BUNDLE = 
			ResourceBundle.getBundle(StupidZombieGui.class.getName(), LocaleManager.getZombieLocale(null));
	}

Por ahora si usted quiere compilar el código y ver como trabaja puede llamar al programa de la siguiente manera:

java -jar -Duser.languaje=es -Duser.region=VE StupidZombie.jar

Por cierto, para todos aquellos lectores que tienen hijos, ¡feliz día del padre (adelantadas) :)!

Veneblogs: , , , ,

Blogalaxia: , , , ,

To2Blogs: , , , ,

Technorati: , , , ,

Del.icio.us: , , , ,

Comienza la cuenta regresiva para StupidZombie 1.1

Ya comenzó la cuenta regresiva para StupidZombie 1.1. Hoy cree las ‘ramas’ en SubVersion, hice pequeños cambios en la compilación del proyecto, y actualice las librerías de terceros (con la ganancia grátis en velocidad del Pinger de XML-RPC).

Pero lo más importante es que ya tengo la lista completa de tareas para la versión 1.1.

Veneblogs: , , ,

Blogalaxia: , , ,

To2Blogs: , , ,

Technorati: , , ,

Del.icio.us: , , ,

¿Como hacer que las aplicaciones de Java se vean como nativas en OSX?

Bajate a StupidZombie
Bajate a StupidZombie

En este caso estoy tratando de que mi aplicación, StupidZombie, tenga un instalador nativo para OSX. Si bien el uso de Webstart es increiblemente conveniente yo también quiero que mis usuarios puedan correr la aplicación de manera similar a otras aplicaciones.

Me conseguí dos excelentes recursos, los cuales son muy fáciles de seguir:

El segundo enlace en particular tiene información sobre como capturar eventos, jugar con la barra de estado y otros.

¿Y que pasa con Linux / Windows? Creo que el instalador de Windows va a ser la segunda prioridad ya que (horror) no tengo Linux instalado en ninguna de las máquinas que tengo en la casa 🙁
Veneblogs: , , ,

Blogalaxia: , , ,

To2Blogs: , , ,

Technorati: , , ,

Del.icio.us: , , ,