By uskatpayday loans

DispatchOperationRuntime y Excepciones. Mi respuesta.

Lo primero que anda mal es el mensaje que lanza la excepción.

Pero realmente el método al que se llamo fue:

Esto, a parte de hacerte perder unas horas intentando determinar el problema, es un mal menor y un error que le puede pasar a cualquiera.

Para mi el problema mas grande esta en la llamada a DiagnosticUtility.FailFast. Este método recibe un mensaje (el de arriba), el tipo de excepción que se captura y el mensaje de la excepción, pero perdemos el resto de información. Por tanto lo que se muestra a la salida es esto:

Bastante inútil, ¿no creéis? Sin embargo la excepción original incluía la verdadera pila de llamadas y podíamos determinar exactamente donde se generaba la excepción, que por cierto era un error de desbordamiento al hacer el flush de nhibernate.

Como no podemos tocar el código de WCF (DispatchOperationRuntime) tendremos que ser más imaginativos. Al final opte por envolver la excepción original en otra que devolviera como mensaje toda la información que me parecía relevante. Supongo que podría haber intentado una solución más elegante con algo de AOP pero también más compleja.

Update:

Es posible aunque no lo he probado que mediante las capacidades de extensión de WCF podamos usar nuestro propio Dispatcher. ¿Alguien lo confirma?

Referencias:

¿Qué anda mal en este código? DispatchOperationRuntime y Excepciones
http://msdn.microsoft.com/es-es/library/system.servicemodel.dispatcher.icallcontextinitializer.aspx
http://fabiomaulo.blogspot.com.es/2009/10/nhibernate-wcf-session-per-call-in.html
http://reflector.webtropy.com/default.aspx/WCF/WCF/3@5@30729@1/untmp/Orcas/SP/ndp/cdf/src/WCF/ServiceModel/System/ServiceModel/Dispatcher/DispatchOperationRuntime@cs/3/DispatchOperationRuntime@cs

 

¿Qué anda mal en este código? DispatchOperationRuntime y Excepciones

Dynamic dispatch en c#

    private void Application_DispatcherUnhandledException(
           object sender
          , DispatcherUnhandledExceptionEventArgs e)
    {
        Process((dynamic)e.Exception);
    }

    public void Process(Exception exception)
    {
        Log.Warn("Exception");
    }

    public void Process(ArgumentException exception)
    {
        Log.Debug("ArgumentException");
    }

Referencias:
http://en.wikipedia.org/wiki/Dynamic_dispatch
http://mstecharchitect.blogspot.com/2008/11/how-to-handle-unhandled-exception-in.html
http://msdn.microsoft.com/en-us/library/dd264736.aspx

Fotos segundo sábado áxil

TDD/BDD – Segundo sábado áxil

Este fin de semana tuvo lugar el segundo sábado áxil de la comunidad áxil-mente de Galicia. En dicho evento pude proponer una charla sobre BDD, después de escuchar las opiniones de todos y ordenar un poco mis ideas voy a intentar expresar mi opinión al respecto.

Yo soy de los que piensan que BDD es TDD bien hecho. Tengo que reconocer que esta opinión provoco ciertas sonrisillas y tal vez merezca la pena una aclaración.

Al principio, al menos en “mi” principio, TDD era una de las practicas de XP y consistía en escribir un test antes de empezar a escribir código. Solo eso. ¿Y BDD? BDD es todo lo que TDD quiso ser y no le dejaron. Escribir los test antes que el código tiene una serie de beneficios intrínsecos. Tenemos mucho más que una extensa red de seguridad para hacer refactoring o cambiar algo en nuestro código. Lo cierto es que también nos ayuda a obtener un mejor diseño, a desacoplar más nuestras clases, a centrarnos más en lo que estamos haciendo, a diseñar nuestras APIs desde el punto de vista de quién las consume y un largo etc. Por tanto TDD merecía un nombre más ambicioso, entonces llego BDD.

