Let's node.js
Acabo de lanzar un blog dedicado a node.js y express.js, donde iré contando cosas que considero interesantes del desarrollo en esta plataforma de alto rendimiento.
También he colocado ejemplos de código:
Página oficinal de node.js: http://www.nodejs.org/
Curso de HTML5 / CSS3 en Mayo en Zaragoza

Curso de HTML5 / CSS3 en Mayo en Zaragoza
http://www.vitaminasdev.com/Cursos/3/html5-y-css3
- Los nuevos tags de HTML5: qué podemos empezar a utilizar ya (header, nav, article, section, video, audio…) y cómo hacerlo compatible con navegadores antiguos.
- Los formularios con HTML5 (los nuevos type, validación nativa…).
- Las API de HTML5: un vistazo rápido a las API de Javascript que harán más fácil el desarrollo de aplicaciones web (canvas, web workers, web sockets, cache…). Este punto es meramente introductorio y no se profundizará más en él por cuestiones de tiempo.
- Soporte actual de CSS3 en los distintos navegadores y en qué situaciones podemos permitirnos usar CSS3 aunque no esté ampliamente soportado.
- Las nuevas herramientas de decoración: border-radius, gradients, shadows, opacity, multiple-backgrounds…
- La tipografía a la carta: @font-face, sus virtudes, sus problemas y herramientas relacionadas, como Google Font Directory o Typekit.
- Los nuevos selectores y sus posibilidades.
- Animaciones y transformaciones con CSS3.
- CSS columns, media queries y las nuevas herramientas de layout.
WebForms vs ASP.NET MVC
Comentarios recientes (Enero 2011) de programadores que acaban de descubrir MVC:
"En Webforms costaba mucho hacer las cosas. Ahora en ASP.NET MVC hacemos todo mucho más rápido y el resultado es mucho mejor" Víctor Bude. Analista programador en Nervia Consultores.
"Utilizando MVC las responsabilidades entre interfaz, lógica de negocios y de control quedan claramente separadas. Con lo que facilita la realización de pruebas unitarias de los componentes y se construyen sistemas más eficientes." Adriana Aparicio. Analista programadora en Nervia Consultores.
"Con MVC todo queda mas usable, mas simple, no hay que acabar metiendo controles dentro de controles con mas controles, si no que todo esta algo mas organizado, además que para comenzar los avances se ven mucho más rápido, lo cual anima al equipo un montón." Eduardo Izquierdo. Analista programador en Nervia Consultores.
Vitaminas de formación en Zaragoza: Fundamentos ASP.NET MVC

Estoy preparando unos talleres de un día, muy prácticos y dirigidos, orientados a programadores que quieren mejorar la calidad del código y su capacidad productiva, haciendo más y mejor en menos tiempo.
El primero de esos talleres es "Fundamentos de ASP.NET MVC". Contenido:
- Arquitectura de una solución ASP.NET MVC
- El patrón MVC
- Routing
- Controllers
- Views, typed Views
- View helpers
- Model (usando Entity Framework)
- Acceso a datos
- Validaciones usando Data Annotations
- Edición de modelo
- Gestión y registro de errores, instrumentación. Elmah
- Testing, unit testing con MVC
Si estás interesado en estos talleres, puedes rellenar este formulario, que servirá para dimensionar la demanda y priorizar los cursos (el envío del formulario no conlleva ningún tipo de compromiso):
Vitaminas de formación en Zaragoza. Formulario de interés
Más información en breve, en www.iloire.com
El proyecto DNDZGZ visto desde fuera (desafío abredatos)

