Felices Fiestas

Un año más… estamos en Navidad, esa época del año donde todos somos mejores personas, el amor rezuma por todas las esquinas y las ciudades y pueblos huelen a buenas intenciones. Ésa época de telefilms americanos de milagros navideños en la sobremesa, de ¡Qué bello es vivir! y de programas con lo mejor del año. De centros comerciales saturados, de atascos permanentes y de calles abarrotadas de gente comprando compulsivamente. De ateos, de no cristianos y de no creyentes celebrando una fiesta religiosa disfrazada de paganismo o buenas intenciones.

Para mi la Navidad supone regresar a Galicia y reencontrarme con mi familia y amigos (cada vez menos). Mis sobrinas crecen a pasos agigantados sin que yo apenas pueda verlo, es lo que tiene vivir a 1000km de ellas.

Como suele ocurrir, el preludio de la Navidad son las cenas y fiestas con amigos y compañeros. Este año ha habido ya unas cuantas y espero que me queden un par de ellas al menos aún 😉 .

Comenzamos el 12 de diciembre con los amigos de la oficina cenando en la Taberna Jamón Jamon para acabar en Calcata a altas horas de la madrugada…

13122008252.jpg13122008242.jpg

Dejaré sólo las fotos visibles. La calidad es la justa, pero agradezcamos al N95 de Mónica su presencia en la cena, sin él no habría testigos del momento.

Continuamos el 19 con la comida/merienda/cena junto a los compañeros de la oficina. Desgraciadamente me tuve que ir poco después de comer ya que salía hacia Madrid esa misma noche, pero aún tuvimos tiempo de tomarnos una copa en las Mamelludes 😉 (a buen entendedor, pocas palabras bastan 😀 ).

img_8421.jpgimg_8433.jpg

img_8424.jpg

Lo siento, había fotos del resto de la gente pero no me las traje. Si alguien me las envía las cuelgo 😛 .

Al día siguiente, el último fin de semana antes de Navidad, nos acercamos, como ya he comentado, a Madrid, más concretamente a Algete, para celebrarlo con algunos amigos. Esta es la penosa y pésima prueba de ello, al más puro estilo 11811, James Brown o Jackson 5, qué más da la comparación:

imgp0536.JPG

Por cierto, para las mentes inquietas, ella es la Campanario ó Campanilla 😉 .

Ésa semana estaba de guardia y las llamadas me arruinaron literalmente el fin de semana, desde el sábado a mediodía hasta el domingo por la noche (ya durmiendo) no dejaron de molestarme 😛 .

Aprovechando que nos encontrábamos por la zona, y tras algunas compras navideñas, decidimos comer en el Asador el Molino, en la carretera de Algete. Tanto el interior como el exterior del sitio son increíbles. Tiene capacidad para 500 personas y hasta 8 comedores distintos, ahí es nada. A nosotros nos tocó en un salón monográfico taurino como podéis ver.

Asador El MolinoAsador El Molino

En cuanto a la comida, qué os puedo decir, cocina tradicional castellana con productos de calidad, algunos llegan directamente de su propia huerta. Decir, además, que el pan lo asan ellos mismos en sus hornos. En la foto siguiente veréis qué pinta tenía el pan (el sabor era muchísimo mejor de lo que os podáis imaginar).

Comenzamos con matanza casera (lomo, chorizo y morcilla) y espárragos trigueros con huevos fritos y jamón.

Asador El Molino

Entre el primer plato y el segundo me tiré 35 minutos de reloj en el parking con el portátil sobre el capó del coche gracias a una bonita llamada de trabajo. Aún así continuamos con medio churrasco de buey y lechal.

Asador El MolinoAsador El Molino

La materia prima, excelente. Me quedé con las ganas del cochinillo. Otra vez será, seguro que oportunidades no nos faltarán.

He de añadir, eso sí, que este sitio barato no es, pero la calidad, como casi siempre, se paga.

¿Por que os cuento todo esto en mi felicitación Navideña?

Porque vosotros sois mi regalo. Formáis parte de mi vida y ocupáis parte de sus mejores momentos. Porque os la sudan mis artículos técnicos 😛 y me pedís más sobre mis paseos y sobre mis comidas (¡quién me lo iba a decir!).

Ahora comienza la parte más familiar y privada de las fiestas, aunque espero todavía ver y cenar con los amigos de Pontevedra, al menos con los que estén allí estos días (lástima Juanp). Así que, ya sabéis, Marcos, Emiliano, David, Patricia, Tito, Carlos, Dasi… Ramiro (sí, Ramiro, si tengo ganas igual me acerco a verte yo a ti 😉 ). Con Javi ya he quedado a tomar unas cañas y nos hemos puesto al día de nuestras vidas. Cris, a ver si te apuntas coño 😛 , ya sé que soy feo, pero tanto… Nuestro amigo Javi se va a esquiar a Cerler, que “cool” se nos ha vuelto el chico 😛 , no lo veré estos días, una pena.

Vaya desde aquí un profundo abrazo a  todos vosotros que hacéis que mi vida sea lo que es. Seguro que me olvido de mucha gente, pero este artículo recoge el grueso de los que dan y recogen mi cariño y respeto.

A todos vosotros y a los lectores de mi blog que no sois vosotros (pocos 😛 )…

FELICES FIESTAS

Actualizaré con fotos de las próximas celebraciones con amigos que vaya teniendo antes de regresar a Valencia el próximo domingo.

Actualización

El viernes tocaba cenar y, sin esperarlo, se presentó más gente de la esperada.

img_4905.JPG

Y el sábado pude quedar con Tito, Graciela, Carlos y Mora.

27122008002.jpg

Lo siento mucho por todos aquellos a los que no pude ver, me habría gustado estar con todos.

Centro de Sistemas de la Xunta de Galicia, las cosas bien hechas

Hace algo más de un mes recibí un email de Marcos avisándome que no podía enviar emails a cuentas del dominio xunta.es, a los diez días le venían rebotados con un error de conexión. Hasta entonces siempre había funcionado bien, pero llevaban ya unos días con el problema. Haciendo una análisis detallado desde el servidor obteníamos lo siguiente:

[osus@lerez ~]# dig xunta.es
; <<>> DiG 9.3.4-P1 <<>> xunta.es
;; global options: printcmd
;; connection timed out; no servers could be reached

[osus@lerez ~]# dig @85.91.64.171 xunta.es
; <<>> DiG 9.3.4-P1 <<>> @85.91.64.171 xunta.es
; (1 server found)
;; global options: printcmd
;; connection timed out; no servers could be reached

