martes, 1 de diciembre de 2009

Iniciando con uso de esquemas, usuarios y permisos con Postgres.

Hola a todos, en estos últimos días hemos estado desarrollando con postgres y nos toco la creación de la base para el sistema, debido a la complejidad que representaba el uso de varias tablas y la administración de ellas decidimos organizarlas en esquemas, dividiendo a la base de manera lógica usando tablas en común que se encuentran en un esquema que es visible para todos aquí presentamos una pequeña introducción a los esquemas.


Para crear un esquema basta con usar el comando:

CREATE SCHEMA esquema1;

Los esquemas son usados en las bases de datos para separarlas de manera lógica dándonos la opción de tener en un momento determinado corriendo un sistema real y uno de prueba dentro de la misma base pero separados mediante esquemas, podemos también tener en dos esquemas distintos los mismos nombres de tablas sin que esto nos represente un error.


Si queremos crear una tabla en nuestro nuevo esquema haremos lo siguiente:

CREATE TABLE esquema1.tabla1(id_tabla1 integer,nombre text);

Ahora para la creación de usuarios con postgres usaremos lo siguiente:

CREATE USER daniel;

De esta forma ya contamos con un esquema y un usuario dentro de nuestra base de datos, con los cuales podemos practicar el uso de privilegios.
Se pueden asignar a los usuarios varios tipos de autorización para diferentes partes de la base de datos. Por ejemplo:


* La autorizacion de lectura.

* La autorizacion de insercion.

* La autorizacion de actualizacion.

* La autorizacion de borrado.

Cada uno de estos tipos de autorización se denomina privilegio. Se puede conceder a cada usuario todos estos tipos de privilegios, ninguno de ellos o una combinación de los mismos sobre partes concretas de la base de datos, como puede ser una tabla una relación una vista o bien un esquema. La norma SQL incluye los privilegios select, insert, update y delete.


El lenguaje de datos SQL incluye comandos para conceder y retirar privilegios. La instrucción grant se utiliza para conceder autorizaciones. La forma básica de esta instrucción es:


grant -lista de privilegios- on -nombre de relación o de vista- to -lista de usuarios o de roles-

la lista de privilegios permite la concesión de varios privilegios con un solo comando, la siguiente instrucción grant concede al usuario daniel la autorización select sobre la relación tabla1

grant select on esquema1.tabla1 to daniel

la autorización update puede concederse sobre todos los atributos de la relación o solo sobre algunos. Si se incluye la autorización update en una instrucción grant, la lista de atributos sobre los que se concede la autorización update puede aparece entre paréntesis justo después de la palabra clave update, si se omite la lista de atributos, el privilegio update se concede sobre todos los atributos de la relación.

La siguiente instrucción grant concede al usuario daniel la autorización update sobre el atributo importe de la relacion prestamo:

grant update(nombre) on esquema1.tabla1 to daniel

El privilegio insert también puede especificar una lista de atributos; cualquier inserción en la relación debe especificarse solo esos atributos y el sistema asigna el resto de los valores predeterminados ( si hay alguno para ellos ) o los define como nulos.

El nombre de usuario public hace referencia a todos los usuarios actuales y futuros del sistema. Por tanto, los privilegios concedidos a public se conceden de manera implícita a todos los usuarios actuales y futuros.
Ahora para retirar una autorización se emplea la instrucción revoke. es muy similar a grant su sintaxis es la siguiente:


revoke -lista de privilegios- on -nombre de la relación o nombre de la vista- from -lista de usuarios o de roles-

por lo tanto para retirar los privilegios anteriores se haría de la siguiente manera:


revoke select on esquema1.tabla1 to daniel



revoke update(nombre) on esquema1.tabla1 to daniel



Hasta aquí este articulo de introducción, hay mucho que tratar aun, espero seguir con estos artículos sobre los usuarios, esquemas y privilegios.

Saludos !


Fuentes:

Fundamentos de base de datos. quinta edicion Silberschatz , Korth , Sudarshan

Lista Oficial de postgres

http://www.postgresql.org/

