Uno de los proyectos que consideramos más representativos de este año, ha sido la web del fotógrafo José Gil Díe (Gorgeous Touch). Partiendo de un diseño de Hector Serrano y José Gil Díe, el principal reto estuvo en el desarrollo de la programación dinámica, en actionscript y php+MySql, haciendo actualizable todo el site desde un panel de control. Posiblemente la parte más complicada haya sido los llamados "Case Studies" (Casos de estudio), una mini aplicación que organiza las imágenes subidas por separado, para ser visualizadas en una película que muestra el desarrollo de trabajo de cada foto.
Hace unos días Gmail introdujo una nueva funcionalidad muy interesante: la posibilidad de adjuntar archivos a un nuevo mensaje arrastrando y soltando. Para el usuario normal, esto puede parecer una tontería, pero para un desarrollador web, que conoce las limitaciones de los navegadores y, sobre todo, la seguridad necesaria en este tipo de eventos, es algo, que al menos debemos estudiar.
Inicialmente apareció en Chrome y cualquiera pensaría que como es su propio navegador, ellos pueden introducir las excepciones que consideren necesarias. Pero ya se puede utilizar también en Firefox ... (así que habrá gato encerrado).
Por el momento no ha aparecido mucha documentación al respecto. Así que nos pusimos a buscar y encontramos las siguientes curiosidades.
- En la versión en inglés, cuando arrastras el archivo, aparece una capa verde que indica "Drop files here to add them as attachments".
- En la versión en español: "Dejar los archivos aquí para añadirlos como archivos adjuntos". Cláramente esto no lo ha traducido un español (esto es una broma, claro, sólo lo hemos puesto por si alguien busca esas cadenas :)).
- En el blog oficial de Google pone sólo que tan pronto como esté disponible esta característica en el resto de navegadores, lo habilitarán. Vaya.
- Parece ser que el culpable será de nuevo HTML5, que aunque la mayoría de cosas interesantes que la gente clama que están hechas con HTML5, son en realidad javascript, en este caso, podemos ir un poco más allá.
- Más concretamente, se trata del File API, y tenemos la suerte de que los chicos del W3C nos han preparado una referencia: Referencia File API HTML5
* Como curiosidad, comentar que mientras buceábamos por el código del Gmail (por cierto, en nuestro caso de Google Apps), nos encontramos con esta rareza: <div style="position: absolute; top: 0px; left: -10000px; overflow: hidden; width: 0px; height: 0px;"><embed wmode="window" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" seamlesstabbing="false" allowfullscreen="true" allowscriptaccess="sameDomain" bgcolor="#000000" flashvars="dbg=true&ap=previewer&nm=yj_api0&cb=Recv_yj_api0&os=macintosh&&" src="im/media-api.swf?ver=1.0.1" style="width: 100%; height: 100%;" name="yj_api0" id="flash_yj_api0" quality="high"></div>
¿Qué hace esa capa oculta con media-api.swf? Eso seguramente, es otra historia...
Presentamos la nueva carpeta de nuestro blog Guru. Desde aquí, publicaremos noticias interesantes relacionadas con el desarrollo web, desde un punto de vista más o menos especializado. No será exactamente una revista, ni tampoco un copia y pega de otros sitios (de eso ya hay demasiado en internet). Intentaremos adelantarnos a las noticias (como buenos Gurus) y traer cuestiones sobre las que pensar en esos ratos libres tan escasos que tenemos. Precísamente por ello, no podremos ofrecer mucha regularidad, pero prometemos que el contenido valdrá la pena.
En principio, no queremos hablar del IPAD, ni tampoco de por qué Mac la ha tomado con Adobe, ni siquiera de la guerra abierta entre Facebook y Google. De todo ello se habla demasiado hoy en día y hay sitios mucho mejores donde informarse. En el primer post hablaremos de Gmail.
Acabamos de terminar el desarrollo de una nueva aplicación de Facebook. En este caso, se trata de un "medidor de calidad de vida". Realizado a partir de una aplicación del IBV (Instituto de Biomecánica de Valencia), es una herramienta, que tras una serie de preguntas te devuelve tu índice de calidad de vida. Pruébalo:
Hace algunos meses terminamos el desarrollo de la nueva imagen de Asindown (Asociación Síndrome de Down de Valencia). El proyecto consistió en un restyling del logotipo y el desarrollo de un nuevo portal web.
Partiendo del respeto hacia la imagen anterior, se intentó principalmente modernizar las formas, así como subsanar algunos problemas de legibilidad. Además, se establecieron variantes del logo para las dos organizaciones que forman Asindown, la Fundación y la Asociación. El anterior logotipo se utilizaba para ambas organizaciones, con lo que no se distinguía suficientemente entre las actividades que realizaba cada entidad. Respecto a la página web, era necesario que pudiera ser administrada por el equipo de la Fundación (sin amplios conocimientos de diseño web) y partiera de un sistema de código abierto. La opción elegida fue adaptar un template de Joomla:
Cvidaclub es una plataforma de red social impulsada por la Asociación Cvida (Empresas especializadas en el cuidado de la calidad de vida, Generalitat Valenciana e IBV). Desde Portfolio, hemos trabajado bajo la dirección del equipo de aplicaciones TIC del IBV en el diseño y programación de la misma. Aparte del interés que tiene técnicamente, por estar basada en Joomla y Jomsocial, en esta ocasión nos gustaría resaltar la utilidad real de la plataforma.
Está enfocada a todo tipo de perfiles a partir de 18 años y su cometido es encontrar un centro de debate y punto de información sobre el mismo objetivo de la asociación: cuidar la calidad de vida. Cualquier persona interesada en estos temas (quien no lo está!) puede unirse y preguntar o debatir sobre las dudas o cuestiones que considere; desde un deportista que quiera mejorar su descanso, hasta un anciano que desee completar su tiempo de ocio. Al fin y al cabo, a todos nos viene bien mejorar nuestra calidad de vida. ¿O no?.
Año nuevo, vida nueva!. Nos hemos mudado a una nueva oficina en la calle Pascual y Genís, 10, piso 8º. Durante los últimos meses, hemos estado muy liados con los preparativos, la obra, la mudanza ..., pero aunque todavía faltan muchas cosas, ya estamos trabajando más o menos de forma continua en el nuevo espacio. En breve enviaremos fotos, vídeos y más información (sobre las muchas fiestas de inauguración que vamos a hacer), pero por el momento, habrá que conformarse con la vista de Google Maps:
Desde hace algún tiempo estamos inmersos en el "nuevo" mundo de las redes sociales. En concreto, trabajamos ya en modo producción en entornos como Elgg o Jomsocial, incluso desarrollando nuevos plugins y widgets. Sin embargo, en los últimos dias, hemos pasado lo que podríamos considerar la frontera definitiva: el desarrollo de una aplicación para Facebook de principio a fin, utilizando tanto las apis de php y javascript, como las nuevas utilidades de Facebook Connect (toda una experiencia).
Dicho así puede parecer poca cosa, pero si tenemos en cuenta que la mayoría de artículos de desarrolladores comienzan diciendo lo obtusa que es la documentación y si añadimos que ésta sólo tiene versión en inglés, mientras que nosotros usamos la versión en español del interface, la cosa se complica. Los muchos problemas que nos hemos encontrado darían para extensos artículos, aunque al final la cosa ha salido bien y (gracias a la intensa viralidad social del sistema), ya tenemos cuarenta y tantos usuarios sin salir siquiera en el directorio.
El widget de Arte10, que muestra las últimas noticias del portal, aparece en Netvibes como widget destacado. Según sus datos, lo han instalado ya más de 3000 usuarios. Además, Arte10 tiene en Netvibes y iGoogle otros widgets, como el de Obra del Momento, que además, aparece en Blogger como uno de los widgets más populares. De hecho, esa "pequeña" inclusión en el índice de Blogger en septiembre de 2008, conllevó un aumento muy considerable de las visitas de todo el portal.
Sin duda, la programación de widgets va a ser uno de los frentes más dinámicos en la programación web de los próximos meses. Muy pronto, todo el mundo querrá un widget, ya que un widget bien hecho tiene tanto poder de dinamización como la mejor de las páginas web y más ahora que todavía es un mundo poco explotado. Por nuestra parte, a pesar de que en casa de herrero, cuchillo de palo, intentamos aderezar cada nueva producción con alguno de estas pequeñas aplicaciones.
Un buen ejemplo de ello, es la red social amiguete.com. Nuestro proyecto personal sobre redes sociales, que sobretodo nos está sirviendo para experimentar en real, las características de los estándares opensocial. Estando todavía en fase alpha y sin haberlo empezado a dinamizar, ya tenemos un pequeño widget (casi en plan campaña teaser), que según vayamos terminando de desarrollar, podría convertirse en la herramienta dinamizadora que necesitamos. Algo tan sencillo como esto, puede hacer mucho por un proyecto, ¿o no?:
Con este tutorial, empezamos una nueva sección en el blog de Portfolio. Además de las noticias relacionadas con nuestro trabajo, incluiremos artículos o tutoriales sobre cuestiones que consideremos interesantes en relación al diseño web y multimedia.
Tras varios días dando vueltas a un código para gestionar la navegación en páginas con Ajax, utilizando los botones de adelante y atrás del navegador, ya hemos empezado a obtener resultados satisfactorios y nada mejor que escribir un mini tutorial, para compartir lo aprendido y suplir la carencia de documentación en castellano sobre este tema (al menos nosotros no la hemos encontrado).
Problema: Cuando se utiliza Ajax, los botones de adelante y atrás del navegador no responden como un usuario inexperto desearía, sino que el historial de navegación queda bloqueado en la página contenedora. Hablando en términos de javascript, necesitamos que el historial de navegacíon al que accederíamos con history.go(-1), por ejemplo, grabe los eventos que vayamos realizando.
Solución: Hoy en día, muchos programadores utilizan frameworks o librerías de javascript que facilitan estas tareas, pero depender de una librería concreta no era solución para nosotros, ya que queríamos integrar el código en CMS10 y crear un topping que trabajase de la forma más independiente posible, por ello, elegimos el script Reallysimplehistory de Brad Neuberg. En resumen, es pequeño, utiliza javascript clásico, no cuenta con florituras innecesarias y tiene pocos bugs. Probablemente el mayor problema que tiene es que la documentación es muy escasa y algo obtusa. (por eso este tutorial :)
Paso a paso: En primer lugar hay que descargar el código y subirlo a un servidor online o local. No se recomienda probarlo sin software de servidor, ya que es muy posible que no funcione correctamente.
Una de las cosas buenas que tiene, es que funciona instalado en carpetas, únicamente habría que cambiar la ruta hacia el archivo blank.html (en la línea 232 de rsh.js)
Del .zip de descarga sólo necesitaremos rsh.js, json2005.js y blank.html. Incluiremos los tres juntos en cualquier carpeta del servidor.
Tal y como se indica en la documentación oficial, incluye el siguiente código en tu página (cuidado con los saltos de línea):
Vamos a utilizar este código porque es el que sirve para cualquier entorno. Para utilizarlo con otras librerías con JQuery, Prototype, etc, visita la web del script. Normalmente suponemos que tendríamos que insertarlo en el <head>, pero hemos probado poniéndolo en el <body> y parece que funciona. Esto puede parecer innecesario, pero en nuestro caso era parte del problema.
En las primeras etiquetas de carga de ambos scripts, incluiremos la ruta de la carpeta hacia ellos (en caso de no estar en la misma carpeta).
Este script sirve para inicializar el "listener" que vigilará los eventos desde la página contenedora. De tal forma, que cuando el usuario navegue utilizando los enlaces internos de la página ajax, deberíamos grabar el evento en un historial creado para tal efecto. Cada vez que se ejecute este script, se consultará el historial y se ejecutará el código que hayas incluido donde pone //do something (hacer algo en inglés).
Por tanto, necesitamos grabar los eventos de navegación en el ajax y luego hacer que el script utilice esos datos grabados para devolver al usuario al lugar que indique el historial.
¿Cómo grabamos los eventos?: utilizaremos dhtmlHistory.add(newLocation, historyData). Es decir, en los enlaces que hayamos creado con javascript para navegar dentro del ajax, pondremos algo así: <a href="#" onclick="dhtmlHistory.add('direccion_del_enlace_hacia_dondevamos', null); el_script_anterior_quegenerase_el_enlace_ajax();">. La variable historyData en principio no la utilizaremos para mantener la sencillez del código.
¿Cómo utilizaremos los datos del historial?: Substituiremos el //do something por nuestra propia función de navegación ajax. Es decir, pondremos un script que recoja la variable newLocation (que sería en este caso la dirección grabada en el historial) y la cargaremos en nuestro div contenedor del ajax.
A veces lo mejor es verlo con un ejemplo. En nuestro caso, creando un topping para CMS10, quedó de la siguiente forma:
Es decir, (sólo cambiamos lo que está en rojo) si no encuentra la variable newLocation carga el ajax en el div con la url inicial, y si lo encuentra, lo carga con la url que devuelva la variable. (La función cargarTopping es la que utiliza CMS10 para cargar los contenidos con ajax)
-Para solucionar el mismo problema en flash y otros formatos, hay un script bastante conocido llamado SWFaddress. En principio, también funciona para Ajax, por lo que puede ser una alternativa interesante a ReallySimpleHistory.