viernes, 31 de mayo de 2013

Introducción a Flex.

clip_image001

Primeros años… Un poco de historia.

Flex es una tecnología desarrollada para la creación de Aplicaciones Enriquecidas de Internet (RIA’s). Su primera publicación corrió por parte de Macromedia en marzo del año 2004 donde se vislumbraba el primer esfuerzo por potenciar las características que poseía Flash para mostrar contenido interactivo, vincularlas con las posibilidades de su lenguaje de programación ActionScript y de esta manera brindar un entorno de desarrollo que permitiera a los programadores explotar las capacidades de ambos en el desarrollo de aplicaciones interactivas complejas. Así que Flex transitó por su primera versión prácticamente desapercibido de la mano de Macromedia hasta que algo inesperado sucedió.

Si bien Macromedia tuvo sus años de gloria el 18 de abril de 2005 se hacía publica su compra por parte del gigante Adobe Systems y en este momento como parte de la transición Flex comenzó una nueva etapa de vida. Fue de esta manera que Flex se convirtió en el primer producto de Macromedia en ser etiquetado por la compañía como Adobe Flex, con la salida de su versión 2.0 y su IDE Adobe Flex Builder basado en Eclipse.

Evolución

En los 3 años siguientes a partir de la salida de Adobe Flex 2.0 muchos desarrolladores comenzaron a experimentar con las nuevas bondades que esta tecnología brindaba, ActionScript había evolucionado para convertirse ahora en un lenguaje orientado a objetos con las capacidades y robustez necesarias para que Flex creciera durante este tiempo. Paralelamente Adobe andaba creando otra pieza fundamental en este rompecabezas, un entorno que hiciera de Flex una tecnología multiplataforma y le permitiera no solo ejecutarse desde la web sino también en otras plataformas de manera nativa, su codename era Apolo y en la primavera del 2007 Adobe lo liberó conjuntamente con una extensión para el desarrollo de aplicaciones nativas con Flex Builder y lo nombró formalmente Adobe AIR el 10 de junio de ese mismo año.

Este había sido el salto clave que la compañía estaba esperando dar y en 2008 con la salida de la versión 3.0 del SDK y el IDE Flex se convertía en una tecnología de preferencia para la creación de aplicaciones orientadas principalmente al sector empresarial. El IDE brindaba ahora un sin número de funcionalidades que hacían muy productivo el tiempo de desarrollo y el SDK integró varios back-ends y generadores de capas de acceso para la conectividad con diversos servidores de base de datos. Así siguió a buen paso y Adobe modificó las licencias para orientarse al futuro de un SDK de Flex de código abierto.

En Marzo de 2010 se libera la versión 4.0 del nuevo SDK que ya en ese momento era opensource y se incluyen modificaciones sustancialmente importantes entra las que se incluía una nueva arquitectura de componentes para explotar al máximo el nuevo núcleo de Adobe Flash Player 10, la optimización para el intercambio de datos con Web Services y una nueva estructura de diseño que permitía la creación de Skins y componentes visuales personalizados. El IDE Flex Builder también ostentó nuevos cambios, entre ellos cambiaba de nombre a Adobe Flash Builder (v4.0) e incluyó diversas características que permitían cómodamente el intercambio de gráficos provenientes de las restantes herramientas de la suite Adobe haciendo mucho más fácil la vida a desarrolladores y diseñadores para la construcción de GUI’s vistosas, dinámicas e innovadoras.

La guerra contra Flash & Flex

Flex ya era muy popular, contaba con gran número de profesionales a nivel mundial y el movimiento a su alrededor era extraordinario. Muchas de las grandes empresas de Internet apostaban por el entorno de Flex para desarrollar sus aplicaciones y los desarrolladores de aplicaciones para dispositivos móviles también se volcaron a Flex y AIR para crear todo tipo de soluciones basadas en estas tecnologías. Debido a su popularidad Apple comenzó a mirar con malos ojos hacia este sector, ya que Adobe representaba la mayor competencia a las aplicaciones nativas para la App Store de iOS y fue por ello que Steve Job, unos pocos días antes de la salida de la versión 4.0 de Flex, lanzó la primera piedra y dijo NO al soporte del plugin de Flash en el sistema operativo del gigante de Cupertino, en principio alegando que los juegos y aplicaciones que corrían sobre la máquina virtual de Flash consumían muchos recursos y afectaban considerablemente el desempeño y la autonomía de los dispositivos.

Adobe por su parte decidió responder de una manera menos “agresiva” y más “diplomática” difundiendo una singular nota que corrió por todos los sitios de internet y decía “We Love Apple. What we don’t love is anybody takin away your freedom to choose what you create, how you créate it, and what you experience on the web.” Formalmente en español (“Nosotros Amamos a Apple. Lo que no amamos es a cualquiera quitándote tu libertad de elegir qué crear, cómo crearlo y qué experimentas en la red.) Las polémicas fueron muchas, a favor y en contra pero lo cierto de todo es que el final de la historia llevo a Flex a ser lo que es hoy en día.

Adobe Flex ahora Apache Flex

Después de varios meses de controvertidas discusiones en todos los rincones de Internet (Comunidades, Redes Sociales, Blogs etc.) finalmente en noviembre de 2011 Adobe anuncia el cese en el desarrollo del plugin de Flash para dispositivos móviles, pero lo que sí hizo eco de explosión fue que paralelamente estaba donando Flex a la Apache Fundation.

Hoy en día y pasado ya casi 3 años Flex sigue vivo, ahora con nuevos horizontes aunque un poco desconocido y a la sombra porque muchos de los nuevos desarrolladores no le vieron en sus días de gloria. Lo cierto es que la Fundación Apache ha puesto mucho interés en él desde que Adobe lo puso en sus manos y hoy por hoy sigue ejecutándose en todas las plataformas, incluidos los dispositivos móviles gracias a su plataforma cruzada con Adobe AIR. Se dice que Adobe asiste a la comunidad de Flex en todo su desarrollo y que está al pendiente de toda su evolución. Lo cierto es que por el momento Flex seguirá siendo una alternativa viable mientras HTML5 madura (¿Lo hará en un futuro cercano?) y desde acá en el blog de SOFTPEI estaremos publicando artículos para que los que no han escuchado sobre él lo conozcan y los que quieran iniciarse tengan un punto de partida por dónde iniciar. Los esperamos en la próxima publicación.

{ Leer Más }


jueves, 30 de mayo de 2013

Introducción a herramientas BPM Opensource.

El estado de los BPM open sources en la actualidad es muy interesante. A partir de un estudio realizado sobre las nuevas funcionalidades del Activiti se ha querido mostrar en esta entrada la relación entre 3 BPM muy conocidos: Bonita, jBPM y Activiti. Esto de una forma muy ligera pues se verán ejemplos prácticos en otras entradas.

La base que se usa es el nuevo libro de Activiti “Activiti in Action

clip_image001

Según este libro los competidores actuales de Activiti son Bonita y jBPM y por eso le dedican parte de la introducción para compararlos entre sí. Veamos.

JBoss BPM o jBPM como también se le conoce es un motor de procesos open source que soporta el lenguaje jPDL y desde la versión 5.0 soporta BPMN 2.0. Nos dicen además que el proyecto se unió con JBoss Drools Project y ha reemplazado a “Drool Flow” como lenguaje de flujo de reglas en el framework Drools.

BonitaSoft es la compañía detrás de Bonita Open Solution o BOS, es un motor de procesos open source que provee soporte para el lenguaje BPMN 2.0. Un diferenciador clave de esta solución es que posee un gran conjunto de conectores y el ambiente integrado de desarrollo que ofrece.

Cuando se compara Activiti con jBPM se debe decir que tienen mucho en común. Esto se debe a que Activiti salió inicialmente de la misma fuente que jBPM por lo que sus frameworks bases utilizan el concepto de máquinas de estado. Pero hay que tener en cuenta que desde que se separaron se han hecho muchas mejoras a Activiti por lo que las diferencias han ido en aumento como pueden apreciar en la siguiente tabla comparativa:

clip_image002

A la hora de comparar Activiti con “Bonita Open Solution” o BOS, los siguientes elementos saltan a la vista:

  • BOS provee una solución basada en una herramienta donde se pueden definir los procesos, formas y el uso de un amplio uso de conectores sin necesidad de escribir código, por eso se dice que es más enfocada a personal no técnico o que no se necesitan grandes habilidades para diseñar, implementar, desplegar, simular y probar un procesos.
  • Activiti es más enfocada a los desarrolladores al proveer una API en JAVA para comunicarse con su motor de procesos. De esta manera se está en control siempre del código generado.
  • Con BOS no puedo tener control total de lo que pasa y es algo que no me acaba de gustar, aunque es una herramienta muy buena.
  • En BOS el código es generado por la herramienta mientras que con Activiti es tarea del desarrollador codificar una buena parte de las acciones a realizar como instanciar los procesos, correr los test, definir las pantallas, etc.
  • Con Activiti si tienes que tocar el código, lo cual es algo que a mucha gente no les gusta y no les quito la razón, pero si consideramos que es una herramienta nueva y si se es un desarrollador de software pues claro que la curiosidad nos pica. Es eso lo que me gusta de Activiti además de que tiene una buena integración con Spring Framework, Spring Integration y Apache Camel, y eso ya dice mucho.

