Archivo por meses: febrero 2009

Actualizado a WordPress 2.7.1

Por fin, ya era hora. He pasado de la versión 2.3 a la 2.7.1 directamente, sin pasar por la casilla de salida que se dice. La verdad es que ha sido todo muy cómodo y no me ha dado ningún problema, todo ha funcionado a la primera y en media hora tenía todo funcionando.

¿Lo peor? Los cambios, muchos, tendré que esperar a acostumbrarme a la nueva interfaz para criticar algo 😛 . Me pierdo por todas partes y encima me queda menos espacio para todo.

Lo primero que me ha resultado raro e incómodo respecto a cómo solía trabajar es la nueva interfaz de subida de imágenes. Antes podía estar subiendo y escribiendo simultáneamente, ahora no, si subo no escribo y viceversa. Sin embargo se ha ganado comodidad al poder subir varios archivos de golpe. Veremos dentro de un par de semanas qué opino.

Fin de semana en Alcoceber, Peñíscola y el Castillo de Xivert

Hace unas semanas aprovechamos un fin de semana para acercarnos a Alcoceber (Alcossebre en valenciano), en la costa castellonense para, desde allí, hacer algunas excursioncitas. Había estado por esa zona allá por el año 2000 o 2001 y guardaba un grato recuerdo de ella, mucho menos saturada que la mayoría de la costa mediterránea, y no me defraudó.

Alcoceber es un encantador pueblo costero víctima del turismo como la mayoría de la costa, aunque en menor medida que los demás. Se aprecia el desarrollo urbanístico pero bastante comedido para lo que se suele ver por aquí.

La mañana del sábado la pasamos paseando por la costa y por el pueblo, hacía un día bastante insípido, nublado por momentos y soleado en otros, pero la playa estaba sencillamente preciosa con el mar un poco picado.

Alcoceber

Alcoceber

Alcoceber

Alcoceber

Al atardecer dedicimos acercarnos a cenar a la vecina localidad de Peñíscola (apenas 30km) pero la lluvia deslució nuestra velada. Me encanta este sitio (fuera de la temporada estival, claro). Estuve hace 4 ó 5 años visitando el castillo y me pareció fantástico en aquel momento. Esta vez no pudimos entrar ya que se había hecho muy tarde y estaba cerrado 🙁 , pero aprovechamos para pasear por el casco antiguo del pueblo, tomar unas cañas, y, como no, hacer algunas fotos de las dos bahías, ya que Peñíscola es casi una isla amurallada (bueno, una península 😛 ).

Peñíscola

Me encanta como me quedaron estas fotos de noche, con paciencia, y eso que estaba lloviendo y tenía que sujetar el paraguas 😛 . Fijáos en la apariencia de manto que tienen las aguas.

El casco antiguo se presenta imponente de noche, con sus estrechas, empedradas  y empinadas callejuelas, todas bien  iluminadas para realzar el conjunto amurallado.

Peñíscola

PeñíscolaPeñíscolaPeñíscola

El castillo se conoce como del Papa Luna por  Benedicto XIII, nombrado Papa en 1394 a la muerte de Clemente VII. Francia se opuso a su nombramiento pese a haber sido elegido por 20 de 21 votos ya que no podrían influenciar en él, además de que era súbdito de la Corona de Aragón, llegándose al Cisma de Occidente, donde llegó a haber tres Papas simultáneamente y que terminó con el Concilio de Constanza, dónde fueron depuestos los tres y elegido Martin V, que llegó incluso a intentar el envenenamiento del Papa Luna. Benedicto XIII siempre defendió su papado al ser nombrado cardenal antes del Cisma, pero finalmente las decisiones conciliares fueron superiores a sus ideas.

A su muerte se eligió en el mismo Castillo de Peñíscola a Clemente VIII, que terminaría abdicando por cuestiones políticas en favor de Martin V en San Mateu, cerquita de  Morella.

