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

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

viernes, 26 de octubre de 2012

Javascript Koans

I've started studing javascript, because in my project one work-mate is using jquery-dataTable + JSON.

So I thought, I must learn this language. One way is throught koans.
I down the needed files from account github. Later I des-compressed the .zip file and opened 'about_asserts.js' in the 'topic' folder.




On the other hand I opened 'jskoans.htm' with the browser, and I started.



It's very simple & very useful.
Happy learning!!!!

Dustin O'Halloran

So nice song video
This author has some interesting piano stuff.

Resources for Javascript

crockford.com
node.js jquery
lesscss
coffeescript
async comunications
A spanish javascript course
Some Stuff
Learning JavaScript Design Patterns A book by Addy Osmani

jueves, 25 de octubre de 2012

Charla Motivante

Leyendo a Carlos Ble, me encuentro con una fantástica charla de Joan Melé, que dice cosas muy interesantes.

domingo, 21 de octubre de 2012

Apprenticeship Patterns - Guidance for the Aspiring Software Craftsman

I've just finished reading 'Apprenticeship Patterns - Guidance for the Aspiring Software Craftsman'.
It explains patterns to become a craftsmanship, for example: Be the worst in your team, Get feedback loops, Find a mentor, Share your Knowledge, practice, practice, practice!!! throw pet projects (breakable toys).

It's been very interesting. I recommend it. In the next future, I'll read again.

miércoles, 10 de octubre de 2012

Perpetual Learning

"School is temporary. Education is not. If you want to prosper in life: find something that fascinates you and jump all over it. Don’t wait for someone to teach you; your enthusiasm will attract teachers to you. Don’t worry about diplomas or degrees; just get so good that no one can ignore you."
— James M Bach. Secrets of a Buccaneer-Scholar

Music Player HTML 5

A work mate, has recomended me a free spotify service Groove Shark

miércoles, 26 de septiembre de 2012

Ganas de escribir mejor código

Leyendo en internet, me he contrado:
"He exhorted us every day to write code that we’d be proud to take home and show our moms. He told us over and over, “I don’t care how much you get done, or whether you meet some deadline. I only care that you produce the best quality that you can.”".

En la lengua de Cervantes:
"Él nos exhorta a diario para escribir código que estaríamos orgullosos de llevar a casa y mostrar a nuestras madres. Él nos dijo una y otra vez: "No me importa lo mucho que hacer, o si usted cumple con algún plazo. Sólo me importa que usted produce la mejor calidad que se puede. "" .

domingo, 16 de septiembre de 2012

Patrón (arquitectura) MVP

En el proyecto en el que estoy programando, hemos tomado de decisión de adoptar el patrón MVP, que es Modelo Vista y Presentador. Es algo muy parecido al MVC.
Para hacerse una idea de lo que es, aquí alguna referencia.

Tiene  muchas ventajas, ya que separa realmente en capas la aplicación.
Mejor esto que meter todo en la presentación, no?

Primeramente hay que hacer 4 proyectos. En este ejemplo concreto voy a emplear asp.net, pero perfectamente se puede emplear WindowsForms, Gtk#, ...

Detallo cada uno de los proyectos de los que consta la solución, para implementar la arquitectura MVP. Luego se puede modificar adaptando a las necesidades concretas de cada proyecto.

1º Vista, donde se encuentran los elementos visuales, en este caso .aspx
2º Presentadores, donde se encuentra la lógica del negocio
3º Modelos, donde está lo relacionado con los datos
4º Entidades, todo lo relacionado con las entidades de negocio y lo que viaja por las capas, pero hay que tener en cuenta de que son objetos no datatables, ni datasets.

Como se puede apreciar, la solución con los cuatro proyectos.

Me voy a centrar en un pequeño ejemplo, que es dar de alta un usuario. Comencemos pues ...

Añadimos un nuevo elemento el proyecto de vistas, que se va a llamar NuevoUsuario.aspx, que va a servir para dar de alta a los nuevos usuarios. El código de presentación es el siguiente.

<%@ Page Language="C#" Inherits="Vistas.NuevoUsuario" %>



NuevoUsuario


También se tiene que crear una interfaz, que se va a llamar IUsuarioVista, se encuentra el en proyecto de Presentadores. Define el comportamiento de la página NuevoUsuario.aspx. El código es el siguiente
using System;

namespace Presentadores
{
 public interface IUsuarioVista
 {
  string Nombre { get; } 
  
  string PrimerApellido { get; }
  
  string SegundoApellido { get; }

  string DeportePreferido { get ; }
 }
}
Como se puede observar las propiedades son cada una de las cajas de texto de la página. Esta es la forma de comunicación de datos entre la vista y el presentador. Como se ve lógico hay una entidad, que se llama Usuario, se crea en el proyecto de Entidades, su código es:
using System;

namespace Entidades
{
 public class Usuario
 {
  public string Nombre {
   get;
   set;
  }
  public string PrimerApellido {
   set;
   get;
  }
  public string SegundoApellido {
   get;
   set;
  }
  public string DeportePreferido {
   get;
   set;
  }
  
  public Usuario ()
  {
   Nombre = string.Empty;
   PrimerApellido = string.Empty;
   SegundoApellido = string.Empty;
   DeportePreferido = string.Empty;
  }
 }
}
En el proyecto (capa) Modelos, creamos la clase correspondiente, para guardar, actializar, crear y eliminar un Usuario, dentro de la base de datos. El código dependerá de la base de datos con la que se trabaje, o sistema de almacenamiento correspondiente.
using System;
using Entidades;

namespace Modelos
{
 public class UsuarioRepositorio
 {
  public UsuarioRepositorio ()
  {
  }
  public void GuardarUsuario (Usuario usuario)
  {
   /*Guarda el nuevo usuario en la base de datos*/
  }
  public void EliminarUsuario (Usuario usuario)
  {
   /*Borrar el usuario en la base de datos*/
  }

