Arragonán
I encuentro Agile Spain en Aragón
Marzo 31st, 2010 - [Enlace local]
El lunes me quedé sorprendido por la respuesta ante el primer encuentro Agile Spain en Aragón, que había convocado Teresa Oliver, alrededor de 20 personas terminamos asistiendo a esta primera toma de contacto. Gente que nos dedicamos a crear nuestros propios productos de software, que da servicios de desarrollo de software, de administraciones públicas… y de diferentes roles dentro de cada organización.
Personalmente fuí a tomar el pulso de la situación del agilismo en mi tierra y a aprender lo que pudiera, y aunque me quedé con la sensación que por estos lares andamos bastante verdes, creo que hay potencial para que esto vaya mejorando. Tampoco tuve oportunidad de absorver conocimiento
, por ser la primera reunión y estar bastante gente terminamos discutiendo en corrillos, aunque yo tuve conversaciones que me hicieron pensar y estrujarme la cabeza XD.
En fin, esperaremos al siguiente encuentro, a ver si la respuesta de la gente es al menos igual, tratamos ya un tema concreto para ver que se puede aprender de experiencias ajenas, y porqué no… hasta intentar aportar algo
Ya que estamos, por si alguien anda despistado con esto de las metodologías ágiles, dejo aquí el manifiesto ágil, que además siempre queda bien ponerlo
:
Estamos poniendo al descubierto mejores métodos para desarrollar software, haciéndolo y ayudando a otros a que lo hagan. Con este trabajo hemos llegado a valorar:
- Individuos e interacciones sobre procesos y herramientas
- Software que funciona sobre documentación exhaustiva
- Colaboración con el cliente sobre negociación de contratos
- Responder ante el cambio sobre seguimiento de un plan
Aunque los elementos a la derecha tienen valor, nosotros valoramos por encima de ellos los que están a la izquierda.
Y pos supuesto un placer ver a gente conocida interesada por el tema, conocer caras nuevas del mundillo, y coincidir por fin con Jorge Rubira, que ya era hora!!
» Leer más, comentarios, etc...
Picando Código
Antel me deprime
Marzo 30th, 2010 - [Enlace local]
Como comenté antes, desde hace unos meses estoy viviendo en Montevideo. Una de las necesidades básicas que todavía no había cubierto desde la mudanza fue el ADSL. Tras unos meses de organización y cuentas, decidí contratar el servicio de una vez. Mi historia para conseguir ADSL fue larga, y prácticamente “en vivo” el día de la conexión. A continuación, mi experiencia con AntelData:
Hay un local de Antel (la empresa de telecomunicaciones de los uruguayos) bastante cerca en Colonia y Arenal Grande. El lunes 22 de marzo fui hasta ahí, saqué un número, y esperé sentado para ser atendido. Mi número fue llamado por el escritorio 7. Ahí me atendió un funcionario, al que le expliqué qué servicios quería contratar.
Necesitaba una línea telefónica para instalar servicio ADSL. En el apartamento había una conexión telefónica pero no existía línea. Me preguntó si pensaba usar el teléfono o solo lo quería para el ADSL. Me dió la buena noticia de que se puede contratar el ADSL, y la línea solo para recibir llamadas. De esta manera me ahorro el cargo fijo ($200 y algo) por tener teléfono, y pago solo por el ADSL.
Acepté la propuesta, ya que no pensaba usar la línea telefónica como tal. Ni siquiera compré un aparato, y quedó registrada como línea para solo recibir llamadas. Le dí mis datos al funcionario, y los datos del plan ADSL que quería contratar: el servicio de 512 Kbps de bajada y 128 de subida a $ 490 por mes. Firmé los contratos, recibí copias, guías telefónicas y me fui a trabajar.
Me sorprendió al día siguiente recibir una llamada en mi teléfono móvil de parte de la gente de AntelData. La llamada en cuestión, era para coordinar un día y hora de instalación del equipo para ADSL. Me ofrecieron el jueves 25 de marzo entre las 10:00 y las 14:00 horas. Acepté, y me alegré. Pensé que el servicio había mejorado mucho, ya que a dos días de haber pedido el servicio, contaría con ADSL en mi apartamento. Más tarde en el trabajo recibí un mail de AntelData confirmando esta información:
Estimado Cliente
Comunicamos a usted, que el día 25/03/2010, en el rango horario comprendido entre las 10:00 y las 14:00 horas, concurrirá un técnico al domicilio donde reside el servicio telefónico número 02******* a instalar el servicio ADSL de referencia.
Incluso pregunté irónicamente en el trabajo: “¿Antel cambió de firma? Están haciendo las cosas demasiado bien”.
Miércoles 24 de marzo, en el ómnibus camino al trabajo recibo una llamada de los técnicos de Antel. Están afuera del edificio para conectarme la línea. Acá la primer “imperfección” del servicio. Podrían haber coordinado un horario para instalarme la línea también, de forma de estar prevenido y esperarlos. “Bueno, de última el jueves ya tengo ADSL” pensé, “No puedo quejarme”. Bajé del ómnibus, crucé la calle, y esperé para tomar otro ómnibus camino a casa. Al rato, tras pagar un segundo boleto (por suerte existe la tarjeta de 2 horas para poder volver al trabajo después sin pagar un tercer boleto), llego a casa. El técnico me esperaba en la recepción del edificio, subimos al apartamento, y me conectó la línea.
Bien, estaba todo listo para el jueves.
Jueves 24 de marzo, en el trabajo sabían que podía llegar más tarde porque iba a esperar a los técnicos del ADSL. De 10:00 a 14:00 podían ir. Me levanté temprano, y esperé. No sonó mi celular, no sonó el timbre. Cada tanto me asomaba por la ventana para ver si veía gente en la puerta, algún medio de transporte identificado con Antel u otra empresa de telecomunicaciones tercerizada. Nada.
Se hicieron las 14:00, y yo esperando. 14:15 estaba en el local comercial de Antel de Colonia y Arenal Grande nuevamente. Saqué número, esperé, y me atendió el mismo funcionario de la vez anterior en el escritorio 7. Le comenté mi problema: “El otro día estuve acá contigo, contraté el servicio ADSL, me instalaron la línea telefónica, y hoy los esperé y no fueron“. Tras revisar un poco la computadora, papeles, la compañera de al lado, una de las primeras respuestas que recibí fue algo parecido a:
“Pero si tienen fecha para hoy, hasta las 19:00 tienen tiempo de ir a instalarlo”
Respondí, todavía calmado, que se habían comprometido a ir en el horario de 10:00 a 14:00, que me lo habían confirmado por teléfono y por e-mail, que había faltado toda la mañana al trabajo, y me tenía que ir a trabajar. Le expliqué que no podía faltar al trabajo y quedarme en mi apartamento hasta las 19:00 por las dudas que fuera a ir uno de los técnicos a instalarme el ADSL. Asintió.
En algún momento ya sus respuestas no eran propias, sino que iba hacia otro escritorio atrás mío, seguramente algún supervisor o algo, y venía con la respuesta. En un primer momento me ofreció el sábado, día en que yo no iba a estar en el apartamento. Le pregunté si podía ser en semana de turismo (desde el lunes 30 de marzo hasta el viernes 2 de abril) y me respondió “Imposible, en turismo no trabajamos“. Bien…
Le plantié la posibilidad de que fueran ese mismo día más tarde. Ya había perdido la mañana, mejor terminar de perder el día, y no tener que perder otra mañana en otra ocasión. A lo que me respondió “No, hoy imposible.” Me resultó raro, ya que uno de sus primeros comentarios fue “tienen tiempo hasta las 19″, en fin…
En un momento me comentó que tenían un registro que decía que uno de los técnicos me había llamado al teléfono móvil porque había ido hasta el edificio donde vivo, y no le había atendido nadie. Mi teléfono no registraba llamadas perdidas, y le expliqué que en mi edificio hay una portera a esa hora, y que además, si hubieran tocado timbre, yo lo hubiera escuchado. Estuve toda la mañana atento a eso esperándolos. Verifiqué el número que tenían anotado, y estaba bien. Aclaré que a pesar de tener la línea de teléfono fija, no podía atender el teléfono si me llamaban, ya que no contaba con un equipo de teléfono, así que cualquier comunicación debían hacerla a mi número de teléfono celular.
Tras otra ida a los escritorios de atrás, volvió con un papel donde decía “Martes de 10:00 a 14:00″. Coordinamos un nuevo horario, hoy martes 30 de marzo. Por cierto, es parte de la semana de turismo donde era “imposible que viniera un técnico ya que no trabajaban“, en fin…
Por las dudas, hablé con la portera de la mañana, y la de la tarde para preguntarles si había venido algún técnico de Antel y que por alguna razón yo no hubiera escuchado el timbre, y mi celular no hubiera agarrado la llamada. Ambas me confirmaron que no había aparecido ningún técnico, ni vieron a ninguno tocando timbre.
Conclusión: perdí prácticamente un día. Esperé de 10:00 a 14:00, fui a Antel a reclamar, llegué a trabajar 15:30 aproximadamente.
Martes 30 de marzo. Me levanté temprano, y a partir de las 10:00 empecé a esperar… Por las dudas, conecté un equipo a la línea telefónica. Es inalámbrico a batería, así que lo dejé cargando. Esperé, pero nada.
En un momento sonó el teléfono, no pude atenderlo porque no tenía suficiente batería. “Me llamarán al celular si son ellos“, supuse. Seguía esperando, otra llamada. Logré atenderlo sin despegarlo de la base. ¡Era de Antel! (al momento son prácticamente las únicas personas que conocen mi número telefónico fijo). Era una mujer quien me explicó que el técnico habíá venido por el edificio, y no le atendía nadie. Le expliqué que esto era imposible, que había portero, y que yo estaba en el apartamento esperando, pendiente del timbre, para que me instalen el ADSL. Corroboré la dirección, era correcta. Me comentó que iba a llamar al técnico para que volviera a pasar. Le comenté que lo esperaría afuera, lo que le pareció bien, cosa que no tuviera ni que tocar el timbre. Esperé un buen rato, media hora aproximadamente… nada. Mi novia en su trabajo llamó al 0800 1111, reclamó al respecto, y le dijeron que todavía estaban a tiempo hasta las 14:00.
Hablé con la portera nuevamente, le comenté del tema. Me dijo que los técnicos de Antel siempre iban al edificio, y no había visto a ninguno en el día. Yo estaba bastante atento también, nuevamente cada algunos minutos me asomaba por la ventana a ver si venía alguien. Decidí volver al apartamento en caso que me llamaran por el teléfono de línea. No habían llamadas perdidas. Me senté a escribir este post…
A esta altura ya pasó como una hora, decidí llamar al teléfono de AntelData: 0800 1111. Le expliqué a la señora que me atendió que me habían llamado para decirme que el técnico había venido, que no había nadie, que esto era imposible porque yo estaba atento al timbre y había portero que sabía que yo los estaba esperando. Le dije que me habían hecho bajar a esperar al técnico, cuando no apareció. Me explicó que lo que quisieron decirme más temprano al llamarme, es que el técnico iba a volver, porque generalmente cuando van y no hay nadie lo dejan para otro día, y que hasta las 14:00 había tiempo…
(12:30) – Sigo esperando.
(13:00) – Sigo esperando… Voy a aprovechar para almorzar…
(13:43) – Paró una camioneta de Antel frente a mi edificio, alguien se bajó y entró al edificio. Bajé, por las dudas, y le pregunté al conductor de la camioneta si venía para instalar un servicio ADSL. Me dijo que no, que si me habían dicho que antes de las 14:00 venían, iban a venir, de lo contrario me llamaban antes.
(14:02) – Ya se cumplió el tiempo límite… Obviamente sigo a la espera.
(14:15) – Me voy hasta las oficinas comerciales de Antel a ver qué hacemos al respecto…
(14:38) – En las oficinas de Antel no me solucionaron el problema. En Información expliqué mi problema, y que quería hablar con algún encargado de conexiones ADSL. Me explicaron que ellos se encargaban del trámite comercial, que no tenían acceso a la parte técnica. Parte de la cuadrilla está de licencia, por lo que puede ser que se hayan atrasado con el horario. Que llame al 0800 1111 y pida para hablar con algún encargado para ver si me pueden solucionar.
Llamo al 0800, me atiende una funcionaria a la que le explico el problema. Me explica que se anota un incumplimiento en el horario del funcionario, ya que no se realizó la instalación en el tiempo definido. Me comenta que no tiene ningún registro de que el técnico haya pasado y no haya encontrado nadie, o que se le haya hecho tarde, o varias razones más por las cuales puede ser que no me hayan instalado el servicio. Me dejó bien claro que no hay registro que diga que la instalación no se vaya a hacer hoy. Que generalmente lo que se hace es esperar hasta las 18:00. Qué raro, otra persona me dijo que el técnico había venido y no había encontrado a nadie, en fin…
Le pregunto a la funcionaria:
¿Qué hago? Yo tendría que estar en mi trabajo a las 15:00. Puedo quedarme acá a esperar hasta las 18:00 por si vienen a hacer la instalación, o irme y pedir que vengan en otro momento, perder un tercer día con este tema, y pasar por lo mismo por tercera vez. No me estás dando una solución. ¿Qué hago?
La funcionaria me explica que no tiene forma de contactarse con los técnicos, me recomienda que si me tengo que ir, deje a alguien en mi apartamento esperando. No se me ocurre nadie, y tampoco me parece la solución hacerle perder el tiempo a un tercero con el mismo tema (por las dudas que vengan). Le pedí para hablar con algún superior, supervisor/a que me pueda dar una solución. Me explica que un supervisor me va a decir lo mismo, insisto con que me pase con un supervisor. A escuchar música de espera…
Mientras oigo la música de espera de Antel en mi teléfono fijo de línea, me llaman al celular del número 02 400 45 93. ¡Es AntelData! Me avisan que por motivo de la semana santa, están realizando un horario especial hasta las 17:00, por lo que pasarían en la tarde a hacer la instalación pendiente. Me preguntan si va a haber gente, a lo que respondo que sí, y me aseguro que la instalación se pretende realizar antes de las 17:00. El técnico me confirma que van a “tratar de que así sea”.
Mientras escribo todo ese párrafo, terminada la llamada con el técnico, sigo escuchando la música de espera de Antel… Son las 14:42. Tengo que avisar en el trabajo que llego más tarde de lo que ya pensaba llegar… A las 15:00 es el daily meeting :S
(15:00) – Me atiende en el 0800 1111 la supervisora Silvia Mandarin. Me explica que estuvo viendo mi caso, y que sí, efectivamente es la segunda fecha que pido y los técnicos no van. Mientras se disculpa por el hecho, y me explica que ingresa un incumplimiento en la franja horaria por parte del funcionario, le comento sobre la llamada que recibí, y le doy el número 400 45 93. Me ofrece entonces esperar a que los técnicos finalmente instalen el ADSL antes de las 17:00, y en caso contrario, que vuelva a llamar al 0800 1111, y me comunique directamente con ella, ya que va a estar disponible hasta las 21:00.
(15:03) – Estoy agradecido que se haya encontrado una solución al asunto. Pero quedo con esa intriga de si tendré ADSL instalado hoy o no. Además nada me va a devolver el tiempo que me hicieron perder. Si tuviera internet, estaría entrando a la página de Defensa del Consumidor ahora mismo para ingresar una denuncia. Pero no tengo internet… todavía…
(16:03) – Aún nada…
(17:04) – Hora de llamar de nuevo a Silvia Mandarin…
Tras haber hablado nuevamente con Silvina Mandarín, la situación sigue igual. Si bien tuvo empatía hacia mi situación, no pudo darme una solución. No tienen manera aparentemente de contactarse con los técnicos que andan en la calle. No sé qué opinará quien lee sobre este tema, pero siendo una empresa de telecomunicaciones…
Además de ingresar una segunda queja por incumplimiento, la supervisora intentará por correo interno hacer que algún técnico se comunique conmigo a mi teléfono móvil. Revisó el sistema, y no habían comentarios ingresados respecto a mi instalación, lo que implica que al estar aún en la calle los técnicos (hay tiempo hasta las 18:00, son las 17:25) existe la posibilidad de que vengan hoy.
Le aclaré que mi problema no era que estaba apurado por tener el servicio, sino que me molestaba perder tanto tiempo por un trámite así. Si no fuera porque trabajo con mi laptop en la oficina, hoy habría perdido el día laboral también, pero aproveché el tiempo para trabajar un poco a la distancia. Me aclaró que no tenía solución inmediata para mi problema, y que de no venir hoy a hacer la instalación los técnicos, quedaría para después de semana de turismo. Y la historia sigue…
(17:44) – Pasa por mi cabeza la frase “atentado a la torre de las telecomunicaciones”, pero no sé porqué…
(17:46) – Para un auto enfrente, veo que el tipo que baja tiene una caja de módems adsl… ¡Es la hora! Toca timbre, sube, y apuradísimo me pregunta si ya sé cómo es el trámite y demás. Se conecta, firmamos los papeles, me comenta que todavía le quedan dos clientes más y termina el día. Que no dan a vasto y están muy atrasados.
Al rato ya tengo ADSL y estoy conectado a Internet finalmente.
Ya llegado este párrafo final, no tengo más ganas de escribir por hoy. La queja quedó presentada en Antel, pero a pesar de miles de quejas y problemas similares al mío, sigue siendo un ente desatroso y desorganizado. Queda en evidencia las idas y venidas de algunos funcionarios que decían una cosa y después otra (no quiero usar el verbo “mentir”…). Algo hay que hacer para hacernos respetar como consumidores y usuarios de sus servicios. Sobretodo, siendo una empresa estatal.
Mañana exploraré la página de Defensa del Consumidor a ver si hay algo más que pueda hacer al respecto… Acá sentado no creo que pueda cambiar nada.
Las fotos pertenecen al corto Ataque de Pánico del compatriota Federico Álvarez, que debe estar por Hollywood trabajando en algo…
» Leer más, comentarios, etc...
Picando Código
Tutorial de Mercurial por Joel Spolsky
Marzo 29th, 2010 - [Enlace local]
Del artículo más reciente del conocido blog Joel On Software, Distributed Version Control is here to stay, baby (El control de versiones distribuído está aquí para quedarse) se desprende un tutorial sobre Mercurial.
En el artículo, Spolsky comenta cómo comenzó a usar Mercurial en su trabajo, viniendo de la “escuela de Subversion”. Explica que para ver las ventajas de los sistemas distribuídos de control de versiones, hay que cambiar la mentalidad. Con estos sistemas, se piensa en términos de cambios y no versiones. Es un modelo de programación distinto, donde en vez de tener “versión 1, versión2″, se tiene “los cambios de Juan”, “los cambios de Pepe”, etc.
Siendo la mayoría de los programadores usuarios de sistemas centralizados de control de versiones (como es mi caso), el cambio de paradigma hacia un sistema distribuído, puede llegar a ser confuso, no aprovechando la capacidad de éstos. Para ayudar un poco al cambio (Spolsky alienta a cambiarse a estos sistemas: “tenemos mejor tecnología ahora”), puso en línea el siguiente tutorial:
Hg Init: A Mercurial Tutorial es un tutorial de seis partes donde Joel Spolsky explica los conceptos clave detrás de Mercurial. Está en inglés, pero así como varios de sus artículos, es posible que sea traducido en otros idiomas.
Personalmente cada vez me interesan más estos sistemas de control de versiones distribuídos. Si bien he leído mucho al respecto, no he llegado a utilizarlos en situaciones reales (más que para obtener y actualizar el código de algún proyecto open source). Pienso que Subversion seguramente seguirá siendo el líder en cuanto a control centralizado, pero en algún momento voy a comenzar algún desarrollo de forma distribuida para adquirir ese concepto.
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering / Project Management
Skills en un equipo Ágil
Marzo 29th, 2010 - [Enlace local]
Desde proyectos Ágiles encuentro este excelente post que nos habla de los skills necesarios en cada uno de los integrantes de un équipo ágil, seguramente la palabra que tenemos mas en mente es auto-organizado pero que skills se requieren para mantener la calidad, la comunicación y el constante aprendizaje, las repuestas en el post.
» Leer más, comentarios, etc...
MadeInFlex
Jugando con AIR 2 beta 2
Marzo 28th, 2010 - [Enlace local]
Hemos hablado en diferentes posts de las caractarísticas de lo que será AIR 2. De momento ya tenemos disponible la beta 2 y con ésta he querido experimentar algunas de sus características. En este artículo veremos algunas de estas características mediante una aplicación de ejemplo y así probar parte de lo que nos aportará la nueva versión de AIR.
Introducción
Hemos posteado anteriormente este artículo en el que comentamos lo que nos aporta AIR 2. En la beta 2 de AIR 2, las mejoras que se recogen, a “grosso modo”, son las siguientes:
- Mejoras en el Print Job para tener un control mayor de la impresión desde AIR.
- Sockets TLS/SSL, que nos permiten conectar a servidores que requieran TLSv1 o SSLv3.
- Soporte para acceso a Flash, así podremos reproducir contenido protegido.
- Mejoras en la API IME, diseñada para usar con el nuevo Flash Text Engine (FTE).
Información, descarga e instalación de la beta 2
En el siguiente link encontrareis la página de AIR 2, con toda la información que necesiteis y explica como descargar e instalar en cualquier sistema operativo.
Probando AIR 2
Para probar algunas de las características de AIR 2, he desarrollado una aplicación que contiene un tab navigator. Cada uno de sus tabs contiene una de las posibilidades de AIR 2 analizadas. Aquí os dejo el proyecto para que lo podais probar y trastear. Descomprimidlo y tendreis el proyecto FXP para importar directamente:
AIR2Enhancements.fxp
Detección de soportes de almacenamiento y apertura con la aplicación por defecto.
Algo que encontrábamos a faltar hasta ahora en AIR era la posibilidad de acceder a dispositivos de almacenamiento. AIR 2 es capaz de detectar estos dispositivos y acceder a ellos. Para ello, debemos tener en cuenta 2 clases:
- StorageVolumeInfo: Es una clase singleton que reconoce los cambios en estos dispositivos. Cuando hay algun cambio, lanza un evento de tipo StorageVolumeChangeEvent. Podemos controlar dos tipos de eventos: storageVolumeMount y storageVolumeUnmount.
- StorageVolume: encapsula la información del dispositivo.
Con estas clases podremos ver la información que nos apetezca del dispositivo.
Por otra parte, la API de la clase File tiene un método llamado openWithDefaultApplication(), que nos permite abrir el fichero con el programa que tiene asignado por defecto el sistema operativo.
En la siguiente imagen vemos el primer tab de la aplicación que muestra los soportes de almacenamiento. Nos permite navegar por todos ellos y también podremos abrir los documentos con la aplicación por defecto:

File promises
File promises es una nueva API que nos permite acceder a ciertas URL’s y arrastrarlas fuera de la aplicación AIR para que se guarden en nuestra máquina local. La clase URLFilePromise se encarga de hacer esta operación mediante la implementación de la interface IFilePromise y usando URLStream y URLRequest.
Para crear una file promise, mediante la clase URLFilePromise, pasamos al clipboard el array de file promises deseadas. Cuando se termina el proceso de drag and drop hacia la máquina local, el runtime descarga los datos para cada file promise. A continuación vemos una imagen de ejemplo de nuestra aplicación:

Native process execution
Con esta API se nos permite interactuar con procesos nativos del sistema operativo. Para realizarlo, las siguientes clases nos dan esta capcidad:
- NativeProcess: tiene la capacidad de lanzar procesos en el sistema operativo en el que se alberga la aplicación.
- NativeProcessStartupInfo: proporciona información básica que nos servirá para lanzar un proceso en el sistema operativo.
- NativeProcessExitEvent: este evento se lanza una vez termina el proceso. Puede ser que no se lance nunca si es que estamos ejecutando un proceso contenido en la misma aplicación AIR.
Para probar esta característica y debido a que estamos usando una versión beta de AIR 2, debemos insertar este tag en el fichero descriptor de la aplicación:
He codificado la aplicación de manera que controle en qué sistema operativo nos encontramos y sólo nos deje lanzar una de las aplicaciones, la que soporte nuestro SO. Aquí va una captura para ver como se lanza una aplicación nativa:
Network interfaces
Un ordenador tiene diferentes interficies de red. Con AIR 2.0 podemos acceder a esta información mediante la clase NetworkInfo. Esta clase nos permite obtener información como por ejemplo: la IP local y las interficies de red. En la siguiente imagen vemos el resultado:
Resolución de DNS
Como sabemos, cada dominio de la red tiene una IP asociada. Un DNS hace la conversión entre los nombres de dominio y las direcciones IP.
AIR 2.0 nos proporciona una DNSResolver, la cual nos permite preguntar a DNS. Cuando se obtiene la información, se nos notifica mediante un evento de tipo DNSResolverEvent.
Una IP puede ser de tipo IPv4 (32-bits) o IPv6 (64-bits). El AIR actual sólo soporta IPv4, pero el nuevo AIR 2.0 reconoce IP’s de tipo.
Hay diferentes tipos de registros en los DNS, AIR 2.0 soporta los siguientes:
- ARecord: Esta clase nos devuleve información de direcciones de tipo 64-bits IPv6. Los registros AAAA se suelen usar para convertir hostnames en direcciones IP.
- AAAARecord: nos devuelve información sobre direcciones de tipo 32-bits IPv4.
- MXRecord: nos proporciona información sobre el mapeo del nombre de un dominio hacia una lista de intercambio de mail.
- SRVRecord: nos devuelve la información de localización de servicios sobre los registros SRV. Se utiliza para los nuevos protocolos en lugar de la creación de protocolos específicos.
- ResourceRecord: clase para encapsular la información del registro DNS.
- PTRRecord: nos permite acceder a la información de registros PTR. Los registros PTR se utilizan normalmente para la realización de consultas DNS inversas.
A continuación una muestra de una consulta que hace nuestra aplicación:

Conclusión
Hemos visto algunas de las características que nos proporcionan las betas de AIR 2.0. Hay muchísimas más características que dejo que experimenteis personalmente. Encontrareis bastante información y ejemplos por internet.
Seguiremos probando betas hasta que salga la release oficial de AIR 2.0.
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering / Project Management
THE REQUIREMENTS OF THE PROBLEM
Marzo 28th, 2010 - [Enlace local]
Casualmente encuentro un artículo que relaciona 2 temas en los cuales estoy inmerso Requerimientos y CRM en el cual David McGinness describe lo importante que es identificar el problema a solucionar, abstraerlo de forma adecuada para poder proponer una correcta solución y al final del proyecto saber si este fue exitoso no por salir en tiempo y costo sino porque realmente el cliente vio resuelto su problema a través de la solución implementada.
The Requirements of the problem
» Leer más, comentarios, etc...
Fetishcode...Thinking in objects
Logging en ADF 11g.
Marzo 27th, 2010 - [Enlace local]
A
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering / Project Management
PMP Opinions
Marzo 25th, 2010 - [Enlace local]
Caray que buena página de Administración de proyectos, sin mas que decir solo que la disfruten!!!
» Leer más, comentarios, etc...
Variable not found
Ajax con ASP: intercambio de datos JSON
Marzo 24th, 2010 - [Enlace local]
Sí, habéis leído bien: ASP a secas, sin la habitual terminación “.NET” que venimos usando mucho últimamente ;-).
Resulta que estoy metido en un proyecto colaborando con un equipo de trabajo que está desarrollando un portal web con esa tecnología (!), y me han encargado la creación de unas herramientas ajaxificadas dentro del mismo.
Aunque pueda parecer lo contrario, las aplicaciones desarrolladas con las vetustas (pero aún vivas) páginas activas de servidor (ASP) pueden aprovechar toda la potencia de las librerías de script de última generación, como la maravillosa jQuery. Vamos a ver lo sencillo que resulta tanto implementar un servicio JSON como consumirlo desde una página ASP.
El lado servidor
El servicio JSON lo implementaremos en un archivo al que llamaremos, por ejemplo, JsonObtenerProductos.asp, cuyo código podría ser como el siguiente:<!--#INCLUDE FILE="Includes\Functions.asp" --><%
Dim categoryId, Rs, countResponse.Expires = -1
If Not UserLogged() or Request("categoryId")="" Then
Response.EndEnd If
categoryId = Cint(Request("categoryId"))
OpenDatabase()
Set Rs = GetProductsByCategoryRecordset(categoryId) Response.ContentType = "application/json" Response.Write "{"Response.Write " ""datos"": ["
count = 0
While Not Rs.Eof
Dim id, name, desc id = Rs("id") name = Rs("name") desc = Rs("desc")count = count + 1
If count > 1 Then
Response.Write ", "End If
Response.Write "{ "Response.Write " ""productId"": " & id & ", "
Response.Write " ""productName"": """ & name & """, "
Response.Write " ""productDesc"": """ & desc & """"
Response.Write "}"Rs.MoveNext
Wend Response.Write " ]" Response.Write "}"Rs.Close
CloseDatabase()
%>
Como se observa, se establece el tipo de contenido a “application/json”, y a continuación se envía al cliente un objeto en formato JSON, en este caso un array de objetos construidos a partir de la información obtenida desde un RecordSet.
Así, una llamada al servicio mediante la petición GET /JsonObtenerProductos.asp?categoryId=3 podría retornar el siguiente resultado:
{ "datos": [
{ "productId": 1, "productName": "Producto 1", "productDesc": "Descripción 1"}, { "productId": 2, "productName": "Producto 2", "productDesc": "Descripción 2"}, { "productId": 3, "productName": "Producto 3", "productDesc": "Descripción 3"}]
}
Se puede entender a simple vista; se trata de una serie de objetos, separados por comas, en cuyo interior se definen cada una de sus propiedades con su correspondiente valor. Fijaos que el mismo nombre de la propiedad va entrecomillado.
El lado cliente
Desde la página .asp que consumirá el servicio, como siempre, lo primero es referenciar la librería jQuery en la página, así:<script src="Scripts/jquery-1.4.2.min.js" type="text/javascript"></script>
A continuación, introducimos en el marcado de la página el siguiente código, que muestra un desplegable con categorías de productos, cuyo cambio provocará la llamada al servidor, y reserva un bloque
<div> para mostrar el resultado:<select id="categories" onchange="reloadProducts()">
<option value="1">Electrodomésticos</option>
<option value="2">Informática</option>
<option value="3">Cocina</option>
...
</select>
<div id="result">
</div>
El código de la función
reloadProducts() es el mostrado a continuación. Utiliza el método getJSON() de jQuery para realizar la llamada Ajax, suministrándole como parámetro la categoría seleccionada en el desplegable en forma de objeto anónimo.<script type="text/javascript"> function reloadProducts() {$.getJSON(
"JsonObtenerProductos.asp", // URL del servicio
{ categoryId: $("#categories").val() }, // Parámetrosfunction(data) { // Función callback
var elem = $("#result");elem.empty(); // Limpiamos el contenedor
var s = "<ul>";
$.each(data.datos, function(i, item) {s += "<li>" + item.productName + "</li>";
});
s += "</ul>"; elem.html(s); // Insertamos la lista en el contenedor});
}
</script>
En la función callback, invocada por jQuery cuando la llamada Ajax ha sido completada con éxito, recibimos en el parámetro “data” los datos obtenidos desde el servidor, en nuestro caso un array de objetos.
Tras limpiar el
<div> donde depositaremos la información, recorremos con $.each() el array de objetos data.datos para crear una lista de productos, que insertamos a continuación en el interior del contenedor.Observad que en el interior del bucle estamos accediendo directamente a la propiedad “productName” del elemento.Y voila! Con esto tendríamos listo un sistema completo de carga asíncrona de elementos utilizando ASP y jQuery. Pero no sólo eso, podríamos utilizar la misma técnica para realizar actualizaciones de zonas de página definidas en archivos .asp independientes, o aprovechar la potencia de plugins y librerías adicionales para mejorar la experiencia de usuario de nuestros sistemas.
Y es que ASP todavía se utiliza bastante y, aunque se trate de una tecnología obsoleta, puede resultar totalmente válida para crear aplicaciones actuales desde el punto de vista de interfaces de usuario e interacción con el servidor, utilizando librerías de scripts de última hornada.
Publicado en: Variable not found.
Hey, ¡estoy en twitter!
» Leer más, comentarios, etc...
Buayacorp
Web Developer Toolbar para Chrome
Marzo 24th, 2010 - [Enlace local]
Para los webmasters, acaba de salir la versión para Google Chrome de la poderosa herramienta Web Developer de Chris Pederick.
» Leer más, comentarios, etc...
4 bits blog
Las vistas de django
Marzo 23rd, 2010 - [Enlace local]
En el anterior post sobre los modelos de django, se explicaba cómo se crean los modelos de datos que se usan con la base de datos, pero no se vio ningún modo de trabajar con ellos a parte de la consola de django.
Las vistas
Las vistas se encargan de la capa lógica de la aplicación web, esto es realizan las tareas necesarias sobre los datos recibidos y devuelven los datos necesarios para que se muestren en la web.
En el caso de django, las vistas son funciones de python que reciben un objeto HttpRequest y que devolverán un objeto HttpResponse. Estas funciones se relacionarán con diferentes direcciones de la aplicación web, gracias al archivo «urls.py».
Creando una vista
Como ya se explicó brevemente en el post de introducción a django, las vistas se definen en el archivo «views.py» de la aplicación a desarrollar.
Siguiendo con el ejemplo del modelo de un usuario, se podrían definir las siguientes vistas:
# views.py
# -*- coding: utf-8 -*-
from proyecto.aplicación.models import Usuario
from django.shortcuts import render_to_response
def mostrar (request):
"""Muestra los datos de los usuarios de la base de datos."""
usuarios = Usuario.objects.all ()
return render_to_response ('mostrar.htm',
{ 'usuarios' : usuarios })
En este ejemplo se ha definido una vista para mostrar todos los usuarios de la base de datos, para ello se puede ver que se hace uso de un «QuerySet» (explicado en el post sobre los modelos de django).
Además, se puede observar que la función de la vista recibe un parámetro request (que será un objeto HttpRequest) y devuelve un objeto HttpResponse mediante la función render_to_response, que genera una página HTML a partir de una plantilla y los datos que se le proporcionen mediante un diccionario (en este ejemplo el diccionario sólo contendrá los usuarios de la base de datos).
Asociando direcciones a las vistas
Una vez creadas las funciones de las vistas, éstas se deberán asociar con sus correspondientes direcciones dentro de la aplicación web, todo esto se realiza editando el archivo «urls.py». Este archivo contiene, básicamente, una variable llamada urlpatterns a la que se asignan una serie de tuplas de expresiones regulares que definen las direcciones y sus funciones asociadas.
Siguiendo el ejemplo, la aplicación tendría el siguiente archivo «urls.py»:
# urls.py
# -*- coding: utf-8 -*-
from django.conf.urls.defaults import *
urlpatterns = patterns('',
(r'^usuario/mostrar/$', 'proyecto.aplicación.views.mostrar'),
)
El archivo «urls.py» se crea a nivel de proyecto, pero se puede dividir en varios, de modo que se puedan definir las direcciones a nivel de aplicación para una mayor modularidad y reutilización.
Como siempre, para más información se puede consultar la documentación sobre cómo asociar direcciones a las vistas en django.
Una breve introducción a las plantillas
Django usa un lenguaje de plantillas para generar las páginas web de la aplicación, estas plantillas son archivos HTML con algunas etiquetas propias de Django, que éste procesará y sustituirá por el contenido adecuado. Las etiquetas del lenguaje de plantillas de django permiten hacer muchas cosas, como: bucles, condiciones, herencia de plantillas, internacionalización, …
Los archivos de las plantillas se pueden crear a nivel de proyecto o de aplicación. Normalmente, se suele crear una plantilla base de la que se heredará la estructura en las plantillas de las diferentes aplicaciones del proyecto, de modo que éstas tengan una mayor modularidad.
Estos archivos se pueden guardar en cualquier directorio dentro del proyecto y/o aplicación, pero por conveniencia se suelen crear directorios llamados «templates» a nivel de proyecto y aplicación, además django suele buscar en estos directorios de forma predeterminada, mientras que si se les da otro nombre, se deberán configurar las rutas de estos directorios en el archivo «settings.py».
{% if usuario %}
Lista de usuarios
{% else %}
No hay ningún usuario
{% endif %}
{% if usuarios %}
{% for usuario in usuarios %}
{{ usuario.email }}
{{ usuario.nombre }} {{ usuario.apellidos }}
{% endfor %}
{% else %}
No hay ningún usuario.
La base de datos de usuarios está vacía.
{% endif %}
En este ejemplo se puede ver que la plantilla trata la lista de usuarios que recibe de la vista y muestra cada usuario, o un mensaje de error si la lista no tuviera ningún usuario. El lenguaje de las plantillas de django intenta ser lo más parecido a Python, siempre que no tengamos en cuenta las llaves y los porcentajes necesarios para marcar las etiquetas de la plantilla.
Para más información se puede consultar la documentación sobre el lenguaje de las plantillas de django.
» Leer más, comentarios, etc...
Variable not found
Personalizar las plantillas por defecto de controladores y vistas MVC
Marzo 22nd, 2010 - [Enlace local]
Una interesante característica de ASP.NET MVC, o más concretamente del conjunto de herramientas incluidas en Visual Studio para darle soporte, es la posibilidad de personalizar las plantillas que el IDE utiliza a la hora de agregar controladores y vistas a un proyecto.
Por ejemplo, cuando añadimos un controlador a nuestro proyecto, el entorno genera por defecto un código como el mostrado a continuación:
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace MiProyecto.Controllers{public class ProductsController : Controller
{ // // GET: /Products/ public ActionResult Index() { return View();}
}
}
Pero, ¿qué ocurre si todos nuestros controladores heredan de un controlador base? ¿O si solemos incluir un código de inicialización o métodos comunes? ¿Y si disponemos de un código estandarizado para los métodos
Create(), Edit(), etc? ¿O simplemente queremos cambiar el nombre de los métodos propuestos? En todos los casos la respuesta es simple: tendríamos que retocar a mano cada uno de los controladores para adaptarlos a nuestras necesidades.
Y lo mismo ocurre, aunque de forma aún más frecuente, con las vistas. Al añadir un elemento de este tipo al proyecto es posible seleccionar la plantilla a utilizar, que determinará el contenido generado automáticamente por Visual Studio en función de si se trata de una vista parcial o completa, si será fuertemente tipada y otros aspectos.Las plantillas disponibles para las vistas aparecen en el desplegable “View Content” del cuadro de diálogo de creación, como se aprecia en la captura de pantalla adjunta.
El contenido generado en cada caso pocas veces resulta válido directamente y requiere bastantes retoques, que debemos repetir una y otra vez en todas las vistas que generemos. Incluso en bastantes ocasiones optaremos por seleccionar la plantilla en blanco (“empty” en el desplegable) para introducir nuestro propio código.
Afortunadamente, podemos personalizar muy fácilmente las plantillas a utilizar en ambos casos:
- de forma global, es decir, a nivel de entorno de desarrollo en el equipo, por lo que las modificaciones que introduzcamos estarán disponibles para todos los proyectos MVC que utilicemos.
- de forma local al proyecto, siendo utilizadas únicamente al crear elementos dentro del mismo.
Personalización a nivel de equipo
Las plantillas que utiliza Visual Studio para generar tanto los controladores como las vistas están almacenadas en la carpetaCommon7\IDE\ItemTemplates\CSharp\Web\MVC 2\CodeTemplates, dentro del directorio de instalación del IDE.Por ejemplo, en mi Visual Studio 2010 las podemos encontrar en C:\Archivos de programa\Microsoft Visual Studio 10.0\Common7\IDE\ItemTemplates\CSharp\Web\MVC 2\CodeTemplates\AddController. En VS2008 es la misma, salvo por la versión del entorno, la 9.0.
En el interior de dicho directorio hay dos carpetas, llamadas “
AddController” y “AddView” en las que encontraremos las plantillas T4 que generan el código por defecto para controladores y vistas, respectivamente.En el caso del controlador, el archivo
AddController/Controller.tt contiene la lógica de generación del código, a la que podemos acceder abriendo el archivo con un editor de texto plano, o con el propio Visual Studio, y realizar los cambios que estimemos oportunos (¡previo backup del archivo original, claro!). Aunque T4 puede llegar a ser complejo, en la plantilla de controladores el código resulta bastante fácil de leer, comprender y modificar.Para las vistas, si accedemos a la carpeta
AddView, observaremos que existe una plantilla T4 para cada una de las posibilidades de contenido disponibles en el desplegable del formulario de diálogo de creación de este tipo de elementos:
Esto ya nos sugiere dos posibilidades a la hora de personalizar los contenidos de las vistas:
- la primera, sustituir el contenido de las plantillas incluidas por defecto, como “Create”, o “Details”, de la misma forma que hemos hecho anteriormente con los controladores,
- o bien, crear nuestras propias plantillas. De hecho, cualquier archivo .tt añadido a esta carpeta hará que en el desplegable aparezca un nuevo elemento:

El código de las plantillas por defecto para las vistas es más complejo que el de los controladores, pero aun sin conocimientos de T4 pueden ser adaptados con relativa facilidad.
Personalización a nivel de proyecto
Una vez comprendido lo anterior, la personalización a nivel exclusivamente de proyecto es trivial, gracias a un interesante detalle: Visual Studio, a la hora de generar el código de controladores y vistas acude en primer lugar la carpeta ~/CodeTemplates del proyecto, y busca unas subcarpetas llamadas AddController y AddView, desde donde según el caso, tomará las plantillas.En el caso de la creación de controladores, si existe ~
/CodeTemplates/AddController/Controller.tt, se utilizará como plantilla en lugar de la definida a nivel de equipo.Para las vistas, Visual Studio poblará el desplegable de plantillas de contenido a partir de los archivos .tt disponibles en la carpeta
~/CodeTemplates/AddView, sumados a los existentes en la carpeta de la aplicación. En caso de coincidencia de nombre (por ejemplo, si creamos aquí una nueva plantilla “Create.tt”) se tomará siempre la plantilla definida en el proyecto.
Eso sí, para que el compilador no genere errores al ejecutar las plantillas a deshora, es necesario retocar sus propiedades, eliminando la herramienta personalizada y dejando esta propiedad en blanco.Publicado en: Variable not found.
Hey, ¡estoy en Twitter!
» Leer más, comentarios, etc...
Joan Garnet :: Arquitectura y desarrollo RIA
Poliglot AIR2: charla en Talleres de verano Subflash
Marzo 22nd, 2010 - [Enlace local]
Un año más me preparo para la aventura veraniega gentileza de Subflash, y este año nos vamos a Bilbao!
Durante el viernes 27, sábado 28 y domingo 29 de Agosto de 2010 un nada despreciable grupo de personajes singulares se recorrerá la península desde casi todos sus ángulos, fuertemente armados con portátiles, ideas e ilusión, todo para poder disfrutar de la oportunidad de compartir inquietudes y conocer a un montón de personalidades afines.
Haciendo un poco de retrospectiva me doy cuenta que desde su primera edición en 2003 he tenido la oportunidad de ofrecer unas cuantas charlas por las distintas iteraciones del festival:
- 2003 – Teruel – Taller Desarrollo Open Source
- 2004 – Madrid – Taller Arquitectura componentes Flash
- 2006 – Oviedo – Flex 2 será gratis pero vale mucho
- 2008 – Alicante – Del 2 al 3 en 45 (guía de migración de AS2 a AS3)
Se puede decir que estoy comprometido con este evento.. y es que le tengo un aprecio MUY especial ya que a esta comunidad le debo un montón de buenos ratos, un montón de conocimientos y también un montón de amigos, entre ellos a destacar al actual señor Subflash, el gran Marcos Gonzalez.
Pero qué tierno me pongo cada vez que hablo de Subflash! :)
Subflash 2010
Pues aquí no acaba todo… este año voy a volver a dar la brasa con una charla:
- 2010 – Bilbao – AIR2 Poliglot

Y para evitar hacerme pesado voy a darla a dúo ni más ni menos que con Andrés Cayón, AUG Manager del DreamWeaver User Group España.
¿Y porqué un HTMLelero JavaScriptero DreamWeaverero como Andrés se junta con un flashero, flexero como yo para dar una charla?
La respuesta: AIR2
Este año Andrés y un servidor vamos a poner sobre la mesa la tecnología AIR y vamos a ver hasta qué punto los conocimientos, técnicas y APIs disponibles son reaprovechables para Flex y JavaScript. Es decir, mientras mostramos todas las novedades disponibles en AIR2 iremos viendo cómo se comparan las APIs en los dos lenguajes y si tiene sentido o no utilizar ciertas fucionalidades en un lado u otro.
Además habrá otras charlas interesantes de la mano de Marc Palau, Dani Llops, Luís Adrián Rosas Wiedfeldt y alguno más que queda por cerrar.
|
|
|
|
Os esperamos!
Aviso, a día de hoy quedan 36 plazas libres de las 60 que hay disponibles y estamos en Marzo! corre y haz la reserva que vuelan!
» Leer más, comentarios, etc...
Joan Llenas at garnet.io :: Thoughts on software development
Poliglot AIR2: charla en Talleres de verano Subflash
Marzo 22nd, 2010 - [Enlace local]
Un año más me preparo para la aventura veraniega gentileza de Subflash, y este año nos vamos a Bilbao!
Durante el viernes 27, sábado 28 y domingo 29 de Agosto de 2010 un nada despreciable grupo de personajes singulares se recorrerá la península desde casi todos sus ángulos, fuertemente armados con portátiles, ideas e ilusión, todo para poder disfrutar de la oportunidad de compartir inquietudes y conocer a un montón de personalidades afines.
Haciendo un poco de retrospectiva me doy cuenta que desde su primera edición en 2003 he tenido la oportunidad de ofrecer unas cuantas charlas por las distintas iteraciones del festival:
- 2003 - Teruel - Taller Desarrollo Open Source
- 2004 - Madrid - Taller Arquitectura componentes Flash
- 2006 - Oviedo - Flex 2 será gratis pero vale mucho
- 2008 - Alicante - Del 2 al 3 en 45 (guía de migración de AS2 a AS3)
Se puede decir que estoy comprometido con este evento.. y es que le tengo un aprecio MUY especial ya que a esta comunidad le debo un montón de buenos ratos, un montón de conocimientos y también un montón de amigos, entre ellos a destacar al actual señor Subflash, el gran Marcos Gonzalez.
Pero qué tierno me pongo cada vez que hablo de Subflash! :)
Subflash 2010
Pues aquí no acaba todo... este año voy a volver a dar la brasa con una charla:
- 2010 - Bilbao - Poliglot AIR2

Y para evitar hacerme pesado voy a darla a dúo ni más ni menos que con Andrés Cayón, AUG Manager del DreamWeaver User Group España.
¿Y porqué un HTMLelero JavaScriptero DreamWeaverero como Andrés se junta con un flashero, flexero como yo para dar una charla?
La respuesta: AIR2
Este año Andrés y un servidor vamos a poner sobre la mesa la tecnología AIR y vamos a ver hasta qué punto los conocimientos, técnicas y APIs disponibles son reaprovechables para Flex y JavaScript. Es decir, mientras mostramos todas las novedades disponibles en AIR2 iremos viendo cómo se comparan las APIs en los dos lenguajes y si tiene sentido o no utilizar ciertas fucionalidades en un lado u otro.
Además habrá otras charlas interesantes de la mano de Marc Palau, Dani Llops, Luís Adrián Rosas Wiedfeldt y alguno más que queda por cerrar.
|
|
|
|
Os esperamos!
Aviso, a día de hoy quedan 36 plazas libres 28 plazas libres de las 60 que hay disponibles y estamos en Marzo! corre y haz la reserva que vuelan!
» Leer más, comentarios, etc...
MadeInFlex
Releases de Flex 4 y Flash Builder 4
Marzo 22nd, 2010 - [Enlace local]
Por fin han salido las versiones oficiales de Flex 4 y de Flash Builder 4.
Podeis ver ejemplos en flex.org y en la aplicación air Tour de Flex, en el apartado de muestras de flex 4.
Estos productos puedes descargarlos de este link.
» Leer más, comentarios, etc...
Picando Código
Actividad en Twitter esta semana
Marzo 19th, 2010 - [Enlace local]
- Me fuí, buen finde #
- ? @YaderV: Wiki de Mario http://2tu.us/1u1l definitivamente fuera de serie. #Mario #Nintendo « Excelente! #
- cat /etc/group | grep svn #
- SVN arreglado
# - Algo anda mal con el servidor SVN… no se puede commitear.. #
- ¿Cuál es una buena respuesta (con mala onda) cuando alguien dice: "¡¡Pah te cortaste el pelo!!" ? Ya tengo una: No, me crece para adentro! #
- Me corté el pelo… #
- Tengo algunos followers nuevos. Que se presenten! #
- ? @withoutmap: picandocodigo ? @pacopistolas: odio tener que compartir el ascensor « yo también ¬¬ « YO MÁS! « No, yo más! #
- ? @pacopistolas: odio tener que compartir el ascensor « yo también ¬¬ #
- Back from the #Scrum Daily Standup Meeting
# - Muy zarpadas me quedaron las moñitas que cociné anoche #
- De a poco voy agarrando el ritmo con Flex y Programación Orientada a Eventos #
- Pegué terrible wallpaper: http://2tu.us/1trd #
- Ya son 6 los bash scripts de uso diario que voy almacenando, mas algunos AWK y SQL archivados por ahí. Scripting FTW! #
- Qué divertido cuando haces un update del proyecto en SVN y todo lo que hiciste ayer dejó de andar… #
- 11:53:48,914 INFO [ServerImpl] Starting JBoss (Microcontainer)… (Empieza la jornada
) # - Me voy, creo que hoy ha sido el día más productivo del mes. Java EE + Flex a full
# - Con paciencia y con saliva… estoy programando en #Flex
# - 16:06:26,447 INFO [ServerImpl] Starting JBoss (Microcontainer)… #
- Pasamos de Eclipse + Java EE a Eclipse + FlexBuilder: modoPaciencia.start() #
- A veces parece que es pedir mucho poder programar en paz… #
- ? @programator: RT @raeioul: amigo publicista/diseñador, no diga que esta desempleado, diga "soy freelance" #
- Descargada la documentación de #PostgreSQL : http://2tu.us/1tcd #
- Manifestación Pacífica contra el Circo Kroner y todos los Circos que usan Animales – Montevideo, Uruguay » http://2tu.us/1tc9 #
- WTF!?!?! apt-get install openoffice.org » Need to get 174MB of archives. After this operation, 404MB of additional disk space will be used #
- Nota mental: Cuando entres a la oficina fijate en el task board qué comprometiste a hacer hoy, no confíes en tu memoria. #Scrum FTW #
- Escribiendo scripts SQL
# - Domo Arigato, Mr. Roboto ? #
- ? @tobiasmayer: recommended: The ScrumMaster's Diary: Weegie Board Estimation http://bit.ly/c7A8wB #
» Leer más, comentarios, etc...
Picando Código
Actividad en Twitter esta semana
Marzo 19th, 2010 - [Enlace local]
- Me fuí, buen finde #
- ? @YaderV: Wiki de Mario http://2tu.us/1u1l definitivamente fuera de serie. #Mario #Nintendo « Excelente! #
- cat /etc/group | grep svn #
- SVN arreglado
# - Algo anda mal con el servidor SVN… no se puede commitear.. #
- ¿Cuál es una buena respuesta (con mala onda) cuando alguien dice: "¡¡Pah te cortaste el pelo!!" ? Ya tengo una: No, me crece para adentro! #
- Me corté el pelo… #
- Tengo algunos followers nuevos. Que se presenten! #
- ? @withoutmap: picandocodigo ? @pacopistolas: odio tener que compartir el ascensor « yo también ¬¬ « YO MÁS! « No, yo más! #
- ? @pacopistolas: odio tener que compartir el ascensor « yo también ¬¬ #
- Back from the #Scrum Daily Standup Meeting
# - Muy zarpadas me quedaron las moñitas que cociné anoche #
- De a poco voy agarrando el ritmo con Flex y Programación Orientada a Eventos #
- Pegué terrible wallpaper: http://2tu.us/1trd #
- Ya son 6 los bash scripts de uso diario que voy almacenando, mas algunos AWK y SQL archivados por ahí. Scripting FTW! #
- Qué divertido cuando haces un update del proyecto en SVN y todo lo que hiciste ayer dejó de andar… #
- 11:53:48,914 INFO [ServerImpl] Starting JBoss (Microcontainer)… (Empieza la jornada
) # - Me voy, creo que hoy ha sido el día más productivo del mes. Java EE + Flex a full
# - Con paciencia y con saliva… estoy programando en #Flex
# - 16:06:26,447 INFO [ServerImpl] Starting JBoss (Microcontainer)… #
- Pasamos de Eclipse + Java EE a Eclipse + FlexBuilder: modoPaciencia.start() #
- A veces parece que es pedir mucho poder programar en paz… #
- ? @programator: RT @raeioul: amigo publicista/diseñador, no diga que esta desempleado, diga "soy freelance" #
- Descargada la documentación de #PostgreSQL : http://2tu.us/1tcd #
- Manifestación Pacífica contra el Circo Kroner y todos los Circos que usan Animales – Montevideo, Uruguay » http://2tu.us/1tc9 #
- WTF!?!?! apt-get install openoffice.org » Need to get 174MB of archives. After this operation, 404MB of additional disk space will be used #
- Nota mental: Cuando entres a la oficina fijate en el task board qué comprometiste a hacer hoy, no confíes en tu memoria. #Scrum FTW #
- Escribiendo scripts SQL
# - Domo Arigato, Mr. Roboto ? #
- ? @tobiasmayer: recommended: The ScrumMaster's Diary: Weegie Board Estimation http://bit.ly/c7A8wB #
» Leer más, comentarios, etc...
Fetishcode...Thinking in objects
Formación en ADF
Marzo 19th, 2010 - [Enlace local]
A
» Leer más, comentarios, etc...
programania
Scrum en Biko2 por Angel Medinilla
Marzo 19th, 2010 - [Enlace local]
Está bien, por una vez, ver videos sobre SCRUM y la gestión ágil de proyectos bien explicados, divertidos… y en castellano. En Biko2 han hecho unas jornadas sobre SCRUM y nos ha dejado en su canal de Youtube, algunas partes de las charlas de Ángel Medinilla.
El Horno de las madalenas
¡pos se tiene que poder!
» Leer más, comentarios, etc...
Bitácora de Javier Gutiérrez Chamorro (Guti)
Técnicas víricas: Introducción
Marzo 18th, 2010 - [Enlace local]
Desde hace bastante tiempo que me planteaba explicar con palabras inteligibles y códigos de ejemplo, las técnicas más utilizadas por virus y malware.
Hablando con un amigo, surgió el reto de desarrollarlo en VBScript, un lenguaje sencillo, fácil de entender, y dónde además había cierta complicación técnica al aplicar los conocimientos, pero que al mismo tiempo evitaba tener que lidiar con juegos de instrucciones y formatos de ejecutables.
Me pareció prudente atacarlo también en VBS, pues hay mucho desalmado inconsciente que le entusiasma el copiar y pegar, de manera que los ejemplos que veamos en esta serie de artículos, serán funcionales unitariamente, aunque no conjuntamente como malware.
Vamos a hablar de polimorfismo y los motores de mutación; ocultación o técnicas stealth; y también de propagación. Todo ello, con ejemplos prácticos que demuestren cada uno de los conceptos.
No os perdáis la siguiente entrega de Técnicas víricas: Polimorfismo.
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering
Ten Step y Líder de Proyecto
Marzo 18th, 2010 - [Enlace local]
Sin duda alguna 2 fuentes importantes de artículos de Project Management Son Ten Step y Líder de Proyecto, recientemente publican:
Ten Step, Los multiples roles del líder de proyecto donde se sugiere lo siguiente:
· A full-time role on a large project.
· Project management responsibilities for multiple projects, each of which is less than full time, but the combination of which adds up to a full-time role.
· Multiple roles on the same project, each of which requires a certain level of skill and responsibility. On one project, for instance, he may be both a project manager and an analyst.
Líder de Proyecto, Green Project Management, muy bueno quien pensaría que lo Green abarca la Administración de proyectos, pero analizandolo esta en el día a día por el ejemplo el hacer reuniones virtuales evita que los miembros se tengan que trasladar a un lugar y contaminar el ambiente otro ejemplo es la revisión de documentos electrónicamente, o bien revisarlo en una máquina sin prender las demas para el ahorro de energía
» Leer más, comentarios, etc...
Variable not found
Una forma mejor de auto-ejecutar T4MVC
Marzo 16th, 2010 - [Enlace local]
Como ya he comentado extensamente por aquí, T4MVC es una herramienta imprescindible a la hora de evitar “cadenas mágicas” cuando desarrollamos sistemas con el framework MVC.
A pesar de sus innumerables virtudes, desde sus comienzos este proyecto arrastra una molesta y pesada carga, asociada a la forma en que Visual Studio utiliza las T4: en principio sólo se ejecutan, y generan código por lo tanto, cuando el archivo de la plantilla es modificado.
David Ebbo, el creado de T4MVC, aportó una solución transitoria al problema incluyendo en la propia plantilla el código para engañar al IDE, haciéndole creer que el archivo .tt estaba siendo modificado continuamente, y forzando así el proceso de generación de código. Aunque válida, resultaba un poco molesto tener el archivo siempre abierto para que este proceso funcionara.
Hace unos días, David comenta en su post “A better way to auto-run T4MVC when you build” la solución propuesta por Joachim Lykke Andersen y que describe en su entrada “How to run T4MVC on build”, consistente en la creación de una macro de Visual Studio capaz de tomar el control antes del inicio de la compilación, e invocar la herramienta personalizada de generación de código.
Y de hecho, tanto ha convencido esta nueva solución a David, el padre de la criatura, que está considerando seriamente la eliminación de la solución de mantener el archivo continuamente modificado en favor de ésta, mucho más limpia.
El procedimiento es el siguiente. En primer lugar, accedemos al entorno de desarrollo de macros, pulsando ALT y F11, y seleccionamos a continuación MyMacros > EnvironmentEvents.
Aparecerá un módulo VB sobre cuyo cuerpo pegamos la siguiente porción de código que, como se puede observar simplemente introduce una lógica al iniciar la compilación mediante la cual se localiza el archivo de plantilla “T4MVC.tt” y se invoca a su herramienta personalizada, en este caso, el generador de código T4:
Public Sub OnBuildBegin(ByVal Scope As EnvDTE.vsBuildScope, _
ByVal Action As EnvDTE.vsBuildAction) _
Handles BuildEvents.OnBuildBegin If Scope = vsBuildScope.vsBuildScopeSolution _Or Scope = vsBuildScope.vsBuildScopeProject Then
Dim projectItem As VSProjectItem _
= DTE.Solution.FindProjectItem("T4MVC.tt").Object
If Not projectItem Is Nothing Then
projectItem.RunCustomTool()
End If
End If
End SubSi aparece un error indicando que no existe la clase
VSProjectItem, basta con incluir la referencia apropiada, utilizando la solución ofrecida por el propio entorno:
» Leer más, comentarios, etc...
MadeInFlex
Fx4 IX. Ciclo de vida de un componente spark
Marzo 15th, 2010 - [Enlace local]
Al desarrollar aplicaciones, y en nuestro caso, con tecnología Flex/AS3, debemos conocer el ciclo de vida de los componentes del framework para así entender la interacción y como sacarles el máximo provecho. Conocer bien el ciclo de vida de los componentes nos servirá para evitar errores al trabajar con ellos.
En este artículo veremos como funciona el ciclo de vida en los spark components. Estos componentes siguen un ciclo de vida parecido a los Halo components, pero con algunas diferencias. Antes de ver estas diferencias, creo necesario hacer un repaso al ciclo de vida de los Halo components.
¿Porqué necesitamos que los componentes tengan un ciclo de vida?
El Flash player funciona con una secuencia de frames. Cada frame tiene la siguiente forma:

En nuestra aplicación hay mucho código que no necesita renderización, como cálculos, iteraciones por colecciones, etc.
En cambio hay código que requiere la actualización del componente, pongamos un ejemplo:
Si cambiamos el width de un container, queremos que este se actualize y de paso que actualize el tamaño de sus hijos. El ciclo de vida hará que estos cambios se apliquen, debido al flujo de etapas que él mismo define.
El ciclo de vida de los Halo components
Los Halo components tienen un ciclo de vida compuesto de tres etapas:
Etapa de creación
Consta de cuatro fases que se ejecutan en el orden en que se explican a continuación:
- Fase de construcción: Fase en la que creamos el objeto llamando a su constructor.
- Fase de configuración: Durante esta etapa, los valores asignados a las propiedades del componente, se guardan internamente para referenciarlos posteriormente.
- Fase de inclusión (attachment): Se activa cuando el componente es añadido a la display list mediante addChild() o addChildAt() o mxml. Define el componente padre, ya que estamos añadiendo un componente a la display list.
- Fase de inialización:Lanza preinitialize event. Luego ejecuta createChildren() para crear sus hijos y finalmente lanza initialize event.
Etapa de la vida del componente
A partir de los cambios que recibe el componente, éste pasa por diferentes fases:

Proceso de invalidación
Los cambios hechos en las propiedades, estilos y subcomponentes son marcados para que sean actualizados.
Hay tres métodos para la invalidación:
- invalidatePorperties(): marca las propiedades del componente que han cambiado.
- invalidatesSize(): marca los componentes que necesitan ser redimensionados de acuerdo con un valor cambiado.
- invalidateDisplayList(): marca el componente cuando éste recibe algún cambio visual.
Proceso de validación
Es la respuesta al proceso de invalidation. Renderiza los cambios marcados en la etapa de invalidation.
Métodos para la validación:
- commitProperties(): para actualizar los cambios en las propiedades. Es la respuesta al método invalidateProperties(). La primera instrucción debe ser super.commitProperties().
- measure(): para actualizar las dimensiones del componente. La primera instrucción debe ser super.measure().
- updateDisplayList(): es el punto final en el proceso de validación. Se ejecuta como resultado a la petición de invalidateDisplayList(). Hace el layout del contenido del componente y realiza cualquier actualización en la renderización.
La validación ejecutará la etapa de actualización del componente de manera que los cambios que se han producido, sean renderizados.
La relación entre los métodos de cada una de las etapas es la siguiente:

Etapa de destrucción del componente
Ocurre cuando el componente se elimina de la displaylist. Luego se llama al garbage collector para eliminar los elementos no referenciados.
¿Qué ha cambiado en Flex 4?
La verdad es que, en cuanto a ciclo de vida, no ha cambiado mucho. Spark se ha construido encima de Halo.
La mayor diferencia es que Spark separa la skin del propio componente, pero existe un contrato entre ambos, un contrato que obliga al componente a definir los datos, partes y estados que tendrá su skin. como muestra tenemos a SkinnableComponent, que extiende de UIComponent, por lo tanto tiene el mismo ciclo de vida, pero tiene una skin que sigue su propio ciclo de vida.
Ciclo de vida de la skin
Una skin puede tener partes estáticas y partes dinámicas. Cuando se ejecuta el createChildren() de un SkinnableComponent, este invoca a validateSkinState(), que a la vez invoca a attachSkin(). La función attachSkin() crea la skin con las partes declaradas y la añade como un hijo del componente.
Cuando muere el componente, se van quitando las partes de la skin y finalmente se destruye la skin. Así se da fin al ciclo de vida de la skin.
Conclusión
Se ha dado un paso a vista de pájaro de lo que es el ciclo de vida en los spark components. Respecto al ciclo de vida de un SkinnableComponent, para entenderlo con claridad es mejor ver y codificar ejemplos. A continuación os dejo unos links que espero que os sirvan.
http://www.developmentarc.com/site/wp-content/uploads/pdfs/understanding_the_flex_3_lifecycle_v1.0.pdf
http://www.flex888.com/1219/flex-4-components-life-cycle.html
http://www.artima.com/articles/flex_spark.html
http://opensource.adobe.com/wiki/display/flexsdk/Gumbo+Skinning
http://www.adobe.com/devnet/flex/articles/flex4_skinning.html
http://miti.pricope.com/2009/08/16/skinning-a-list-in-flex-4-magnifier-effect/
» Leer más, comentarios, etc...
Variable not found
Y después de ASP.NET MVC 2… ¿qué?
Marzo 14th, 2010 - [Enlace local]
Estando todavía calentito el horno del que acaba de salir ASP.NET MVC 2, es curioso conocer algo sobre el próximo plato que están preparando Haack y su equipo: ¡ASP.NET MVC 3!
Ya se han publicado algunas de las líneas y objetivos que guiarán los futuros desarrollos y determinados detalles que probablemente serán incluidos, aunque obviamente todavía pueden variar sustancialmente. Las principales áreas de atención son en estos momentos:
- aumentar la productividad de los desarrolladores,
- facilitar aún más el uso de Ajax,
- incluir mejoras arquitecturales,
- y aumentar el rendimiento.
Asimismo, se dará soporte a nuevos atributos de validación además de los ya incluidos en las anotaciones de datos de ASP.NET 4.
Otra línea en estudio es la introducción de herramientas basadas en línea de comandos, alternativas a las incluidas en Visual Studio.
Para facilitar el uso de Ajax se introducirán nuevos helpers que simplifiquen la implementación de escenarios habituales, como los controles de selección de fecha o cuadros de edición con auto-completado.
También se considera interesante ampliar los helpers existentes para permitir la actualización parcial de varias zonas de la página, e incluir soporte para plantillas en cliente, que permitan añadir el marcado muy rápidamente a datos retornados en formato JSON desde el controlador.
Desde el punto de vista arquitectural, se planea seguir flexibilizando el framework, permitiendo nuevos puntos de inyección de dependencias, como la instanciación de clases del Modelo desde el binder, o en filtros de acción.

Se prevé también la creación de una factoría de controladores para MEF (Managed Extensibility Framework) que permitan ampliar las funcionalidades de un sistema mediante sus sencillos mecanismos de extensibilidad, sin necesidad de recompilar.
Se incrementarán también las herramientas de generación de andamiaje de aplicaciones, para acelerar la implementación de escenarios comunes, como los habituales CRUD.
Y respecto al rendimiento, el equipo está estudiando nuevas técnicas para mejorar el cacheo de respuestas, y soluciones como aumentar el control sobre el estado de sesión, permitiendo activarlo o desactivarlo para mejorar la eficiencia.
En cualquier caso, lo que sí ha dejado claro Phil es que ASP.NET MVC 2 será la última versión del framework con soporte para ASP.NET 3.5 SP1.
Fuente: Roadmap de ASP.NET MVC.
Publicado en: Variable not found.
Hey, ¡estoy en twitter!
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering
Estimator Tool en Sure Step 2010
Marzo 14th, 2010 - [Enlace local]
Como varios sabran en el mundo de la Ingeniería de Software existen varios métodos para estimar, tal ves el mas conocido es Function Points normado por el IFPUG y otro que tiene su fama es Use Case Points (checar este buen artículo de Methods and tools ) pero en el mundo de las aplicaciones empresariales no existía uno hasta ahora que en Sure Step 2010 se integra el Estimator Tool a la cual mis respetos!!! se ve que Microsoft le esta invirtiendo mucho al aspecto metodológico y no solo al técnico. Estimator Tool se define a través del siguiente cuadro:
Como se puede apreciar existe una muy robusta área de datos de entrada a través de la cual se genera toda la información de salida como es hrs por etapa e incluso por actividad en base a un WBS (Work Breakdown Structure) y por si esto fuera poco los parámetros base para el cálculo pueden ser ajustados en base a la experiencia del equipo de implementación, en fin una excelente herramienta!!!, en siguientes entradas entraremos mas a detalle.





