Picando Código
100.000 descargas de List Category Posts
Enero 31st, 2011 - [Enlace local]
List Category Posts es uno de los plugins que he desarrollado para WordPress.
Con su última actualización (versión 0.15.1) el plugin alcanzó las 100.000 descargas. Aprovecho el “hito” para repasar un poco la historia del plugin y analizar cómo ha evolucionado en este tiempo.
Su desarrollo surgió como una necesidad para la página de Programación en el blog. Quería ordenar algunos contenidos de una manera determinada, pero no encontré plugins de WordPress que me permitieran hacer exactamente lo que necesitaba, así que lo desarrollé.
En un principio era bastante básico, simplemente mostraba los posts de una categoría que recibía por Id. Con el paso del tiempo el plugin se hizo más popular de lo que esperaba (de hecho no esperaba que hubiera mucho más gente que lo encontrara útil). Y ahí empezaron a surgir las ventajas de contar con un desarrollo de código libre. Empezaron a llegar correcciones y características nuevas, algunas en forma de código, y otras con quejas, críticas, pedidos y más, y el plugin cobró vida propia y evolucionó para donde lo llevaban
Estoy muy contento de tener este pequeño proyectito que se ha ido transformando en algo bastante importante para mí. Mantenerlo es como una responsabilidad. Por un lado hacia los usuarios y desarrolladores que lo han usado, han aportado ideas/código y lo han encontrado bueno (algunos hasta consideraron que valía dinero y decidieron donar por PayPal). Por otro, es una responsabilidad hacia mi mismo de mantener un proyecto de software vivo. Si bien es bastante chico, y no tiene muchas líneas de código ni complejidad, desde 2008 he venido agregando de a poquito algunas cosas y mejorándolo en algunos ratos libres. Además me mantiene tocando código PHP cada tanto.
El futuro de List Category Posts
Si dependiera de mi, el plugin ya alcanzó y superó mis espectativas iniciales. Por lo tanto, no habrían más mejoras o correcciones que hacerle, a menos que se me presentara la necesidad nuevamente.
Pero ahora siento la presión de que ya no es más “mi plugin”, sino que pertenece a los usuarios que lo usan. Así que pienso seguir trabajando para alcanzar una versión 1.0. En base a los pedidos de los usuarios, me definí tres características para un lanzamiento 1.0:
- Internacionalización: De manera que las opciones puedan ser traducidas en el widget. Esto es bastante sencillo según tengo entendido, simplemente no he tenido la “voluntad” de mirarlo e implementarlo.
- Paginación: Muchos usuarios han pedido que se puedan mostrar cierta cantidad de posts de una categoría con una paginación. Otra característica que no he comenzado de vago. Tengo pensado implementar una solución que use Ajax pero que también funcione sin JavaScript en caso de que el navegador no lo soporte o no lo tenga habilitado.
- Simplificar el sistema de plantillas: El plugin permite aplicar distintos estilos a la lista que muestra. Pero el sistema de plantillas de diseño es algo complejo para el usuario común. Digamos que se necesita al menos conocimiento en HTML y CSS, y un poco de PHP también ayuda. Además, pienso agregar un botón (o similar) para que el usuario pueda armar su lista de posts eligiendo a mano la categoría, autor, y demás filtros que necesite, y esto genere automáticamente el código.
Nunca se me hubiera ocurrido el uso de plantillas en primer lugar para mi uso personal. Pero parece que sería una funcionalidad muy interesante para los usuarios. Además las ideas que tengo respecto a esto, me obligarían a aprender algunas cosas nuevas de jQuery y la API de WordPress. Supongo que tarde o temprano lo implementaré, pero por ahora esto sigue siendo un proyecto relegado a algunos momentos libres – o de inspiración – y nada más.
Incluso tengo pensados dos o tres plugins más para WordPress. Pero por el momento quedan solo en ideas, ya veré si tengo tiempo algún día de concretar todas mis ideas a código…
Comparte:
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering / Project Management / Business Process Management
Encuesta de Salarios
Enero 31st, 2011 - [Enlace local]
Desde Software Guru se presenta los resultados de la encuesta de salarios 2010, aquí la página
» Leer más, comentarios, etc...
Variable not found
Enlaces interesantes 28
Enero 31st, 2011 - [Enlace local]
Estos son los enlaces publicados en Variable not found en Facebook y Twitter desde el domingo, 23 de enero de 2011 hasta el domingo, 30 de enero de 2011.
Espero que te resulten interesantes. :-)
- DotNetCurry: ASP.NET MVC 3 Razor Syntax - RenderBody, RenderPage and RenderSection ASP.NET MVC
Fecha: 26/01/2011 - Steven Moseley: "ASP.NET MVC 3: Integrating the jQuery UI date picker and adding a jQuery validate date range validator" ASP.NET MVC
Fecha: 26/01/2011 - Eduard Tomàs: [BlogPost] Más sobre Razor templates... Ahora un helper Repeater reutilizable ;-)
Fecha: 26/01/2011 - Eduard Tomàs: [BlogPost] Razor templates en ASP.NET MVC 3. Simple, pero una pasada!
Fecha: 25/01/2011 - Comparación detallada de SQL Server Compact 4 y SQL Server Express 2008 R2.
Fecha: 25/01/2011 - Debugging, Tracing and Instrumentation in .NET and ASP.NET (14 FAQ).
Fecha: 25/01/2011 - Dependency Injection with ASP.NET MVC 3 distilled and simplified.
Fecha: 25/01/2011 - P is for Programming: “Client-Side Validation in MVC 3" by Jaco Pretorius
Fecha: 24/01/2011 - 10 plugins jQuery para mostrar imágenes. Algunos son espectaculares.
Fecha: 24/01/2011 - Cómo usar StructureMap con ASP.NET MVC 3.
Fecha: 24/01/2011 - How to Add Mobile Pages to Your Webforms / ASP.NET MVC application.
Fecha: 24/01/2011 - Gisela Torres: Creación de un vhd para arrancarlo en modo nativo #Windows #win2k8 #vhd #virtualization
Fecha: 24/01/2011 - Disponible la localización de ASP.NET MVC 3 para nueve idiomas.
Fecha: 24/01/2011
Publicado en: Variable not found
» Leer más, comentarios, etc...
Bitácora de Javier Gutiérrez Chamorro (Guti)
Cierre de los cines Lauren Sant Andreu
Enero 29th, 2011 - [Enlace local]
El pasado sábado conocí una desagradable noticia, los cines Lauren Sant Andreu han cerrado después de una relativamente larga agonía. Recuerdo como fue su construcción, y recuerdo ir a ver en su apertura, el estreno de la película La máquina del tiempo hoy hace 9 años. Recuerdo también con gran parte de mis actividades sociales, [...]Artículos relacionados:
» Leer más, comentarios, etc...
Joan Llenas at garnet.io :: Thoughts on software development
Nuevo dominio!
Enero 28th, 2011 - [Enlace local]