La primera persona que hablo sobre BDD fue Dan North. En su artículo habla sobre todo el proceso que siguieron él y algunos amigos hasta dar con lo que llamaron BDD. Os animo a leer el artículo con atención. Para mí la palabra clave es “behaviour”.  Si quitamos la palabra test de nuestro proceso de desarrollo favorito y ponemos comportamiento no tendremos una batería de test que ejercita nuestras clases y métodos, tendremos el comportamiento de nuestros objetos expresado en forma de test. Esa es la clave.

Un poco de código:

Ejemplo en TDD:

   1:  [TestClass]
   2:  public class CalculatorTests
   3:  {
   4:     [TestMethod]
   5:     public void AddTest()
   6:     {
   7:        var calc=new Calculator();
   8:        var result = calc.Add(3, 2);
   9:        Assert.AreEqual(5,result);
  10:      }
  11:  }

Ejemplo en BDD:

   1:  [TestClass]
   2:  public class CalculatorSpecs
   3:  {
   4:      [TestMethod]
   5:      public void given_two_natural_number_when_add_then_result_is_ok()
   6:      {
   7:         var calc = new Calculator();
   8:         var result = calc.Add(3, 2);
   9:         Assert.AreEqual(5, result);
  10:      }
  11:  }

¿Pero qué aporta BDD? Bueno, primero desterrar de una vez por todas la T(est) de su nombre, algo que muchos pedían a voz en grito. Y segundo, otra serie de beneficios, por ejemplo: la mejor documentación de tu código estará en tus test, serán menos frágiles o al menos mentirán menos ya que prueban el “qué “ y no el “cómo”, incluso, si tienes suerte, puede que tus clientes escriban los criterios de aceptación de sus historias usando Gherkin y cerrarás el círculo como hace Dan North en su artículo.

Algunos dicen que BDD son test de aceptación. Yo pienso que un test tanto si es de aceptación, de integración, unitario o lo que sea debe y puede expresar un comportamiento. Otros hablan de niveles y dicen que BDD solo se puede aplicar a niveles más externos de la aplicación dejando TDD para las capas más internas y cercanas al desarrollador. Mi opinión es que estas confusiones las han provocado los framework y sus notaciones a la hora de expresar los comportamientos. Así tenemos Given/When/Then o Context/Specification. Pero no podemos dejar que estos frameworks nos digan dónde podemos usar BDD. Si para ti no es natural expresar los test de tus capas más internas con GWT entonces no lo uses, usa cualquier otra forma que te sea útil (can_add_two_numbers por ejemplo).

BDD es la forma de hacer TDD del siglo 21, ¿te lo vas a perder?

 

Para saber más:

 

@axilmente en la #kutruparty

Al final @pvcarrera, @pepellou y un servidor conseguimos reunirnos para un minievento técnico en la kutruparty. Se nos unieron seis interesados, y como no sabíamos muy bien que nos íbamos a encontrar todo fue bastante improvisado. Empezamos explicando brevemente conceptos básicos sobre pruebas automatizadas e implementamos una calculadora que “sabia” dividir. Después introdujimos TDD y para asentar los conocimientos dedicamos un pomodoro de 45′ a implementar FizzBuzz. Para terminar @pepellou propuso una mesa redonda en la que hablamos sobre incorporar lo que habíamos visto hasta ese momento en nuestro día a día.

La verdad es que creo que a pesar de lo precipitado que acabo siendo todo, fue un éxito.

Quiero darle las gracias a Adrián y al resto de la organización de la kutruparty por alojarnos y colaborar con todos los medios a su disposición.

1º Sábado Áxil de la comunidad axilmente

El pasado Sábado día 20 de Noviembre fue el primer sábado axil de la comunidad ágil gallega. Tal acontecimiento tuvo lugar en el Centro Sociocultural e Xuvenil Municipal “O Ensanche” en Santiago de Compostela.

La jornada empezó escribiendo en una pizarra los temas que nos interesaban, después votamos y al final llegamos a un acuerdo salomónico de cómo organizar el día. Todo muy bien guiado por @jpenalta.