La historia del Papa Luna está repleta de hechos e historias milagrosas. Una de las más conocidas es la que asegura que con su manto y su báculo podía ir caminando sobre las aguas del Mediterráneo desde su castillo hasta Roma. ¿Teletransportación medieval? 😛

Peñíscola

PeñíscolaPeñíscola

PeñíscolaPeñíscola

La lluvia nos aguó la fiesta en Peñíscola, así que decidimos regresar a Alcoceber a la hora de cenar y acostarnos pronto para aprovechar la mañana del domingo (si el tiempo lo permitía).

De regreso a nuestro punto de partida buscamos dónde cenar y nos llamó la atención algo parecido a un asador vasco, en la zona de bares y restaurantes del puerto deportivo de Alcoceber, en la parte interior, el primero subiendo desde el sur. Lo siento, no recuerdo el nombre. Restaurante Asador Guetaria.

La cena fue increíble, en el segundo plato entenderéis porque. Ya sé que algunos echábais ya de menos fotos de comida en mis artículos 😛 .

Pedimos de primero revuelto de gulas con gambas. Para mi exquisito, mi acompañante no pudo disfrutar de este plato ya que no le gusta nada que lleve o huela a cebolla… más me toca 🙂 .

img_4345.JPG

Aquí viene lo verdaderamente importante de la cena. Con la emoción me olvidé de la foto de rigor, así que la tuve que hacer después de acabarlo, aún así creo que se aprecia perfectamente la magnitud del chuletón de buey que nos metimos entre pecho y espalda. Nada más y nada menos que 1,4kg de uno de los mejores chuletones que he comido en mi vida, bien servido en una bandeja que mantiene el calor, si no a mitad de chuletón estaría ya congelado. Y es que por mucho que presuma de que me encantan los pescados y los arroces, soy carnívoro por naturalez, aquí ha quedado demostrado.

img_4346.JPG

Después de semejante cena no pudimos más que acostarnos y dormir, aunque eso es un decir. Tremendo temporal que hizo ese día por la noche, parecía que el hotel iba a salir volando. Cual sería nuestra sorpresa, sin embargo, cuando al levantarnos el domingo nos topamos con un bonito día soleado, o lo más parecido a eso que se podía tener en aquellas condiciones.

El temporal había dejado la playa totalmente encharcada, las olas debieron de ser gigantestas, pero ahora el mar se presentaba antes nosotros en toda la brabura que puede dar el Mediterráneo.

Alcoceber

Alcoceber

Después de desayunar y dar un paseíto por la playa nos acercamos hacia otro de mis destinos pendientes (siempre digo lo mismo, ¿no?), el Castillo de Xivert.

Tomando la carretera nacional en dirección a Peñíscola y justo tras dejar a mano izquierda una gasolinera y a mano derecha el desvío a Alcalá de Xivert, se encuentra un pequeño y mal señalizado (y recalco lo de pequeño) desvío a mano derecha que conduce al castillo. Tras unos minutos de pista asfaltada donde comenzamos a divisar el edificio, habrá que tomar una pista de tierra a mano izquierda. Me habían avisado que la pista sería intransitable con un turismo, pero nada más lejos de la realidad, aún a pesar de la tormenta de la noche anterior, la pista estaba perfecta para el coche. Tras unos 7km de pista llegamos a una especie de merendero, ahí dejamos el coche y seguimos las indicaciones que, tras 100 ó 200m de sendero a pie por el bosque, nos deja a los pies del castillo.

Castillo de Xibert

Castillo de Xibert

En plena Sierra de Irta se alza monumental este castillo de origen árabe reconquistado por Jaime I en 1234 (tras tomar precisamente Peñíscola) y entregado a la Orden del Temple. Las dos gigantescas torres circulares unidas entre sí que le dan la majestuosidad que tiene, fueron obra de los Templarios. Dicen que es uno de los más bellos y completos de toda la Comunidad Valenciana. Doy fé, me pareció increíble, sin restaurar apenas se mantiene imponente. Ahora mismo están realizando tareas de restauración, lástima, por lo poco que he visto creo que no me va a gustar lo que van a hacer…

