You are here

Feed aggregator

100 Articles to Sharpen Your Mind

MSDN Blogs - Sun, 07/20/2014 - 22:45

Actually, it's more than 100 articles for your mind.  I've tagged my articles with "mind" on Sources of Insight that focus on increasing your "intellectual horsepower":

Articles on Mind Power and the Power of Thoughts

Here are a few of the top mind articles that you can quickly get results with:

Note that if reading faster is important to you, then I recommend also reading How To Read 10,000 Words a Minute (it’s my ultimate edge) and The Truth About Speed Reading.

If there’s one little trick I use with reading (whether it’s a book, an email, or whatever), I ask myself “what’s the insight?” or “what’s the action?” or “how can I use this?"  You’d be surprised but just asking yourself those little focusing questions can help you parse down cluttered content fast and find the needles in the haystack.

Customising the Company Login window series Part 2 - Visual Basic for Applications

MSDN Blogs - Sun, 07/20/2014 - 20:00

Following on from my previous post: Customising the Company Login window series Part 1 - Introduction, here is the method to create a solution using Visual Basic for Applications (VBA).

As discussed in the earlier post, the problem we are trying to overcome is that the company drop down list on the Company Login window is not wide enough to show a long company name. This can make it difficult to select the correct company when the company names are long and differ only by some characters at the end of the name.

Below is a screenshot of the original window from Microsoft Dynamics GP 2013. 

 

Following are the step by step instructions on how to use Visual Basic for Applications (VBA) code to "modify" the window:

  1. Load Microsoft Dynamics GP and get the Company Login window showing (either on first login or by switching companies after login). 
     
  2. Now that the window is open we need to add it to Visual Basic, but as the window is modal we cannot use the menus. So press the keyboard shortcut Ctrl-F11 to add the window.
     
  3. Then we need add the fields to Visual Basic. Press the keyboard shortcut Shift-F11 to enter selection mode (note the cursor changes). Now click on each of the fields on the right hand side (including the checkbox). Once all fields have been added, press Shift-F11 to exit selection mode.
     
  4. Now that the resources have been added to Visual Basic, we can start writing the code needed. Press Alt-F11 to open the Visual Basic Editor.
     
  5. Best practice is to require variable declaration, so select Tools >> Options and make sure the Require Variable Declaration option is checked and click OK.
     
  6. On the top left of the Visual Basic Editor is the Project Explorer window which will have a list of application dictionaries installed in Microsoft Dynamics GP (if the window is not showing press Ctrl-R). Locate the Microsoft_Dynamics_GP project and expand the tree to show the Microsoft Dynamics GP Objects and double click on the CompanyLogin (Window) to open the script editor.
     
  7. From the resources drop down list (directly above the script editor on the left hand side), select Window. From the event drop down list (on the right hand side), select BeforeOpen (if not already selected). This will generate the declaration for the Window_BeforeOpen() event.
     
  8. Now we can add the code to move the left hand edge of the fields to the left and increase the field widths to fill the space created (except for the numeric fields). Using a variable makes it easier to tweak the changes to meet your requirements. The maximum adjustment that fits nicely in the window is 230 pixels. The code for this customisation is shown below.
     
  9. Finally, select from the Visual Basic Editor's menus select Debug >> Compile Microsoft Dynamics GP and File >> Save Microsoft_Dynamics_GP.
     
  10. Now you can re-open the Company Login window to see your changes. If you want to tweak the adjustment, change the value, recompile, save and test again. Close the Editor when you are finished.

 

Here is a screen shot of the window with the full 230 pixel adjustment: 

 

Below is the code used:  

Company Login Code

Option Explicit

Private Sub Window_BeforeOpen(OpenVisible As Boolean)
    Dim Adjust As Integer
    Adjust = 230
   
    Company.Left = Company.Left - Adjust
    Company.Width = Company.Width + Adjust
    Rememberthiscompany.Left = Rememberthiscompany.Left - Adjust
    Rememberthiscompany.Width = Rememberthiscompany.Width + Adjust
    Server.Left = Server.Left - Adjust
    Server.Width = Server.Width + Adjust
    UserID.Left = UserID.Left - Adjust
    UserID.Width = UserID.Width + Adjust
    CurrentUsers.Left = CurrentUsers.Left - Adjust
    'CurrentUsers.Width = CurrentUsers.Width + Adjust
    UsersAllowed.Left = UsersAllowed.Left - Adjust
    'UsersAllowed.Width = UsersAllowed.Width + Adjust
End Sub

 

 

The VBA package for this customisation is attached to the bottom of this article. You can use Tools >> Customize >> Customization Maintenance to load the package.

 

Thanks to Patrick Roth and Aaron Berquist for their feedback on this customisation.

Hope you find this useful and educational. 

David

ScrollBar en Silverlight con Estilo de Blend

MSDN Blogs - Sun, 07/20/2014 - 19:00

nota: Este artículo es una versión re-editada de un artículo existente que escribí en mi blog anterior, traducido al español, revisado y adaptado a los cambios más recientes de tecnología.

descargar el código ejemplo.

El objetivo de este tutorial es mostrar cómo cambiar el estilo predeterminado de un control ScrollBar o Barra de Desplazamiento en Silverlight, con la apariencia y comportamiento similar al que presenta la interfaz de la aplicación Expression Blend.

Este artículo como muchos de estilo tutorial es extenso, y quizá no sea para que todos lo lean completamente; pero, aquellos que estén realmente interesados en aprender es bueno que lo sigan hasta el final.

Aplicar estilos en controles Silverlight es una tarea fácil. Hay algunos conceptos iniciales por comprender, pero una vez esto se logra, es más una actividad mecánica. Para la creación de una aplicación Silverlight se puede utilizar Visual Studio o Expression Blend. Aunque en las últimas versiones de Visual Studio se han incorporado muchas de las características de Blend en su área de diseño.

Expression Blend inicio como parte de Expression Studio, una colección de aplicaciones orientadas para diseñadores gráficos. En la actualidad, Blend es una aplicación complementaria de Visual Studio, para el diseño de escenarios complejos que involucran cambios visuales en controles como estilos y animaciones. Sin importar que Blend esté orientada a diseñadores gráficos en la integración de su trabajo dentro de las aplicaciones basadas en XAML, como lo son, Windows Presentation Foundation [WPF], Silverlight [SL] y Windows Phone [WP]; es un editor bastante sofisticado con el que es divertido experimentar. Personalmente yo recomiendo que desarrolladores de XAML se sienta cómodos utilizándola. Incluso, luego de un tiempo se comenzará a depender de muchos de los trucos rápidos que se pueden logran con esta aplicación.

Comencemos revisando con detalle el objetivo de este tutorial. La siguiente gráfica, presenta la interfaz de usuario de Blend para Visual Studio 2013. La interfaz de Blend, se ha mantenido muy constante desde sus inicios, y en este caso el estilo del ScrollBar no ha cambiado, por lo menos no desde el artículo original que se basó en la versión 4. Para esta revisión, la implementación será actualizada a Silverlight 5.

El primer paso es identificar los elementos que componen el control de ScrollBar. Se puede utilizar una herramienta de edición gráfica y capturar la pantalla de la aplicación similar a la imagen y comenzar a analizar aspectos como, colores utilizados, dimensiones de las diferentes partes y formas y los estados visuales del control.


Disección del Control

La interfaz de usuario de un control ScrollBar está compuesta de las siguientes partes:

  • 1 área contenedora.
  • 2 botones de desplazamiento corto.
  • 2 botones de desplazamiento largo.
  • 1 pieza móvil.

Algunas de estas piezas son fáciles de identificar como se puede ver en la siguiente gráfica.

Área Contenedora

Formada por un rectángulo con un ancho fijo de 17 pixeles en el caso de un ScrollBar vertical o un alto fijo de 17 pixeles para el caso de uno horizontal. La dimensión restante dependerá del tamaño del contenido o ésta puede ser definida por el desarrollador.

Botones de Desplazamiento Corto

Estos botones tienen el objetivo de permitir movimientos cortos o de un solo paso en el contenido afectado por el ScrollBar, usualmente están ubicados en los extremos de la barra.

Cada botón está formado por un rectángulo de 17 pixeles de ancho por 17 pixeles de alto, y una punta de flecha o triangulo isósceles con una base de 7 pixeles y una altura de 7 pixeles. Para cada uno de los diferentes botones el triángulo rota para indicar la dirección de desplazamiento de la vista sobre el contenido.

Botones de Desplazamiento Amplio

