jueves, 29 de noviembre de 2012

Citas sobre el agilismo y el desarrollo del software

Cosas que me he encontrado y me han gustado relacionado con el agilismo y el desarrollo del software.

"Todo viaje de mil millas empieza con un solo paso" Lao Tze.

"Escoge un trabajo que te guste, y no tendrás que trabajar ni un sólo día de tu vida" Confucio.

+-+-+-+-+-+-++-+-+-+-+-+-++-+-+-+-+-+-++-+-+-+-+-+-++-+-+-+-+-+-++-+-+-+-+-+-+
Manifisto Ágil

Individuals and interactions over processes and tools. Sin personas con conocimiento técnico y actitud adecuada, no producen resultados.
Working software over comprehensive documentation. Los documentos no pueden sustituir, ni pueden ofrecer la riqueza y generación de valor que se logra con la comunicación directa entre las personas y a través de la interacción con los prototipos.
Customer collaboration over contract negotiation. Dar el mayor valor posible en cada iteración, y de forma continua. Un contrato no aporta valor al producto. En el desarrollo ágil el cliente es un miembro más del equipo, que se integra y colabora en el grupo de trabajo.
Responding to change over following a plan. La anticipación y la adaptación.

+-+-+-+-+-+-++-+-+-+-+-+-++-+-+-+-+-+-++-+-+-+-+-+-++-+-+-+-+-+-++-+-+-+-+-+-+

A los individuos y su interacción, por encima de los procesos y las herramientas.
El software que funciona, por encima de la documentación exhaustiva.
La colaboración con el cliente, por encima de la negociación contractual.
La respuesta al cambio, por encima del seguimiento de un plan.

Aunque hay valor en los elementos de la derecha, valoramos más los de la izquierda

+-+-+-+-+-+-++-+-+-+-+-+-++-+-+-+-+-+-++-+-+-+-+-+-++-+-+-+-+-+-++-+-+-+-+-+-+

El software que funciona es la principal medida del progreso.
La excelencia técnica es un objetivo interno de la agilidad, tanto para la organización, como para el proyecto y para las personas. La adaptación continua al cambio requiere excelencia técnica en el diseño de la arquitectura, refactorización, simplicidad… Sin excelencia técnica por parte del equipo el resultado no tiene la sencillez, robustez y flexibilidad necesarias para desarrollarse en un entorno ágil, que exige cambio y modificación continua.
Contar con personas valiosas y motivadas es un factor clave. La agilidad necesita talento y motivación. La cultura y política de gestión de personal debe estar alineado en este sentido.
Las personas del negocio y los desarrolladores deben trabajar juntos de forma cotidiana a través del proyecto.
La simplicidad como arte de maximizar la cantidad de trabajo que se hace, es esencial.
El desarrollo ágil se basa en la construcción iterativa. En la entrega continua de pequeños módulos de valor.
Los desarrollos se basan en la modularidad sobre “piezas” funcionales simples. En intervalos regulares, el equipo reflexiona sobre la forma de ser más efectivo y ajusta su conducta en consecuencia.

+-+-+-+-+-+-++-+-+-+-+-+-++-+-+-+-+-+-++-+-+-+-+-+-++-+-+-+-+-+-++-+-+-+-+-+-+

"La diferencia entre los promedios y los mejores ya no es de 1:2, como en el pasado. Es 1:100 o incluso 1:1000" Nathan Myhrvold (Ex-director de I+D de Microsoft)


Cada uno de los ciclos de desarrollo es una iteración (sprint) que produce un incremento terminado y operativo del producto. Estas iteraciones son la base del desarrollo ágil, y Scrum gestiona su evolución a través de reuniones breves de seguimiento en las que todo el equipo revisa el trabajo realizado desde la reunión anterior y el previsto hasta la reunión siguiente.

El desarrollo ágil no es un desarrollo por fases.

En Scrum los equipos son auto-organizados, con margen de decisión suficiente para tomar las decisiones que consideren oportunas.

martes, 27 de noviembre de 2012

SharePoint 2010 KeywordQuery searchs in SPLists & Document Libraries

private ResultTableCollection RearlizarLaBusqueda(Busqueda busqueda)
{
    ResultTableCollection resultado = new ResultTableCollection();
    using (SPSite sitio = new SPSite(_url))
    {
        KeywordQuery consulta = new KeywordQuery(sitio);
        consulta = ConfigurarConsulta(consulta, busqueda);
        if (_validador.EsValidaLaConsulta(consulta))
        { resultado = consulta.Execute(); }
    }
    return resultado;
}

private KeywordQuery ConfigurarConsulta(KeywordQuery consulta, Busqueda busqueda)
{
    var nombresDeListas = ConseguirListasPorModulo(busqueda.Ambito);
    var resultado = consulta;
    string hiddenConstraints = ConfigurarElHiddenConstraints(_url, nombresDeListas);

    resultado.IgnoreAllNoiseQuery = true;
    resultado.KeywordInclusion = KeywordInclusion.AllKeywords;
    resultado.EnableStemming = true;
    resultado.TrimDuplicates = false;
    resultado.ResultTypes = ResultType.RelevantResults;
    resultado.HiddenConstraints = hiddenConstraints;
    resultado.QueryText = busqueda.Texto;
    return resultado;
}

private List ConseguirListasPorModulo(string nombreDelModulo)
{
    var resultado = new List();
    if (string.IsNullOrEmpty(nombreDelModulo))
    {
        resultado = ConseguirTodosLosNombresDeLasListasDeTodosLosModulosPermitidos();
    }
    else 
    {
        resultado = _gestorConfiguracionBusqueda.ConseguirLosNombresDeLasListasPorNombreDeModulo(nombreDelModulo);
    }
    return resultado;
    
}

private string ConfigurarElHiddenConstraints(string url, List nombresDeListas)
{
    StringBuilder ambitos = new StringBuilder(string.Empty);
    string direccionDeLista = string.Empty;
    var urlLista = string.Empty;
    for (int contador = 0; contador < nombresDeListas.Count; contador++)
    {
        urlLista = ConstruirUrlLista(url, nombresDeListas[contador]);
        direccionDeLista = string.Format("site:\"{0}\"", urlLista);
        ambitos.Append(direccionDeLista);
        if (contador + 1 < nombresDeListas.Count) 
        {
           ambitos.Append(" OR ");

        }
   }
   return ambitos.ToString();
}

private string ConstruirUrlLista(string url, string nombreLista)
{
    using(SPSite site = new SPSite(url))
    using (SPWeb web = site.OpenWeb())
    {
       var lista = web.Lists.TryGetList(nombreLista);
       if (lista != null)
       {
           return lista.ParentWeb.Url + "/" + lista.RootFolder.Url + "/";
       }
       throw new Exception("Nombre de lista no encontrada");
    }
}

lunes, 19 de noviembre de 2012

loading animation with JQuery-BlockUI

When the dats are loading from the server, i needed a loading page animation. I´ve dicovered BlockUI
This the code:


   



viernes, 16 de noviembre de 2012

Scopes in Javascript

   window.color = “red”; //<-- general scope everything without a scope
   var object = { color: “blue” };
   function sayColor(){
     //alert(this.color);
   }
   sayColor(); //”red” without scope
   o.sayColor = sayColor;
   o.sayColor(); //”blue” inside a object/function

Function Declarations vs. Function Expressions

A Function Declaration is:
function add(numberOne, numberTwo){
    return numberOne + numberTwo;
}
A Function Expressions is:
var add = function(numberOne, numberTwo){
      return numberOne + numberTow;
};
When we write a function declaration, it's loaded in the execution context, before the script runs, but when we write a function expresion, the interpreter, load while it's executing the code. So we can find a simple error.
//alert(add(10,10)); the vm doesn't found the function add(), because it's not loaded
var add = function(numberOne, numberTwo){
      return numberOne + numberTow;
};

My first Class in Javascript: Manage the Html tag select

//objeto que describe cada uno de los 
//options del Select|Combo
function ComboOption(texto, valor) {
    this.texto = texto;
    this.valor = valor;
}

//Gestiona las posibles operaciones sobre el control
//HTML 
function GestorCombo(idCombo) {
    this.combo = document.getElementById(idCombo);
    if (this.combo == null) { return; }

    this.borrarTodasLasOpciones = function () {

        var i;
        for (i = this.combo.length - 1; i >= 0; i--) {
            if (this.combo.options[i].selected) {
                this.combo.remove(i);
            }
        }
    }

    this.aniadirOption = function (option) {
        this.combo.options[this.combo.options.length] = new Option(option.texto, option.valor);
    }

    this.conseguirValorSeleccionado = function () {
        var resultado = '';
        if ((this.combo.selectedIndex > -1) && (this.combo.options.length > 0)) {
            resultado = this.combo.options[this.combo.selectedIndex].value;
        }
        return resultado;
    }

    this.seleccionarOption = function (valor) {
        for (i = 0; i < this.combo.options.length; i++) {
            if (this.combo.options[i].value == valor) { break; } 
        }
        this.combo.options.selectedIndex = i;
    }
}

martes, 13 de noviembre de 2012

Brian Crain

A new piano author appears in my life, he's Brian Crain some music of him.
Happy listening!!!

Ordering Asc & Desc In Javascript

It's aMazing and so easy!!! Here it's the code
  function orderDescending(valueOne, valueTwo){
   if(valueTwo > valueOne){
    return 1;
   }
   if (valueTwo < valueOne) {
    return -1;
   }
   else{return 0;}
  }
  function orderAscending(valueOne, valueTwo){
   if(valueTwo > valueOne){
    return -1;
   }
   if (valueTwo < valueOne) {
    return 1;
   }
   else{return 0;} 
  }

  var numbers = [1,4,27,4,8,0];

  numbers.sort(orderAscending);
  //alert(numbers);

  numbers.sort(orderDescending);
  //alert(numbers);

But We can improve it, in this way ...
function Comparator(propertyName) {
   return function(objectOne, objectTwo){
   var valueOne = objectOne[propertyName];
   var valueTwo = objectTwo[propertyName];
   if (value1 < value2){
     return -1;
   } else if (value1 > value2){
      return 1;
   } else {
      return 0;
   }
   };
}
And We can use it in this way
var data = [{name: “PersonOne”, age: 1}, {name: “PersonTwo”, age: 2}];
data.sort(Comparator(“name”));

jueves, 8 de noviembre de 2012

Working With JQueryDataTable data

I´m using JQuery-DataTable in a SharePoint 2010 Application. 
I comunicate server to client throught $.getJSON(url, parameter, function(returnData){});
But when I pass the JSON to JQueryDatatable, it doesn´t work, why? I don´t Know.
It works, with arrays, not with objects, I don´t why. 
But we must convert the JSON Object into Array. So We have to use this simple function

function ConvertObjectToArray(obj) {
        var arr = [];

        for (cont = 0; cont < obj.length; cont++) {
            var t = 0;
            arr[cont] = [obj.length];

            for (var propiedad in obj[cont]) {
                arr[cont][t] = obj[cont][propiedad];
                t++;
            }
        }

        return arr;
    }