jump to navigation

Quitar HTML de una cadena octubre 14, 2008

Posted by superpiwi in Java, Programacion.
3 comments

public static String quitarHTML(String htmlString)
{
String noHTMLString = htmlString.replaceAll("\\<.*?\\>", "");
return noHTMLString;
}

ASN.1 Editor Plugin para Eclipse agosto 7, 2008

Posted by superpiwi in Eclipse, Java, Programacion.
add a comment

Si trabajas con ASN.1 en tus desarrollos, un muy buen plugin que puedes instalar en Eclipse es ASN.1 Editor. Permite resaltado de sintaxis, comparacion de valores, asistente de codigo y para mi una de las mejores opciones: la decodificacion de mensajes (BER dump) que permite simplificar el analisis de mensajes ASN1 codificados. Para ello simplemente has de abrir el fichero binario que contiene el mensaje ASN1 decodificado y en la consola podras ver el resultado:

Enlace | ASN Editor

Aptana Studio 1.0 liberado noviembre 2, 2007

Posted by superpiwi in Uncategorized.
1 comment so far

aptana.png

Ya podemos ir descargandolo ^^.

Enlace

JavaLangNullPointer no esta muerto octubre 19, 2007

Posted by superpiwi in Uncategorized.
add a comment

Llevo mucho tiempo sin escribir en JavaLangNullPointer, pero os quiero decir que esta web no esta muerta.

Desgraciadamente (o no) todo mi tiempo se me va ahora en UBUNTU LIFE

http://www.ubuntulife.net

Si soy el mismo «superpiwi», si teneis en feeds esa web vereis que practicamente escribo cada dia.

¿Esta muerta javalangnullpointer?

ni de coña, de hecho tengo intencion de cambiar de servidor en navidad y relanzarla. Pero ahora no escribo pq ya estoy escribiendo en ubuntu life.

Significa que estoy parado???

ni mucho menos, tengo varios proyectos abiertos y cuando esten terminados seran compartidos aqui:

* Mejoras a SQL2iBatis, una herramienta para generar ficheros de mapero iBatis a partir de tablas

* Alexandria, una libreria para almacenar/compartir ficheros mediante tags

Y dos nuevos que empece:

* EMonitor, API para controlar y monitorizar procesos Unix: comprobar estado, matar/levantar procesos

* JEvolution, para automatizar pruebas (ejecucion de shell scripts, sqlplus, tareas java mediante reflection y XMLs)…

No comento nada de estos ultimos hasta que esten mas avanzados…

Tengo pendiente tambien con un «socio» implementar un «buscador» muy especial, pero de esto no comento nada que si no nos roban la idea 😉

Por cierto, mi socio ha creado la mejor web de Java que puede existir, pero todavia no la ha hecho publica, esperemos que lo haga pronto…

Saludos, y de momento seguir visitandome en http://www.ubuntulife.net, pronto volveremos…

FreeTTS, convertir textos a voz… agosto 21, 2007

Posted by superpiwi in Eclipse, Java, Programacion.
47 comments

Hoy algo divertido, vamos a convertir un texto en voz. Para ello hacemos uso del siguiente API: FreeTTS

Descargate el paquete desde su sitio web y lo descomprimes, Tienes que añadir a tu CLASSPATH los siguientes ficheros:

cmu_time_awb.jar, cmu_us_kal.jar, cmudict04.jar, cmulex.jar, cmutimelex.jar, en_us.jar, freets.jar, jsapi.jar

Aqui te dejo un ejemplo sencillito. He escrito una clase SimpleTTS. Con un constructor donde le pasas la voz que quieres usar («En el ejemplo Kevin16) y 2 metodos: speak (que te reproduce por el altavoz el texto especificado) y toFile (que te graba un fichero de audio).

Ejemplo:

SimpleTTS voz = new SimpleTTS(”kevin16″);
voz.speak(”Hello World!”);
voz.close();


