Noticias Weblogs Foros Wiki Código

Meta-Info

¿Que es?

Planeta Código es un agregador de weblogs sobre programación y desarrollo en castellano. Si eres lector te permite seguirlos de modo cómodo en esta misma página o mediante el fichero de subscripción.

rss subscripción

Sponsors

Puedes utilizar las siguientes imagenes para enlazar PlanetaCodigo:
planetacodigo

planetacodigo

Si tienes un weblog de programación y quieres ser añadido aquí, envíame un email solicitándolo.

Idea: Juanjo Navarro

Diseño: Albin

Joan Llenas at garnet.io :: Thoughts on software development

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.

Ejemplo ListCollectionView (10) - 19.26 kB
zip

» Leer más, comentarios, etc...

PROGRAMANDO EN .NET

Oracle: obtener el código de procedures o packages desde línea de comandos

Enero 25th, 2011 - [Enlace local]

Cuando tenemos un IDE (como sqldeveloper) obtener el código de un procedure es algo tan fácil como hacer click con el ratón, pero esto también lo podemos hacer desde la línea de comandos (con sqlplus, por ejemplo):SELECT text FROM all_source WHERE name = 'NOMBRE_PROCEDURE';Cuando se trata de un package, obtendremos tanto la definición como el cuerpo, pero si queremos únicamente el cuerpo,

» Leer más, comentarios, etc...

Picando Código

Analizando la memoria en GNU/Linux

Enero 25th, 2011 - [Enlace local]

El fin de semana le compré 2GB de memoria más a mi computadora Hoth. Tenía un solo dim de 2GB hasta ahora, con un procesador AMD Athlon 64 X2 Dual Core 5600+.

Hacía meses que estaba por hacerlo, ya que venía andando bastante mal. Si bien estoy usando ArchLinux – un cambio que implicó mejoras en el rendimiento – aparentemente uso demasiadas aplicaciones al mismo tiempo.

Varias personas me comentaron que al usar una arquitectura de 64 bits, era conveniente tener al menos 4GB para que la computadora rindiera. Estoy muy oxidado en lo que respecta a arquitecturas de computadoras, así que me considero bastante ignorante en el tema del hardware.

Un tema que sí notaba, es que el sistema accedía mucho a la memoria Swap. Y algo que sí sé de hardware, es que la lectura y escritura en el disco duro es el proceso más lento en los componentes de memoria.

Dim DDR2 2GB

Dim DDR2 2GB

Hay un par de aplicaciones en la línea de comando de GNU/Linux que nos permiten obtener información interesante sobre la memoria de nuestra máquina. La primera es free. Con el parámetro -m, podemos ver los valores en megabytes. Así estaba mi computadora antes de la instalación del nuevo dim:

[fernando@hoth ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          1754       1711         42          0         30        196
-/+ buffers/cache:       1485        268
Swap:         1906        390       1515

Otro comando nos ayuda a determinar qué tipo de memoria tenemos en la computadora: sudo dmidecode --type memory. Antes de comprar la memoria siquiera, podemos fijarnos el tipo de memoria, y otros datos:

# dmidecode 2.11
SMBIOS 2.5 present.

Handle 0x0027, DMI type 16, 15 bytes
Physical Memory Array
	Location: System Board Or Motherboard
	Use: System Memory
	Error Correction Type: None
	Maximum Capacity: 8 GB
	Error Information Handle: Not Provided
	Number Of Devices: 4

Handle 0x0029, DMI type 17, 27 bytes
Memory Device
	Array Handle: 0x0027
	Error Information Handle: Not Provided
	Total Width: 64 bits
	Data Width: 72 bits
	Size: 2048 MB
	Form Factor: DIMM
	Set: None
	Locator: DIMM0
	Bank Locator: BANK0
	Type: DDR2
	Type Detail: Synchronous
	Speed: 333 MHz
	Manufacturer: Manufacturer0
	Serial Number: SerNum0
	Asset Tag: AssetTagNum0
	Part Number: PartNum0

Handle 0x002B, DMI type 17, 27 bytes
Memory Device
	Array Handle: 0x0027
	Error Information Handle: Not Provided
	Total Width: Unknown
	Data Width: Unknown
	Size: No Module Installed
	Form Factor: DIMM
	Set: None
	Locator: DIMM1
	Bank Locator: BANK1
	Type: SDRAM
	Type Detail: None
	Speed: Unknown
	Manufacturer: Manufacturer1
	Serial Number: SerNum1
	Asset Tag: AssetTagNum1
	Part Number: PartNum1

Handle 0x002D, DMI type 17, 27 bytes
Memory Device
	Array Handle: 0x0027
	Error Information Handle: Not Provided
	Total Width: Unknown
	Data Width: Unknown
	Size: No Module Installed
	Form Factor: DIMM
	Set: None
	Locator: DIMM2
	Bank Locator: BANK2
	Type: SDRAM
	Type Detail: None
	Speed: Unknown
	Manufacturer: Manufacturer2
	Serial Number: SerNum2
	Asset Tag: AssetTagNum2
	Part Number: PartNum2

Handle 0x002F, DMI type 17, 27 bytes
Memory Device
	Array Handle: 0x0027
	Error Information Handle: Not Provided
	Total Width: Unknown
	Data Width: Unknown
	Size: No Module Installed
	Form Factor: DIMM
	Set: None
	Locator: DIMM3
	Bank Locator: BANK3
	Type: SDRAM
	Type Detail: None
	Speed: Unknown
	Manufacturer: Manufacturer3
	Serial Number: SerNum3
	Asset Tag: AssetTagNum3
	Part Number: PartNum3

Como ven, este comando despliega cuántos puertos tenemos, la capacidad máxima de memoria de nuestro motherboard, y qué dims tenemos instalados además de informacion detallada de cada uno. Importante saber antes de comprar un nuevo dim.

Ahora que tengo estos 4GB, el sistema vuela. Se nota que no tiene que usar el disco para la memoria de intercambio, y con las mismas aplicaciones ejecutándose, la Ram se mantiene poco más de la mitad y apenas un poco de memoria swap. En este momento ejecutando: Icecat con 28 pestañas, 2 instancias de Hotot (una para Twitter y otra para Identi.ca), Amarok, Kopete, Dolphin, Emacs y Yakuake, el sistema no muestra ninguna lentitud.

Mirando la memoria libre con free, pueden ver que apenas se está usando la ram del swap:

[fernando@hoth ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          3706       3575        131          0         59        778
-/+ buffers/cache:       2737        969
Swap:         1906          7       1898

Y la información del nuevo dim con sudo dmidecode --type memory:

Handle 0x002B, DMI type 17, 27 bytes
Memory Device
        Array Handle: 0x0027
        Error Information Handle: Not Provided
        Total Width: 64 bits
        Data Width: 72 bits
        Size: 2048 MB
        Form Factor: DIMM
        Set: None
        Locator: DIMM1
        Bank Locator: BANK1
        Type: DDR2
        Type Detail: Synchronous
        Speed: 333 MHz
        Manufacturer: Manufacturer1
        Serial Number: SerNum1
        Asset Tag: AssetTagNum1
        Part Number: PartNum1

Lo que me queda por comprar ahora, como detalle final, sería una placa de video. Tengo una ATI integrada, por lo que obtiene memoria de la Ram. Además, me gustaría tener una placa nVidia ya que sus drivers son muy superiores a los de ATI en GNU/Linux. Veremos si más adelante encuentro que vale la pena la inversión…

En cuanto a la memoria, 4GB debería ser suficiente memoria para cualquiera… ¡Sí, claro!

Ya conocía free desde hace un tiempo, pero dmidecode lo descubrí hace poco. Así que aprovecho para compartir esta info por acá por si a alguien más le resulta útil (y para tener a mano cuando me olvide…).

Comparte: Twitter Identi.ca del.icio.us Google Bookmarks BarraPunto Bitacoras.com Tumblr Print Facebook

» Leer más, comentarios, etc...

Variable not found

Acceso a datos con .NET Framework 4: nuevo curso en CampusMVP

Enero 25th, 2011 - [Enlace local]

Acceso a datos con .NET Framework 4

Días atrás presentaba el nuevo curso de ASP.NET MVC 3 en CampusMVP, y ahora le toca el turno a otro de los asuntos que me ha tenido bastante entretenido los últimos meses: el nuevo curso de preparación de la certificación 70-516 TS: Accessing Data with Microsoft® .NET Framework 4.



El objetivo del curso es ayudaros a preparar el examen 70-516 de Microsoft que os certificará como Technology Specialists en acceso a datos sobre la versión 4 del framework. Sin embargo, el curso está conceptualizado para lograr un objetivo aún mayor: aprender a identificar, seleccionar e implementar con éxito todas las tecnologías de acceso a datos disponibles en la última versión del marco de trabajo de Microsoft, de forma que los conocimientos adquiridos os sean de utilidad en vuestra vida profesional.



Para ello, se ha creado un completo temario exclusivo para el curso, en el que se incluyen más de 130 temas con orientación muy práctica, cerca de 4 horas de vídeos explicativos, aplicaciones de ejemplo, enlaces, y otros recursos, a través de los siguientes módulos:

Como magníficos complementos y ampliaciones al temario, el material del curso incluye los siguientes libros en formato PDF, imprimibles y sin DRM:

El curso se imparte totalmente online, a través de la plataforma CampusMVP, sin horarios y a vuestro propio ritmo. La duración total del curso está estimada en 16 semanas (con una dedicación media de 8 o 10 horas por semana, dependiendo del nivel de partida), y durante las cuales, como tutor, contaréis con mi asistencia para resolver vuestras dudas.



¡Garantía de aprobado CampusMVP!Adicionalmente, para que vayáis bien preparados al examen, el curso incluye 6 meses de acceso a las simulaciones del examen oficial de MeasureUp, el único proveedor avalado por Microsoft. Durante este tiempo podréis practicar todo lo que necesitéis hasta estar bien preparados e ir al examen con total tranquilidad.



Ah, aprovecho también para decir que este curso está incluido dentro de la nueva iniciativa Garantía de aprobado de CampusMVP. Esto implica que si seguís la metodología propuesta y os preparáis a conciencia, en caso de no superar el examen de certificación se os devolvería el importe del curso, aunque ya os adelanto que no os va a hacer falta… ;-)



En cualquier caso, vayáis al examen o no, los conocimientos adquiridos seguro os pondrán a la última en tecnologías de acceso a datos de Microsoft, y podréis aplicarlos de inmediato en la vida real. ¡Espero poder veros por allí!



Enlace: Preparación de la certificación 70-516 TS: Accessing Data with Microsoft® .NET Framework 4 en CampusMVP.



Publicado en: Variable not found.



» Leer más, comentarios, etc...

Buayacorp

Ejemplos de Webkit CSS (II): Colores, Bordes y Fondos

Enero 24th, 2011 - [Enlace local]

Ejemplos de Webkit

Esta es la segunda parte de la entrega “Ejemplos de Webkit”, en esta oportunidad vamos a mostrar algunos ejemplos de colores, bordes y fondos.

Leer más, comentarios, etc...

» Leer más, comentarios, etc...

Picando Código

Leyendo Pickaxe: Ruby básico

Enero 24th, 2011 - [Enlace local]

Programming Ruby 1.9

Programming Ruby 1.9

Empiezo esta serie de posts para aprender Ruby con el capítulo 2 del libro Programming Ruby 1.9. El capítulo 1 describe cómo usar la línea de comando, instalar Ruby, ejecutar el código, documentación y demás. Me salteo este capítulo porque no me resulta tan divertido postear al respecto…

La “metodología” de estudio es: Estudio el material, escribo el código, lo ejecuto, lo modifico y pruebo los cambios. Después agarro el libro, el código y los apuntes, me alimento con ellos, lo proceso en mi estómago, y vomito el resultado en el Editor de entradas de WordPress que hace que se publique acá :D

Resumen básico de Ruby

Ruby es un lenguaje “genuinamente” orientado a objetos. Todo es un objeto. La sintaxis es “limpia”, no necesita punto y coma al final de una sentencia siempre y cuando se escriba cada una en una línea separada. Los comentarios se escriben con #, y la indentación no es importante.

Los métodos se definen con def, seguidos del nombre y los parámetros, los paréntesis para los parámetros son opcionales. Se termina el método con end. Las variables no necesitan ser declaradas. Los paréntesis también son opcionales al pasarle parámetros a un método.

Estoy usando Emacs como editor de texto, que tiene coloreado de sintaxis y tabulación. Por ahora no necesito más. Para ir mirando un poco de sintaxis, algo así como un “Hola mundo”. Para empezar, vengo corriendo los scripts desde la consola, así que agregué la ruta de ruby al principio del archivo para que encuentren cómo ejecutarse con ./.

#!/usr/bin/ruby
# -*- coding: utf-8 -*-
 
#puts - método standard que muestra los argumentos en la consola
#seguido de un salto de línea
puts 'Leyendo Pickaxe...'
puts 'Leyendo Pickaxe...'.length
puts "El resultado de la vida, el universo y todo lo demás es par?"
puts 42.even? #Pregunto si 42 es par...
 
def saludar(nombre)
  resultado = "Buenos días, #{nombre.capitalize}"
end
 
puts saludar("fernando")
puts saludar "alfredo"

Podrán haber notado que el método “saludar” no tiene un retorno. En Ruby, el valor retornado por un método es el valor de la última expresión evaluada. Así que si bien podría haber puesto “return result”, también podemos prescindir de él. Si les interesa ir siguiendo el código, les recomiendo ir escribiéndolo, modificándolo y viendo qué salida produce. Hay varios ejemplos de lo que comentaba más arriba.

Variables

Agrego algunos apuntes que saqué de los videos del curso de Ruby On Rails de la Universidad de Berkeley.

En Ruby cualquier variable puede guardar cualquier tipo (todo es un objeto). Siempre se pasa por referencia, al modificar el valor en un método, modificamos el original. Los nombres de las variables indican el alcance y no el tipo de variable.

El libro muestra una tabla con algunas convenciones para nombres de variables en Ruby. Como las de la presentación del curso es más extensa, hago un merge de ambos contenidos:

Tipo de variable Nombre
Variable local foo _bar _123
Variable de instancia @foo @_123
Variable de clase @@foo @@_123
Constantes CONTS Const
Variables globales $foo $_123 $Horse
Constantes de módulo Math::PI
Integers y Bignums (? Long) 1 2 3_000
Número punto flotante 1.0 3.0
Función de módulo Math::sin(x)
Símbolos :symbol :"A_Symbol"

Como ven el primer caracter del nombre de la variable determina cómo se va a usar. Seguido de este caracter, los nombres pueden contener cualquier letra, dígito o subguión, con la condición de que el caracter seguido de @ no puede ser un dígito.

Las variables de instancia y nombres de métodos se escriben en minúscula con subguión para separar palabras. Las clases siguen la misma convención que Java usando MixedCase. En el curso también muestran algo de expresiones regulares, arreglos y hash, pero como el libro cubre eso más adelante, lo dejo para después.

Strings

Hay muchas formas de crearlos en Ruby, siendo los string literals las más comunes: arreglo de caracteres entre comillas simples o dobles. Como en otros lenguajes, la diferencia entre ‘ y ” es el procesamiento realizado en la construcción del String. El más eficiente es la comilla simple, el valor del objeto es “literalmente” lo que se escribe.

Con las comillas dobles, Ruby procesa n poco más y busca substituciones como los caracteres de escape (\n y demás), y interpolación de expresiones. En el caso de secuencias “#{variable}”, se reemplaza este String con el valor de la variable variable.

Array y Hashes

En Ruby los Array y Hash son colecciones indexadas, guardan objetos accesibles a través de una llave. En el caso de los arreglos, la llave es un entero, mientras que los hash soportan cualquier objeto como índice.

#!/usr/bin/ruby
# -*- coding: utf-8 -*-
 
#Inicialización de array literal
a = ['Hola', 3, 'something, something, dark side...']
a[3] = 42
puts "El array se ve así: #{a.inspect}"
 
#Atajo para array de palabras (%w):
b = %w{ Luke Leia Han Chewie R2-D2 C3PO Lando }
puts "Contenido del array de palabras: #{b.inspect}"
 
#Ahora hashes:
 
c = {
  'nes' => 'Super Mario bros',
  'gb' => 'Super Mario land',
  'snes' => 'Super Mario world',
  'n64' => 'Super Mario 64',
  'gamecube' => 'Super Mario Sunshine',
  'wii' => 'Super Mario Galaxy',
  'nds' => 'New Super Mario Bros'
}
#Obviamente los keys deben ser únicos.
 
puts "Hash: #{c.inspect}"
 
p c['nes']
p c['n64']
p c['wii']
p c['n3ds']
 
#El método p funciona como puts pero muestra valores como nil explícitamente

Como venen el último ejemplo, al intentar a acceder a un elemento inexistente, Ruby devuelve el objeto nil. En Ruby null se representa con nil, un objeto que no representa nada. Además al usar nil en expresiones condicionales, su valor es false.

Voy dejando esta primera parte por acá para no hacer mucho más largo el post. Sigo estudiando por mi lado, y hago el repaso en el blog cuando vaya a postear. En el próximo post termino el segundo capítulo, mientras sigo estudiando el tercero.

Comparte: Twitter Identi.ca del.icio.us Google Bookmarks BarraPunto Bitacoras.com Tumblr Print Facebook

» Leer más, comentarios, etc...

Picando Código

Mortal Kombat Rebirth será una serie web de 10 episodios

Enero 24th, 2011 - [Enlace local]

Hace un tiempo publiqué sobre un corto: Mortal Kombat Rebirth. En el momento se especulaba que terminaría en película, pero al final se confirmó que el resultado será una serie web de 10 episodios. Nada indica que se llamará “Mortal Kombat Rebirth” como el corto, pero será dirigida por Kevin Tancharoen, el mismo director. Michael Jai White será el protagonista en el papel de Jax.

En febrero se empieza a filmar en la ciudad de Vancouver, aunque todavía no he encontrado la fecha del lanzamiento de la serie. Algunos personajes que serán presentados: Shang Tsung, Liu Kang, Sub Zero, Durak, Kabal, Kitana/Mileena y Scorpion.

Lo único que encontré respecto a la historia es que algunos terrestres lucharán para salvar al planeta de Shao Kahn y Shang Tsung, dos dioses de un universo paralelo, o algo parecido :P

Si sigue la calidad del corto, seguramente tenga un éxito importante. Si es así, nos aseguraremos algunos episodios más de Mortal Kombat en este formato.

Por si no han visto el video, acá lo repito:

Flawless Victory!

Via io9.com

Comparte: Twitter Identi.ca del.icio.us Google Bookmarks BarraPunto Bitacoras.com Tumblr Print Facebook

» Leer más, comentarios, etc...

Variable not found

Enlaces interesantes 27

Enero 23rd, 2011 - [Enlace local]

Estos son los enlaces publicados en Variable not found en Facebook y Twitter desde el lunes, 17 de enero de 2011 hasta el domingo, 23 de enero de 2011. Espero que te resulten interesantes. :-)