Luego de que veamos unos ejemplos ustedes podrán corroborar estos puntos.

Si preguntaran por una herramienta para empezar un desarrollo relevante en BPM y que fuera open source se les recomendaría Bonita, pero sin perder de vista a Activiti pues en unos años será la líder en este campo. Ya el tiempo lo dirá. ¿Ustedes que creen?

{ Leer Más }


miércoles, 29 de mayo de 2013

.Net Los primeros pasos.

dotnet (1)

Si afirmáramos que .Net es de las tecnologías más completas para los desarrolladores de la actualidad, realmente no estaríamos exagerando. Piense usted en cualquier aplicación que quiera desarrollar para la plataforma de Windows, bueno de seguro que .Net tiene la solución a gran parte de sus problemas. Por supuesto que existen otras tecnologías excelentes como son Java, C++, Phyton o PHP. Cada una con sus especificidades y características, por lo que la elección siempre dependerá de usted y lo que desee lograr, pero sin dudas .Net es un buen comienzo al menos para los de menos experiencia en este mundo de la programación. El desarrollo constante de .Net ha permitido adaptarse a las nuevas tecnologías y los requerimientos más complejos. Pongamos algunos ejemplos; si quisiéramos desarrollar una web dinámica podríamos usar ASP.Net, también podríamos tener la posibilidad de realizar un buen diseño utilizando WPF, publicar servicios Web utilizando SOAP, realizar aplicaciones desktop etc. Sin dudas un sinfín de posibilidades y por si esto fuera poco podríamos hacer esto utilizando un único lenguaje C#.

Algunas de sus ventajas son:

  • Completamente orientado a objetos: Los dos .Net Framework y su lenguaje insignia, C# están orientados a objetos desde su concepción.
  • Independiente del lenguaje: .Net Framework permite utilizar toda una variedad de lenguajes como C++ .Net, Visual Basic o C#. Estos se compilan a un código común, conocido como IL, permitiendo así mayor interoperabilidad. Una forma fácil de entender esto es podríamos escribir un función en C++ .Net y después utilizarla en C# o Visual Basic sin dificultades.
  • Gran cantidad de utilidades: .Net contiene una gran variedad de funcionalidades para crear aplicaciones por ejemplo trabajo con Hilos, Acceso a Datos, Seguridad, Acceso a ficheros y un largo etc...
  • Visual Studio: .Net también nos presenta un ambiente para desarrolladores, Visual Studio, este magnífico IDE integra las mejores funcionalidades de .Net en un solo lugar. Ya dedicare alguno de estos post a esta herramienta.

Entendiendo un poco .Net Framework

¿Qué es .Net Framework? Muy simple, es un conjunto de funcionalidades que nos permiten desarrollar aplicaciones para Windows sin tener que utilizar directamente la API de Windows (aunque en caso que quisiéramos también podríamos). Este concepto es bastante reducido pero ilustra muy bien de que va .Net Framework.

Haciendo un poco de historia recordamos que la primera versión de .Net Framework (1) se presentó por allá por el año 2002 con mucha expectación. En el 2005 se introdujo .Net Framework (2) con gran cantidad de mejoras pero siempre teniendo en cuenta la compatibilidad con las versiones anteriores. La Versión actual de .Net Framework es la 4.5 que igualmente contiene una gran cantidad de mejoras respecto a su predecesor.

Una vista general de .Net Framework sería algo así:

clip_image002

Ahora, expliquemos esta imagen. En lo alto y de color naranja se observan los diferentes lenguajes de programación que se pueden utilizar en .Net. En este mismo color se puede apreciar también el Common Language Specification (CLS), como su nombre indica es un lenguaje común que expone un conjunto de características de lenguaje básicas requeridas por la mayoría de las aplicaciones. Una forma más clara de entender esto significa que si deseáramos, se puede extender otros lenguajes siempre y cuando cumplan con los requerimientos de CLS.

En color azul se encuentra la Class Library, biblioteca de clases en castellano, esta contiene buena parte de las utilidades que pudiéramos utilizar en nuestra aplicaciones. Su forma de acceso es común a todos los lenguajes y permite modificaciones mediante la herencia.

El otro punto fuerte de .Net es el Common Language Runtime (CLR). Como ya explicábamos los compiladores de .Net no producen código nativo, si no que producen código intermedio (IL). El compilador de código nativo (compilador JIT, Just-In-Time) de la CLR es el que se encargará de compilar "al vuelo" el código IL a lenguaje nativo de la plataforma donde se ejecute la aplicación. Una de las muy buenas características de CLR es que mantiene la ejecución bajo control, esto significa que maneja algunos detalles tan importantes como son la administración de memoria y la seguridad.

Ya en lo más bajo de las capas se encuentra Windows como la plataforma base para la ejecución de las aplicaciones .Net Framework.

Hasta aquí hemos visto algunos de los conocimientos básicos que hay que poseer para trabajar sobre .Net. En los post siguientes le daremos seguimiento a otras características de esta importante herramienta que es .Net Framework.

{ Leer Más }


martes, 28 de mayo de 2013

HTML5, su influencia en la evolución de la Web.

clip_image002

El HTML5 (HyperText Markup Language, versión 5) es la quinta revisión del lenguaje de programación “básico” de la World Wide Web, el HTML. En esta versión, se introducen nuevas características para ayudar a los desarrolladores de aplicaciones Web, así como rediseñar el código actualizándolo a nuevas necesidades que demanda la web, prestándose especial atención a la definición de claros criterios de conformidad para los navegadores web en un esfuerzo por mejorar la interoperabilidad.

HTML5 también es un término de marketing para agrupar las nuevas tecnologías de desarrollo de aplicaciones web: HTML5, CSS3 y nuevas capacidades de Javascript. HTML5 incluye todos los elementos válidos de ambos HTML4 y XHTML 1.0. Además, ha sido diseñado con algunos principios primarios en mente para asegurar trabajar adelante simplemente sobre cada plataforma, es compatible con los navegadores antiguos, y maneja errores con facilidad. Un resumen de los principios del diseño que guiaron la creación del HTML5 puede ser encontrado en la página oficial de W3C.

Ante todo, HTML5 incluye redefiniciones de elementos de marcado existentes, y los nuevos elementos que permiten a los diseñadores web ser más expresivos en la semántica de su marcado. Por qué utilizar en su página divs cuando se puede tener artículos, secciones, encabezados, pies de página, y más.

“HTML5 es el presente de la web y si no estás asimilando lo que está pasando ya eres parte de la vieja generación de desarrolladores. Eso tendría que tenerte preocupado.”

Entender HTML5 permite que hagamos mejores sitios web, teniendo en cuenta que los usuarios se pueden conectar desde teléfonos móviles, tabletas, eBooks, netbooks, computadores y otra gama de dispositivos.

Todas las empresas gigantes de la web, por ejemplo Google, Apple, Microsoft, Adobe, Facebook, Yahoo y Mozilla, hoy respiran HTML5 y lo apoyan.

En el corazón de HTML5 hay varios nuevos elementos semánticos, así como varias tecnologías relacionadas. Estas adiciones y estos cambios han sido introducidos con la meta de hacer las páginas webs más fáciles de codificar, usar y acceder.

Los nuevos elementos semánticos junto a otros estándares, contribuyen a hacer nuestros documentos más accesibles para humanos y máquinas dando como resultado beneficios para la accesibilidad y búsqueda.

Los elementos semánticos, en particular, han sido diseñados considerando la dinámica en la web, enfocándose en particular en hacer página más portables y modulares.

Transformación de HTML4 a HTML5

Imagen 1: Estructura típica de una página con HTML4, llena de DIVs

clip_image004

Imagen 2: Estructura típica de una página con HTML5

clip_image006

En HTML5 hay algunos nuevos elementos semánticos:

<header>, <hgroup>, <nav>, <article>, <section>, <aside>, <time>, <mark>

<footer>

Hay cuatro nuevos elementos multimedia:

<audio>, <canvas>, <source>, <video>

Y hay nuevos elementos para estructurar el contenido:

<details>, <summary>

Formularios

Nuevos tipos de entrada:

<input type="email" />, <input type="url" />, <input type="date" />, <input type="time" />, 

<input type="datetime" />, <input type="month" />, <input type="week" />, <input type="number" />, <input type="range" />, <input type="tel" />, <input type="search" />, <input type="color" />


Nuevos controles:

<output></output>

Nuevos atributos:

autofocus, min, max, pattern, placeholder, required, step

En resumen, podemos decir que las tecnologías asociadas con HML5 ayudan a echar los cimientos para la siguiente generación de aplicaciones web. Nos dejan construir sitios que son más simples para desarrollarse, más fácil para mantener, y más amigables al usuario. En próximas entradas estaremos abordando nuevos temas interesantes relacionados con HTML5 y su influencia en la evolución de la web.

{ Leer Más }


lunes, 27 de mayo de 2013

Introducción a la biblioteca JasperReports y la herramienta iReport.

clip_image001

