viernes, 2 de septiembre de 2011

Google Voice para Android en España

 Hoy por hoy si estás en España, ¡no uses, o mejor, ni si quiera instales Google Voice para Android!
Supongo que el mensaje es directo y claro, pero por si acaso no queda claro, lo explicaré de la forma más clara posible.
¿Por qué recomiendo no utilizar y ni si quiera instalar la aplicación en Android? Veamos: Google Voice no está disponible en España de forma completa. No entiendo por qué se anunció a bombo y platillo que estaba disponible en España cuando no es así.
Lo único que está disponible en España es la posibilidad de hacer llamadas desde GMail. Eso no es Google Voice.
Google Voice nos permite tener un número propio de Google Voice (cosa que en España no existe), nos permite tener un buzón de voz llamado VoiceMail, nos permite utilizar la aplicación Google Voice en Android, y todo lo mencionado anteriormente en España no funciona.
En España sólo se pueden hacer llamadas utilizando la cuenta de Google Voice desde GMail. Nada más.
El lector se preguntará por qué mi mensaje inicial de no usar y ni si quiera instalar la aplicación Google Voice en Android... pues bien, habiendo dejado claro que Google Voice no funciona en España, simplemente sería absurdo intentar usar una aplicación que ya os aseguro que a día de hoy no funciona, pero lo grave no es eso, lo grave es que cada vez que intentas activar Google Voice en Android esta aplicación envía un SMS a Estados Unidos, al número 0017605370537. En el caso de Movistar 0.60€ por mensaje que nadie te dice que se envía, lo hace la app de forma totalmente silenciosa. Ya te enterarás cuando te llegue la factura de tu compañía de teléfono. Como además la aplicación no te avisa de que en España no funciona sino que te dice que hay un problema y lo intentes más tarde.... imaginad el resultado.
Resumiendo: una pena que Google, compañía que en general goza de mi total confianza cometa estos errores tan lamentables y de los que parece casi nadie habla.

lunes, 25 de abril de 2011

Firefox 4: errores con DNIe y otros certificados digitales


Como a más de uno le habrá pasado, al instalar la última versión de Firefox (la 4), tuve la desagradable sorpresa de que mi DNIe, que funcionaba perfectamente, dejó de funcionar al entrar en las webs de algunos bancos y ciertos certificados digitales tampoco me funcionaban. Curiosamente no fallaba al entrar en la web de la agencia tributaria.

El error que daba Firefox4 en ambos casos era el mismo, tanto para dichos certificados como para el DNIe.


Este error se debe a que una de las líneas de las preferencias de Firefox viene cambiada en esta versión, no se si por error o por cambio de política, (Actualización por sugerencia de @tractis: Se debe a un cambio de política debido a una vulnerabilidad detectada en páginas SSL) la cuestión es que basta con cambiar lo siguiente y funcionará como antes sin problemas:

Para quien no separa como cambiar los parámetros internos de configuración de Firefox diremos que hay que poner en la barra de direcciones lo siguiente:

about:config

De este modo nos aparecerá una lista de parámetros de configuración bastante larga. Para seleccionar la línea que buscamos es recomendable introducir en la casilla "Filtro" lo siguiente:

security.ssl.allow

Nos aparecerá la línea con la preferencia de configuración:

security.ssl.allow_unrestricted_renego_everywhere__temporarily_available_pref

En la columna valor veremos que pone "false" para cambiarlo por "true" basta con hacer doble clic en dicho valor y ya está.

(Actualización por sugerencia de @tractis: Tal y como Alfonso de The New Territory explica en su blog la solución descrita unas línas más arriba deja sin resolver la vulnerabilidad comentada anteriormete y tenemos que tener en cuenta que si la llevamos a cabo mantendremos dicha vulnerabilidad para todas las páginas SSL. Lo que él recomienda es incluir sólo las páginas que son de confianza en una lista de excluidos y no modifiquemos la línea que yo apunté)

Eso lo podemos hacer en la línea:

security.ssl.renego_unrestricted_hosts y en el valor introducimos cada dominio se parado por comas: (ej. cam.es,cajamar.es)

A partir de ese momento nuestros certificados y DNIe funcionará igual que antes.

jueves, 14 de abril de 2011

Breve apunte de programación con Java. Impresión con JasperReports a doble cara


Otro breve apunte de programación con Java. Hoy trataremos el tema de imprimir a doble cara usando JasperReports.

Para imprimir algo a doble cara, la forma más sencilla es decirle al driver de impresora que se ponga en modo duplex e imprimir normalmente (el driver se encarga de hacer la impresión a doble cara).

El problema está en que si estamos imprimiendo continuamente cosas a doble cara y cosas que no van a doble cara, que sea el usuario quien cambie las funciones de impresión en cada impresión no es lo más recomendable, por lo que la opción más adecuada es que sea el programa el que indique al driver que vamos a imprimir en duplex, imprimamos como lo haríamos normalmente y sea el driver quien se encargue del duplex y al finalizar el informe deje el tema duplex como antes del mismo.

