Mostrando entradas con la etiqueta Genexus X. Mostrar todas las entradas
Mostrando entradas con la etiqueta Genexus X. Mostrar todas las entradas

viernes, 20 de noviembre de 2015

Permisos en postgres para correr aplicaciones Genexus

Una aplicación genexus Evo3 que en desarrollo accedía a la base con el superusuario de postgres, al tener que pasarla a producción tuve que restringir algunos permisos sobre la base de datos por temas de seguridad, acá le copio los pasos que tuve que realizar




Crear rol aplicación: grants_app_miapp
Crear usuario aplicación: app_miapp
Otorgar privilegios de: select, update, insert y delete, sobre todas las tablas de la base miapp
Otorgar privilegios de: select y usage, sobre todas las secuencias de la base miapp

Comandos ejecutados:

-- Executing query:
CREATE ROLE grants_app_miapp
  SUPERUSER INHERIT CREATEDB CREATEROLE REPLICATION;

-- Executing query:
ALTER ROLE grants_app_miapp IN DATABASE miapp
  SET search_path = "public";

-- Executing query:
COMMENT ON ROLE grants_app_miapp  IS 'Rol de aplicación de la base de datos miapp.';

-- Executing query:
CREATE ROLE app_miapp LOGIN
  PASSWORD ''
  NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;

-- Executing query:
COMMENT ON ROLE app_miapp IS 'Usuario de aplicación de la base de datos miapp. Obtiene los privilegios a través del rol grants_app_miapp';

-- Executing query:
GRANT grants_app_miapp TO app_miapp;
Query returned successfully with no result in 42 ms.

-- Executing query:
grant select,update,insert,delete on all tables in schema public to grants_app_miapp;

-- Executing query:
grant select on all SEQUENCEs in schema public to grants_app_miapp;

-- Executing query:
grant usage on all SEQUENCEs in schema public to grants_app_miapp;

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.




             

miércoles, 31 de julio de 2013

HTTPClient.HTTPConnection.setTcpNoDelay(Z)V) error con Gx Evo1 o Evo2

Como este error me ha pasado 2 o 3 veces y cada vez que me pasa tengo que buscar cual es la causa, lo trascribo asi ya se donde buscar.

Esto pasa tanto con Gx Evolution1 o Evolution2, y se resuelve tan facil como eliminar del lib del tomcat los jar GXWS*.jar.


sábado, 14 de mayo de 2011

Conversor de colores

El titulo no dice mucho, pero la idea sería que tengo los colores en RGB y los necesito en hexadecimal, entonces buscando en san-google, encontré una página que además de darme esta conversión, me da otras (por ejemplo CMYK), y tienen varias cosas más que no he investigado, pero eso se los dejo a ustedes.

La página que les comentaba es la siguiente:


domingo, 3 de abril de 2011

Instalar y configurar ambiente Linux con Ruby para aplicacion Genexus Ev2 para Android

Luego de hacer mil pruebas voy a comentar cómo hacer para tener un ambiente Linux, en mi caso la distro que utilice fue Ubuntu, con Ruby, en mi caso la versión 1.9.1 que es la que funcionaba con Genexus Evolution 2 (beta 2 y algún nigth buils mas, pero creo que no me equivoco si digo que desde evolution 1 en delante, hasta hoy funciona), y una aplicación en mi caso particular para Android.

Perimo contarle que hice muchas pruebas, en las que utilizando Ubuntu Desktop 10.10 (supongo que server 10.10 es lo mismo), no pude llegar a que funcionara, el problema es que instales lo que instales, de ultima queda instalado Ruby 1.9.2, y esto no le gusta a las aplicaciones Genexus.

Las otras pruebas las realice (y en esta si me quedo andando) con Ubuntu Server 10.4.

También les cuento que probé varias formas de instalar, tanto ruby como las otras cosas que necesito, por ejemplo passenger, y la única que me función es la que voy a describir abajo, probar instalando por rvm (que es un manejador / instalador de ruby, dicho muy brutamente), con el código fuente, a la vieja usanza del famoso make, make install, con apt-get, pero repito la única forma que me anduvo fue como describo (para obtener este manual estuve trabajando más de 1 semana entera, y muchas horas en cada dia)