JasperReports está considerada como una de las mejores bibliotecas de software libre para generar reportes [1]. Tiene la habilidad de entregar contenido enriquecido al monitor, a la impresora o a ficheros PDF, HTML, XLS, CSV y XML. Está escrito completamente en Java y puede ser usado en gran variedad de aplicaciones de Java, incluyendo Java EE o aplicaciones web, para generar contenido dinámico. Su propósito principal es ayudar a crear documentos de tipo páginas, preparados para imprimir en una forma simple y flexible.

JasperReports se usa comúnmente con iReport Designer [2], un constructor / diseñador de informes visual, poderoso, intuitivo y fácil de usar. Este instrumento permite que los usuarios desarrollen visualmente informes complejos con cartas, imágenes, subinformes y otros [3]. iReport está además integrado con JFreeChart, una de la biblioteca gráficas OpenSource más difundida para Java. Los datos para imprimir pueden ser recuperados por varias vías como pueden ser: JDBC, TableModels, JavaBeans, XML, etc.

Entre las principales características de iReport podemos destacar las siguientes:

  • 100% escrito en JAVA y además OPENSOURCE y gratuito.
  • Maneja todas las etiquetas de JasperReports.
  • Permite diseñar con sus propias herramientas: rectángulos, líneas, elipses, campos de los textfields, cartas, subreports (subreportes).
  • Soporta internacionalización nativamente.
  • Browser de la estructura del documento.
  • Recopilador y exportador integrados.
  • Soporta JDBC.
  • Soporta JavaBeans como orígenes de datos (éstos deben implementar la interface JRDataSource).
  • Incluye Wizard’s (asistentes) para crear automáticamente informes, plantillas y sub-reportes.
  • Facilidad de instalación.

Estas potencialidades se pueden combinar con JasperServer que proporciona una interfaz basada en web para gestionar, programar y ejecutar los informes, un repositorio para almacenar todos los recursos del informe como imágenes, fuentes, fuentes de datos y mucho más, un servicio de seguridad para decidir quién puede ejecutar que informe, y un servicio web API para ejecutar los informes de aplicaciones externas (por lo que puede generar informes de cualquier tipo de entorno, como PHP o. NET).

La herramienta iReport Designer le permite diseñar informes JasperReports, así como también permite ejecutarlos y generar la salida en una aplicación Java, y JasperServer permite a los usuarios finales y las aplicaciones externas acceder, ver y publicar sus informes de forma segura.

Ciclo de Vida de un Reporte usando iReport Designer.

Cuando se diseña un informe con iReport Designer se crea un archivo JRXML, que es un documento XML que contiene la definición del diseño del informe. La disposición de los componentes está diseñada completamente de una manera visual, por lo que no debe preocuparse por la estructura real del archivo JRXML. Antes de ejecutar un informe, el JRXML deberá elaborarse en un objeto binario llamado archivo de Jasper. Esta recopilación se hace por razones de rendimiento. Los archivos Jasper son lo que usted necesita enviar con su solicitud, a fin de ejecutar los informes.

La ejecución de informes se realiza pasando un archivo de Jasper y una fuente de datos para JasperReports. Hay un montón de tipos de fuentes de datos, es posible llenar un archivo Jasper de una consulta SQL, un archivo XML, un archivo csv, una consulta HQL (Hibernate Query Language), una colección de JavaBeans, etc .. Si usted no encuentra una fuente de datos adecuada, JasperReports es muy flexible y permite que usted escriba su propio origen de datos personalizado. Con un archivo de Jasper y una fuente de datos, JasperReports es capaz de generar el documento final en el formato que prefiera.

iReport Designer también permite configurar las fuentes de datos y utilizarlas para probar sus informes. En muchos casos, los asistentes por datos pueden ayudarle a diseñar sus informes mucho más rápido. iReport Designer incluye el propio motor JasperReports para hacerle una vista previa del resultado del informe, probar y refinar sus informes.

clip_image003

Figura 1 Proceso de compilación

Interfaz de usuario

Podemos asegurar que iReport Designer es un potente entorno para el diseño de informes. Los informes pueden ser diseñados desde cero o desde una de las muchas plantillas listas para usar que están disponibles. iReport Designer le ayudará durante todas las fases de la elaboración del informe: Diseño JRXML, compilación Jasper, ejecución de informes y exportación de documentos o visualización. La figura 2 muestra los principales componentes de la interfaz de usuario de iReport Designer.

clip_image005

Una breve descripción de los principales componentes de la interfaz de usuario de iReport Designer sería la siguiente:

  • El Diseñador de Informes (Report Designer) es donde se diseña visualmente el informe, arrastre, posicionamiento, alineación y cambiar el tamaño de los elementos del informe.
  • El Inspector de Informe (Report Inspector) muestra la estructura completa del informe que se compone de muchos objetos (por ejemplo, campos, parámetros y variables), bandas (que son las secciones del documento) y elementos (como campos de texto, imágenes o gráficos).
  • La paleta de elementos (Elements Palette) contiene los elementos que se pueden arrastrar dentro de una banda para mostrar los datos.
  • La hoja de propiedades (Property Sheet) se utiliza para configurar las propiedades del componente seleccionado en el informe (por ejemplo, un campo, elemento, banda, grupo, u otros).

A modo de conclusión queremos recomendarle el uso conjunto de la biblioteca JasperReports y la herramienta iReport Designer, en próximas entradas estaremos proporcionando más información sobre este tema.

{ Leer Más }


sábado, 25 de mayo de 2013

Desplegando un servicio axis2 en un servidor Tomcat.

clip_image002

A veces se nos pide un requerimiento dentro de proyecto de que expongamos determinadas funcionalidades vía servicios web.

Mi solución más rápida es crear un servicio en axis2 y desplegarlo en un servidor tomcat usando el mismo axis2. Veamos cómo:

Paso 1: crear el servicio axis2.

Paso 2: descargarnos el tomcat y el war del axis2 y desplegar axis2 como una aplicación dentro de tomcat.

Paso 3: desplegar el servicio dentro del axis2.

El paso 1 se puede realizar de diferentes vías. Buscando en google hay una explicada en español que salió ayer y viene como anillo al dedo para los fan de wso2. La pueden encontrar aquí.

El paso 2 es cosa de buscar las instalaciones tanto del tomcat como de axis2, descargarlos y ya. El war de axis2 debe ser desplegado como una aplicación más dentro del tomcat.

El tomcat tiene esta esta forma cuando lo descompactan.

clip_image003

En la carpeta bin lo más interesante son los ejecutables startup.sh o .bat para iniciar el servidor y el shutdown.sh o .bat para apagar el servidor. sh para linux y .bat para Windows

En la carpeta conf tenemos el fichero server.xml para la configuración de los puertos y cosas de seguridad relacionadas con los certificados si queremos usar https. También tenemos el fichero tomcat-users.xml para los usuarios iniciales del tomcat.

En la carpeta webapps es donde ponemos nuestros war, las aplicaciones, para que sean desplegadas y luce así.

clip_image005

Lo que haré ahora es tomar el war de axis2 y ponerlo en esta carpeta y arrancar el servidor. En mi caso estoy usando la versión axis2-1.6.1-war del axis2, ustedes pueden usar la más actual.

Cuando inician el server puede ir al navegador y poner esta url: http://localhost/axis2/ tengan en cuenta que estoy usando el puerto 80, si usaran el 8080 tendrían que especificarlo en la URL.

Verán algo como esto.

clip_image007

Como ven todo muy fácil y sin complicación.

Ahora vamos al paso 3. Buscamos nuestro servicio en axis2 que tendrá extensión .aar y lo copiaremos en [TOMCAT]\webapps\axis2\WEB-INF\services\ donde [TOMCAT] es la ubicación del servidor de tomcat. Usaré este servicio Echo.aar

Cuando lo hagan verán un error como este en la consola:

clip_image009

Bueno, no es que todos los tutoriales funcionan a la primera, se preguntarán. En este caso es intencional y el error se debe a que el servicio que escogí, que no es que siempre pase, se expone tanto a través de http como de https y el axis2 ni el servidor tomcat fueron configurados para soportar https.

Una solución puede ser habilitar el https, pero lo que haremos será deshabilitar este transporte en el fichero services.xml del servicio.

Para hacerlo deben meterse dentro del .aar del servicio y buscar esta ruta: Echo.aar\META-INF\ services.xml

Cuando lo abran verán lo siguiente:

clip_image011

Eliminan o comentan esta línea <transport>https</transport> y listo. Solo tienen que reiniciar el servidor y el error se habrá ido y podrán ver el servicio a través de la aplicación web de axis2.

Van a http://localhost/axis2/ dan clic en Services y ya está.

clip_image012

Si dan clic en “echo” podrán acceder al WSDL del servicio.

Luego es cosa de consumirlo nada más.

{ Leer Más }


viernes, 24 de mayo de 2013

Enginio: servicio basado en la nube para aplicaciones Qt.

clip_image001

Hace algunos meses hemos estado escuchando noticias alentadoras sobre el nuevo servicio basado en la nube para aplicaciones Qt: http://engin.io .Ahora que ya está disponible una versión inicial de este backend queremos profundizar un poco más en el conocimiento de sus principales característica [1].

¿Por qué usar Enginio?