/**
*
* FreeTTS
* requiere en el CLASSPATH: cmu_time_awb.jar, cmu_us_kal.jar, cmudict04.jar, cmulex.jar, cmutimelex.jar,
* en_us.jar, freets.jar, jsapi.jar
*
* @author jose
* @version 0.0.0.1
* @since JDK 1.5 / Eclipse Callisto
*/
import com.sun.speech.freetts.audio.AudioPlayer;
//import com.sun.speech.freetts.audio.JavaClipAudioPlayer;
//import com.sun.speech.freetts.audio.MultiFileAudioPlayer;
import com.sun.speech.freetts.audio.NullAudioPlayer;
//import com.sun.speech.freetts.audio.RawFileAudioPlayer;
import com.sun.speech.freetts.audio.SingleFileAudioPlayer;
//import java.io.*;
//import java.net.URL;
//import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioSystem;
import com.sun.speech.freetts.Voice;
import com.sun.speech.freetts.VoiceManager;
//import com.sun.speech.freetts.audio.JavaClipAudioPlayer;
public class SimpleTTS
{
Voice voice=null;
public SimpleTTS(String voiceName) throws Exception
{
VoiceManager voiceManager = VoiceManager.getInstance();
this.voice = voiceManager.getVoice(voiceName);
if (this.voice == null)
{
System.out.println("La lista de voces disponibles es:");
listAllVoices();
throw new Exception("No se encuentra la voz llamada: "+voiceName+". Por favor selecciona una voz diferente.");
}
this.voice.allocate();
}
//----
public void speak(String text) throws Exception
{
this.voice.speak(text);
}
//----
public void toFile(String filename,String text) throws Exception
{
javax.sound.sampled.AudioFileFormat.Type type = getAudioType(filename);
AudioPlayer audioPlayer = null;
if(audioPlayer == null)
audioPlayer = new NullAudioPlayer();
audioPlayer = new SingleFileAudioPlayer(getBasename(filename), type);
System.out.println("audioPlayer "+audioPlayer);
this.voice.setAudioPlayer(audioPlayer);
this.voice.speak(text);
audioPlayer.close();
}
//----
public void close() throws Exception
{
this.voice.deallocate();
}
//----
public static void listAllVoices()
{
System.out.println();
System.out.println("All voices available:");
VoiceManager voiceManager = VoiceManager.getInstance();
System.out.println("voiceManager:"+voiceManager);
Voice[] voices = voiceManager.getVoices();
for (int i = 0; i < voices.length; i++) {
System.out.println(" " + voices[i].getName()
+ " (" + voices[i].getDomain() + " domain)");
}
}
//----
public static javax.sound.sampled.AudioFileFormat.Type getAudioType(String file)
{
javax.sound.sampled.AudioFileFormat.Type types[] = AudioSystem.getAudioFileTypes();
String extension = getExtension(file);
for(int i = 0; i < types.length; i++)
if(types[i].getExtension().equals(extension))
return types[i];
return null;
}
//----
public static String getExtension(String path)
{
int index = path.lastIndexOf(".");
if(index == -1)
return null;
else
return path.substring(index + 1);
}
//----
public static String getBasename(String path)
{
int index = path.lastIndexOf(".");
if(index == -1)
return path;
else
return path.substring(0, index);
}
//----
static public void main(String[] args) throws Exception
{
try
{
// Instanciamos para usar la voz "kevin16"
SimpleTTS voz = new SimpleTTS("kevin16");
// Reproduce por el altavoz
//while (true)
//{
voz.speak("auan babuluba balan bambu");
voz.speak("Hello World!");
//}
voz.speak("Text to Speech demo");
// Graba un fichero de audio con el contenido en el directorio
voz.toFile("ttsdemo.wav", "Ubuntu Life is the best site of Linux");
// Podriamos reproducir este fichero desde consola: $ mplayer ttsdemo.wav
// Cerramos
voz.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
//----
}
//end of class SimpleTTS

JSQL2iBatis: Generador de codigo de Acceso a Bases de Datos agosto 19, 2007

Posted by superpiwi in Eclipse, Java, Oracle, Programacion.
10 comments

jsql2ibatis.gif

Este es un post tecnico (para desarrolladores de Java). Si no eres desarrollador o simplemente no te interesa, no lo leas, en esta web tambien encontraras muchas mas cosas.

Hace unas 2 o 3 semanas que termine JSQL2iBatis, pero hasta ahora no he tenido tiempo para contar de que iba esto.

JSQ2iBatis es un generador de codigo para hacer mas facil el acceso a cualquier tipo de base de datos a la que puedas conectar mediante JDBC. Esta inspirado en SQL2iBatis, y es similar a Abator, pero quitando la complejidad de este ultimo pues es mas simple. No es perfecto, tiene “algunos” fallos pero a mi me viene bien, me esta ahorrando mucho “tiempo” de codificacion. Imaginate que tienes que mapear 28 tablas, antes tardaba 1 semana, ahora tengo el codigo en 1 dia.

Yo empece escribiendo JSQL2iBatis como una “tool” que me ayudara para otro proyecto mayor: Alexandria. Es un proyecto que empezare en breve y toda la capa de acceso a base de datos la codificara ayudandome de esta tool.

He liberado el codigo como licencia GNU, podeis usarla libremente, y mejorarlo (esto ultimo es lo que espero mas, pues he escrito el codigo en poco tiempo y se que tiene muchas chapuzas, pero al menos funciona que es lo que me interesaba).

Pero bueno, vayamos “a lo que interesa”, veamos como se usa.

La idea es simple, es tomar un fichero con las sentencias CREATE TABLE de la base de datos y a partir de ese fichero generar las clases JAVA y ficheros XML de SQL Mappings para mapear esas tablas. Veamoslo mejor con un ejemplo.

Primeramente vamos a crear una tabla USUARIOS en MYSQL.

root@soledad:/opt/lampp/bin# ./mysql -u root mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.0.37 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> show tables
-> ;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| columns_priv |
| db |
| func |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| host |
| proc |
| procs_priv |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+---------------------------+
17 rows in set (0,00 sec)

Creamos una base de datos:

mysql> CREATE DATABASE TEST;
Query OK, 1 row affected (0,12 sec)
mysql> exit
Bye

Nos conectamos a la base de datos recien creada y creamos una tabla usuarios:

root@soledad:/opt/lampp/bin# ./mysql -u root TEST;
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.0.37 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> show tables;
Empty set (0,00 sec)
mysql> CREATE TABLE USUARIOS (LOGIN VARCHAR(50),PASS VARCHAR(50),IMAGEN BLOB,PERFIL VARCHAR(1),PRIMARY KEY(LOGIN));
Query OK, 0 rows affected (0,01 sec)
mysql> SELECT * FROM USUARIOS;
Empty set (0,00 sec)

gedit01.jpg

Bien, tenemos la tabla creada en MySQL, y un fichero llamado “TABLE.sql” con las sentencias CREATE TABLE de esta tabla. He de advertir que no soporto tipos compuestos, del estilo NUMBER(10), cuando definas el fichero de DDL con las sentencias CREATE TABLE, unicamente has de indicar el tipo de la columna (VARCHAR,BLOB,NUMBER,etc..) pero no la precision.

Vamos a generar el codigo JAVA y los XML correspondientes. Para ello en el directorio raiz de JSQL2iBatis existe un script “execute.sh” que hemos de ejecutar con la siguiente sintaxis:

./execute.sh <nombre_package> <directorio_destino> <fichero_sql>

donde:

nombre_package: es el package de las clases Java que se generaran. (nota: he detectado un pequeño fallo que hace que no se generen 2 clases java auxiliares, para evitarlo debes emplear como nombre del package “com.sqlmap”, de esa manera esas clases se generaran, despues ya puedes cambiar el nombre del package al que quieras).

directorio_destino: es el directorio donde se genera el codigo de las clases java y el xml.

fichero_sql: es el fichero de DDL con las sentencias CREATE TABLE que queremos mapear.

Por ejemplo ejecutamos:

./execute.sh com.sqlmap /home/jose/Desktop/source TABLE.sql

generacodigo.jpg

Se generaran en la carpeta /home/jose/Desktop/source las clases correspondientes.

Que son: Usuarios.java, Usuarios.xml, SQLMapping.xml, MyProperties.properties,y 2 clases de apoyo para iBatis llamadas SQLMap y SQLMapPool.

Ya solo nos queda añadir el driver de Acceso a MySQL. Y cambiar el properties para que apunte a nuestra base de datos de MySQL:

# Propiedades para MySQL (Descomenta si usas esta bdatos en lugar de ORACLE)
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/TEST
username=root
password=
activeConnections=010
idleConnections=5
maxWait=120000

properties.jpg

Tal vez tengas que editar el XML Usuarios.xml para ajustar el nombre de la tabla. MySQL es sensible a mayusculas y minusculas, no es lo mismo la tabla USUARIOS que la tabla Usuarios. En Oracle no es necesario hacer nada mas.

Pues bien, si has llegado a este punto. Se han generado de manera automatica todo lo necesario para acceder a la tabla Usuarios mediante iBatis. Veamos un ejemplo de codigo:
Podriamos acceder a la tabla de la siguiente manera:

//Para probar el funcionamiento de la clase
public static void main(String args[])
{
try
{
System.out.println("[iniciado]");
Usuarios test = new Usuarios();
test.setLogin("jose");
test.setPass("jose");
test.setImagen("OK".getBytes());
test.setPerfil("user");
test.insert();
System.out.println("[Finalizado]");
}
catch(Exception e)
{
e.printStackTrace();}
}
//----

ejemplo-de-uso-de-jsql2ibatis.png

Y el resultado:

root@soledad:/opt/lampp/bin# ./mysql -u root TEST
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.0.37 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> select * from USUARIOS;
+-------+------+--------+--------+
| LOGIN | PASS | IMAGEN | PERFIL |
+-------+------+--------+--------+
| jose | jose | OK | u |
+-------+------+--------+--------+
1 row in set (0,00 sec)

consulta1.jpg

YATA!!! que sencillo no?, no has tenido que escribir la clase Java de acceso a la tabla Usuarios y ya tienes una clase que te permite hacer INSERT, UPDATE, DELETES y mas operaciones. Incluso soporta insercion y recuperacion de BLOBS y todo…

Que guay!!!, y si no te gusta o quieres cambiar la SQL, solo tienes que editar el fichero Usuarios.xml.

Simple y Sencillo.

Pues ahora en vez de una tabla, escribe un fichero TABLE.sql con 28 tablas. A que mola!!! se acabo el escribir una por una el codigo de acceso Java a cada una de esas tablas.

Se que no es perfecto, pero esta basado en plantillas VELOCITY asi que facilmente cambiando las plantillas puedes generar tu propio codigo.

Espero que sea de utilidad. Puedes encontrar mas detalles en el fichero README que incluyo con la distribucion.

Referencias: iBatis Framework

Mis Proyectos Personales julio 18, 2007

Posted by superpiwi in Uncategorized.
7 comments

clock2.jpg

Lamento llevar tanto tiempo sin escribir en este Blog. No, no lo he olvidado, no lo voy a abandonar. Solo que no he tenido tiempo ni de actualizarlo como me hubiera gustado. Me faltan horas al dia…

Antes de nada, si me habeis preguntado algo y no os he respondido lo siento. Mandarme el codigo a la siguiente direccion:

ubuntulife.admin@gmail.com

Y cuando pueda os respondere. Quiero de todas formas comentaros mi situaciona actual.

Tengo «muchisimas» cosas que compartir con vosotros de Java, mis trucos, mis años de experiencia, mi codigo, espero poco a poco poder ir actualizandolo, pero esta web va a estar un poco en el «olvido» hasta que termine otras cosas.

1) He terminado un proyecto que voy a compartir con vosotros. Estoy subiendolo a «sourceforge», es un generador de codigo, cuando lo tenga terminado os comentare mejor. Es solo el inicio para otro proyecto mayor que se llama «Alejandria» pero del que no os comentare nada hasta que este mas avanzado.

2) Me he apuntado al curso de servicios web de Java Passion. Empieza en Agosto, eso me quitara algo de tiempo. Ya hice el curso de «Ajax», tenia muchos conocimientos pero me apunte y me gusto. Consigues mucha documentacion.