Al final durante las dos horas de la mañana hicimos dos tracks en paralelo uno de iniciación y otro más avanzado. No hubiese estado mal que hubiera ido al de iniciación pero me pareció que habría más discusión el avanzado y allí me fui.
En primer lugar hablamos sobre scrum en entorno multiproyecto una mesa redonda propuesta por @carlisgg. La charla estuvo bastante interesante, @mpermar, @pepellou, @pvcarrera y otros que aún no tengo “virtualizados” compartieron sus experiencias y surgieron algunas ideas que espero que @carlisgg pusiera en práctica y en la próxima nos comente que tal le fue.

La segunda trato sobre contratos ágiles, propuesta por @pvcarrera, muy interesante también. Además había gente que tenía experiencia en tratar con las administraciones publicas y hablamos sobre cómo podría encajar un contrato ágil en la administración.

Después nos fuimos a comer con el resto de la tropa. @davidesmerodes hizo buenas migas con un tal Milo y nos consiguió una comida de primera. Las cuatro horas que tuvimos para degustar los fabulosos platos de la cocinera ganadora del permio milenium se pasaron volando. Durante la comida hablamos de muchísimas cosas pero los efectos del vino no me permiten contáoslas.

A la vuelta de la comida llego el momento técnico. @pvcarrera y @pepellou hicierón una demostración magistral de tdd codificando la conocida kata FizzBuzz. Pasado el pomodoro desenfudamos los portátiles y en parejas nos pusimos con Roman Numerals durante dos pomodoros. Después una retrospectiva rápida y a la retrospectiva de verdad.

@davidesmerodes tiro de lápiz y pizarra y nos guio en la retrospectiva. Salieron muchas cosas interesantes pero… no le hice una foto a la pizarra. De todos modos yo me quedo con lo de saber que no estamos solos, que somos más de un pirado en esto de hacer las cosas mejor cada día y que en Enero será la segunda de una larga lista de sábados agiles.

Adjunto por si a alguien le interesa mi implementación de la kata Roman Numerals: código en codeplex

Por favor ayúdame a mejorar, critícame.

Otros que también lo contaron:

Mi experiencia con Android (1)

Después de mucho tiempo utilizando Windows Mobile (desde 2003 aproximadamente) calló en mis manos una Htc Magic. Fue entonces cuando me di cuenta de lo frustrante que es la experiencia Windows Mobile para el usuario.
Android lo hace todo tan sencillo y funciona tan bien que el paso de un sistema a otro fue muy natural, nada traumático.

Ya metido en harina me hice con una Htc Desire, la misma que actualmente me acompaña a todos sitios. Mucho podría escribir aquí sobre las diferencias entre ambos sistemas y sobre mi experiencia con Android pero para eso ya hay grandes fuentes de donde beber:

El caso es que después de un tiempo con la rom original decidí rootearla y ponerle una rom cocinada. La elegida después de algunas pruebas fue OpenDesire. Una rom muy equilibrada con muchas características que no trae “out of the box”, muy rápida y sin los programas que le mete htc a su desire, eso quiere decir también sin htc sense. He tenido esta rom durante un par de meses pero a cada nueva versión se resolvia algun problema y aparecía otro. Pequeños problemas no obstante pero siempre un pero. Total que recientemente decidi volver a la rom original.

El problema de la rom original es que trae algunos programas que no se pueden desinstalar y que si no estas rápido y se lo impides se conectan a Internet y consumen batería. Después de buscar un rato encontré la forma de eliminar dichas aplicaciones:

Borrar aplicaciones Htc SENSE
adb shell
mount system
cd system
cd app
ls
rm *Friend*
rm *PDFView*
rm *Twitter*
rm *Stack*
rm *Quicko*
rm *Foot*