Cuando estuvimos revisando las soluciones existentes de la nube, vimos que hay campo para una mejoría. Algunas fueron difíciles de comprender y requirieron conocimiento específico de ciertas infraestructuras o las plataformas y en la mayoría de los casos no tuvieron a soporte para las APIs Qt/C++. Usando la experiencia que tenemos en el desarrollo de soluciones backend para diversas clases de aplicaciones, se decidió a crear una solución que enlace las aplicaciones con un backend-almacenamiento en la nube basado en los APIs intuitivos de Qt. Con Enginio los desarrolladores pueden concentrarse en crear su aplicación haciéndola visualmente agradable y eficiente y pueden dejar a Enginio manejar la funcionabilidad del backend, la escalabilidad, la seguridad y el rendimiento.

Nuestra meta fue construir, teniendo en cuenta el lema de Qt: "simplificar la vidas de los desarrolladores" y sabiendo eso, quisimos entregar a los desarrolladores un backend para aplicaciones Qt, que le permita obtener una experiencia elemental del desarrollo. Entonces, comenzamos a crear una solución fácil de usar y con valor añadido para aplicaciones Qt y al mismo tiempo transmitimos ese rasgo de desarrollo sin ningún esfuerzo para otras plataformas. Queremos asegurarnos de que los beneficios que continúa brindando el backend de Qt estén disponibles para todo. Enginio estará disponible para los usuarios de ambos modelos: el software libre y bajo licencias comerciales. Para usuarios empresariales de Qt, que desarrollan bajo las licencias comerciales de Qt, pronto publicaremos algunas funcionalidades de valor añadido.

Las funcionalidades de la tecnología Enginio:

  • La consola de Web (La interfaz de usuario para configurar y manejar a su backend)
  • El almacenamiento de datos con menos esquema (El lugar para almacenar los datos de sus aplicaciones)
  • El modelo de seguridad (El mecanismo de control sobre qué datos pueden acceder los usuarios finales)
  • El soporte para archivo (Puedes salvar archivos pequeños o grandes en la nube)
  • Profundidad en las búsquedas de texto (Localiza datos almacenados por su contenido)
  • La biblioteca del cliente Qt/QML (La forma más conveniente para crear aplicaciones)

¿Cómo comenzar a usar Enginio?

  1. Crearse una cuenta en Enginio.

clip_image002

  1. Configurar su nuevo backend.

clip_image003

  1. Desarrollar sus aplicaciones.

clip_image004

La última versión liberada de la biblioteca Qt está disponible de la consola Enginio.

La biblioteca compartida y el plugin (extensión) QML están construidos e instalados como siempre con 'qmake && make install'.

Ejemplo de Qt:

I. En el IDE Qt Creator escoge File > New File or Project… y crea una nueva “Qt Gui Application”.

II. En el nuevo fichero del proyecto con extensión .pro adicione:

clip_image006

III. En MainWindow.cpp:

clip_image008

Ejemplo QML:

I. En el Qt Creator haga clic en File > New File or Project… y cree una nueva “Qt Quick 2 Application (Built-in Elements)”

II. En main.qml:

clip_image010

Luego de que ejecute “Build”, su aplicación conectada está lista.

Y así terminamos nuestro breve artículo sobre http://engin.io, si le ha resultado interesante envíenos sus comentarios.

{ Leer Más }


jueves, 23 de mayo de 2013

Arquitectura genérica para el desarrollo de aplicaciones empresariales.

En varias entradas del blog hemos abordado temas que tienen que ver con la persistencia de los datos en almacenes relacionales y hemos visto el uso de diferentes tecnologías y enfoques para resolver el tema de la persistencia.

Que se toquen estos temas desde lo básico a lo más usado actualmente no es un hecho casual si no que forma parte de una estrategia de ir tocando todos los puntos que forman parte de una arquitectura genérica que se puede usar para el desarrollo de aplicaciones empresariales.

Digo arquitectura genérica primero porque es ampliamente usada por diferentes empresas de desarrollo de software y segundo porque a partir de ella se pueden obtener múltiples variaciones particulares en función del dominio del negocio que se ataque.

Por allá por el 2010 en el sitio de adictos al trabajo sacaron una propuesta de arquitectura que hasta la fecha la considero bastante adecuada para desarrollos basados en JAVA. La pueden ver en esta entrada.

clip_image001

Fig.1. Arquitectura propuesta por Autentia.

En la entrada donde se publica se hace un análisis muy bueno de cada componente y de posibles variantes que existían en la fecha de publicación.

En ese sentido creo que hasta el día de hoy no cambiaría casi que ninguno de los componentes con sus excepciones claro:

En el tema de los servicios web y soluciones de integración e interoperabilidad se ha avanzado bastante por lo que sustituiría los siguientes elementos:

o BPM: ellos proponen JBPM o Intalio. Yo pondría algo como Bonita, Activiti o una herramienta que va surgiendo ahora y es el Bussiness Process Server de WSO2.

o jUDDI: pondría otra herramienta de WSO2, el Governance Registry o GREG. Que expone una UDDIv3 pero que además implementa el WS-Discovery.

o OpenESB: lo cambiaría sin problemas por el ESB de WSO2.

o Servicios Web: siguiendo con la tónica usaría el Application Server de WSO2 más el conjunto de herramientas que necesite para el desarrollo y despliegue de servicios web.

o Subversion: lo cambiaría por Mercurial o por Git.

o En la capa de presentación es donde más debate podría haber. Aun estas tecnologías tienen su fuerza aunque están surgiendo soluciones como Vaadin y ZK que tienen sus pros y sus contras, y a las cuales dedicaré otras entradas.

La capa de persistencia es obvio que la mantendría. Hasta el momento Hibernate como implementación del estándar JPA sigue siendo la mejor solución.

El uso de Spring para la capa de lógica de negocio es evidente que sigue siendo un “top priority”.

IReport lo continuaría seguro, con JasperReport como librería para generar los reportes.

El tema de integración continua es otro de los fuertes de esta propuesta que se sigue manteniendo: el uso de Maven, ya lo hemos tocado en este blog, Hudson que actualmente es Jenkins junto con Sonar son las herramientas básicas para la integración continua.

En el caso de la herramienta para portales no podría estar más de acuerdo. Liferay sigue de líder en este tema, junto con Alfresco en la gestión de contenidos. Y claro en el Business Intelligence la suite de Pentaho llegó para quedarse. Por ultimo como plataforma de aprendizaje y e-learning moodle es la elección por defecto. Ah y claro en las ETL sugieren a Talend, esa si se las debo pues no he trabajado en esta tecnología.

{ Leer Más }


miércoles, 22 de mayo de 2013

Inicio rápido con el Framework Qt.

clip_image001

Hace unos días publicamos un artículo, comentando las mejoras fundamentales que hemos experimentado con el lanzamiento de la versión 5.0 del Framework Qt. El presente tiene el objetivo de continuar profundizando en el estudio de Qt, que como ya explicamos, es un framework para el desarrollo de aplicaciones multiplataforma. Una de sus funciones más conocidas es la de la creación de interfaces de usuario, sin embargo no se limita a esto, ya que también provee clases para facilitar otras tareas de programación como el manejo de sockets, soporte para programación multihilo, comunicación con bases de datos, manejo de cadenas de caracteres, entre otras.

Qt utiliza C++ de manera nativa, pero ofrece soporte para otros lenguajes como Python mediante PyQt, Java mediante QtJambi, o C# mediante Qyoto.

Varias aplicaciones conforman la suite para el desarrollo con Qt, entre ellas están:

  • Qt Assistant: Herramienta para visualizar la documentación oficial de Qt.
  • Qt Designer: Herramienta WYSIWYG para crear interfaces de usuario.
  • Qt Linguist: Herramienta para la traducción de aplicaciones.
  • Qt Creator: IDE para el lenguaje C++, pero especialmente diseñado para Qt, integra las primeras dos herramientas mencionadas.

Instalación de Qt

A continuación revisamos algunas de las formas que existen para instalar y configurar el entorno de desarrollo de Qt:

  • Instalar Qt utilizando un asistente de instalación
  • Instalar Qt mediante la compilación del código fuente

A continuación, describimos cada una de ellas.

Instalar Qt utilizando un asistente de instalación

Ventajas: Este método es sencillo de realizar, permite mantenerse con la versión más reciente de Qt.

Desventajas: Puede generar un poco de confusión debido a que, dependiendo de los permisos con los que realicemos la instalación, las herramientas de Qt pueden o no ser agregadas al path por el instalador.

Instrucciones: Descargar la versión que deseemos instalar, desde la página oficial de descargas de Qt: http://qt-project.org/downloads

En dónde el nombre del instalador suele tener la forma: qt-[plataforma]- [versión-licencia] -[versión]- [arquitectura].[extensión] Un ejemplo de ello es la versión 5.0.2 opensource de 32 bits para linux que lleva por nombre: qt-linux-opensource-5.0.2-x86-offline.run.

Después ejecutamos el instalador y seguimos las instrucciones que nos muestra e indicamos la información que nos pide (path de instalación, aceptar el acuerdo de licencia).

Una vez terminada la instalación podemos ejecutar el entorno de desarrollo integrado Qt Creator y comenzar a crear aplicaciones o revisar los impresionantes ejemplos.

