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.
» 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.
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:
» Leer más, comentarios, etc...
Variable not found
Acceso a datos con .NET Framework 4: nuevo curso en CampusMVP
Enero 25th, 2011 - [Enlace local]

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:
Introducción, donde hacemos una breve presentación del curso y una rápida revisión de las tecnologías de acceso a datos incluidas en .NET Framework 4 y que iremos desgranando a lo largo del curso.- El núcleo de ADO.NET, donde comenzamos desde cero tratando temas básicos como conexiones, comandos de consulta y actualización, o transacciones, hasta profundizar en asuntos algo más avanzados como la encriptación de cadenas de conexión, comandos asíncronos, MARS, el uso del LTM, técnicas de control de concurrencia, la abstracción del origen de datos usando factorías de proveedores, y muchos otros temas.
- Uso de DataSets, la solución clásica para la gestión de datos desconectados que sigue siendo válida en determinados escenarios. En este módulo detallaremos el proceso de definición de conjuntos de datos en memoria (tablas, columnas, restricciones, etc.), la carga desde fuentes de datos externas usando adaptadores, fórmulas para la realización de consultas, actualización de datos en memoria y traslado a la base de datos relacional, la gestión de conflictos, la relación con XML, o la tecnología LINQ To DataSet, entre otros temas.
- Entity Framework, donde partiremos de la descripción arquitectural del marco de entidades e iremos profundizando progresivamente en sus distintos componentes de forma práctica:
- En El EDM, trataremos la creación y personalización del Entity Data Model, desde escenarios de mapeo simples hasta el modelado de herencia, el uso de tipos complejos o el mapeo avanzado de entidades.
- La sección Entity Client describe las interioridades de este proveedor de acceso a datos a través de los modelos conceptuales. Veremos su paralelismo con otros data providers y aprenderemos a utilizar sus conexiones, a crear consultas utilizando el lenguaje eSQL, y a recuperar los datos obtenidos en ellas.
- A continuación, estudiaremos Object Services y el papel fundamental que juega en la arquitectura de Entity Framework. Veremos el contexto de objetos, las fórmulas para la realización de consultas fuertemente tipadas sobre el modelo conceptual, y trataremos otras funciones vitales, como la materialización de entidades, la resolución de identidad o el seguimiento de estado.
- Descrita ya toda la infraestructura, entraremos en LINQ to Entities, la extensión de LINQ que nos permite realizar consultas integradas sobre los modelos conceptuales.
- También dedicaremos varios temas a describir en detalle cómo realizar operaciones de actualización del origen de datos utilizando Object Services (inserción, actualización, y eliminación), y deteniéndonos a tratar aspectos como la transaccionalidad, los problemas de concurrencia o el uso de objetos desconectados.
- Por último, dedicaremos varios capítulos a la personalización de contextos y entidades mediante el uso de plantillas T4, la creación de STE (Self-Tracking Entities) y el uso de objetos POCO (Plan Old CLR Objects).
- El siguiente módulo, LINQ to SQL, trataremos esta tecnología que, aunque ampliamente superada por Entity Framework, puede ser de utilidad en escenarios simples (bueno, y entra en el examen 70-516 ;-)). Veremos cómo crear modelos de objetos, su personalización y aprenderemos a utilizar el contexto de datos para la realización de consultas mediante LINQ, así como a actualizar el origen de datos gestionando los posibles problemas de concurrencia que pueden aparecer, pasando por aspectos como la transaccionalidad de las operaciones, o el uso de objetos desconectados.
- En WCF Data Services detallaremos el uso de servicios WCF de acceso a datos utilizando OData (Open Data Protocol). Comenzaremos creando servicios y configurándolos para permitir el acceso a datos utilizando la semántica REST, y veremos cómo acceder a ellos de forma directa y utilizando las librerías cliente, tanto para consultar como para actualizar datos. También, entre otros asuntos, estudiaremos la creación de interceptores, operaciones personalizadas, y veremos cómo realizar operaciones asíncronas.
- Terminando ya con el temario, realizaremos una introducción a Sync Framework, el marco de trabajo que nos permite implementar escenarios OCA (Ocassionally Connected Applications) mediante el uso de una base de datos local capaz de sincronizarse con otras fuentes de datos. Veremos cómo crear y configurar cachés locales, tanto en escenarios locales como distribuidos, y estudiaremos las operaciones de sincronización y el tratamiento de conflictos.
- Y por último, una Guía del Examen, que incluye valiosos consejos y trucos vistas a superar el examen de certificación.
- C# 3.0 y LINQ, del maestro Octavio Hernández.
- Entity Framework 4.0, del gran Unai Zorrilla, y que ya comenté por aquí hace unas semanas.
- El whitepaper Comenzando con OData, del único e inigualable José Miguel Torres (que puedes leer online aquí).
- Además, al acabar el curso, también se suministrará el temario completo en formato PDF, lo que permitirá su consulta en el futuro, incluso habiendo finalizado el periodo de formación.
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]
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...
Picando Código
Leyendo Pickaxe: Ruby básico
Enero 24th, 2011 - [Enlace local]
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á
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:
» 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
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:
» 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. :-)
- Recuperar datos de una cookie en cada petición usando Action Filters. ASP.NET MVC, por Eduard Tomás
Fecha: 19/01/2011 - Action filters globales configurables en el web.config, con ASP.NET MVC 3, by K. Scott Allen.
Fecha: 19/01/2011 - EasyHttp, un wrapper de webrequest que facilita el consumo de servicios REST, by Hadi Hariri.
Fecha: 19/01/2011 - El rendimiento de ASP.NET MVC 3, más o menos igual que el de la versión 2.
Fecha: 19/01/2011 - Qué bueno: Sitios autoactualizables utilizando Nuget, by Phil Haack.
Fecha: 19/01/2011 - Ejecución de aplicaciones ASP.NET MVC 3 en servidores que no tienen el framework instalado, by Scott Guthrie.
Fecha: 19/01/2011 - EF 4 + CTP 5 = Code First: Conventions IV, by Unai zorrila.
Fecha: 19/01/2011
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]
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
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:
» 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.

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
: type="text/plain" rel="author" href="http://domain/humans.txt" />El contenido de este archivo de texto sería algo como esto:
/* 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: responsables de separar las clases según su responsabilidad
- Áreas funcionales: agrupan clases que atañen el mismo ámbito funcional
- Patrones de diseño: nos permiten coordinar los objetos de manera consistente
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:
- Presentation: se encarga de la apariencia visual y del comportamiento de la presentación. Cairngorm recomienda el uso del patrón de presentación Presentation Model, que se encarga de controlar el estado y comportamiento de la capa de visualización.
- Application: coordina la presentación y la infraestructura de componentes. Coordina los componentes de distintas capas y los enlaza con los Domain Objects mediante el concepto de Controller que ya veremos.
- Domain: se centra en las tareas sobre el modelo de negocio. Representa una abstracción del mundo real mediante un modelo de datos. Sus responsabilidades suelen ser: la validación, cálculos sobre los datos, filtro, ordenación y formateo de datos…
- Infrastructure: coordina los objetos y su integración con otros sistemas, como el servidor y sus servicios remotos.
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.

Á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:

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

Coordinación de PMs

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:
- Facilitan la lectura y control a alto nivel de la coordinación entre PMs
- Se encargan de asegurar el orden en la gestión de los eventos lanzados por los distintos PMs, ya que los mecanismos de mensajería, normalmente no suelen definir un orden
- Evitan el código de gestión de eventos (event-handling) en cada PM para escuchar a las peticiones de los otros
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:
- Traducir los eventos procedentes de un área funcional a eventos de otras áreas funcionales
- Interceptar eventos a nivel de aplicación
- Traducir los eventos de aplicación a llamadas de la API de dominio con la finalidad de mantener los objetos de dominio libres de cualquier conocimiento relacionado con otras capas arquitecturales
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:

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
- Un modulo puede ser desarrollado, y probado con una relativa independencia
- Los tiempos de compilación se minimizan, ya que los cambios en un módulo no requieren de otros módulos
- Los módulos pueden ser cargados bajo demanda, lo que hace que la carga inicial de la aplicación es mucho menor
- Si un usuario no usa un determinado módulo, no es necesario cargarlo
- Se pueden cargar diferentes módulos para distintos usuarios, según sus privilegios
- Un modulo es más fácil de entender y mantener que una aplicación monolítica, consiguiendo una mejor cohesión funcional
- La interacción entre módulos puede determinarse con APIs, independientemente del crecimiento de la aplicació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.
- Aproximación transversal: El modelo de dominio se instancia en el PM o Vista de más alto nivel y se va propagando jerárquicamente a las subvistas o PMs relacionados.
- Aproximación con framework de IoC: Se responsabilizan de la construcción de los objetos. El desarrollador especifica los objetos que se necesitan en el container de IoC.
Así el framework IoC puede proporcionar estos objetos mediante inyección de dependencias o dependency lookup.
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]
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:
- Integrado en una TV: Por el momento, existe un modelo de HDTV Sony – Sony Internet TV - que viene con el firmware integrado.
- Dispositivo separado: Se trata de dispositivos que podemos conectar a la TV. Hay al menos dos presentaciones en el mercado actualmente:
- Logitech Revue: Un dispositivo que conectamos a la TV y obviamente a un módem o router para acceder a Internet para obtener la funcionalidad del sistema.
- Sony Internet Blu-ray: Un reproductor de Blu-ray que integra Google TV.
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:
- HTML5: si no tiene implementada toda la especificación, de todas formas anda cerca.
- CSS3
- Mucho JavaScript: El motor de JavaScript de Google Chrome es de los mas rápidos que existen.
- Flash: También permite la reproducción de contenidos Flash, aunque no funciona demasiado bien, hay optimizaciones recientes en la reproducción de video que serían el principal objetivo de esta tecnología.
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:
» 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:
- No user management for each server
- Users know only one, easily changed password for all servers
- Greater control of user actions
- Monitor unscheduled access
- Log user activity
- Single point of failure
- Single point of entrance
- Can become a pain when transfering files
- SSH Client
- GNU Screen
- User account for each user (limit the user's group using quotas)
- Common user account on each server you wish to connect to (i.e. foo)
# /etc/hosts.allowYour users should be able now to:
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
- Connect to the screen server using someuser@screenserver
- 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
Genial, como siempre geek & poke
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
. 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 Montevideo está buscando:
Desarrolladores Java:
- JSF y Spring, preferentemente UI y con ¡buen ingles! Semi Senior para arriba.
- Un arquitecto con Hibernate, Spring y Maven.
Desarrolladores Microsoft:
- Seniors o Arquitectos en .NET (3.5 y 4.0) muy fuertes en SQL y preferentemente con WPF. Ingles AVANZADO.
- Sharepoint Seniors
Interesados mandar mail con Curriculum a bernardo.manzella@globant.com.
Comparte:
» Leer más, comentarios, etc...
Variable not found
ObjectInfo y ServerInfo en MVC 3
Enero 19th, 2011 - [Enlace local]
En 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)
objeto, que es el objeto que queremos volcar.profundidad, el número de niveles en caso de tratarse de objetos cuyas propiedades son, a su vez, otros objetos.elementos_enumeracion, el número de elementos mostrados cuando se trata de colecciones.
<%: 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 :

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()

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:
- Idea Place
- Enhacement Tool
- Social Media
- Improve Performances of SAP CRM 7.0
» 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>










