<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>JuanK 1/0 on msdn</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/juank/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/juank/feed.xml</link>
    <description>Juan Carlos Ruiz - Microsoft Technical Evagelist</description>
    <lastBuildDate>Wed, 17 Apr 2019 03:23:10 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Hola UWP: ¿Cortana eres tú? Iniciando aplicaciones con comandos de voz</title>
      <link>https://docs.microsoft.com/archive/blogs/juank/hola-uwp-cortana-eres-t-iniciando-aplicaciones-con-comandos-de-voz</link>
      <pubDate>Thu, 28 Jan 2016 15:33:31 GMT</pubDate>
      <dc:creator><![CDATA[Juankk]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/juank/2016/01/28/hola-uwp-cortana-eres-t-iniciando-aplicaciones-con-comandos-de-voz/</guid>
      <description><![CDATA[Una de las características que más me ha gustado de las aplicaciones UWP es la capacidad que se...]]></description>
      <content:encoded><![CDATA[<p>Una de las características que más me ha gustado de las aplicaciones UWP es la capacidad que se tiene de trabajar con Cortana en Windows 10 y es que por fin poco a poco se está haciendo realidad aquel sueño nerd de poder hablar con tu máquina, darle instrucciones y que además te responda, algo que hace no mucho tiempo parecía algo muy difícil de lograr.</p>

<p>Implementar estos comandos de voz es sencillo en las aplicaciones UWP solo debemos tener en cuenta que los comandos de voz inician con un prefijo, el cual usualmente es el nombre de la aplicación o una "palabra clave" aunque tenemos la libertad de definir opciones para pronunciar el nombre de la aplicación antes o después del comando y elegir que comportamiento implementar cuando la aplicación se lanza.</p>

<p>Al escribir este post Cortana solo está disponible en las siguientes regiones y lenguajes:</p>

<ul>
<li>Australia (Inglés)</li>
<li>Canadá (Inglés)</li>
<li>China (Chino simplificado)</li>
<li>Francia (Francés)</li>
<li>Alemania (Alemán)</li>
<li>Japón (Japonés)</li>
<li>Italia (Italiano)</li>
<li>España (Español)</li>
<li>Reino Unido (Inglés)</li>
<li>Estados Unidos (Inglés)</li>
</ul>

<blockquote>
  <p>Si deseas obtener los últimos lenguajes puedes visitar el siguiente <a href="https://windows.microsoft.com/en-us/windows-10/cortanas-regions-and-languages#v1h=tab01">link</a> </p>
  
  <p><strong>Nota:</strong> Toma en cuenta que para que Cortana funcione correctamente necesitamos que el lenguaje del dispositivo, el paquete de lenguaje y el país o región correspondan con las configuraciones antes mencionadas.</p>
</blockquote>

<h2 id="definiendovoicecommands">Definiendo VoiceCommands</h2>

<p>Y bien vamos ahora con el código que es por lo que seguramente estás en este post.</p>

<p>En primer lugar, todos los comandos de voz están definidos en un archivo XML por lo tanto agregaremos una a nuestro proyecto. <br>
<img src="https://saturninopimentel.com/content/images/2016/01/VoiceCommands1.png" alt="">
Y después debemos escribir la siguiente estructura.  </p>

<pre><code>&lt;?xml version="1.0" encoding="utf-8" ?&gt;  
&lt;VoiceCommands xmlns="https://schemas.microsoft.com/voicecommands/1.2"&gt;  
  &lt;CommandSet xml:lang="en-us" Name="HoLCommandSet en-us"&gt;
    &lt;CommandPrefix&gt;Hello commands, &lt;/CommandPrefix&gt;
    &lt;Example&gt;Launch&lt;/Example&gt;

    &lt;Command Name="LaunchApp"&gt;
      &lt;Example&gt;launch&lt;/Example&gt;
      &lt;ListenFor&gt;launch&lt;/ListenFor&gt;
      &lt;Feedback&gt;Welcome aboard, I'm opening the app&lt;/Feedback&gt;
      &lt;Navigate/&gt;
    &lt;/Command&gt;

  &lt;/CommandSet&gt;

  &lt;!--Se puede agregar un soporte opcional para cualquier otro lenguaje soportado --&gt;
  &lt;!--&lt;CommandSet xml:lang="es-es" Name="HoLCommandSet es-es"--&gt;

&lt;/VoiceCommands&gt;
</code></pre>

<p>Veamos en que consiste cada una de las secciones.</p>

<p><strong>VoiceCommands</strong> es el elemento principal de nuestro XML y dentro del cuerpo de este tag es donde vamos a colocar todos nuestros comandos, el esquema de <strong>VoiceCommands</strong> debe apuntar a la versión 1.2.</p>

<pre><code>&lt;VoiceCommands xmlns="https://schemas.microsoft.com/voicecommands/1.2"&gt;  
</code></pre>

<p><strong>CommandSet</strong> es el elemento principal de cada uno de los comandos soportados por nuestra aplicación y debe apuntar al lenguaje que va a soportar en este caso xml:lang="en-us".</p>

<pre><code>&lt;CommandSet xml:lang="en-us" Name="HoLCommandSet en-us"&gt;  
</code></pre>

<p><strong>CommandPrefix</strong> es la palabra o frase que utilizaremos como usuarios para decirle al sistema que escuche los comandos para nuestra App.
Este prefijo debe ser definido para cada uno de los elementos CommandSet en el lenguaje que definamos.  </p>

<pre><code>&lt;CommandPrefix&gt;Hello commands, &lt;/CommandPrefix&gt;  
</code></pre>

<blockquote>
  <p><strong>Nota:</strong> la coma que he colocado en el prefijo es opcional y solo sirve para indicar al sistema que debe hacer una pequeña pausa.</p>
</blockquote>

<p>Ahora podemos crear nuestro comando, en la estructura debemos definir el elemento <strong>ListenFor</strong> que indicará al sistema que palabra o frase se utiliza para reconocer el comando, <strong>FeedBack</strong> que define el texto de confirmación que Cortana dirá al usuario al ejecutar el comando, el elemento <strong>Example</strong> para este comando y el elemento <strong>Navigate</strong> que significa que la aplicación se lanzará en el primer plano.  </p>

<pre><code>&lt;Command Name="LaunchApp"&gt;  
   &lt;Example&gt;launch&lt;/Example&gt;
   &lt;ListenFor&gt;launch&lt;/ListenFor&gt;
   &lt;Feedback&gt;Welcome aboard, I'm opening the app&lt;/Feedback&gt;
   &lt;Navigate/&gt;
&lt;/Command&gt;  
</code></pre>

<h2 id="instalandoloscomandosdevoz">Instalando los comandos de voz</h2>

<p>Una vez que hemos definido el archivo XML de nuestro comando de voz, es necesario instalarlo, para ello vamos a utilizar el método <strong>InstallCommandDefinitionsFromStorageFileAsync</strong> en el método <strong>OnLaunched</strong> antes de iniciar el frame principal.</p>

<pre><code> var storageFile =
                await
                    Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///VoiceCommands.xml"));

            await
                Windows.ApplicationModel.VoiceCommands.VoiceCommandDefinitionManager
                    .InstallCommandDefinitionsFromStorageFileAsync(storageFile);

Frame rootFrame = Window.Current.Content as Frame;  
</code></pre>

<blockquote>
  <p><strong>Nota:</strong> Como ya habrás notado los comandos se instalan después de la primera vez que ejecutas tu aplicación.</p>
</blockquote>

<h2 id="controlandoellanzamientodenuestraaplicacin">Controlando el lanzamiento de nuestra aplicación</h2>

<p>Cuando inicias tu aplicación a través de los comandos de voz la aplicación entra en el evento <strong>OnActivated</strong> en lugar de <strong>OnLaunched</strong> por tanto debemos crear el frame principal en este evento para que nuestra aplicación funcione.</p>

<p>También es necesario controlar como fue lanzada nuestra aplicación esto lo he realizado en un <strong>switch</strong> utilizando el enumerador <strong>ActivationKind</strong> <br>
y por último manejar en un método los parámetros de nuestro comando de voz.  </p>

<pre><code>protected override void OnActivated(IActivatedEventArgs args)  
{
    Frame rootFrame = Window.Current.Content as Frame;
    if (rootFrame == null)
    {
        rootFrame=new Frame();

        rootFrame.NavigationFailed += OnNavigationFailed;

        Window.Current.Content = rootFrame;
    }

    switch (args.Kind)
    {
        case ActivationKind.VoiceCommand:
            HandleVoiceCommand(args,rootFrame);
            break;
        default:
            break;
    }

    Window.Current.Activate();

    base.OnActivated(args);
}
</code></pre>

<p>En el método en el que manejaremos nuestros parámetros haremos un cast del parámetro <em>arg</em> a <strong>VoiceCommandActivatedEventArgs</strong> y obtendremos el nombre del comando para realizar las tareas que tengamos preparadas para nuestra aplicación, en este caso solo navegaremos a la página de inicio.  </p>

<pre><code>private void HandleVoiceCommand(IActivatedEventArgs args,Frame frame)  
{
    var commandArgs = args as VoiceCommandActivatedEventArgs;

    var speechRecognitionResult = commandArgs.Result;
    var command = speechRecognitionResult.Text;

    var voiceCommandName = speechRecognitionResult.RulePath[0];
    var textSpoken = speechRecognitionResult.Text;

    Debug.WriteLine("Command: " + command);
    Debug.WriteLine("Text spoken: " + textSpoken);

    switch (voiceCommandName)
    {
        case "LaunchApp":
             frame.Navigate(typeof (MainPage));
             break;
        default:
        break;
    }

}
</code></pre>

<p>Y ahora podemos ejecutar nuestro proyecto y ver el resultado de nuestro ejemplo como se muestra en las siguientes imágenes (recuerda que debes ejecutar la aplicación al menos una vez para que se instalen los comandos). <br>
<img src="https://saturninopimentel.com/content/images/2016/01/VoiceCommands2.png" alt="">
<img src="https://saturninopimentel.com/content/images/2016/01/VoiceCommands3.png" alt=""></p>

<p>El código de ejemplo lo he dejado en <a href="https://github.com/Satur01/CortanaVoiceCommands">github</a> y espero te resulte útil.</p>

<p>Si deseas saber más sobre los comandos de voz para Cortana visita el siguiente <a href="https://msdn.microsoft.com/en-us/library/windows/apps/dn722331.aspx">link</a></p>

<p>Espero te resulte útil este post y puedas incluir estos comandos de voz en tus aplicaciones. <br>
¡Saludos!</p>

<p><a href="https://twitter.com/SaturPimentel">@saturpimentel</a></p>]]></content:encoded>
    </item>
    <item>
      <title>UWP - Cómo implementar validación de campos en Universal Apps</title>
      <link>https://docs.microsoft.com/archive/blogs/juank/uwp-cmo-implementar-validacin-de-campos-en-universal-apps</link>
      <pubDate>Sun, 17 Jan 2016 18:51:31 GMT</pubDate>
      <dc:creator><![CDATA[Juankk]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/juank/2016/01/17/uwp-cmo-implementar-validacin-de-campos-en-universal-apps/</guid>
      <description><![CDATA[Avanzado

Actualmente UWP no incorpora ningún framework de validación, sin embargo la comunidad de...]]></description>
      <content:encoded><![CDATA[<p><label itemprop="proficiencyLevel" class="label label-error">Avanzado</label></p>

<p>Actualmente UWP no incorpora ningún framework de validación, sin embargo la comunidad de C# es pujante y en GitHub ya hay una alternativa muy interesante que vale la pena revisar: <a href="https://github.com/scionwest/ValidatableBase">ValidatableBase</a> .</p>

<p>En este post revisaremos como implmentar validación con atributos utilizando esta libreria.</p>

<h2 id="tarea0instalacin">Tarea 0 - Instalación</h2>

<p>Lo primero es que debes descargar o clonar el repositorio de GitHub ya que actualmente al menos no tienen binarios publicados. Abres la solución y la compilas en modo release para obtener la dll.</p>

<h2 id="tarea1prepararlasolucinuwpyagregarlalibreriadevalidacin">Tarea 1 - Preparar la solución UWP y agregar la libreria de validación</h2>

<ol>
<li>Desde Visual Studio 2015 creamos un nuevo proyecto de tipo Blank UWP <br>
<img src="https://juank.io/content/images/2016/01/HOL-01-1.png" alt="Nuevo proyecto UWP" title=""></li>
<li>Desde el explorador de soluciones creamos una nueva carpeta llamada <em>Binaries</em> y allí adicionamos los archivos generados al compilar <strong>ValidatableBase</strong> <br>
<img src="https://juank.io/content/images/2016/01/HOL-02.png" alt="Agregar libreria" title="">
<ul><li>ValidatableBase.dll</li>
<li>ValidatableBase.pdb </li></ul></li>
<li>Agregamos como referencias del proyecto la libreria <strong>ValidatableBase.dll</strong> copiada en la carpeta de la solución  </li>
<li>Ahora creamos otro folder y lo nombraremos <em>util</em>, allí crearemos <strong>BindableBase</strong>, sino sabes que es puedes referirte a este artículo : <a href="https://juank.io/apps-binding-inotifypropertychanged-bindablebase-xaml-c/">Apps, Binding, INotifyPropertyChanged y BindableBase | XAML | C#</a> , pero en todo caso acá lo tienes <br>
<script src="https://gist.github.com/JuanKRuiz/b686ca389077a120c60b.js"></script></li>
<li>Abrimos el archivo <strong>MainPage.xaml</strong> y nos aseguramos de insertar este xaml en el <code>Grid</code> que viene por defecto. <br>
<pre class="language-markup">
<code>
    &lt;StackPanel HorizontalAlignment="Stretch" VerticalAlignment="Center"&gt;
        &lt;StackPanel Orientation="Horizontal"&gt;
            &lt;TextBlock Width="100" Text="Nombre: "/&gt;
            &lt;TextBox Width="250" /&gt;
        &lt;/StackPanel&gt;
        &lt;StackPanel Orientation="Horizontal"&gt;
            &lt;TextBlock Width="100" Text="Email: "/&gt;
            &lt;TextBox Width="250"/&gt;
        &lt;/StackPanel&gt;
        &lt;StackPanel Orientation="Horizontal"&gt;
            &lt;TextBlock Width="100" Text="Errores :"/&gt;
            &lt;TextBlock Width="400" Height="100"/&gt;
        &lt;/StackPanel&gt;
        &lt;Button HorizontalAlignment="Stretch"&gt;Validar&lt;/Button&gt;
    &lt;/StackPanel&gt;
</code>
</pre></li>
<li><p>Ahora creamos una carpeta <strong>Models</strong> y allí  el modelo, una clase <code>User</code> definida cmo se ve a continuación, heredando de <code>ValidatableBase</code> <br>
```
    using Sullinger.ValidatableBase.Models;</p>

<pre><code>public class User
{
    BindableBase binder;


<pre><code>private string name;


public string Name
{
    get { return name; }
    set { binder.SetProperty(ref name, value); }
}


private string email;


public string Email
{
    get { return email; }
    set { binder.SetProperty(ref email, value); }
}


public User()
{
    binder = new BindableBase();
    email = name = string.Empty;            
}
</code></pre>

}
</code></pre>

<p>```</p></li>
<li><p>En la solución creamos una carpeta <strong>ViewModels</strong> y en ella creamos la clase <code>MainPageVM</code>, por el momento como se ve a continuación <br>
```
public class MainPageVM : BindableBase, ICommand
{
    public event EventHandler CanExecuteChanged;</p>

<pre><code>public bool CanExecute(object parameter)
{
    return true;
}


public void Execute(object parameter)
{
    throw new NotImplementedException();
}


private User usuario;
public User Usuario
{
    get { return usuario; }
    set { SetProperty(ref usuario, value); }
}


private string errores;


public string Errores
{
    get { return errores; }
    set
    { SetProperty(ref errores, value); }
}


public MainPageVM()
{
    errores = string.Empty;
    usuario = new User();
}        
</code></pre>

<p>}
```</p>

<blockquote>
  <p>La libreria incorpora mecanismos más sofisticados y útiles que el que vamos a usar para mostrar los errores, pero con el fin de mantenerlo sencillo he optado por cumular los errores en una cadena de texto.    </p>
</blockquote></li>
<li><p>Ahora que tenemos esto listo, regresemos al <code>xaml</code> y dejamos listos el <code>DataContext</code>, los <code>Binding</code> y el Comando del botón, quedando así: <br>
<div class="language-markup">
```
<page x:class="App5.MainPage" xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:App5" xmlns:d="https://schemas.microsoft.com/expression/blend/2008" xmlns:mc="https://schemas.openxmlformats.org/markup-compatibility/2006" mc:ignorable="d" xmlns:vm="using:App5.ViewModels">
    <page.datacontext>
        <vm:mainpagevm>
    </vm:mainpagevm></page.datacontext></page></div></p>

<pre><code>&lt;Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"&gt;
    &lt;StackPanel HorizontalAlignment="Stretch" VerticalAlignment="Center"&gt;
        &lt;StackPanel Orientation="Horizontal"&gt;
            &lt;TextBlock Width="100" Text="Nombre: "/&gt;
            &lt;TextBox Width="250" Text="{Binding Usuario.Name, Mode=TwoWay}" /&gt;
        &lt;/StackPanel&gt;
        &lt;StackPanel Orientation="Horizontal"&gt;
            &lt;TextBlock Width="100" Text="Email: "/&gt;
            &lt;TextBox Width="250" Text="{Binding Usuario.Email, Mode=TwoWay}"/&gt;
        &lt;/StackPanel&gt;
        &lt;StackPanel Orientation="Horizontal"&gt;
            &lt;TextBlock Width="100" Text="Errores :"/&gt;
            &lt;TextBlock Width="400" Height="100"/&gt;
        &lt;/StackPanel&gt;
        &lt;Button HorizontalAlignment="Stretch" Command="{Binding}"&gt;
            Validar
        &lt;/Button&gt;
    &lt;/StackPanel&gt;
&lt;/Grid&gt;
</code></pre>

<p>
```</p></li>
</ol>

<h2 id="tarea2elprocesodevalidacin">Tarea 2 - El proceso de validación</h2>

<ol>
<li>La validación en ValidatableBase es basada en atributos, así que hay que decorar el modelo con atributos que indiquen que queremos validar, la propiedad <code>Name</code> de <code>User</code> la validaremos como requerida. <br>
<div class="language-csharp">
<code>
    [ValidateObjectHasValue( FailureMessage = "El nombre no se puede dejar en blanco",
                             ValidationMessageType = typeof(ValidationErrorMessage))]
    public string Name
    {
        get { return name; }
        set { binder.SetProperty(ref name, value); }
    }
</code>


<blockquote>
  <p>Notemos que el atributo indica que el campo es requerido, y podemos colocar un mensaje de validación personalizado, de igual forma debemos indicar que esta validación es tipo <strong>error</strong>, podría tambien ser un <strong>warning</strong>.</p></blockquote></div></li>
  <li>Le hacemos la misma decoración al campo <code>email</code>  </li>
  <li>El campo <code>email</code> debe etener una validación adicional, pues desde luego queremos validar que si corresponda con un correo electrónico válido, hay varias formas de hacerlo con la libreria, ya que incluso puedes crear tus propios <code>ValidationAttribute</code>, pero para mantenerlo simple adicionaremos  un atributo <code>ValidateWithCustomHandler</code> al campo <code>Email</code> quedando así <br>
  <code>
      [ValidateWithCustomHandler( DelegateName = "IsValidEmail",
                                  FailureMessage = "Esto no parece un correo electrónico",
                                  ValidationMessageType = typeof(ValidationWarningMessage))]
      [ValidateObjectHasValue(FailureMessage = "El email no se puede dejar en blanco",
                       ValidationMessageType = typeof(ValidationErrorMessage))]
      public string Email
      {
          get { return email; }
          set { binder.SetProperty(ref email, value); }
      } <br>
  </code></li>
  <li><p>Cramos en la clase <code>User</code> el método <code>IsValidEmail</code> y lo marcamos con un atributo  <code>ValidationCustomHandlerDelegate</code> como se ve a continuación </p><p></p>


<p><code>``
    [ValidationCustomHandlerDelegate(DelegateName = "IsValidEmail")]
    private IValidationMessage IsValidEmail(IValidationMessage failureMessage, PropertyInfo property)
    {
        const string regExp = @"\A(?:[a-z0-9!#$%&amp;'*+/=?^_</code>{|}~-]+(?:.[a-z0-9!#$%&amp;'<em>+/=?^_`{|}~-]+)</em>@(?:<a href="https://juank.io/?:[a-z0-9-]*[a-z0-9]">a-z0-9</a>?.)+<a href="https://juank.io/?:[a-z0-9-]*[a-z0-9]">a-z0-9</a>?)\Z";</p>

<pre><code>    return Regex.IsMatch(this.Email, regExp, RegexOptions.IgnoreCase)
        ? null
        : failureMessage;
}    
</code></pre>

<p>```</p></li>
</ol>

<h2 id="tarea3mostrarloserrores">Tarea 3 - Mostrar los errores</h2>

<ol>
<li>La aplicación ya esta preparada para realizar las validaciones, invocaremos la validación en el método <code>Execute</code> del viewmodel:  <code>MainPageVM</code> <br>
<code>
    public void Execute(object parameter)
    {
        Usuario.ValidateAll();
    }
</code></li>
<li><p>Así como esta ya se ejecutarán las validaciones, pero desde luego hace falta mostrar los mensajes en pantalla, para ello modificams el código del método <code>Execute</code> del viewmodel:  <code>MainPageVM</code> para concatenar todos los mensajes encontrados para cada propiedad tras la validación. <br>
```
public void Execute(object parameter)
{
    Errores = string.Empty;
    Usuario.ValidateAll();</p>

<pre><code>if (Usuario.HasValidationMessages())
{
    var propiedades = Usuario.GetValidationMessages();


<pre><code>foreach (var propiedad in propiedades)
{
    foreach (var error in propiedad.Value)
    {
        Errores += $"{propiedad.Key}: {error.Message}\n";
    }
}
</code></pre>

}
</code></pre>

<p>}
```</p>

<blockquote>
  <p>Como lo mencioné, la libreria tiene otras cosas más sofisticadas para mostrar los errores a traves de binding de colecciones, pero para mantener el ejemplo sencillo lo he hecho de esta manera</p>
</blockquote></li>
<li>vamos al <code>xaml</code> y configuramos el <code>Binding</code> del control que muestra los errores, en el último <code>TextBlock</code> <br>
<div class="language-markup">
<code>
&lt;TextBlock Width="400" Height="100" Text="{Binding Errores}" /&gt;
</code></div></li>
<li>Ahora ejecutamos la aplicación y listo! cada vez que presionemos el botón se realizarán las validaciones. <br>
<img src="https://juank.io/content/images/2016/01/HOL-03.png" alt="Validaciones" title=""></li>
</ol>

<p>Eso fue todo, espero sea últil ;)</p>]]></content:encoded>
    </item>
    <item>
      <title>¿Por qué esperar? SignalR y Mobile Services para mensajes en tiempo real</title>
      <link>https://docs.microsoft.com/archive/blogs/juank/por-qu-esperar-signalr-y-mobile-services-para-mensajes-en-tiempo-real</link>
      <pubDate>Wed, 09 Dec 2015 18:31:50 GMT</pubDate>
      <dc:creator><![CDATA[Juankk]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/juank/2015/12/09/por-qu-esperar-signalr-y-mobile-services-para-mensajes-en-tiempo-real/</guid>
      <description><![CDATA[En estas últimas semanas he estado trabajando en una aplicación que tiene un sistema de envío de...]]></description>
      <content:encoded><![CDATA[<p>En estas últimas semanas he estado trabajando en una aplicación que tiene un sistema de envío de mensajes, para estos mensajes se ha utilizado <strong>SignalR</strong> para mejorar la velocidad de entrega y vaya que es rápida la conexión y el envío de mensajes.</p>

<p>La aplicación a la que me refiero tenía un backend con <strong>Mobile Services</strong> el cual ya ofrece un <strong>Azure Service Bus</strong> que utilizamos como backplane para la distribución de los mensajes.</p>

<p>Este es un post con un breve ejemplo de cómo enviar mensajes entre las aplicaciones, como primer punto vamos a definir que es <strong>SignalR</strong>.</p>

<h3 id="quessignalr">¿Qué es SignalR?</h3>

<p><strong>SignalR</strong> es una biblioteca open source desarrollada por miembros del equipo de ASP .Net y que nos sirve para conectar aplicaciones en tiempo real de una manera muy sencilla, <strong>SiganlR</strong> nos provee una capa de abstracción que nos permite utilizar diferentes transportes que inicia por Web Sockets y en caso de no ser soportados hace un proceso de fallback entre los diferentes tipos de conexión que soporta.</p>

<p>El proceso de fallback a grandes rasgos sería el siguiente, primero intentaría conectar por <strong>web sockets</strong>, en caso de no poder conectarse lo intentará con <strong>Server Sent Events</strong>, <strong>Forever Frames</strong> y <strong>Long Pollig</strong> sucesivamente hasta lograr una conexión.</p>

<p>Una de las características principales de <strong>SignalR</strong> es que nos permite simular una conexión persistente en el caso del HTTP y administra la conexión con web sockets que sí soportan una conexión persistente.</p>

<p><strong>SignalR</strong> nos da también la habilidad de hacer "push" desde el servidor hacia el cliente, evitando que el cliente tenga que realizar conexiones al servidor para validar si existe nueva información, <strong>SignalR</strong> evita esto permitiendo al servidor realizar callback a los clientes. </p>

<h3 id="creandonuestroprimersignalrhub">Creando nuestro primer Signalr Hub</h3>

<p>Lo primero que haremos es instalar los paquetes de Nuget que nos darán acceso a las características de <strong>SignalR</strong> en nuestro servidor.</p>

<p>Para esto iremos a la consola de Nuget y agregaremos la siguiente línea.  </p>

<pre><code class="language-csharp">Install-Package WindowsAzure.MobileServices.Backend.SignalR  
</code></pre>

<p>Una vez hemos agregado los paquetes a nuestro proyecto Web podemos crear nuestro hub, en este ejemplo crearemos un método que nos permita enviar un mensaje a todos los clientes conectados.  </p>

<pre><code class="language-csharp">[HubName("ChatHub")]
    public class ChatHub : Hub
    {
        public ApiServices Services { get; set; }

        public void Send(string message)
        {
            Clients.All.helloMessage(message);
        }
    }
</code></pre>

<blockquote>
  <p><strong>Nota:</strong> Clients.All no es la única manera en la que podemos enviar mensajes, también tenemos <strong>Caller</strong>, <strong>Others</strong>, <strong>AllExcept</strong>, etc. te invito al leer el siguiente <a href="https://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-server">post</a> para más información.</p>
</blockquote>

<p>Después en el archivo WebApiConfig agregaremos el siguiente código para iniciar los servicios de <strong>SignalR</strong>.  </p>

<pre><code class="language-csharp">public static class WebApiConfig  
    {
        public static void Register()
        {
           //Initialize SignalR
           SignalRExtensionConfig.Initialize();            
        }
    }
</code></pre>

<h3 id="conectandonuestraaplicacin">Conectando nuestra aplicación</h3>

<p>Ahora agregaremos los paquetes de Nuget para habilitar los servicios de <strong>SignalR</strong> en el cliente, como podrás notar en este ejemplo utilizaremos una aplicación universal.</p>

<p>Agrega la siguiente línea en la consola de Nuget.  </p>

<pre><code class="language-csharp">Install-Package Microsoft.AspNet.SignalR.Client  
</code></pre>

<p>Una vez se instalen los paquetes agregaremos el siguiente código para conectarnos con los servicios de SignalR.  </p>

<pre><code class="language-csharp">private IHubProxy proxy;  
private HubConnection hubConnection;

private async Task ConnectToSignalR()  
{
   //Se crea el hub utilizando la url de nuestro Mobile Service
   hubConnection = new HubConnection(App.MobileService.ApplicationUri.AbsoluteUri);  

   //Agregamos en los headers la llave de Mobile Service, de lo contrario no nos permitirá realizar la conexión 
   hubConnection.Headers["x-zumo-application"] = App.MobileService.ApplicationKey;

   //Creamos un proxy para conectarnos con el hub de chat que hemos creado previamente
   proxy = hubConnection.CreateHubProxy("ChatHub");
   // Iniciamos la conexión
   await hubConnection.Start();

   //Utilizaremos el método On para recibir la notificación cada vez que se utilice el mensaje "helloMessage".
   proxy.On&lt;string&gt;("helloMessage", async (msg) =&gt;
   {
      await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =&gt;
      {
         message += " " + msg;
         Message.Text = message;
      });
   });
}
</code></pre>

<p>Al navegar a la página conectaremos con el hub.  </p>

<pre><code class="language-csharp"> protected override async void OnNavigatedTo(NavigationEventArgs e)
 {          
    await ConnectToSignalR();
 }
</code></pre>

<p>Después agregaremos el siguiente código en un botón para enviar información desde nuestra app y no solo recibir.  </p>

<pre><code class="language-csharp">private async void Button_OnClick(object sender, RoutedEventArgs e)  
{
   //Utilizaremos el método invoke cuando deseemos enviar un mensaje desde nuestra aplicación
   await proxy.Invoke&lt;string&gt;("Send", TextBox.Text);
   TextBox.Text = string.Empty;
}
</code></pre>

<h3 id="escalandoconazureservicebus">Escalando con Azure Service Bus</h3>

<p>En este caso al utilizar <strong>Mobile Service</strong> y tener un nivel de servicio básico o estándar (como es el caso que he platicado anteriormente) te tengo una buena noticia, ya tenemos habilitado <strong>Azure Service Bus</strong> para sincronizar nuestra entrega de mensajes en los clientes sin importar cuantas instancias tengamos trabajando. ¡Excelente! ¿No te parece? <br>
La siguiente es una imagen que explica cómo funciona SignalR en conjunto con <strong>Azure Service Bus</strong>.</p>

<p><img src="https://saturninopimentel.com/content/images/2015/11/scaleout32.png" alt=""></p>

<blockquote>
  <p><strong>Nota:</strong> <strong>Azure Service Bus</strong> a pesar de ser un muy buen servicio no es el único con el que puedes trabajar ya que SignlR te permite trabajar también con Redis y con SQL Server.</p>
</blockquote>

<p>Ahora ya podemos enviar mensajes en tiempo real a través de nuestras aplicaciones.</p>

<p>Te dejo él código del proyecto de ejemplo en <a href="https://github.com/Satur01/DemoSignalR">github</a>, como siempre espero te resulte útil y no olvides compartir.</p>

<p>¡Saludos!</p>]]></content:encoded>
    </item>
    <item>
      <title>Hola UWP: Detectar la familia de dispositivos</title>
      <link>https://docs.microsoft.com/archive/blogs/juank/hola-uwp-detectar-la-familia-de-dispositivos</link>
      <pubDate>Thu, 12 Nov 2015 11:06:15 GMT</pubDate>
      <dc:creator><![CDATA[Juankk]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/juank/2015/11/12/hola-uwp-detectar-la-familia-de-dispositivos/</guid>
      <description><![CDATA[Con Windows 10 podemos crear una sola aplicación y hacer que esta se ejecute en diferentes...]]></description>
      <content:encoded><![CDATA[<p>Con <strong>Windows 10</strong> podemos crear una sola aplicación y hacer que esta se ejecute en diferentes dispositivos, con esta diversidad de dispositivos es probable que se piense que se limita la funcionalidad, pero no es así ya que las aplicaciones UWP cuentan con APIs y herramientas específicas para cada familia de dispositivos que nos permiten crear experiencias únicas.</p>

<p>En este post vamos a ver como reconocer a cada una de las diferentes familias, para ello vamos a crear un nuevo proyecto y en el MainPage.xaml.cs vamos a agregar la siguiente referencia.</p>

<pre><code class="language-csharp">using Windows.System.Profile;  
</code></pre>

<p>Después vamos a agregar una propiedad que va a contener un mensaje con el nombre de la familia a la que pertenece el dispositivo la cual vamos a obtener a través de la propiedad <strong>DeviceFamily</strong> de la clase <strong>VersionInfo</strong>. </p>

<pre><code class="language-csharp">public string DeviceFamily = $"La familia del dispositivo es:{AnalyticsInfo.VersionInfo.DeviceFamily}";  
</code></pre>

<p>Entre los posibles resultados que arrojará esta propiedad se listan los siguientes:</p>

<ul>
<li><strong>Windows.Desktop</strong></li>
<li><strong>Windows.Mobile</strong></li>
<li><strong>Windows.Xbox</strong></li>
<li><strong>Windows.IoT</strong></li>
</ul>

<p>Por último vamos a utilizar un atado de datos con <a href="https://saturninopimentel.com/xbind-viene-en-camino/">x:Bind</a> para vincular la propiedad con el TextBlock y listo podemos ejecutar nuestro aplicación y saber en qué familia de dispositivos se esta ejecutando nuestra aplicación.</p>

<pre><code class="language-csharp">&lt;StackPanel&gt;  
    &lt;TextBlock Text="¡Hola UWP!" FontSize="24" FontWeight="Light" Margin="12" /&gt;
    &lt;TextBlock Text="{x:Bind DeviceFamily}" Margin="12,0,0,0" /&gt;
&lt;/StackPanel&gt;  
</code></pre>

<p>Ahora podemos conocer a que familia pertenece el dispositivo donde se está ejecutando nuestra aplicación y hacer los cambios que consideremos necesarios, espero les resulte útil ¡Saludos!</p>]]></content:encoded>
    </item>
    <item>
      <title>Hola UWP: Hola Universal Windows Platform</title>
      <link>https://docs.microsoft.com/archive/blogs/juank/hola-uwp-hola-universal-windows-platform</link>
      <pubDate>Mon, 26 Oct 2015 12:07:54 GMT</pubDate>
      <dc:creator><![CDATA[Juankk]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/juank/2015/10/26/hola-uwp-hola-universal-windows-platform/</guid>
      <description><![CDATA[El post originar lo puedes leer en el blog de Satur

Con la salida de Windows 10 han llegado las...]]></description>
      <content:encoded><![CDATA[<p>El post originar lo puedes leer en <a href="https://saturninopimentel.com/hola-uwp-hola-universal-windows-platform/">el blog de Satur</a></p>

<p>Con la salida de Windows 10 han llegado las <strong>Universal Windows Platform Apps</strong> y ahora dedicaré un tiempo para escribir una serie acerca de cómo iniciarse en el desarrollo de estas aplicaciones y algunos cambios que son importantes. Resolvamos primero la siguiente pregunta.</p>

<h2 id="qusonlasuniversalwindowsplatform">¿Qué son las Universal Windows Platform?</h2>

<p>En resumen, las aplicaciones <strong>Universal Windows Platform</strong> son las nuevas aplicaciones de Windows 10, las cuales incluyen un núcleo común para todos los dispositivos con Windows 10 y que además incluye un API específica para cada una de las familias de dispositivos, permitiéndonos desarrollar aplicaciones con tiempo, esfuerzo y recursos menores en los diferentes dispositivos de la familia Windows 10 comparado con el desarrollo por separado.</p>

<blockquote>
  <p>Si necesitas más información puedes ver la presentación que he realizado hace algún tiempo en este <a href="https://www.slideshare.net/Josesaturninopimentel/windows-10-technical-preview-tools">link</a> o ver el siguiente <a href="https://www.youtube.com/watch?v=A8CZwG73nt8">vídeo</a>.</p>
</blockquote>

<h2 id="lasherramientas">Las herramientas</h2>

<p>Veamos las herramientas que nos serán necesarias para el desarrollo de estas aplicaciones.  </p>

<h3 id="visualstudio2015ymicrosoftblend">Visual Studio 2015 y Microsoft Blend</h3>

<p>Primero vamos a necesitar <strong>Visual Studio 2015</strong> en cualquiera de sus versiones <strong><em>Enterprise</em></strong>, <strong><em>Professional</em></strong> o <strong><em>Community</em></strong> que además incluyen <strong>Blend</strong> (una herramienta para hacer interfaces de usuario mucho más atractivas con menor esfuerzo que en <strong>Visual Studio</strong>).</p>

<p>Te dejo el link donde puedes descargar la versión <strong><em>Community</em></strong> y ver precios de las otras versiones <a href="https://www.visualstudio.com/en-us/products/vs-2015-product-editions.aspx">aquí</a>.</p>

<p align="center">  
<img src="https://saturninopimentel.com/content/images/2015/10/vs2015.png" alt="Visual Studio">
</p>  

<p>  
<img src="https://saturninopimentel.com/content/images/2015/10/blend-2015.png" alt="">
</p>  

<h3 id="sdkdedesarrollo">SDK de desarrollo</h3>

<p>Por lo general al inicio de la instalación de <strong>Visual Studio 2015</strong> se te ofrece la opción de agregar las herramientas de desarrollo para <strong>Universal Windows Platform Apps</strong>, selecciónala y el asistente instalará todo lo necesario, asegúrate de seleccionar también los emuladores.  </p>

<p>  
<img src="https://saturninopimentel.com/content/images/2015/10/VS_Tools.png" alt="">
</p>  

<p>Si no elegiste la instalación anterior siempre puedes descargar el SDK por separado en el <a href="https://dev.windows.com/en-us/downloads">Dev Center</a>, solo tienes que buscar la opción que aparece en la siguiente imagen y descargar el instalador.  </p>

<p>  
<img src="https://saturninopimentel.com/content/images/2015/10/sdkwin10.png" alt="sdk">
</p>

<h2 id="creandonuestroprimerproyectouwp">Creando nuestro primer proyecto UWP</h2>

<p>Para generar nuestra primer aplicación <strong>UWP</strong>, solo tienes que ir al menú <strong>File -> New -> Project</strong>. <br>
<img src="https://saturninopimentel.com/content/images/2015/10/hw10uwp1.png" alt="uwp1">
A continuación, seleccionemos la opción <strong>Windows</strong> y después una aplicación en blanco tal como se muestra en la siguiente figura. <br>
<img src="https://saturninopimentel.com/content/images/2015/10/hw10uwp2.png" alt="uwp2"></p>

<p>Cambiemos un poco el código de <strong>MainPage.xaml</strong> y agreguemos la siguiente línea dentro del Grid.</p>

<pre><code class="language-csharp">&lt;TextBlock Text="¡Hola Windows 10!" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="35"&gt;&lt;/TextBlock&gt;  
</code></pre>

<p>Ahora compilemos, ejecutemos nuestra aplicación y ¡Listo!</p>

<p><img src="https://saturninopimentel.com/content/images/2015/10/mainpage.png" alt=""></p>

<p>Si tienes acceso a una raspberry con <a href="https://saturninopimentel.com/instalar-windows-10-iot-en-raspberry-pi-2/">Windows 10 IoT</a> también puedes ejecutar la aplicación y puedes probar en los dispositivos móviles con Windows 10.</p>

<blockquote>
  <p>Una pregunta que surgió en un grupo y que considero es común, es como podemos quitar el contador de frames que aparece en la esquina superior izquierda el cual es útil para monitorear aplicaciones que utilicen muchos gráficos, la respuesta es muy sencilla solo tenemos que cambiar el valor de la propiedad <strong>EnableFrameRateCounter</strong> a <strong>false</strong> en el archivo <strong>App.xaml.cs</strong>.</p>
</blockquote>

<pre><code class="language-csharp">#if DEBUG
    if (System.Diagnostics.Debugger.IsAttached)
    {
        this.DebugSettings.EnableFrameRateCounter = false;
    }
#endif
</code></pre>

<h2 id="culeslaestructurageneraldelosuniversalwindowsplatform">¿Cuál es la estructura general de los Universal Windows Platform?</h2>

<p>Existen componentes comunes en todos los proyectos <strong>UWP</strong> y que van a resultar conocidos para todos los desarrolladores que tengan experiencia con proyectos con XAML,veamos los más relevantes.</p>

<h3 id="losarchivosappxamlyappxamlcs">Los archivos App.xaml y App.xaml.cs</h3>

<p><strong>App.xaml.cs</strong> es el archivo de entrada a todas las aplicaciones <strong>UWP</strong> y contiene los métodos que se encargan de controlar los eventos de activación (el cual es sobrescrito) y suspensión. 
En el proyecto que hemos generado por default nos ha agregado una llamada al método <strong>InitializeComponent()</strong> también ha inicializado <strong>Application Insights</strong>(Un sistema de monitorización que veremos más adelante) y ha agregado el método encargado de controlar el evento <em>Suspending</em>.  </p>

<p align="center">  
<img src="https://saturninopimentel.com/content/images/2015/10/hw10uwp3.png" alt="">
</p>  

<h3 id="nuestrapginaprincipalmainpage">Nuestra página principal MainPage</h3>

<p>Esta vista está compuesta por <strong>MainPage.xaml</strong> y <strong>MainPage.xaml.cs</strong> y hereda de la clase <strong>Page</strong>, en la primera podemos manejar todos nuestros elementos gráficos de una manera muy cómoda y en el segundo archivo podemos agregar toda nuestra lógica y manejadores de eventos, aunque como hemos visto en una serie anterior en aplicaciones empresariales lo más recomendable es implementar el patrón <strong>MVVM</strong>.</p>

<blockquote>
  <p>Para mayor información del patrón MVVM visita el siguiente <a href="https://saturninopimentel.com/tag/mvvm/">link</a></p>
</blockquote>

<h3 id="elarchivodemanifiestodelpaquete">El archivo de manifiesto del paquete</h3>

<p>En el archivo <strong>Package.appxmanifest</strong> se encuentra la descripción y la identificación de tu aplicación, es en este archivo donde podemos agregar <strong><em>capabilities</em></strong> y <strong><em>extensions</em></strong> además de que puedes administrar las pantallas de inicio, los <strong><em>Tiles</em></strong> y logos. Para modificar este archivo, no es necesario que conozcas todos los tags XML de cada una de las características ya que contamos con el <strong><em>Manifest editor</em></strong> (editor de manifiesto) que nos permite manejar todo de una forma gráfica, ¿Fácil no?</p>

<p><img src="https://saturninopimentel.com/content/images/2015/10/Package-appxmanifest.png" alt="Package.appxmanifest"></p>

<h3 id="elfolderdereferencias">El folder de referencias</h3>

<p>Es común en todos los proyectos utilizar librerías adicionales de terceros y estas están dentro del folder <em>references</em> en el cual puedes también almacenar los archivos de los paquetes que agregues de Nuget.</p>

<h3 id="laspropiedadesdelproyecto">Las propiedades del proyecto</h3>

<p>El archivo de propiedades es donde puedes definir como se compilará tu proyecto, actualizar las versiones de tu proyecto y configuraciones para hacer <em>debug</em> de tu proyecto entre otras cosas.</p>

<p>Con esto llegamos al final de este post, te invito a suscribirte a la lista de correos para mantenerte informado de las nuevas entradas de esta serie antes que nadie y si tienes alguna duda puedes encontrarme en twitter como <a href="https://twitter.com/SaturPimentel">@saturpimentel</a>.</p>

<p>Nos vemos. <br>
¡Saludos!</p>]]></content:encoded>
    </item>
    <item>
      <title>Interactive Window en el siguiente update de Visual Studio 2015</title>
      <link>https://docs.microsoft.com/archive/blogs/juank/interactive-window-en-el-siguiente-update-de-visual-studio-2015</link>
      <pubDate>Tue, 13 Oct 2015 08:35:01 GMT</pubDate>
      <dc:creator><![CDATA[Juankk]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/juank/2015/10/13/interactive-window-en-el-siguiente-update-de-visual-studio-2015/</guid>
      <description><![CDATA[El update 1 de Visual Studio 2015 se encuentra en CTP (Consumer Technical Preview) y está disponible...]]></description>
      <content:encoded><![CDATA[<p>El update 1 de Visual Studio 2015 se encuentra en <strong>CTP</strong> (<strong>Consumer Technical Preview</strong>) y está disponible desde el 8 de octubre de este año.</p>

<p align="center">

<blockquote class="twitter-tweet" lang="es"><p lang="en" dir="ltr">New news that&#39;s new... Today we released Visual Studio 2015 Update 1 CTP - <a href="https://t.co/7bKKNMwd6F">https://t.co/7bKKNMwd6F</a> Read all about it. <a href="https://t.co/Xr4mAChShB">pic.twitter.com/Xr4mAChShB</a></p>&mdash; Visual Studio (@VisualStudio) <a href="https://twitter.com/VisualStudio/status/652270502732529664">octubre 8, 2015</a></blockquote>  
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

</p>

<p>Después de ver el tweet fui a la página y revisé las nuevas características que pronto veremos en <strong>Visual Studio 2015</strong>. </p>

<p>Una de las que más llamó mi atención fue <strong>Interactive Window</strong>, esta pequeña ventana nos va a permitir probar pequeñas piezas de código de una manera rápida y sencilla sin la necesidad directa de compilar y ejecutar nuestro proyecto en curso o generar otro (algo que al menos una vez todos hemos hecho).</p>

<h2 id="quesinteractivewindow">¿Qué es Interactive Window?</h2>

<p><strong>Interactive Window</strong> es una REPL que soporta características como el <strong>IntelliSense</strong> dentro de <strong>Visual Studio 2015</strong>.</p>

<p>Según wikipedia un <a href="https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop">REPL</a> es:</p>

<blockquote>
  <p>Un read–eval–print loop (REPL), es un simple, entorno interactivo de programación computacional que toma entradas de usuario individuales (es decir expresiones individuales), las evalúa y retorna el resultado al usuario; un programa escrito en un entorno REPL es ejecutado en trozos. </p>
</blockquote>

<p>Activar esta ventana es muy sencillo, solo tienes que instalar el update 1 de <strong>Visual Studio 2015</strong> y seleccionar la opción <code>View &gt; Other Windows &gt; C# Interactive</code>.  </p>

<p align="center">  
<img src="https://saturninopimentel.com/content/images/2015/10/view.png" alt="">
</p>

<h3 id="contextoasncronoypblico">Contexto asíncrono y público.</h3>

<p>Esta herramienta soporta por el momento la versión 6.0 de C#, <br>
el contexto es por default asíncrono y tiene un nivel de acceso <strong>public</strong> para variables y métodos, aun cuando el contexto es asíncrono puede trabajar con código no asíncrono, como en el siguiente ejemplo  </p>

<p align="center">  
<img src="https://saturninopimentel.com/content/images/2015/10/csi-1.png" alt="">
</p>  

<p align="center">  
<img src="https://saturninopimentel.com/content/images/2015/10/csi-async.png" alt="">
</p>

<h3 id="pantallaparaenumerables">Pantalla para Enumerables</h3>

<p>Una de las cosas que más me ha gustado es el soporte que tiene para <strong>LINQ to objects</strong> y lo sencillo que es entender el resultado.  </p>

<p align="center">  
<img src="https://saturninopimentel.com/content/images/2015/10/csi-LINQ.png" alt="">
</p>

<h3 id="caractersticasinteractivas">Características interactivas</h3>

<p>Esta herramienta es muy fácil de utilizar con solo presionar <code>enter</code> podremos evaluar nuestros <em>snippets</em> de código, también contamos con un histórico de navegación que podemos utilizar utilizando las combinaciones de teclas <code>alt + flecha arriba</code> y <code>alt + flecha abajo</code>.</p>

<p>Podemos navegar en el editor de una forma simple e intuitiva y las acciones de copiar y pegar mantienen el formato y puedes utilizar los clásicos shortcuts  <code>ctrl + c</code> y <code>ctrl + v</code>.</p>

<p>Esta ventana también tiene soporte de múltiples líneas y además tienes disponible la capacidad de selección de los snippets.</p>

<h3 id="caractersticasdeedicin">Características de edición</h3>

<p>Como he mencionado anteriormente tenemos disponible <strong>IntelliSense</strong> además de buscar y reemplazar.  </p>

<p align="center">  
<img src="https://saturninopimentel.com/content/images/2015/10/csi-intellisense.png" alt="">
</p>

<h3 id="comandos">Comandos</h3>

<p><strong>Interactive Window</strong> tiene soporte para algunos comandos que pueden resultarte útiles y se listan a continuación.</p>

<ul>
<li><strong>#r</strong> nos da la capacidad de agregar referencias a ensamblados por ejemplo <code>'turuta\ensamblado.dll'</code> </li>
</ul>

<p align="center">  
<img src="https://saturninopimentel.com/content/images/2015/10/csi-async.png" alt="">
</p>  

<ul>
<li><strong>#load</strong> con este comando puedes cargar archivos scripts de c# (.csx) </li>
<li><strong>#clear</strong> o <strong>#cls</strong> para limpiar la pantalla</li>
<li><strong>#help</strong> para ayuda, por si solo muestra la lista de comandos, pero si especificas el comando te muestra la documentación disponible.</li>
<li><strong>#reset</strong> para reiniciar <strong>Interactive Window</strong> a su estado inicial.</li>
</ul>

<h2 id="interactivewindowtambinestdisponibleenlneadecomandos">Interactive Window también está disponible en línea de comandos</h2>

<p>Con algunas limitaciones evidentes, como la falta de <strong>IntelliSense</strong> y otras inherentes a la consola podemos tener acceso a C# Interactive.</p>

<p>Para ello solo tienes que iniciar la consola de <strong>Visual Studio 2015</strong> y teclear <strong>csi</strong>.</p>

<p align="center">  
<img src="https://saturninopimentel.com/content/images/2015/10/csi-console.png" alt="">
</p>

<h2 id="conclusin">Conclusión</h2>

<p>En lo personal me ha gustado esta nueva herramienta ya que me permitirá probar código y verificar el resultado de algunas operaciones sin necesidad de ejecutar ni tener que crear proyectos solo para probar alguna funcionalidad.</p>

<p>Para mantenerse al tanto de la documentación del proyecto de <strong>Interactive Window</strong> pueden hacerlo <a href="https://github.com/dotnet/roslyn/wiki/Interactive-Window">aquí</a> y si quieren probar el update 1 de <strong>Visual Studio 2015</strong> pueden hacerlo <a href="https://www.microsoft.com/en-us/download/details.aspx?id=49189">aquí</a>, solo tengan muy en cuenta que es una versión <strong>CTP</strong> por lo tanto aun no es una versión final (advertidos están :D).</p>

<p>Por último, dejo algunas preguntas para ti. <br>
¿Qué te parece esta nueva herramienta?
¿En que escenarios la utilizarías?</p>

<p>¡Saludos!</p>]]></content:encoded>
    </item>
    <item>
      <title>Lab de Azure para desarrolladores - Fundamentos de Websites</title>
      <link>https://docs.microsoft.com/archive/blogs/juank/lab-de-azure-para-desarrolladores-fundamentos-de-websites</link>
      <pubDate>Thu, 24 Sep 2015 08:29:00 GMT</pubDate>
      <dc:creator><![CDATA[Juankk]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/juank/2015/09/24/lab-de-azure-para-desarrolladores-fundamentos-de-websites/</guid>
      <description><![CDATA[Intermedio

Hola, este es el primero de una serie de HOL(= Hands On Lab)  que he diseñado para que...]]></description>
      <content:encoded><![CDATA[<p><label itemprop="proficiencyLevel" class="label label-warning">Intermedio</label></p>

<p>Hola, este es el primero de una serie de HOL(= Hands On Lab)  que he diseñado para que aprendas los fundamentos sitios web en Azure.</p>

<h2 id="comoobtenerunasuscripcinenazure">Como obtener una suscripción en Azure</h2>

<p>Puedes obtnerlas de muchas formas</p>

<ol>
<li>A través del trial, este trial es de 200 USD que te regala microsoft para que pruebes lo que quieras: <a href="https://azure.microsoft.com/en-us/pricing/free-trial/">Try it Now</a> Aunque es gratis se requiere tarjeta de crédito, más como un procedimiento de verificación que cualquier cosa. Te descuentan un dolar de prueba y en 24 horas te lo devuelven  </li>
<li>Con una suscripción normal de pago  </li>
<li>Por medio del programa <a href="https://www.bizspark.com/">BizSpark</a>, si eres emprendedor puedes registrarte en este programa y Microsoft te apoyara en tu emprendimiento con un montón de beneficios, entre los que se encuentran 150 USD al mes durante tres años para consumir servicios en Azure. Puedes ver este video para más info:  </li>
</ol>

<div itemprop="video" itemscope="" itemtype="https://schema.org/VideoObject" class="videoWrapper">  
  <meta itemprop="name" content="Microsoft Apoya a Emprendedores!">
  <meta itemprop="duration" content="T9M15">
  <meta itemprop="url" content="https://youtu.be/XJr5iS80Nac">
  <meta itemprop="thumbnail" content="https://i1.ytimg.com/vi/XJr5iS80Nac/0.jpg">
<iframe src="https://www.youtube.com/embed/XJr5iS80Nac" frameborder="0" allowfullscreen></iframe>  
</div>  

<p>4 . Si tu, o la empresa para la que trabajas tienen una suscripción a MSDN esta viene tambien con un bono mensual gratuito para consumir servicios en Azure. <br>
5. Sitios web de Azure que duran una hora y es GRATIS <a href="https://trywebsites.azurewebsites.net/?language=cs">Try Azure WebSites</a></p>

<h2 id="tarea1crearunsitiowebgratuitoycompartido">Tarea 1 - Crear un sitio web gratuito y compartido</h2>

<h3 id="utilizandoelportaldeazure">Utilizando el portal de Azure</h3>

<p>1.Navegamos al portal de azure <a href="https://manage.windowsazure.com/">manage.windowsazure.com</a> <br>
2.Dentro del panel de opciones seleccionamos <strong>Aplicaciones Web</strong> <br>
<img src="https://juank.io/content/images/2015/05/SNAG-00.png" alt="azure websites"></p>

<p>3.En el menu inferior damos click en Nuevo <br>
<img src="https://juank.io/content/images/2015/03/HOL-01.png" alt="azure websites"></p>

<p>4.Se desplegará un menú para crear un nuevo sitio web, donde seleccionamos "Creación personalizada" <br>
<img src="https://juank.io/content/images/2015/05/SNAG-01.png" alt="azure websites"></p>

<p>5.Configuramos el sitio de la siguiente forma, asegurate de personalizar tu nombre, escoge la opción de sitio web gratuito y base de datos gratuita. Sino tienes una base de datos gratuita procede a crear una nueva con las configuraciones por defecto.En plan de hospedaje asegúrate de utilizar Este de EEUU (Gratis) <br>
<img src="https://juank.io/content/images/2015/03/HOL-04.png" alt="azure websites"></p>

<p>6.Asegurate de nombrar la base de datos de una forma adecuada, para que siempre sepas que base de datos es. <br>
7.De la misma forma, para este ejercicio, en el panel siguiente crea un nuevo servidor de base datos, para efectos de este laboratorio usaremos los siguientes datos de acceso</p>

<ul>
<li><strong>Usuario</strong>: JuanK</li>
<li><strong>PassWord</strong>: DevCamp2015</li>
<li><strong>Región</strong>: Este de EEUU</li>
</ul>

<p><img src="https://juank.io/content/images/2015/03/HOL-06.png" alt="azure websites"></p>

<p>8.Seguidamente hay que establecer el repositorio, seleccionaremos "Repositorio Git Local" <br>
<img src="https://juank.io/content/images/2015/03/HOL-05.png" alt="azure websites"></p>

<ol>
<li><p>Eso es todo hemos creado nuestro primer sitio web. Dentro del panel de Azure damos click en nuestro sitio creado y a continuación click en "Examinar" <br>
<img src="https://juank.io/content/images/2015/03/HOL-07.png" alt="azure websites"></p></li>
<li><p>En el browser se abrirá el nuevo sitio creado con su contenido por defecto <br>
<img src="https://juank.io/content/images/2015/03/HOL-09.png" alt="azure websites"></p></li>
</ol>

<h3 id="utilizandoxplat">Utilizando X-Plat</h3>

<p>Hay muchas formas para crear un sitio web en azure, la más normal es a través del portal como lo acabamos de hacer, sin embargo en un entorno profesional para desarrolladores o ITpro es necesario recurrir a la automatización por ello revisaremos formas alternativas de crear un sitio web.</p>

<p>1.Abrir la consola de <a href="https://go.microsoft.com/?linkid=9828653&amp;clcid=0x409">X-Plat</a>, para ello abrimos una consola de comandos pulsando en el teclado [Windows] + [R], allí escribimos <strong>CMD</strong> y presionamos [ENTER] <br>
<img src="https://juank.io/content/images/2015/03/HOL-10.png" alt="azure websites"></p>

<p>2.En la consola de comandos ingresamos el siguiente comando, lo cual producirá la siguiente salida</p>

<pre><code>    azure
</code></pre>

<p><img src="https://juank.io/content/images/2015/03/HOL-11.png" alt="azure websites"></p>

<p>3.Para ver las opciones disponibles para crear un sitio web ingresamos.Esto nos mostrará la lista completa de comandos para crear un sitio web desde X-plat.</p>

<pre><code>azure site  
</code></pre>

<p>4.Para poder trabajar con X-PLat necesitamos adicionar nuestra cuenta de Azure, nos aseguraremos de solo trabajar con ella por el momento. Para ello ingresamos el siguiente comando  </p>

<pre><code>azure account clear  
azure account download  
</code></pre>

<p>5.El último comando ingresado lanzará una ventana del browser, es posible que se requiera autenticación, pero una vez realizada el browser cargará la siguiente página <br>
<img src="https://juank.io/content/images/2015/03/HOL-12.png" alt="azure websites"></p>

<p>6.Esto descargará un archivo <strong>.publishsettings</strong> con el conjunto de credenciales, asegúrate de guardarlos en una ubicación adecuada.</p>

<pre><code> azure account import "K:\MyDownloads\MSDN-credentials.publishsettings"
</code></pre>

<p>7.Ahora haremos uso del comando <strong>create</strong> así que ingresamos el siguiente comando para ver el detalle de su uso.  </p>

<pre><code>azure site create -h  
</code></pre>

<p>8.El cual nos devolverá algo como esto:  </p>

<pre><code>Create a web site

Usage: site create [options] [name]

Options:  
  -h, --help                       output usage information
  -v, --verbose                    use verbose output
  --json                           use json output
  --location &lt;location&gt;            the geographic region to create the website
  --hostname &lt;hostname&gt;            the custom host name to use
  --slot &lt;slot&gt;                    the name of the slot
  --git                            Configure git on web site and local folder
  --gitusername &lt;gitusername&gt;      the publishing username for git
  --github                         Configure github on web site and local folder
  --githubusername &lt;username&gt;      the github username
  --githubpassword &lt;password&gt;      the github password
  --githubrepository &lt;repository&gt;  the github repository full name (i.e. user/repository)
  -s, --subscription &lt;id&gt;          the subscription id
</code></pre>

<p>9.Con esta información podemos proceder a crear un nuevo website, ingresaremos el siguiente comando, la ejecución tardará un poco.  </p>

<pre><code>azure site create --location "East US" --git juank2  
</code></pre>

<p>10.Puedes cambiar <strong>juank2</strong> por el nombre que desees, de seguro ese nombre ya esta ocupado. En el ejemplo hemos usado la ubicación "East US", para obtener una lista de las diferentes ubicaciones para websites puedes ingresar este comando el cual dará la siguiente respuesta.  </p>

<pre><code>site location list

Name  
----------------
South Central US  
North Europe  
West Europe  
North Central US  
West US  
East Asia  
East US  
Southeast Asia  
East US 2  
Japan West  
Japan East  
Central US  
Brazil South  
site location list command OK  
</code></pre>

<p>11.Desde el portal revisa que el sitio se haya creado de forma exitosa y abre la URL de la misma forma en como lo hiciste en la <a href="https://juank.io/#utilizandoelportaldeazure">Utilizando el portal de Azure</a>.</p>

<h2 id="tarea2crearunsitiowebbsicoyconocersusfuncionalidadeswordpress">Tarea 2 - Crear un sitio web - Básico y conocer sus funcionalidades - Wordpress</h2>

<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>  
<!-- Banner inline -->  
<ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-5101019755195877" data-ad-slot="4724147342" data-ad-format="auto"></ins>
<script>  
(adsbygoogle = window.adsbygoogle || []).push({});
</script>

<p>1.Navegamos al portal de azure <a href="https://manage.windowsazure.com/">manage.windowsazure.com</a> <br>
2.Dentro del panel de opciones seleccionamos <strong>Aplicaciones Web</strong> <br>
<img src="https://juank.io/content/images/2015/05/SNAG-00.png" alt="azure websites"></p>

<p>3.En el menu inferior damos click en Nuevo <br>
<img src="https://juank.io/content/images/2015/03/HOL-01.png" alt="azure websites"></p>

<p>4.Seleccionamos la opción "De la galería" <br>
<img src="https://juank.io/content/images/2015/03/HOL-13.png" alt="azure websites"></p>

<p>5.En el recuadro escogemos "Blogs" y seguidamente "WordPress" <br>
<img src="https://juank.io/content/images/2015/03/HOL-14.png" alt="azure websites"></p>

<p>6.Seguidamente debemos configurar el blog, seleccionamos</p>

<ul>
<li>"Crear una nueva bsae de datos MySQL"</li>
<li>Este de EEUU Gratis</li>
</ul>

<p><img src="https://juank.io/content/images/2015/03/HOL-15.png" alt="azure websites"></p>

<p>7.En la siguiente pantalla configuramos la BD MYSql, con un nombre adecuado y la misma región seleccionada para el website. <br>
<img src="https://juank.io/content/images/2015/03/HOL-16.png" alt="azure websites" title=""> </p>

<p>8.Eso es todo hemos creado nuestro primer sitio web. Dentro del panel de Azure damos click en nuestro sitio creado y a continuación click en "Examinar" <br>
<img src="https://juank.io/content/images/2015/03/HOL-07.png" alt="azure websites"></p>

<p>9.Arrancará una pantalla de configuración para wordpress <br>
<img src="https://juank.io/content/images/2015/03/HOL-16.png" alt="azure websites"></p>

<p>10.Revisa la pestaña con el icono de nube <img alt="Inicio rápido" src="https://juank.io/images/QuickStart_Cloud.png"> allí encontrarás acceso directo a otras funcionalidades del sitio <br>
11.En la parte inferior se ubican los controles de Inicio, Apagado y Reinicio del sitio entre otras opciones <br>
<img src="https://juank.io/content/images/2015/03/HOL-17.png" alt="azure websites"></p>

<p>12.En la pestaña "Configurar" encontraremos múltiples opciones pero para este caso debemos notar estas, porque se encuentra activado el soporte para PHP. <br>
<img src="https://juank.io/content/images/2015/03/HOL-18.png" alt="azure websites"></p>

<p>13.En la pestaña "Escalar" debemos notar que tenemos un sitio web de tipo "Gratis" por lo que la barra de desplazamiento se encuentra bloqueada <br>
14.Damos click en "Compartido", más abajo en número de instancias movemos la barra hasta 3 y presionamos "Guardar" <br>
<img src="https://juank.io/content/images/2015/03/HOL-19.png" alt="azure websites"></p>

<p>15.Lo que acabamos de hacer es configurar nuestro sitio con más capacidad, ahora no solo no tiene las limitaciones de un sitio web gratuito, sino que ahora se encunetra en un hosting compartido y nos permite crear varias instancias del mismo sitio a manera de cluster para balancear el consumo del mismo en tres servidores. Otra ventaja de los sitios "Compartidos" versus los "Gratis" es que puedes asociar nombres de dominio personalizados.</p>

<h2 id="tarea3crearunsitiowebbsicoyconocersusfuncionalidadesjava">Tarea 3 - Crear un sitio web - Básico y conocer sus funcionalidades - Java</h2>

<p>1.Navegamos al portal de azure <a href="https://manage.windowsazure.com/">manage.windowsazure.com</a> <br>
2.Dentro del panel de opciones seleccionamos <strong>Aplicaciones Web</strong> <br>
<img src="https://juank.io/content/images/2015/05/SNAG-00.png" alt="azure websites"></p>

<p>3.En el menu inferior damos click en Nuevo <br>
<img src="https://juank.io/content/images/2015/03/HOL-01.png" alt="azure websites"></p>

<p>4.Seleccionamos la opción "De la galería" <br>
<img src="https://juank.io/content/images/2015/03/HOL-13.png" alt="azure websites"></p>

<p>5.Seleccionamos "Apache Tomcat" <br>
<img src="https://juank.io/content/images/2015/03/HOL-20.png" alt="azure websites"></p>

<p>6.En la siguiente pantalla nombramos el website y escogemos el tipo de sitio/región que vamos a crear <br>
<img src="https://juank.io/content/images/2015/03/HOL-21.png" alt="azure websites"></p>

<p>7.Una vez creado el sitio procedamos a la pestaña "Configuración" Allí notaremos que aunque la opción de java esta deshabilitada en el portal , este comportamiento puede ser modificado en el archivo de configuración del web server para la aplicación. <br>
8.Navegamos al portal de azure <a href="https://manage.windowsazure.com/">manage.windowsazure.com</a> <br>
9.Dentro del panel de opciones seleccionamos <strong>websites</strong> <br>
<img src="https://juank.io/content/images/2015/03/HOL-00.png" alt="azure websites"></p>

<p>10.En el menu inferior damos click en Nuevo <br>
<img src="https://juank.io/content/images/2015/03/HOL-01.png" alt="azure websites"></p>

<p>11.Seleccionamos "Creación Rápida", configuramos nombre y región "Este de EEUU Básico" o crear un nuevo plan de hospedaje en esa misma Zona. <br>
<img src="https://juank.io/content/images/2015/03/HOL-22.png" alt="azure websites"></p>

<p>12.Exploramos el sitio como lo hemos hecho en otras oportunidades, y veremos <br>
<img src="https://juank.io/content/images/2015/03/HOL-23.png" alt="azure websites"></p>

<p>13.Vamos a la pestaña "Configuración" y encendemos las opciones que se ven a continuación, seguidamente presionamos guardar. <br>
<img src="https://juank.io/content/images/2015/03/HOL-24.png" alt="azure websites"></p>

<p>14.Exploramos el sitio nuevamente y obtendremos <br>
<img src="https://juank.io/content/images/2015/03/HOL-25.png" alt="azure websites"></p>

<p>15.Ahora el sitio soporta java de acuerdo a la configuración del portal <br>
16.En el portal de Azure vamos a la pestaña "Escalar" puesto que así lo configuramos desde su creación, en la parte inferior podemos mover el slider hasta 3 instancias, pero a diferencia del modo Compartido revisado anteriormente ahora trabajamos con instancias de computo dedicadas exclusivamente para nuestras aplicaciones. <br>
17.Otra cosa importante de notar es que ahora podemos escoger la capacidad de estas instancias de computo. Para este ejercicio el sitio debes configurarlo en modo básico y dos instancias del tamaño mostrado en la gráfica. <br>
<img src="https://juank.io/content/images/2015/03/HOL-26.png" alt="azure websites"></p>

<p>18.Recuerda grabar. <br>
19.Configurar el sitio como básico te da acceso a otras funcionalidades de la plataforma, en la pestaña "Configuración" revisa los settings que aparecen a continuación, estas funcionalidades no están disponibles en sitios configurados como "Compartido" o "Gratis" <br>
<img src="https://juank.io/content/images/2015/03/HOL-27.png" alt="azure websites"></p>

<p><img src="https://juank.io/content/images/2015/03/HOL-28.png" alt="azure websites"></p>

<p><img src="https://juank.io/content/images/2015/03/HOL-29.png" alt="azure websites"></p>

<h2 id="tarea4crearunsitiowebestndaryconocersusfuncionalidadesaspnetmvc">Tarea 4 - Crear un sitio web - Estándar y conocer sus funcionalidades - ASP.Net MVC</h2>

<p>1.Abrimos Visual Studio, creamos un nuevo proyecto [File > New project] de tipo "ASP.Net Web Application" <br>
<img src="https://juank.io/content/images/2015/03/HOL-31.png" alt="azure websites"></p>

<p>2.En la configuración seleccionamos <br>
<img src="https://juank.io/content/images/2015/03/HOL-32.png" alt="azure websites"></p>

<p>3.Escogemos un nombre par el sitio y lo configuramos como se ve a continuación <br>
<img src="https://juank.io/content/images/2015/05/SNAG-04.png" alt="azure websites"></p>

<p>4.Visual Studio por si mismo creará el website de Azure y asociara el proyecto con este. Es probable que en este proceso se te solicite autenticación. <br>
5.Presionamos [F5] para lanzar el sitio localmente, una vez lanzado se debe ver así. <br>
<img src="https://juank.io/content/images/2015/03/HOL-34.png" alt="azure websites"></p>

<p>6.Desde Visual Studio detenemos el sitio web <br>
<img src="https://juank.io/content/images/2015/03/HOL-35.png" alt="azure websites"></p>

<p>7.Click derecho sobre el proyecto y seleccionamos "Publicar" <br>
<img src="https://juank.io/content/images/2015/03/HOL-36.png" alt="azure websites"></p>

<p>8.En el diálogo siguiente validaremos la conexión <br>
9.Si todo está bien, y debería estarlo damos click en publicar <br>
<img src="https://juank.io/content/images/2015/03/HOL-37.png" alt="azure websites"></p>

<p>10.El sitio se lanza automáticamente en el browser puedes cambiar el tamaño de la ventana para ver como el sitio se adapta automáticamente, esto se llama diseño responsive y esta presente gracias a que la plantilla  de ASP.Net esta creada con un framework de CSS para tal fin: <a href="https://getbootstrap.com/">BootStrap</a>. ASP.Net es compatible con tecnologías estándar de punta como HTML5, CSS3 y javascript. <br>
<img src="https://juank.io/content/images/2015/03/HOL-38.png" alt="azure websites"></p>

<p>11.El sitio ya se encuentra publicado en Azure, vamos a la pestaña "Configuración" y nos aseguramos que este configurado como "Estándar" <br>
12.Aumentaremos el número de instancias a 4 y guardamos. Tengamos atención en la parte resaltada en rojo <br>
<img src="https://juank.io/content/images/2015/03/HOL-39.png" alt="azure websites"></p>

<p>13.Los sitios estándar tienen todos los beneficios de estar en la nube. No solo podemos cambiar el tamaño de las instancias de computo y aumentar el número de instancias, sino que ademas podemos crear un sitio elástico. Es decir un sitio que sea capaz de aumentar o reducir el número de instancias según se requiera. Para qué? para solo utilizar lo que se necesita y por ende solo pagar por lo que realmente se usa. En adición a tener un sitio que responde de manera inmediata a diferentes volúmenes de usuarios. <br>
14.Seleccionamos la opción de escalar por CPU, configuramos luego de la siguiente forma:</p>

<ul>
<li>Número mínimo de instancias: 3</li>
<li>Número máximo de instancias: 8</li>
<li>CPU Mínima: 30</li>
<li>CPU Máxima: 80
<img src="https://juank.io/content/images/2015/03/HOL-40.png" alt="azure websites"></li>
</ul>

<p>15.Lo que acabamos de hacer no es otra cosa que establecer la forma en que mi sitio escalará de manera elástica, le hemos indicado que cada que el promedio de uso CPU esté por debajo del 30% se deben apagar instancias de computo hasta llegar a un mínimo 3. Y que cada vez que el promedio de CPU esté por encima del 80% encienda nuevas instancias de computo hasta un máximo de 8.  Guardemos los cambios y exploremos el sitio. <br>
16.Tener un sitio estándar tiene aún más flexibilidad para configurar la escalabilidad de la aplicación. Damos click en el botón "Configurar horas de programación" <br>
<img src="https://juank.io/content/images/2015/03/HOL-41.png" alt="azure websites"></p>

<p>17.Configuramos horas de programación adicionales marcando las casillas que se muestran en la imagen. <strong>Lee lo que dice cada una de ellas</strong> <br>
<img src="https://juank.io/content/images/2015/03/HOL-42.png" alt="azure websites"></p>

<p>18.Al aplicar los cambios ahora podemos escoger nuevos valores de la lista, cada uno de ellos nos permite crear diferentes programaciones según si es de noche o de día o si estamos en un fin de semana. <br>
<img src="https://juank.io/content/images/2015/03/HOL-43.png" alt="azure websites"></p>

<p>19.Seleccionemos la opción "Noche de la semana" configurándola como se ve a continuación. Analiza el porque esta configuración puede ser conveniente. <br>
<img src="https://juank.io/content/images/2015/03/HOL-44.png" alt="azure websites"></p>

<p>20.Guarda los cambios, selecciona ahora "Fin de semana" y en número de instancias coloca solo 21.Analiza el porque esta configuración puede ser o no ser conveniente. <br>
<img src="https://juank.io/content/images/2015/03/HOL-45.png" alt="azure websites"></p>

<p>22.Vamos al menú configuración y habilitamos la siguiente opción. <br>
<img src="https://juank.io/content/images/2015/03/HOL-46.png" alt="azure websites"></p>

<p>23.Normalmente cuando un sitio web entra en desuso, es decir deja de recibir visitas por un tiempo, el web server baja el sitio de la memoria, lo cual no esta mal pero cuando alguien  vaya a visitar el sitio después de este periodo inactivo sentirá el sitio un poco lento mientras el web server termina de cargarlo en memoria nuevamente. Esta opción le indica al web server que nunca baje el sitio de memoria aunque este se encuentre inactivo. <br>
24.En el portal de Azure vamos a la pestaña "Copias de Seguridad". Ahora que nuestro sitio está en modo estándar podemos automatizar la generación de copias. Explora estas opciones. Sino tienes una cuenta de almacenamiento en Azure puedes crearla en esta opción. <br>
<img src="https://juank.io/content/images/2015/03/HOL-47.png" alt="azure websites"></p>

<p><strong>FIN</strong></p>]]></content:encoded>
    </item>
    <item>
      <title>Lo nuevo en C# 6.0 interpolación de cadenas</title>
      <link>https://docs.microsoft.com/archive/blogs/juank/lo-nuevo-en-c-6-0-interpolacin-de-cadenas</link>
      <pubDate>Tue, 22 Sep 2015 23:26:47 GMT</pubDate>
      <dc:creator><![CDATA[Juankk]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/juank/2015/09/22/lo-nuevo-en-c-6-0-interpolacin-de-cadenas/</guid>
      <description><![CDATA[En c# 6.0 no existen grandes nuevos conceptos en comparación con su antecesor, en cambio existen...]]></description>
      <content:encoded><![CDATA[<p>En c# 6.0 no existen grandes nuevos conceptos en comparación con su antecesor, en cambio existen muchas nuevas características para ayudarnos a hacer nuestro código más legible. <br>
<strong>string interpolation</strong> es una de estas nuevas características y en este vídeo veremos cómo utilizarlas y cuáles son sus ventajas en comparación de <strong>string.format</strong>.</p>

<iframe src="https://channel9.msdn.com/Series/Ninja-Tips/14-Ninja-Tips-Csharp-6-Interpolacion-de-cadenas/player" width="960" height="540" allowfullscreen frameborder="0"></iframe>]]></content:encoded>
    </item>
    <item>
      <title>Lo nuevo en C# 6.0 nameof</title>
      <link>https://docs.microsoft.com/archive/blogs/juank/lo-nuevo-en-c-6-0-nameof</link>
      <pubDate>Tue, 22 Sep 2015 23:25:55 GMT</pubDate>
      <dc:creator><![CDATA[Juankk]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/juank/2015/09/22/lo-nuevo-en-c-6-0-nameof/</guid>
      <description><![CDATA[En C# 6.0 no existen grandes nuevos conceptos en comparación con su antecesor, en cambio existen...]]></description>
      <content:encoded><![CDATA[<p>En C# 6.0 no existen grandes nuevos conceptos en comparación con su antecesor, en cambio existen muchas nuevas características para ayudarnos a hacer nuestro código más legible.</p>

<p><strong>nameof</strong> es una de estas nuevas características y en este vídeo veremos cómo utilizarlas y cuáles son sus características.</p>

<iframe src="https://channel9.msdn.com/Series/Ninja-Tips/15-Ninja-Tips-csharp-6-name-of/player" width="960" height="540" allowfullscreen frameborder="0"></iframe>]]></content:encoded>
    </item>
    <item>
      <title>Lo nuevo en C# 6.0 using static</title>
      <link>https://docs.microsoft.com/archive/blogs/juank/lo-nuevo-en-c-6-0-using-static</link>
      <pubDate>Tue, 22 Sep 2015 23:22:55 GMT</pubDate>
      <dc:creator><![CDATA[Juankk]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/juank/2015/09/22/lo-nuevo-en-c-6-0-using-static/</guid>
      <description><![CDATA[En c# 6.0 no existen grandes nuevos conceptos en comparación con su antecesor, en cambio existen...]]></description>
      <content:encoded><![CDATA[<p>En c# 6.0 no existen grandes nuevos conceptos en comparación con su antecesor, en cambio existen muchas nuevas características para ayudarnos a hacer nuestro código más legible. <br>
<strong>using static</strong> es una de estas nuevas características y en este vídeo veremos cómo utilizarlas y cuáles son sus ventajas.</p>

<iframe src="https://channel9.msdn.com/Series/Ninja-Tips/16-Ninja-Tips-C-6-using-static/player" width="960" height="540" allowfullscreen frameborder="0"></iframe>]]></content:encoded>
    </item>
  </channel>
</rss>