Si queremos utilizar las herramientas desde la terminal es necesario ejecutarlas indicando el path en el que están instaladas, o si lo preferimos agregar al path dicha ruta para sólo indicar el nombre del ejecutable. Si existe más de una versión en el path del sistema suele tomar en cuenta la que aparece primero.

Instalar Qt mediante la compilación del código fuente

Ventajas: A pesar de ser el método más complicado, se simplifica bastante gracias al script de configuración y compilación que se incluye, al cual sólo debemos indicarle con que parámetros deseamos incluir o excluir en la construcción de nuestro entorno de desarrollo de Qt. Suele ser la forma ideal si requerimos alguna característica adicional a las predeterminadas.

Desventajas: Aparte de ser la forma más complicada, la compilación de Qt toma bastante tiempo, dependiendo del hardware de la máquina puede llegar a unas 10 horas o más.

Algunas veces los scripts de instalación presentan algún problema que puede complicar todo ya que no se puede construir mediante los parámetros definidos en el asistente y habrá que buscar que es lo que falla y cómo solucionarlo.

Instrucciones: Descarga el código fuente desde la página oficial de descargas de Qt: http://qt-project.org/downloads por ejemplo:

Para Windows: http://download.qt-project.org/official_releases/qt/5.0/5.0.2/single/qt-everywhere-opensource-src-5.0.2.zip

Para Linux/Mac: http://download.qt-project.org/official_releases/qt/5.0/5.0.2/single/qt-everywhere-opensource-src-5.0.2.tar.gz

Una vez descargado el archivo, lo descomprimimos, buscamos el script de configuración, de nombre configure, lo ejecutamos y seguimos las instrucciones. Luego esperamos (un largo tiempo) a que termine la instalación.

Podemos agregar una versión compilada al Qt Creator y al path del sistema con el fin de utilizarla de manera más cómoda.

Nuestro Primer Programa en Qt: "Hola Mundo"

A continuación vamos a crear y explicar a detalle la clásica primera aplicación en programación, esta vez con Qt.

El código de un Hola Mundo en Qt es el siguiente:

#include  <QApplication>;
#include <QLabel>;

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QLabel *label = new QLabel ("Hola Mundo!");

label->show();

return app.exec();
}

Revisaremos el código línea por línea:

#include <QApplication>

#include <QLabel>

En las primeras dos líneas incluimos los archivos de cabecera que utilizaremos para el ejemplo, QApplication es una clase que representa una aplicación gráfica de Qt, es la encargada de administrar el flujo de ejecución y la configuración principal de la aplicación. QLabel es una clase que representa a un control de interfaz de usuario etiqueta, el cual es generalmente utilizado para mostrar texto no editable en pantalla.

int main(int argc, char *argv[])

Declaramos nuestra función main en la cual comenzará la ejecución de nuestro programa, es necesario especificar los argumentos de línea de comandos argc (un entero que contiene el número de argumentos) y argv (un arreglo/matriz que contiene el valor de cada uno de los argumentos) ya que al crear un objeto de la clase QApplication es necesario especificarlos.

QApplication app(argc, argv);

Crea el objeto QApplication llamado app y pasa como parámetros los argumentos de línea de comandos.

QLabel label("Hola Mundo!");

Crea un objeto QLabel llamado label, y la cual contendrá el texto que queremos mostrar en pantalla, el cual especificamos como argumento del constructor.

label.show();

Muestra la etiqueta en pantalla. Qt se encargará de crear una ventana para poder mostrar la etiqueta en pantalla ya que nosotros no hemos asignado alguna.

return app.exec();

Inicia el hilo principal de la aplicación a partir de este momento el framework toma el control de la aplicación y responde a la interacción del usuario con los controles de interfaz gráfica de acuerdo a todo lo especificado anteriormente. La sentencia return regresa al sistema operativo la respuesta de la ejecución del programa una vez que ha finalizado, esta respuesta típicamente será cero en caso de que la aplicación se haya ejecutado exitosamente.

Construcción de un Proyecto Utilizando la Terminal

Escribimos el texto del ejemplo en un archivo de texto sin formato utilizando una herramienta como el bloc de notas de Windows o editores de texto plano de GNU/Linux como GEdit, guardamos el archivo como holamundo.cpp o cualquier otro nombre con extensión “.cpp”. Abrimos una terminal en la ubicación de nuestro archivo holamundo.cpp y ejecutamos los siguientes comandos:

Para crear un archivo de proyecto para nuestra aplicación ejecutamos el comando:

qmake -project

Creamos un archivo de proyecto específico para la plataforma o SO en el que estamos trabajando con el comando:

qmake

Para especificar el archivo de proyecto a utilizar, muy útil cuando existe más de un archivo de proyecto en nuestro directorio de trabajo actual, ejecutamos el comando:

qmake [nombre-de-archivo-de-proyecto].pro

Para generar el archivo ejecutable de nuestra aplicación, ejecutamos el comando:

make

o si utilizamos Windows el comando será:

mingw32-make

Al igual que sucedía con los archivos de proyecto, si existe más de un archivo de construcción de proyecto habrá que especificar el nombre del archivo que deseamos que se procese.

Para ejecutar el archivo ejecutable generado por el compilador al procesar nuestro código, utilizamos el comando: ./holamundo o si utilizamos Windows, el comando será: holamundo.exe

Construcción de un Proyecto Utilizando Qt Creator

Ejecutamos la aplicación Qt Creator seleccionándola del menú de aplicaciones de nuestro sistema. Al hacerlo veremos la pantalla de bienvenida de Qt Creator.

En ella seleccionamos la opción "New File or Project..." del Menú "File". Veremos un asistente de creación de nuevo proyecto, para este ejemplo seleccionaremos un proyecto vacío.

En el siguiente paso del asistente seleccionamos las plataformas (targets) para las cuales deseamos construir nuestra aplicación Qt, para este ejemplo nos sirve cualquiera, nosotros elegimos Desktop/Escritorio.

En los pasos siguientes del asistente se nos solicitará el nombre del archivo e información sobre control de versiones, para el nombre nos sirve cualquiera, nosotros utilizamos HolaQt.cpp y para el control de versiones por ahora basta con presionar "Finish".

Agregamos un nuevo archivo al proyecto, haciendo clic derecho en la carpeta principal del proyecto y seleccionando la opción "Add New..." del menú contextual que aparece. Escribimos el código del ejemplo y presionamos el botón de ejecutar y construir aplicación. El botón de ejecutar y construir es el botón con una flecha color verde colocado en la parte inferior izquierda de la interfaz de Qt Creator, o presionamos Ctrl+R es el atajo de teclado para ejecutar la acción que realiza este botón. Esperamos a que la compilación termine y veremos nuestro programa en ejecución.

Esperamos le ha resultado interesante este artículo, envíenos sus comentarios.

{ Leer Más }


lunes, 20 de mayo de 2013

El Framework Qt en la vanguardia tecnológica del desarrollo de software.

clip_image002

Luego del lanzamiento de Qt 5.0, muchos desarrolladores han felicitado al equipo de desarrollo, por los grandes avances tecnológicos ha traído esta nueva versión. SoftPEI ha usado el Framework Qt para el desarrollo de sistemas informáticos complejos, de forma exitosa, es por ello que nuestra empresa se mantiene al tanto de las noticias relacionadas con Qt.

Recientemente la empresa Digia (1) y la comunidad que desarrolla el Framework Qt (2) se han reunido para elaborar de conjunto las metas (3) que debe alcanzar Qt para los próximos años:

• N. º 1 en el soporte multi-plataforma.

• N. º 1 en la experiencia del desarrollador.

• N. º 1 en la creación de experiencias de usuario.

• Fuerte ecosistema generador de valor.

• Modelo de licencia dual.

• La arquitectura de negocios abierto.

A continuación los desarrolladores de Qt explican a detalle cada una de estas metas.

# 1 en el soporte multi-plataforma

Qt es por naturaleza un marco de desarrollo multi-plataforma, que ha apoyado un gran número de sistemas de escritorio, embebidos y plataformas móviles. En los últimos meses, hemos estado trabajando activamente en la introducción de soporte para Android e iOS, así como la mejora de la experiencia en el escritorio y plataformas embebidas. Con el pronto-a-ser lanzado Qt 5.1 ya podremos ofrecer pre-estrenos tecnológicos sólidos para Android y iOS, que esperamos que se complete para Qt 5.2 que sale antes de que finalice este año. Con la introducción de la ayuda en Qt 5.1 para las plataformas móviles líderes, Qt salta a la siguiente fase de ser una plataforma agnóstica de clase mundial en el marco de desarrollo de software multiplataforma.

# 1 en la experiencia del desarrollador

En Qt 5.0 se acoplan perfectamente el Qt Creator y otras herramientas en el mismo paquete Qt junto con las bibliotecas, por lo que es posible conseguir todo lo que necesitan para empezar a desarrollar con Qt en un solo lugar. Todavía es posible el desarrollo de Qt con otros IDE de Qt Creator - por ejemplo, con Visual Studio o XCode. También hemos estado trabajando en mejorar los instaladores de línea de Qt 5, que estarán disponible pronto. También estamos invirtiendo fuertemente en herramientas. Centrándose en, por ejemplo, el nuevo Qt Quick Designer, que fue lanzado por primera vez con Qt Creator 2.7 y las nuevas Qt Quick Controls de los cuales el primer conjunto vendrá en Qt 5.1.

