Archivo de la categoría: Técnico

El arte de emprender mal…

Últimamente he leído bastante por ahí sobre consejos que debería uno tener en cuenta a la hora de lanzarse de lleno al mundo del emprendimiento, sobre todo acerca de las relaciones son los socios. Aquí va mi experiencia personal.

Corría el año 2001 cuando monté mi primera empresa junto a 4 socios más:

  • Director de compras. Llamémosle “EL Cojo“. Un cincuentón con tanta experiencia en negociaciones con proveedores como en el arte de vivir bien.
  • Director de reservas. Alias “El listo“. Cuarentón con amplia experiencia directiva en el ramo hotelero.
  • Director técnico. Alias “JR“. Treintañero largo con muchos años de experiencia en gestión de equipos de desarrollo.
  • Diseñador gráfico. Mi Compañero. Cerca de los treinta y casi diez años de experiencia en diseño.
  • Responsable de desarrollo. Yo, 25 añitos un par de años de experiencia en desarrollo 😐 .

A este equipo añadimos una secretaria/recepcionista.

La idea pintaba bien y el equipo “parecía” que también. Alquilamos un despacho bastante amplio en un edificio de oficinas, compramos mobiliario y equipamiento, tiramos infraestructura de red, conectividad, servidores… Teníamos todo muy bien montado y dimensionado para meter más gente según fuésemos necesitando. Sólo nos faltaban los clientes y el trabajo 😉 .

El reparto de participaciones en la S.L. se hizo sobre la marcha a medida que entrábamos los demás, quedando los tres “directores” con la misma cantidad y los “pringaos” con una pequeña parte.

Me olvidaba del negocio. Queríamos ofrecer servicios de consultoría e implantación de proyectos B2B y B2C a los sectores de la hostelería y turismo. Partíamos de un grupo de gente con experiencia y los conocimientos y contactos adecuados.

Desde el principio manejábamos varios posibles proyectos con entidades públicas (Diputación de Valencia y Agencia Valenciana de Turismo) y privadas (una importante cadena de hoteles a nivel nacional) gracias a los contactos de los “directores“. Los “públicos” no recuerdo mucho de qué iban, sólo me  acuerdo de los “mamoneos” que se llevaban, y es que a esta gente le gusta/ba mucho mamonear. Eso sí, no os preocupéis por nada, lo vuestro “está hecho” decían siempre.

El proyecto de la cadena hotelera era impresionante para la época. Básicamente consistía en una central de compras para todos los hoteles de la cadena que centralizase todas las compras y la distribución. Con esto conseguirían, por un lado, mejorar los acuerdos con los distribuidores al aumentar el volumen de pedidos y por otro controlar y mejorar enormemente los rápeles que hasta entonces estaban completamente fuera de control. Las cifras de retorno para la cadena eran mil-millonarias (en pesetas 😉 ). A esto hay que sumarle una póliza de riesgo con una de las principales aseguradoras de este páis (sí, la del logotipo rojo y blanco 😛 ) que ya teníamos negociada.

De esta época es también, posiblemente, el mejor proyecto que he tenido a la vista en mi vida. Recordad que hablamos del año 2001. Era un proyecto a nivel europeo para el CSIC. Una especie de red social para relacionar investigadores y proyectos. La persona con la que lo gestionamos (directora de algo) estaba ilusionadísima con el sistema que planteamos y nuestro proyecto disfrutó de su firma y aprobación. Parecía que rozábamos el éxito. Querían que fuésemos a Ginebra a ver el famoso acelerador de partículas que de aquella estaba todavía comenzando a desarrollarse. Finalmente, cuando todo parecía que iba a funcionar, la directora de algo tuvo un grave problema personal que la llevó a ponerse de baja médica y cortó de cuajo cualquier posibilidad de desarrollar el proyecto.

