viernes, 28 de enero de 2011

Insertar varias filas en MySQL con Java

Ayer me preguntaban como se podían meter varias filas directamente en una base de datos MySQL a través de Java. A mi, lo único que se me ocurrió es preparar un string con tantos valores como filas queramos meter:

String s = "INSERT INTO table (aa, bb ,cc) values (?,?,?), (?,?,?) , (?,?,?) , (?,?,?)...."

y así tantas veces como filas queramos meter. Todo esto se podría automatizar con un método que devolviera ese string automáticamente pasándole el número de filas que quisiéramos (escrito rápido y sin mucha comprobación):

public String createInsert(int rows){
   String s = "INSERT INTO table (aa, bb, cc) values ";
   for(int i = 0; i < rows; i++){
      s += "(?,?,?),"
   }
   //Aquí habría que quitar la última coma
}

Pero hoy, la misma persona que me preguntó me informa que todo esto ya está preparado en Java y que se puede hacer de manera mucho más sencilla... así que aquí dejo una mejor solución (lo de antes no eran más que indagaciones):

String s = "INSERT INTO table (aa, bb ,cc) values (?,?,?)"
PreparedStatement st = connection.prepareStatement(s);
int rows = 20;
for(int i = 0; i < rows; i++){
   st.setString("a string")  //or whatever value: int, date, null
   st.setString("a string")  //or whatever value: int, date, null
   st.setString("a string")  //or whatever value: int, date, null
   st.addBatch();      //añadir una fila
}
st.executeBatch();

lunes, 24 de enero de 2011

Grub.cfg en lugar de menu.lst

Donde dije digo digo Diego... y dónde antes se editaba /boot/grub/menu.lst ahora se edita /boot/grub/grub.cfg

Así que si quieres cambiar las opciones de arranque de GRUB de tu Ubuntu 10.04, ya sabes, no busques por menu.lst porque no lo encontrarás, busca y edita grub.cfg en su lugar

domingo, 2 de enero de 2011

WhatsApp para Android

Hoy he descubierto la aplicación WhatsApp para mi Android. Había oído hablar de ella, pero no había hecho mucho caso pues no me parecía que ofreciera mucha mejora con respecto a otros servicios ya existentes como mandar un correo electrónico o el propio chat de gtalk (los dos te notifican de la llegada de un nuevo correo y de un nuevo chat).

 Sin embargo, hablando con dos amigos, que me han convencido, tienen toda la razón en que:
  • WhatsApp permite separar: mientras que los correos te llega una notificación por cada uno, con WhatsApp sólo te llega notificación cuando alguien te escribe... no quieres tener que estar leyendo todos los correos que te llegan al momento por si alguien te quiere decir algo.
  • Parece ser que el GTalk no va del todo fino en los iPhone
  • A mucha gente le da pereza escribir un email, mientras que la interfaz de esta aplicación invita a que se use más como SMS.
La cosa es que finalmente me la he instalado. Es necesario registrarse con nuestro número de teléfono, de manera que únicamente podremos tener una cuenta asociada a nuestra tarjeta. Y el primer "fallo" llega aquí:
  • No es gratuita. Se adquiere una licencia que nos permite utilizar la aplicación durante un año, tras el cual se deberá pagar por el uso de la misma (no estoy seguro de la cantidad pero me parece haber oído que algo así como 1 euro mensual... quizá me confunda y en su página no lo encuentro)
Cuando se verifica y activa la cuenta, llega el segundo fallo:
  • Detecta que tengo una ROM distinta de la de fábrica y dice que puede ser incompatible... a pesar de ello sigo adelante
La inicialización tarda bastante, yo de hecho he tenido que apagar el teléfono y volverlo a encender cansado de esperar (más de 10 minutos??).

Otro fallo, este de privacidad:
  • De buenas a primeras, puedes ver a todos los contactos que tienen la aplicación instalada, lo que quiere decir, que a partir del momento que la instalas, tu también saldrás en todas las listas de la gente que se la instale... Debería de haber una opción de privacidad para no aparecer en dichas listas automáticamente y poder ir añadiendo a los usuarios que quieras una vez ellos te hayan aceptado. Aunque luego se puede bloquear a usuarios, no es lo mismo.
Más fallos, de funcionamiento:
  • No sé si será debido a mi ROM y las incompatibilidades que puedan existir, pero al abrir la lista de contactos de WhatsApp, se me queda colgada y tengo que volver a abrirla para que funcione... esto me ha pasado sobretodo al principio y aleatoriamente, bastantes veces. También pasa esto en otras pantallas, pero menos... ya digo que no sé si será por mi ROM o no.
  • No hay manera de desactivar las notificaciones... hay que entrar en la elección del sonido y elegir "Ninguno", pero no hay un botón para desactivarlo y luego poder volverlo a activar, que sería mucho más rápido.
  • Igual que en el caso anterior, no hay manera de desactivar la aplicación momentaneamente en casa de que tengamos poca batería o que simplemente nos de la gana desactivarla... por lo que he visto, creo que la única manera sería desinstalándola... o quitando la conexión de datos claro...
  • Y por último, por la manera en que funciona la aplicación, supongo que gastará "bastante" batería. En los iPhone funciona a través de los mensajes "push", pero en android ese tipo de mensajes no están implementados todavía (por lo que tengo entendido) por lo que tendrán que tener otro sistema para la recepción de los mensajes que implicará un mayor consumo de batería.