# 1 en la creación de una gran experiencia de usuario

Qt es conocido por su capacidad para crear increíbles experiencias de usuario. Estamos trabajando duro para mantener la posición de Qt como marco de desarrollo de software que permite la creación de impresionantes interfaces de usuario con un rendimiento gráfico inmejorable. La nueva canalización de gráficos de Qt 5 es una de las piedras angulares para alcanzar este objetivo. Qt Quick 2 ofrece un escenario gráfico GL basado en un sistema de partículas y una colección de efectos de sombreado para lograr animaciones divertidas y frescas, entre otras cosas, así como Qt Graphical Effects y Qt Multimedia que permite al desarrollador aportar movimiento y sonido a la vida dentro de su aplicación. Vamos a seguir mejorando estas capacidades y que sea aún más fácil crear aplicaciones impresionantes con Qt.

Fuerte Ecosistema generación de valor

Además de trabajar activamente con la comunidad de desarrolladores a través del Proyecto Qt, nos aseguramos de que los eventos y actividades Qt son valiosos.

Este año, la Cumbre Colaboradores Qt y KDE Akademy se llevará a cabo en forma conjunta, en la que las dos comunidades pueden aprovechar de la experiencia de cada una. Creemos que trabajando juntos en el ecosistema podemos llevar conjuntamente Qt hacia adelante a una velocidad inigualable y beneficiarse de la creciente base de usuarios de los desarrolladores que hacen soluciones basadas en Qt en más de 70 diferentes industrias, incluyendo software libre.

Modelo de licencia dual

Creemos que el modelo de licenciamiento dual es de vital importancia para todo el ecosistema de Qt para prosperar, y que es la mejor manera de desarrollar Qt. Esto significa que queremos unir a todos los desarrolladores, organizaciones, empresas de todo el mundo, independientemente de la industria, el modelo de negocio, los tipos de dispositivos, etc para promover sus propios objetivos de desarrollo y estrategias de negocios.

A fin de mantener el liderazgo en Qt que permite la innovación en nuestro desarrollo, es importante que Qt esté disponible para los usuarios comerciales y la comunidad de código abierto y proporcionar la funcionalidad que satisfacer las diversas necesidades de ambos. Creemos en el poder del desarrollo open-source en el fomento de la innovación y el valor mucho todo lo que hacemos en conjunto con la comunidad de Qt a través del Proyecto de Qt. El modelo de licencia dual tiene dos objetivos en el impulso de Qt a seguir:

• Las Licencias Comerciales de Qt aseguran futuras inversiones en I + D con la estabilidad financiera necesaria para mantener a los equipos de ingeniería de Qt Digia, producen el desarrollo del código invaluable y contribuciones. Los ingresos generados por las ventas de licencias comerciales también permite que el proyecto Qt asegure, por ejemplo, la infraestructura, los repositorios y qt-project.org , los servidores y el desarrollo como un ámbito comunitario para el desarrollo de Qt donde todos puedan participar y contribuir.

• Las licencias de código abierto de Qt proporciona un medio incomparable para hacer Qt disponibles en todas partes para todo el mundo el aumento de la base de usuarios de Qt y la promoción de la adopción de la tecnología.

Los dos modelos anteriores funcionan mano a mano, una de nuestras metas es llevar Qt a todos, nosotros realmente creemos en licenciamiento dual también para el futuro.

Arquitectura Empresarial Abierta

Estrechamente relacionado con el fuerte ecosistema de generación de valor es la arquitectura de negocios abierto - un nuevo elemento en el ecosistema Qt. Creemos que permite más oportunidades de negocio para todo el mundo a través de Qt será beneficioso para todo el ecosistema. Arquitectura de negocios abierto es un principio que define las reglas para un terreno de juego, en el que todos están invitados a participar. En este punto, vemos esto como un principio, pero más tarde espero que seamos capaces de desarrollar toda la arquitectura de negocios de tal manera que haya negocio para todos.

Con un ecosistema Qt, creemos que Digia y otros actores de la comunidad pueden ofrecer productos de valor añadido de la funcionalidad, herramientas y servicios. Creemos que tener estos componentes adicionales disponibles no sólo proporciona más oportunidades de negocio para todas las empresas interesadas, sino también hacen más fuerte a Qt. Cuantas más soluciones prefabricadas estén disponibles para satisfacer las necesidades y desafíos de diversos sectores y casos de uso, más valor Qt ofrece a nuestros usuarios.

Valor añadido

Digia está tratando de crear valor añadido en principalmente las siguientes áreas:

• Valor agregado en funcionalidad especialmente para los usuarios de la empresa y en el espacio integrado.

• Mejora de las herramientas que proporcionan un tiempo de salida al mercado reducido y ahorro de costes para las empresas que utilizan Qt.

• Los servicios basados ​​en la nube que se pueden utilizar en combinación con soluciones construidas con Qt.

• Apoyo y servicios para el desarrollo de Qt.

Algunos ejemplos de estos ya están disponibles, por ejemplo, la biblioteca de gráficos y la mejora de Visual Studio Add-in, así como nuestro apoyo y oferta de servicios. Estamos trabajando en un nuevo backend basado en la nube para aplicaciones Qt llamados Enginio, que se presentó por primera vez en los días de desarrolladores Qt año pasado. Estamos muy cerca de lanzar la muestra de tecnología pública, así que estad atentos para ello.

Especialmente para nuestros clientes empresariales y embebidos, hemos estado trabajando con las herramientas adicionales que pueden ser conectados en el IDE de Qt Creator para hacer los desarrollos con Qt aún más eficiente, así como para satisfacer las crecientes demandas de nuestros clientes y las empresas que han optado por Qt como su opción de desarrollo estratégico y que requieren un compromiso total de Digia para tener éxito en su industria. Creemos que es posible proporcionar estos refinamientos de Qt para muchas industrias diferentes, y pretendemos desarrollar Qt y nuestras herramientas, para que también ofrezcan más a otros miembros de la comunidad de Qt.

En general, estamos muy contentos con el progreso del ecosistema Qt. Creo juntos seremos capaces de llevar Qt adelante a un ritmo récord y realmente hacer que sea la opción # 1 para las aplicaciones multi-plataforma y desarrollo de interfaz de usuario.

Bueno esto es todo, envíenos sus comentarios.

{ Leer Más }


sábado, 18 de mayo de 2013

Introducción a los servicios web con Spring y Apache CXF.

En esta primera entrega de la serie de servicios web con Spring veremos un ejemplo bastante sencillo de cómo usar Maven para crear y gestionar un proyecto de una aplicación web que expone un servicio y lo prueba internamente. La prueba externa la realizaremos usando la herramienta SOAPUI.

Para esta entrada hice uso de un tutorial que pueden encontrar en este blog: http://pfelitti87.blogspot.com/ realmente me pareció bastante sencillo y que funciona sin mucha modificación. Luego lo iremos incrementando con más elementos en otras entradas hasta tener un servicio web completamente funciona. En esta entrada solo quiero mostrarles cómo funciona lo básico.

Lo primero es tener un IDE de desarrollo, el eclipse STS de Spring en mí caso que ya viene con un plugin para Maven instalado, y crear un proyecto de Maven con el arquetipo para aplicaciones web.

Luego modificamos el pom del proyecto para que quede así:

&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

&lt;modelVersion>4.0.0&lt;/modelVersion>

&lt;groupId>com.maven.test&lt;/groupId>

&lt;artifactId>Spring-WS-CXF&lt;/artifactId>

&lt;packaging>war&lt;/packaging>

&lt;version>0.0.1-SNAPSHOT&lt;/version>

&lt;name>Spring-WS-CXF Maven Webapp&lt;/name>

&lt;url>http://maven.apache.org&lt;/url>

&lt;dependencies>

&lt;!-- Dependencias de Spring -->

&lt;dependency>

&lt;groupId>org.springframework&lt;/groupId>

&lt;artifactId>spring-web&lt;/artifactId>

&lt;version>3.2.2.RELEASE&lt;/version>

&lt;scope>compile&lt;/scope>

&lt;/dependency>

&lt;dependency>

&lt;groupId>org.springframework&lt;/groupId>

&lt;artifactId>spring-context&lt;/artifactId>

&lt;version>3.2.2.RELEASE&lt;/version>

&lt;scope>compile&lt;/scope>

&lt;/dependency>

&lt;!-- Dependencias de Apache CXF para servicios web -->

&lt;dependency>

&lt;groupId>org.apache.cxf&lt;/groupId>

&lt;artifactId>cxf-api&lt;/artifactId>

&lt;version>2.6.0&lt;/version>

&lt;scope>compile&lt;/scope>

&lt;/dependency>

&lt;dependency>

&lt;groupId>org.apache.cxf&lt;/groupId>

&lt;artifactId>cxf-rt-frontend-jaxws&lt;/artifactId>

&lt;version>2.6.0&lt;/version>

&lt;scope>compile&lt;/scope>

&lt;/dependency>

&lt;dependency>

&lt;groupId>org.apache.cxf&lt;/groupId>

&lt;artifactId>cxf-rt-transports-http&lt;/artifactId>