Y no olvides que puedes seguir esta información en vivo y en directo desde Variable not found en Facebook, o a través de Twitter.



Publicado en: Variable not found



» Leer más, comentarios, etc...

Ingenieria de Software / Software Engineering / Project Management / Business Process Management

Agilidad vs Tradicional

Enero 23rd, 2011 - [Enlace local]

Gracias a Proyectos Agiles encontre este post Planificación Agil vs Planificación tradicional, observar como maneja el artículo los Niveles (Estratégico, Táctico y Operativo)

» Leer más, comentarios, etc...

Picando Código

Quiero aprender Ruby

Enero 22nd, 2011 - [Enlace local]

Ruby

Ruby

Ya pasó el año 2010, y todavía no aprendí Ruby… Fui a RubyConf Uruguay, estuve en Rails For Zombies, miré videos del curso de Ruby On Rails de la Universidad de Berkeley y todavía no siento que aprendí mucho de Ruby.

Bueno, obviamente, he aprendido mucho de Ruby, Ruby On Rails, y demás. Pero todavía no estoy al nivel de decir “puedo programar en Ruby”. Digamos, como programador debería poder hacer un programa algo sencillo en Ruby, pero me falta un montón de contexto teórico para conocer bien el lenguaje.

De todas formas, todo eso (mucho o poco según cómo se lo mire) ha hecho que me guste mucho el lenguaje. Esto me motiva a obligarme a aprender, para así poder llegar a ser feliz programando como el resto de los programadores Ruby :)