[osus@lerez ~]# dig @85.91.64.172 xunta.es
; <<>> DiG 9.3.4-P1 <<>> @85.91.64.172 xunta.es
; (1 server found)
;; global options:  printcmd
;; connection timed out; no servers could be reached

[osus@lerez ~]# ping 85.91.64.171
PING 85.91.64.171 (85.91.64.171) 56(84) bytes of data.
64 bytes from 85.91.64.171: icmp_seq=1 ttl=45 time=184 ms
--- 85.91.64.171 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 184.025/184.025/184.025/0.000 ms

[osus@lerez ~]# ping 85.91.64.172
PING 85.91.64.172 (85.91.64.172) 56(84) bytes of data.
64 bytes from 85.91.64.172: icmp_seq=1 ttl=45 time=173 ms
-- 85.91.64.172 ping statistics ---
2 packets transmitted, 1 received, 50% packet loss, time 1000ms
rtt min/avg/max/mdev = 173.111/173.111/173.111/0.000 ms

[osus@lerez ~]# telnet 85.91.64.172 53
Trying 85.91.64.172...
Connected to 85.91.64.172 (85.91.64.172).
Escape character is '^]'.
Connection closed by foreign host.

Donde 85.91.64.171 y 85.91.64.172 son los servidores DNS de xunta.es.

Como se puede ver en el resultado de las pruebas, conectividad con los servidores DNS sí que había, respondían al ping, no había ningún tipo de bloqueo, sin embargo el servidor DNS no aceptaba nuestras solicitudes, con lo cual no podíamos resolver ningún host de xunta.es. Era ése precisamente el error que reportaba nuestro MTA cuando devolvía los emails, no se ha encontrado el servidor de destino (como no podía resolver los servidores MX asumía que el dominio no existía).

Decido entonces ponerme en contacto con el centro de sistemas y el primer mensaje no se me ocurre otra cosa que escribirlo con una cuenta desde la misma máquina que fallaba. Me llegó devuelto a los diez días tal como acabo de describir, pero me sirvió para ver con mis propios ojos el problema. Volví a escribir con una cuenta de otra máquina explicándoles el problema y las pruebas que os he copiado.

En un primer momento me contestan que, tras abrir una incidencia con el centro de gestión de red,  no tienen ningún problema de conectividad y que deberíamos tener acceso.

Abrín incidencia co centro de xestión de rede da Xunta de Galicia, e dinme que en principio non debería haber ningún problema co acceso ó noso servidor dende a vosa ip, polo que deberíades poder enviar sen problemas.

Entre otras cosas me indican, además, que haga una prueba de acceso al servidor de correo. Obviamente no han entendido bien que el problema es sólamente la resolución DNS, el resto funciona correctamente.

El 23 de noviembre vuelvo a escribirles explicando que el problema no es la conectividad, es sólo la resolución DNS y que al no poder resolver estamos cerrando a nuestra máquina cualquier host de xunta.es, adjuntando de nuevo las pruebas realizadas.

Unos días después me contestan que han hecho algunos cambios en sus DNS, que comprobemos si ya funciona, pero sigue sin hacerlo y así se lo hago saber el 1 de diciembre y les indico además, por si quieren hacer pruebas, el entorno (sistema operativo, versión de bind…).

10 días despues me contestan, atención:

Non me olvidei do voso problema co dns da Xunta… Simplemente comentarche que escalei a incidencia ó Centro de Xestión de Rede e como non me respostaran onte volvín a enviarlle a consulta e dinme que están preparando un escenario para reproducir o voso problema, porque en principio non hai ningún filtro no dns que impida que unha ip como a vosa realice consultas ó dns… Creo que van montar unha máquina cunha ip como a vosa para facer probas, mantereite informado dos progresos nas súas probas.

Es decir, que escalaron de nuevo la incidencia al centro de gestión de red y que, como no encontraban ningún problema,  iban a replicar nuestro entorno con nuestra misma IP para probar y ver in situ la situación.

Al día siguiente nos informan que, efectivamente, han visto el error que comentábamos y que nos avisarían cuando lo solucionasen. La verdad, temía que a ellos sí que les funcionase, pero no fue así.

Un par de días más tarde nos avisan que la incidencia está ya resuelta, que hagamos las pruebas oportunas para comprobarlo. En efecto, ahora todo volvía a funcionar correctamente.

En todo momento pensé que el problema iba a quedar sin solucionar, era bastante escéptico y creía que jamás se preocuparían por ver qué estaba pasando, sin embargo ocurrió todo lo contrario. Muchos centros de soporte y de sistemas deberían tomar nota y aprender de este caso. Hay ocasiones en que aunque parezca que tus sistemas están bien porque a todo el mundo le funcionan, puede haber algún caso aislado que presente una incidicencia que sea problema tuyo y no de él. El clásico “si a todo el muno le funciona es que funciona y si a uno no le va, será problema de él“, puede no ser siempre correcto, pero hay que molestarse en comprobarlo. Sé de buena tinta que en la inmensa mayoría de sitios habrían pasado de nosotros y mucho menos aún se habrían tomado las molestias de replicar nuestro escenario para comprobar lo que les contábamos.

Desde aquí dar las gracias a Silvia, la persona que se responsabilizó de nuestra incidencia y que puso todo su empeño en encontrar la solución, y agradecer a todo el Centro de Xestión de Rede de la Xunta de Galicia su colaboración y ayuda. No me han dicho el origen del problema, entiendo que puede ser información confidencial en cuanto a tipología de redes, firewalls, DMZ’s… pero el trabajo ha sido excelente.

Conversión de vídeos a 3gpp bajo demanda en un entorno web

Hoy veremos como aplicar conversiones de vídeo en un entorno web donde los usuarios suben sus vídeos en cualquier formato. Sí, tienes razón, ni más ni menos que lo que hace YouTube, de hecho utilizaban un sistema muy similar a lo que veremos ahora y basado en el mismo software. En realidad el artículo se podría aplicar a prácticamente cualquier tipo de conversiones, incluso para iPod o PSP, sólo hay que utilizar los parámetros adecuados. Nosotros nos centraremos en la conversión a 3gp para después poder hacer streaming con ellos además de permitir su descarga.

Nuestro entorno se basará en un servidor con Linux (Centos5 en mi caso). Como software sólamente necesitaremos ffmpeg, herramienta imprescindible para cualquier aplicación (tanto web como de escritorio) bajo Linux.