Estos botones no poseen un estilo visual, su objetivo es permitir que el usuario desplace el contenido a pasos amplios; sus dimensiones están regidas por el área contenedora que no es ocupada por las demás piezas.

Pieza de Movimiento Rápido

Es la pieza movible que le permite al usuario navegar rápidamente sobre el contenido para llegar a una ubicación deseada. Consiste en un rectángulo de 17 pixeles de ancho (para el caso de una barra vertical) y un rectángulo interior de 7 pixeles de ancho con un valor de 4.5 para el radio en los ejes X y Y. La altura (o la dimensión opuesta) está definida por el espacio requerido por el control de acuerdo al contenido.

Colores y Estados Visuales

Un control de Interfaz de Usuario recibe diferentes interacciones con el usuario. Para cada una de estas define un estado, por ejemplo, un Botón puede responder a algunas interacciones (comportamientos, eventos o estados) como:

  • Normal: cuando no hay interacción con el botón.
  • MouseOver: cuando el puntero del mouse se encuentra sobre el área visual del botón.
  • Pressed: cuando se hace clic sobre el botón.

Cuando se está creando el estilo de un control, se define una apariencia visual para cada uno de los estados que el control soporta. Esta definición permite presentar cambios visuales que diferencien y alerten al usuario de cuando el control está en modo Normal, MouseOver o Pressed. Estos cambios de apariencia pueden ser tan simples como un color, modificaciones de forma, o complejos como adición de animaciones y transiciones.

Para un control ScrollBar, cada pieza define su propio conjunto de estados, observemos que cambios ocurren cuando se interactúa con cada una de ellas.

Área Contenedora

El área contenedora no posee cambios visuales durante los diferentes estados, simplemente consiste en un rectángulo (Rectangle) sin borde y un color de relleno equivalente a #3D3D3D.

Botones de Desplazamiento Corto

Están formados por 2 controles; un rectángulo (Rectangle) que actúa como fondo, con un color y borde igual al del área contenedora; y un control Path en forma triangular sin borde y un color de relleno que cambia basado en el estado así: Normal #808080, MouseOver #CCCCCC y Pressed #E5E5E5.

Botones de Desplazamiento Amplio

Estos botones actúan como relleno para el área contenedora que no es utilizada por otras piezas, por tal razón no presentan ningún elemento visual ni cambios en los diferentes estados.

Pieza de Movimiento Rápido

Ésta cambia el color de relleno basado en los estados de la misma forma que el triángulo en los botones de desplazamiento corto. Normal #808080, MouseOver #CCCCCC y Pressed #E5E5E5.

Implementación

Habiendo identificado los diferentes cambios, comencemos a implementarlos en un proyecto. Como se mencionó anteriormente, ésta se llevará a cabo utilizando Blend para Visual Studio 2013.

Creación del Proyecto
  1. Dar inicio a Blend para Visual Studio 2013.
  2. Hacer clic en Nuevo proyecto... en la ventana de inicio; en caso que ésta no aparezca se puede seleccionar la opción a través del menú de Archivo.
  3. En la ventana de Nuevo proyecto seleccione Silverlight como el tipo de proyecto.
  4. Seleccione la plantilla Aplicación Silverlight.
  5. Asigne como nombre ScrollBarBlend y haga clic en Aceptar.
Ubicando los Controles

Una vez creado el proyecto, se presentará el área de Vista de Diseño vacía. Ubique 2 instancias del control ScrollBar (una será vertical y la otra horizontal) en ésta área.

  1. En la parte superior izquierda de Blend, localice la pestaña de Activos y selecciónela.
  2. De la lista de activos, seleccione Controles.
  3. En el campo Buscar activos, comience a escribir “scroll” y de los resultados arrastre 2 controles ScrollBar y ubíquelos en el área de Vista de Diseño.
  4. Seleccione un ScrollBar y asigne los siguientes valores a las propiedades de Diseño:
    HorizontalAlignment: Right
    VerticalAlignment: Stretch
    Margin: 0 8 8 25
    Orientation: Vertical

1 <ScrollBar Margin="0,8,8,25" HorizontalAlignment="Right"/>
  1. Seleccione el otro ScrollBar y asigne estos valores en las propiedades de Diseño:
    HorizontalAlignment: Stretch
    VerticalAlignment: Bottom
    Margin: 8 25 0 8
    Orientation: Horizontal

1 <ScrollBar Margin="8,0,25,8" VerticalAlignment="Bottom" Orientation="Horizontal"/> Preparación de la Plantilla de Estilo

Cree una copia de la plantilla de una de las instancias y enlace esta platilla a la otra instancia.

  1. De clic-derecho en cualquiera de las instancias del control ScrollBar y seleccione del menú contextual Editar platilla » Editar una copia....
  2. La ventana Crear recurso Style aparecerá.
  3. Escriba EstiloScrollBarBlend en el campo Nombre (clave), y deje el valor del campo Definir en asignado a Este documento UserControl: <sin nombre>.
  4. Haga clic en Aceptar, y el código XAML para el nuevo estilo será creado.
En este momento, el área de Vista de Diseño cambiará a modo de edición de plantilla, es necesario salir de este modo para asignar el estilo que se creó a la otra instancia del ScrollBar.
  1. Ubique la pestaña de Objetos y línea de tiempo.
  2. El primer elemento dentro de ésta dice EstiloScrollBarBlend (ScrollBar Template) con una flecha apuntando hacia arriba.
  3. Haga clic en la flecha para salir del modo de edición de plantilla.
  4. De clic-derecho en la otra instancia del control ScrollBar y del menú contextual seleccione Editar plantilla » Aplicar recurso » EstiloScrollBarBlend.

También se puede lograr el mismo resultado haciendo clic en el control de ruta de navegación [ScrollBar] en la parte superior del área de Vista de Diseño.

El siguiente fragmento de código presenta el bloque XAML que define el control Grid con el nombre de LayoutRoot que contiene las 2 instancias del control ScrollBar.


1 2 3 4 5 6 7 8 9 <Grid x:Name="LayoutRoot" Background="White">   <ScrollBar Margin="8,0,25,8"              VerticalAlignment="Bottom"              Orientation="Horizontal"              Style="{StaticResource EstiloScrollBarBlend}"/>   <ScrollBar Margin="0,8,8,25"              HorizontalAlignment="Right"              Style="{StaticResource EstiloScrollBarBlend}"/> </Grid>