3) Soy el unico blogger de ubuntulife. Cada dia intento publicar algo. Pero es «mucho» trabajo, no os lo podeis ni imaginar. Se lleva la mayor parte de mi tiempo. Esa web ha crecido mucho y me gusta, por eso…

4) Quiero migrar «javalangnullpointer» a mi propio servidor. Darle el aspecto de «ubuntulife» y que sea tanto o mas visitada. En eso trabajare las proximas semanas. en Migrar este blog a mi propio dominio y actualizarlo a diario tanto como a ubuntulife. Mis grandes pasiones son java y linux. Y tengo muchos conocimientos que compartir con vosotros.

5) Aparte de Alejandria he empezado otro Proyecto que me «robara» de 6 a 7 horas diarias de mi existencia. Pero es algo que creo gustara mucho, tampoco comentare nada hasta que este mas avanzado.

6) Un amigo mio (mi socio) ha creado 2 proyectos personales «que son cojonudos» y tambien quisiera formar parte de ellos, y ayudarle si el me lo pide. Asi que eso tambien me robara mucho tiempo. Esos «proyectos» estan casi terminados pero aun no son visibles, pero os daran muchas sorpresas…

7) Tengo tambien pensado empezar un 3 proyecto. Pero este creo que ya existe. La idea es asociar un fichero a otro fichero. crear una especie de metadata. Por ejemplo a un documento PDF escribir un enlace y que ese enlace no sea una referencia a otra web sino el documento en si. No te fastidia por ejemplo un tutorial en PDF donde un enlace te dice que descargues un fichero de tal web y cuando vas a esa web, ya no existe. Pues la idea seria que cuando haces click en el PDF no te redireccione a otra web, sino que ya te aparezca ese fichero. Similar a los atachados en los correos. Ya se que los documentos crecerian mucho, pero hoy en dia el espacio de almacenamiento es mayor y el ancho de banda tambien. Y en el PDF tendrias toda la informacion, ese enlace seria realmente otro archivo. Otra opcion de uso podria ser en un MP3. ese metadata seria un GIF animado con secuencias del concierto. Habria que modificar los players para que interpretaran ese fichero meta y te lo mostraran en el reproductor. EL mp3 crece en tamaño pero ya no te hartarias de ver esos efectos de visualizacion, podrias ver un pequeño mini-concierto cuando reproduces el Mp3. no se si me he explicado bien, La idea es asociar como campos de un fichero otros ficheros. y todo va guardado junto en un unico fichero, en el caso del PDF los enlaces son otros PDFs que se abren, en el caso del MP3 el fichero asociado es una minipelicula del concierto.