miércoles, 7 de octubre de 2009

jCodeCollector

JCodeCollector es una aplicación multiplataforma escrita en Java, que nos ayuda a ir recopilando aquellos fragmentos de códigos (snippet) que pueden ser útil en otro momento.

Con JCodeCollector puedes almacenar tu código, agregarles etiquetas y comentarios. También se pueden añadir palabras para que sean resaltadas como parte de la sintaxis del lenguaje. Link



miércoles, 30 de septiembre de 2009

SCREENCAST .- Grabación digital de la salida por pantalla de la computadora

Hola a todos este es mi primer aporte, presentandoles una herramienta util, que podemos necesitar en cualquier momento. Yo en especial he tomado la decisión que todos mis aportes seran utilizando esta herramienta.

A quien no le ha pasado por grabarse cualquier cosa haciendo en pantalla, por ejemplo la parte mas dificil de un juego, logrando un record con el ordenador, o quizás tenga necesidades sencillas, como hacer tutoriales más prácticos que no incluyan una tonelada de texto largo y denso, pues ScreenToaster hace todo eso, pero muy simple y en línea.

Con ScreenToaster puedes crear screencasts desde la web de la aplicación, con una calidad de imagen muy impresionante y la posibilidad de agregar audio e incluso subtítulos a los vídeos. Y todo se limita al entorno de su sitio web, lo que lo hace muy accesible y fácil de usar.



Para hacerlo, debes registrarte en el sitio. Actualmente ScreenToaster se encuentra en Beta privada, por lo que deberás requerir de una clave de invitación para luego poder registrarte y comenzar a hacer screencasts. Por la gran demanda de accesos para probar la beta.

Una vez que te registres, podrás grabar tu película sólo pinchando el botón gigante de la página principal. Apenas tienes que instalar un applet para iniciar el grabador, y lo demás es historia. Utilizas unos comandos sencillos para grabar (Alt+S) y detener la grabación (de nuevo, Alt+S), y hasta puedes grabar nada más que una zona y no toda la pantalla (Alt+Shift+S). Cuando ya has terminado el vídeo, puedes agregar algunos subtítulos (que no son muy convencionales) y grabar tu voz sobre el vídeo o algún audio que prefieras. Luego puedes optar entre publicar el vídeo o mantenerlo privado. En cualquiera de los modos, tu vídeo siempre podrá ser visto desde una URL o insertándolo con el código html en otra web.

Pd. Pido disculpas, durante la grabacion del video se me paso decir que la herramienta estaba en español , disculpen no me di cuenta. Saludos.




miércoles, 23 de septiembre de 2009

Opengoo: Una alternativa mas a la ofimatica en linea

Hola, bueno como habrán notado mi compañero julio a estado publicando acerca de lo que es extjs, ayer leyendo algunas cosas en internet me tope con Opengoo, una solución mas a lo que se denomina ofimatica en linea, entre las cuales destacan googledocs,Zoho, ThinkFree entre algunos mas.

Lo que me llamo la atencion de Opengoo es que esta diseñado con extjs usa como motor de base de Datos MySQL, php y Apache, entre las cosillas que trae están: calendario, administración de tareas, procesador de texto, creador de hojas de presentación, debido a que se encuentra en fase beta no tiene implementado hojas de calculo, cabe destacar que el proyecto va mas alla a ofrecer tan solo ofimatica en linea sino que busca el poder administrar de forma adecuada documentos y fomentar la colaboracion a distancia.

el proyecto esta hospedado en sourceforge y esta en plena fase de desarrollo pero se puede bajar una version de prueba (que esta bastante decente).

Fuentes:

http://linux.softpedia.com/progDownload/OpenGoo-Download-40218.html
http://www.carlosleopoldo.com/post/opengoo/
http://es.wikipedia.org/wiki/Opengoo

sábado, 12 de septiembre de 2009

Sistemas de Inscripciones (I).