Luego de revisar el estilo predefinido para un control ScrollBar que Blend creo, las partes que no serán necesarias para este ejercicio fueron eliminadas para hacer el código más fácil de entender y modificar. Este es el código resultante para el estilo.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 <UserControl.Resources>   <Style x:Key="EstiloScrollBarBlend" TargetType="ScrollBar">     <Setter Property="MinWidth" Value="17"/>     <Setter Property="MinHeight" Value="17"/>     <Setter Property="IsTabStop" Value="False"/>     <Setter Property="Template">       <Setter.Value>         <ControlTemplate TargetType="ScrollBar">           <Grid x:Name="Root">             <Grid.Resources>               <ControlTemplate x:Key="RepeatButtonTemplate"                                TargetType="RepeatButton">                 <Grid x:Name="Root" Background="Transparent">                   <VisualStateManager.VisualStateGroups>                     <VisualStateGroup x:Name="CommonStates">                       <VisualState x:Name="Normal"/>                     </VisualStateGroup>                   </VisualStateManager.VisualStateGroups>                 </Grid>               </ControlTemplate>               <ControlTemplate x:Key="HorizontalIncrementTemplate"                                TargetType="RepeatButton">                 <Grid x:Name="Root">                   <VisualStateManager.VisualStateGroups>                     <VisualStateGroup x:Name="CommonStates">                       <VisualState x:Name="Normal"/>                       <VisualState x:Name="MouseOver"/>                       <VisualState x:Name="Pressed"/>                       <VisualState x:Name="Disabled"/>                     </VisualStateGroup>                   </VisualStateManager.VisualStateGroups>                 </Grid>               </ControlTemplate>               <ControlTemplate x:Key="HorizontalDecrementTemplate"                                TargetType="RepeatButton">                 <Grid x:Name="Root">                   <VisualStateManager.VisualStateGroups>                     <VisualStateGroup x:Name="CommonStates">                       <VisualState x:Name="Normal"/>                       <VisualState x:Name="MouseOver"/>                       <VisualState x:Name="Pressed"/>                       <VisualState x:Name="Disabled"/>                     </VisualStateGroup>                   </VisualStateManager.VisualStateGroups>                 </Grid>               </ControlTemplate>               <ControlTemplate x:Key="VerticalIncrementTemplate"                                TargetType="RepeatButton">                 <Grid x:Name="Root">                   <VisualStateManager.VisualStateGroups>                     <VisualStateGroup x:Name="CommonStates">                       <VisualState x:Name="Normal"/>                       <VisualState x:Name="MouseOver"/>                       <VisualState x:Name="Pressed"/>                       <VisualState x:Name="Disabled"/>                     </VisualStateGroup>                   </VisualStateManager.VisualStateGroups>                 </Grid>               </ControlTemplate>               <ControlTemplate x:Key="VerticalDecrementTemplate"                                TargetType="RepeatButton">                 <Grid x:Name="Root">                   <VisualStateManager.VisualStateGroups>                     <VisualStateGroup x:Name="CommonStates">                       <VisualState x:Name="Normal"/>                       <VisualState x:Name="MouseOver"/>                       <VisualState x:Name="Pressed"/>                       <VisualState x:Name="Disabled"/>                     </VisualStateGroup>                   </VisualStateManager.VisualStateGroups>                 </Grid>               </ControlTemplate>               <ControlTemplate x:Key="VerticalThumbTemplate" TargetType="Thumb">                 <Grid>                   <VisualStateManager.VisualStateGroups>                     <VisualStateGroup x:Name="CommonStates">                       <VisualState x:Name="Normal"/>                       <VisualState x:Name="MouseOver"/>                       <VisualState x:Name="Pressed"/>                       <VisualState x:Name="Disabled"/>                     </VisualStateGroup>                   </VisualStateManager.VisualStateGroups>                 </Grid>               </ControlTemplate>               <ControlTemplate x:Key="HorizontalThumbTemplate" TargetType="Thumb">                 <Grid>                   <VisualStateManager.VisualStateGroups>                     <VisualStateGroup x:Name="CommonStates">                       <VisualState x:Name="Normal"/>                       <VisualState x:Name="MouseOver"/>                       <VisualState x:Name="Pressed"/>                       <VisualState x:Name="Disabled"/>                     </VisualStateGroup>                   </VisualStateManager.VisualStateGroups>                 </Grid>               </ControlTemplate>             </Grid.Resources>             <VisualStateManager.VisualStateGroups>               <VisualStateGroup x:Name="CommonStates">                 <VisualState x:Name="Normal"/>                 <VisualState x:Name="MouseOver"/>                 <VisualState x:Name="Disabled"/>               </VisualStateGroup>             </VisualStateManager.VisualStateGroups>             <Grid x:Name="HorizontalRoot">               <Grid.ColumnDefinitions>                 <ColumnDefinition Width="Auto"/>                 <ColumnDefinition Width="Auto"/>                 <ColumnDefinition Width="Auto"/>                 <ColumnDefinition Width="*"/>                 <ColumnDefinition Width="Auto"/>               </Grid.ColumnDefinitions>               <RepeatButton x:Name="HorizontalSmallDecrease"                             Grid.Column="0"                             IsTabStop="False"                             Interval="50"                             Margin="1"                             Template="{StaticResource HorizontalDecrementTemplate}"                             Width="16"/>               <RepeatButton x:Name="HorizontalLargeDecrease"                             Grid.Column="1"                             IsTabStop="False"                             Interval="50"                             Template="{StaticResource RepeatButtonTemplate}"                             Width="0"/>               <Thumb x:Name="HorizontalThumb"                      Background="{TemplateBinding Background}"                      Grid.Column="2"                      MinWidth="18"                      Template="{StaticResource HorizontalThumbTemplate}"                      Width="18"/>               <RepeatButton x:Name="HorizontalLargeIncrease"                             Grid.Column="3"                             IsTabStop="False"                             Interval="50"                             Template="{StaticResource RepeatButtonTemplate}"/>               <RepeatButton x:Name="HorizontalSmallIncrease"                             Grid.Column="4"                             IsTabStop="False"                             Interval="50"                             Margin="1"                             Template="{StaticResource HorizontalIncrementTemplate}"                             Width="16"/>             </Grid>             <Grid x:Name="VerticalRoot" Visibility="Collapsed">               <Grid.RowDefinitions>                 <RowDefinition Height="Auto"/>                 <RowDefinition Height="Auto"/>                 <RowDefinition Height="Auto"/>                 <RowDefinition Height="*"/>                 <RowDefinition Height="Auto"/>               </Grid.RowDefinitions>               <RepeatButton x:Name="VerticalSmallDecrease"                             Height="16"                             IsTabStop="False"                             Interval="50"                             Margin="1"                             Grid.Row="0"                             Template="{StaticResource VerticalDecrementTemplate}"/>               <RepeatButton x:Name="VerticalLargeDecrease"                             Height="0"                             IsTabStop="False"                             Interval="50"                             Grid.Row="1"                             Template="{StaticResource RepeatButtonTemplate}"/>               <Thumb x:Name="VerticalThumb"                      Height="18"                      MinHeight="18"                      Grid.Row="2"                      Template="{StaticResource VerticalThumbTemplate}"/>               <RepeatButton x:Name="VerticalLargeIncrease"                             IsTabStop="False"                             Interval="50"                             Grid.Row="3"                             Template="{StaticResource RepeatButtonTemplate}"/>               <RepeatButton x:Name="VerticalSmallIncrease"                             Height="16"                             IsTabStop="False"                             Interval="50"                             Margin="1"                             Grid.Row="4"                             Template="{StaticResource VerticalIncrementTemplate}"/>             </Grid>           </Grid>         </ControlTemplate>       </Setter.Value>     </Setter>   </Style> </UserControl.Resources>

Principalmente, las modificaciones que se hicieron al estilo pre-definido, limpiaron los estados visuales del control, removiendo las acciones que cada estado realizaba, al igual que se eliminaron los elementos que le daban la apariencia y personalidad al control. ¿Por qué es esto conveniente? Si da un vistazo al código original, se dará cuenta que está formado por múltiples elementos y transiciones de color para darle una sensación de profundidad o volumen a cada pieza, y el objetivo estético que se busca es completamente opuesto. Blend presenta una interfaz gráfica plana, así que es más fácil comenzar con un esqueleto en lugar de ir modificando cada uno de los elementos.

Definición de Colores

Como parte de la creación del estilo se definirán algunos elementos de Color para hacer el código más legible y ordenado. Una definición de color permite la reutilización de su valor a través de un identificador fácil de recordar.

En la parte inicial del código XAML, luego de la etiqueta inicial UserControl.Resources, adicione el siguiente código.

1 2 3 4 <Color x:Key="BackgroundColor">#FF3D3D3D</Color> <Color x:Key="StandardColor">#FF808080</Color> <Color x:Key="HoverColor">#FFCCCCCC</Color> <Color x:Key="PressedColor">#FFE5E5E5</Color> Redefinición de los Elementos de la Plantilla

El primer paso es definir la apariencia inicial del control, es decir, crear las formas y colores para el estado Normal. Técnicamente este no es un estado, sino la apariencia predeterminada del control. Usualmente en el estado Normal, no hay cambios sobre lo que se define de modo inicial. En este momento ninguno de los controles ScrollBar presenta elementos visuales, sin embargo están allí contenidos en el área del control UserControl.

  1. Haga clic-derecho sobre la instancia vertical del ScrollBar en la Vista de Diseño. Ubique el puntero del mouse hacia el borde derecho de ésta área y una vez el halo del control aparezca haga clic-derecho sobre él.
  2. Del menú contextual, seleccione la opción Editar platilla » Editar actual.
  3. La pestaña de Objetos y línea de tiempo presenta ahora los componentes de la plantilla.
  4. Expanda el nodo VerticalRoot, para mostrar los componentes de ésta versión del ScrollBar.
Asegúrese de tener la vista de código XAML activada. En caso que no lo esté, del menú Ver seleccione la opción Vista de documento activo » Vista en dos paneles. Esta acción se puede lograr igualmente haciendo clic en el botón de Dos paneles en la esquina superior derecha del área de documento.
¿Por qué escribir código XAML? Primero, es más fácil de explicar y presentar en lugar de describir todos los movimientos del mouse. Y segundo, permite mucho mayor control sobre lo que se hace.
  1. Seleccione el objeto VerticalRoot y observe como este es igual seleccionado en la vista de código XAML. Éste objeto es un control Grid.
  2. Agregue un control Rectangle luego de la etiqueta de cierre de RowDefinitions, para que actué como fondo del control.
  3. En la vista de código, asigne el valor de 5 a la propiedad RowSpan y asigne a la propiedad Fill al valor del color BackgroundColor de la lista de recursos de colores creados anteriormente, como se puede observar en el siguiente fragmento de código.