La vida continuaba hasta que un día “Mi Compañero” y yo comenzamos a oler cosas raras. Resulta que “El Cojo“, cojo de verdad, falto de liquidación para aguantar los momentos de inicio de la actividad empresarial, decidió, de mutuo acuerdo con “El Listo“, darse de alta como trabajador de la empresa para posteriormente solicitar la baja en la Seguridad Social y cobrar la prestación y él se haría cargo de sus cotizaciones y sus pagos trimestrales a Hacienda 😐 . Creo que eso se llama estafa, pero como veréis más adelante, no lo era, todo muy legal. Resulta que este hombre había echado cuentas y para que le quedase pasta gansa después de pagar sus gastos necesitaba una nómina muy elevada, así que ni corto ni perezoso se nos pone una de 600.000 pesetas, sí, 3.600 eurazos. Craso error. Tan listo era que no sabía que la S.S. tiene un máximo para las prestaciones y a partir de ahí da igual cual sea tu cotización, cobras el máximo. Sus cuentas de la vieja ya no salían tan redondas. Para agravar más la situación, como “El Cojo” no disponía de liquidez inicial para hacer frente a sus pagos mensuales de Seguridad Social ni de Hacienda, pidió aplazamientos hasta comenzar a cobrar de la Seguridad Social. En una situación normal es la empresa la que te paga mensualmente y la S.S. le paga a ella algún mes después, no recuerdo cuantos, pero en su acuerdo, obviamente, nosotros no íbamos encima a adelantarle el dinero. El caso es que cuando empezaron a llegar los primeros pagos de la Seguridad Social por su baja, llegaron también los cobros de su cotización (recordemos que estaban aplazados) junto a los intereses pertinentes, con lo que no quedaba dinero que cobrar. ¡Menuda idea tuvo “El Cojo“!

Como ya he dicho, de esto nos enteramos cuando ya estaba todo hecho.

Algunos meses después “El Listo” nos convence de que “El Cojo” es un lastre en la empresa y que deberíamos deshacernos de él. No era ningún secreto, trabajar, lo que es trabajar, más bien poco, ya todos nos habíamos dado cuenta. Así que amablemente le pedimos que abandonase el equipo, seguiría manteniendo sus participaciones en la empresa (30%) pero se desvinculaba completamente de su gestión. Un par de semanas después recibíamos en el despacho una citación del juzgado por impago de nóminas a su nombre. Nos reclamaba todas las que no tenía firmadas, o sea, todas, ya que él mismo manejaba todo su asunto. El acuerdo nos costó 9.000 euros.

A todo esto los proyectos seguían en proceso de latencia. Está hecho, no os preocupéis, es que la administración tiene mucha burocracia.

El Listo” era una persona… muy lista 😉 . A la par que trabajaba en la empresa llevaba también su propio proyecto turístico. Nos daba igual ya que todos hacíamos algo para ir sobreviviendo. Pero “El Listonos la metió bien metida. Para desarrollar un proyecto turístico contratamos dos chicas que se encargaron de llamar una por una a todas las agencias de viajes minoristas y mayoristas de este país. Imaginaos las facturas de teléfono, de aquella se pagaban todas las llamadas, no como ahora 😛 . Un par de meses después, cuando el primer paso del negocio estaba terminado, nos dice que no, que lo habíamos entendido mal, que aquello era para su negocio y que ya veríamos después cómo la empresa podía sacar algo de ahí. 😐 . Repito, 😐 . ¿Es que nos ves cara de tontos? Cuatro personas delante de la pizarra planteando el negocio y tres entendemos que el trabajo realizado es para la empresa y ¿tú dices que no? . Su respuesta: Creía que lo hacíais como amigos

Año y medio después cerrábamos el chiringuito. Lo único que llegamos a hacer fue una especie de “badulaque” para llamémosle “Apu“. Así es, era hindú y tenía algo parecido a un bazar 😛 . O sea, una tienda virtual de la época 😛 . A algunos nos costó dinero y otros lo ganaron, directa o indirectamente.

Me olvidaba de “JR”. Era (y es) un buen tipo, bueno organizando gente, pero falto de mano izquierda y todos terminaban por subírsele a las barbas. Tuvo muchos problemas después de esto para comenzar de nuevo, pero al final lo logró y parece que le va bastante bien, eso sí, como asalariado.

Finalmente los dos más pringaos, el diseñador y yo, somos desde entonces muy buenos amigos. Hemos hecho muchas otras cosas juntos a partir de ahí, algunas con más fortuna, otras con menos, pero nunca tan mal como entonces. La experiencia empresarial le costó mucho dinero y tardó mucho en recuperarse y levantar cabeza. Ahora es profesor de autoescuela y no quiere saber ni lo que es un ordenador 😉 .

¿Y yo? Aquí sigo. No me quejo. Como ya conté en otras ocasiones, otros negocios me han ido muy bien y esto es una simple anécdota en mi vida que contaré a mis nietos sobre los peligros de juntarte con la gente inadecuada.

Creo que esto se puede aplicar a cualquier aspecto de la vida, no sólo al empresarial. Igual que te la pega un socio te la puede pegar un amigo, todo depende de las personas y del afán de fama, poder y dinero que tengan.

