Bitácora de Javier Gutiérrez Chamorro (Guti)
¡Feliz 1293840000!
Diciembre 31st, 2010 - [Enlace local]
Según la convención de UNIX timestamp, definida como el número de segundos que han pasado desde el 1 de enero de 1970, el valor de 1293840000 corresponde ni más ni menos que a hoy, 1 de enero de 2011. Así que feliz año a todos.
» Leer más, comentarios, etc...
Buayacorp
jQuery deshabilitará el hotlinking
Diciembre 31st, 2010 - [Enlace local]
La gente de jQuery nos informa (muy tarde) que desde el día de hoy desde el 31 de Enero del 2011 deshabilitará el hotlinking de sus archivos. Es decir que tienes que actualizar tus enlaces de jQuery o guardar una copia local:
Alternativas
Tenemos algunas alternativas que pueden servirte:
Usar el jQuery desde CDN
Usar el jQuery desde Google
Usar desde Cached Commons
O simplemente puedes bajarte la última versión y guardarla en tu propio sitio.
También te puede interesar: Tres razones por las que dejar que Google hostee jQuery por tí.
Fuente | jQuery Blog
» Leer más, comentarios, etc...
MadeInFlex
Flex Hero Mobile (III): ActionBar y Text Components
Diciembre 30th, 2010 - [Enlace local]
En este post hablaremos de la ActionBar, un componente que ayuda a la navegación de las aplicaciones Mobile hechas con Hero. También trataremos los TextComponents que nos proporciona el framework para tratar elementos de texto.
ActionBar
Descripción detallada
ActionBar es un SkinnableComponent que proporciona navegación, además de permitirmos añadir el título y las acciones relacionadas con el ViewNavigator.
ActionBar tiene las siguientes propiedades:
- ActionBarSkin: la skin po defecto
- Opcional: tenemos como opcional el titleDisplay, para mostrar el título, navigationGroup, titleGroup y actionGroup.
A continuación vemos las distintas partes de la ActionBar:

Title Group
Si el titleContent no es nulo, reemplaza a titleGroup. En caso contrario, ActionBar insertará el titleDisplay, si existe, como titleGroup.
Action Group
El actionContent es un proxy para el contenido del actionGroup. A diferencia de titleGroup, no tiene preferencias para el caso de contenido nulo.
Navigation Group
De la misma manera, navigationContent es un proxy para en contenido de navigationGroup.
Interacción entre la ActionBar, las vistas y el ViewNavigator
Tanto las vistas como el ViewNavigator definen proxies para las 6 propiedades de la ActionBar. Cuando el ViewNavigator añade una nueva vista, comprueba los valores para estas propiedades y da el contenido a la ActionBar. Si la vista activa no define estos valores, ActionBar da sus valores para estas propiedades. De esta manera los developers pueden determinar contenido por defecto en la zona del navigationContent, como puede ser el Home Button.
El ViewNavigator controla el contenido de la ActionBar cada vez que un evento de navegación ocurre. ViewNavigator escucha los cambios de las propiedades cuando una vista es activada, con la finalidad de actualizar la ActionBar. Cuando se desactiva la vista, ViewNavigator quita los listeners de la vista y escucha la nueva vista activa.
Debajo vemos diferentes modalidades de la ActionBar.

Podeis encontrar más información y ejemplos en este link.
Text Components
Descripción detallada
Tienen como objetivos los siguientes:
- Disponer de los componentes de texto típicos como: Label, TextInput y TextArea
- Proporcionar el máximo rendimiento en áreas críticas, como skins o items renderers
- Proporcionar una predicción de texto nativa y de edición
Características
Los componentes de texto para mobile, por motivos de rendimiento, extienden de TextField. Esto hará que la performance sea mejor, aunque si queremos optimizar al máximo en ciertos escenarios, como en la creación de item renderers, podemos mirar la especificación de estos elementos.
Además nos proporcionan:
- Una nueva primitiva llamada StyleableTextField: extiende de TextField y nos da soporte para estilos. También implementa IDisplayText y IEditableText. No implementa IUIComponent o ILayoutElement, por lo que no puede usarse como child de un container. Está pensada para usarse en skins y en item renderers.
- Dos nuevas primitivas, IDisplayText y IEditableText: definen el contrato entre un text display y un editable text. Las skin parts de Texto en los componentes Spark han sido actualizadas para usar estas interfaces en lugar de TextBase y RichEditableText.
- Nuevas skins para los componentes TextInput y TextArea: estos componentes usan la nueva primitiva StyleableTextField.
Teclado y Focus
Los TextInput y las TextArea editables han sido pensadas para que pueda introducirse texto, de manera que no se permite que el teclado se superponga encima de ellos. Cuando uno de estos componentes recibe el foco, el típico rectángulo de color los envuelve.
Mas información aquí.
» Leer más, comentarios, etc...
Picando Código
Primer encuentro de Wikipedistas en Uruguay
Diciembre 30th, 2010 - [Enlace local]
Paso la información del primer encuentro de Wikipedistas en Uruguay. Hay una comunidad de wikipedistas uruguayos que incluso ya han planteado la creación de Wikimedia Uruguay. Si les interesa el tema, es la oportunidad ideal para integrarse a la comunidad y empezar a colaborar.
Dónde y cuándo
Nos juntaremos el sábado 15 de enero de 2011, a las 19.00 hrs. El punto de encuentro será en Piriápolis, en el departamento de Maldonado. Para los que están en Montevideo, salimos de Terminal Tres Cruces para pasar el día. Más información pronto.
Objetivos
- Celebrar Diez años de Wikipedia, conocernos entre nosotros, desarrollar lazos.
- Continuar con las conversaciones para la creación de Wikimedia Uruguay.
- ¡Pasar un buen rato!
» Leer más, comentarios, etc...
Buayacorp
WordPress 3.0.4 disponible
Diciembre 29th, 2010 - [Enlace local]
Me ha sorprendido que en menos de un mes se han liberado ya 4 actualizaciones de WordPress, hoy recibo la sorpresa de que está disponible la actualización urgente para WordPress 3.0.4.
Esta actualización arregla un bug en el Core de WordPress, específicamente en la librería de “sanitización” de HTML que permite ejecutar código arbitrario.
Si estás metido en esto de la seguridad, los chicos de WordPress te invitan a que le des una mirada a los cambios que se han hecho últimamente. Ahora si feliz año.
» Leer más, comentarios, etc...
MadeInFlex
Flex Hero Mobile (II): ViewNavigator
Diciembre 29th, 2010 - [Enlace local]
En el segundo post de Hero en cuanto a Mobile veremos el componente ViewNavigator, que actúa como core del modelo de navegación de las aplicaciones mobile hechas con Hero.
Introducción
El concepto View y view navigator son conceptos del nuevo framework Hero que nos permite crear y navegar dinámicamente por el contenido de la aplicación. ViewNavigator es un componente que trata la creación y presentación de las vistas. ViewNavigator usa una pila de vistas, que hace que solo sea visible la que se situa en el top de la pila. El developer puede usar los métodos como pushView y popView para ir a una vista o retornar a una vista previa.
Objetivos
- Mostrar dinámicamente el contenido de una área específica
- Dar la habilidad para navegar por distintas vistas
- Proporcionar un sistema de datos para dar la información necesaria a una vista cuando se crea
- Soportar diferentes políticas de destrucción
- Proporcionar una Infrastructura para rellenar automáticamente la ActionBar con los datos relacionados con la vista activa
Relación con ViewStack
ViewNavigator es similar al componente mx:ViewStack: pueden cambiar rápidamente el contenido visual. La mayor diferencia entre ellos es el sistema de navegación: ViewStack solo puede cambiar entre estados predefinidos, mientras que ViewNavigator permite al developer activar dinámicamente un número de vistas y saltar rápidamente entre ellas, según el flujo que defina el usuario. Esto significa que ViewNavigator crea y mantiene un historial de navegación y representa mejor el modelo de navegación. Además ViewNavigator contiene un modelo de datos con la habilidad de persistir los datos y estados entre diferentes sesiones de la aplicación.
Relación con los States
ViewNavigator no se puede considerar un reemplazo de los States de Flex. Aún y así, las vistas y los states son similares en tanto que permiten al developer cambiar el contenido bajo demanda, pero hay diferencias: los states son un subsistema que se concentra en el cambio de subpartes de componentes y propiedades en el mismo instante de tiempo, controlados por un solo thread; mientras que las vistas centralizan toda la lógica y el contenido relacionado en un único componente, el cual es reemplazado totalmente al navegar a otra vista.
Descripción detallada
Estructura del componente
A continuación vemos este componente:

La content area es el contenendor principal de la vista actual. Cuando se crea una vista, automáticamente es añadida a este contenedor. La ActionBar nos permite mostrar la información contextual a la vista actual.
Control de las vistas
Como hemos dicho, ViewNavigator usa una pila para controlar las vistas, concretamente tiene un vector de objetos llamado navigation stack, donde el primer elemento es el que estará activo y visible. ViewNavigator nos proporciona un sistema de push y pop de vistas. Es importante destacar que no proporciona ningún mecanismo para poder mostrar una vista específica de la navigation stack.

En la imagen anterior vemos como al seleccionar un elemento de la vista de búsqueda, accedemos a la vista de detalle. Esto provoca la destrucción de la vista de búsqueda y la vista de detalle pasa a ser la activa y visible.
Vistas
Una vista (View) es la clase base de todas las vistas de la aplicación y es una subclase de Group. Una vista tiene una propiedad data que será usada para representar su contenido y estado. Este objeto es automáticamente serializado, persistido y restaurado por el view navigator cuando una vista se activa o desactiva.
Políticas de destrucción
La implementación incial de ViewNavigator solo permite una vista visible. Cuando una vista pasa a ser activa, los componentes de la anterior se destruyen. De esta manera tenemos una mejor gestión de memoria.
También es cierto que en determinados escenarios es más costoso destruir una vista y volverla a crear cuando sea necesario. Para tratar esto, las vistas tienen una propiedad llamada destructionPolicy que determina que debe pasar cuando la vista es reemplazada en la pila. Por defecto se destruyen, pero podemos determinar que se mantengan en memoria.
Modelo de datos de la vista
Las vistas también tiene soporte para la persistencia de datos. Estos datos se guardan en un objeto y se settean a la propiedad data de la vista cuando se hace la llamada de pushView(). Des esta manera se asegura que la vista contenga los datos que necesita. Cuando una nueva vista se pone como activa, los datos de la anterior son guardados.
Ciclo de vida de una vista
ViewNavigator sigue el flujo típico de invalidación de las aplicaciones Flex para hacer la transición entre vistas. Así un developer puede ejecutar operaciones de navegación en un solo frame. Todas las operaciones de navegación pueden ser canceladas.
A continuación el diagrama de acciones y eventos que suceden cuando se solicita una nueva vista:

Visibilidad de la ActionBar
Disponemos de dos layouts para la action bar dentro del navegador. El developer puede cambiar entre ellos usando la propiedad overlayControls de la vista y del ViewNavigator. Con overlayControls a false, la ActionBar usa como layout vertical. SI tiene valor true, el área de vista se expande al width y height del navegador. La ActionBar se pone encima aplicando un alpha determinado.

Orientación
ViewNavigator soporta las orientaciones de portrait y landscape. Debemos usar los siguientes skin states del ViewNavigator:
- portrait: Las vistas se muestran en layout portrait y con la ActionBar con el layout por defecto
- landscape: Las vistas se muestran en layout landscape y con la ActionBar con el layout por defecto
- portraitAndOverlay: Las vistas se muestran en layout portrait y con la ActionBar se superpone a la content area
- landscapeAndOverlay: Las vistas se muestran en layout landscape y con la ActionBar se superpone a la content area
Transiciones
Podemos definir transiciones para pasar de una vista a la siguiente. Podemos pasar un objeto de tipo ViewTransition para determinar que transición queremos aplicar.
ViewNavigator tiene dos skin parts opcionales: defaultPushTransition y defaultPopTransition.
Más información y ejempos aquí.
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering / Project Management / Business Process Management
Elegir el tipo de implementación Microsoft Dynamics
Diciembre 29th, 2010 - [Enlace local]
Como sabes existen 5 tipos de implementación para un proyecto de Microsoft Dynamis: Standar, Agile, Rapid, Enterprise y Upgrade, pero en que basarnos para elegir el mejor método de entrega, Sure Step Methodology nos proporciona la siguiente tabla:
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering / Project Management / Business Process Management
Trabajo on site–offshore Sure Step Methodology
Diciembre 29th, 2010 - [Enlace local]
Para aquellos que implementamos Microsoft Dynamics y seguimos Sure Step aquí una guía sobre las actividades que se pueden realizar on site y aquellas que se pueden realizar offshore dentro del proyecto
» Leer más, comentarios, etc...
MadeInFlex
Flex Hero Mobile (I): MobileApplication
Diciembre 28th, 2010 - [Enlace local]
Igual que hicimos comentando las novedades de Hero para desktop, vamos a postear una serie para explicar, a grosso modo, lo que nos ofrecerá Hero para Mobile. En este primer post veremos una visión global centrada en la clase MobileApplication.
MobileApplication
Esta clase permite crear aplicaciones enfocadas a dispositivos móviles. Una aplicación mobile típica se divide en diferentes vistas que se van mostrando u ocultando según el flujo de la aplicación. Este modelo de aplicación se conoce como view-based. Una aplicación mobile saca partido del componente ViewNavigator, que ya veremos, para gestionar estas vistas.
Por otro lado, una aplicación mobile debe estar integrada con los eventos que nos puede lanzar el dispositivo, como la gestión de teclado o el control de la orientación.
A continuación vemos el típico flujo de una aplicación mobile (click para ampliar):