¿Qué es ffmpeg?

Hace unas semanas veíamos cómo utilizar ffserver para convertir flujos de vídeo y hacer streaming. ffmpeg es la utilidad en la que se apoya ffserver para realizar las conversiones.

ffmpeg es una herramienta de software libre que permite realizar conversión entre la mayoría de formatos de vídeo más utilizados. Una inmensa mayoría de programas de conversión bajo Windows no son más que frontends gráficos para ffmpeg.

Normalmente los paquetes precompilados de ffmpeg no vienen con las extensiones adecuadas para las conversiones que necesitamos, así que deberemos compilar nuestra propia versión.

Necesitas instalar los siguientes paquetes, son más de los imprescindibles, pero así nos ahorraremos problemas futuros:

libmp4v2
libvorbis
libvorbis-devel
lame
lame-devel
faac
faac-devel
faad2
x264
x264-devel
xvidcore
xvidcore-devel

Debo decir que para mi Centos no están todos disponibles como rpm con lo cual habrá que compilar manualmente algunos de ellos. No deberías tener ningún problema para localizar cada librería.

Finalmente habrá instalar los siguientes paquetes:

http://ftp.penguin.cz/pub/users/utx/amr/amrnb-7.0.0.2.tar.bz2

http://ftp.penguin.cz/pub/users/utx/amr/amrwb-7.0.0.3.tar.bz2

Con esto tenemos ya todo preparado para compilar nuestro propio ffmpeg. Descarga el paquete desde la web oficial, descomprímelo y:

./configure --enable-libmp3lame --enable-libvorbis --enable-libogg --enable-libamr-nb --enable-libamr-wb --enable-libfaac --enable-gpl --enable-libxvid --enable-libx264 --enable-libfaad --enable-shared
make
make install

Si has seguido bien todos los pasos tendrás el software de conversión preparado.

Convirtiendo a 3gp

Para realizar las conversiones algo tan sencillo como:

ffmpeg -y  -i original.avi -s qcif -r 12 -b 30 -ac 1 -ar 8000 -ab 12200 video.3gp
/usr/local/bin/MP4Box -3gp -mtu 1450 -hint video.3gp

Cuando vimos cómo hacer streaming a móviles veíamos como utilizar la utilidad MP4Box para que nuestros vídeos 3gp se puediesen utilizar para emitir en vivo.

Para nuestro proyecto es probable que necesitemos algo más. Si queremos que también se puedan visualizar los vídeos desde una web necesitaremos convertirlos a flv:

ffmpeg -y -i original.avi -acodec libmp3lame -ac 2 -ar 22050 -r 12 -b 196 -s 176x144 video.flv
/usr/bin/flvtool2 u video.flv

Flvtool es una herramienta que inserta en los flv los metadata necesarios para que funcione bien en el reproductor flash.

Y necesitaremos capturar algún fotograma del vídeo para mostrar como demo:

ffmpeg -i original.avi -y -ss 00:00:01 -vframes 1 -an -sameq -s 160x120 -f image2 thumbnail.jpg

Ahora ya sabemos:

  • cómo crear nuestro vídeo 3gp que nos sirva tanto para descarga como para streaming.
  • cómo crear el vídeo flv que nos sirva para ver vía web.
  • cómo generar thumbnails de escenas del vídeo.

Creando el entorno web

Supongamos que queremos desarrollar una web al estilo Youtube donde el usuario sube vídeos desde un formulario y posteriormente se desea mostrarlos categorizados, con un buscador, una preview (flv), descarga para móviles, etc.

La parte de la web propiamente dicha resulta obvia, no vamos a entrar en detalles. Lo que nos ocupa aquí es como realizar la conversión según las instrucciones que hemos visto. Obviamente no podemos ejecutar la conversión cada vez que un usuario sube un vídeo, sería un proceso lento y pesado. La mejor manera es crear una cola de conversión. Cuando se sube un nuevo vídeo no esta disponible públicamente (no se ha convertido todavía). Podríamos definir tres estados diferentes para un video:

  1. Sin procesar (convertir).
  2. Procesando.
  3. Procesado.

Según esto sería sencillo tener en una tabla el estado de los vídeos. Sólo los procesados se listarían públicamente.

Por otro lado tendríamos una tarea encargada de buscar vídeos en estado “sin procesar” y realizar su conversión. Esta tarea podría ser o bien un demonio residente que está permanentemente buscando vídeos o bien, si el tráfico de nuevos vídeos no va a ser elevado, podría ejecutarse periódicamente para realizar las conversiones.

Si el tráfico fuese muy elevado podría incluso haber varias tareas en paralelo ya que una vez una de ellas encuentra un vídeo “no procesado” actualiza su estado a “procesando” de manera que la siguiente tarea ya no escogerá ese mismo vídeo.

La teoría es mucho más sencilla de lo que parece. La tarea que realiza la conversión creará los formatos que estimemos oportunos según ya hemos visto antes.

Convirtiendo a otros formatos

Con ffmpeg se pueden generar los vídeos para casi cualquier formato existente incluyendo PSP, iPod/iPhone/iTouch… Googleando un poco encontrarás los parámetros adecuados para cada formato.

Conclusiones

En este artículo he explicado cómo realizar conversiones de vídeos a distintos formatos y cómo aplicarlo a un entorno web dónde los usuarios suben sus propios vídeos. He dado los pasos básicos para entender el sistema, vosotros tendríais que adaptarlo a vuestras necesidades.

Oh-la-la, París ida y vuelta

Desayuné en Valencia, comí en París y cené en Valencia. Fin a una semana de estrés y tensión.

Hace un par de semanas, nos avisaron un viernes a mediodía de que teníamos que exponer oralmente (en inglés) la parte ténica de un proyecto al que nos habíamos presentado ante un comité de expertos de nuestro potencial cliente. La reunión sería el martes siguiente, así que tendríamos tres días, de los cuales dos eran fin de semana, para preparar nuestra presentación. Conseguimos posponerlo hasta el jueves, así que allí nos fuimos Guillermo y yo hacia París tras una semana trabajando como chinos (con todo el respeto al colectivo oriental).

Estas son nuestras caras a las seis de la mañana en el aeropuerto de Valencia, sin apenas haber dormido en los cinco días anteriores y con los nervios a flor de piel.

img_4571.JPGimg_4572.JPG

Impresionante la vista aérea de los Pirineos con ese manto de nieve…