Seguimos avanzando y esta vez, me he propuesto desarrollar un pequeña aplicación que administre inscripciones, con el fin de afrontar casos reales y empezar a ver que partes pueden resultar difícil a la hora de iniciar con el estudio de este framework, nos tocará doble trabajo, ya que el lenguaje del lado del servidor será php, el cual conozco una mínima parte. Pero bueno , siempre hay que dar un primer paso para empezar a caminar. En esta primera parte mostrare solamente la interface del login (login.js) y posteriormente veremos su funcionalidad en php.


Login, esta basado en un FormPanel, el cual esta configurado por default con layout:'form', el cual renderisa correctamente las etiquetas y campos de texto.

En la linea 4 tenemos la instrucción Ext.QuickTips.init(), ésta habilita el uso de los tooltips, y con Ext.form.Field.prototype.msgTarget = 'side' (linea 6), hace que cuando exista un error de validación, se muestre un icono rojo en la parte lateral, en este caso, el campo de texto.


defaultType (linea 9), indica que los items (objetos hijos) posteriores serán de ese tipo (xtype), en este caso serán 'textfield', en link pueden ver todos los xtype disponibles.

En la linea 13 encontramos la sentencia monitorValid:true, esta propiedad activa o desactiva el monitoreo de los botones que han sido configurados (declarados) en el arreglo buttons, siempre y cuando estos a su vez estén configurados con la propiedad formBind:true. El monitoreo consiste en habilitar o deshabilitar los botones según el estado del form, en otras palabras, si el form es valido, se habilitan los botones, y si el form no lo es, se deshabilitan.

De la linea 14 a la 27, tenemos el arreglo de objetos items, en el cual se declaran dos componentes hijos del FormPanel del tipo 'textfield'. En la linea 19 y 23, se configura para que se validen a no dejar vacíos los campos (allowBlank:false), si esto pasara, el monitorValid lo detecta y mostrándose el icono rojo lateral con su tooltip de error correspondiente.

En las lineas 29 al 36, se declara el arreglo de botones, aquí solo hay uno, configurando:
  • el monitoreo de este botón (linea 31)
  • un icono (linea 33)
  • su etiqueta (linea 34)
De las lineas 39 a la 54 se hace la instancia de un objeto de tipo Ext.Window, la cual será la ventana que contendrá el FormPanel previamente creado, la configuración de sus propiedades están muy claras:
  • layout: usara el tipo 'fit'.
  • width: 317 pixeles de ancho.
  • height: 148 pixeles de alto.
  • title: titulo de la ventana.
  • closeAction:'hide', al cerrar la ventana solo se encenderá, de tal manera que puede ser invocada de nuevo sin instanciarse.
  • closable: dibuja el botón de la "x" para poder cerrar la ventana.
  • draggable: puesta a false para ser una ventana fija, no flotante.
  • border: false, no dibuja su borde.
  • defaults: Su comportamiento es parecido al defaultType, todo lo configurado en esta propiedad, será tomado por los componentes hijos declarandos en el arreglo items.
  • items: tiene como hijo, el componente llamado panel.
Finalmente en la linea 56 mostramos la ventana.

Probar el ejemplo.

miércoles, 2 de septiembre de 2009

POO en su estilo de prototipos para javascript

Muy estimados colegas, en estas pocas lineas haré mi contribución a nuestro blog. Disculpen las tardanzas y espero les sirva de algo.

Hace días experimentando un poco en un lenguaje basado en script (javascript), intente implementar el paradigma POO, siguiendo las reglas generales creando clases con sus respectivos propiedades y métodos.

class Persona{

//atributos

public Persona(){

}

//metodos

public metodo1(){

}

}


Sopresa javascript es un lenguaje Orientado a Objetos pero usa un estilo especial de dicho paradigma, y con esto me refiero a los prototipos, que en si refiere a las mismas ideas de la POO, como la reutilización de código, herencia, polimorfismo, encapsulamiento, ocultación entre otros.

Programación basada en prototipos es un estilo de programación orientada a objetos en el cual, las "clases" no están presentes, y la re-utilización de procesos (conocida como herencia en lenguajes basados en clases) se obtiene a través de la clonación de objetos ya existentes, que sirven de prototipos, extendiendo sus funcionalidades. Este modelo es conocido como orientado a prototipos, o programación basada en instancias.

http://en.wikipedia.org/wiki/Prototype-based_programming.


Siendo esto tema de interés tratare de explicar esto en codigo.

El siguiente caso quería obtener el número próximo anterior múltiplo de 6 de un numero X.

Creamos nuestro archivo donde radica el POO.

clases.js



archivo html


Un ejemplo sencillo y facil de realizar les dejo algunos link para por si quieren implementar algunas otras caracteristicas mas fuertes como la herencia y polimorfismo.

Un saludo a todos y cuidense.

El mas claro.

Ejemplos

uno mas

un PDF bueno


sábado, 29 de agosto de 2009

Editor para programar

Hola a todos !!!, bueno en esta ocasión les quiero hablar de jEdit un editor multiproposito desarrollado en java el cual es multiplataforma, entre las curiosidades que para mi gusto ayudan mucho a un programador es su soporte de plugins con el que cuenta ya que desde ahí se puede hacer extensible, además permite tener mas de un código en primer plano (como en el ejemplo),en las opciones de configuración le podemos ir picando y encontrar mas curiosidades como cambiar el lookandfeel etc; una de las cosas que le podemos reprochar es que al estar desarrollado en java depende de la maquina virtual ... pero bueno es una opcion mas.






y ustedes que otros editores conocen ?.

fuentes:

http://www.esdebian.org/wiki/jedit-instalacion-debian
http://www.vivaserver.com.ar/blog/2007/09/21/jedit-el-textmate-de-los-pobres

miércoles, 26 de agosto de 2009

Iniciando con php y algo de AJAX

Iniciando con php y Ajax, en este articulo vamos a ver el uso de php como lenguaje script en aplicaciones cliente-servidor usando Apache como servidor web algo de html y javascript, vamos a mantener todo de una forma simple llegando hasta AJAX

Introduccion

Bueno primero que nada vamos a ver que es php, al igual que las otras herramientas que usaremos,
apache, html,javascript AJAX, y el famosillo MySQL sin embargo todo esto toma sentido cuando estas tecnologías se unen:

De esta forma el servidor web (Apache) nos permite interactuar con el motor de base de datos (MySQL) mediante un lenguaje script (php) devolviendo segun las peticiones del cliente una informacion u otra formando de esta manera paginas dinamicas en base a las solicitudes del cliente y a las respuestas del servidor. El cliente que no es mas que nuestro navegador web (Firefox) que nos da soporte para HTML y javascript.

Instalación

En cuestión al instalador en lo que es windows recomiendo algo rápido y que nos evite meterle mucha mano a la configuracion un ejemplo es Appserv existe otro paquete que nos ofrecen en conjunto las citadas herramientas ya configuradas y listas para trabajar, ahora que si nos encontramos en Linux podemos descargarnos por aparte cada herramienta, basta con esta serie de comandos para la instalacion:

apt-get install apache2
apt-get install php5
apt-get install mysql-server-5.0
apt-get install php5-mysql
apt-get install libapache2-mod-php5

apt-get install phpmyadmin


En las primeras tres lineas estan las herramientas basicas para nuestro servidor web, las otras dos son las que nos enlazaran entre ellas y la ultima es un frontend de nuestro gestor de Base de datos (este tambien se encuentra en Appserv), si todo salio bien hasta este momento podemos teclear en nuestro navegador web lo siguiente:
localhost/phpmyadmin desde aqui podremos gestionar nuestro MySQL, crear usuarios, bases de datos, etc.

Interacción de las herramientas

Ahora vamos a iniciar con un pequeño ejemplo en php :





este pequeño ejemplo nos imprime 10 veces la palabra Sinergia, para detallar mas en la programación en php pueden ver esta liga.

Ahora veremos un ejemplo de coneccion a una Base de datos de MySQL, pero primero crearemos nuestra base:




y ahora el codigo para interactuar con ella:




Como vemos el procedimiento consiste en conectarnos mediante un origen (el host local en este caso), usuario (login1), y una contraseña (password1) si no hay éxito para la conección saldremos del script con un mensaje de error, en caso de que se logre la coneccion seleccionamos a que base nos conectamos (test), en seguida realizamos una consulta y mostramos cada campo en la pagina, para finalizar cerrando el flujo a la coneccion, para ahondar mas en las funciones php-mysql sirvase consultar la siguiente pagina.


Ahora veremos un ejemplo del uso de AJAX pero para no entrar frios en el tema diremos que AJAX es la unión de varias tecnologías que nos permiten realizar recargas dinámicas asíncronas de manera que no se refresque la pagina completa si no solo una parte de ella, un ejemplo es el correo electrónico GMail entre muchos mas.

El primer codigo presentado es el encargado de mostrar la pantalla inicial usando codigo HTML, Vemos que dentro del codigo php se encuentra codigo HTML desde aqui lo creamos para despues ser interpetado por el navegador ya que el codigo php nunca se vera sino unicamente el resultado de este, creamos un elemento llamado div que pasaremos por medio de javascript hacia el servior dentro de este div vemos que hay un textfield y fuera de el vemos un boton que se enlaza con una funcion javascript, notese que el codigo php puede mezclarse con el HTML siempre y cuando se haga la separacion correspondiente mediante el uso de tag .



El segundo codigo es el que nos crea la interfaz entre el cliente y el servidor, al inicio encontramos la funcion nuevoAjax que nos creara el elemento XMLHTTPrequest, la segunda funcion es la funcion Nombre en donde con ayuda del DOM hacemos uso de los elementos en HTML y obtenemos sus valores; El metodo open de nuestro objeto ajax nos da la pauta de como se enlazara de manera asincrona, a que archivo se dirijira y con que metodo de paso de parametros lo hara, en este caso POST, y le especificamos con el true que se trata de una llamada asincrona; tenemos tambien el escuchador de eventos onreadystatechange el cual se disparara en cuanto la llamada asincrona se haya realizado, de tal forma que "pegaremos" el HTML que nos mande nuestro server a nuestro div (notar que el div previamente se paso a la variable resul) y el numero 4 nos indica que la transferencia se ha terminado satisfactoriamente, con el metodo setRequestHeader enviamos el atributo Content-type indicando el contenido del archivo, por ultimo usamos el metodo send con el que enviamos como parametro el valor del textfield hacia el server, en caso de no mandar parametros pondremos null.



Ahora nos toca el ultimo archivo, es el que esta del lado del server este archivo es llamado por nuestro archivo .js mediante el metodo open se carga y con el metodo send se llama, este archivo contiene codigo HTML que es enviado a traves de php se crea una tabla y se van creando filas y columnas mediante dos for anidados dentro del segundo for usamos la variable predefinida $_POST["variable"] dicha variable nos servira para capturar la informacion enviada previamente desde nuestro codigo js y todo lo que nos arroje (con arrojar me refiero a todo lo que envie echo) este archivo se enviara al archivo js y se pegara al objeto div (recordar el manejador de eventos onreadystatechange).

y ahi lo tienen, nuestro primer ejemplo usando AJAX, espero que haya quedado al menos un poco claro.

Conclusion:

Como hemos visto el uso de los lenguajes script se van incrementando y la forma en que ellos van interactuando nos puede marear un poco al inicio y si ha esto le añadimos el manejo de la Base de Datos desde uno de ellos pues se vuelve un poco enredado, pero una vez entrando a esto, solo es cuestion de practicar.

Links:
http://www.tufuncion.com/tutorial_basico_ajax
http://www.cristalab.com/tutoriales/introduccion-a-ajax-con-php-y-formularios-c165l/
http://www.librosweb.es/ajax/capitulo7/interaccion_con_el_servidor.html
http://www.lugmen.org.ar/pipermail/lug-list/2005-May/035613.html
http://www.webestilo.com/php/php09b.phtml



lunes, 24 de agosto de 2009