  public void ActualizarUsuario (Usuario usuario)
  {
   /*Actualiza los valores del usuario en la base de datos*/
  }
 }
}
Ahora toca la lógica del negocio, es decir programar el código del presentador, relaciionado con dar de alta un nuevo usuario. Esta capa, se tiene que encargar de conseguir los datos introducidos y guardarlos en la base de datos. Para ello, por medio de la interfaz, se pueden conseguir los valores, se construye la entidad Usuario y luego se llama a la capa de datos, pasándole el nuevo usuario, para almacenarlo.
using System;
using Modelos;
using Entidades;

namespace Presentadores
{
 public class UsuarioPresentador
 {
  private IUsuarioVista _vista;
  private UsuarioRepositorio _modelo;
  
  public UsuarioPresentador (IUsuarioVista vista)
  {
   _vista = vista;
   _modelo = new Modelos.UsuarioRepositorio();
  }
  
  public void GuardarNuevoUsuario ()
  {
   var nuevoUsuario = new Usuario ()
   {
    Nombre = _vista.Nombre,
    PrimerApellido  = _vista.PrimerApellido,
    SegundoApellido = _vista.SegundoApellido,
    DeportePreferido = _vista.DeportePreferido
   };
   _modelo.GuardarUsuario(nuevoUsuario);
  }
 }
}
Como se puede apreciar el el código anterior. Colabora con la página porque en el contructor se la han pasado, y está en el objeto _vista. Hay que decir que la página tiene que implementar la interfaz IUsuarioVista. Luego el objeto que se encarga de guardar los datos, es _modelo. Ahora el código codebehing de la página es:
using System;
using System.Web;
using System.Web.UI;
using Presentadores;

namespace Vistas
{
 public partial class NuevoUsuario : System.Web.UI.Page, IUsuarioVista
 {
  private UsuarioPresentador _usuarioPresentador;
  
  public NuevoUsuario ()
  {
   _usuarioPresentador = new UsuarioPresentador (this);
  }
 
  
  public string Nombre { 
   get { return txtNombre.Text; } 
  }

  public string PrimerApellido {
   get { return txtPrimerApellido.Text; }
  }
  public string SegundoApellido { 
   get { return txtSegundoApellido.Text; }
  }
  public string DeportePreferido { 
   get { return txtDeportePreferido.Text; }
  }
  
  
  protected void btnGuardar_click (object sender, EventArgs e)
  {
   _usuarioPresentador.GuardarNuevoUsuario (); 
  }
 }
}
Como se puede apreciar, para crear en presentador, se pasa así mismo, porque implementa la interfaz IUsuarioVista. De esta forma colaboran la capa de presentación y la capa de las vistas.

Una forma de limpia y coherente de hacer las cosas, mejor que meter todo en la página y el siguiente que se apañe.

viernes, 7 de septiembre de 2012

Estudiando

Formas alternativas e interesante a la universidad pública española, para aprender de verdad.
Enlace

jueves, 6 de septiembre de 2012

Yiruma

Hace poco conocí a un chico, que me recomendó este autor.
En youtube hay una lista de reproducción, para hacerse una idea de lo que toca.

Piano

Lo malo de tener amigos, que tocan el piano, es que han despertado una sana curiosidad por este instrumento.

Me he encontrado una página para tenerla en cuenta: Pianistas del mundo

jueves, 23 de agosto de 2012

Sobre esta profesión

Leyendo alguna cosilla, me he encontrado con material muy interesante. Sigo creyendo que el futuro, son las metodología ágiles.

artículo1 artículo2

viernes, 27 de julio de 2012

Mi primera revisión de código

Estoy contento, porque un compañero me ha estado viendo el código, que he estado escribiendo en las últimas semanas.
Me ha gustado porque muchas veces me ha preguntado el porqué de lo que había hecho.
Un sentido crítico muy bueno y positivo, también me ha hecho pensar y plantearme la forma en la que hago las cosas, preguntas como ¿porque tienes este constructor que no hace nada? ¿por qué esta clase que no aporta nada a la lógica? La herencia es para extender la funcionalidad de la clase inicial, ¿esta realmente lo hace?

También es un buen golpe al ego, que eso me dificulta bastante el aprender.

Lo recomiendo muy vivamente, por encima de fricciones, años de experiencia, cargos, ... sincermente creo que es muy bueno para aprender a programar, también creo que hacer equipo.

Sobre Productividad

Siempre tengo en mente la manera de mejorar. La productividad es algo muy importante y más que nunca: material interesante

miércoles, 25 de julio de 2012

I prefer simple object dto from datatable

First of all, sorry, my english is not very good. I'm improving it, writting, reading, ...

At work, there is an arquitecture in 3 layers (DAL, BL and UI). Each layer is in a different assembly and there is another .dll with dto. But these dto's are datatables, because, the dal layer works with them.

May be i'm wrong, but i think that it's not the best solution for a complex project. I prefer simple object that represents a bussiness entity like user, car, account, ... Because the dependency between layers is very important for the maintaing of the application. Infact, each datatable represent tables of the databases, but we must build each layer independient of another.

Update: About OOP

jueves, 19 de julio de 2012

Impress.js

Leyendo cosas de Fernando Blat, comentaba esta librería. Desde el primer momento me gustó.
Así que me puse manos a la obra, en vez de tener que hacer cosas con el LibreOffice Draw.
Me lo descargué y con este tutorial estuve estudiando un poco.


Lo que pensaba era hacer una típica presentación con música y las dispositivas, con imágenes y alguna letra. Así que este es el resultado.
 



  Presentation 
  
 
 



 
Your browser doesn't support impress.js. Try Chrome or FireFox.
Are you ready!!!
Welcome.
Another
come on!!!!
Normal Rotate!!
Return from rotate
thoughts
positioning rotating