Bueno me base en un manual que la gente de artech tienen desde hace tiempo y mucha ayuda de alguien de Artech (su nombre es Daniel Mendez, y es un conocido de los eventos gx, por más que nunca hable con el), para el que quiera mirarlo les deja el link http://wiki.gxtechnical.com/commwiki/servlet/hwiki?Linux+setup+for+running+Ruby+applications+using+mod-rack

Pero con este manual no basta (por lo menos a mi no me basto ni por casualidad).

Empecemos:

Paso 1: Instalar Ruby:

Para esto ejecutamos lo siguiente (recordar que esto es para Ubuntu Server 10.4 en la versión más nueva no funciona porque termina instalando la versión 1.9.2)

$ sudo apt-get install ruby1.9.1-dev ruby1.9.1 ri1.9.1 rdoc1.9.1 irb1.9.1 libreadline-ruby1.9.1 libruby1.9.1

Paso 2: Crear los links a lo instalado:

$ sudo ln -s /usr/bin/ruby1.9.1 /usr/local/bin/ruby

$ sudo ln -s /usr/bin/ri1.9.1 /usr/local/bin/ri

$ sudo ln -s /usr/bin/rdoc1.9.1 /usr/local/bin/rdoc

$ sudo ln -s /usr/bin/irb1.9.1 /usr/local/bin/irb

$ sudo ln -s /usr/bin/gem /usr/local/bin/gem

Esto se puede hacer acá o más adelante, pero como lo necesito lo hago acá, si nos fijamos en la carpeta /usr/local/bin, vamos a ver que el link a gem no está bien (debe de aparecer en rojo), pero por ahora la dejamos así.

Paso 3: Instalar algunas gemas que precisamos.

$ sudo apt-get install libmysql-ruby1.9.1

$ sudo apt-get install rubygems1.9.1

$ sudo apt-get install libmysqlclient15-dev

Para este paso y para todos los que vienen cada cosa que instala debemos de ver que no quiera instalar algo distinto a la versión 1.9.1, si por alguna cosa dice que quiere instalar alguna otra versión, tenemos que buscar la vuelta para no hacerlo.

Paso 4: Instalar gema passenger

$ sudo gem install passenger

A esta altura si nos fijamos el link de gem que hicimos en el punto 2 ya debe de estar verde.

Para cerciorarnos que todo sigue bien desde la consola debemos de ver la versión de ruby

$ ruby -v

Si esto nos dice 1.9.1 esta todo bien, si dice otra cosa algo hicimos mal y no creo que funcione la aplicación genexus.

Paso 4: Instalar passenger.

Primero tenemos que descargarnos passenger, yo la versión que instale fue la 3.0.5. Luego que lo tengamos lo copiamos a alguna ruta, en mi caso /home/teto/passenger, luego entramos a la carpeta bien (la van a ver dentro de lo que descomprimimos), y le daremos permiso de ejecución y ejecutamos lo siguiente:

$ cd ./passenger-X.X.X/bin/
$ chmod 777 passenger-install-apache2-module
$ ./ passenger-install-apache2-module

Esto es interactivo, es decir que nos va tirando por consola varios mensajes, el primero es que va a empezar a trabajar, luego hace un chequeo, y acá es donde empieza a complicarse un poco la instalación, ya que casi seguramente no pase todos los chequeos, pero al final el instalador nos va diciendo que nos está faltando y cómo podemos hacer para instalarlo, todo es con apt-get, pero aca hay que tener mucho, mucho, cuidado, ya que si empezamos a ejecutar lo que nos dice, sin mirar lo que va a instalar (sobre todos las dependencias que necesitan los paquetes que instalamos), que en ningún momento nos diga que va a instalar algo distinto a ruby 1.9.1. Mi consejo es que vayan instalando de a una y que vayan mirando las dependencias, y si algo les da una dependencia de con un ruby 1.8 (este fue mi caso), que lo dejen de lado y vayan instalando lo otro, que nos dijo, o buscando la versión 1.9.1 del paquete. Sé que no es muy específico lo que digo pero solo en un par de paquetes nos da problemas, la gran mayoría se pueden instalar directamente.

Cuando se termina de instalar passenger, nos da 3 renglones que tenemos que guardarlos para poner en el archivo de configuración de apache.

