martes, 10 de diciembre de 2013

Co-working Javascript Game

A work collegue, has made a little game with javascript.

Happy playing!!!!

Apuntes de la charla de Bonilla sobre los equipos para ser brillantes

Bonilla - Equipos para ser brillantes  --> video de la charla

1._ Mantener el flow. Minimizar las interrupciiones. Proteger el tiempo haciendo uso de pomodoros

2._Alimentar el cerebro
-Organizar sesiones técnicas
-Comer el 20 minutos y los 40 restantes dedicarlos a ver vídeos comentar
-Montar un grupo de usuarios/estudio una vez al mes

3._Reconocer el trabajo. Dar las gracias:
-El trabajo vale para algo
-Reconocimiento de las pequeñas victorias
-Para cualquiera, también para los pobres becarios
-Reconocmiento entre compañeros

4._Report Robot
-Automatizar
-Compartir la información con todos

5._Dog fooding. Probar el propio software que se hace
-Alpha testing
-Es doloros
-Es entretenido
-Da feeback muy rápido

6._Celebra un día especial con los compañeros
-Se hace piña
-Las personas son buenas, el problemas son la circunstancias

7._Experimentar
-Motivación <-> innovación

Algunas frases que he escuchado que me han gustado:
Good programmer, good comunicator.
El programa lo que hace es contar un cuento.
Los programadores lo que hacemos es contar historias.

sábado, 19 de octubre de 2013

Porting Sqel from javacript to .NET

After the lunch, while I was listening this, in the Codemotion 2013, I´ve ported sqel, from javascript to .NET, with TDD. So it´s my new petproject.
It´s not finished yet :-)

The code lives here

Happy programming!!!

lunes, 14 de octubre de 2013

Artesanía en el software

Cada vez veo más, mi profesión como una artesanía, al igual que el cocinero de shushi o el que se dedica hacer violines.
Creo que lo que hay detrás de esa visión es la pasión por lo que hago y que descubrí cuando tenía 15 años.

Dos muy buenos artículos que describen algo que siento y pienso: I y II

domingo, 13 de octubre de 2013

New PetProject: a TODO list

I've just push in github a new petproject made with jquery/ajax, autocomplete plug-in, ASP.NET WebForms, different layers, good practices and patterns, of course.

The code lives here

Happy coding!!!

miércoles, 2 de octubre de 2013

Frases

Porque el mayor error que puedes cometer es tener miedo de cometer un error
Porque el futuro pertenece a aquellos que se preparan para ello. 
Porque al final, lo que importa no son los años de vida, sino la vida de los años.
Porque cada día es una oportunidad de empezar de nuevo. No lo olvides nunca. 
Porque triunfar no es llegar el primero; es levantarte todas las veces que te caes en el camino.
Porque la disciplina es el puente entre las metas y los logros.
Porque quien no ha afrontado la adversidad no conoce su propia fuerza.
Porque solo se vive una vez.
Porque cada día tienes la oportunidad de superarte.
Porque nunca te arrepentirás de haberte cuidado, pero seguro que te arrepientes si no lo haces.
Para descubrir hasta donde puedes llegar.
Para dejar atrás los complejos.
Porque toda carrera empieza por un primer paso.
Porque solo está derrotado aquel que deja de soñar.
Porque hace más el que quiere que el que puede.
Porque nunca sabrás lo que eres capaz de hacer hasta que lo intentes.
Porque hay una fuerza motriz más poderosa que el vapor, la electricidad y la energía atómica: la voluntad.
Porque lo importante no sólo es llegar, es disfrutar del camino recorrido. 
Porque el "no puedo" no existe.
Porque si no te atreves a dar un paso adelante, siempre te encontrarás en el mismo sitio.
Porque no tienes que ser mejor que los demás, tienes que ser mejor de lo que piensas que puedes ser.
Porque no estás derrotado cuando pierdes, estás derrotado cuando te das por vencido.
Porque solo aquellos que se atreven a tener grandes fracasos terminan consiguiendo grandes éxitos.
Porque la diferencia entre quien eres y quien quieres ser está en lo que haces.
Si buscas resultados distintos, no hagas siempre lo mismo.
Porque puedo aceptar el fracaso, pero no puedo aceptar no intentarlo.
Porque dentro de veinte años estarás más decepcionado por las cosas que no hiciste que por las que hiciste.
Porque en la vida no hay atajos, si trabajas duro verás la recompensa.
Porque no se trata de decirlo, hay que hacerlo.
Porque no importa cuantas veces te caes, sino cuantas veces te levantas y sigues peleando.
Recuerda que la felicidad es una manera de viajar, no un destino.
Porque el éxito es la habilidad de ir de fracaso en fracaso sin perder el entusiasmo.
Porque todos los triunfos nacen cuando nos atrevemos a comenzar.
Porque tú pones tus limites.
Porque lo único imposible es aquello que no intentas.
Porque nunca es tarde para empezar.
Porque la fuerza de voluntad es la madre de todas las fuerzas.
Porque también es importante tomarse un descanso y disfrutarlo.
Porque el único sitio donde el éxito viene antes que el trabajo es en el diccionario.
Ser la mejor versión de ti mismo.
Porque un esfuerzo total es una victoria completa.
Porque ningún sueño se hace realidad, hasta que te levantas y te pones a trabajar.
Porque la constancia es la clave del éxito.
Porque ser débil es una elección, igual que ser fuerte.
Para dejar de soñar y empezar a hacer.
Porque no es valiente quien no tiene miedo, sino quien sabe vencerlo. 
Porque es duro fracasar, pero es todavía peor no haber intentado nunca triunfar.
Porque si realmente quieres encontrarás la manera, y sino encontrarás una excusa. 
Cuando pienses en dejarlo acuérdate porqué empezaste.
Porque tu destino no está en las estrellas, está en tus manos.
Porque el miedo no existe en otro lugar excepto en la mente. 
Porque tu futuro lo determina lo que haces hoy, no mañana.

