jueves, 7 de noviembre de 2013

OLE Error: SC:499 - FAC 4 - SEV 1

Este error se da cuando genexus no se instala bien, esto sucede muy a menudo cuando se instalan versiones viejas de gx (en mi caso Gx 8.0)  en Windows 7.
Salta el error cuando se intenta compilar un objeto, cuando se intenta importar un objeto de otro modelo o de diseño, o hacer un copy model.

Solución:
            1 – ejecutar el bat GXRegNT.bat que está en la carpeta de instalación de gx (normalmente C:\Program Files (x86)\ARTech\GeneXus\gxw80)
            2 – revisar que el generador que se este intentando generar este instalado
            3 – registrar en .net los tres exe de genexus que se indican arriba.
-          C:\Windows\Microsoft.NET\Framework\v2.0.50727>RegAsm.exe "C:\Program Files (x86)
\ARTech\GeneXus\gxw80\GXWSDLInspector.exe"
-          C:\Windows\Microsoft.NET\Framework\v2.0.50727>RegAsm.exe "C:\Program Files (x86)
\ARTech\GeneXus\gxw80\WizardNewModel.exe"
-          C:\Windows\Microsoft.NET\Framework\v2.0.50727>RegAsm.exe "C:\Program Files (x86)

\ARTech\GeneXus\gxw80\GXThemeEditor.exe"

martes, 5 de noviembre de 2013

Error 0x80070005 Acceso Denegado

Este error se da cuando tenemos un servidor de licencias genexus e intentamos acceder desde otro equipo, normalmente pasa con sistema operativo Windows 7.

Pasos a seguir para licenciar genexus con servidor de licencias en distinto pc
Para utilizar las licencias en otro pc, se debe de indicar la ip o el nombre del  pc en el license manager de genexus como se muestra en la imagen



Se debe de seleccionar Remote License e indicar la ip del equipo que oficia de servidor de licencia.
Si ocurre el error que se muestra en la imagen, ya sea en el license manager como al abrir genexus se debe de seguir los pasos que indico abajo para poder evitar este error.



Voy a explicar suponiendo que las maquinas no están en un dominio, para esto hay ayuda en el wiki de genexus, también voy a suponer que el servidor de licencias funciona, y los clientes están en Windows 7, ya que con Windows XP es más sencillo (igual aplica y se puede tomar como referencia) (http://www2.gxtechnical.com/portal/hgxpp001.aspx?15,4,61,O,S,0,,22835), igual si ven los pasos son casi todos iguales, solo hay algunos distintos.
-          Primero en el servidor de licencias debemos de crear el usuario con el que se conecta el o los pc clientes, debe de indicarse siempre el usuario y la contraseña idénticos.
-          Ambos equipos, servidor y cliente deben de estar en el mismo grupo de trabajo.
-          En el servidor debe de existir un grupo llamado ARTech Remote Protection User, y los usuarios que creamos antes todos deben de pertenecer a este grupo. Ademas algo que no se necesita pero podemos utilizarlo en el futuro es el grupo GXprotAdmin, se usa más que nada para loguear los errores del license manager, a este grupo también agregar los usuarios de los clientes (los que creamos en el primer punto). Si alguno de estos grupos no existen se deben de crear.



-          En el cliente crear si no existe los 2 grupos que se indicaron arriba y agregar el usuario del equipo a estos grupos
-          Ahora se debe de dar permiso de acceso remoto al usuario anónimo, esto se hace de la siguiente forma:
1 Inicio > Ejecutar > dcomcnfg, luego en mi pc le damos botón derecho y propiedades, luego en Anonymous Logon en Editar Limites le damos acceso remoto, como se muestra en las siguientes imágenes.






lunes, 16 de septiembre de 2013

Aplicación que lea epub


Lo que quiero decir es, que el programa lea los epub en voz alta para que yo los escuche sin necesidad de mirar la pantalla, se que hay muchos audiolibro pero no es lo que busco ahora.

Primero lo que es equipo debe de tener es un tts en el idioma que desees para que el SO sepa pasar de un texto a voz. Esto no vamos a hablar en este momento pero para español el que utilizo yo es IVONA tts.
Ahora lo que necesitamos es un lector de epub, que tenga la funcionalidad de utilizar el tts, yo el que utilizo es FBReader, no es el mas vistoso de los lectores epub, no es el mas practico, pero para lo que yo quiero me funciona muy bien.
Para poder escuchar el libro lo único que hay que hacer es abrir el epub, luego presionamos el menú, y en el menú desplegable, la ultima opción es Speak, pero primero debemos de instalar 2 cosas, una es el propio FBReader, y ademas agregarle el FBReadear TTS Plugin, este ultimo es el encargado de leer el texto basandose en el tts que tengas instalado.

Todos estos programas que indique arriba se pueden descargar gratis del Market.

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

Lo que quiero hacer es directo desde la consola de linux, correr una consulta sql y el resultado obtenerlo en un archivo, esto lo puedo hacer por ejemplo para programar una consulta sql que es muy pesada para que se corra en la noche.

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.

El objetivo de este post es mostrar todo el ciclo para poder utilizar desde una aplicación Java para Android, un servicio Rest hecho en Genexus Evolution 2.

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                JSONObject unRes = Resultado2.getJSONObject(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

El problema al que me enfrento es a tener que actualizar un registro en una tabla muy grande, que debe de ser igual que el valor que me devuelve una subconsulta, abajo pongo un ejemplo


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.