RSS

Spring Community Day Lima 2009

sábado, 17 de octubre de 2009


Uno de los últimos eventos de este año para la comunidad peruana de desarrolladores, el Spring Community Day Lima 2009 una conferencia en la cual los expositores (incluido el autor) compartiràn su experiencia sobre el framework Spring con la comunidad, hasta el momento ya nos encontramos en la segunda reuniòn de coordinación y el evento promete bastante, vamos a desarrollar un caso de negocio completo, inciando desde el user story (perspectiva ágil desde luego) hasta pasar por cada uno de los proyectos de Spring, mi parte junto con Mayer Horna es Spring DAO, usaremos hibernate y MySql hasta el momento.

Entre los demás proyectos de Spring a verse están Spring MVC, Spring Core, Spring Security, Unit Test con Spring y al final pero no menos importante la subida del proyecto a la nube por medio de Cloud Foundry.

Durante el evento se podrán twitterar preguntas que se responderán al momento, y los asistentes que lleven sus portátiles podrán seguirnos con el código que va a estar publicado previamente, bueno solo queda invitar a la comunidad a que participen de este gran evento.

Dejo el link del evento, saludos.

Mi primer Scrum Mind map

jueves, 10 de septiembre de 2009



Desde hace un tiempo que me vengo interesando bastante por el mundo de las metodologías ágiles, he estado investigando acerca de Scrum, XP, kanban, Lean entre otras. Es así que es estado participando en las reuniones de la comunidad e AgilePeru oyendo las experiencias de las personas que tomaron la iniciaiva de lo agil y les va muy bien, en el Peru esto todavia no esta muy desarrollado, pues la mayoría de las consultoras sigue 2 o hasta podríamos decir que 3 caminos: El primero es el de RUP, quièn no ha empezado con RUP y sus famosas iteraciones, despues de esto algo que esta ganando cada vez más adeptos es el famoso y muy conocido CMMI con sus innumerables documentos conforme niveles vas escalando en el modelo, y a decir verdad es bastante bueno, yo mismo he trabajado en varios proyectos implementando esta metodología y he revisado sus bases y me parece bastante completa, sin embargo creo que no sería ideal para cualquier proyecto, debido precisamente a su complejidad, en proyectos en los que los requerimientos son muy cambiantes y el tiempo es bastante ajustado creo que no sería nuestra mejor opción.

Es precisamente allí donde entran las metodologías agiles, cuyos preceptos no he oído decir pero a mi parecer tienen una filosofía totalmente contraria a RUP y CMMI, quienes dicen documenta primero, detalla lo más que puedas y de despues de eso dale los documentos al programador que el no necesita ni conversar con los analistas, en el doc esta todo... :S.

Bueno últimamente he estado en proyectos del tipo lo necesito para mañana!!!, es por ello el motivo de mi investigación y en particular en este caso el propósito de este post, he creado un mapa mental (tecnica la cual recomendo enormemente, en otro artículo explicare sus bondades) para poder diagramar el modo de trabajo de scrum y cuáles son los pasos básicos para la implementación del mismo en una empresa, vale decir que esta muy amarrado con conceptos de
productividad y trabajo en equipo y que como en todo lugar el primer problema a enfrentar el el cambio, algo a la que muchas personas se oponen radicalmente, por miedo generalmente pero al final es algo necesario, todo siempre cambia.

Dejo la imagen del mi mapa mental, así como el archivo original, lo he creado con una herramienta llamada XMind que permite subir los mapas a su web para verlos online (no abre con IE).

Saludos

Introducción a Mantis Bug Tracker

miércoles, 5 de agosto de 2009

Después de tiempo regreso a los post, esta vez para explicar una herramienta muy útil el Mantis Bug Tracker.

En los desarrollos orientados a la calidad es muy importante hacer un seguimiento a las observaciones que se dan en tiempo de desarrollo, en muchas empresas esto se da a través de archivos Excel en donde se listan una serie de incidencias y pantallazos con la evidencia correspondiente, el MantisBT es un software Open Source que nos permite realizar esto, trae un entorno totalmente ágil para poder registrar incidencias, asignar una incidencia a uno o muchos usuarios, crear roles para los usuarios (informador, desarrollador, etc), agregar documentos por incidencia, entre otras cosas. Se instala sobre un servidor LAMP o WAMP, trae su propia BBDD en MySql y es bastante personalizable.