El resultado fue genial, el consumo de batería era menor y sin programas que no quería. El problema llego con una actualización de la rom original.
Pues sí, resulta que si eliminas dichos programas y despues intentas instalar una actualización oficial fallará. El primer fallo es sobre la firma. Tienes que decirle al recovery que se salte esa comprobación. El siguiente error es que no encuentra alguna de las aplicaciones borradas. Mi solución fue restaurar la rom y aplicar el update. También podrías guardar una copia de dichos programas y restaurarla antes de una actualización.

De momento yo sigo con esos programas instalados, eso sí, bien configurados para que no se conecten a Internet.

Aturdido y abrumado

Aturdido y abrumado así me encontraba cuando @ecomba me pregunto: “¿Que sientes?”.
Estábamos en la tercera retrospectiva del día. ¡Vaya pregunta! os diréis, pero realmente tenia sentido.
Las dos primeras iteraciones habían transcurrido con normalidad. Creía que sabia lo que estaba haciendo, al menos en la segunda. La primera fue… ¿como decirlo? como si te sacaran a oscura de casa y te pusieran a programar en un ordenador que no es el tuyo y te pidieran que rehicieras el kernel de linux. Bueno… tal vez no tanto, pero soy andaluz. El caso es que me encontraba extraño y nervioso. Era la primera vez que practicaba pair programming, además de cuando en cuando tenia un tío detrás de mi cogote que no decía nada pero cuya cara era un poema. La segunda, sin embargo, fue sobre ruedas. Pero llego la retrospectiva y fue toda una bofetada, ¿Qué es eso de mundo? ¿ Dónde pone vecindario? ¿Qué es una celda?…. ¿Qué estaba pasando?
Entonces @ecomba nos orientó: “Quiero que hagáis TDD de la siguiente manera: Escribid primero el assert. Después el código necesario pero todo dentro de la mima clase de test. Solo cuando os pida a gritos que la saquéis a una clase lo haréis… Ah por cierto… no uséis if ni métodos de más de 4 lineas”.
Bueno, fue un poco frustrante pero seguí adelante. La putada fue que justo antes de que pasaran los malditos 45 minutos del maldito pomodoro @ecomba vino a nuestro lado y nos dijo: “¿Que es muerto?”. Acto seguido borramos todo el código. Lo que nos devuelve al principio de la historia.
Despues de preguntar por nuestro estado de ánimo nos alentó a continuar empezando por definir las reglas de muerte y vida.
Creo que al final del quinto pomodoro todos habíamos comprendido perfectamente las reglas del juego de la vida, algo que no nos habíamos molestado en hacer la primera vez que nos pusimos a programar. Además les habíamos puesto nombre, y no cualquier nombre, nombres coherentes y oportunos. Habíamos luchado con el “naming”.
En la última iteración nos pidió que consideráramos la variable temporal del problema. Esto nos ayudo a juntar todas las piezas del puzzle que antes nos había hecho construir.
¿Qué aprendí? Es difícil decirlo. Y eso que parte del tiempo que pase pensando lo hice intentando descubrir el propósito del juego de @ecomba.
Como conclusión puedo decir que con frecuencia no analizamos en profundidad el problema, nos basamos en nuestra experiencia o en ideas preconcebidas que conducen nuestro TDD. Hay que fijarse más en el dominio y tal vez TDD no solo sirva para que el diseño emerja sino también para clarificar el dominio que queremos modelar. También que los nombres son muy importantes, las palabras son muy importantes, que el pair programming es genial y muy enriquecedor, que cada lenguaje es una pequeña joya y que si estos tíos organizan otra fiesta yo no me la pierdo (aunque me tenga que colar).

Gracias especialmente a @ecomba por regalarnos su tiempo a @autentia por el patrocinio y a todos los que estuvieron allí, que son muchos, por compartir un poco de código conmigo.

Otros que también lo contaron:

¿Quién no quiere un Nexus One?

Pues yo desde luego quiero uno y si encima me lo regalan los chicos de El Androide Libre mejor que mejor. Si vosotros malditos insistís en minimizar la probabilidad de que me toque aquí tenéis las bases.

Suerte,