Objeto Ext.Viewport.

Este objeto es un contenedor especial dentro del core de Ext Js (muy parecido a Ext.Panel), el cual representa el area visible de la aplicación.
Su jerarquia de clases es:


Decimos que es especial porque:
  • Automáticamente se renderiza en el cuerpo del documento html (document.body).
  • Se ajusta al tamaño de la ventana según esta sea redimensionada. (Probar cambiando el tamaño de la ventana en el demo).
  • Solo puede haber un objeto Ext.Viewport por página.
  • No soporta desplazamiento (scrolling), si se necesita, este debe ser implementado por los componentes hijos, como por ejemplo un Ext.Panel.
Bueno ya basta!, dame algo que ver, muéstrame algo de código...
Ejemplo:


Explicando un poco:

Ext.onReady( ); Esta función que se ejecuta cuando DOM esta listo y puede ser referenciado, es como el evento onLoad del body, pero la diferencia es que onReady no espera que carguen las imágenes, estilos, JavaScript y el DOM, por lo tanto esta listo antes que el evento onLoad. (Dar un vistazo al API de Ext JS.)

Todos los objetos tienen algo llamado "Opciones de Configuración", que vienen a ser las opciones iniciales de cada objeto, y aca items es precisamente una de las opciones de Ext.Viewport. Algunas otras opciones son:
  • anchor: Esta opción debe ser usada cuando el contenedor ha sido configurado con un administrador de contenidos AnchorLayout.
  • disabled: Habilita o deshabilita el componente, su valor por default es falso.
  • hidden: Esta propiedad configura al objeto para saber si debe ser mostrado o no.
  • hideBorders: Indica si debe o no debe ser pintados los borders, su valor por default falso
  • layout: Indica el tamaño y la posición que tomaran los objetos dentro del contenedor.
  • items: Puede ser un objeto o un arreglo de objetos. Esta es una de las vías por la cual podemos agregar componentes hijos dentro de otro objeto, en este caso el contenedor Ext.Viewport.
Ejemplo;
  • un solo objeto: items:{...}
  • varios objetos: items_[{...}, {...}]
Estos objetos (items) pueden ser cualquier objeto basado en la clase Ext.Component los cuales podemos encontrarlos expresados de dos formas:
  • Un instancia completa:


quedando: items:{nombre}
  • Un literal objeto (object literal, objeto dinámico) que contiene un conjunto de propiedades y valores, que:
1.- Tiene especificado el tipo de objeto mediante xtype, el cual debe ser alguno de las lista que se encuentra dentro de Ext.Component.
2.- Si no es especificado un xtype, el valor de defaultType del contenedor(Conteiner) será usado, siendo este 'panel'.
quedando:


El resultado es el siguiente:


Ver demo: Viewport
Se que parece una cosilla de nada, pero espero seguir avanzando, para ver ejemplos más útiles.

Conclusión:
Bueno pues como ya vimos crear un objeto Ext.Viewport, es algo muy sencillo ya que todos tenemos las bases sobre los conceptos de la programación orientada a objetos, y como bien dije al principio es muy parecida la programación en Java, (recuerdo cuando le cambie el color a mi primer panel.... ;-) ), además de que la forma en que se agregan los objetos es muy clara, gracias a JSON, que espero poder explicar un poco sobre esta notación.

Links:
API Ext JS
Material de apoyo.

sábado, 15 de agosto de 2009

ASIMO

El es Asimo es el robot mas avanzado que existe actualmente.
Ahora es la estrella principal de la empresa Honda (creadora del robot) y no es para menos.

martes, 11 de agosto de 2009

¿Doblas cucharas con la mente?

No sé por que pero de cierto modo me es familiar esta situación (click para ver en grande):

"Cualquier parecido con la realidad, es pura coincidencia"

domingo, 9 de agosto de 2009

Interfaces gráficas con PyQt

En esta entrada, realizaremos un ejemplo sencillo de PyQt, con el siguiente orden:
  1. Diseño de la interfaz gráfica con QtDesigner.
  2. Generación del código en Python con la herramienta pyuic4.
  3. Creación de una clase para contener el objeto con la ventana y manejar sus eventos, además del punto de entrada (main) para nuestro programa.