Fuente

martes, 3 de septiembre de 2013

Mis 30 cosas, que he aprendido en 30 años

Copiando la entrada de Kirai. Hago mi lista:

1._Acostarme pronto y levantarme pronto, me ayuda a exprimir más el día.
2._Leer me ayuda para mejorar profesional y personalmente, además tener una mente abierta al mundo que tengo a mi alrededor.
3._Rezar me ayuda a mantener mi equilibrio interior y tener paz conmigo mismo y con los demás.
4._Sigo luchando por los sueños que tengo sin realizar.
5._Desconectar. Hacer cosas que me llenan, me motivan, me ayuda a recargar las pilas.
6.-Hacer deporte, me ayuda para los dolores de espalda, me hace estar más relajado, dormir mejor, liberar toxinas, ...
7._La primera, la segunda, la tercera, la ... No salen bien las cosas, un ejemplo de constancia son Edison con la bombilla o James Dyson con la aspiradora. He aprendido mucho de mis fracasos y errores. En la vida hay caídas, pero hay que levantarse, aprender de los errores y seguir.
8._Algunas veces hago un parón, para reflexionar, ver cómo van las cosas y coger impulso para continuar.
9._Hay dos tipos de hombres: los hacedores, que su principal objetivo es hacer las cosas y hacerlas bien, y los habladores, que se dedican a mover la lengua. Un hombre se define principalmente por lo que hace, no por lo que dice. Como en todo hay excepciones.
10._Ser fiel a uno mismo, es un gran paso para ser más feliz.
11._No hablar mal de nadie. Muchas veces me digo, estoy más guapo callado :-(
12._Llevar una vida ordenada, me está ayudando a perseverar y a llegar a las metas.
13._Trabajar profesionalmente en un proyecto que realmente me gusta y me motiva, ya no es trabajo rutinario, aburrido y desmotivador.
14._Tener un mentor, me ayuda a progresar, porque es una persona objectiva que me conoce muy bien y me dice las cosas que nadie me dice, para que mejore.
15._En la vida algunas veces se gana, otras veces se pierde, pero nunca hay que darse por vencido, simplemente hay que dejar pasar el momento que toca perder.
16._La humildad, como arma para mejorar y aprender. He visto en muchas personas que el creerse estar por encima de los demás le han traído catastróficas consecuencias. Agachar la cabeza me cuesta, pero siempre biene muy bien para ponerme en mi sitio y darme cuenta de lo que realmente soy: "cuanto más alto te creer, más dura será la caída".
17._Mi madre dice que medio mundo habla mal del otro medio. Intento solo hacer caso, a los que realmente buscan mi bien.
18._Nunca terminaré de aprender cosas.
19._Sonreir, ser y estar alegre. Es un buen método para disfrutar realmente de la vida.
20._No hay que tener miedo a estar solo, como dice el refrán: "es mejor estar solo que mal acompañado". Pero siempre en la vida es mejor caminar junto a alguien.
21._Muchas veces es mejor callarse antes que discutir, porque pueden ser tiempo y esfuerzo perdidos.
22._Un compañero de trabajo me dice: "Luis, no te acojones". Pues eso.
23._Cuando he quitado horas al sueño, mi cuerpo lo ha notado y mi carácter también.
24._Disfruta del camino, porque la meta está demasiado lejos todavía.
25._El odio y el rencor no sirven para nada.Gritar y echar la bronca no es la solución, es mejor motivar y animar.
26._Kaizen, mejoras pequeñas pero constantes.
27._Es más importante el tiempo y las personas, que el dinero.
28._La vida es un constante cambio, solo hay que adaptarse a él.
29._El dolor forma parte de la vida, no se puede vivir sin él, solo hay que entenderlo y encontrar su significado.
30._Me parece importante dar gracias, porque la vida es puro regalo. Ser agradecido es de buen nacido.

jueves, 29 de agosto de 2013

Contando 200 cosas

Cuando comencé esto, no pensaba que iba a tener tanto que escribir.
Como es un número redondo, voy a poner un par de videos que me traen muy buenos recuerdos
Los enemigos - Sueña por mí
Los enemigos - La carta que no

martes, 23 de julio de 2013

Kaleidos Manifest



  1. In the beginning, it's the people
  2. Code should be beautiful
  3. Customers are not a necessary evil
  4. Love your work and your work will be loved
  5. Shelfware is wrong
  6. Let us surprise you
  7. 1.618033988749894848204586834
  8. In the end, it's the people

nice!!!!

jueves, 11 de julio de 2013

Playing with AutoMapper & DataTable in C#

Some time ago, I mapped every colum from database in a POCO. This task was very boring, so for the next project, I´ve found a solution is AutoMapper.
The simple, but real example.

We have a POCO or a DTO User:
using System;

public class User
{
    public int ID { get; private set; }
    public string Name { get; private set; }
    public string LastName { get; private set; }
    public int Age { get; private set; }

    public User WithID(int id)
    {
        ID = id;
        return this;
    }
    public User WithName(string name) 
    {
        Name = name;
        return this;
    }
    public User WithLastName(string lastName)
    {
        LastName = lastName;
        return this;
    }
    public User WithAge(int age)
    {
        Age = age;
        return this;
    }

    public User()
    {
        ID = 0;
        Name = string.Empty;
        LastName = string.Empty;
        Age = 0;
    }
}

We have the mapper:
using System;
using AutoMapper;
using System.Data;
using System.Collections.Generic;

public class UserMapper
{
    public IEnumerable Map(DataTable data)
    {
        AutoMapper.Mapper.Reset();
        AutoMapper.Mapper.CreateMap()
                        .ForMember(t => t.ID, f => f.MapFrom(r => r["IdUser"]))
                        .ForMember(t => t.LastName, f => f.MapFrom(r => r["Last_Name"]));
        return AutoMapper.Mapper.Map>(data.CreateDataReader());
    }
}

The Test (I use fluent Assertions):
using System;
using System.Linq;
using System.Collections.Generic;
using System.Data;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using PruebaAutoMapper;
using System.Collections;
using FluentAssertions;

private DataTable CreateDataTable()
{
    var result = new DataTable();
    result.Columns.Add(new DataColumn("IdUser", typeof(int)));
    result.Columns.Add(new DataColumn("Name", typeof(string)));
    result.Columns.Add(new DataColumn("Last_Name", typeof(string)));
    result.Columns.Add(new DataColumn("Age", typeof(int)));

    result.Rows.Add(1, "NameI", "Last_NameI", 1);
    result.Rows.Add(2, "NameII", "Last_NameII", 2);
    result.Rows.Add(3, "NameIII", "Last_NameIII", 3);
    result.Rows.Add(4, "NameIV", "Last_NameIV", 4);

    return result;
}

private IEnumerable CreateList()
{
    var result = new List();

    result.Add(new User().WithID(1).WithName("NameI").WithLastName("Last_NameI").WithAge(1));
    result.Add(new User().WithID(2).WithName("NameII").WithLastName("Last_NameII").WithAge(2));
    result.Add(new User().WithID(3).WithName("NameIII").WithLastName("Last_NameIII").WithAge(3));
    result.Add(new User().WithID(4).WithName("NameIV").WithLastName("Last_NameIV").WithAge(4));

    return result;
}

[TestMethod()]
public void MapTest()
{
    UserMapper mapper = new UserMapper();
    var data = CreateDataTable();
    var expected = CreateList();

    var actual = mapper.Map(data);

    expected.ToList().ShouldAllBeEquivalentTo(actual.ToList());
}
}