La metodología usada para desarrollar aplicaciones mobile es diferente a la que usamos para aplicaciones desktop. Una aplicación mobile se suele usar durante poco tiempo y a menudo interrumpida por otras acciones: mensajes, llamadas u otras aplicaciones. Se espera que al abrir una aplicación mobile, se hayan guardado los datos y estado anteriores, lo que implica que debemos persistirlos cada vez que la usamos.
Para poder conseguir este objetivo, Flex Hero nos proporciona apis de persistencia de datos para guardar los datos de las vistas. Esto permite a los developers guardar de forma rápida y sencilla los diferentes datos y estados entre sesiones.
MobileApplication no está pensada para ser usada para aplicaciones desktop o web, requiere AIR 2.5 SDK y swcs exclusivos de Flex Mobile (mobileComponents y mobileTheme).
Objetivos de MobileApplication
- Crear una aplicación mobile con una plantilla simple, que exponga los diferentes aspectos de UI comunes en las applicaciones mobile
- Automatizar el control de los eventos de orientación que se lanzan en runtime
- Automatizar el manejo de eventos de hardware, menu y búsqueda que se pueden dar en runtime
- La creación de un manager simple de persistencia que permita guardar los datos y recuperarlos bajo demanda
- La implementación de una skin básica para la aplicación
Descripción
Creación de Interficíe de Usuario
La clase MobileApplication provee una manera fácil y rápida de crear UI para móviles. Este componente extiende a SkinnableContainer y contiene una estructura muy específica definida con skin parts opcionales. Los componentes estándar de la UI son:
- ViewNavigator: usado par tratar la navegación a través de las vistas dentro de la aplicación. Se expande por todo el área libre de la pantalla del dispositivo. Nos proporciona acceso a una ActionBar, responsable de mostrar el título y los componentes contextuales de la vista actual.
- Menú de la aplicación: Se muestra en respuesta a un click a una acción sobre el menu del dispositivo.
Debido a que MobileApplication usa ViewNavigator para navegar a través de sus vistas, no podemos añadir directamente hijos al componente MobileApplication. El developer necesitará usar la propiedad firstView o invocar manualmente la llamada pushView() del navigator para definir que objeto visual se instancia al inicializar la aplicación.
Menú de aplicación
Muchos dispositivos móviles usan un menu de aplicación. Con este menu se muestran las acciones globales o contextuales relacionadas con cada estado de la aplicación.
Atajos de teclado
Se suelen usar en muchos dispositivos y también se ha aplicado a dispositivos que soportan Flex Mobile. La clase MobileApplication proporciona automáticamente un botón de retorno (back button) para gestionar la navegación principal de la aplicación. Cuando la tecla de retorno se pulsa, la clase MobileApplication comprueba cuantas vistas están en la pila. En el caso de que se esté gestionando más de una vista, mobile application llama el método popView() sobre el navigator para que muestre la vista anterior. Si no hay ninguna vista empilada o sólo se está gestionando la actual, al pulsar back retornamos a la vista principal de la aplicación.
La clase MobileApplication nos expone apis sencillas para que los developers puedan sobreescribir está funcionalidad si nos interesa otro comportamiento.
Soporte para la orientación
Las clases MobileApplication y ViewNavigator tienen comunicación estrecha para controlar la orientación del dispositivo. El developer puede usar la propiedad de la clase MobileApplication llamada landscapeOrientation, que es solo de lectura, y permite determinar la orientación del dispositivo. Cuando cambia la orientación del dispositivo, la clase MobileApplication capturará la orientación del stage y automáticamente actualize esta propiedad. Para cambiar la orientación física del dispositivo debemos usar las apis de la clase Stage.
La clase ViewNavigator soporta los estados de landscape y portrait.
Propiedades de vista a nivel de aplicación
A continuación mostramos propiedades interesantes de la clase MobileApplication. Estas propiedades se usan como proxy para usarlas sobre la clase ViewNavigator que contiene los mismos valores y definirlos si no han sido setteados en la vista actual.
- firstView: define la primera vista cuando no se ha definido ninguna sección
- firstViewData: el objeto de datos que se debe settear a la primera vista de la aplicación
Propiedades de la ActionBar
- title: el título usado en la action bar
- titleContent: los UIComponents que deberían ser visualizados en la ActionBar
- titleLayout: el layout por defecto de la zona de titleContent
- navigationContent: los UIComponents que se deben mostrar en la zona de navegación de la ActionBar
- navigationLayout: el layout de la zona de navegación de la ActionBar
- actionContent: los UIComponents a mostrar dentro de la zona de acción de la ActionBar
- actionLayout: el layout que se aplica dentro de la zona de acción de la ActionBar
Persistencia de datos entre las sesiones de la aplicación
Flex Mobile framework introduce un nuevo manager que nos permite guarda datos mediante una API muy sencilla. Este manager se llama PersistenceManager e implementa la interface IPersistenceManager. Nos da una lista de apis para que el developer pueda usar para guardar y tratar los datos de la aplicación.
Persistencia automática del estado de la aplicación
Usando PersistenceManager, la clase MobileApplication automáticamente guarda y restaura la información del estado de la aplicación para que dispongamos de ella cuando la aplicación se suspende y se relanza. MobileApplication tiene la propiedad sessionCachingEnabled que una vez habilitada hace que la aplicación guarde automáticamente su estado. Usa los siguientes parámetros para hacer este guardado:
versión de la aplicación, un timestamp para saber el momento es que se ha guardado y el estado de la navegación. Todo esto se guarda en la pila del navegador principal.
Debemos tener en cuenta que el objeto compartido que PersistenceManager usa para guardar los datos no está ni encriptado ni protegido. Se guarda con un formato fácilmente legible. Esto implica tener cuidado con lo datos que el developer guarda. El developer siempre tiene la posibilidad de implementar su propio manager de persistencia para crear una mejor manera de guardar los datos, si lo cree necesario.
Aquí encontrareis más información y ejemplos.
» Leer más, comentarios, etc...
Buayacorp
Ejemplos de Webkit CSS (I)
Diciembre 28th, 2010 - [Enlace local]
Retomando nuestra costumbre de ayudarles con artículos de Diseño, presentamos ejemplos de como usar Webkit CSS y CSS 3, en esta entrega: Flexible Box Model, Box Sizing y Columns
» Leer más, comentarios, etc...
Variable not found
Llega la Programación Gestual: Visual Studio Kinect Edition
Diciembre 28th, 2010 - [Enlace local]
Los desarrolladores, antes o después, acabamos sufriendo problemas físicos debido a nuestro trabajo. El hecho de estar sentados todo el día aporreando teclas como posesos lleva asociado una serie de males de espalda, manos, muñecas, brazos, hombros, cervicales… vaya, que a veces parece que sería mejor estar cargando bultos en el muelle ;-)
Esto han debido pensar los equipos de trabajo de Kinect y Visual Studio en Microsoft, en conjunción con laboratorios MS Research, que se han unido para brindarnos lo que será la próxima revolución en el mundo del desarrollo de software, y que han decidido llamar “Gesvelopment” (Gestual Development, o tecnología GDM).
Visual Studio Kinect Edition es el primer producto de la casa que incorporará este nuevo paradigma. Básicamente, consiste en un sensor Kinect unido al PC de trabajo, en el que se instalará un Visual Studio tuneado con complementos capaces de interpretar movimientos y voz del desarrollador y trasladarlos a acciones en el editor y el propio entorno.
La tecnología GDM permitirá programar mediante movimientos, voz, posiciones y gestos del cuerpo, es decir, sin necesidad de tocar una tecla o el ratón para nada. Esto irá combinado con una serie de ayudas específicas permitirán aumentar nuestra productividad y, al mismo tiempo, mantenernos en una forma física envidiable.
Los interfaces de usuario podremos crearlos utilizando una herramienta al más puro estilo Minority Report: arrastrando virtualmente los elementos sobre la pantalla, redimensionándolos, abriendo sus propiedades, etc., siempre mediante movimientos de brazos, manos y piernas perfectamente sincronizados con lo que aparece en pantalla.
El código lo editaremos mediante un conjunto de movimientos y gestos preestablecidos, similares a los usados en el lenguaje de signos. Esto no implica, sin embargo, la aparición de un nuevo lenguaje para .NET. GDM monta una capa de abstracción sobre los lenguajes usados (C#, VB.NET, HTML, etc.), de forma que el mismo movimiento puede ser transformado a instrucciones del lenguaje activo, sea cual sea éste, siempre que se disponga de los drivers oportunos.
Así, por ejemplo, en lenguajes de programación clásicos, un movimiento circular con el brazo será interpretado como bucle, y será introducido en el código traducido al lenguaje actual, o un salto del programador será convertido en un jump, goto, o la estructura más cercana. O por ejemplo, en HTML podremos enfatizar texto (<em>) inclinándonos hacia la derecha (véase la imagen lateral), mientras que cerrar el puño con fuerza será útil para formatear en negrita (<strong>). La variedad de gestos y movimientos permitidos es enorme.
GDM también incluye un sistema de reconocimiento de voz con el que se podrán matizar y definir, por ejemplo, nombres de variables o instrucciones cuyos movimientos serían difíciles de ejecutar.
Las operaciones con el entorno (compilar, ejecutar, copiar, pegar, etc.) las realizaremos también con movimientos corporales explícitos. En el ejemplo de la derecha, podemos ver el gesto mediante el cual podemos cortar y enviar al portapapeles el texto seleccionado; podemos compilar apretando una mano contra otra, o ejecutar aplicaciones haciendo un gesto de decapitación con la mano derecha sobre nuestro cuello. Esto último denota algo de humor negro, sin duda, por parte de los desarrolladores del invento.
Otro aspecto realmente curioso e interesante es que dado que algunos dispositivos como Kinect son capaces de detectar y seguir los movimientos de más de una persona al mismo tiempo, será posible trabajar de forma colaborativa (pair programming), como se aprecia en la fotografía de la derecha, donde aparecen dos desarrolladores trabajando sobre una vista MVC.
Los afortunados poseedores del sensor Kinect podrán probar una edición limitada de GDM al instalar Visual Studio 2010 Beta 2, aunque el producto será distribuido oficialmente con Visual Studio 2012 (codename NutCracker), en una edición especial del producto.
Sin embargo, Microsoft no se ha centrado exclusivamente en sus tecnologías, jugando con abstracciones que hacen posible independizarse del dispositivo de detección de movimientos y reconocimiento de voz, e incluso del entorno de
desarrollo. Así, aunque algo más tarde, también será posible desarrollar aplicaciones utilizando el mando de la Wii, y Move, el sensor de las consolas Playstation. También se están ya implementando drivers para todo tipo de entornos de desarrollo profesionales como Eclipse, Netbeans, o el block de notas.
Esto es posible gracias a su arquitectura modular, en la que se han previsto componentes que aíslan el software del hardware, y éstos a su vez del IDE y lenguaje utilizado:

Está claro que antes de que se implante de forma generalizada deberán cambiar algunos aspectos en nuestro entorno y cultura empresarial, como:
- el espacio de trabajo deberá ampliarse para cada desarrollador. Será necesario un espacio de al menos tres metros cuadrados diáfanos por desarrollador para poder ejercitar su trabajo de forma eficiente y sin interferir con el compañero.
- las instalaciones deberá adecuarse. Las empresas deberán instalar zonas de duchas, e incorporar fisioterapeutas o médicos deportivos a sus plantillas.
- la ropa de trabajo deberá ser cómoda y apropiada para una actividad física, quizás chándal y zapatos deportivos puedan ser una buena opción.
- el tamaño de los monitores deberá ampliarse al menos a 50 pulgadas, para que el desarrollador pueda leer textos a cierta distancia, y mientras está en movimiento.
- habrá que cambiar ciertos hábitos: menos café y más Gatorade, dietas altas en proteína para desayunos y almuerzos, etc.
Ya sabéis, id calentando, que GDM está cerca…
Publicado en: Variable not found.
Nota para despistados: obviamente la noticia no es real, se trata simplemente de una broma del Día de los Inocentes, así que tendremos que seguir siendo inertes, estáticos, parte del mobiliario, con dolores por todas partes y ganando peso. Bonito panorama para 2011, eh? ;-D
» Leer más, comentarios, etc...
Picando Código
Yaourt: Instalando paquetes de AUR en ArchLinux
Diciembre 27th, 2010 - [Enlace local]
Yaourt es una herramienta que actualmente considero imprescindible en ArchLinux. Tras un tiempo de usar los repositorios AUR, gracias a un pique de @yrvn conocí Yaourt (Yet AnOther User Repository Tool). Combina las ventajas del repositorio AUR con la facilidad de instalación de pacman, el gestor de paquetes de ArchLinux. Ya en mi entrada de ArchLinux vs. Debian GNU/Linux comenté sobre AUR:
AUR es el Arch User Repository, un repositorio gestionado por la comunidad de usuarios de Arch. Contiene descripciones de paquetes (PKGBUILDs) que permiten compilar un paquete desde el código fuente con makepkg e instalarlo con pacman. Esto es una de las fortalezas de Arch. Así como si un programa existe para GNU/Linux, en algún lugar hay un .deb para instalarlo, probablemente también esté listado en AUR. Este repositorio tiene bastante movimiento, y sus paquetes pueden ser votados a través de aurvote para que se incluyan en el repositorio oficial de la comunidad.
La manera tradicional de instalar aplicaciones desde AUR es bastante “tediosa” si se quiere, aunque como todo en Arch, nos permite tener un control importante de lo que vamos a instalar. Hay que tomar esto en cuenta ya que el software disponible en AUR no tiene soporte oficial por parte de la distribución.
Antes de conocer Yaourt, tenía que buscar el tarball con el PKGBUILD y otros archivos necesarios (desde la interfaz web de AUR), extraerlo y ejecutar el comando makepkg sobre los archivos e instalar el paquete generado con pacman.
Yaourt es un wrapper para pacman que agrega acceso a AUR, permitiendo y automatizando la compilación e instalación de paquetes. Usa la misma sintaxis que pacman, por lo que no hay que aprender nuevas formas de mantener el sistema, y agrega opciones nuevas.
Sus características:
- Soporte para AUR (búsqueda, instalación, chequear conflictos y dependencias)
- Búsqueda e instalación interactiva
- Compilación de paquetes directamente desde el código Arch Build System
- Manejo de archivos de backup: .pac*
- Guarda y restaura bases de datos alpm. Ejecuta consultas directamente desde un archivo de respaldo.
- Busca huérfanos y prueba bases de datos locales
- Soporta paquetes partidos
Para instalarlo, se recomienda instalar previamente el paquete básico de desarrollo para contar con las herramientas como gcc o make, entre otras:
pacman -S base-develAhora, podemos agregar el repositorio de Yaourt en /etc/pacman.conf:
[archlinuxfr] Server = http://repo.archlinux.fr/$arch
Siendo $arch la arquitectura: i686 o X86_64. Por último actualizar, sincronizar e instalar:
pacman -Syu yaourtUna vez instalado, podemos buscar cualquier paquete en AUR y obtendremos una sintaxis coloreada mostrando los orígenes del software, las versiones y descripción.
Podemos usar yaourt para actualizar el sistema al estilo pacman: yaourt -Syu, se actualiza el sistema tal cual si usáramos pacman. Ahora, un tip que tuve que buscar, para actualizar también los paquetes de los repos AUR y devel, es agregarlos como parámetros:
yaourt -Syu --devel --aur
Personalmente uso muchos paquetes de AUR: Gimp, Amarok y otros traídos desde el repositorio GIT, además de varios paquetes de software como Opera, Firefox 4 beta y demás. Estos se van actualizando automáticamente con yaourt y no tengo que entrar a la interfaz web de AUR a preocuparme en ver qué paquetes instalé y cuáles tienen versiones nuevas.
En su momento me llevaba bastante tiempo hacer eso, y con yaourt se me facilitó enormemente el trabajo. Supuse que todos los Archers conocerían la herramienta, pero siempre hay algún nuevo/despistado como yo que no la conocía.
Más info:
» Leer más, comentarios, etc...
Arragonán
Screencasts de Mockito
Diciembre 27th, 2010 - [Enlace local]
Hace un poco que he empezado a trastear Mockito para utilizarlo en un proyectillo que llevo entre manos. Por si hay algún javero despistado, es una librería para ayudarnos a hacer mocks y stubs de las dependencias de código que queramos testear.
Pues hace unos días que encontré unos screencasts sobre Mockito que me resultaron muy aclaratorios de como puedo aprovechar la librería. Como me resultaron útiles, simplemente los comparto
:
» Leer más, comentarios, etc...
xailer.info (esp)
Xailer 2.1.5 Beta
Diciembre 24th, 2010 - [Enlace local]
Estimados usuarios de Xailer,
Como se comunicó hace días en los foros de noticias, tenemos el placer de presentar a modo de regalo de Papa Noel una nueva versión del IDE de Xailer que ha sufrido una tremenda transformación interior que ha sido necesaria para acometer importantes mejoras en la herramienta.
Debido a esta importante transformación hemos decidido publicar previamente el nuevo IDE en forma de Beta para que sea probada antes de realizar el salto a la versión 2.2 que incorporará el nuevo IDE. El periodo Beta va a ser muy corto. De hecho el IDE ha sido ampliamente probado por nosotros mismos y creemos que serán pocos los ‘bugs’ que se encuentren (cruzo los dedos).
El principal cambio que se ha realizado ha sido el soporte de múltiples proyectos, es decir, la posibilidad de tener abiertos varios proyectos a la vez controlando la dependencia entre ellos. Para poder realizarlo ha sido necesario modificar completamente el archivo XPJ que guarda la información del proyecto pasando de formato INI a formato XML que ofrece muchas más posibilidades. Cada vez que abra un proyecto antiguo con el nuevo IDE, éste le solicitará la conversión al nuevo formato. Si no lo realiza la gestión multi-proyecto no estará operativa. Obviamente, si realiza la conversión el proyecto no podrá ser abierto con versiones anteriores de Xailer por lo que es recomendable hacer una copia de seguridad del mismo por si acaso.

El cambio del XPJ a formato XML nos ha permitido mejorar el proceso de compilado de cada fichero en particular siendo posible cambiar para un determinado fichero sus condiciones de compilación. Una imagen vale más que mil palabras:
Hemos incluido en el editor de código una colección de barras de botones para facilitar las operaciones de edición, como son:
- la navegación a través del código mostrando un combo con todos los métodos y funciones del modulo. Cuando se desplaza por el código el combo le mostrará el nombre del método o función donde se encuentra y si escribe en el combo directamente observará como el editor le crea automáticamente el método en la clase, incluido su prototipado.
- Operaciones clásicas de edición como copiar, cortar, pegar, deshacer y rehacer.
- Operaciones de búsqueda y reemplazo
- Operaciones con marcas
Cada una de las barras puede ser ocultada desde la configuración del editor.
Realmente el gran cambio en el IDE de Xailer se ha producido en su interior. Sin el cambio que se ha realizado era imposible acometer muchas mejoras que teníamos pendientes y otras muchas que aún nos quedan por hacer. Esperamos que en futuro podáis ver avances en el IDE con muchísima más agilidad.
Aprovechamos también el lanzamiento de Xailer 2.1.5 Beta para daros a conocer el nuevo gestor de descargas que hemos puesto en marcha en:
http://www.xailer.com/download
Como podréis ver el archivo consiste únicamente en el ejecutable del IDE. Os recomiendo que simplemente copiéis el archivo a vuestro directorio \Xailer\Bin y hagáis un enlace directo al mismo para de esta forma utilizar indistintamente el IDE 2.14 o éste nuevo. Es importante que tengáis en cuenta que si arrancáis el proyecto desde el explorador de archivos se arrancará la versión antigua de Xailer.
El nuevo gestor de descargas está pensado para que sea utilizado por todos vosotros como repositorio de cualquier fichero útil para el desarrollo de software con Xailer. Os animamos a que contribuyáis con vuestras propias rutinas, clases, ejemplos, documentos o incluso aplicaciones finales.
No intente utilizar esta versión Beta si no tiene actualmente registrada una versión de Xailer 2.1.
Un cordial saludo,
[El equipo de Xailer]
» Leer más, comentarios, etc...
Variable not found
¡Felices fiestas y nuevo año!
Diciembre 24th, 2010 - [Enlace local]
Desearos a todos unas muy felices fiestas en compañía de todos los que os importan, y un próximo año lleno de dicha, salud y prosperidad. Puestos a pedir, a ver si incluso puede ser un poquillo mejor que el que dejamos atrás ;-)
Nos vemos por aquí.
» Leer más, comentarios, etc...
Buayacorp
D0z.me acorta urls y hace ataques DDoS a la vez
Diciembre 23rd, 2010 - [Enlace local]
Con la creciente ola de ataques que ha generado Wikileaks, especialmente ataques DDoS a varios sitios conocidos, se han inventado muchas herramientas para “ayudar” a hacer estos ataques.