&lt;version>2.6.0&lt;/version>

&lt;scope>compile&lt;/scope>

&lt;/dependency>

&lt;!-- For testing purposes -->

&lt;dependency>

&lt;groupId>org.springframework&lt;/groupId>

&lt;artifactId>spring-test&lt;/artifactId>

&lt;version>3.2.2.RELEASE&lt;/version>

&lt;scope>test&lt;/scope>

&lt;/dependency>

&lt;dependency>

&lt;groupId>junit&lt;/groupId>

&lt;artifactId>junit&lt;/artifactId>

&lt;version>4.11&lt;/version>

&lt;scope>test&lt;/scope>

&lt;/dependency>

&lt;/dependencies>

&lt;build>

&lt;finalName>Spring-WS-CXF&lt;/finalName>

&lt;plugins>

&lt;!-- Con este plugin se puede iniciar jetty ejecutando mvn jetty:run -->

&lt;plugin>

&lt;groupId>org.mortbay.jetty&lt;/groupId>

&lt;artifactId>maven-jetty-plugin&lt;/artifactId>

&lt;version>6.1.26&lt;/version>

&lt;configuration>

&lt;scanIntervalSeconds>3&lt;/scanIntervalSeconds>

&lt;/configuration>

&lt;/plugin>

&lt;plugin>

&lt;groupId>org.apache.maven.plugins&lt;/groupId>

&lt;artifactId>maven-compiler-plugin&lt;/artifactId>

&lt;version>3.0&lt;/version>

&lt;configuration>

&lt;source>1.7&lt;/source>

&lt;target>1.7&lt;/target>

&lt;/configuration>

&lt;/plugin>

&lt;/plugins>

&lt;/build>

&lt;/project>


De esta manera ya tendremos todas las librerías descargadas y listas para ser usadas en el proyecto.

Luego crearemos los paquetes tal y como se muestran en la siguiente imagen, claro ustedes lo pueden modificar a su gusto:

image

Como pueden apreciar tengo una clase interface HelloWordService que tiene lo siguiente:

package org.blog.samples.webservices.Interface;

import javax.jws.WebService;

@SuppressWarnings("restriction")

@WebService

public interface HelloWorldService {

public void sayHello();

}

Vean la anotación @WebService que la uso para indicar que esta clase interface es para un servicio web.

Luego viene su implementación:

package org.blog.samples.webservices.Impl;

import org.blog.samples.webservices.Interface.HelloWorldService;

import javax.jws.WebService;

@SuppressWarnings("restriction")

@WebService(endpointInterface = "org.blog.samples.webservices.Interface.HelloWorldService")

public class HelloWorldServiceBean implements HelloWorldService {

public void sayHello() {

System.out.println("Hello World!!!");

}

}

En este caso la anotación tiene un parámetro que establece la interface del endpoint apuntando a la interfaz anterior.

Como pueden ver la implementación es bastante sencilla, pues no es mi intención en esta entrada llegar a una implementación real del servicio, solo los componentes necesarios que lo conforman.

Ahora creamos el fichero service-definition-beans.xml que lo pondremos en src/main/resources y que contendrá lo siguiente:

&lt;?xml version="1.0" encoding="UTF-8"?>

&lt;beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

&lt;bean id="helloWorldService" class="org.blog.samples.webservices.Impl.HelloWorldServiceBean" />

&lt;/beans>

Como pueden ver solo se está creando un bean normal en este fichero.

Ahora vamos a especificar el endpoint del servicio a través del siguiente fichero de configuración webservice-definition-beans.xml que se ubica en la carpeta WEB-INF de la aplicación web:

&lt;?xml version="1.0" encoding="UTF-8"?>

&lt;beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.1.xsd

http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

&lt;import resource="classpath:service-definition-beans.xml" />

&lt;jaxws:endpoint id="helloWorld" implementor="#helloWorldService"

address="/HelloWorld" />

&lt;/beans>

Aquí estamos creando un endpoint que tiene como implementador el bean que creamos en el fichero de configuracion anterior y estamos diciendo que su dirección relativa a la aplicación será /HelloWorld. Luego veremos qué es esto.

Ahora nos encargamos de como probar el servicio para que en caso de que haya un fallo la aplicación no sea creada, o pensando en positivo para crear la aplicación siempre que el servicio pase la prueba.

En este caso la prueba es un poco falsa pues poco hay que probar. Esta es la clase correspondiente:

package org.blog.samples.webservices.test;

import org.blog.samples.webservices.Interface.HelloWorldService;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations = { "/service-definition-beans-test.xml" })

public class HelloWorldServiceTest {

@Autowired

@Qualifier("helloWorldClient")

private HelloWorldService helloWorldClient;

@Test

public void helloWorldClientTest() {

helloWorldClient.sayHello();

}

}

Y el fichero service-definition-beans-test.xml es este:

&lt;?xml version="1.0" encoding="UTF-8"?>

&lt;beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.1.xsd

http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

&lt;jaxws:client id="helloWorldClient"

serviceClass="org.blog.samples.webservices.Interface.HelloWorldService"

address="http://localhost:8080/Spring-WS-CXF/HelloWorld" />

&lt;/beans>

Deben ubicarlo en el directorio resources de la aplicación web.

Como ven solo corremos una prueba que utiliza el bean del servicio anteriormente creado, mediante la anotación @Autowired y llama a la operación sayHello.

Si queremos ya podemos construir el war de nuestra aplicación y para eso lanzamos el comando Maven: mvn clean install aunque si ya estamos en el STS damos clic derecho encima del proyecto/Run AS/Maven build y ponemos algo como lo que se muestra en la siguiente imagen. Fíjense que hemos marcado que no se ejecuten las pruebas porque se intentará conectarse a la aplicación web que aún no está corriendo. Si lo quieren hacer desde la línea de comando pueden tirar lo siguiente: mvn clean install -Dmaven.test.skip=true

image

Ahora viene lo interesante porque podemos desde Maven ejecutar un servidor ligero para aplicaciones web y levantar automáticamente nuestra aplicación. Esto es gracias al plugin de Maven “maven-jetty-plugin”

Para eso hacemos lo siguiente:

image

O mvn jetty:run desde la línea de comando.

Esto nos levantará el servidor de jetty y desplegará nuestra aplicación así que ya podemos ejecutar nuestras pruebas a través del siguiente comando: “mvn test” o desde el eclipse, como gusten. Podrán ver la siguiente salida:

-------------------------------------------------------

T E S T S

-------------------------------------------------------

Running org.blog.samples.webservices.test.HelloWorldServiceTest

may 13, 2013 10:41:07 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions

Información: Loading XML bean definitions from class path resource [service-definition-beans-test.xml]

may 13, 2013 10:41:08 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh

Información: Refreshing org.springframework.context.support.GenericApplicationContext@134fd233: startup date [Mon May 13 22:41:08 EDT 2013]; root of context hierarchy

may 13, 2013 10:41:08 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons

Información: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@10554f8b: defining beans [helloWorldClient.proxyFactory,helloWorldClient,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor]; root of factory hierarchy

may 13, 2013 10:41:08 PM org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass

Información: Creating Service {http://Interface.webservices.samples.blog.org/}HelloWorldServiceService from class org.blog.samples.webservices.Interface.HelloWorldService

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.243 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------

[INFO] BUILD SUCCESS

[INFO] ------------------------------------------------------------------------

[INFO] Total time: 6.438s

[INFO] Finished at: Mon May 13 22:41:10 EDT 2013

[INFO] Final Memory: 12M/169M

[INFO] ------------------------------------------------------------------------

Si quieren probar la aplicación pueden ir a: http://localhost:8080/Spring-WS-CXF/

Y verán esto:

image

Si pinchan en el enlace podrán ver el WSDL del servicio que tiene el siguiente aspecto:

&lt;?xml version='1.0' encoding='UTF-8'?>

&lt;wsdl:definitions name="HelloWorldServiceBeanService" targetNamespace="http://Impl.webservices.samples.blog.org/" xmlns:ns1="http://Interface.webservices.samples.blog.org/" xmlns:ns2="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://Impl.webservices.samples.blog.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

&lt;wsdl:import location="http://localhost:8080/Spring-WS-CXF/HelloWorld?wsdl=HelloWorldService.wsdl" namespace="http://Interface.webservices.samples.blog.org/">

&lt;/wsdl:import>

&lt;wsdl:binding name="HelloWorldServiceBeanServiceSoapBinding" type="ns1:HelloWorldService">

&lt;soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

&lt;wsdl:operation name="sayHello">

&lt;soap:operation soapAction="" style="document"/>

&lt;wsdl:input name="sayHello">

&lt;soap:body use="literal"/>

&lt;/wsdl:input>

&lt;wsdl:output name="sayHelloResponse">

&lt;soap:body use="literal"/>

&lt;/wsdl:output>

&lt;/wsdl:operation>

&lt;/wsdl:binding>

&lt;wsdl:service name="HelloWorldServiceBeanService">

&lt;wsdl:port binding="tns:HelloWorldServiceBeanServiceSoapBinding" name="HelloWorldServiceBeanPort">

&lt;soap:address location="http://localhost:8080/Spring-WS-CXF/HelloWorld"/>

&lt;/wsdl:port>

&lt;/wsdl:service>

&lt;/wsdl:definitions>

De esta manera sabemos que el servicio está corriendo dentro de la aplicación desplegada con jetty.

Por último algo que siempre hago es probar el servicio, para eso uso el SOAPUI, pero esto lo dejaré para otra entrada para no extenderme más.

Quedo al tanto de sus comentarios.

{ Leer Más }


viernes, 17 de mayo de 2013

Servicios de datos con WSO2 para resolver el acceso a datos.

En la entrada Introducción a Spring JDBC como solución a los problemas de uso e JDBC en proyectos productivos veíamos cómo podíamos implementar el acceso a datos usando Spring JDBC y luego en la entrada Sustituyendo la capa de persistencia de Spring JDBC por Spring + Hibernate hacíamos lo mismo pero usando Spring + Hibernate + Anotaciones.

En esta entrada entonces quiero ilustrarles un posible problema y la solución que se le puede dar.

Asumamos que somos los desarrolladores de una aplicación donde una de las entidades es “capítulo” y que hemos creado un DAO para dicha entidad. Esto permite que se pueda acceder desde cualquier lugar de la aplicación a los datos de “capítulo” a través del DAO correspondiente, pero que pasa si otra aplicación por algún motivo justificado necesita acceder a esos mismos datos. ¿Cómo se hace?

Soluciones pueden existir 2 o 3, pero en mi caso quiero exponerles una que he usado bastante y que consiste en crear un servicio de acceso a datos que exponga a través de SOAP o REST un conjunto de operaciones CRUD sobre dicha entidad. Pueden ver esta solución en la siguiente imagen.

image

Como se puede ver en la imagen el “Sistema propio” bien puede optar por acceder a la entidad directamente en la BD o puede hacerlo vía el servicio web. El resto de las aplicaciones tiene ahora acceso a los datos de la entidad “Capitulo” de una forma controlada gracias al uso del AS o el DSS.

Las ventajas de este enfoque son:

  • Se desarrolla más rápido el acceso a la entidad, con tan solo 3 minutos tienes creado un servicio web que cumple con todos los estándares del Stack WS-*.
  • Se puede brindar acceso a los datos de la entidad a otras aplicaciones sin requerir nuevas implementaciones.
  • La aplicación dueña de la entidad puede seguir accediendo de la manera tradicional o empezar a hacerlo desde el servicio web. Aquí si el servicio web cumple con la misma interface con que cumplía la implementación usando JDBC o Hibernate no debe haber problema para hacer el cambio.
  • Al usar la plataforma de WSO2 al servicio se le pueden incorporar facilidades para la autenticación, autorización y auditorias que aseguren un correcto acceso a los recursos.
  • El servicio expuesto es interoperable e independiente de la tecnología, o sea que se puede consumir desde cualquier lenguaje de programación.

Desventajas:

  • Por lo general se dice que el acceso a los servicios es más lento que si se accede directamente a los recursos, y es algo cierto. Lo que se debe determinar es si la latencia introducida afecta la experiencia del usuario final o del sistema. Aquí temas como el cacheo de la información juegan un papel fundamental.
  • A los desarrolladores no les gusta tener fuera de su control funcionalidades del sistema y en este caso el servicio está fuera del sistema en un servidor externo, lo que requiere un acceso diferente a la BD.
  • Si solo se requiere un servicio web para 1 entidad, la solución dada puede ser como el ejemplo de usar un cañón para matar un mosquito. Algunas otras variantes como RMI o incluso Spring Web Services puede ser más interesante de implementar. Aunque si la empresa se encuentra dentro de una iniciativa SOA o en alguna implementación de una solución de integración si tiene mucho sentido implementar un servicio de acceso a datos. Esto último lo pueden ver en la siguiente entrada Introducción a SOA y BPM.

Para aquellos que quieran ver cómo implementar un servicio de acceso a datos usando la suite de WSO2 en solo 3 minutos los invito a que vean este enlace.

El servicio que se crea por esa vía contiene las operaciones CRUD básicas y lo bueno es que luego se puede modificar para ajustarlo a nuestras necesidades. Si alguien quiere hacerlo desde cero y no usar la funcionalidad de “Generate” pues lo puede hacer sin ningún problema.

En otras entradas estaremos viendo más de estos temas.

Palabras claves: servicio web, servicio de acceso a datos, WSO2, AS, DSS, SOAP.

{ Leer Más }


jueves, 16 de mayo de 2013

CodeIgniter y el Modelo Vista Controlador

Cuando se desea desarrollar un sistema informático, ya sea de mediana o gran envergadura, se impone utilizar alguna metodología de desarrollo, y poner en práctica patrones arquitectónicos y de software. Los patrones son modelos de diseño y desarrollo propuestos debido a la cantidad de aplicaciones informáticas que tienen características similares, y basados en experiencias y buenas prácticas de desarrolladores de todos los tiempos.

En el desarrollo web, uno de los patrones de uso recurrente es el patrón arquitectónico Modelo-Vista-Controlador[1] (MVC, del inglés Model-View-Controller ), el cual separa la lógica de la aplicación de su representación al usuario y la comunicación al modelo, como se representa en la figura 1.

clip_image002

Figura 1 Representación del patrón de arquitectura Modelo-Vista-Controlador (MVC).

Para este patrón la Vista es la representación de todos los elementos de interacción con los usuarios, es decir, la página web visualizada en el navegador del usuario, con los componentes de formularios, etc. El Modelo encierra las funcionalidades para interactuar con los datos, generalmente de tipo persistente, en este caso, en esta capa se ubican las funciones de interacción con la base de datos. El Controlador por su parte, maneja las entradas de la Vista, abstrayendo su procesamiento para finalmente aplicar los cambios en el modelo. Esto permite hacer cambios en el control sin afectar los elementos que conforman la Vista y el Modelo.

En otras palabras, un código como el siguiente no debería estar en un único fichero.php. Fíjese que he capturado un valor de la vista, he consultado la base de datos y he mostrado los resultados, todo en un mismo segmento de código:

<?php
$connection = pg_connect("dbname=usurios port=5432 user=postgres password=postgres");

$name = $_POST['userName'];
$sentence = "select * from usuarios where nombre = '".$name."'";
$query = pg_Exec($connection, $sentence);
$num_rows = pg_num_rows($query);

echo '<span style="font-weight: bold;"> Se encontraron '.$num_rows.' usuarios con ese nombre.</span>';
?>

Según el MVC debería existir un modelo que haga la consulta, una vista que muestre el resultado, y un controlador que capture el post de la vista, pase el valor al modelo, reciba el resultado de la consulta y la pase a la vista para ser mostrado.

Pues bien, el CodeIgniter (un framework o conjunto de herramientas para desarrollo de sitios web usando PHP), permite no solo desarrollar proyectos mucho más rápido que lo que podría hacer si escribiera el código desde cero, sino que además se basa en el modelo-vista-controlador, permitiendo una buena separación entre lógica y presentación, y permitiendo que las páginas web contengan un mínimo de codificación. En CodeIgniter las clases del modelo no son requeridas.

Veamos el ejemplo anterior, pero usando clases de CodeIgniter, en tres ficheros diferentes:

//en el fichero users_model.php
class Users_model extends Model {
function get_users_quantity($name)
{
$this->db->where('nombre', $name);
$query = $this->db->get('usuarios');

return $query->num_rows();
}

}

 

//en el fichero users.php
class Users extends Controller {
function quantity()
{
$name = $this->input->post('userName');
$this->load->model('users_model');
$data['quantity'] = $this->users_model-> get_users_quantity($name);
$this->load->view('public_view', $data);
}

}

 

//en el fichero public_view.php


echo '<span style="font-weight: bold;"> Se encontraron '.$quantity.' usuarios con ese nombre.</span>';



Bueno, hemos dividido el código en tres partes correspondientes al modelo, al controlador y a la vista. Como pueden ver, en la clase Users_model se hace la consulta a la base de datos; la clase controladora Users actúa como interfaz entre el modelo y la vista, pidiendo al modelo un resultando y cargando la vista, a la cual se le pasa el quantity dentro del arreglo data; y en el fichero public_view.php correspondiente a la vista se muestran los resultados, con una total abstracción de la lógica de control y la interacción con la base de datos.

Con esta arquitectura, nunca verás una página .php en la barra de direcciones de tu navegador, sino el nombre del controlador y la función, por ejemplo, el caso anterior sería accesible por la dirección:

http://sitio/users/quantity

Los ficheros con las clases deben ser colocadas en carpetas específicas dentro del directorio del sitio de CodeIgniter, como se muestra en la figura 2.

clip_image002[4]

Figura 2 Estructura de carpetas de CodeIgniter.

Bueno, en este artículo he comentado las ventajas de usar Codeigniter para proyectos web medianos y grandes, donde es necesario mantener una organización del código y una estructura que garantice rapidez y seguridad, así como la comodidad que brinda para implementar nuestro sitio siguiendo la arquitectura MVC. En próximos artículos comentaré otras ventajas de usar CodeIgniter.





[1] Bahsoon, R. y W Emmerich: Evaluating software architectures: development, stability and evolution. Julio 2003


{ Leer Más }


IconIconIcon