Pirineos

Ya desde nuestra llegada a París el inglés se convirtió en nuestro idioma, no sólo con el cliente sino también con nuestros partners en Francia. Al final fueron cerca de 8 horas hablando y pensando exclusivamente en inglés.

La presentación consistía en tres partes:

  1. Arquitectura funcional
  2. Arquitectura técnica
  3. Calidad y SLA

Yo exponía la segunda. Habíamos preparado concienzudamente el contenido de nuestras presentaciones puesto que, además de comentar nuestra solución al proyecto, era más que probable que nos disparasen cañonazos de preguntas, como así fue.

Inicialmente estaban estipuladas dos horas de exposición, pero al final estuvimos cerca de dos horas y media vendiendo nuestra idea y nuestra solución. Mi exposición en particular se alargó más de una hora con constantes intervenciones de los asistentes por parte del cliente y al final se abrió un pequeño “ruegos y preguntas” aunque prácticamente se había contestado todo sobre la marcha.

Parece que les gustaron nuestras ideas y opiniones a los galos.

img_4582.JPGimg_4583.JPG

Al final, entre que se nos alargó la exposición más de la cuenta y que el tráfico en París es un caos, estuvimos a punto de perder el avión de vuelta.

La prueba de que, en efecto, era París 😛 .

Aeropuerto de Paris

Conclusiones

¿Qué he aprendido de esta experiencia?

  • Tenemos muy mal concepto de nosotros mismos al hablar en inglés, tal como nos decía uno de nuestros colaboradores en Francia, habláis claro y fluído, más que suficiente para mantener una conversación sin dificultades. Puede que gramaticalmente no sea perfecto, pero entendéis y se os entiende y se puede mantener una conversacion con vosotros sin ningún problema. Nos puso como ejemplo a los indios (de la India), que hablan un inglés gramaticalmente perfecto pero a los que no se les entiende absolutamente nada por el acento que tienen. He hecho muchas referencias al inglés porque, en realidad, era nuestro único problema. Ni hablar en público ni exponer tus conocimientos nos supone un problema, la parte técnica la tenemos ampliamente controlada, no en vano es nuestro trabajo. La barrera idiomática sí que es un hándicap, y salimos airosamente. Sólo decir que acabamos hablando de la crisis y de la burbuja inmobiliaria en España 😉 .
  • Otro de nuestros partners salía de la reunión asombrado de la manera en que habíamos sacado adelante la situación, en cómo habíamos jugado nuestras cartas ante la indiferencia inicial del cliente y su interés final.  Y todo esto “en inglés”. A veces las cosas son mucho más sencillas de lo que creemos. Si no vendes humo, si conoces el entorno y la materia sobre la que tienes que hablar, es difícil que te dejen quedar mal. Recuerda también que, igual que no hay que decir a todo sin razón,  NO hay que saberlo todo y no es malo decir “No lo sé, no dispongo de esa información, pero mañana podría enviarosla por email“.
  • A veces nos sentimos cohibidos a la hora de tratar con clientes como importantes y conocidas multinacionales, sin embargo, ten en cuenta que:
    • si buscan externalizar un servicio es porque necesitan a alguien como tú.
    • si te han llamado para que les cuentes de viva voz tu propuesta es porque algo en ella les ha gustado o llamado la atención
    • es difícil que alguien escoja un partner para un proyecto sin ver la cara de la gente que trabajará en él (no sólo técnica, también comercialmente), cuestión de confianza. Más aún si ellos son franceses y tu español.
    • es posible que lo que para ti es la mejor solución al problema, por obvia que parezca, no se le haya ocurrido antes a ninguno de los otros potenciales candidatos y el cliente se sorprenda de lo que le propones.
  • No lo había pensado antes pero es importante que el cliente participe y pregunte durante tu exposición, significa que le interesa lo que le estás contando. Si te pasases dos horas hablando sin que te interrumpiesen, probablemente estarían, además de dormidos, pensando en lo que van a hacer después de que termine “este pesado”, es decir, no le interesa tu propuesta. No tengas miedo a las preguntas, si hay preguntas es porque están atentos a tu exposición.

Y esto es todo. A pesar de la tensión de esta semana, es probable que nos haya venido muy bien como ejercicio práctico tanto de conversación en inglés como de exposición “colaborativa” de un proyecto. Despues de esto creo que nos va a tocar más veces repetir experiencia en otros países.

Ciudad romana de Segóbriga

A 250km de Valencia en dirección Madrid y desviándose apenas unos 5km de la autovía A3 (perfectamente señalizado), se encuentra la Ciudad Romana de Segóbriga, una gran desconocida. Reconozco que he pasado decenas de veces por delante del letrero y nunca se me había ocurrido parar… hasta hoy.

La verdad es que nos quedamos bastante impresionados ya que, entre otras cosas, tenía teatro, anfieatro (bien conservados) y circo (apenas los restos), lo que da una idea de lo que un día fue la ciudad. Un destino poco conocido dentro de la España Romana, quizás por eso es una sorpresa.

Ciudad Romana de segóbriga

Ciudad Romana de segóbrigaForo Romano de Segobriga

Es una de las ciudades romanas (entendida como el conjunto) mejor conservadas y el conjunto arqueológico más importante de la meseta. A partir del s.I se convirtió en un importante núcleo agrario y minero además de centro de comunicaciones. La conquista islámica supuso su declive, pero, por suerte, han llegado hasta nosotros las huellas de lo que llegó a ser.

Teatro

Teatro Romano de Segobriga

Ciudad Romana de segóbrigaCiudad Romana de segóbriga

El teatro, al igual que el anfiteatro, conserva el graderío y mantiene todavia la estructura original del 79d.c., cuando se construyó. Cabe señalar que, por aquel entonces, Segóbriga tenía nada más y nada menos que 5.500 habitantes.

Termas

Termas Romanas de Segóbriga

Circo

Esa forma oval que se observa en el centro de la foto era el impresionante circo. Lo reconozco, me habría gustado vivir aquella época sólo por ver una apasionante carrera de cuadrigas, quizás ya hubiese un Fernando Alonso en la antigua Roma 😛 .

Circo Romano de Segóbriga

Anfiteatro

Finalmente el precursor de nuestras plazas de toros. Con capacidad para 5.500 espectadores, flanqueaba junto al teatro la entrada a la ciudad y, como casi siempre, se construyó aprovechando una ladera natural del cerro. Increíble su acústica.