Bienvenidos al nuevo joangarnet.com joan.garnet.io :)
Después de darle mil vueltas al tema de mi nombre de dominio vs mi nombre real creo que por fin he encontrado una solución que permite que ambos coexistan en total harmonía.
Mi objetivo principal con este cambio es presentarme como quién soy: Joan Llenas pero sin dejar de estar unido al nombre que llevo tantos años cultivando: Joan Garnet.
Pensando en mi condición profesional de autónomo crónico estuve pensando que sería una buena idea crear una marca con Garnet como nombre, de este modo he podido crear el subdominio que hereda todo lo construído en joangarnet.com.
Un rebranding en toda regla!
Por fin creo que podré olvidarme de los conflictos esquizofrénicos Joan Llenas vs Joan Garnet :)
El sitio esta migrado al 100% y en principio todo debería funcionar pero si alguien se encuentra con páginas no encontradas o con contenidos que no existen por favor que me lo haga saber a través de un comentario en este mismo post.
Y no olvidés de resindicar los RSS!
Gracias!
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering / Project Management / Business Process Management
Product Backlog
Enero 27th, 2011 - [Enlace local]
Muy buenos consejos para que la pila del producto o Product Backlog se mantenga en un estado optimo, creo que resalta la priorización de los requerimientos.
» Leer más, comentarios, etc...
xailer.info (esp)
Soporte de VCS en la próxima versión de Xailer
Enero 27th, 2011 - [Enlace local]
Estimado usuario de Xailer,
Queremos presentaros una pequeña avanzadilla de lo que llevará entre otras cosas la futura de versión de Xailer, que con el tiempo también incorporaremos a xEdit: El control de versiones, normalmente conocido por las siglas VCS. Actualmente ya está terminado el soporte de CVS y es muy posible que para la publicación de la nueva versión de Xailer también tengamos soporte de Subversion.
Os dejo a continuación unas imagenes de la nueva funcionalidad que espero os guste.
Saludos,
[El equipo de Xailer]
» Leer más, comentarios, etc...
Blog de SQUaC
AccUsa v0.3
Enero 27th, 2011 - [Enlace local]
We have published AccUsa version 0.3; it's available in "Descargas" (downloads section):
This version of our Support Tool for Accessibility and Usability Engineering fixes some bugs and has better support for Microsoft Access 2003. Besides that, it includes some new features, mainly for accessibility evaluations:
- New accessibility guidelines: UNE; W3C mobile best practices; ATAG; UAAG; PDF guidelines; Flash guidelines: Video games guidelines.
- New accessibility tools: MobileOK; Unicorn; AChecker; AccessColor; W3C Link Checker; WebANywhere; INTAV.
- Now it's possible to launch online tools from AccUsa, selecting one... [sigue ...]
» Leer más, comentarios, etc...
Joan Garnet :: Arquitectura y desarrollo RIA
Seguridad para el resto de nosotros (en el Flash Player)
Enero 26th, 2011 - [Enlace local]
La seguridad en el Flash Player es uno de los puntos más borrosos dentro del desarrollo con La Plataforma Flash.
Cuando se obvian conceptos de seguridad (en la capa Flash) durante las decisiones arquitecturales lo que sucede es que en el momento de desarrollar se tiende a buscar soluciones rápidas cuando surgen problemas, sin previa meditación, entonces es cuando los agujeros de seguridad de abren, las empresas pierden dinero e incluso la tecnología se juzga mal por ello.

Esto pretende ser una recopilación comprimida de lo que un desarrollador debe saber acerca del modelo de seguridad dentro del Flash Player.
Security Sandboxing
El Sandboxing es el concepto sobre el que se construye la seguridad en el Flash Player.
En general cuando hablamos de un Security Sandbox estamos hablando de un dominio web, es decir existen tantos Security Sandboxes como dominios (y subdominios) hay en la web. Es por esto que también se les llama Security Domains.
Dentro del Flash Player podemos separar la seguridad en dos subconjuntos:
- Cross site scripting
- Cross site resource loading
Esta separación se debe a que las reglas de seguridad fundamentales para ejecución de código entre dominios (cross site scripting) son distintas a las de acceso a recursos externos entre dominios (cross site resource loading).
Cross site scritpting
Se conoce como cross site scripting el poder ejecutar código de un dominio desde otro.
Por ejemplo: miweb.com/app1.swf carga otraweb.com/app2.swf y app1.swf puede ejecutar métodos, acceder a propiedades y enviar eventos a app2.swf.
Lo primero que hay que tener claro es que el cross site scripting solo maneja la relación entre archivos swf en lo que a ejecución de código se refiere.
Igualmente importante es saber que el cross site scripting por defecto no es posible ya que es una brecha de seguridad por definición, no obstante existen casos en los que es interesante tener control sobre este aspecto y es por ello que el Flash Player expone APIs que permiten habilitarlo de forma explicita.
Dentro del ámbito del cross site scripting, un Sandbox de seguridad es una caja fuerte donde, de forma segura, podemos ejecutar aplicaciones o exponer librerías para el consumo de las aplicaciones que estén dentro del mismo Sandbox (dominio web).
Diferentes Sandboxes no pueden accederse entre si de forma predeterminada, y si intentamos hacerlo el Flash Player nos lanza una excepción del tipo SecurityError diciendo: "Security sandbox violation".
Permitiendo el cross site scripting
Siempre que lo creamos conveniente podemos habilitar la ejecución de código entre dominios utilizando una de estas APIs:
flash.system.SecurityDomain.allowDomain(... dominios):voidflash.system.SecurityDomain. allowInsecureDomain(... dominios):void
notar el parámetro ...rest, que permite pasar uno o varios dominios separados por coma: allowDomain("dominio1.com", "dominio2.com", "dominioN.com")
Estas APIs permiten a un swf explicitar que dominios pueden ejecutar su código, por ejemplo:
Si tenemos dominio1.com/app1.swf y dominio2.com/app2.swf y app2.swf tiene el código SecurityDomain.allowDomain("dominio1.com"), cuando app1.swf cargue el archivo app2.swf, entonces app1.swf podrá ejecutar código de app2.swf.
Es importante destacar que la inversa no es posible, es decir, app2.swf no podrá ejecutar código de app1.swf.
Para que la ejecución de código se permita en los dos sentidos tendremos que añadir el código SecurityDomain.allowDomain("dominio2.com") en app1.swf.
Estas dos imagen quizás lo ilustren mejor:

Con respecto a SecurityDomain. allowInsecureDomain(), sirve para lo mismo pero en el contexto de un swf cargado desde un dominio con SSL (HTTPS) que quiere cargar y ejecutar código de otro swf que está en un dominio no SSL (HTTP).
Cross site resource loading
Debido a que los recursos externos tipo multimedia, xml, txt, etc... no pueden comunicar al Flash Player si permiten o no su descarga desde otros dominios la estrategia para manejar este tipo de contenido a nivel de Sandbox se hace de otra forma.
Ahora nos olvidamos de Security.allowDomain y Security.allowInsecureDomain por completo e introducimos los Cross Domain Policy Files a.k.a crossdomain.xml.
De forma predeterminada estos archivos XML se añaden en el directorio raíz del dominio que almacena los recursos a los que se quiere dar acceso abierto desde otros dominios y el Flash Player los descarga automáticamente antes del primer acceso a un recurso para ver si se puede o no realizar la operación. Los dominios que podrán acceder a dichos recursos están declarados en el archivo XML en cuestión.
Por ejemplo, desde dominio1.com se quiere abrir el acceso para los dominios dominio2.com y dominio3.com. Para ello tendríamos este archivo crossdomain.xml en la raíz del dominio dominio1.com:
-
<?xml version="1.0"?>
-
-domain-policy> -
-access-from domain="dominio2.com"/> -
-access-from domain="dominio3.com"/> -
-domain-policy>
Un diagrama más ilustrativo:

Tipos de archivo y acciones permitidas
La información ofrecida en el punto anterior aunque cierta, no es del todo completa. Es importante saber que dependiendo del tipo de recurso que se quiera cargar de otro dominio el Flash Player se comporta de forma distinta.
Esta tabla resume el tipo de acceso permitido por tipos de archivo:
| Tipo de archivo | Con crossdomain.xml | Sin crossdomain.xml |
| Archivos de datos (txt, xml, php (el resultado interpretado, claro), etc...) | -Se puede descargar. -Se puede leer el contenido. |
-No se puede descargar -Se recibe SecurityErrorEvent.SECURITY_ERROR. |
| Archivos multimedia (png, jpg, mp3, flv, etc...) | -Se puede descargar. -Se puede renderizar/escuchar el contenido. -Se puede manipular el contenido con las APIs pertinentes. |
-Se puede descargar. -Se puede renderizar/escuchar el contenido. -No se puede manipular el contenido con las APIs, se lanza SecurityError. |
Para profundizar
Lo dicho aquí, aunque cubre la mayor parte de lo que se puede controlar a nivel seguridad en el Flash Player en el contexto de swfs en internet no lo es todo.
Dejo unos enlaces a recursos que amplían este contenido:
- LoaderInfo.sharedEvents: para habilitar un canal de comunicación a través de eventos entre swfs de diferentes Security Sanboxes.
- Loader.loadBytes(): Inyección de código de otros Security Sandboxes.
- Local Sandboxes: Modelo de seguridad para swfs que se ejecutan en local.
- AIR Security Sandboxes: Modelo de seguridad de Adobe AIR.
- Extending AIR application with plugins: Un caso de uso de cómo permitir acceso a contenido descargado de internet en aplicaciones AIR.
- Cambios en el comportamiento de algunas APIs con respecto a la seguridad en Flash player 10.1 y AIR2.
- Apartado de Flash Player Security en el Adobe Developer Center.
Próximamente
Un tema muy atado a la seguridad es la forma en que el Flash Player particiona las definiciones de clases entre distintos Security Domains e incluso dentro de uno mismo.
En un articulo próximo completaré el tema de seguridad hablando de los contenedores de definiciones de clases que utiliza el Flash Player, los ApplicationDomain.
» Leer más, comentarios, etc...
Joan Llenas at garnet.io :: Thoughts on software development
Seguridad para el resto de nosotros (en el Flash Player)
Enero 26th, 2011 - [Enlace local]
La seguridad en el Flash Player es uno de los puntos más borrosos dentro del desarrollo con La Plataforma Flash.
Cuando se obvian conceptos de seguridad (en la capa Flash) durante las decisiones arquitecturales lo que sucede es que en el momento de desarrollar se tiende a buscar soluciones rápidas cuando surgen problemas, sin previa meditación, entonces es cuando los agujeros de seguridad de abren, las empresas pierden dinero e incluso la tecnología se juzga mal por ello.

Esto pretende ser una recopilación comprimida de lo que un desarrollador debe saber acerca del modelo de seguridad dentro del Flash Player.
Security Sandboxing
El Sandboxing es el concepto sobre el que se construye la seguridad en el Flash Player.
En general cuando hablamos de un Security Sandbox estamos hablando de un dominio web, es decir existen tantos Security Sandboxes como dominios (y subdominios) hay en la web. Es por esto que también se les llama Security Domains.
Dentro del Flash Player podemos separar la seguridad en dos subconjuntos:
- Cross site scripting
- Cross site resource loading
Esta separación se debe a que las reglas de seguridad fundamentales para ejecución de código entre dominios (cross site scripting) son distintas a las de acceso a recursos externos entre dominios (cross site resource loading).
Cross site scritpting
Se conoce como cross site scripting el poder ejecutar código de un dominio desde otro.
Por ejemplo: miweb.com/app1.swf carga otraweb.com/app2.swf y app1.swf puede ejecutar métodos, acceder a propiedades y enviar eventos a app2.swf.
Lo primero que hay que tener claro es que el cross site scripting solo maneja la relación entre archivos swf en lo que a ejecución de código se refiere.
Igualmente importante es saber que el cross site scripting por defecto no es posible ya que es una brecha de seguridad por definición, no obstante existen casos en los que es interesante tener control sobre este aspecto y es por ello que el Flash Player expone APIs que permiten habilitarlo de forma explicita.
Dentro del ámbito del cross site scripting, un Sandbox de seguridad es una caja fuerte donde, de forma segura, podemos ejecutar aplicaciones o exponer librerías para el consumo de las aplicaciones que estén dentro del mismo Sandbox (dominio web).
Diferentes Sandboxes no pueden accederse entre si de forma predeterminada, y si intentamos hacerlo el Flash Player nos lanza una excepción del tipo SecurityError diciendo: "Security sandbox violation".
Permitiendo el cross site scripting
Siempre que lo creamos conveniente podemos habilitar la ejecución de código entre dominios utilizando una de estas APIs:
flash.system.SecurityDomain.allowDomain(... dominios):voidflash.system.SecurityDomain. allowInsecureDomain(... dominios):void
notar el parámetro ...rest, que permite pasar uno o varios dominios separados por coma: allowDomain("dominio1.com", "dominio2.com", "dominioN.com")
Estas APIs permiten a un swf explicitar que dominios pueden ejecutar su código, por ejemplo:
Si tenemos dominio1.com/app1.swf y dominio2.com/app2.swf y app2.swf tiene el código SecurityDomain.allowDomain("dominio1.com"), cuando app1.swf cargue el archivo app2.swf, entonces app1.swf podrá ejecutar código de app2.swf.
Es importante destacar que la inversa no es posible, es decir, app2.swf no podrá ejecutar código de app1.swf.
Para que la ejecución de código se permita en los dos sentidos tendremos que añadir el código SecurityDomain.allowDomain("dominio2.com") en app1.swf.
Estas dos imagen quizás lo ilustren mejor:

Con respecto a SecurityDomain. allowInsecureDomain(), sirve para lo mismo pero en el contexto de un swf cargado desde un dominio con SSL (HTTPS) que quiere cargar y ejecutar código de otro swf que está en un dominio no SSL (HTTP).
Cross site resource loading
Debido a que los recursos externos tipo multimedia, xml, txt, etc... no pueden comunicar al Flash Player si permiten o no su descarga desde otros dominios la estrategia para manejar este tipo de contenido a nivel de Sandbox se hace de otra forma.
Ahora nos olvidamos de Security.allowDomain y Security.allowInsecureDomain por completo e introducimos los Cross Domain Policy Files a.k.a crossdomain.xml.
De forma predeterminada estos archivos XML se añaden en el directorio raíz del dominio que almacena los recursos a los que se quiere dar acceso abierto desde otros dominios y el Flash Player los descarga automáticamente antes del primer acceso a un recurso para ver si se puede o no realizar la operación. Los dominios que podrán acceder a dichos recursos están declarados en el archivo XML en cuestión.
Por ejemplo, desde dominio1.com se quiere abrir el acceso para los dominios dominio2.com y dominio3.com. Para ello tendríamos este archivo crossdomain.xml en la raíz del dominio dominio1.com:
-
<?xml version="1.0"?>
-
-domain-policy> -
-access-from domain="dominio2.com"/> -
-access-from domain="dominio3.com"/> -
>
Un diagrama más ilustrativo:

Tipos de archivo y acciones permitidas
La información ofrecida en el punto anterior aunque cierta, no es del todo completa. Es importante saber que dependiendo del tipo de recurso que se quiera cargar de otro dominio el Flash Player se comporta de forma distinta.
Esta tabla resume el tipo de acceso permitido por tipos de archivo:
| Tipo de archivo | Con crossdomain.xml | Sin crossdomain.xml |
| Archivos de datos (txt, xml, php (el resultado interpretado, claro), etc...) | -Se puede descargar. -Se puede leer el contenido. |
-No se puede descargar -Se recibe SecurityErrorEvent.SECURITY_ERROR. |
| Archivos multimedia (png, jpg, mp3, flv, etc...) | -Se puede descargar. -Se puede renderizar/escuchar el contenido. -Se puede manipular el contenido con las APIs pertinentes. |
-Se puede descargar. -Se puede renderizar/escuchar el contenido. -No se puede manipular el contenido con las APIs, se lanza SecurityError. |
Para profundizar
Lo dicho aquí, aunque cubre la mayor parte de lo que se puede controlar a nivel seguridad en el Flash Player en el contexto de swfs en internet no lo es todo.
Dejo unos enlaces a recursos que amplían este contenido:
- LoaderInfo.sharedEvents: para habilitar un canal de comunicación a través de eventos entre swfs de diferentes Security Sanboxes.
- Loader.loadBytes(): Inyección de código de otros Security Sandboxes.
- Local Sandboxes: Modelo de seguridad para swfs que se ejecutan en local.
- AIR Security Sandboxes: Modelo de seguridad de Adobe AIR.
- Extending AIR application with plugins: Un caso de uso de cómo permitir acceso a contenido descargado de internet en aplicaciones AIR.
- Cambios en el comportamiento de algunas APIs con respecto a la seguridad en Flash player 10.1 y AIR2.
- Apartado de Flash Player Security en el Adobe Developer Center.
Próximamente
Un tema muy atado a la seguridad es la forma en que el Flash Player particiona las definiciones de clases entre distintos Security Domains e incluso dentro de uno mismo.
En un articulo próximo completaré el tema de seguridad hablando de los contenedores de definiciones de clases que utiliza el Flash Player, los ApplicationDomain.
» Leer más, comentarios, etc...
Najaraba.com: Software libre, metodologías ágiles y más.
Testeo defensivo, o que disparen a ese API
Enero 26th, 2011 - [Enlace local]
A raíz de una entrada de @sergioazo y su correspondiente conversación, he recordado una técnica que leí en algún sitio para minimizar los problemas en el trabajo con librerías externas de terceros en tu proyecto.Se puede usar para varias cuestiones:Comprender el funcionamiento real de una librería (no el esperado)Defenderte frente a cambios en el comportamiento futuro de la libreríaDocumentar el
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering / Project Management / Business Process Management
Green Project Management
Enero 26th, 2011 - [Enlace local]
Toda una serie de artículos sobre Green Project Management sobre varias categorías, todo se resume en que como Administradores de Proyecto tenemos el poder de tomar varias decisiones, las cuales pueden repercutir de algun modo en el cuidado de nuestro entorno, dos ejemplos de esto son:
1) Para reuniones de seguimiento, Promover juntas remotas de modo que las personas no tengan que trasladarse en auto a una oficina
2) Para Análisis Requerimientos, evitar que el cliente nos de documentos impresos
» Leer más, comentarios, etc...
PROGRAMANDO EN .NET
Me mudo
Enero 26th, 2011 - [Enlace local]
He decicido cambiar el blog de plataforma, a partir de hoy los nuevos posts estarán en programandoenpuntonet.wordpress.comLos posts antiguos se quedarán aquí, no voy a eliminar ninguno.A ver si con el cambio aumento la frecuencia de posts :)Happy codding ;)
» Leer más, comentarios, etc...
xperiments.es
Inyectando xml con formato dentro de javascript
Enero 26th, 2011 - [Enlace local]
A veces estaria bien poder definir un xml en javascript de la siguiente manera:
1 2 3 4 | var html = <form> <input type="text"> form>; |
Hasta que javascript soporte E4X en todos los navegadores, esto no va a ser podible…
Mientras llega E4X podemos simularlo utilizando los comentarios de javascript, para alli almacenar nuestras variables de una manera legible…
Definiriamos variables de la siguiente manera:
1 2 3 4 5 6 7 | /*! {"embed":{ "id":"form" } } */ |
La primera linea tiene que se un comienzo de comentario javascript /* , pero atencion con el simbolo ! justo detras, por lo que quedaria en /*!. Esto lo utilizamos para que algunos minimizadores de codigo no borren estos comentarios.
En la segunda linea es donde le especificamos al parser la variable que estamos definiendo, usando la propiedad id del objecto JSON descrito.
La ultimi linea tiene que ser un cierre de comentario */ en linea nueva…
Ejemplo completo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | var data = function() { /*! {"embed":{ "id":"form" } } */ /*! {"embed":{ "id":"button"} } } var parsedData = window.parseEmbeds(data); alert( parsedData.form ) alert( parsedData.button ); |
Libreria de parseo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | (function(window) { window.parseEmbeds = function( fn, opt ) { var dataObj = {} var regex_comments = /\*(.|[\r\n])*?\*/gi; var code = fn.toString().match( regex_comments ); var comment; var lines; var outputString; var trim11 =function(str){str = str.replace(/^\s+/, '');for (var i = str.length - 1; i >= 0; i--) {if (/\S/.test(str.charAt(i))) {str = str.substring(0, i + 1);break;}}return str;}; for( var i=0; i<code.length; i++ ) { comment = code[ i ]; if( comment.indexOf('{"embed":')!=-1 ) { lines = comment.split('\n'); outputString = ""; for( var e=2; e <lines.length-1; e++ ) { outputString+=trim11(lines[e]); } dataObj[ JSON.parse( lines[ 1 ] ).embed.id ] = outputString; } } return dataObj; } })(window); |
» Leer más, comentarios, etc...
Joan Garnet :: Arquitectura y desarrollo RIA
Device Days 2011
Enero 26th, 2011 - [Enlace local]
BlocketPc, el Spanish Mobile and Devices Adobe User Group, organiza un año más Device Days, unas charlas totalmente orientadas al desarrollo para móviles, tablets, televisiones y gadgets varios.