D0z.me es un acortador url como tantos, pero su particularidad está en que al acceder al enlace, se genera un iframe invisible que es el que empieza a hacer el ataque DDoS. El ataque seguirá mientras el usuario esté en el navegador.
El creador de esta herramienta es Ben Schmidt que nos advierte sobre utilizar los acortadores de url y el peligro que pueden generar a internet el creciente número de estos acortadores.
Enlace | D0z.me
Fuente | Fayerwayer
» Leer más, comentarios, etc...
MadeInFlex
Servicios Personalizados de Pimento
Diciembre 22nd, 2010 - [Enlace local]
En los artículos anteriores dedicados a Pimento Data Service exploramos el uso de la clase EntityManager para invocar operaciones CRUD y la funcionalidad de “lazy loading”. Esta vez vamos a tratar el uso de los servicios personalizados y lo haremos como siempre a través de un ejemplo.
Habiamos mencionado en el primer artículo que Pimento Data Services ofrece dos modelos de programación, uno basado en la clase EntityManager y el otro basado en los servicios personalizados. Con este último se crean clases de Java que asemejan a la capa de servicios de una arquitectura multicapa, y se exponen como servicios remotos de Cinnamon, el framework que implementa AMF y que soporta tareas “ant” que facilitan la creación de “proxies” en ActionScript de estas clases Java.
El uso de este modelo de programación permite también aprovechar las facilidades de Pimento en cuanto a que entidades que hayan sido cargadas por un servicio personalizado pueden ser gestionadas por el framework, o sea, se cargarán en el “cache” del cliente, se gestionará su llave primaria cuando se haga persistente una nueva instancia, etc. Esto quiere decir que los dos modelos se pueden complementar entre sí para adaptarse a los requerimientos.
El ejemplo
El ejemplo que desarrollaremos será el mismo que en el artículo dedicado al “lazy loading”, pero en este caso, en vez de hacer la carga inicial de la entidad “Project” utilizando la clase EntityManager lo haremos utilizando un servicio personalizado, la asociación “One To Many” la cargaremos a través del método “initialize”, de EntityManager, lo que probará la integración de ambos modelos de programación.
Lo primero será descargar el framework de aquí. Luego creamos un proyecto de tipo “Dynamic Web Project” con las siguientes características:
- Nombre del proyecto: CustomPimentoServer
- Target Runtime: En nuestro caso usaremos Apache Tomcat 6, pero puede utilizarse cualquier otro que se haya configurado.
- Versión del módulo Web Dinámico: 2.5
- Configuración: Configuración por defecto para Apache Tomcat 6.0
- Cambiamos la carpeta donde se compilarán las clases a “CustomPimentoServer/WebContent/WEB-INF/classes”.
Una vez creado el proyecto copiamos el contenido de la carpeta “server/web/WEB-INF/lib” de la distribución del framework en “WebContent/WEB-INF/lib” de nuestro proyecto. Sustituimos el archivo de HSQLDB por el controlador JDBC de MySQL, y copiamos de la carpeta “server/release” los archivos “cinnamon-core”, “cinnamon-reflect”, “pimento-core” y ”pimento-generator”. Necesitamos copiar también “freemarker” y “paranamer” de la carpeta “server/lib” y el paquete “javassist”, este lo podemos encontrar en la distribución de Spring con dependencias. La carpeta “generatorTemplate” la copiamos en la raíz del proyecto.
Creamos una carpeta denominada “config” dentro de “WebContent/WEB-INF” de nuestro proyecto y copiamos los archivos “jpa-spring.xml” y “pimento-spring.xml” en “server/web/WEB-INF/config” en la distribución del framework; también copiamos el archivo “dp.properties.template.mysql” de “server/web/WEB-INF/config/db-templates” como “db.properties” en “WebContent/WEB-INF/config” de nuestro proyecto y ajustamos los valores de la conexión a la base de datos. Como estamos en fase de desarrollo ponemos “hibernate.hbm2ddl.auto=update”.
Finalmente el archivo “web.xml” de nuestro proyecto queda así:
En este caso el servicio personalizado se define en el archive service-spring.xml, cuyo contenido es el siguiente:
Las entidades con que trabajaremos son:
Project:
Task
Estas son entidades de JPA con anotaciones del framework que indica que serán gestionadas por éste.
El servicio personalizado se concibe como una clase que implementa una interface donde se definen todas las operaciones. El código es el siguiente:
ProjectService
Nótese aquí la anotación “@CinnamonService” que indica un servicio a ser invocado remotamente.
ProjectServiceImpl
Esta es una clase que utiliza JPA del modo tradicional donde de realiza la carga de la entidad Project. Para poder utilizar esta clase desde Flex a través de Pimento debemos generar el “proxy” para ActionScript, lo cual haremos mediante las tareas “ant” suministradas por el framework para esto:
Antes de proseguir con el cliente cargaremos algunos datos iniciales en la base de datos:
Creamos un proyecto Flex con las siguientes características:
- Nombre del proyecto: CustomPimentoClient
- Tipo de aplicación: Web
- Seleccionamos el SDK por defecto
- Como tecnología del servidor no seleccionamos ninguna
- Como carpeta de salida seleccionamos la carpeta WebContent del proyecto CustomPimentoServer que creamos anteriormente.
Nuestra interface de usuario será la misma que en el artículo anterior:
Inicialmente cargaremos una instancia de Project, pero esta vez utilizando el servicio personalizado, e inspeccionaremos el contenido de su propiedad “tasks”, luego cargaremos las instancias de “Task” asociadas mediante el método “initialize” de la clase EntityManager, las cuales mostraremos en el “DataGrid”.
Para estructurar mejor el proyecto nos auxiliaremos del framework Robotlegs. Lo primero que haremos será incluir en el proyecto las librerías del framework Pimento y Cinnamon. Copiamos en la carpeta “libs” del proyecto los archivos “cinnamon-1.1.0.swc” y “pimento-1.1.0.swc” que se encuentran en la carpeta “client\release” de la distribución, incluimos también “spicelib-core-2.0.1.swc” y “spicelib-reflect-2.0.1.swc” de la carpeta “client\lib” y la librería del framework Robotlegs.
Creamos luego las clases en ActionScript que representan las entidades:
Project
Task
La configuración del framework en el cliente comienza con la creación de una instancia de la clase “PimentoConfig”, a través de la cual podemos obtener el “EntityManager” que usaremos para invocar las operaciones de persistencia. La clase PimentoConfig necesita conocer el URL de la aplicación JEE que a través de Cinnamon recibirá las solicitudes del cliente para invocar las operaciones de persistencia, específicamente el URL al servlet “service”. En nuestro caso cargaremos esta información de un archivo xml externo. El comando que hace todo esto y además carga la instancia de “Project” que insertamos en la base de datos es el siguiente:
Para configurar el servicio personalizado creamos una instancia de ProjectServiceImp y lo registramos en el framework a través del método “addService”. Al final cargamos la entidad basado en su Id.
Una vez cargada la instancia de Project, ante el evento “Click” del botón se ejecuta el comando que carga los datos de la asociación:
El código fuente del proyecto se puede descargar desde aquí.
Conclusiones
Hemos visto el modelo de programación de Pimento que permite utilizar servicios personalizados, que no son más que clases de Java expuestas como destinos remotos que toman entidades como parámetros o devuelven entidades como retorno. Estas entidades pueden ser gestionadas por Pimento lo que permite que este modelo coexista con el otro que se basa en la clase EntityManager, dando gran flexibilidad a la aplicación.
» Leer más, comentarios, etc...
programania
Orgullo sin autocomplacencia y propósitos de año nuevo
Diciembre 21st, 2010 - [Enlace local]
Tras vergüenza y dolor, no todo va a ser malo: me apetece escribir con un poco de orgullo (intentando evitar la autocomplacencia).
Cosas que he hecho durante el 2010
- Me he quitado el pánico a la terminal. Ya no le tengo miedo.
La terminal es mucho más poderosa que los entornos gráficos. Es verdad que cuesta más entrar, pero una vez que uno se encuentra cómodo, no vuelve atrás. - He instalado, configurado y puesto en marcha un ecosistema ágil con jira, hudson, subversion, phing, phpunit + métricas yo solito. Ha sido duro, pero empiezo a ver la luz.
- Hago Kanban “con muletas”. Me gustaría llegar a poder desplegar cada user story en producción haciendo un simple “phing production” en la terminal. Ahora “a veces es así”, pero otras muchas no porque tengo que hacer varios pasos más manuales (sobre todo los relacionados con la base de datos).
- Hago pruebas unitarias, pero las hago después de programar. No me puedo fiar de mis pruebas.
- Haciendo pruebas unitarias me he dado cuenta de cómo de acoplado está mi lógica de negocio de mi acceso a datos. Yo pensaba que no, pero es así.
Cosas que quiero hacer durante el 2011
- Tratar de que me defina el producto de mi trabajo.
- Corolario 1: quitarme todas las nomenclaturas: no llamarme ni “ingeniero”, ni “arquitecto”, ni siquiera “artesano” (aunque este último me guste bastante… ).
- Corolario 2: escribir en programania sobre lo que HAGO más que sobre lo que LEO.
- Corolario 3: show me the code! enseñar mi código. abrir las ventanas para que no huela a cerrado. Con humildad y con transparencia, enseñando lo que haces. Así es más fácil que otros te corrijan y mejores.
- Corolario 4: si quiero que mis productos me definan: intentar crear buenos productos sin excusas.
- Corolario 5: sin excusas significa que no vale eso de “me pagaban poco”, “la informática es una mierda”, “el cliente era atecnológico”, “mis jefes no me entienden”. Que lo que hago brille es mi responsabilidad.
- Corolario 6: crear mi primer producto Saas vendible.
- Intentar distinguir lo más claramente posible el tiempo de producir y el tiempo de aprender.
- Corolario 1: intentar no ponerle al cliente cosas con las que jugueteo por primera vez.
- Corolario 2: tener regularmente un “tiempo para aprender”. Quizá parte sea en mi tiempo de trabajo, pero hay que tener claro que parte importante saldrá sacrificando mi tiempo personal.
- Corolario 3: convertir las Code Katas en una costumbre.
- Hacer ATDD con un Kanban que no esté cojo:
- Corolario 1: utilizar TDD no sólo para jugar sino en proyectos reales.
- Corolario 2: ayudarme de Doctrine 2 en PHP, para separar mejor mi lógica de negocio de mi acceso a datos y así poder unit testear como dios manda.
- Corolario 3: llegar a planificar sólo con story points y business value (no planificar por horas).
» Leer más, comentarios, etc...
Cerebro en la Sombra » Técnico
Modificando la infraestructura web de un servidor con Nginx para servir contenido estático y como proxy de Apache
Diciembre 21st, 2010 - [Enlace local]
Es la moda
, y con este comentario no quiero decir que no sea una buena idea.
La explicación es sencilla. Solemos utilizar Apache para servir cualquier tipo de contenido a través de una petición HTTP, pero en Apache cargamos habitualmente muchos módulos necesarios para que nuestras aplicaciones funcionen correctamente, empezando por el mismísimo PHP, pero que no necesitamos para servir contenidos estáticos (imágenes, archivos css o javascript, archivos comprimidos…). Si pudiésemos separar de una manera sencilla las peticiones de estáticos de las de dinámicos podríamos redirigirlas a distintos servicios y conseguiríamos que las estáticas consumiesen muchos menos recursos ya que las podríamos hacer con un servidor mucho más ligero que Apache. ¡Podemos!
Este sería el escenario tradicional de un servidor web:
Las solicitudes HTTP llegan al servidor web desde Internet y éste lee los archivos en disco necesarios para servirla. Nada nuevo.
Este es el escenario al que queremos migrar:
Todas las peticiones HTTP son recibidas en el puerto 80 por un servidor mucho más ligero que Apache (nginx, lighttpd) que se encarga de servir directamente los contenidos estáticos desde el disco y de redirigir las solicitudes dinámicas al Apache de siempre que ahora escucha en el puerto 8080, es decir, el servidor ligero actúa como proxy para las peticiones de contenidos dinámicos.
Para el caso que nos ocupa, el servidor a migrar tiene varios virtual hosts definidos de distintos sites y se pretendía dejar los que tienen poco tráfico tal y como están ahora, es decir, que Apache lo sirva todo, y cambiar sólo aquellos donde el tráfico es elevado para que Nginx sirva los estáticos.
El primer paso es, por tanto, instalar y configurar Nginx para que actúe como proxy completo. Deberemos modificar también Apache para que deje de escuchar en el puerto 80. Empecemos por esto último.
Tendremos que cambiar el fichero de configuración httpd.conf para que escuche en el nuevo puerto, en mi caso el 8080. Cambiaremos la línea correspondiente para que quede así:
Listen 8080
Pero esto no es todo. Tenemos que modificar también los virtual hosts definidos para que escuchen en el nuevo puerto. Al final del mismo archivo cambiaremos la línea correspondiente por esta (la tuya será similar, quizás en vez del asterisco tenga la ip de tu máquina):
NameVirtualHost *:8080
En mi Centos5 la configuración de los virtual hosts se guarda en /etc/httpd/httpd.d. Desde ahí lanzamos este comando que nos los actualizará todos de un tirón:
for i in `dir .`; do sed -i s/*:80/*:8080/g $i; echo $i; done
Menos mal, sino habría que cambiarlos a mano uno por uno
.
Ahora instalamos nginx:
yum install nginx
y hacemos la primera configuración que nos permitirá, de momento, que sea proxy completo de Apache, es decir, que lo redirija todo a Apache.
Creamos el archivo /etc/nginx/proxy.conf
resolver 127.0.0.1; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 128m; client_body_buffer_size 256k; proxy_connect_timeout 60; proxy_send_timeout 60; proxy_read_timeout 60; proxy_buffer_size 32k; proxy_buffers 32 256k; proxy_busy_buffers_size 512k; proxy_temp_file_write_size 512k;
La primera línea será la ip del servidor DNS.
Ahora añadiremos a la configuración de nginx lo siguiente dentro del “server” por defecto.
/etc/nginx/nginx.conf
server{
listen 80;
location / {
proxy_pass http://$host:8080;
include /etc/nginx/proxy.conf;
}
El primer paso debería estar terminado. Levantamos los servicios de Apache y nginx y probamos a navegar por los virtual hosts del servidor. Si todo ha ido bien debería funcionar correctamente, pero si analizamos las cabeceras que se reciben en la respuesta, por ejemplo con el plugin livehttpheaders de Firefox, veremos como añade la siguiente línea a todas las solicitudes:
Server: nginx/0.8.53
Prueba 1 superada. Vamos ahora a configurar determinados virtual hosts para que el contenido estático lo sirva nginx.
/etc/nginx/conf.d/virtual.conf
server {
listen 80;
server_name www.tudominio.com;
location ~* ^.+\.(jpg|js|jpeg|png|ico|gif|txt|js|css|swf|zip|rar|avi|exe|mpg|mp3|wav|mpeg|asf|wmv|flv)$ {
root /var/httpd/www.tudominio.com;
expires 30d;
}
location / {
proxy_pass http://www.tudominio.com:8080;
include /etc/nginx/proxy.conf;
}
}
Con esto le decimos que todos los archivos estáticos los sirva nginx directamente y que las demás peticiones las redirija a Apache. Debemos crear un “server” por cada virtual host que queramos configurar de esta manera. Básicamente lo que hacemos es configurar la misma ruta en disco para los archivos estáticos que la que teníamos en Apache, de esta manera no tendremos que cambiar absolutamente nada. En muchos sitios proponen crear un host static.tudominio.com, pero esto implicaría modificar físicamente todas tus aplicaciones web, y eso no es lo que se pretende
.
Sólo nos queda reiniciar nginx. ¿Cómo sabemos si funciona? Sencillo, revisando los logs de Apache y nginx. Si lo hacemos veremos cómo este último sirve los archivos estáticos y Apache todos los demás
.
Finalmente tendremos un pequeño problema. Desde Apache se verán todas las solicitudes HTTP como si vinieran de la propia máquina ya que, en efecto, vienen de nosotros mismos a través del proxy. Esto puede ser un problema para analizadores de tráfico pero también si tienes algún sistema que controla las ip’s de los usuarios. Para solucionarlo tenemos mod_rpaf para Apache (reverse proxy add forward module) que nos reemplazará las cabeceras adecuadamente de manera que la IP remota que veamos sea la de nuestro cliente. Lo descargamos, lo instalamos y lo configuramos:
/etc/httpd/conf.d/rpaf.conf
LoadModule rpaf_module modules/mod_rpaf-2.0.so RPAFenable On RPAFsethostname On RPAFproxy_ips 127.0.0.1 RPAFheader X-Forwarded-For
Con esto conseguiremos que se reemplace la IP del cliente que se recibe en Apache con la que viene en la cabecera “X-Forwarded-For” que es donde nginx nos deja la original.
Eso es todo. Si reiniciamos el servidor Apache veremos que en los logs comenzará a verse la IP real del usuario y no la de nuestra máquina local.
Como siempre, un último detalle. Integremos nginx con Cacti para hacer un seguimiento
.
Las plantillas están aquí, pero a mi no me funcionaron bien, las cambié un poco por estas otras.
Añadimos en la configuración inicial de nginx las siguientes líneas:
location /nginx_status {
stub_status on;
access_log off;
allow IP_DE_TU_SERVIDOR_CACTI;
deny all;
}
Con esto podrás acceder al estado del servidor nginx desde http://IP_DE_TU_SERVIDOR/nginx_status.
Dentro del zip hay cuatro archivos, dos scripts perl que debes copiar en el directorio scripts de tu instalación de cacti y dos xml que debes importar desde la propia herramienta. Ya está todo preparado. Desde la configuración de cacti del servidor donde has instalado nginx añades las nueves fuentes de datos y los gráficos. Al configurarlo te pedirá la url de acceso que veíamos hace un momento.
Y hasta aquí hemos llegado. En muy poco tiempo hemos conseguido modificar toda la estructura de nuestro sistema web sin pérdida de disponibilidad y, lo mejor de todo, hemos creado un sistema mucho más eficiente y robusto. En condiciones de tráfico medio no notarás mucha diferencia de rendimiento, pero tendrás un sistema mucho más preparado para hacer frente a picos y efectos “barrapunto”
.
» Leer más, comentarios, etc...
Variable not found
Cambios en la validación de peticiones en ASP.NET MVC 3
Diciembre 21st, 2010 - [Enlace local]
Hace no demasiado tiempo escribía sobre las formas de evitar el error “Request.Form peligroso”, mostrando distintas técnicas para controlar la forma en que ASP.NET defiende nuestras aplicaciones de ataques de inyección de script evitando la entrada de campos de formulario, cookies o parámetros del querystring con contenidos HTML. En ese post cubría hasta la versión 2 de MVC, Webmatrix, y ASP.NET Webforms.
Ahora, por fin la RC 2 de ASP.NET MVC 3 estabiliza por fin algo que ha sufrido varios cambios durante toda la fase de pruebas del producto, y que nos estaba volviendo algo locos por el cambio de denominación de atributos, o la aparición y desaparición de propiedades.
En ASP.NET MVC 3, por defecto, todos los parámetros de entrada serán sometidos a las comprobaciones oportunas para evitar la aparición de etiquetas y entidades HTML. En caso de detectar la aparición de algún texto peligroso, aparecerá el mismo error de siempre:

Sin embargo, a diferencia de versiones anteriores, la desactivación de la validación se puede realizar ahora de forma mucho más detallada, únicamente sobre los campos que nos interesen, evitando así los problemas derivados del enfoque previo, según el cual se validaban todos los campos o no se validaba ninguno.
Para ello, se ha introducido el atributo
[AllowHtml] (definido en System.Web.Mvc), que aplicado sobre una propiedad del modelo, permite que ésta contenga etiquetas y otros elementos que podrían ser considerados peligrosos durante el proceso de binding. El siguiente ejemplo muestra una entidad que permitiría contenido HTML en la propiedad Texto, pero no en el Titulo:
Un aspecto importante es que con MVC 3 ya no será necesario introducir el atributo
requestValidationMode="2.0" en el elemento <httpRuntime> del web.config, ni ningún otro cambio en el archivo de configuración. Simplemente, el anterior código funcionará :-)Y por otra parte, comentar que desde la RC de MVC 3 no se acepta el parámetro
Exclude del atributo [ValidateInput], que se utilizaba para indicar a nivel de controlador las propiedades o campos a omitir del proceso de validación. Por esta razón, dicho atributo será posible utilizarlo únicamente como siempre, para activar o desactivar la validación a nivel de acción, es decir, para todos los valores de la entrada; por ejemplo, en el siguiente código, se indica que los parámetros de entrada a la acción Edit no deben ser validados:
Hey, todo esto está muy bien, pero… ¡AllowHtml no me funciona!
Ya, pero que no cunda el pánico ;-DTodo lo que he dicho anteriormente es verdad, salvo por un pequeño detalle. Debido a un bug de la Release Candidate 2 de ASP.NET MVC 3, ya comentado por ScottGu hace unos días, el atributo
[AllowHtml] no funcionará directamente a no ser que introduzcamos el siguiente código en el global.asax:
Obviamente, la versión final de MVC 3 vendrá con este problemilla solucionado.
Publicado en: Variable not found.
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering / Project Management / Business Process Management
Team Foundation Server 2010, Microsoft Solution Framework y SCRUM
Diciembre 21st, 2010 - [Enlace local]
Me da gusto saber que Microsoft ha invertido para que sus productos consideren SCRUM, si bien hace algunos años era una Utopía SCRUM y todo el tema de Agilidad ahora tiene tal madurez que los grandes corporativos (IBM, Microsoft etc) lo adoptan o aplican a sus productos.
Algunos links interesantes sobre herramientas de Microsoft y SCRUM
Scrum with Team Foundation Server 2010
MSF for Agile Software Development v5.0
» Leer más, comentarios, etc...
xailer.info (esp)
Xailer 2.1.4
Diciembre 20th, 2010 - [Enlace local]
Estimados usuarios de Xailer,
Hoy publicamos una pequeña actualización de Xailer con número de versión 2.1.4. (también accesible por el sistema de actualización automática)
La próxima revisión de Xailer incorporará grandes cambios que seguro os gustaran. Esperamos poder presentaroslo antes de Navidad, es decir, an apenas un par de días.
No intente actualizarse a esta versión hasta que tenga absoluta certeza de que tiene derecho a recibirla.
Un cordial saludo,
[El equipo de Xailer]
» Leer más, comentarios, etc...
Variable not found
Enlaces interesantes 24
Diciembre 20th, 2010 - [Enlace local]
Estos son los enlaces publicados en Variable not found en Facebook y Twitter desde el domingo, 12 de diciembre de 2010 hasta el domingo, 19 de diciembre de 2010.
Espero que te resulten interesantes. :-)
- Patrones para la selección de múltiples entidades en Entity Framework
Fecha: 17/12/2010 - Geolocalización del usuario desde el navegador
Fecha: 17/12/2010 - SuprotimAgarwal: Video Web Helper in ASP.NET MVC 3 RC 2
Fecha: 17/12/2010 - Scott Guthrie: ASP.NET MVC 3: Implicit and Explicit code nuggets with Razor
Fecha: 17/12/2010 - http://weblogs.asp.net/scottgu/archive/2010/12/15/asp-net-mvc-3-razor-s-and-lt-text-gt-syntax.aspx
Fecha: 17/12/2010 - Obtener el ID del usuario actual en ASP.NET, por Eduard Tomàs.
Fecha: 17/12/2010 - Marcin Dobosz: Razor, Nested Layouts and Redefined Sections - Razor layout made easier ASP.NET MVC
Fecha: 15/12/2010 - Scott Guthrie: I just blogged details of a ASP.NET MVC 3 RC2 bug and an easy fix to temporarily work around it
Fecha: 15/12/2010 - José Manuel Alarcón: Cómo crear un temporizador global en ASP.NET
Fecha: 14/12/2010
Publicado en: Variable not found
» Leer más, comentarios, etc...
Ingenieria de Software / Software Engineering / Project Management / Business Process Management
CRM y BPM
Diciembre 20th, 2010 - [Enlace local]
Cuales son los principales problemas dentro de una estrategia de CRM y como puede ayudar a resolverlos BPM, el el siguiente artículo se menciona estos 2 temas, resalto lo siguiente
1) Ofrecer respuestas adecuadas y en el tiempo adecuado a los clientes
2) Automatizar los procesos de CRM sin ser necesario accesar a varias fuentes de información
» Leer más, comentarios, etc...
MadeInFlex
Flex Hero: Size Report, OSMF y RSLs
Diciembre 19th, 2010 - [Enlace local]
Acabaremos esta serie de Hero para desktop con este post, hablando de estos tres aspectos importantes: Size Report, Open Source Media Framework (OSMF) y mejoras en cuanto a las Run Shared Libraries (RSL).
Hero Size Report
El tamaño final de las aplicaciones siempre es un aspecto determinante para cualquier proyecto. En este apartado veremos las mejoras que ha realizado Hero en este ámbito.
El compilador de Flex 3.x y 4.0 nos proporciona la opción -link-report , que genera un report XML, detallando el tamaño aproximado en bytes todas las clases ActionScript incluidas en el SWF final. Nos puede ayudar a ver durante el desarrollo, las areas que contribuyen, en mayor mesura, a tener una película demasiado pesada.
También disponemos de la utilidad swfdump utility, que proporciona un report de alto nivel, pero no lo suficientemente adecuado para ver las áreas problemáticas relacionadas con el tamaño de la película.
Flex 4.5 mejora la opción -size-report para tener un total del peso de cada tipo dentro del SWF (script, media, fonts, etc).
Uso
Cuando usamos mxmlc o compc -size-report
El tag principal report, contiene un subtag llamado swf que nos da el tamaño en bytes del SWF, tanto comprimido como no comprimido.
Otra información
Este report también nos da información importante como puede ser:
- Sumario por frame:Nos proporciona un sumario de todos los scripts y tags a nivel de frame.
- Actionscript: Datos ActionScript asociados con el SWF.
- Frame data: Datos adicionales a las definiciones de los frames relacionados al SWF.
- Bitmap data: Los bitmap data embebidos en la aplicación.
- Fonts: Todas las Fuentes embebidas.
- Sprite: Datos a nivel de Sprite.
- Datos de los Shapes
- Datos binarios: Datos binarios relacionados con el SWF, como pueden ser shaders, Pixel Bender u otros tipos de datos embebidos.
- Datos de sonido
- Datos de video
Más información sobre esta característica aquí.
Integración de OSMF 1.0
Flex Hero actualiza la version de OSMF a 1.0. Con esta actualización se añado soporte para HTTP Streaming. Podemos usar esta funcionalidad para proporcionar recursos bajo demanda, como streamming dinámico mediante el componente Spark VideoPlayer.
Dos enlaces para más información:
HTTP Streaming
Información
Mejoras de Hero en cuanto a RSLs
Se ha hecho un esfuerzo para poder usar las RSLs de manera mucho más fácil y más efectiva.
El uso de las RSLs en la caché de Flash Player se introdujo en Flex 3. Flex 3 solo tenía 3 RSLs y solo se cargaba por defecto la RSL del framework. La opción RSL linkage estaba desactivada por defecto.
En Flex 4 se hizo el cambio para que se cargaran todas las RSLs y para permitir que pudieran ser debuggadas, aunque no se cambió la manera de cómo se configuraban y cargaban. Se cargaban 6 RSLs para cada aplicación.
Las RSLs se definieron de manera muy simple: especificando el SWC que se quiere como librería externa y luego cargando la RSL desde la URL que contiene todas las clases necesarias para que la aplicación funcione.
Historial de las RSLs
1. El número de RSLs aumentó en el paso de Flex 3 a Flex 4. La carga de todas las RSLs retarda el inicio de la aplicación, ya que las RSLs deben cargarse aunque no se usen en la aplicación.
2. En Flex 4 se espera que las sub-aplicaciones y modules usen las RSLs cargadas por la aplicación primcipal. Pero hay módulos que necesitan custom RSLs. Podemos pensar que la aplicación principal cargará estas custom RSLs, pero no es así.
3. Podemos crear RSLs para sobreescribir clases de las RSLs del SDK, pero el proceso es complicado.
4. Se está creando un set de componentes Spark como análogos de los componentes mx. En muchos casos no hace falta usar componentes mx. Si incluimos la RSL del framework, se cargan todos los components mx y provoca más consumo de memoria.
En relación a todo esto, Hero aplica las siguientes soluciones:
1. El compilador elimina las RSLs que no son usadas por la aplicación, usando una nueva opción de compilación: “remove-unused-rsls”.
2. Si una sub-aplicación o módulo intenta cargar una RSL que ya ha sido cargada, la ignora.
3. Para poder sobreescribir RSLs, podemos incluir una opción de compilador para que incluya sólo la herencia de dependencias en un SWC que serán usadas por la RSL sobreescrita.
4. Se han movido los componentes mx a una RSL separada para poder descartarla si no la usamos.
Rendimiento
El rendimiento usando RSLs ha mejorado en Flex 4.5 comparado con Flex 4.0. Las mejoras se deben a no cargar las RSLs que no se necesitan y la reducción de tamaño de la RSL del framework.
Se han hecho tests con una aplicación simple, la típica “Hello World” para demostrar las mejoras de rendimiento.
La aplicación ha sido complada en 4.0 y en 4.5 con la opción de compilador “remove-unused-rsls”. El resultado es que se han quitado RSL que no se usan, como osmf o rpc y se ha conseguido reducir el tamaño de la RSL del framework de 608 KB a 310 KB.
Con una velocidad de bajada de 1500 kbps, se optienen estos resultados:
para la versión de SDK 4.5 el tiempo de inicialización es de 9 segundos y la memoria de sistema necesaria es de 14 MB, mientras que para el SDK 4.0 se precisan 15 segundos de inicialización y 17.4 MB de memoria.
Así observamos que hay una reducción considerable en cuanto a tiempo y a memoria.
Más info en estos dos links:
RSL enhancements
Linking RSLs