Castillo de Xibert

Castillo de XibertCastillo de XibertCastillo de XibertCastillo de XibertCastillo de Xibert

En los alrrededores del castillo se encuentra el antiguo poblado, bien señalizado por el sendero del bosque que os comentaba anteriormente. Al llegar verás una gran puerta de hierro, abre el cerrojo, no está cerrado con llave 😛 . Este espacio, rodeado también de murallas, fue el resultado de la ampliación que realizaron los árabes para albergar a la población y al ganado y protegerlos de las amenazas.

Castillo de Xibert

Castillo de XibertCastillo de XibertCastillo de XibertCastillo de Xibert

Supongo que los que me seguís os habreis dado ya cuenta de que soy un apasionado de los castillos, hay muchas referencias a ellas en mi blog. Pues bien, éste es alucinante por que NO está restaurado, al menos no todavía,  y se conserva fantásticamente para tener más de 1000 años, sí, has leído bien. Si os gustan los castillos y el contacto con la naturaleza, os lo recomiendo encarecidamente, podéis incluso subir hasta el castillo por la ruta de senderismo que lleva directamente a él.

Marcos regresa por la puerta grande

Han tenido que pasar 6 meses desde su “Sayonara Baby“, no publicado oficialmente pero si extraoficialmente al dejar de escribir, para que mi buen amigo Marcos retome su blog. Y lo ha hecho por la puerta grande, con un artículo a página completa en El País, sí, el de papel, el de toda la vida, con foto de hambriento incluída.

El reportaje habla de personas de a pié que han convertido sus blogs personales en lo mejor posicionado por su apellido, en su caso no sólo García sino también su nombre de pila, por “Marcos” aparece por encima de todas las empresas de “marcos” (de puertas, ventanas, cuadros…).

Desde aquí mi más sincera enhorabuena a Marquiños. ¡Que nos debes una comida de las buenas! El próximo viaje a Madrid no hay excusas 😛 .

Usuarios de ftp virtuales con vsftpd y MySQL

Un problema que se me ha presentado más de una vez es dar acceso FTP a determinadas carpetas a usuarios que necesitan actualizar archivos en ellas. Por regla general habría que crear un usuario del sistema que tuviese su “home” en esa carpeta o un enlace simbólico desde otra, pero nunca me ha gustado la idea de crear usuarios a diestro y siniestro, aunque sean sin privilegios. Buscando un día, empecé a encontrar información sobre cómo crear usuarios “virtuales” en vsftpd y me gustó mucho la idea, combinando esto con la gestión de usuarios en MySQL podría tener un sistema bastante sencillo de dar acceso FTP a unos cuantos usuarios sin incrementar los del sistema y, por tanto, sin abrir agujeros de seguridad.

Lo primero será instalar los módulos necesarios, asumiendo que ya tienes el servidor MySQL funcionando. Nos hará falta el paquete vsftpd y el pam_mysql que permitirá hacer autentificaciones contra una base de datos de este tipo.

yum install pam_mysql vsftpd

Ahora configuramos el archivo /etc/pam.d/vsftpd para que quede así;

[osus@servidor vsftpd]# cat /etc/pam.d/vsftpd
auth required /lib/security/pam_mysql.so user=vsftpd passwd=clave host=localhost db=basedatos table=usuarios usercolumn=usuario passwdcolumn=pass crypt=0
account required /lib/security/pam_mysql.so user=vsftpd passwd=clave host=localhost db=basedatos table=usuarios usercolumn=usuario passwdcolumn=pass crypt=0
session required /lib/security/pam_mysql.so user=vsftpd passwd=clave host=localhost db=basedatos table=usuarios usercolumn=usuario passwdcolumn=pass crypt=0

Esto indica a vsftpd que debe autenticarse contra “basedatos” en “localhost” con el usuario “vsftpd” y la clave “clave” y que debe buscar en la tabla “usuarios” con las columnas  “usuario” y “pass“. Qué evidente es todo 😛 .

