Incluye: La Primera Revista de Programación en Castellano
Incluye: La Primera Revista de Programación en Castellano
DE
VLUY
DINC
Precio: 6 € (España) (IVA incluido) • AÑO XIV. 2.ª ÉPOCA • Nº 158 • UNA PUBLICACIÓN DE: REVISTAS PROFESIONALES S.L.
OPINIÓN REDES
La singularidad empaquetada Técnicas AJAX profesionales
para el desarrollo de un slideshow
ACTUALIDAD
Entrevista a Antonio Gómez Pavón BASES DE DATOS
de Microsoft 4D v11 SQL: componentes y servicios web
DISPOSITIVOS MÓVILES DISEÑO
Primeros pasos con Android Creando aplicaciones semánticas con Jena
MIDDLEWARE VÍDEO-TUTORIAL
Uso avanzado de LINQ para SQL Menú Arts
EDITORIAL
Número 158 DESPEDIDA
Ed i t a : R EVISTAS PROFESIONALES S.L.
Si la escritura de este pequeño texto que se publica como editorial
[email protected]
siempre supone un momento intenso de comunicación con los
C/ Valentin Beato 42,3ª 28037 - Madrid
lectores, en esta ocasión este momento es todavía más especial por
www.revistasprofesionales.com
E d i to r lo que acarrea de despedida. En efecto, el mes que viene, la
Agustín Buelta singladura de Sólo Programadores ya no estará al cargo de este que
•••••••••••••••••••••••••••••••••• escribe y, al hacerlo, se despide. Debo a esta publicación y a sus
Co o r d i n a c i ó n T é c n i c a - R e d a c c i ó n lectores una de las mejores experiencias de mi carrera profesional
Carlos Laparra y de mi vida. A lo largo de tantos meses he tenido ocasión de
•••••••••••••••••••••••••••••••••• conocer a programadores excelentes, incluso pioneros en
Maquetación numerosos proyectos, y he recibido el honor de ser invitado a
Raúl Clavijo eventos de gran altura. Además, he tenido el privilegio de llevar
••••••••••••••••••••••••••••••••••
adelante la primera plataforma digital española para una
As e s o r í a d e Pu b l i c i d a d
publicación de este ámbito, que ha acortado las distancias y ha
Felipe Ribagorda
hecho accesibles los artículos de Sólo Programadores a lectores a
Tel.:91 304 87 64
D e l e g a c i ó n e n B a r ce l o n a los cuales no hubiera podido llegar la edición en papel, aportando
C/ Rocafort,241/243,5º 1ª con ello una modesta contribución a la construcción de una Internet
Mariano Sánchez orientada a contenidos. Por todo ello, doy las gracias a todas las
Tel.:93 322 12 38 personas que me han ayudado a hacer lo mejor posible mi trabajo, y
•••••••••••••••••••••••••••••••••• me despido con un afectuoso saludo.
S u s c ri pc i o n e s
Tel:91 304 87 64
Fax:91 327 13 03
SUMARIO
•••••••••••••••••••••••••••••••••••
I m p re s i ó n
L.M.S.Solución Gráfica
[email protected]
••••••••••••••••••••••••••••••••••• OPINION
D i s t ri b u c i ó n 11 La singularidad empaquetada
ACTUALIDAD
12 Entrevista a Antonio Gómez Pavón, de Microsoft
Saturnino Calleja,7
28002 Madrid
Tfno.915 864 933
DISPOSITIVOS MÓVILES
18 Primeros pasos con Android (II)
D I S T R I B U C I O N E N M E X I CO 24 Desarrollo de aplicaciones con pyS60
DIMSA - C/ Mariano Escobedo,218
Col.Anáhuac.11320 México,D.F.
MIDDLEWARE
D I S T R I BUCION EN ARG E N T I N A 28 LINQ para SQL (y II)
Capital Federal:Distrimachisa
Interior:York Agencysa - Tlf:(5411) 433 150 51 BASES DE DATOS
•••••••••••••••••••••••••••••••••• 36 Caso práctico con 4D v11 SQL (y III)
Quedan expresamente prohibidas la reproducción,la
distribución y la comunicación pública de todo o parte de
los textos contenidos en esta publicación,por cualquier REDES
medio y en cualquier soporte,y para cualquier fin, 46 Slideshow de imágenes con AJAX, XML y DOM (y III)
incluyendo la realización de resúmenes de prensa
comerciales,sin la autorización expresa de esta Editorial,
conforme a lo dispuesto en la vigente Ley de Propiedad
DISEÑO
Intelectual.La infracción de la presente prohibición 52 Programando en Java la Web Semántica con Jena (II)
será perseguida penalmente.
Depósito legal:M-26827-1994 VÍDEO-TUTORIAL
P R I N T E D I N S PA I N 66 Menú Arts
P.V.P. 6 euros
Y ADEMÁS. . .
04 Noticias
06 javaHispano: Blue Ray, Grails, Andorid y más
08 Comunidad .NET. Visual Basic 2008
16 DVD. Visual Studio 2008
62 Lecturas. El libro de Django
noticias 21/2/08 12:44 Página 4
NOTICIAS
PRAGSIS
Innovación tecnológica en España
España es uno de los países de la Unión Europea que menos apues-
ta por la innovación tecnológica en sus productos y servicios, y esto
se refleja también en la estructura empresarial a la hora de adap-
tarse a los cambios tecnológicos. Ésta es la conclusión a la que ha
llegado la consultora tecnológica Pragsis Technologies después de
realizar un análisis sobre varios estudios estadísticos correspon-
dientes al año 2007 de diferentes empresas especializadas en el
sector. Con la apertura del nuevo año todo son nuevos propósitos y
las empresas han decidido subirse al tren tecnológico para no que-
darse en la cola de las nuevas revoluciones que se avecinan en cam-
pos como Internet, las conexiones de alta velocidad y la telefonía
móvil, entre otros.
En los días en los que nos encontramos, las innovaciones tecnoló- Entre los indicadores que el estudio ha utilizado para medir la inno-
gicas son un elemento esencial a la hora de estudiar la productivi- vación, nuestro país solo destaca en la venta de productos novedo-
dad de los factores de las economías modernas, ya que este aspec- sos, que representan en torno al 10% de la facturación total. En este
to repercute directamente tanto en una notable mejora de la efi- aspecto, otro indicador significativo es el número de pequeñas y
ciencia en el terreno económico, como en el bienestar de sus habi- medianas empresas que han decidido a lo largo del pasado año dar
tantes. A la hora de analizar el sector tecnológico hay que basarse un vuelco a su organización empresarial para adaptarse y posicio-
principalmente en dos ámbitos: el que se plantea cómo afecta al narse en el ámbito de las nuevas tecnologías potenciando notable-
crecimiento de la economía la introducción de los cambios técnicos, mente sus departamentos para impulsar la innovación.
y el que estudia cuál es el contexto de los mercados que favorecen Un reciente estudio publicado por la BBC recuerda que en 2007 se han
la introducción de los descubrimientos tecnológicos por parte de desarrollado herramientas que borran las fronteras entre el mundo on-
las empresas que compiten en ellos. line y el off-line como pueden ser la implantación de la gigantesca red
Los indicadores que Pragsis ha considerado en sus estudios para valorar social de Facebook, el iPhone o la Nintendo Wii, entre otros. Para este 2008
el panorama tecnológico en nuestro país son las estadísticas de nos encontramos con varios retos como la implantación Ultra Móvil PC,
Investigación y Desarrollo (I+D), los datos de patentes y las encuestas de que consiste en la conversión de la PDA en un verdadero ordenador por-
innovación de la Organización para la Cooperación y el Desarrollo tátil; la consolidación de la televisión por Internet; la tecnología de redes
Económico (OCDE) (http://www.ipyme.org/IPYME/es-ES/UnionEuropea/ inalámbricas de largo alcance WiMax (que ya es una realidad en Estados
OCDE/), estudios estadísticos de la Fundación para la innovación tecno- Unidos) o el afianzamiento de las soluciones de movilidad entre la pobla-
lógica: COTEC (http://www.cotec.es/) y la Oficina estadística comunitaria: ción española, con un amplio abanico de opciones en las que Pragsis está
EUROSTAT (http://es.wikipedia.org/wiki/Eurostat). El barómetro de la trabajando, como la tecnología NFC que permitirá a los usuarios olvidar-
innovación europea sitúa a España en el grupo de países que van a la se de pagar en efectivo o con su tarjeta de crédito en los establecimien-
zaga a la hora de incorporar nuevos métodos tecnológicos a su oferta de tos, o en el caso de la tecnología de Códigos 2D, poder acceder a cualquier
productos y servicios, en el que también nos topamos con países como evento o participar de numerosas promociones directamente a través de
Italia, Croacia y Hungría, entre otros. su teléfono móvil con la mayor rapidez, eficacia y seguridad posible.
PANDA SECURITY dad le permite saber cuándo va a enviarse este tipo de datos y
dónde, con lo que tendrá siempre el control sobre ellos. De esta
Regalos en el Día Internacional de la Internet Segura manera, se aumenta la seguridad de las transacciones y del inter-
cambio de datos online.
Panda Security tiene entre sus principales objetivos conseguir una Además, la suite de Panda permite analizar el equipo con
navegación por Internet más segura. Por eso, apoya la celebración TotalScan Pro, una solución online que ofrece una mayor capaci-
del 5º Día Internacional de la Internet Segura regalando a los usua- dad de detección, ya que está basada en un innovador modelo de
rios un mes gratuito de Panda Internet Security, su suite integral de seguridad denominado “Inteligencia Colectiva”. Este sistema está
seguridad, disponible en la dirección http://www.pandasecurity.com/ basado en la recolección de información sobre malware proce-
spain/homeusers/downloads/internet-security. dente de toda la comunidad de internautas y el procesamiento
En 2007 se ha observado un uso creciente de automatizado de estos datos en
las páginas web como medio para distribuir unos nuevos datacenters. Esto es
troyanos, gusanos y otras variedades de mal- correlacionado y aprovechado para
ware. En ocasiones, esas páginas no son mali- ofrecer una mayor detección y
ciosas, sino páginas legales que han sido mejorar así la seguridad de los
modificadas por los ciber-delincuentes para clientes de Panda.
infectar a todos aquellos usuarios que las visiten. Para proteger Panda Internet Security ofrece, además, otras funcionalidades
frente a esta creciente amenaza, Panda Internet Security cuenta como anti-spyware, un sistema de mejora del rendimiento del
con un sistema de filtrado web, que bloquea las páginas maliciosas PC, Firewall, Anti-Phishing, anti-rootkit, etc.
o fraudulentas. Puede acceder a la descarga gratuita de un mes de Panda Internet
La protección de los datos confidenciales del usuario está reforza- Security en la dirección http://www.pandasecurity.com/spain/
da, además, con la inclusión de “identity Protect”. Esta funcionali- homeusers/downloads/internet-security.
NOTICIAS
JAVAHISPANO
En diciembre del año pasado en esta sección nos hicimos eco de la oferta pública que
Oracle hizo por BEA Systems: 6,6 billones de dolares. BEA declinó la oferta por considerar-
la demasiado baja. Sin embargo, como ya apuntamos en su día, BEA es una compañía
pequeña en el nicho del mercado de servicios en el que compite: entre sus rivales directos
están compañías como IBM, Sun, Oracle, SAP y (aunque sea con otra tecnología) Microsoft.
Dado el momento de bonanza por el que el sector tecnológico está pasando, era cuestión
de tiempo que alguien con suficiente dinero en sus arcas intentase comprar la compañía.
También apuntamos que quizás los propios directivos de BEA, conscientes de esta situa-
ción, estuviesen interesados en la oferta y sólo quisiesen subir su cuantía, y que probable-
mente las negociaciones continuaban en silencio. Efectivamente, las negociaciones conti-
nuaban y finalmente ha habido un acuerdo: 8,5 billones de dólares. La compra de la com-
pañía no se ha hecho efectiva de modo inmediato, sino que llevará todavía varios meses el
resolver todos los detalles legales y hasta entonces ambas compañías continuarán operan-
do de modo independiente.
Oracle ha informado que la línea de productos de BEA se fusionará con la suya propia y que, cuando la adquisición se ejecute, seguirá
dando soporte a los antiguos clientes de BEA. Sin embargo, la compañía ha sido muy parca en los detalles de qué significa que los pro-
ductos de BEA se "fusionen" con los suyos: por ahora no está claro hasta qué punto los componentes del servidor de aplicaciones de
BEA, que en muchos aspectos es superior al de Oracle, serán parte del futuro Oracle Application Server. En cualquier caso, esperamos
que esta compra, a diferencia de algunas compras anteriores de Oracle, esté guiada también por la tecnología y no sólo por el interés
en conseguir los clientes de una compañía rival.
JAVAHISPANO
Actualidad Java de la mano de javaHispano
Sobre el autor
Abraham Otero ([email protected]) es responsable de calidad y miembro de la junta de javaHispano.
COMUNIDAD .NET
COMUNIDAD .NET
Visual Basic 2008
COMUNIDAD .NET
LISTADO 11 Firmas
‘
‘Con la firma tradicional
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MessageBox.Show(“Hey!!”)
End Sub
‘
‘Relajado
Private Sub Relajado() Handles Button1.Click
MessageBox.Show(“Hey!!”)
End Sub
‘
‘Ademas ...
Dim MiEventHandler As EventHandler = AddressOf Relajado
‘o
Dim TuEventHandler As New EventHandler(AddressOf Button1_Click)
OPINIÓN
La singularidad empaquetada
NICOLÁS VELÁSQUEZ ESPINEL PCs con Vista como con otros sistemas ope-
rativos. Y es que según estimaciones de
Un punto de inflexión marca un Microsoft, en algunos casos con la nueva
actualización el rendimiento se ha incremen-
antes y un después, una tado hasta en un 50%.
singularidad que sirve para En el apartado de discos se añade soporte
definir un hecho determinado sin para exFAT, un sistema de ficheros pensado
el cual no dejaría de ser más que para ser usado en portátiles con discos flash. Windows Vista tras la instalación del
También se soporta EFI (Extensible Firmware Service Pack.
un acto intrascendente. Así Interface) en sustitución de la BIOS, en clara últimos años. La contagiosa corriente que
ocurrió con el Big Bang, el grito vía de extinción, y de Secure Digital DMA. En prefiere condenarlo antes de escucharlo es
de Eureka de Arquímedes, el día cuanto a la seguridad se presentan mejoras cuanto menos cuestionable. El criterio perso-
en el que se conocieron Paul en BitLocker, que permite el cifrado de los nal debería cocinarse de forma única y perso-
datos, con el soporte de BitLocker en múlti- nal y sólo ser sazonado con la opinión popu-
McCartney y John Lennon o el ples discos y en discos USB, además de pro- lar, nunca al contrario, como ocurre en
mítico gag de la empanadilla de tección para las APIs en modo 64 bits. muchos casos en los que sólo con oír la pala-
Martes y Trece. Sucesos que Si nos ceñimos a las notas de prensa enviadas bra Microsoft algunos se santiguan intentan-
indudablemente han alcanzado por la empresa con base en Redmond y las do ahuyentar los malos espíritus sin saber
noticias aparecidas sobre este tema, las mejo- realmente por qué. Cierto es que no se trata
un lugar destacado en el Olimpo ras resultantes pueden generar un margen de de una ONG si no de toda una multinacional
de los momentos ilustres. confianza del que hasta ahora ha adolecido el que se mueve al son del repiquetear del vil
sistema, y suponer de este modo el espalda- metal pero, ¿qué empresa que forme parte del
Muchos son los que dicen que estamos a razo definitivo para que Vista empiece a fun- mercado de la oferta y la demanda no lo
punto de vivir otro de esos acontecimientos, cionar de la forma en la que tiene que hacer- hace? De hecho, algunos ya vaticinan que la
aunque, eso sí, a una escala mucho menor, lo (aunque hay que advertir que el pack sólo molona Google está condenada a seguir sus
delimitada por el ámbito tecnológico de incluye mejoras y actualizaciones, nada de pasos. Por lo pronto sus empleados “cool” que
nuestros tiempos. La versión final del Service nuevas aplicaciones por lo que a primera vista antes podían llevar mascotas e ir en calceti-
Pack 1 de Windows Vista está a punto de salir, todo seguirá igual). nes por sus oficinas ya han empezado a
o ya lo ha hecho para cuando estés leyendo Sin embargo tras algún tiempo en el sector, sé encorbatarse. Todo un síntoma.
estas líneas, y se espera que su instalación que los adjetivos con los que se adornan los Evaluar la importancia de un punto de infle-
solucione todos los problemas que ha ido comunicados y los números que rematan xión antes de que este se produzca no es una
arrastrando el nuevo sistema operativo de estadísticas y porcentajes tienen “validez” si tarea baladí ya que sólo la perspectiva que
Microsoft desde que saliera hace ya un año. Y te encuentras del mismo lado del espejo (el de proporciona el tiempo inexorable tiene la pre-
es que pese a que aún es muy pronto para Lewis Carrol). Con esto sólo quiero decir que rrogativa de acreditarla. ¿Acaso conseguirá
poder valorarlo, desde la multinacional norte- conviene recibir con cautela cualquier infor- Microsoft dar un golpe de autoridad dando a
americana se anuncia que este paquete de me por un sencillo motivo: aún no he proba- sus usuarios lo que ha venido prometiéndoles
actualizaciones permitirá que Vista pueda por do la versión definitiva y mientras no lo haga, o tendremos que sufrir inútilmente la instala-
fin ser lo que ha venido prometiéndose desde yo, que estoy en todo mi derecho, me haré de ción de un extenso paquete de actualizacio-
hace tiempo: un sistema operativo estable, la hermandad de Santo Tomás, el incrédulo. nes que a buen seguro llevará varias horas?
seguro y de alto rendimiento. El momento de Pero de la misma forma deshagámonos de los Yo prefiero creer que si Microsoft consigue
la verdad ha llegado. prejuicios y del popularismo demonizador que su Service Pack haga la mitad de lo que
La actualización permitirá a los usuarios que ha perseguido a Microsoft durante los promete para Vista, será algo positivo (mea
experimentar mejoras en la compatibilidad de culpa, siempre veré la botella medio llena) ya
las aplicaciones, dispositivos, en la fiabilidad, que en todo caso creo que esto tendrá como
en el rendimiento, en la seguridad y en la vida consecuencia directa un incentivo para el
de la batería del equipo, con el consiguiente mercado, y estimularlo siempre es bueno
aumento en el rendimiento del sistema. Se para nosotros, los usuarios de a pie. Eso sig-
asegura que Windows Vista SP1 soportará nifica que otros se pondrán las pilas para no
diez veces el número de aplicaciones para quedarse rezagados, crearán nuevos produc-
pequeñas empresas y consumidores que la tos, más potentes y versátiles, y que seremos
primera versión de Vista y reducirá el tiempo nosotros los que nos beneficiaremos directa-
empleado en la copia de archivos dentro del Google puede acabar sufriendo el
mente. Y al final y al cabo, eso es lo único que
propio PC o en equipos en red, tanto entre síndrome Microsoft. importa, ¿no?
ACTUALIDAD
ACTUALIDAD
Entrevista a Antonio Gómez Pavón de Microsoft
ACTUALIDAD
nos de cómo ha recibido la comunidad paga, sobre todo en tiempo, y en aplica- AGP: Dar soluciones a los equipos de desarro-
esta nueva tecnología? ciones complejas, más. llo es una de las características principales de
AGP: Es una de las novedades más valora- NV: Asimismo, me llama poderosamente la nueva versión de Visual Studio Team
das por los más de 3.000 usuarios que en la atención la tecnología que aparece en System. Cada vez es más habitual que haya
España ya han probado Visual Studio 2008, Visual Studio 2008 bautizada como distintos roles involucrados en todo el proce-
sobre todo por su productividad, ya que per- Astoria y que incluye de momento un so que creación de software, y desde estas
mite consultas entre distintos tipos de datos pequeño conjunto de interfaces que nuevas versiones mejoramos e incrementa-
(XML, Relacionales, Objetos), algo que podría soportan LINQ sobre HTTP, lo que algu- mos nuevas funcionalidades para el arquitec-
considerarse básico, pero que ahorra tiempo nos se atreven a calificar que podría to, desarrollador, diseñador, profesional de
a la hora de desarrollar. suponer un primer paso en dirección a la base de datos y testers.
NV: ¿Qué hay de cierto en algunas noti- web 3.0 o web semántica. ¿Qué puedes A la hora de gestionar proyectos hay tam-
cias que apuntan a que si no se desarro- decirnos de ella? bién otros roles involucrados en el proceso
lla correctamente el código LINQ, se AGP: Astoria permite a los desarrolladores de desarrollo: jefes de proyectos, analistas,
pueden generar accesos redundantes a la crear y consumir servicios de datos para la directores de desarrollo, CIOs, que gracias a
base de datos y, por ende, disminuir el Web, estos servicios acceden a información Team Foundation Server pueden no solo
rendimiento del sistema? con una simple interfaz HTTP que pueden ser tener un repositorio de código o control de
AGP: El truco es desarrollar correctamen- consumidos por webs basados en AJAX y versiones, sino que pueden tener el control
te ;-) Hay tutoriales y documentación en webs que cuentan con aplicaciones interac- de los proyectos, gestión de tiempos, auto-
nuestro portal MSDN para orientar a los tivas. matizar compilaciones, control de tiempos,
desarrolladores a optimizar su código NV: Cambiando un poco el tercio, ¿qué etc. Asimismo cabe destacar su integración
LINQ. También contamos con partners que puedes decirnos de la importancia que con Project y Project Server.
hoy son especialistas en LINQ y ofrecen vais dando a las versiones Team de Visual NV: En lo que respecta a la nueva tecno-
formación. Seguro que el mal código se Studio? logía Silverlight, desde el punto de vista
ACTUALIDAD
Entrevista a Antonio Gómez Pavón de Microsoft
DVD
DVD
Visual Studio 2008
DISPOSITIVOS MÓVILES
DISPOSITIVOS MÓVILES
Primeros pasos con Android (II)
DISPOSITIVOS MÓVILES
DISPOSITIVOS MÓVILES
Primeros pasos con Android (II)
DISPOSITIVOS MÓVILES
DISPOSITIVOS MÓVILES
Primeros pasos con Android (II)
callback y para el segundo, vamos a ver una sus métodos “onCreate”, “onStart” etc. Se les tos eventos que ocurran en el teléfono,
forma de pasar datos extra a las actividades. llama de la misma forma que a una activi- como que se reciba una llamada, llegue un
Esto se ve claramente en el listado 4. dad: a través de un Intent, con lo que ten- SMS o llegue una cierta hora. En lugar de
Como se ve en el listado, crear el callback es drán que estar también descritos en el mani- hacer un código que continuamente com-
sencillo, ya que sólo hay que sobrescribir el fiesto a través de la etiqueta “service” y sus pruebe si el evento se ha producido, se deja
método “onActivityResult” que viene en toda correspondientes acciones. Entran en ejecu- el código “almacenado” y se activa cuando
clase “Activity”. Este es el punto de entrada ción de la siguiente manera: el evento de interés se produzca. No tienen
de toda actividad que termina, y la diferen- Intent i = new Intent(Intent.INSERT_ interfaz de usuario asociada, pero al igual
ciaremos gracias al parámetro ACTION); que los servicios, pueden utilizar el
“requestCode”. El parámetro “resultCode” y el startService(i);
NotificationManager.
parámetro “data” nos los pasa la actividad Aunque pueden registrarse de forma pro-
que ha finalizado (a través del método El método “stopService(Intent)” lo para (o gramática (usando métodos como
“setResult(int code, string data)”). El paráme- “stopSelf” si estamos dentro del código del pro- “Context.registerReceiver”), lo ideal es
tro “extras” sirve para recoger datos extra. pio service) y para conseguir una referencia al registrarlos en el manifiesto. Se registran
En el momento de llamar a la actividad, al servicio en ejecución utilizaremos el método de la forma usual: con un intent-filter y
método “startSubActvity” se le pasa un pará- “bindService(Intent)”. Este último método crea unas acciones, esta vez dentro de una eti-
metro extra que actúa de identificador, y que una conexión entre el servicio y el que llama a la queta “receiver”. La clase que ejecute el
luego se retornará en el callback en forma función. El servicio se mantendrá activo mien- código heredará de “IntentReceiver”. Esta
del parámetro requestCode. Para añadir tras se haya empezado su ejecución o mientras clase tiene un método que ha de sobrescri-
datos extra, se utiliza el método “putExtra” existan conexiones a él. Si una actividad está en birse:
de la clase “Intent”, donde se añade un iden- estado visible y con máxima prioridad y además @Override
tificador del extra y el dato en sí. tiene una conexión a un servicio, el servicio pasa
public void onReceiveIntent (Context
Por último, es posible forzar la ejecución de a su vez a tener una prioridad alta.
c, Intent i)
una actividad concreta que deseemos en
{
lugar de dejar al sistema que busque la acti- Notificaciones
vidad por defecto. Se hace de la siguiente Los servicios que no están ligados a una inter- Super.onReceiveIntent(c, i);
manera: faz de usuario tienen su forma de notificar a //…
Intent i = new Intent(Intent.INSERT_ la propia interfaz del sistema de eventos que
}
ACTION, ActividadConcreta.class); ocurran en ellos. Para ello utilizan las notifica-
this.startSubActivity(i);
ciones, que son mensajes que salen de forma Ahí es donde podremos colocar el código
flotante para notificar mensajes y tras un deseado. Es importante señalar que este
Servicios tiempo desaparecen, todo ello de forma asín- código tiene que ser síncrono y no puede
crona mientras la interacción ocurre en otra recibir callbacks. También es importante
En numerosas ocasiones es necesario ejecutar parte. Tienen varias formas de aparecer: señalar que hay que tener especial cuidado
un código que no está de ninguna manera Un objeto “View” que se muestra de si se registran Intent Receivers en los méto-
ligado a una interfaz de usuario. Por ello, no forma temporal, el más común y más dos de pausa de una actividad. Si se regis-
tiene ningún sentido crear una actividad, sólo parecido a las notificaciones de Windows tra en el método “onPause()” debe desregis-
sería necesario el propio código. Un opción o Linux. trarse en el “onResume()”. No es aconsejable
incorrecta en la que suele pensar es arrancar Un icono que se muestra en la barra de desregistrar un Intent Receiver en el méto-
un Thread aparte una vez comienza la activi- tareas esperando a que se pulse para do “onFreeze()”.
dad (por ejemplo en el método “onCreate”). mostrar el mensaje. Es posible también provocar un Intent con-
Esto es incorrecto y da lugar a que el thread Pilotos luminosos que se encienden en el creto desde la propia aplicación para arran-
finalice de forma repentina en cuanto la acti- dispositivo. car el Intent Receiver deseado, a través del
vidad acaba. Recordemos que al ver el ciclo de Alertas en forma de pitidos, vibraciones o método “Context.broadcastIntent(Intent)”.
vida de una actividad, había momentos en los luz de la pantalla.
que el sistema podía decidir destruirla por Para mostrarse se utiliza la clase Conclusión
necesidades urgentes, o simplemente porque “NotificaitionManager” y sus métodos
la actividad acababa por su cuenta. En esos “notifyWithView” o “notifyWithText”. Se le En este artículo hemos visto algo más en
momentos se destruye tanto la actividad pasan parámetros como un identificador detalle cómo crear interfaces gráficas,
como los Threads que haya arrancado. Un hilo único de notificación, elemento View a mos- eventos y varios tipos de bloques. Hemos
de ejecución no tiene suficiente entidad por él trar o mensaje de texto que debe aparecer, descubierto un paradigma novedoso en
mismo como para seguir con vida una vez duración o gravedad del mensaje, entre otros. cuanto a cambio de ventanas y uso de
finaliza la actividad que lo arrancó. Para estas formularios para tareas específicas en
situaciones Android y su esquema de bloques Intent Receivers lugar de sólo para una aplicación.
tienen un elemento especial llamado servicio. Android es muy novedoso en muchos
Los servicios heredan de la clase “Service” y Los Intent Receivers son códigos que que- aspectos, veremos más aún en el siguien-
tienen de la misma forma que una actividad remos que ejecuten como respuesta a cier- te artículo.
DISPOSITIVOS MÓVILES
Desarrollo de aplicaciones
con pyS60
PEDRO PLEGUEZUELOS LEDESMA que las aplicaciones para las dos versiones ante-
riores y la tercera son incompatibles. Es decir, una
PyS60 es una versión de Python aplicación desarrollada para la plataforma S60v2
ideada para dispositivos móviles no funcionará en un dispositivo con plataforma
S60v3. Esto es debido a que S60v3 trabaja sobre
con sistema operativo Symbian y una nueva versión de Symbian (v9.1).
de tipo Serie 60. Este lenguaje nos El objetivo de este artículo será presentar un
ofrece grandes posibilidades a la camino para desarrollar aplicaciones sobre dispo-
sitivos móviles con plataforma S60v3. Para ello
hora de desarrollar aplicaciones usaremos una versión del lenguaje Python adap-
bajo esa plataforma. Con muy tada a este tipo de plataformas llamada pyS60.
pocas líneas de código es posible
crear aplicaciones realmente
funcionales accediendo a todos los
servicios que el dispositivo móvil
ofrece.
Introducción
Por todos es sabido que un sistema operativo es la
capa de software que envuelve y oculta las pecu- Figura 1. Diagrama de capas.
liaridades del funcionamiento del hardware.
Gracias a esta capa de software no es necesario Python para Serie 60
saber con exactitud la arquitectura de la máquina
que estamos programando. Sería realmente Python es un lenguaje de programación interpre-
tedioso programar una aplicación para una tado de propósito general y multiparadigma. Esto
máquina sin sistema operativo. significa que puede usarse para crear programas
Algunos terminales móviles de última generación siguiendo múltiples filosofías: orientados a objetos
ya disponen de sistema operativo incorporado. Por o estructurados, entre otros. Fue creado por Guido
ejemplo, tenemos Windows Mobile, Palm OS o Van Rossum, científico de computación holandés.
Symbian OS, nacido este último para competir con Su objetivo era crear un lenguaje sobre todo de
los dos anteriores. Symbian soporta actualmente fácil lectura y uso. En el argot, suele decirse que un
cuatro tipos de dispositivos móviles: Serie 60, Serie código es “Pythonico” si sigue esos ideales.
80, Serie 90 y UIQ. La más usada es la plataforma De ahora en adelante supondremos que el lector
Serie 60, principalmente por la marca finlandesa está familiarizado con el lenguaje Python y nos
Nokia. Estas plataformas consisten en un conjunto centraremos en las particularidades de Python
de librerías destinadas a facilitar el acceso a las sobre la plataforma S60. En el sitio oficial de
diversas funcionalidades del dispositivo como por Python el lector podrá encontrar un interesante
ejemplo funciones propias de telefonía, herramien- tutorial para iniciarse en este lenguaje:
tas de gestión personal o reproductores multime- http://docs.python.org/tut/.
dia. Una de las principales características de los ter- Python para la plataforma S60 (pyS60) es una
Material adicional minales S60 es que pueden soportar aplicaciones versión modificada de la versión 2.2.2. de Python
El material complementario puede Java MIDP 2.0, Symbian, C++, Flash o Python. adaptada para su uso en dispositivos móviles. A
ser descargado desde nuestra web Actualmente la plataforma S60 se encuentra en fecha de edición de este artículo, la última versión
www.revistasprofesionales.com su tercera edición (S60v3). Es importante señalar de pyS60 es la 1.4.1 Final.
DISPOSITIVOS MÓVILES
Desarrollo de aplicaciones con pyS60
class calculadora(object):
#Constructor
def __init__(self):
DISPOSITIVOS MÓVILES
DISPOSITIVOS MÓVILES
Desarrollo de aplicaciones con pyS60
MIDDLEWARE
Material adicional
El material complementario puede
ser descargado desde nuestra web
www.revistasprofesionales.com Figura 1: Archivo DBML y modelo relacional de datos.
MIDDLEWARE
LINQ para SQL (y II)
TABLA 1: LINQ para Objetos vs. LINQ para SQL importante es que puedes incluir directa-
Ejemplo de LINQ a Objetos Ejemplo de LINQ a SQL mente en el código una consulta:
var socios = from soc in clubDeportivo.
int[] números = new int[] {0,4,2,8,6}; var facturas =
Socios
var resultado = from n in números from fac in clubDep.Facturas
where soc.Nombre == “Susana”
where n < 5 where fac.Socio.Nombre==”Carlos” select soc;
orderby n select fac;
La variable “socios” almacena la definición de
select n; la consulta, que retornará todos los miem-
bros del club deportivo con el nombre
“Susana”. Para ejecutarla, basta solamente
con acceder a alguna de sus filas, empleando
por ejemplo, la estructura foreach siguiente:
foreach (var soc in socios) {
Console.Write (“Socio = “ + soc.Nombre
+ “, Apellido = “ + soc.Apellido);
}
MIDDLEWARE
Figura 3. El nuevo tipo de archivo ofrecido por Visual Studio 2008 tiene extensión dbml.
MIDDLEWARE
LINQ para SQL (y II)
MIDDLEWARE
MIDDLEWARE
LINQ para SQL (y II)
//Se recorren todos los conflictos detectados en esta fila; cada entrada del bucle contiene un problema.
foreach (var conflictosPorFila in conflictos.MemberConflicts)
{
conflictosPorFila.Resolve(RefreshMode.KeepCurrentValues);
}
MIDDLEWARE
en este caso de tipo “ChangeConflict cionado. Veamos entonces, en el listado 4, lo Para las tablas de la figura 5 consideré un
Exception”. Esta siempre es producida en el que necesitamos para resolver el conflicto. usuario 1 y otro 2, el segundo siempre guar-
momento de sincronizar la copia privada, o La propiedad “ChangeConflicts” del objeto da su copia, mientras que el primero es quien
lo que es igual, cuando se invoca al méto- “cd” (clubDeportivoDataContext) retorna una descubre el conflicto cuando intenta sincro-
do “SubmitChanges”. colección de errores por fila. La segunda nizar sus modificaciones. Como ves, con
Una forma fácil de comprobar alguno de estructura foreach obtiene por cada fila la estas tres opciones puedes resolver todos los
estos escenarios es teniendo más de una ins- lista de conflictos de concurrencia. Si por escenarios, y brindar una solución definitiva
tancia de la aplicación a la vez que conserven ejemplo el usuario 1 modifica el nombre y el al problema de concurrencia.
una variable con una copia local de las filas. apellido del socio y lo mismo hizo el usuario
Presta atención ahora al listado 3, el cual 2, entonces habrán 2 conflictos a resolver Conclusiones
muestra el esqueleto de código LINQ que (“MemberConlicts” retornará 2 elementos).
administra los errores resultantes de un He agregado a su vez algunos comentarios La verdad es que en esta ocasión, una vez
conflicto. en el código para que puedas analizarlo paso más, me he quedado sin espacio para seguir
Como puedes apreciar, el método a paso. La última línea que se encuentra explicándote los secretos de LINQ para SQL.
“SubmitChanges” especifica como parámetro resaltada indica qué hacer. En ella, podemos Tenía en mente mostrarte cómo utilizar pro-
un valor del enumerado “ConflictMode”, que indicar una de las tres alternativas mostradas cedimientos almacenados, lo que brinda una
le dice a LINQ que continúe enviando los en la tabla 4. flexibilidad mayor. No obstante, hay otras
cambios de las filas pese a que se produzcan Se debe llamar a “SubmitChanges” una vez tecnologías que tratar y creo haber cubierto
errores de concurrencia. Esto te permitirá que el método “Resolve” es invocado en las los aspectos más importantes, así como
posteriormente obtener en una colección filas con problemas, ya que es este quien algunos de los avanzados, lo que sin lugar a
toda la lista de problemas. He adicionado un finalmente se encarga de enviar los cambios dudas te dará la posibilidad de seguir reco-
bloque de captura de excepciones en donde a la base de datos. rriendo por tí mismo el mundo LINQ.
escribiré el código para la gestión del conflic- Me imagino que estarás un poco confundido, Como siempre, me despido dejándote un abra-
to. La última línea por su parte reenvía las por lo que en la figura 5 te muestro los cam- zo, recibiendo tus comentarios a través de tus-
modificaciones cuando el asunto se ha solu- bios y resultados para cada caso. [email protected].
Sólo Programadores
en Formato
Digital
Por menos dinero
Llegará antes a su ordenador que a los quioscos
Entre en www.revistasprofesionales.com
Suscripción anual a Sólo Programadores (12 números) por sólo 27 euros
BBDD(4d) 21/2/08 13:12 Página 36
BASES DE DATOS
Caso práctico
con 4D v11 SQL (y III)
desarrolladores, consideramos que cierta funcio-
PABLO OLMOS
nalidad de nuestra base de datos puede ser útil
En la primera entrega de esta serie nos para otros desarrollos, podemos “convertirla” en
componente, y reaprovecharla desde otras bases
centramos en explicar, paso a paso, de datos, integrándola en ellas mediante arras-
cómo crear una base de datos así como trar y soltar.
sus formularios de creación, consulta, En realidad, con el modelo de componentes de
4D v11 SQL, se nos está ofreciendo una potente
modificación y eliminación de datos. herramienta para lleva hasta el límite el concep-
En la segunda entrega entramos de to de desarrollo modular y reutilización de códi-
go, dos conceptos estratégicos en la programa-
lleno en la programación de ción ágil.
funcionalidades mediante escritura A continuación, demostraremos cómo integrar,
directa de código, lo cual nos permitió en nuestra base de datos de ejemplo, un compo-
nente ya desarrollado y probado que permite
comprobar la potencia del lenguaje de gestionar productos. Este componente se llama
4D v11 SQL. En esta última entrega “4D Product Management.4dbase”, y se encuen-
nos centraremos en otros aspectos no tra junto con el material complementario que
acompaña a este artículo.
menos importantes, como puedan ser
la creación y gestión de componentes, Instalación del componente
Para instalar el componente, haremos lo siguiente:
así como la publicación de nuestras Si tenemos el entorno 4D v11 SQL abierto, lo
bases de datos en la web, o la creación cerraremos.
y consumo de servicios web. En el sistema de ficheros de nuestro sistema
operativo, si “buceamos” por la estructura de
Componentes: el desarrollo modular de 4D directorios de nuestra base de datos, encontra-
remos un directorio llamado “Components”.
Los lectores que tuvieron la ocasión de tener en Como el lector supondrá, todo componente
sus manos el número 155, correspondiente al integrado en nuestra base de datos tendrá que
pasado mes de diciembre, pudieron leer un com- ubicarse aquí. Entonces, lo que haremos será
pleto artículo dedicado a la creación y gestión de
componentes en 4D v11 SQL. En aquella ocasión,
hicimos hincapié en la instalación de componen-
tes creados por terceros, y además dimos unas
pinceladas de lo necesario para crear nuestros
propios componentes. Sin embargo, si el lector
no tuvo la ocasión de leer dicho artículo, a con-
tinuación haremos un breve repaso, ahora desde
un punto de vista totalmente práctico.
Para quienes no hayan oído nunca hablar de los
componentes de 4D, decir que un componente
Material adicional es una librería de códigos y formularios que
El material complementario puede puede ser incorporada a cualquier base de datos
ser descargado desde nuestra web 4D mediante una sencilla operación de arrastrar Figura 1. El Explorador muestra el
www.revistasprofesionales.com y soltar. Dicho de otra manera: si nosotros, como componente instalado.
BASES DE DATOS
Caso práctico con 4D v11 SQL (y III)
Este método, del componente “4D Product Figura 2. Nuestro componente en ejecución.
Management.4dbase”, creará las tablas nece-
sarias mediante SQL.
LISTADO 1 planilla.shtml
<html>
Importación de datos <head>
En el material complementario se han <title>Productos</title>
incluido también dos ficheros de texto: <link rel=”stylesheet” href=”/css/emx_nav_left.css” type=”text/css” />
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8”><style type=”text/css”>
“productos.txt” y “categorías.txt”. Si abrimos <!—
estos dos ficheros, observaremos que con- body {
background-image: url(logo.png);
tienen datos susceptibles de ser importados background-repeat: no-repeat;
(a partir de la segunda línea, claro está). A background-color: #FFFFFF;
partir de aquí, será nuestra labor importar }
—>
estos datos, tendiendo en cuenta que: </style></head>
Los datos del fichero “productos.txt” los <body>
<div align=”center”>
importaremos en la tabla “Prod”. <h1>Título acá</h1>
Los datos del fichero “categorías.txt” los <table width=”70%” border=”1”>
importaremos en la tabla “Cat”. <!—CUERPO DE LA PÁGINA —>
Para importar estos datos, elegiremos la
opción “Archivo -> “Importar” -> “Desde un </table>
</div>
archivo”. Elegiremos el fichero TXT y, a conti- </body>
nuación, se nos mostrará la ventana de </html>
importación. Esta ventana, nos ofrece una
vista previa o previsualización de cómo los “Products” de la lista desplegable al ele- como búsquedas, adición y modificación de
datos contenidos en el fichero de texto serán mento de menú creado. Este método es un registros (véase la figura 2).
asignados a cada uno de los campos de la método de componente que no podemos
tabla. A continuación, solo tendremos que modificar, sin embargo lo tenemos a nues- Desarrollo web
pulsar en “Importar” para luego pulsar en el tra disposición para usarlo. Por último,
botón “Sí a todo” de la ventana de diálogo marcaremos la opción “Iniciar en nuevo Afortunadamente, el entorno 4D v11 SQL
que nos aparecerá. proceso”. cuenta con un servidor web incorporado, el
cual nos permitirá publicar en la web los
Creación del menú Probando el componente datos de nuestra base de datos, de manera
Ahora, nuestro objetivo será crear un Desde el menú “Ejecutar”, pulsaremos sobre dinámica. La figura 3 nos muestra el cuadro
menú con objeto de listar los productos de “Probar aplicación”. A continuación, iremos de preferencias del servidor web que nos
nuestra base de datos. Para ello, desde el a “Productos” -> “Lista de productos”. Como ofrece 4D.
Editor de Menús, crearemos uno nuevo veremos, se nos mostrará una lista de pro- Veamos ahora cómo publicar el contenido
cuyo nombre será “Productos”. Le añadire- ductos mostrada en un formulario de pro- de nuestra base de datos, concretamente,
mos un elemento llamado “Lista de pro- yecto del componente, en el que podremos nuestra lista de productos. El primer paso
ductos”. Ahora asociaremos el método utilizar funcionalidades preprogramadas consistirá en arrancar el servidor web.
BASES DE DATOS
Con la etiqueta 4DLOOP haremos un bucle permiten invocar a los métodos de 4D indi-
sobre la tabla “Prod” de la siguiente manera: cados después de “4DACTION/”.
Para ello, haremos clic en “Ejecutar” -> <!—4dloop [Prod]—><tr> En este momento, y después de todos estos
“Arrancar servidor web”. <td><a href=”/4daction/detalles_prod? cambios, nuestro fichero prods.shtml, que
A continuación crearemos un nuevo método id=<!—4dvar [Prod]ProdID—>”><!—4dvar
originalmente era igual que el listado 1,
de proyecto llamado “web_Lista_de_Prods”, [Prod]ProdID—></a></td>
ahora debería ser como el listado 2. Ahora, ya
y en sus propiedades estableceremos solo nos queda comprobar que todo va bien.
<td><!—4dvar [Prod]Name—></td>
“Disponible vía 4DACTION, 4DMETHOD y Para eso, invocaremos a la siguiente URL
4DSCRIPT”. El código que introduciremos en <td><!—4dvar [Prod]Des—></td> desde nuestro navegador web:
este método será el siguiente: <td align=”right”><!—4dvar String([ http://localhost/prods.shtml
ALL RECORDS([Productos]) Prod]Prix;”$ #########,00”)—></td>
</tr> Si todo ha ido como es de esperar, lo que
Hecho esto, es momento ahora de crear el <!—4dendloop—> veremos será algo parecido a la figura 4.
documento HTML que mostrará nuestra Si el lector estudia el contenido del listado 2
lista de productos. Para ello, abriremos el Sobre este ultimo código, solo dos comenta- atentamente, observará que, en el campo
documento “plantilla.shtml” ubicado en el rios. Por un lado, aclarar que la etiqueta identificador de la tabla de productos, hemos
directorio “Carpeta Web” del material com- “4DVAR” sirve para invocar el valor de una escrito el siguiente código:
plementario, y lo guardaremos con otro variable o campo de 4D. Por otro lado, decir <a href=”/4daction/detalles_prod?id=
nombre: “prods.shtml” (véase el listado 1). que los enlaces tipo: <!—4dvar [Prod]ProdID—>”>
Sobre este fichero, haremos los siguientes <a href=”/4DACTION/Metodo_de_proyecto”> <!—4dvar [Prod]ProdID—></a>
cambios.
El título del documento lo pondremos en la
etiqueta “H1”, y será “Productos”.
Con la etiqueta “4DSCRIPT” invocaremos
nuestro método de proyecto recién creado
“web_Lista_de_Prods”:
<!—4dscript/web_Lista_de_Prods—>
BASES DE DATOS
Caso práctico con 4D v11 SQL (y III)
LISTADO 2 prods.shtml que tendrá por objeto mostrar los detalles del
<html> producto, para que puedan ser modificados y
<head> enviados al motor de 4D. El listado 3 recoge el
<title>Productos</title>
<link rel=”stylesheet” href=”/css/emx_nav_left.css” type=”text/css” /> contenido íntegro del fichero “edit_prod.shtml”.
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8”><style type=”text/css”> Y por fin, crearemos el método de proyecto
<!—
body { “detalles_prod”, estableciendo en sus propie-
background-image: url(logo.png); dades que se aun método “Disponible vía
background-repeat: no-repeat;
background-color: #FFFFFF; 4DACTION, 4DMETHOD y 4DSCRIPT”, y escri-
} biendo en él este código:
—>
</style></head> C_LONGINT(id)
<body>
<div align=”center”> QUERY([Prod];[Prod]ProdID=id)
<h1>Productos</h1> SEND HTML FILE(“edit_prod.shtml”)
<table width=”70%” border=”1”>
<!—4dscript/web_Lista_de_Prods—>
<tr> Llegados a este punto, solo nos queda crear
<th>ID</th> el método de proyecto “edit_producto”.
<th>Producto</th>
<th>Código</th> Como se desprende del estudio del listado 3,
<th>Precio (USD) </th> este método recibirá los datos enviados por
</tr>
<!—4dloop [Prod]—> el formulario y, en base a ellos, tendrá que
<tr> actualizar la información de la tabla “Prods”.
<td><a href=”/4daction/detalles_prod?id=
<!—4dvar [Prod]ProdID—>”> Para conseguir este propósito, marcaremos el
<!—4dvar [Prod]ProdID—></a></td> método como “Disponible vía 4DACTION,
<td><!—4dvar [Prod]Name—></td>
<td><!—4dvar [Prod]Des—></td> 4DMETHOD y 4DSCRIPT”, escribiendo en él
<td align=”right”> este código:
<!—4dvar String([Prod]Prix;”$ #########,00”)—></td>
</tr> QUERY([Prod];[Prod]ProdID=vID)
<!—4dendloop—>
</table> If (Records in selection([Prod])=1)
</div> [Prod]Name:=vProducto
</body>
</html> [Prod]Prix:=vPrecio
Es por ello que en la figura 4 el identificador Ahora, basándonos en el contenido del listado [Prod]Des:=vCodigo
del producto (campo “ID”) aparece de color 1, o lo que es lo mismo, en el contenido del SAVE RECORD([Prod])
azul, como enlace HTML. Ahora, la pregunta fichero “plantilla.shtml”, crearemos el fichero End if SEND HTTP REDIRECT(“/prods.
es: ¿hacia dónde apunta este enlace? Como “edit_prod.shtml” añadiéndole un formulario shtml?r”+String(Random))
hemos comentado antes, la etiqueta “4DAC-
TION” permite invocar un método de 4D. Por
lo tanto, lo que estamos diciendo con el códi-
go anterior es que cuando el usuario haga
clic sobre el valor del campo “ID”, estará invo-
cando al método “detalles_prod”, pasándole
como parámetro el identificador del propio
producto. El objetivo de este método no será
otro que recibir la petición del usuario y mos-
trar una página HTML con los detalles del
producto, para que el propio usuario pueda
visualizarlos y modificarlos. Veamos cómo
conseguir esto.
Como es de suponer, necesitamos poder reci-
bir esta petición desde 4D para poder proce-
sarla. Con objeto de poder manipular las Figura 5. Pantalla de edición de producto.
variables e invocaciones que nos llegan
desde el servidor web, es necesario crear el
método de proyecto “COMPILER_WEB”, con
el siguiente código:
C_LONGINT(id)
C_LONGINT(vID)
C_TEXT(vProducto;vCodigo)
C_REAL(vPrecio)
Figura 6. Iniciando el “Asistente de Servicios Web”.
BASES DE DATOS
LISTADO 3 edit_prods.shtme
Con esto, hemos cerrado ya el círculo. <html>
Ahora, tenemos una página web que mues- <head>
<title>Productos</title>
tra el contenido de nuestra tabla “Prods”. <link rel=”stylesheet” href=”/css/emx_nav_left.css” type=”text/css” />
Además, permite al usuario entrar en los <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8”><style type=”text/css”>
<!—
detalles de un producto, modificar sus body {
datos y actualizar así la tabla “Prods”. Con background-image: url(/https/es.scribd.com/logo.png);
background-repeat: no-repeat;
este ejemplo sencillo hemos visto lo fácil background-color: #FFFFFF;
que es hacer un desarrollo web con 4D v11 }
—>
SQL. Evidentemente que lo visto hasta </style></head>
ahora no es más que la punta del iceberg, <body>
<div align=”center”>
ya que 4D v11 SQL es una tecnología pen- <h1> </h1>
sada para ofrecer funcionalidades mucho <h1>Editar producto</h1>
<p> </p>
más ricas y avanzadas, haciendo uso exten- <form action=”/4daction/edit_producto” method=”post”>
sivo de AJAX. <table width=”70%” border=”1”>
<tr>
<td>Producto</td>
4D como cliente de servicios web <td><textarea name=”vProducto” id=”vProducto”>
<!—4dvar [Prod]Name—></textarea>
<input name=”vID” id=”vID” type=”hidden”
En las próximas líneas vamos a comprobar value=”<!—4dvar [Prod]ProdID—>”></td>
</tr>
lo sencillo que puede ser consumir un ser- <tr>
vicio web desde nuestra aplicación 4D. <td>Código</td>
<td><input name=”vCodigo” type=”text” id=”vCodigo”
Concretamente, la funcionalidad que value=”<!—4dvar [Prod]Des—>”></td>
vamos a incorporar a nuestro desarrollo, </tr>
<tr>
vía servicio web, será la de un conversor de <td>Precio</td>
monedas cuyo fichero de descripción de <td><input name=”vPrecio” id=”vPrecio” type=”text”
value=”<!—4dvar [Prod]Prix—>”></td>
servicio se encuentra en: </tr>
<tr>
http://www.webservicex.net/Currency <td> </td>
Convertor.asmx?wsdl <td><input name=”Enviar” type=”submit” id=”Enviar” value=”Enviar”></td>
</tr>
</table>
Lo primero que haremos será abrir el </form>
“Asistente de Servicios Web” que encontra- </div>
</body>
remos en el Explorador, en la sección </html>
BASES DE DATOS
BASES DE DATOS
Caso práctico con 4D v11 SQL (y III)
Figura 13. Ventana de propiedades del método “WS_Producto_Precio”. Figura 14. El fichero WSDL de nuestro servicio web.
BASES DE DATOS
Conclusiones
Con estas palabras finalizamos aquí una
serie de tres entregas, con un enfoque
totalmente práctico, y dedicada a la nueva
versión del entorno de desarrollo con base
de datos integrada de 4D: 4D v11 SQL. En
esta serie hemos aprendido a crear una
base de datos desde cero, diseñando su
modelo de datos con el editor de estructu-
ra visual de 4D v11 SQL, hemos creado las
tablas para implementar este modelo de
datos, hemos aprendido también todo lo
Figura 18. Ventana de construcción de la aplicación, pestaña “Estructura compilada”. necesario para crear formularios de con-
sulta, inserción, modificación y eliminación
podremos indicar cuestiones como gene- guntando por la “Ubicación de 4D Volume de datos en nuestras tablas. Además,
rar un componente o bien generar una Desktop”, en realidad lo que se nos está hemos visto cómo enriquecer nuestra base
estructura compilada. pidiendo es el directorio que contiene de datos mediante la programación de
Sin embargo, si abrimos la pestaña todos los archivos necesarios para la procesos y triggers. Además, hemos visto
“Aplicación” (véase esta pestaña en la generación del ejecutable. Si hacemos clic las capacidades de 4D v11 SQL en materia
figura 19), encontraremos los menús y en el botón “Construir”, crearemos por fin de desarrollo modular con la creación y
opciones necesarias para generar una nuestra aplicación ejecutable, que tendrá gestión de componentes. Por último,
aplicación ejecutable. A destacar que, un aspecto como el que se muestra en la hemos comprobado lo fácil que es publicar
cuando en esta ventana se nos está pre- figura 20. el contenido de nuestra base de datos en la
web, así como la creación y consumo de
servicios web. Y como conclusión de la
serie, hemos mostrado cómo empaquetar
nuestra aplicación en un ejecutable.
Esperamos que lo visto hasta ahora haya
resultado de interés y, sobre todo, haya
servido como punto de partida para que el
lector inicie su descubrimiento de la tecno-
logía 4D v11 SQL.
Referencias
Este artículo está completamente basado en
el material creado por 4D Hispano, y pre-
sentado en las sesiones de laboratorio del
evento Software Guru, a finales de 2007. La
información presentada en este artículo
puede ampliarse consultando los siguientes
enlaces:
http://www.4d.com/docs/CMU/CMU02008.HTM
http://www.4d.com/docs/CMU/CMU02070.HTM
http://www.4d.com/docs/V6U/V6U00063.HTM
Figura 19. Ventana de construcción de la aplicación, pestaña “Aplicación”. http://www.4d.com/docs/V6U/V6U00064.HTM
REDES
this.updateTitleLst(o); doc.appendChild(oLi);
this.selectImg(0);
Obsérvese que en el último paso se añade al array
} el elemento “oA”, es decir, en enlace recién creado.
Material adicional
El material complementario puede Este método realiza tres tareas: actualiza la lista de Luego el valor de “i” es siempre el índice dentro de
ser descargado desde nuestra web imágenes, actualiza las imágenes mismas y final- ese array en el que se encuentra el enlace corres-
www.revistasprofesionales.com mente selecciona la primera imagen de la lista. pondiente a la iteración “i”.
REDES
Slideshow de imágenes con AJAX, XML y DOM (y III)
REDES
Aspecto de la aplicación con una imagen seleccionada. Momento de la transición entre una imagen y otra.
oListener: null,
El método “addObjListener” recibe ahora un Más adelante se comprobará, pero
nuevo parámetro, “oArgs”, que puede ser de addListener: function(oListener) {···}, “OpacityTrans” sólo va a generar un evento
cualquier tipo (un número, una cadena de fadeOff: function(oElement, iMillis) {···}, que es el que marca el final de la transición.
caracteres, un array, otro objeto, etc.). La fun- opacity: function(iOpacity) {···}, El método “opacity” es el que realmente
ción “HandlerImpl” se modifica para que se uti- setOpacity: function(oElementStyle, modifica la opacidad del elemento objeto de
lice este parámetro adicional en la llamada al iOpacity) {···}, la transición, y lo hace de manera que se
método del objeto que hace de “escuchador” fire: function() {···}
garantiza el funcionamiento para la mayor
del evento. parte de los navegadores que hay en la
};
Con el cambio descrito, la llamada captura actualidad:
de los clics quedaría como sigue: El objeto cuenta con tres atributos: opacity: function(iOpacity) {
EventUtil.addObjListener(oA, “click”, “oElement”, “oElementStyle” y “oListener”. El var iOpacityCalc = (iOpacity / 100);
this, this.clickListener, i); primero es el elemento objeto de la transi-
this.oElementStyle.opacity =
ción. El segundo atributo es un acceso direc-
iOpacityCalc;
El parámetro “i” es un valor numérico que se to al valor del atributo “style” de dicho ele-
this.oElementStyle.MozOpacity =
corresponde con el índice de de un array. El mento. Finalmente “oListener” es la función
método “clickListener” queda: que “escucha” los eventos que lanza iOpacityCalc;
REDES
Slideshow de imágenes con AJAX, XML y DOM (y III)
nada va a afectar que se cree el atributo “oElement.style” simplemente para optimi- un único parámetro, “i”, que es el índice que
“MozOpacity” en el objeto “style”. zar los accesos. Seguidamente se crea una identifica a la imagen seleccionada, tanto en
Si el método “opacity” es el responsable de variable, “iSpeed”, que es el resultado de el atributo “arrLnk”, el array de elementos
modificar la opacidad de un elemento una dividir el tiempo, “iMillis”, por 100. La transi- “<a>”, como en el atributo “arrImg”, el array
sola vez, el método “fadeOff” es el respon- ción consiste en modificar la opacidad del de elementos “<img>”:
sable de hacerlo varias veces, modificando elemento 100 veces, desde totalmente opaco selectImg: function(i) {
la opacidad de 100 ó 1 (totalmente opaco) (100 o 1, según el sistema de medición) ···
a 0 (totalmente transparente). En otras hasta totalmente transparente (0), y la varia-
}
palabras, este método es quien realmente ble “iSpeed” lo que viene a calcular es el
realiza la transición. Recibe dos paráme- tiempo que tiene que transcurrir entre El atributo “iSelectedIndex” del objeto
tros, el primero es el elemento cuya opaci- modificaciones de la opacidad. La variable “Slideshow” guarda el índice correspondien-
dad se quiere modificar dinámicamente “iTimer”, que se define a continuación ini- te a la imagen anteriormente seleccionada.
mediante una transición que podría califi- cialmente con el valor 0, también contribuye Su valor puede ser “-1”, lo que indica que no
carse como “suave”: de totalmente opaco a a implementar esa hipotética línea del tiem- existe ninguna imagen seleccionada. Esto
totalmente transparente, poco a poco po controlando cuántas unidades de tiempo ocurre cuando se crea el objeto “Slideshow”.
comprendido en un espacio fijo de tiempo. “iSpeed” han trascurrido. Establecidos los Cuando se da este caso, en realidad no hay
El segundo parámetro es precisamente ese valores de “iSpeed” y “iTimer”, y modificada que hacer transición entre una imagen y
espacio de tiempo: inicialmente la opacidad del elemento para otra sino simplemente mostrar la imagen
run: function(oElement, iMillis) { que sea totalmente opaco, el paso final con- seleccionada:
this.oElement = oElement; siste en hacer un bucle mediante el cuál se if (this.iSelectedIndex!=-1) {
modifica 100 veces la opacidad. Para contro- ···
this.oElementStyle = oElement.style;
lar el tiempo entre modificación y modifica-
var iSpeed = Math.round(iMillis / 100); } else {
ción, la propia modificación se lanza aprove-
var iTimer = 0; this.arrLnk[i].className = “sel”;
chando la función estándar “setTimeout”. El
this.opacity(100); primer parámetro es una llamada a la fun- this.arrImg[i].className = “sel”;
for(var i=100; i>=0; i—) { ción que realmente cambia la opacidad para }
setTimeout(“OpacityTrans.opacity(“ + i esa iteración del bucle. El segundo paráme- La acción de mostrar una imagen consiste
+ “)”, iTimer*iSpeed); tro marca el tiempo. Por último, cuando el simplemente en cambiar el atributo
iTimer++;
bucle termina, se llama al método “fire” para “className” del correspondiente elemento
lanzar el evento que avisa del final de la HTML.
}
transición. Cuando el valor de “iSelectedIndex” es dis-
setTimeout(“OpacityTrans.fire()”, tinto de “-1”, existe una imagen selecciona-
iTimer*iSpeed); La selección de las imágenes da que en ese momento se está mostrando.
} El método que recopila y emplea todas las Primeramente se tiene que deseleccionar el
Las dos primeras líneas simplemente asig- funcionalidades explicadas hasta el momen- elemento de la lista actual modificando la
nan valores a los atributos “oElement” y to es “selectImg”. Cuando el usuario hace clic propiedad “className” del enlace:
“oElementStyle” del elemento. El objeto en uno de los elementos de la lista de títulos this.arrLnk[this.iSelectedIndex]
“style” del elemento se guarda en un atribu- de imágenes, o cuando el objeto “Slideshow” .className = “”;
to en vez de hacer constantemente se inicializa, se ejecuta este método. Recibe
El evento “onload” del objeto “window” determina el momento en Cabeceras HTTP de la llamada AJAX cuando se emplea HTTP
que se crea el objeto “Slideshow” y con ello la llamada AJAX. Compression.
REDES
osw.flush();
Seguidamente se guardan en dos variables cual ajusta el título de la lista y la imagen
la imagen seleccionada hasta el momento y correspondientes a la nueva selección. gzipos.flush();
la nueva selección: El método “addListener” sólo configura la gzipos.finish();
var oCurrImg = this.arrImg[this. función que se ejecuta al concluir la transi- baos.flush();
iSelectedIndex]; ción. Es “fadeOff” el método que realmente data = baos.toByteArray();
var oNextImg = this.arrImg[i];
realiza la transición sobre la imagen actual,
haciéndola desaparecer poco. En el segundo paso se devuelven los datos
Antes de comenzar la transición hay que comprimidos al cliente con las cabeceras
apilar las imágenes convenientemente de Optimización en el lado del servidor HTTP correctamente establecidas:
modo que la correspondiente a la selección res.setContentType(“text/plain; charset=
actual esté encima y justo debajo la imagen El Servlet “SSlideshow” representa el lado del ISO-8859-1”);
correspondiente a la nueva selección. Para servidor de la parte AJAX de la aplicación. En res.addHeader(“Content-Length”, Integer
ello se modifica el valor de los atributos un entorno real este Servlet accedería a una .toString(data.length));
“zIndex” del objeto “style” de las imágenes. base de datos, un repositorio de ficheros o
res.addHeader(“Content-Encoding”, “gzip”);
Además la nueva imagen seleccionada se cualquier otra fuente de datos, para cons-
hace visible. En realidad no va a verse por- truir el objeto JSON que devuelve. Con el os = res.getOutputStream();
que se encuentra justo detrás de la selec- objeto de simplificar el desarrollo de la apli- os.write(data);
cionada hasta el momento, pero tiene que cación y facilitar su entendimiento, en este os.flush();
hacerse visible para que se vea a medida caso “SSlideshow” simplemente devuelve
que la imagen correspondiente a la antigua siempre el mismo objeto JSON, que además ¿Qué diferencia hay entre un método y otro?
selección desaparece: se almacena en una variable estática: Desde el punto de vista del cliente práctica-
oCurrImg.style.zIndex = 10; private final static String STATIC_ mente ninguna ya que hoy en día la casi tota-
oNextImg.style.zIndex = 9; JSON_RES = “[{\”src\”: \”img/ophiopogon- lidad de los navegadores soportan HTTP
japonicus-nigrescens.jpg\”, \”width\”:450, Compression. Cuando el navegador recibe los
oNextImg.className = “sel”;
\”height\”:300, \”title\”: \”Ophiopogon datos procedentes del servidor, si encuentra
Una vez que los elementos que van a pro- <i>japonicus</i> ‘Nigrescens’\”},{···}, un cabecera “Content-Encoding” que indique
tagonizar la selección tienen sus propie- ···,{···}]”; que éstos están comprimidos, los descompri-
dades establecidas correctamente, puede me dinámicamente y de forma transparente.
comenzar la transición. No obstante Con respecto a la forma en la que el ser- La diferencia realmente importa estriba en el
antes debe configurarse la función a la vidor devuelve el objeto JSON cabe seña- tamaño de los datos que van del servidor al
que “OpacityTrans” llamará cuando se lar algo que afecta al rendimiento de la cliente. Al usar compresión el tamaño es sen-
termine la transición. Esta función se propia aplicación. En el código se han cre- siblemente menor y por lo tanto, en aplicacio-
define dinámicamente. La variable “oSelf” ado dos métodos, “serviceNormal” y nes que hacen un uso intensivo de AJAX, las
guarda una referencia al propio objeto “serviceHttpCompression”, que ilustran ventajas son evidentes y se pueden resumir
“Slideshow”: dos formas de servir la cadena de texto de manera coloquial diciendo que tardan
var oSelf = this; correspondiente al objeto JSON. El prime- menos en llegar 10KB que 100KB.
OpacityTrans.addListener ( ro representa el método “normal”, y que
function() {
puede resumirse: Conclusiones
res.setContentType(“text/plain; charset=
oCurrImg.className = “”;
ISO-8859-1”); A lo largo de estos tres artículos se ha que-
OpacityTrans.setOpacity(oCurrImg.style, rido exponer un proyecto sencillo y al
bw = new BufferedWriter(new Output
100); mismo tiempo lo más completo posible de
StreamWriter (res. getOutputStream(),
oSelf.selectImgEnd();
“ISO-8859-1”));
desarrollo de aplicaciones web con DOM y
} AJAX. El resultado y sobretodo las técnicas
bw.write(STATIC_JSON_RES);
); empleadas pueden servir fácilmente de
bw.flush(); punto de partida para realizar cualquier otra
OpacityTrans.fadeOff(oCurrImg, 2000);
El método “serviceHttpCompression” en aplicación. En este tipo de aplicaciones,
La función que se ejecuta al terminar la cambio utiliza HTTP Compression, es decir, relativamente complejas y en las que inter-
transición simplemente hace invisible la mandan el contenido comprimido en dos vienen muchos actores, tanto en el servidor
imagen correspondiente a la antigua selec- pasos. El primero lógicamente consiste en la como en el cliente, es muy importante esta-
ción modificando la propiedad propia compresión: blecer una metodología de trabajo que de
“className” del elemento HTML, y resta- baos = new ByteArrayOutputStream(); lugar a desarrollos robustos y que se pue-
blece su opacidad. Éste último paso es gzipos = new GZIPOutputStream(baos); dan mantener razonablemente bien en el
necesario ya que es posible que dicha ima- tiempo. Aquí la orientación a objetos de
osw = new OutputStreamWriter(gzipos,
gen vuelva a seleccionarse posteriormente. JavaScript no es un capricho o una ortodo-
Charset.forName(“ISO-8859-1”));
Finalmente llama al método xia académica. Es una necesidad que hace
osw.write(STATIC_JSON_RES);
“selectImgEnd” del método “Slideshow”, el posible el desarrollo estructurado.
Archivador de revistas
+ archivador de cd´s
por solo
3E
DISEÑO
Programando en Java la
Web Semántica con Jena (II)
Dr. DIEGO LZ. DE IPIÑA GZ. DE ARTAZA (Profesor del Razonar sobre ontologías bien a través de
Departamento de Ingeniería del Software de la Facultad
de Ingeniería de la Universidad de Deusto - ESIDE) motores de reglas o razonamiento OWL.
El objeto de esta entrega será aprender las princi-
En esta segunda entrega ponemos en pales interfaces de programación proporcionadas
práctica mediante la framework Jena por Jena para realizar programación de la Web
Semántica. En concreto, vamos a tomar como
las tecnologías semánticas revisadas referencia el vocabulario RDF Relationship, accesi-
en la primera. Aprenderemos cómo ble en http://vocab.org/relationship/, que describe
crear un grafo RDF, serializarlo a un relaciones de parentesco entre personas. Sobre
este vocabulario y con la ayuda de Jena nos dedi-
fichero o base de datos, inferir caremos a aprender a realizar, en las siguientes
nuevas relaciones sobre él con la secciones, las siguientes acciones:
ayuda de OWL y consultar tal Creación de un grafo RDF definiendo las relacio-
nes de parentesco dentro de una familia. La
modelo mejorado mediante familia ficticia creada puede verse en la figura 2.
SPARQL. Para el final de la entrega Serialización de tal modelo a disco en forma de
DISEÑO
Programando en Java la Web Semántica con Jena (II)
DISEÑO
DISEÑO
Programando en Java la Web Semántica con Jena (II)
LISTADO 3 Consulta del modelo RDF mediante Jena API (“RDF/XML” (opción por defecto), “RDF/XML-
ResIterator parents = model.listSubjectsWithProperty(parentOf); ABBREV”, “N-TRIPLE” e “N3”) y base – la URI
while (parents.hasNext()) { base para nombrar a los conceptos del
Resource person = parents.nextResource();
// Imprime la URI del recurso modelo RDF. Asimismo, para leer un modelo
System.out.println(person.getURI()); del sistema de ficheros se puede utilizar cual-
} quiera de los métodos “Model.read()” provis-
NodeIterator moreParents = model.listObjectsOfProperty(childOf);
... tos, que pueblan el modelo desde un
NodeIterator siblings = model.listObjectsOfProperty(eduardo, siblingOf); “Reader”, un “InputStream” o una URL. Los
...
StmtIterator moreSiblings = eduardo.listProperties(siblingOf); modelos pueden ser parseados desde forma-
to N3, N-Triples o, por defecto, sintaxis
LISTADO 4 Escribiendo y leyendo un modelo RDF de disco
RDF/XML.
Quizás una opción más interesante es repetir
String rdfFileName = “family.rdf”;
try { este mismo proceso sobre un motor de base
FileWriter rdfWriter = new FileWriter(rdfFileName); de datos. Por ejemplo MySQL. Antes de mos-
model.write(rdfWriter);
rdfWriter.close();
trar el código que nos permitiría la escritura
y lectura de modelos RDF hacia y desde un
model.write(System.out, “N-TRIPLE”); motor de bases de datos relacional, es preci-
// read the model from a file so instalar e inicializar la base de datos para
Model model2 = ModelFactory.createDefaultModel(); Jena a través de los siguientes pasos:
InputStream in = FileManager.get().open( rdfFileName );
if (in == null) { 1.- Descargar MySQL Community Server
throw new IllegalArgumentException(“File: “ + rdfFileName + “ not found”); desde http://dev.mysql.com/downloads/
} mysql/5.0.html#downloads. La instala-
model2.read(in, “”);
model2.write(System.out); ción es muy sencilla, tan solo hay que
model.write(System.out, “RDF/XML-ABBREV”); descargarse el instalador para tu sistema
} catch (IOException ioe) {
ioe.printStackTrace(); operativo correspondiente y ejecutarlo.
} En el caso de Windows será necesario
tras la instalación ejecutar “mysqladmin”
cias en el modelo seleccionadas por s, donde previamente existentes. Una desventaja de para arrancar el motor relacional.
el constructor de la única implementación de utilizar un modelo en memoria es obvia- 2.- Instalar el driver JDBC para MySQL que
esta interfaz tiene la siguiente forma mente que el modelo tendrá que repoblar- nos permitirá conectarnos desde Jena
“SimpleSelector(subject, predicate, object)”. se cada vez que la aplicación sea lanzada. mediante JDBC al motor de bases de
Para conseguir un control más refinado Además, cualquier cambio hecho al modelo datos MySQL. Tal driver puede descar-
sobre las sentencias seleccionadas puede será perdido cada vez que la aplicación se garse desde http://dev.mysql.com/down-
crearse una subclase de “SimpleSelector” que cierre. loads/connector/j/5.1.html. Lo importan-
modifique su método “select”. Para ello es Una solución para resolver estos problemas te es extraer del .zip provisto el fichero
muy conveniente el uso de la técnica Java de es utilizar el método “Model.write()” para “mysql-connector-java-5.1.5-bin.jar” y
sobreescritura de un método de manera inli- serializar el modelo al sistema de ficheros y hacerlo disponible en tu CLASSPATH.
ne dentro de la construcción de tal objeto. “Model.read()” para deserializarlo al arranque. 3.- Crear una base de datos donde Jena pueda
Así, el siguiente fragmento muestra cómo Sin embargo, Jena también ofrece modelos exportar e importar modelos. El fichero
seleccionar aquellas sentencias con el predi- persistentes, que son continuamente y de “create_db_and_users_family.sql”, provis-
cado “parentOf” donde la URI del sujeto modo transparente serializados a un reposi- to junto con el código de esta entrega, se
acaba en “Juan”: torio. En concreto, Jena puede persistir los encarga de crear una base de datos de
StmtIterator iter5 = model.listStatements( modelos tanto al sistema de ficheros como a nombre “family” y nombre de usuario/
new SimpleSelector(null, parentOf, una base de datos relacional. Los motores de contraseña “family/family”.
(RDFNode) null) {
bases de datos actualmente soportados son Una vez realizados los pasos de configura-
PostgreSQL, Oracle, MySQL y SqlServer. ción de nuestro entorno seguiremos el
public boolean selects(Statement s)
Para demostrar cómo exportar e importar un siguiente proceso de programación usando
{return s.getSubject().toString()
modelo a un fichero consideremos el listado la API de Jena para exportar nuestro modelo
.endsWith(“juan”); 4, cuya versión completa es disponible en el RDF sobre una familia a MySQL. Este proceso
} fichero “Ejemplo3.java”. Obsérvese cómo el se muestra en el listado 5 y corresponde con
} método “Model.write” serializa un modelo el contenido del fichero “Ejemplo4.java” del
); RDF como un stream de bytes. Este método código de la entrega:
recibe al menos un parámetro de tipo 1.- Instanciar el driver MySQL mediante la
Importando y exportando modelos “java.io.OutputStream”, es decir el stream de sentencia “Class.forName(“com.mysql.
No todas las aplicaciones comenzarán con salida donde serializar los datos, pero puede jdbc.Driver”)”.
un modelo vacío. Más comúnmente, un opcionalmente recibir el parámetro “lang”, 2.- Crear una instancia de la clase
modelo será poblado al comienzo con datos un string indicando el formato de salida “com.hp.hpl.jena.db.DBConnection”. El
DISEÑO
constructor de esta clase toma como LISTADO 5 Escribiendo y leyendo datos de una base de datos MySQL
argumentos el “ID” y “password” del String rdfFileName = “family.rdf”;
usuario para logearse en la base de try {
Class.forName(mysqlDriver);
datos, así como una URL que contiene el } catch (ClassNotFoundException e) {
nombre de la base de datos que Jena System.err.println(“MySQL driver class not found”);
habrá de utilizar, en la forma “jdbc: System.exit(-1);
}
mysql://localhost/dbname”. Es importan- IDBConnection connection = new DBConnection(DB_URL, DB_USER, DB_PASSWORD, DB_TYPE);
te reseñar que Jena puede almacenar ModelMaker maker = ModelFactory.createModelRDBMaker(connection);
Model familyModel = maker.createModel(“family”,false);
varios modelos RDF en una sola base de
datos. El último parámetro indica el tipo try {
familyModel.begin();
de base de datos a utilizar que para el InputStream in =
caso de MySQL es “MySQL”. Ejemplo4.class.getClassLoader().getResourceAsStream(rdfFileName);
3.- La instancia de “DBConnection” puede if (in == null) {
throw new FileNotFoundException(“File not found on classpath: “+ rdfFileName);
ahora ser utilizada por la factoría de }
modelos de Jena para crear el modelo a familyModel.read(in,null);
familyModel.commit();
partir del contenido de la base de datos. } catch (FileNotFoundException e) {
Esto se hace mediante la sentencia System.err.println(e.toString());
“Model familyModel = maker.create } finally {
try {
Model(MODEL_NAME,false)”. El flag connection.close();
“false” en este caso significaría que en } catch (java.sql.SQLException e) {}
}
caso de ya existir un modelo con tal connection = new DBConnection(“jdbc:mysql://localhost/family”, “family”, “family”, “family”);
nombre en la base de datos que devuel- ModelRDB modelRDB = ModelRDB.open(connection, “family”);
va una copia del mismo y la cargue en modelRDB.write(System.out, “N3”);
“familyModel”, en vez de crear nuevas
tablas que recojan el modelo RDF. modelo serializado a una base de datos. precursor de SPARQL. La carpeta “doc/ARQ”
4.- A continuación, la instancia de modelo “ModelRDB” es equivalente a “Model” pero incluida en la distribución de Jena incluye
obtenida se utiliza como las instancias de en este caso cada vez que se modifica o lee documentación detallada sobre cómo utilizar
modelo utilizadas en previos ejemplos de del modelo realmente se está operando este módulo. Con todo, a continuación
esta entrega. Por ejemplo, la siguiente sen- sobre la base de datos subyacente. vamos a revisar dos aspectos relativos al uso
tencia leería el contenido de un de este módulo:
“InputStream” en el modelo: “family Consultando Modelos RDF con SPARQL Ejecución de consultas SPARQL desde
Model.read(in,null)”, donde el segundo línea de comando.
parámetro indica la base a utilizar cuando Jena soporta SPARQL a través del módulo Ejecución de consultas SPARQL desde la
se convierten URIs relativas a absolutas. ARQ. Este módulo no solamente puede pro- API de Jena.
Por otro lado, la sentencia del listado 5 cesar consultas en SPARQL, sino que también Para probar la ejecución de consultas
“ModelRDB.open(connection,”family”)”, acepta consultas expresadas en RDQL, el pro- SPARQL desde línea de comando tomaremos
muestra cómo cargar de un solo golpe un pio lenguaje de consultas de Jena que fue como referencia el modelo definido en el lis-
NÚMEROS ATRASADOS
157 - Febrero 2008 156 - Enero 2008
Nos sumergimos en el mundo Android, la nueva El iPhone ha irrumpido con fuerza en el mercado. En
plataforma móvil de la Open Handset Alliance, este número desvelamos las principales técnicas para
para analizar las herramientas incluidas en su programar aplicaciones web adaptadas a este innova-
SDK y poder crear nuestra primera aplicación dor dispositivo. Además, entregamos la última parte
Android. Además, continuamos nuestro segui- del curso dedicado a la creación de buscadores con
miento a la tecnología 4D v11 SQL, iniciamos una Lucene, una extensa revisión a la tecnología LINQ para
serie dedicada a LINQ para SQL, continuamos XML, hacemos una primera introducción a Silverlight.
nuestro desarrollo para iPhone, programamos la Además, empezamos una serie avanzada sobre pro-
web semántica con Jena y ofrecemos la segunda gramación AJAX, en la cual crearemos un slideshow de
entrega de nuestro curso AJAX. 1 CD-ROM imágenes. En términos de bases de datos, empezamos
incluido. un tutorial sobre 4D v11 SQL, además de las secciones
habituales. 1 DVD incluido.
BOLETÍN DE PEDIDO
Rellene o fotocopie el cupón y envielo a REVISTAS PROFESIONALES, S.L.
(Revista SÓLO PROGRAMADORES) C/ Valentín Beato, 42 - 3ª Planta - 28037 MADRID
Tel.: 91 304 87 64 - Fax: 91 327 13 03 - www.revistasprofesionales.com - [email protected]
Deseo me envíen los número/s: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
NOMBRE Y APELLIDOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .EDAD . . . . . . . . TELÉFONO . . . . . . . . . . . . . . . .
DOMICILIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .C.P.: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
CIUDAD . . . . . . . . . . . . . . . . . .PROVINCIA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
FORMAS DE PAGO
Giro Postal a nombre de REVISTAS PROFESIONALES, S.L. Talon Bancario a nombre de REVISTAS PROFESIONALES S.L.
Domiciliación Bancaria Contra Reembolso (5€ de gastos de envio por paquete)
Banco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Domicilio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Firma:
Numero de cuenta: _ _ _ _/ _ _ _ _/ _ _ / _ _ _ _ _ _ _ _ _ _ _ _
Titular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Tarjeta de crédito _ _ _ _/ _ _ _ _/ _ _ _ _/ _ _ _ _/ Fecha de caducidad:
Extranjero: Gastos de envio 5€ por paquete. Unica forma de pago tarjeta de crédito (VISA, Mastercard, American Express,...)
DISEÑO(websem) 21/2/08 13:21 Página 58
DISEÑO
tado 1. La consulta SPARQL utilizada, guar- LISTADO 6 Ejecutando una consulta SPARQL desde Jena
dada en el fichero “HijosEduardo.rq”, y el public void printEduardoChildren() {
comando que la ejecuta desde línea de String queryString =
“PREFIX rel: <http://purl.org/vocab/relationship/> “ +
comandos con sus correspondientes resulta- “PREFIX fam: <http://family/> “ +
dos son mostrados en la figura 3. La librería “SELECT ?person2 “ +
“jena.jar” incluida dentro de la carpeta “lib” “WHERE {“ +
“ fam:eduardo rel:childOf ?person2 “ +
del directorio de instalación de Jena incluye “ } “;
una clase “sparql” cuya bloque “main” ejecu- Query query = QueryFactory.create(queryString);
QueryExecution qe = QueryExecutionFactory.create(query, model);
ta consultas pasadas como parámetro desde ResultSet results = qe.execSelect();
línea de comandos, tal como se ha hecho en //ResultSetFormatter.out(System.out, results, query);
ResultSetFormatter.outputAsXML(results);
la figura 3. Para ver los parámetros que acep- // Importante – eliminar recursos utilizados durante la ejecución de la consulta
ta este ejecutable basta con escribir en una qe.close();
ventana de consola el comando “java }
jena.sparql –help”. En la consulta mostrada
en la figura 3 obsérvese que la construcción Aunque la herramienta de línea de comandos model)”, pasando como parámetro la consul-
“FROM <family.rdf>” hace referencia al “sparql” es útil para ejecutar consultas autó- ta (instancia de “Query”) a ejecutar y el
fichero RDF que habíamos generado en el lis- nomas, las aplicaciones Java pueden hacer modelo (instancia de “Model”) sobre el que
tado 4 al serializar el modelo del listado 1 a uso de las capacidades SPARQL de Jena ejecutarla. Dado que los datos sobre los que
un fichero. Entre los símbolos “<” y “>” podrí- directamente. El paquete “com.hp.hpl.jena. se efectúa la consulta son provistos progra-
amos haber indicado igualmente la URL query” contiene clases que permiten la crea- máticamente, la consulta no necesita una
completa de un recurso colgado en la web, ción y ejecución con Jena de consultas. Usar cláusula FROM.
en vez de hacer referencia a un fichero de la factoría “QueryFactory” es el enfoque más Existen varios métodos “execute()” dentro
disco en el mismo directorio donde se ejecu- sencillo. Esta clase tiene varios método “cre- de la clase “QueryExecution”, cada uno de
ta el comando. En ocasiones no se indica ate()” que permiten leer una consulta textual ellos realizando un tipo de consulta dife-
nada en la cláusula FROM, pasándose el de un fichero o de un “String”. Estos métodos rente. Aparte de consultas SELECT, SPARQL
grafo sobre el que ejecuta la consulta sólo en “create()” devuelven un objeto “Query” que también soporta las construcciones CONS-
tiempo de ejecución. Este es de hecho un encapsula la consulta parseada. TRUCT, ASK y DESCRIBE, que fueron descri-
comportamiento común cuando se realizan Tras crearse una instancia de “Query” es pre- tas en la anterior entrega. Para la ejecución
consultas SPARQL dentro de un programa, a ciso crear una instancia de “QueryExecution”, de un simple SELECT, hay que invocar
menudo reutilizando la misma consulta con una clase que representa una ejecución única “execSelect()”, que devuelve una instancia
diferentes grafos. La URL pasada puede ser la de una consulta. Para obtener un de “ResultSet”. El “ResultSet” permite iterar
localización de un fichero o la dirección web “QueryExecution” invoca al método sobre cada “QuerySolution” devuelto, pro-
de un grafo remoto. “QueryExecutionFactory.create(query, veyendo así acceso a cada valor de variable
DISEÑO
Programando en Java la Web Semántica con Jena (II)
DISEÑO
Dada una ontología y un modelo, el motor de LISTADO 8 Inferencia ontológica y consulta sobre modelo inferido
inferencia de Jena puede derivar nuevas sen- Reasoner owlReasoner = ReasonerRegistry.getOWLReasoner();
tencias que el modelo no expresa de manera Reasoner familyReasoner = owlReasoner.bindSchema(familyOntology);
InfModel infModel = ModelFactory.createInfModel(familyReasoner, model);
explícita. Jena ofrece varios tipos de String queryString =
“Reasoners” que permiten trabajar con dife- “PREFIX rel: <http://purl.org/vocab/relationship/> “ +
rentes tipos de ontologías. Dado que quere- “PREFIX fam: <http://family/> “ +
“SELECT ?parent “ +
mos usar la ontología OWL definida en el lis- “WHERE {“ +
tado 7 con el modelo RDF del listado 1, tene- “ fam:maria rel:childOf ?parent “ +
“ } ORDER BY ?parent”;
mos que utilizar la interfaz “com.hp.hpl.jena. Query query = QueryFactory.create(queryString);
reasoner.Reasoner”, que es implementada QueryExecution qe = QueryExecutionFactory.create(query, infModel);
ResultSet results = qe.execSelect();
por todos los razonadores soportados por ResultSetFormatter.out(System.out, results, query);
Jena como “BasicForwardRuleReasoner”, qe3.close();
“OWLFBRuleReasoner” u “OWLMicroReasoner”.
El listado 8 muestra un ejemplo sobre cómo ?siblingOf1 rel:siblingOf ?siblingOf2 tar un modelo RDF, bien a través de la API de
aplicar la ontología de familia OWL mostrada FILTER(?siblingOf1 != ?siblingOf2) Jena o utilizando consultas SPARQL.
en el listado 7 al modelo de familia RDF defi- } ORDER BY ?siblingOf1 Finalmente, hemos visto cómo utilizar el
nido en el listado 1 para así crear un modelo motor de inferencia OWL de Jena para reali-
de inferencia. En primer lugar, obtenemos un Por otro lado, la segunda consulta SPARQL zar inferencias sobre un modelo al que se
razonador OWL del registro de razonadores devuelve los nombres de los padres de María. aplica una ontología descrita en OWL.
mediante el método “ReasonerRegistry. Tal consulta es mostrada dentro del listado 8. Esta entrega ha demostrado el potencial de
getOWLReasoner()”. El siguiente paso es aso- La figura 5 muestra los resultados de haber representar datos como modelos RDF y la fle-
ciar el razonador a la ontología de familia ejecutado estas dos consultas sobre un xibilidad del lenguaje de consultas RDF SPARQL
(familyOntology). Esta operación devuelve un modelo normal primero y en segundo lugar para extraer datos de estos modelos. Hemos
razonador listo para aplicársele las reglas de sobre otro sobre el que se ha inferido nuevo observado el potencial de OWL para inferir
la ontología. A continuación, utilizamos el conocimiento a través de OWL. La primera conocimiento implícito a partir de ternas RDF
razonador asociado para crear un modelo vez las consultas son ejecutadas sobre el explícitas. Las técnicas explicadas serán un
mejorado con inferencias definido por la modelo definido en el listado 1. En la segun- punto de comienzo útil para que empecemos a
clase “InfModel” a partir del modelo de fami- da ocasión se repiten ambas consultas sobre utilizar modelos RDF en nuestras aplicaciones
lia original. un “InfModel” generado al aplicar al modelo Java. Se recomienda visitar la web de Jena para
Habiendo creado un modelo de inferencia a original las relaciones OWL expresadas en aprender más sobre lo explicado.
partir de los datos originales y la ontología “familyModel”. Así, aunque en el listado 1 y En la próxima entrega seguiremos apren-
OWL, ahora lo podemos tratar como cual- en su código de ejemplo asociado en la diendo más sobre programación semántica
quier otra instancia de modelo. Por tanto, entrega, “Ejemplo1.java”, no se indica explíci- en Java. Concretamente, nos aproximaremos
como muestra el código del método tamente que Diego es hermano de Eduardo, al concepto de “Web Semántica con minús-
“owlReasoningOverModel()” incluido en el esto puede inferirse aplicando la propiedad culas”, una simplificación realista de la
fichero de la entrega “Ejemplo6.java”, las de simetría del predicado “siblingOf”. Por otro misma que puede fácilmente aplicarse a los
mismas consultas definidas sobre un mode- lado, una vez inferido que Diego es hermano portales Web 2.0 actuales para dotarlos de
lo Jena normal pueden ser reutilizadas y de Eduardo y como se conoce que Eduardo mayor inteligencia.
aplicarse al modelo inferido sin ningún es hermano de María, se puede inferir, dada
cambio. Sobre el modelo inferido se aplican la transitividad de la propiedad “siblingOf” Referencias
dos consultas. La primera tiene como retor- que Diego es también hermano de María.
no los pares de hermanos donde alguien no Finalmente, dado que se conoce del listado 1 Jena – A Semantic Web Framework for
puede ser hermano de sí mismo. que Juan e Inés son padres de María, se Java, http://jena.sourceforge.net
Desafortunadamente, el hecho de haber puede inferir que María es hija de ambos, Introduction to Jena, Philip McCarthy,
considerado “siblingOf” como transitivo y dado que los predicados “childOf” y http://www.ibm.com/developerworks/xml/
simétrico a la vez, revisar listado 7, lo hace “parentOf” han sido declarados como inver- library/j-jena/
reflexivo, dando lugar a inferencias como sos en la ontología “familyModel”. An Introduction to RDF and the Jena RDF API,
“Diego es hermano del mismo padre y http://jena.sourceforge.net/tutorial/RDF_API/
madre que Diego”, que aunque semántica- Conclusiones Search RDF data with SPARQL, Philip
mente cierto suena extraño. La construcción McCarthy, http://www.ibm.com/developer
FILTER de la siguiente consulta se encarga En este artículo se han demostrado algunas works/java/library/j-sparql/
de eliminar esos resultados extraños: de las características más importantes de la Meet Jena, a Semantic Web Platform for Java,
PREFIX rel: <http://purl.org/vocab/ framework de programación semántica Jena, Ian Dickinson, http://www.devx.com/semantic/
relationship/> con ejemplos ilustrando cómo crear, importar Article/34968/1954?pf=true
y persistir al sistema de ficheros o bases de Let Semantics Bring Sophistication to Your
SELECT ?siblingOf1 ?siblingOf2
datos relacionales modelos RDF. También Applications, Rod Coffin, http://www.devx.com/
WHERE {
hemos revisado diferentes modos de consul- semantic/Article/34591/1954?pf=true
LECTURAS
El libro de Django
En http://the-geek.org/django-book/, las peticiones. En otras palabras, le otorga una
con licencia GNU Free Document, manera de designar qué código se ejecutará
para cada URL. Por ejemplo, se le podría decir
se encuentra la versión beta de la al framework: “Para las URL que se parezcan a
traducción al español del libro /users/joe/, ejecuta el código que muestre el
perfil del usuario con ese nombre de usuario”.
The Django Book, cuyo primer Facilita mostrar, validar y volver a mostrar for-
capítulo reproducimos a mularios HTML. Los formularios HTML son la
principal manera de obtener datos de entrada
continuación. Django es un de los usuarios web, así que más le vale a un
framework en Python para framework web facilitar la representación de
formularios y el manejo del código tedioso
desarrollo web, y se considera para mostrar y volver a mostrar formularios
una alternativa a Ruby on Rails. (resaltando los errores).
Convierte la entrada que envía el usuario en
Si se dirige a la página web http://djangoproject.com estructuras de datos que se pueden manipular
utilizando su navegador web o, dependiendo de la cómodamente. Por ejemplo, el framework
década en la que esté leyendo este trabajo litera- podría convertir los datos de un formulario
rio destinado a ser eterno, utilizando su teléfono HTML en tipos de datos nativos al lenguaje de
móvil, agenda electrónica, zapato o cualquier programación que se esté utilizando.
cacharro que suplante a Internet, se encontrará Ayuda a separar el contenido de la presenta-
con esta explicación: ción mediante un sistema de plantillas, de
“Django es un framework web de alto nivel en manera que se pueda cambiar el aspecto de un
Python que fomenta el desarrollo rápido y el dise- sitio web sin afectar al contenido, y viceversa.
ño limpio y pragmático.” Se integra cómodamente con las capas de
Eso es un gran bocado, o un gran vistazo, o un almacenamiento (como las bases de datos)
gran puñado de píxeles, dependiendo de si este pero no exije estrictamente el uso de una base
libro se está recitando, leyendo en papel o pro- de datos.
yectándose en un Jumbotrón, respectivamente. Le permite trabajar más productivamente, a un
Descompongámoslo. nivel de abstracción mayor que si estuviera
programando usando, digamos, HTTP. Pero no
Django es un framework web de alto nivel... le prohíbe ir un nivel de abstracción “hacia
abajo” cuando sea necesario.
Un framework web es un software que alivia el Se aparta de su camino, evitando llenarle la
sufrimiento derivado de construir páginas web aplicación de manchas sucias, como URL que
dinámicas. Abstrae problemas comunes al desarro- contengan “.aspx” o “.php”.
llo web y proporciona atajos para tareas de progra- Django hace todas estas cosas bien; y presenta
mación frecuentes. una serie de características que elevan el listón de
Para los lectores que han llegado tarde a la fiesta: lo que debería ser un framework web.
un sitio web dinámico es uno en el que las pági- El framework está escrito en Python, un lenguaje de
nas no son simplemente documentos HTML colo- programación bonito, conciso, potente y de alto
cados en algún lugar del sistema de ficheros de nivel. Para desarrollar un sitio utilizando Django hay
un servidor. Por el contrario, en un sitio web diná- que escribir código Python que utiliza las bibliotecas
mico, cada página la genera un programa de de Django. Aunque este libro no incluye un tutorial
computador (una famosa “aplicación web”) que completo de Python, sí llama la atención sobre
usted, el desarrollador web, crea. Por ejemplo, una características y funcionalidades de Python cuando
aplicación web podría obtener registros de una es procedente, especialmente cuando el código no
base de datos o realizar alguna acción basándose tiene sentido de forma inmediata.
en la entrada del usuario.
Un buen framework web resuelve los siguientes ...que promueve el desarrollo rápido...
problemas:
Proporciona un método para hacer correspon- A pesar de lo potentes que sean sus característi-
der peticiones URL con el código que maneja cas, un framework web carece de valor si no con-
LECTURAS
El libro de Django
LECTURAS
1.- La presentación está vinculada al te el mismo código para las peticiones a Hablando más seriamente, Django todavía no
código. Si un diseñador quisiera editar “/bar/” y “/baz/”? Tendría que configurar invierte los efectos del calentamiento global.
el HTML de esta página, tendría que edi- una serie de “includes” o reglas de rees-
tar este código, porque el el HTML y el critura, algo que rápidamente se hace Porqué se desarrolló Django
PHP están entrelazados. inmanejable.
En contraste, el enfoque MVC de Django En contraste, Django desvincula las URLs Las raíces de Django se encuentran en los pro-
fomenta la separación entre el código y del código que se llama, de manera que blemas y soluciones del Mundo Real. No fue cre-
la presentación, de manera que la pre- siempre se pueden cambiar las URLs que ado para promocionarlo y venderlo a los desa-
sentación está gobernada por plantillas llaman a un cierto trozo de código. rrolladores, ni tampoco fue creado como ejerci-
y la lógica de negocio reside en módu- 4.- Los parámetros de conexión a la base cio académico durante el tiempo libre de alguien.
los de Python. Los programadores se de datos están “hard-coded”. Es sucio Fue construido, desde el primer día, para resol-
ocupan del código y los diseñadores se tener que especificar la información de verle problemas diarios a un equipo de desarro-
ocupan del HTML. conexión, el servidor, el nombre de usua- llo web en la vanguardia de la industria.
2.- El código relativo a bases de datos está rio y la contraseña, dentro de este código, Comenzó en el otoño de 2003, en un perió-
vinculado a la lógica de negocio. Esto es porque es configuración, no lógica de dico de pueblo en Lawrence, Kansas.
un problema de redundancia: si se renom- programación. Además, este ejemplo Por una razón u otra, el periódico Lawrence
bran las tablas o columnas de la base de también tiene “hard-coded” el hecho de Journal-World consiguió atraer a un talentoso
datos, será necesario reescribir el SQL. que el motor de bases de datos es MySQL. grupo de diseñadores y desarrolladores web a
En contraste, el enfoque MVC de Django En contraste, Django sólo tiene un lugar principios de la década 2000. La división web
fomenta el uso de una sola capa de acce- para almacenar la configuración, y la del periódico, World Online, se convirtió rápi-
so a datos abstraída, responsable de todo capa de acceso a bases de datos está damente en una de las divisiones web de un
el acceso a los datos. En el caso de abstraída, de manera que es sencillo periódico más innovadoras del mundo. Sus
Django, la capa de acceso a datos cono- cambiar de servidor de base de datos tres sitios principales, LJWorld.com (noticias),
ce los nombres de las tablas y las colum- (digamos, de MySQL a PostgreSQL). Lawrence.com (entretenimiento/música) y
nas de la base de datos, y permite ejecu- KUsports.com (deporte universitario), empe-
tar sentencias SQL mediante Python en Lo que no hace Django zaron a ganar premio tras premio en la indus-
lugar de escribir SQL directamente. Esto tria del periodismo en línea. Sus innovaciones
significa que si cambia el nombre de las Por supuesto, queremos que este libro sea fueron muchas, incluyendo:
tablas de la base de datos, sólo hace falta justo y equilibrado. Con eso en mente, tene- La página de entretenimiento local más
cambiarlo en un sitio , en la definición del mos que ser honestos y resumir lo que no exhaustiva del mundo, Lawrence.com, que
modelo de datos, en lugar de tener que hace Django: aúna bases de datos locales de eventos,
cambiar todas las sentencias SQL desper- Alimentar a su gato. bandas, restaurantes, bebidas especiales,
digadas por el código. Leer de su mente los requisitos del pro- canciones descargables y noticias en for-
3.- La URL está unida al código. Si este yecto e implementarlos en un tiempo mato tradicional.
fichero PHP reside en “/foo/index.php”, se razonable para engañar a su jefe y hacer- Una sección veraniega de LJWorld.com
ejecutará con todas las peticiones a esa le creer que en realidad no se ha queda- dedicada a los jugadores de las liguillas loca-
dirección. Pero, ¿y si quiere que se ejecu- do en su casa para ver “El precio justo”. les, que los trataba como si fueran los New
York Yankees, proporcionando una página
para cada equipo y liga, obteniendo datos
meteorológicos para mostrar pronósticos
para los partidos, ofreciendo panoramas de
360 grados de todos los campos de juego de
los alrededores y alertando a los padres de
las cancelaciones de los partidos mediante
mensajes a teléfonos móviles.
Alertas a teléfonos móviles sobre los par-
tidos de baloncesto y fútbol americano de
la Universidad de Kansas, que permitía a
los aficionados estar al tanto de las pun-
tuaciones y estadísticas clave durante los
partidos, y un segundo sistema que utili-
zaba algoritmos de inteligencia artificial
que permitía a los aficionados enviar
mensajes en inglés al sistema para con-
sultar la base de datos (“cuántos puntos
llevan los giddens” o “pts giddens”).
Una exhaustiva base de datos con todas
las estadísticas imaginables sobre el fút-
bol americano y el baloncesto universita-
rios, incluyendo un medio para comparar
cualquier grupo de jugadores o equipos
de la NCAA.
LJWorld.com, primer sitio desarrollado con Django.
LECTURAS
El libro de Django
http://www2.kusports.com/stats/
La página web del Washington Post, was-
hingtonpost.com, utiliza Django para sus
proyectos con bases de datos, y varias
pizcas de funcionalidad por todo el sitio.
Algunos ejemplos:
La base de datos de los votos del
Congreso de EEUU: http://projects.was-
hingtonpost.com/congress/
El directorio de personal y la funcionali-
dad que permite a los lectores contactar
con los periodistas, que aparece como un
enlace en la mayoría de los artículos.
Faces of the Fallen: http://projects.was-
hingtonpost.com/fallen/
Chicagocrime.org, una base de datos de
libre acceso sobre los crímenes que se
producen en Chicago y una de las prime-
ras aplicaciones externas basadas en
Google Maps, fue desarrollada en Django.
Tabblo.com, una innovadora web de com-
partición de fotos, utiliza Django. La pági-
na le permite juntar sus fotografías para
El sitio web de The Washington Post también usa Django.
crear álbumes de fotos que cuentan his-
Proporcionando blogs a los miembros de la en el que ya movía la mayoría de los sitios torias.
comunidad y promocionando de forma pro- de World Online, el equipo de World Online, Texasgigs.com, un sitio de música local de
minente los contenidos de la comunidad, que ya incluía a Jacob Kaplan-Moss, decidió Dallas, Texas, fue escrito en Django.
antes de que los blogs estuvieran de moda. que sería una buena idea liberar el frame- Grono.net, una red social polaca, comen-
Muchos expertos del periodismo en el mundo work. De esa manera retribuirían a la comu- zó a sustituir su código en Java por
señaralon a World Online como ejemplo del nidad del software libre, obtendrían mejoras Django. Descubrieron que no solo era
futuro del periodismo. El New York Times gratis de desarrolladores externos, y genera- más rápido de desarrollar (y más diverti-
publicó una noticia sobre la empresa en la rían cierta publicidad para su sistema de do), sino que proporcionaba mayor rendi-
portada de la sección de negocios; la National gestión de contenidos comercial, Ellington miento que Java y requería menos recur-
Public Radio emitió una serie de dos días sobre (http://www.ellingtoncms.com/). Django se sos de hardware.
ella. El director editorial de World Online, Rob liberó en julio de 2005 y rápidamente se Traincheck.com fue desarrollada en
Curley, dio charlas casi semanalmente en con- hizo popular. Django. Esta web le permite enviar men-
ferencias de periodismo por todo el planeta, Aunque Django es un proyecto de software sajes de texto desde su teléfono móvil
exponiendo las ideas innovadoras y las carac- libre con colaboradores en todo el mundo, para obtener los horarios de metro relati-
terísticas del sitio web de World Online. En una los desarrolladores originales de World vos al lugar donde se encuentre.
industria lóbrega y anticuada reacia a los cam- Online siguen proporcionando las principa- Existe una lista actualizada con las docenas
bios, World Online era una rara excepción. les directivas para el crecimiento del frame- de sitios que utilizan Django en http://code.
Gran parte del éxito de World Online fue debi- work, y World Online contribuye con otros djangoproject.com/wiki/DjangoPoweredSites
do a la tecnología que había detrás de sus aspectos importantes como tiempo laboral,
páginas, y a la filosofía que dice que los pro- material publicitario y alojamiento/ancho de Sobre este libro
gramadores informáticos son igual de impor- banda para la página web del framework
tantes que los propios periodistas a la hora de (http://www.djangoproject.com/). El objetivo de este libro es explicar todas
crear periodismo de calidad del siglo XXI. las cosas que hace Django y convertirle
Por esto se desarrolló Django: los desarrolla- Quién usa Django en un experto en ellas. Al leer este libro
dores de World Online necesitaban un frame- aprenderá las habilidades necesarias para
work para desarrollar sitios web complejos Muchos desarrolladores web de todo el desarrollar sitios web potentes de forma
sobre bases de datos de forma indolora, fácil mundo utilizan Django. Algunos ejemplos rápida, con un código limpio y fácil de
y con los plazos temporales del periodismo. concretos: mantener.
En otoño de 2003, dos desarrolladores de Por supuesto, World Online sigue utili- El contenido completo del libro puede
World Online, Adrian Holovaty y Simon zando Django para todos sus sitios web, encontrarse en http://the-geek.org/djan-
Willison, se pusieron a crear este framework. tanto internos como los de los clientes go-book/ y la versión en inglés en http://
Decidieron utilizar Python, un lenguaje del comerciales. Algunos de sus sitios que www.djangobook.com/en/beta/.
que se habían enamorado recientemente. corren con Django son: Copyright 2006 Adrian Holovaty y Jacob
Tras explorar (y quedar decepcionados con) http://www.ljworld.com/ Kaplan-Moss.
las librerías de programación web disponibles http://www.lawrence.com/ Copyright de la traducción: Ricardo Cárdenes
en Python, empezaron a crear Django. http://www.6newslawrence.com/ Medina y Gabriel Rodríguez Alberich
Dos años más tarde, en verano de 2005, tras http://www.visitlawrence.com/ Esta obra tiene licencia GNU Free Document
haber desarrollado Django hasta un punto http://www.lawrencechamber.com/ License.
VIDEO-TUTORIAL
Menú Arts
JORGE RUBIRA Edition, de escritorio, y hará uso de colores, degra-
dados y transparencias entre otros efectos. El
En esta nueva edición de los entorno de desarrollo elegido en esta ocasión ha
vídeo-tutoriales vamos a explicar sido NetBeans 6.0.
cómo crear un menú artístico ¿Cómo obtener el vídeo-tutorial?
usando colores, degradados,
transparencias y otros efectos, todo El material que conforma este vídeo-tutorial
consiste en un archivo de vídeo y unos archivos
ello con tecnología Java y el IDE de código que implementan el proyecto. El
NetBeans 6. vídeo-tutorial así como el material del proyecto
desarrollado pueden descargarse desde
www.revistasprofesionales.com. El formato del
Creación de menús artísticos vídeo es WMV y el tamaño de la descarga es de
40 MB aproximadamente.
Muy probablemente el lector haya sentido la
necesidad, en algún momento de su carrera pro-
fesional, de crear una interfaz gráfica de usuario ¿Tienes sugerencias para el próximo
con controles absolutamente personalizados, vídeo-tutorial?
intentando así huir del clásico aspecto que ofre-
cen siempre la mayoría de aplicaciones. Pues bien, Nos interesa saber cómo podemos mejorar los
en el vídeo-tutorial de este mes, Jorge Rubira nos vídeos y sus contenidos, de modo que si tenéis
enseña a crear un menú artístico, en el que la cualquier sugerencia para futuros vídeos, no
única limitación será nuestra propia imaginación. dudéis en transmitirla a Jorge Rubira, el autor:
Este menú será una aplicación Java Standard [email protected].
15/2/08 18:36:04