Espero que no se me olvide subirlo a mi repositorio.

miércoles, 18 de julio de 2012

Optimizar los Javascript con Closure

Escuchando el podcast de RailsHispano, han comentado Closure, que es una herramienta, que puede ayudarnos para mejorar el rendimiendo de los javascript.

BDD & .NET = SpecFlow

Llevo tiempo detrás del XP, y todo lo que lo rodea, aprendiendo por mi cuenta TDD, patrones, buscando la excelencia técnica (que no se consigue con certificaciones, que las respuestas están puestas en internet), es decir, leyendo libros técnicos, viendo lo que otros han hecho y sobre todo programando (Katas, y código empresarial).

Ahora le toca al BDD. Me he visto y he practicado con este  vídeo. La verdad es que ahora entiendo un poco más lo que es, pero todavía me falta bastante por aprender.
Es importante tener instalado el SpecFlow , junto con el visual studio (en mi caso fue el monodevelop) en el sistema (en caso fue xubuntu 12.04), para poder hacerlo.Dejo el código resultante.
Primeramente la características (feature), el escanario que vas a testear.

Feature: Scoring
 In order to keep track of my score
 As a bowler
 I want to use automatic scoring system for some feedback
 
Scenario: Bowling a strike
 Given I am on the first frame
 When I bowl a strike
 Then I see a "X" and a message that says "Good Job!"
 And I Should hear "Green Day"

Scenario: Bowling a gutter ball as a first throw
 Given I am on the first frame
 When I bowl a gutter ball
 Then I should see an "0" and a message that says "You need lessons"

Scenario: Bowling a gutter balls in a frame
 Given I hace bowled a gutter ball already
 When I bowl another gutter ball
 Then I should see an "0" and a message that says "You need lessons"

Scenario: Finishing the game with nothing but gutter balls
 Given I bowled a gutter ball on every frame
 Then I should see an "0" and a message that says "you need lessons"
 And I Should hear "Sad Trombone"

Código que testea
using System;
using NUnit.Framework;
using TechTalk.SpecFlow;
using SuperBowlingScorer;

namespace Spec
{
 [Binding]
    public class ScoringSteps
 {
  SuperScorer _scorer;
  [Given(@"I am on the first frame")]
  public void GivenIamOnTheFirstFrame ()
  {
   _scorer = new SuperScorer ();
   Assert.AreEqual (1, _scorer.Frame);
  }

  [When(@"I bowl a strike")]
  public void WhenIBowlAStrike ()
  {
   _scorer.ScoreFirstBall (10);
  }

  [Given(@"I have bowled a gutter ball already")]
  public void WhenIHaveBowledAGutterBallAlready ()
  {
   _scorer = new SuperScorer ();
   _scorer.ScoreFirstBall (0);
  }
  
  [Then(@"I see a ""(.*)"" and a message that says ""(.*)""")]
  public void ThenISeeAXAndAMessageThatSaysGobJob (string score, string message)
  {
   Assert.AreEqual (message, _scorer.BowlerMessage);
   Assert.AreEqual (score, _scorer.Score);
  }
  
  [Then(@"I should hear  ""(.*)""")]
  public void ThenIShouldHearGreenDay (string song)
  {
   Assert.AreEqual (song, _scorer.SongToPlay);
  }
  
  [When(@"I bowl a gutter ball")]
  public void WhenIBowlAGutterBall ()
  {
   _scorer.ScoreFirstBall (0);
  }
  
  
  
  [When(@"I bowl another gutter ball")]
  public void WhenIBowlAnotherGutterBall ()
  {
   ScenarioContext.Current.Pending ();
  }
  
  
  [Given(@"I bowled a gutter ball on every frame")]
  public void GivenIBowledAGutterBallOnEveryFrame ()
  {
   _scorer = new SuperScorer ();
   for (int i = 1; i < 10; i++) {
    _scorer.ScoreFirstBall (0);
    _scorer.ScoreSecondBall (0);
   }
   
  }
 }
}
  

Código que implementa las funcionalidad a testear (S.U.T.)
using System;

namespace SuperBowlingScorer
{
 public class SuperScorer
 {
  public int Frame {
   get;
   set;
  }
  
  public string BowlerMessage {
   get;
   set;
  }
  
  public string Score {
   get;
   set;
  }
  
  public string  SongToPlay {
   get;
   set;
  }
  
  
  
  public int PinsTotal {
   get;
   set;
  }
  
  public int FirstBallScore {
   get;
   set;
  }
  
  
  public SuperScorer ()
  {
   Frame = 1;
  }
  
  public void ScoreSecondBall (int pinsKnockedDown)
  {
   PinsTotal += pinsKnockedDown;
   if (Frame < 10) {
    Frame ++;
   }
   
   if (IsGutterBall (pinsKnockedDown) && (FirstBallScore == 0)) {
    BowlerMessage = "You need lessons";
    Score = "0";
   }
   
   if ((Frame == 10)
    && (PinsTotal == 0)) {
    BowlerMessage = "You need the gutter bumpers";
    Score = "0";
    SongToPlay = "Sad Trombone";
   } 
  }
  
  public bool IsGutterBall (int pinsKnockDown)
  {
   return pinsKnockDown == 0;
  }
  
  public bool IsStrike (bool isFirstBall, int pinsKnockedDown)
  {
   return isFirstBall && (pinsKnockedDown == 10);
   
  }
  
  public void ScoreFirstBall (int pinsKnockDown)
  {
   if (IsStrike (true, pinsKnockDown)) {
    BowlerMessage = "Good Job!";
    Score = "X";
    SongToPlay = "Green Day";
   } else if (IsGutterBall (pinsKnockDown)) {
    BowlerMessage = "You'll better next time";
    Score = "0";   
   }
   FirstBallScore = pinsKnockDown; 
   PinsTotal += pinsKnockDown;
  }
 }
}
Creo que puede ayudar mucho a testear las aplicaciones y dar más calidad a los productos. Tengo que seguir investigando ...