El último parámetro, “crypt“, indica el modo en que se guardarán las claves:

  • 0 para claves en texto plano sin encriptar
  • 1 para claves encriptadas con la función crypt()
  • 2 para claves generadas con la función PASSWORD() de MySQL
  • 3 para claves en md5

Escoge el sistema que prefieras. Dejaremos ahora el archivo de configuración principal de este modo:

[osus@servidor vsftpd]# cat /etc/vsftpd/vsftpd.conf
ftpd_banner= "Servidor FTP"
anonymous_enable=NO
chroot_local_user=YES
guest_enable=YES
guest_username=ftpoculto
hide_ids=YES
listen=yes
listen_address=192.168.3.254
listen_port=21
local_enable=YES
max_clients=100
max_per_ip=5
pam_service_name=vsftpd
use_localtime=YES
user_config_dir=/etc/vsftpd/usuarios
userlist_enable=YES
userlist_file=/etc/vsftpd/denied_users
virtual_use_local_privs=YES
xferlog_enable=YES
async_abor_enable=YES
connect_from_port_20=YES
dirlist_enable=NO
download_enable=NO
local_umask=000

Con esto le estamos diciendo que no permitiremos el acceso anónimo y que el usuario real que se utilizará será “ftpoculto“, los usuarios virtuales se comportarán como este usuario. Le indicamos, además, que busque los usuarios virtuales en /etc/vsftpd/usuarios y que no deje entrar a ningún usuario real, sólo a los virtuales. Para esto último haremos lo siguiente:

cat /etc/passwd | cut -d ":" -f 1 | sort > /etc/vsftpd/denied_users

Así añadimos a la lista de usuarios denegados a todos los usuarios del sistema, no hay que ponerlos a mano uno a uno 🙂 .

Ahora debemos configurar el acceso para cada usuario dentro de la carpeta “usuarios“. El nombre del archivo debe ser el mismo que el del usuario que se ha añadido a la base de datos, el que utilizará el cliente para conectarse. Yo, por ejemplo, suelo utilizar como nombres el dominio del cliente, así se quién es quién.

[osus@servidor usuarios]# cat tudominio.com
dirlist_enable=YES
download_enable=YES
local_root=/var/www/tudominio.com/
write_enable=YES
anon_world_readable_only=NO

Tendremos que configurar el directorio de este usuario para que pueda escribir en él. Para conseguirlo recordamos que vsftpd utilizaría el usuario real “ftpoculto“. Debemos, por tanto, dar permisos sobre los directorios de los usuarios virtuales a ese usuario:

chown -R ftpoculto.users /var/www/tudominio.com

Con esto, el usuario “tudominio.com” podrá moverse en /var/www/tudominio.com a sus anchas 🙂 .

La verdad es que me ha funcionado muy bien siempre. Si se combina con un sistema de acceso VPN sencillo, de manera que el puerto FTP no tenga que estar abierto púclibamente, queda todo muy robusto y seguro además de que es muy sencillo añadir nuevos usuarios, incluso lo puedes automatizar con un script ya que solamente hay que añadir un registro en la base de datos y crear el archivo de configuración en /etc/vsftpd/usuarios.

Es una buena idea en pequeños entornos ISP no dedicados o especializados, entornos donde los usuarios no van a necesitar habitualmente acceso FTP (cms, blogs, webs corporativas…).

Hay muchos más parámetros en vsftpd, desde limitar el ancho de banda por usuario hasta utilizar SSL en las conexiones, sólo hay que leer un poco la documentación 🙂 .

Adobe AIR V – Trabajando con bases de datos locales sqlite

Llegamos al penúltimo capítulo de esta serie acerca de Adobe AIR. Hoy veremos como trabajar en local con datos persistentes de manera que podamos recuperarlos en otras sesiones. Al decir en local me refiero a que no se necesita conexión a Internet para salvaguardarlos, no se utilizará una base de datos remota sino el propio ordenador del cliente.