Creating Javascript Fluent Api

First of all the tests, using Jasmine (making TDD):

describe("Test for Fluent Car", function(){

    it("Create simple Object Car", function () {
        var car = new Car();

        expect(car).not.toBeNull();
    })

    it("initialize Model", function () {
        var car = new Car();
        var model = 'Model';
        
        car.withModel(model);
        
        expect(car.Model()).toEqual(model);
    })

    it("initialize Model & Gas", function () {
        var car = new Car();
        var model = 'Model';
        var gas =  120;
        
        car.withModel(model)
           .withGas(gas);

        expect(car.Model()).toEqual(model);
        expect(car.Gas()).toEqual(gas);
    })

    it("initialize Make & Model & Gas", function () {
        var car = new Car();
        var make = 'make';
        var model = 'Mmdel';
        var gas =  120;

        car.withModel(model)
           .withMake(make)
           .withGas(gas);
        
        expect(car.Model()).toEqual(model);
        expect(car.Make()).toEqual(make);
        expect(car.Gas()).toEqual(gas);
    })

    it("initialize Height & Width", function () {
        var car = new Car();
        var height = 147;
        var width = 259;

        car.withHeight(height)
           .withWidth(width);
        
        expect(car.Height()).toEqual(height);
        expect(car.Width()).toEqual(width);
    })
});

The code:
function Car(){
 this._make = '';
 this._model = '';
 this_gas = 0;
 this._height = 0;
 this._width = 0;
 
 function Make(){
  return this._make;
 }

 function withMake(make){
  this._make = make;
  return this;
 }

 function Model(){
  return this._model;
 }

 function withModel(model){
  this._model =  model;
  return this;
 }

 function Gas(){
  return this._gas;
 }

 function withGas(gas){
  this._gas = gas;
  return this;
 }

 function Height(){
  return this._height;
 }

 function withHeight(height){
  this._height = height;
  return this;
 }

 function Width(){
  return this._width;
 }

 function withWidth(width){
  this._width = width;
  return this;
 }

 return{
  Make:Make,
  withMake:withMake,
  Model:Model,
  withModel:withModel,  
  Gas:Gas,
  withGas:withGas,
  Width:Width,
  withWidth:withWidth,
  Height:Height,
  withHeight:withHeight
 }
}




Source

lunes, 10 de junio de 2013

asynch log vs normal log

Some time ago, my program manager said to me that, remove the system logger, because, made the web application slower.

Yesterday I thought, I can write an asynch logger for improving the performance of the application in c# 4.0, with Visual Studio 2010.

The main idea is this:


public void Write(string message)
{
    Task.Factory.StartNew(() => WriteTheMessage(message)); 
}

private static void WriteTheMessage(string message)
{
    lock (_locker)
    {
        using (StreamWriter writer = File.AppendText(path))
        {
            writer.WriteLine(message);
        }
    }
}


All the code

A simple test:




Repository Pattern

I've added a new utility in my github repo is a simple implementation of repitory pattern.
I've found the original code: carl-berg

martes, 4 de junio de 2013

Simple board kanban

Some time ago, I was in a course about personal kanban & another productivity techniques by Diego Rojas The course was very funny.

I dicovered a great simple HTML board kanban

lunes, 3 de junio de 2013

Some nice videos

One
Two
Sport motivation I
Sport motivation II
Sport motivation III

Una opinión sobre la gestión de proyectos en España

Según mi experiencia no siempre pasa esto, pero casi. Básicamente hay dos tipos de informáticos, entendiéndose por ello gente que se dedica a la informática:

- Los que saben: No han nacido sabiendo, no, el conocimiento no les vino por ciencia infusa, sino que se han interesado en aprender de qué va esto y se dedican a ello

- Los que no saben: Ni saben, ni quieren saber, ni sabrán, porque se la fuma. Esconden su incompetencia con frases del tipo... "Cuando yo era joven.... Es que ya no tengo tiempo de tocar esto... Es que yo soy de C y no de Java... Blah blah". Esta gente, a la que la informática y, en general, cualquier cosa que suponga un esfuerzo real más allá que lamer dos culos, se la trae al pairo, se convierte en un perfecto trepa y, muy probablemente, terminará siendo un jefe de proyecto, director manager, o como coño quieras llamarle.

¿Y por qué alguien que no sabe, que es un cateto, va a ser un jefe de proyecto? ¿Cómo es posible esto? Fácil, son cosas que se heredan: su jefe también lo es, de modo que es fácil engañarle porque no sabe hacer la 'O' con un canuto. Mientras que tú, tecnólogo apasionado, estás dedicándote a lo que te debes dedicar, tu compañero, experto en facebook, msn, age of empires, y que no sabe lo que es una dirección IP, está dorando la píldora a vuestro jefe y comiéndote la tostada.

"¿Comer la tostada? A mí me gusta lo que hago, no quiero hacer gestión" Ya, pero esto no es EEUU, esto es España, un sitio donde el que gana pasta es el que "gestiona", nadie va a valorar tu trabajo porque no entienden nada de lo que haces ni saben el esfuerzo que supone hacerlo. ¿Estás contento con tu sueldo y tu situación? En ese caso no te preocupes de más, y disfruta
:)

Para el resto: El que gestiona, por norma, NO es más que tú, sino todo lo contrario, porque ni sabe de tecnología, ni sabe de gestión. Analízalo:

- Ha estudiado lo mismo que tú, o algo parecido.
- No tienen ni idea del mundo técnico, porque saber es mucho más que hacer una carrera, módulo, certificación, o título de cualquier tipo. Saber es esforzarse y amar lo que haces
- Se han aprendido cuatro palabras y frases hechas para salir del paso en reuniones y tertulias, enseguida meten la zarpa hasta el fondo, aunque con los años ganan pericia en esto
- De gestión saben lo mismo que tú, evidentemente, osea: nada. Una vez ascendidos, si tienen un mínimo de verguenza y autocrítica se comprarán algún libro de liderazgo para noveles del que copiarán otras cuatro frases interesantes. Lo importante es aparentar, esa es la cuestión
- Una vez en la brecha, hay gestores que lo hacen mejor, y otros peor. ¿De qué depende esto?: Del sentido común. De ahí la lotería tan común en el campo de los proyect managers, los hay buenos, mediocres y patéticos, siendo los dos últimos los más extendidos.
- La incompetencia de un gestor la solucionan los técnicos que asumen de verdad el proyecto. Muchos proyectos salen adelante cuando el gestor se quita de enmedio y deja que los saben hagan y organicen su propio trabajo. El gestor ha hecho poco más que asistir a una reunión estúpida de lanzamiento y poner la mano a final de mes
- Son opacos, no dicen lo que piensan, siempre usan una sonrisa, evitan confrontaciones directas, suelen ir por la espalda, la nobleza brilla por su ausencia, y son genios de la copia oculta del correo. Estas son algunas características comunes a todo proyect manager trepa que se precie
- Físicamente, sobre todo si son jóvenes, se les suele distinguir porque tratan de ocultar sus inexperiencia (fruto inexcusable, entre otros, de su juventud) con elementos de camuflaje de todo tipo, buscando un aspecto más senior: ropa demasiado seria, coche de carroza, dejarse barba o resaltar las canas son sólo algunas de las estrategias que podemos encontrarnos

Alguna vez, y sólo alguna vez, por extrañas circunstancias que aún desconozco, he visto jefes de proyectos tecnológicos que de verdad sabían gestionar un proyecto (Ironías de la vida, estos, generalmente, no eran informáticos, ni telecos, ni técnicos de sistemas, ni, ni...) Pero, en la mayoría de los casos, el simple hecho de que no entorpezcan el trabajo del equipo es ya motivo de celebración, tal y como afirma el texto del artículo.

Hasta la próxima.

martes, 28 de mayo de 2013

Pistas para mejorar como programador

Leyendo un internet, he descuibierto una entrevista a Raúl Murciano, que habla de cómo mejorar como programador. Lo copio literal:

"Personalmente recomendaría lo siguiente, tanto a la gente que esté pensando en ir a trabajar fuera como a los que busquen trabajo en España:

- Si te vas a dedicar a la programación o al desarrollo web, plantéate si te gusta ese trabajo y si te divierte aprender. Este sector avanza a un ritmo increíble y no tiene pinta de frenar. Es imposible saber de todo, pero sí que necesitas mantenerte un poco al día. Si eso no te divierte vas a tirar un montón de tiempo de tu vida a la basura y se te agriará el carácter. Incluso si lo piensas fríamente, no tiene sentido: cualquiera que le ponga un poco de entusiasmo lo hará mejor que tú en poco tiempo. Dedicarte a esto si no te gusta sólo porque hay más empleo es pan para hoy y hambre para mañana. Como contrapartida, si te gusta crear y experimentar dentro de este terreno, estás de suerte: hace mucha falta gente como tú. No todo es de color de rosa, pero si tienes tiempo, ganas y la actitud necesaria estoy seguro de que no te faltarán oportunidades. Y si te faltan, escríbeme: raul@murciano.net e intentaré echarte un cable en lo que pueda.

- Como añadido al punto anterior, los cambios que vivimos no sólo son tecnológicos. Por un lado, el programador de hoy en día ya no recibe sus especificaciones y se mete en su cueva durante meses hasta que termina el proyecto. Los proyectos ahora se redefinen de manera iterativa y parte de nuestro trabajo consiste en aportar conocimiento técnico para evaluar riesgos, costes y oportunidades. Por otra parte, la mayor parte de los proyectos involucran gente de distintas disciplinas y conviene no sólo saber trabajar en equipo (que también tiene lo suyo) sino aprender un poco de las áreas relacionadas con nuestro trabajo. Para ser un buen desarrollador front-end necesitarás comprender a tus compañeros de diseño y de back-end, y todos deberéis entender al diseñador/manager del producto en el que estáis trabajando. El perfil de ultra-especialista-en-mi-nicho existe pero hay que ser MUY bueno.

- A nivel de "empleabilidad", me parece importantísimo tener algo visible que puedas enseñar, ya sea a nivel profesional o algo que hayas hecho en tu tiempo libre. Un blog, unos experimentos en GitHub, algún cacharreo de fin de semana... Algo que te divierta hacer y de lo que podrías hablar durante una entrevista de trabajo. Tener un título universitario te puede venir bien para conseguir un visado, pero en mi experiencia eso suele ser lo de menos. Cada vez más gente se da cuenta de que somos lo que hacemos, y no lo que un papel dice que hemos estudiado. Y volviendo a lo que comentaba antes, el entusiasmo, la persistencia y la humildad necesarias para aprender a hacer las cosas un poquito mejor cada día. Creo que sin eso no somos nadie, en lo personal y en lo profesional."

Fuente

viernes, 24 de mayo de 2013

New Little Pet Project: AudioPlayer

I´ve read somethings about sound in HTML5. So I´ve decided write some code playing with it.

The result is in my github account.

Software Companies


Here in Spain the no culture of real software companies, making awesome products. Because our bussiness is rentting programmers for typing for 8hours per week. This is aour software ecosystem.

I´ve found a list of real software companies (out from Spain of course).
One of them (platform45) says: "We love building software". It´s amazing.

domingo, 19 de mayo de 2013

Algunos trucos para generar código limpio

Hace unas semanas estuve en un curso de introducción al TDD, dado por Carlos Ble.
Estas son algunas de las ideas que apunté:

.Código.
-No escribir ninguna línea de producción sin un test que esté en rojo.
 -formas de hacer tdd: tdd inside-out <--> tdd outside-in
 -Escuelas de tdd: school U.K. - school U.S.A.

 -Programar con método. Ser metódico. Disciplina y esfuerzo.
 -Escribir código para la máquina o para las personas: profesionalidad. Escribir código para otros seres humanos.
 Poner cuidado en el código.

 -Libro: Clean Code - Robert C. Martin
 -Videos: cleancoders.com

 -No solo un punto de retorno. Cuando antes se termine, mejor, para no poner ruido al código.
 -Un método no debe de tener más de 5 líneas.
 -Método hagan una cosa --> SOLID
 -Métodos que sean de 2 ó 3 líneas, con un nombre muy muy bueno. Mal nombre es contra-producente, para no entrar a ver lo que hace.
 -No comentar el código. Salvo un frameWork, una api y una clase añadirle la información de su contexto. Salva guardar la expresividad del código.
 -Pensar antes de añadir un comentario, para no mentir y no estar invirtiendo tiempo en el mantenimiento.
 -La función ideal no debe de tener parámetros. Puede tener como máximo 3 parámetros, pero no parámetros booleanos. Si tienes demasiados parámetros tiene que pasar un objeto.
 -Clases no tener más de 2 ó 3 público y 2 ó 3 métodos privados. Con una cantiadad de 25 y 200 líneas.
 -Nada de duplicidad y nombres expresivos.
 -Números mágicos

.Unit Test.
 -Agrupar los test, por contexto.
 -Test repetible e inocuo. Si trabaja con la base de datos, luego tiene que limpiarla.
 -Los test, no tienen que depender, unos de otros.
 -Test muy rápidos y unitarios.
 -No hay verdades absolutas
 -Test de integración, necesita un entorno de verdad, igual al de producción. Comprobar integración con los sistemas.
 -Los test de base de datos, son de end2end, pero se hacen al final, son costosos y tienen que ser pocos, porque son muy lentos
-Dejar una línea entre Arrange, Act & Assert.

 .Doubles.

-Cuando un objeto tiene varias dependencias, es mejor hacer uso de una factoria.
-Stub devuelve cosas, no tiene memoria
-Spy, tiene memoria, recuerda lo que ha pasado
-Mock, tiene memoria, y falla si se tiene que hacer otra llama y no se hace.