sábado, 14 de julio de 2012

Install Sublime Text 2 In Xubuntu 12.04

this is the step that i've done for installing in my xubuntu 12.04

1._ Open the Web Browser
2._ Type uwall.tv and you look Audioslave (or your favorite group) in the reach box (of course, it's optinal)
3._ Open another tab
4._ Type http://www.sublimetext.com/2
5._ Select & Click your version of the sublime for your machine
6._ Save the file in the folder of your system.
7._ Open a terminal & go to the sublime file is
8._ Type:
tar -xvjf filename.tar.bz2

9._ Type:
sudo mkdir /opt/sublimetext2

10._ Type:
sudo mv 'the extracted content' /opt/sublimetext2/

11._ Type:
sudo touch /usr/bin/sublime

12._ Type:
sudo chmod 755 /usr/bin/sublime

13._ Type:
sudo gedit /usr/bin/sublime

14._ Type:
#!/bin/sh
export SUBLIME_HOME="/opt/sublimetext2" 
$SUBLIME_HOME/sublime_text $*
15._ Type:
sudo gedit /usr/share/applications/sublime.desktop

16._ Type:
[Desktop Entry]
Encoding=UTF-8
Name=Sublime
Comment=Sublime Text Editor
Exec=sublime
Icon=/opt/sublimetext2/Icon/128x128/sublime_text.png
Terminal=false
Type=Application
Categories=GNOME;Application;Development;
StartupNotify=true

Source

jueves, 12 de julio de 2012

Sublime

I´ve discovered a new text editor, it may be the best text editor, faster than TextMate and other.
It´s Sublime Text

I´ve found a video explains some interesting things.

Starting with it.

It  seems nice!!!

miércoles, 11 de julio de 2012

Cosas para estudiar

Como el blog también me sirve como recordatorio. Apunto cosas que tengo que estudiar/leer/mirar/...
Mock vs. Stub, traducido
Agile Spain
S.O.L.I.D I, II y II
videos de Agile Spain
Material

Fuente: blog

sábado, 7 de julio de 2012

Arte callejero

Desde hace muchos años, creo que desde que estaba en el colegio y un chico de mi clase, se dedicaba a pintar. Ha despertado en mí una curiosidad por este tipo de arte urbano. Pero yo prefiero los bien hechos, los otros me dan la sesación de que ensucian (solo es una opinión personal). Sobretodo me fijo en la dibujos, más que en las letras.

Me he encontrado una galería que me ha llamado poderosamente la atención.

viernes, 6 de julio de 2012

Videos para aprender a programar de verdad

Leyendo cositas de Carlos Ble, me he encontrado con que hacía referencia a videos, para aprender a programar.

Me he visto el video que hablar en contra de los Null. Me acuerdo que mi jefe, me habló del patrón null y eso lo tengo que cambiar sí o sí, paraescribir mejor código. A practicarlo para interiorizarlo. Tienen muh buena pinta.

30J Huelga

Leyendo barrapunto, que el 30J había una huelga. Me he encontrado con unos interesantes comentarios (1, 2).

Me acuerdo una vez cuando un gestor, em dijo que los programadores son los nuevos esclavos del siglo XXI.
Puede que la única salida que tenga un informático en España sea por mar, aire o tierra. Pero también me llama poderosamente la atención las startup, que luchan por sacar su producto adelante con esfuerzo, ganas y mucho talento. Puede que ese sea una salida posible para cambiar las cosas.

viernes, 29 de junio de 2012

Jugando un poco con Vala

Vala es un nuevo lenguaje de programación, que ha surgido en torno a Gnome, más documentación en Wikipedia, ¿dónde sino?

Me parecio interesante, porque es muy parecido a C#, y con toda la potencia de los lenguajes modernos, pero a parte sin las penalizaciones de una máquina virtual. Lo malo es que no es multiplataforma, pero creo que el objetivo de este lenguaje, es más bien, la velocidad y la productividad que dan los lenguajes modernos.

Para empezar con el típico ejemplo de Hello World
/*compile: $valac file_name.vala*/
/*execute: $./file_name*/

using GLib; 

public class test{

 public static int main (string[] args) 
 { 
  stdout.printf ("Hello World\n");
   return 0; 
 } 
} 
Hace tiempo vi un mini-tutorial, para empezar a escribir algo y aquí está el resultado.
/*compilying: $valac --pkg gtk+-2.0 file_name.vala*/
/*executing: $./file_name*/

using GLib; 
using Gtk;

public class test{

 public static int main (string[] args) 
 { 
  Gtk.init(ref args);
 
  var win = new MainWindow();
  win.show_all();
  
  Gtk.main();
   return 0; 
 } 
} 

public class MainWindow : Gtk.Window
{
 Gtk.Button btnOk; 
 public MainWindow()
 {
  this.destroy.connect(Gtk.main_quit);
  
  btnOk = new Gtk.Button();
  btnOk.label = "Press Me!";
  btnOk.clicked.connect(btnOk_clicked);
  this.add(btnOk);
 }

 private void btnOk_clicked()
 {
  stdout.printf("btnOk_clicked!!!\n");
 }
} 

Como se puede observar, está el concepto de eventos y delegados, como lo hay en otros lenguajes. El concepto es el mismo, simplemente cambia la sintáxis.
La ejecución del código.

.NET y NCurses

Quien haya visto lo de ncurses, habrá pensado que eso es de la época de las cavernas. Simplemente quería jugar un poco y probar como se relaciona .net con librerías externas a su propio sistema.

El ejemplo de código es para linux (GNU/Linux, para que no se enfade nadie), con la librería libncurses.so.5 instalada en el sistema.
using System;
using System.Runtime.InteropServices;

public class Curses {
 const string Library = "libncurses.so.5";

 [DllImport(Library)]
 private extern static IntPtr initscr( );

 [DllImport(Library)]
 private extern static int endwin( );

 [DllImport(Library)]
 private extern static int mvwprintw(IntPtr window,
 int y, int x, string message);

 [DllImport(Library)]
 private extern static int refresh(IntPtr window);

 [DllImport(Library)]
 private extern static int wgetch(IntPtr window);

 private IntPtr window;
 
 public Curses( ) 
 {
  window = initscr( );
 }
 ~Curses( ) {
  int result = endwin( );
 }
 public int Print(int x, int y, string message) 
 {
  return mvwprintw(window, y, x, message);
 }
 public int Refresh( ) 
 {
  return refresh(window);
 }
 public char GetChar( ) 
 {
  return (char)wgetch(window);
 }
}
public class HelloCurses 
{
 public static void Main(string [] args) 
 {
  Curses Curses = new Curses( );
  Curses.Print(10, 10, "Hello, curses!");
  //Curses.Refresh( );
  char c = Curses.GetChar( );
  Curses = null;
 }
} 
Tuve complicaciones con la librería, porque no la encontraba.
 Lo que tuve que hacer es buscar la librería ncurses que tenía en el sistema, con el comando locate, exactamente lo que escribí fue: 'locate ncurses', con el nombre que me dio, lo puse en el programa y listo.

En este caso concreto el nombre de la librería es libncurses.so.5, como indica la captura de pantalla.

El resultado de la ejecución

Inversion Of Controler -- Dependency Injection

El tema de esta entrada es tratar este patrón. Está realmente muy bien explicado en Wikipedia. En el libro de Carlos Ble, también lo trata fenomena, y es ahí donde lo oí por primera vez y lo entendí.



Ya que tenía un poco de tiempo he decidido estudiar un poco y ver un video sobre este tema de TekPub, que lo explican fenomenalmente bien.

El tema es que tengo una xubuntu 12.04 instala con monodevelop 2.8 y ni corto ni perezoso me puse a reproducir el ejemplo para ver si lo conseguía. Tengo que decir que todo ha ido de maravilla y funciona a la perfección.






Generalmente tengo la manía de hacer un proyecto en blanco y luego le voy añadiendo las distintas partes, si tiene web, pues un proyecto de web, si hay algo de test unitarios, su proyecto de test unitarios, ... También lo que hago es dentro del proyecto hacerme una carpeta, que se llama lib y ahí  meto todo lo externo que utilizo; en este caso el ninject. Por lo tanto como se puede ver en la captura de pantalla un proyecto en blanco y luego el proyecto de consola.

 
using System;
using Ninject;
using Ninject.Modules;

namespace ShoGun.Console
{
 class Program
 {
  public static void Main (string[] args)
  {
   var kernel = new StandardKernel(new RangerModelue());
   var sam = kernel.Get();
   
   sam.Attack("The unwashed masses");
   
   System.Console.Read();
  }
 }
 
 class SamuraiModelue:NinjectModule
 {
  public override void Load()
  {
   Bind<IWarrior>().To<Samurai>();
   Bind<IWeapon>().To<Sword>();
  }
 }
 
 class RangerModelue:NinjectModule
 {
  public override void Load()
  {
   Bind<IWarrior>().To<Ranger>();
   Bind<IWeapon>().To<Shuriken>();
  }
 }
}  
Es la clase principal, donde se juega con las clases Samurai, Sword, Rangery Shuriken, para luego inyectarlas a otras clases.

using System;

namespace ShoGun.Console
{
 public interface IWeapon
 {
  void Hit(string target);
 }
        
        public interface IWarrior
 {
  void Attack(string target);
 }
 }
Interfaces que no falten por favor.

 
using System;

namespace ShoGun.Console
{
 public class Shuriken : IWeapon
 {
  public Shuriken ()
  {
  }
  
  public void Hit(string target)
  {
   System.Console.WriteLine("Pierces {0}'s armor", target);
  }
 }
        public class Sword : IWeapon
 {
  public Sword ()
  {
  }
  
  public void Hit(string target)
  {
   System.Console.WriteLine("Chopped {0} clean in half", target);
  }
 }
}
Las armas, importante para luchar.
 
using System;
using Ninject;

namespace ShoGun.Console
{
 public class Samurai:IWarrior
 {
  private IWeapon _weapon;
  
  [Inject]
  public Samurai (IWeapon weapon)
  {
   _weapon = weapon;
  }
  
  public void Attack(string target)
  {
   _weapon.Hit(target);
  }
 }
}
El guerrero, interesante detalle [Inject], en el constructor, que indica que ese objecto se va a inyectar.
De esta forma también compruebo que  en linux (GNU/Linux, para no ofender a nadie) también funcionan las cosas.

jueves, 28 de junio de 2012

Curso para aprender a programar de verdad

Parece raro que en la universidad se enseñe a programar de verdad, pero la uji, oferta un interesante curso para aprender a programar bien; de forma ágil.

miércoles, 27 de junio de 2012

Keavy McMinn

Estoy actualizando/limpiando mi repo de github, porque estoy haciendo un petporject, para aprender un poco de mvc 2 (sigo siendo igual de paquete). Ojeando el blog de la empresa, me he dado cuenta de que una de sus empleadas es Keavy McMinn y que a parte de tener blog y las demás cosas sociales, entrena para IronMan, bueno en este caso IronWoman (por cierto tiene una bonita Cervélo, me recuerda a la de Ana Burgos).

Siempre me pregunto cómo lo harán. Trabajar en un sitio tan cool, como GitHub, entrenar(18 horas a la semana, solo para terminarlo), y seguro que tiene tiempo para estar con la familia. Bueno se me olvidaba, tiempo para estar al día en este mundillo y ser tan buena, como para estar ahí.

Tengo mucho que aprender ... :-)