1 2 3 4 5 <Rectangle Grid.RowSpan="5">   <Rectangle.Fill>     <SolidColorBrush Color="{StaticResource BackgroundColor}" />   </Rectangle.Fill> </Rectangle>
  1. Lo mismo aplica para el objeto HorizontalRoot, pero en este caso el valor de 5 se asigna a la propiedad ColumnSpan y el mismo valor de color para la propiedad Fill.

Los cambios se verán reflejados de forma inmediatamente en el área de Vista de Diseño.

1 2 3 4 5 <Rectangle Grid.ColumnSpan="5">   <Rectangle.Fill>     <SolidColorBrush Color="{StaticResource BackgroundColor}" />   </Rectangle.Fill> </Rectangle>
  1. Del nodo VerticalRoot, seleccione el objeto VerticalSmallDecrease, una instancia del control RepeatButton.
Un control RepeatButton es un tipo de control Button que tiene un comportamiento especial para el evento Click, éste evento se activa repetidamente mientras el usuario se mantenga presionando el botón. El evento se activará basado en el valor de la propiedad Interval del control.
  1. Haga clic-derecho en el objeto y del menú contextual seleccione Editar platilla » Editar actual.

Para observar mejor los cambios, haga un acercamiento de la vista hacia la esquina superior derecha del área de Vista de Diseño.

  1. Dentro del control Grid con el nombre Root, luego de la etiqueta de cierre VisualStateManager.VisualStateGroups agregue un control Rectangle que actuará como fondo, y un control Path que será flecha para el botón, así como se ve en el fragmento de código.
1 2 3 4 5 6 7 8 9 10 11 12 <Rectangle>   <Rectangle.Fill>     <SolidColorBrush Color="{StaticResource BackgroundColor}"/>   </Rectangle.Fill> </Rectangle> <Path x:Name="Arrow" Data="M0,7 L7,7 L3.5,0 z"       HorizontalAlignment="Center"       VerticalAlignment="Center">   <Path.Fill>     <SolidColorBrush Color="{StaticResource StandardColor}"/>   </Path.Fill> </Path>
  1. Regrese a la plantilla del objeto anterior así como se indicó en la Gráfica 6, para crear el fondo y la flecha para el botón VerticalSmallIncrease. Repitiendo los pasos desde el punto 10 anterior, el código de los cambios se presenta a continuación.
1 2 3 4 5 6 7 8 9 10 11 12 <Rectangle>   <Rectangle.Fill>     <SolidColorBrush Color="{StaticResource BackgroundColor}"/>   </Rectangle.Fill> </Rectangle> <Path x:Name="Arrow" Data="M0,0 L3.5,7 L7,0 z"       HorizontalAlignment="Center"       VerticalAlignment="Center">   <Path.Fill>     <SolidColorBrush Color="{StaticResource StandardColor}"/>   </Path.Fill> </Path>
  1. Realice los mismos cambios para los botones respectivos del control ScrollBar horizontal, asignando al control Path de la izquierda "M0,3.5 L7,7 L7,0 z" y para el control Path de la derecha "M0,0 L0,7 L7,3.5 z".

Ahora es tiempo de crear la pieza móvil del control ScrollBar, la cual le permite al usuario desplazarse a través del contenido rápidamente.

  1. Como fue presentado anteriormente, edite la plantilla actual para el control ScrollBar vertical.
  2. De la lista de objetos contenidos en el nodo de VerticalRoot, haga clic-derecho sobre el objeto VerticalThumb y edite su plantilla actual.
  3. En el control Grid de la plantilla, agregue un control Rectangle y asigne a la propiedad Fill el valor del recurso BackgroundColor. Agregue otro control Rectangle y asigne a la propiedad Width el valor de 7, a las propiedades de RadiusX y RadiusY el valor de 3.5 y a la propiedad Fill el valor del recurso StandardColor. El código se presenta a continuación.
1 2 3 4 5 6 7 8 9 10 <Rectangle>   <Rectangle.Fill>     <SolidColorBrush Color="{StaticResource BackgroundColor}"/>   </Rectangle.Fill> </Rectangle> <Rectangle x:Name="VisualThumb" Width="7" RadiusX="3.5" RadiusY="3.5">   <Rectangle.Fill>     <SolidColorBrush Color="{StaticResource StandardColor}"/>   </Rectangle.Fill> </Rectangle>
  1. Proceda de la misma forma con el objeto HorizontalThumb pero esta vez asigne el valor de 7 a la propiedad Height para el segundo control Rectangle.
  2. Presione F5 para ejecutar el proyecto y observe el progreso a este punto.
Definir los Estados Visuales

A este punto del tutorial las modificaciones visuales han sido completadas, lo siguiente es equiparar el comportamiento del control ScrollBar con su contraparte en Blend. Principalmente en los estados de MouseOver y Pressed.

  1. Haciendo uso de la pestaña Objetos y línea de tiempo, navegue hasta la plantilla del control ScrollBar vertical.

Asegúrese que la vista de código este activa, no es un requisito pero es interesante ver como el código cambia.

  1. Expanda el nodo VerticalRoot y haga clic-derecho sobre el objeto VerticalSmallDecrease para editar su plantilla actual.
  2. En el grupo de pestañas en la parte superior izquierda de la aplicación, ubique la que se llama Estados y selecciónela.
  3. De la lista de estados definidos, seleccione MouseOver y la Vista de Diseño pasará a modo de grabación para el estado seleccionado. Esto significa que los cambios realizados en las propiedades de los objetos de esta plantilla serán almacenados en este estado.
  4. Seleccione el control Path con el nombre de Arrow y cambie la propiedad de Fill al valor de HoverColor en el grupo de Pincel en el panel de propiedades a la derecha.
  5. Un control StoryBoard que contiene una instancia de ColorAnimation ha sido creado en el estado de MouseOver con la información de cambio de color para la propiedad Fill para la instancia del control llamada Arrow.
  6. Repita este mismo proceso desde el paso 5 para las 3 puntas de flecha restantes.
  7. Aplique el mismo color para los controles Thumb de ambas instancias del ScrollBar en el estado MouseOver.
  8. Regrese a la plantilla para el botón VerticalSmallDecrease.
  9. Haga clic en el estado Pressed de la lista que aparece en el panel de Estados.
  10. Seleccione el control Path llamado Arrow y cambie la propiedad Fill al valor del recurso de color PressedColor.
  11. De la misma forma, aplique el proceso del paso 11 a los 3 botones restantes y a los 2 controles Thumb en ambos controles ScrollBar.

Con estos últimos cambios se completa el objetivo de modificar el estilo del control ScrollBar para que equipare el que presenta Blend.

Un Paso Adicional

Buscando ir un poco más allá del objetivo inicial de este ejercicio, sería ubicar el estilo que se acaba de crear dentro de un archivo de Diccionario de recursos, para que el estilo se pueda aplicar en cualquier punto de la aplicación Silverlight.

Recurso General de Aplicación
  1. Ubique la pestaña Proyectos en el grupo de la esquina superior izquierda. Cerca de donde está ubicada la pestaña de Estados.
  2. Haga clic-derecho sobre el nombre del proyecto (ScrollBarBlend) y seleccione Agregar nueva carpeta.
  3. Nombre esta nueva carpeta Activos.
  4. Haga clic-derecho sobre la carpeta Activos y seleccione Agregar nuevo elemento.
  5. En la ventana de Nuevo elemento seleccione Diccionario de recursos.
  6. Asígnele el nombre de EstilosBlend.xaml y presione Aceptar.
  7. Abra el archivo App.xaml y verifique que el código que se presenta a continuación fue agregado, de lo contrario, adiciónelo.
1 2 3 4 5 6 7 <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="Activos/EstilosBlend.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources>

Cámbiese a la vista de código XAML, en caso que solo este active la Vista de Diseño, un archivo de diccionario de recursos no tiene elementos visuales de diseño.

  1. Abra el archivo EstilosBlend.xaml creado en el paso 6.
  2. De las pestañas en la parte superior de la Vista de Diseño, seleccione el archivo MainPage.xaml.
  3. Corte el fragmento de código contenido dentro de la etiqueta UserControl.Resources.
  4. Una vez la etiqueta UserControl.Resources este vacía, puede ser eliminada.
  5. Pegue el código en el portapapeles dentro del archivo EstilosBlend.xaml dentro de la etiqueta ResourceDictionary.
  6. Algunos errores aparecerán debido a una propiedad que Blend adiciono automáticamente al elemento ColorAnimation. Hay dos opciones para resolver estos errores: a) retire todas las ocurrencias del fragmento d:IsOptimized="True" o b) en la parte superior del archivo adicione unos propiedades a la etiqueta ResourceDictionary según se presenta en el código siguiente.