A diferencia de las aplicaciones Flash embebidas en un navegador, AIR permite el acceso completo al sistema de archivos del sistema operativo, no tiene las limitaciones de la máquina virtual Flash ni las políticas de seguridad, así que podemos crear, abrir, modificar y guardar cualquier archivo.

Si unimos todo esto con sqlite obtenemos lo que buscamos ya que AIR trae soporte nativo para sqlite con lo que guardar y consultar datos con sentencias sql no será un problema, más sencillo imposible.

AIR permite dos modos de trabajo con sqlite, síncrono y asíncrono. La diferencia es obvia, en el primer tipo se espera a que la ejecución de las instrucciones sql termine para continuar la ejecución de la aplicación, mientras que en el modo asíncrono se utilizan eventos que se disparan cuando se da por finalizada la consulta. En modo sincrono debemos ejecutar todo enjaulado en estructuras try/catch para prevenir errores y excepciones.

Aunque puedes crear la base de datos directamente desde la propia aplicación con sentencias CREATE TABLE, yo prefiero distribuir la aplicación con la base de datos ya creada, es mucho más cómodo. Para crearlas suelo usar dos utilidades:

También puedes hacer tu propia aplicación AIR para gestionar bases de datos sqlite, no conozco ninguna pero sería muy útil. ¿Quién se atreve? 🙂

Con cualquiera de ellas podremos crear la estructura de nuestra base de datos que copiaremos en el directorio del código fuente, para que al compilarla y empaquetarla se distribuya con ella.

Como no todos los sistemas operativos permiten a cualquier usuario escribir en la ruta de instalación de las aplicaciones, lo mejor y más recomendable es copiar la base de datos “base” en la carpeta de usuario del cliente que está ejecutándola ya que ahí siempre tiene permisos. Para hacerlo AIR nos provee de todos los mecanismos necesarios.

Con los métodos userDirectory y applicationDirectory de la clase File accedemos a las rutas de usuario y de la aplicación respectivamente independientemente del sistema operativo sobre el que está corriendo la aplicación, con lo cual hacemos el proceso completamente transparente.

var a:File=File.userDirectory.resolvePath("basedatos.db");
if(!a.exists){
    var b:File=File.applicationStorageDirectory.resolvePath("basededatos.db");
    b.copyTo(a, true);
}

Sencillo y evidente, sobran más explicaciones. Sabiendo esto es ya muy fácil conectar a la base de datos. Utilicemos el método síncrono antes comentado.

private var dbFile:File;
private var conn:SQLConnection;
private var q:SQLStatement;  

private function iniciaDB():void {
    var dbFile:File=File.userDirectory.resolvePath("basededatos.db");
    if(!dbFile.exists){
        var b:File=File.applicationStorageDirectory.resolvePath("basededatos.db");
        b.copyTo(dbFile, true);
    }
    conn = new SQLConnection();
    try{
        conn.open(dbFile);
    }catch (error:SQLError){
        Alert.show("ERROR ABRIENDO BBDD "+error.message+" "+error.details);
    }
}

¡Ya estamos dentro de la base de datos! Sólo nos queda ejecutar consultas y recuperar los resultados. No tiene mucha ciencia. Veamos un ejemplo para que queda bien claro.

var q:SQLStatement;
var result:SQLResult;

q.text = "SELECT campo1, campo2 FROM tabla";

try{
   q.execute();
   result=q.getResult();
   if(result.data){
     var numResults:int = result.data.length;
     for (var i:int = 0; i < numResults; i++){
        var r:Object = result.data[i];
        //accedemos a los campos desde el objeto, r.campo1, r.campo2
     }
   }
}catch (error:SQLError){
  //la consulta nos ha devuelto un error
}

Eso es todo como iniciación sqlite desde AIR. Del mismo modo se pueden ejecutar instrucciones INSERT, DELETE