lunes, 25 de junio de 2012

Música por Internet

Ayer recibí un email con un enlace a una página, el sitio en cuestión es: http://uwall.tv/. Lo he estado probando y está genial. Una de las cosas que me gusta es que al grupo que busques carga una lista de reproducción.

Es lo primero que vemos cuando se carga la página.








Escuchando algo de los RATM, ya que han vuelto a la escena musical.





También escuchando a los Foo Fighters, su mítica canción 'The Best of You'.

viernes, 22 de junio de 2012

Escuchar música con Html 5

Al ver tanto html 5 por todas partes a uno le despierta cierta curiosidad, así que viendo una página que estaba reproduciendo una bonita música de fondo, le he dado a que me muestre el código y he encontrado un bonito reproductor, hecho con esa tecnología.


jueves, 21 de junio de 2012

Técnica Pomodoro

Hace unos meses un compañero de trabajo -es lo bueno de trabajar con más personas y con parecidas inquietudes- me mando un email con este boletín de campus MVP. Hice una lectura rápida, pero sin determe mucho. Al poco tiempo escuché a Carlos Ble, hablando de la técnica Pomodoro. Entonces ya me empezó a interesar. Después de leer lo bueno que resulta, he decidido probarlo.

Me he descargado esta aplicación. He rellenado con las tareas que tenía planificado hacer en ese día y a por ello. Los resultados no pudieron ser mejores; porque me dio tiempo a estudiar y terminé de forma bastante satisfactoria todo lo que tenía previsto hacer en ese día. lo que veo que hay que tener bastante disciplina interior -que es básico para sacar cualquier cosa adelante-. Lo malo que veo es que con equipos de trabajo de varias personas, haciendo cosas diferentes, es complicado llevar esta técnica a buen término.