Pero, ¿qué es todo esto? Dejemos que la Wikipedia nos ilumine, pues todo está dicho y la vida es corta; ahora, a falta del artículo correspondiente, les puedo decir que QtDesigner es una aplicación para diseñar interfaces gráficas de Qt, almacenando la descripción y disposición de los componentes en un archivo XML, para su posterior uso desde múltiples lenguajes de programación.

Requerimientos.

El sistema usado en la elaboración y prueba de este ejemplo es Debian Sid, por lo que mencionaré el nombre de paquetes propios de la distribución. Sin embargo, las herramientas usadas son multiplataforma.
  • python (podemos usar de la versión 2.4 en adelante).
  • Las librerías de Qt4, que se obtendrán automáticamente por dependencias al instalar python-qt4.
  • python-qt4 (la interfaz entre las librerías Qt4, programadas en C++, y el lenguaje que estaremos usando).
  • qt4-designer.
  • pyqt4-dev-tools (este paquete nos proporciona el comando pyuic4).

Introducción a Python.

Python es un lenguaje muy fácil de aprender, por lo que aún si no lo hemos usado nunca, con un poco de lectura y práctica podremos comenzar con nuestros primeros programas, en un nivel básico, pero funcional.

Les recomiendo leer este tutorial para un rápido inicio. Para entender con facilidad el ejemplo de esta entrada, será necesario conocer la estructura de un programa en Python, los tipos de datos, funciones y en menor medida, herencia, módulos y paquetes.

Entrando en materia.

Nuestro ejemplo está basado de este material, siendo muy recomendable su lectura, y desde la diapositiva 41 se comienza a usar QtDesigner. Les debería quedar algo así:

Los botones que creamos para las cuatro operaciones, tienen los nombres: sum, res, mul y div, por otro lado, los campos de texto se llamarán num1, num2 y result, y por último, a la ventana le hemos llamado calc. Bien, guardaremos este formulario con el nombre calc.ui y ahora viene la magia: con el comando pyuic4 tomaremos ese archivo .ui y generaremos el código en Python. El comando es:
pyuic4 calc.ui -o calc_ui.py

El resultado lo vemos a continuación:

Archivo calc_ui.py

Noten que con QtDesigner hemos hecho todo el trabajo sucio; de haber modificado más propiedades o agregado más componentes, escribir, probar y mantener el código manualmente sería una actividad poco grata.

Aquí hay un punto importante a tratar, y es que cada vez que modifiquemos nuestra interfaz (.ui) tendremos que regenerar el código en Python, por lo que no es nada recomendable hacer cambios a este último, dado que serán sobreescritos sin piedad.

Para complementar el formulario con el código correspondiente a los eventos y algunas otras acciones en tiempo de ejecución, podemos escribir una nueva clase y ahí crear un objeto basado de la clase originada desde QtDesigner, o bien, que esta nueva clase herede de la primera. En esta ocasión haremos lo último.

Archivo calc.py

Una diferencia que vemos entre el código anterior y el mostrado en la diapositiva 57 de la presentación, es que en nuestra clase no hemos controlado el evento clicked() sobre el botón salir. En lugar de ello, hemos definido un manejador para este evento desde el mismo QtDesigner, redirigiéndolo al método close() del formulario. En la diapositiva 44 podemos ver dónde se ubica el editor de señales. Aquí les dejo una captura de esta herramienta:

Lo anterior lo pudimos hacer porque close() forma parte de la clase QWidget, y es lo que se llama un slot, que no es mas que un método diseñado para recibir señales (eventos) y con un comportamiento definido. No hay que olvidar que desde QtDesigner no podemos agregar código, así que nuestros métodos para responder a los clicks sobre los botones tendrán que ser implementados y "conectados" de manera externa.