Después de esto he seguido haciendo muchísimos negocios, tanto con “El Diseñador” como con Marcos, y no nos ha ido nada mal. Hemos tenido nuestros más y nuestros menos y hemos discutido, sin duda, diez años dan para muchas discusiones, pero siempre hemos llegado a buen puerto.

Los socios son lo más parecido a una pareja sentimental. Pasas con ellos más tiempo que con la propia pareja, sin embargo tienes mucha menos confianza que con ella. Si cuando una pareja tiene problemas de dinero lo primero que se resiente es su relación, imaginaos qué puede ocurrir cuando los problemas de liquidación los tiene una sociedad que está hecha para ganar dinero. Y es que con las vacas gordas todo va bien, el problema viene con las flacas.

Es muy fácil dar consejos sobre lo que se debe y no se debe hacer o sobre cómo se deben hacer las cosas, seguramente me hubiesen venido muy bien, pero creo que, al final, todos los que comiencen en el emprendimiento tropezarán en la misma piedra ya que de primeras no crees que un potencial socio tuyo vaya a hacerte nada semejante. Eso sí, las siguientes veces ya no te fías de nadie. Y es que sabe más el diablo por viejo que por diablo 😉 . Un buen amigo mío diría: Siempre hay alguien más listo que tú.

Y es que, al final, todo depende del objetivo por el que te metes en un negocio. En el caso que os he contado, los “directores” buscaban el pelotazo, el negocio fácil a través del mamoneo, y al no conseguirlo como esperaban, buscaron lo mejor para sí mismos. Los pringaos, sin embargo, buscábamos hacer cosas, teníamos ilusión en los proyectos, creíamos en ellos y queríamos llevarlos a cabo y disfrutar haciéndolo. Creo que ésa es la diferencia.

Por cierto, el otro día me crucé con “El Cojo“. Qué cachondo el tío… 😉

Un año blogueando

Pues sí, ha pasado ya un año desde que comencé a escribir. ¡Quién lo iba a decir! Aquello que comenzó casi como una obligación (maldito Marcos 😛 ) me ha ido enganchando mucho más de lo que hubiese imaginado y ahora no puedo estar más de tres días sin escribir.

Durante este tiempo he escrito 112 artículos en 13 categorías y 381 tags. Salgo a un post cada 3,25 días 😐 , increíble. Y lo más sorprendente, me han nviado 412 comentarios, si me lo cuentan hace un año me hubiese reído.

De los artículos, 76 son técnicos, 30 de viajes y escapadas y el resto personales o de opinión. Creo que está muy bien la distribución, la gente que me conoce lee los de viajes y, sobre todo, comidas 😛 , los lectores habituales buscan en su mayoría los técnicos.

Como podéis ver en el siguiente gráfico, durante este año he ido aumentando progresivamente las visitas diarias hasta las 300 de media que tengo actualmente, no está mal.

osus_analytics

La mayoría de visitas viene de buscadores, aunque aquí no se cuentan los lectores del RSS que veremos un poco más adelante.

A principios de año puse publicidad (Adsense) sólo para los visitantes que llegan desde buscadores, mis lectores habituales permanecen limpios. Durante estos dos meses he ingresado un total de 6,47 dólares. ¡Guau!, con suerte, y manteniendo el nivel de ingresos, a final de año me puedo ir de cena, eso sí, yo solo 😛 . Era cierto eso que decían de que los bloggers ganan una pasta 🙂 .

osus_adsense

Sobre el feed, alucinado estoy. Según FeedBurner tengo 47 suscriptores actualmente 😐 . Venga, que se presenten y se identifiquen uno a uno, se merecen un aplauso. ¡Son 47 personas que me leen habitualmente!

feedburner11

Vamos con otro tema importante, los artículos más leídos:

  1. Regala lotería y personaliza tus participaciones y décimos
  2. Cobrando por servicios a través de PayPal con PHP
  3. Monitorizando servidores con Cacti
  4. Conexiones VPN entre máquinas Linux y Windows con autentificación a través de servidor Radius y MySQL
  5. Consumiendo webservices SOAP desde PHP
  6. Modelando bases de datos con MySQL Workbench
  7. Usando certificados SSL de cliente como sistema de autenticación web
  8. Insertar imágenes en RichTextEditor de Flex
  9. Desbloquea tu teléfono móvil sin desbloquear el teléfono
  10. Cómo emitir webcams en vivo con un servidor Linux y en formato FLV
  11. Alertas y acciones en tu servidor a través de SMS
  12. Haciendo streaming de vídeos a móviles
  13. Feira Franca 2008, Pontevedra regresa al medievo