También hicimos una kata, para validad contraseñas, con las siguientes reglas:
-Al menos 4 carácteres.
-Al menos un número y una letra
-Al menos una mayúscula
-Al menos una minúscula


El resultado está en mi cuenta de github


Me gustó mucho el curso, por todo.

sábado, 11 de mayo de 2013

Mi resumen de SaveInformaticOS

El pasado sábado 27 de abril estuve en el Open Space SaveInformaticOS

Sigo a JM Beas. Además se celebraba en mi universidad. Fue la primera vez que asistía a un evento de este tipo. Se iba a tratar el problema de nuestra profesión. Como era normal salió el tema de las cárnicas.

Creo que la solución para los males que estamos viviendo son:
-Estudiar, formarse, porque la empresa no se va a preocupar en formar, eso es algo que atañe a cada.
-Mejorar muchísimo como programador.
-Acercarse a lo que es la artesanía de software. Hacer commits a un repositorio público. Hacer proyectos, para demostrar lo que se vale.
-Tener esa actitud de mejora constante, a pesar del paso de los años.
-No va a ser fácil, pero creo que la recompensa va a merecer la pena.

Muy buenas sensaciones en general.
He visto a gente que realmente quiere cambiar, tiene ganas de mejorar. También he visto a gente que disfruta de su situación, por estar en una empresa de producto y se ha dado cuenta del difícil que se están poniendo las cosas. Pero he visto a gente que sufre por su ambiente laboral.

He puesto caras a personas que leo sus blogs, como el de Agustín Cuenta, kinisoftware, Laura Morillo, Alfredo Casado.

Me ha gustado que el CEO de Aspgems, ha dicho que el modelo de la sucontratación, va a morir, porque es insostenible, tal y como se está moviendo el mercado, la bajada de precios tan fuerte.

Me he encontrado a varios profesores de universidad y la verdad es que a la universidad española se la ha apretado bastante, porque la carrera deja bastante que desear. Yo creo que tiene que establecer unas bases sólidas, como por ejemplo paradigmas de programación (orientación a objetos, funcional, lógica, ...), patrones, diseño, ... Con esos conceptos en la cabeza luego el lenguaje o el framework de moda, es lo de menos. Después en el mundo laboral hay que seguir estudiando y ver los distintos caminos que se pueden tomar. Se ha hablado del mentor, para seguir progresando, cosa que me parece muy interesante y recomendable.

Hubo un debate sobre cómo veíamos el futuro. Yo no dije nada, porque tampoco quería trollear, pero para ser sincero lo veo muy negro, porque cada vez veo más paro, más crisis, catástrofes naturales más frecuentes y la tensión bélica entre los paises se puede oler a distancia. Pero solo es una opinión, espero estar equivocado.

Mientras tanto a trabajar, que para eso me pagan, a seguir mejorando y si se puede a disfrutar del recorrido.

miércoles, 8 de mayo de 2013

Ejercicios para hacer en la oficina

Lo malo de trabajar en una oficina delante del ordenador, es que tarde o temprano aparecen los dolores de cuello y espalda. Algunos ejercicios que recomiendan para combatir este mal tan extendido.

Funny T-Shirts

I´ve found an online shop, it sell funny t-shirts source

Coding & Age

I´m from Spain. I work in a little company in Madrid. But the top of the age as a programmer (not software develoiper) is close to 40. I´m worry about it, because I like/enjoy coding. But the stadistics have another opinion about the age & the coding. source I source II

jueves, 18 de abril de 2013

Example of GoF design patterns

url by stackoverflow.com

Forma de terminar los métodos

Llevaba tiempo pensando en cómo terminar los métodos que escribía.
En la universidad, me habían enseñado que había un punto de entrada y otro punto de salida.

public string DoSomething(string paramOne, string paramTwo)
{
   string result = string.Empty;
   if(!string.IsNullOrEmpty(paramOne) && string.IsNullOrEmpty(paramOne)){
      resultado = paramOne;
   }

   else if(string.IsNullOrEmpty(paramOne) && !string.IsNullOrEmpty(paramOne)){
      resultado = paramTwo;
   }

   else if(!string.IsNullOrEmpty(paramOne) && !string.IsNullOrEmpty(paramOne)){
      resultado = paramOne +  "_" + paramTwo;
   }
   return result;
}

Pero leyendo a MagMax, en este artículo me he dado cuenta de que tengo que desaprender y volver aprender cómo escribir los métodos.

public string DoSomething(string paramOne, string paramTwo)
{
   if(string.IsNullOrEmpty(paramOne) && string.IsNullOrEmpty(paramOne)){
      return string.Empty;
   }

   if(!string.IsNullOrEmpty(paramOne) && string.IsNullOrEmpty(paramOne)){
      return paramOne;
   }

   if(string.IsNullOrEmpty(paramOne) && !string.IsNullOrEmpty(paramOne)){
      return paramTwo;
   }

   if(!string.IsNullOrEmpty(paramOne) && !string.IsNullOrEmpty(paramOne)){
      return paramOne +  "_" + paramTwo;
   }
}

miércoles, 27 de marzo de 2013

Creating Namespace in javascript

The Simple HTML


Prueba Namespace
 




The javascript code

var Entities = {};  //<-- the NameSpace