Cuando estaba haciendo mi segundo pomodoro, me acordé de este podcast que habla de productividad personal para todo tipo de personas.

Foo Fighters World & Friend of a Friend

Escuchando música me he encontado con esta canción. Creo que es una joya escondida.



Aprovechando que estoy hablando de buenas canciones de este grupo, añado otra

BDD & .NET

En una primera instancia están las pruebas unitarias (Unit Test, puede o no hacerse TDD), pero a un nivel más alto está  el  BDD, son pruebas de comportamiento (Behavior).
Para el mundo el .NET está la herramienta SpecFlow, para mono también está disponible. Me supongo que esto viene del Mundo Pepino que se encuentra en Ruby On Rails


Me he encontrado con dos videos (video1 y video2), que son bastante aclaradores sobre cómo funciona, cómo utililizarlos. he de comentar, que el segundo video es de los chicos de TekPub.

Seguro que hay muchas más cosas, porque parece que esto está creciendo bastante.

MVC HtmlHelpers

Estudiano un poco de MVC, y viendo videos de los de TekPub, he descubierto una cosa que me puede ayuar para montar los helpers para css, imágenes o ficheros de jscript.

En el servidor
namespace System.Web.Mvc
{
    public static class HtmlHelpers
    {
        private const string pubDir = "/content";
        private const string cssDir = "css";
        private const string imageDir = "images";
        private const string scriptDir = "javascript";

        public static string CSS(this HtmlHelper htmlHelper, string fileName)
        {
            if(! fileName.EndsWith(".css"))
            {
                fileName += fileName + ".css";
            }
            
            return string.Format("<link rel='stylesheet' type='text/css' href='{0}/{1}/{2}'/>\n",pubDir, cssDir ,fileName);
        }

        public static string JavaScript(this HtmlHelper htmlHelper, string fileName)
        {
            if (!fileName.EndsWith(".js"))
            {
                fileName += fileName + ".js";
            }

            return string.Format("<script type='text/javascript' src='{0}/{1}/{2}' ></script>\n", pubDir, scriptDir, fileName);
        }

        public static string Image(this HtmlHelper htmlHelper, string fileName)
        {
            return string.Format("<img src='{0}/{1}/{2}' />\n", pubDir, imageDir, fileName);
        }
    }

}
En el lado del cliente
        <%= Html.CSS("Site.css")%>
        <%= Html.JavaScript("jquery-1.4.1.js")%>
        <%= Html.JavaScript("colorpicker.js")%>

Una regla de la informática es que no hay que re-inventar la rueda -la otra es si funciona para qué tocar, pero con los test unitarios y demás prácticas ágiles, eso ya está quedando obsoleto-. Por lo tanto he descubierto que ya hay alguien que ha deicado tiempo y esfuerzo a desarrollar interesantes helpers

lunes, 18 de junio de 2012

La Universidad y ser buen desarrollador

Desde hace tiempo voy viendo que gente que es muy buena en la programación, incluso personas que trabajan en Microsoft y no tienen título universitario, pero que son unas máquinas tirando líneas de código.
Me pregunto si de verdad merece la pena pasar por la universidad para ganarse la vida con esto de la programación.
Me he encontrado esto, que es bastante interesante.

viernes, 15 de junio de 2012

Publicar código en el blog

He encontrado una página donde indica cómo publicar código en blogger.
El resultado está bien, aunque perfecto no hay nada.
namespace Test
{
    public class Prueba
    {
          public bool Probando(T historiaDeUsuario){ return true;}
    }
} 

Lo que hay en el html es lo siguiente
 
namespace Test
{
    public class Prueba
    {
          public bool Probando(T historiaDeUsuario){ return true;}
    }
}

jueves, 14 de junio de 2012

Interfaces & Mockito

Poco a poco estoy aprendiendo cómo están programando otras personas.

En el libro Profesisonal ASP.NET Design Patterns -un tocho de más de 1000 páginas, solo me leí los primeros capítulos- explica la importancia de programar con interfaces, de esa manera, el dessarrollo depende del comportamiento y no de la implementación, es menos propenso a errores. Por lo tanto sigue el principio de "fácil extender, difícil de modificar".