A partir de aquí puede seguir cualquiera 😛 .

En el próximo y último capítulo veremos como hacer ventanas de notificación instantáneas y no intrusivas, del estilo de los avisos de conexión del Messenger 😉 .

Sindicado en Planet Webdev

Si el verano pasado añadía mi blog (o más bien me lo aceptaban 😛 ) en Planeta Código, ahora comienzo a aparecer en Planet Webdev. Creo que es una buena manera de que gente que habitualmente no lee tus artículos pueda llegar a ellos indirectamente y, si de paso, les sirven de algo, mejor que mejor.

Comencé a escribir para compartir mis experiencias de los últimos años como técnico aunque la realidad es que me ha servido para recordar cosas y conceptos que hace tiempo tenía olvidados. El objetivo es, sencillamente, aprender escribiendo.

A lo largo de este año posiblemente se vea un cambio de orientación reduciendo los artículos más técnicos y enfocándome más hacia la opinión, gestión de proyectos, management… espero que a todos os siga interesando igual.

Un abrazo a todos.

Chuletón & Blogs de Cucharete

Primero fue el Sabadete (y su resultado),  después llegó el Vinete (y así ourrió) y ahora llega el Chuletón & Blogs. Cucharete, el sitio de los restaurantes de Madrid, invitará el próximo 17 de marzo a un peazo chuletón de 40 euros a 30 bloggers que comenten el evento en su blog.

Chuleton & blogs by Cucharete

No me cabe ninguna duda de que Marcos y su equipo saben lo que hacen. Estuvimos el pasado fin de semana charlando y comiendo juntos aprovechando un viaje que tuve que hacer a Madrid y tanto él como Nines están a tope con el evento, seguro que a medida que se acerque el día el estrés irá en aumento ya que no suelen dejar ningún detalle al azar.

¿Por qué quiero ir? En realidad no quiero 😛 , más bien no puedo, me pilla un poco a desmano 😛 , pero hablando en condicional, me encantaría ir por varias razones:

  • La comida, obviamente, la mejor excusa, y si viene regada por semejante vino, mejor aún.
  • El evento en sí mismo. Si aún no has visto las crónicas de los anteriores hazlo ahora y lo entenderás.
  • La gente, tanto blogger reunido tiene que dar para mucha historieta y batallita.

Y si no quiero ir, ¿por qué escribo? 😛 . Por que son mis amigos y siempre están ahí. Por que un blog es (o debiera de ser) un medio de comunicación libre y abierto, no un sistema de favores, recomendaciones ó intercambios. Y porque me da la gana 🙂 .

¡Suerte!

Adobe AIR IV – Detectando el estado de la conexión

Continuamos con la serie de artíulos sobre Adobe Air. Hoy trataremos un tema curioso como es detectar si el cliente dispone de conexión a Internet. ¿Qué utilidad puede tener saberlo? Sencillo, permitir que la aplicación trabaje en modos offline y online.

Esta parte viene bastante bien explicada en el manual. Existe un evento “NETWORK_CHANGE” que no sirve para nuestro propósito 😐 .  ¿Para qué sirve entonces? Para detectar cambios en las interfaces de red en general. Este evento se dispara cada vez que se producen modificaciones en alguna de las interfaces de red de la máquina que ejecuta la aplicación, lo que no quiere decir que cambie el estado de la conexión a Internet ya que este evento no sabe si hay o no salida a Internet ni a través de cual de las interfaces se sale. ¿Qué utilidad puede tener entonces? No lo sé 😛 , pero ahí está el evento por si lo quieres utilizar para algo…

NativeApplication.nativeApplication.addEventListener(Event.NETWORK_CHANGE, onNetworkChange);
function onNetworkChange(event:Event)
{
    //Check resource availability
}