Anfiteatro Romano de Segóbriga

Anfiteatro Romano de SegóbrigaAnfiteatro Romano de SegóbrigaAnfiteatro Romano de Segóbriga

Hospedería Casas de Lujan

Lo siento, tengo el vicio de comer todos los días 😛 . Al llegar a Segóbriga era ya la hora de comer, así que nos dejamos guiar por un folleto que cojimos en la propia Ciudad Romana. A unos 8km de ésta llegamos a la Hospedería Casas de Luján, un gran descubrimiento que nos dejó con la boca abierta.

Hospedería Casas de Luján

Hospedería Casas de LujánHospedería Casas de LujánHospedería Casas de Luján

Enclavada en un maravilloso entorno rural se encuentra esta gran casa de labranza del s.XVII completamente rehabilitada y convertida en hotel, restaurante y salones de celebraciones. Pero Casas de Luján no es solo la casa, es todo el entorno, completamente  integrado, parece que te encuentres en un museo etnográfico y no en un establecimiento de hostelería. El río y los animales (pavos, gallinas, gallos, un burro…) no hacen sino reforzar la imagen encantadora que tiene el lugar.

Hospedería Casas de Luján

Hospedería Casas de LujánHospedería Casas de Luján

El interior es más de lo mismo, ambiente tradicional y rural, bien conservado y decorado con el gusto preciso para no caer en la soez. Esto es la carta del restaurante, muy original.

Carta en Hospedería Casas de Luján

Hospedería Casas de LujánHospedería Casas de LujánHospedería Casas de LujánHospedería Casas de Luján

Pero bueno, ya esta bien, vamos a lo importante ¿no?. Muy bonito, sí, pero ¿qué hay de la comida? Fantástica.

Migas de bacalao con gambas y piñones y Collage de foie de pato y oca con configura de naranja y frambuesa.

Hospedería Casas de LujánHospedería Casas de Luján

Chuletón de Ávila y Pierna de cordero lechal deshuesada.

 Hospedería Casas de LujánHospedería Casas de Luján

Tarta de tiramisú y Tarta de queso de cabra y membrillo.

Hospedería Casas de LujánHospedería Casas de Luján

Todo ello regado con una botella de la zona, Estola Reserva del ’98 D.O. La Mancha.

Nosotros salimos encantados y queremos volver un fin de semana para conocer más la zona (Belmonte, Lagunas de Ruidera, La Alcarria, El Toboso…)

Congreso de Webmasters 2008 y I Foro de Startups

Casualidades de la vida, aunque el próximo fin de semana estaré en Madrid no será para asistir al Congreso de Webmasters 2008, donde más de 30 expertos descubrirán la realidad del sector a través de ponencias, talleres, mesas redondodas y, sobre todo, networking, mucho networking.

Quien sí estará será mi buen amigo y socio Marcos García que el domingo a las cinco de la tarde participará en una mesa redonda sobre la actualidad de la blogosfera hispana. Debatirá nada más y nada menos que con Fernando Tellado, Javier Martín (Loogic), Luís Rull, y Wicho (Microsiervos).

Además de esto, mañana martes 18 de noviembre se celebra en Barcelona el I Foro de Satartups organizado por First Tuesday (Carlos Blanco y Amaia Helguera)  donde se buscará al mejor de los siete proyectos seleccionados de entre los 21 presentados. Los ganadores se repartirán los premios cedidos por distintas empresas y emprendedores (anda que algunos se han estirado…). Es aquí precisamente donde desde Cucharete colaboraremos con una cena para 2 personas en el restaurante La Alacena de Serrano.

Depurando condiciones Rewrite en Apache

Últimamente he tenido que utilizar bastante ModRewrite de Apache en distintos proyectos, algunos de migración y otros de Internet Móvil donde se necesitan ciertas URL’s para que las operadoras lancen sus sitemas de billing.

Con ModRewrite es muy fácil convertir URLs antiguas al formato nuevo en caso de migración (de manera que no pierdes el SEO que tengas). En el caso del billing de las operadoras móviles es todavía más sencillo puesto que simplemente lo usamos para simular una URL premium. Por ejemplo:

http://tudominio.com/premium.php?noticia=3

Se convierte en:

http://tudominio.com/index.php?noticia=3

De este modo no es necesario hacer scripts independientes y separados por operadora sino que todo queda integrado en nuestro framework.

El problema es que es bastante tedioso depurar lo que hace ModRewrite para ver si las condiciones que has escrito son correctas o si algún filtro no se está ejecutando correctamente. Para solucionarlo lo mejor que podemos hacer es decirle a Apache que “logee” todas las decisiones que va tomando sobre nuestros filtros. Tan fácil como esto:

RewriteEngine on
RewriteLog "/logs/rewrite.log"
RewriteLogLevel 4

RewriteCond %{REQUEST_URI} ^/premium.php$
RewriteRule ^/premium.php /index.php

Este sencillo ejemplo nos permite comprobar qué veremos en el log:

213.xxx.xxx.xxx - - [15/Nov/2008:00:48:23 +0000] [tudominio.com/sid#127d7b0][rid#16b8c20/initial] (3) applying pattern '^/premium.php' to uri '/premium.php'
213.xxx.xxx.xxx - - [15/Nov/2008:00:48:23 +0000] [tudominio.com/sid#127d7b0][rid#16b8c20/initial] (4) RewriteCond: input='/premium.php' pattern='^/premium.php$' => matched
213.xxx.xxx.xxx - - [15/Nov/2008:00:48:23 +0000] [tudominio.com/sid#127d7b0][rid#16b8c20/initial] (2) rewrite /premium.php -> /index.php
213.xxx.xxx.xxx - - [15/Nov/2008:00:48:23 +0000] [tudominio.com/sid#127d7b0][rid#16b8c20/initial] (2) local path result: /index.php
213.xxx.xxx.xxx - - [15/Nov/2008:00:48:23 +0000] [tudominio.com/sid#127d7b0][rid#16b8c20/initial] (2) prefixed with document_root to /var/www/tudominio.com/index.php
213.xxx.xxx.xxx - - [15/Nov/2008:00:48:23 +0000] [tudominio.com/sid#127d7b0][rid#16b8c20/initial] (1) go-ahead with /var/www/tudominio.com/index.php [OK]

Por cada URL que se solicita al servidor, Apache va comprobando las posibles condiciones que has escrito por si coincide con el patrón (matched) o no (not matched). Si la URL cumple los requisitos, la reescribe según se indica en la regla, en caso contrario la deja pasar tal cual. Con toda esta información podemos hacer un completo seguimiento de las reglas que queremos aplicar para comprobar si hay algún error o por qué determinada URL no hace lo que esperamos que haga.

El nivel del log indica la cantidad de información que se guardará, de 0 a 9. A  mayor valor, más información.

Algo muy sencillo pero que pasa desapercibido para la mayoría y acabamos perdiendo muchísimo tiempo probando reglas sin saber qué está ocurriendo en el interior de nuestro servidor web.

Fotomatón, o haciendo fotos instantáneas online

La idea es sencilla, conectas con la webcam de tus usuarios, les haces una foto y la envías a una galería donde se pueden ver los caretos de tus visitantes. La implementación es casi tan sencilla como la teoría y el resultado es increíble y original.

El sistema es el mismo que utilizaba BloggerSnap, un servicio que tuvo un increíble éxito en su lanzamiento y que parece cerrado desde abril. Hace un año estaba por encima del puesto 40.000 en Alexa, seguramente estuvo incluso más alto. Imagino que sería muy complicado mantener el coste del ancho de banda con tanta popularidad. Hace un par de años estuvimos a punto de lanzar un servicio similar y lo desestimamos ya que no veíamos la manera de monetizarlo mientras que, a poco que tuviese éxito, los gastos se dispararían.

En un escenario normal dependerías de software que el usuario tendría que instalar para que se hiciese la foto y posteriormente te la enviase, con lo cual no conseguirías el objetivo de la instantaneidad, pero existe una solución que permite hacerlo todo mediante una aplicación online: Flash, en nuestro caso Flex 😛 .

La potencia de la plataforma Flash en el tratamiento de audio y vídeo va mucho más allá de lo que pueda parecer y permite crear aplicaciones multimedia avanzadas con participación del usuario de manera bastante rápida. Si además dispones de dinero suficiente, puedes combinarlo con Flash Media Server y los límites los pondrá tu imaginación. Otro día crearemos un videochat 😉 .

La clave es el acceso a la cámara y al micrófono del equipo que permite la plataforma Flash previa autorización del usuario, obviamente. Si lo autorizas, el player conectará con tu webcam y comenzará a mostrar el vídeo de la misma y, si la aplicación lo requiere, enviarlo a otros usuarios. Lo mismo se puede hacer con el audio.

En el taller de hoy haremos una pequeña aplicación para crear una galería de fotos instantáneas en web/blog. Los usuarios que lo deseen pueden hacerse la foto con su propia webcam y ésta quedará alojada en la galería. Simple pero llamativo.

La aplicación constará de dos partes:

  • Zona de capturas: una aplicación desarrollada en Flex que permitirá a los usuarios hacerse fotos sin más necesidad que tener una webcam.
  • Galería: una sencilla página html donde se listan todas las fotos que se han hecho los usuarios.

Capturando imágenes

Aunque pueda parecer algo muy complicado veremos a continuación que la facilidad de conectar con la webcam en Flex es impresionante.

Nuestra aplicación consta de dos únicos componentes, una imagen y un botón. La imagen nos aportará simplemente algo de estilo y el botón lo utilizaremos de disparador de nuestra cámara de fotos online.

Hay tres tareas bien diferenciadas:

  • Conectar con la webcam.
  • Capturar la foto.
  • Enviarla a nuestro servidor.

Conectar con la webcam

Con este sencillo código estaremos visualizando en nuestra aplicación la webcam que el usuario tenga conectada a su equipo.

private function insertWebcamVideo():void{
	var videoHolder:UIComponent = new UIComponent();
	if(Camera.names.length>0){
	   camera = Camera.getCamera();
	   if(camera==null || camera.width==-1 || camera.height==-1 || camera.fps==-1){
	   		Alert.show("Lo sentimos, no tienes cámara", "Error", 4, null, null, iconoAlerta);
	   		captura.enabled=false;
	   		camera=null;
	   }else{
		   camera.addEventListener(StatusEvent.STATUS, cerrar);
		   video = new Video(camera.width, camera.height);
		   video.attachCamera(camera);
		   videoHolder.addChild(video);
		   videoHolder.width=video.width;
		   videoHolder.height=video.height;
		   videoHolder.visible=true;
		   videoHolder.y=0;
		   caja.addChildAt(videoHolder, 0);
		   caja.removeChild(fotillo);
	   }
	}else{
   		Alert.show("Lo sentimos, no tienes cámara", "Error", 4, null, null, iconoAlerta);
   		captura.enabled=false;
	}
	//Security.showSettings(SecurityPanel.CAMERA);
}

Tan fácil como comprobar primero si tiene webcam (sino, obviamente, no puede hacerse fotos 😛 ) y posteriormente añadirla a un componente de vídeo que habremos incorporado a un UIComponent para mostrarlo en la aplicación. En este momento ya tenemos la cámara del usuario en vivo en la aplicación.

Capturar la foto

Teniendo el flujo de vídeo en la aplicación, queremos que cuando el usuario presione el botón “Capturar” se le haga la foto.

private function getSnapshot():void{
	var snapshot:BitmapData = new BitmapData(video.width, video.height, true);
	var m : Matrix = new Matrix();
	snapshot.draw(video, m);
	var jpegEnc:JPGEncoder=new JPGEncoder(75);
	var jpegDat:ByteArray = jpegEnc.encode(snapshot);
	var img_src:String = base64Encode(jpegDat);

	if(img_src.length>1600){
		//imagen correctamente capturada
	}else{
		Alert.show("La imagen capturada parece estar vacía", "Error", 4, null, null, iconoAlerta);
	}
}

Con este otro código conseguimos este efecto. Se obtiene una captura bit a bit del objeto de vídeo y se comprime en JPEG para enviarla al servidor. ¡Ya tenemos la foto hecha!

Enviar la foto

Utilizaremos un HTTPService para enviar por POST la foto que hemos realizado y que guardaremos en una base de datos. Añadimos a la función anterior el código para enviar la foto.

private function getSnapshot():void{
	var snapshot:BitmapData = new BitmapData(video.width, video.height, true);
	var m : Matrix = new Matrix();
	snapshot.draw(video, m);
	var jpegEnc:JPGEncoder=new JPGEncoder(75);
	var jpegDat:ByteArray = jpegEnc.encode(snapshot);
	var img_src:String = base64Encode(jpegDat);

	if(img_src.length>1600){
		var temp:Object=new Object();
		temp.imagen=img_src;
		httpService.send(temp);
		cargandoWindow = ventanaEspera(PopUpManager.createPopUp(this as DisplayObject, ventanaEspera, true));
	}else{
		Alert.show("La imagen capturada parece estar vacía", "Error", 4, null, null, iconoAlerta);
	}
}

<mx:httpservice id="httpService" showbusycursor="false" useproxy="false" method="POST" resultformat="text" url="upload.php" result="onResult()"
fault="onHTTPFault(event)" />

Ya está. El script upload.php de tu servidor recibirá por POST la variable “imagen” con el contenido de tu foto. Sólo habrá que guardarla en un archivo y habrás terminado la parta más ¿complicada? del proyecto.

if($_POST['imagen'] & strlen($_POST['imagen'])!=0 & strlen($_POST['imagen'])>1600){
        $bmd=base64_decode($_POST['imagen']);
        $im = fopen("fotos/foto.jpg",'w');
        fwrite($im,$bmd);
        fclose($im);
}

Antes de guardar la imagen en disco podrías añadir un registro a una base de datos que te permita generar después la galería. Esa parte queda a tu elección.

Generando la galería

Esta es la parte fácil, simplemente creas un script PHP (o en el lenguaje que prefieras) que liste las fotos que has ido guardando en la base de datos paginando como creas oportuno. Creo que sobran más comentarios para algo tan fácil.

Conclusiones

Hoy hemos visto cómo de una manera extremadamente rápida y sencilla se puede conectar con la webcam (y el micrófono) de los usuarios. Sólo hemos visto como hacer una fotografía instantánea de lo que se está viendo a través de la cámara, pero el sistema abre un inmenso mundo de posibilidades.

Descárgate aquí el código del proyecto.

Tour murciano, Gredas de Bolnuevo, la Manga y Cabo de Palos

Este fin de semana necesitaba unos días de descanso en toda regla, sin agobios ni prisas, así que partimos el sábado por la mañana hacia la bahía de Mazarrón.

Gredas de Bolnuevo

Iba con muchísimas ganas de ver esto, muy cerquita de Mazarrón, pero en realidad me lleve una gran decepción.

Gredas de Bolnuevo

Había visto en varios sitios de Internet fotos de esta zona y me había llamado la atención hasta tal punto de convertirse en un destino preferente para un fin de semana, sin embargo, al llegar allí todo cambió. Quizás me había hecho demasiadas ilusiones y había idealizado el lugar, pero el caso es que fue tan decepcionante que cuando llegamos al lugar exacto supusimos que no era aquello, no podía ser eso aquello tan impresionante que habíamos visto en fotos. Pero lo era.

Gredas de Bolnuevo

Gredas de BolnuevoGredas de BolnuevoGredas de Bolnuevo

La verdad es que una vez estás allí y comienzas a esconderte entre las formas rocosas cambias algo la idea inicial. Vale que es un trozo pequeño, pero las figuras son realmente impresionantes y extrañas.

Gredas de Bolnuevo

Gredas de BolnuevoGredas de BolnuevoGredas de Bolnuevo

Me hace gracia pensar que en el propio cartel explicativo rezaba: “Ciudad Encantada de Bolnuevo“. Entiendo que todos quieran aprovechar los recursos naturales que tienen pero…

En fin, que algo es algo y menos es nada. No creo que valga la pena un viaje a propósito para verlas pero si te encuentras por la zona puede que lleguen a gustarte.

Gredas de Bolnuevo

Gredas de BolnuevoGredas de Bolnuevo

Algo de explicación técnica sacada del propio cartel.

También conocido como Ciudad Encantada de Bolnuevo, está formada por mangas arenosas o gredas de color amarillento, areniscas y, en menor medida, por finos lentejones microconglomerados. Las areniscas presentan cantos carbonatados de color gris azulado y diferente macrofauna de moluscos y crustaceos. Las Gredas, según los estudios, han aportado abundantes microfósiles que datan del Zancliense (Plioceno inferior; unos 4millones de años). Estas rocas presentan diferentes grados de cohesion, han sufrido un proceso de erosión diferencial, en el que el agua y el viento (este último es el responsable de la erosión alveolar en “nido de abejas” que se observa en algunos estratos de areniscas) han sido fundamentales de dicho proceso. Todo ello ha dado lugar a caprichosas formas micóticas de gran belleza.

Comida en La Manga del Mar Menor

Después de la gran decepción de las Gredas se acercaba la hora de comer, así que decidimos acercarnos a La Manga del Mar Menor, a un restaurante llamado La Escuela de Pìeter (Urbanización Veneziola, Tel. 968 43 70 59). Lo mejor, sin duda alguna, el propio restaurante y su situación, en la playa, en el Mar Menor, mirando al sol. Para que os hagáis una idea, en una mesa de al lado había unos chicos que habían llegado por mar en unas motos acuáticas. Hay gente que se acerca en barco.

La Escuela de Pieter, La MangaLa Escuela de Pieter, La Manga

Fijaos en la situación de nuestra mesa. Sobran más palabras.

La Escuela de Pieter, La Manga

Dicho esto llegamos a la parte interesante. Tomamos trimarino (gambas, chanquetes y almejas) y chopitos de primeros y arroz con marisco de segundo. La comida, en general, bien y punto, no es de la mejor pero está bien. El arroz en su punto, sobraba el pollo 😛 . El trimarino resultó ser lo mejor, estaba muy buena la mezcla. Los chopitos, demasiado hechos, estaban excesivamente duros y algo insípidos para mi gusto.

Trimarino, La Escuela de PieterChopitos, La Escuela de Pieter

Arroz de Marisco, La Escuela de Pieter

Cabo de Palos

Después de comer y con el estómago a punto de reventar nos acercamos al Cabo de Palos a dar un paseo y tomar algo. Impresionante en esta época del año.

Cabo de Palos

Cabo de Palos

Cabo de Palos

Cabo de PalosCabo de PalosCabo de Palos

Comer en Murcia

El domingo, y antes de regresar a Valencia, nos acercamos a uno de nuestros restaurantes preferidos de Murcia, El Cañal los Almillas (Camino Viejo Gilandario, 9, Aljúcer, Tlf: 968 251 405), situado en un entorno privilegiado en mitad de la huerta murciana.

El Cañal, Los Alamillos

Tomamos almejas a la marinera y ensalada de la casa seguido de carne a la piedra, especialidad de la Casa. Todo bien pero la carne de buey, escelente.

Almejas a la marinera, El Cañal, MurciaEnsalada de la casa

img_4447.JPGimg_4451.JPG

De postre, tiramisú y tarta de queso. Estaban buenos, pero lo realmente llamativo eran los precios de los postres, 2,75 euros, hoy en día, es muy barato.

img_4453.JPG

Primeros pasos con Flash Media Server (2), autentificando usuarios del chat

Hace unos días veíamos como crear un sencillo chat con FMS.

Hoy, a petición popular, vamos a añadir la primera mejora a nuestra aplicación. Por defecto habíamos diseñado un chat público, cualquiera podía conectarse. Sin embargo, puede que deseemos que sólo nuestros usuarios registrados puedan utilizarlo. Necesitamos entonces que nuestros clientes se puedan autentificar contra nuestra base de datos pero no podemos dejar esa responsabilidad en manos de la aplicación cliente, cualquiera podría hacer otra que se conecte a nuestro servidor sin requerir autentificación.

FMS no puede conectarse con ningún tipo de bases de datos, no es su función, aunque cada vez hay más gente solicitando esta funcionalidad y se espera que en la próxima versión (FMS4) haya alguna novedad al respecto. Sea como fuera, de momento no hay métodos nativos para acceder a bases de datos así que sólo se puede recurrir a lo que un día fue Flash Remoting y hoy son los servicios RPC bajo AMF, el método estándar de acceso a datos desde aplicaciones Flash (con el permiso de los webservices SOAP). Con el tiempo fueron apareciendo versiones en los distintos lenguajes para utilizar el protocolo AMF fuera del amparo de Macromedia (ahora Adobe), pero sin duda uno de los pioneros fue amfphp, el que nos permite comunicar aplicaciones Flash con el servidor a través de PHP.

AMF es un formato para serialización de datos e invocación de métodos remotos y es independiente al lenguaje con el que trabaja el servidor, simplemente debe cumplir las especificaciones. FMS, como no podía ser de otra forma, puede comunicarse con nuestro servidor gracias a este protocolo AMF y esto es precisamente lo que vamos a utilizar para autentificar a nuestros usuarios:

dibujo1.jpg

El proceso es mucho más sencillo de lo que parece.

Comenzaremos por descargar amfphp desde la web oficial.  Lo descomprimes y subes la carpeta “amfphp” a tu servidor en la ruta que desees. Ya tienes lo que es el cerebro del sistema listo, para comprobarlo prueba la URL:

http://tuservidor/amfphp/gateway.php

Si todo va bien, prueba ahora el navegador de servicios, herramienta imprescindible para probar tus métodos remotos:

http://tuservidor/amfphp/browser/

Si no has visto ningún error es que todo va bien. Veamos ahora como crear tu servicio de autentificación.

Dentro de la carpeta amfphp que has subido a tu servidor encontrarás la carpeta services. Crea dentro de ella un nuevo directorio con el nombre de tu aplicación, por ejemplo chat. Creamos ahora dentro de esa carpeta las clases y métodos que se necesiten para crear el servicio de autentificación. Por ejemplo, en mi caso creo Chat.php:

<?
class Chat{
    var $conn;    function Chat(){
      $this->conn=mysql_connect("host", "usuario", "clave");
      mysql_select_db('db', $this->conn);
    }
function login($nick, $pass){
        $rs=mysql_query("select * from usuarios where nick='$nick' AND pass='$pass'");
        if(mysql_num_rows($rs)>0)
          return 1;
        else
          return 0;
    }
}
?>

Sencillo ¿no?. Nuestra clase tiene un método login que nos dice si la pareja nick/clave existe en nuestra base de datos. Obviamente esto es sólo un ejemplo, en tu aplicación haz la clase con todos los métodos y la lógica que necesites.

Si ahora vas de nuevo al Service Browser verás que te aparece la nueva aplicación chat con la clase que has creado. Si accedes a ella puedes probar el método login pasándole los parámetros necesarios. Más sencillo imposible.

Ya tenemos la lógica de autentificación lista. ¿Cómo le decimos ahora a FMS que la utilice? Modificamos el archivo main.asc que habíamos hecho en el capítulo anterior para que antes de aceptar la conexión de un usuario la autentifique.

application.onConnect = function(client, nick, clave, sala){
    var valido=1;
    for( i in this.userList){
        if(String(this.userList[i].nick).toLowerCase()==String(nick).toLowerCase()){
            valido=0;
            break;
        }
    }
    if(valido==1){
        var myServer = NetServices.createGatewayConnection("http://tudominio/amfphp/gateway.php");
        var servicio = myServer.getService("chat.Chat", this);
        var callserver=servicio.login(email, clave);

        this.login_Result=function(result){
            //trace("RESULTADO LOGIN"+result);
            if(result>0){
                client.uid = this.uid;
                client.nick = nick;
                client.sala = sala;
                this.acceptConnection(client);
                this.userList[client.uid] = client;
                this.users_so.setProperty(client.uid, client);
                var msg = "*** Entra " + client.nick + " ***";
                this.chat_so.send("onMsgSend", msg);
                client.call("onUserid", null, client.uid, client.nick);
                this.uid++;
            }else{
                var err = new Object();
                err.message = "Email o contraseña incorrectos";
                application.rejectConnection(client, err);
            }
        }
    }else{
        var err = new Object();
        err.message = "Ya hay un usuario con ese nick";
        trace(err.message);
        application.rejectConnection(client, err);
    }
}

Es tan simple como añadir la comprobación del usuario y clave de nuestro cliente. Indicamos la url de nuestro gateway (amfphp) y llamamos al método login con los datos correspondientes. Lo más importante es la forma en que obtenemos los datos que devuelve el metodo. La llamada es asíncrona, no se paraliza la actividad esperando por un resultado sino que se continua la actividad esperando a recibir la respuesta. Para eso se supone que debe haber definida una función nombremetodoremoto_Result, en nuestro caso login_Result ya que login es el método remoto al que llamamos. Cuando se llame a esta función sabremos si el usuario existe en nuestra base de datos, con lo que aceptamos su conexión al chat, o no existe y la rechazamos.

Como habéis visto, es muy sencillo llamar a métodos remotos desde FMS de manera que aumenten las posibilidades de tu aplicación ya que puedes hacer uso de bases de datos y de sistemas avanzados y siempre de manera muy simple.

Yo te he dado las pistas de cómo hacerlo, el resto queda a tu imaginación.