Realmente lo pienso mas para todas esas revistas en formato PDF tipo cursos y tutoriales que te dicen «descarga» este archivo de «tal» sitio, no seria genial que ese archivo estuviera incluido en la propia revista, en el contexto del tutorial.

Y para aun rizar el rizo, estoy escribiendo (intentando) escribir un cliente de descarga de ficheros de 2 famosos sitios de descarga de ficheros de manera directa. La idea es usar un sniffer para saber que parametros esperan y luego en la peticion de fichero cambiar la IP dinamicamente. Es que estos sistemas te detectan la IP y cuando descargas te obligan a esperar un tiempo muy largo entre descarga y descarga, asi que mi idea es «inyectar» en cada peticion un valor de IP diferente para que piensen que eres un cliente diferente y te permitan la descarga directa. Pero esto ultimo, son solo «experimentos» que estoy haciendo, aun no se si me dara resultado…

A todo esto sumo el trabajo, una carga excesiva. hay gente que se ha ido de vacaciones y yo estoy haciendo «jornada intensiva» pero «INTENSIVA» de verdad, saliendo tarde, la piscina es para otros que son amantes, ya veis que no para mi, que pena!!!

Y mi proyecto mas importante, «vengarme» de aquellos que me engañaron. Pero para ese puedo esperar años. Soy como el conde de montecristo…