Para solucionar el problema, hace poco aproveché la oferta del décimo aniversario de Programming Ruby 1.9, y tengo el libro en mis manos. Para darle continuidad a estos estudios, iré posteando en el blog a medida que vaya avanzando con el libro. Esto me va a generar cierto tipo de presión para seguir estudiando. Pido que si les interesa el tema, dejen su comentario cuando vean que hace mucho tiempo que no publico al respecto :P

También ire publicando si llego a hacer algún script/aplicación relevante, para poder sentirme práctico con el lenguaje.

Hacer públicos los conocimientos que vaya adquiriendo me van a ayudar no solo a re-estudiarlos, sino recibier algún feedback en los comentarios. Además dejar los apuntes en el blog me va a facilitar la tarea de repasarlos. Bueno, la aventura empieza, y para 2012 prometo “saber Ruby” como se debe…

Comparte: Twitter Identi.ca del.icio.us Google Bookmarks BarraPunto Bitacoras.com Tumblr Print Facebook

» Leer más, comentarios, etc...

Bitácora de Javier Gutiérrez Chamorro (Guti)

Irfanview

Enero 22nd, 2011 - [Enlace local]

Durante años he estado más que satisfecho con XnView, sin embargo, la evolución que está por venir, XnViewMP, no es de mi agrado. Se basa en el uso de Qt para la creación de una interfaz de usuario multiplataforma, que al final hace que la instalación mínima del programa sean 50 Mb. de espacio en [...]

» Leer más, comentarios, etc...

Buayacorp

Humans.txt: somos personas, no máquinas

Enero 22nd, 2011 - [Enlace local]

Una iniciativa para conocer a los creadores de un sitio web.

Humans.txt

Generalmente creamos archivos robots.txt para ser reconocidos y controlar cierta información para los buscadores. Pero ¿Por qué no poner información de los autores del sitio?

¿Qué tengo que hacer?

La iniciativa propone crear un archivo humans.txt en la raiz de nuestro sitio y añadir en :

HTML:
 type="text/plain" rel="author" href="http://domain/humans.txt" />

El contenido de este archivo de texto sería algo como esto:

CODE:
 
/* TEAM */
	Chief: Alex Concha
	Contact: alex [at] buayacorp.com
	From: Cusco, Perú
 
	Slave: Braulio Soncco
	Contact: braulio [at] buayacorp.com
	From: Cusco, Perú
 
 
/* SITE */
	Last update: 2011/01/22
	Language: Spanish
	Doctype: XHTML with CSS
	Tools: WordPress, PHP
	IDE: Various

Una excelente iniciativa que podemos adoptar.

» Leer más, comentarios, etc...

MadeInFlex

Cairngorm 3 Overview

Enero 22nd, 2011 - [Enlace local]

Ahora que Cairngorm 3 desde hace un tiempo ya es una realidad, on este artículo queremos mostrar que es, que nos aporta respecto a sus versiones anteriores y daremos un vistazo a su evolución.

Las versiones anteriores de Cairngorm se basaban en una implementación específica del patrón Model-View-Controller, en cambio Cairngorm 3, debido a la experiencia, quiere darnos una serie de guías, buenas prácticas y nos aporta unas librerías y herramientas para ayudarnos en el desarrollo.
Esto implica que el paso de Cairngorm 2 a 3 no sea un simple un cambio de versión si no un cambio de paradigma.

El objetivo de Cairngorm 3 es dar unas bases para conseguir unos desarrollos limpios, consistentes, testeables y fácilmente escalables.

Arquitectura de Cairngorm

Para aproximarnos a un diseño simple y testeable, Cairngorm recomienda una arquitectura concreta para las aplicaciones Flex. Esta arquitectura tiene como objetivo que la estructura de la aplicación se desglose en pequeñas unidades de funcionalidad.

Antes de ver la separación arquitectural, entendamos como concibe Cairngorm una aplicación. Está compuesta de 3 capas de alto nivel:

Capas de Arquitectura

Las clases con diferentes tipos de responsabilidad en las diferentes capas, pueden cambiarse separadamente por otras. De esta manera, si el diseño visual necesita ser ajustado, la mayoría de los cambios se limitan a clases de la capa de presentación y no a otras partes del código.

Cairngorm recomienda esta separación de capas según la responsabilidad general de cada una de ellas:

En la siguiente figura vemos la jerarquía de capas. De arriba hacia abajo, la comunicación entre una capa y su contigua es directa; en dirección contraria, la comunicación se realiza mediante eventos, callback functions u otras soluciones similares.
layers

Áreas funcionales

Las aplicaciones se suelen dividir en diferentes áreas funcionales. La codificación de cada área funcional suele estar agrupada y separada de otras áreas funcionales, para que así sean desarrolladas y probadas de manera independiente. Podemos tener una aplicación de ejemplo que esté compuesta por tres áreas funcionales: contactos, mensajes y gastos. Entonces, cada una de estas áreas es subdividida según las distintas capas de arquitectura, según sea conveniente, como podemos ver en la siguiente imagen:
areas-funcionales

Cada área funcional suele estar contenida en un package. Ciertas áreas funcionales, según su grado de relación, pueden estar contenidas en un proyecto separado y así extraerse en módulos. El código que suele usarse en diferentes partes de la aplicación, como componentes, suelen ponerse dentro de un proyecto de librería.

Las áreas funcionales suelen tener sus capas de presentación y aplicación. A menudo contienen sus propias capas de dominio, pero otras veces comparten conocimiento del modelo de dominio de otras áreas. En este caso, estos modelos de dominio suelen ser encapsulados en proyectos de librería. Las áreas funcionales pueden interactuar con otras mediante interfaces y eventos AS3.

Capa de presentación

Presentation Model

Una de las cosas que nos recomienda Cairngorm 3 es tender a minimizar el código dentro de los mxml. Si es posible debemos intentar no tener código ni funciones, así las vistas reducen su tamaño y se centran solo en la disposición de sus componentes; haciendo más fácil la lectura.

La manera de hacerlo es extrayendo las variables y funciones que estarían en el Script-block en presentation models.
Cada componente o vista MXML significativa debe tener su propio presentation model. El PM se centra en el estado y comportamiento requeridos para representar los datos en la vista.

Un PM no debe saber nada de otro, ni de la vista relacionada ni de qué sirve a la aplicación. Un PM no debe tener referencia a la vista a la cual sirve, sino que es la vista que observa al PM relacionado. La comunicación entre ambos se realiza mediante Bindings o eventos.

Con esta aproximación minimizamos los errores en la vista y la lógica se localiza en el PM, que es fácilmente testeable.

Coordinación entre PMs

Cairngorm nos muestra dos entidades para coordinar los presentation models con otras entidades: Presenter y Controller. A continuación los vemos con mayor detalle.

Presenters

Su ámbito se centra en la capa de presentación. Se encarga de la coordinación local entre Presentation Models de una misma área funcional o de una región de ésta. Entendemos pues que su rol está por encima de los PMs.

Sus principales objetivos son:

Desacoplar la presentación del Dominio
presenter1

Coordinación de PMs
presenter2
Como vemos en la figura anterior, reducen el acoplamiento entre PMs y los domains, escuchando eventos procedentes de los domains y comunicándolos a los PMs.

También son usados para manejar los eventos procedentes de PMs y delegarlos a otros PMs.
Las razones que nos pueden motivar a usar Presenters son:

Controllers

Los Controllers se sitúan en la capa de Application. Tienen la responsabilidad de gestionar la coordinación general de los Presenters, no en un ámbito local, sino más global de un grupo específico de PMs. Se encargan de:

controller

En situaciones determinadas, los PMs pueden comunicarse directamente con los objetos de dominio y recibir sus cambios mediante eventos, como podemos ver en la siguiente figura:
pm-dm

Aplicaciones Modulares

La modularidad va más allá de los conceptos de Flex Module y ModuleLoader. Implica la separación de aplicaciones en unidades pequeñas que pueden ser desarrolladas y testeadas independientemente.

Beneficios de la Modularización

Modularización y Cairngorm 3

Como hemos visto, una de las claves de Cairngorm 3 es separa las aplicaciones en diferentes áreas funcionales que pueden ser desarrolladas independientemente; viene a ser una arquitectura modular, donde cada área funcional sería un módulo. Cairngorm recomienda que la comunicación entre las distintas áreas funcionales se haga mediante APIs definidas por interfaces, eventos y DTOs. Así minimizamos las dependencias entre las distintas áreas.

Tendencia hacia el bajo acoplamiento

Cairngorm 3 da mucha importancia a que las capas arquitecturales tengan un mínimo acoplamiento, asumiendo que cada capa cambia por motivos diferentes. Con un bajo acoplamiento en las distintas capas, éstas pueden tolerar mejor el cambio. Por otro lado, el bajo acoplamiento tiene un precio: cuanto menos acoplado esté un objeto a otro, se incrementa la dificultad de lectura.
Hay distintas opciones para conseguir un bajo acoplamiento que los desarrolladores deben tener en cuenta.

Opciones para construir, recuperar y aislar objetos

La manera en que creamos, recuperamos o aislamos los objetos en una aplicación Flex, es un aspecto importante.
Por ejemplo, creando un objeto de dominio dentro de un PM, provocamos una dependencia directa. Implica que el objeto queda aislado y si otra parte de la aplicación requiere este objeto, no tendrá acceso directo para consultarlo.

Además con esta dependencia forzada con el objeto de modelo dentro del PM, estamos atando fuertemente la capa de presentación a una implementación concreta del dominio. Con una interface del dominio y usando eventos, podemos bajar el acoplamiento, desacoplando las capas arquitecturales.

La implementación de un objeto de dominio no puede cambiarse sin cambiar la implementación del PM, lo cual puede restringir la flexibilidad de la aplicación.
Los objetos de modelo tienen un significado a más alto nivel que el PM. Cuando el dominio puede abstraerse y controlarse con objetos de más alto nivel, conseguimos una inversión de control, que se opone a la aproximación usual de que objetos de bajo nivel controlan a otros.