Para nuestro propósito debemos utilizar la clase URLMonitor que, como su propio nombre indica, sirve para monitorizar una URL. En efecto, así es como AIR detecta el estado de la conexión, conectando periódicamente a la URL que le indiquemos. Si no puede alcanzarla asume que te has quedado sin salida a Internet. Vamos, que si estábais esperando algo superavanzado y chulo, podéis seguir esperando, es el método más tradicional que existe: leches, no puedo conectar con Google, habré perdido la wifi. Es lo mismo 😛 .

import air.net.URLMonitor;
import flash.net.URLRequest;
import flash.events.StatusEvent;

var monitor:URLMonitor;
monitor = new URLMonitor(new URLRequest('http://www.adobe.com'));
monitor.addEventListener(StatusEvent.STATUS, announceStatus);
monitor.start();

function announceStatus(e:StatusEvent):void {
    trace("Status change. Current status: " + monitor.available);
}

Dentro de la función, lo que nos interesa es el valor de monitor.available, true ó false, lo que nos indicará si podemos o no conectar con la URL. Éste es, en realidad, el concepto de URLMonitor, determinar si una URL es alcanzable o no. Que una URL no sea alcanzable no quiere decir que no tengas acceso a Internet, sólo que no tienes con aquella URL. La comprobación, por tanto, debería hacerse con la URL del backend de nuestra aplicación y no con cualquier URL en general ya que de quien depende nuestra aplicación es de nuestro backend, no de Google 😛 .

El mismo sistema se puede utilizar para comprobar el estado de cualquier aplicación que escuche en un puerto distinto al 80. La explicación sería exactamente la misma y lo haríamos de este modo:

import air.net.ServiceMonitor;
import flash.events.StatusEvent;

socketMonitor = new SocketMonitor('www.adobe.com',6667);
socketMonitor.addEventListener(StatusEvent.STATUS, socketStatusChange);
socketMonitor.start();

function announceStatus(e:StatusEvent):void {
    trace("Status change. Current status: " + socketMonitor.available);
}

En el próximo capítulo veremos cómo añadir potencia a nuestras aplicaciones utilizando sqllite para guardar datos offline. Si combinamos la posibilidad de guardar datos en la aplicación con la de comprobar el estado de red contra el backend podremos hacer que nuestra aplicación funcione en modo offline guardando lo que necesitase enviar y procesándolo cuando tenga conexión. Creo que no se ha entendido bien, pongamos un ejemplo práctico.

Tengo una aplicación que permite enviar SMS a móviles a través de una pasarela HTTP que será quien haga los envíos. Mi aplicación pide el número de destino y el texto a enviar, conecta con la pasarela y le pasa el mensaje que quiero enviar. Como es lógico, si en el momento de enviar no tengo conexión con la pasarela, no podré enviar el SMS. Tengamos ahora presente lo que acabamos de ver en este artículo… ¡puedo saber en cada momento si la pasarela HTTP es alcanzable!  Si cuando voy a hacer el envío no tengo conexión, los guardo en mi base de datos sqllite y cuando cambie el estado de la conexión (URLMonitor me avisará) lanzo todos los envíos pendientes.

Seguro que si lo piensas un poco tú también le encuentras alguna utilidad 🙂 . Lo dicho, en el próximo capítulo… sqllite.

Adobe AIR III – Actualizando automáticamente las aplicaciones

He aquí otra de esas cosas superchulas que vemos en aplicaciones de otros. Ejecutas una aplicación y automáticamente te dice que hay una nueva versión y si quieres actualizarla. Si aceptas, se actualiza ella sola.

Esto en AIR es extremadamente sencillo, sólo necesitaremos unas pocas líneas de código 🙂 .

La primera parte consiste en invocar la comprobación desde tu aplicación, en el evento creationComplete.

private function actualiza():void{
appUpdater.updateURL = "http://tuservidor.com/update.xml";
appUpdater.isCheckForUpdateVisible = false;
appUpdater.addEventListener(UpdateEvent.INITIALIZED, onUpdate);
appUpdater.addEventListener(ErrorEvent.ERROR, onError);
appUpdater.initialize();
}