Esta nueva edición tendrá lugar en la Universitat Politécnica de Catalunya el 18 de Febrero, y contará con una serie de ponentes de nivel internacional que hablarán de varios temas relacionados con el desarrollo para dispositivos móviles.
- Synctur: Desarrollo multiplataforma con Flash
- Maximiliano Firtman: HTML5 para dispositivos móviles
- Justinmind: Safe time! Boost prototyping
- Mark Doherty: Meet the Blackberry Playbook
La asistencia es completamente gratuita, y por si fuera poco sortearán entre los asistentes una licencia de Adobe Web Premium CS5, licencias de Video2Brain y merchandising.
Agenda con los horarios de las ponencias
Registro (plazas limitadas)
» Leer más, comentarios, etc...
Joan Llenas at garnet.io :: Thoughts on software development
Device Days 2011
Enero 26th, 2011 - [Enlace local]
BlocketPc, el Spanish Mobile and Devices Adobe User Group, organiza un año más Device Days, unas charlas totalmente orientadas al desarrollo para móviles, tablets, televisiones y gadgets varios.

Esta nueva edición tendrá lugar en la Universitat Politécnica de Catalunya el 18 de Febrero, y contará con una serie de ponentes de nivel internacional que hablarán de varios temas relacionados con el desarrollo para dispositivos móviles.
- Synctur: Desarrollo multiplataforma con Flash
- Maximiliano Firtman: HTML5 para dispositivos móviles
- Justinmind: Safe time! Boost prototyping
- Mark Doherty: Meet the Blackberry Playbook
La asistencia es completamente gratuita, y por si fuera poco sortearán entre los asistentes una licencia de Adobe Web Premium CS5, licencias de Video2Brain y merchandising.
Agenda con los horarios de las ponencias
Registro (plazas limitadas)
» Leer más, comentarios, etc...
Bitácora de Javier Gutiérrez Chamorro (Guti)
AkelPad
Enero 26th, 2011 - [Enlace local]
Me ha sorprendido descubrir el editor de textos para Windows de código abierto AkelPad.
Inició su andadura con la versión 1 de 2003 de la mano de Alexey Kuznetsov, a partir de 2007 con la versión 2, Aleksander Shengalts tomó el relevo. Durante este tiempo ha sido actualizado regularmente, aunque por motivos que desconozco, su difusión no ha acabado de cuajar.
Conceptualmente es similar a EmEditor, es decir una base estable, sencilla y eficiente, que se extiende con plugins. A diferencia de EmEditor, AkelPad es todavía más compacto (una instalación mínima no llega a los 400 Kb.), aunque quizás no sea tan veloz, ni gestione tan bien los archivos de gran tamaño. A su favor, es gratuito, y poco a poco va mejorando.
Dentro de sus otros competidores, es más completo que Notepad2, pero menos que Notepad++.
De base, vendría a ser un bloc de notas, con capacidad multiarchivo (bien sea SDI o MDI), y comandos mejorados. Con añadidos, podemos tenerlo en castellano, soportar autocompletado, resaltado de sintaxis, exploración de archivos, o programación con scripts y macros.
Las distribuciones recientes están disponibles tambuién como programa nativo x64, mientras que las de 32 bits siguen funcionando tanto en equipos con Windows 95, como con Windows 7. Es decir, una compatibilidad, que no podría ser más amplia.
De serie, nos permite escoger guardar la configuración en el registro, o en un archivo INI. En este último caso, AkelPad funciona en el cómodo modo portable.
» Leer más, comentarios, etc...
Bitácora de Javier Gutiérrez Chamorro (Guti) » Programación
AkelPad
Enero 26th, 2011 - [Enlace local]
Me ha sorprendido descubrir el editor de textos para Windows de código abierto AkelPad.
Inició su andadura con la versión 1 de 2003 de la mano de Alexey Kuznetsov, a partir de 2007 con la versión 2, Aleksander Shengalts tomó el relevo. Durante este tiempo ha sido actualizado regularmente, aunque por motivos que desconozco, su difusión no ha acabado de cuajar.
Conceptualmente es similar a EmEditor, es decir una base estable, sencilla y eficiente, que se extiende con plugins. A diferencia de EmEditor, AkelPad es todavía más compacto (una instalación mínima no llega a los 400 Kb.), aunque quizás no sea tan veloz, ni gestione tan bien los archivos de gran tamaño. A su favor, es gratuito, y poco a poco va mejorando.
Dentro de sus otros competidores, es más completo que Notepad2, pero menos que Notepad++.
De base, vendría a ser un bloc de notas, con capacidad multiarchivo (bien sea SDI o MDI), y comandos mejorados. Con añadidos, podemos tenerlo en castellano, soportar autocompletado, resaltado de sintaxis, exploración de archivos, o programación con scripts y macros.
Las distribuciones recientes están disponibles tambuién como programa nativo x64, mientras que las de 32 bits siguen funcionando tanto en equipos con Windows 95, como con Windows 7. Es decir, una compatibilidad, que no podría ser más amplia.
De serie, nos permite escoger guardar la configuración en el registro, o en un archivo INI. En este último caso, AkelPad funciona en el cómodo modo portable.
Artículos relacionados
VIMWindows 3 en vivo
Cómo añadir compatibilidad de estilos visuales Windows XP a las aplicaciones
» Leer más, comentarios, etc...
Picando Código
Ruby básico – parte 2
Enero 26th, 2011 - [Enlace local]
Sigo con la segunda parte del segundo capítulo del Pickaxe. Creo que la primer parte de Ruby básico fue bastante extensa (para ser un post de un blog), pero es lógico por haber sido el principio hay mucho por ver. De a poco iré aceitando un poco este tipo de posts para hacerlos de manera dinámica (para no aburrirme) pero intentando plasmar los aprendizajes.
Como comentaba antes, además del libro tenía como referencia los videos de un curso de la U. de Berkeley. Esta vez agregué también un material único del mundo de Ruby: _why’s poignant guide ro ruby.
Veníamos viendo algo básico del lenguaje, variables, strings, hasta Arrays y Hashes. Hoy comenzamos con algo creo que novedoso en Ruby que son los símbolos.
Símbolos en Ruby
Los símbolos en Ruby son algo así como constantes a las que no hay que declarar. Ruby garantiza que su valor es único y siempre será el mismo valor, no se les puede asignar un valor de la manera tradicional :simbolo = "Peanut butter jelly" « Esto genera un error.
Funcionan como un string y se nombran con : como primer caracter de su nombre. Al decir “funcionan como un string” me refiero a que se les puede asignar un nombre y usarlo como un string, pero no tienen las funciones de un string. Según _why, generalmente son usados en situaciones donde necesitas un string pero no lo muestras en pantalla. Aparentemente también se usan como llaves en un hash. Más adelante hay más por ver sobre símbolos.
#!/usr/bin/ruby :fernando :chunky_bacon puts :fernando p :chunky_bacon puts :"Chunky bacon!!"
Imprime:
[fernando@hoth pickaxe]$ ./symbols.rb fernando :chunky_bacon Chunky bacon!!
Estructuras de control
Ruby cuenta con las estructuras de control básicas de todo lenguaje de programación. Como esta parte es bastante básica, simplemente pego código de cómo se arma cada estructura para tener como referencia.
#!/usr/bin/ruby hoy = Time.now #Estructura if-else if hoy.saturday? puts "Tiempo de estudiar Ruby" elsif hoy.sunday? puts "Ir a la playa" else puts "Hay que trabajar" end #Estructura while num = 99 while num < 0 puts "#{num} bottles of beer on the wall," puts "#{num} bottles of beer" puts "Take one down and pass it around," num -= 1 puts "#{num} bottles of beer on the wall." end #Statement modifiers: puts "Me voy a la playa" if Time.now.sunday? num = 6 puts num = num -1 while num > 1
Expresiones regulares
En Picando Código ya publiqué 10 razones para aprender y usar expresiones regulares. Así que asumo que todos los lectores saben qué son y para qué sirven las expresiones regulares.
Por lo que he aprendido hasta el momento, en Ruby las expresiones regulares se representan entre barras: /expresión regular/. Nada nuevo para la mayoría. Para comparar una cadena de caracteres con una expresión regular se usa el “match operator”: =~. Éste retorna la posición inicial del patrón en la cadena de caracteres.
#!/usr/bin/jruby # -*- coding: utf-8 -*- regla1 = "You do not talk about Fight Club" puts regla1 =~ /[0-9]/ #nil si no encuentro nada... if regla1 =~ /Fight Club/ puts "Someone has been talking 'bout it" end
Creo que gané un par de geek points extra por probar este código con JRuby
Bloques e Iteradores
Se viene todo un tema, algo bastante particular y poderoso del lenguaje. Nada asegura que ya haya asimilado correctamente su concepto, pero comparto con ustedes lo que entiendo.
Los bloques en Ruby, son una porción de código entre llaves {} o do y end. Se pueden asociar a la invocación de un método escribiéndolos enseguida después de la llamada a un método. Definiendo: la forma de asociar un bloque a un método, es escribiéndolos inmediatamente después de la llamada a dicho método.
Ahora, un método puede invocar su bloque asociado con el comando yield. En este concepto, creo que la incisiva guía de _why explica de forma totamente comprensible de qué se trata. En inglés los símbolos de “Ceda el paso” en el tránsito dicen “Yield”:
Puedes preguntarte qué tiene que ver la palabra yield con los carteles de tránsito. Y realmente, es una buena pregunta con, creo yo, una buena respuesta. Cuando ejecutas un método, le estás dando a ese método el control de tu programa. Control para hacer su trabajo y volver con una respuesta.
Con yield, el método se está deteniendo en la intersección, devolviendote el control, a tu bloque. El método está permitiéndote hacer t trabajo antes de resumir el suyo.
Esas pequeñas fases de iluminación… Podemos usar yield las veces que queramos dentro de un método. Cada vez que lo usemos, el método llamará a su bloque asociado.
Los bloques también pueden recibir parámetros. Los parámetros son variables encerradas en pipes y separadas por una coma: |arg1,arg2|.
Código obligado haciendo pruebas de bloques:
#!/usr/bin/ruby # -*- coding: utf-8 -*- def metodo (name) print "Dentro del método: #{name} - " yield(name) end #Bloque en línea simple: metodo("Mario") { puts "Bloque en línea simple"} #Bloque en varias líneas: metodo("Pitágoras") do puts "Bloque en varias líneas" puts 1 * 1 puts 11 * 11 puts 111 * 111 puts 1111 * 1111 puts 11111 * 11111 end metodo("Armando") {|name| puts "Como parámetro del bloque: #{name}"}
Los bloques se usan en Ruby para implementar iteradores – métodos que devuelven elementos sucesivos de una colección. Creo que el código en este caso es bastante explicativo:
#!/usr/bin/ruby avengers = %w{ Iron\ Man Hulk Thor Captain\ America Wasp Ant-Man } 42.times { print "*"} puts avengers.each {|name| puts "#{name}"} 42.times { print "*"} puts
Lectura y escritura
De los últimos temas del segundo capítulo del libro de Pickaxe, es lectura y escritura. El libro cubre por ahora la entrada y salida estándar. Las funciones:
puts– Imprime en la salida estándar con un salto de línea.print– ídem pero sin salto de línea. Ambos pueden usarse para escribir en cualquier objeto de entrada/salida.printf– Imprime con el control de un string de formato (como en C, Perl o PHP): %s, %d, etc.
En cuanto a la lectura, el método tradicional es gets. Éste retorna la siguiente línea de la entrada estándar.
Argumentos desde la línea de comando
Para terminar este post, vamos a ver cómo usar los argumentos pasados a nuestro script Ruby desde la línea de comando. El array ARGV contiene todos los parámetros que pasemos por comandos, y ARGF es un objeto especial de tipo Entrada/Salida que se comporta como los contenidos de los archivos cuyos nombres se pasen por parámetros.
#!/usr/bin/ruby # -*- coding: utf-8 -*- num = ARGV.size puts "Parámetros: #{num}" ARGV.each {|arg| puts "#{arg}"}
Prueben algún código con ARGV y ejecútenlo desde la línea de comandos pasándole varios parámetros.
Y ahí va la segunda parte de este proceso de aprender Ruby. Ya la próxima arrancamos con la interacción entre objetos. Para el próximo post, seguramente vaya mas rápido, ya que no voy a ponerme a definir conceptos básicos de orientación a objetos, solo particularidades de Ruby.
Comparte:
» Leer más, comentarios, etc...
Variable not found
Generación de atributos con guiones en helpers MVC 3
Enero 26th, 2011 - [Enlace local]
Desde la primera versión de ASP.NET MVC se permite añadir a la mayoría de los helpers que generan etiquetas HTML atributos personalizados. Para ello, se introducían objetos anónimos cuyas propiedades eran transformadas a atributos en el momento del renderizado, como en el siguiente ejemplo:
Este código generaría el siguiente marcado:
Ahora que se van a poner muy de moda los atributos personalizados al estilo HTML5, como los “data-xxxx”, nos encontramos con un pequeño problema a la hora de introducirlos en objetos anónimos: los lenguajes como C# o VB no permiten el uso de guiones en los nombres de propiedades, por lo que si escribimos el siguiente código, se generará un error de compilación:
En ASP.NET MVC 3, por convención, es posible introducir este tipo de propiedades, pero utilizando el guión bajo (“_”) en lugar del guión medio (“-“). O en otras palabras, si queremos que el helper genere un atributo data-xx en el marcado HTML, debemos nombrar la propiedad del objeto anónimo como data_xx, tal y como se hace en el siguiente ejemplo:
… que generaría el siguiente marcado, correcto en HTML5:
Publicado en: Variable not found.
» Leer más, comentarios, etc...
MadeInFlex
Device Days 2011
Enero 25th, 2011 - [Enlace local]
BlocketPc, el Spanish Mobile and Devices Adobe User Group, organiza un año más Device Days, unas charlas totalmente orientadas al desarrollo para móviles, tablets, televisiones y gadgets varios.

Esta nueva edición tendrá lugar en la Universitat Politécnica de Catalunya el 18 de Febrero, y contará con una serie de ponentes de nivel internacional que hablarán de varios temas relacionados con el desarrollo para dispositivos móviles.
- Synctur: Desarrollo multiplataforma con Flash
- Maximiliano Firtman: HTML5 para dispositivos móviles
- Justinmind: Safe time! Boost prototyping
- Mark Doherty: Meet the Blackberry Playbook
La asistencia es completamente gratuita, y por si fuera poco sortearán entre los asistentes una licencia de Adobe Web Premium CS5, licencias de Video2Brain y merchandising.
Agenda con los horarios de las ponencias
Registro (plazas limitadas)
» Leer más, comentarios, etc...
Arragonán
Groovy Koans en el Spring I/O
Enero 25th, 2011 - [Enlace local]
Este año se repite el Spring I/O, bajo el nuevo nombre, que es el evento de SpringSource y javaHispano promovido por Sergi Almar. Y este año, a diferencia del anterior, me toca estar sólo ante el peligro con un taller de Groovy Koans.
Groovy Koans es un proyecto para ayudar a introducirse al lenguaje Groovy utilizando tests unitarios, conocí el proyecto un poco de rebote gracias a Amalia, y me pareció interesante proponerlo como taller para ayudar a conocer los fundamentos del lenguaje. Todavía tengo que ver que subconjunto de los koans selecciono para el taller, ya que no veo posible hacerlos todos en un par de horas.
En el taller realmente espero hablar muy poco, prefiero dedicarme a dar apoyo y a resolver las dudas que puedan surgir cuando la gente se ponga manos a la obra.
Sin estar del todo cerrada la agenda, la verdad es que el cartel es impresionante, con ponentes internacionales y nacionales de muchísimo nivel. Si os interesa groovy, grails, spring o el ecosistema java en general yo no dudaría en registrarme
Por cierto, las fechas son 17 y 18 de Febrero, y el lugar la Universidad CEU San Pablo en Boadilla del Monte (Madrid).
» Leer más, comentarios, etc...
Joan Garnet :: Arquitectura y desarrollo RIA
Filtros reusables para ICollectionView.filterfunction
Enero 25th, 2011 - [Enlace local]
Siguiendo con el mismo ejemplo del post anterior introduzco una mejora notable para conseguir eliminar la duplicación de código existente en los filtros.