Se ha escrito bastante ya sobre el desafío abredatos y sobre el equipo maño que ha participado: dndzgz (Dónde en Zaragoza)
A mi me gustaría entrar en la vertiente técnica (manteniendo el post "todos los públicos") y hacerlo desde fuera, ya que Daniel y Alberto nos han contado muchas cosas desde dentro.
1) Primeras impresiones, introducción
Estaba muy interesado en conocer el código asociado a un proyecto que se concibe y ejecuta en 48 horas por un equipo en el que apenas se conocen sus miembros.
Detrás de este proyecto había buenos profesionales, pero sinceramente, esperaba encontrar eventualmente "spaghetti code", "hacks" buscando atajos rápidos para solucionar problemas complejos (recordemos: sólo 48 horas - un exigente "deadline" que cumplir, sueño acumulado, muchas horas de programación seguidas, nulo trabajo en equipo anterior), etc..
Mi sorpresa fue agradable al encontrar en el repositorio de código público (el código está disponible para descarga y revisión)
- Una elección de plataforma tecnológica innovadora y muy adecuada para el desafío (bueno, esto ya lo conocía "a priori")
- Una elección de lenguaje de servidor muy acertada: Python
- Una ejecución realmente concisa, elegante y brillante
2) Apuesta tecnológica: AppEngine
AppEngine, de Google, es una plataforma de desarrollo que permite al programador abstraerse del trabajo asociado a poner un proyecto web en marcha (instalación, configuración de base de datos, etc), y del asociado a su crecimiento (Google te garantiza escalabilidad de forma transparente) y centrarse en el desarrollo (por ahora limitado a los lenguajes Java y Python).
AppEngine gestiona de manera transparente la escalabilidad del proyecto en un entorno distribuido. Perfecto para un desafío de 48 horas, donde no puedes perder el tiempo con la configuración de los servidores ni con la puesta en marcha!!
3) Python, lenguaje de programación utilizado en el "backend" (el servidor)
Usando AppEngine puedes elegir dos lenguajes de programación: Java y Python. Dani y Alberto son "javeros", así que os podéis imaginar el lenguaje que usaron.... pues.. eligieron Python!!.
Con Python, obtener una URL de Bizi y obtener el conjunto de datos deseado mediante "scrapping" se convierte en una tarea de unas pocas líneas de código. Ejemplo extraído de Dndzgz (perdonad que el formato haga que no encaje correctamente en el blog):
class FecthBizi(BaseHandler):
def get(self):
response = urlfetch.fetch(’http://www.bizizaragoza.com/localizaciones/station_map.php’).content
self.response.headers[’Content-Type’] = ’text/plain’
response = response.replace(’r’, ’ ’)
response = response.replace(’n’, ’ ’)
response = response.replace(’t’, ’ ’)
regex = ’GLatLng((-?d+.d+),(-?d+.d+).+?idStation="+(d+)+"&addressnew=([a-zA-Z0-9]+)’
matchobjects = re.finditer(regex, response)
result = []
import base64
for match in matchobjects:
s = match.group(4)
result.append({"name": base64.decodestring(s + ’=’ * (4 - len(s) % 4)),
"lat": float(match.group(1)),
"lon": float(match.group(2)),
"id": match.group(3)})
self.create_service("bizi", result)
4) Un impecable trabajo de cliente: jQTouch, jQuery, HTML5, CSS
Una vez que los datos son recuperados mediante el acceso a las diferentes URLS y limpiados ("scrapping"), estos datos están ya preparados para ser "digeridos" por la aplicación ya en el entorno local.
Daniel y Alberto usaron jQTouch para crear el interfaz de usuario de manera que de la impresión de que la aplicación se comporta como una "aplicación nativa" (es decir, desarrollada específicamente para cada terminal), aunque no haya sido así (por cierto, en este momento me consta que se está trabajando en versiones nativas para Android y iPhone)
A destacar el uso de una base de datos local (localStorage) utilizando la potencia de HTML 5 para guardar los favoritos. Más información sobre "Web SQL Database" en el blog de Daniel Latorre: http://www.danilat.com/weblog/2010/05/18/sql-con-javascript-web-sql-database/
Notas finales
Creo que dndzgz, tanto por su abordaje innovador (arquitectura distribuida autogestionada - App Engine, la "nube" de Google), como por su brillante ejecución (código conciso, eficiente, elegante), es un proyecto a ser utilizado como ejemplo en talleres de desarrollo de aplicaciones basadas en consumo de servicios, geoposicionadas y orientadas a dispositivos móviles.
Es brillante lo que este equipo ha conseguido en tan poco tiempo y con tan sólo unos pocos Kbytes de código.
Este proyecto, prueba una afirmación que defiendo profundamente:
"In our field, the top 1 percent of the work force can easily be 10 times as productive as the average developer. The best developers invent new products, figure out shortcuts that save months of work, and, when there are no shortcuts, plow through coding tasks like a monster truck at a tea party" Joel Spolsky - Artículo completo
Por supuesto, aunque quede fuera de este humilde mini-análisis técnico quiero destacar también el brillante trabajo de Diseño y Marketing de Mamen y Lucas (respectivamente).
Referencias
- Dónde en Zaragoza: http://www.dndzgz.com/web/index.html
- Blog de Daniel Latorre http://www.danilat.com/weblog/
- Blog de Alberto Gimeno: http://gimenete.wordpress.com/
Programador cabreado

Has sentido alguna vez que tu trabajo como programador es ingrato, o te genera insatisfacción?
Te sientes con frecuencia "cabreado"?
Aquí tienes un lugar para desahogarte :)
http://www.programadorcabreado.com/
(la imagen ha sido tomada de flickr, licencia CC. Original aquí)
DND ZGZ - Desafío Abredatos
DND ZGZ... No, no es el balbuceo de un bebé. es una iniciativa (dónde en Zaragoza) llevada a cabo por 4 Zaragozanos para afrontar el desafío abredatos.
El objetivo: la liberación en formato abierto de los datos públicos, para aprovechamiento de los mismos en beneficio de los ciudadanos. En tan solo 48 horas, los equipos participantes en el desafío han podido hacer cosas como la aplicación multiplataforma del equipo @dndzgz, que permite localizar puntos Wifi, paradas de Bizi y autobuses.
Los pobres han tenido que obtener los datos que alimentan las aplicaciones diseccionando a mano el código HTML de las páginas webs correspondientes (desperdicio de tiempo y talento). Si estos datos hubiesen estado disponibles de forma pública en un formato más fácilmente manipulable se podría haber conseguido mucho más, con mucho menos esfuerzo.
Ese es el objetivo.
Podéis conocer más del equipo, el proyecto y la aplicación aquí
Almacenamiento de contraseñas seguro, sincronizado y multiplataforma

Mi estrategia para guardar la contraseñas, mantenerlas sincronizadas entre equipos independientemente del SO.
Almacenamiento de contraseñas seguro, sincronizado y multiplataforma
Grupo desarrolladores de Android en Zaragoza

Recientemente se ha creado un grupo de desarrolladores interesados en la plataforma Android. Si estás interesado, puedes inscribirte aquí:





