jueves, 20 de diciembre de 2012

Javascript Kata String Reverse

Code in javascript
String.prototype.reverse = function(){
 var result = [];
 var values =  this.split('');
 for(var cont = 0; cont < values.length; cont++){
   result.unshift(values[cont]);
 }
 return result.join('');
}

Test with Jasmine
describe("StringReverse", function () {
    describe("Funcionatity", function(){

        it("Reverse two characters", function () {
            var value = 'va';
            expect(value.reverse()).toEqual('av');
        });

        it("Reverse three characters", function () {
            var value = 'val';
            expect(value.reverse()).toEqual('lav');
        });

        it("Reverse number with three digits", function () {
            var value = '123';
            expect(value.reverse()).toEqual('321');
        });

        it("Reverse complex line text", function () {
            var value = 'q1w2e3r4t5y6u7i8o9p0';
            expect(value.reverse()).toEqual('0p9o8i7u6y5t4r3e2w1q');
        });
    });
});

ScreenShot with the final result

Profesionalidad

Copio literalmente el artículo de Antonio Elena porque me ha parecido excelente. Otra cosa es que lo viva.


La honradez y la sinceridad son las mejores políticas, aunque no lo parezcan a largo plazo. Esta es una breve lista cuya mayoria de elementos casi siempre olvidamos en nuestro día a día. Yo el primero.
  • Se sincero siempre.
  • Acepta la responsabilidad de lo que dices. Tus afirmaciones, tus opiniones, son tuyas.
  • Admite tus errores. No pasa nada. Todo el mundo se equivoca. Admítelos sin vergüenza. Hazlos públicos. En realidad la gente, o las buenas personas, siempre aprecian la transparencia.
  • De la misma, manera no te preocupe mostrar desacuerdo, siempre con educación, cuando te mientan, tergiversen tu información o no sean claros contigo.
  • Expresa tus opiniones siempre de forma constructiva, buscando la conciliación, pero sin tener miedo de expresarlas.
  • Aprende a decir no.
  • Se amable. Agradece con sinceridad el esfuerzo de los demás o habla con ellos cuando tengas algo que objetar.
  • No hables mal a las espaldas de la gente. No enredes, no desinformes.
Si sigues estas guías, deberías poder esperar que los demás también lo hicieran, pero si no, tu ética es la que es. Hay una cita famosa, que no se de quién es, que viene a decir, “no podemos romper la ley, nos rompemos nosotros ocontra la ley”. El original inglés queda mejor, “we cannot break the law, we break ourselves against the law,” y es que el hecho de actuar en contra de nuestro principios solo nos vas a perjudicar a nosotros mismos.
Practicar esto día a día requiere constancia, atención voluntaria y dedicación, pero los resultados son siempre positivos, si bien es un esfuerzo que en solitario lleva bastante tiempo. Mejora tu ambiente laboral, y las relaciones con tus jefes o con los que dependen de ti o tus iguales en tu equipo. Con los clientes, quizás sea más discutible, pero a la larga creo que es igualmente positivo. Y esa mejora, no tengas duda, contagia el resto de aspectos de tu vida.
Si tu entorno de trabajo es un sitio lleno de mentiras, de tensiones, de peleas o malas palabras, ten por seguro que pronto afectará a facetas de tu vida ajenas a la laboral.

Kata StringBuilder

This Kata consist in Simulate the behaviour of the StringBuilder Class. The framework test is Jasmine

The javascript  class
function StringBuilder(value){
 var buffer = new Array(value);
 this.toString = function(){
  return buffer.join('');
 }
 this.append = function(value){
  buffer.push(value);
 }
 this.clear = function(){
  buffer.length = 1;
 }
}

The tests< br />
describe("StringBuilder", function () {
    
    describe("StringBuilder Constructor", function () {
        it("Empty Constructor", function(){
            var stringBuilder =  new StringBuilder('');
            expect(stringBuilder.toString()).toEqual('');
        });

        it("Constructor with some value", function () {
            var value = 'value';
            var stringBuilder =  new StringBuilder(value);
            expect(stringBuilder.toString()).toEqual(value);
        });

    });

    describe("Funcionatity", function(){
        it("Append only a value", function () {
            var value = 'value';
            var stringBuilder =  new StringBuilder('');
            stringBuilder.append(value);
            expect(stringBuilder.toString()).toEqual(value);
        });

        it("Append two values", function () {
            var valueOne  = 'valueOne';
            var valueTwo = 'valueTwo';
            var stringBuilder =  new StringBuilder('');
            stringBuilder.append(valueOne);
            stringBuilder.append(valueTwo);
            expect(stringBuilder.toString()).toEqual(valueOne + valueTwo);
        });        

        it("Append three values", function () {
            var valueOne  = 'valueOne';
            var valueTwo = 'valueTwo';
            var valueThree = 'valueThree';
            var stringBuilder =  new StringBuilder('');
            stringBuilder.append(valueOne);
            stringBuilder.append(valueTwo);
            stringBuilder.append(valueThree);
            expect(stringBuilder.toString()).toEqual(valueOne + valueTwo + valueThree);
        });  

        it("Clear values", function () {
            var valueOne  = 'valueOne';
            var valueTwo = 'valueTwo';
            var valueThree = 'valueThree';
            var stringBuilder =  new StringBuilder('');
            stringBuilder.append(valueOne);
            stringBuilder.append(valueTwo);
            stringBuilder.append(valueThree);
            stringBuilder.clear();
            expect(stringBuilder.toString()).toEqual('');
        });        
    });
})

screenshot of all passed tests


viernes, 14 de diciembre de 2012

Simple Herency in Javascript

//May be, I'm wrong and there is a better way 
//for getting simple herency in javascript
function Thing(name){
 this.color = 'black';
 this.name = name;
}

Thing.prototype.sayName =  function(){
 alert('Thing My name is: ' + this.name);
}

Thing.prototype.sayColor = function(){
  alert('My color is: ' + this.color);
}

function Animal(){
 Thing.call(this, "Floppy"); //<--- herency properties with a parameter
 this.age = 12;
}

Animal.prototype = new Thing();    //<--- set herecy functions by prototypes 
Animal.prototype.constructor = Animal; //<-- set constructor of the object Animal

Animal.prototype.sayAge = function(){
  alert('Animal, my age is: ' + this.age);
}

Animal.prototype.sayName =  function(){ //<--- override the mother's function sayName
  alert('Animal My name is: ' + this.name);
}

var dog = new Animal();
dog.color = 'red';
var phone = new Thing('htc');

alert(' phone color: ' + phone.color + ' phone name: ' + phone.name);
alert('dog, age: ' + dog.age + ' dog color: ' + dog.color + ' dog name: ' + dog.name);
phone.sayName();
phone.sayColor();
dog.sayName();
dog.sayAge();

martes, 4 de diciembre de 2012

Clean Code Definition

  • Easy to understand.
  • Easy to modify.
  • Easy to test.
  • Works correctly (of course) 
source: stackoverflow.com

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");
    }
}