1 2 3 4 5 6 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d">
  1. 14. Presione F5 para ejecutar el proyecto y verificar que funciona como se espera.

Para tener un mejor ejemplo de la aplicación de este estilo, un artículo que integre estos cambios dentro de un control ScrollViewer será publicado en el futuro.

descargar el código ejemplo. ir a la página 1 2 3 4 5

Open complex type step by step with Web API 2.2 for OData v4.0

MSDN Blogs - Sun, 07/20/2014 - 18:59
Introduction

Recently, Microsoft officially announced Web API 2.2 for OData v4 via the blog post Announcing the Release of ASP.NET MVC 5.2, Web API 2.2 and Web Pages 3.2. In this release, a new feature named open complex type is introduced.

As the ODL v4 spec says: Open complex types are keyless named structured types consisting of a set of declared and dynamic (un-declared) properties.

Open complex types allow customers to add undeclared properties in the payload. And in the future they can use these properties in queries.

This blog is intended to provide a step by step guide for you to use the open complex types with Web API 2.2 for OData v4.0. Let’s get started.

BookStore Console Application

For simplicity, we’ll start by creating a simple console application named BookStore. In this console application, we’ll create an inline Web API OData Service to provide the basic functionality of a book store:

  1. Query the metadata information of the book store.
  2. Query the books from the book store.
  3. Create new books into the book store.
Install the Nuget package

Once the empty console application has been created, the first thing is to install the Web API 2.2 for OData v4.0 Nuget package from Nuget.org. On the solution explorer, right click on “References” in the BookStore project and select “Manage Nuget Packages” in the Nuget Packages Management dialog. You should see:

 

In the above dialog, search and select “Microsoft ASP.NET Web API 2.2 for OData v4.0” package and click the install button to install the package into the console application. After being installed, the updated references are the follows:

 

Where:

  1. Microsoft.OData.Core, Microsoft.OData.Edm, Microsoft.Spatial are the OData v4 Dlls.
  2. System.Web.OData is the Web API 2.2 Dll.

And the packages.config has the following values:

Build the open complex type model CLR type definition

For developers, it’s quite easy to define a model with open complex type. You should only add an extra property with IDictionary<string, object> in your CLR class.

For the BookStore application, we'll create a couple of C# classes to build the model. First of all, add a new folder in the solution named “Models”. In the “Models” folder, add the following classes:

// CLR classes:

//

Where in OData terms:

  • Book  is an entity type.
  • Press is an open complex type, because it has an extra property named DynamicProperties as IDictionary<string, object>.
  • Address is an open-less complex type.
  • Category is an Enum type.

Note: The DynamicProperties property in the Press type is a container used to contain the dynamic properties. In WebAPI 2.2 for OData v4, a complex type with an IDictionary<string, object> property will be built as an open complex type.

Inline model data

For simplicity we'll store all the data in memory using a BooksContext class which as you can see below has three books.

// BooksContext.cs

//

Where:

  1. The Press of Book1 has no dynamic properties.
  2. The Press of Book2 has two dynamic primitive properties.
  3. The Press of Book3 has one dynamic complex property.
Build the Edm Model

Now it’s easy to build  the Edm Model like this:

// GetEdmModel()

//

Note: The convention model builder won’t automatically add the Address type because there are no properties of the Book or the related Press classes that explicitly reference the Address class. However we plan on using Address in our open Press class, so we need to add it explicitly to the model.

Build the controller

It's time to build the controller to implement the OData routing. Add a new folder named "Controllers" in the BookStore project. In this folder, add a C# class named BooksController and derived it from ODataController. In this class, we'll add a private instance of BooksContext to play the DB role like this:

// BooksController.cs

//

Note: While this controller only supports Querying Books, Getting a single Book by key and Creating a new Book, you can easily add additional methods to implement the rest of OData’s supported interactions if needed.

Build the client

For simplicity, we'll build the client in the same console application. First, we change the Program class name to BookStoreApp class and use it to serve as our client. By adding the following method to create the instance of HttpClient:

// GetClient()

// Query the metadata

For customers to use the OData service, they first need to query the metadata document. Here’s how you can do that:

// QueryMetadata()

//

The resulting metadata document is below. For a customer, he can find the complex type “Press” has an attribute named OpenType and its value is true, while the complex type Address doesn’t have such attribute. Most importantly, “Press” complex type has only THREE declared properties named “Name, Web, Category”. The customer doesn’t know anything about the “DynamicProperties” property, because this is merely an implementation detail.

// Metadata document

// Query the entity with the dynamic properties

 Customers can now retrieve a single entity (and it’s dynamic properties) like this:  

 // QueryEntity()

//

The payload of the entity with dynamic properties should be:

// Payload

//