Entities.Person = (function(){ //<-- create a class into the NameSpace
 var Person = function() {
  name = 'Pepe';
  age = 0;
  setAge  = function(age){
   this.age = age;
  };
  setName = function(name){
   this.name = name;
  };
  getName = function(){
   return this.name;
  };
  getAge = function(){
   return this.age;
  };
  
  return {   //<-- set the public & private methods
   setName : setName,
   getName : getName,
   setAge : setAge,
   getAge : getAge
  }
 }
 return Person; //<-- it´s very import for instancing the objects into the NameSpace
})( );

Entities.Client = (function(){ //<-- the same name atribute
 var Client = function(){  //<-- the same name object
  var name = '';
  var direction = '';
  var money = 103;
  return {

  }
 }
 return Client; //<-- the same name return type
})();

var student = new Entities.Person();  //<-- create an object into the NameSpace Entities

 student.setAge(19);
 student.setName('Juan');

 console.log('name: ' + student.name + ' get Name: ' + student.getName());
 console.log('age: ' + student.age + ' get Age: ' + student.getAge());

var foo = new Entities.Person();
foo.setName('Pepe');
foo.setAge(30);

console.log('age:' + foo.getAge() + ' name: ' + foo.getName());



var clientOne = new Entities.Client();
clientOne.name = 'ClientOne';
clientOne.money = 234;
console.log('name Client : ' + clientOne.name);
console.log('money client : ' + clientOne.money);

martes, 26 de marzo de 2013

Educación

Me hace gracia, tener a un compañero que se pavonea, porque tiene un título de ... Me hace gracia porque en la programación, lo que vale es el código que se pica, por mucho título que se tenga.
Para ser sincero, el código que escribe, es bastante cutre a pesar de haber pasado por la universidad, porque no conoce patrones, ni principios SOLID, ... Son líneas de código una detrás de otra, sin mucho sentido. Pero he tenido compañeros que no tenían títulos, pero que han sido muy buenos.
Con esto no digo que no sirva para nada la universidad, yo he pasado por ella, pero no es la única fuente para formarse como desarrollador. Además el ego dificulta enormemente la capacidad de poder seguir aprendiendo.


Un ejemplo muy claro es Pau Garcia-Milà que ha comenzado  eyeos

Me he encontrado un video que habla sobre este tema


lunes, 25 de marzo de 2013

Why is Learning to Code So Hard?

The Answer

Picar código

Picar código | verb. jerg | Forma despectiva de referirse a la actividad o el oficio de programar. Lleva 10 años picando código. Vaya pringao.
Picar código. Vaya expresión más rara. Parece algo inofensivo. Todos la hemos utilizado alguna vez, de broma, como una queja o como una excusa: yo sólo pico código.
El problema con esta forma de hablar es que oculta unos síntomas mas graves. Tal vez esconde el hecho de que la mayoría de los programadores están descontentos con lo que hacen.

Algunos síntomas de picar código

Te auto excluyes del proceso

Solo hago lo que me dicen. No me interesa el negocio donde trabajo. No me importa la metodología de trabajo que utilizan. Voy hecho un zombie por la oficina. Ni siquiera sé por qué programo.

Te anonimiza

Destacar es malo en cualquier caso. Llevo un traje de camuflaje a la oficina a juego con mi cubículo. Que nadie sepa que estoy aquí. Que nadie me pregunte nada. Y menos de programación. Simplemente eres un recurso más Necesitaban 50 programadores para terminar el proyecto de la muerte. Me escogieron a mí. Pero tengo la sensación de que da igual que esté o no.

Crees que no tienes futuro

Todos mis antiguos compañeros tienen puestos de gestión. A mis 35 años, hasta mi madre se preocupa por mi futuro. Tengo que llegar a jefecillo como sea.
Creemos que hay otra forma de trabajar. Queremos eliminar lo negativo y lo ingrato que se entiende por picar código. De hecho, no queremos volver a hablar de picar código. Hay que eliminar esa expresion de nuestro vocabulario. Dejemos de picar y empezemos a programar. Tenemos que entender que programar es una tarea creativa, que no caduca cuando cumples 30 años, y que no se realiza en una habitación cerrada, escondida de los clientes de tu empresa.

El manifesto de basta ya de picar

Firma tu trabajo

Tu trabajo lleva tu sello, y no una multitud de Ctr-C y Ctr-V. Todas tus lineas tiene un propósito y no te importa proyectarlas en la pared para sugerencias de tus compañeros.

Practica, practica, Practica

La mayoría de los días, haces una pequeña practica de programación. Practicas escribir tests. Mejoras tus refactors. Experimentas.

Aprende

Conoces las ultimas tendencias en lenguajes. Estas aprendiendo formas mas eficaces de utlizar tu editor. Lees blogs relevantes y atiendes presentaciones en grupos de usuarios.

Consciente de tu valor

Te involucras en el negocio para el que trabajas ¿Por qué es importante lo que estás programando? ¿Cómo utilizan tus programas? ¿Cuándo? ¿Quién? ¿Por qué? Haces preguntas y entiendes el valor que aportas con tu trabajo.

Fuente

jueves, 21 de marzo de 2013

Nice ecosystem software

  1. Quality tests – sometimes TDD, sometimes test first, and sometimes test after.
  2. Refactor to your heart’s content – if you’re afraid to change code because it might break something, you have problems. Follow SOLID principles as best as you responsibly can and you’ll have fewer problems here.
  3. Continuous integration – make sure everything is working all the time. It helps in the long run (and by long run, I mean tomorrow). Oh, and by CI, I mean CI done right.
  4. Collective code ownership – everybody owns this feature; it’s not just my own. a.k.a. No silos. Also, your victories must be shared, but your failures are also not your own.
  5. Deploy early and often – The best time to deploy a feature is the moment it’s declared “Done” (or Done, done, done). The longer the span between this time and delivery, the more likely it is to fail.