private function onUpdate(event:UpdateEvent):void {
	appUpdater.checkNow(); // Go check for an update now
}
private function onError(event:ErrorEvent):void {
	Alert.show(event.toString());
}

La segunda es crear un xml en la ruta indicada en “updateURL” con la información de la última versión disponible y la url a la misma. Muy sencillo.

<?xml version="1.0" encoding="utf-8"?>
<update xmlns="http://ns.adobe.com/air/framework/update/description/1.0">
<version>v0.2</version>
<url>http://tuservidor.com/tuaplicacion.air</url>
<description><![CDATA[
v0,2
Aquí puedes incluir información sobre la nueva versión...
Nuevas funciones, opciones...
]]></description>
</update>

Sube el XML al servidor junto a la nueva versión de la aplicación. Recuerda que al compilarla deberás decirle que la versión ha cambiado ya que este es el parámetro que se utiliza para la comprobación, el número de versión.

Eso es todo, tu aplicación se actualizará automáticamente si hay nuevas versiones.

En el próximo capítulo veremos cómo detectar el estado de la conexión a Internet y su utilidad.

Adobe Air II – Aplicaciones en la barra de tareas

Después de ver cómo crear los distintos tipos de ventana con los que se puede crear una aplicación AIR, veremos hoy como hacer una de esas cosas tan chulas que se minimizan en un icono al lado del reloj de Windows.

Es muy sencillo una vez, de nuevo, se entiende el concepto. No todos los sistemas operativos permiten lo que queremos hacer, Windows, Mac OSX y algunos Linux. Para saber si lo soporta AIR dispone de dos métodos, supportsSystemTrayIcon, para entornos tipo Windows, y supportsDockIcon, para entornos tipo Mac.

Antes de meternos en berenjenales necesitaremos, al menos, dos iconos para nuestra aplicación (gif o png si es transparente) a 16×16 píxeles y a 128×128.

En este código veremos cómo asignar un icono en la barra de tareas o en el Dock y crear un menú contextual en este icono con la opción “Salir”, puedes añadir tantas opciones como estimes oportuno.

private function appTray():void{
    var icon:Loader = new Loader();
    var iconMenu:NativeMenu = new NativeMenu();
    var exitMenu:NativeMenuItem = iconMenu.addItem(new NativeMenuItem("Salir"));
    exitMenu.addEventListener(Event.SELECT, function(event:Event):void {
        NativeApplication.nativeApplication.icon.bitmaps = [];
        NativeApplication.nativeApplication.exit();
    });

    if (NativeApplication.supportsSystemTrayIcon) {
        icon.contentLoaderInfo.addEventListener(Event.COMPLETE, iconLoadComplete);
        icon.load(new URLRequest("icons/icono16.png"));

        var systray:SystemTrayIcon = NativeApplication.nativeApplication.icon as SystemTrayIcon;
        systray.tooltip = "Mi Aplicación";
        systray.menu = iconMenu;
        systray.addEventListener(ScreenMouseEvent.CLICK, restauraVentana);
    }

    if (NativeApplication.supportsDockIcon){
        icon.contentLoaderInfo.addEventListener(Event.COMPLETE,iconLoadComplete);
        icon.load(new URLRequest("icons/icono128.png"));
        var dock:DockIcon = NativeApplication.nativeApplication.icon as DockIcon;
        dock.menu = iconMenu;
    }
}

private function restauraVentana(e:ScreenMouseEvent):void{
	stage.nativeWindow.visible=true;
	stage.nativeWindow.orderToFront();
}

Como veis, creamos el menú que le vamos a asignar y cargamos el icono adecuado dependiendo del soporte del sistema operativo. Eso es todo.

Simplemente llamaríamos a esta función en el evento creationComplete de la aplicación y ya la tendríamos integrada en la barra de tareas o en el Dock.

Éste es el resultado.

Aplicacion AIR en la barra de tareas

Sencillo ¿no?. En el siguiente capítulo, aplicaciones que se actualizan automáticamente si hay una versión nueva.