Opciones de separación de la construcción y comportamiento de los objetos

Puede ser muy incómodo para el PM substituir el objeto de dominio con una implementación diferente cuando el PM crea al objeto de dominio. Puede también ser muy incómodo el hecho de recuperar una misma instancia del dominio en un determinado lugar de la aplicación. Tenemos diferentes opciones de separar la creación del comportamiento de un objeto para simplificarlo, a continuación mostramos las dos más comunes.

Librerías que nos proporciona Cairngorm

Cairngorm 3 proporciona diferentes librerías, alguna de ellas construidas sobre frameworks existentes como Parsley, Swiz y Spring ActionScript.
Estas librerías son interesantes, tenemos librerías para validación, para la gestión de popups, de navegación, gestión de módulos, etc. Recomiendo que leáis este apartado para que veáis que nos proporciona.

Para entender más como funciona Cairgorm 3 y los distintos conceptos, es necesario mirar y analizar un poco el código de las aplicaciones de ejemplo.

La información de Cairngorm 3 está en este link.

» Leer más, comentarios, etc...

Picando Código

Google TV

Enero 21st, 2011 - [Enlace local]

Google TV

Google TV

Hoy tuvimos una Open Talk en la oficina de Globant sobre Google TV. Estuvo a cargo de Esteban Lussich y Andrés Levin.

Esteban nos presentó la charla en las oficinas, mientras que Andrés estuvo en contacto a través de Skype ya que se encuentra on-site en Google.

Fue bastante interesante, por suerte la comunicación fue muy fluída y ambos pudieron exponer determinados puntos.

La charla despertó mi interés en Google TV y me hizo ver el potencial en la plataforma. Así que decidí darle un poco de continuidad al tema publicando al respecto.

A nivel de la arquitectura

Se trata de un sistema que integra el sistema operativo Android con el navegador web Google Chrome. Obviamente todo modificado y “tuneado” – como decía la presentación – para la plataforma TV.

Android provee la base para crear aplicaciones extendiendo la funcionalidad del sistema. Esta apuesta de Google ayuda a fortalecer la plataforma Android. Le da a los desarrolladores un mayor alcance al programar sus aplicaciones para Android, así como un nuevo nicho en el cual explotar su creatividad.

Por otro lado Chrome es la puerta a los contenidos en internet, permitiendo la navegación de sitios web y transmisión de TV. Otra apuesta de Google para darle énfasis al camino por el que quiere llevar a la web en el futuro.

Todo esto podría sonar a un indicio de la posible fusión entre Android y Chrome OS.

Hardware

El hardware se presenta de dos maneras:

El dispositivo para interactuar con Google TV no es un teclado, ni un control remoto, ni un mouse. Es una mezcla de estos tres. Las versiones que hay hasta ahora son parecidas a un teclado inalámbrico con trackpad o touchpad. Éstos hacen de “mouse”, pero como explicaba Esteban, la precisión a 3 metros de distancia es bastante compleja (o inexistente).

Por esto, la interfaz está orientada a ser manejada con el D-Pad, la clásica “cruz” de los controles de videojuegos. Esta forma de trabajo ya está probada y es bastante simple y familiar para la mayoría de los usuarios. Pero también presenta un nuevo reto para los desarrolladores que elijan tener aplicaciones o sitios web compatibles.

A nivel de desarrollo

El “reto” es transformar los contenidos web en algo accesible con la interfaz denominada 10 feet UI, o interfaz de usuario de 10 pies (3 metros).  Se refiere a una GUI para un televisor o pantalla similar, en la que el usuario se encuentra a una distancia considerable de la pantalla.

Esto implica que los elementos (botones, texto, imágenes) deben mostrarse en un tamaño suficientemente grandes para ser identificados a la distancia. Los sitios web y aplicaciones no deberían hacer uso de scroll ni incluir demasiado texto ya que esto cansaría la vista. Esta interfaz exige un cierto nivel de simplicidad y una cantidad reducida de elementos en pantalla.

El uso de Google Chrome como navegador web le da a los desarrolladores la posibilidad de desarrollar en un ambiente web con las ventajas de un navegador moderno como Chrome:

La experiencia comentada se basó en este punto, donde se desarrollaron herramientas para interactuar con los dispositivos de Hardware y demás. Iba a haber una demo pero por algunos problemas de red, no pudimos presenciarla, pero quedó pendiente para otra ocasión.

Redondeando…

Resumiendo puedo decir que me resultó una plataforma muy interesante. Como decía, motivó mi interés el haber escuchado un poco del tema por gente que trabajó en la parte técnica. Parece que Google le va a hacer una competencia directa a Apple TV. Solo que, así como pasa en el terreno de los teléfonos móviles, los paradigmas de desarrollo y modelo de negocios (en cuanto a desarrollo de los dispositivos integrados) son distintos.

Lo bueno de esta competencia es que al existir al menos dos proveedores grandes, existe competencia intensa que obligará a los involucrados a mejorar constantemente para no quedarse obsoletos. Me parece que habrá que darle tiempo a esto para que tome relevancia. Pero viendo que Apple y Google apuestan a este híbrido entre televisión y computador personal, podríamos suponer que Internet TV será el estándar de acá a un tiempo en vez de la vieja y olvidada televisión.

Agrego que en la charla también se comentó un poco el gran tema: ¿Cómo es la vida en Google? Probablemente la mayoría de los que trabajamos en este ámbito hemos visto fotos y leído cómo es trabajar en Google. Pero tiene un agregado especial escucharlo de alguien que lo vivió y nos puede contar de primera mano (y podemos hacerle preguntas) cómo fue su experiencia.

Más info:

Comparte: Twitter Identi.ca del.icio.us Google Bookmarks BarraPunto Bitacoras.com Tumblr Print Facebook

» Leer más, comentarios, etc...

Buayacorp

Drupal Summit Latino 2011 – Lima, Peru

Enero 21st, 2011 - [Enlace local]

Por fin podemos anunciar oficialmente el lanzamiento del mayor evento Drupal del año: "Drupal Summit Latino – Lima 2011".