Source

lunes, 18 de marzo de 2013

New way of assignment in javascript

Prubea

domingo, 10 de marzo de 2013

The object LocalStorage in Javascript

A simple object for saving data in the client side, in Firefox has 5MB.



Prubea

jueves, 7 de marzo de 2013

copy .dll into gac from Visual Studio Post Build Event

A reminder for reducing the time of copygin the .dll of the project into c:\windows\asssembly (GAC)

VS2008
copy /Y $(TargetPath) $(SolutionDir)Presentacion\GAC
"C:\Archivos de programa\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe"  -i  $(TargetPath)

VS2010
"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\x64\gacutil.exe" /f /i $(TargetPath)

sábado, 2 de marzo de 2013

Tekpub & javascript

I've watched the video about javascript by tekpub guys, while I've coded I've listened mix seven lions. This the plain javascript code result. It's a nice exercise for improving the javascript skills.
The Code:
var cycler = function(parentContainer){
 var listContainer = $(parentContainer);
 var firstPost = $(parentContainer + " li:first");
  
 cycle  = function(){
  removeFirst();
 }

 removeFirst = function(){
  firstPost.fadeOut(appendToEnd);
 };

 appendToEnd = function(post){
  firstPost.remove();
  listContainer.append(firstPost);
  firstPost.fadeIn(); 
 };


 return{
  cycle : cycle
 }
};

$(function(){
 $("#btnCycler").click(function(){
  var listCycler = new cycler("#posts");
  listCycler.cycle();
 });
});

The HTML:

JS Demo

  • First text
  • Second text
  • Thrid
  • Fourth Text

lunes, 25 de febrero de 2013

Improve Javascript skills

Javascript resources

Page loaded in javascript

Using anonimus function (due to the scope) the events fire where the page is loaded.

 

lunes, 18 de febrero de 2013

Catching the mouse wheel event


Simple Context Menu in Javascript

Right click to get a custom context menu. Click anywhere else to get the default context menu.

domingo, 17 de febrero de 2013

Working with Keycodes in Javascript

I've dicovered a new way for working with keycodes in javascript. Here is the code:

 

 

3 different ways with event click button in javascript


  
  
  

 

jueves, 14 de febrero de 2013

Some Nice Javascript programs


Clock which shows love
To-Do List

Some Theory about Repositories in SharePoint Applications

General Theory
List Design
Unit of Work
DataMapper
SharePoint List Repositories
Some Considerations
Some How-To´s
Project Object SharePoint Mapper
SharePoint Common FrameWork
SharePoint Guidance


Extend class String with Trim function in javascript

String.prototype.trim = function () {
    return this.replace(/^\s+/, '').replace(/\s+$/, '');
}

Authentication SharePoint 2010 based in Forms


using Microsoft.SharePoint;
using Microsoft.SharePoint.IdentityModel;

public class AuthenticationSharePoint : Authentication
{
    public bool IsValid( string url, Usuario usuario)
    {
        return SPClaimsUtility.AuthenticateFormsUser(new Uri(url), usuario.Login, usuario.Contrasenia);
    }
}

Clone Generic Object by Reflection in .NET


public static List GetAllProperties(Type type)
{
    BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly;
    var list = new List();

    if (type != null)
    {
        list.AddRange(type.GetProperties(flags));
        list.AddRange(GetAllProperties(type.BaseType));
    }

    return list;
}

public static T Clonar(T original)
{
    if (original == null) { throw new Exception("cannot be null object"); }

    var tipo = original.GetType();
    var resultado = Activator.CreateInstance(tipo);
    foreach (PropertyInfo propiedad in GetAllProperties(tipo))
    {
        propiedad.SetValue(resultado, propiedad.GetValue(original, null), null);
    }
    return (T)resultado;
}

ProgressBar in javasccript

 

 Progress Bar



    

domingo, 10 de febrero de 2013

Load CSS file Dynamically

function loadCSSFileDymanically(dir){
var link = document.createElement(“link”);
link.rel = "stylesheet";
link.type = "text/css";
link.href = dir;
var head = document.getElementsByTagName(“head”)[0];
head.appendChild(link);
}

Load JavaScript file Dynamically

function loadScriptDinamically(dir){
var script = document.createElement(“script”);
script.type = “text/javascript”;
script.src = dir;
document.body.appendChild(script);
}

lunes, 28 de enero de 2013

My New Pet Project: Pomodairo

I've started a new pet project called Pomodairo, because I'm studing javascript. The original idea I've used a sound librery called riffwave.js
The code lives in github

The Photo is from internet
Happy  proramming

lunes, 21 de enero de 2013

javascript Working with QueryString

I've write a beter function for getting the values from the Querystring. I'm sure, there is a better code and better way. I show you the code (blospot has some problems with the code formating):

/*
function getQueryString(){
 var search = location.search.substring(1);
 var result = {};
 var elements = search.split("&");
 var element = '';
 var key = '';
 var value = '';

 for(var i=0; i<elements.<length>; i ++){
  element = elements[i].split('=');
  key = decodeURIComponent(element[0]);
  value = decodeURIComponent(element[1]);
  result[key] = value;
 }
 return result;