Hay cosas interesantes en esta lista. La más sorprendente es el que está en el primer puesto, no lo esperaba, pensaba que el segundo, el de integración de PayPal, sería el más popular, pero las Navidades le arrebataron el primer puesto ampliamente, incríble el tirón que tuvo en esas fechas. A partir de ahí, los tres siguientes son posiblemente, y junto al número 7, los artículos más curraos que he escrito, larguísimos y muy detallados.

He querido poner los 13 más populares porque precisamente en este puesto aparece el primer artículo no técnico, otra sorpresa. Como ya he comentado, he escrito 30 artículos de viajes y similares y, casualmente, el más popular es el de la Feira Franca de Pontevedra, mi tierra natal. Aún no me lo creo. Al lado de detallados artículos de media España (desde la Alpujarra hasta Navarra pasando por Teruel, Castellón, o el Vall d’Aran), el más leído es el de esta fiesta pontevedresa.

Comienzo mi segundo año de blogger con más ilusión que el primero, muchísima más, pero también con unos objetivos muy elevados. Ahora hay (para mi) mucha gente pendiente de lo que escribo y eso implica una gran responsabilidad. Espero no defraudar a nadie.

Seguiré en mi línea de alternar trabajo con placer, me gusta, me funciona bien y hace que la gente que me rodea, gente no técnica, pueda también leer algunas de las cosas que escribo, algunos incluso son parte de esas cosas.

Como ya comenté recientemente, a lo largo de este año seguramente escribiré más artículos sobre temas de managment, gestión de proyectos y de equipos e incluso de opinión, siempre sin dejar de lado la parte mas técnica. Tranquilos, también seguiré con los viajes y los chuletones 😉 .

Espero que dentro de un año sigáis, al menos, los que estáis ahora 🙂 .

Gracias y un abrazo a todos.

Adobe AIR y VI – Notificaciones instantáneas ó toast style windows

Llegamos, por fin, al último capítulo de esta serie sobre Adobe Air.

En el proyecto en el que estoy trabajando necesito que se lancen notificaciones ante determinados eventos en el servidor. Podría hacerlo abriendo ventanas normales, claro, pero son avisos que no requieren acción del usuario, sólo son mensajes, así que me gustaría que fuesen no intrusivos, que no molesten al usuario con lo que esté haciendo. Son los típicos mensajes que lanzan algunos programas de esos que se quedan como un icono en la barra de tareas (Messenger, McAfee…).

Tras mucho buscar llegué a la primera conclusión. Este tipo de ventanas las llaman “toast style windows” 😐 . El segundo paso era cómo hacerlas. Seguí buscando y encontré varias clases que implementaban lo que yo quería, si alguien lo ha hecho ya… ¿por qué reinventar la rueda?. Probé varios sistemas y el que más me convenció fue éste, directamente desde Adobe. Sencillamente lo controla todo, desde lanzar varias ventanas y que se apilen una sobre otra a lo alto del escritorio hasta controlar si el usuario está utilizando el ordenador o no para no eliminarlas sin que las vea. Sencillamente perfecto. Con algo de estilos pueden quedar muy bien.

Toast windows con AirEl ejemplo del que os hablo venía para hacer con Adobe Flash, no con Flex, pero se adapta sólo.

Lo primero que necesitaremos son las clases que lanzan las ventanas. Os las dejo aquí.

Y ahora las utilizamos en la aplicación.

import com.xplota.display.DisplayManager;
import com.xplota.display.MessageWindow;

private var displayManager:DisplayManager;

function nuevoMensaje(texto:String):void(){
    displayManager = new DisplayManager();
    displayManager.displayMessage(texto);
}

nuevoMensaje("prueba de nueva ventana");

Ya está! Eso es todo. Sencillo ¿eh? 😉 . Prueba a lanzar varias ventanas y verás como se apilan automáticamente unas sobre otras. Si haces click sobre una de ellas verás que desaparece, da igual en cual, deja ese hueco. Si esperas 10 segundos (configurables), verás que la ventana desaparece sóla, pero si no utilizas ni el teclado ni el ratón, el sistema supone que no estás viendo lo que ocurre y mantiene ahí los mensajes para que no los pierdas. No olvides diseñarlas un poco más chulas que las que trae por defecto 😛 .

Hasta aquí hemos llegado con este minicurso de AIR. Creo que he cubierto la mayoría de cosas que se necesitan para comenzar una aplicación decente en AIR, aún así es posible que añada alguno más, quién sabe…

Espero que os hayan sido útiles.

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.

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.

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.