You are on page 1of 77

NMERO 90 P.V.

P 6,95
CANARIAS P.V.P 7,05
CONSTRUYE UN BOTNET
Explota tcnicas de ataque de red
Versin Live y
de instalacin.
Ms info en
pg. 3.
WWW. L I N U X - MA G A Z I N E . E S
BOTNETS
Moderniza tu coche
con Arduino
8
4
1
3
0
4
2
5
9
4
5
0
5
0
0
0
9
0
Principios de
seguridad PHP
FSTRANSFORM
Cambia de sistema de
ficheros sin perder tus datos
GRATIS
Autoino
EXPLOTA TCNICAS DE ATAQUE DE RED
Descubre herramientas de desarrollo HTML5
Crea grficos 3D con WebGL y Three.js
Explora el modo offline de HTML5
GREP
Busca en archivos y
ficheros comprimidos
TINTII
Scale los colores
a tus fotos
GGPLOT
Crea grficos
estadsticos con R
AARON
SWARTZ
Homenaje a
un hacker
7
FLOW3
Un moderno
framework para PHP
DVD
KNOPPIX 7.0.4

D
V
D
D
E
F
E
C
T
U
O
S
O
?
Si crees que tu D
VD
est en m
al estado, escrbenos a
dvd@
linux-m
agazine.es para diagnosticarlo o para que
te enviem
os uno nuevo.
[1] Wiki Knoppix: http:// www. knoppix.
net/ wiki/ Main_Page
[2] Foros Knoppix: http:// www.
knoppix. net/ forum/
[3] Chuletario de opciones para el
arranque de Knoppix (en el DVD): /
KNOPPIX/ knoppix-cheatcodes. txt
RECURSOS
Este DVD contiene Knoppix 7.0.4, un
sistema operativo completo y con apli-
caciones listas para ser utilizadas.
Knoppix 7.0.4 viene en versin Live,
por lo que puede ser arrancada y pro-
bada sin instalar nada en el disco duro.
Para empezar a usar tu Linux, inserta el
DVD en el reproductor y rearranca el
ordenador. Si no aparece el men del
DVD, tienes que ajustar la BIOS para
arrancar desde el disco. Para hacerlo,
normalmente has de pulsar una tecla
durante las primeras fases del arran-
que del ordenador (habitualmente F2 o
Supr), buscar el men que permite
cambiar la secuencia de arranque de
dispositivos y colocar el lector de DVDs
en el primer lugar de la secuencia. Pos-
teriormente se guardan los cambios y
se sale de la herramienta de
configuracin para que se reinicie el
arranque. Como cada BIOS es dife-
rente, recomendamos consultar la
documentacin del fabricante para
realizar esta operacin.
Arranque
E
n nuestro DVD os traemos lo ltimo del sistema Linux Live por antonomasia.
Knoppix lleva por ah desde hace ms de doce aos y, gracias a su veterana y
su solidez, se ha convertido en el sistema Live basado en Debian con el que
muchas distros similares se miden.
La versin contenida en el DVD contiene ms de 9 gigabytes de software, entre los
que se incluye el kernel 3.4.9, LibreOffice 3.5.4.2, Gimp 2.8 e IceWeasel 10.0.6, entre
otros muchos programas y aplicaciones.
Pero lo que hace destacar a Knoppix por encima de otros sistemas Live son su lite-
ralmente centenares de herramientas para la monitorizacin, configuracin y control
de dispositivos, procesos y redes, utilidades de auditora y sistemas de rescate. En
suma, Knoppix rene todo lo necesario para la administracin de sistemas, exmenes
forenses y seguridad.
3
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
EDITORIAL
4
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
L
a informacin es poder. Pero
como todo poder, hay quienes
quieren guardrselo para s mis-
mos. La herencia cientfica y cultural,
publicada durante siglos en libros y
revistas, est siendo digitalizada y ence-
rrada por un puado de corporaciones
privadas. Quieres leer artculos que con-
tengan los ms famosos resultados de la
ciencia? Necesitars enviar enormes can-
tidades de dinero a editoriales como
Reed Elsevier.
Hay quienes luchan para cambiar esto. El
Movimiento por el Acceso Abierto ha pele-
ado valientemente para asegurarse de que
los cientficos no vendan sus derechos a
copia, sino que publiquen su trabajo en
Internet, bajo clusulas que permitan a cual-
quiera acceder a ellos. Sin embargo, incluso
en el mejor de los casos, esto slo se aplicar
a cosas publicadas en el futuro. Todo lo
publicado hasta ahora se habr perdido.
Ese es un precio demasiado alto. Forzar a
los acadmicos a pagar por leer el trabajo de
sus colegas? Escanear bibliotecas enteras
para slo permitir a la gente de Google leer
sus contenidos? Suministrar artculos
cientficos para las universidades de lite del
primer mundo, pero no a los hijos de los pa-
ses en vas de desarrollo? Es escandaloso e
inaceptable.
Estoy de acuerdo, dicen muchos, pero
qu podemos hacer? Las empresas son due-
as de los derechos, cobran inmensas canti-
dades de dinero para el acceso y es perfecta-
mente legal. No hay nada que podamos
hacer para impedrselo. Pero hay algo que s
podemos hacer, algo que ya se ha hecho
antes: podemos enfrentarnos a ellos.
Aquellos que tengis acceso a esos recur-
sos estudiantes, bibliotecarios, cientficos
se os ha concedido un privilegio. Alimentis
este banquete de conocimiento mientras el
resto del mundo se queda fuera.
Pero no necesitis de hecho,
moralmente, no podis guardar
este privilegio para vosotros mis-
mos. Tenis el deber de compartirlo
con el mundo. Y ya lo habis hecho:
intercambiando contraseas con
colegas o rellenando peticiones de
descargas para vuestros amigos.
Mientras tanto, los que se han
quedado fuera no estn ociosos.
Habis estado entrando a hurtadillas
por rendijas y saltando vallas, libe-
rando la informacin encerrada por
las editoriales y compartindola con
vuestros amigos.
Pero todas estas acciones ocurren
en la oscuridad, ocultas y soterra-
das. Se le llama robar o pirate-
ra, como si compartir la riqueza
del conocimiento fuera el equiva-
lente moral de saquear un barco o asesinar a
su tripulacin. Pero compartir no es inmoral,
de hecho es un imperativo moral. Slo los
que estn cegados por la codicia se negaran
a permitir a un amigo a hacer un copia.
Las grandes corporaciones, claro est,
estn cegadas por la codicia. Las leyes bajo
las que operan lo requieren, sus accionistas
se rebelaran si no fuera as. Y los polticos a
los que tienen comprados les apoyan, apro-
bando leyes que les dan poderes exclusivos
para decidir quin puede realizar copias.
No hay justicia en la obediencia a leyes
injustas. Es hora de salir a la luz y, siguiendo
la gloriosa tradicin de la desobediencia civil,
declarar nuestra oposicin a este expolio de
la cultura pblica.
Necesitamos coger la informacin, est
donde est almacenada, hacer copias y com-
partirla con el mundo. Necesitamos coger las
cosas no sujetas a copyright y aadirlas al
archivo. Necesitamos comprar bases de
datos secretas y colgarlas en la web. Necesi-
tamos descargar revistas cientficas y subirlas
a redes de pares. Necesitamos luchar por la
Guerrilla del Acceso Abierto.
Si somos suficientes a lo largo y ancho del
mundo, no slo mandaremos un poderoso
mensaje en oposicin a la privatizacin del
conocimiento, sino que haremos que sea
algo del pasado. Te unirs a nosotros?
Aaron Swartz, 1986 2013
Texto original disponible en dominio pblico [1].
Traduccin de Paul C. Brown,
distribuido como obra en dominio pblico [2].
MANIFIESTO DE LA
GUERILLA POR EL
ACCESO ABIERTO
[1] Guerilla Open Access Manifesto:
http:// archive. org/ details/
GuerillaOpenAccessManifesto
[2] Dominio Pblico: http://
creativecommons. org/
publicdomain/ zero/ 1. 0/
RECURSOS
Nos sentimos orgullosos de nues -
tros orgenes como pu blicacin,
que se remonta a los primeros
das de la revolucin Linux.
Nuestra revista hermana, la
publicacin alemana Linux
Magazine, fundada en 1994, fue
la primera revista dedicada a
Linux en Europa. Desde aquellas
tempranas fechas hasta hoy,
nuestra red y experiencia han
crecido y se han expandido a la
par que la comunidad Linux a
lo ancho y largo del mundo.
Como lector de Linux
Magazine, te unes a una
red de informacin
dedicada a la distribucin
del conocimiento y
experiencia tcnica. No nos
limitamos a informar sobre el
movimiento Linux y de Software
Libre, sino que somos parte
integral de l.
Qt: Uno para todos
Plasma Active, Ubuntu Phone y Sail-
fish de Jolla trabajan para unificar sus
APIs [1] y a efectos prcticos significa-
ra que una app desarrollada para una
de las plataformas podr ser compi-
lada para el
resto con mni-
mos problemas.
Un poco de
contexto:
Ubuntu
Phone no nece-
sita presenta-
cin. A estas
alturas todo el
mundo ha visto
el vdeo del sis-
tema operativo
para mviles de
Canonical fun-
cionando en un
Galaxy Nexus
en CES. Sin
embargo,
Plasma Active y
Sailfish tal vez
si necesiten un poco ms de explica-
cin.
Plamas Active es un esfuerzo comu-
nitario por crear una interfaz grfica
para dispositivos mviles basada en
las tecnologas del escritorio KDE
(conocido como Plasma). Ya existen
versiones funcionales del sistema
implementadas en diferentes dispositi-
vos. Puedes ver un ejemplo de Plasma
Active en accin en [2].
Sailfish es un producto de Jolla, una
empresa fundada por ex-empleados de
Nokia, ex-empleados que estaban
involucrados en el desarrollo de
Maemo cuando estaban en la gigante
de telefona finlandesa. Cuando Steven
Elop se hizo con Nokia y mat el pro-
yecto Maemo (que para entonces se
haba fusionado con Moblin para dar
lugar a MeeGo que luego se trans-
form en Tizen y esperemos que ah
se quede), muchos de los ingenieros y
mandos intermedios que haban traba-
jado en implementar Meego/ Maemo
en el N9, se vieron de patitas en la
calle. Y decidieron fundar su propia
empresa para seguir con su trabajo. En
estos
momentos,
Sailfish es
un sistema
maduro
que se
imple-
menta en
mviles de
venta
sobre todo
en China.
Visita
[3] para
ver una
demo de
Sailfish.
Todos
los siste-
mas cita-
dos tienen
algo en comn: Qt y sus tecnologas
anejas. Por tanto, puede tener sentido
que, para poder contar con un cat-
logo de apps bien surtido desde el pri-
mer momento (cosa fundamental para
el xito de cualquier SO mvil), se uni-
fiquen las APIs para permitir que los
desarrolladores de uno y otro proyecto
puedan portar sus apps de un sistema
a otro de manera sencilla.
8
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Barclays y el Software Libre
Barclays planea ahorrar miles de millones
de libras migrando a GNU/ Linux.
El gigante bancario britnico pretende
deshacerse de muchas de sus licencias de
software privativo, incluyendo las que man-
tienen con Microsoft y Oracle y migrar a
soluciones de software abierto que puedan
desarrollar y mantener internamente.
Fuentes internas de la entidad calculan
que sus gastos en TI se reduciran en un
90%, lo que para una empresa del volumen
de Barclays, supondra una cifra de varios
miles de millones de libras esterlinas.
NOTICIAS
8
WWW. L I NUX- MAGAZI NE. ES
NOTICIAS
OpenMandriva Vive!
OpenMandriva es ya oficial y legalmente
una ONG.
En su primer post de 2013, Charle-H.
Schulz anuncia que OpenMandriva ha
completado el proceso burocrtico de
incorporacin [1] como ONG con
todos sus papeles en regla.
Segn el post, an quedan algunas
tareas por realizar, como migrar el resto
de la infraestructura tcnica al orga-
nismo recin creado y que ser regida
por la comunidad de usuarios y desarro-
lladores. Para ello, cuentan con plena
cooperacin de la empresa creadora de la
distro original, Mandriva S.A., que por
fin hace lo correcto.
[1] Schulz anuncia la incorporacin
de OpenMandriva:
http:// standardsandfreedom. net/
index. php/ 2013/ 01/ 03/
openmandriva-gets-incorporated/
[2] Anuncio en el blog de Mandriva:
http:// blog. mandriva. com/ en/ 2013/
01/ 03/ openmandriva-welcome/
RECURSOS
[1] Barclays ahorra con Soft Libre:
http:// www. thesundaytimes. co. uk/
sto/ business/ Finance/ article1188867.
ece
RECURSOS
[1] Unificacin de APIs:
http:// aseigo. blogspot. com. es/ 2013/
01/ qml-component-apis-to- come-
together. html
[2] Plasma Active en accin:
http:// www. youtube. com/ watch?
v=5l6R2HSKKRE
[3] Demo de Sailfish:
http:// www. youtube. com/
watch?v=_c_BqnR_vAM
RECURSOS
9
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
de la pregunta que me he formulado un
milln de veces: qu pensara Aaron?
[3]
Aaron liber la infraestructura de Red-
dit como software libre y fue uno de los
principales motores tras el fracaso de
SOPA y PIPA, organizando la protesta que
cerr los ms importantes sitios de Inter-
net.
Si eso no fuera suficiente para conver-
tirlo en persona non-grata a ojos del esta-
blishment USA (y objeto de constante
investigacin y monitorizacin por parte
del FBI), utilizando cuentas de prueba y
desde terminales pblicos en bibliotecas,
descarg el 20% de la base de datos
PACER que recoge los documentos de los
tribunales federales y que sientan los pre-
cedentes sobre
los que se basa
la legislacin
estadounidense.
Con respecto a
estos documen-
tos, si bien
supuestamente
son de dominio
pblico, haba
que pagar por
ellos y Swartz
los liber en
REPAC, una
base de datos
pblica creada
por activistas en
pro de la liber-
tad de informa-
cin. Esto le
supuso ser
objeto de una
demanda judi-
cial que al final
no prosper.
En palabras
de Cory Docto-
row,
Cuando sali
de Reddit,
Aaron se convir-
Aaron Swartz, 1986 2013
Muri Aaron Swartz [1], creador del pro-
tocolo RSS, co-autor de Reddit, nio pro-
digio del hacking y evangelista de la libe-
racin de la informacin.
Las aportaciones al mundo de la infor-
mtica, software libre y conocimiento
abierto de Aaron fueron abundantes y de
muy alto nivel. A los 14 aos trabaj con
Tim Berners-Lee, creador de la web, para
formalizar y popularizar el formato RSS.
En la esquela de Berners-Lee leemos:
Hackers por la justicia, uno ha cado.
Hemos perdido uno de los nuestros [2]
Tambin ayud a la creacin de Crea-
tive Commons con Lawrence Lessig a los
15. En palabras de Lessig:
Era brillante y divertido. Un nio pro-
digio. Un alma, una conciencia, la fuente
NOTICIAS
NOTICIAS
ti en un dedicado, temerario y encanta-
dor perturbador de mierda.
Sin embargo, en los ltimos aos era
objeto de una inmisericorde e injustifi-
cada persecucin judicial por haberse
infiltrado en el MIT, plantado en un servi-
dor que cosechaba artculos acadmicos,
artculos que planeaba luego liberar al
gran pblico.
A pesar de que la organizacin duea
de los documentos JSTOR, decidi retirar
los cargos e incluso puso en marcha un
plan para hacer pblica su base de datos
de documentos, el MIT no fue tan claro y
la fiscala, decidida a convertir a Aaron en
un ejemplo para el movimiento por la
transparencia y libertad de informacin,
aument el nmero de delitos que
supuestamente haba cometido infiltrn-
dose en una edificio pblico y accediendo
a una habitacin abierta para descargar
artculos acadmicos, de 4 a 13.
Aaron se enfrentaba en el momento de
su muerte a ms de cuatro millones de
dlares en multas y hasta a 50 aos de
crcel.
Aaron se quit la vida ahorcndose en
su domicilio neoyorkino el 11 de enero.
Tena 26 aos de edad.
[1] Aaron Swartz en Wikipedia:
http:// en. wikipedia. org/ wiki/ Aaron_
Swartz
[2] Tim Berners-Lee homenajea a
Swartz:
http:// lists. w3. org/ Archives/ Public/
www-tag/ 2013Jan/ 0017. html
[3] Esquela de Lawrence Lessig:
http:// lessig. tumblr. com/ post/
40347463044/ prosecutor-as-bully
[4] RIP, Aaron Swartz de Cory Doc-
torow:
http:// boingboing. net/ 2013/ 01/ 12/ rip-
aaron-swartz. html#more-205376
[5] Aaron explica cmo derrotaron
SOPA y PIPA:
http:// youtu. be/ Fgh2dFngFsg
RECURSOS
PORTADA Desarrollo de Botnets
10
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
analiza los correos electrnicos [1][2].
Rpidamente reescrib el mensaje uti-
lizando un lenguaje menos blico. As
es mi vida como programador de bot-
nets.
Este tipo de lenguaje es uno de los
obstculos a los que se tiene que
enfrentar un desarrollador de botnets,
pero ms all de su mala reputacin y
de su desafortunado nombre, los bot-
nets comerciales crean oportunidades
reales para el mundo de los negocios y
de los desarrollares. En este artculo,
voy a describir mi proyecto de compra
de automviles, explorando la impor-
tancia de los botnets comerciales y
detallando cmo las herramientas de
cdigo abierto, incluyendo Linux, son
importantes en el mundo de la progra-
macin de botnets y hostings.
Mala Reputacin
Por favor, no se lleven una mala ima-
gen de m cuando me escuchen decir
que soy programador de botnes. De
hecho, soy un miembro de la comuni-
dad IT respetable y bien conocido, con
experiencia en seguridad. Tambin soy
un desarrollador de software de indis-
cutible valor para mis clientes. La
principal forma con la que genero ese
valor es por medio de la automatiza-
H
ace unos aos, desarroll un
botnet comercial, tambin
conocido como sniper (franco-
tirador en ingls). Este botnet sniper
compraba automticamente vehculos
de un sitio web. Tambin se encargaba
de los pagos y de concertar una fecha
de entrega con mi cliente, una
empresa de automviles con bastante
reputacin. Aunque la primera prueba
real no fue satisfactoria, pude encon-
trar rpidamente el problema y com-
poner un correo electrnico que indi-
cara que estbamos listos para inten-
tarlo de nuevo. El correo electrnico
deca:
Estimado cliente, los snipers se
encuentran en posicin y van a empe-
zar al medioda a disparar sobre los
coches. Esperemos que por fin hoy
acierten en algn blanco.
Justo antes de enviar el mensaje, me
acord de que el gobierno intercepta y
cin de tareas online. Por ejemplo,
entre algunas de las tareas que auto-
matizo se encuentran la verificacin
de precios online, verificacin de sitios
web con precisin, verificacin de
identidades y obtencin de productos
para su reventa. Incluso he realizado
trabajos para gobiernos extranjeros. A
lo largo de 15 aos y numerosos pro-
yectos, he encontrado que la mejor
manera de automatizar tareas consiste
en distribuir la carga por medio de un
botnet.
No importa cmo de bien sean reci-
bidos mis botnets, constantemente me
encuentro batallando la mala reputa-
cin de los botnets de otros programa-
dores. Cuando la mayora de la gente
escucha la palabra botnet, visuali-
zan virus y programas spyware sigilo-
sos en ordenadores infectados. La
mayor parte de esta reputacin es bien
merecida. Por ejemplo, segn un
informe de seguridad publicado por
Microsoft a principios de este ao [3],
un simple botnet, Conficker, infect
alrededor de 7 millones de ordenado-
res por todo el mundo. Los sitios web
de comparticin de ficheros fueron la
primera fuente de infeccin. Los snto-
mas incluan la desactivacin de los
servicios de seguridad. El pronstico
Los secretos de un desarrollador de Botnets
Trabajadores
de la Web
No todos los Botnets son malos. Vamos a mostrar cmo aprovechar la
potencia de la arquitectura botnet para resolver problemas del mundo
real en un contexto empresarial. POR MICHAEL SCHRENK
Michael Schrenk es desarrollador soft-
ware, autor y conferenciante especia -
lizado en botnets comerciales. Es el
autor del libro Webbots, Spiders and
Screen Scrapers. Se puede visitar su
sitio web en http:// www. schrenk. com.
EL AUTOR
un
ejem-
plo
parti-
cularmente bueno.
Al contrario que el
ofensivo Conficker, este botnet no
tiene ninguna intencin daina y ha
sido probablemente la nica forma de
resolver un problema real del mundo
empresarial. Ahora, por primera vez,
he obtenido el permiso para hablar del
proyecto.
Un da, un cliente del mundo del
automvil me llam con un problema.
Me explic que los comerciantes de la
automocin utilizaban sitios web
seguros especiales para comprar veh-
culos de segunda mano provenientes
de empresas de rent a car. Estos
coches eran vehculos de gran valor
para los concesionarios, ya que tenan
pocos kilmetros y eran ltimos mode-
los de marcas populares.
Todos los comerciantes de la
automocin en los EE.UU.
queran tener vehculos de
este tipo en sus inventarios
de segunda mano y cada da,
varios centenares de estos
vehculos se aadan al sitio
web. De aquellos ofertados
en el sitio web, cerca de
media docena despertaban el
inters de casi todos los
comerciantes de vehculos
del pas. Estos coches eran
particularmente populares
porque posean equipamiento espe-
cial, tenan descuentos o
eran modelos de
moda.
El problema de mi
cliente era que, aunque l
poda ver los coches en venta
en el sitio web, no poda com-
prar los vehculos hasta una
hora especfica y cuando lle-
gaba la hora, los servidores
tenan demasiado trfico debido a
la competencia, dificultando incluso la
posibilidad de realizar una puja, no
digamos ya realizar una compra. Mi
cliente haba descubierto una gran
fuente de coches usados en los que
estaba interesado, pero que era inca-
paz de comprar. Tena un problema de
negocio y necesitaba una solucin, por
ello me pidi ayuda. Sospech que un
botnet personalizado podra resolver
el problema.
Cmo Funcionan los
Botnets Comerciales
Los Botnets como Sniper comparten
tres partes en comn:
Un servidor central.
Un nmero de mquinas clientes
(que denominar cosechadoras).
Un portal web para administrar los
botnets.
La Figura 1 muestra cmo se interrela-
cionan estos elementos.
El Servidor Central
y el Portal Web
Como cualquier botnet, el servidor
central es el corazn y el alma de Sni-
per, con un portal web que reemplaza
la frustrante interfaz web original. En
vez de competir con todo el mundo
para comprar un vehculo en un
Desarrollo de Botnets PORTADA
11
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
de los
ordena-
dores infecta-
dos no era bueno.
Si no se trataban, el virus
Conficker poda eventualmente tomar
el control completo del ordenador
infectado, convirtindolo en un
esclavo zombie de un servidor maestro
que se encontraba en la nube. Una vez
infectado, los ordenadores podan ser
utilizados para diversos propsitos
dainos, tales como el lanzamiento de
ataques DDoS (Distributed Denial of
Service) o cometer fraudes de identi-
dad.
Aunque los mtodos de distribucin
y propsito son diferentes, el botnet
Conficker comparte muchas similitu-
des con los botnets blancos que pro-
gramo con propsitos empresariales,
pero la diferencia es importante. No
todos los botnets son elementos soft-
ware que los antivirus deban eliminar.
En realidad, un pequeo porcentaje de
botnets actualmente son legtimos y
tiles, especialmente para negocios
que buscan obtener una ventaja com-
petitiva.
El Botnet Sniper
Aunque he programado muchos bot-
nets comerciales, el proyecto sniper es Figura 1: Anatoma de un botnet comercial.
los casos, sin embargo, la peticin de
compra de un coche se realizaba pr-
xima a la venta real. Una vez confir-
mada la venta, la cosechadora deba
pagar por el vehculo y concertar una
entrega entre mi cliente y el provee-
dor.
La mayora de los intentos indivi-
duales de los botnets de compras de
coches fallaban, pero en conjunto, los
botnets conseguan una tasa de xito
de ms del 95 por ciento. Esta tasa es
considerable si tenemos en cuenta
que, antes de utilizar los botnets, la
tasa de xito era tan baja que incluso
no mereca la pena realizar el intento
de comprar un coche. Usando este bot-
net Sniper, mi cliente se aseguraba de
conseguir casi cualquier vehculo que
se propona del sitio web de venta. De
hecho, a menudo tena que calmar el
entusiasmo de mi cliente y recordarle
que no deba volverse avaricioso
intentando comprar demasiados
coches en un nico da.
El botnet Sniper estuvo en funciona-
miento durante ms de un ao y com-
praron millones de dlares en coches
con muy poco
mantenimiento.
Hicimos, sin
embargo, en un
momento, el des-
cubrimiento de
que estbamos
tambin compi-
tiendo con otro
comerciante de
automviles que
tambin estaba
utilizando mto-
dos automatiza-
dos para realizar
las compras de los
vehculos en el
mismo sitio web.
Esto nos deriv a
una inevitable competicin con los
otros programadores. Tambin nos
llev a las tcnicas de sincronizacin
de relojes descrita anteriormente. Una
vez implementada la sincronizacin de
los relojes y ajustada, nuestro botnet
de nuevo domin la competicin,
incluso la competicin con el otro
botnet!
Por Dentro
Aunque el funcionamiento interno del
botnet podra parecer complicado, el
proceso de desarrollo de cualquier bot-
net se simplifica drsticamente cuando
se observan las tareas de forma indivi-
dualizadas y se utilizan las herramien-
tas adecuadas. A continuacin se pue-
den ver varios fragmentos de cdigo
donde se muestra cmo la programa-
cin de un botnet comercial efectivo
no es tan difcil como en principio
pudiera parecer. Algo que hace que el
desarrollo sea sencillo es el uso de las
herramientas de cdigo abierto que he
desarrollado para este propsito que se
puede obtener de Internet [4]. Las
libreras incluyen funciones para pro-
momento determinado, mi cliente
ahora slo tiene que seleccionar tran-
quilamente los vehculos que desea
comprar en el portal web del botnet. El
servidor central luego asigna estos
coches a las cosechadoras individua-
les. Posteriormente, a lo largo del da,
mi cliente utiliza el portal web para
descubrir qu coches han sido com-
prados por el botnet.
Las Cosechadoras
Deplegamos entre una y doce cosecha-
doras por cada coche que queramos
comprar. Las cosechadoras se encon-
traban repartidas por todo el pas.
Algunos ordenadores ejecutaban una
cosechadora y otros posean mltiples
instancias de las que se estaban ejecu-
tando simultneamente. En todos los
casos, las cosechadoras se ejecutaban
en nuestros ordenadores (al contrario
que los dainos botnets como Confic-
ker que se hacen presa de los ordena-
dores de otras personas). Una vez
asignado un vehculo de la web de
venta (objetivo), la cosechadora tena
que verificar que el coche an se
encontraba activo en el sitio de venta
y ligarse con el reloj del servidor web.
Conforme se acercaba la venta, se
deba sincronizar con ms precisin
con el reloj del servidor de ventas.
Durante el proceso de sincronizacin,
cada cosechadora tambin meda la
latencia del servidor y estimaba cun-
tas personas se encontraban utilizando
el sitio web.
Dependiendo de la estimacin de
cunta gente se encontraba com-
prando coches en el sitio web, cada
cosechadora debera enviar peticiones
de tiempo precisas para comprar el
vehculo asignado. En das particular-
mente saturados, las peticiones se rea-
lizaban incluso cinco segundos antes
del tiempo de venta. En la mayora de
PORTADA Desarrollo de Botnets
12
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
01 <?php
02 include(LIB_http.php); // incluye el
cdigo http de la librera
03 $target = http://www.schrenk.com; //
especifica la direccin de destino
04 $referrer = ; // especifica un
referrer, si se necesita
05 $result = http_get($target, $referrer);
06 $raw_data = $result[FILE];
07 ?>
Listado 1: Descargando una pgina web
01 <?php
02 include(LIB_http.php); // incluido el
cdigo de anlisis de la librera
03
04 $task = return_between($raw_data, <task>,
</task>, EXCL);
05 $target = return_between($raw_data, <target>,
</target>, EXCL);
06 $username = return_between($raw_data,
<username>, </username>, EXCL);
07 $password = return_between($raw_data,
<password>, </password>, EXCL);
08 $vin_array = parse_array($raw_data, <vin>,
</vin>);
09 ?>
Listado 3: Procesando los datos de la web
01 <xml>
02 <task>purchase</task>
03 <target>somewebsite.com</target>
04 <username>clientname</username>
05 <password>supersecret</password>
06 <vehicles>
07 <vin>192KF8Q2MSJE8T921</vin>
08 <vin>192KF8IWECOWIMCE3</vin>
09 <vin>192KF0032HJS002AS</vin>
10 </vehicles>
11 </xml>
Listado 2: Del servidor central a las
cosechadoras
cesar y descargar pginas web, que a
continuacin vamos a explorar. Tam-
bin incluye cdigo que ser de ayuda
para otras muchas tareas, como el redi-
mensionado de imgenes, la programa-
cin de araas y la comunicacin con
servidores de correo electrnico.
Descarga de Pginas Web
Las cosechadoras para el botnet no
slo tienen que descargar las pginas
web del servidor de ventas, sino que
tambin tienen que solicitar al servi-
dor central que realice tareas. En cual-
quier caso, consisten esencialmente en
realizar peticiones HTTP a los servido-
res web solicitando pginas web. Si se
utiliza la librera LIB_http [4], el
cdigo para descargar una pgina web
es bastante simple. El cdigo del Lis-
tado 1 muestra un ejemplo.
El Listado 1 usa LIB_http, que hace
un uso intensivo de libcurl4 [5], la
implementacin PHP de cURL. El pro-
yecto cURL es un conjunto de herra-
mientas multiplataforma que permite
el acceso a recursos utilizando diver-
sos protocolos (no slo HTTP). cURL
tambin se encarga automticamente
de salvar los posibles obstculos tales
como la gestin de cookies, el redirec-
cionamiento de pginas, el cifrado y
otras tareas de bajo nivel.
Procesando los Datos
Una vez bajada una pgina web, hay
que extraer el material importante del
resto del texto que lo rodea que pre-
senta poco inters para las cosechado-
ras. Por ejemplo, obtener las instruc-
ciones que vienen del servidor central,
que son simplemente pginas web
especializadas. Para esta demostra-
cin, vamos a suponer que los datos
que la cosechadora recibe del servidor
central son como el cdigo XML que se
muestra en el Listado 2.
Aunque existen diversas formas de
procesar documentos XML, la librera
LIB_parse se usa en el Listado 3 para
mostrar cmo se
puede utilizar la
misma tcnica
para procesar
diversos tipos de
informacin web.
En el ejemplo
del Listado 3 se
muestran dos de
las muchas fun-
ciones de
LIB_parse. La
funcin
return_between()
simplemente
devuelve los
datos que se
encuentren entre
dos etiquetas. El
ltimo parmetro
EXCL pasado a la
funcin le indica
que no incluya las
etiquetas en el
resultado. Si se
quiere que se
incluyan las eti-
quetas junto con
los datos, el ejem-
plo debera haber
utilizado el par-
metro INCL. La
otra funcin que
se muestra en el
Desarrollo de Botnets PORTADA
13
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Listado 3 es parse_array(). Esta fun-
cin crea un array de fcil uso con
todos los caracteres encontrados entre
cada instancia de las dos etiquetas. En
este caso, las etiquetas son etiquetas
XML que encapsulan los nmeros de
identificacin de los vehculos. Con
pginas web normales, la funcin
parse_array() podra devolver las cel-
das de una tabla, hiperenlaces o todas
las referencias a imgenes, como se
muestra en el Listado 4.
Envo de Formularios
Otra tarea requerida es el envo de for-
mularios por parte del botnet. El envo
de formularios es la tcnica utilizada
para la compra de los vehculos, as
como para el pago y para concertar la
entrega de los mismos. De nuevo, con
la ayuda de LIB_http, esta operacin se
realiza de forma sencilla. En realidad
existen dos formas de enviar un for-
mulario, dependiendo de lo que espere
el controlador del formulario. Se
puede utilizar el mtodo GET modifi-
cando la query string al final de la
URL, o se puede realizar una peticin
por el mtodo POST, como se muestra
en el Listado 5.
Programando y Albergando
Entornos
Desarrollo cosechadoras y los servido-
res para las cosechadoras tanto en
entornos WAMP como LAMP, aunque
Ubuntu es mi distribucin de Linux
favorita. (No tengo ninguna preferen-
cia tcnica por utilizar Ubuntu, sim-
plemente es por cuestiones de familia-
ridad). He escrito bots en Perl, Java,
Visual Basic e incluso Tcl/ Tk. En los
ltimos 12 aos, sin embargo, he
estado programando exclusivamente
en PHP. A parte de la simplicidad del
lenguaje, PHP funciona bien con lib-
curl [5], que facilita la descarga de
pginas web. Adems de las herra-
mientas de cdigo abierto que he
comentado anteriormente, la nica
otra herramienta que he utilizado ha
sido un editor de textos, normalmente
jEdit [6].
A lo largo de los aos he estado
deplegando mis proyectos en diversos
entornos de produccin. Inicialmente,
mis servidores estaban todos basados
en FreeBSD. Posteriormente, me pas
a una alternativa ms barata, entornos
01 <?php
02 include(LIB_http.php); // incluido el
cdigo de anlisis de la librera
03
04 // inicializa los elementos del formulario como un
array
05 $form_array[session] = 12301231#e0sds0122342;
06 $form_array[user] = $username;
07 $form_array[password] = $password;
08 $form_array[Login] = login;
09 $form_handler = http://www.WebbotsSpidersScre-
enScrapers.com/form_analyzer.php;
10 $referrer = ;
11
12 $submission_result = http_post_form($form_handler,
$referrer, $form_array);
13 $web_page = $submission_result[FILE];
14 ?>
Listado 5: Enviando un formulario por el
mtodo POST
01 <?php
02 include(LIB_parse.php); // incluido el
cdigo de anlisis de la librera
03
04 $td_array = parse_array($raw_data, <td,
</td>); // array de celdas de una tabla
05 $img_array = parse_array($raw_data, <img, >);
// array de imgenes
06 $link_array = parse_array($raw_data, <a, </a>);
// array de enlaces
07 ?>
Listado 4: Usando la funcin parse_array()
botnet podra haber incluso ahorrado
dinero al vendedor, ya que el proceso
estaba automatizado. Por ello, los
errores en el pago o en la entrega se
reducen drsticamente. Durante el ao
que el proyecto estuvo funcionando,
los botnets nunca produjeron un error
que costara al sitio web de ventas nin-
gn dinero o prdida de tiempo.
El verdadero peligro de no utilizar
las ideas nada tradicionales como el
uso de botnets comerciales son el
riesgo de no motivar a los desarrolla-
dores a usar sus habilidades para inno-
var.
Viviendo en la Sombra
Incluso cuando todo es legal y
honesto, es mejor que los programado-
res de los botnets no muestren todas
sus cartas. La nica razn por la que
estoy utilizando un ejemplo real en
este artculo es porque el ciclo de vida
natural de la aplicacin finaliz hace
varios aos y he obtenido el permiso
especfico de mi cliente para escribir
sobre el proyecto. Por otro lado, siem-
pre mantengo la boca cerrada cuando
se trata de los proyectos que estoy
desa rrollando. La razn de vivir entre
las sombras es ocultar cualquier pista
de que estoy desarrollando tecnologas
que solucionan problemas que todo el
mundo resuelve de forma tradicional.
Esta poltica es mejor ya que nunca se
sabe quin puede leer los registros de
los servidores y nunca se sabe quin
conoce a los competidores de nuestros
clientes.
Aunque muchos botnets dependen
de proxies para ocultar su ruta, creo
que la mejor forma de desarrollar bot-
nets sigilosos consiste en simular la
actividad humana lo ms aproximada-
mente posible. Las formas para hacer
que un botnet se parezca a un humano
incluyen:
insercin de retardos aleatorios
limitacin de interaccin con el
sitio web objetivo
uso de mltiples cuentas de usua-
rio (si es posible o necesario)
ejecutar los botnets durante los
picos de los perodos de uso
El ltimo punto a veces se sobrestima,
pero si queremos que el comporta-
miento del botnet se parezca al de una
persona, es mejor que funcione
cuando el resto de la gente tambin
est utilizando el sitio web objetivo.
Su ejecucin durante los picos de los
perodos de uso tambin har que las
entradas en los registros del servidor
sean menos sospechosas.
Desarrollo de Botnets
como Carrera Profesional
Mi vida como desarrollador de soft-
ware se volvi interesante cuando
comenc a programar bots. Mi entrada
en este rea vino de un inters por la
seguridad de las redes, que rpida-
mente me deriv por un inters en
clientes web automatizados. Los web-
bots fueron mi camino para salir de la
jungla cbica y comenc un perodo
en el que me surgieron contratos nue-
vos, oportunidades de dar conferen-
cias por todo el mundo y apariciones
en los medios de comunicacin, inclu-
yendo la BBC en el Reino Unido y en la
California Public Radio en EE.UU. Qui-
zs la mayor recompensa, a pesar de
todo, sea la expresin en la cara de
mis clientes cuando les resuelvo los
problemas de negocio usando tecnolo-
gas existentes de forma interesante e
inesperada.
Linux, donde la palabra clave es
barato. Mi experiencia es que una
solucin de hosting tiene un coste tan
bajo como 3 libras, 2 euros o 5,99
dlares US al mes, un precio ms que
adecuado para albergar los servidores
para las cosechadoras. La razn de
adquirir un hosting mnimo radica en
que mis botnets proporcionan un
beneficio especfico por tarea y tienen
muy pocos usuarios humanos. Por
ltimo, he estado disfrutando la flexi-
bilidad y las ventajas de coste de las
soluciones Linux basadas en la nube,
principalmente EC2 de Amazon,
donde Ubuntu es la distribucin estn-
dar.
Los Beneficios de la
Arquitectura Botnet
La arquitectura botnet clsica ofrece
muchos beneficios. La ms obvia es
que se puede escalar fcilmente la
capacidad de la arquitectura simple-
mente aadiendo ms cosechadoras.
La idea de albergar las cosechadoras
en un entorno basado en la nube es
especialmente atractiva slo por este
motivo. Mltiples cosechadoras tam-
bin proporcionan redundancia y per-
miten el uso de mltiples direcciones
IP. Como se ve en el ejemplo del bot-
net Sniper, la tecnologa botnet pro-
porciona ventajas competitivas obvias.
En el caso del ejemplo, mi cliente era
ms competitivo que cualquier otro
competidor que no hubiese desple-
gado botnets.
Probablemente se est preguntando
si el uso de botnets para resolver pro-
blemas de negocios es o no un juego
limpio. Para el caso del ejemplo un
botnet de compra de coches la alter-
nativa hubiese sido llenar una habita-
cin con vendedores y personal de
administracin e indicarle a los mis-
mos que refresquen sus navegadores
de forma repetida hasta que los coches
que cada uno tuviese asignados salie-
sen a la venta. La solucin basada en
el uso de recursos humanos, hubiera
tenido que emplear la misma (o
mayor) cantidad de recursos de servi-
dor, pero a un mayor coste y con un
peor resultado para mi cliente. La
nica diferencia es que mis botnets
necesitan menos mano de obra.
Con ellos, el sitio web de ventas de
coches realiza sus ventas. De hecho, el
PORTADA Desarrollo de Botnets
14
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
[1] Security Services Get More Access to Monitor Emails and Social Media:
http:// www. guardian. co. uk/ technology/ 2012/ jul/ 28/ isecurity- services-emails- social-
media
[2] U.S. Government Wants to Read Your Emails:
http:// news. discovery. com/ tech/ internet-wiretap-intelligence. html
[3] Informe de Inteligencia de Seguridad de Microsoft, Volume 12, 2012 (pgina 4):
http:// download. microsoft. com/ download/ C/ 9/ A/ C9A544AD-4150-43D3-80F7-
4F1641EF910A/ Microsoft_Security_ Intelligence_Report_Volume_12_ English. pdf
[4] Libreras Webbot/ Botnet:
http:// www. webbotsspidersscreenscrapers. com/ DSP_download. php
[5] libcurl: http:// curl. haxx. se/ libcurl/
[6] jEdit: http:// www. jedit. org/
RECURSOS
PORTADA HTML5 Offline
16
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
para guardar coordenadas geogrficas
(geolocalizaciones). Esta aplicacin fun-
ciona en cualquier dispositivo que per-
mita caractersticas de HTML en desco-
nexin, incluyendo Firefox (actualmente
14) , Opera (v12), Chrome (v21), Safari e
Internet Explorer (v9).
Entender HTML Offline
Para operar sin una conexin de Inter-
net, una aplicacin HTML5 offline debe
mantener una copia sin la conexin de la
aplicacin y todos los datos de la misma.
HTML5 define los siguientes componen-
tes:
Cach de la aplicacin una cach
utilizada para almacenar componen-
tes de la aplicacin en s misma,
tales como archivos HTML y Java -
Script.
Almacenamiento web usado para
almacenar parejas de valores clave.
Web SQL utilizado para almacenar
datos en una base de datos SQL.
Indexed DB que almacena datos
en una base de datos No SQL.
Para empezar, describiremos estos com-
ponentes importantes de almacena-
miento offline, antes de ponernos a tra-
bajar en una aplicacin HTML5 sin cone-
xin.
Cach de la Aplicacin
La memoria cach de la aplicacin [3] se
controla a travs de un manifiesto de
L
os navegadores web original-
mente eran simples visores para
documentos de HTML esttico.
Desde HTML2, los navegadores tienen la
capacidad de capturar una sencilla
entrada del usuario con un formulario y
enviarla a la base de datos en Internet.
Para que esto funcione, desde luego, el
sistema tiene que estar conectado a Inter-
net. Con cualquier interrupcin de la
conexin de red, los desesperados usua-
rios pierden su trabajo.
HTML5 [1] incluye algunas caracters-
ticas muy potentes que permiten a las
aplicaciones web trabajar sin conexin.
En este artculo nos introduciremos en
estas tecnologas offline en detalle. Tam-
bin mostraremos cmo construir un
ejemplo de aplicacin que implementa
una herramienta con capacidad offline
cach que se deposita en el servidor
web. El manifiesto del Listado 1 hace
que el navegador almacene todos los
archivos que se han listado despus de la
palabra clave CACHE en la cach de la
aplicacin. El manifiesto de la misma
permite rutas URL relativas y absolutas.
Los usuarios deben conceder permisos
antes de que el navegador almacene
todos los archivos. Si el navegador no
pregunta, los usuarios pueden cambiar
la configuracin, por ejemplo a travs
del men contextual de Firefox en Ver
informacin de la pgina | Permisos. En
la Figura 1, el usuario ha permitido que
se almacenen datos en la cach de la
aplicacin (ver la ltima configuracin al
final).
Las URL en la seccin NETWORK del
manifiesto de cach (Listado 1) no aterri-
zan en la cach de la aplicacin. En su
lugar, el navegador los solicita cada vez
nuevamente al servidor web. El comodn
* permite al sistema acceder a cada URL
en la web. Los desarrolladores asocian
un archivo HTML con el manifiesto de
cach especificando una ruta en el atri-
buto manifest (Listado 2). Esta ruta es
relativa al archivo HTML. La primera vez
que se llama, el navegador web verifica
la validez del manifiesto. Si el navegador
est en modo desconectado o no hay
conexin de red disponible, el navegador
carga los archivos desde la cach de la
aplicacin.
Aplicaciones Offline con HTML5
SIN RED
Una memoria cach en desconexin en nuestro nave -
gador y un poco de acrobacia HTML5 combinadas dejan
que las aplicaciones web sigan funcionando incluso
cuando se cae la conexin. POR ANDREAS MLLER
01 CACHE MANIFEST
02
03 CACHE:
04 index.html
05 js/jquery-1.7.1.min.js
06 js/script.js
07 s/jquery.mobile-1.1.0.min.css
08 js/jquery.mobile-1.1.0.min.js
09 js/OpenLayers.js
10
11 NETWORK:
12 /couchdb/
13 *
Listado 1: Manifiesto de
Cach
namiento local con JavaScript (Listado
3).
El atributo storage en la Lnea 2 se
refiere al almacenamiento local. El
mtodo save en la Lnea 4 almacena
objetos en un campo. Despus la lnea 7
los escribe con el mtodo setItem() en el
almacenamiento local. Para obtener un
valor, stringify() traduce el campo a una
cadena de caracteres en formato JSON.
Un objeto se lee con el mtodo de lec-
tura read (Lnea 10). Al igual que save,
este mtodo primero desempaqueta el
campo del objeto
con unpack().
Unpack lee el
campo serializado
del almacena-
miento local con
getItem() (Lnea 5).
Finalmente, parseJ-
SON() reconstruye
el campo. El
mtodo read() uti-
liza los resultados
de la operacin de
lectura para llamar
a la funcin de
retrollamada defi-
nida por el usuario
desde la lista de
parmetros (ver
Lnea 10).
Web SQL
Si bien el almace-
namiento local es
perfectamente ade-
cuado para el almacenamiento de pares
de valores clave, no es adecuado para
mantener datos estructurados. La dura-
cin del procesado del mtodo strin-
gify() crece rpidamente con el tamao
del objeto a serializar (Figura 3). W3C
tambin ha creado Web SQL [5], el cual
puede acceder a una base de datos SQL
desde los navegadores web con Java -
Script. Esta solucin es controvertida, sin
embargo el desarrollo ulterior de la
norma se suspendi a finales de 2010.
Web SQL se incluye en las versiones
HTML5 Offline PORTADA
17
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Si el manifiesto ha cambiado un slo
bit, el navegador web lo lee de nuevo y
carga los archivos otra vez desde la sec-
cin CACHE en la aplicacin. Chrome
nos permite echar un vistazo sobre cmo
se procesa el manifiesto de cach (Figura
2). Para que el navegador web reconozca
el manifiesto se debe establecer el
correspondiente tipo MIME en el servi-
dor web de Apache aadiendo la
siguiente lnea en nuestro archivo de
configuracin.
AddType cache-manifest U
.appcache
Almacenamiento Web
Las cookies facilitan el seguimiento de
una sesin en el protocolo HTTP, pero
son poco adecuadas para un almacena-
miento permanente de los datos de la
aplicacin en un navegador web. Por
esta razn W3C cre Web Storage en
2009 [4]. En contraposicin a las alterna-
tivas Web SQL e Indexed DB, este tipo de
almacenamiento est incluido en las ver-
siones actuales de todos los navegado-
res.
Web Storage ofrece dos tipos de alma-
cenamiento de datos: el almacenamiento
de sesin guarda datos por pestaa y el
almacenamiento local los guarda por
URL. Ambos almacenamientos, sesin y
local, depositan valores clave, pero slo
los datos en almacenamiento local que-
dan permanentemente. El objeto win-
dow. LocalStorage implementa el almace-
Figura 1: El usuario puede establecer permisos para la Geolocaliza-
cin y la cach offline.
Figura 2: Registros de Chrome para los pasos del proceso del mani-
fiesto de cach.
01 window.LocalStorage = {
02 storage: window.localStorage,
03
04 save : function(obj) {
05 var pos = this._unpack(pos);
06 pos[obj.key] = obj;
07 this.storage.setItem(pos,
JSON.stringify(pos));
08 },
09
10 read : function(key, cbk) {
11 cbk(this._unpack(pos)[key]);
12 },
13
14 _unpack : function(key) {
15 var data = this.storage.getItem(key)
16 return (data)?jQuery.parseJSON(data):{};
17 }
18 };
Listado 3: Almacenamiento Local
01 <!DOCTYPE HTML>
02 <html manifest=geotrack.appcache>
03 [...]
04 </html>
Listado 2: Integrar el Manifiesto
base de datos. El mtodo openDatabase()
necesita el nombre de la base de datos, la
versin, un nombre para mostrar y el
tamao aproximado de la base de datos
en bytes. Un nmero de versin vaco
abrir siempre la
ltima versin.
En la lnea 14,
readTransaction()
lee los datos y
transaction()
(Lnea 22) es para
escribir. Ambos
mtodos corren de
manera asncrona
(ver el apartado
Invocacin de
Mtodo Asn-
crono). El mtodo
executeSql() en las
lneas 9, 15 y 23
ejecuta instrucciones SQL. El interro-
gante en las declaraciones de SQL es un
comodn que se reemplaza por los ele-
mentos en los campos que siguen.
La retrollamada de xito desde execu-
teSql() en la Lnea 16 llama a la funcin
de retrollamada cbk definida por el usua-
rio para la primera lnea de resultados
data.rows.item(0). La retrollamada en la
Lnea 17 escribe un mensaje de error en
la consola. El esquema de la base de
datos se puede cambiar con el mtodo
changeVersion() (Lnea 8). Esta funcin
necesita los nmeros antiguo y nuevo de
la versin. Las instrucciones para mani-
pular el esquema se transfieren por la
retrollamada de xito.
Indexed DB
Mozilla rechaz implementar Web SQL
en Firefox y representar objetos en las
actuales de los navegadores Opera,
Chrome y Safari.
Un ejemplo de Web SQL se puede ver
en el Listado 4. Antes de las instruccio-
nes SQL, la lnea 3 debe primero abrir la
PORTADA HTML5 Offline
18
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
01 window.DataConnector = {
02 autoConnect : function() {
03 if (IndexedDB.indexedDB) {
04 return IndexedDB;
05 } else if (window.openDatabase) {
06 return WebSQL;
07 } else if (window.localStorage) {
08 return LocalStorage;
09 }
10 throw new Error({message: no storage class
available!});
11 }
12 };
Listado 6: Inicializar la Cach Offline
01 window.WebSQL = {
02 _open : function() {
03 return window.openDatabase(geos, , myDB,
50000000);
04 },
05
06 reinstall : function(vers) {
07 var db = this._open();
08 db.changeVersion(db.version, vers, function(t) {
09 t.executeSql(CREATE TABLE pos (id, lat float, lon
float));
10 });
11 },
12
13 read : function (key, cbk) {
14 this._open().readTransaction(function(t) {
15 t.executeSql(SELECT * FROM pos WHERE id = ?,
[key],
16 function(t, d)
{d.rows.length?cbk(d.rows.item(0)):},
17 function(t, e) {console.log(e.message)});
18 });
19 },
20
21 save : function(obj) {
22 this._open().transaction(function(t,r) {
23 t.executeSql(INSERT INTO pos (id, lon, lat)
VALUES (?, ?, ?),
24 [obj.key, obj.lon, obj.lat])
25 });
26 }
27 };
Listado 4: Envoltorio de Objeto para Web
SQL
01 window.IndexedDB = {
02 indexedDB : window.indexedDB ||
window.webkitIndexedDB || window.mozIndexedDB,
03
04 storeParams: {keyPath:key, autoIncrement:false},
05
06 open : function(cbk, mod) {
07 var orq = this.indexedDB.open(geos);
08 orq.onsuccess = function(e) {
09 if (window.mozIndexedDB) {
10 try {
11 cbk(e.target.result.transaction([pos],
mod).objectStore(pos));
12 } catch(l) {
13 cbk(e.target.result.transaction([pos], ((mode
===
0)?readonly:readwrite)).objectStore(pos));
14 }
15 } else {
16 cbk(e.target.result.transaction([pos],
mod).objectStore(pos));
17 }
18 }},
19
20 reinstall : function() {
21 this.indexedDB.deleteDatabase(geos);
22 var orq = this.indexedDB.open(geos);
23 orq.onupgradeneeded = function(e) {
24 e.target.result.createObjectStore(pos,
IndexedDB.storeParams);
25 };
26 orq.onsuccess = function(e) {
27 if (e.target.result.setVersion) { //chromium
28 var crq = e.target.result.setVersion(2);
29 crq.onsuccess = function(e) {
30 e.target.source.createObjectStore(pos,
IndexedDB.storeParams);
31 }}};
32 },
33
34 read : function(key, cbk) {
35 this.open(function(obst) {
36 obst.get(key).onsuccess =
function(e) {cbk(e.target.result);}
37 }, 0);
38 },
39
40 save : function(obj) {
41 this.open(function(obst) {obst.put(obj);}, 1);
42 }
43 };
Listado 5: Envoltorio de Objeto para IndexedDB
columnas de una tabla de base de datos
(asignacin relacional de objetos) es
complicado. Muchos consideran que es
ms sencillo usar un almacn de objetos,
tal y como el componente Indexed DB
[6]. Indexed DB almacena objetos de
acuerdo a sus claves y con transacciones
e ndices, tambin incluye aspectos
importantes de un sistema de bases de
datos capaz de permitir mltiples usua-
rios. Indexed DB ha sido parcialmente
implementado en las versiones actuales
de Firefox y Chrome, as como en el pr-
ximo Internet Explorer 10 de Microsoft.
El Listado 5 muestra cmo funciona
IndexedDB: la Lnea 2 referencia el
objeto de la base de datos con los prefi-
jos del fabricante de distintos navegado-
res. En la Lnea 6, el cdigo JavaScript
abre la base de datos y en la lnea 13 ini-
cia una transaccin. El primer parme-
tro del mtodo de transaccin entrega
una lista de almacenes de objetos que
hay que procesar. La segunda lnea
marca las transacciones ledas con 0 y
escribe 1. A partir de la versin 13, Fire-
fox usa readonly y readwrite, tal y como
prescribe el estndar. Slo entonces el
siguiente mtodo objectStore() permite
el acceso a los datos en el almacn de
objetos pos.
En la Lnea 35, read usa el mtodo
get() para leer el objeto de manera asn-
crona con la clave key. La retrollamada
de xito llama a la funcin de retrolla-
mada definida por
el usuario cbk()
para el resultado de
la operacin de lec-
tura. save en la
Lnea 39 usa el
mtodo put() para
almacenar un
objeto. Indexed DB
extrae la clave de keyPath: key en la
Lnea 14. Este acuerdo le da a Indexed
DB la ruta para encontrar la clave en un
objeto.
El cdigo en las lneas 23 y 29 entrega
el parmetro mientras el almacn de
objetos pos est siendo creado por el
mtodo createObjectStore(). Despus de
haber borrado la base de datos pos en la
Lnea 20, el cdigo permite al evento
onupgradeneeded crearla de nuevo. Esto
tambin ocurre cuando se abre por pri-
mera vez una base de datos. En el nave-
gador Chrome, el mtodo setVersion()
entra en accin en la retrollamada de
xito de la peticin de apertura. La Lnea
27 especifica el nmero mayor de la ver-
sin.
API Uniforme
Los tres objetos envueltos en los Lista-
dos 3 a 5 ofrecen una API uniforme para
almacenar objetos. El mtodo autoCon-
necet del objeto DataConnector en el Lis-
tado 6 selecciona la mejor interfaz. Si
ninguno de los mtodos de almacenaje
es adecuado, throw produce un error.
Una Aplicacin de Ejemplo
La cach de aplicacin y los mtodos de
almacenaje descritos previamente permi-
ten al desarrollador construir una aplica-
cin web capaz de sobrevivir sin cone-
xin. En el resto de este artculo, descri-
biremos la programacin de una aplica-
cin de ejemplo que se muestra en la
Figura 4.
Geotracker [6] permite al usuario guar-
dar y mostrar coordenadas geogrficas
en un dispositivo mvil. Con un clic en
New Entry el usuario puede marcar una
posicin nueva en el mapa. Tambin se
establece la posicin actual. Despus de
guardar la ubicacin, la aplicacin pri-
mero deposita la posicin en una de las
tres reas de almacenamiento y luego
coloca una marca roja en el mapa. La
posicin tambin se pone en una lista
bajo el mapa. Aunque la geolocalizacin
ya es una caracterstica estndar en tel-
HTML5 Offline PORTADA
19
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Figura 3: Comparativa de resultados del
almacenamiento local: la duracin de proce-
sado aumenta abruptamente cuando se
almacenan grandes campos de datos.
Una invocacin de mtodo asncrono, toma el motor
JavaScript fuera de su ejecucin secuencial y ejecuta el mtodo
tan rpido como puede. De esta manera la aplicacin puede
continuar ejecutndose, por ejemplo, mientras espera alguna
entrada. Si la invocacin es correcta, se ejecuta una retrolla-
mada de xito. Si la invocacin no es correcta se ejecuta una
retrollamada de error.
Invocacin de Mtodo Asncrono
Tal y como demuestra un reinicio del
navegador , los datos guardados se retie-
nen y la aplicacin puede incluso ini-
ciarse sin la necesidad de una conexin
de red. Aquellos que estn interesados
en lo que pasa bajo la superficie debe-
ran usar las versiones actuales de los
navegadores Firefox, Opera o Chrome
para su anlisis. Chrome permite todas
las tecnologas descritas en este artculo.
Adems, el navegador web de Google
ofrece una consola ordenada para la ins-
peccin de la aplicacin web. Podemos
llamar a la consola con el atajo de
teclado [Ctrl] + [Mays] + [I].
El navegador web puede determinar la
posicin actual de un dispositivo mvil
con la API de Geolocalizacin [7]. Fire-
fox [8] y Chrome determinan la posicin
con una consulta a
Google, la cual
analiza la informa-
cin de las redes
Wifi en las cerca-
nas y la direccin
IP. La API de Geo-
localizacin empaqueta los datos en un
objeto. Estos datos incluyen la latitud y
longitud, la precisin en grados, la alti-
tud sobre el nivel del mar as como la
precisin de la altitud (altitudeAccuracy)
en metros, la velocidad actual en en el
suelo (velocidad) en metros por segundo
y la direccin del movimiento (heading)
en grados, relativos a 0 norte con incre-
mento en el sentido horario.
Evaluacin de la Posicin
La API de Geolocalizacin se imple-
menta en todas las versiones actuales de
los navegadores Firefox, Opera, Chrome,
Safari e Internet Explorer, pero por des-
gracia no funciona en Firefox bajo Linux.
El script Geolocation Shim [9] es una
manera alternativa para determinar
nuestra geolocalizacin con Google. En
todo caso para realizar esta operacin
debe activarse la interfaz WiFi.
El Listado 7 muestra cmo utiliza el
programador la API de Geolocalizacin.
La funcin getCurrentPosition() en las
lneas 3 a 7 determina la posicin de
manera asncrona. La retrollamada de
xito se encuentra en el primer parme-
tro de la funcin y la retrollamada de
error est en el segundo.
El objeto en el tercer parmetro
configura la llamada: highAccuracy
determina la posicin tan precisamente
como sea posible, lo que puede que uti-
lice algo de energa; maximumAge per-
mite el uso de geolocalizaciones guarda-
das ms recientes que la especificada y
timeout determina el tiempo despus del
cual el posicionamiento se abortar.
Ambas entradas usan unidades en mili-
segundos. No obstante, la configuracin
maximumAge=0 no recurrir a geoloca-
lizaciones previamente guardadas.
La funcin watchPosition() observa la
posicin actual permanentemente. Si la
posicin cambia notablemente, el cdigo
fonos inteligentes y otros dispositivos
mviles, este sencillo ejemplo nos mos-
trar cmo construir una aplicacin con
la nueva e importante funcionalidad de
modo sin conexin de HTML5.
Geotracker emplea una coleccin de
diferentes tecnologas web. Almacena-
miento local, Web SQL e Indexed DB que
aseguran que los datos de la aplicacin
van a estar disponibles sin conexin. La
API de Geolocalizacin determina la ubi-
cacin del dispositivo mvil y la biblio-
teca OpenLayers muestra la posicin en
un mapa. jQuery Mobile dibuja una
interfaz grfica que funciona en ordena-
dores y telfonos inteligentes. Final-
mente, CouchDB almacena las ubicacio-
nes en el servidor, lo que las pone a dis-
posicin de mltiples usuarios.
PORTADA HTML5 Offline
20
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Figura 4: La aplicacin con capacidad offline del ejemplo Geotracker almacena coordenadas
geogrficas y muestra su posicin en un mapa.
01 window.Geolocation = {
02 current : function() {
03 navigator.geolocation.getCurrentPosition(
04 function(pos) {Geolocation.success(pos)},
05 function(err) {console.log(err.code);},
06 {highAccuracy:true, maximumAge:0, timeout:1000}
07 );
08 },
09
10 watch : function() {
11 navigator.geolocation.watchPosition(
12 function(pos) {Geolocation.success(pos)}
13 );
14 },
15
16 success : function(pos) {
17 Geolocation.latitude = pos.coords.latitude;
18 Geolocation.longitude = pos.coords.longitude;
19 }
20 };
Listado 7: Envoltorio Objeto API de
Geolocalizacin
01 <!DOCTYPE html>
02 <html>
03 <head>
04 <meta charset=UTF-8/>
05 <script src=js/OpenLayers.js></script>
06 <script src=listing-12.js></script>
07 </head>
08 <body>
09 <div id=osmap
style=width:512px;height:256px></div>
10 </body>
11 </html>
Listado 8: OpenLayers
ejecuta la retrollamada de xito, lo que
guarda la latitud y longitud actuales.
OpenLayers
Las geolocalizaciones se pueden mostrar en
un mapa con la ayuda de la biblioteca
JavaScript libre OpenLayers [10]. Actual-
mente, OpenLayers est disponible en la
versin 2.11. El Listado 8 muestra cmo
integra el elemento script en la lnea 5 la
biblioteca, en un documento HTML. El con-
tenedor div en la Lnea 9 recoge el mapa.
El Listado 9 demuestra cmo se pue-
den mostrar las posiciones usando
JavaScript. La Lnea 6 inicializa el rea
del mapa, la lnea 7 aade una capa con
Openstreetmap y la lnea 9 aade la capa
para los marcadores. El mtodo addMar-
ker() en la Lnea 15 marca una geolocali-
zacin creando un clon del objeto de
imagen en la lnea 12 y luego inserta las
coordenadas transformadas con coords
(Lnea 20). Finalmente, el script centra el
mapa con los marcadores nuevos.
jQuery Mobile
jQuery Mobile [11], actualmente en la
versin 1.1.0, es un entorno de trabajo
de cdigo abierto utilizado para crear
interfaces grficas de usuario para nave-
gadores web en telfonos inteligentes y
tabletas. El entorno de trabajo jQuery
Mobile incluye muchos botones precon-
figurados, listas, dilogos y filtros de
bsqueda que de lo contrario los desa -
rrolladores tendran que tomarse la
molestia de crear y poner a prueba.
jQuery Mobile, que est basado en
HTML5 y en la biblioteca de JavaScript
jQuery, es compatible con un nmero
creciente de entornos, tales como Apple
I-OS 3.2 a 5.0, Android 4.0, Windows
Phone 7 a 7.5, Blackberry 7, Firefox Des-
ktop 4 a 9, Firefox Mobile (10 Beta),
Opera Desktop 4 a 5, Chrome Desktop 11
a 17 y Safari Desktop, as como para
Internet Explorer 7 a 9.
Los elementos preconfigurados desde
jQuery Mobile se pueden utilizar con
atributos de datos preconfigurados [12]
(Listado 10). Despus de que las lneas 6
a 8 hayan cargado los archivos para
jQuery Mobile, el atributo de datos data-
theme en la Lnea 11 selecciona el diseo
corporativo c para la pgina. Los pro-
gramadores pueden crear sus propios
diseos con la herramienta ThemeRoller
[13]. El atributo data-role identifica el
contenedor en la lnea 12 como una
pgina nica y el atributo en la lnea 13
es la cabecera para esta pgina. La lnea
16 especifica el rea de contenido y la
lnea 17 define el elemento a como un
botn para aadir ubicaciones nuevas.
El botn New Entry en la Lnea 17 del
Listado 10 integra un dilogo referen-
ciando el elemento con el ID addDetails
en el atributo data-rel=dialog. El Lis-
tado 11 muestra el cdigo fuente del ele-
mento formulario introduciendo la ubi-
cacin. El Listado 12 describe el compor-
tamiento de la aplicacin en el caso de
diferentes eventos. La primera vez que
se carga el elemento ID addDetail dis-
para el evento pageinit en la Linea 1.
El envo del formulario el evento
submit (Lnea 2) llama a la funcin
add(). Un clic en el botn de cancelar
el evento clic cierra el dilogo (Lnea
3). Antes de que el dilogo disparado por
el evento pagebeforeshow (Lnea 6) apa-
rezca, JavaScript introduce los valores
actuales para la latitud y longitud geo-
grficas en los campos de texto. La apli-
HTML5 Offline PORTADA
21
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
01 window.Map = {
02 map: undefined,
03 ipath : img/marker.png,
04
05 init : function() {
06 this.map = new OpenLayers.Map({div:osmap,
zoom:12});
07 this.map.addLayer(new OpenLayers.Layer.OSM());
08 this.marker = new OpenLayers.Layer.Markers();
09 this.map.addLayer(this.marker);
10 var size = new OpenLayers.Size(21,25);
11 var offset = new
OpenLayers.Pixel(-(size.w/2), -size.h);
12 this.icon = new OpenLayers.Icon(this.ipath, size,
offset);
13 },
14
15 addMarker : function(lon, lat) {
16 this.marker.addMarker(new
OpenLayers.Marker(this.coords(lon, lat),
this.icon.clone()));
17 this.map.setCenter(this.coords(lon, lat));
18 },
19
20 coords : function (lon, lat) {
21 return new OpenLayers.LonLat(lon, lat).transform(
22 new OpenLayers.Projection(EPSG:4326),
23 new OpenLayers.Projection(EPSG:900913)
24 );
25 }
26 };
Listado 9: Envoltorio de Objeto para OpenLayers
01 <!DOCTYPE HTML>
02 <html manifest=geotrack.appcache>
03 <head>
04 <meta charset=UTF-8/>
05 <title>Geo Tracker</title>
06 <link rel=stylesheet
href=css/jquery.mobile-1.1.0.min.css/>
07 <script src=js/jquery-1.7.1.min.js></script>
08 <script
src=js/jquery.mobile-1.1.0.min.js></script>
09 <script src=listing-9.js></script>
10 </head>
11 <body data-theme=c>
12 <div data-role=page id=overview>
13 <div data-role=header>
14 <h1>Geotracker</h1>
15 </div>
16 <div data-role=content>
17 <a data-role=button data-rel=dialog
href=#addDetail>New Entry</a>
18 <h2>Entries</h2>
19 <div id=listcontainer>
20 <ul id=list data-role=listview></ul>
21 </div>
22 </div>
23 </div>
24 </body>
25 </html>
Listado 10: Atributos datos jQuery Mobile
apache2/ sites-available/ offline y enla-
zarse con /etc/ apache2/ sites-enabled.
Antes de reiniciar el servidor Apache con
apache2ctl restart, debe cambiarse la
configuracin predeterminada del Puerto
:80 a :8080, por ejemplo.
La siguiente consulta HTTP crea una
base de datos vaca denominada geos:
curl -X PUT U
http://localhost/couchdb/geos
El Listado 14 muestra la sincronizacin
de la cach sin conexin con la base de
datos CouchDB. El mtodo toSync() de la
Lnea 4 serializa el objeto con stringify
para un documento JSON y lo enva por
HTTP PUT a la base de datos geos. La
clave del docu-
mento se aade al
final del URL de
acuerdo con la API
de REST. El tipo de contenido de la con-
sulta HTTP es application/ json. Con la
cach de la aplicacin y el almacena-
miento de datos para los datos de la apli-
cacin (Almacenamiento Local, Web
SQL e Indexed DB), HTML5 incluye todo
lo necesario para que una aplicacin
pueda funcionar en modo desconexin
de manera que las aplicaciones estn
siempre disponibles y no se vean influi-
das por las interrupciones de la conexin
de red.
Conclusin
jQuery y HTML5 nos ayudan a evitar un
alto coste de desarrollo con aplicaciones
diferentes para las distintas plataformas.
Esta breve mirada a cmo construir una
aplicacin web capaz de funcionar sin
conexin debera ser suficiente para
empezar con las nuevas caractersticas
del modo sin conexin de HTML5.
cacin de ejemplo transfiere los datos
recogidos a la base de datos CouchDB.
Datos En Lnea
CouchDB [14] es una base de datos
NoSQL que almacena documentos en
formato JSON con relacin a una clave.
La base de datos CouchDB incluye una
API REST y se puede gestionar fcil-
mente con jQuery. Despus de la instala-
cin, el servidor CouchDB corre bajo el
puerto 5984. Un proxy inverso integra
CouchDB en el dominio de la aplicacin
web. El Listado 13 muestra la
configuracin de un servidor web Apa-
che para este fin.
La definicin del proxy est en la lnea
4. Este campo debe guardarse en /etc/
PORTADA HTML5 Offline
24
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
01 <VirtualHost *:80>
02 DocumentRoot /home/pa/www
03
04 ProxyPass /couchdb http://localhost:5984
05 ProxyPassReverse /couchdb http://localhost:5984
06 </VirtualHost>
Listado 13: Proxy para CouchDB
01 $(#addDetail).live(pageinit, function() {
02 $(#detail).submit(function() { return add();});
03 $(#addCancel).click(close);
04 });
05
06 $(#addDetail).live(pagebeforeshow, function()
{
07 $(#latitude).val(Geolocation.latitude);
08 $(#longitude).val(Geolocation.longitude);
09 });
Listado 12: Eventos
01 window.Sync = {
02 syncurl : /couchdb/geos,
03
04 toSync : function(obj) {
05 $.ajax({
06 url : Sync.syncurl+/+obj.key,
07 contentType : appcliation/json,
08 type : PUT,
09 data : JSON.stringify(obj)
10 });
11 }
12 };
Listado 14: Sincronizacin con la Base de
Datos
01 <div data-role=page id=addDetail>
02 <div data-role=content>
03 <form id=detail>
04 <div data-role=fieldcontain>
05 <label for=lat>Key</label>
06 <input type=text name=key id=key>
07 <label for=lat>Latitude</label>
08 <input type=text name=lat id=latitude>
09 <label for=long>Longitude</label>
10 <input type=text name=long id=longitude>
11 <fieldset class=ui-grid-a>
12 <div class=ui-block-a>
13 <input id=addCancel data-rel=back
type=button value=Cancel/>
14 </div>
15 <div class=ui-block-b>
16 <input data-rel=back type=submit
value=Save/>
17 </div>
18 </fieldset>
19 </div>
20 </form>
21 </div>
Listado 11: Dilogo con jQuery Mobile
[1] HTML5:
http:// www. whatwg. org/ specs/ web-apps/ current-work/
multipage/ index. html
[2] Instalacin de demostracin de los autores (en alemn):
http:// pamoller. com/ geotrack/ index. html
[3] Cach de la Aplicacin:
http:// www. whatwg. org/ specs/ web-apps/ current-work/
multipage/ offline. html#offline
[4] Almacenamiento Web: http:// www. w3. org/ TR/ webstorage/
[5] Web SQL: http:// www. w3. org/ TR/ webdatabase/
[6] Indexed DB: http:// www. w3. org/ TR/ IndexedDB/
[7] API de Geolocalizacin:
http:// www. w3. org/ TR/ geolocation-API/
[8] Geolocalizacin en Firefox:
http:// www. mozilla. org/ en-US/ firefox/ geolocation/
[9] Geolocalizacin Shim: https:// gist. github. com/ 366184
[10] OpenLayers: http:// openlayers. org
[11] jQuery Mobile: http:// jquerymobile. com
[12] Atributos de datos personalizados:
http:// www. whatwg. org/ specs/ web-apps/ current-work/
multipage/ elements. html#custom-data-attribute
[13] ThemeRoller: http:// jquerymobile. com/ themeroller
[14] CouchDB: http:// couchdb. apache. org
[15] Listados de este artculo:
http:// www. linux-magazine. es/ Magazine/Downloads/ 90
RECURSOS
Herramientas HTML5 PORTADA
25
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
nuevas funcionalidades, HTML5 Rocks es
un buen lugar para comenzar.
Google comenz con HTML5 Rocks en
2010 como una forma de ayudar a los desa -
rrolladores y a los diseadores web con
demos, ejemplos de cdigo e instrucciones
paso a paso para casi todas las funciones de
HTML5 (Figura 1). Los ejemplos de cdigo
y demos cubren los modos offline, la geolo-
calizacin, las etiquetas para audio y vdeo,
as como el elemento <canvas>y el alma-
cenamiento de ficheros.
HTML5 Rocks tambin incluye una serie
de presentaciones interactivas que propor-
cionan un resumen exhaustivo de las posi-
bilidades de HTML5. Adems, podemos
encontrar una zona de pruebas de cdigo
donde se puede experimentar con HTML5,
incluyendo las nuevas API y propiedades
CSS3, en un entorno seguro sin que corra
peligro nuestro propio sistema.
Tambin vale la pena visitar el sitio web
oficial del Consorcio W3C [2]. El sitio
W3C contiene muchos enlaces a recursos
tiles, as como a tutoriales. El sitio web
tambin proporciona validadores para
HTML y CSS, que los desarrolladores web
pueden utilizar para comprobar la confor-
midad de su cdigo con el estndar [3].
Tambin son de gran ayuda las hojas de
resumen (cheats-
heet) que ofrece la
W3C [4], con refe-
rencia para todos
los elementos
HTML5, CSS3 y los
comandos XSLT.
G
racias a HTML5 y CSS3, muchos
sitios web cuentan ahora con fun-
cionalidades que anteriormente
eran simplemente imposibles incluso con
Java. Y HTML5 no slo mejora la aparien-
cia de los sitios web en los PC de escritorio,
tambin ayuda a que se desarrollen de
forma eficiente las aplicaciones web para
dispositivos mviles. Slo por estas razo-
nes, HTML5 dominar sin lugar a dudas el
futuro de las aplicaciones web. Gracias a
HTML5, los navegadores web ya no necesi-
tarn ms complementos adicionales para
poder reproducir vdeo o audio desde las
sitios web.
HTML5 y CSS3 abren completamente un
abanico de nuevas posibilidades para los
desarrolladores, como la programacin de
hilos con workers para la web, acceso
directo a los sistemas de ficheros con
<localStorage>, un modo offline sofisti-
cado, grficos en dos dimensiones con el
elemento <canvas> y animaciones con
CSS3.
Ya se encuentran disponibles diversas
herramientas profesionales y libres que nos
ayudarn a comenzar a programar en la
web con HTML5.
Recursos en la web para
HTML5
Actualmente, el recurso ms popular para
HTML5 es sin duda HTML5 Rocks [1] de
Google. Si queremos familiarizarnos con
las posibilidades del estndar HTML5 o si,
simplemente, queremos saber como nues-
tro proyecto web se puede beneficiar de las
La Developer Network de Mozilla [5]
proporciona sus propios recursos HTML5,
incluyendo ejemplos de cdigo y referen-
cias. Mozilla se centra en HTML5 haciendo
que la diferencia entre aplicaciones nativas
y aplicaciones web sea cada vez ms
difusa.
Maqetta
Con el editor web, basado en la web, de
cdigo abierto Maqetta [6] podemos, en un
abrir y cerrar de ojos, crear interfaces de
usuario tanto para aplicaciones mviles
como de escritorio usando HTML5, CSS3 y
Ajax.
Maqetta, que ha sido desarrollada por
IBM, intenta eliminar las desventajas de los
entornos Ajax en comparacin con las tec-
nologas propietarias como Flash o Siver-
light. IBM deleg el proyecto Maqetta a la
Dojo Foundation, con una licencia de
cdigo abierto, a principios de este ao. (La
Dojo Foundation es una fundacin sin
nimo de lucro conocida tambin por su
framework Dojo Toolkit JavaScript [7]).
La versin actual de Maqetta 6.0.1
puede descargarse como un archivo ZIP
desde el sitio web [8] e instalarla posterior-
mente en un servidor web local. Tras des-
comprimir el archivo ZIP, lo nico que hay
HTML5 est de moda y Google no es el nico que piensa de esta forma. Podemos encontrar muchos recur-
sos, frameworks y utilidades que nos ayudarn a empezar con el nuevo estndar. POR THOMAS DRILLING
Herramientas y recursos para desarrolladores de HTML5
Caja de Herramientas
d
o
n
a
t
a
s

1
2
0
5

-

1
2
3
R
F
.
c
o
m
Aunque Google recomienda el uso de su propio navegador,
Chrome, para poder experimentar con todas las funciones de
HTML5, la mayora de los navegadores web soportan HTML5.
Con la notable excepcin de Internet Explorer de Microsoft.
Consejo
probadas, tales como la librera YUI de
Yahoo o la jQuery UI (Figura 3).
Maqetta tambin nos ayuda en el
desarrollo de aplicaciones para mviles con
sus siluetas, es decir, plantillas para disposi-
tivos como el iPhone, de modo que poda-
mos crear las pantallas con el tamao
exacto para el dispositivo en cuestin
(Figura 4).
Tambin se pueden crear diseos perso-
nalizados con la vista del cdigo fuente.
Incluso es posible trabajar con ambas al
mismo tiempo. Ms all de esto, Maqetta
tambin soporta el trabajo en equipo de
diversas maneras, como revisiones, evalua-
ciones y funciones para realizar comenta-
rios.
HTML5 Boilerplate
Si slo acaba de comenzar su aventura con
HTML5, debera echarle un vistazo a la uti-
lidad de cdigo abierto HTML5 Boilerplate
[9]. Boilerplate es una plantilla profesional
de HTML/ CSS/ JS que sirve como punto de
partida para los proyectos de HTML5.
Fue desarrollada por Paul Irish, uno de
los ingenieros de desarrollo del equipo de
Google Chrome y actualmente se encuentra
disponible para su descarga la versin 3.0
del proyecto en el sitio web, as como en
GitHub [10], donde puede encontrarse una
versin documentada excelente.
Gracias a la normalizacin entre navega-
dores, a la optimizacin de rendimiento
interna y a muchas otras funciones, tales
El editor WYSIWYG nos ayudar a crear
las interfaces de los sitios o aplicaciones
web (Figura 2). Maqetta hace posible la cre-
acin de pantallas atractivas con multitud
de elementos que simplemente se pueden
aadir con la tnica de arrastrar y soltar.
Al contrario que
con otras solucio-
nes, Maqetta no
est vincula a una
nica y especfica
librera UI. En la
versin actual, se
puede fcilmente
tambin integrar
con otras soluciones
que hacer es ejecutar ./maqetta.server.
unix.sh y maqetta. local. unix.sh. A conti-
nuacin, la herramienta se encontrar dis-
ponible en http:// Server_Name:50000/
maqetta o en http:// 127. 0. 0. 1:50000/
maqetta.
PORTADA Herramientas HTML5
26
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Figura 1: En el sitio web de Google HTML5 Rocks, los programadores y los diseadores web
pueden experimentar con las nuevas funciones de HTML.
Figura 2: El potente editor web Maqetta fue desarrollado original-
mente por IBM.
Figura 4: En Maqetta, las plantillas ayudan a producir diseos con el
tamao exacto de la pantalla del dispositivo final.
Figura 3: Maqetta puede integrar otras libreras grficas si fuera
necesario.
como las peticiones Ajax entre dominios,
Boilerplate simplifica el trabajo con muchas
funciones HTML5. Entre otras cosas, el
paquete incluye un fichero de
configuracin .htaccess que es bastante til
para los novatos (Figura 5). Proporciona
tambin tiles preconfiguraciones, como
una serie de reglas de cach estndar o
configuraciones para la reproduccin efi-
ciente de vdeo con HTML5. Adems,
HTML5 Boilerplate soporta el uso sencillo
de fuentes @font-face, as como la compre-
sin de los recursos utilizados en el sitio
web para su envo.
Modernizr
Adems de Boilerplate, Paul Irish ha desa -
rrollado Modernizr [11], junto con Faruk
Ates. Modernizr es una librera de cdigo
abierto para JavaScript que es bastante
popular entre los diseadores web ya que
ayuda a evitar los errores con los navegado-
res antiguos a la hora de visualizar los sitios
web con HTML5 y CSS3.
Segn su documentacin, Modernizr
reconoce si el navegador soporta o no
HTML5 y, si fuera necesario, reemplaza las
funciones que no existan con cdigo HTML
normal. De modo que se obtiene cierta
compatibilidad hacia atrs. El valor del sis-
tema completo reside en el hecho de que
los desarrolladores pueden estar familiari-
zados con HTML5 sin tener que preocu-
parse si los navegadores de los usuarios
son o no compatibles con HTML5. La libre-
ra soporta <video> y @font-face, entre
otras funciones.
SproutCore
Otro framework bastante popular de
cdigo abierto para HTML5 para el
desarrollo de aplicaciones web es Sprout-
Core [12]. Con la ayuda de este framework
libre para HTML5, podemos programar
aplicaciones web que, junto con los nave-
gadores compatibles con HTML5, pueden
competir fcilmente con las aplicaciones
de escritorio sin necesidad de que el
usuario tenga que instalar ningn comple-
mento.
SproutCore viene de Strobe Inc., que fue
fundada por Charles Jolley, antiguo emple-
ado de Apple. Desde 2011, el framework
SproutCore se encuentra disponible bajo
licencia de cdigo abierto (Licencia MIT).
El framework fue concebido originaria-
mente como una fundacin para el servicio
de Apple MobileMe y es bastante popular
entre los programadores gracias a su robus-
tez y velocidad. Adems, el sistema se
escala bien.
Tcnicamente, el framework difiere de
otras soluciones, ya que SproutCore imple-
menta la lgica de negocio completa en
JavaScript y por ello, es completamente
una solucin del lado del cliente, con lo
que se reduce substancialmente los tiem-
pos de reaccin de la aplicacin web, ya
que la transferencia de datos entre el nave-
gador y el servidor se reducen al mnimo.
SproutCore por s mimo, sin embargo, est
implementado en Ruby, algo que no nos
afecta en absoluto como programadores de
interfaces web en absoluto: con Sprout-
Core, como con otras plataformas web,
podemos programar en HTML5, JavaScript
y CSS3.
Para poder utilizar SproutCore 1.9.2 bajo
Linux, hace falta tener Ruby 1.9.2, aunque
la mayora de las distribuciones slo inclu-
yen Ruby 1.8.2. Afortunadamente, Ruby
posee Gems, su propio gestor de paquetes,
que permite fcilmente controlar la instala-
cin o desinstalacin de mltiples versio-
nes del programa o de las libreras. Ade-
ms, se pueden utilizar mltiples imple-
mentaciones de Ruby y versiones de Gems
simultneamente con la ayuda de RVM, el
Gestor de Versiones de Ruby. Se puede ins-
talar RVM directamente de GitHub o utili-
zar el rvm-installer (Listado 1, lneas 1 a 3).
As pues, sera buena idea extender la
variable PATH del sistema con Ruby aa-
diendo la siguiente lnea en el fichero
~/.bash_profile:
[[ -s $HOME/.rvm/U
scripts/rvm]] && U
source $HOME/.rvm/U
scripts/rvm
Ahora ya podremos instalar la versin 1.9.2
de Ruby por medio de RVM sin ningn pro-
blema (Listado 1, lneas 4 a 6).
Los usuarios de Ubuntu tambin pueden
probar SproutCore 1.8.2 con relativo poco
esfuerzo, simplemente instalando ruby-rvm
y (si no est ya instalado) el paquete
build-essential. Luego podemos instalar
SproutCore 1.8.2 con gem install sproutcore
(Figura 6).
El servidor SproutCore, que se ejecuta
con sproutcore server, usa el puerto 4020
por defecto. Con la Getting Started Guide
podremos aprender cmo preparar nuestro
primer proyecto.
Sencha Touch
Uno de los frameworks ms conocidos para
crear aplicaciones multiplataformas para
smartphones es Sencha Touch [13], que
est basado enteramente en HTML5 y
CSS3. Sencha Touch se distingue por s
mismo como sugiere su nombre por su
facilidad a la hora de gestionar los eventos
producidos por toques e incluye una libre-
ra UI bastante completa. Sencha Touch usa
CSS3 exclusivamente para el diseo grfico
de la interfaz de usuario y se priva de usar
imgenes (aparte de los iconos). Ms all
de esto, Sencha Touch tambin utiliza un
gran nmero de funciones de HTML5.
Oficialmente soporta las plataformas
mviles Android, iOS y Blackberry 6, pero
segn el fabricante, debera funcionar con
cualquier navegador mvil que soporte
HTML5. La versin actual es la 2.0.2.2 de la
Herramientas HTML5 PORTADA
27
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Figura 5: Una caracterstica a resaltar de HTML5 Boilerplate es la inclusin de un fichero
.htaccess.
facilita el desarrollo de
aplicaciones mviles
basadas en HTML5 que
pueden traducirse nativa-
mente. Jo es software
libre y se encuentra en
GitHub [16] bajo licencia
OpenBSD.
Hay Mucho Ms
Los desarrolladores que
deseen comenzar a integrar datos multime-
dias con la ayuda de las funciones <video>
y <audio> de HTML5 y sin tener que
preocuparse de los navegadores que los
usuarios utilicen pueden utilizar MediaEle-
mentPlayer [17] (Figura 7). MediaElement-
Player, que viene con una librera JavaScript
de cdigo abierto, proporciona un reproduc-
tor de vdeo universal con la ayuda del fra-
mework popular Jquery [18]. Mientras se
carga la pgina, un script comprueba si el
navegador soporta HTML5 si no es as,
automticamente reemplaza las etiquetas
<video> por un
componente Flash o
Silverlight.
Aptana Stuido [19] de Appcelerator es
una herramienta de desarrollo web muy
potente. La tima versin, 3.0, soporta
todas las tecnologas web actuales relevan-
tes, entre las que se incluye HTML5, CSS3,
JavaScript, Ruby, Rails, PHP y Python. Ade-
ms de sus validadores propios, Aptana
Studio tambin incluye diversos emulado-
res de navegadores, pero slo es gratuito
para uso no comercial.
Conclusiones
HTML5 ofrece muchos beneficios, entre
los que se incluye la reproduccin de con-
tenidos multimedia, dejando obsoletos el
uso de componentes adicionales siempre
que simplemente se integren contenidos
multimedia en el navegador por medio de
las etiquetas HTML5 <video> y
<audio>. Si HTML5 se vuelve tan popu-
lar como se espera, Flash y Silverlight
pronto se volvern superfluas. Pero
HTML5 puede hacer mucho ms que el
mero reemplazo de componentes extras.
Espero que este resumen de las herramien-
tas disponibles eleven vuestro inters por
la Web 3.0.
Free Commercial Version que se puede
descargar gratuitamente.
Jo Framework
Uno de los frameworks menos conocidos
para HTML5 es Jo [14] que soporta
Android, Blackberry, ChromeOS, iOS y pla-
taformas WebOS. Como Sencha Touch, Jo
tambin est pensado principalmente para
el desarrollo de aplicaciones mviles e
incluye una librera UI, as como animacio-
nes CSS3 fciles de implementar. Junto con
la aplicacin PhoneGap [15], Jo tambin
PORTADA Herramientas HTML5
28
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Figura 6: Pueden tenerse instaladas mltiples versiones de Ruby y
utilizarse simultneamente con RVM y Gems.
Figura 7: MediaElementPlayer hace posible la visualizacin de aplica-
ciones HTML5 con etiquetas de vdeo incluso con navegadores anti-
guos.
01 $ curl -s
https://rvm.beginrescueend.com/install/rvm -o
rvm-installer
02 $ chmod +x rvm-installer
03 $ ./rvm-installer --version latest
04 $ rvm install ruby-1.9.2
05 $ rvm use 1.9.2
06 $ rvm --default use 1.9.2
Listado 1: Instalando RVM
[1] HTML5 rocks: http:// www. html5rocks. com/ en/
[2] Consorcio W3C: http:// www. w3. org
[3] Validador W3C: http:// validator. w3. org
[4] Hojas de ayuda W3C: http:// www. w3. org/ 2009/ cheatsheet
[5] Mozilla Developer Network: https:// developer. mozilla. org/
[6] Fundacin Dojo Maqetta:
http:// dojofoundation. org/ projects/ maqetta
[7] Kit de herramientas Dojo:
http:// dojofoundation. org/ projects/ dojo
[8] Descarga de Maqetta: http:// maqetta. org/ downloads/
[9] HTML5 Boilerplate: http:// html5boilerplate. com/
[10] HTML5 Boilerplate (GitHub):
https:// github. com/ paulirish/ html5-boilerplate
[11] Modernizr: http:// www. modernizr. com
[12] SproutCore: http:// www. sproutcore. com
[13] Sencha Touch: http:// www. sencha. com/ products/ touch/
[14] Framework de aplicaciones Jo HTML5: http:// joapp. com
[15] PhoneGap: http:// phonegap. com
[16] Jo (GitHub): http:// github. com/ davebalmer/ jo
[17] MediaElementPlayer: http:// mediaelementjs. com
[18] jQuery: http:// jquery. com
[19] Aptana Studio: http:// www. aptana. com
RECURSOS
Seguridad PHP PORTADA
29
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
como muy tarde, el proyecto debera
especificar los estndar de codificacin
para que las pruebas y revisiones de
cdigo hablen el mismo idioma.
Los ingenieros saben que la calidad se
consigue con procesos en la produccin
y no una vez que el producto ha sido
lanzado. OpenBSD es un ejemplo posi-
tivo de construccin de calidad en el pro-
ceso. Muchos consideran la versin
OpenBSD de Unix el sistema operativo
ms seguro, gracias a los estndares de
calidad y pruebas. Desde el principio,
todos los desarrolladores implicados en
el proyecto han tenido en cuenta el
cdigo seguro y libre de errores. Adems
de proporcionar educacin continua pro-
fesional, el equipo de OpenBSD man-
tiene una coleccin de rutinas para los
casos estndar. Estas rutinas implican
que los desarrolladores no tienen que
reinventar la rueda y cometer los mis-
mos errores que ya han sido corregidos.
1. No reinventar nada
Los nuevos programas no funcionan tan
bien como los proyectos que ya han sido
probados en la prctica. Muchos desa -
rrolladores escriben sus propias rutinas
para la gestin de sesin y validacin de
la autentificacin, dejando a menudo
las puertas abiertas de par en par para
fallos en la sesin de navegacin o
inyecciones de SQL (Figuras 1 y 2).
H
oy en da, los ataques en siste-
mas web difcilmente seleccio-
nan las debilidades de los proto-
colos de red, si no los fallos en las apli-
caciones. Varias de las brechas de segu-
ridad ms espectaculares en los ltimos
aos, como la que ocurri con Sony
PlayStation Network, se aprovecharon
de los errores de programacin de las
aplicaciones web. Los defectos no son
especialmente exticos, pudiendo ser
agrupados en unas pocas categoras. Por
ejemplo, el hack a Sony ocurri por una
inyeccin de SQL.
Los sistemas operativos modernos
proporcionan medidas de proteccin
elaboradas ante vulnerabilidades, como
la seleccin aleatoria en el espacio de
direcciones, pero los atacantes ms lis-
tos pueden evitar esas protecciones con
varios trucos. La nica solucin real es
desarrollar aplicaciones web sin brechas
de seguridad. Por lo tanto, evitar siste-
mticamente defectos en la programa-
cin es el objetivo de cualquier gestin
de calidad profesional del software.
La programacin segura comienza
mucho antes de que la primera lnea de
cdigo sea escrita. En la fase de diseo,
los desarrolladores deberan considerar
qu temas de seguridad podran apare-
cer, qu requisitos de seguridad son
necesarios y bajo qu condiciones el
software ser utilizado. Para entonces,
2. Revisar el Cdigo
Dos medidas muy simples de proteccin
ante intrusiones y que inspiran mejores
prcticas son: por un lado, acordar den-
tro del proyecto quin o quines sern
responsables de ciertas rutinas y ciertas
libreras y por otro, que cada desarrolla-
dor audite el cdigo de los dems, lo
que hace que mejore la calidad. Los
acuerdos reducen la probabilidad de
invenciones redundantes debido a que
una persona frecuentemente tendr una
solucin para un problema estndar.
Al mismo tiempo, estos acuerdos tam-
bin suelen llevar a un segundo efecto
en el aseguramiento de la calidad. Un
desarrollador que tiene que explicar su
cdigo a otro lo documentar mejor y
ser ms minucioso. Adems, los resul-
tados de las presentaciones de cdigo
pueden ser utilizadas directamente para
la documentacin un tema que a
menudo se descuida.
Este tipo de consultas estn lejos de
ser las revisiones de cdigo sistemti-
cas, en las que un segundo desarrolla-
dor o incluso todo el equipo examina la
programacin de un compaero lnea
por lnea. Este tipo de pruebas consu-
men demasiado tiempo, pero promete
suponiendo que tenemos a un buen
equipo un alto grado de probabilidad
de encontrar errores. OpenBSD invierte
en este esfuerzo.
Muchos ataques en la web son resultados de errores de pro-
gramacin. El cdigo descuidado deja una puerta abierta para
los no invitados. POR TOBIAS EGGENDORFER
Siete principios para prevenir
vulnerabilidades en la programacin en PHP
Invitando al
no invitado
atacante podra descubrir nombres de
bases de datos y tablas desde un men-
saje de depuracin. Un simple remedio
contra los mensajes de depuracin olvi-
dados es utilizar una palabra clave de
prefijo, que har ms fcil descubrir
mensajes. Como alternativa, los desarro-
lladores pueden integrar una funcin
especial de depuracin en sus sistemas
con include, dejando en blanco la panta-
lla en sistemas en produccin.
Como los mensajes de depuracin, los
mensajes de errores que encuentran su
camino en el mundo exterior pueden
ayudar a los atacantes. Adems de reve-
lar problemas de seguridad a los intru-
sos, los mensajes tcnicos confunden a
los usuarios, algo que tiene un efecto
negativo en la usabilidad. Entradas de
registro detalladas o envos automticos
de correos al administrador son mejores
soluciones. La buena documentacin,
que es un prerrequisito para las pruebas
de software, incluye crear una lista de
los posibles mensajes de error y de deci-
siones sobre en qu condiciones los
recibir la aplicacin web.
6. Construir un Escenario
de Pruebas
Los escenarios de pruebas son combina-
ciones de condiciones iniciales especfi-
cas, diseadas para un comportamiento
ilcito previsible que el programa debe-
ra mostrar. Este tipo de escenario para
suceder fcilmente en sistemas de bases
de datos como MySQL que utilizan tipos
de datos como tinyint.
Cuando se ejecuta un anlisis de flujo
de datos, los desarrolladores deben estar
atentos a todos los clculos y manipula-
ciones de los datos de entrada relaciona-
dos con los lmites.
4. Configurar Sistemas de
Pruebas Adecuadamente
En el curso de anlisis de flujo de datos,
aparecen despistes en la codificacin de
las URL o en el escape doble de senten-
cias de SQL. Escapes mltiples tambin
pueden surgir a travs de la falta de
atencin cuando, en nuestro propio
entorno de pruebas, PHP se ejecuta con
magic quotes desactivadas y luego estn
activadas en el entorno de produccin.
El entorno de pruebas y el de produc-
cin deberan ejecutarse con las mismas
versiones y ficheros de configuracin.
Una tarea de cron que ejecute un simple
diff (comparacin) mediante una cone-
xin por SSH puede asegurarse de que
las configuraciones son consistentes.
5. Recordar la depuracin y
los mensajes de error
Hay problemas de seguridad que salen a
menudo por olvidar los mensajes de la
depuracin. Mientras ms detallados
sean los mensajes, de mayor utilidad
sern para los atacantes. Por ejemplo, un
Las revisiones intensivas no slo dan
como resultado el descubrir problemas
de seguridad, tambin ayudan a los
desa rrolladores a aumentar el descubri-
miento de errores de programacin crti-
cos y adems, pueden llegar a mejorar
la documentacin.
3. Analizar datos de
entrada y flujos de datos
Un anlisis de flujo de datos es un fra-
mework para la revisin de cdigo que
ayuda en la bsqueda de lagunas de
seguridad. Por cada pieza de datos que
es introducida, es importante investigar
cundo y cmo podra influir en otros
procesos. Esto se hace fcilmente en for-
mularios simples de envo de correos,
pero consumen mucho tiempo en apli-
caciones de bases de datos. La experien-
cia muestra que un anlisis de flujo de
datos es la mejor manera de localizar
problemas que pueden llevar a cross-
site scripting, inyecciones de cdigo y
puntos similares de ataque.
En este tipo de anlisis de flujo de
datos, los valores extremos son siempre
de inters. Por ejemplo, cuando una
variable de tipo entero excede
PHP_INT_MAX, PHP automticamente
ejecuta un cambio de tipo a decimal.
Esto puede tener efectos sorpresa como
que el valor encuentre su camino en un
campo de base de datos de tipo entero.
Desbordamientos de enteros pueden
PORTADA Seguridad PHP
30
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Figura 1: Unas buenas pruebas podran haber descubierto que la pan-
talla de autentificacin del sitio de demostracin Badstore.net per-
mite inyecciones de SQL
Figura 2: por lo tanto, cualquiera puede ver lo que otros clientes
han pedido. Este tipo de problemas tambin ocurren en un escalo-
friante nmero de tiendas reales.
una calculadora podra ser 2 + 2 con la
salida esperada de 4. El escenario a aa-
dir es obvio para el probador y aunque
es fcil de aplicar, quin va a aadir
(231 - 1) + 1 para ver si un entero de
32-bit con signo se desborda?.
Por lo tanto, una prueba organizada
incluye la determinacin de los lmites
del sistema y las pruebas. Como regla,
no es muy efectivo si el mismo desarro-
llador que escribi la aplicacin define
los escenarios de pruebas su familiari-
dad con el cdigo hace probable que no
vea sus propios errores.
Las pruebas deben ser ampliables.
Hay escenarios de pruebas por cada fun-
cin individual, por cada mdulo y por
cada sistema completado. Estas pruebas
deberan cubrir deliberadamente situa-
ciones extremas. Los desarrolladores
deberan, adems, incluir pruebas por
cada error conocido. Si la calculadora
ha ignorado la regla de las multiplicacio-
nes antes de las sumas en el paso
debido a un error en el cdigo, este
error debera estar cubierto por un esce-
nario de pruebas.
Una medicin de la calidad de las
pruebas es la cantidad de cdigo
cubierto. Una cobertura del 100 por cien
sera lo ptimo
pero no siempre es
posible. En la pro-
gramacin orien-
tada a eventos o
con gestores de
excepciones de
errores que son
difciles de provo-
car, algunas partes
del cdigo quedan
virtualmente inalcanzables.
7. Utilizar Programas de
Pruebas
Es esencial utilizar pruebas automatiza-
das adems de pruebas manuales. Para
probar una caracterstica individual,
suele ser suficiente utilizar pruebas
escritas por nosotros que sean familia-
res con varios datos de entrada y que
correspondan con los datos de salida y
que adems, se puedan comparar los
resultados de las pruebas con los resul-
tados reales.
Sin embargo, si el programa que esta-
mos probando es algo ms elaborado,
no ser efectivo escribir nuestros pro-
pios programas de pruebas. Afortunada-
mente, PHP tiene muchos sistemas para
ello como PHPUnit [1], SimpleTest [2] o
TestPlan [3].
Ambos PHPUnit y SimpleTest sirven
para probar las funciones individuales y
las instrucciones de un programa por
ejemplo, cuando los valores de una
variable son vlidos o cuando las funcio-
nes y bloques de funciones devuelven
valores correctos. Por lo tanto, PHPUnit
y SimpleTest slo son adecuados para
entornos de PHP. El manual de PHPUnit
[4] proporciona una buena introduccin
a pruebas automticas los conocimien-
tos son fcilmente trasladables a Simple-
Test, que tiene una documentacin ms
escasa. Ambos son comparables en
cuanto a funcionalidad y conceptos.
Por otro lado, TestPlan comprueba si el
programa devuelve los valores esperados
Seguridad PHP PORTADA
31
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
TestPlan en Prctica
La instalacin de TestPlan es relativamente sencilla y est bien
explicada en su pgina de inicio [3], excepto el cmo establecer la
variable de entorno TESTPLAN_HOME correctamente. Para este
artculo, sera:
export TESTPLAN_HOME=U
~/testplan-1-0-r6/
En el ordenador con Fedora del autor, no fue necesario establecer
JAVA_HOME
La primera prueba sencilla en el Listado 1 comprueba el nmero
de enlaces en la pgina de inicio del autor, as se demuestran
mltiples elementos desde el lenguaje de programacin Tes-
tPlan. Soporta iteraciones, puede contar, extraer cosas desde la
salida de datos e incluso generar la salida por s mismo. De esta
forma, la lnea 5 selecciona los enlaces en la salida %Response%
con el parmetro a, que corresponde a la etiqueta HTML para un
enlace. El parmetro href en la lnea 6 apunta a la URL devuelta
por la lnea 7.
El Listado 2 contiene la simple prueba de contar desde el Listado
1, aunque es ms complejo. Aqu, TestPlan autentifica contra la
cuenta de Facebook del autor y verifica que HTTPS est activado.
Esta comprobacin se ejecuta en dos fases: primero, la funcin
Check se asegura que el texto deseado se encuentra en la pgina.
Si esto es correcto, el script contina ejecutndose. A continua-
cin, lee el mensaje, remueve el HTML y utiliza una expresin
regular para comprobar si enabled est presente. (Sin embargo,
muchas pruebas en el formulario del Listado 2 harn que el script
parezca sospechoso a Facebook, mostrando un CAPTCHA para
autentificarse.)
Si enabled est presente, el script reportar su prueba como que
ha sido pasada (ver Figura 3). De otro modo, el test intentar
automticamente activar HTTPS por s mismo (Figura 4, lnea 6-
00). Debido a que Facebook asigna a cada formulario un ID alea-
torio en cada nuevo acceso, tendremos que emplear un pequeo
truco. El resultado es depositado en la variable local %id. Este es
el caso para el contenido de un campo oculto en la lnea 31. Con
esos valores, podemos tener la direccin del formulario deseado
en la pgina (lnea 33), rellenado correctamente y enviado a Face-
book.
Si queremos probar automticamente si Facebook ha activado
realmente HTTPS algo que es necesario si la prueba tiene que
continuar, debemos escribir otra pequea prueba para ver si
Facebook ha cerrado la sesin al usuario otra vez. Dependiendo
del resultado, el script debera autenticarse otra vez si es necesa-
rio y a continuacin, ejecutar otra vez la prueba. El lenguaje de
TestPlan incluye la posibilidad de llamar a mdulos externos, as
que es suficiente con implementar la prueba de HTTPS una vez
nuestro propio script llamar entonces al mdulo en varios sitios.
Este acercamiento simplifica el mantenimiento de la prueba.
Fundamentalmente, el lenguaje propio de TestPlan es potente y
fcil de aprender, pero est escasamente documentado. Se nece-
sita experimentar un poco. Merece la pena utilizar TestPlan
debido a su flexibilidad y no slo para nuestras propias aplica-
ciones web, sino tambin para pequeos (y por supuesto, lega-
les) ataques.
01 default %Cmds.Site% http://www.eggendorfer.info/
02 GotoURL %Cmds.Site%
03
04 set %Count% 1
05 foreach %Link% in %Response://a%
06 Notice %Count% Enlace: %Link% %URL%
07 set %Count% as binOp %Count% + 1
08 end
Listado 1: Contar Enlaces
debe ser transmi-
tido a las pruebas,
algo que reducir la
probabilidad de
error.
Merece la pena todo esto?
Desafortunadamente, las pruebas siste-
mticas en las aplicaciones web no
estn todava muy expandidas. La pre-
sin del coste y tiempo son las razones
ms comunes para la falta de atencin
para las pruebas. Esto es extrao,
debido a que tan pronto como un ata-
cante toma el control de nuestro sitio
web, nadie piensa en el tiempo y los pre-
supuestos. Incluso aquellos que no quie-
ren incluir la prdida de ingresos y de
reputacin en la ecuacin deben tener
en cuenta que, una vez que los procesos
adecuados estn establecidos, los gastos
generales para el mantenimiento de
estos procesos son bastante ms mane-
jables. El conocimiento ganado de las
pruebas sistemticas ayuda a prevenir a
que sucedan otra vez los mismos errores
y la calidad de los trabajos en el futuro
se mejora.
con una entrada de datos especficos. Es
decir, comprueba la repuesta de ciertos
datos de entrada. Para este propsito,
TestPlan tiene su propio lenguaje de pro-
gramacin que est optimizado para eje-
cutar iteraciones bsicas en pginas web,
como introducir datos en formularios o
hacer clic en enlaces. El programador
puede buscar en la salida las palabras o
cadenas de caracteres. De esta forma, los
programadores pueden comprobar fcil-
mente si la aplicacin funciona desde la
perspectiva del usuario. Si selecciona-
mos los datos de entrada con precisin,
podemos incluso descubrir situaciones
crticas (ver el recuadro titulado Test -
Plan en Prctica).
Debe estar claro en la mente del desa -
rrollador en qu condiciones se debe eje-
cutar el programa correctamente, dnde
estn los lmites y qu datos de entrada
no se van a tolerar. Este conocimiento
PORTADA Seguridad PHP
32
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
01 default %Cmds.Site% https://www.facebook.com
02 GotoURL %Cmds.Site%
03
04 SubmitForm with
05 %Form% id:login_form
06 %Params:email% someone@somewhere.com
07 %Params:pass% somesecurepassword
08 %Submit% key:enter
09 end
10
11 set %Count% 1
12 foreach %Link% in %Response://a%
13 set %URL% as selectIn %Link% @href
14 set %Count% as binOp %Count% + 1
15 end
16
17 Notice %Count% Links on Facebook homepage.
18 GotoURL
https://www.facebook.com/settings?tab=security
19
20 Notice Check if HTTPS is enabled.
21 Check //span[contains(text(),Secure browsing is
currently)]
22 set %all% %Response://span[contains(text(),Secure
browsing is currently)]%
23 if strMatches %all% ^(Secure browsing is currently).*
(enabled)\.$
24 Pass HTTPS enabled
25 else
26 Notice HTTPS disabled
27 Notice Try to enable HTTPS.
28 Notice Subsequently start test again.
29 GotoURL
https://www.facebook.com/settings?tab=security&sec
tion=browsing&view
30 set %id%
%Response://form[@action=/ajax/settings/security/
browsing.php]/@id%
31 set %fb_dtsg%
%Response://form[@action=/ajax/settings/security/
browsing.php]/input[@name=fb_dtsg]/@value%
32 SubmitForm with
33 %Form% id:%id%
34 %Params:secure_browsing% 1
35 %Params:fb_dtsg% %fb_dtsg%
36 %Submit% value:Save changes
37 end
38 Notice Test HTTPS again
39 Fail HTTPS
40 end
Listado 2: Probar Facebook
Figura 3: El programa de pruebas especificado en el Listado 2 se
autentifica en Facebook, cuenta los enlaces y confirma que HTTPS
est activado.
Figura 4: La ejecucin de esta prueba revela que HTTPS no est acti-
vado. El programa intenta entonces cambiar el protocolo por s
mismo.
[1] PHPUnit:
https:// github. com/
sebastianbergmann/ phpunit/
[2] SimpleTest: http:// simpletest. org
[3] TestPlan: http:// testplan. brainbrain. net
[4] Manual PHPUnit:
http:// www. phpunit. de/ manual/ 3. 6/ en/
index. html
RECURSOS
3D con Three.js PORTADA
33
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
los intentos anteriores como VRML,
applets de Java con Java-3D/ JOGL o 3D-
Flash slo haban conseguido una
audiencia limitada debido al bajo rendi-
miento o la necesidad de instalar visores
especiales y bibliotecas Java. Gracias al
amplio soporte del que disfruta WebGL
M
s all de la palabra de moda
HTML5, un paquete com-
pleto de nuevas tecnologas ha
encontrado su entrada en los navegado-
res de nuestros ordenadores y dispositi-
vos mviles [1]. Entre ellas hay una que
abre las puertas del mundo 3D: WebGL.
La biblioteca Web Graphics Library [2] es
una interfaz JavaScript para la biblioteca
Open GL 3D. Con ella, las pginas nor-
males de HTML pueden incluir conte-
nido tridimensional que corre en tarjetas
grficas con aceleracin hardware.
WebGL est ya implementado en los
navegadores de escritorio Mozilla Firefox
(desde la versin 4), Opera (desde la ver-
sin 12) y Google Chrome (desde la ver-
sin 9). Dado que Khronos Group usa
OpenGL para los Sistemas Empotrados
(OpenGL ES) como la fundacin, tam-
bin se puede usar bajo Android con
Firefox para mvil y Opera Mobile.
Si bien la idea de proporcionar aplica-
ciones 3D a la web no es nueva, todos
en navegadores, ahora por primera vez
los desarrolladores pueden esperar un
gran grupo de usuarios.
Compatibilidad Hardware
La manera ms sencilla de comprobar el
estado de nuestro ordenador es con esta
HTML5 permite el 3D en los navegadores. Gracias a WebGL, Firefox, Chrome y compaa, podemos mostrar
mundos en tres dimensiones sin complementos o visores especiales y la biblioteca de Java Script Three.js
facilita el trabajo de programacin. POR JOHANNES RAIDA, CARSTEN ZERBST
Escenas 3D en navegadores web con Three.js
Perspectiva en 3D
Figura 1: La configuracin de WebGL en Firefox se encuentra en about:config.
S
O
R
A
P
O
N
G