Con un ejemplo se verá más claro:
jreport = JasperCompileManager.compileReport(new FileInputStream("miReport.jrxml"));

Map parametros = new HashMap();
parametros.put("misql", "select * from clientes order by razon_social");

JasperPrint print = JasperFillManager.fillReport(jreport, parametros, conn);

JRExporter exporter = new JRPrintServiceExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);

PrintRequestAttributeSet attrSet = new HashPrintRequestAttributeSet();
attrSet.add(Sides.DUPLEX);

exporter.setParameter(JRPrintServiceExporterParameter.PRINT_REQUEST_ATTRIBUTE_SET, attrSet);
exporter.exportReport();

En el ejemplo anterior observamos varias cosas: El report recibe un parámetro (que debemos haber indicado en la creación del mismo) llamado misql, el cuál contiene la SQL que recupera los datos del report.

Una vez tenemos el objeto JasperPrint podemos imprimirlo normalmente o bien crear un objeto JRExporter para aplicarle ciertos parámetros de impresión (en este caso, la impresión DUPLEX).

Finalmente con exporter.exportReport() lo que hacemos es imprimir con los parámetros fijados en exporter.

lunes, 4 de abril de 2011

Breve apunte de programación con Java. ProgressMonitor

Siguiendo con los breves apuntes de programación con Java, hoy hablaremos de una clase muy simple y muy útil que nos brinda Java para monitorizar procesos en nuestros programas de escritorio con Swing.

La clase se llama ProgressMonitor y se construye así:
new ProgressMonitor(Component parentComponent,
  Object message, String note, int min, int max);

Aunque parece bastante claro qué es cada cosa, parentComponent es el componente del que depende la ventana que creará la clase ProgressMonitor y puede ser null, message es el mensaje que mostrará el diálogo en la línea superior, note es la cadena que se mostrará debajo de la anterior y sobre la barra de progreso, min es el valor mínimo de la barra de progreso y max el máximo.

Veamos un ejemplo y cómo se vería:
ProgressMonitor pm = new ProgressMonitor(null, "Importación de Datos",
  "Realizando Importación...", 0, 100);  
pm.setNote("Insertando Albaranes...");
pm.setProgress(0);
new Thread()
{
  public void run()
  {
    hacerCositas(); // en éste método se actualiza pm con 
                    // pm.setProgress(x) para cada registro
  };
}.start();

Se vería más o menos así:

Es muy importante tener en cuenta que para que funcione correctamente ProgressMonitor debe ser actualizado desde un Thread ya que si no se hace así no se actualizará y se mostrará un diálogo completamente estático en el mejor de los casos, a veces ni se muestra.

También conviene recordar que si el proceso tarda menos de 500 milisegundos no se muestra el diálogo. Esta cifra también se puede cambiar.

Para más información es interesante leer Tutorial de uso de Barras de Progreso y ProgressMonitor (en inglés) de Oracle.

sábado, 12 de marzo de 2011

Breve apunte de programación con Java. Return, Tabs, cursores y otras malas hierbas


Hoy, retomando desde hace mucho, demasiado tiempo, el blog, escribiré un breve apunte sobre el uso de la tecla Return o Enter, así como las flechas del teclado (cursores) para pasar de un campo a otro utilizando Java J2SE (Swing).

Como todos sabemos, la tecla por defecto en entornos gráficos para pasar de un campo al siguiente es la tecla TAB. En ocasiones es mucho más práctico pasar al siguiente campo pulsando la tecla Intro, ya que está junto al teclado numérico y evita tener que desplazar la mano. También resulta casi imprescindible cuando el usuario viene de aplicaciones en las que era el Return la tecla elegida para pasar de campo y la costumbre es de años de utilización.

Para obtener el resultado buscado, en Java tenemos varias alternativas tales como utilizar listeners en las pulsaciones de cada campo y en función de la tecla hacer esto o lo otro... pero Java tiene definidas unas teclas para pasar el campo siguiente o anterior y reescribiendo éstas obtenemos el resultado sin necesidad de escribir más código del necesario.

El código que podríamos insertar en el constructor de la ventana podría ser el siguiente:


Set forwardKeys = this.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS);
Set newForwardKeys = new HashSet(forwardKeys);
newForwardKeys.add(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0));
newForwardKeys.add(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0));
this.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, newForwardKeys);
Set backwardKeys = this.getFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS);
Set newBackwardKeys = new HashSet(backwardKeys);
newBackwardKeys.add(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0));
this.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, newBackwardKeys);


Dicha ventana tendría definidas las teclas ENTER y FLECHA ABAJO para siguiente campo y FLECHA ARRIBA para el anterior.