Asimismo se puede integrar con muchas herramientas como un cliente de correo (si no se tiene un dominio propio se puede usar gmail) para que se nos envíe un mail al momento de que Calidad nos reporte una nueva incidencia o cuando la incidencia cambie de estado; Se puede integrar con eclipse, CVS o SVN para que nuestras incidencias aparezcan como tareas en el eclipse y de este modo asociar un commit a una tarea y por tanto a una incidencia (se cambia de estado y se envía un correo automáticamente apenas commiteamos desde el eclipse).

Bueno, espero que les pueda ayudar, sobre todo porque las incidencias no son tan solo cosas que hay que arreglar y ya, sino que a través del seguimiento de la misma podemos tener datos importantes que nos ayuden a determinar el costo final de un proyecto y el tiempo del mismo.

Saludos.

TreePanel con ExtJS

lunes, 15 de junio de 2009

En este pequeño articulo vamos a iniciar creando un menú que abra las páginas que le indicamos, para esto vamos a necesitar la liberia del ExtJS y principalmente la clase Ext.tree.TreePanel, en mi caso lo he hecho con la versión 3.0 que a la fecha de este post se encuentra en RC 2.

ExtJS: http://extjs.com/products/extjs/download.php

Importamos las librerias de ext y luego los archivos:

pricipal.css






/** CSS para pantalla principal **/



html, body {



font: normal 12px verdana;



margin: 0;



padding: 0;



border: 0 none;



overflow: hidden;



height: 100%;



}



.p {



margin:5px;



}



.msg .x-box-mc {



font-size:13px;



}



#msg-div {



position:absolute;



left:35%;



top:10px;



width:310px;



z-index:30000;



}.x-grid3-row-body p {



margin:5px 5px 10px 5px !important;



}.settings {



background-image:url(../images/png/folder_wrench.png);



}.nav {



background-image:url(../images/png/folder_go.png);



}#north {



background: #7F99BE url(../images/gif/layout-browser-hd-bg.gif) repeat-x center;



}







#center1 {



background-image:url(../images/jpeg/desktop.jpg);



}



#north h1 {



font-size: 16px;



color: #fff;



font-weight: normal;



padding: 5px 10px;



}