He estado jugando con esto de las interfaces, a raíz de este video, además le he añadido Mockito, para hacerlo más divertido. El código es algo muy trivial, de hecho hay un muy buen ejemplo que particularmente me aclaró mucho.

De todas formas voy a poner el pequeño código que he generado.

using System.Drawing;
namespace BrosPaint
{
    public interface IPintable
    {
        Color CurrentColor { get; set; }
        Color ChangeColor(Color newColor);
    }
}
Una pequeña interfaz de pintado.

using System.Drawing;

namespace BrosPaint
{
    public class Vehicle: IPintable
    {
        public Color CurrentColor { get; set; }
        public string Model { get; set; }

        public Color ChangeColor(Color newColor)
        {
            CurrentColor = newColor;
            return newColor;
        }
    }
    public class Truck:Vehicle
    {
    }
}
Implementando una clase genérica, que es vehículo. Luego su clase concreta tractor -Truck-.

namespace BrosPaint
{
    public class Car:Vehicle
    {
    }
}
Jugando un poco con el concepto de herencia, representado en la clase coche -Car-

using System.Drawing;
using NUnit.Framework;
using BrosPaint;

namespace BrosPaint.Test
{
    public class CarTest
    {
        [Test]
        public void PaintCar_Test()
        {
            IPintable item = new Vehicle();
            item.CurrentColor = Color.DimGray;

            item.ChangeColor(Color.DarkViolet);

            Assert.AreEqual(Color.DarkViolet, item.CurrentColor);
        }
    }
}
No puede falta el test ...

namespace BrosPaint
{
    public interface IRepository<t>
    {
         T Get(T element);
    }
}
Un interfaz muy genérica que extrae un elemento de un repositorio, que puede ser una base de datos, un fichero, un servicio web, ...

using NUnit.Framework;
using Moq;
using BrosPaint;

namespace BrosPaint.Test
{
    public class IRepositoryTest
    {
        [Test]
        public void RepositorySimpleTest()
        {
            var mock = new Mock<irepository<car>&gt;();
            var filter = new Car();
            var result = new Car();
            result.Model = "Ferrari";
            mock.Setup(x =&gt; x.Get(It.IsAny<car>())).Returns(result);


            var RepositoryCar = mock.Object;

            Car expectedCar = new Car();
            expectedCar.Model = "Ferrari";
            Car getCar = RepositoryCar.Get(new Car());

            var pp = getCar.Model;
            var ss = expectedCar.Model;

            Assert.IsNotNull(getCar);
            Assert.IsNotNull(expectedCar);
            Assert.IsTrue(expectedCar.Model == getCar.Model);
        }
    }
}
Test, que prueba el repositorio, utilizando mockito -moqueándolo-

jueves, 7 de junio de 2012

Cliente nativo de GitHub para Windows

Desde hace algo de tiempo vengo utilizando github, como repositorio de código. Principalmente lo utilizo para las Katas de programación. Este fin de semana he sacado un rato para subir una Kata, para mi sorpresa me he bajado el cliente nativo para windows. Además está hecho con metro. Se nota que estos tíos son muy buenos.

Un ejemplon de lo dicho.
Cliente nativo de GitHub, para windows














Para más información

Programadores en España

Opiniones sobre la informática-programadores en España.

viernes, 1 de junio de 2012

AutoMapper

Investigando esto del ASP.NET MVC, me encontré con la herramienta AutoMapper. Después ver este video ya he entendido para qué sirve.

Principalmente sirve para crearte los dto´s desde la entidades, para pasar los datos entre capas. Parece que es un proyecto bastante utilizado en este tipo de proyectos.

jueves, 31 de mayo de 2012

miércoles, 23 de mayo de 2012

Mejorando como programador

Leyendo cosas de Carlos Ble, ha escrito sobre un sitio, para mejorar como programador.

String.Empty vs ""

Estudiando LessFramework, me he encontrado que para incializar las cadenas de texto, hace uso de String.Empty.
string callingMethod = String.Empty;
Me ha entrado la curiosidad y he estado googleando, para ver la razón que hay detrás, me he encontrado una página, que dice que es más eficiente String.Emtpy, porque no crea un objeto (es un mñetodo estático) y por lo tanto se ahorra memoria, pero en cambio con "", se crea un objeto y tiene que ponerlo en la pila de los objetos, por lo tanto afecta algo (muy muy poco) al rendimiento.

martes, 22 de mayo de 2012

Unix desde AT&T

Me he encontrado un video que cuenta la historia de Unix y la página es de la propia AT&T

El código que me encuentro en el trabajo

Me pregunto si realmente somo buenos programadores o nos merecenos lo que tenemos.
Porque viendo este código ya me entran las dudas. Eso sí, sigo con ganas de seguir mejorando como programador, porque si no tuviera estas ganas de aprender, seguro que generaría este código o aún peor. Un compañero de profesión me dijo una vez que él escribía el código todo seguido ...

       private void AplicarContorno(Control control, bool aplicar)
        {
            var canvas = (Canvas)control.FindName("Canvas");
            foreach (var poligono in canvas.Children)
            {
                try
                {
                    var path = (Path)poligono;
                    if (aplicar)
                    {
                        path.Stroke = Brushes.Black;
                    }
                    else
                    {
                        path.Stroke = Brushes.Transparent;
                    }
                }
                catch (Exception)
                {
                    try
                    {
                        var canvas2 = (Canvas)poligono;
                        if (canvas2 != null)
                        {
                            foreach (var municipio in canvas2.Children)
                            {
                                var path2 = (Path)municipio;
                                if (aplicar)
                                    path2.Stroke = Brushes.Black;
                                else
                                    path2.Stroke = Brushes.Transparent;
                            }
                        }
                    }
                    catch
                    {
                    }
                }
            }
        }