Comentando algo más sobre el código, de las líneas 13 a 16 vemos la forma en que enlazamos unas señales específicas de los botones, con cuatro diferentes métodos ubicados en la misma clase (línea 18 a la 28). El bloque de la línea 30 en adelante está fuera de la definición de la clase, y será ejecutado cuando este módulo sea invocado como punto de entrada de la aplicación.

Para ejecutar el programa:
python calc.py


Bueno, ahí tenemos ya nuestra potente calculadora en ejecución. En alguna entrada posterior veremos los cambios o inconvenientes que surjan al hacer todo esto en windows, y en cosas más importantes, usaremos el otro método de comunicación entre QtDesigner y Python, que es cargar directamente el archivo .ui en tiempo de ejecución, es decir, sin generar previamente el código con pyuic4.

Enlaces y adjuntos.

Python para todos
Presentación sobre PyQt
pyqt-calculadora.zip

sábado, 8 de agosto de 2009

¿Qué es Ext JS?

Hoy en día existen muchas herramientas para el desarrollo de Aplicaciones de Internet Enriquecidas (RIA), una de ellas son los frameworks de JavaScript, y dentro de estos, es donde se encuentra ubicado Ext JS, la cual nos permite desarrollar aplicaciones con una velocidad considerable y con un aspecto muy agradable (look and feel), cabe mencionar que ya existen muchos "look and feel" para darle un aspecto diferente al convencional. Su pronunciación ( X´d) podemos encontrarla en este hilo del foro oficial (Aquí).

Esta librería que inicialmente fue desarrollada como una extensión de la libreria Yahoo! User Interface (YUI) , y gracias a su buena estructura actualmente puede interactuar con jQuery, Prototype y YUI, además Ext JS cuenta con su propia librería la cual se llama Ext-base.

Al programar con esta libreria verán que es muy semejante a utilizar Java, ya que pueden crear ventanas, paneles, grids, layouts, tooltips, pestañas, control de formularios, menús, check box, radio button, arboles, barra de herramientas, combobox, campos de fecha, y muchos widget mas, lo cual esta ampliamente documentado.

Existen tres tipos de licencias:

  • Comercial: Si deseas desarrollar software propietario esta es la elección, su precio va desde $329 hasta $16,449, dependiendo del numero de licencias deseadas.
  • Open Source: Esta implica que tu aplicación deberá ser liberada con licencia GNU GPL V3.
  • Revendedor: Este tipo de licencia es necesaria adquirirla cuando deseas realizar un framework o librería basada sobre Ext JS. Para saber el costo es necesario ponerse en contacto con el equipo de Ext JS.

Actualmente Ext JS esta en su versión 3.0 y puede ser descargada desde su sitio oficial aquí.

Instalación:

Para comenzar a usarlo solo tienen que ser importados los siguientes archivos:
  • ext-3.0.0/resources/css/ext-all.css
  • ext-3.0.0/adapter/ext/ext-base.js
  • ext-3.0.0/ext-all.js


Resultado:


Conclusión
:

Este framework es algo muy novedoso y a mi gusto uno de los mejores estructurados y que tiene un gran alcance gracias a sus adapters lo cual permite interactuar con otras librerías. Con ella podemos realizar aplicaciones muy vistosas y sobre todo operacionales en el ambiente web, y con un flujo de datos como si fuera una aplicación de escritorio.

Esta libreria esta actualmente siendo utilizada por varias entidades de las cuales podemos citar algunos ejemplos: Adobe, Amazon.com, Boeing, Borland, Cisco, CNN, Down Jones & Co, HP, IBM...


NOTAS: También existe una versión para trabajar con Google Web Toolkit (GWT). http://www.extjs.com/products/gxt/

Links:
Ejemplos:
http://www.quizzpot.com/ (Curso con videos, ejemplos y materiales. Muy ilustrativo)
http://extjs.com/deploy/dev/examples/samples.html
http://extjsmexico.com/demos/modulo_usuarios/modulo_usuarios.php
http://www.sdsimple.es/app/ usuario: passer password: passer HOT!
http://es.wikipedia.org/wiki/ExtJS
http://extjsmexico.com/