[#VISUALSTUDIO2010] HowTo: Dar formato a los XAMLs con un atributo por línea

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

   

[#KINECT] Merry Christmas with Kinect and Visual Studio 2010 (regalo del Valentino)

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:

[#WINDOWS8] HowTo: Evitar el mensaje para habilitar .NET Framework 3.5 cuando se ejecuta una prueba unitaria en Visual Studio 2010

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:WindowsSystem32Fondue.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:Windowssystem32>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

   

[#JETBRAINS] Primeros días con #WebStorm

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

   

[#POWERSHELL] Habilitando permisos de ejecución para scripts de PowerShell

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

[#WINDOWS8] Image Login, me ha fascinado y el Valentino happy happy

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

   

[#TFS2010] TFS Power Tools December 2011

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 😀

 

 

Saludos @ Home

El Bruno

   

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

[#WINDOWSPHONE] HowTo: Crear Pngs transparentes para publicar aplicaciones en el AppHub

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

   

[#VS11] HowTo: Empaquetar y desplegar una aplicación en Windows 8 (II)

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

   

[#VS11] HowTo: Empaquetar y desplegar una aplicación en Windows 8

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.GridApplication01ElBruno.GridApplication01

   3: binDebugelbruno.gridapplication01.exe

   4:  

   5: [Content]

   6: ...ElBruno.GridApplication01ElBruno.GridApplication01

   7: binDebugelbruno.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