Lima (Perú) alojará el primer evento a nivel latinoamericano dedicado a Drupal los días 27, 28 y 29 de Enero de 2011.

Habrán 36 conferencias dictadas por reconocidos y experimentados drupaleros provenientes de varios países de América Latina, Estados Unidos y Europa.

Se espera la presencia de más de 300 participantes lo que será sin duda alguna, a nivel continental, la mayor concentración jamás vista de experiencia y conocimiento sobre el software de publicación de sitios Web más exitoso del momento: Drupal por supuesto!

Concurso Drupal en tu vida

El evento será la oportunidad de premiar a la mejor fotografía Drupal del año en nuestro continente. El ganador será elegido por la comunidad en el sitio del evento y será premiado con un pack de libros en castellano de la colección Aprende Drupal 6 (Inicial + Intermedio + Avanzado) de FORCONTU.

Así que ingresa al sitio del evento - ! PARTICIPA y GANA !

Keynotes

Como si fuera poco, tendremos también 3 KEYNOTES de infarto! Fran Gil (España), Felix Delattre - xamanu (Alemania) y Fernando P. García – develCuy (Perú) nos hablarán de los temas más candentes del presente y del futuro de Drupal.

! Eso sí que no te lo puedes perder !

Sorteo Curso On-Line FORCONTU durante el evento

Además durante el evento, se sorteará entre todos los participantes un curso integral online de creación y gestión de portales web con Drupal 6 (300 horas de formación online tutorizada, en un período de 5 meses) de FORCONTU.

No pierdas esta increíble oportunidad ! inscríbete ya !

Más información en http://lima2011.drupal-latino.org

» Leer más, comentarios, etc...

Monocaffe

Central GNU Screen/SSH Server

Enero 20th, 2011 - [Enlace local]

I'm not going to explain why screen is such a great tool because it's and there are many blogs who will tell you so. What I'm going to explain is how you can use screen to setup a central server to manage and monitor who connects to your servers and what do they do.

Screen has the special ability that allows us to log and connect to running sessions. This becomes handy in our current objective: setting up a central server where all users must connect so they can connect to other servers.

The idea is pretty basic and has lots of advantages:



Of course, there are some disadvantages:



First, we need to setup a single server with the following:



  1. SSH Client
  2. GNU Screen
  3. User account for each user (limit the user's group using quotas)
  4. Common user account on each server you wish to connect to (i.e. foo)
You have your screen server, and on each server you have a user (i.e. foo) with the same password (i.e. bar123). Now secure you SSH configuration by allowing access only from the screen server to the foo user (and admin just in case):

# /etc/hosts.allow

sshd: 192.168.0.2/255.255.255.0

sshd: 192.168.0.3/255.255.255.0

# /etc/hosts.deny

sshd: ALL

# /etc/ssh/sshd_config

AllowUsers foo admin

PermitRootLogin no
Your users should be able now to:



  1. Connect to the screen server using someuser@screenserver
  2. Connect to your servers only from the new screen server using foo@webserver

Use some screen magic

If you include screen in this whole setup, you'll be able to log user activity in the servers by correctly configuring screen. First, add the following configuration to /etc/screenrc:



# Scrolling

defscrollback 1500

termcapinfo xterm* ti@:te@



# Detach on close

autodetach on



# Disable key binds

bind H echo "Disabled" # Don't allow the user to disable logging

bind d echo "Disabled" # Don't allow to detach

bind ^d echo "Disabled" # Don't allow to detach

bind c echo "Disabled" # Don't allow to create

bind ^c echo "Disabled" # Don't allow to create

bind S echo "Disabled" # Don't allow to split

bind : echo "Disabled" # Don't allow to issue commands



# no startup msg

startup_message off



# Logging

deflog on

logtstamp on

logfile /tmp/screen-logs/%t-%Y%m%d-%n.log


On each user's home folder, create an empty .screenrc file. This file should be owned by root with read only permits (since you don't want the users to modify it). This way, no user will be able to override the general configuration.



Next, download the manager.sh script and add your servers:



servers=(

"foo@bar1"

"foo@bar2"

"foo@bar3"

)


This script allows a user to select a server from the given list and launchs a ssh session inside a screen session:

 /usr/bin/screen -S user.bar1 -t user.bar1 /usr/bin/ssh foo@bar1 


Since you're controlling and monitoring all the screen sessions, you can easily know what the users are doing on each server by watching the log files: user-20110116-0.log



Well, I hope this is useful for someone else. Leave a comment for any suggestions.

» Leer más, comentarios, etc...

Fetishcode

Programa de Talleres OFM 11g

Enero 20th, 2011 - [Enlace local]

A

» Leer más, comentarios, etc...

Bitácora de Javier Gutiérrez Chamorro (Guti)

Q-Dir

Enero 20th, 2011 - [Enlace local]

Quad Explorer for Windows, o simplente Q-Dir, es un poco conocido gestor de archivos gratuito, que tanto dispone de versión nativa x64 para equipos de última generación, como de versión ANSI x86 para Windows 95, 98 y ME, pasando por la versión unicode para 2000, XP, Vista, 7 de 32 bits. Permite mostrar en una [...]

» Leer más, comentarios, etc...

xailer.info (esp)

xEdit 2.2

Enero 20th, 2011 - [Enlace local]

Estimados usuarios de Harbour y xHarbour,

Acabamos de actualizar xEdit,  nuestro entorno de desarrollo gratuito para Harbour y xHabour, incluyendo el soporte de subproyectos y nuevas barras de herramientas que hacen aún más fácil su uso.

Podéis descargar la nueva versión desde nuestra Web de descargas en:

http://www.xailer.com/download

Un saludo

[El equipo de Xailer]

» Leer más, comentarios, etc...

Arragonán

Conseguir un billón

Enero 20th, 2011 - [Enlace local]

Ok, o mil millones ;)

getabillion

Genial, como siempre geek & poke :D

Me ha hecho gracia y me viene al pelo para recomendar algunos posts sobre “emprendeduría” (menudo palabro…), que vienen a poner un poco los pies en el suelo.

Los de Martín Pérez sobre los mitos de emprender desde su(nuestra) experiencia con Jobsket, el de Alberto Molpeceres de bootstraping de Linking Paths, el de Manuel Recena que habla también de su experiencia con klicapy el blog de Iago Soto en general.

