.
Para hacernos aún más fácil la vida, existen las RubyGems que es un sistema de empaquetar en Ruby. Un gem es un aplicación o librería de Ruby empaquetada, tiene un nombre (por ejemplo rake) y una versión (por ejemplo 0.4.16). La existencia de gems permite que: • •
•
Exista una forma estándar de distribuir los programas y librerías de Ruby, Tener una herramienta que permite el fácil manejo e instalación de los paquetes de gems, Un servidor de gems que permite disponer de las gems desde cualquier máquina donde RubyGems está instalado.
La información obtenida de la ejecución del comando sería (la hemos reducido considerablemente), ver Listado 1.
Instalación de una gem Si ejecutamos: gem install --remote progressbar # shortcut: gem i -r progressbar
la gem progressbar se instalará en el ordenador. Véase que no es necesario especificar la versión, pero si se desea se puede hacer. Por defecto se instalará la última versión disponible. Por lo tanto si queremos instalar una versión específica, haríamos:
Las gems se gestionan desde cada ordenador gem ins -r progressbar-0.0.3 utilizando el comando gem. Se pueden instalar, eliminar, buscar (entre otras posibilidades) pa- o
Listado de las gems disponibles Si ejecutamos:
gem ins -r progressbar --version '> 0.0.1'
Desinstalando una gem Si queremos desinstalar una gem, tan sólo tenemos que escribir lo siguiente. gem uninstall progressbar Successfully uninstalled progressbar version 0.0.3
gem query --remote
# atajo:
Listado de todas las gems instaladas:
gem q -R gem query --local
entonces obtendremos un listado de todas # atajo: 'gem q -L' las gems que se encuentren en el servidor remoto. Instalando Ruby on Rails Para la instalación de Ruby on Rails, podemos hacerlo de dos formas, manualmente haciendo uso de las gems, como hemos visto en el apartado anterior, o bien usando otras herramientas específicas para cada sistema operativo:
Para usuarios de Debian o Ubuntu Primero tenemos que instalar Ruby sudo aptget install ruby irb rdoc Luego instalamos las gems, descargando un fichero de http://rubyforge.org/frs/?group_ id=126&release_id=5803 y descomprimiéndolo en nuestro ordenador (ver Figura 2). tar zxvf rubygems-0.9.0.tgz
luego vamos al directorio creado Figura 2. Rubyforge.org, sitio de proyectos open source en Ruby
60
cd rubygems-0.9.0
Linux+ 3/2007
para programadores Ruby on Rails: ¿nos gusta porque está de moda o porque lo vale? y ejecutamos: ruby setup.rb all
Los archivos deberán ser descargados en ruby script/server un sólo directorio y los comandos ejecutados en ese directorio. Creamos un controlador
Ahora instalamos Rails:
gem install rake-0.7.1.gem
ruby script/generate controller test
gem install activesupport-1.3.1
Verás que se crean una serie de directorios y ficheros, entre ellos tienes que encontrar gem install actionmailer-1.2.5.gem directorio_trabajo_rails/ejemplo/app/controllers/ gem install actionwebservice-1.1.6.gem test_controller.rb. gem install rails-1.1.6.gem Al controlador vamos a agregar un método index: Muy bien hasta aquí ya debemos tener instalado Ruby y Rails satisfactoriamente. class TestController < Ahora que menos que escribir un clásico ActionController::Base con Rails, cómo escribir hola mundo en nuesdef index tro navegador con Rails. end En primer lugar tendremos que crear end nuestro proyecto rails con Una vez hecho esto, crearemos la vista para rails MiProyecto esta acción que acabamos de crear, en direc-
gem install rails –include-
gem install activerecord-1.14.4.gem
dependencies
gem install actionpack-1.12.5.gem
Para poder empezar con Rails vamos a necesitar un servidor web, por defecto instala Webrick. Para ponerlo en marcha, tenemos que ejecutar: script/server -d -p 3000
Y necesitaremos una base de datos como MySQL, que tendremos que tener instalada además de alguna librería extra como libmysql-ruby (para el caso de MySQL, pero se podría usar otra bases de datos cmo PostreSQL)
Para usuarios de Mac Os X En el sistema Mac OsX existe una herramienta muy sencilla que permite la instalación y facilita el desarrollo en Rails, se denomina Locomotive (http://locomotive.raaum.org/) Locomotive está disponible como binario universal, tanto para arquitectura de PowerPC como Intel (como requisito tiene que ser Mac OS X 10.3 o posterior) . Será necesario tener instalado las herramientas Xcode para poder usar las rubygems y compilar código nativo.Por defecto, el servidor web será lighttpd con FastCGI y la base de datos que usará será SQLite, pero también se puede enganchar a MySQL y PostgreSQL. Se puede instalar manualmente también siguiendo las instrucciones que aparencen en:
torio_trabajo_rails/ejemplo/app/views/test crea un archivo llamado index.rhtml y dentro escribimos el texto Mundo Hola desde RoR!, lo grabas y si accedes desde el navegador a http://localhost:3000/test/ verás tu primera incursión en Rails. Digamos que te controlador test es el controlador principal de tu aplicación, lo ideal es que los usuarios entren a tu página a través de simplemente escribiendo tudominio.com, ruby script/server y no teniendo que escribir tudominio.com/ test , para lograr esto editemos directorio_tray si todo ha ido bien, accediendo a http: bajo_rails/ejemplo/config/routes.rb: descomenta//localhost:3000 veremos una pagina de bien- mos la línea venida de Rails. De momento nuestra aplicación no hace # map.connect '', :controller => nada, así que vamos a crear un controlador "welcome" quedaría así: con map.connect '', :controller => "test": este comando crea toda la estructura de ficheros y directorios necesarios. Ahora para comprobar que nuestra instalación es correcta ponemos en marcha el servidor web que viene con Ruby, Webrick, en la línea de comandos, desde dentro del directorio del proyecto que acabamos de crear, escribimos:
+info http://hivelogic.com/articles/ 2005/12/01/ruby_rails_lighttpd_mysql_ tiger
Para usuarios de Windows En Windows podemos echar mano de Instant Rails (http://instantrails.rubyforge.org/wiki/ wiki.pl) , que contiene Ruby, Rails, Apache y Mysql, todo preconfigurado y listo para usar. Tendrás que descargar un fichero zip, descomprimirlo en un directorio, y en dicho directorio ejecutar InstantRails.exe. Instant Rails detectará preguntará si quieres actualizar las rutas en todos los ficheros de configuración...pulsa sobre el si. Para una instalación manual debemos descargarnos cada uno de los módulos: Figura 3. Loudthinking, blog personal del desarrollador de Rails David Heinemeier Hansson
www.lpmagazine.org
61
para programadores Ruby on Rails: ¿nos gusta porque está de moda o porque lo vale? Y como nos indican unas líneas arriba, debemos borrar el archivo directorio_trabajo_rails/ ejemplo/public/index.html y ahora si se podría acceder a través de http://localhost:3000/. Lo más común es hacer aplicaciones que accedan a una base de datos y hagan operaciones (insertar, actualizar, borrar) en la misma. Una forma sencilla de hacer esto es con lo que en rails se denomina scaffolding. Primero creamos en la base de datos una tabla que se llame recetas, por ejemplo, si queremos hacer una base de datos de recetas. Configuramos el acceso desde rails en el fichero database/config.yml y ahora tenemos dos opciones, crear el modelo y el controlador Receta:
Listado 1. Gems en servidor remoto activerecord (0.8.4, 0.8.3, 0.8.2, 0.8.1, 0.8.0, 0.7.6, 0.7.5) Implements the ActiveRecord pattern for ORM.
BlueCloth (0.0.4, 0.0.3, 0.0.2)
BlueCloth is a Ruby implementation of Markdown, a text-to-HTML conversion tool for web writers.
Markdown allows you to write using an easy-to-read, easy-to-write plain text format, then convert it to structurally valid XHTML (or HTML). captcha (0.1.2) Ruby/CAPTCHA is an implementation of the 'Completely Automated Public Turing Test to Tell Computers and Humans Apart'. cardinal (0.0.4) Ruby to Parrot compiler. cgikit (1.1.0)
ruby script/generate model Receta
CGIKit is a componented-oriented web application
ruby script/generate controller Receta
framework like Apple Computers WebObjects.
This
framework services Model-View-Controller architecture
y en el fichero del controlador poner:
programming by components based on a HTML file, a definition file and a Ruby source.
class RecetaController <
Si queremos buscar gems en el servidor remoto para posteriormente poder
ActionController::Base
instalarlas, lo haríamos de la siguiente forma:
scaffold :receta
gem query --remote --name-matches doom
end
# atajo: gem q -R -n doom Se obtiene como resultado lo siguiente:
De esta forma se generan dinámicamente todos *** GEMS EN SERVIDOR REMOTO*** los métodos necesarios para añadir, modificar ruby-doom (0.8, 0.0.7) y borrar recetas en nuestra base de datos. Esta Ruby-DOOM provides a scripting API for creating DOOM forma puede servir para aplicaciones muy senmaps. It also provides higher-level APIs to make map cillas en las que no necesitemos nada más. creation easier. Otra opción es usar un generador que crea todos los ficheros con el código de la dades, sencillez, simplicidad, elegancia, pero lento o en genérico los lenguajes interpretados opción anterior: también nos encontramos ante ciertos peros, son lentos. que son los que en muchas ocasiones frenan Ante eso, encontramos como respuesta ruby script/generate scaffold Receta a los desarrolladores a usar Rails, veamos si en el blog de DHH, www.loudthinking.com, realmente son “peros” consistentes. algo que es parte de la propia filosofía de De esta forma podemos tomar este código coRails, no se busca un lenguaje o entorno de mo base y modificarlo para adaptarlo a nues- Rendimiento y escalabilidad programación que sirva para todas las situatra aplicación. Generalmente uno de los problemas que se ciones, no hay que reinventar la rueda, sino Hasta ahora, estamos viendo que en Rails asocian a Rails es el rendimiento y la escala- saber en qué momento qué herramientas hay la mayor parte de las cosas son ventajas, facili- bilidad, por un lado, se dice porque Ruby es que usar, Rails está orientado a desarrollo web, si en algún momento la aplicación tiene un cuello de botella, quizá la forma de eviRails J2EE tarlo sea usando otro lenguaje (C, C++, Java) que haga determinada tarea de forma óptima, puede que parezca hacer trampa, pero es una Tomcat Servlet Container Container Webrick forma que casos específicos en los que el rendimiento pueda ser peor no determinan el ActionServlet DispatchServlet M-V-C desarrollo general de una aplicación web. ActionController
RHML
Action
ActionForm
Active Record
Persistence
Hibernate
MySQL
Database
MySQL
Figura 4. Tabla comparativa de Rails y J2EE
62
Linux+ 3/2007
JSP
Performance
Definitivamente, una debilidad de Ruby poco conocida (o poco publicitada), es su baja performance en velocidades de ejecución. Los benchmarks en diversos equipos y con distintas rutinas señalan a Ruby como un lenguaje lento, en comparación con PHP4, y más
para programadores Ruby on Rails: ¿nos gusta porque está de moda o porque lo vale? Por otro lado, el concepto de Rails como Framework MVC + ActiveRecord, ideal para el desarrollo ágil de sitios Web 2.0, seguramente no es la panacea universal ni la solución definitiva, ya que podemos encontrar otras posibles soluciones en otros lenguajes: • • •
Cake (PHP). Anteriormente citado, Django (Python), Trails (Java).
Estos funcionan tan bien o inclusive mejor que RoR, dependiendo del sistema con el que estamos lidiando.
Flexibilidad vs. Organización
En muchos casos se oye decir a desarrolladores web que RoR está más organizado y es más estructurado mientras que PHP es más flexible. Tanto Ruby como PHP son lenguajes de scripting con propósito similar. La organiza-
Figura 5. Amazon apuesta por Rails en su sitio unspun.amazon.org lento aun en comparación a PHP5. Como PHP es un lenguaje de script, extrecontrapartida, posee una excelente gestión de madamente liberal, no lo ata con ninguna memoria, superior a las 2 versiones de PHP tecnología extra y su forma de uso está más en el mercado actual. basado en la programación estructurada, influencia del lenguaje C. Sin embargo RoR Comparando Rails con PHP es un entorno de programación basado en Cuando aparece alguna novedad siempre Ruby, siendo Ruby un lenguaje orientado a hay tendencia a hacer comparaciones, cuan- objetos 100%. do en muchos casos tampoco tiene mucho La mejora del modelo de OOP en PHP5 sentido hacerlas. ha traído aparejado el surgimiento de un En el caso de establecer una comparación número importante de entornos de prograentre PHP y RoR, se parte de un error de base, mación (Cake, PRADO, Symfony, etc.) que se no son comparables, ¿podríamos hacer una van agregando al lote del Zend Framework, comparación entre peras y manzanas? ¿Por aunque ninguno logra imponerse fuertemenqué se genera esta falsa comparación? te sobre el resto. P
64
U
B
L
I
C
Linux+ 3/2007
I
D
A
D
ción que le dota Rails a Ruby bien se la puede entregar cualquier Framework a PHP, como ser algunos de los citados anteriormente.
Comparando Rails con Django
Django es uno de los entornos de programación más competente para el desarrollo web en Python. Es destacable en primer lugar porque está altamente reconocido por parte de los programadores de Python y en segundo lugar es un entorno de programación de nueva generación que no necesita copiar Ruby on Rails. Django y Rails aspiran a resolver un tipo de problemas similares, de una manera similar, usando una arquitectura similar. En
para programadores Ruby on Rails: ¿nos gusta porque está de moda o porque lo vale? IBM ha añadido Ruby on Rails a la lista de entornos de programación para DB2, entre los cuales también se incluyen Java, .Net y PHP. Odeo, es un portal de podcasting con millones de visitas. La coctelera, ha desarrollado The Shaker, una herramienta para la publicación y administración de contenidos en Internet, es un servidor de blogs, que se caracteriza por su sencillez, facilidad de uso y usabilidad.
Conclusión
Figura 6. La coctelera, servidor de blogs en español desarrollado en Rails por The-Cocktail la actualidad no parece que haya especiales ventajas técnicas en cambiar de entorno de programación para un grupo desarrollador de Django a Rails y viceversa. Para los desarrolladores que no se encuentran utilizando ninguno de los dos entornos de programación para la implementación web, pero que sin embargo utilizan Python o Ruby, pues lo lógico es que los primeros se beneficien de Django y los segundos de Rails, aprovechando los conocimientos adquiridos que tiene en los respectivos lenguajes de script. Para desarrolladores que no conozcan ninguno de los dos lenguajes pues la elección dependerá del tipo de entorno de desarrollo y del tipo de aplicación.
Comparando Rails con J2EE
Uno de los debates más acalorados a la hora de comparar Rails con otros entornos de programación ya existentes, es el que existe entre Rails y J2EE. Si observamos la figura a continuación, veremos que son pocas las diferencias reales entre los elementos que componen una aplicación web. ambos tiene un contenedor en el que el código de la aplicación se ejecutará, un entorno MVC que facilita la separación entre el modelo, la vista y el controlador y la existencia de un mecanismo que permite que los datos sean persistentes Por lo tanto posiblemente no sea tanto la parte técnica lo que diferencia ambos entornos de programación sino la filosofía que siguen los desarrolladores de cada uno de los entornos, mientras Rails prefiere tener código explícito en lugar de ficheros de configuración, el hecho de que Ruby sea un lenguaje más ágil y permite generar con
Hemos visto de una manera rápida, las principales características de Ruby on Rails, las ventajas que tiene, la agilidad, facilidad de desarrollo, es un lenguaje cuya lectura es accesible a primera vista, está pensado para potenciar la usabilidad en las aplicaciones. También hemos visto alguno de los puntos flacos de los que se acusa a Rails, como es el rendimiento, aunque se podría decir que en estos momentos la inversión de personal de desarrollo es mayor que la
código en tiempo de ejecución. Generalmente Rails se basa en proyectos individuales, y la aplicación puede definir componentes homogéneos. En cambio, en J2EE la tendencia es desarrollar los mejores componentes de manera independiente uno de otro, y se utiliza XML para la configuración y unión de los distintos componentes.
inversión en hardware, con lo cual habría que evaluar realmente qué necesita la aplicación que tengamos entre manos. Sin embargo, desde la experiencia de Dabne como empresa que desarrolla en Rails, sólo hemos visto ventajas, la existencia de conveciones ahorran tiempo, evita reprogramación de cierto código, el scaffolding permite poder poner en marcha una aplicación de manera rápida, para emplear Grandes y no tan el tiempo en las partes más específicas de la grandes usan Rails aplicación, además existe una comunidad de En muchas ocasiones se señala a Rails como rails muy activa, lo cual siempre es una buena una apuesta vana, con escasa trascendencia forma de aterrizar en algo nuevo. porque no está siendo utilizado como entorno de programación en sitio grandes, con gran cantidad de tráfico. Sin embargo hemos de En la red tener en cuenta que Rails apenas ha sido publico hace poco más de 3 años, lo cual puede ser • Sitio oficial de Rails en español: una razón para pensar que la implementación rubyonrails.org.es/. de sitios web no es automática, aún así si mi- • Lista de correo de rails en español: ramos con detalle, veremos que son múltiples http://lists.simplelogica.net/mailman/ las apuestas por el uso de Rails en empresas listinfo/ror-es. grandes y desde luego en las no tan grandes. • Blogs: Veamos algunos ejemplos de donde se http://www.lacoctelera.com/railes, está utilizando Rails, sin incluir a las plataforhttp://www.shinkitune.com/blogonrails/, mas creadas por los propios creadores de RoR http://sobrerailes.com/. (37 signals o Basecamp): • Fuentes: Amazon usa Rails en Amazon Unspun, http://rubyforge.org/, ejemplo de aplicación de la web 2.0 donde http://rubygems.org/. la intención es llegar a consensos colectivos sobre cualquier tipo de tema, dando la posibilidad a los usuarios de crear listas y sobre la temática elegida poder establecer un consen- Sobre la autora so de si es bueno, malo, divertido, etc. Carolina García Cataño es socia de la Leopard, la nueva versión del sistema empresa Dabne-Tecnologías de la inforoperativo Mac OsX incluirá por defecto, el mación. Podéis escribirle a carolina.garci entorno de programación de aplicaciones
[email protected]. web de Ruby On Rails.
www.lpmagazine.org
65
www.buyitpress.com ¡Suscríbete a tus revistas favoritas y pide los números atrasados!
¡Regalos para nuevos suscriptores!
Ahora te puedes suscribir a tus revistas preferidas en tan sólo un momento y de manera segura. Te garantizamos: • precios preferibles, • pago en línea, • rapidez en atender tu pedido. ¡Suscripción segura a todas las revistas de Software-Wydawnictwo!
Pedido de suscripción Por favor, rellena este cupón y mándalo por fax: 0048 22 887 10 11 o por correo: Software-Wydawnictwo Sp. z o. o., Bokserska 1, 02-682 Varsovia, Polonia; e-mail:
[email protected] Nombre(s) ...................................................................................................
Apellido(s) ..................................................................................................
Dirección .............................................................................................................................................................................................................................. C.P. ..............................................................................................................
Población ....................................................................................................
Teléfono .....................................................................................................
Fax ...............................................................................................................
Suscripción a partir del No ................................................................................................................................................................................................... e-mail (para poder recibir la factura) .................................................................................................................................................................................. o Renovación automática de la suscripción
Título
número de ejemplares al año
Sofware Developer’s Journal Extra! (1 CD-ROM) – el antiguo Software 2.0 Bimestral para programadores profesionales
número de suscripciones
a partir del número
Precio
6
38 €
Linux+DVD (2 DVDs) Mensual con dos DVDs dedicado a Linux
12
69 €
Hakin9 – ¿cómo defenderse? (2 CD-ROM) Mensual para las personas que se interesan por la seguridad de sistemas informáticos
12
69 €
Linux+Pack (7 CD-ROMs) Las distribuciones de Linux más populares
8
65 €
MSCoder (2 CD-ROM) Independent magazine for developers using Microsoft platforms
6
38 € En total
Realizo el pago con:
□ tarjeta de crédito (EuroCard/MasterCard/Visa/American Express) nO Válida hasta
□ transferencia bancaria a BANCO SANTANDER CENTRAL HISPANO Número de la cuenta bancaria: 0049-1555-11-221-0160876 IBAN: ES33 0049 1555 1122 1016 0876 código SWIFT del banco (BIC): BSCHESMM
Fecha y firma obligatorias:
CVC Code
para programadores OpenXava
OpenXava: J2EE rápido y fácil
Javier Paniza Lucas
[email protected]
Java es, sin duda, el lenguaje de programación más popular que existe. Esto indica el índice TIOBE, es el lenguaje con más proyectos en Sourceforge, es apoyado incondicionalmente por los grandes de la industria (IBM, Oracle, SAP, Sun, Google, etc.). La relación entre Java y Linux siempre ha sido buena.
M
uchos servidores de aplicaciones Java corren sobre Linux, además una hegemonía total de Windows hubiera quitado interés a una tecnología multiplataforma como Java. Pero a pesar de todo esto, la tecnología Java, especialmente la tecnología Java de servidor, J2EE, es rechazada por muchos programadores Linux, porque parece una tecnología muy compleja y poco productiva en comparación con otras alternativas para Linux. OpenXava es un marco de trabajo que permite desarrollar aplicaciones J2EE de forma rápida y sencilla.
J2EE (Java 2 Extremadamente Enredado)
J2EE (ahora Java EE 5) es el estándar Java para servidores de aplicaciones. Un servidor de aplicaciones nos permite tener las aplicaciones instaladas en un servidor web y poder usarlas desde el cliente usando un simple navegador de Internet, se puede decir que un servidor J2EE es algo parecido a PHP + MySQL pero con Java; la principal diferencia es que un servidor J2EE posee un conjunto mínimo de servicios, JSP (páginas dinámica), JMS (mensajes asíncronos), EJB (transacciones, persistencia, objetos dis-
68
Linux+ 3/2007
tribuidos) y muchos más, que son muy útiles para desarrollar aplicaciones críticas de empresa. Si hacemos una aplicación J2EE, ésta podrá ser desplegada en cualquier servidor de aplicaciones que cumpla el estándar. Ejemplos de servidor de aplicaciones J2EE, son el IBM WebSphere Application Server, el BEA Weblogic, o el JBoss (que ahora pertenece a RedHat). La mayoría de bancos y grandes empresas confían en esta tecnología para desarrollar sus nuevos sistemas críticos. J2EE es un estándar de la industria. Ahora bien, cuando nosotros, simples programadores, intentamos desarrollar una aplicación de gestión con J2EE
Sobre el autor Javier Paniza Lucas desarrolla aplicaciones J2EE destinadas a la administración pública desde 1999, dentro de la empresa Gestión 400. Actualmente participa activamente (también desde Gestión 400) en el proyecto de código abierto OpenXava.
para programadores OpenXava
Listado 1. Cliente.xml: Componente de negocio Cliente
Listado 3. Factura.xml: Componente de negocio Factura
"ISO-8859-1"?>
<entidad> <propiedad nombre="codigo" tipo="String" clave="true" longitud="5" requerido="true"/> <propiedad nombre="nombre" tipo="String" longitud="40" requerido="true"/> <mapeo-entidad tabla="CUSTOMERS"> <mapeo-propiedad propiedadmodelo="codigo" columna-tabla= "ID"/> <mapeo-propiedad propiedadmodelo="nombre" columnatabla="NAME"/>
nos encontramos con que tenemos que ser expertos en orientación a objetos, diseñar una arquitectura de nuestro sistema, conocer un catálogo inmenso de patrones de software, utilizar varios marcos de trabajos y tecnologías (Struts, Hibernate, etc). Al final, lo que antes hacíamos en una hora con unos cuantos clics de ratón, ahora nos hace falta escribir 15 clases Java, varios archivos XML, varios JSP. Necesitamos 4 programadores expertos para poder hacer una simple aplicación de gestión. Es una pena, porque Java, además de ser ubicuo, es un lenguaje divertido, elegante, potente, y no es intrínsecamente complicado, lo es J2EE, y a veces las aplicaciones que nosotros (los programadores Java) hacemos.
<entidad> <propiedad nombre="anyo" tipo="int" clave="true" longitud="4" requerido="true"> <propiedad nombre="numero" tipo="int" clave="true" longitud="6" requerido="true"/> <propiedad nombre="fecha" tipo="java.util.Date" requerido="true"> <mapeo-entidad tabla="FACTURAS"> <mapeo-propiedad propiedad-modelo="anyo" columna-tabla="FACANO"/> <mapeo-propiedad propiedad-modelo="numero" columna-tabla="FACNUM"/> <mapeo-propiedad propiedad-modelo="fecha" columna-tabla="FACFEC"/> <mapeo-referencia referencia-modelo="cliente"> <detalle-mapeo-referencia columna-tabla="FACCLI" propiedad-modelo-referenciado="codigo"/>
Por otra parte J2EE es una plataforma con muchas bondades, y ahí es donde entra en juego OpenXava, ya que nos permite desarrollar aplicaciones de forma rápida y sencilla, pero el resultado son aplicaciones J2EE, desplegables en cualquier servidor de aplicaciones Java.
do Java (y en general en el mundo OO). Un marco de trabajo es una aplicación casi acabada, en la que tenemos algunos huecos. El programador que quiera hacer una aplicación final nueva, solo tiene que coger el marco de trabajo y rellenar esos huecos. Un marco de trabajo es útil cuando nos encontramos varias aplicacioOpenXava: Un marco de trabajo nes con una estructura parecida. OpenXava es Los marcos de trabajos son una técnica de un marco de trabajo para desarrollar aplicareutilización del código muy usada en el mun- ciones de gestión. Si necesitamos desarrollar
Listado 2. aplicacion.xml: Definición de los módulos de la aplicación
<modulo nombre="Clientes"> <modelo nombre="Cliente"/>
Figura 1. Modo lista del módulo de clientes
www.lpmagazine.org
69
para programadores OpenXava aplicaciones de gestión (facturación, control de almacén, contabilidad, inventario, nóminas, etc.) OpenXava es una opción a considerar. Pero la mejor forma de conocer OpenXava es mediante un ejemplo.
Componentes de negocio
OpenXava está orientado a componentes de negocio. Las piezas básicas para construir una aplicación con OpenXava son los componentes de negocio. Un componente de negocio agrupa toda la información referente a un concepto de negocio. Un concepto de negocio puede ser Albarán, Factura, Cliente. Un componente de negocio se declara en OpenXava usando XML. Es realmente sencillo. Por ejemplo, si quisiéramos declarar un componente de negocio Cliente, escribiríamos un archivo Cliente.xml con este contenido (ver Listado 1). Todo, absolutamente todo lo que el sistema necesita saber para trabajar con el concepto de cliente está en este archivo Cliente.xml. En este caso es todavía simple, de momento solamente indicamos las propiedades del componente y su mapeo a la base de datos, pero en Cliente.xml podemos definir las validacio nes, los cálculos, la presentación de datos tabulares, la disposición de la interfaz gráfica, etc. Vamos a ver qué puede hacer OpenXava a partir de una definición de componente como ésta.
Módulos y controladores reutilizables
Si queremos que este componente funcione y el usuario pueda trabajar con él tenemos que registrarlo en nuestra aplicación; esto se hace con un archivo llamado aplicacion.xml, de la siguiente forma (Listado 2). Y con solamente esto, sin nada más, sin ni siquiera una línea de código Java, Open
Listado 4. Factura.xml: Añadimos una colección de líneas a la Factura. ...
<entidad> ... <propiedad nombre="oid" oculta="true" tipo="int" clave="true"/> <propiedad nombre="descripcion" tipo="String" longitud="60" requerido="true"/> <propiedad nombre="importe" estereotipo="DINERO" requerido="true"/> <mapeo-entidad tabla="FACTURAS"> ... <mapeo-agregado agregado="LineaFactura" tabla="LINEAS"> <mapeo-referencia referencia-modelo="factura"> <detalle-mapeo-referencia columna-tabla="LINANO" propiedad-modelo-referenciado="anyo"/> <detalle-mapeo-referencia columna-tabla="LINFAC" propiedad-modelo-referenciado="numero"/> <mapeo-propiedad propiedad-modelo="oid" columna-tabla="LINID"/> <mapeo-propiedad propiedad-modelo="descripcion" columna-tabla="LINDES"/> <mapeo-propiedad propiedad-modelo="importe" columna-tabla="LINIMP"/>
Xava genera una aplicación como la en la Figura 1. El usuario puede filtrar, ordenar, generar informes en PDF, añadir o quitar campos a la lista, consultar en modo detalle cualquier objeto, borrar, modificar, etc. Y nosotros no hemos tenido que programar toda esta lógica.
El truco está en que el controlador Typical, que nosotros hemos asociado en el archivo aplicacion.xml a nuestro componente Cliente, tiene esta lógica reutilizable incluida. Un controlador es un conjunto de acciones que puede ejecutar el usuario. OpenXava viene con un nutrido conjunto de controladores reutilizables incluidos, pero nosotros siempre tenemos la posibilidad de refinar su comportamiento y, por supuesto, crear nuestros propios controladores.
Referencias y valores por defecto
A primera vista pudiera parecer que OpenXava sirve para hacer mantenimientos sencillos de tablas simples. Nada más lejos, las capacidades de OpenXava nos permiten modelar prácticamente cualquier sistema de gestión. Entre otras cosas OpenXava permite definir referencias y colecciones en el más puro estilo orientado a objetos. Vamos a verlo definiendo una primera versión de un componente Factura (ver Listado 3).
Figura 2. Modo detalle del módulo de clientes
70
Linux+ 3/2007
para programadores OpenXava
Listado 5. CalculadorSumaImportes.java: Clase Java con la lógica para sumar los importes. package org.openxava.lpmagazine.ca lculadores; import java.math.*; import java.rmi.*; import java.util.*; import org.openxava.calculators.*; import org.openxava.lpmagazine.mo delo.*;
public class CalculadorSumaImportes implements IModelCalculator { private Factura factura;
public Object calculate() throws Exception {
BigDecimal result = new BigDecimal("0.00");
for (Iterator it = factura.getLinea s().iterator(); it.hasNext(); ) {
LineaFactura linea = (LineaFactura) it.next(); result = result.add(linea.getImpo rte()); }
return result; }
factura puede tener varias líneas, por eso se modela como una colección. Y de agregados porque las líneas de la factura forman parte de la factura, no tienen vida propia (no son entidades), se borran cuando una factura se borra y no son compartidas por más de una factura. Puede que los conceptos de colección y agregado parezcan un poco extraño al principio, pero son naturales y muy fáciles de usar, lo veremos con un ejemplo. Para definir las líneas de la factura modificaremos nuestro componente Factura añadiendo el siguiente código (Listado 4.). Con el resultado de la Figura 4. El agregado LineaFactura se define en el mismo Factura.xml ya que LineaFactura solamente se va a utilizar desde Factura. La interfaz gráfica permite al usuario añadir, editar y borrar líneas. Cuando una factura se borra, todas sus líneas desaparecen con ella. Hemos visto un ejemplo de una colección de agregados, pero también es posible definir una colección a otras entidades, por ejemplo, si nos interesara que el Cliente tuviese una colección de sus facturas esto se definiría de la siguiente forma en Cliente.xml:
public void setModel(Object model)
this.factura = (Factura) model;
}
Y OpenXava generaría el código Java y la interfaz gráfica adecuada.
throws RemoteException { }
Listado 6. Factura.xml: Definición de la vista (representación visual) para la Factura. ...
<entidad> ... ... <miembros> anyo, numero, fecha; <seccion nombre="cliente"> cliente <seccion nombre="lineas"> lineas <seccion nombre="importes"> sumaImportes <mapeo-entidad tabla="FACTURAS"> ... <mapeo-agregado agregado="LineaFactura" tabla="LINEAS"> ...
Cuya representación sería como en la Figura 3. Vemos como con la simple línea de XML:
Es suficiente para definir una referencia, y que nuestra interfaz gráfica ya visualiza automáticamente la referencia al cliente en la factura, y ofrece la posibilidad de buscar clientes o crear nuevos. También observamos como el formulario contiene relleno por defecto el año y la fecha. Esto se hace mediante los calculadores valor defecto, estos calculadores se ejecutan justo al pulsar la acción nuevo para crear una nueva factura. Los calculadores son clases Java que podemos escribir nosotros, aunque en este caso se han utilizado calculadores estándar que vienen incluidos en OpenXava.
Agregados y colecciones
Ahora necesitamos que nuestra factura tenga líneas. Para eso vamos a crear una colección de agregados. Una colección porque una Figura 3. Visualización del componente Factura con una referencia
www.lpmagazine.org
71
para programadores OpenXava
Distribución de la vista
OpenXava no es un lenguaje de definición de interfaces gráficas (como XUL o XForms), más bien genera automáticamente la interfaz gráfica a partir del modelo. Sin embargo, podemos definir vistas para distribuir la información visualmente de formas más agradable y práctica. Veamos cómo. En Factura.xml podemos insertar este código (Listado 6). El resultado visual sería como en la Figura 6. Hemos usado la definición de la vista para indicar que miembros queremos que aparezcan, y como nos gustarían que se clasificaran (usando las secciones). Es OpenXava el que convierte esa definición en una interfaz gráfica final, implementando las secciones como pestañas, por ejemplo. Gracias al nivel de abstracción alto al definir vistas no sería difícil generar a partir de la misma ap-
Figura 4. Visualización del componente Factura con su colección de líneas
Lógica propia
Hasta ahora hemos visto como nosotros hacemos unas simples declaraciones con la estructura de nuestros datos y OpenXava genera toda la aplicación por nosotros. Esto es rápido, pero puede hacer parecer a OpenXava un poco rígido; esto no es así. OpenXava ofrece mucha flexibilidad a la hora de añadir o refinar su comportamiento estándar, prácticamente toda la funcionalidad que ofrece una aplicación OpenXava se puede refinar. Aquí vamos a ver el caso más sencillo, que es insertar un cálculo cuya lógica vamos a programar nosotros. Esto se hace definiendo una propiedad calculada. Vamos a definir una propiedad calculada para calcular la suma de los importes en la la factura. Editamos el archivo Factura.xml y añadimos: <propiedad nombre="sumaImportes" estereotipo="DINERO">
72
Así declaramos que Factura tendrá una propiedad calculada llamada sumaImportes y cuya lógica de cálculo está en la clase Java CalculadorSumaImportes, que es como sigue en el Listado 5. OpenXava inyecta primero el objeto factura en el calculador llamando a setModel(), y después ejecuta calculate() para obtener el resultado del cálculo. OpenXava genera una clase Java por cada entidad y agregado que definimos en nuestro componente, y esas clases (como Factura, Cliente o LineaFactura) las podemos usar cuando escribimos nuestra lógica, de esta forma podemos trabajar con objetos sin ni siquiera tener que usar SQL, como hemos hecho en este calculador (OpenXava se encarga de la persistencia mediante Hibernate, EJB2 o EJB3 JPA según el estilo de generación de código que se escoja). Por supuesto si queremos usar SQL también se puede hacer. Ahora en nuestra interfaz de usuario ya aparece la suma de los importes (ver Figura 5). Puede que la interfaz gráfica que OpenXava ha generado para nuestra factura no nos guste demasiado, no nos debe preocupar esto también se puede refinar.
Linux+ 3/2007
licación OpenXava interfaces gráficas diferentes, usando por ejemplo Swing, SWT, AJAX, FLEX, WML, o HTML pero con diferentes formatos. Las vistas OpenXava permiten definir grupos (implementados como marcos), secciones anidadas (las pestañas), visualizar las referencias como combos, personalizar el comportamiento de cualquier parte de la interfaz, definir eventos, etc. De hecho, la flexibilidad de la definición de vistas es tal, que aplicaciones grandes (con cientos de componentes) se han hecho exclusivamente con vistas OpenXava sin tener que escribir ni un solo archivo JSP (OpenXava permite insertar código JSP propio en cualquier lugar).
Portal
Ya tenemos una pequeña gestión de clientes y facturas, pero si queremos convertir esto en
Figura 5. Visualización del componente Factura con una propiedad calculada
para programadores OpenXava
Figura 8. Un portlet OpenXava de una aplicación de Padrón en un WebSphere Portal
Conclusión
La conclusión es evidente, con solamente 3 simples archivos XML y una clase Java podemos desarrollar con OpenXava una pequeña aplicación lista para usar. Además una aplicación que sigue los estándares Java J2EE, desarrollada usando orientación a objetos y desplegable en un portal. Puede parecer que OpenXava es útil para desarrollar de forma rápida aplicaciones
Figura 6. Visualización del componente Factura con una vista refinada una aplicación final aún nos falta una gestión de usuarios y la navegación por los módulos. OpenXava no incluye ninguna de estas cosas, pero tiene algo mejor, genera automáticamente una aplicación de portlets desplegable en cualquier portal estándar JSR-168, así es el portal el que se encarga de la navegación y la seguridad. En el contexto de Java un portal es un software de servidor que permite crear un sitio web con una apariencia consistente a partir de un conjunto de piezas, que se llaman portlets. Estos portlets siguen un estándar (JSR-168), así cualquiera que haga portlets siguiendo este estándar puede añadirlos a un portal Java. Los portales Java se utilizan como portales corporativos, muchas ve-
ces de uso interno, para integrar aplicaciones dispersas con una interfaz de usuario coherente y una misma gestión de usuarios. OpenXava automáticamente genera aplicaciones JSR-168, no necesitamos escribir nada de código específico, solo coger el archivo war resultante y desplegarlo en nuestro portal favorito. El aspecto de nuestra aplicación desplegada en un Liferay (un portal de código abierto) sería como en la Figura 7. Podemos también ver qué aspecto tiene una aplicación OpenXava de gestión de Padrón Municipal de Habitantes en el portal comercial IBM WebShere Portal (Figura 8).
sencillas para acceder a base de datos, y de hecho, lo es. Sin embargo, OpenXava se ha utilizado para desarrollar aplicaciones críticas (como Padrón, Nóminas, etc), y aunque OpenXava no desarrolla de forma mágica las aplicaciones (no es una bala de plata) sí que ahorra bastante trabajo, creando una estructura común, suministrando gratis mucha funcionalidad típica, y poniendo una base para reutilizar código de forma efectiva. OpenXava ofrece muchas más posibilidades de las que se han visto en este sucinto artículo,se puede aprender más de lo que ofrece OpenXava leyendo su guía de referencia, o visitando su sitio web (http://www.openxava. org). No dudéis en poner cualquier pregunta que tengáis sobre OpenXava en sus foros: http://sourceforge.net/forum/?group_id=123187 y sobre todo probadlo, es de código abierto (LGPL) y funciona perfectamente en cualquier distribución Linux.
En la red • • • • •
Figura 7. Nuestro portlet de facturas dentro de un portal Liferay
www.lpmagazine.org
Sitio de OpenXava: http://www.openxava.org, Índice TIOBE: http://www.tiobe.com/tpci.htm, J2EE (sun): http://java.sun.com/javaee/, J2EE (wikipedia): http://es.wikipedia.org/wiki/J2EE, Portales/portlets: http://es.wikipedia.org/wiki/Portlet.
73
para programadores Proyectos en PHP con Oracle
Connection Pooling en PHP
Carlos Sánchez Valle
[email protected]
La mayoría de los proyectos existentes en PHP utilizan MySQL como backend y escalan muy bien simplemente utilizando conexiones persistentes. Ese no es el caso para los proyectos en PHP con Oracle. Abrir una conexión a una base de datos Oracle es un proceso relativamente largo en tiempo: es necesario crear conexiones de red, abrir una sesión autenticada y crear un nuevo proceso de la base de datos que maneje la sesión.
74
S
i utilizáramos conexiones persistentes en un sitio con mucho tráfico con una configuración de servidores web Apache en granja, necesitaríamos ir abriendo conexiones según creciera el número de peticiones y debido al consumo medio de memoria de 2 a 3 MB por proceso de Oracle, un número no muy alto de peticiones dinámicas por servidor provocaría que rápidamente nos quedáramos sin memoria en el servidor de base de datos. Necesitamos una solución intermedia que se encargue de mantener conexiones abiertas, de gestionarlas dinámicamente según las necesidades de tráfico, de cerrarlas y de lanzar las consultas a la base de datos en nombre de todos los servidores web. Lo que necesitamos es un pool de conexiones. Una de las preguntas que aparecen en 'The Oracle PHP/FAQ' [http://www.oracle.com/technology/tech/php/htdocs/php_faq.html] es si PHP ofrece algún tipo de pooling de conexiones para conectarse a Oracle. La respuesta oficial de Oracle en este tema es tajante: No. Desafortunadamente PHP no ofrece ningún tipo de pooling de conexiones para Oracle. Oracle nos ofrece una alternativa que consiste en una aplicación de código
Linux+ 3/2007
libre que ofrece pooling de conexiones con APIs para diversos lenguajes y con soporte de multitud de bases de datos. Entre estas combinaciones encontramos el caso que nos ocupa en este artículo, PHP y Oracle. Esta aplicación se llama SQLRelay, y aunque carezca de un soporte popular por parte de la comunidad de desarrolladores, tanto de PHP como de Oracle, SQLRelay es la única alternativa posible para manejar un proyecto de altísimo tráfico, desarrollado en PHP y con Oracle como backend. Esta configuración es precisamente la que utilizamos en el portal de empleo Trabajar.com.
Trabajar.com y su red de portales de empleo
En tan sólo un año la red de portales de empleo Trabajar.com, perteneciente al grupo Canalmail, ha logrado reunir más de 700.000 candidatos para casi 14.000 empresas. El portal de referencia para encontrar empleo en tecnologías Linux, PHP, etc, es Informaticos.com. Según los datos de estadísticas para el mes de noviembre de 2006, la red de empleo ha superado el millón de visitas únicas.
para programadores Proyectos en PHP con Oracle
Listado 1. Ejemplo de fichero de configuración de SQLRelay
<users> <user user="FOO" password="FOO"/>
Todo este tráfico lo soporta una plataforma basada en gran parte en soluciones de código abierto y del mundo Linux. Todas las máquinas del cluster tienen instalado el sistema operativo Debian. La granja de servidores web balanceados tienen instalados la versión 2.0 del servidor web Apache, y utilizan la versión 4.4.2 de PHP. El backend consiste en 2 máquinas con Oracle 9i replicadas, configuradas de tal modo que si la primera fallase entra a dar servicio automáticamente la segunda. El framework en el que se basa toda la aplicación ha sido desarrollado a medida para el proyecto y utiliza una clase de abstracción de base de datos con dos posibles drivers intercambiables: uno para conectarnos directamente a Oracle a través de la extensión de PHP que maneja la Oracle Connection Interface (OCI8) y otro que utiliza la API que nos proporciona el pool de conexiones SQLRelay para conectarnos con PHP. De este modo, modificando un sencillo archivo de configuración podemos cambiar de conexión directa con Oracle a conexión a través del pool o viceversa, por si existiera cualquier problema con el mismo o quisiéramos parar el pooling por cualquier razón.
Problemática
El servidor web Apache en su versión 2.0 que tenemos instalado en las máquinas de Trabajar.com, funciona en modo preforking. Esto significa que el servidor para cada una de las peticiones que recibe, arranca un nuevo proceso para atenderla. El servidor tiene una serie de parámetros de configuración que permite configurar cuantos de esos procesos arranca al iniciarse y cuantos segundos pueden quedarse a esperar nuevas peticiones una vez que han servido la última, para evitar
experiencia del grupo Canalmail con su plataforma de email marketing basada en lenguaje Java y Oracle hacía uso de soluciones de pooling y sin ellas no sería posible soportar la carga de trabajo de la base de datos con el conjunto de máquinas actual. Era necesario buscar. Una solución similar para el entorno de PHP, y afortunadamente, Oracle derivaba a un proyecto de código abierto llamado SQLRelay. [http://sqlrelay.sourceforge.net]
Solución
SQLRelay es un pool de conexiones a base de datos, que actúa además como proxy y balanceador de carga, disponible para Unix y Linux. SQLRelay permite acelerar que el servidor esté continuamente creando y mejorar la escalabilidad de las aplicacioy matando procesos. nes web y distribuir el acceso a diferentes Si uno de estos procesos atiende una bases de datos replicadas, entre otras caracpetición a un script PHP que tiene que conec- terísticas. tarse a la base de datos, como por ejemplo una de las fichas de las ofertas de empleo de Trabajar.com, el proceso tiene que abrir una conexión a la base de datos Oracle, que como ya comentamos en la introducción, es un proceso largo y costoso. Suponiendo que la totalidad de las peticiones fuesen dinámicas: nº de procesos Apache * nº de servidores web = nº de conexiones a Oracle
Entre las bases de datos soportadas encontramos las siguientes: Oracle, MySQL, mSQL, PostgreSQL, Sybase, MS SQL Server, IBM DB2, Interbase, Sybase, SQLite, ODBC y MS Access. Además, SQLRelay cuenta con APIs nativas para los siguientes lenguajes: C, C++, Perl, Python, PHP, Ruby, Java, TCL y Zope. SQLRelay cuenta con su propia extensión para PHP de acceso a bases de datos, que permite lanzar las consultas y realizar las operaciones usuales contra Oracle, como utilizar Binding, recoger resultados de múltiples líneas, cachear ResultSets, llamar a procedimientos en PL/SQL, lanzar transacciones, etc. Esta extensión sirve para lanzar estas operaciones contra el demonio de SQLRelay, que se encargará a su vez de
Cada conexión a Oracle consume de 2 a 3 MB de memoria en el servidor de base de datos, por lo que con un tráfico estimado de 100 peticiones dinámicas simultáneas, y con 5 máquinas en la granja de servidores web serían necesarios de 1 a 1,5 GB de memoria libre. Para 300 peticiones simultáneas, este numero aumenta de 3 a 4,5 GB de memoria necesaria. Más que suficiente para empezar a poner en problemas a un servidor de base de datos. Si el servidor llegase a entrar en swap, el rendimiento caería en picado y sería imposible seguir aceptando consultas, llegando a colapsar la base de datos. En esta situación, los procesos web se quedarían esperando el resultado de las consultas lanzadas, se iría llegando al número máximo de procesos por servidor web, y el sitio quedaría completamente incapacitado para dar servicio. Cuando Trabajar.com empezó a sufrir problemas de rendimiento debido al crecimiento en tráfico, enseguida el equipo técnico se puso manos a la obra para buscar una solución de pooling de conexiones. La Figura 1. Esquema conceptual de SQLRelay
www.lpmagazine.org
75
para programadores Proyectos en PHP con Oracle
Listado 2. Ejemplo de utilización de la API PHP de SQLRelay $con=sqlrcon_alloc("host",9007,"","user","password",0,1); $cur=sqlrcur_alloc($con);
que es necesario instalar previamente la librería Rudiments desde http://www.firstworks. com.
Configuración de SQLRelay
sqlrcur_sendQuery($cur,"select * from my_table");
Merece más atención el proceso de la configuración que se hace íntegramente a través de un archivo XML localizado normal$rowarray=sqlrcur_getRow($cur,$row); mente en /usr/local/firstworks/etc/sqlrelay. for ($col=0; $col<sqlrcur_colCount($cur); $col++) { conf. echo rowarray[$col]; En el archivo se puede ir rellenando echo ","; cada una de las instancias de SQLRelay. } Una instancia de SQLRelay consiste en el echo "\n"; demonio listener y cada uno de los de} monios que manejan las conexiones. Si es sqlrcur_free($cur); necesario definir diferentes configuraciones sqlrcon_free($con); para conectar a diferentes bases de datos (producción, desarrollo...) cada una viene dirigirlas a la base de datos correspondiente un demonio Listener escucha peticiones de representada en una instancia. y devolver los resultados. los clientes, que en este caso, serían scripts Dentro de las instancias, tenemos otros Por lo tanto, es necesario cambiar las PHP. Estos clientes establecen sesiones dos tags destacables, users y connections. El sqlrcon_endSession($con);
for ($row=0; $row<sqlrcur_rowCount($cur); $row++) {
llamadas a la base de datos del código PHP, ya que las funciones son diferentes que las de la extensión OCI8 de PHP, aunque según el creador, también cuenta con un driver para PEAR:DB, lo que facilita mucho la tarea de integrar SQLRelay si el proyecto la utiliza. En nuestro caso, el equipo técnico tuvo que crear de cero un driver para la clase de abstracción que utiliza el framework del proyecto. El funcionamiento de SQLRelay se basa en la utilización de una serie de demonios: por un lado, lanza un número determinado de demonios que mantienen múltiples conexiones a la base de datos y por otro lado,
con el demonio Listener, que son dirigidas a su vez a los demonios que mantienen las conexiones. Los clientes envían las consultas y las llamadas a procedimientos a estos demonios a través de la red, los demonios ejecutan las consultas a través de las conexiones abiertas a la base de datos y devuelven los resultados por la red al cliente.
Instalación de SQLRelay
La instalación de SQLRelay es relativamente sencilla y está detallada en la siguien te URL: http://sqlrelay.sourceforge.net/sqlrelay/ installing.html. Únicamente conviene reseñar
primero define los usuarios que tienen privilegios para manejar la instancia, representados por nombre de usuario y password, y el segundo describe cada demonio de conexión a Oracle. En condiciones normales, sin bases de datos replicadas ni balanceo de carga de bases de datos, tendremos definida únicamente una sola conexión. Los atributos de este tag son la cadena de conexión, y en ella encontramos el usuario y el password para conectar a Oracle, y una serie de variables de configuración como autocommit activado o desactivado o la variable NLS_Land a utilizar. El tag de la instancia también lleva atributos muy importantes, como connections, que es el número de conexiones que se crearán al iniciar el demonio, maxconnections, que es el máximo número de conexiones que puede llegar a crear según se acumulen los clientes, el ttl, los timeouts, el comando que se lanza al finalizar una sesión, etc. Todos los atributos posibles y sus valores están definidos en la documentación de SQLRelay.
Comandos de SQLRelay
SQLRelay se maneja mediante comandos como cualquier otro demonio. Una vez completado el archivo de configuración hay que llamar al comando sqlr-start para arrancar el listener y arrancar el número de conexiones a Oracle definido con el atributo connections de la instancia definida en la configuración. Para detener la ejecución del demonio simplemente hay que llamar a sqlr-stop.
Figura 2. Home de Trabajar.com
76
Linux+ 3/2007
para programadores Proyectos en PHP con Oracle de la máquina donde se alberga la base de datos, de una manera más eficiente que abriendo conexiones directamente desde nuestros scripts PHP. La instalación, configuración y manejo de la API PHP de SQLRelay no es excesivamente complicada, y ante cualquier problema existe una extensa documentación, aunque desconocemos otros proyectos de la envergadura de Trabajar.com donde esté siendo utilizado. Por citar algunas desventajas, comentaremos que si el proyecto donde se piense implantar no cuenta con clases de abstracción de base de datos, es necesario cambiar todo el código que maneja la interacción con ésta, ya que la API es diferente que la nativa de Oracle en PHP. Aunque viene con las funciones más usuales, no tiene tanta variedad como las OCI8, pero tenemos que comentar que no hemos echado en falta ninguna.
Figura 3. Aquí encontraréis detalles de la instalación de SQLRelay Otro comando interesante es el sqlr-status que nos muestra información del demonio, como las conexiones que mantiene con el servidor Oracle, con los clientes, el número de cursores abiertos, número de consultas lanzadas y número de errores encontrados.
Utilización de la API de SQLRelay
En el siguiente listado de código podemos ver como conectarnos al demonio de SQLRelay, lanzar una consulta simple y recorrer el ResultSet que nos devuelve como resultado. En el caso de Trabajar.com, no se utilizan las funciones de la API PHP de SQLRelay directamente en el código, sino que el equipo técnico tuvo que construir un driver específico para la clase de abstracción de base de datos del framework del proyecto, basándose en el driver de Oracle que utilizaba las OCI8. De todas maneras, si tu proyecto utiliza la clase de abstracción de bases de datos PEAR DB, utilizar esta API es tan sencillo como añadir el driver que viene con la distribución de SQLRelay y realizar la conexión de la siguiente manera, sustituyendo el usuario, el password, el host y el puerto de Oracle por los que corresponda.
El último paso después de la configuración y el arranque del Listener de SQLRelay es utilizar la API PHP que nos proporciona como método de lanzar las consultas y procedimientos a la base de datos. La mejor manera de comprender la utilización de SQLRelay desde nuestro código PHP es con un sencillo ejemplo. La API de SQLRelay no es tan rica como puede ser la OCI8 nativa de PHP, pero nos permite hacer la mayoría de las operaciones normales: lanzar consultas, ejecutar procedimientos, enlazar variables (binding), comenzar y finalizar transacciones con commit y rollback, $db = DB::connect("sqlrelay://user: utilizar cursores, e incluso cachear Result- password@host:9007/testdb"); Sets enteros. Para el resto de operaciones se pueden utilizar todos los métodos de PEAR DB como de costumbre.
Conclusiones
Figura 4. Para instalar la librería Rudiment visitad esta página
SQLRelay actualmente es prácticamente la única opción posible para poder utilizar desde un proyecto en PHP un backend como Oracle sin sufrir problemas de rendimiento en entornos de mucho tráfico. Al ofrecer un pool de conexiones, puede gestionar y manejar las conexiones a Oracle de manera escalable sin saturar la memoria
www.lpmagazine.org
Si en algunas partes del proyecto donde se implante es necesario recibir ResultSets muy largas de la base de datos, es posible que sea más eficiente conectar directamente con Oracle, porque las ResultSets tienen que hacer un doble camino: de Oracle a SQLRelay y de SQLRelay al cliente. Además de estos aspectos, en la implantación y uso diario de SQLRelay en Trabajar.com hemos detectado ciertos problemas con algunas de las conexiones que mantiene el demonio de SQLRelay con la base de datos. En raras ocasiones alguna conexión empieza a devolver errores de la base de datos (ORA-00600 para ser más exactos), mientras que el resto de conexiones abiertas funcionan correctamente. En estos casos cambiamos nuestros archivos de configuración de la aplicación para conectar directamente a Oracle a través de la API nativa de PHP, reiniciamos SQLRelay y volvemos a cambiar todo para conectar a través del pooling. Afortunadamente esto no ocurre muy a menudo y es fácilmente detectable configurando una serie de alarmas. Hemos estado varios meses con el demonio funcionando y sin reiniciarlo hasta que empezamos a detectar los primeros errores. Desde el equipo técnico de Trabajar.com, podemos afirmar que sin SQLRelay actualmente el portal de empleo no podría soportar el tráfico diario sin haber realizado ninguna fuerte inversión en mayor y mejor hardware, por lo que recomendamos la utilización de este pooling de conexiones en cualquier proyecto PHP con base de datos Oracle como backend.
77
entrevista Un laptop por niño
OLPC: Entrevista a uno de los desarrolladores
U
n laptop por niño (One Laptop Per Child), es un proyecto humanitario y sin fines de lucro, que tiene por meta entregar un laptop a cada niño del mundo, sobre todo en los países sub desarrollados donde el acceso a la tecnología es más bien escaso. Fue pensado para que el profesor tuviese una herramienta más de trabajo en la sala de clases. Linux+ tuvo la oportunidad de entrevistar a Eduardo Silva, quien es uno de los tantos programadores con que este proyecto cuenta, veremos los aspectos técnicos de la máquina, y veremos qué ha logrado hacer el equipo de desarrollo con esta máquina, que si bien a buenas y a primeras parece escasa en recursos, nos daremos cuenta que cumple de sobra con el fin que se creó, acercar a los niños a la tecnología. Por dar un ejemplo, este laptop es capaz de crear automáticamente una red con otros laptops que estén al alcance de su antena Wireless, y tiene una autonomía de aproximadamente 3 horas (hay planes de incluso cuadruplicar su duración), además tiene una cámara web integrada. Y todo por US$100. Linux+: Eduardo, ¿cuándo y por qué fue tu primera incursión en Linux? Eduardo Silva: En el año 1998 mientras terminaba un sistema en Visual Basic para un
78
La experiencia a través de Google en OLPC y después como voluntario ha sido sorprendentemente enriquecedora...
cliente, las pantallas azules cada vez más, me iban sacando de mis casillas, el sistema operativo era muy inestable, mi aplicación se caía sin razón alguna y fue en ese momento que me dí cuenta que el sistema operativo que tenía frente a mis ojos no era lo que decía ser y nunca lo sería. Pasados unos días, mi hermano Gonzalo que ya había tenido experiencia en Unix hace un tiempo, llegó con la novedad de un SET de distribuciones de Linux que se había conseguido, que era un unix gratuito (así se le conocía en ese tiempo) y nos dispusimos a instalarlo. Lo primero que me maravilló fue el arranque del sistema, en el cual podías ver en detalle lo que estaba haciendo, muchas de las cosas que para mi eran desconocidas. El aprender a instalarlo me habrá tomado hacer el proceso unas 15 ó 20 veces, en ese entonces el proceso de instalación no era muy amigable y se requerían de varios conceptos básicos que yo no tenía para poder lograr una instalación exitosa. Me inicié con RedHat 5.1 y hasta el día de hoy recuerdo mis 2 grandes batallas: configurar mi módem (gracias a Dios no era un winmódem) y configurar la tarjeta gráfica para X. L+: ¿Qué fue lo primero que programaste en Linux (aparte de los típicos programas para aprender al estilo hola mundo)?
Linux+ 3/2007
ES: Si mi memoria no me falla, lo primero que programé fue un escaneador de puertos, un simple programa en C que intentaba conectarse a los puertos de comunicación de una máquina para saber cuales estaban abiertos y cuales no, la idea principal era aprender sobre sockets y comunicación de programas a través de una red. L+: ¿Qué distribución usas actualmente? ES: En mi servidor local uso Debian, en mi laptop uso Ubuntu. Por un largo tiempo probé distintas distribuciones y al final opté por lo más estable y rápido de actualizar. L+: ¿Prefieres herramientas de programación 4GL (Visual Basic, Power Builder, etc.) o las típicas interfaces con IDE?, ¿por qué? ES: Hay herramientas 4GL que son excelentes, pero todo va por un tema de gusto y comodidad, yo prefiero los IDE, nunca he sido muy amigo de las herramientas 4GL (aunque las utilicé mucho un buen tiempo), para mi un IDE lo tiene todo, es por eso que se llama Ambiente de Desarrollo Integrado: marcador de sintaxis, debuggers, compilador/ intérprete, documentador, etc. L+: Eduardo, ¿cómo fue que llegaste a trabajar para Google en el proyecto OLPC? ES: Todo comenzó en 2005 cuando vi que Google tenía un programa llamado Summer of Code 2005, en el cual reclutaban
entrevista Un laptop por niño a distintos estudiantes universitarios (o áreas afines) para que invirtieran su tiempo de vacaciones trabajando para proyectos opensource, es decir, Google te daba una lista de proyectos y tu seleccionabas a cual deseabas aplicar, enviabas una propuesta al proyecto canalizada por Google y los mentores del proyecto calificaban las mejores según la calidad de ésta y los conocimientos de la persona (cada proyecto utiliza sus criterios de selección), una vez que el proyecto te ha aprobado viene la aprobación final por Google, una vez que está todo ok, comienzas a trabajar directamente con un mentor que te es asignado en el proyecto, tu trabajo dura tres meses y Google te remunera una buena suma de dinero por la labor hecha. Yo apliqué a este programa en el año 2005 pero no fui aceptado. Ya en el año 2006 comencé a oír sobre el proyecto OLPC y me pareció haber escucha-
que abres el XO cuesta creer que hay tanta maravilla junta, tanto en hardware como en software. En los componentes de hardware encontramos un procesador AMD Geode GX-500, 128MB de memoria RAM, NAND Flash de 512MB como dispositivo de almacenamiento central (el XO no posee disco duro), Chipe Marvell (wireless), 3 USB externos, batería de 2000 ciclos de carga, LCD de 7.5” (logra una resolución de 1200x900), 1 Slot para memorias SD, Audio, Cámara VGA, etc. Uno de los grandes desafíos de este gran proyecto educacional, es lograr que el laptop optimice al máximo el consumo de energía, para lo cual se han implementado nuevas soluciones aplicadas al hardware como lo es el nuevo chip DCON, el cual actúa como una interfaz intermedia que permite el deswizzling y anti-aliasing en modo color, permitiendo también a su vez
L+: ¿Qué interfaz gráfica se utiliza en el OLPC, se sabe que la pantalla es muy pequeña? ES: El ambiente de trabajo para XO se llama Sugar, el cual es un ambiente diseñado específicamente para niños y programado en Python, es un entorno 100% visual en el cual los programas son llamados actividades, los cuales están integrados con iconos de una forma amigable. Sugar es un entorno que permite la integración de otros usuarios de Sugar a través de la red, pudiendo crear grupos de trabajo y compartiendo actividades con ellos. El entorno es muy fácil de usar y lo más importante es que es muy intuitivo. Siendo la pantalla pequeña, hay que destacar que tenemos una resolución de 1200x900, lo cual da una excelente nitidez de los contenidos y como Sugar es un entorno basado en objetos visuales/iconos no hay nin-
do una de las mejores ideas que se podrían realizar y ya había un staff de trabajo para el proyecto, en ese entonces deseé algún día poder participar haciendo alguna colaboración. Meses más tarde se abre Google Summer of Code 2006, y uno de los proyectos disponibles para participar era OLPC, apliqué para la organización y esta vez fui aceptado para participar del programa. Durante tres meses estuve desarrollando a Memphis, una herramienta gráfica para el análisis de uso de memoria un poco diferente a lo que es pstools, en este caso la medición de recursos se realiza en base a métricas específicas, también fue incluida la exportación de reportes, soporte de plugins, etc. Actualmente sigo participando como voluntario de OLPC donde aun sigo desarrollando Memphis. L+: ¿Podrías darnos una pequeña reseña acerca de las características físicas del OLPC? ES: El laptop en sí a primera vista parece un juguete para niños, pero una vez
tener la pantalla activa con el procesador suspendido. Uno de los componentes que más consume energía es el LCD. Otra forma de ahorrar energía, se ha logrado con la suspensión de CPU, en los laptops convencionales esto ocurre alrededor de los 10 segundos, en XO es menor a 100mS, gracias a estas implementaciones se ha logrado un gran ahorro energético. L+: ¿Cuáles han sido los principales obstáculos que han encontrado al desarrollar software para el OLPC? ES: Más que obstáculos, yo los llamaría desafíos u oportunidades, dentro de ellos a nivel de diseño físico que debe ser resistente al polvo y líquidos, una carcasa rígida y una extra protección para el LCD. A nivel de software, el optimizar al máximo el uso de espacio del sistema, eliminando componentes que no son necesarios, una imagen actual del sistema operativo instalado esta entre los 100 y 150MB, la auto configuración de la red inalámbrica, mesh-network, optimizar la transferencia de datos desde el Nand Flash, entre otros. L+: ¿El OLPC se basa en alguna distribución, o es una distribución específicamente creada para él? ES: OLPC está auspiciado por una gran variedad de empresas dentro de las cuales se encuentra RedHat, la cual ha aportado con Ingenieros para la adaptación de Fedora Core para el laptop. Es una versión optimizada con un par de variaciones a la distribución actual. El Kernel utilizado es un branch llamado olpc-2.6, con los drivers específicos para el hardware de OLPC como: CPU, CAFE, Touchpad, etc.
gún problema al utilizarlo. L+: Sabemos que el OLPC es una máquina de bajo costo, ¿crees tú que en un futuro cercano se siga desarrollando el mismo proyecto, pero con mejor hardware, o sólo se seguirá optimizando el software? ES: Yo creo que el proyecto se seguirá desarrollando a la par con el nacimiento de nuevas tecnologías, el costo del hardware tiene una gran tendencia a reducirse, en algún momento las nuevas tecnologías se irán integrando en el proyecto, la evolución de cualquier proyecto debe ir a la par de la tecnología, y hablando del software: el SW siempre debe ser óptimo, ningún programa debería desperdiciar recursos, optimizar debiera ser una práctica común entre los desarrolladores. L+: Por último, ¿cómo ha sido la experiencia de trabajar en un proyecto tan grande como OLPC? (desde el punto de vista humano, cansancio, tiempo, enriquecimiento intelectual y esas cosas..) ES: La experiencia a través de Google en OLPC y después como voluntario ha sido sorprendentemente enriquecedora, en OLPC te desenvuelves con personas que tienen mucha experiencia tanto en desarrollo como en implementaciones tecnológicas. El staff oficial siempre está dispuesto a ayudarte y hay espacio para quien desee aportar. Para ayudar lo más crítico es el tiempo, en mi caso me hago el tiempo en las tardes-noche después de mi jornada de trabajo para hacer correcciones a los SW que estoy desarrollando. L+: ¿Qué no se puede hacer con OLPC? ES: Instalar Windows que pesa 1.5GB y requiere del doble de recursos para hacer lo mismo que XO.
Figura 1. Laptop para los niños
www.lpmagazine.org
79
para principiantes Trucos y truquillos
Trucos y truquillos Leonardo Ibarra R.
Pues nuevamente aquí, compartiendo con uste- rio utilizando Gnome, que conste que les estoy des, tips, trucos y truquillos. En esta ocasión nos advirtiendo que hay que armarse de paciencia a centraremos en la apariencia de nuestro escrito- fin de tener los resultados que les muestro.
Felices trucos y que lo disfruten. Ánimo.
Ya falta menos, ánimo
Ahora para cambiar el Splashscreen, lo más cómodo es tener instalado el Gnome-splashscreen-manager, si no lo tienes puedes instalarlo con tu administrador de paquetes, para los usuarios de Ubuntu la orden sería: $ sudo apt-get install gnomesplashscreen-manager
Una vez instalado, lo llamaremos con la siguiente orden: $ gnome-splashscreen-manager
Una vez aquí con la opción install seleccio-
Figura 2. Primer menú a modificar del panel Inferior
Figura 3. Segundo menú a modificar del panel Inferior
namos la imagen para el splash que previa- escritorio cambiar fondo, seleccionamos la que invocarlo mediante la linea de comando mente descargamos, y posteriormente la acti- imagen y listo. vamos con la opción activate.
así:
Para que sea mas fácil cambiar nuestro
Posteriormente instalamos nuestro fondo cursor utiliza Gcursor, ya sabes si no lo tienes $gcursor
de pantalla, sí ya sabes, clic derecho sobre el lo instalas, posteriormente solamente tendrías
Instala el tema Jaguarx y listo. Una cosa más y terminamos, algo de lo más atractivo del sistema de Mac, es su panel semitransparente, para tenerlo en nuestro sistema necesitamos seguir los siguientes pasos: Vamos a borrar el panel inferior, por si no lo sabes esto se hace dando clic derecho en el panel donde no haya ningún icono, esto despliega un menú con la opción Borrar este panel, la seleccionamos, ahora vamos al panel superior igualmente clic derecho, y ahora seleccionamos la opción Panel nuevo, si es necesario podemos arrastrarlo a la parte inferior del escritorio, una vez ahí clic derecho Propiedades, en tamaño ponemos 50 pixeles y quitamos la opción de expandir, nos pasamos a la pestaña fondo y seleccionamos Color sólido y ponemos color blanco, corremos la barra Estilo hacia la izquierda a fin de tener el nivel de transparencia deseado y cerramos este menú. Ahora ya tenemos un panel al cual conFigura 1. Esta es la apariencia de Gnome por default
80
forme se le vayan agregando lanzadores se
Linux+ 3/2007
para principiantes Trucos y truquillos expandirá, para iniciar podemos añadir las mos añadir lanzadores de las aplicaciones que Pues después de esta faena ya está listo funciones de Papelera, Salir, Control de volumen, utilicemos regularmente, yo arrastro los iconos nuestro GNU/Linux Gnome con apariencia de para esto clic derecho sobre el panel inferior->Aña- ya existentes en el escritorio para añadirlos. Mac OS. dir al panel, y seleccionamos las opciones menEl resto ya va en gustos y necesidades de Que lo disfrutes. cionadas anteriormente, luego de esto ya pode- aplicaciones.
Ánimo.
GNU/Linux con apariencia de Mac Os
Mucho se ha dicho de que si el escritorio Gnome Como entrada del sistema podemos usar los Se me olvidaba el cursor, éste lo descargamos es bueno para trabajar, pero le faltan aplicacio- siguientes temas Gdm: nes para el usuario que viene de Windows, que si Kde es bonito pero consume recursos, que si • Windowmaker es un escritorio para usuarios noveles, en fin, cada quien usa como escritorio •
http://www.gnome-look.org/content/ show.php?content=28630, http://www.gnome-look.org/content/
lo que sabe, o conviene, o aguanta su máquina.
show.php?content=14486.
Pero a este respecto yo puedo decir que lo fabuloso del mundo GNU/Linux es la liber- Para el Splashscreen a mi me gustaron estos: tad, y la cantidad de opciones que hay, así es
de aquí – Recuerden que les dije que había que armarse de paciencia: •
http://www.gnome-look.org/content/ show.php?content=14775.
Ya con todo esto en nuestro disco duro, ahora procederemos a instalar los paquetes. Como estoy seguro de que no todo mun-
•
http://www.gnome-look.org/content/
do usa Ubuntu, y por lo tanto sus lanzadores
Así es que tomando en cuenta esto, un día se me antojó tener mi Ubuntu con apariencia • de Mac, utilizando Gnome, cabe destacar que
show.php?content=42858, http://www.gnome-look.org/content/ show.php?content=42836.
gráficos pueden tener ubicaciones diferentes, invocaremos las aplicaciones que utilizaremos a través de consola a fin de que dichas
que por lo tanto todo vale, ¿ok?
ya había visto en Internet algunas capturas de instrucciones les sean útiles. pantalla, pero ni idea de cómo se conseguía Para el tema de escritorio necesitamos Primero instalaremos el tema T-ish y los esto, así que me puse a investigar y ahora lo T-ish en su versión 3.2 de la siguiente dire- iconos OSX para lo cual desde la linea de cocomparto contigo.
cción:
Antes de empezar a descargar los paquetes que utilizaremos, te sugiero crear una • carpeta que llamaremos Mac, dentro de ésta
mandos daremos la siguiente instrucción:
http://www.gnome-look.org/content/ show.php?content=30859.
$ gnome-theme-manager
crea las carpetas que listo a continuación a fin de que posteriormente puedas identificar fá- Posteriormente el paquete de iconos de aquí:
La cual despliega la pantalla que nos permitirá instalar estos archivos, ya sea indican-
cilmente a qué corresponde cada paquete:
do la ruta o arrastrándolos hacia esta ventana, una vez hecho esto en detalles del tema
•
http://www.gnome-look.org/content/ show.php?content=31618.
en la sección Controles y Borde de la ventana, debe estar seleccionado el tema T-ish, y en la
• •
Tema, Iconos,
•
Gdm,
Y por ultimo el fondo de escritorio lo descar- sección iconos el tema OSX, al aplicarlos ve-
•
Splash,
gamos de aquí:
• •
Fondo, Cursor.
•
http://lxvweb.tripod.com/.
rás que inmediatamente nuestro Gnome se empieza a parecer a la interfaz de un Mac, pero todavía faltan algunos detalles. Continuamos con Gdm, que es la pantalla con la que iniciamos, la cual nos pide usuario y contraseña cuando arranca el sistema, para poder configurarla necesitamos ser root, así que en nuestra terminal escribimos: $ sudo gdmsetup
Después de proporcionar la contraseña, ya podremos seleccionar la pantalla que utilizará Gdm al arrancar, en mi caso es AppleLinux 0.1, verán que en este mismo menú de configuración , aparece la opción Color de fondo, es importante que lo cambiemos a fin de que cuando se presente el splash del sistema éste tenga un fondo acorde con nuestra configuración, lo más cómodo es presionar el botón del color y posteriormente tomar una muestra del color preferido con el go-
Figura 4. Así quedará nuestro escritorio una vez modificado
tero y listo.
www.lpmagazine.org
81
El tema principal del siguiente número de Linux+ será:
Gráfica
es decir, nuevas soluciones gráficas para Linux
El próximo número incluirá los siguientes artículos: • Seguridad
Firewall en Linux
• OSCommerce
Comercio electrónico seguro y eficaz
• Monitorización de redes en Linux Guía práctica
• Linux contra Windows
Esta vez basamos nuestra comparación en MySQL
• ACE
Formatos de fichero
!El número a la venta a partir del 1 de abril!
DVD1 : FreeBSD 6.2
El sistema ideal para servicios de Internet o Intranet, fácil de instalar
DVD2 : Debian 4.0
La versión más reciente del sistema operativo universal
La Redacción se reserva derecho a modificar sus planes
Programas comerciales Web-analiser PRO 2.76 Programa que permite recoger y analizar las estadísticas del tráfico de tu sitio web