Para no reinventar las funciones de filtrado cada vez que las necesitamos podemos abstraer un poco la funcionalidad y crear una base sobre la que poder construir fácilmente una librería de filtros, que a menudo suelen ser los mismos.
Para empezar crearemos una sencilla interfaz para no tener que ir a la documentación cada vez que queramos implementar el filtro a revisar la firma de ICollectionView.filterFunction.
-
package filters
-
{
-
public interface ICollectionFilter
-
{
-
function filterFunction(item:Object):Boolean;
-
}
-
}
A continuación implementaremos el filtro, en este caso se trataba de un filtro que obtenía el valor aceptado del filtro desde un TextInput.
-
package filters
-
{
-
import spark.components.TextInput;
-
-
public class TextInputFilter implements ICollectionFilter
-
{
-
private var textInput:TextInput;
-
private var filterFields:Array;
-
-
public function TextInputFilter(textInput:TextInput, filterFields:Array)
-
{
-
this.textInput = textInput;
-
this.filterFields = filterFields;
-
}
-
-
public function filterFunction(item:Object):Boolean
-
{
-
var filterText:String = textInput ? textInput.text.toLocaleLowerCase() : "";
-
var match:Boolean = false;
-
var len:int = filterFields.length;
-
for (var i:uint = 0; i
) -
{
-
var field:String = filterFields[i];
-
var value:String = String(item[field]).toLowerCase();
-
if (value.indexOf(filterText)> -1)
-
{
-
match = true;
-
break;
-
}
-
}
-
return match;
-
}
-
}
-
}
Finalmente instanciaremos los filtros para cada colección.
-
// ....
-
import filters.TextInputFilter;
-
-
private function createFilterFunctions():void
-
{
-
dp1.filterFunction = new TextInputFilter(filterText1, [ 'Nombre', 'Album' ]).filterFunction;
-
dp2.filterFunction = new TextInputFilter(filterText2, [ 'Nombre', 'Album' ]).filterFunction;
-
}
-
// ....
Por lo demás el ejemplo es el mismo. Se puede ver que reducimos el número de líneas de código de forma considerable, en gran medida por la eliminación de la duplicación de código. Además el código es mucho más sencillo de leer/entender.
En mi otro blog (en inglés) escibí algo parecido pero tratando las labelFunction de los componentes de lista, para las cuales se puede aplicar exactamente el mismo principio, de hecho cualquier clase que exponga una función a modo de estrategia puede refactorizarse para seguir este principio. Los beneficios son bastante obvios.
Descarga ejemplo
En el zip hay un proyecto Flex4 para Flash Builder.
» Leer más, comentarios, etc...
Joan Llenas at garnet.io :: Thoughts on software development
Filtros reusables para ICollectionView.filterfunction
Enero 25th, 2011 - [Enlace local]
Siguiendo con el mismo ejemplo del post anterior introduzco una mejora notable para conseguir eliminar la duplicación de código existente en los filtros.