Si llegamos a este paso ya tendríamos casi todo pronto, lo que nos falta ahora es tener apache instalado, y configurado.

Paso 4: instalación y configuración de apache2.

$ sudo apt-get install apache2


En el archivo /etc/apache2/apache2.conf al final agregamos las 3 líneas que nos dio el instalador
de passenger en mi caso es algo así



LoadModule passenger_module
/home/teto/ruby/passenger-3.0.5/ext/apache2/mod_passenger.so
PassengerRoot /home/teto/ruby/passenger-3.0.5
PassengerRuby /usr/bin/ruby1.9.1


Ademas tenemos que modificar el httpd.conf para indicar el directorio virtual del apache,
en mi caso es algo asi (esto también lo indica el instalador de passenger pero lo que nos
pone no está del todo bien)


VirtualHost // esto va entre simbolos de mayor menos
ServerName localhost
DocumentRoot /home/teto/ruby/aplicacion/public
Directory /home/teto/ruby/ aplicacion /public
// esto va entre simbolos
// de mayor menos
AllowOverride all
Options -MultiViews
/Directory
// esto va entre simbolos de mayor menos
/VirtualHost // esto va entre simbolos de mayor menos

Si se fijan, mi aplicación , se llama aplicación, pero tenemos que indicar hasta public.

Paso 5: copiar la aplicación.

Bueno esto es la parte fácil (creo), teniendo ya compilada y bien configurada la aplicación en genexus, recordar poner bien la base de datos, el webroot que tienen que tener algo asi: http://ipdelservidor/aplicacion, luego generamos y compilamos, para que nos cree todos los objetos que necesitamos.

Luego detecatamos donde nos crea los objetos (si lo dejaron por defecto estaría en RubyModel), y copiamos todo, a la carpeta del servidor /home/teto/ruby/aplicacion.

Luego creamos dentro del servidor una carpeta tmp y una public (/home/teto/ruby/aplicación/tmp y /home/teto/ruby/aplicación/public)

Luego (y esto no se si es necesario y me parece que no pero yo lo hago por las dudas) encontramos la carpeta gxruby de donde instalamos genexus y la copiamos también a la carpeta /home/teto/ruby/aplicación.

Paso 6: probar que funcione.

Lo podemos probar desde el emulador o desde algún celular que tenga android, si es desde el emulador solo tenemos que darle play a genexus (si tenemos todo bien configurado, la base creada etc., la aplicación se muestra en el emulador) o ejecutar nuestra aplicación en el cel.

Bueno con esto a mí me funciono, por favor si hay algún error o si alguien tienen una forma más fácil, me lo comenta para investigarlo.

viernes, 23 de abril de 2010

Tranferir licencias GX

Tengo un equipo el cual voy a formatear, y necesito respaldar mis licencias Genexus.

Para esto vamos a utilizar el equipo que yo tengo, otro equipo con Genexus la versión que esté utilizando que tenga los upgrade igual a mi equipo.

Entonces en el otro equipo tengo que ejecutar el LicenceManajer, esto está en el menú de inicio de programas en el menú de Genexus, y tiene un icono de una llave.

Entonces ejecutamos el LM, luego que aparece la ventana arriba a la derecha tenemos un botón Transfer, seleccionamos la licencia que guardaremos (debemos hacer un archivo y el proceso por cada una de las licencias a guardar) hacemos click en el botón, y nos lleva a la ventana que mas vamos a utilizar.

En esta ventana tenemos varias cosas para hacer, la idea es generar un archivo .trf, desde el equipo al que le voy a agregar las licencias, luego desde mi equipo exportar las licencias a ese archivo, y por ultimo levantar estas licencias en el otro equipo, y ahí la licencia queda segura en el otro pc, luego que instale mi equipo, se hace lo mismo pero tomando como base la licencia que tiene el otro equipo, es decir al revés que como lo hicimos primeramente.

Entonces con el LM en la pantalla que nombre arriba, vamos a generar un .trf, entonces tenemos que marcar abajo a la izquierda “Register Transfer”, marcar la ruta donde queremos guardar el archivo y presionamos OK. Esto genera un archivo .trf, que tenemos que pasarlo en este caso a mi equipo.

Estando en mi equipo ejecuto nuevamente el LM y me paro en la pantalla que nombre arriba, y en la ruta marcamos donde este el .trf que pasamos a mi equipo, luego seleccionamos “Tranfer Out”, y la cantidad de licencias que pasaremos, normalmente 1, pero pueden ser mas (de un solo generador por ejemplo 1 licencia de Java), y presionamos ok, y se sobrescribe el .trf.

Por ultimo tenemos que volver el .trf al otro equipo, podemos sobrescribir el que ya habíamos generado, y vamos a ver que el tamaño es mayor. Luego ejecutamos el LM, y debemos seleccionar la ruta del archivo (por defecto se guarda la ultima utilizada), y debemos seleccionar “Tranfer In”.

Si seguimos los pasos que puse acá, debería de aparecer la licencia en la pantalla principal del LM. Para que todo esto funcione los 2 equipos deben de tener genexus al mismo upgrade de developer y del generador que estemos traspasando.

domingo, 18 de abril de 2010

DataSelector en genexus 10

Muchas veces tenemos aplicaciones que repetimos una y otra vez las mismas consultas, un ejemplo de esto es el clásico usuarios habilitados, cuando el usuario se va a loguear al sistema al validarlo si el usuario esta activo, cuando vamos a hacer algo con los usuarios mostramos los que están activos. Entonces el código sería algo así:

For each

Where UsuarioEstado = “A”

……

Y esto se repite por todo el sistema, pero que pasa si ahora hacemos la aplicación que sea paga, entonces tenemos algo asi

For each

Where UsuarioEstado = “A”

Where UsuarioPago = “S”

…..

Y esto debemos de cambiarlo en todos lados.

Entonces Genexus 10 (X, evolutio1, etc., como quieran nombrarla) tiene un nuevo objeto que se llama DataSelector, y sirve para ayudarnos en estos casos. El data selector lo que hace es decir cuales son las condiciones que debe de cumplir una consulta, también puede recibir parámetros, decirle el orden, y por ultimo un defined by para recorrer la tabla correcta.

Lo que debemos hacer es primero definir el data selector, que seria asi

Parametros: no recibr

Condition: UsuarioEstado = “A”

Order: aca pude ser el nombre por ejemplo

Defined by: supongo que con los 2 campos recorre bien la tabla entonces no le indico nada

Al desarrollar la aplicación ponernos en todo los for each que tengan que ver con los usuarios activos

For each USING nombre del datastore

……

Entonces como dije si ahora tenemos que tener solo los usuarios actives y que pagaron, debemos de cambiar el DataStore agregándole una condition, y no tocar nada mas de la aplicación.

sábado, 12 de septiembre de 2009

Data Provider Genexus X

La idea de este post no es enseñar lo que es un Data Provider, que es uno de los tipos de objetos nuevos en Genexus, sino solamente dar un pequeño ejemplo de como utilizarlo para tener en nuestra aplicación un menú superior.


El menú superior va a ser el clásico Dolphin menu, que se puede agregar como un User Control, por lo que debe de ser el mas usado hasta el momento.

Para empezar hay que agregar el usar control en nos guste, casi con seguridad va a ser en una Máster Page, con solo agregar el control se genera el objeto DPDolphinMenuData que es el dataprovider que vamos a modificar.

Como vemos ya se crea con un ejemplo, pero es muy estático, si queremos algo mas dinámico y que se cargue de una tabla debemos de modificarlo un poco.

Entonces supongamos que tenemos una tabla menú, en la que tenemos un MenuCodigo, MenuNombre, MenuDescripcion, MenuEstado, y MenuPrograma, la frutilla en la torta seria tener un MenuSeguridad, pero eso lo dejo para que ustedes lo hagan.

El código que tendría nuestro D.P. seria el siguiente


MenuData

{

MenuDataItem

where MenuEstado = 'A' // Activo

{

MenuID = MenuCodigo

MenuTitle = MenuTitle

MenuDescription = MenuDescription

MenuURL = MenuURL

}

}

Con esto lo que hacemos es recorrer toda la taba Menú, y a los ítems que están activos los cargamos al dataprovider, y con esto ya podemos mostrar esto en nuestra web.