jueves, 17 de mayo de 2012

ASP.NET MVC

Cuando se comienza a conocer una tecnología, uno está muy perdido, por lo menos es lo que me pasa ahora que me ha dado por estudiar MVC y mi olfato me dice que las cosas van a ir por aquí. Mirando cosas sobre este tema, me he encontrado un video, que da una buena visión (esa es mi sensación), para montar un proyecto con testa tecnología.
Espero que sea utilidad.
Me he dado cuenta de que hay más videos.

Una forma distinta de ver las horas

Enlace

Fichero de Log Asíncrono

Hablando con algunos compañeros de trabajo, estábamos debatiendo sobre emplear ficheros de log. Soy firme defensor de ello, porque ante un error en producción, hay que conocer el porqué del fallo. El problema que nos encontrábamos era que al hacer uso de ficheros de log, la fvelocidad, disminuía muchísmo. así que buscando un poco he pensado que una buena solución es generar los ficheros de log de forma asíncrona. Se emplean las EnterPriseLibrary, porque para qué reinventar la rueda, por lo tanto no hay que olvidar la .dll.

using Microsoft.Practices.EnterpriseLibrary.Logging;

namespace ClassLibrary1
{
    public class Log
    {
        delegate void WriteLogDelegate(string message);

        public static void WriteLog(string message)
        {
            WriteLogDelegate logDelegate = new WriteLogDelegate(AsyncWriteLog);
            AsyncHelper.FireAndForget(logDelegate, message);
        }

        static void AsyncWriteLog(string message)
        {
            LogEntry log = new LogEntry();
            log.Message = message;

            Logger.Write(log);
        }      
      
    }
}
using System;

namespace ClassLibrary1
{
    /// <summary>
    /// This is asynchronous helper class from Jon Skeet
    /// http://www.yoda.arachsys.com/csharp/threads/threadpool.shtml
    /// </summary>
    public class AsyncHelper
    {
        /// <summary>
        /// Delegate to wrap another delegate and its arguments
        /// </summary>
        delegate void DelegateWrapper(Delegate d, object[] args);

        /// <summary>
        /// An instance of DelegateWrapper which calls InvokeWrappedDelegate,
        /// which in turn calls the DynamicInvoke method of the wrapped
        /// delegate.
        /// </summary>
        static DelegateWrapper wrapperInstance = new DelegateWrapper(InvokeWrappedDelegate);

        /// <summary>
        /// Callback used to call <code>EndInvoke</code> on the asynchronously
        /// invoked DelegateWrapper.
        /// </summary>
        static AsyncCallback callback = new AsyncCallback(EndWrapperInvoke);

        /// <summary>
        /// Executes the specified delegate with the specified arguments
        /// asynchronously on a thread pool thread.
        /// </summary>
        public static void FireAndForget(Delegate d, params object[] args)
        {
            // Invoke the wrapper asynchronously, which will then
            // execute the wrapped delegate synchronously (in the
            // thread pool thread)
            wrapperInstance.BeginInvoke(d, args, callback, null);
        }

        /// <summary>
        /// Invokes the wrapped delegate synchronously
        /// </summary>
        static void InvokeWrappedDelegate(Delegate d, object[] args)
        {
            d.DynamicInvoke(args);
        }

        /// <summary>
        /// Calls EndInvoke on the wrapper and Close on the resulting WaitHandle
        /// to prevent resource leaks.
        /// </summary>
        static void EndWrapperInvoke(IAsyncResult ar)
        {
            try
            {
                wrapperInstance.EndInvoke(ar);
                ar.AsyncWaitHandle.Close();
            }
            catch (Exception ex)
            {
                //Handle the exception.
            }
        }
    }
}


También hay que crear un fichero de configuración, que en este caso se llama: App.config y el contenido es:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </configSections>
  <loggingConfiguration name="Logging Application Block" tracingEnabled="true"
    defaultCategory="General" logWarningsWhenNoCategoriesMatch="true">
    <listeners>
      <add fileName="SVPBuildTool.log" rollSizeKB="0" timeStampPattern="yyyy-MM-dd"
        rollFileExistsBehavior="Increment" rollInterval="Day" formatter="Text Formatter"
        header="----------------------------------------" footer="----------------------------------------"
        listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.RollingFlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
        traceOutputOptions="None" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.RollingFlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
        name="Rolling Flat File Trace Listener" />
    </listeners>
    <formatters>
      <add template="Timestamp: {timestamp}&#xD;&#xA;Message: {message}&#xD;&#xA;Category: {category}&#xD;&#xA;Priority: {priority}&#xD;&#xA;EventId: {eventid}&#xD;&#xA;Severity: {severity}&#xD;&#xA;Title:{title}&#xD;&#xA;Machine: {machine}&#xD;&#xA;Application Domain: {appDomain}&#xD;&#xA;Process Id: {processId}&#xD;&#xA;Process Name: {processName}&#xD;&#xA;Win32 Thread Id: {win32ThreadId}&#xD;&#xA;Thread Name: {threadName}&#xD;&#xA;Extended Properties: {dictionary({key} - {value}&#xD;&#xA;)}"
        type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
        name="Text Formatter" />
    </formatters>
    <categorySources>
      <add switchValue="All" name="General">
        <listeners>
          <add name="Rolling Flat File Trace Listener" />
        </listeners>
      </add>
    </categorySources>
    <specialSources>
      <allEvents switchValue="All" name="All Events">
        <listeners>
          <add name="Rolling Flat File Trace Listener" />
        </listeners>
      </allEvents>
      <notProcessed switchValue="All" name="Unprocessed Category" />
      <errors switchValue="All" name="Logging Errors &amp; Warnings" />
    </specialSources>
  </loggingConfiguration>
</configuration>