Para no reinventar las funciones de filtrado cada vez que las necesitamos podemos abstraer un poco la funcionalidad y crear una base sobre la que poder construir fácilmente una librería de filtros, que a menudo suelen ser los mismos.
Para empezar crearemos una sencilla interfaz para no tener que ir a la documentación cada vez que queramos implementar el filtro a revisar la firma de ICollectionView.filterFunction.
-
package filters
-
{
-
public interface ICollectionFilter
-
{
-
function filterFunction(item:Object):Boolean;
-
}
-
}
A continuación implementaremos el filtro, en este caso se trataba de un filtro que obtenía el valor aceptado del filtro desde un TextInput.
-
package filters
-
{
-
import spark.components.TextInput;
-
-
public class TextInputFilter implements ICollectionFilter
-
{
-
private var textInput:TextInput;
-
private var filterFields:Array;
-
-
public function TextInputFilter(textInput:TextInput, filterFields:Array)
-
{
-
this.textInput = textInput;
-
this.filterFields = filterFields;
-
}
-
-
public function filterFunction(item:Object):Boolean
-
{
-
var filterText:String = textInput ? textInput.text.toLocaleLowerCase() : "";
-
var match:Boolean = false;
-
var len:int = filterFields.length;
-
for (var i:uint = 0; i
) -
{
-
var field:String = filterFields[i];
-
var value:String = String(item[field]).toLowerCase();
-
if (value.indexOf(filterText)> -1)
-
{
-
match = true;
-
break;
-
}
-
}
-
return match;
-
}
-
}
-
}
Finalmente instanciaremos los filtros para cada colección.
-
// ....
-
import filters.TextInputFilter;
-
-
private function createFilterFunctions():void
-
{
-
dp1.filterFunction = new TextInputFilter(filterText1, [ 'Nombre', 'Album' ]).filterFunction;
-
dp2.filterFunction = new TextInputFilter(filterText2, [ 'Nombre', 'Album' ]).filterFunction;
-
}
-
// ....
Por lo demás el ejemplo es el mismo. Se puede ver que reducimos el número de líneas de código de forma considerable, en gran medida por la eliminación de la duplicación de código. Además el código es mucho más sencillo de leer/entender.
En mi otro blog (en inglés) escibí algo parecido pero tratando las labelFunction de los componentes de lista, para las cuales se puede aplicar exactamente el mismo principio, de hecho cualquier clase que exponga una función a modo de estrategia puede refactorizarse para seguir este principio. Los beneficios son bastante obvios.
Descarga ejemplo
En el zip hay un proyecto Flex4 para Flash Builder.
» Leer más, comentarios, etc...
Joan Garnet :: Arquitectura y desarrollo RIA
ListCollectionView: creando vistas de colecciones
Enero 25th, 2011 - [Enlace local]
A menudo me he encontrado con que hay cierta confusión a la hora de trabajar con casos de uso medianamente complejos que utilizan colecciones en Flex.
Una colección en el ámbito de Flex es una instancia de una clase que enriquece y homogeniza el acceso a los tipos básicos que proporciona ActionScript para tratar con matrices de datos, es decir: Array, XMLList y Vector.

Cualquier colección en Flex debe extender la clase mx.collections.ListCollectionView ya que ésta proporciona implementaciones por defecto de las interfaces mx.collections.ICollectionView y mx.collections.IList (siempre se pueden reimplementar si fuera necesario), las cuales ofrecen homogenización; permitiendo manipular un Array, XMLList o Vector a través de los mismos métodos; y riqueza; permitiendo realizar operaciones de ordenado, filtrado, creación de múltiples vistas a partir de un mismo origen de datos, iteración, búsqueda, bookmarking, etc...
Las colecciones que actualmente existen en Flex son: ArrayCollection y XMLListCollection, y no dudo que pronto habrá una implementación oficial de VectorCollection, eso o Generics.
El mecanismo base que utiliza ListCollectionView internamente para proporcionar todo este rango de operaciones, que a la vez es el concepto que detecto no acaba de cuajar en un gran número de desarrolladores, es el de disponer de un origen de datos y múltiples representaciones, o dicho de otra forma:
Una colección, múltiples vistas (de la colección)
De aquí el nombre List Collection View (Vista de una colección de lista o algo así...)
La clave es sentirse cómodo con el concepto y no dudar en por ejemplo disponer de un mismo ArrayCollection y manipularlo mediante filtros, ordenaciones, etc... en diferentes contextos teniendo la certeza que las manipulaciones no se solaparan entre las distintas vistas de la colección.
Un ejemplo:

Disponemos de una colección con grupos de música y sus álbumes. Queremos disponer de dos vistas de la colección para popular dos mx.control.DataGrid y aplicarles distintos filtros por texto.
El resultado debe ser que cada filtro debe afectar solo a una de las vistas de la colección.
Finalmente, para demostrar que la colección es en realidad la misma, disponemos de un botón para eliminar un elemento de cualqueira de las dos vistas, y al hacerlo veremos que la eliminación se realiza en ambas vistas, ya que la eliminación es una operación que afecta a la colección madre y por lo tanto a todas sus vistas.
ver ejemplo mejorado en otro post
Descarga ejemplo
En el zip hay un proyecto Flex4 para Flash Builder.