Por tanto, y resumiendo, la aplicación en sí está bien, la idea es muy buena y da algo más que lo que pueden ser las notificaciones del correo o de otros medios de chat (ver el artículo del Androide Libre para más info). Sin embargo, el funcionamiento de la misma no es el mejor, echando en falta opciones de privacidad y sobre todo la posibilidad de poder suspender la aplicación temporalmente.

lunes, 27 de diciembre de 2010

Cuidado con el Wii Party

Pues sí, el juego en cuestión actualiza la versión de la Wii sin previo aviso de manera que te la deja en la versión 4.3E (para el continente europeo) y hace que sea más complicado instalar el HomeBrew para poderle instalar nuestras propias aplicaciones.

No es imposible pero actualmente, la única manera posible de instalarlo es con un juego original (el LEGO Indiana Jones por ejemplo) que si no tenemos, tendremos que conseguir, bien comprándolo o mejor pidiéndolo a algún amigo / conocido o alquilándolo en una tienda de videojuegos.

Pues sólo dejo esto como aviso a navegantes que a mi ya me ha pasado al no tener ni idea del WiiMundo

lunes, 20 de diciembre de 2010

Deshabilitar Foreign Key Checks en MySQL

En algunas ocasiones las foreign keys de nuestras tablas nos pueden dar mucho la lata cuando estamos en un entorno de desarrollo, borrando y añadiendo filas constantemente, restaurando tablas... ya que nos saltará error al incumplirse las restricciones que estos índices imponen.

Bien, pues en MySQL es fácil deshabilitar este chequeo y que no nos de error, para ello:

set foreign_key_checks = 0; 
 
Realizamos nuestras acciones
 
set foreign_key_checks = 1; 

Métodos para el Drag and Drop en Java

Una de las cosas que se ha cambiado en la implementación de Java 6 es la manera en que se realizan los drag and drops (DnD) entre los componentes. No tengo ni idea de como funcionaba antes, pero por lo que he leído y me han contado, era bastante más complicado que como se puede hacer ahora.

Lo primero que se debe saber es que todo gira en torno a la clase TransferHandler. Muchos de los componentes de Swing ya vienen con un "Transfer Handler" por defecto, que en muchos casos será suficiente para nuestros propósitos.

Para comenzar a utilizar un TransferHandler en nuestro componente, existen tres métodos que deberemos emplear:

A continuación, existen dos tipos de métodos: los métodos para exportar datos y los métodos para importar datos.

Los primeros se utilizan para exportar los datos desde un componente cuando se comienza un gesto de arrastrar (drag) o cuando se copia o corta desde el componente con el que estamos trabajando. Estos métodos son:
  • getSourceActions(JComponent) - indicará qué acciones se permiten con los elementos del componente: copiar, mover o ambos. Este método se llamará automáticamente al comienzo del drag o arrastre.
  • createTransferable(JComponent) - este es el método más importante de todos ya que es el encargado de preparar los datos que se desean exportar: todo un objeto propio, sólo un String con el nombre, el id... Devuelve un objeto de tipo Transferable
  • exportDone(JComponent, Transferable, int) - este método se llama una vez que se ha terminado el drag and drop y en él se deben implementar las acciones necesarias después de la exportación (por ejemplo, después de mover un elemento, se debe eliminar de su ubicación original).

A continuación, los métodos empleados para importar datos cuando se suelta un objeto sobre un componente o cuando se pega desde el portapapeles:
  • canImport(TransferHandler.TransferSupport) - este método se llama de manera constante mientras se está haciendo un drag and drop y nos indica si el componente que se encuentra debajo del cursor del ratón aceptará los datos (return true) o si de lo contrario los rechazará (return false).
  • importData(TransferHandler.TransferSupport) - este método se invoca en el momento que se suelta sobre un componente terminando el drag and drop. Realiza las acciones necesarias para insertar los datos desde el origen hasta este punto y devuelve true en caso de una importación satisfactoria y false en caso contrario.

Por último, es necesario indicar la función de la clase TransferSupport, una clase interna de TransferHandler y que permite que se realice la transferencia de los datos entre el origen y el destino.Esta clase nos ofrece información acerca de la transferencia como el componente destino, la acción que se va a realizar (copiar o mover), los datos que se están transfiriendo, si se soporta ciertos tipos de datos, la localización exacta del componente destino...

Con estos métodos se puede realizar drag and drop en java, la lógica a aplicar en cada uno de ellos depende de nuestra aplicación en cuestión.

Tutorial completo

jueves, 9 de diciembre de 2010

Instalar Java de Sun en Ubuntu 10.04

Siguiendo con el tema del servidor, al que tengo un poco abandonado, hoy me ha tocado instalar el JRE de java para poder ejecutar aplicaciones en él. Cómo otras veces ya había tenido problemas con los paquetes open que vienen en los repositorios por defecto de Ubuntu, he decidido no jugarmela e instalar directamente los paquetes de Sun.

Para ello, desde la consola ejecutamos:
sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"

Para a continuación, actualizar e instalar java:
sudo apt-get update
sudo apt-get install sun-java6-jre

y LISTO!

Visualmente también lo podemos hacer abriendo Synaptic: System-> Administration-> Synaptic Package Manager
Una vez dentro, en Settings-> Repositories-> Other Software, activamos el repositorio arriba indicado (http://archive.canonical.com/ lucid partner) y si no está, lo añadimos. Salimos de esta ventana y hacemos un "Reload" del Synaptic y buscamos el paquete que queremos instalar. Igual de sencillo: el JRE de java instalado en nuestro servidor para poder ejecutar otras aplicaciones.

Espero sea útil.