C
H
A
I
P
A
N
Y
A

-
1
2
3
R
F
.
c
o
m
definir la escena 3D representada por el
objeto Three.Scene. Esto sirve como un
nodo padre para la geometra que se va a
representar, as como para la cmara y
las luces.
Luces, Cmara, Accin!
En primer lugar el cdigo establece la
cmara (desde la lnea 67). Three.js pro-
porciona tres clases de cmaras: una con
proyeccin perspectiva (PerspectiveCa-
mera), una con proyeccin ortogonal
(OrthographicCamera) y una que puede
conmutar entre las dos (CombinedCa-
mera ). Cuando se crea la cmara, los
programadores especifican el campo de
visin (fov), la relacin de proporcin y
las distancias mnima (near) y mxima
(far) de la figura geomtrica. Se define
as el tronco de visualizacin (frustum),
el cual es el volumen de la forma pirami-
dal que define los objetos visibles de la
escena mostrada por el navegador. La
Figura 3 muestra el tronco con los
correspondientes parmetros de
Three.js. Un ejemplo [9] en el sitio del
proyecto demuestra alguno de estos
valores.
En muchos casos, el programador que-
rr que el usuario controle la posicin y
direccin de la cmara. Para esto,
Three.js proporciona soluciones prepara-
das, tales como TrackballControls() en la
lnea 73. Esta solucin de control pre-
senta las caractersticas de comporta-
miento habituales: la cmara rota al pul-
sar el botn izquierdo del ratn, se
acerca cuando se mantiene el botn cen-
tral y se mueve al pulsar el botn dere-
cho. Los controles adicionales, tales
como FirstPersonControl(), el cual
camina a travs de la escena como el
propio tirador, estn disponibles o se
pueden programar.
Una cmara es de poca utilidad en la
oscuridad, por lo tanto, el cdigo define
la fuente de luz desde la lnea 76 y le
asigna a una posicin. Irradia luz blanca
( 0xffffff ) con una intensidad mxima
(1.0 ). En el ejemplo, la fuente de luz
tiene una posicin fija en la escena.
Ahora lo nico que falta es el propio
3D. El Listado 1 genera un plano desde la
lnea 81 y un cubo desde la lnea 88 con
JavaScript. Para cada objeto, el cdigo
primero define la geometra y luego
genera la superficie con un material
(Mesh). Al igual que una cmara, mesh
se posiciona y se monta en la escena.
se ejecutan a travs de los mismos
pasos:
Cargar las bibliotecas de JavaScript
Crear el lienzo
Crear la escena Three.js
Iniciar los bucles de eventos
Un ejemplo sencillo de este proceso se
muestra en el Listado 1, el cual genera la
pgina web que se muestra en la Figura
2. El ejemplo usa la biblioteca principal
de Three.js, as como la clase ayudante
Detector.js. La pgina HTML integra las
bibliotecas con la etiqueta de script en la
cabecera. Las Lneas 16 y 17 usan una
URL absoluta, pero las bibliotecas que
estn disponibles en nuestro propio ser-
vidor se pueden recuperar a travs de
rutas relativas como js/ Three.js. En con-
traste con complementos y applets, el
rea dibujada por Three.js no es un
objeto exterior al sitio web el navega-
dor lo trata como parte del HTML nor-
mal. En este ejemplo, un simple ele-
mento div con el ID ThreeJSCanvas
(lnea 23) sirve como un lienzo. Los
desa rrolladores pueden definir su posi-
cin, tamao, color de fondo y mucho
ms usando la Hoja de Estilos en Cas-
cada Cascading Style Sheets (CSS). En el
ejemplo, se especifican los diferentes
colores de fondo para las partes 2D
(blanco) y 3D (gris), pero tambin es
posible una imagen de fondo comn.
La implementacin del ejemplo tiene
lugar en el bloque JavaScript que se ini-
cia en la lnea 25. Llama a cada funcin
por turnos para inicializar la escena y
arrancar el bucle del evento. La funcin
init usa primero la biblioteca ayudante
Detector.js, la cual comprueba si el nave-
gador permite WebGL y muestra el resul-
tado con el atributo webgl. Si ste es el
caso, el script puede usar WebGL para
hardware acelerado. En caso contrario
genera CanvasRenderer. Esto funcionar
en navegadores sin WebGL, pero ofre-
ciendo muchas menos funcionalidades.
Despus es necesario conectar el ren-
derizador con el elemento HTML. Para
ello, la lnea 51 consulta el elemento div
usando el ID desde el Modelo de Objeto
de Documento Document Object Model
(DOM). Las siguientes lneas determinan
el tamao del elemento y lo transfieren
al renderizador. En la lnea 60, el script
inserta el elemento DOM desde el rende-
rizador en el elemento div. De esta
manera la parte 3D se empotra en la
pgina HTML. Despus es necesario
pgina de prueba [3] del consorcio
WebGL. Si no muestra compatibilidad en
Firefox, una buena idea es comparar la
configuracin en about:config con la de
la Figura 1. Chrome es un poco quisqui-
lloso con las tarjetas grficas. Si la com-
patibilidad WebGL no funciona de
manera inmediata, se puede establecer
manualmente en el archivo de
configuracin /usr/ share/ applications/
google-chrome.desktop con la lnea:
Exec=/opt/google/chrome/U
google-chromeU
--enable-webgl U
-ignore-gpu-blacklist %U
Los detalles de las tarjetas grficas se
pueden llamar en Chrome desde esta
URL: chrome:// gpu.
La programacin con OpenGL nunca es
coser y cantar y WebGL no es diferente. A
diferencia de C o Java, no es necesario
compilar con JavaScript, pero con esta
biblioteca de bajo nivel hay que escribir
buena parte del cdigo antes de poder
conseguir resultados. La solucin es una
biblioteca que encapsule las tareas comu-
nes, como crear formas geomtricas bsi-
cas o cargar modelos o texturas. Esta faci-
lidad extra para el usuario la proporciona
la biblioteca de JavaScript Three.js [4].
Three.js proviene de un programador
espaol que se llama a s mismo Mr.
Doob y est disponible bajo licencia
MIT. Podemos ver un resumen de las
posibilidades de Three.js en el extenso
grupo de demos del sitio web del pro-
yecto: desde sencillos cubos hasta com-
plejas escenas 3D para vrtices o som-
breado de fragmentos. Podemos encon-
trar ms ejemplos en el blog de Jerome
Etienne [5] y en la pgina Learning
WebGL [6]. Estos ejemplos acallan las
frecuentes quejas relativas al rendi-
miento. Si bien JavaScript no puede
competir con el rendimiento de C++ o
Java, una vez que se han cargado los
datos en la pila de OpenGL, ya no juega
ningn papel.
WebGL todava no puede conseguir los
niveles de rendimiento de C++ [7] o de
las aplicaciones Java [8] con sus dcadas
de mantenimiento, pero puede crear
mundos con varios cientos de miles de
polgonos y corre en distintas platafor-
mas sin instalaciones adicionales.
No importa lo intrincadas que sean las
escenas, todos los programas de Three.js
PORTADA 3D con Three.js
34
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
3D con Three.js PORTADA
35
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
001 <!doctype html>
002 <html>
003 <head>
004 <title>Three.js Example</title>
005 <style type=text/css>
006 body {
007 background-color: #ffffff;
008 }
009
010 #ThreeJSCanvas {
011 background: #ababab;
012 width: 800px;
013 height: 600px;
014 }
015 </style>
016 <script
src=https://github.com/mrdoob/three.js/raw/maste
r/build/Three.js></script>
017 <script
src=https://github.com/mrdoob/three.js/raw/maste
r/examples/js/Detector.js></script>
018 </head>
019 <body>
020 <h1>WebGL Example</h1>
021 Lorem ipsum dolor sit amet, consetetur ...
022
023 <div id=ThreeJSCanvas></div>
024
025 <script>
026 var renderer;
027 var scene;
028 var camera;
029 var cameraControl;
030 var cubusMesh;
031
032 // Initialize the scene
033 init();
034
035 // Animate die scene
036 animate();
037
038 function init(){
039 console.log(init);
040
041 // If WebGL is supported by the browser, use
the
042 // hardware-accelerated WebGL-renderer,
otherwise the
043 // normal CanvasRenderer
044 if(Detector.webgl){
045 renderer = new
THREE.WebGLRenderer({antialias:true});
046 } else {
047 renderer = new THREE.CanvasRenderer();
048 }
049
050 // Fetch the defined DIV element by its ID
051 var divElement =
document.getElementById(ThreeJSCanvas);
052
053 // Set the renderer to the size of the DIV
element
054 var canvasWidth = divElement.offsetWidth;
055 var canvasHeight =
divElement.offsetHeight;
056
057 renderer.setSize(canvasWidth,
canvasHeight);
058
059 // and attach it to the DIV element
060
divElement.appendChild(renderer.domElement);
061
062 // Create the scene into which all objects
will be inserted
063 scene = new THREE.Scene();
064
065 // Create the camera, set its position
066 // and point it at the origin
067 camera = new THREE.PerspectiveCamera(50,
canvasWidth / canvasHeight, 1, 10000);
068 camera.position.set(3, 4, 5);
069 camera.lookAt( new THREE.Vector3( 0, 0,0));
070 scene.add(camera);
071
072 // Control of the camera with the mouse
073 cameraControl = new
THREE.TrackballControls(camera,
renderer.domElement);
074
075 // Define and insert a light source
076 var directionalLight = new
THREE.DirectionalLight(0xffffff, 1.0);
077 directionalLight.position = new
THREE.Vector3( 20,20,20);
078 scene.add(directionalLight);
079
080 // A 5X5-sized plane
081 var planeGeo = new THREE.PlaneGeometry(5,
5, 20, 20);
082 var planeMat = new
THREE.MeshLambertMaterial({color: 0xef0000});
083 var mesh = new THREE.Mesh(planeGeo,
planeMat);
084 mesh.doubleSided = true
085 scene.add(mesh);
086
087 // A cube
088 var cubusGeo = new THREE.CubeGeometry( 1, 2,
4, 1,2,4); //new Three.new THREE.TorusGeometry( 1,
0.42 );
089 var cubusMat = new
THREE.MeshLambertMaterial( { color: 0x00ef00 } );
090 cubusMesh = new THREE.Mesh( cubusGeo,
cubusMat );
091 cubusMesh.position = new THREE.Vector3( 0,
1.01, 0);
092
093 scene.add( cubusMesh );
094
095
096 }
097
Listado 1: Un ejemplo sencillo
El material determina la apariencia del
objeto: adems de los colores simples,
los desarrolladores pueden usar texturas
o sombras para las superficies. Ahora la
definicin del mundo 3D est completa y
se puede iniciar el bucle.
Dentro del bucle de eventos, el cdigo
procesa las entradas del usuario a inter-
valos regulares o anima la escena antes
de que se dibuje una nueva imagen
desde la escena 3D. La funcin ani-
mate() es la responsable de esto en el
ejemplo, por primera vez en la lnea 36
despus de que se haya definido la
escena. De manera que se utiliza la fun-
cin requestAnimationFrame() para que
una nica llamada pueda convertirse en
un bucle de eventos real. Esto lo maneja
el navegador que es responsable de lla-
mar regularmente a la funcin ani-
mate(). Tambin interrumpir el bucle
de eventos, por ejemplo, si la ventana no
est visible en ese momento, ahorrando
de este modo recursos del sistema.
Previamente vimos en el Listado 1
como rota el cubo alrededor de su eje y
PORTADA 3D con Three.js
36
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Figura 3: El tronco determina la parte visible del mundo 3D. Las propiedades de esta vista piramidal se representan por variables de JavaScript
en Three.js.
Figura 2: La pgina web del Listado 1 crea un sencilla escena 3D.
098 function animate(){
099
100 // Rotate the cube
101 cubusMesh.rotation.y = 1e-4* new
Date().getTime();
102 // Rotating the camera according to user
input
103 cameraControl.update();
104
105 // Rendering the scene
106 renderer.render(scene, camera);
107
108 // Next rendering only if required
109 requestAnimationFrame(animate);
110 }
111
112 </script>
113 </body>
114 </html>
Listado 1: Un ejemplo sencillo (Cont.)
luego actualiza la posicin de la cmara
de acuerdo a la entrada del usuario. Aun-
que parecen similares a primera vista,
son dos movimientos distintos: la pri-
mera accin rota el objeto en la escena y
la segunda accin mueve la perspectiva
en la escena. Una vez que la escena 3D
se haya actualizado adecuadamente, la
lnea 106 llama al renderizador para inte-
grarla en una vista 2D.
Tener slo planos y los cubos resulta-
ran aburridos, pero Three.js proporciona
ms opciones para generar escenas 3D.
Por ejemplo, se pueden generar geome-
tras primitivas (tringulos, cubos, cilin-
dros, esferas, lneas) y extrudir planos
para crear slidos. La biblioteca tambin
puede cargar figuras geomtricas defini-
das exteriormente y hacer que la tarjeta
grfica calcule el sombreador de los vrti-
ces. La capacidad de cargar figuras geo-
mtricas externas hace a Three.js particu-
larmente atractivo para muchas aplica-
ciones, dado que permite la integracin
de potentes herramientas de modelado,
tales como Blender o un sistema CAD.
Dependiendo de la aplicacin, esto se
puede hacer con el cargador de Three.js
para formatos externos, tales como
Wavefront Object, Collada y VTK o con
un convertidor que traduce los archivos
al formato JSON de Three.js. Este archivo
ASCII define los puntos, planos, norma-
les y colores. Incluso los modelos anima-
dos, como gente caminando, se pueden
almacenar en este tipo de archivos.
Importar Geometras
Los convertidores de lnea de rdenes,
as como los complementos para Blender
y 3DS Max se encuentran bajo utils/
exporters en el cdigo fuente de Three.js.
Se pueden programar ms convertidores
relativamente rpido: usando un conver-
tidor escrito por ellos, los autores expor-
taron la moto de la Figura 4 a JSON
desde el formato JT comn en el mundo
CAD. El Listado 2 carga los archivos
JSON. La funcin load() requiere el URL
del archivo JSON y una funcin de lla-
mada para posteriores acciones una vez
cargada. Esta funcin define el material,
crea una malla y la aade a la escena, tal
y como se hizo con la geometra creada
manualmente en el Listado 1.
El atributo de malla doubleSided
desacti va el recorte de la cara posterior
de manera que se muestran ambos
lados de una superficie. Sin este par-
metro, slo se dibujara el lado con un
vector normal que mirase a la cmara.
Si los vectores normales no son unifor-
mes, podran aparecer agujeros en la
superficie.
GeometryUtils mueve la geometra al
polo. En caso contrario, se podra posi-
cionar en su ubicacin original y podra
no ser visible despus de la carga.
Cuando se cargan geometras externas,
se aplican los mecanismos normales de
seguridad del navegador. Chrome por
ejemplo, slo lo permite si la pgina
HTML y los datos JSON vienen del
mismo servidor. Slo es posible cargar
directamente desde el disco duro local si
3D con Three.js PORTADA
37
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Figura 4: Se pueden mostrar modelos complejos que incluyen sombras en navegadores sin
necesidad de complementos.
Figura 5: Una visualizacin de la poblacin mundial que combina aspectos 2D y 3D.
tecas de CSG (Constructive Solid Geo-
metry), que usan operadores lgicos para
combinar geometras primitivas [14].
El desarrollo se ver ayudado por utili-
dades comunes de JavaScript tales como
dat-gui [15] o consolas en Firefox y
Chrome. WebGL Inspector [16] permite
una mirada profunda en la pila OpenGL.
De forma alternativa se pueden definir
escenas completas 3D va arrastrar y sol-
tar con ThreeNodes.js [17].
Incluso ahora, empezar con la progra-
macin en 3D con Three.js es ms senci-
llo que con la mayora de cualquiera de
las otras tecnologas. Los navegadores
con WebGL ya se estn extendiendo y lo
seguirn haciendo en dispositivos de
escritorio y mviles. La combinacin de
2D y 3D en particular va a dar lugar a un
nmero cada vez mayor de nuevas apli-
caciones que irn ms all de las escenas
de demostracin o de juegos graciosos.
Por ejemplo, los autores de este artculo
estn trabajando en un visor llamado
CADOculus que muestra datos CAD en
navegadores web [18].
Chrome se ha iniciado con la opcin -
disable-web-security.
En este artculo solamente hemos ara-
ado la superficie de la versatilidad de la
que es capaz Three.js. Junto a la geome-
tra generada o importada explcita-
mente, la biblioteca tambin permite tc-
nicas de visualizacin tales como sprites
e incluye un sistema de partculas. Ms
all de eso, se pueden definir geometras
y colores hasta el ltimo detalle con
sombreados de vrtices y fragmentos
[10]. Aplicaciones como visualizaciones
de datos [11] (Figura 5) o el juego Zom-
bie vs Cow [12] (Figura 6) demuestran
las posibilidades.
En el futuro van a tener lugar muchos
desarrollos interesantes de la implemen-
tacin de WebGL en navegadores, en el
desarrollo posterior de Three.js y en el
mundo de los convertidores, por ejem-
plo, en juegos con motores fsicos tales
como Physijs [13] y en el CAD con biblio-
PORTADA 3D con Three.js
38
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
[1] Public SQL por Peter Kreuel,
Linux-Magazine 67 pg. 17
[2] WebGL:
http:// www. khronos. org/ webgl/
[3] Pruebas WebGL: http:// get. webgl. org
[4] Proyecto Three.js:
https:// github. com/ mrdoob/ three. js/
[5] Aprender Three.js:
http:// learningthreejs. com
[6] Aprender WebGL:
http:// learningwebgl. com/ blog/
[7] OpenSceneGraph:
http:// www. openscenegraph. org
[8] JmonkeyEngine:
http:// jmonkeyengine. com
[9] Frustum:
http:// mrdoob. github. com/ three. js/
examples/ webgl_camera. html
[10] Tutorial de Sombreado:
http:// aerotwist. com/ tutorials/
an-introduction-to-shaders-part-1/
[11] Visualizacin del crecimiento de la
poblacin mundial:
http:// data-arts. appspot. com/ globe
[12] Zombies vs Cow:
http:// yagiz. me/ zombiesvscow/
[13] Physijs: http:// chandlerprall. github.
com/ Physijs/
[14] CSG: http:// evanw. github. com/ csg. js/
[15] dat-gui:
http:// code. google. com/ p/ dat-gui/
[16] WebGL Inspector: http:// benvanik.
github. com/ WebGL-Inspector/
[17] ThreeNodes.js: http:// idflood. github.
com/ ThreeNodes. js
[18] CADOculus:
http:// www. cadoculus. de
[19] Listados de este artculo:
http:// www. linux-magazine. es/
Magazine/ Downloads/ three. js/
RECURSOS
Figura 6: Los juegos del tipo Zombie vs Cow tambin usan Three.js.
01 var loader = new THREE.JSONLoader();
02 loader.load(mini.json, function(geometry){
03 var material = new THREE.MeshLambertMaterial( { color: 0x00efef } );
04
05 mesh = new THREE.Mesh(geometry, material);
06
07 mesh.doubleSided = true;
08 THREE.GeometryUtils.center(geometry);
09 scene.add(mesh);
10 });
Listado 2: Carga de datos JSON
Johannes Raida y Carsten Zerbst
crean soluciones individuales de
software para las industrias auto-
movilstica y aeroespacial. Su foco
particular est en el software para
CAD, PDM y el intercambio de
datos.
L
O
S

