Intentare mostrarles todas las cosas que me pasan día a día en mis pruebas, en mi trabajo, etc.
lunes, 16 de septiembre de 2013
Aplicación que lea epub
sábado, 14 de septiembre de 2013
Kingsofft el office para los smart devices
Con las nuevas tecnologías se nos presentan retos para pode migrar a ellas que a veces te sorprenden, que quiero decir, bueno, hace poco incursione en el mundo de los tablet, sin estar tan seguro que realmente lo necesitan. Lo primero que hice, creo que, como todo el mundo es llenarlo de juegos, pero mi segunda fase es ver cuanto puedo desprenderme del notebook o pc.
Lo primero que tengo claro es que hoy por hoy se que no me voy a olvidar del pc 100%, pero esperemos que sea un numer alto.
Lo segundo es contar con un lugar en la nube para tener todos mis documentos, esto esta mas que salvado, con dropbox que utilizó yo, pero existen muchas otras opciones. Luego preciso uno o mas programas para poder editar, crear, modificar los mismos, como por mucho que nos pese dependemos del mundo microsofft, debemos encontrar algún programa que pueda manejas archivos word, excel y hasta powerpoint.
Para esto tenemos kingsofft, es una aplicación que con su versión gratis te da para hacer muchísimo. Yo lo uso principalmente con archivos word, y lo básico esta mas que cubierto, y además tiene miles de funcionalidades mas que todavía no las he usado. Enumerar todo lo que se puede hacer es imposible, así que les aconsejo que lo instalen y prueben.
Algunas pocas funcionalidades son el manejo de la letra, es decir negrita, subrayado, tamaño, color, etc., los estilos, se puede interactuar con dropbos y los otro conocidos. La interfaz para mi tablet de 10 es muy limpia e intuitiva, en resumes es de lo gratis lo mejorsito.
Pruebenlo y me dejan sus comentarios.
viernes, 13 de septiembre de 2013
Ejecutar sql en mysql directo desde consola
El comando a ejecutar desde el prompt es el siguiente:
myql -u [usuario] -p[password] -D [DB] -h [host] -e ‘select * from ....;’ > resultado.txt
en esta consulta lo que debemos de cambiar son el usuario, el password, la base de datos, si el host no es local, luego la consulta que necesito, y por ultimo redirigimos el resultado a el txt
viernes, 9 de agosto de 2013
Consumir servicio Rest hecho en Gx Evo2 desde Android.
Lo primero que precisamos es un servicio hecho en Genexus Evolution 2, esto es muy fácil ya que basta con cualquier procedimiento (por ejemplo) marcar que va a ser un servicio y va a ser Rest, no el clásico SOAP que ya hace mucho trabajamos.
La forma de definir un servicio Rest es un poco distinto a los SOAP, pero es bastante fácil igual lo único que hay que hacer es marcar la propiedad del procedimiento como se muestra en la imagen.
Bueno ya tenemos el servicio, esto en mi caso lo genere en Java y va a correr en un tomcat, especifico esto porque no sé si en algún otro lenguaje o motor de servlet (probarlo y comentar).
Ahora vamos a ver si este servicio funciona, para esto voy a usar una aplicación para Firefox, para poder consumir este servicio, la aplicación se llama RestClient, la agregan en las extensión de FF, luego de reiniciar en las Herramientas queda un punto para llamar al programa, lo ejecutamos y tenemos varias cosas para tener en cuenta que cambian un poco de lo que ya deberíamos de manejar.
Primero al ser un procedimiento genexus, el método es POST. Además la url cambia la parte de servlet por rest. También en la url, el nombre debe de ser idéntico, es decir con mayúsculas y minúsculas como se llama el programa. En el Body agregamos los parámetros que recibe el procedimiento, los de in, no los de out, de la siguiente forma:
{ "usuario": "pepe" }
Podemos agregar varios parámetros separado por coma. En el Header, agregamos en "Content-Type" como "application/json".
En resumen debe de quedar como la imagen.
Para probar que nuestro servicio funcione, solo con ejecutarlo con SEND, no se devuelve abajo lo que el servicio retorna.
Ahora vamos a ver el código que tenemos que utilizar en Java/Android para consumir este servicio.
try
{
HttpClient httpClient = new DefaultHttpClient();
JSONObject dato = new JSONObject();
dato.put("usuario", "miusuario");
HttpPost post = new HttpPost(URL+"wsRestMiWS");
post.setHeader("content-type", "application/json");
post.setEntity(new StringEntity(dato.toString()));
HttpResponse resp = httpClient.execute(post);
String respStr = EntityUtils.toString(resp.getEntity());
Log.i("DEBUGGER", respStr);
JSONObject respJSON = new JSONObject(respStr);
String Resultado1= respJSON.getString("ResultadoDevuelto1");
Log.i("DEBUGGER", "Resultado1:"+Resultado1);
JSONArray Resultado2= respJSON.getJSONArray("ResultadoDevuelto2");
for(int i=0; i
Log.i("DEBUGGER", "Atributo1:"+unRes .getString("Atr1"));
Log.i("DEBUGGER", "Atributo2:"+unRes .getString("Atr2"));
}
}
catch(Exception ex)
{
Log.e("DEBUGGER", "Error!", ex);
}
Vamos a explicar las lineas que tenemos que cambiar para que esto funcione.
dato.put("usuario", "miusuario");
aca agregamos todos los parámetros que recibe nuestro procedimiento genexus, en mi caso solo recibe el parámetro "usuario" y el valor que le paso es "miusuario", un punto a tener en cuenta y muy importante es que la variable que se definió en genexus debe de ser identica en cuanto a las mayúsculas y minúsculas, sino el servicio no responde correctamente.
HttpPost post = new HttpPost(URL+"wsRestMiWS");
URL es la ruta del server hasta la parte del "rest/" y wsRestMiWS es el nombre de mi procedimiento genexus (es decir el servicio Rest) y también debe de respetarse las mayúsculas y minúsculas.
Log.i("DEBUGGER", respStr);
Este Log, y como todos los otros, son solo para debugger, este nos va a tirar todo lo que devolvió el servicio.
String Resultado1= respJSON.getString("ResultadoDevuelto1");
Nuestro primero parámetro de out en el servicio genexus, se es una variable que se debe de llamar ResultadoDevuelto1, respetando mayúsculas y minúsculas, y es una variable simple que nos devuelve un solo valor.
JSONArray Resultado2= respJSON.getJSONArray("ResultadoDevuelto2");
Log.i("DEBUGGER", "Atributo1:"+unRes .getString("Atr1"));
Log.i("DEBUGGER", "Atributo2:"+unRes .getString("Atr2"));
Nuestro segundo parámetro de out, es ResultadoDevuelto2, y es una colección de datos, con Atr1 y Atr2 en cada uno de sus campos
Estas pocas lineas de código nos van a tirara en el log los valores que nuestro servicio nos devolvió, luego debemos de acomodarlas en donde nos quede mejor.
viernes, 2 de agosto de 2013
Update en mysql con subconsulta
update tabla1 set atributo1 = (select valor1 from tblvalores where valor2 = 'XXXXX') where ..........;
La subconsulta devuelve un solo registro para valor1, pero lo que hace es al recorrer toda la tabla1 para cada uno de los registros a actualizar se va a realizar la consulta anterior, haciendo que esto sea menos performante que un update sin la subconsulta, sino que con el valor1 directamente.
Entonces buscando soluciones encontramos que en un script podemos con @id podemos registrar el valor de la subconsulta y luego hacer el update utilizando este valor.
Ejemplo de como quedaría la consulta de arriba.
select @id:= valor1 from tblvalores where valor2 = 'XXXXX';
update tabla1 set atributo1 = @id where .......;
Esto es mas performante, ya que en la primer consulta realizamos 2n consultas, mientras que en la segunda n+1.
miércoles, 31 de julio de 2013
HTTPClient.HTTPConnection.setTcpNoDelay(Z)V) error con Gx Evo1 o Evo2
Esto pasa tanto con Gx Evolution1 o Evolution2, y se resuelve tan facil como eliminar del lib del tomcat los jar GXWS*.jar.
viernes, 26 de julio de 2013
Delete de registro de tabla de subconsulta que incluye la tabla
Lo primero que probe es:
Delete from tabla1 where dato1 in (select dato1 from tabla1 t1, tabla2 t2 where t1.id =t2.id and ......);
esto no funciona ya que en la subconulta se utiliza la tabla que se va a eliminar, entonces busque una solucion por consulta sql, ya que por store procedure se puede hacer (o por algun programa en cualquier lenguaje).
Por consulta sql se puede hacer, esto lo probe en MySql pero asumo que en algun otro motor debe de funcionar.
DELETE FROM tabla1 WHERE dato1 IN (
SELECT * FROM (
select t1.dato1
from tabla1 t1, tabla2 t2
where t1.id .....
) as tab_aux
);