Where, the customer can find out that the Press property of Book('978-1-107-63706-1’) has four properties (three declared properties and one dynamic property). The name of dynamic property is “Address” and its type is #BookStore.Address.

Create an entity with dynamic properties

The customer can post an entity with dynamic properties to the service. The code is similar to above. In this case the request looks like this:

POST ~/odata/Books

Content-Type: application/json

Content:

// Summary

The open complex type feature included in Web API 2.2 for OData v4  provides a very easy way for customers to post their customized properties to the data service and allow them to be queried and retrieved in the future.  We believe open complex type support is a really useful feature for modelling real world problems and in the future, after we add open entity type and the dynamic collection property support to the next release of Web API OData, it will be even better.

Thanks. 

SYSK 391: Entities as a data contract

MSDN Blogs - Sun, 07/20/2014 - 16:56
There may be instances when using data transfer objects (DTO) is appropriate. For example, if you need to control the serialization details, such as which members to serialize and which not to serialize, and if you need to change the names of the serialized members, or do data contract mapping based on service version, or you want to suppress custom logic in entities created via partial classes, etc. If you choose to use DTOs, consider using generator classes, e.g. EntitiesToDTOs - Entity Framework...(read more)

Using WDF in an NDIS driver

MSDN Blogs - Sun, 07/20/2014 - 13:25
Can, Should, and How?

WDF is a framework that makes it easier to write Windows drivers.  NDIS is a framework for writing low-level Windows network drivers.  The purposes of these frameworks overlap a bit, and some people (okay, probably many people) are confused about the relationship between NDIS and WDF.  Today we’ll set down a few guidelines.  But first – let’s dispel one tenacious myth.

Myth: Some people think that NDIS drivers cannot use WDF.

In reality, you can use WDF in your NDIS driver.  I know this works rather well, because I have personally written several WDF-based NDIS drivers.

So where do people get the idea that WDF is incompatible with NDIS?  There are a few sources of this idea:

  • When writing an NDIS miniport driver, certain parts of WDF are not compatible with NDIS.  You must put WDF into a mode sometimes referred to as “miniport mode”.  Not all WDF APIs are available in miniport mode.  See the step-by-step checklist here.  Note that this restriction only applies to NDIS miniport (and IM) drivers; protocols and LWFs can use the full breadth of WDF functionality.
  • Miniport drivers must also put NDIS into a special mode, called NDIS-WDM mode.  This is a poor name, because it seems to indicate that you must use WDM.  The reality is that NDIS-WDM mode just means your driver can use any non-NDIS framework.  (At the time that NDIS-WDM mode was invented, there were no other frameworks besides WDM, so the name didn’t seem to be too constraining.  If it helps, you can think of it as NDIS-WD* mode.)
  • Most of the NDIS drivers that are included with Windows (like TCPIP) don’t use WDF.  But this isn’t because Windows developers are avoiding WDF; it’s because most inbox drivers simply predate WDF.  If we were writing the network stack from scratch, we’d use more WDF.  New drivers like MSLLDP, an NDIS protocol driver included with Windows 8, are indeed based on WDF.

Now that we know you can combine WDF with NDIS, let’s talk about whether you should combine WDF with NDIS.  In nearly all cases, an NDIS driver will work with or without WDF.  So you rarely have the decision forced upon you by the technology.  Ultimately, it will come down to what you decide, based (hopefully) on a good engineering judgment call.  Let’s collect some evidence to help you make that decision.

Reasons you should use WDF in your NDIS driver
  • Your engineering team is already familiar with WDF.
  • You will be developing several drivers, including non-networking drivers.  (Might as well learn WDF now.)
  • Your driver already uses WDF.
  • You are writing an NDIS miniport that uses IRPs on its lower edge (USB, SDIO, etc.)
  • You are writing a protocol or LWF that interacts with non-NDIS parts of the OS (usermode IOCTLs, WSK requests, etc.)
  • Your code would benefit from WDF’s clever object management system to avoid memory leaks.
  • You are new to Windows driver development, and have no idea where to start &#x1f630;

Generally speaking, it’s a good idea to consider WDF.  But there are a few reasons why WDF might not be very useful to your NDIS driver:

Reasons that WDF won’t help in your NDIS driver
  • Your engineering team is already very familiar with NDIS, but has no experience with WDF.
  • You are maintaining a mature driver that does not use WDF.
  • You are writing a simple NDIS miniport on a directly-connected bus (like PCI).
  • You are writing a protocol or LWF that has minimal interaction with the rest of the OS.  This driver mostly only calls NDIS APIs.
  • Your codebase must be compatible with platforms where WDF is not available (like Windows CE).

Mind you, it’s still quite possible to link against WDF in these situations.  But you’ll probably find that there aren’t a lot of opportunities to actually use WDF APIs.  Integrating with WDF doesn’t give a lot of value if you don’t call its APIs.  In those cases, the pragmatic engineering decision may be to just not use WDF.

Okay, so let’s suppose you’ve decided to give WDF a spin.  You’ll eventually notice that WDF overlaps somewhat with NDIS.  For example, both frameworks have APIs for workitems (NdisQueueIoWorkItem versus WdfWorkItemEnqueue).  Which API should you use?  Again, in many cases, either framework’s APIs will work.  Again, it’s an engineering decision that ought to consider several factors, including maintaining consistency with your other code, etc.  But if you are new to NDIS and WDF, you can use this quick-reference table as a starting place for your decision-making process.

API family Use NDIS APIs? Use WDF APIs? Use WDM APIs? Work items Avoid Preferred Do not use Timers Avoid Preferred Do not use Memory allocation Avoid Preferred Okay Locks & interlocks Avoid (but RW locks are okay) Preferred Preferred Events Avoid Preferred Preferred String handling Avoid Preferred Preferred DMA Preferred Okay Avoid Interrupts Preferred Not permitted Not permitted DPCs (for miniports) Preferred for interrupts Okay for non-interrupts Avoid DPCs (for non-miniports) Avoid Preferred Avoid Processor information Avoid (except RSS APIs) (no equivalent) Preferred IRPs and IOCTLs (for miniports) Required Not permitted Not permitted IRPs and IOCTLs (for non-miniports) Avoid Preferred Avoid Direct bus/port access Okay Preferred Preferred Reading configuration Preferred for standard keywords Preferred for other registry values Okay for other registry values File I/O Avoid Preferred Avoid

Remember, the above table only contains guidelines.  It is still acceptable to ship a driver that uses an API marked "Avoid".  You should use the table to help nudge your decision-making when you have no other compelling reasons to use a particular API family.

Weekend Links 07/20

MSDN Blogs - Sun, 07/20/2014 - 07:55

I have been away for a few days of summer vacation, but do not despair, the news links will keep coming.

 

Windows Developer Program for IoT now rolling out

http://channel9.msdn.com/coding4fun/blog/Windows-Developer-Program-for-IoT-now-rolling-out

In my latest presentation in a local meetup 2 things caught the attention of all assistants: Voice recognition with Cortana and Internet of Things. Well, now you have the right place to quench your thirst for knowledge:

Enter the new Windows Developer for IoT Portal

Just follow the link to this great post in Channel 9 

 

AdDuplex launches new monetization platform for developers and advertisers

http://www.wpcentral.com/adduplex-launches-new-monetization-platform-developers-advertisers 

Especially with GameDevs I have heard this question: How do I make money with my game/app? A common answer (not the only one!!!) is with advertisement. You can give Adduplex a try!

 

Microsoft ‘Video Tuner’ Editing App for Windows Phone 8.1 Now Available

http://tech-tongue.com/news-2/microsoft-video-tuner-editing-app-for-windows-phone-8-1-now-available/ 

If we have learned anything about the Internet and the mobile ecosystem is that videos rule. So, it would not hurt you to have a powerful editing tool for your cat videos or, well, other important videos in your life.

 

Matchingo - A Memory Matching Game 

http://blogs.msdn.com/b/gamewords777/archive/2014/07/12/local-games-matchingo.aspx

Last week I was telling you all about Matchingo, a game created by a local Game Developer: Roger Peters 

Have you Download it yet??? It is Free! 

  

 

Gameloft’s Dungeon Gems RPG Puzzler Out Now For Windows/Windows Phone 8 (FREE)

http://www.wp7connect.com/2014/07/18/gamelofts-dungeon-gems-rpg-puzzler-out-now-for-windowswindows-phone-8-free/ 

I downloaded this match 3/RPG game last night and still have lots of content to check. The mechanic is quite simple, but with the additional RPG games the replay value is quite high. It seems that I found a new pet project for my free time.

  

Download for Free here!!!

 

 Well, that's it for the moment. See you in a couple of days.

How to enable lab management logs at the server side?

MSDN Blogs - Sun, 07/20/2014 - 07:24

Here are the steps you should follow to enable lab management logs at the server side.

  • Run query on configuration database (typically Tfs_Configuration)

DECLARE @Id UNIQUEIDENTIFIER = NEWID()
EXEC prc_CreateTrace @traceId = @Id , @area=’LabManagement’, @level=4

  • Start the ETW trace listener on the AT machine
  • logman -ets start TraceSession -p "Microsoft-Team Foundation Server"

  • <repro issue>
  • Stop the ETW trace listener.

logman -ets stop TraceSession

  • Dump the log files.

tracerpt TraceSession.etl

Input
----------------
File(S):
     TraceSession.etl
100.00%
Output
----------------
DumpFile:           dumpfile.xml
Summary:            summary.txt
The command completed successfully.

  • You will observe the log file (dumpfile.xml) in C:\Windows\System32 directory and that contains all the logs.

Enjoy !!

在 Azure 上的 PHP 網站使用 Azure 的 Redis Cache 服務

MSDN Blogs - Sun, 07/20/2014 - 06:49

Microsoft Azure 的網站服務可以讓 PHP 網站開發人員架設網站(參考教學課程),如果要在網站系統中使用 Cache 來提升系統效能,可以考慮 Azure 上的 Redis Cache 服務(目前在預覽階段)。

建立 Redis Cache 服務

要使用 Redis Cache,目前需要到預覽中的新版 Azure 管理介面來操作,在新增服務的選項中選擇 Redis Cache。

然後選擇要用哪一個訂閱、什麼方案(Basic or Standard)、還有快取服務要用哪一座資料中心(建議與您的服務放在同一座資料中心,以減少網路的延遲)來提供服務。

建立完成後,Azure 需要一些時間把服務建立起來,一旦建立完成便能立即使用,而也可以在管理介面中看到它的一些狀態,可以點開 KEYS 來看金鑰或是 Properties 來看它的設定

點開 Properties 就會看到連線資訊,還有連接埠號碼。

搭配 KEYS 裡面顯示的金鑰就可以來使用 Redis Cache 服務了。

在網站服務上的 PHP 網站如何使用

如果您使用 Azure 的網站服務來運作 PHP 網站,要連接 Redis Cache 服務也很容易,只要下面幾個步驟:

  1. 到這裡下載編譯好的,給 Windows 環境的 PHP Redis 擴充套件,記得要根據您網站上設定的 PHP 版本下載對應的版本,而且要下載 VC9 編譯、NTS (non-thread-safe) 的版本。(當然您也可以選擇熟悉的 PHP Redis 套件,這裡只是範例)
  2. 將下載的套件解開壓縮,將 php_redis.dll 放在您的 PHP 專案目錄下,比方說放在 bin/php_redis.dll 下。
  3. 在上傳部署套件之前,先到 Azure 網站服務的管理介面上,將 app settings 加一個 PHP_EXTENSIONS 的常數,然後指到擴充套件的位置(如:bin\php_redis.dll 要用 Windows 的目錄表示法),像是這樣(圖為新版管理介面的網站設定,在現在的管理介面可在設定頁籤中找到):

  4. 上傳擴充套件檔案、重新啟動網站就完成了。

上面這個 PHP Redis Cache 是使用這個套件,它的連接方式像這樣:

<?php $redis = new Redis(); $redis->pconnect('您 Redis Cache 的 hostname'); $redis->auth('在 KEYS 頁面中找到金鑰'); #開始使用 $redis 做 cache 操作 ...

您可以在專案的 GitHub 頁面上查詢它的使用方法。

參考資料 這篇文章原始發佈於「Microsoft Azure 中文部落格」

在 Azure 上的 PHP 網站使用 Azure 的 Redis Cache 服務

MSDN Blogs - Sun, 07/20/2014 - 06:13

Microsoft Azure 的網站服務可以讓 PHP 網站開發人員架設網站(參考教學課程),如果要在網站系統中使用 Cache 來提升系統效能,可以考慮 Azure 上的 Redis Cache 服務(目前在預覽階段)。

建立 Redis Cache 服務

要使用 Redis Cache,目前需要到預覽中的新版 Azure 管理介面來操作,在新增服務的選項中選擇 Redis Cache。

然後選擇要用哪一個訂閱、什麼方案(Basic or Standard)、還有快取服務要用哪一座資料中心(建議與您的服務放在同一座資料中心,以減少網路的延遲)來提供服務。

建立完成後,Azure 需要一些時間把服務建立起來,一旦建立完成便能立即使用,而也可以在管理介面中看到它的一些狀態,可以點開 KEYS 來看金鑰或是 Properties 來看它的設定

點開 Properties 就會看到連線資訊,還有連接埠號碼。

搭配 KEYS 裡面顯示的金鑰就可以來使用 Redis Cache 服務了。

在網站服務上的 PHP 網站如何使用

如果您使用 Azure 的網站服務來運作 PHP 網站,要連接 Redis Cache 服務也很容易,只要下面幾個步驟:

  1. 到這裡下載編譯好的,給 Windows 環境的 PHP Redis 擴充套件,記得要根據您網站上設定的 PHP 版本下載對應的版本,而且要下載 VC9 編譯、NTS (non-thread-safe) 的版本。(當然您也可以選擇熟悉的 PHP Redis 套件,這裡只是範例)
  2. 將下載的套件解開壓縮,將 php_redis.dll 放在您的 PHP 專案目錄下,比方說放在 bin/php_redis.dll 下。
  3. 在上傳部署套件之前,先到 Azure 網站服務的管理介面上,將 app settings 加一個 PHP_EXTENSIONS 的常數,然後指到擴充套件的位置(如:bin\php_redis.dll 要用 Windows 的目錄表示法),像是這樣(圖為新版管理介面的網站設定,在現在的管理介面可在設定頁籤中找到):

  4. 上傳擴充套件檔案、重新啟動網站就完成了。

上面這個 PHP Redis Cache 是使用這個套件,它的連接方式像這樣:

<?php $redis = new Redis(); $redis->pconnect('您 Redis Cache 的 hostname'); $redis->auth('在 KEYS 頁面中找到金鑰'); #開始使用 $redis 做 cache 操作 ...

您可以在專案的 GitHub 頁面上查詢它的使用方法。

參考資料

Internet Explorer @ IETF 90

MSDN Blogs - Sun, 07/20/2014 - 00:39

This week Microsoft is sending a number of engineers, including members from the IE team, to the Internet Engineering Task Force meetings in Toronto. We’re looking forward to the conversations and working groups as it’s always great to get together face-to-face with engineers from across the industry.

In particular, there are several discussions we’re excited about including HTTP/2.0 and the safe preference header Internet proposal, which we’ve already been working on with several industry partners and has been enabled in IE as an early implementation.

If any of you are attending the event, please stop by and say hello.

-Adrian Bateman

Semantically Speaking...

MSDN Blogs - Sun, 07/20/2014 - 00:02

So I've temporarily escaped from Azure to lend a hand with, as Monty Python would say, something completely different. And it's a bit like coming home again, because I'm back with the Enterprise Library team. Some of them even remembered me from last time (though I'm not sure that's a huge advantage).

...(read more)

Small Basic - Triangle Challenge

MSDN Blogs - Sat, 07/19/2014 - 23:54

One of this month's challenges was set by Nonki - "Draw a picture of a regular triangle".

Here are some of the solutions:

 By Athasak, QQK823

This answer was shown to not be an exact equilateral triangle by Nonki and have the side ratios below.

 Another by Athasak after some corrections, GFS579

 By Pappa Lapub, ZLD815-0

 And one by Nonki using the Turtle, RXR906

Visit all the monthly forum challenges and solutions.

Issues with Hosted Build service -7/19 - Investigating

MSDN Blogs - Sat, 07/19/2014 - 21:01

Initial Update: Sun, Jul 19 2014 4:00 AM

We are currently investigating issues with Hosted build service. Customers may experience intermittent  build failures and long queue times while submitting their builds. However, we are seeing successful builds after retry so any customer experiencing issues should try to re-queue failed builds. Our DevOps teams are engaged and actively investigating the issues. We will provide an update as soon as we have more details on the issue.

We apologize for the inconvenience and appreciate your patience while working on resolving this issue.

Configuring SharePoint 2013 ECT & BCS for SQL Connectivity

MSDN Blogs - Sat, 07/19/2014 - 17:07

After having to walk through these setup steps recently for the first time with SQL and the impersonated windows ID I thought I'd post these steps for later reference and hopefully some of you will find them helpful.

There are several authentication options when configuring an External Content Type to point to a SQL server list.

Connect with User's Identity

Connect with Impersonated Windows Identity

Connect with Impersonated Custom Identity

 

The steps for each method above are outlined here: 

Connect with User's Identity

Use this for authenticating with the credentials from SQL itself when a user visits SharePoint to view the SQL list content

 

SharePoint Designer
  1. Create new External Content Type
  2. Create new database connection. Use Connect with User's Identity
  3. Create Read Item and Read List operation at the very least
  4. Save External Content Type
  5. Right-click newly created ECT and create External List

Connect with Impersonated Windows Identity

Use this option for SQL authentication when you want your user accounts hidden behind a single Windows alias. The alias account credentials are kept in the Secure Store Service Application.

SharePoint Central Admin
  1. Central Admin > Manage Service Application. Create a new Secure Store Service Application and edit it.
  2. Create a new target application using the Group type.
  3. Enter all the accounts that require access on the next screen.
  4. Once the Target Application has been created open the associated drop down list and select Set Credentials and enter the Username/Password of the AD alias account.
SharePoint Designer
  1. Create new External Content Type
  2. Create new connection and use the Connect with Impersonated Windows Identity option and enter the Secure Store Application ID you just created in Central Admin above
  3. Create a Read List and Read Item operation at the very least
  4. Save the External Content Type
  5. Open up the options menu of the newly created ECT to create an External List
SharePoint Central Admin
  1. Once you are finished with the previous step in SharePoint designer it automatically creates your External Content Type
  2. From the Business Data Connectivity Service Application find the new ECT, select the box next to it, and go to Set Object Permissions located on the command ribbon.
  3. Select a user or group with access to the ECT and grant at least Execute permissions to it.
  4. Select Set Metadata Store Permissions located on the command ribbon

Connect with Impersonated Custom Identity

This option is very much like the Impersonate Windows Identity selection but the configuration uses an account created in SQL as opposed to an AD account as was used In the Windows Identity section above.

 

SharePoint Central Admin
  1. Central Admin > Manage Service Application and select or create a new Secure Store Service Application and edit it. Create a new target application using the Group type.
  2. After the Target Application has been created select Set Credentials from the dropdown and enter the Username/Password of a SQL account
SharePoint Designer
  1. Create a new External Content Type
  2. Create a NEW connection, or use one that you know was setup w/ a SQL login. Use the Connect with Impersonated Custom Identity option and enter the Secure Store Application ID created in the previous steps.
  3. Create a Read Item and Read List operation at the very least
  4. Save the External Content Type
  5. Open up the options menu of the newly created ECT to create an External List
SharePoint Central Admin
  1. Once you are finished with the previous step in SharePoint designer it automatically creates your External Content Type
  2. From the Business Data Connectivity Service Application find the new ECT, select the box next to it, and go to Set Object Permissions located on the command ribbon.
  3. Select a user or group with access to the ECT and grant at least Execute permissions to it.
  4. Select Set Metadata Store Permissions located on the command ribbon

 

Hope you find this useful.

Issue with Application Insights 7/19 - Investigating

MSDN Blogs - Sat, 07/19/2014 - 15:39

Initial Update: Saturday, Jul 19 2014 10:30 PM UTC

Application Insights is investigating a issue with Usage data pipeline. Our DevOps teams are engaged and investigating at this time.
Few customers may see significant latency for usage related data during this incident window.

We apologize for the inconvenience this may have caused.

-Application Insights Service Delivery Team

RESTORE VERIFYONLY: How does it check for available space on destination devices?

MSDN Blogs - Sat, 07/19/2014 - 14:30

 

“How does RESTORE VERIFYONLY checks for space on destination drives when a drive isn’t specified as part of the statement?” was the question being asked this time.

And this was my answer to that one:

This is what SQL does:

  1. In order to complete the space check, it iterates over all data files, transaction log files, FTS files, filestream data files, and filestream log files it encounters in the backup set, and accumulates the space each of these files requires from each volume in the volume list,
  2. then it iterates over the list of volumes and makes sure each of them have sufficient space available to accommodate what has been found as required in the previous step. If any of the volumes doesn’t meet that minimum, informational message 3257 is reported. (There is insufficient free space on disk volume '%ls' to create the database. The database requires %I64u additional free bytes, while only %I64u bytes are available.)

Now, some curious findings about how this space availability feature works internally beyond what’s explained above and which are not thoroughly  documented:

  • Trace flag 3105 (available on retail builds of every version ranging from 2005 up to 2014, both included) causes this space check functionality to be skipped.
  • For RAW volumes, that space check is skipped by default, whether or not the mentioned TF is enabled.
  • If the instance of SQL running the RESTORE VERIFYONLY statement doesn’t “see” the volume on which a given file is expected to be restored (either the one specified in the backupset or the overridden value via the WITH MOVE clause), it reports informational message 3181 (Attempting to restore this backup may encounter storage space problems. Subsequent messages will provide details.)
  • If the name of the database whose backup set is being verified is found in the sys.databases table of the instance where the RESTORE VERIFYONLY command is being executed, SQL enumerates all the files associated to that database, and for each of them does this:
    • gets the size of the file,
    • gets the current volume on which the file is located,
    • if that volume matches any of the volumes on which the restore is being expected to happen (based on the physical paths in the backupset or the overridden paths indicated through the WITH MOVE clause), the size of the file is deducted from the space required in that volume as calculated in step 1 above.

The tricky thing here is that RESTORE VERIFYONLY doesn’t let you override the name of the database as it comes in the backup set, so when the name of the database in the backupset matches that of a database in the instance in which you’re executing the RESTORE VERIFYONLY command, the calculations made by the space check logic might not coincide with what you were expecting. Keep in mind that SQL treats that backup as one that is expected to be restored on top of (replacing) an existing database with the exact same name, and you may be planning to restore it side by side, under a different database name.

How to setup your most used templates in PowerShell_ISE

MSDN Blogs - Sat, 07/19/2014 - 12:32

The success story for visual studio is the fact that you have tones of templates that saves your time and let you focus in the main idea and the ultimate goal for your code.

Powershell_ISE provide this capability for most generic scripting techniques that you usually use.

Click Start Snippets and select the script code you want.

You can create your own snippets for most common codes/APIs/connections that you usually use.

This code will add a new snippet for outlook object mode

PowerShell_ISE

$m = @'

# Connect to outlook
$Outlook = New-Object -comobject Outlook.Application
$namespace = $Outlook.GetNameSpace("MAPI")

# Connect to the inbox folder
$inbox = $namespace.GetDefaultFolder(6)
'@

New-ISESnippet -Text $m -Title ‘MyOutlook' -Description “MyOutlook" `
-Author "Ahmed Ashour" -Force

 

簡單玩 Windows for IoT

MSDN Blogs - Sat, 07/19/2014 - 06:18

在 //Build/ 2014 開發大會上,微軟宣佈了 Windows for IoT 的計劃,並且也宣告了對於 IoT 製造商來說,Windows for IoT 將會免授權費!

而最近也開始推出 Windows Developer Program for IoT 計劃,開放給有興趣的開發人員,同時 MS Open Tech 也為此計劃開發了一些套件,可以到 http://www.windowsondevices.com/ 查看關於開發 Windows for IoT 的各項訊息(文件、範例程式碼等),在這個網站上也可以申請開發套件,包括一塊 Intel Galileo 開發板以及 為 Intel Galileo 特製的 Windows for IoT 作業系統,這個作業系統支援標準的 Arduino Writing API 以及部份的 Win32 API,供開發人員開發應用程式。

收到的開發板大概會會長這樣,左下角的 MicroSD 卡裝的就是為這塊開發板特製的 Windows for IoT 作業系統,接上電源後,透過 Ethernet 網路線到開發機器上就可以開始開發跑在這塊開發板上的應用程式了。在開始之前,先到這裡看一下要怎麼準備開發環境,基本上需要 Visual Studio 2013 (Express 版的話要是 Visual Studio 2013 Express for Desktop 的版本),大致上就是裝一個 watch 開發板狀態、還有一個 Visual Studio 的擴充套件,還有打開 Windows 上的 Telnet 用戶端程式,以便能 telnet 進板子做一些操作(像是關機)。

準備工作完成後,開發應用程式就很簡單了,如果裝好了指定的 Visual Studio 擴充套件,那在開啟專案時可以在 Visual C++ 下看到 Windows for IoT 的範本。

專案建立完成後,如果發現專案找不到 arduino 相關的標頭檔,那就自己手動安裝 Galileo C++ SDK 的套件,這部份可以透過 nuget 來安裝,順利安裝完成後應該就能順利編譯了。編譯完成後,就是要送到開發板上執行或偵錯,所以網路線接好後,先用 GalileoWatcher 看一下是否有偵測到板子,再執行建置好的專案便會透過網路來進行遠端偵錯了。

而在 Microsoft Open Technology 公司也針對 IoT 的開發開設了一個 GitHub 帳號,將許多開發資源都開放源碼於此,有興趣玩 Windows for IoT 的開發人員可以關注一下。

參考資料

簡單玩 Windows for IoT

MSDN Blogs - Sat, 07/19/2014 - 06:18

在 //Build/ 2014 開發大會上,微軟宣佈了 Windows for IoT 的計劃,並且也宣告了對於 IoT 製造商來說,Windows for IoT 將會免授權費!

而最近也開始推出 Windows Developer Program for IoT 計劃,開放給有興趣的開發人員,同時 MS Open Tech 也為此計劃開發了一些套件,可以到 http://www.windowsondevices.com/ 查看關於開發 Windows for IoT 的各項訊息(文件、範例程式碼等),在這個網站上也可以申請開發套件,包括一塊 Intel Galileo 開發板以及 為 Intel Galileo 特製的 Windows for IoT 作業系統,這個作業系統支援標準的 Arduino Writing API 以及部份的 Win32 API,供開發人員開發應用程式。

收到的開發板大概會會長這樣,左下角的 MicroSD 卡裝的就是為這塊開發板特製的 Windows for IoT 作業系統,接上電源後,透過 Ethernet 網路線到開發機器上就可以開始開發跑在這塊開發板上的應用程式了。在開始之前,先到這裡看一下要怎麼準備開發環境,基本上需要 Visual Studio 2013 (Express 版的話要是 Visual Studio 2013 Express for Desktop 的版本),大致上就是裝一個 watch 開發板狀態、還有一個 Visual Studio 的擴充套件,還有打開 Windows 上的 Telnet 用戶端程式,以便能 telnet 進板子做一些操作(像是關機)。

準備工作完成後,開發應用程式就很簡單了,如果裝好了指定的 Visual Studio 擴充套件,那在開啟專案時可以在 Visual C++ 下看到 Windows for IoT 的範本。

專案建立完成後,如果發現專案找不到 arduino 相關的標頭檔,那就自己手動安裝 Galileo C++ SDK 的套件,這部份可以透過 nuget 來安裝,順利安裝完成後應該就能順利編譯了。編譯完成後,就是要送到開發板上執行或偵錯,所以網路線接好後,先用 GalileoWatcher 看一下是否有偵測到板子,再執行建置好的專案便會透過網路來進行遠端偵錯了。

而在 Microsoft Open Technology 公司也針對 IoT 的開發開設了一個 GitHub 帳號,將許多開發資源都開放源碼於此,有興趣玩 Windows for IoT 的開發人員可以關注一下。

參考資料

原始文章發佈於「開發者之魂」部落格

Pages

Subscribe to Randy Riness @ SPSCC aggregator
Drupal 7 Appliance - Powered by TurnKey Linux