A
U
T
O
R
E
S
Fstransform PRCTICO
39
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Normalmente se decide qu sistema de
ficheros se va a utilizar cuando se instala
Linux si la distribucin no toma la deci-
sin por s misma. Luego, una vez que el
sistema se encuentra en el disco, la realiza-
cin de un cambio es difcil: por motivos
de seguridad, hay que copiar todos los
ficheros a un disco diferente, luego hay
que volver a formatear completamente el
disco duro y por ltimo, volver a copiar
todos los ficheros de nuevo al disco y espe-
rar que todos los atributos se conserven.
Los programas de la lnea de comandos
del kit de herramientas Fstransform, sin
embargo, permiten la conversin de un sis-
tema de ficheros a otro. Esto significa que
ya no es necesario tener un segundo disco
duro como almacenamiento intermedio.
Desafortunadamente, este kit de herra-
mientas tiene algunos inconvenientes.
U
na vez que se opta por un sistema
de ficheros, no puede cambiarse
fcilmente especialmente si ya se
tienen ficheros almacenados en l. Massi-
miliano Ghilardi cambi esto con su
pequeo kit de herramientas denominado
Fstransform [1]: con l slo hace falta un
comando para cambiar de un tipo de sis-
tema de ficheros a otro.
Los sistemas de ficheros son los respon-
sables de la forma en la que se almacenan
los ficheros en las unidades de disco. De -
safortunadamente, actualmente existen
multitud de ellos compitiendo por hacerse
con el puesto de cabeza. En Linux, ext4 es
el ms popular, con Btrfs a la espalda espe-
rando hacerse con el primer puesto. Win-
dows usa NTFS y su antecesor, FAT32, que
actualmente prevalece en las unidades de
memoria USB.
No sin una Copia
de Seguridad
Por ejemplo, Fstransform slo soporta los
sistemas de ficheros comunes de Linux:
ext2, ext3, ext4, ReiserFS, JFS y XFS. Los
sistemas de ficheros de Windows, NTFS,
MS-DOS y FAT32, estn excluidos explci-
tamente (Figura 1). Por lo tanto, queda
totalmente descartada la posibilidad de
convertir una particin antigua de Win-
dows a ext4.
Adems, siempre existe el peligro de que
Fstransform al realizar la conversin tire
todos los datos a un pozo sin fondo. Ghi-
raldi expresamente indica en la documen-
tacin que no se hace responsable de nin-
guna prdida de datos. Dicho de otra
forma, si pierdes tus datos, es tu problema.
Por ello, si se desea utilizar Fstransform, se
debera realizar primero una copia de
Cathy Keller, 123rf.com
El Camaleon
Fstransform convierte sistemas de ficheros sin necesidad de formatear ni borrar ningn fichero.
POR TIM SCHRMANN
Convirtiendo sistemas de ficheros con Fstransform
actualmente montada, es necesario dispo-
ner de acceso de lectura y escritura. Ade-
ms, los programas y los procesos tienen
que tener permiso para acceder a la parti-
cin durante la conversin. Dicho de otro
modo, Fstransform tiene que poder des-
montar la particin. Esto tambin significa
que no se puede convertir la particin raz
al vuelo. Si todas las condiciones se cum-
plen, lo nico que tendremos que hacer
ahora es ejecutar como root el comando
fstransform. Los parmetros necesarios
son el fichero de dispositivo de la particin
que se va a convertir y el sistema de fiche-
ros de destino. Por ejemplo, el comando:
# fstransform /dev/sdc1 xfs
convertir la particin del disco duro
externo (sdc1) al sistema de ficheros XFS.
Recolocacin
En el primer paso, Fstransform comprueba
si todas las herramientas se encuentran
presentes. Si se apreciara algn error como
se muestra en la Figura 2, debera cance-
condiciones que aparecen en
el cuadro Requisitos para
Fstransform. Sin embargo,
esto no debera ser un pro-
blema para ninguna distribu-
cin y para los sistemas de
ficheros mencionados ante-
riormente.
Plan de Conversin
Como es una herramienta
bastante nueva, Fstransform
an no se encuentra disponi-
ble por defecto en las distri-
buciones. Por ejemplo, Cano-
nical no lo ha incluido en sus
repositorios hasta Ubuntu
12.10. Si no cuentas con
dicha versin de la distribu-
cin, no hay otra alternativa
que compilarla por nosotros mismos. Sin
embargo, esta operacin se realiza rpida-
mente. Primero, hay que instalar el compi-
lador de C++ y make usando el gestor de
paquetes de nuestra distribucin. En
Ubuntu estos dos programas se encuentran
en los paquetes g++ y
make. Luego, podemos des-
cargar la versin actual de
Fstransform desde su sitio
web [1], descomprimir el
fichero en el disco duro y eje-
cutar los siguientes tres
comandos en el directorio
que se haya creado en este
ltimo paso:
$ ./configure
$ make
$ sudo make install
Si la particin en que se va a
convertir se encuentra
seguridad, preferiblemente en la forma de
una imagen. Luego, se podr revertir rpi-
damente al estado anterior si fuera necesa-
rio. El Live CD Clonezilla [2] es perfecto
para esta tarea.
Para que Fstransform convierta el sis-
tema de ficheros, la particin debe tener al
menos un cinco por ciento del espacio
libre. Cuanto ms espacio libre haya, mejor
ir la conversin. Ghiraldi tambin acon-
seja que para poder convertir una particin
al sistema de ficheros XFS, el disco duro
debera tener al menos un diez por ciento
de espacio libre.
Adems, las herramientas apropiadas
del sistema de ficheros deben estar instala-
das tanto para el sistema de ficheros actual
como para el nuevo. Por ejemplo, si se
quiere actualizar una particin al sistema
de ficheros XFS en Ubuntu, tambin hay
que tener el soporte para XFS por medio
del paquete xfs-progs. Pero esto no es todo:
tambin es necesario que se cumplan las
PRCTICO Fstransform
40
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Figura 1: Fstransform cobardemente rehusa ejecutarse
cuando detecta un sistema de ficheros que no soporta.
Figura 2: Fstransform no puede encontrar las herramientas
del sistema para el sistema de ficheros XFS y por ello, can-
cela la operacin.
Figura 3: Fstransform nos da otra oportunidad por si nos
arrempetimos.
Antes de que Fstransform pueda convertir un sistema de ficheros, tienen
que cumplirse los siguientes requisitos:
El sistema de ficheros tiene que ser compatible con ficheros sparse
[3].
El sistema de ficheros tiene que soportar una de las siguientes dos fun-
ciones del sistema: ioctl(FS_IO_FIEMAP) o ioctl(FIBMAP)
Linux tiene que soportar los sistemas de ficheros origen y destino.
Los programas mkfs y fsck tienen que estar instalados en los sistemas
de ficheros origen y destino.
Los siguientes programas de la lnea de comandos deben estar dispo-
nibles: which, expr, id, blockdev, losetup, mount, umount, mkdir,
rmdir, rm, mkfifo, dd, sync, fsck y mkfs.
Requisitos para Fstransform
larse el proceso presionando la tecla Enter
e instalar los programas que falten.
Si la particin que se va a convertir no
se encuentra montada en ningn sitio,
Fstransform la montar en el directorio
/tmp. Algunas distribuciones, como
Ubuntu, abren de forma automtica el
administrador de archivos cuando sucede
esto. Debera cerrarse inmediatamente la
ventana del administrador de archivos.
En caso contrario, aparecer un mensaje
de error en cuestin de segundos.
Fstransform ahora se para de nuevo y
ofrece al usuario una ltima oportunidad
para cancelar el proceso completo presio-
nando Ctrl + C (Figura 3). Si se quiere
continuar, slo habr que presionar la
tecla Enter. Tras completarse la primera
parte de la conversin, Fstransform des-
montar la particin que est convir-
tiendo. Si algo fuera mal, por alguna
razn, Fstransform se lo comunicar
(Figura 4). Una particin que no se
pueda desmontar no es motivo de
pnico: simplemente hay que abrir una
segunda ventana de terminal y desmon-
tar la particin manualmente, por ejem-
plo:
$ sudo umount /dev/sdc1
De nuevo en la ventana con Fstransform,
hay que teclear continue y presionar Enter.
En algn punto, debera aparecer algn
mensaje indicando que Fstransform se
encuentra preparado (Figura 5). De
nuevo, hay que presionar la tecla Enter y
esperar a que termine el proceso. La con-
versin tarda del orden de un minuto por
gigabyte. Por ello, una particin con 250
GB de datos puede tardar cuatro horas.
Durante este tiempo, no se puede inte-
rrumpir a Fstransform bajo ningn con-
cepto. Lo mejor que se puede hacer es no
tocar el sistema hasta que aparezca el
mensaje de que ha finalizado con xito la
conversin (Figura 6).
El programa fstransformes un script. La
conversin real se lleva a
cabo entre bastidores por
dos programas: fsmove y
fsremap. Si algo fuera mal,
hay varios ficheros de regis-
tro en /var/tmp/fstransform:
fstransform.log. <nmero>
y fsremap.job. <nmero>.
Si fsremap se cancela, se
puede probar con:
# fsremap -resume-job=U
Nmero /dev/sdc1
para que contine con la
tarea.
Conclusiones
Fstransform es tremendamente til, espe-
cialmente para convertir sistemas de fiche-
ros con enormes diferencias tcnicas como
de ReiserFS a ext4. Como Fstransform dis-
para algunas buenas armas para realizar
este trabajo, deberamos tomarnos muy en
serio las advertencias y asegurarnos de que
se tiene una copia de seguridad operativa. A
veces, algunos sistemas de ficheros vienen
con sus propios programas de conversin,
que pueden ser ms rpidos y seguros.
Para convertir antiguos sistemas de fiche-
ros ext a versiones modernas, no hay por
qu utilizar Fstransform. Los desarrolladores
de ext ofrecen una herramienta llamada
tune2fs para realizar esta tarea [4]. Puedes
convertir un sistema de ficheros ext3 a un
sistema de ficheros ext4, por ejemplo, de
forma ms conservadora, de forma ms
rpida y de forma ms segura que con
Fstranform.
Fstransform PRCTICO
41
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
[1] Fstransform:
http:// sourceforge. net/ projects/
fstransform/
[2] Taller de Clonezilla: Tim Schrmann,
Jurassic Park, LU 08/ 09, p.48,
http:// www. linux-community. de/
18988
[3] Ficheros Sparse:
http:// en. wikipedia. org/ wiki/ Sparse_
file
[4] Mantenimiento de sistemas de
ficheros: Nathan Willis, Festes
Fundament, LU 10/ 2011, p.42,
http:// www. linux-community. de/
24394
RECURSOS
Figura 4: Fstransform es incapaz de desmontar la particin que va a
convertir.
Figura 5: La preparacin para la conversin a otro tipo de sistema de
ficheros ha finalizado.
Figura 6: Un simple mensaje anuncia que la conversin se ha
realizado con xito.
L
os estadsticos suelen ver el mundo
como un origen de datos enorme a
explorar y entender, y no es nece-
sario un gran colisionador de hadrones
para generar datos interesantes.
Por ejemplo, las mediciones de rendi-
miento de software o las estadsticas de
acceso a servidores web nos darn un mon-
tn de material que no llega a ser informativo
o definitivo hasta que hayamos encontrado
la manera correcta de visualizar las pilas de
datos en bruto.
Una Cuestin de Estructura
Existe un nmero ms que suficiente de pro-
gramas disponibles que permiten crear grfi-
cos, tales como hojas de clculo, Gnuplot o el
entorno de trabajo Matplotlib de Python,
pero todos estos siguen el enfoque impera-
tivo tradicional. Dependiendo del tipo de
datos, por lo general elegimos la mejor com-
binacin de grficos a partir de una seleccin
predefinida: grficos de barras, puntos, lneas
o algo similar para a continuacin, aadir un
mayor o menor nmero de parmetros o
casillas de verificacin para configurar todos
los detalles de formato.
En muchos casos, esta tarea consume bas-
tante tiempo, especialmente si los datos cam-
bian continuamente o si es difcil saber por
adelantado qu tipo de visualizacin nos
dar los mejores resultados. Despus de
todo, la mayor parte de la gente quiere con-
PRCTICO Ggplot2
42
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
centrarse en el anlisis de datos y no en los
detalles tcnicos al crear el grfico.
Este problema no es exactamente nuevo
entre los estadsticos y los aficionados al tra-
tamiento de datos. Una solucin atractiva fue
creada por el estadstico Leland Wilkinson
[1], que cre The Grammar of Graphics y se
explay a lo largo de varias dcadas, descri-
biendo cmo asignar los diversos aspectos de
los conjuntos de datos a los componentes de
un grfico sin tener que centrarse en los deta-
lles explcitos del formato.
En ggplot2, una potente, pero no muy
conocida herramienta de visualizacin que
se basa en lenguaje estadstico GNU R,
Hadley Wickham ha implementado los con-
ceptos de la gramtica de grficos.
La sintaxis y los conceptos de ggplot2 y R
pueden parecer poco convencionales. Aun-
que el lenguaje no puede tacharse de no ser
prctico o no consistente, la curva de apren-
dizaje es ms acusada que con otros mto-
dos.
Sin embargo, nuestros esfuerzos sern
recompensados al ganar flexibilidad y una
esttica de grficos con calidad de publica-
cin que podremos crear sin juguetear dema-
siado con los parmetros.
El Gran R
GNU R se incluye en muchas distribuciones
de Linux como paquete binario. Incluye una
shell interactiva que podemos iniciar en la
lnea de comandos (tecleando R) y varios
front-ends (por ejemplo ESS Mode en
Emacs). Para acceder a ggplot2 desde dentro
de una sesin de R, lo nico que tenemos
que hacer es teclear library(ggplot2).
Si ggplot2 no est incluido en la instalacin
estndar de nuestra distribucin R, podemos
instalarlo junto a todas sus dependencias
tecleando la lnea siguiente en la shell de R:
install.packagesU
(ggplot2,U
dependencies=T)
Podemos finalizar la sesin de R escribiendo
quit() o pulsando la combinacin de teclas
Ctrl+D.
Filas de Datos
Los datos de muestra del Listado 1 nos ayu-
dan a demostrar los principios tras ggplot2.
Los datos estn en un archivo CSV, un senci-
llo formato de datos aunque universal que
casi cualquier aplicacin puede exportar, y
describen un experimento que mide el rendi-
miento de los algoritmos foo, bar e hiper apli-
cados a conjuntos de datos de diferentes
tamaos (DataScope). La columna Through-
put es la velocidad del volumen de datos pro-
cesados. Al mismo tiempo, los datos distin-
guen tres configuraciones: A, B y C.
Este escenario es similar a muchas situa-
ciones que le pueden ocurrir a un programa-
Visualizacin de datos con ggplot2
Curvas Elegantes
Aadir grficos atractivos e informativos a nuestro trabajo generalmente requiere una gran cantidad de
paciencia, pero ggplot2, complemento del paquete estadstico R, aade estructura a los grficos y simplifica
la vida a los aficionados a las estadsticas. POR WOLFGANG MAUERER
Matt Tilghmann, 123RF.com
43
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
dor o en el trabajo diario a un administrador
de sistemas. En la vida real, probablemente
tendramos que extraer los datos de los archi-
vos de log o de otras fuentes, pero debido a
que este paso no tiene nada que ver con la
visualizacin, vamos a ignorar la fuente.
Los datos en ggplot2 estn representados
por marcos de datos, una estructura de datos
R que se asemeja a las listas o matrices utili-
zadas en otros lenguajes de programacin.
Cada marco comprende un nmero arbitra-
rio de filas y columnas, a las que se les puede
dar un nombre. En ggplot2 es suficiente con
denominar una columna.
El Listado 2 muestra
cmo el comando de R
read.csv crea un marco de
datos a partir del archivo
CSV. El argumento hea-
der=T le indica a R que
utilice las etiquetas de las
columnas en la primera
lnea del archivo de texto.
El operador de asignacin
<- almacena los datos en
la variable dat. El
comando print() permite hacer una compro-
bacin.
Primero iremos a por un subconjunto, el
del algoritmo de foo. GNU R proporciona un
subconjunto de comandos que crean un
marco de datos ms pequeo:
dat.sub <- subsetU
(dat, AlgorithmU
==foo)
Para convertir los datos en bruto en un gr-
fico (vase la Figura 1), se necesitan dos lla-
madas a R:
Ggplot2 PRCTICO
01 Algorithm, DataScope, Through-
put, Configuration
02 foo,32,6.67,A
03 foo,64,7.19,A
04 foo,128,7.60,A
05 foo,256,8.03,A
06 foo,512,8.21A
07 foo,32,6.79,B
08 foo,64,6.60,B
09 foo,128,7.45,B
10 [...]
11 foo,512,8.21,C
12 bar,32,4.00,A
13 bar,64,6.92,A
14 bar,128,11.17,A
15 [...]
16 bar,256,16.01,C
17 bar,512,19.97,C
18 hyper,32,6.62,A
19 hyper,64,8.40,A
20 [...]
Listado 1: Datos de Ejemplo
01 dat <- read.csv(data.txt, header=T)
02 print(dat)
03 Algorithm DataScope Throughput
Configuration
04 1 foo 32 6.675104 A
05 2 foo 64 7.190872 A
06 3 foo 128 7.684894 A
07 4 foo 256 8.038377 A
08 [...]
Listado 2: Crear un Marco de Datos
Figura 1: Primer intento de visualizacin: medida de rendimiento con el algoritmo foo.
La asignacin del objeto de base an no
describe qu objeto grfico se utilizar para
los puntos de datos. Ggplot2 administra los
objetos grficos en capas, cada una de las
cuales contiene un objeto. Un grfico puede
comprender mltiples capas superpuestas:
ggplot garantiza automticamente que los
parmetros exteriores de la tabla (por ejem-
plo, su tamao y las etiquetas de los ejes)
coinciden en todas las capas. Para crear un
objeto de capa, necesitamos una funcin
como geom_<type>, donde type define el
tipo de objeto grfico a utilizar.
El comando anterior utiliza dos capas con
objetos grficos sencillos: puntos
(geom_point ()) y lneas (geom_line ()).
Ggplot2 aade ambos al objeto base, transfi-
riendo la configuracin al mismo (origen de
datos y mapeado esttico). Combinando el
objeto base con los objetos de la capa crea-
mos un nuevo objeto R combinado, que se
puede sacar como salida del comando de
impresin genrico print. Sin embargo, el
resultado no es texto por consola sino un gr-
fico por pantalla.
Por supuesto, tambin podemos guardar
grficos de forma permanente. El comando
ggsave(/tmp/graph.pdf, g)
guarda el grfico contenido en g al archivo
especificado en formato PDF. Ggplot2 identi-
fica el formato de archivo deseado por la
extensin. Adems de PDF, tambin pode-
mos optar por PNG, JPG, EPS y SVG. Por
defecto, el software crea figuras con un for-
mato de 9,75 x 4,6 pulgadas.
Para cambiar esto, podemos usar los par-
metros height y width. Los formatos rasteri-
zados como JPG y BMP utilizan una resolu-
cin predeterminada de 300 puntos por pul-
gada, pero podemos modificar esto con el
parmetro dpi. Para crear un grfico PNG
cuadrado con una longitud de arista de 5 pul-
gadas en alta resolucin, probamos el
siguiente comando:
ggsave(plot.png, U
g, height=5,U
width=5, dpi=1200)
Por supuesto, tiene ms sentido usar forma-
tos vectoriales para evitar problemas de esca-
lado, as como de bordes y de feos artefactos
que surgen cuando queremos volver a utili-
zarlos.
Una Cuestin de
Puntos de Vista
Como los datos en bruto se hacen cada vez
ms complejos, el mensaje detrs de ellos
no siempre est claro. Por contra, tendre-
mos que descubrir el tipo de visualizacin
adecuada para revelar el mensaje. En Esta-
dstica, este proceso se conoce como Esta-
dstica de Exploracin. Ggplot2 soporta
este mtodo, ya que permite mejorar grfi-
cos de forma interactiva y paso a paso para
entender y visualizar mejor los resultados.
En cada uno de los pasos, nos fijamos en
los diferentes aspectos de los datos del gr-
fico hasta conseguir una imagen global
coherente.
Adems de los sencillos objetos grficos
vistos hasta ahora, tales como puntos y
lneas, ggplot2 soporta una enorme selec-
cin de otros elementos grficos que pode-
mos combinar sin restricciones prcticas.
La Figura 2 muestra una pequea selec-
cin, pero podemos encontrar una lista
completa en la pgina web de ggplot2 [2].
g <- ggplotU
(data=dat.sub, aes(U
x=DataScope, U
y=Throughput, U
colour=Configuration)) U
geom_point() U
+ geom_line()
print(g)
La transformacin se realiza en dos pasos: el
objeto base ggplot define una asignacin
esttica adems de la fuente de datos, que es
el marco de datos dat.sub creado previa-
mente. La asignacin describe qu elemen-
tos de los datos se mapean a qu componen-
tes en la tabla. El comando especifica que
Throughput (eje y) se dibujar sobre DataS-
cope (eje x). Otro componente de los datos,
Configuration, se codifica con colour. En
otras palabras, ggplot2 utiliza un color para
identificar cada configuracin.
PRCTICO Ggplot2
44
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Figura 3: Dibujar el conjunto completo de datos con diferentes smbolos para los algoritmos.
Figura 2: Una pequea seleccin de objetos grficos soportados por ggplot2.
El conjunto de datos de demostracin
completo, en comparacin con el subcon-
junto limitado, contiene varios tipos de algo-
ritmos, que se pueden distinguir por una
forma diferente del smbolo en el grfico. El
siguiente comando crea el grfico que se
muestra en la Figura 3:
g <- ggplot(U
data=dat, aes(U
x=DataScope, U
y=Throughput, U
colour=Configuration, U
shape=Algorithm)) U
+ geom_point(size=3) U
+ geom_line() U
+ scale_x_log10()
Adems de la fuente de datos completa, dat,
en lugar del subconjunto dat.sub, y la forma
esttica, el cdigo tambin contiene una
nueva caracterstica. Hemos utilizado size
para ajustar el tamao de los puntos creados
por geom_ point() a 3, lo que los hace ligera-
mente ms grandes que el valor predetermi-
nado de 2.
En comparacin con la esttica configu-
rada directamente en el objeto ggplot(),
geom_point no est vinculado a los datos. En
su lugar, utiliza un valor fijo, lo que explica
por qu no se incluye con los parmetros de
aes(): la configuracin se utiliza directa-
mente. Adems, el valor por defecto slo se
aplica a la capa de puntos, es decir, que no
afecta a las lneas, como se puede ver en la
Figura 3. La ltima parte aadida al
comando, scale_x_log10(), realiza una trans-
formacin de escala: en lugar de una escala
lineal, el eje x usa ahora una logartmica.
Ggplot2 modifica los ejes para asegurar que
todas las capas se colocan adecuadamente.
Pulido
Un grfico definitivo debe contener tanta
informacin como sea posible para reflejar
los diferentes aspectos de los datos. El peligro
aqu es la sobrecarga de datos y sin una cui-
dadosa consideracin, los grficos pueden
llegar a ser ilegibles. (Los lmites aqu no son
duros y rpidos: mientras que un lector de
monografas cientficas querra estudiar una
figura durante 10 minutos, respecto a los lec-
tores de tabloides es poco probable que sean
tan entusiastas).
Una posible solucin es no representar
aspectos de los datos implcitamente como
colores y smbolos, sino explcitamente en
forma de subgrficos. Este concepto se aplica
en ggplot2 con facet_grid.
Para distribuir los datos por los mltiples
grficos subordinadas que se muestran en la
Figura 4, tendramos que utilizar el siguiente
comando:
g <- ggplot(U
data=dat, aes(U
x=DataScope, U
y=Throughput, U
colour=Algorithm)) U
+ geom_point(aesU
(colour=Algorithm))U
facet_gridU
(~Configuration)
La expresin facet_grid(~Configuration)
estipula que ggplot2 crear un grfico sepa-
rado subordinado para todas las configura-
ciones que hay posibles (es decir, A, B, y
C). Cada subgrfico muestra su propio sub-
conjunto de datos globales, pero en este
caso usando capas y las asignaciones estti-
cas idnticas.
Las facetas se pueden aplicar tanto vertical
como horizontalmente mediante
facet_grid(<Variable>~.). Debemos tener
cuidado de no olvidar el punto final, que es
necesario por razones tcnicas. La combina-
cin de ambas variantes en la siguiente defi-
nicin
facet_grid(U
Algorithm~Configuration)
genera los resultados que se muestran en la
Figura 5.
La esttica clolour ahora es superflua, por
lo que se omite: en publicaciones impresas,
una visualizacin monocromtica puede ser
ventajosa porque evita la necesidad de una
cara impresin en color. Como alternativa,
podramos representar ms variables con los
Ggplot2 PRCTICO
45
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Figura 5: Facetado en dos dimensiones con colores.
Figura 4: Facetado unidimensional: un subgrfico para cada configuracin.
Ajuste Fino
En la vida real, es desgraciadamente imposi-
ble prescindir completamente de una revi-
sin del manual, en el caso de ggplot2, este
esfuerzo adicional suele ser pequeo. Como
ejemplo prctico, podemos observar los
resultados de las mediciones realizadas en la
latencia en un sistema de doble ncleo fun-
cionando a tiempo real (RT) y en tiempo no
real (no-RT) de una variante de Linux. Cada
medicin almacena un punto de demora
(latencia) junto con informacin acerca de
qu CPU y en qu modo (RT o no-RT) se ha
tomado la medida.
En contraste con el ejemplo anterior, el
gran nmero de valores medidos (varios
miles) significa que la opcin de formato ele-
gida ser un histograma de resumen. El Lis-
tado 3 muestra el cdigo que crea el grfico
de la Figura 6 (los datos en bruto estn dispo-
nibles en lnea 4).
Las correcciones manuales se refieren
principalmente a los ejes: nuevas palabras
clave restringen los datos en la direccin x de
1 hasta 500 (xlim()) y tambin hacen que el
etiquetado logartmico de eje y sea ms legi-
ble (argumentos para scale_y_log10()). La
funcin theme_bw() selecciona un estilo
alternativo que optimiza el grfico para una
representacin monocroma.
La noticia ms importante se oculta en el
objeto grfico. ste no muestra una represen-
tacin directa de los datos originales, sino
una transformacin estadstica implcita.
El histograma (geom_histogram()) correla-
ciona todas las latencias que se producen en
un rango con una ventana temporal espec-
fica. Cada rango est representado por una
barra cuya altura es proporcional al nmero
de puntos de medicin que contiene. En con-
traste con las lneas y puntos, los objetos gr-
ficos ms complejos no siempre se basan en
una representacin directa de los datos origi-
nales.
Ahondar en la opcin de transformaciones
explcitas estadsticas en el proceso grfico
est ms all del alcance de este artculo,
pero la recoplacin exhaustiva de todas las
palabras clave (geoms, transformaciones
estadsticas, escalas, parmetros de diseo,
etc), est disponible en la pgina web de
ggplot2 [2] , y es un buen lugar para empe-
zar si necesitamos ms informacin.
Un compaero muy til que no debemos
tener lejos en nuestro trabajo diario con el
software es el libro del autor de ggplot2, Wic-
kham [5]. Por desgracia, no hay disponible
una introduccin completa para ggplot2 de
forma gratuita en la web, pero una inversin
en el libro sin duda dar sus frutos, y proba-
blemente apoyar el desarrollo y actualiza-
cin del paquete.
Adems de los recursos mencionados
hasta ahora, se puede consultar las pginas
man (bastante escasas) para todos los
comandos. No se usa el clsico mecanismo
de pgina man, sino que est disponible
directamente al teclear ?<keyword> y
?geom_line.
Futuro
Tenemos dos opciones para utilizar ggplot2
de forma no interactiva, de las que realmente
no podemos prescindir para la evaluacin
automtica de datos. Podemos guardar los
comandos que necesitamos, incluyendo
ggsave() y el comando para cargar la librera
ggplot2, en un archivo de texto que se puede
ejecutar desde la lnea de comandos de
Linux, tecleando R CMD BATCH
<archivo>.r. Podramos poner los grficos
que hemos creado de esta manera en un ser-
vidor web, por ejemplo.
Un mtodo ms sofisticado es la funcin
Sweave de R. El sistema combina R y ggplot2
con el sistema de maquetado LaTeX para
producir un do dinmico que proporciona
documentos imprimibles con elegantes grfi-
cos, generados a partir de una fuente mixta
de R y el cdigo LaTeX. Los espritus intrpi-
dos encontrarn todos los detalles en [6].
colores que ya no se utilizan para aadir an
ms informacin al grfico.
El facetado funciona muy bien si la varia-
ble que estamos separando contiene slo
unas pocas categoras, como Configuration
en este ejemplo. Hasta un cierto lmite,
podemos seguir con el uso de colores, pero
en el caso de un mayor nmero de catego-
ras, tiene sentido utilizar smbolos de dife-
rentes tamaos (la esttica size). Como
alternativa, podemos preprocesar datos con
un gran nmero de categoras (y R hace un
trabajo muy bueno en esto) para crear un
nmero ms razonable de las categoras
clasificadas.
Mientras que la Figura 3 amenaza con
ahogar a los visitantes con una avalancha
de detalles, las alternativas de las Figuras 4
y 5 son ms legibles. Tendremos que deci-
dir caso a caso qu forma nos servir mejor
para nuestro propsito. Si necesitamos un
poco de ayuda haciendo esto, recomiendo
la lectura de un buen texto de grficas esta-
dsticas [3].
Lo importante desde el punto de vista del
usuario es que las variantes no implican
ms esfuerzo: Ggplot2 gestiona automti-
camente los detalles molestos como el posi-
cionamiento de grficas subordinadas o el
diseo de eje, y si hemos trabajado con gr-
ficas en otros programas, estaremos proba-
blemente familiarizados con el tedioso tra-
bajo necesario para obtener resultados
satisfactorios.
PRCTICO Ggplot2
46
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Figura 6: Ejemplo de histograma: medidas de
latencia del kernel de Linux.
[1] Wilkinson, L. The Grammar of Gra-
phics, 2nd ed. Springer, 2005.
[2] Pgina web de ggplot2: http:// had.
co. nz/ ggplot2
[3] Tufte, E. R. The Visual Display of
Quantitative Information, 2nd ed.
Graphics Press, 2001.
[4] Listados de este artculo: http:// www.
linux-magazine. es/ Magazine/
Downloads/ 90
[5] Wickham, H. ggplot2: Elegant Gra-
phics for Data Analysis. Springer,
2009.
[6] Pgina web de Sweave: http:// www.
statistik. lmu. de/ ~leisch/ Sweave/ Info
RECURSOS
01 g <- ggplot(data=latency, aes(x=total_observed_delay)) + geom_histogram(binwidth=1)
+ scale_y_log10(breaks=c(1, 10, 100, 1000), + labels=c(1, 10, 100, 1000)) + xlim(1,500) +
facet_grid(type~CPU) + xlab(expression(paste(Delay [, mu, s]))) + ylab( # samples [a.u.]) + theme_bw()
Listado 3: Ajuste fino
FLOW 3 DESARROLLO
47
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
FLOW3 tena como objetivo proporcionar las bases para una nueva versin de TYPO3, pero tras varios aos
de desarrollo, emergi en octubre de 2011 como un moderno framework de PHP que soporta el desarrollo
gil de aplicaciones web empresariales. POR TIM SCHRMANN
E
l sistema de gestor de contenidos
TYPO3 empez a sentir su edad
sobre el 2007. Aunque el software de
cdigo abierto continu siendo popular, su
base necesitaba una renovacin drstica.
Desafortunadamente, la enorme obra
que habra supuesto su renovacin ame-
naz con poner en peligro la estabilidad de
todo el sistema, as que se les pidi a los
desarrolladores de TYPO3 que reescribie-
ran la versin 5 (denominada Phoenix)
desde cero.
El primer paso para el proceso de reescri-
tura fue crear una fundacin que siguiera
los conceptos de las tcnicas de desarrollo y
programacin ms modernas. Los desarro-
lladores, Robert Lemke y Karsten Dambe-
kalns, establecieron esta tarea y fueron asis-
tidos por un ejrcito de voluntarios de la
comunidad de TYPO3.
Cinco aos despus, los desarrolladores
pueden dirigirse ahora a un interesante fra-
mework, que es til para programar aplica-
ciones en la liga mayor de la web, indepen-
dientemente de TYPO3. La primera versin
estable de FLOW3 [1], tal y como se ha lla-
mado finalmente, apareci a finales de octu-
bre de 2011, despus de numerosas versio-
nes de pre-lanzamiento y versiones de
prueba de hecho, los desarrolladores han
rehecho FLOW3 varias veces en el curso del
ciclo de desarrollo.
Sin embargo, todo este proceso no evit
que una gran corporacin en Alemania
estableciera su base de datos de clientes con
una versin de pre-lanzamiento, aunque los
desarrolladores no dicen qu compaa fue.
FLOW3 parece ser una opcin tan atractiva
que una visin en detalle es recomendable.
Palabra de moda Bingo
En su ncleo, FLOW3 es una coleccin de
clases de PHP que permite al usuario
desarrollar aplicaciones web con el mnimo
esfuerzo. Esto significa que el desarrollador
de la aplicacin no tiene que preocuparse
sobre distribuir objetos individuales de PHP
en bases de datos relacionales.
Aplicaciones Web con el framework de PHP Flow3
Ir con la
Corriente
Vladimir D Ivanovic, 123RF.com
DESARROLLO FLOW 3
48
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Por encima de todo, FLOW3 est dise-
ado para aplicaciones web de tamao de
mediano a grande, que requieren una plani-
ficacin precisa y cuidadosa. Por lo tanto,
FLOW3 se basa en borradores y en las ms
modernas tcnicas de programacin, inclu-
yendo principalmente el modelo vista con-
trolador (MVCs,) inyeccin de dependen-
cias, diseo derivado de dominio y progra-
macin orientada a aspectos.
Adems, hay un uso excesivo de nombres
de espacios, que fueron introducidos en
PHP 5.3, y de anotaciones, algo que PHP no
soporta.
Si alguno de estos trminos te est dando
dolores de cabeza, no te preocupes. Si ests
interesado en comenzar con FLOW3, todo
lo que necesitas es un conocimiento bsico
de la programacin orientada a objetos y el
concepto MVC.
Modelos, Vistas y
Controladores
Cada aplicacin FLOW3 se compone de
varias partes (Figura 1). Cuando un usuario
activa una accin, FLOW3 activa un contro-
lador, que inicia a continuacin todas las
dems acciones. Si necesita informacin de
la base de datos, consulta a un repositorio.
El repositorio accede a la base de datos y
empaqueta los resultados que se devuelven
en un objeto PHP fcil de gestionar o en un
modelo. Dicho sea de paso, el repositorio
no habla directamente a la base de datos, en
vez de eso, se apoya en las libreras Doc-
trine 2 [2] que estn integradas en FLOW3
en segundo plano. El ltimo ayudante de
este grupo es la Vista. sta crea el sitio web
finalizado, con la informacin en el modelo
y con el diseo de la plantilla, con alguna
asistencia de un motor de plantillas llamado
Fluid (desarrollado expresamente para
FLOW3), permitiendo al framework abs-
traer el contenido
de lo visual.
Todo esto podra
sonar complejo
pero para una apli-
cacin completa de
libreta de direccio-
nes o para una
pequea base de
datos de pelculas,
solamente necesita-
mos tres clases de
PHP hechas por
nosotros y algo de
HTML mezclado
con las instruccio-
nes de Fluid. Si queremos, FLOW3 generar
las cuatro partes en un proceso semi auto-
mtico.
Instalacin
Para instalar FLOW3, primero necesitamos
un servidor web y una versin de PHP 5.3.2
o superior. La razn para esta versin de
PHP tan reciente, comparado con otros sis-
temas de gestores de contenidos, es por el
uso de nombres de espacios. Los desarrolla-
dores de FLOW3 recomiendan Apache 2
como el servidor web con el mdulo
mod_rewrite activado.
Si queremos almacenar datos, tambin
necesitaremos una base de datos. FLOW3
soportar cualquiera que tenga un controla-
dor PDO naturalmente, incluyendo al
popular MySQL [3]. XAMPP [4] nos da el
entorno de desarrollo necesario. Como
alternativa, en Ubuntu podemos instalar los
paquetes apache2, mysql-server, php5,
php5-cli y php5-mysql.
Despus de cumplir todos los requisitos,
hay que descargar el archivo FLOW3 y des-
comprimirlo en nuestro directorio de Docu-
mentRoot siendo /var/www en Ubuntu o
/opt/lampp/htdocs para XAMPP. Este paso
crea una carpeta FLOW3-1.0.0 con los sub-
directorios listados en la Tabla 1. El directo-
rio Web o el fichero index.php que con-
tiene, para ser ms precisos es el punto
central para ir a nuestra nueva aplicacin
web. Los usuarios slo tienen que apuntar a
ese fichero directamente en sus navegado-
res web. FLOW3 por s mismo est alojado
en Packages/Framework, lo que implica que
slo necesitaremos actualizar estas carpetas
cuando FLOW3 sea actualizado.
Gestin de Permisos
Mientras est ejecutndose, FLOW3 escribe
continuamente en alguno de sus directo-
rios, con lo que necesitamos dar a la cuenta
de usuario que ejecuta el servidor web sus
privilegios de escritura correspondientes.
Aunque esto no es suficiente. Un script de
ayuda nos permite lanzar FLOW3 desde la
lnea de comandos, as que el desarrollador
de la aplicacin tambin necesita los privile-
gios de escritura. Para asegurarnos de que
todo est configurado correctamente, hay
que ir al subdirectorio FLOW3-1.0.0 y lan-
zar el script flow3 que se encuentra all:
Figura 1: Una aplicacin web con FLOW3 comprende al menos cuatro
clases y una plantilla en el formato de un fichero HTML. Los nmeros
muestran la tpica secuencia de llamadas.
Figura 2: Estos mensajes indican que el comando flow3 ha configurado correctamente los per-
misos en los ficheros. Los parmetros que se muestran en el script son adecuados para una
instalacin en Ubuntu 11.10.
Tabla 1: Directorios de Instalacin FLOW3
Directorio Contenido
Configuration/ Ficheros de configuracin de la aplicacin
Data/ Datos persistentes y temporales: cach, logs, recursos, bases de datos
Packages/Framework/ FLOW3
Packages/Application/ Paquetes de ficheros/ aplicaciones PHP
Web/ Directorio pblico web y punto de entrada
FLOW 3 DESARROLLO
49
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
sudo ./flow3 core:U
setfilepermissions tim www-dataU
www-data
El primer www-data es la cuenta de usuario
del servidor web, el ltimo www-data es el
grupo y tim es el nombre de usuario del
desarrollador de la aplicacin. El anterior
comando est pensado para Ubuntu (Figura
2). Los usuarios de XAMPP pueden hacer
esto:
sudo /opt/lampp/bin/php U
flow3 core:setfilepermissions U
tim nobody nogroup
Pero este comando slo establece los permi-
sos de los ficheros. Tambin necesitamos
asegurarnos que el desarrollador de la apli-
cacin es un miembro del grupo de usua-
rios del servidor web.
Arranque rpido
Ahora podemos acceder a la URL http://
localhost/ FLOW3-1.0.0/ Web en nuestro
navegador. FLOW3 toma un par de segun-
dos en completar el proceso de inicializa-
cin. Durante la fase de desarrollo, como
mnimo necesitamos 250MB para cada
script de PHP y puede que necesitemos
incrementar el parmetro memory_limit en
el php.ini. Una vez que la inicializacin se
complete, veremos una pgina como la
mostrada en la Figura 3. Si ejecutamos Apa-
che 2 con mod_rewrite activado, probable-
mente no veamos esta pgina ste es el
caso del entorno XAMPP. La solucin es un
host virtual que nos lleve hasta la instala-
cin de FLOW3. En XAMPP, necesitamos
agregar las tres lneas del Listado 1 al
fichero de configuracin /opt/lampp/etc/
httpd.conf y aadir la siguiente lnea a
/etc/hosts:
127.0.0.1 ejemplo.local
Necesitaremos reiniciar el servidor web
antes de que podamos ver la pgina en
http:// ejemplo. local. Si vemos la pgina tal
y como se muestra en la Figura 3, FLOW
est listo para la accin.
Empaquetando la Estacin
FLOW3 almacena los ficheros PHP y los
recursos pertenecientes a la aplicacin en
paquetes. Cada paquete tiene un nombre
nico o clave de paquete, comprometiendo
el nombre de la compaa del desarrollador
y un nombre de paquete de libre eleccin.
Por ejemplo, si una compa-
a llamada Roxy quiere
crear una base de datos de
pelculas, podra almacenar
todos los ficheros de PHP
pertenecientes a la aplica-
cin en un paquete llamado
Roxy. Movies.
Los ficheros y recursos para
un paquete son almacena-
dos en Packages/
Application en un directorio
separado despus del
paquete. En otras palabras,
los ficheros de Roxy podran
ser localizados en
FLOW3-1.0.0 /Packages/
Application/ Roxy.Movies.
El cdigo PHP no es
almacenado aleatoriamente.
Tiene que seguir obligato-
riamente una estructura de
directorios. Los usuarios
pueden crearla manual-
mente o simplemente dejar
la tarea al script flow3. El
siguiente comando crea el
paquete Roxy.Movies:
./flow3 U
kickstart:package U
Roxy.Movies
Los subdirectorios enumerados en la Tabla
2 estn ahora ubicados en Packages/Appli-
cation/Roxy.Movies.
Adicionalmente, FLOW3 ha creado un con-
trolador sencillo llamado Standar que
escupe texto sin sentido cuando es llamado.
Se puede acceder a l a travs del navegador
en la URL http:// localhost/ FLOW3-1. 0. 0/
Web/ index. php/ Roxy.Movies/ Standar (con
Tabla 2: Estructura de Directorios de Paquetes
Directorio Contenido
Classes/ Clases PHP
Configuration/ Ficheros de configuracin
Documentation/ Documentacin
Meta/ Metadatos o informacin bsica de paquetes
Resources/ Otros recursos (p.ej., imgenes, plantillas (Fluid)
Tests/ Pruebas unitarias
Figura 3: Funcion: la pgina de Bienvenida en una nueva
instalacin de FLOW3.
01 NameVirtualHost *:80
02
03 <VirtualHost *:80>
04 DocumentRoot
/opt/lampp/htdocs/FLOW3-1.0.0/Web/
05 ServerName ejemplo.local
06 </VirtualHost>
Listado 1: httpd.conf para XAMPP
Figura 4: El controlador estndar generado automticamente devuelve un mensaje de texto
plano.
DESARROLLO FLOW 3
50
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
DESARROL
un host virtual en http:// ejemplo. local/
Roxy. Movies/ Standar).
La Figura 4 muestra los resultados. Desde
la URL, FLOW3 determina as a qu contro-
lador llamar en cada paquete.
Almacn
Roxy no quiere devolver textos de prueba,
quiere gestionar una lista de pelculas
almacenadas en una base de datos. El
usuario tiene que decirle a FLOW3 qu
base de datos utilizar en el fichero de
configuracin. Si se utiliza MySQL, creare-
mos un nuevo fichero Settings.yaml en el
directorio /FLOW3-1.0.0/Configuration y lo
rellenaremos con el contenido del Listado
2.
Para nuestro entorno, necesitaremos
modificar el nombre de la base de datos
(dbname), el nombre de usuario (user) y la
contrasea. En Ubuntu y XAMPP, el usuario
es root y la contrasea en XAMPP no est
establecida por defecto. FLOW3 espera
encontrar ficheros de configuracin en for-
mato YAML [5]. La sangra es significativa
en este lenguaje de etiquetado. Cada nivel
aade dos espacios. Una plantilla comen-
tada para Settings.yaml est disponible en
/FLOW3-1.0.0/Configuration/Settings.yaml.
example.
En contraste con otros CMSs, FLOW3 no
crea la base de datos Movies en este ejem-
plo. En vez de eso, tenemos que hacerlo en
la lnea de comandos.
mysql -u root
CREATE DATABASE Movies;
exit
En XAMPP, mysql se encuentra en el subdi-
rectorio /opt/lampp/bin. Una vez que tene-
mos la base de datos, escribiremos:
./flow3 doctrine:migrate
creando todas las tablas de la base de datos
requeridas por FLOW3.
Construccin del Modelo
El siguiente paso es decir a FLOW3 qu
datos son necesarios para almacenar en la
base de datos. Para ello, crearemos un
modelo que sea adecuado. En FLOW3, los
modelos son simples objetos de PHP. En
otras palabras, el gestor de pelculas slo
necesita una clase para encapsular los
datos de una pelcula. Para mantener las
cosas sencillas, simplemente usaremos el
nombre de la pelcula y una descripcin
corta.
El script flow3 crear una clase de PHP
adecuada:
./flow3 kickstart:model U
Roxy.Movies movietitle:string U
description:string
En principio, el framework crear una clase
llamada Movie que ser parte del paquete
Roxy.Movies. Encapsular dos variables lla-
madas title y description, ambas almacena-
das como cadenas de texto. La clase Movie
se encuentra en /FLOW3-1.0.0/
Packages/Application/Roxy.Movies/Classes/
Domain/Model/Movie.php. Como podemos
ver en el Listado 3, slo contiene dos varia-
bles, adems de los mtodos para obtener y
establecer.
Normalmente, un desarrollador de PHP
tendra ahora que crear las tablas de la base
de datos y considerar cmo mostrar la infor-
macin desde las variables. Afortunada-
mente, FLOW3 gestiona todo esto asu-
miendo que dimos alguna ayuda en la
forma de las anotaciones, que estn ocultas
en comentarios. Ellos dan la informacin
FLOW3 sobre la clase, el mtodo o un atri-
buto.
Debido a que PHP no soporta nativa-
mente anotaciones, FLOW3 utiliza su pro-
pia sintaxis, que estipula que las anotacio-
nes empiezan por @. Por ejemplo, @var
string en el Listado 3 indica que $title alma-
cena una cadena de texto. Esta informacin
ayudar despus al framework a crear una
tabla adecuada en la base de datos.
La siguiente cosa que necesita la aplica-
cin web es un repositorio que acepte un
objeto pelcula y que enve la informacin a
la base de datos o que la obtenga desde la
base de datos. FLOW3 requiere un reposito-
rio separado por cada modelo para que sea
almacenado.
Para crear un repositorio, simplemente
hay que derivar una nueva clase desde Repo-
sitory. Una vez ms, el script flow3 gestio-
nar esta tarea si lo preferimos. El siguiente
comando crea un repositorio para Movie:
01 TYPO3:
02 FLOW3:
03 persistence:
04 backendOptions:
05 driver: pdo_mysql
06 dbname: Movies # nombre
base de datos
07 user: root # usuario
base de datos
08 password: secret # con-
trasea base de datos
09 host: 127.0.0.1 # host
base de datos
Listado 2: Settings.yaml
01 <?php
02 namespace
Roxy\Movies\Domain\Model;
03 use TYPO3\FLOW3\Annotations as
FLOW3;
04
05 /**
06 * @FLOW3\Scope(prototype)
07 * @FLOW3\Entity
08 */
09 class Pelicula {
10
11 /**
12 * @var string
13 */
14 protected $title;
15
16 /**
17 * @var string
18 */
19 protected $description;
20
21 /**
22 * @return string El ttulo
del pelcula
23 */
24 public function
getTitulo() {
25 return $this->title;
26 }
27
28 // ...
29 }
30 ?>
Listado 3: Extracto para Movie.php
Figura 5: El controlador Film generado por
FLOW3 y el diseo de plantillas que lo acom-
paan proporcionan una aplicacin web fun-
cional que necesita algo de color y diseo.
FLOW 3 DESARROLLO
51
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
./flow3 kickstart:repository U
Roxy.Movies Movie
El fichero generado /FLOW3-1.0.0/Packa-
ges/Application/Roxy.Movies/Classes/Doma
in/Repository/FilmRepository.php por este
proceso se muestra en el Listado 4.
Debido a que la clase base Repository
incluye un nmero estndar de mtodos
tiles, no hay nada ms que hacer aqu ade-
ms de derivar la clase. Y, slo en el caso de
que te lo preguntes, la extraa anotacin de
la barra lateral en diagonal que aparece a la
izquierda de Repository es simplemente
parte del concepto de nombres de espacios
en PHP [6].
La anotacin @FLOW3\Scope(single-
ton) asegura que slo habr un repositorio
de Movie basndose en la plantilla Single-
ton para hacerlo.
Tanto si hemos creado un modelo o un
repositorio, necesitaremos ejecutar
./flow3 doctrine:update
para actualizar la tabla de la base de datos.
Controladores
En el programa de gestin de pelculas, que-
remos que los usuarios puedan crear,
borrar, modificar y por supuesto, ver las
pelculas. Todas estas acciones son coordi-
nadas por un controlador. Generar la clase
adecuada con flow3 no lleva tiempo:
./flow3 kickstart:U
actioncontroller--U
generate-actions U
Roxy.Movies Movie
El controlador en este ejem-
plo va con el nombre de
Movie. El parmetro --gene-
rate-actions asigna automti-
camente mtodos a su clase
para crear, editar y borrar
objetos de Movie.
La aplicacin completa ya
est lista para su uso. Todo lo
que necesitamos es dirigir
nuestro navegador al contro-
lador en http:// localhost/
FLOW3-1. 0. 0/ Web/ index.
php/ Roxy. Movies/ Movie o http:// ejemplo.
local/ Roxy. Movies/ Movie. Los resultados son
bastante sobrios pero ya es una aplicacin
funcional, como podemos ver en la Figura 5.
Para descubrir lo que sucede en segundo
plano, necesitamos mirar la clase del contro-
lador de movie, que est almacenado en el
fichero FLOW3 -1.0.0/Packages/Applica-
tion/Roxy.Movies/Classes/ Controller/Movie-
Controller.php.
El Listado 5 muestra el comienzo del
fichero. Cuando se activa en el navegador,
FLOW primero activa MovieController.
Debido a que no se declar una accin espe-
cfica, el controlador que implementes eje-
cuta su mtodo indexAction(), que pregunta
al repositorio de pelculas para mostrar todas
las pelculas que almacena mediante Movie-
Repository->findAll(). Dicho sea de paso,
este mtodo es parte del repositorio estndar
de la clase base Repository.
El controlador utiliza inyecciones de
dependencias para acceder al objeto del
repositorio. La variable $MovieRepository
est anotada con @FLOW3\Inject. El con-
trolador indica as: quiero el repositorio de
pelculas en mi variable $MovieRepository.
FLOW3 evala automticamente inyeccio-
nes al repositorio en la variable requerida
cuando se crea el controlador.
Gracias a esta tcnica, los programado-
res de PHP no tendrn que mover ms
objetos o pasarlos de una forma compli-
cada. El repositorio devuelve una lista de
pelculas que el controlador enva inme-
diatamente a una vista estndar con
assign().
Afortunadamente, el controlador crea la
vista automticamente por adelantado y la
almacena en la variable $this->view. Al
mismo tiempo, assign() se asegura de que
01 <!DOCTYPE html>
02 <html>
03 <head>
04 <meta
charset=utf-8>
05 <title><f:render
section=Title /></title>
06 <f:base />
07 </head>
08 <body>
09 <f:flashMessages
class=flashmessages />
10
11 <h1><f:render
section=Title /></h1>
12 <f:render
section=Content />
13 </body>
14 </html>
Listado 6: Un Diseo
Simple
01 <?php
02 namespace Roxy\Peliculas\Domain\
Repository;
03
04 use TYPO3f\FLOW3\Annotations as FLOW3;
05
06 /**
07 * @FLOW3\Scope(singleton)
08 */
09 class MovieRepository extends
\TYPO3\FLOW3\Persistence\Repository {
10 }
11 ?>
Listado 4: La Clase MovieRepository
01 <?php
02 namespace Roxy\Movies\
Controller;
03 use TYPO3\FLOW3\Annotations as
FLOW3;
04 use TYPO3\FLOW3\MVC\
Controller\ActionController;
05 use \Roxy\Movies\Domain\Model\
Movie;
06
07 /**
08 * @FLOW3\Scope(singleton)
09 */
10 class MovieController extends
ActionController {
11
12 /**
13 * @FLOW3\Inject
14 * @var
\Roxy\Movies\Domain\
Repository\MovieRepository
15 */
16 protected
$MovieRepository;
17
18 /**
19 * @return void
20 */
21 public function
indexAction() {
22
$this->view->assign(movies,
$this->MovieRepository->
findAll());
23 }
24
25 // ...
Listado 5: Extracto de la Clase MovieController
DESARROLLO FLOW 3
52
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
la vista sea inmediatamente consciente de
la lista de pelculas por el nombre de
Movies. Los desarrolladores web pueden
utilizar este nombre para direcciones y reu-
tilizar las pelculas en el diseo de las planti-
llas.
En segundo plano, la vista lanza el
motor de plantillas Fluid, integrado con
FLOW3. El motor genera a continuacin el
sitio web terminado desde los ficheros
HTML en los directorios Roxy.Movies/
Resources/ Private/ Layouts/ y Roxy.
Movies/Resources/Private/ Templates/. Si
queremos crear las pginas de una manera
diferente, no tenemos que escribir nues-
tras propias clases para las vistas y pasar-
las al controlador.
En este ejemplo, Fluid primero va a la
plantilla Roxy.Movies/Resources/Private/
Layouts/Default.html. Contiene el diseo o
la estructura bsica para un sitio web. Podr-
amos aadir un logotipo de la compaa
para mostrarlo en cualquier pantalla de la
aplicacin. En este sencillo ejemplo, el
diseo es simplemente una pgina de
HTML (Listado 6).
Plantillas de Fluid
Las extraas etiquetas que comienzan con
<f: son marcadores de posicin que Fluid
reemplaza con otras partes de HTML, cono-
cidas como secciones. El ejemplo de diseo
contiene dos secciones: Title y Content. Otro
fichero (Listado 7) define la apariencia de
estas secciones. En este ejemplo, es almace-
nado en Roxy.Movies/Resources/ Private/
Templates/Movie/Index.html. El fichero
contiene todas las secciones para el diseo
del fichero Default.html, como indica la pri-
mera lnea en el Listado 7.
La seccin Title slo contiene el texto
Lista de pelculas. La seccin Content (lnea
5) es ms compleja. Fluid primero com-
prueba si el controlador ha pasado una lista
de pelculas, como en la lnea <f:if condi-
tion={movies}>. Se accede a la variable
entre llaves asignada en la vista anterior con
assign(). Si la variable est vaca es decir,
no existen pelculas todo lo que veremos
es una notificacin en la pantalla: No se han
creado pelculas todava (lnea 19). De otra
forma, el bucle for each entre las lneas 9 y
15 realizar iteraciones entre las pelculas
existentes y crear los tres enlaces para cada
pantalla, edicin y borrado (lneas de la 11 a
la 13). Cuando el usuario realiza un clic en
el enlace anterior, el controlador ejecutar la
accin definida en action, como lanzar la
funcin editAction(), que recibir la pelcula
actual (arguments=...) como un argu-
mento.
En este ejemplo, la automatizacin no
funciona perfectamente. Una vez que el
usuario crea una pelcula, su nombre desa -
parece de la lista. El malhechor aqu est
oculto en la lnea 11 de la plantilla, donde
{movie.name} se pasa a la salida. Sin
embargo, el objeto Movie no tiene un atri-
buto nombre, en vez de eso, debera ser
title:
<f:link.action action=showU
arguments={movie: movie}>U
{movie.title}</f:link.action>
Hasta el momento, no hemos programado
ni una sola lnea de cdigo. FLOW3 ha
generado todas estas clases automtica-
mente.
FLOW3 fuerza a los desarrolladores al
uso consistente de conceptos modernos de
programacin. Aunque esto podra parecer
paternalista a primera vista, ayuda a simpli-
ficar el trabajo de desarrollo, especialmente
en proyectos largos. Contribuye a evitar
errores y mantiene la sobrecarga de mante-
nimiento al mnimo.
A diferencia de otros frameworks de
PHP basados en componentes, no pode-
mos extraer partes individuales de FLOW3
y utilizarlas por separado. Para compen-
sar, los desarrolladores prometen que las
aplicaciones desarrolladas en FLOW3
soportarn migraciones fciles como
extensiones de TYPO3 Phoenix ms ade-
lante.
El Futuro
En este artculo, slo hemos comentado una
pequea parte de las capacidades de
FLOW3. Si quieres conocer ms, tmate
algo de tiempo en leer la excelente docu-
mentacin, aunque no est completamente
terminada [7]. Los huecos se pueden relle-
nar con las listas de correo y un canal de
IRC sobre FLOW3, donde puedes conocer a
desarrolladores.
La hoja de ruta para las inminentes ver-
siones de FLOW3 1.1 y 1.2 ya est fijada.
El framework ser ms gil y tendr un
repositorio de paquetes, que actuarn
como extensiones de repositorio en
TYPO3, parecido a un mercado de exten-
siones.
01 <f:layout name=Default />
02
03 <f:section name=Title>Lista
de pelculas</f:section>
04
05 <f:section name=Content>
06 <f:if condition={movies}>
07 <f:then>
08 <ul>
09 <f:for each={movies}
as=movie>
10 <li>
11 <f:link.action
action=show
arguments={movie:
movie}>{movie.name}</f:link.a
ction>
12 <f:link.action
action=edit
arguments={movie:
movie}>Edit</f:link.action>
13 <f:link.action
action=delete
arguments={movie:
movie}>Delete</f:link.action>
14 </li>
15 </f:for>
16 </ul>
17 </f:then>
18 <f:else>
19 <p>No se han creado
pelculas todava.</p>
20 </f:else>
21 </f:if>
22 <p><f:link.action
action=new>Crear una nueva
pelcula</f:link.action></p>
23 </f:section>
Listado 7: Plantilla Index.html
RECURSOS
[1] Flow3: http:// flow3. typo3. org/
[2] Proyecto Doctrine:
http:// www. doctrine-project. org
[3] Lista de controladores PDO:
http:// www. php. net/ manual/ de/ pdo.
drivers. php
[4] XAMPP: http:// www. xampp. org
[5] Yaml:
http:// de. wikipedia. org/ wiki/ YAML
[6] Namespaces en PHP:
http:// php. net/ manual/ en/ language.
namespaces. php
[7] Documentacin para Flow3:
http:// flow3. typo3. org/
documentation. html
[8] Soporte para Flow3:
http:// flow3. typo3. org/ support. html
Migracin de Apps (II) DESARROLLO
clase. Dentro de las actividades estaban
las AsyncTasks para uso del programa-
dor de la interfaz, que poda utilizar los
datos, independientemente de si tenan
relacin con alguna parte de la interfaz.
A partir de Android 3 existe el Loader
para esta actividad.
CursorLoader
Por desgracia, al parecer las aplicaciones
de los programadores no fueron toma-
das en cuenta. El marco de toda la clase
H
asta la versin 2 de Android, el
SQLiteOpenHelper era la herra-
mienta a elegir. As, las bases
de datos para el desarrollo de un pro-
yecto se encontraban en un lugar cen-
tral y accesibles para el desarrollador de
la interfaz grfica. El SQLiteOpenHelper
pona a nuestra disposicin varios
mecanismos para manipular la base de
datos SQLite: desde la creacin y actua-
lizacin de la base de datos, hasta
manipular estos datos con una sub-
funciona solamente con el ContentProvi-
der y dej de funcionar con el cursor.
Esto es comprensible, ya que el objeto
cursor slo se carga mediante el Loader.
En los tiempos previos al CursorLoader,
el programador deba cargarlo por su
cuenta y an cuando estuviera traba-
jando correctamente, era necesario utili-
zar tareas independientes. Esta labo-
riosa tarea no ser parte del trabajo del
desarrollador nunca ms, ya que ahora
el CursorLoader se hace cargo de ello.
En la primera parte de este taller te mostramos los ajustes necesarios, los nuevos fragmentos y las especifica-
ciones. En esta segunda parte te explicamos los cambios realizados en la base de datos, la nueva ActionBar y
las modificaciones realizadas en las preferencias del sistema.
POR HARALD WILHELM
De Android 2 a Android 4 en siete pasos
Parte 2
DE 2 A 4
D
e
n
i
s

F
o
n
c
h
i
k
o
v
,

1
2
3
R
F
53
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
DESARROLLO Migracin de Apps (II)
54
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
gestin del Cursor. Por eso, el mtodo
startManagingCursor() que era tan
importante en Android 2, ha quedado
ahora obsoleto.
En vez de eso, ahora es necesario
crear un SimpleCursorAdapter y aso-
ciarlo con la lista. Los parmetros del
Cursor los dejamos a cero, para que los
nuevos CursorLoaders puedan permitir
el intercambio dinmico de cursores.
Con initLoader() pones en marcha la
adquisicin de datos. Con onCreateLoa-
der() se insta al fragmento a proporcio-
nar el CursorLoader. Una vez que ten-
gas los datos es necesario notificar con
onLoadFinished(), para que el frag-
mento y el cursor sean reconocidos por
el Adapter.
La base de datos
Al utilizar el CursorLoader tienes todos
los mtodos de acceso a la base de
Aunque en la documentacin de
Android, se especifica en varios lugares
que el ContentProvider slo est desti-
nado para el acceso externo, no se
puede pasar una cadena de consulta en
el CursorLoader. Por lo tanto, el acceso
mediante el CursorLoader a datos loca-
les o internos de una app sin el Content-
Provider no es posible.
En nuestra app de ejemplo utilizamos
un truco para no tener que mover el
manejo de una base de datos a un Con-
tentProvider. Es posible leer la lista de
entradas sin el ContentProvider si se crea
una copia de la clase AsyncTaskLoader
(MyCursorLoader). De este modo, la
nueva app utiliza cmodamente el Loa-
der, tal y como lo muestra el Listado 1.
El nuevo Loader se hace cargo de la
recuperacin de datos asncrona, por
medio de Callbacks sobre el estado
actual y es tambin responsable de la
datos, que tambin podrs supervisar,
tal y como lo hara una subclase del
SQLiteOpenHelper. Podrs abrir y
cerrar la base de datos con la app de la
tablet desde un punto central. Con este
fin se ofrece una subclase de la aplica-
cin (MyApplication). Para que
Android reconozca esta clase, es nece-
sario darla de alta en application y
luego (android:name=MyApplica-
tion). Al igual que en Java, con
Android existen muchos caminos para
llegar al mismo destino. Depende del
programador utilizar las clases de la
aplicacin o Singletons para la manipu-
lacin de la base de datos, o abrirla en
cada fragmento o Activity. El mtodo
utilizado depender de la experiencia
de cada programador.
Como ltima opcin se puede trabajar
con una instancia central de la base de
datos, ignorando el ContentProvider y
la reutilizacin de los fragmentos recor-
tados. El fragmento de nuestro ejemplo
debe tener acceso a la instancia de la
base de datos mientras se haga uso del
ContentProvider. La pregunta sobre las
razones para recortar la base de datos
se responden en ese momento. Para una
aplicacin pequea como la que utiliza-
mos en nuestro ejemplo esto funciona
bien. Cada desarrollador debe pregun-
tarse desde el inicio del proyecto exacta-
mente cmo quiere reutilizar los frag-
mentos. Si tienes dudas de cmo
hacerlo, entonces deberas utilizar el
ContentProvider.
La ActionBar
An con las pocas manipulaciones que
se hacen en el fichero del Manifiesto,
as como en las declaraciones del Men,
la vieja app utiliza la ActionBar,
La ActionBar es una combinacin del
conocido men de opciones, una barra
de ttulo y de algunas otras caractersti-
cas. Las entradas importantes del men
se pueden localizar permanentemente
en posiciones visibles, con o sin iconos.
Otras opciones, que no se ven a simple
vista, se encuentran en las apps de
Android 4 haciendo clic sobre el men
de expandir (el smbolo con los tres
puntos verticales).
Las entradas del men se pueden
agrupar como se ha hecho habitual-
mente. Adems, se pueden desactivar y
reiniciar mediante el Spinner desde la
ActionBar. Un ejemplo sera una cuenta
Listado 1: CursorLoader sin ContentProvider
01 public class MyCursorLoader extends AsyncTaskLoader<Cursor> {
02
03 // Un constructor nuevo ...
04 public MyCursorLoader(final Context context, final String selection,
final String[] selectionArgs) {
05 super(context);
06
07 this.observer = new ForceLoadContentObserver();
08 this.selection = selection;
09 this.selectionArgs = selectionArgs;
10 }
11
12 // ... y un mtodo parcheado
13 @Override
14 public Cursor loadInBackground() {
15 Cursor cursor = null;
16
17 if (uri != null) {
18 cursor = getContext().getContentResolver().query(uri, projec-
tion, selection, selectionArgs, sortOrder);
19 } else if (selection != null) {
20 // nuevo
21 cursor = MyApplication.getSqliteDatabase().rawQuery(selec-
tion, selectionArgs);
22 }
23
24 if (cursor != null) {
25 cursor.getCount();
26 registerContentObserver(cursor, observer);
27 }
28
29 return cursor;
30 }
31 }
55
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
de correo: en un pequeo tringulo del
lado inferior derecho del Spinner se
encuentra la lista de opciones, que se
despliega con un clic. En el programa
del correo electrnico puedes navegar
entre diferentes cuentas de correo.
El nuevo atributo (opcional) show
AsAction manipula la visibilidad de la
ActionBar. La opcin ifRoom se mues-
tra, tal y como indica su nombre, slo
cuando hay suficiente espacio en la
ActionBar. De otro modo, slo es visible
cuando el usuario selecciona el men
de Overflow (Listado 2).
Pero presta atencin, la nueva Action-
Bar tiene una diferencia muy drstica
en comparacin con el men de opcio-
nes de antes: siempre est visible. Mien-
tras que sin utilizar la ActionBar, pue-
des cargar el men con la respectiva
tecla (onCreateOptionsMenu()) y des-
pus prepararlo (onPrepareOptions-
Menu()), estas entradas no estarn visi-
bles en la ActionBar. Ahora es tarea del
desarrollador especificar explcitamente
cundo se deben mostrar u ocultar las
entradas del men. No es suficiente
tener ActionBar y esperar pasivamente
a los Callbacks.
Las Preferencias
Incluso en los ajustes existe una nueva
clase dentro del nuevo paradigma de
framentos PreferenceFragment.
Siguiendo su lema de todo es reutiliza-
ble, ahora el PreferenceActivity que
sola ser un nico bloque, puede ser
particionado y ordenado segn tus pre-
ferencias.
Para aprovechar este nuevo esquema
al mximo, se requieren los llamados
preference-header. Cada uno de estos
Header representa un fragmento, que se
encarga de sus propios ajustes indivi-
dualmente. Mediante el uso de este
header puedes obtener una vista atrac-
tiva, como las que ests acostumbrado
a ver en las apps actuales de tu tablet
(Figura 1). En el ejemplo del Listado 3,
el ActivityPreference carga el Header de
un fichero XML. As se cargan los dos
fragmentos nuevamente y sus respecti-
vos diseos del correspondiente archivo
XML (fragmentpreference1.xml, etc.).
Este desglose tiene naturalmente una
desventaja. Tres elementos de cdigo
diferentes se encargan del todo. En el
ejemplo, se resuelve utilizando el Acti-
vityPreference como punto en comn
para todas las consultas. Para probar, si
un Checkbox concreto est activado, se
comprueba con el Activity y a su vez
esta consulta se enva al fragmento
especfico, tal y como lo muestra el Lis-
tado 5.
Conclusin
Con muy pocos, exactamente con tres
cambios mnimos, se puede obtener
una nueva app (al menos visualmente)
a partir de una vieja de un smartphone.
Pero eso no significa que ya sea una app
para tu tablet. En este taller se ha
hablado de distintas tcnicas para obte-
ner una app moderna en tus manos. Sin
embargo, esto no significa que a partir
de una app de telfono se pueda obte-
ner una app de tablet con un par de
pequeos cambios. Por ejemplo, en este
taller no hemos utilizado el ContentPro-
vider como ubicacin de la base de
datos. Si se decidiera hacer este cambio,
habra que retocar todo. Es por eso que
a veces es bueno empezar desde cero.
El SDK actual de Android soporta
toda clase de dispositivos: no hay dife-
rencia entre un smartphone o una
tablet, cada desarrollador es capaz de
programar apps especficas para una
determinada clase de dispositivos. Pero
las apps combinadas son de gran ayuda
para hacer paquetes compatibles.
Desgraciadamente, Google no slo
ampli el rbol de clases, sino que al
mismo tiempo las modific radical-
Listado 3: Viejo vs. nuevo Cargar el men
01 // Alt
02 @Override
03 public boolean onPrepareOptionsMenu(Menu menu) {
04
05 // Adaptaciones dinmicas
06
07 return super.onPrepareOptionsMenu(menu);
08 }
09
10 @Override
11 public boolean onCreateOptionsMenu(Menu menu) {
12 super.onCreateOptionsMenu(menu);
13
14 MenuInflater menuInflater = new MenuInflater(this);
15 menuInflater.inflate(R.menu.activitydetails, menu);
16
17 return true;
18 }
19
20 // Nuevo
21 setHasOptionsMenu(true);
22
23 @Override
24 public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) {
25 super.onCreateOptionsMenu(menu, menuInflater);
26
27 menu.clear();
28
29 menuInflater.inflate(R.menu.fragmentdetails, menu);
30 }
Listado 2: Opciones en la nueva ActionBar
01 <item
02 android:icon=@drawable/ic_menu_preferences
03 android:id=@+id/men_preferences
04 android:showAsAction=ifRoom|withText
05 android:title=@string/txt_preferences />
Migracin de Apps (II) DESARROLLO
camente para esta versin. Las funcio-
nes comunes se almacenarn en el pro-
yecto de la librera de Android y de este
modo, se tendrn apps diferentes segn
sea el dispositivo en que se vayan a uti-
lizar.
Continuar?
Google apuesta por el desarrollo de
Android a un ritmo muy acelerado. Por
otro lado, tambin existen las contribu-
ciones, que son desarrolladas por pro-
gramadores independientes de acuerdo
a sus propios deseos para el sistema
Android. Por lo tanto, es de esperar que
el desarrollo se siga dando a este ritmo
acelerado. Quiz sera ms recomenda-
ble que en vez de tantas nuevas versio-
nes, hubiera una fase de estabilizacin
con Jelly Bean.
mente. La cantidad de clases y mtodos
que ya no se utilizan es muy grante.
Hasta las mismas apps para smartpho-
nes se han visto afectadas por la migra-
cin a Android 4. Por esta complejidad,
se ofrecen apps desarrolladas especfi-
DESARROLLO Migracin de Apps (II)
56
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
DESARROL
Figura 1: Vista del nuevo Preference Design de Android 4.0 con Header.
Listado 5: Consulta de
preferencias
01 // Activity
02 public static boolean isItem1()
{
03 return FragmentPrefer-
ence1.isItem1();
04 }
05
06 // Fragmento
07 public static boolean isItem1()
{
08 return item1;
09 }
Listado 4: Cargar PreferenceHeader
01 // Activity
02 @Override
03 public void onBuildHeaders(List<Header> target) {
04 loadHeadersFromResource(R.layout.activitypreference, target);
05 }
06
07 // Recurso XML
08 <preference-headers
09 xmlns:android=http://schemas.android.com/apk/res/android>
10
11 <header
12 android:fragment=de.asltd.androiduser.a4.FragmentPreference1
13 android:title=@string/txt_header1_short
14 android:summary=@string/txt_header1_long />
15
16 <header
17 android:fragment=de.asltd.androiduser.a4.FragmentPreference2
18 android:title=@string/txt_header2_short
19 android:summary=@string/txt_header2_long />
20 </preference-headers>
Perl: Evernote y GTD DESARROLLO
00-Inbox de modo que Evernote ordena
el directorio hasta el final. En la bandeja
(vase la Figura 2) van todas las investiga-
ciones para las cuales el usuario deter-
mina posteriormente la siguiente etapa de
procesamiento. Si el paso tarda menos de
dos minutos, el usuario tendr que
hacerle frente de inmediato, de lo contra-
rio, la tarea se vuelca en una carpeta de
un proyecto especfico.
Podemos configurar un sistema de
recordatorios con Evernote que es similar
a un pedazo de papel en archivos fsicos.
El cuaderno 01-Tickler contiene entradas
individuales con la fecha de la accin en
formato YYYY-MM-DD en la lnea del
asunto. Con la API de Evernote, una tarea
de cron que se ejecuta una vez al da abre
el cuaderno de recordatorios Tickler,
revisa todas las entradas y comprueba si
una entrada de fecha es para el da
siguiente (vase la Figura 3). Si es as, el
script lleva la notificacin a la bandeja de
entrada del usuario, y el usuario estar
feliz al ver que ahora puede completar el
siguiente paso de un pequeo proyecto.
Planificacin con Tickler
La entrada 2013-01 planear vacaciones
de verano me recuerda que debo reser-
var un vuelo para mis vacaciones en
agosto ya en enero de 2013 y el cronjob
saca esta entrada del cuaderno de recor-
datorios Tickler el 31 de diciembre de 2012
y lo pone en mi bandeja de entrada para
que pueda abrir un nuevo proyecto Plan
de Vacaciones e iniciar la accin (echar
un vistazo a las ofertas de Lufthansa).
Y, la entrada Tickler 2012-04-14: Smith
ha terminado la versin para Linux auto-
mticamente cae en mi bandeja de
entrada en la tarde del 13 de abril, lo que
me permite recordar a mi muy sorpren-
dido colega sobre la fecha lmite de la
liberacin que haban prometido semanas
antes.
Para reanimar proyectos temporalmente congelados, los usuarios de Getting Things Done ordenan carpe-
tas etiquetadas por fecha y revisan regularmente estos archivos de recordatorio. Por contra, Perl y Evernote
envan recordatorios automticamente a los usuarios. POR MICHAEL SCHILLI
Getting Things Done con Evernote y Perl
Inolvidable
57
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
E
l mtodo de productividad Getting
Things Done (GTD) del autor
superventas David Allen [2] pro-
mete una mente como el agua, paz espi-
ritual y flexibilidad extrema de un lucha-
dor de Karate en el dominio de la vida coti-
diana. La regla bsica: no cargarse con
tareas para las que no se puede gestionar
de inmediato el siguiente paso, sino archi-
varlas en un sistema sistema de pedidos
(vase la Figura 1).
Si te Gusta el Papel
Los archivos tienen etiquetas de los das
del mes y los meses del ao. Si un colega
anuncia un resultado para el da 14 de un
mes, los discpulos de GTD escriben una
hoja de papel con las cifras clave y la arro-
jan a la carpeta con el nmero 14. Y, para
comenzar a planificar las vacaciones de
verano en enero, ya que an hay vuelos
baratos, un trozo de papel con la direccin
URL del sistema de reservas en lnea ter-
mina en la carpeta con la etiqueta Enero.
Si marcamos las carpetas regularmente,
nos daremos cuenta de que existen ciertas
tareas para el da siguiente o el mes que
viene. Ante el asombro del mundo desor-
ganizado en torno a ellos, los seguidores
de GTD se hacen cargo de estas tareas con
puntualidad y examinan con fiabilidad si
los plazos prometidos realmente se dieron.
Automatizar con Evernote
Como ya he mencionado en un artculo
anterior [3], la versin bsica y gratuita
del servicio Evernote [4] es una
bendicin si deseamos
optimizar las tareas
diarias en lnea
con GTD. El
usuario
define una
bandeja de
entrada
como
DESARROLLO Perl: Evernote y GTD
58
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
generados automti-
camente en el sub-
directorio gen-perl
cuando se inicia la
tarea de cron. El
mdulo local::lib de
CPAN asegura que
encontrar los
mdulos de CPAN
instalados en el
directorio home del
usuario. La lnea 31
inicializa Log4perl,
que escribe instruc-
ciones de depura-
cin a un archivo de
log que nos dice lo
que el script est
haciendo mientras
se est ejecutando.
Este paso es particu-
larmente til si utili-
zamos una tarea de
cron para lanzar un
script: el registro
ayuda a encontrar
las causas de los
errores y eliminarlos
ya que el proceso no
est conectado a
ningn terminal.
Adems del nivel de
registro $DEBUG,
tambin limita la
salida a la categora
Main para limitar
el registro al pro-
grama principal y
suprimir la salida de
mdulos de CPAN
con soporte incor-
porado de Log4perl.
La Figura 4 muestra los datos de log de
una ejecucin del script exitosa.
Ciruga a Corazn Abierto
La lnea 68 autentica al usuario contra el
servidor web de Evernote. Si la contrasea
y la clave del consumidor son correctas, se
da al script lectura sin restricciones y
acceso en escritura. Debido a que estamos
manejando informa-
cin confidencial
que no queremos
perder, se reco-
mienda precaucin
durante la progra-
macin. Al mismo
tiempo, deberamos
Gracias a la API Web de Evernote, imple-
mentar la aplicacin del Tickler es bas-
tante sencillo. En una entrega anterior de
esta seccin de Perl [3] se detalla cmo el
protocolo Thrift trabaja con Perl y cmo
los programadores de aplicaciones pueden
recoger una clave de aplicacin desde la
pgina web de Evernote. Equipado con los
permisos, los desarrolladores pueden
empezar a publicar sus scripts en contra de
la caja de arena de Evernote, y una vez que
todos los errores hayan sido resueltos, soli-
citar el acceso al servidor de produccin.
En el Listado 1, el bloque BEGIN inicial-
mente cambia al directorio $Bin, donde
reside el script, para asegurarse de que ser
capaz de encontrar los mdulos thrift
asegurar que el script slo se ejecuta en un
sistema seguro tras un cortafuegos para
evitar la exposicin de las credenciales en
los sistemas ms fcilmente comprometi-
bles, como servidores web orientados a
Internet.
Para buscar las entradas del cuaderno
01-Tickler, el script necesita ahora el
GUID del cuaderno. La lnea 105 itera en
todos los cuadernos de esta cuenta y com-
prueba si el cuaderno actual tiene este
nombre. Lo mismo se aplica a 00-Inbox.
El script evernote-tickler vuelca los GUID
para cada uno en las variables
$tickler_guid y $inbox_guid respectiva-
mente, y en el archivo de log si las encuen-
tra. Si no es as, las lneas 126 y 131 termi-
nan el programa con un error: no tendra
sentido procesar una cuenta que no tena
esas carpetas.
La API de Evernote no ofrece una fun-
cin de directorio para buscar notas en un
cuaderno especfico, sino que insiste en
que se utilice un mtodo findNotes() que
busca en todos los cuadernos en busca de
notas. Dicho esto, un filtro de tipo EDAM-
NoteStore::NoteFilter, armado con el par-
metro notebookGuid, restringir la bs-
queda a un cuaderno con el GUID especifi-
cado.
El segundo parmetro para findNotes()
especifica un desplazamiento, con el que
podremos crear paginacin para notas que
encontremos. En el ejemplo, el script
obtiene la lista completa de eventos y uti-
liza un tercer parmetro para restringir la
lista a 50 entradas, lo cual debera ser sufi-
ciente incluso para las listas ms largas.
Debido a que Evernote limita el nmero
mximo de cuadernos devueltos por lla-
mada a 50, tendremos que trabajar con un
desplazamiento y llamadas mltiples si
queremos ms.
La lnea 151 utiliza el mdulo CPAN
DateTime para calcular la fecha de
maana sumando un nico da a la fecha
de hoy (today()). El mtodo ymd() con-
vierte el objeto resultante DateTime en una
cadena con el formato YYYY-MM-DD. La
expresin regular de la lnea de 115 corta la
fecha fuera de la lnea de asunto (title())
Figura 2: La bandeja de entrada del usuario muestra inicialmente un
nico artculo capturado de la web
Figura 3: pero tras ejecutar la tarea programada del sistema de
recordatorios Tickler, la cita de maana con el dentista termina en la
bandeja de entrada.
Figura 4: La tarea de cron ha encontrado una entrada Tickler para el
da siguiente y la lleva a bandeja de entrada del usuario.
Photo: Ben Christen
Figura 1: Sistema Tickler para gestionar notas.
Perl: Evernote y GTD DESARROLLO
Listado 1: evernote-tickler
001 #!/usr/local/bin/perl -w
002 #############################
003 # evernote-tickler
004 # Mike Schilli, 2012
005 # (m@perlmeister.com)
006 #############################
007 use strict;
008
009 BEGIN {
010 use FindBin qw($Bin);
011 chdir $Bin;
012 }
013
014 use local::lib;
015 use Thrift;
016 use Thrift::HttpClient;
017 use Thrift::BinaryProtocol;
018
019 use lib gen-perl;
020 use EDAMUserStore::Constants;
021 use EDAMUserStore::UserStore;
022 use EDAMNoteStore::NoteStore;
023 use EDAMNoteStore::Types;
024 use EDAMErrors::Types;
025 use EDAMTypes::Types;
026 use DateTime;
027 use Log::Log4perl qw(:easy);
028
029 my ($home) = glob ~;
030
031 Log::Log4perl->easy_init(
032 {
033 level => $DEBUG,
034 category => main,
035 file => >>$home/data/ .
036 evernote-tickler.log
037 }
038 );
039
040 my $username = my-user;
041 my $password = my-passwd;
042 my $consumer_key =
043 perlsnapshot;
044 my $consumer_secret =
045 my-consumer-secret;
046
047 my $evernote_host =
048 evernote.com;
049 my $user_store_uri =
050 https://$evernote_host
051 . /edam/user;
052 my $note_store_uri_base =
053 https://$evernote_host
054 . /edam/note/;
055
056 my $http_client =
057 Thrift::HttpClient->new(
058 $user_store_uri);
059 my $protocol =
060 Thrift::BinaryProtocol
061 ->new($http_client);
062
063 my $client =
064 EDAMUserStore::
UserStoreClient
065 ->new($protocol);
066
067 my $result =
068 $client->authenticate(
069 $username,
070 $password,
071 $consumer_key,
072 $consumer_secret
073 );
074
075 my $user = $result->user();
076
077 my $note_store_uri =
078 $note_store_uri_base
079 . $user->shardId();
080
081 my $note_store_client =
082 Thrift::HttpClient->new(
083 $note_store_uri);
00 16 * * * U
/path/evernote-tickler
asegurar que Tickler se pone en marcha
todos los das a las cuatro de la tarde y que
encontraremos una coleccin de tareas
para el da siguiente en la bandeja de
entrada. Si esa no es una buena hora para
retomar un proyecto, no obstante, pode-
mos corregir la fecha y poner la nota de
nuevo en el cuaderno Tickler.
Para los eventos crticos con la hora,
tales como reuniones, los usuarios pueden
programar citas en una aplicacin de
calendario. Y, si los usuarios pueden
manejar el siguiente paso hacia la conclu-
sin de la tarea y el paso lleva menos de
dos minutos, lo harn inmediatamente de
acuerdo con GTD. De lo contrario, se cre-
ar una nueva nota en un cuaderno que
muestra todos los proyectos principales y
los prximos pasos. Luego, puedes selec-
cionar un elemento de la lista para su pro-
cesamiento inmediato en funcin del
estado de nimo, nivel de energa y el con-
texto.
de la nota y la deposita en la variable
$date_in_title.
La condicin if de la lnea 169 com-
prueba si la fecha del ttulo, coincide total
o parcialmente con la fecha de maana.
Especificando de un mes (YYYY-MM) o
una fecha especfica (YYYY-MM-DD) por
tanto devolver coincidencias. La API web
de Evernote no proporciona un comando
para mover, lo que explica el porqu la
lnea 177 copia la entrada del Tickler a la
bandeja de entrada del usuario si la fecha
coincide. La copia que permanece en el
cuaderno Tickler se elimina posterior-
mente con el mtodo deleteNote() de la
lnea 191.
Cron Confiable
Una entrada en nuestro crontab con el
siguiente formato
DESARROLLO Perl: Evernote y GTD
60
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
DESARROL
[1] Listados de este artculo:
http:// www. linux-Magazine. es/
Magazine/ Downloads/ 90
[2] Allen, David.Getting Things Done:
The Art of Stress-Free Productivity.
Penguin, 2002:
http:// www. amazon. com/ dp/
0142000280
[3] Recuerda esto por Michael Schilli,
Linux Magazine nmero 86.
[4] Evernote: http:// www. evernote. com
RECURSOS
Listado 1: evernote-tickler (Cont.)
084
085 my $note_store_protocol =
086 Thrift::BinaryProtocol
087 ->new($note_store_client);
088
089 my $note_store =
090 EDAMNoteStore::
NoteStoreClient
091 ->new(
092 $note_store_protocol);
093
094 my $notebooks =
095 $note_store->listNotebooks(
096 $result
097 ->authenticationToken(
098 )
099 );
100
101 my $tickler_guid;
102 my $inbox_guid;
103
104 for
105 my $notebook (@$notebooks)
106 {
107 if ($notebook->name() eq
108 01-Tickler)
109 {
110 $tickler_guid =
111 $notebook->guid();
112 DEBUG
113 Found Tickler notebook;
114 }
115 if ($notebook->name() eq
116 00-Inbox)
117 {
118 $inbox_guid =
119 $notebook->guid();
120 DEBUG
121 Found Inbox notebook;
122 }
123 }
124
125 if (!defined $tickler_guid) {
126 die
127 No Tickler notebook found;
128 }
129
130 if (!defined $inbox_guid) {
131 die
132 No Inbox notebook found;
133 }
134
135 my $filter =
136 EDAMNoteStore::NoteFilter
137 ->new();
138 $filter->notebookGuid(
139 $tickler_guid);
140
141 my $note_list =
142 $note_store->findNotes(
143 $result
144 ->authenticationToken(
145 ),
146 $filter, 0,
147 50
148 );
149
150 my $tomorrow =
151 DateTime->today(
152 time_zone => local)
153 ->add(days => 1);
154 my $tomorrow_date_match =
155 $tomorrow->ymd();
156
157 for my $note (
158 @{ $note_list->{notes} })
159 {
160 my $title = $note->title();
161
162 my ($date_in_title) =
163 ($title =~ /^(\S+)/);
164
165 DEBUG Check if ,
166 $tomorrow_date_match ,
167 matches $date_in_title;
168
169 if ($tomorrow_date_match =~
170 /^$date_in_title/)
171 {
172
173 DEBUG $title matches. ,
174 Move to Inbox.;
175
176 my $worked =
177 $note_store->copyNote(
178 $result
179 ->authenticationToken(
180 ),
181 $note->guid(),
182 $inbox_guid
183 );
184
185 die copy note failed ($!)
186 if !defined $worked;
187
188 DEBUG Deleting note in ,
189 Tickler file;
190
191 $note_store->deleteNote(
192 $result
193 ->authenticationToken(
194 ),
195 $note->guid()
196 );
197 }
198 }
61
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
S
i algo fuera mal en alguno de mis
sistemas, los tengo configurados
para que me enven un correo
electrnico afortunadamente, nunca he
experimentado una situacin en la que
Postfix deje de funcionar. Normalmente,
utilizo los comandos de mail para esto.
Sin embargo, es complicado si se quiere
adjuntar un fichero, como un volcado o
un grfico de Munin. Algunos entornos
convierten datos binarios en ASCII y
crean las cabeceras necesarias, de esta
forma se puede realizar todo con el
comando mail sin ningn tipo de pro-
blema, pero la vida es mucho ms fcil
con la herramienta correcta de trabajo.
Esta herramienta se llama Biabam [1].
El nombre parece que viene de un tipo
de Dadaismo de principios del siglo XXI,
pero afortunadamente, eso es slo lo
malo de esta herramienta con total sin-
ceridad, no tengo ni idea de lo que signi-
fica el nombre. Pero sigamos. Si se quie-
ren adjuntar dos imgenes en un correo
electrnico y enviarlas a dos destinata-
rios diferentes, el comando ser algo
parecido a:
echo Malfunction, U
see graphics |U
biabam /opt/scripts/U
El Da a Da del Administrador de Sistemas: Biabam y Tre-agrep
Toma Dos
comercial, tre-agrep est disponible bajo
una licencia BSD ms liberal. Tre-agrep
proporciona un mtodo simple para aa-
dir niveles de seleccin de borrosidad
para cualquier bsqueda. Por ejemplo, si
se quiere buscar en el fichero de registros
example.com con una borrosidad
mxima de dos caracteres, se debera de
teclear lo siguiente:
tre-agrep U
-2 example.com /var/U
log/mail.log
El resultado se muestra en la Figura 1: lo
que permite es una desviacin de dos
caracteres en la bsqueda, incluso
encontrar coincidencias si se escribe
mal el nombre en este caso, el mensaje
podra ser exmaple.com.
La mayora de las aplicaciones que se muestran en esta columna son pequeas, rpidas, funcionales y se
explican de forma clara. Esta vez no va a ser una excepcin. Se va a presentar un do dinmico de herramien-
tas. POR CHARLY KHNAST
La Columna de Charly: Biabam y Tre-agrep ADMINISTRACIN
image1.png, U
/opt/scripts/U
image2.png U
-s Error on system U
Palim-Palim U
admin1@example.com, U
admin2@example.com
La salida del comando echo es un texto
que se redirige a Biabam. Hay que pasar
los binarios separados por comas en la
lnea de comandos de Biabam para crear
los adjuntos. Para ello, se debe evitar el
uso de rutas relativas. El parmetro -s
especifica el texto en la lnea del asunto.
Finalmente, las direcciones de los desti-
natarios van a continuacin, tambin
separadas por comas.
Dulcemente Borroso
La segunda herramienta de mi do din-
mico acepta ms parmetros que Bia-
bam. Treagrep [2] es una implementa-
cin nueva de Agrep [3].
A diferencia de la aplicacin original,
que no se encuentra disponible para uso
Figura 1: Tre-agrep realiza una bsqueda borrosa en el fichero mail.log, incluso encuentra
entradas del registro que estn mal escritas.
[1] Biabam: http:// freecode. com/
projects/ biabam
[2] Tre-agrep: http:// laurikari. net/ tre/
[3] Agrep: ftp:// ftp. cs. arizona. edu/ agrep/
RECURSOS
ADMINISTRACIN Inseguridades: Automatizacin
62
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
E
n el artculo del ltimo mes,
hablaba de encontrar y remediar
problemas de seguridad. En este
mes continuaremos con la automatiza-
cin administrativa. La remediacin
segura est bien, pero en algn momento
necesitaremos que los servidores hagan
cosas tiles, como ejecutar software, pro-
cesar datos y cosas as. Cmo podemos
controlar de manera eficiente cientos de
miles de sistemas, implementar y distri-
buir software y realizar los cambios de
configuraciones que necesitemos? Por
supuesto, no podemos imple-
mentar directamente en
produccin y esperar
lo mejor, por lo que
es probable que
necesitemos
soportar por
separado el
desarrollo, las
pruebas y los
grupos de pro-
duccin como
mnimo.
Puppet
Puppet [1] es una herramienta estupenda
y est escrita en Ruby [2], de manera que
corre en casi todos los SO modernos y
aunque no todos los vendedores incluyen
Puppet, los paquetes estn disponibles
para la mayora de los sistemas [3]. En
pocas palabras, Puppet nos permite ges-
tionar nuestros servidores de forma
segura. Podemos definir configuraciones
y pruebas para servidores, grupos de ser-
vidores, tipos de servidores, aplicaciones,
etc. y despus aplicarlas a nuestros siste-
mas. Por ejemplo, podemos crear
pruebas para comprobar los
permisos del sistema de
archivos y aplicarlas
posteriormente en
nuestros sistemas,
asegurndonos de
que los archivos en
/etc/ estn adecua-
damente configura-
dos o bloqueados.
Tambin podemos
definir una aplica-
cin a instalar, como
MySQL y una versin
especfica, digamos la
5.5.20. Dado que
Puppet entiende
distintos siste-
mas (por
ejemplo,
Red Hat
Enter-
prise Linux, Debian, FreeBSD) ejecutar
las rdenes apropiadas (es decir, yum,
apt-get) en cada sistema.
Puppet tambin permite herencia, lo
que nos habilita para sobrescribir valores.
Por ejemplo, Red Hat Enterprise Linux
trae MySQL 5.1.61 con actualizaciones de
seguridad (backports) relevantes, de
manera que en el ejemplo de MySQL
puede que necesitemos MySQL 5.5.20 en
todos los sistemas excepto para Red Hat
Enterprise Linux, para lo que la versin
5.1.61 con los parches (5.1.61-1.el5_2.1 en
el momento de escribir esto) est actuali-
zada.
Incluso mejor, hay mdulos de Puppet
disponibles para gestionar servicios espe-
cficos tales como Exim, Bacula y Postfix,
por nombrar algunos. La mayora de los
mdulos parecen estar alojados por varios
autores en GitHub, de manera que yendo
a GitHub y buscando Puppet lo_
que_sea deber devolvernos un mdulo
de Puppet (suponiendo que exista). Por
otra parte, Google es una buena opcin.
El mdulo Exim, por ejemplo, nos per-
mite comprobar que las listas grises estn
presentes y activadas. Estos mdulos nos
sirven de ayuda realmente con mucho del
trabajo pesado y de los problemas espec-
ficos de las aplicaciones con los que se
enfrentan los administradores.
Otro aspecto de Puppet son las comuni-
caciones seguras y autenticadas. Puppet
usa cifrado SSL con autenticacin basada
en certificado, de manera que los clientes
y servidores Puppet se autentican unos
contra otros, dificultando caer en un ata-
que (en teora no debera ser posible).
Esto es un aspecto crtico cuando se ges-
tionan servidores distribuidos en una red
grande o incluso alrededor del globo (un
hecho cada vez ms comn con la com-
putacin en nube). Un aspecto final, cr-
tico en despliegues a gran escala, es la
informacin suministrada por Puppet.
Hacer cambios en la configuracin est
bien, pero necesitamos conocer en qu
estado estn los servidores. (Surtieron
efecto los cambios? Alguien los ha des-
hecho accidentalmente o de otra
manera?)
Foreman
Con todo lo que hace Puppet, por qu
necesitaramos Foreman [4]? Por una
cosa, Foreman aade una interfaz web
realmente atractiva a Puppet, especial-
mente cuando se trata de informar y ver
Autoservicio
Combinar Puppet, Foreman, Pulp, Candlepin y Katello nos permite
implementar software y servidores automticamente y de forma
segura. POR KURT SEIFRIED
Implementando con confianza
el estado actual de los sistemas. Tambin
permite aprovisionar servidores usando
KickStart, JumpStart, Preseed, y Auto-
YaST, lo que significa que la mayora de
los sistemas Linux estn cubiertos. Kate-
llo (que veremos despus) tambin per-
mite DNS/ DHCP y LDAP, as que pode-
mos integrar fcilmente los sistemas que
hayamos creado y desplegado en la
infraestructura existente.
Pulp
Una pregunta sencilla: dnde pensamos
conseguir las actualizaciones de software
y los paquetes personalizados? Las posibi-
lidades son: si tenemos cualquier canti-
dad de sistemas, querremos ejecutar
nuestros propios repositorios de manera
que controlemos qu software se imple-
menta en qu sistemas (para actualizar el
sistema de manera segura, conociendo
que cada paquete de actualizacin dispo-
nible ha sido probado) y de manera que
podamos emplazar repositorios cerca de
nuestros sistemas (por ejemplo uno en
cada proveedor de nube que usemos).
Pulp [5] nos permite definir grupos de
paquetes, grupos de sistemas y cosas as.
Este enfoque nos permite tener reposito-
rios de desarrollo, pruebas y produccin
apuntando al sistema adecuado con lo
que, podemos fcilmente controlar las
actualizaciones de software. Un paquete
puede iniciarse en desarrollo, pasarse a
pruebas o incluso, una vez probado,
puesto en produccin o en un grupo de
produccin especfico. De esta manera,
todos nuestros sistemas sern capaces de
actualizarse. Este proceso permite actuali-
zar sistemas selectivamente y por etapas.
Por ejemplo, se puede insertar una actua-
lizacin de una biblioteca para los servi-
dores de produccin que no tienen
cerrado el software de terceros instalado y
retrasar la actualizacin de esta biblioteca
en los servidores con software de cdigo
cerrado hasta que se haya probado. O,
incluso se podra dividir los servidores
con el software de cdigo cerrado en dos
partes, actualizar la mitad de ellos y si no
se rompe nada, actualizar la otra mitad.
Pulp tambin permite personalizar soft-
ware fcilmente, insertando nuestros pro-
pios paquetes en nuestros repositorios,
teniendo nuestros propios paquetes de
configuracin SELinux (uno por cada
grupo de aplicacin) e implementar ver-
siones modificadas de software, algo que
se vuelve algo sencillo con Pulp.
Candlepin
Un aspecto de los
modernos siste-
mas virtualizados
y especialmente
de la computacin
en nube es que es
realmente sencillo
crear e implemen-
tar servidores.
Antiguamente,
implementar un
servidor general-
mente supona rdenes de compra, espe-
rar a que nos entregaran el hardware,
copiar el software, configurarlo e imple-
mentarlo. Con los sistemas modernos,
debemos implementar un centenar de
servidores en minutos con unos pocos
clics. As que si estamos usando software
del que tenemos un nmero finito de
licencias o estamos proporcionando servi-
cios que estn licenciados, necesitamos
alguna forma de gestin de derechos.
Candlepin [6] proporciona eso exacta-
mente, permitindonos crear suscripcio-
nes y gestionarlas internamente (por
ejemplo, definiendo que tenemos funcio-
nando 10 instancias de un producto
comercial) y externamente (por ejemplo,
permitiendo al cliente implementar hasta
20 instancias de un servidor). Por
supuesto, Candlepin permite algo ms
que lmites arbitrarios. Por ejemplo, pode-
mos usar autenticacin basada en certifi-
cados o nombres de usuario y contrase-
as, de manera que el cliente puede ir a
un portal de autoservicio y pagar para
recibir un producto o servicio. Tambin
permite reglas de negocio: podemos com-
partir un grupo de licencias entre varias
unidades de negocio basndonos en las
horas del da (por ejemplo, permitiendo
ms servidores en las horas laborables y
rotarlos por el globo como si siguieran al
sol).
Hay que sealar que las licencias han
incrementado su complejidad con rpi-
dos aumentos y disminuciones de utiliza-
cin. Un ejemplo sera un cliente que
compra 100 licencias de un producto,
pero en realidad quiere usar 300 licencias
al mismo tiempo, pero slo durante 8
horas al da. Ser capaz de proporcionar
este tipo de estructura de licencias se
convertir en comn y muy posiblemente
los proveedores que pueden hacer esto
sern populares entre los financieros de
los clientes.
Ahora Todo Junto Katello
Ahora nos enfrentamos a un problema
clsico del cdigo abierto: tenemos una
gran coleccin de herramientas y utilida-
des, pero necesitamos controlarlo todo de
una vez en un sistema central de gestin.
Esto es exactamente lo que hace Katello
[7]. Katello es, literalmente, un conjunto
de programas de pegado y una interfaz
web que junta Foreman, Pulp y Candlepin
(Figura 1). Adems, conseguimos una
estupenda interfaz administrativa basada
en la web y una lnea de rdenes de
Python (podemos automatizar la gestin
hasta un nivel muy alto usando estas
herramientas).
Finalmente, dado que Katello permite
diferentes roles de usuario y permisos,
podemos delegar de forma segura la
administracin, permitiendo a los desa -
rrolladores gestionar sus propios sistemas
y hacer actualizaciones limitadas para
probar los servidores por ejemplo, y
podemos restringir el trabajo pesado de
gestin de los sistemas de produccin a
unos pocos administradores de confianza.
De esta manera, diferentes departamentos
y unidades de negocio pueden compartir
un sistema central de gestin, lo que per-
mite a TI echar un ojo a todos los siste-
mas al mismo tiempo.
Inseguridades: Automatizacin ADMINISTRACIN
63
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Figura 1: Katello y componentes (reproducidos de katello.org).
RECURSOS
[1] Puppet Labs: http:// puppetlabs. com/
[2] Lenguaje Ruby:
http:// www. ruby-lang. org/ en/
[3] Descarga de Puppet: http:// projects.
puppetlabs. com/ projects/ 1/ wiki/
Downloading_Puppet
[4] Foreman:
http:// www. theforeman. org/
[5] Pulp: http:// www. pulpproject. org/
[6] Candlepin:
http:// www. candlepinproject. org/
[7] Katello: http:// katello. org/
culo, en el que vamos a dotar a nuestras
antiguallas de sensores y prestaciones
inimaginables en la poca en la que se
fabricaron, para ser la envidia entre
todos los vehculos con ms de 10 aos
de nuestro barrio.
Buscaremos la realizacin de ejemplos
sencillos y asequibles, con los que facili-
tar la conduccin o la localizacin de
nuestro vehculo, centrndonos en los
principales problemas que aparecen
cuando utilizamos un coche: el aparca-
miento y el robo.
Vehculos modernos
En esta poca de crisis es difcil embar-
carse en la compra de un coche, incluso
es algo impensable para mucha gente.
Pero, y si tuviramos la posibilidad de
aadir unos extras a nuestro coche para
darle un toque mas moderno y futurista?
Eso mismo vamos a conseguir hoy.
Realizaremos dos pequeos ejemplos
para solucionar dos de los problemas
ms frecuentes cuando se utiliza un
coche.
El primero de ellos consistir en un
sistema de aparcamiento asistido, al
estilo de los pitidos que emiten los nue-
vos vehculos a medida que se aproxi-
man a obstculos, pero enfocado nica-
mente a la parte trasera de nuestro
coche, ya que es la que ms problemas
causa. Se basar en un sensor de aproxi-
macin, en nuestro caso un sensor de
ultrasonidos bsico, muy similar al sen-
sor de la Figura 1 que tenemos disponi-
ble en la pgina web de Cooking Hacks
[1]. El uso de un tipo de sensor u otro,
nicamente nos influir en cmo tratar
C
on una casa ms que monitori-
zada y controlada gracias a los
montajes que hemos ido viendo a
lo largo de esta serie de artculos sobre
domtica, vamos a centrarnos ahora en
el control de nuestro coche.
Desde que empec la carrera, obtuve
el privilegio y el regalo de un magnfico
blido de carreras heredado de mi her-
mana que a su vez lo hered de mi
padre, un Ford Orion. Una preciosa
mquina con motor de color rojo pasin
que recorre las calles de Zaragoza con
paso lento pero seguroo como otros lo
vern, un tastarro.
Lo confieso, siempre he tenido envi-
dia de esos coches recin salidos de
fbrica con todos los extras y que presu-
men de caractersticas como me aparco
solo. Y por ello he planteado este art-
64
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Electrnica en el automvil
CUIDA
TU
COCHE
No todos tenemos un coche de ltima generacin con el que deleitarnos, pero podemos modernizarnos y
poner nuestro vehculo a la moda con la ayuda de nuestro Arduino. POR LUIS MARTN
HARDWARE Arduino
Figura 3: Esquema bsico de conexin y
patillaje del mdulo GPS.
Figura 2: Mdulo GPS utilizado para obtener
la posicin del vehculo.
K
i
r
i
l
l

C
h
e
r
e
z
o
v
-

1
2
3
R
F
.
c
o
m
Figura 1: Sensor de ultrasonidos utilizado
para medir la distancia a los obstculos.
los datos de la medida, pero como ya
hemos trabajado con muchos tipos de
sensores, esto no nos supondr ningn
problema.
Para nuestro coche, en vez de utilizar
una seal acstica, que en ocasiones
puede resultar molesta, utilizaremos una
indicacin visual basada en varios LEDs
que nos indicarn la proximidad de los
obstculos encendindose progresiva-
mente.
Para un segundo diseo, nos plantea-
remos una solucin a la prdida de nues-
tro vehculo, pudiendo ser por un robo o
porque simplemente no sabemos dnde
hemos aparcado. La misin de este ejem-
plo nicamente es la de un sistema de
posicionamiento de nuestro vehculo, y
la funcionalidad final la tendremos que
elegir nosotros como usuario. Para el
artculo, lo que haremos ser enviar la
posicin del vehculo a nuestro telfono
mvil, ya que es algo que todo el mundo
tiene a mano en la actualidad.
Al igual que estos dos ejemplos, exis-
ten otras muchas posibles aplicaciones
para nuestro coche, as que como siem-
pre lo nico que tenemos que hacer es
buscar un problema que solucionar.
Dnde est mi coche?
El principal punto sobre el que debemos
aprender algo nuevo en este artculo es
el de cmo saber dnde hemos dejado
aparcado el coche. O como se dira en
trminos ms tcnicos, cules son sus
datos de posicionamiento (altitud, lati-
tud) GPS.
Para obtener estas medidas vamos a
servirnos del mdulo GPS [2] que pode-
mos ver en la Figura 2. Se trata de uno
Arduino HARDWARE
65
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
de los mdulos ms sencillos de entre
todos con los que hemos trabajado, ya
que slo es necesario conectarlo, y el
modulo ya comienza a mandarnos su
posicin.
El mdulo GPS es un pequeo circuito
electrnico que se puede conectar a la
placa Arduino y obtener los datos exac-
tos de posicin y altitud, adems de
velocidad, fecha y hora UTC. Necesita
una antena, estar colocado en el exterior
y un poco de tiempo para obtener seal
de los satlites y comenzar a dar la posi-
cin. El mdulo GPS es el complemento
perfecto para el desarrollo de aplicacio-
nes de geolocalizacin.
Listado 1: Ejemplo del sistema de aparcamiento asistido Sensor de ultrasonidos
01 // Variables
02 int sensorUltrasonidos = 0;
03 int valor = 0;
04 int valorInicio = 0;
05 int inicioAparcamiento = 0;
06
07 void setup(){
08 // Inicializamos el puerto serie
(UART baudrate) a la velocidad de
comunicacion de los XBee
09 Serial.begin(9600);
10 }
11
12 void loop(){
13 // Esperamos a recibir un dato
por comunicacin serie con el
XBee
14 while(Serial.available()<0){
15 }
16 // Comenzamos a enviar medidas
del sensor cuando recibimos una
s
17 valorInicio = Serial.read();
18 if (valorInicio ==s){
19 inicioAparcamiento = 1;
20 }
21 if (valorInicio == q){
22 inicioAparcamiento = 0;
23 }
24 // Enviamos la medida del sensor
adaptada a un valor de 0 a 7 en
funcin de cercana
25 if (inicioAparcamiento == 1){
26 valor = analogRead(sensorUl-
trasonidos);
27 if ((valor <=140) && (valor >=
10)){
28 if((valor > 43))
Serial.print(0);
29 if((valor <=39) && (valor >
35)) Serial.print(1);
30 if((valor <=35) && (valor >
31)) Serial.print(2);
31 if((valor <=31) && (valor >
27)) Serial.print(3);
32 if((valor <=27) && (valor >
23)) Serial.print(4);
33 if((valor <=23) && (valor >
19)) Serial.print(5);
34 if((valor <=19) && (valor >
15)) Serial.print(6);
35 if((valor <=15) && (valor >
13)) Serial.print(7);
36 if((valor <=13))
Serial.print(8);
37 }
38 // Pequeo retardo de tiempo
39 delay(1000);
40 }
41 }
Figura 4: Esquema del conexionado del ejem-
plo de aparcamiento asistido Sensor ultra-
sonidos.
Figura 5: Esquema del conexionado del ejem-
plo de aparcamiento asistido Indicacin
visual de LEDs.
Figura 6: Esquema de los dos nodos XBee
para aparcamiento asistido.
Figura 7: Montaje del sensor de ultrasonidos
en la parte trasera del vehculo.
Figura 8: Montaje de la indicacin visual
como ayuda al aparcamiento.
Arduino, que nos permite crear una
UART virtual en dos pines digitales cual-
quiera. Lo veremos ms en profundidad
en los apartado de hardware y software.
Para cualquier duda o problema con
este mdulo, podemos recurrir al
siguiente tutorial de Cooking Hacks
sobre GPS[3].
Estos ejemplos han sido sacados de la
seccin de Cooking Hacks Lets Cook!
[4]. Una seccin dedicada a la comuni-
dad en la que cualquier usuario puede
presentar sus proyectos.
Diseo del Hardware
En el caso del montaje para estos ejem-
plos, observamos que el del dispositivo
de aparcamiento asistido tiene una nota-
ble mayor dificultad, ya que el de posi-
cionamiento de su vehculo supone
Como podemos ver en el esquema de
la Figura 3, el mdulo utiliza los dos
pines de comunicaciones Rx y Tx, junto
a la alimentacin. Y al ver esto y pensar
que queremos utilizar este mdulo junto
al GPRS, se nos plantea el problema de
que Arduino slo dispone de una UART
y tenemos dos dispositivos que la necesi-
tan. Para solucionar esto utilizaremos la
librera SoftwareSerial disponible en
HARDWARE Arduino
66
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Listado 2: Ejemplo del sistema de aparcamiento asistido Indicacin visual con LEDs
001 // Variables
002 int LED0 = 12;
003 int LED1 = 11;
004 int LED2 = 10;
005 int LED3 = 9;
006 int LED4 = 8;
007 int LED5 = 7;
008 int LED6 = 6;
009
010 int estadoLED = 0;
011 int valorAparcamiento = 0;
012
013 void setup(){
014 // Inicializamos el puerto
serie (UART baudrate) a la
velocidad de comunicacin de
los XBee
015 Serial.begin(9600);
016 // Configuramos los pines de
los LEDs como salidas digitales
017 pinMode(LED0,OUTPUT);
018 pinMode(LED1,OUTPUT);
019 pinMode(LED2,OUTPUT);
020 pinMode(LED3,OUTPUT);
021 pinMode(LED4,OUTPUT);
022 pinMode(LED5,OUTPUT);
023 pinMode(LED6,OUTPUT);
024 // Avisamos al sensor de ultra-
sonidos de que empezamos a
aparcar
025 delay(2000);
026 Serial.print(s);
027 }
028
029 void loop(){
030 valorAparcamiento =
Serial.read();
031 nivelLED(valo-
rAparcamiento-48);
032 if (estadoLED == 1){
033 digitalWrite(LED0,HIGH);
034 digitalWrite(LED1,HIGH);
035 digitalWrite(LED2,HIGH);
036 digitalWrite(LED3,HIGH);
037 digitalWrite(LED4,HIGH);
038 digitalWrite(LED5,HIGH);
039 digitalWrite(LED6,HIGH);
040 delay(500);
041 digitalWrite(LED0,LOW);
042 digitalWrite(LED1,LOW);
043 digitalWrite(LED2,LOW);
044 digitalWrite(LED3,LOW);
045 digitalWrite(LED4,LOW);
046 digitalWrite(LED5,LOW);
047 digitalWrite(LED6,LOW);
048 delay(500);
049 }
050 // Pequeo retardo de tiempo
051 delay(5000);
052 }
053
054 // Funcin encargada de encen-
der los LEDs en funcin de la
medida del sensor
055 void nivelLED(int valor){
056 switch (valor){
057 case 0:
058 digitalWrite(LED0,LOW);
059 digitalWrite(LED1,LOW);
060 digitalWrite(LED2,LOW);
061 digitalWrite(LED3,LOW);
062 digitalWrite(LED4,LOW);
063 digitalWrite(LED5,LOW);
064 digitalWrite(LED6,LOW);
065 estadoLED = 0;
066 break;
067 case 1:
068 digitalWrite(LED0,HIGH);
069 digitalWrite(LED1,LOW);
070 digitalWrite(LED2,LOW);
071 digitalWrite(LED3,LOW);
072 digitalWrite(LED4,LOW);
073 digitalWrite(LED5,LOW);
074 digitalWrite(LED6,LOW);
075 estadoLED = 0;
076 break;
077 case 2:
078 digitalWrite(LED0,HIGH);
079 digitalWrite(LED1,HIGH);
080 digitalWrite(LED2,LOW);
081 digitalWrite(LED3,LOW);
082 digitalWrite(LED4,LOW);
083 digitalWrite(LED5,LOW);
084 digitalWrite(LED6,LOW);
085 estadoLED = 0;
086 break;
087 case 3:
088 digitalWrite(LED0,HIGH);
089 digitalWrite(LED1,HIGH);
090 digitalWrite(LED2,HIGH);
091 digitalWrite(LED3,LOW);
092 digitalWrite(LED4,LOW);
093 digitalWrite(LED5,LOW);
094 digitalWrite(LED6,LOW);
095 estadoLED = 0;
096 break;
097 case 4:
098 digitalWrite(LED0,HIGH);
099 digitalWrite(LED1,HIGH);
100 digitalWrite(LED2,HIGH);
101 digitalWrite(LED3,HIGH);
102 digitalWrite(LED4,LOW);
103 digitalWrite(LED5,LOW);
104 digitalWrite(LED6,LOW);
105 estadoLED = 0;
106 break;
107 case 5:
108 digitalWrite(LED0,HIGH);
109 digitalWrite(LED1,HIGH);
110 digitalWrite(LED2,HIGH);
111 digitalWrite(LED3,HIGH);
112 digitalWrite(LED4,HIGH);
113 digitalWrite(LED5,LOW);
114 digitalWrite(LED6,LOW);
115 estadoLED = 0;
116 break;
117 case 6:
118 digitalWrite(LED0,HIGH);
119 digitalWrite(LED1,HIGH);
120 digitalWrite(LED2,HIGH);
121 digitalWrite(LED3,HIGH);
122 digitalWrite(LED4,HIGH);
123 digitalWrite(LED5,HIGH);
124 digitalWrite(LED6,LOW);
125 estadoLED = 0;
126 break;
127 case 7:
128 digitalWrite(LED0,HIGH);
129 digitalWrite(LED1,HIGH);
130 digitalWrite(LED2,HIGH);
131 digitalWrite(LED3,HIGH);
132 digitalWrite(LED4,HIGH);
133 digitalWrite(LED5,HIGH);
134 digitalWrite(LED6,HIGH);
135 estadoLED = 0;
136 break;
137 case 8:
138 estadoLED = 1;
139 }
140 }
Arduino HARDWARE
67
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Listado 3: Ejemplo de sistema de posicionamiento del vehculo
001 // Incluimos la librera Soft-
wareSerial para la conexin del
GPS
002 #include <SoftwareSerial.h>
003
004 // Definimos y configuramos los
pines para la conexin del GPS
por software
005 SoftwareSerial gps(9, 8);
006
007 // Variables
008 byte byteGPS = 0;
009 int i = 0;
010 int h = 0;
011 int aux = 0;
012
013 char GPS_GGA[100]=;
014
015 char longitude[12]=;
016 char latitude[12]=;
017 char altitude[12]=;
018 int fix = 0;
019 // Declaramos la variable pin
para encender el modulo GPRS
020 int pinModuloOn = 2;
021 // ********* es el nmero al que
se envia el mensaje
022 char numero_tele-
fono[]=*********;
023 // Funcin encargada de encen-
der el mdulo GPRS
024 void encenderModulo(){
025
digitalWrite(pinModuloOn,HIGH
);
026 delay(2000);
027
digitalWrite(pinModuloOn,LOW)
;
028 }
029
030 void setup(){
031 // Inicializamos el puerto
serie (UART baudrate) a la
velocidad de comunicacin con
el GPRS
032 Serial.begin(115200);
033 // Inicializamos el puerto
serie por software
034 gps.begin(4800);
035 // Encendemos el mdulo GPRS
036 encenderModulo();
037 // Esperamos un tiempo hasta
que el mdulo se encienda
038 for (int i=0;i < 5;i++){
039 delay(5000);
040 }
041 // Configuramos el modo mensaje
de texto
042 Serial.println(AT+CMGF=1);
043 // Pequeo retardo de tiempo:
044 delay(100);
045
046 }
047
048 void loop(){
049
050 // Leemos las secuencias GGA
que nos da el GPS con los valores
de posicin
051 byteGPS = gps.read();
052 while(byteGPS != G){
053 byteGPS = gps.read();
054 }
055 byteGPS = gps.read();
056 if (byteGPS == G){
057 GPS_GGA[0]=$;
058 GPS_GGA[1]=G;
059 GPS_GGA[2]=P;
060 GPS_GGA[3]=G;
061 GPS_GGA[4]=G;
062 i = 5;
063 while(byteGPS != 10){
064 byteGPS = gps.read();
065 GPS_GGA[i]=byteGPS;
066 i++;
067 }
068 i = 0;
069 while(GPS_GGA[i]!=,){
070 latitude[i]=GPS_GGA[i];
071 i++;
072 }
073 i++;
074 while(GPS_GGA[i]!=,){
075 i++;
076 }
077 i++;
078 // Obtenemos la latitud
079 aux = 0;
080 while(GPS_GGA[i]!=,){
081 latitude[aux]=GPS_GGA[i];
082 i++;
083 aux++;
084 }
085 i++;
086 latitude[aux]=GPS_GGA[i];
087 i++;
088 i++;
089 // Obtenemos la longitud
090 aux = 0;
091 while(GPS_GGA[i]!=,){
092 longitude[aux]=GPS_GGA[i];
093 i++;
094 aux++;
095 }
096 i++;
097 longitude[aux]=GPS_GGA[i];
098 i++;
099 i++;
100 fix = GPS_GGA[i]-48;
101 i++;
102 i++;
103 while(GPS_GGA[i]!=,){
104 i++;
105 }
106 i++;
107 while(GPS_GGA[i]!=,){
108 i++;
109 }
110 i++;
111 // Obtenemos la altitud
112 aux = 0;
113 while(GPS_GGA[i]!=,){
114 altitude[aux]=GPS_GGA[i];
115 i++;
116 aux++;
117 }
118 }
119
120 // Si fix = 1 (satelites
conectados) enviamos el mensaje
121 if (fix == 1){
122 // Pequeo retardo de tiempo:
123 delay(1500);
124 // Envio el numero del desti-
natario
125 Serial.print(AT+CMGS=\);
126 Serial.print
(numero_telefono);
127 Serial.println(\);
128 // Tras recibir un > envo
los datos en el mensaje
129 while(Serial.read()!=>);
130 Serial.print(My coordinates
are: );
131 Serial.print(Latitude: );
132 i = 0;
133 while(latitude[i]!=0){
134 Serial.print(latitude[i]);
135 i++;
136 }
137 Serial.print( | Longitude:
);
138 i = 0;
139 while(longitude[i]!=0){
140 Serial.print(longitude[i]);
141 i++;
142 }
143 Serial.print( | Altitude: );
144 i = 0;
145 while(altitude[i]!=0){
146 Serial.print(altitude[i]);
147 i++;
148 }
149 // Pequeo retardo de tiempo:
150 delay(1000);
151 // Aviso del fin de mensaje
152 Serial.write(0x1A);
153 Serial.write(0x0D);
154 Serial.write(0x0A);
155 // Mandamos el mensaje cada 2
minutos
156 delay(120000);
157 }
158 }
colocarse en la parte trasera del vehculo
como en la Figura 7 y el de recepcin en
la zona del conducto de manera visible
como en la Figura 8.
Para aprender a trabajar con los mdu-
los XBee o recordar cmo funcionaban
slo tenemos que recurrir al artculo de
Centro de control. [5]
En nuestro segundo ejemplo, trabaja-
remos con un montaje y consistir en la
conexin a un Arduino de un mdulo
GPRS y otro GPS. El mdulo GPRS lo
conectamos como aprendimos ya en
anteriores artculos [6]. Una vez conec-
tado, debemos conectar el mdulo GPS
en los pines restantes, pero alimentn-
dolo por medio de dos cables, ya que en
esos pines no se dispone de alimenta-
cin. Podemos observar el proceso de
montaje en las Figuras 9 y 10.
Una vez ensamblado, lo situaremos en
algn lugar del salpicadero para que
reciba buena seal de los satlites y con
la antena en posicin horizontal.
Programacin
Cuando nos pongamos a programar el
primero de los ejemplos, observaremos
que se trata de una programacin muy
sencilla, por lo que vamos a implemen-
tar unos cdigos un poco ms elabora-
dos. En el nodo encargado de la adquisi-
cin de datos de proximidad slo sera
necesario la toma de datos de una seal
analgica y su posterior envo va comu-
nicacin serie al mdulo XBee, sin
embargo hemos establecido una serie de
rangos de medida que se clasifican en
ocho casos distintos. Una vez que le
mandamos este caso al nodo encargado
de realizar la indicacin visual, lo tra-
mita por medio de un case .
Para nuestro segundo ejemplo, no
tenemos que asustarnos, ya que se trata
de un cdigo largo debido a que tramita-
mos todos los datos que nos enva el
GPS. Realmente slo utilizamos las par-
tes comentadas, ya que enviamos 3
datos a nuestro mvil: latitud, longitud y
altitud. Para trabajar con estos dos
mdulos a la vez, podemos recurrir al
tutorial Mobile Pack for Arduino de Coo-
king Hacks [7].
Una vez recibida la informacin de los
satlites (Figura 11), la cual puede tardar
varios minutos, se enva un mensaje con
dicha informacin al destinatario, como
se observa en la Figura 12.
Casa domtica: siguientes
pasos
Nos encontramos ya cerca del final del
camino, con casi la totalidad de nuestra
casa domotizada, nicamente nos queda
cerrar algunos puntos especficos y ejem-
plos especiales y ya podremos decir final-
mente que nuestra casa es domtica.
Enfrente, encontramos un mundo
todava lleno de posibilidades y aplica-
ciones que implementar en nuestro
hogar, y con tan slo nuestra experien-
cia, conocimientos e imaginacin pode-
mos plantearnos prcticamente cual-
quier sistema electrnico.
montar mdulos sobre Arduino como si
de un Lego se tratara.
En el ejemplo del aparcamiento asis-
tido, el montaje viene separado en dos
nodos. Un nodo emisor de los datos de
proximidad de los obstculos, basado en
la conexin de un sensor de aproxima-
cin analgico conectado a alimenta-
cin, masa y una entrada analgica, y en
un mdulo de comunicaciones XBee
para enviar el dato al nodo receptor,
como podemos observar en la Figura 4.
El nodo receptor, aparte de tener un
mdulo XBee conectado para recibir los
datos como se observa en la Figura 5,
dispone de una serie de 7 LEDs conecta-
dos en las I/ O digitales 6-12. Ambos
nodos se envan la informacin por
medio de los mdulos de comunicacin
XBee (Figura 6). En cuanto a su coloca-
cin en el vehculo, el nodo emisor debe
HARDWARE Arduino
68
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
RECURSOS
[1] Sensor de ultrasonidos: http:// www. cooking-hacks. com/ index. php/ shop/ sensors/ proximity/ ultra-sonic-range-module. html
[2] Mdulo GPS: http:// www. cooking-hacks. com/ index. php/ shop/ arduino/ exclusive-products/ gps-module-for-arduino. html
[3] Tutorial mdulo GPS: http:// www. cooking-hacks. com/ index. php/ documentation/ tutorials/ arduino-gps
[4] Lets Cook!: http:// www. cooking-hacks. com/ index. php/ let-s-cook. html
[5] Artculo Centro de control, de Luis Martn, Linux Magazine nmero 86, pag. 58.
[6] Artculo Seguridad en el hogar, de Luis Martn, Linux Magazine nmero 87, pag. 57.
[7] Tutorial Mobile Navigator Pack: http:// www. cooking-hacks. com/ index. php/ blog/ tutorial_arduino_quadband_mobile_navigator_pack
Figura 9: Proceso de conexin de las placas
GPS y GPRS para el segundo ejemplo.
Figura 10: Montaje del ejemplo de posi-
cionamiento de nuestro coche.
Figura 11: Lectura en monitor serie de la
posicin de nuestro vehculo.
Figura 12: Montaje del ejemplo de posi-
cionamiento de nuestro coche funcionando.
fue utilizada en la pelcula Pleasantville [2]
mediante la eliminacin de color, y despus
se aadi de nuevo de forma selectiva.
Un programa llamado Tintii [3] puede
aplicar estos espectaculares efectos de color
(Figura 1) mediante el color selectivo o el
estallido de color. En combinacin con
otras herramientas de mejora, se pueden
crear fascinantes obras de arte.
Tintii transforma primero una imagen a
color a una en escala de grises y luego res-
taura los colores individuales. Las partes
que se han mejorado de esta manera desta-
can en la escena sorprendentemente. Se
puede manipular el matiz, la saturacin y
la luminosidad de los colores, para dar a
sus imgenes un ambiente completamente
diferente. Con unos cuantos toquecitos a
los controles deslizantes las imgenes pli-
das se transforman en brillantes y coloridas
obras de arte, o un cielo gris y nublado se
convierte en un infierno ardiente.
Caja de pinturas de regalo
Tintii fue creado por el programador y fot-
grafo aficionado Lawrence Murray. Parece
ser que Lawrence tiene un gran corazn
linuxero: aunque los usuarios de Windows
y Mac OS X deben pagar entre 5 y 20 dola-
res por Tintii, la versin de Linux se puede
descargar y utilizar sin coste. Es ms, todo
el cdigo fuente est disponible bajo la
GNU GPLv2. Incluso algunas distribucio-
nes de Linux ofrecen un paquete completo
en sus repositorios. Sin embargo, stos sue-
len contener una versin anterior de Tintii
que carece de algunas de las opciones ms
interesantes. Si deseas que todas las funcio-
nes estn disponibles o no encuentras Tintii
en tu gestor de paquetes, la informacin del
cuadro Mezcla Fresca te llevar a tu
meta.
Para iniciar Tintii, es necesario abrir una
ventana de terminal y escribir el comando
tintii, incluso si lo has instalado a travs del
Centro de Software de Ubuntu.
Colorizar Tintii LINUX USER
69
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
ltimo lo tenemos en La Lista de Schindler
[1], filmada por Steven Spielberg completa-
mente en blanco y negro, a excepcin de
una escena que muestra a un nio que lle-
vaba un abrigo de color rojo brillante en
una toma monocroma. Una tcnica similar
Tintii, un modesto programa de procesamiento de imgenes, convierte
las imgenes a color en fotografas en blanco y negro y luego mejora
reas especficas con llamativos efectos de coloreado.
POR TIM SCHRMANN
L
os objetos importantes se pueden
destacar en una imagen desenfo-
cando el fondo, recortando el
sujeto, eliminando el color de las reas sin
importancia o aadiendo color a caracters-
ticas importantes. Un ejemplo de esto
Mejorar las fotos de forma selectiva con Tintii
Croma
Para realizar una nueva compilacin de Tintii a partir del cdigo
fuente, utiliza primero el gestor de paquetes para instalar el com-
pilador C++, make, y los paquetes de desarrollo para wxWidgets
y Boost. En openSUSE, estos paquetes son gcc-c++, make,
boost-devel y wxWidgets-devel y sus respectivas dependencias.
Los usuarios de Ubuntu necesitan los paquetes build-essential,
libwxgtk2.8-dev, y libboost-all-dev con todas sus dependencias.
Para descargar el archivo del cdigo fuente, navega hasta la
pgina de Tintii [3], haz clic en el botn Download situado en la
parte superior derecha, a continuacin, haz clic de nuevo en el
cuadro For Linux. Para instalarlo, descomprime el archivo en tu
disco duro, ve al subdirectorio que se ha creado, abre una ven-
tana de terminal y escribe los siguientes tres comandos:
./configure --disable-assert CXXFLAGS=-O3 -g3
make
sudo make install
En openSUSE, es necesario sustituir el ltimo comando por los
dos siguientes:
su root
make install
Mezcla fresca
previsualizacin (en las versiones anterio-
res de Tintii, aparecen a la izquierda). Al
hacer clic en una de ellas, se activa y Tintii
restaura el color correspondiente. En las
miniaturas de vista previa, el color est algo
exagerado a propsito. De esta manera, es
ms fcil ver qu partes de la imagen se
veran afectadas. Se pueden colorear ms
zonas con tan slo activar ms miniaturas
de la vista previa.
En una imagen no todos los colores tie-
nen la misma intensidad. Bajo un cielo pre-
dominantemente nublado, el horizonte de
la ciudad puede carecer de todas las tonali-
dades de azul. En este caso, Tintii no puede
restaurar el color que falta y en la vista pre-
via correspondiente, sigue predominando
el gris. Para que uno de los colores vuelva
al cuadro, basta con hacer clic sobre la
miniatura correspondiente.
Mezcla
En la ltima versin, Tintii muestra nume-
rosos controles deslizantes que permiten
ajustar los colores delicadamente o exage-
rando por completo. Tres controles corres-
ponden al color presentado en la vista pre-
via en el lado izquierdo. El control desli-
zante sobre la escala en blanco y negro
oscurece o aclara el color, creando, por
ejemplo, brillantes contraventanas azules
(Figura 3). El siguiente deslizador sube o
baja la intensidad (saturacin) del color.
Cuando se mueve hacia la derecha, resalta
los objetos coloreados ms y ms hasta
que parecen brillar. Puedes aprovechar
esta circunstancia para lograr algunos
efectos interesantes: restaurar todos los
colores y poco a poco aumentar la intensi-
dad (Figura 4). De esta manera las imge-
nes de paisajes, especialmente, literal-
mente se convierten en un estallido de flo-
res. Sin embargo, tienes que encontrar la
configuracin correcta: arrastrar el cursor
demasiado, produce una descarado efecto
de envoltorio de caramelo. (Vase el cua-
dro Deslizadores).
Por ltimo, el deslizador superior te per-
mite cambiar un color por otro completa-
mente diferente. Si, por ejemplo, se activa
la vista previa azul y se mueve la barra
hacia la izquierda sobre la parte verde de la
escala, Tintii colorea todas las partes azules
de color verde hierba, como en la figura 5.
Esta funcin es excelente para hacer un
cielo azul ms azul o transformar un pai-
En este punto, las versiones antiguas de
Tintii muestran una ventana espartana
(Figura 2, abajo a la derecha), en el que
puedes hacer clic en Open y luego elegir las
imgenes. Sin embargo, en la versin ms
reciente, la ventana principal que se ve en
la Figura 1 se abre inmediatamente. Al
hacer clic en File | Open puedes navegar al
archivo de imagen de tu disco duro que
quieras. Tintii puede procesar los formatos
BMP, PNG, JPEG, TIFF, GIF, PNM, PCX,
IFF, iconos de Windows (ICO), Cursor Win-
dows (CUR, ANI), TGA y XPM.
La imagen seleccionada aparecer en
blanco y negro en la ventana principal.
Justo a la derecha hay varias miniaturas de
LINUX USER Colorizar Tintii
70
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Figura 1: Slo los elementos azules de la imagen han sido seleccionados con Tintii, incluyendo
el cielo y las contraventanas, propias de la regin de Odenwald, en Alemania.
Figura 2: Las versiones anteriores de Tintii, como la que se muestra
aqu en Ubuntu, ofrecen menos funciones que la versin ms reciente.
Figura 3: Se ha aumentado el brillo de todas las reas azules, obte-
niendo en este caso una tonalidad turquesa.
saje de floreciente primavera en otoal
(Figura 6).
Cuando se abre una imagen nueva, Tintii
determina los cuatro colores principales de
la imagen y crea una vista previa de cada
uno. Sin embargo, si tienes una imagen
que contiene tonalidades de un mismo
color, cuatro colores no es suficiente. Por
eso en la ltima versin de Tintii puedes
restaurar colores adicionales con el signo
ms debajo de las barras de desplaza-
miento y, en las versiones anteriores, slo
tienes que teclear un nmero mayor en el
campo Thumbs. Sin embargo, no se pue-
den elegir los colores que se aaden. En
vez de eso, Tintii vuelve a determinar que
colores destacan o son ms importantes. En
el caso de un paisaje, puede agregar varios
tonos de verde. Por el contrario, un clic en
el signo menos reduce el nmero de colo-
res que pueden ser manipulados. De
nuevo, con las versiones anteriores, sola-
mente hay que establecer el campo
Thumbs a un valor menor. En un principio,
se tarda un poco en acostumbrarse a este
procedimiento. Si no ests seguro, sigue
haciendo clic en el signo ms hasta que
Tintii ofrezca colores muy similares y luego
usar el signo menos para reducir la selec-
cin de nuevo. En total, Tintii puede ofre-
cer al mismo tiempo hasta 16 diferentes
tonos de un color.
Manchando la imagen
Con el deslizador Decay en el panel de
Post procesado debajo de la imagen, se
puede eliminar el color de las reas ligera-
mente coloreadas tirando del deslizador
hacia la derecha. De esta manera, un
arbusto podra seguir siendo de un delicio-
samente verde mientras que el resplandor
verdoso del musgo en una pared de la casa
se desvanece en el gris que lo rodea. Si
empujas el deslizador Decay en la direccin
opuesta, Tintii recoloriza estructuras discre-
tas. Para completar el efecto, ajusta el con-
traste del Decay ajustando el deslizador
Edge. Cuanto ms lejos se empuja la barra
hacia la derecha, ms manchado aparece
el color (ver Figuras 7 y 8)
Cuando se desea resaltar estructuras
finas como cabellos o ramas, empuja el
deslizador Edge a la derecha. Adems de
esto, se puede suavizar la transicin de un
color a otro con gradientes dentro del
mismo color. En versiones anteriores de
Tintii, la cada y el margen deban ajustarse
cada una por separado en la saturacin (Sat
decay y Sat edge) y el color (Hue decay y
Hue edge) en el panel de post procesado.
Para cada pxel de la imagen, Tintii
determina a qu color se adapta mejor de
entre los deslizadores de color. Entonces,
se aplica la configuracin de acuerdo con
los controles correspondientes. Por ejem-
plo, si Tintii determina que un pxel de una
imagen es predominantemente azul,
entonces lo ajustar de acuerdo a los ajus-
tes prximos a la miniatura azul, como en
la Figura 1. Pero eso slo suceder si el
deslizador Hardness del panel de post pro-
cesado est en el extremo derecho. Cuanto
ms se deslice hacia la izquierda, mayor
ser la influencia que otros deslizadores
tienen sobre el color final del pxel. La
Colorizar Tintii LINUX USER
71
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Tira siempre de los deslizadores muy
lentamente. Si se hace algo de manera
rpida se destacaran reas no deseadas
que contienen pequeas cantidades del
color elegido.
Deslizadores
Figura 4: Con la suficiente saturacin, la casa luce mucho ms con colores llamativos.
Figura 5: En este caso, las contraventanas azules se han coloreado de verde. Desafortunada-
mente, no se puede ajustar Tintii para que no afecte a otros elementos azules, como el cielo.
rojo, verde y azul que estar presente en el
resultado final. Si, por ejemplo, se mueve el
deslizador Red hasta la derecha, la escala
de grises resultante slo tendr en cuenta el
espectro rojo. Moviendo los deslizadores,
puedes aclarar u oscurecer reas grises para
resaltar detalles especficos. La suma de
todos los colores individuales siempre ser
del 100%. Si se mueve un deslizador hacia
la izquierda, los otros dos se movern a la
derecha para compensar.
Si tus experimentos han ido demasiado
lejos, haz clic en Edit | Restore Defaults para
restablecer todos los valores a su estado ori-
ginal. Por ahora, no hay manera de desha-
cer los pasos individuales. Para acercar y
alejar la imagen, utiliza la lupa en la barra
de herramientas. En el caso de imgenes de
alta resolucin, se debe utilizar esta fun-
cin para examinar la imagen para darte
cuenta de pequeas manchas no deseadas
de color. Si todo est a tu gusto, asegura tu
obra de arte a travs de File | Save As o con
un clic en Save As en la barra de herramien-
tas.
Conclusin
Tintii es adictivo. Una vez que comienzas a
experimentar con los colores, te encontra-
rs rpidamente probando los efectos tan
slo por diversin en toda tu biblioteca de
imgenes. Al hacerlo, pronto descubrirs
que no se puede lograr siempre un buen
resultado. Los mejores y ms interesantes
resultados se logran imgenes de colores
ms variados. Tintii no puede evocar un
cielo azul brillante sobre un edificio de pie-
dra gris en un da lluvioso. Adems, el pro-
grama siempre revela todos los objetos de
un color especfico. Si, por ejemplo, deseas
establecer el foco en una mujer con un
paraguas rojo se debe evitar que haya un
coche rojo en el fondo. Por ahora, Tintii no
puede enmascarar u omitir objetos indivi-
duales. Por otro lado, las operaciones senci-
llas conducen a resultados rpidos y sto te
sorprendern una y otra vez.
influencia es tambin mayor con el cre-
ciente predominio de ese color en el pxel.
En un pxel de color turquesa, los ajustes
de color azul y verde tendrn el efecto ms
fuerte en Tintii. Normalmente, no tendrs
ninguna razn para mover el deslizador
hacia la izquierda. En la mayora de las
imgenes, slo obtendras colores deslava-
dos. Pero a veces se pueden revelar estruc-
turas ocultas y posiblemente, por ejemplo,
resaltar el plido resplandor verde del
musgo en la pared. Como anotacin: el
ajuste Hardness no est en las versiones
anteriores de Tintii.
Tintii crea automticamente una imagen
en blanco y negro. En el panel del Channel
Mixer se puede ajustar la proporcin de
LINUX USER Colorizar Tintii
72
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
[1] La lista de Schindler:
http:// es. wikipedia. org/ wiki/
La_lista_de_Schindler
[2] Pleasantville: http:// es. wikipedia. org/
wiki/ Pleasantville
[3] Tintii:
http:// www. indii. org/ software/ tintii
RECURSOS
Figura 7: Con el deslizador Edge totalmente a la izquierda, las salpica-
duras de color verde tienen lmites ntidos.
Figura 8: Si mueves el deslizador Edge a la derecha, los colores se
vuelven manchas difusas.
Figura 6: Adems de la aplicacin de colores que seran naturalmente imposibles, la funcin
del mezclador de canales puede transformar una escena de primavera en un paisaje otoal.
gamos suficiente espacio para
desempaquetar los datos o puede
que desempaquetarlo todo tarde
una eternidad, o puede que el
archivo ya est en el servidor
remoto y descargarlo para proce-
sarlo no sea una opcin. Por esta
razn, los desarrolladores, siem-
pre tan inteligentes, han encon-
trado vas ms simples y eficien-
tes para buscar en archivos.
No Desempaquetar
En un fichero comprimido, el nombre del
fichero es generalmente el mismo que el
nombre del fichero empaquetado (cam-
biando slo su extensin), mientras que un
archivo agrupa mltiples ficheros bajo un
nico nombre de fichero. Sin embargo, exis-
ten programas habituales cuyas opciones
nos permiten listar el contenido de un
archivo. Los comandos de la Tabla 3 nos
dejan buscar ficheros sin la necesidad de
desempaquetarlos.
La lista del contenido del archivo puede
filtrarse con el comando grep que usa el
nombre deseado como un patrn y conec-
tado con una tubera. La salida de la lista del
fichero contiene simplemente un nombre de
fichero en cada lnea. Esto se debe a que el
comando grep slo devuelve las lneas que
coinciden con el patrn de bsqueda del
nombre del fichero.
Las tres variantes pueden ayudar [1]:
grep -F (alternativamente, fgrep o
grep --fixed-strings): este comando slo
extrae las coincidencias exactas de la
cadena en un flujo o cadena de datos. La
herramienta ignora caracteres, no estn-
dares.
Cualquier sistema Linux nos da las herramientas adecuadas
para buscar dentro de ficheros y archivos comprimidos desde
la lnea de comandos de manera rpida y fcil.
POR AXEL BECKERT Y FRANK HOFMANN
WWW. L I NUX- MAGAZI NE. ES Nmero 90
73
Lnea de Comandos: Bsqueda de ficheros en ZIPs y TARs LINUX USER
Encuentra ficheros compartidos y archivos
Bsqueda
Los programas introducidos en este artculo pertenecen a los de compresin de datos
o a la categora de archivado, mientras que otros programas combinan ambos proce-
sos. La primera categora incluye las herramientas xz, gzip y bzip2. En la segunda cate-
gora encontramos tar, zip, 7-Zip. RAR combina ambas tcnicas.
Para procesar un archivo tar comprimido con gzip, bzip2 o xz necesitamos tener insta-
lados los programas de compresin instalados como asistentes y tar los llamar direc-
tamente. Es bastante fcil identificar el tipo de compresin de archivos viendo la
extensin del fichero. La Tabla 1 nos da los detalles de los formatos ms populares.
7-Zip no es un caso especial. Los ficheros de este tipo acaban habitualmente en .7z.
Las herramientas correspondientes reciben el nombre de 7z, 7za y 7zr. Las diferencias
se encuentran en los formatos que el programa puede manejar (incluyendo gzip,
bzip2, xz, LZMA, RAR o zip). Los nombres de los paquetes en Debian o Ubuntu son
p7zip (7zr), p7zip-full (7z, 7za), y p7zip-rar (RAR plugin for 7z).
Ficheros Comprimidos vs. Archivos
P
ara liberar espacio utilizado por
datos que no necesitamos habi-
tualmente o que tenemos que
transportar de un lado para otro, pode-
mos comprimir ficheros individuales o
reunirlos todos en un archivo (vase el
cuadro Ficheros Comprimidos vs. Archi-
vos), luego podemos hacer una copia de
seguridad de ellos en un medio externo
(por ejemplo, en un DVD, disco duro
externo o en la nube).
Slo despus nos daremos cuenta de que
ahora hay que resolver el excitante pro-
blema de saber cmo encontrar algo en
estos archivos y ficheros comprimidos. Nor-
malmente podremos recordar fragmentos
partes del nombre de un fichero, o porciones
del contenido, y la manera ms simple de
buscar es desempaquetando el archivo o
fichero con los comandos de la Tabla 2 y
comprobar los ficheros para el contenido
que deseamos. Este mtodo es bastante
prctico para volmenes de pequeos de
datos. Sin embargo, si andamos buscando
en un volumen mayor, este mtodo pronto
se vuelve impracticable. Puede que no ten-
Tabla 1: Extensiones de Ficheros
Tipo Extensin
Archivos comprimidos
gzip .gz
bzip2 .bz2
xz .xz
Archivos
zip
.zip
7-Zip
.7z
RAR
rar
tar
.tar
tar+gzip
.tar.gz
tar+bzip2
.tar.bz2
tar+xz
.tar.xz
$ tar -tjf U
Archivo.tar.bz2 | U
egrep --color U
^ factura.1[5-7]\.pdf
Gracias a egrep y a los patrones de
expresiones regulares podemos filtrar
todos los nombres de ficheros que coin-
cidan con un patrn dado a partir de la
tabla de contenidos del archivo.
El carcter ^ en el patrn de bs-
queda hace que slo coincida si la
cadena factura ocurre al comienzo de
una lnea. Luego tenemos dos nmeros
que siguen a un carcter arbitrario (.). El pri-
mer nmero es 1 y el segundo ha de estar
entre 5 y 7. El patrn finaliza con un punto
que necesitamos para prote-
ger con una barra invertida
para que grep lo interprete
como un carcter literal y no
especial y la cadena pdf.
Con este coinciden, por ejem-
plo, factura015.pdf, fac-
tura817.pdf, factura-16.pdf y
factura-16.pdf.bak.
Si lo nico que sabemos de
un fichero que estamos bus-
cando es la fecha aproximada
del ltimo cambio, necesita-
mos adoptar un mtodo dis-
tinto. La opcin tar -v nos
ofrece informacin detallada
sobre ficheros de archivos, tales como privi-
legios de acceso, propietario y grupo,
tamao, fecha la ltima modificacin y el
nombre de los ficheros. Para crear una lista
de todos los ficheros que contienen tienen
como marca de tiempo la fecha 11-13 21-23
de Diciembre de 2011, podemos usar lo
siguiente:
$ tar -tjvf U
Archivo.tar.bz2 | U
egrep --color U
2011-12-[12][1-3]
En este caso, egrep acta como un filtro en la
salida para fechas. Slo las lneas que contie-
nen las cadenas 2011-12-11, 2011-12-12, 2011-
12-13, 2011-12-21, 2011-12-22 o 2011-12-23 se
muestran como resultados. La herramienta
grep -G (o , grep --basic-regexp): un grep
utiliza una variante ms simple de expre-
siones regulares y por tanto no interpreta
el patrn de bsqueda tan literalmente
como fgrep. Puede usar varios comodines
(por ejemplo, *) como expresiones para
cualquier nmero de caracteres. Estas
expresiones regulares simples son simila-
res (aunque no idnticas) a los comodines
utilizados para listar o seleccionar ficheros
en la shell.
egrep (alternativamente, grep -E o
grep --extended-regexp): aqu s se utilizan
expresiones regulares extendidas y que
son similares a las utilizadas en la bs-
queda de patrones por programas de la
lnea de comandos tales como sed y awk,
el editor vi y el paginador less.
Los comandos
$ tar -tzf U
Archivo.tar.gz | U
fgrep --color U
Nombrefichero
devolvern coincidencias para un archivo
tar.gz. Tar rastrea el archivo especificado y
enva una tabla de contenidos completa a
travs de una tubera de salida estndar.
Desde la tubera, fgrep recoge los datos como
entrada y los filtra basndose en un patrn
especfico como el nombre del fichero.
La opcin --color no es estrictamente nece-
saria, pero da mejor aspecto a la salida y
hace que fgrep resalte las coincidencias con
el nombre del fichero en la salida. Grep y
egrep son tiles para bsquedas ms com-
plejas, cuando no conocemos el nombre
exacto del fichero y deseamos usar un patrn
para buscar.
Los siguientes comandos son similares al
ejemplo anterior, excepto que buscamos en
un archivo comprimido bzip2 en este caso:
LINUX USER Lnea de Comandos: Bsqueda en ZIPs y TARs
74
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
En Debian, las versiones siguientes a la versin 4.0 (Etch), fgrep y egrep simplemente
invocan a grep, pasando una llamada a grep con las opciones correspondientes: grep -F
para fgrep y grep -E para egrep, cosa que se haca con un script shell:
$ cat /bin/fgrep
#!/bin/sh
exec grep -F ${1+$@}
En las versiones ms recientes de Debian, los comandos ahora son binarios separados.
Scientific Linux y Ubuntu hacen las cosas como Debian, pero las derivadas de Red Hat/
Fedora, como CentOS no lo hacen. El Listado 1 muestra que fgrep y egrep enlazan a
grep en CentOS 5.5 como podemos ver por los privilegios de usuario y el indicador en
la columna de la derecha.
Los comandos fgrep y egrep tambin estn marcados como obsoletos (vase las pgi-
nas man para cada uno de estos comandos) y se incluyen por razones histricas. Pode-
mos esperar, pues, que estos comandos desaparezcan en el futuro, as que necesitare-
mos llamar a grep con las opciones correspondientes. Dicho esto, no se ha fijado nin-
gn lmite a este importante y controvertido cambio.
Grep Entonces y Ahora
01 $ ls -l $(which egrep fgrep grep)
02 lrwxrwxrwx 1 root root 4 22. Okt 2010 /bin/egrep -> grep*
03 lrwxrwxrwx 1 root root 4 22. Okt 2010 /bin/fgrep -> grep*
04 -rwxr-xr-x 1 root root 85060 26. Sep 2009 /bin/grep*
Listado 1: Greps en CentOS 5.5
Tabla 3: Contenido de la Lista
Tipo Comando
Archivos comprimidos
gzip gzip -l Fichero.gz
bzip2 Sin opciones
xz xz -l Fichero.xz
Archivos
zip
unzip -l Archivo.zip
7-Zip
7z l Archivo.7z
RAR
unrar l Archivo.rar
tar
tar -tf Archivo.tar
tar+gzip
tar -tzf Archivo.tar.gz
tar+bzip2
tar -tjf Archivo.tar.bz2
tar+xz
tar -tJf Archivo.tar.xz
Tabla 2: Extraccin de Ficheros
Tipo Comando
Ficheros comprimidos
gzip gunzip Fichero.gz, unp Fichero.gz
bzip2 bunzip2 Fichero.bz2, unp Fichero.bz2
xz unxz Fichero.xz, unp Fichero.xz
Archivos
zip
unzip Archivo.zip, unp Archivo.zip
7-Zip
7z e Archivo.7z, unp Archivo.7z
RAR
unrar e Archivo.rar, unp Archivo.rar
tar
tar -xf Archivo.tar, unp Archivo.tar
tar+gzip
tar -xzf Archivo.tar.gz, unp Archivo.tar.gz
tar+bzip2
tar -xjf Archivo.tar.bz2, unp Archivo.tar.bz2
tar+xz
tar -xJf Archivo.tar.xz, unp Archivo.tar.xz
trata todos los caracteres encerrados entre
corchetes como alternativas cuando se com-
paran el patrn. [12] significa que el patrn
coincide con el 1 2. [1-3] significa que el
patrn coincide con un nmero entre 1 y 3
(ambos inclusive). Es posible utilizar esta
notacin compacta de fechas para formular
las seis combinaciones sin escribir cada una
de ellas individualmente.
Si deseamos hacer lo contrario, es decir,
que salga todo menos las coincidencias que
corresponden al patrn, necesitamos aadir
la opcin -v:
$ tar -tjvf U
Archivo.tar.bz2 | U
grep -E -v U
2011-12-[12][1-3]
Ahora la salida contiene documentos que
coinciden con el patrn de, por ejemplo,
2011-11-30 o 2011-12-24, pero no 2011-12-13.
Ficheros Comprimidos
La primera llamada a la bsqueda en un
fichero comprimido sigue la misma rutina
previamente explicada, es decir, desempa-
quetar el fichero a la salida estndar (Tabla
2), y luego filtrarlo mediante grep. Este
ejemplo con un fichero bzip2-comprimido:
$ bzip2 -dc U
Fichero.bz2 | U
grep -F U
Patrn bsqueda
presenta todas las lneas en la salida estn-
dar que contiene al menos una coincidencia
con el patrn de bsqueda. Para ficheros
binarios, muestra el mensaje matches in
binary file (standard input).
Si estamos interesados en las cadenas
donde se producen las coincidencias, la
opcin -o le dice a grep que imprima cada
lnea con una coincidencia en una lnea
separada. Para contar el nmero de coinci-
dencias, redirigimos la salida a travs de una
tubera al comando wc -l (Figura 1). Ntese
cmo -o muestra el nmero de coincidencias
en la cadena.
En la Tabla 4, los comandos alternativos
de la tercera columna cumplen exactamente
las mismas funciones que los comandos lis-
tados en la segunda. Muchas herramientas
incluyen variantes que siguen la nomencla-
tura de la herramienta cat, la cual muestra el
contenido de un fichero en la salida estn-
dar, por lo que xzcat muestra el contenido
empaquetado de los ficheros comprimidos
con el formato xz.
El programa
ucat es parte del
paquete unp [2],
el cual contiene
pequeos scripts
Perl que ejecutan
el comando nece-
sario para extraer
un fichero depen-
diendo de su for-
mato. Segn su
cdigo fuente, el
software soporta
los formatos gzip,
tar-gzip, bzip2 y 7-zip. El backend de ucat
utiliza las herramientas de la lnea de
comandos correspondientes, suponiendo
eso s que las tengamos instaladas.
Los programas de compresin a
menudo incluyen sus propias herramien-
tas de bsqueda. Gzip, por ejemplo, con-
tiene zgrep, zfgrep y zegrep. Estos tres pro-
gramas son scripts shell. zgrep es bas-
tante voluminoso y controla la mayora
del trabajo, mientras que zegrep slo con-
tiene un par de lneas que simplemente
llaman a zgrep con las opciones -f o -E.
Bzip2 y xz se utilizan en el mismo princi-
pio. En este caso las herramientas se deno-
minan bzgrep, bzfgrep y bzegrep, y xzgrep,
xzfgrep y xzegrep. Por tanto, podemos sim-
plificar la bsqueda previa en el fichero
bzip2, y lo mismo puede aplicarse a llama-
das con zgrep. En el ejemplo, el asistente
busca todas las entradas en el fichero que
contiene una cadena que comience con S
seguido de dos caracteres arbitrarios tras la
cadena th (Figura 2).
Zipgrep busca archivos zip. Este script
shell pertenece al paquete unzip. Cuando se
busca por patrones, utiliza en unzip y egrep.
Segn su pgina man, zipgrep pasa todas
las opciones y parmetros que conoce
egrep. En nuestro laboratorio, descubrimos
Lnea de Comandos: Bsqueda de ficheros en ZIPs y TARs LINUX USER
75
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Tabla 4: Desempaquetar archivos
Tipo Comando Comando alternativo
Ficheros comprimidos
gzip gzip -dc Fichero.gz zcat Fichero.gz
bzip2 bzip2 -dc Fichero.bz2 bzcat Fichero.bz2
xz xz -dc Fichero.xz xzcat Fichero.xz
Archivos
zip
unzip -p Archivo.zip ucat Archivo.zip
7-Zip
7z e Archivo.7z -so ucat Archivo.7z
RAR
unrar p Archivo.rar ucat Archivo.rar
tar
tar -Of Archivo.tar ucat Archivo.tar
tar+gzip
tar -xOzf Archivo.tar.gz ucat archivo.tar.gz
tar+bzip2
tar -xOjf Archivo.tar.bz2 ucat Archivo.tar.bz2
tar+xz
tar -xOJf Archivo.tar.xz ucat Archivo.tar.xz
Figura 3: Para conseguir el resaltado de las coincidencias con colores, combinamos zipgrep y
grep, porque zipgrep se atraganta con las opciones de grep.
Figura 2: Bzgrep simplifica la bsqueda de archivos empaquetados.
Figura 1: Una cadena de comandos nos permite identificar fcilmente el nmero de coinciden-
cias de una cadena en un fichero comprimido.
cen una tras otra. Si no especificamos la
opcin -v, los nombres de ficheros podran
no mostrarse en la salida de error estndar.
Los resultados de bsqueda comprenden
una lista de nombres de ficheros extrados
del archivo tar y las coincidencias que contie-
nen, sin mapeado entre ambos (Figura 4).
Para resultados de bsqueda ms comprensi-
bles, necesitamos ahondar ms profunda-
mente en nuestra caja de trucos y aventurar-
nos en la programacin shell, como muestra
el Listado 2.
La salida del primer comando tar la lista
de ficheros en el archivo se vuelca en la
variable fichero. La shell divide la salida
cuando ve un espacio en blanco. Por eso es
peligroso tener un espacio en blanco en el
nombre de un fichero y, de hecho, los nom-
bres de ficheros que contie-
nen espacios en blanco pue-
den llevar a errores dentro
del bucle a medida que se
itera a travs de los valores.
En cada iteracin del bucle
se compara y evala el
patrn. Para hacer esto, el
script guarda los resultados
del comando tar/ grep en la
variable buscarcoin. tar se
limita a desempaquetar el
fichero del archivo
y muestra su con-
tenido. La tubera
reenva luego la
cadena de datos a
grep para su fil-
trado.
En el siguiente
paso, el script uti-
liza el valor
devuelto por el
comando grep. Si
grep ha encon-
trado una coinci-
dencia en la bsqueda, devuelve 0. El opera-
dor && se asegura de que el script evale el
valor y slo ejecuta los siguientes comandos
echo si grep devuelve 0, que se interpreta
como ejecutado con xito y con una coinci-
dencia.
La salida es el nombre del fichero y las
lneas contienen las correspondencias desta-
cadas de la bsqueda. Los valores se
encuentran localizados en las dos variables,
fichero y buscarcoin. El contenido se enva a
la salida estndar. El punto y coma entre los
comandos echo indican el final de lnea. El
ltimo comando echo crea una lnea vaca
entre la salida, mejorando as la legibilidad
(Figura 5).
En los ejemplos, podremos sustituir el
grep -F por un patrn de bsqueda usando
grep -E en combinacin con una expresin
regular. El que se utilice una opcin u otra
depender de cmo de exhaustiva y flexible
necesite ser nuestra bsqueda. Este mtodo
tambin funciona con archivos tar compri-
midos: slo necesitamos introducir la opcin
para el formato de compresin, por ejem-
plo, -z para ficheros gzip comprimidos.
Combinaciones
Como no existe una versin especfica de
grep para RAR y 7-zip, resulta de nuevo til
combinar dos comandos: unrar o 7z por una
parte, y grep por la otra. Con unrar necesita-
mos la opcin p (de print). Esto le dice al
que zipgrep no estaba bien desarrollado, ya
que incluye opciones largas, pero sin sus
correspondientes opciones cortas (por ejem-
plo, --color)[3].
Por cada coincidencia, el programa pre-
senta el nombre del fichero, dos puntos, y
luego la lnea con la cadena coincidente. Si
deseamos resaltar las coincidencias, necesi-
tamos dar un ligero rodeo, porque zipgrep
tiene un problema con la opcin --color.
Como atajo, necesitamos usar una combi-
nacin de ambas herramientas (Figura 3). El
comando
$ zipgrep [Pp]rice.*pdf U
archive.zip | grep --color U
-E [Pp]rice.*pdf
combina dos comandos para formar una
cadena.
Archivos
Para archivos, generalmente necesitamos
comparar el contenido con un patrn, espe-
cialmente si no conocemos el nombre pre-
ciso o bien la fecha del ltimo cambio del
fichero que estamos buscando. La opcin
tar --to-std-out o -o reenva el contenido de un
fichero a la salida estndar. Entonces pode-
mos filtrar luego la cadena de datos rediri-
gindola a grep:
$ tar -x0vf U
archivo.tar | U
grep -F U
clavebusqueda
Tar procesa el archivo fichero por fichero. La
opcin -v le dice al programa que muestre los
datos a travs de dos canales: el contenido se
enva a la salida estndar (stdout), y los nom-
bres de ficheros se envan a la salida de error
estndar (stderr). La terminal mezcla estos
dos canales de manera que las lneas apare-
LINUX USER Lnea de Comandos: Bsqueda en ZIPs y TARs
76
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Figura 4: La lista de ficheros y bsquedas coincidentes se mezclan cuando buscamos los con-
tenidos del fichero de los archivos tar.
Figura 5: Resultado de la bsqueda y los ficheros mapeados.
01 for ficheros in $(tar -tf archivo.tar);
02 do
03 buscarcoin=$(tar -xOf archivo.tar
$fichero | grep -F cadenabusqueda) && echo
$fichero:;
04 echo $buscarcoin | grep --color -F
cadenabusqueda;
05 echo ;
06 done
Listado 2: Salida Legible
programa que muestre el contenido de los
ficheros compactados en nuestro archivo en
la salida estndar.
En el caso de 7-zip, necesitamos dos
opciones: -e extrae los ficheros, y -so controla
la salida. Redirigiendo la salida a grep:
$ unrar p archivo.rar | U
grep --color -E U
[Pp]rice.*pdf
$ 7z e archivo.7z -so | U
grep --color -E U
[Pp]rice.*pdf
podemos filtrar los datos.
Velocidad
En este punto, puede que sea el momento de
preguntarnos cul es la tasa de coincidencias
y de la velocidad con la que obtenemos los
resultados de bsqueda. A pesar de que exis-
ten herramientas especiales para formatos
especficos, esto no significa que funcionen
mejor. Las herramientas estndar se optimi-
zan a menudo al mximo.
Por hacer una comparativa que nos diera
valores bastante plausibles, usamos un
fichero con 12MB de texto ASCII en nuestro
laboratorio. El fichero se comprimi con los
programas mencionados y luego buscamos
en el fichero, una bsqueda utilizando las
herramientas que usan la salida estndar y
otra usando los programas de bsqueda
especficos para cada formato. La Tabla 5
muestra los resultados y la Figura 6 los ilus-
tra.
La lista de coincidencias fue idntica y
completa para todos los programas, pero el
tiempo para completar las tareas de compa-
racin de patrones fueron considerablemente
diferentes segn el programa utilizado,
siendo Xz el ms rpido y bzip2 el ms lento.
La Figura 6 muestra los tiempos medidos
para buscar los datos de texto. La primera
columna es la bsqueda con grep contra el
fichero descomprimido (12MB). Las colum-
nas adyacentes muestran la duracin para
una ruta de bsqueda especfica columnas
2 y 3 para bzip2 (1,8MB de datos), columnas
4 y 5 para gzip (2,4MB) y columnas 6 y 7
para xz (98KB). Hay que notar que podemos
asignar una duracin especfica para cada
bsqueda. La bsqueda usando la salida
estndar siempre presenta un rendimiento
similar al del programa especfico para cada
formato.
Considerando el nivel de compresin, el
formato xz vuelve a ser el ganador. Esta
herramienta comprime los datos mucho ms
que las otras. Como slo necesita leer 98KB
de disco, el tiempo de bsqueda se reduce. El
desempaquetado y la bsqueda ocurren por
completo en RAM, lo que hace que la
demora sea inferior.
Conclusiones
Es bastante fcil
buscar en archivos
de ficheros y datos
comprimidos siem-
pre que combine-
mos las distintas
herramientas
correctamente. Evi-
dentemente, esto
supone disponer
de un conoci-
miento bastante
completo de las
opciones y par-
metros. Si usamos
herramientas
especiales para
formatos de archi-
vos y paquetes de
compresin espe-
cficos, el tiempo
de bsqueda es
ligeramente
menor. Sin
embargo, compa-
rado con los comandos de la shell clsica, la
calidad de los resultados no difiere.
Las diferencias en trminos de velocidad
se hacen ms aparentes cuanto mayor es el
volumen de datos. Que esto juegue un
importante papel en el uso diario depen-
der de cada caso individual, de datos
archivados y de su volumen. A excepcin
de zipgrep, todas las herramientas que exa-
minamos cumplieron con nuestras expecta-
tivas.
La secuencia de comandos que usamos
diariamente las elegimos con frecuencia
por una razn comn: tiene nuestra distri-
bucin el paquete y est instalado? El nivel
de legibilidad del comando y el nivel de
idoneidad que espera el usuario tambin
pueden tener una mayor influencia en su
uso. Los atajos nos ahorran tiempo en la
salida y tambin pueden reducir la tenden-
cia al error.
Existen otras herramientas como grep
para otros formatos, incluyendo documen-
tos PDF (pdfgrep), datos de audio (taggrep-
per), listas de procesos (pgrep) y hojas de
clculo Gnumeric (ssgrep). Axel Beckert
ofrece una panormica en su blog [4].
Lnea de Comandos: Bsqueda de ficheros en ZIPs y TARs LINUX USER
77
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Figura 6: Los tiempos para que los comandos acaben la ejecucin difie-
ren considerablemente.
Tabla 5: Herramientas del Laboratorio
Tiempo (sec)
Mtodo Comando Real Usuario Sistema
Descomprimido time grep --color -E [Pp]rice.+pdf testlist 0,040 0,024 0,016
bzegrep time bzegrep --color [Pp]rice.+pdf testlist.bz2 0,824 0,832 0,036
bzip2+grep time bzip2 -dc testlist.bz2 | grep --color -E [Pp]rice.+pdf 0,826 0,832 0,036
zegrep
time zegrep --color [Pp]rice.+pdf testlist.gz 0,189 0,196 0,024
gunzip+Grep
time gunzip -dc testlist.gz | grep --color -E [Pp]rice.+pdf 0,173 0,184 0,016
xzgrep
time xzgrep --color -E [Pp]rice.+pdf testlist.xz 0,113 0,100 0,044
xz+Grep
time xz -dc testlist.xz | grep --color -E [Pp]rice.+pdf 0,097 0,108 0,020
[1] Tutorial grep de Drew: http:// www.
uccs. edu/ ~ahitchco/ grep/
[2] Desempaquetar paquete en Debian:
http:// packages. debian. org/ squeeze/
unp
[3] Informe de bug de Debian sobre zip-
grep: http:// bugs. debian. org/ cgi-bin/
bugreport. cgi?bug=652838
[4] grep everything: http:// noone. org/
blog/ English/ Computer/ Shell/
grep%20everything. futile
RECURSOS
Gracias a los autores Maximilian
Techter, Thomas Osterried y Thomas
Winde por sus aportaciones crticas y
comentarios durante la creacin de
este artculo.
Agradecimientos
COMUNIDAD Konsultorio
78
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
KNOPPIX de gran tamao, que con-
tiene el sistema de ficheros completo
de forma comprimida, y trata de leer
unos pocos bytes hacia atrs. Si esto
falla, significa que la unidad no es
capaz de leer los datos del archivo
completamente y el sistema se colgar
tarde o temprano debido a los datos
defectuosos.
En tu caso, creo que el archivo des-
cargado ISO podra estar incompleto o
haberse quemado a una velocidad
demasiado alta, lo que puede hacer
que los datos sobre los sectores exter-
nos del disco sean ilegibles. Tambin
podra ser que la unidad tenga un lser
descalibrado que sea incapaz de ras-
trear el flujo de bits grabados a partir
un cierto punto de la superficie del
DVD.
Si grabas la versin pblica descar-
gada de Knoppix, por favor asegrate
de que la unidad est configurada a
una velocidad que no cause desborda-
miento del bfer y grabe discos perfec-
tamente legibles. Para los CD por lo
general recomiendo 8x, y para los DVD
un velocidad mxima de escritura de
4x (aunque de 2x a 3x podra ser an
mejor, as como utilizar una unidad
USB 2.0 externa, ms fiable).
Si la unidad de DVD no se puede
sustituir, prueba a crear en un equipo
diferente una unidad flash USB con la
utilidad Install on flash disk y arranca
el ordenador con la unidad flash en
lugar del DVD, que es mucho ms
rpida.
Ahora bien, es muy poco probable que
los dos DVDs me hayan salido defec-
tuosos, as que prob nuevas opciones
de arranque: nodma, acpi=off y fail-
safe, todo ello en vano. S que las ver-
siones 6.7 y 7.0 de Knoppix usan com-
presin. Est ah el problema?
Mi equipo es un porttil Toshiba
Satellite P30 con 2GB de RAM y dual
Pentium CPU. La unidad de CD-ROM
es un MATSHITA DVD-ROM UJ-820S.
No es de doble capa. Funciona como
una mquina de arranque dual con
Debian y Windows XP.
Le agradecera su ayuda, ya que
parece que este problema est aqu
para quedarse (al menos para m) y me
gustara seguir usando Knoppix.
Recuerdos, Neville
El primer mensaje, the file /mnt-
system/ KNOPPIX/ KNOPPIX is bro-
ken resulta de una simple comproba-
cin rpida. El problema ms comn de
los defectos de CD y DVD es una des-
carga incompleta del archivo .iso gra-
bado. En el sistema de archivos ISO
9660, el ndice de contenidos se sita al
principio, por lo que no te dars cuenta
de que falta algo o sea ilegible cuando
se acabe de comprobar el contenido del
directorio: todos los archivos se ven y
tienen el tamao correcto en la lista,
pero en realidad la lectura de datos
desde el archivo ISO incompleto debido
a una parte inexistente dar lugar a un
error de lectura posteriormente.
La verificacin rpida de Knoppix
busca el final del archivo KNOPPIX/
EL
KONSULTORIO
DE KLAUS
Klaus Knopper es el creador de
Knoppix y co-fundador de la
LinuxTag Expo. En la actuali-
dad trabaja como profesor,
programador y consultor. Si
tienes algn problema de
configuracin o simplemente
quieres conocer mejor cmo
funciona Linux, no dudes en
escribir sus preguntas a:
preguntas@linux-magazine.es
DVD defectuoso
o la unidad ptica?
Hola Klaus, he estado usando los
DVDs de Knoppix de Linux
Magazine desde hace algn tiempo y
no he tenido problemas con las versio-
nes 6.1 a 6.5. Sin embargo, reciente-
mente he probado la versin 6.7 y me
muestra el mensaje del Listado 1, as
que prob con knoppix testcd y hace lo
mismo. Llegu a la conclusin de que
es posible que tenga un DVD defec-
tuoso y decid esperar a la siguiente
versin.
Cuando apareci Knoppix 7.0 en la
revista Linux Magazine, lo intent de
nuevo, y obtuve el mismo mensaje.
01 The file /mnt-system/KNOPPIX/KNOPPIX1 (size 3888060kB) is broken.
02
03 May be a problem during download or burning.
04 You may want to check deeper using knoppix testcd
Listado 1: Mensaje de error Knoppix 6.7
Konsultorio COMUNIDAD
79
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
errneas u obsoletas de alguna manera
ms fcil?
Las redefiniciones especficas de
los tipos de archivos respecto a
los programas se mantienen en
$HOME/ .local/ share/ applications/
defaults.list, que deberan parecerse al
ejemplo del Listado 2.
Como se puede ver, ni siquiera con-
tiene los nombres de los programas,
sino que enlaza a los archivos .desktop
de cada aplicacin. Si modificas las
opciones del programa o introduces
nuevos programas en el men contex-
tual, se crea un nuevo archivo .desktop
en $HOME/ .local/ share/ applications/
<nombre programa>.desktop que
contiene la lnea de comandos deseada
con las opciones.
Puedes modificar estos archivos con
cualquier editor de texto.
arranque con grub-mkpasswd-pbkdf2.
Tus propios cambios al men de GRUB
deberan ir a /etc/ grub.d/ 40_custom
para despus llamar con update-grub,
en lugar de editar /boot/ grub/ grub.cfg
directamente. Tecleando
sudo grub-mkconfig
se mostrar la nueva configuracin
antes de actualizar grub.cfg.
Para rescatar una instalacin GRUB2
que no arranca, es necesario iniciar
con un sistema Live, que no necesaria-
mente tiene que contener GRUB 2 (por
ejemplo, Knoppix sigue utilizando el
viejo GRUB para la instalacin del
disco duro), montar la particin raz y
de arranque de tu instalacin en el
disco duro, agregar /proc y /sys y luego
hacer chroot dentro de la jerarqua del
sistema de archivos
montado para llamar
a los scripts de
GRUB.
De esta manera,
puedes acceder a tu
sistema instalado,
sin tener que reinsta-
lar, y tratar de arre-
glar GRUB 2 desde
all. El apartado
Rescatar a GRUB 2
explica el procedi-
miento, que requiere
permisos de root
para que funcione.
Asociaciones
de Tipo de
Archivo
Hola Klaus, el
escritorio
LXDE parece ignorar
/etc/ mailcap para
encontrar el pro-
grama preferido para
un tipo de archivo o
extensin. Esto es
algo comprensible,
ya que puedo editar
las asociaciones de
archivos con el men
contextual del
archivo y Abrir con.
Pero, dnde guarda
LXDE esta informa-
cin? Puedo modifi-
car las asociaciones
Detalles de GRUB
Estimado Klaus, recientemente
he instalado GRUB 2 en mi Gen-
too Linux, pero estoy teniendo proble-
mas para entender la documentacin
de este nuevo gestor de arranque. He
trabajado en crear las entradas de
men para cargar el kernel Gentoo, sin
embargo, trat de encadenar mi sis-
tema operativo secundario (Ubuntu)
con el multiboot y/ o comandos chain-
loader para conseguir entender cmo
se hace esto, pero no logr hacer que
funcionase.
El comando multiboot parece detec-
tar el gestor de arranque de Ubuntu
(core.img), pero simplemente reinicia
en silencio el ordenador en lugar de
cargar el sistema operativo. As que,
cules son las diferencias entre los
comandos? Cmo se utilizan?
Saludos cordiales, Toms
GRUB 2 es diferente del viejo
GRUB en varios aspectos. Para
asegurarte de que tiene suficiente espa-
cio disponible en el master boot
record, asegrate de que la primera
particin comienza en la ubicacin
recomendada del sector 2048, en lugar
del DOS-compatible sector 63.
GRUB 2 carga dos imgenes,
boot.img y core.img, que contienen los
programas y controladores de disco
duro y de acceso al sistema de archivos
usando el chipset de la computadora
(tambin es posible un arranque EFI).
Adems, los mdulos para tareas espe-
cficas se cargan bajo demanda.
El archivo de configuracin principal
es ahora /boot/ grub/ grub.cfg, que se
crea automticamente y se actualiza en
Ubuntu mediante el comando
sudo update-grub
que lee los parmetros de
configuracin almacenados como
variables de shell desde /etc/ default/
grub y llama a los scripts de shell de
/etc/ grub.d/ * con el fin de escribir la
configuracin deseada en /boot/ grub/
grub.cfg. Por tanto, la forma recomen-
dada en Ubuntu no es cambiar grub.cfg
directamente, sino cambiar los par-
metros de /etc/ default/ grub y ejecutar
el comando anterior.
Existen varias utilidades auxiliares
que tambin ayudan con diferentes
tareas, como crear una contrasea de
En este ejemplo, el sistema de archivos raz es /dev/ sda2 y la
particin de arranque es una particin separada, /dev/ sda1, y
contiene kernels, ramdisk inicial y la configuracin de GRUB.
Sigue estos pasos:
1. Arranca desde el sistema Live, obtn la shell de root.
2. mkdir /rescue
3. Monta el sistema de archivos con los dispositivos, suid, y
permiso exec:
mount -o dev,suid,exec /dev/sda2 /rescue
4. Monta la particin /boot.
mount /dev/sda1 /rescue/boot
5. Monta con Bind los directorios del sistema, incluyendo los
submounts.
mount --rbind /proc /rescue/proc
mount --rbind /sys /rescue/sys
mount --rbind /dev /rescue/dev
6. Cambia a root en /rescue
chroot /rescue
7. Ahora, cambia la configuracin de GRUB mediante la modi-
ficacin de /etc/ default/ grub y /etc/ grub.d/ 40_custom, a conti-
nuacin ejecuta:
update-grub
y/ o reinstala el bootloader en el MBR con
grub-setup /dev/sda
8. Finaliza chroot.
exit
No olvides desmontar con umount la particiones de arranque
y raz, o al menos llamar a sync para asegurar que todos los
datos se escriben antes de reiniciar.
Rescatar a GRUB 2
01 [Default Applications]
02 application/pdf=kde-kpdf.desktop
03 application/x-cd-image=gnome-mplayer.desktop
04 application/x-java=java.desktop
05 application/docbook+xml=openoffice.org-writer.
desktop
06 ...
Listado 2: Tipos de Archivo por Defecto
COMUNIDAD Distros a Medida
H
ace poco estuve en Nigeria para
asistir a Idlelo 5, en la que se con-
gregaron los lderes del software
libre de todos los pases de frica. Al final
de la conferencia, estaba hablando con un
joven brillante reconocido por los dems
asistentes como un joven y prometedor
programador. Le pregunt en qu proyectos
estaba trabajando y me dijo que quera
comenzar una distribucin. Admito que me
estremec, porque s que ya hay ms de
500 distribuciones GNU/ Linux (algunos
dicen que 600, pero todas no estn activas).
Le pregunt la razn por la que quera
crear su propia distribucin y me dijo que
quera una que estuviera hecha a medida
para frica, con salvapantallas de pases
de frica, fondos de escritorio, traduccio-
nes y otras cosas ms. Tambin me dijo que
quera aprender a crear una distribucin.
Aunque me di cuenta de que quera
aprender, seal que la creacin de una dis-
tribucin era mucho trabajo y que l podra
ser capaz de emplear mejor su tiempo en
algn otro proyecto o ayudando a mejorar
alguna distribucin. Despus de todo,
cuando tienes tu propia distribucin (sobre
todo una que quieres que usen los dems),
tienes que configurar servidores para des-
cargarla, escribir documentacin, realizar
tus propias pruebas y seguimiento de erro-
res y as sucesivamente. Por lo tanto, es
mucho ms difcil que aprovechar lo que
han hecho los dems.
Crear una distribucin completa no slo
requiere mucho trabajo, adems hay que
animar a la gente a que la use y conseguir
que llegue a depender de ella. Si la distribu-
cin es slo para tu uso, entonces estamos
hablando de mucho trabajo para una
audiencia realmente pequea.
Por supuesto, hoy en da lo que mucha
gente llama una distribucin, otros la lla-
man una derivada, un re-empaquetado
de una distribucin ya existente, pero con
un conjunto de paquetes hecho a medida
para un uso en particular. Este enfoque se
aprovecha de todo el trabajo de la distribu-
cin subyacente y permite adaptar los
paquetes y la instalacin a tus necesida-
des. Muchas de las distribuciones principa-
les, sino todas, apoyan la realizacin de
derivadas y algunas incluso tienen herra-
mientas para crear derivadas. OpenSUSE
tiene SUSE Studio [1], que te permite cons-
truir una derivada a partir de su conjunto
de componentes y Fedora tiene Revisor
con una agradable interfaz grfica. Debian
tiene un mecanismo de compilacin
basado en web llamada Proyecto Debian
Live [2], que te permite especificar los
paquetes de base.
Mediante la creacin de una derivada,
puedes eliminar la necesidad de descargar
los ocho (o nueve, he perdido la cuenta)
DVDs de binarios de una distribucin com-
pleta como Debian, consiguiendo tal vez
que todo lo inicialmente necesario quepa
en un CD-R o DVD. Una vez creada la ima-
gen .iso, puedes descargarla una vez, poner
un DVD-R o unidad de disco USB e instalar
tantos sistemas como desees. Desafortu-
nadamente, la mayora de estas herra-
mientas funcionan slo para los jue-
gos de instrucciones Intel/ AMD y
ARM. Motorola y otras arquitectu-
ras se quedan fuera a la intempe-
rie, incluso si la instalacin de
base las admite.
Otra forma de crear una distribucin es
utilizar un script de inicio a medida, res-
pondiendo a una serie de preguntas como
si los estuvieras escribiendo en la consola.
Esta posibilidad ha estado disponible desde
hace varios aos y generalmente se usa
para instalar de una manera homognea
una gran cantidad de servidores a la vez,
pero tambin podra usarse para crear una
distribucin personalizada haciendo que el
script de instalacin de una distribucin
estndar tire de paquetes adicionales desde
la red o de cualquier otra parte y ejecutar
los comandos necesarios para adaptar la
distribucin de la manera deseada. Este
enfoque tiene la ventaja aadida de ser
capaz de utilizar distribuciones para dife-
rentes arquitecturas (por ejemplo, ARM,
Motorola, PowerPC, MIPS), ya sea con la
misma secuencia de instalacin, lo ms
habitual, o con cambios menores.
Los scripts de instalacin es la tcnica del
Proyecto Cau [3] y se utilizar para insta-
lar millones de servidores, clientes ligeros y
sistemas virtuales. Los miembros del pro-
yecto han considerado la creacin de una
distribucin propia, pero usando esta tc-
nica se puede lograr el mismo resultado
con mucho menos esfuerzo. Y mantendr
la cercana necesaria con la distribucin
base para poder enviar correcciones de
errores y mejoras hacia la distro principal.
En este momento de la vida de GNU/
Linux, me gustara animar a aquellas per-
sonas que quieran crear su propia distri-
bucin a considerar seriamente trabajar
con una distribucin ya existente. nete a
su equipo y aprende cmo crear una dis-
tribucin, para despus poner la tuya en
rbita.
Crear distribuciones a medida
DERIVADAS
Maddog plantea los beneficios de la creacin de tu propia distro derivada. POR JON MADDOG HALL
[1] SUSE Studio: http:// susestudio. com/
[2] Proyecto Debian Live:
http:// live-build. debian. cgi-bin/ net/
live-build
[3] Proyecto Cau v0.5:
https:// www. linux-magazine. es/
issue/ 81/ 077-077_MaddogLM81. pdf
RECURSOS
80
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
PRXIMO NMERO PRXIMO NMERO
i
r
u
m
x
d
e
,

1
2
3
R
F
Conviviendo
con Windows 8
A LA VENTA: MARZO 2013
82
Nmero 90 WWW. L I NUX- MAGAZI NE. ES
Sguenos en nuestras redes sociales:
Facebook: facebook. com/ linuxmagazine. es
Twitter: twitter. com/ linux_spain
Google+: plus. google. com/ b/ 101673494113753130304/
Identi.ca: identi. ca/ linuxspain/
Tras las publicacin y puesta a la venta de Windows 8, los
interrogantes sobre la coexistencia entre GNU/ Linux y el
nuevo sistema de Microsoft son ms relevantes que nunca:
funcionar W8 en una mquina virtual? Necesitar cambiar
algo en Samba? Podr acceder a mis ficheros Linux desde
Windows (y viceversa)? Qu pasa con el arranque seguro? En
el nmero 91 de Linux Magazine contestamos a todas estas
preguntas y a algunas ms.

You might also like