.principal_tabhome{



background-image:url(../images/png/principal_home.png) !important;




customTreePanel.js


Ext.BLANK_IMAGE_URL = 'ext/resources/images/default/s.gif';
Ext.namespace('Ext.org.demo');

//Clase para creacion de los tabs en la parte derecha
Ext.ux.IFrameComponent = Ext.extend(Ext.BoxComponent, {
onRender : function(ct, position){
this.el = ct.createChild({tag: 'iframe', id: 'iframe-'+ this.id, frameBorder: 0, src: this.url});
}
});

//Panel Superior
Ext.org.demo.PrincipalHeader = function(config) {
var tree = config.tree;
var myRef = this;
this.txtFindObject = new Ext.form.TextField({
width: 200,
emptyText:'Buscar',
listeners:{
render: function(f){
f.el.on('keydown',
function (e){
tree.filterTree(e);
}
, f, {buffer: 350});
}
}
});

this.btnExpandAll = new Ext.Toolbar.Button({
iconCls: 'icon-expand-all',
tooltip: 'Expandir Todo',
handler: function(){
tree.root.expand(true);
}
});

this.btnCollapseAll = new Ext.Toolbar.Button({
iconCls: 'icon-collapse-all',
tooltip: 'Colapsar Todo',
handler: function(){
tree.root.collapse(true);
}
})

this.toolBar = new Ext.Toolbar({
cls:'top-toolbar',
items:[ ' '
,this.txtFindObject
,' '
,' '
,this.btnExpandAll
,'-'
,this.btnCollapseAll
]
});

config.items = [{
xtype:'box',
el:'north',
border:false,
anchor: 'none -25'
}
,this.toolBar
];

Ext.org.demo.PrincipalHeader.superclass.constructor.call(this, config);
}

Ext.extend(Ext.org.demo.PrincipalHeader, Ext.Panel, {
layout:'anchor',
initComponent: function(){
Ext.org.demo.PrincipalHeader.superclass.initComponent.apply(this);
}
});



//Tree
Ext.org.demo.PrincipalTree = function(config) {

var filter = new Ext.tree.TreeFilter(this, {
clearBlank: true,
autoClear: true
});
var hiddenPkgs = [];

this.filterTree = function filterTree(e){

var text = e.target.value;
Ext.each(hiddenPkgs, function(n){
n.ui.show();
});
if(!text){
filter.clear();
return;
}
this.expandAll();

var re = new RegExp( Ext.escapeRe(text), 'i');
filter.filterBy(function(n){
return !n.attributes.leaf || re.test(n.text);
});

hiddenPkgs = [];
this.root.cascade(function(n){
if(!n.attributes.leaf && n.ui.ctNode.offsetHeight < 3){
n.ui.hide();
hiddenPkgs.push(n);
}
});
}
Ext.org.demo.PrincipalTree.superclass.constructor.call(this, config);
}

Ext.extend(Ext.org.demo.PrincipalTree, Ext.tree.TreePanel, {
//enableDD: true,
minSize: 175,
maxSize: 300,
width: 200,
initComponent: function(){
Ext.org.demo.PrincipalTree.superclass.initComponent.apply(this);
}
});

//Vista Principal, agrupa al panel superior, izquierdo, centro
Ext.org.demo.PrincipalView = function(config) {
this.north = config.north;
this.west = config.west;
this.center = config.center;

config.items = [
this.north
,this.west
,this.center
];

//Funcion para añadir un tab
this.addTab = function addTab(e) {
var tabs = this.center;

var open = !tabs.getItem(e.id);
if (open){
var newPanel = new Ext.Panel({
id : e.id,
title: e.text,
loadScripts: true,
autoScroll: true,
closable: true,
iconCls:e.id,
//style: "background:url("+e.attributes.icon+")!important",
//icon : e.attributes.icon,
layout:'fit',
items: [ new Ext.ux.IFrameComponent({
id: e.id
, url: e.attributes.url
, name: e.id
}) ]
});
tabs.add(newPanel);
tabs.setActiveTab(newPanel);
}
else {
tabs.setActiveTab(e.id);
}
}

//Para controlar el load de los items
this.west.on('click', function(node, e){
if(node.isLeaf()){
e.stopEvent();
this.addTab(node);
}
},this);


Ext.org.demo.PrincipalView.superclass.constructor.call(this, config);
};

Ext.extend(Ext.org.demo.PrincipalView, Ext.Viewport, {
layout:'border'
});


Ext.onReady(function(){
Ext.state.Manager.setProvider(new Ext.state.CookieProvider());

//LADO IZQUIERDO: Arbol
var tree = new Ext.org.demo.PrincipalTree({
rootVisible:false,
lines: true,
region:'west',
split: true,
autoScroll: true,
title:'Menu de Opciones',
iconCls:'principal_mainmenu',
singleExpand: false,
collapsible: true,
layoutConfig:{
animate:true
},
loader: new Ext.tree.TreeLoader({}),
root: new Ext.tree.AsyncTreeNode(
{
'children':
[
{
'text':'Base',
'children':
[
{
'id':'Ordenes_de_Pedido',
'icon':'urlDelIcono.png',
'text':'Ordenes de Pedido',
'leaf':true,
'url': 'urlDeLaPagina.html'
},{
'id':'Mantenimiento de Empleados',
'icon':'urlDelIcono.png',
'text':'Mantenimiento de Empleados',
'leaf':true
},{
'id':'Empresa_de_Servicio',
'icon':'urlDelIcono.png',
'text':'Empresas de Servicio',
'leaf':true
}
]
},
{
'text':'Segundo Modulo',
'children':
[
{
'id':'Empresa2',
'icon':'urlDelIcono.png',
'text':'Empresa 2',
'leaf':true
},{
'id':'ModuloDePruebas1',
'icon':'urlDelIcono.png',
'text':'Modulo de Pruebas 1',
'leaf':true
},{
'id':'ModuloDePruebas2',
'icon':'urlDelIcono.png',
'text':'Modulo de Pruebas 2',
'leaf':true
}
]
}
],
'expanded':true
}
)
});

//PARTE SUPERIOR: Para las busquedas de objetos en el menu
var hd = new Ext.org.demo.PrincipalHeader({
border: false,
region:'north',
cls: 'docs-header',
height:60,
tree : tree
});

//Tab Panel (Parte derecha)
var tabs = new Ext.TabPanel({
region:'center',
deferredRender:false,
activeTab:0,
items:[{
contentEl:'center1',
title: 'Home',
iconCls: 'principal_tabhome',
html : 'Aqui se puede linkear a una imagen o ingresar cualquier fragmento de html',
//autoLoad: 'http://www.google.com.pe/',
autoScroll:true
}]
});

var principalView = new Ext.org.demo.PrincipalView({
north:hd
,west:tree
,center:tabs
});
});

Esta claro que hay partes de este código que deben generarse dinámicamente como el bloque que va dentro de: "Ext.tree.AsyncTreeNode", esto podría de acuerdo a los roles y permisos que tenga el usuario logeado, tambien se puede dividir el codigo en varios *.js, pero esto hubiera hecho aún mas largo este post. :S

un ejemplo de como se vería.

Novedades del Twitter...

lunes, 8 de junio de 2009

Este es un resúmen de las noticias que he encontrado gracias al twitter.

Java Servlet 3.0 Specification. Consigo trae nuevas características como el uso de anotaciones para filtros, listeners y servlets, así como la capacidad de insertar Fragmentos de códigoen archivos de donfiguracion adicionales al web.xml. (@lshimokawa).

Eclipse Galileo. Nueva versión del eclipse que hasta esta fecha esta en release candidate 2 sale liberada completamente en 3 semanas, propone nuevas características que serán mostradas en el eclipse DemoCamp, para los que no soporten la espera la RC3 esta disponible para descarga y testeo. (@springhispano).

Spring Source Tool Suit 2.1.0 M2 Released, para los que usamos esta implementación de eclipse especialmente diseñada para el desarrollo con Spring esta nueva versión trae soporte para nuevas anotaciones, integración con VMWare Lab Manager, etc, más info y/o descarga del STS aquí.

Saludos

Demo Ext v1

miércoles, 20 de mayo de 2009

Muchas personas me han pedido un pequeño demo sobre como poder comenzar a desarrollar con Ext, así que aquí va, el primer demo que integra un mantenimiento completo, bastante simple y compacto, hecho con eclipse, MySQL, Struts e Ibatis, espero que les pueda servir de ayuda para poder comenzar con este Framework, próximamente estaré colgando una demo sobre como usar JavaScript Orientado a Objetos y como desarrollar aplicaciones grandes con Ext, conultas un post o por mail.

Link de descarga.

Spring Live 2009

lunes, 18 de mayo de 2009

Y finalmente culminó el "Spring Live 2009", día tan esperado entre muchos programadores, aunque no tuve la oportunidad de ir, tengo muchos compañeros que asistieron y me comentaron que a pesar de uno que otro percance, el contenido de los temas fueron altamente nutritivos, me hablaron mucho de las novedades de Spring 3.0, las diferentes integraciones de Spring con frameworks como Flex y ExtJs así como la introducción que dieron sobre Grails. Y bueno parece que el evento fue todo un éxito y hay grandes posibilidades de tener otro como este a fin del año, felicitaciones a JoeDayz organizador del evento y esperemos que hallan más de estas conferencias.

ExtJS 3.0 RC1.1 liberada!


La versión 3.0 de ExtJS ya ha sido liberada, con ella trae muchas actualizaciones en cuanto a corrección de Bugs y sobretodo nuevos widgets, tales como ListView, Toolbar, RowEditors, Grouped Tabs, Buttons de diferentes diseños y formas, Charts (gráficos estadísticos) y algunas nuevas clases como Ext.Direct que simplifica considerablemente la comunicación entre el lado del cliente y el servidor; asimismo ya esta disponible el manual online creado por el equipo de Ext, les dejo el link.