December 2011 - Artículos

image47dd1de4

Buenas,

me lo voy a apuntar ahora que me lo han mostrado 10 veces, porque si no me mareo. El tema es el siguiente, cuando te peleas con WPF, Silverlight, o alguna otra tecnología que haga un uso excesivo de formatos con etiquetas, pues el tema de la edición en modo texto puede ser bastante complicado. Una gran solución “visual” para estos casos es aprovechar el formateo que nos ofrece Visual Studio, donde se separa un atributo por línea. Esta opción se activa desde el menú [Tools // Options], en la sección [Text Editor // XAML // Formatting // Spacing] seleccionado la opción [Position each attribute on separate line]

image

Por ejemplo, volviendo al ejemplo que publiqué hace 2 días podemos ver parte del XAML con este formato

   1: <TextBlock Text="Merry Christmas" Grid.Row="0" Grid.Column="1" FontSize="24" Foreground="White" 
   2: FontFamily="Segoe UI Semilight" FontWeight="Bold" Margin="0" HorizontalAlignment="Center" />
   3: <Canvas x:Name="canvasContent" Margin="10,10,0,0" Grid.Row="0" Grid.Column="0" Grid.RowSpan="2">
   4: <Grid Grid.Column="1" Grid.Row="1"><Border BorderThickness="3" BorderBrush="White" CornerRadius="10" 
   5: Padding="2" HorizontalAlignment="Center" VerticalAlignment="Center"> <Grid>
   6: <Border x:Name="mask" Background="White" CornerRadius="7" /> <StackPanel><StackPanel.OpacityMask>
   7: <VisualBrush Visual="{Binding ElementName=mask}" /></StackPanel.OpacityMask><Image x:Name="CameraViewer" 
   8: Stretch="UniformToFill" MaxWidth="640" MaxHeight="480" /></StackPanel></Grid></Border></Grid>

 

O después de un Ctrl+k, Ctrl+d, lo vemos de una forma más “natural”

   1: <TextBlock Text="Merry Christmas"
   2:            Grid.Row="0"
   3:            Grid.Column="1"
   4:            FontSize="24"
   5:            Foreground="White"
   6:            FontFamily="Segoe UI Semilight"
   7:            FontWeight="Bold"
   8:            Margin="0"
   9:            HorizontalAlignment="Center" />
  10: <Canvas x:Name="canvasContent"
  11:         Margin="10,10,0,0"
  12:         Grid.Row="0"
  13:         Grid.Column="0"
  14:         Grid.RowSpan="2">
  15:     <Grid Grid.Column="1"
  16:           Grid.Row="1">
  17:         <Border BorderThickness="3"
  18:                 BorderBrush="White"
  19:                 CornerRadius="10"
  20:                 Padding="2"
  21:                 HorizontalAlignment="Center"
  22:                 VerticalAlignment="Center">
  23:             <Grid>
  24:                 <Border x:Name="mask"
  25:                         Background="White"
  26:                         CornerRadius="7" />
  27:                 <StackPanel>
  28:                     <StackPanel.OpacityMask>
  29:                         <VisualBrush Visual="{Binding ElementName=mask}" />
  30:                     </StackPanel.OpacityMask>
  31:                     <Image x:Name="CameraViewer"
  32:                            Stretch="UniformToFill"
  33:                            MaxWidth="640"
  34:                            MaxHeight="480" />
  35:                 </StackPanel>
  36:             </Grid>
  37:         </Border>
  38:     </Grid>
  39:     <ContentControl x:Name="contentControlHat1">
  40:         <Image x:Name="imageHat1"
  41:                Width="64"
  42:                Height="64"
  43:                Source="/ElBruno.KinectViewer;component/Images/santa-hat.png"
  44:                Visibility="Hidden" />
  45:     </ContentControl>

 

Ojo, que sobre gustos no hay nada escrito y tal vez esta opción a más de uno no le guste, pues bien … aquí hay una opción para probar y elegir.

 

Saludos @ Home

El Bruno

   

image

Buenas,

en estos días de fiestas, cuando se te juntan al lado 2 enanos con ganas de jugar, tenes el kinect conectado al PC y el SDK que te extraña, pues lo menos que te sale es algo como lo siguiente:

image

¡¡¡ Una aplicación que para cada persona que aparece en la WebCam le pone un gorro de Santa Claus !!!

Disclaimer: como pueden ver en el screenshot, además de la vista de la WebCam estoy mostrando el skeleton, pero como justo le dió un rayo de sol a mi enana en el brazo, pues no lo reconoció !!!

Pues bien, después de varios post sobre Kinect, hoy el desafío consistía en lo siguiente

  1. identificar el joint específico de la cabeza de cada skeleton
  2. calcular las coordenadas relativas de ese joint frente a la imagen de la webcam
  3. pintar un Santa Hat en la webcam

El primer punto se soluciona fácilmente, ya que una vez que iteramos por los skeletons reconocidos en modo Trackeable (líneas 6 a 9), podemos iterar entre los Joints del skeleton y verificar que el mismo sea el de la cabeza comparando con [JointID.Head] (línea 17).

Una vez identificado el Joint de la cabeza pasamos al 2do punto que es un poco más complicado. La función GetDisplayPosition() (línea 27), es la encargada de realizar la conversión de la posición del Joint a la ubicación relativa en la imagen. Para esto se utilizan las siguientes capacidades del SDK

- SkeletonEngine.SkeletonToDepthImage() utilizando esta función podemos conocer la ubicación relativa en “depth” de un joint.

- NuiCamera.GetColorPixelCoordinatesFromDepthPixel() utilizando esta función, podemos descubrir la posición en coordenadas X/Y a partir del depth que obtuvimos antes.

En ambos casos, hay que hacer algunos ajustes ya que por un lado la imagen de la webcam está en resolución de 640*480 y la capacidad de depth es solo de 320*240. Pero bueno, con estas pocas líneas ya podemos definir la ubicación específica de nuestra cabeza y pintar un SantaHat en el mismo.

 

   1: void KinectSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
   2: {
   3:     canvasSkeleton.Children.Clear();
   4:     this.HideImageHats();
   5:     var skeletonId = 0;
   6:     foreach (var skeleton in e.SkeletonFrame.Skeletons.Where
   7:                   (skeleton =>
   8:                             SkeletonTrackingState.Tracked == skeleton.TrackingState))
   9:     {
  10:         skeletonId++;
  11:         this.DisplayImageHats(skeletonId);
  12:         PaintBones(skeleton);
  13:         PaintJoints(skeleton);
  14:  
  15:         foreach (Joint joint in skeleton.Joints)
  16:         {
  17:             if (joint.ID != JointID.Head)
  18:             {
  19:                 continue;
  20:             }
  21:             var newPosition = this.GetDisplayPosition(joint);
  22:             this.MoveImageHats(newPosition, skeletonId);
  23:         }
  24:     }
  25: }
  26:  
  27: private Point GetDisplayPosition(Joint joint)
  28: {
  29:     float depthX, depthY;
  30:     kinect.SkeletonEngine.SkeletonToDepthImage(joint.Position, out depthX, out depthY);
  31:     depthX = Math.Max(0, Math.Min(depthX * 320, 320));
  32:     depthY = Math.Max(0, Math.Min(depthY * 240, 240));
  33:     int colorX, colorY;
  34:     var iv = new ImageViewArea();
  35:     kinect.NuiCamera.GetColorPixelCoordinatesFromDepthPixel(ImageResolution.Resolution640x480, iv, (int)depthX, (int)depthY, (short)0, out colorX, out colorY);
  36:     var newX = (int)(CameraViewer.ActualWidth * colorX / 640.0) - 30;
  37:     var intY = (int)(CameraViewer.ActualHeight * colorY / 480) - 30;
  38:     return new Point(newX, intY);
  39: }
Esta vez he cambiado el modo de publicación y si quieren descargar el código lo pueden hacer desde CodePlex desde http://kinectmerrychristmas.codeplex.com/ .
Si ya tienes un Kinect, el SDK y ganas de probar la aplicación, puedes instalar la misma directamente desde http://kinectmerrychristmas.codeplex.com/releases/79524/clickOnce/ElBruno.MerryChristmas.application

 

Saludos @ Home y Merry Christmas

El Bruno

   

Referencias:

image47dd1de4

Buenas,

otro detalle a tener en cuenta con Windows 8 y Visual Studio 2010 que me dí en la frente y que tenía pendiente de postear.  En este caso es el siguiente mensaje que te aparece cuando ejecutas pruebas unitarias y tienes habilitada la Cobertura de Código.

image

Si no has visto este mensaje es que, o bien no tienes habilitada la Cobertura de Código o no tienes pruebas unitarias; en ambos casos te mereces que una horda de zombies te persiga y coma esa parte de tu cerebro que te detiene para no hacer pruebas unitarias.

Pero bueno, volviendo a lo que me molestaba, que era tener que habilitar esta feature para cada ejecución de Unit Tests; me puse a ver que tiene Windows 8 por debajo en este caso.

Una vez habilitado todo lo necesario en “Turn Windows features on or off”, la siguiente prueba me siguió mostrando la ventana de activación, así que decidí bajar un nivel más.

image

Antes de seguir, el nuevo Task Manager de Windows 8 es muy bueno, pero el Process Explorer de Windows SysInternal sigue siendo la mejor tool para analizar procesos en un entorno Windows.

Asi que lancé una sesión de unit tests con el Process Explorer activo y me llamó la atención que además del árbol de llamadas propio de Visual Studio 2010

  • devenv.exe
    • QTAgent32.exe
      • VSPerfMon.exe
        • conhost.exe

Apareciese un ejecutable desconocido para mi >> fondue.exe

image

Después de navegar un poco por internet (donde no hay nada de información al respecto), encontré lo siguiente

  • C:\Windows\System32\Fondue.exe “Windows Features on Demand UX”

Que tampoco me ayudó mucho, ya que es básicamente lo que me indica el formulario de activación, pero si me ayudó a ver la ayuda del mismo

image

Y claro, después de 2 pruebas encontré el comando que estaba necesitando

C:\Windows\system32>Fondue.exe /enable-feature:NetFx3 /hideux:all

Una vez ejecutado este comando desde un Command Prompt con permisos de Administrator, no tendremos más problemas con la ejecución de pruebas unitarias.

 

 

Saludos @ La Finca

El Bruno

   

image

Buenas,

en estos días donde con Javi y Roberto no hacemos otra cosa más que pegarnos con JavaScript y la castaña de HTML5, pues después de un tweet de Hadi Hariri me enteré de la existencia de WebStorm 3.0 y decidí probarla. La verdad es que comparado con Visual Studio 2010 es mucho más potente para jugar con JavaScript. Detalles como las siguientes hace que realmente lo tenga en cuenta para la siguiente fase del proyecto:

  • Soporte para unit testing.
    JavaScript es una castaña, creo que no digo nada nuevo y los frameworks de Unit Testing que hay por allí no son muy buenos, pero por lo que he visto en la integración y soporte, el IDE de WebStorm hace que sea bastante natural trabajar con pruebas unitarias en este contexto. Como referencia > http://blog.jetbrains.com/webide/2011/10/javascript-unit-testing-support/#comments
  • Duplicated Code
    JavaScript es una castaña, lo repito aquí. Y así como al copy/paste de esta sentencia lo hago en 2 clicks en el post, el JavaScript el copy/paste es una de las prácticas mas utilizadas. No sé porqué, parece que la gente no supiera que cada acción de copy/paste lanza un trigger que mata un gatito en internet, pero bueno esto es así. El detector de duplicated code ayuda bastante a eliminar esos “bad smells” que hay en el código.
  • Integración con TFS
    Cool Risa

 

Si quieres eliminar el ardor de tu úlcera y vivir unos años más, pues descarga el trial desde http://www.jetbrains.com/webstorm/index.html

 

Saludos @ La Finca

El Bruno

   

Publicado 22/12/2011 18:19 por El Bruno | 1 comment(s)
Archivado en: ,

Buenas,

me lo voy a apuntar para que la próxima vez que me aparezca este error

   1: C:\>;powershell.exe -command ./New-Scriptazo.ps1
   2: File C:\\New-Scriptazo.ps1 cannot be loaded because the execution of scripts is disabled on this system. 
   3: Please see "get-help about_signing" for more details.
   4: At line:1 char:22
   5: + ./New-Scriptazo.ps1 <;<<<
   6:     + CategoryInfo          : NotSpecified: (:) [], PSSecurityException
   7:     + FullyQualifiedErrorId : RuntimeException

me acuerde que la sentencia desde la consola de PowerShell para habilitar la ejecución de comandos es

   1: Set-ExecutionPolicy RemoteSigned

Listo Brunito???

 

Saludos @ La Finca

El Bruno

   

Fuente: http://technet.microsoft.com/en-us/library/ee176949.aspx

Publicado 20/12/2011 15:05 por El Bruno | con no comments
Archivado en: ,

Buenas,

me parece increíble que todavía no haya probado esta funcionalidad y eso que en WinTablet.Info hablaron de esto hace ya unos meses. Pues bien, como la tableta del “Guidours 8” es del Valentino, no iba a pretender que cada vez que quisiera pintar o jugar a los pajaritos cabreados pusiese mi contraseña de Live. Lo mejor es configurarle un acceso con Live Image Login y listo …

Para muestra un video Risa

Windows 8–Live Image Login

 

Saludos @ Home

El Bruno

   

Publicado 19/12/2011 21:49 por El Bruno | con no comments
Archivado en:

image47dd1de4

Buenas,

una vez más Brain Harry nos presenta un nuevo release de la TFS Power Tools. En este caso, la descarga de December 2011 presenta las siguientes novedades

  • Todo para ECLIPSE.

Lo dicho, hay minor bug fixing en la versión de Visual Studio 2010 + Team Foundation Server 2010 pero esta versión incorpora como gran novedad un montón de funcionalidades para el proveedor de Team Explorer Everywhere. Desde la gestión y configuración de alertas desde ECLIPSE hasta las búsquedas dentro de este IDE. Antes de olvidarme, también esta el soporte para x64 para el proveedor MSSCCI; y como siempre los datos completos en el post de Brian Harry.

Yo me iré a seguir organizando el descontrol que ha quedado en mi casa después de la fiesta de los Ninos :D

 

 

Saludos @ Home

El Bruno

   

Fuente: http://blogs.msdn.com/b/bharry/archive/2011/12/16/december-2011-tfs-power-tools-release.aspx

image47dd1de4

Buenas,

hoy me han rebotado una aplicación para Windows 8 en la AppHub por un detalle de lo más extraño:

Los ScreenShots que subí a la AppHub asociados con mi aplicación eran PNGs transparentes

Pues bien, a grandes problemas >> pequeñas soluciones. En mi caso, como todo el tratamiento de imágenes lo hago en local con IrfanView como visor y con Paint.Net como herramienta de edición. Si tengo problemas más avanzados recurro a Expressión Blend o a alguno que sepa. Pero bueno, para este caso en particular, la solución consistió en

  • Abrir los PNGs con IrfanView
  • Realizar un “Save As” en formato PNG
  • Desmarcar la opción “Save Transparent Color”

image

En 10 días aproximadamente veré si esto le gusta o no a la gente de AppHub.

 

Saludos @ La Finca

El Bruno

   

Publicado 15/12/2011 19:15 por El Bruno | 1 comment(s)
Archivado en: ,

image

Buenas,

ayer vimos como empaquetar y desplegar una aplicación creada con Visual Studio 11 en un Windows 8. Lo que el bruno no te contó (porque soy un tipo jodido) es que si quieres desplegar una aplicación en un Windows 8 que no tenga instalado Visual Studio 11 te vas a encontrar con el siguiente error

image

Donde los mensajes interesantes a tener en cuenta son los siguientes

  • Installation of this application requres a Windows Store Developer License or enterprise-qualified client
  • [Package Full Name] was blocked beacuse no valid policy or license could applied to it.

Toma ya!!! qué significa esto? pues que para poder instalar un paquete en Windows 8 necesitamos tener instalado el Visual Studio 11. Y ojo, no solo instalado sino además que lo hayamos ejecutado una vez para que se nos active la Store Developer License.

Así que ya sabes >> instala un Visual Studio 11 y serás feliz Risa

 

Aclaración: este es el post con la solución oficial hasta hoy, mañana va el post con el truco/ñapa que te ayuda a ahorrarte el espacio en disco que te consume Visual Studio 11.

 

Saludos @ Here

El Bruno

   

image

Buenas,

ahora que la App Store para Windows 8 es una realidad, surge la duda sobre cómo desplegar las aplicaciones desarrolladas con Visual Studio 11 en Windows 8. Supongamos que tenemos una Grid Application muy simple

image

Pues bien, si quieres ejecutar esta interesante aplicación en otro ordenador con Windows 8, seguramente lo primero que harás será copiar el contenido de la carpeta bin/Debug o bin/Release a ese ordenador. Sin embargo al momento de lanzar el ejecutable te encontrarás con el siguiente error:

image

   1: [Window Title]
   2: ...ElBruno.GridApplication01\ElBruno.GridApplication01\
   3: bin\Debug\elbruno.gridapplication01.exe
   4:  
   5: [Content]
   6: ...\ElBruno.GridApplication01\ElBruno.GridApplication01\
   7: bin\Debug\elbruno.gridapplication01.exe
   8:  
   9: This application can only run in the context of an AppContainer.
  10:  
  11:  
  12: [OK]

¿Y ahora?, pues los más osados instalarán Visual Studio 11 en ese ordenador y recompilarán la aplicación. De esta forma lograremos algo que los desarrolladores venimos pidiendo desde hace siglos >> que se distribuya Visual Studio como parte del sistema operativo, en clientes, servers, teléfonos móviles, etc. Pero se me va la idea … pues bien, si quieres desplegar la aplicación lo puedes hacer empaquetando la misma y distribuyéndola a través de 2 canales

  • App Store
  • Local App Packaging

Como para la primera hay que pagar y todavía no está activa, pues veamos los pasos para la 2da opción.

1. En primer lugar seleccionamos el proyecto

2. Desplegamos el menú contextual y seleccionamos la opción [Store // Create App Package…]

image

3. Seleccionamos la opción de creación de paquete local

image

4. Definimos la ubicación para la generación del paquete y el gestionado de versiones.

image

5. Ahora ya podemos construir nuestro package.

6. Una vez generado el paquete podremos copiar el directorio “Package” a cualquier Windows 8.

7. Dentro del directorio “Packages\<Application Name>_<Version>_AnyCPU_Debug_Test\” existe un archivo .BAT que permite instalar la aplicación.

8. Lanzamos el bat de instalación desde un command prompt con permisos de administrator

image

9. Listo … nuestra aplicación ya se encuentra instalada y lista para ejecutar desde el contexto de Metro Risa

image

 

 

Saludos @ Here

El Bruno

   

Cover Image For The Agile Samurai

Buenas,

Si bien lo leí en vacaciones, tengo pendiente desde hace bastante tiempo el hacer un review de este excelente libro de Jonathan Rasmusson (dar una vuelta por su  blog ya es un placer):

THE AGILE SAMURAI

En pocas, muy poca páginas, JR da un repaso a los principios básicos de la gestión de proyectos de desarrollo con Agile; la gestión de requerimientos (user stories si sos muy detallista), el día a día de desarrollo, y muchas conclusiones sobre el trabajo en general. Lo más interesante del libro, es que plantea todos los conceptos que ya conoces (pero tal vez no utilizas) de una forma tan natural que te dan ganas de trabajar con sus concejos lo antes posible.

Otro punto que me ha gustado mucho es que el libro viene plagado de imágenes, que son bastante representativas. No se trata del clásico chart creado para explicar un concepto o idea, sino más bien un dibujo tipo comic que con 2 trazas te deja claro un concepto. Por ejemplo, mira la siguiente imagen para el ejercicio de asignación de Points a US

¿Basatante claro no? pues lee el post completo en http://agilewarrior.wordpress.com/2011/11/13/self-inflicted-scope-creep/ y verás que el tema de la gestión de alcances y expectativas es muy delicado en un proyecto. Es como una vuelta a los orígenes >> te cuenta lo que ya sabes pero te dan ganas de trabajar de esta forma. Desde el comienzo de un proyecto, donde tienes que tener muy en claro que TODOS los participantes del proyecto, pues eso mismo > van a participar; todo el mundo tiene que tener las ideas, claras, etc. Habla un poco de refactoring, de integración continua, etc.; vamos que es un de todo un poco muy pero muy interesante.

Finalmente, este libro no se trata de código, sino más bien de la correcta selección de las prácticas de AGILE para trabajar en proyectos de desarrollo de software. Puede ser tan útil para una persona que desarrolle en single developer mode, como para un equipo de desarrollo que quiera comenzar con AGILE o mejorar las prácticas que vienen aplicando.

Lo puedes encontrar aquí >> http://pragprog.com/book/jtrap/the-agile-samurai

Saludos @ Here

El Bruno

   

Publicado 11/12/2011 15:32 por El Bruno | con no comments
Archivado en: ,

Buenas,

el clásico rapidito de los viernes para que te pongas las pilas con el desarrollo de Windows 8 y puedas ganar una Tablet como la que les han regalado a los asistentes al BUILD. Para esto “sólo” tienes que crear una aplicación para Windows 8 y seguir los pasos que se comentan en https://buildwindowscontest.com/. Si eres uno de los afortunados puedes ganar una Tablet mucho mejor que esta de la foto

image

 

Pero a ver, que la cosa no estará facil, por un lado solo queda cerca de un mes para crear la aplicación y por otro, tendrás la oportunidad de que el siguiente trio de cracks pueda ver tu app:

  • Jensen Harris, Director of Program Management, Windows User Experience
  • Antoine Leblond, Senior Vice President, Windows Web Services
  • Jason Zander, Corporate Vice President, Visual Studio

Finalmente, los premios que son los que nos importan

  • A Samsung Windows Developer Preview PC from the BUILD conference, so you can test your apps with touch and sensors
  • One year of Windows Azure, so you can build apps that feel connected and alive
  • A two-year subscription to the Store, so you can continue to update and improve your app

 

Saludos @ Home

El Bruno

   

Fuente: https://buildwindowscontest.com/

Publicado 9/12/2011 19:51 por El Bruno | con no comments
Archivado en:

image47dd1de4

Buenas,

hace unos días, Jorge escribió un artículo destripando el funcionamiento de un Singleton con .Net. Luego llegó José y también aportó un poco de luz al respecto; y yo me dije a mi mismo,

¿Pero estos de que hablan? programar un Singleton a mano, están locos o qué?

Vamos que desde el Edu definió a UNITY como “ese que hace los news” pues creo que no he creado un objeto con “new” desde hace bastante tiempo. Para los que no conocen UNITY, pues en pocas palabras es un inyector de dependencias creado por el equipo de Patterns & Practices de Microsoft que ya va por su versión 2.0 y que, como a la cerveza negra, te termina gustando cuando le agarras el gustito.

Veamos un ejemplo muy pero muy simple en el que utilizaremos una clase llamada “ClaseChorra” para validar las instancias que se creen de la misma.

El modelo de Singleton está basado en el ejemplo simple que explica Jorge en su post.

   1: class ClaseChorra
   2: {
   3:     private static ClaseChorra claseChorra;
   4:     public System.Guid Id { get; set; }
   5:     public ClaseChorra()
   6:     {
   7:         Id = System.Guid.NewGuid();
   8:     }
   9:     public override string ToString()
  10:     {
  11:         return Id.ToString();
  12:     }
  13:     public static ClaseChorra GetSingletonInstance()
  14:     {
  15:         return claseChorra ?? (claseChorra = new ClaseChorra());
  16:     }
  17: }

 

Antes de seguir >> DisclaimerHoy en España es Luernes (lunes + viernes) con lo que tampoco me estoy esforzando mucho con los ejemplos, es lo que suele suceder después de una semana ardua de trabajo.

No hace no falta que explique que si creo objetos a cholón, como explica Jorge en su post, pues tendré errores de lo más variado.
Por ejemplo el siguiente código me deja una única instancia con el mismo ID para cada ejecución de la misma:
 
   1: class Program
   2: {
   3:     static void Main(string[] args)
   4:     {
   5:         var c1 = ClaseChorra.GetSingletonInstance();
   6:         var c2 = ClaseChorra.GetSingletonInstance();
   7:         c2.Id = Guid.NewGuid();
   8:         Console.WriteLine("c1: {0}", c1);
   9:         Console.WriteLine("c2: {0}", c2);
  10:         Console.ReadLine();
  11:     }
  12: }

El resultado es:

   1: c1: 34baaf27-87de-42f7-b2ad-046e35ee65fa
   2: c2: 34baaf27-87de-42f7-b2ad-046e35ee65fa

 

Pues bien, hasta aquí el ejemplo de Jorge. Pero ¿cómo lo haríamos con UNITY?. Lo ideal es leer el artículo de MSDN “Using Lifetime Managers” donde se explican diferentes opciones para trabajar con el registro de tipos y de objetos en Unity. Yo dejaré un par de ejemplos.

Por ejemplo, en la siguiente porción de código, estoy definiendo un UnityContainer para que el mismo se encargue de crear por mí los objetos que yo necesito (recuerden las palabras del Edu > “UNITY es el que hace los news"). Utilizando el container creo las instancias c1 y c2 y luego muestro los valores de la misma.

   1: static void Main(string[] args)
   2: {
   3:     var myContainer = new UnityContainer();
   4:     myContainer.RegisterType<ClaseChorra>();
   5:     var c1 = myContainer.Resolve<ClaseChorra>();
   6:     var c2 = myContainer.Resolve<ClaseChorra>();
   7:     c2.Id = Guid.NewGuid();
   8:     Console.WriteLine("c1: {0}", c1);
   9:     Console.WriteLine("c2: {0}", c2);
  10:     Console.ReadLine();
  11: }

 

El resultado son 2 instancias diferentes de la misma clase:

   1: c1: dea932a8-7ce6-4f44-aa6c-89cb04bed186
   2: c2: 011f211a-9a83-463d-81ea-566ef0dbbdab

 

Ahora bien, si yo quisiese que siempre que se cree un objeto del tipo ClaseChorra, el mismo sea la misma instancia para todos, pues simplemente le digo a UnityContainer que tipo de LifeTimeManager debe utilizar. Existen varias opciones, pero para el siguiente ejemplo utilizaremos un PerThread, que nos ayuda a tener una única instancia del objeto por thread.

   1: static void Main(string[] args)
   2: {
   3:     var myContainer = new UnityContainer();
   4:     myContainer.RegisterType<ClaseChorra>(new PerThreadLifetimeManager());
   5:     var c1 = myContainer.Resolve<ClaseChorra>();
   6:     var c2 = myContainer.Resolve<ClaseChorra>();
   7:     c2.Id = Guid.NewGuid();
   8:     Console.WriteLine("c1: {0}", c1);
   9:     Console.WriteLine("c2: {0}", c2);
  10:     Console.ReadLine();
  11: }

 

Como bien estarás suponiendo, ahora las clases c1 y c2 son la misma:

   1: c1: 84b8087b-48f5-4519-9362-b5239603ac0a
   2: c2: 84b8087b-48f5-4519-9362-b5239603ac0a

 

Así que ya sabes, o te pones a codificar todo el patrón Singleton super-sure en tu código y dejas que “UNITY haga los news por tí” Risa

 

Saludos @ Home

El Bruno

   

Fuentes:

image47dd1de4

Buenas,

si cuando estas trabajando con Team Foundation Server 2010 las opciones que te ofrecen para validar un archivos son

  • CheckOut File And AutoMerge
  • Override Local File or Folder

pues te quedas un poco piedra. En el primer caso, se desprotegerá el archivo local y se ejecutará el peor invento que se distribuyó con Visual Studio > AUTOMERGE !!!

En el segundo caso, pues pierdes los cambios locales y directamente te traes la versión del server.

La pregunta es

¿cómo he llegado a este estado?

Pues supongo que hay varias opciones, pero la más común es que hayas eliminado el atributo ReadOnly del archivo local y luego has complicado al pobre Workspace que define el estado de tus archivos locales para Team Foundation Server.

image

En la imagen anterior puedes ver, el detalle del porqué de esta acción y que quede bastante claro > esto es uno de los peores defectos de Team Foundation Server. La forma de trabajo utilizando la propiedad ReadOnly de los archivos es algo que Microsoft viene realizando desde Visual Source Safe y no será hasta Team Foundation 11 que se cambiará este modelo de trabajo.

Así que ya sabes, si trabajas con TFS, pues no trabajes desde el File System como si nada Risa

 

Saludos @ Home

El Bruno

   

Buenas,

con el amigo Javi estuvimos buscando una opción para abrir un correo específico en el cliente de Microsoft Outlook sin tener que recurrir a Interop. Si alguno quiere datos de porqué no utilizar Interop le invito unas cañas y lo hablamos porque tiene más problemas que una peli de Viernes 13. Pero bueno a lo que íbamos, cuando lanzas el ejecutable de Outlook, puedes pasarle una serie de comandos para que el mismo se abra en un folder específico, se reinicie, etc.

Una de estas opciones permite seleccionar un folder [outlook.exe /select folder:{folderName}] pero si bien es posible también abrir un correo, no hay ningún ejemplo que se encuentre rápido sobre esto. Así que basados en los ejemplo de LISP de este link, modificamos la macro de Outlook para que nos muestre el EntryID del correo seleccionado.

   1: 'Adds a link to the currently selected message to the clipboard
   2: Sub AddLinkToMessageInClipboard()
   3:  
   4:    Dim objMail As Outlook.MailItem
   5:    Dim mailId As String
   6:  
   7:    'One and ONLY one message muse be selected
   8:    If Application.ActiveExplorer.Selection.Count <> 1 Then
   9:        MsgBox ("Select one and ONLY one message.")
  10:        Exit Sub
  11:    End If
  12:  
  13:    Set objMail = Application.ActiveExplorer.Selection.Item(1)
  14:    mailId = "outlook:" + objMail.EntryID
  15:    MsgBox mailId
  16:  
  17: End Sub

Y luego lanzamos desde la línea de comandos el mismo con la sentencia:

   1: outlook.exe /select outlook:{ENTRYID}

Donde {ENTRYID} es el identificador del elemento dentro del cliente Outlook.

Esto tiene mucha más historia detrás, ya que si trabajas con Exchange, pues hay varios IDs a tener en cuenta, pero eso es tema para otro post.

 

 

Saludos @ Home

El Bruno

   

Fuente: http://superuser.com/questions/71786/can-i-create-a-link-to-a-specific-email-message-in-outlook

Publicado 2/12/2011 18:08 por El Bruno | con no comments
Archivado en: ,

image

Buenas,

hoy dejo un tip de los simples pero útiles para todos aquellos que tienen que depurar 2 procesos al mismo tiempo con Visual Studio. Muchas veces he visto que los developers lanzamos un proyecto en modo DEBUG desde el IDE y luego con adjuntamos al otro proceso para tener control sobre el mismo.

Si ambos procesos pertenecen a una misma solución, es posible configurar la misma para que cuando se inicie una compilación y ejecución (el F5 de toda la vida) se lancen varios proyectos. Para esto, desplegamos las propiedades de la solución, seleccionamos la opción [Multiple startup projects] y … listo Risa

image

Saludos @ Here

El Bruno