Y sí, como podéis ver tengo poco tiempo y pocas ganas de escribir últimamente :P . Pero bueno, quizás algún día me da el punto y hasta me animo a soltar alguna historia del tema.

» Leer más, comentarios, etc...

Fetishcode

Desinstalar JDeveloper 11g sobre Ubuntu.

Enero 19th, 2011 - [Enlace local]

A

» Leer más, comentarios, etc...

Picando Código

Globant Montevideo está contratando: Desarrolladores Java y Microsoft

Enero 19th, 2011 - [Enlace local]

Globant

Globant

Globant Montevideo está buscando:

Desarrolladores Java:

Desarrolladores Microsoft:

Interesados mandar mail con Curriculum a bernardo.manzella@globant.com.

Comparte: Twitter Identi.ca del.icio.us Google Bookmarks BarraPunto Bitacoras.com Tumblr Print Facebook

» Leer más, comentarios, etc...

Variable not found

ObjectInfo y ServerInfo en MVC 3

Enero 19th, 2011 - [Enlace local]

ASP.NET MVCEn el nuevo ASP.NET MVC 3 me he topado con dos helpers que no conocía y que, a pesar de su sencillez, en ocasiones pueden resultar bastante interesantes: ObjectInfo y ServerInfo. Vamos a verlos muy rápidamente.



ObjectInfo



El primero de ellos puede sernos útil cuando queremos volcar el contenido completo de un objeto sobre la página, por ejemplo cuando estemos depurando. La forma general de utilización es la siguiente:



ObjectInfo.Print(objeto, profundidad, elementos_enumeracion)


Los parámetros son:

Un ejemplo (con el motor WebForms):





<%: ObjectInfo.Print(Model, 2, 5) %>


El resultado será un contenido HTML maquetado de forma que pueda apreciarse muy claramente el contenido del objeto. En la siguiente captura de pantalla se observa el resultado, teniendo en cuenta que hemos enviado al helper un objeto que contiene un enumerable de Personas :


Resultado de ObjectInfo.Print()


ServerInfo



Por otra parte, el helper ServerInfo muestra información sobre el servidor en el que se está ejecutando la aplicación: configuración y variables de servidor, información del runtime y variables de entorno.



Su único método, que además no tiene parámetros, retorna el string HTML listo para ser incluido en la salida, por ejemplo así (en Razor):





@ServerInfo.GetHtml()


Y el resultado sería como el que sigue:



Resultado de ServerInfo.GetHtml()




Publicado en: Variable not found.



» Leer más, comentarios, etc...

Ingenieria de Software / Software Engineering / Project Management / Business Process Management

SAP CRM

Enero 18th, 2011 - [Enlace local]

Top 10 post de SAP CRM  directo desde SCN (SAP Community Network), intersantes temas como:

» Leer más, comentarios, etc...

Monocaffe

Adding Tags to your Tags

Enero 18th, 2011 - [Enlace local]

I'm working on a Plugin to allow for Grails to easily draw HTML5 Graphs using the RGraph library. The problem with this plugin is that we have to provide a lot of attributes for any given tag to work, for example, the Rose Chart:



<rgraph:rose name="rosetest"

title="Rose Chart Test"

values="[1, 2, 3]"

tooltips="['Fred', 'Rich', 'Alex']"

zoom="true"

width="500" height="500"/>


The code for this tag was the following:



def rose = { attrs ->

draw(new Rose(attrs))

}


But this is what I wanted:



<rgraph:rose title="Rose Chart Test" zoom="true">

<rgraph:attribute name="rosetest2"/>

<rgraph:attribute values="[1, 2, 3,]"/>

<rgraph:attribute tooltips="['Fred', 'Rich', 'Alex']"/>

<rgraph:attribute width="500"/>

<rgraph:attribute height="500"/>

<rgraph:rose>


My objective is to be able to use a map given by the controller to draw the whole thing in three lines of code. But first, to acomplish this, we need to create a new tag named attribute which saves the given attribute to the page scope:



def attribute = { attrs ->

this.pageScope.attrs << attrs

}


Now we modify our tags to look like:



def rose = { attrs, body ->

attrs << initTag(body)

draw(new Rose(attrs))

}


This new method initTag is for DRY:



def initTag(def body){

this.pageScope.attrs = [:]

body()

return this.pageScope.attrs

}


Here initTag instantiates a new map in the attrs key in the page scope. Then, the body is executed, which continues processing the tags inside the rose tag and reads all the attribute tags. Each attribute tag simply saves the given attributes to the scope. Finally, when all attribute tags are read, initTag method returns all the attributes to the tags attrs variable, which is used to instantiate a new Rose object used to paint the JavaScript code.



function rosetestRGraphDraw(){

var rosetest = new RGraph.Rose('rosetest', [1, 2, 3]);

rosetest.Set('chart.zoom', true);

rosetest.Set('chart.width', 500);

rosetest.Set('chart.tooltips', ["Fred", "Rich", "Alex"]);

rosetest.Set('chart.title', "Rose Chart Test");

rosetest.Set('chart.height', 500);

rosetest.Draw();

}



Now, this works, but what if I wanted to, instead of putting each attribute by it's own, to have the controller return a map with all the data I need and use the g:each tag. Then, we need to modify the attribute tag like this:



def attribute = { attrs ->

def m = [:]

m.put attrs.name, attrs.value

this.pageScope.attrs << m

}


<rgraph:rose title="Rose Chart Test 2" zoom="true">

<rgraph:attribute name="name" value="rosetest2"/>

<rgraph:attribute name="values" value="[1, 2, 3]"/>

<rgraph:attribute name="tooltips" value="['Fred', 'Rich', 'Alex']"/>

<rgraph:attribute name="width" value="500"/>

<rgraph:attribute name="height" value="500"/>

</rgraph:rose>


The HTML might not be so nice this way, but now we can do this:



<rgraph:rose title="Rose Chart Test 2" zoom="true">

<g:each in="${someMap}" var="${entry}">

<rgraph:attribute name="${entry.key}" value="${entry.value}"/>

</g:each>

</rgraph:rose>

» Leer más, comentarios, etc...

Información legal y técnica