En fin, veis que estoy algo liado. Pero poco a poco intentare ir sacando las cosas. Saludos.

Eclipse Europa junio 25, 2007

Posted by superpiwi in Eclipse, Java, Programacion.
add a comment

eclipse-europa.jpg

Quedan solo 5 dias.

Eclipse Europa es la liberacion anual de los proyectos de Eclipse. Como los ultimos años con la release de Callisto, la release de Europa es una liberacion coordinada de diferentes proyectos. Este año, esta release incluye 21 projects.

La liberacion conjunta de todos estos proyectos permite evitar incompatibilidades entre ellos.

Zoho Creator – Crea tus aplicaciones de bases de datos de manera online junio 21, 2007

Posted by superpiwi in Java, Programacion.
add a comment

zohocreator_logo.gif

Zoho creator nos permite crear de manera visual nuestras aplicaciones web de bases de datos y embeber los resultados en nuestra propia web.

Aqui tienes un video demostrativo.

Hasta el nabo de programar junio 18, 2007

Posted by superpiwi in Uncategorized.
3 comments

Yo creo que a todos nos pasa lo mismo. Cuando llevamos unos cuantos años haciendo lo mismo estamos hasta los cojo… 

No entiendo muy bien el porqué de la p**a desidia que vengo experimentando los últimos meses, pero comienza a ser preocupante de cojones. No entiendo esta sensación de desinterés total hacia algo que, un tiempo atrás, prácticamente constituía mi única fuente de placer y disfrute personal.

Hará unos 6 o 7 años que estoy metido en esta mierda y, muy a mi pesar, creo que estoy llegando al final de un ciclo… supongo que tantos esfuerzos y horas invertidas para recoger 0 frutos y 0 ahorros, a la larga acaban desilusionando hasta al más forofo. Lo triste del asunto es que este declive llega en un momento no demasiado bueno, puesto que tengo varios proyectos abiertos que pensaba terminar en un plazo relativamente corto, y lo que es peor, algunos de estos proyectos los he desarrollado en horario laboral, con lo cual no puedo permitirme el lujo de aparcarlos y olvidarlos, tan sólo puedo mirar hacia adelante y terminarlos como buenamente pueda… es realmente desolador.

Visto en | Uno de payeslandia