Técnicas de Aprendizaje automático y Azure Machine Learning

Estaba pendiente determinar la técnica de aprendizaje a usar en la anterior entrada Pasos para realizar un experimento de Aprendizaje Automático. En esta entrada se describen las principales técnicas existentes de aprendizaje automático. Estas técnicas se pueden clasificar en función de la información que se quiere predecir.
La entrada se organiza en función de esta clasificación:

Módulos de Regresión (Regression)

Técnicas que predicen un dato en función de datos de entrada. Por ejemplo, el precio de un vehículo en función de sus características.

  • Regresión Lineal:
    Método estadístico. En Azure Machine Learning, el módulo Linear Regression.

    VariablePredecida = B0 + B1[Variable1] + B2[Variable2] + … + BN[VariableN] + Error

  • Arboles de Decisión:
    Crea un árbol donde en cada nodo se asocia un decisión en función de una variable. En Azure Machine Learning, el módulo Decision Forest Regression.
    Formula Árbol de decisión
  • Gradient Tree Boosting:
    Aplica una técnica que combina múltiples arboles de decisión. En Azure Machine Learning, el módulo Boosted Decision Tree Regression.
  • Redes Bayesianas:
    Aplica una técnica que combina un grafo de nodos y método de probabilidad que se adapta en los casos que los valores de las variables están influenciados entre ellos. Hay que tener en cuenta que es un método costoso; a mayor numero de variables y valores.
  • Redes Neuronales:
    Aplica una malla de nodos (perceptores) que recibe unos pesos de entradas que se pueden activar (activation function) y generar unos pesos de salida. Los nodos de inicio de la red neuronal son nuestras variables de entrada (deben ser numéricas) y los nodos finales nuestra variable de salida. Es un método que requiere de un gran numero de datos para obtener resultados óptimos. En Azure Machine Learning, el módulo Neural Network Regression.

Módulos de clasificación (Classification)

Técnicas que clasifican la información en un grupo mediante una etiqueta o clase. Por ejemplo, el tipo de vehículo en función de sus características. Incluye todas las técnicas anteriores de regresión.

Módulos de Agrupación (Clustering)

Técnicas que clasifican los datos en grupos, pero a diferencia de la técnica anterior los grupos no se conocen a priori. Es el sistema quien determina los grupos a partir de los patrones obtenidos de los datos. En este caso el grupo creado se llama cluster. Por ejemplo, extraer los segmentos que agrupan nuestros clientes.

Módulos de Recomendación (Recomendation Engines)

Realiza recomendaciones de datos en función de un análisis de los mismos. Por ejemplo, recomendar productos en función de los productos en la cesta de compra. En Azure Machine Learning, se deben utilizar los módulos Train Matchbox Recommender y Score Matchbox Recommender.

Publicado en Azure, Machine Learning | Etiquetado , | Deja un comentario

Pasos para realizar un experimento de Aprendizaje Automático y Azure Machine Learning

En esta entrada se describen los pasos estándar para realizar un experimento de aprendizaje automático y su equivalencia en Azure Machine Learning.
En la galería de ML publique un experimento muy simple que realiza una predicción del precio de un vehículo en función de sus características.

Pasos para realizar un experimento de Aprendizaje Automático

  • 1.- Determinar el objetivo del experimento. Generalmente se inicia con una pregunta a responder. En nuestro caso, puedo determinar el precio de un vehículo en función de sus características?
  • 2.- Obtener los datos. En Azure Machine Learning, estos pueden ser obtenidos de múltiples fuentes (maquina local, Blob Storage, Sql, Url…) y en diferentes formatos (CSV, Excel, OData…). La datos se obtienen:
    • Mediante el módulo Reader que permite acceder a las múltiples fuentes externas; a excepción de la maquina local.
    • Los Saved Datasets que contienen datos almacenados. Para adjuntar datos de la maquina local debemos crear un Saved Dataset.
      AzureML Cargar Datos
  • 3.- Preparar los datos para su posterior análisis.
    • Validar datos vacíos o nulos en las columnas. En Azure Machine Learning disponemos del módulo Missing Values Scrubber que nos ayuda en esta tarea.
    • Validar la corrección de tipos en los datos de las columnas.
    • Validar la corrección de valores en los datos de las columnas.
    • Validar ciertos formatos de datos (Por ejemplo: fechas, emails…)
    • Aglutinar datos similares (Por ejemplo: Irlanda, República de Irlanda, Eire, Eir… pero no Irlanda del Norte).
    • AzureML Preparar Datos

  • 4.- Determinar los elementos clave a analizar. Es un paso fundamental sobretodo en volúmenes grandes de datos ya que sino realizamos la correcta elección gastaremos tiempo de proceso analizando datos innecesarios y también reduciremos la precisión de la predicción. En Azure Machine Learning disponemos del módulo Filter Based Feature Selection que nos ayuda en esta tarea; también podemos determinar directamente la columnas a analizar mediante el módulo Project Columns.
    AzureML Determinar Elementos Clave
  • 5.- Aplicar la técnica de aprendizaje automático. La técnica de análisis se aplica sobre un subconjunto de los datos obteniendo un modelo (entrenamos nuestro experimento). El módulo Train Model es el que realiza dicha tarea que alimentamos con el subconjunto de datos obtenido mediante el módulo Split.
    AzureML Aplicar Tecnica Analisis
    En otra entrada futura se describirán las técnicas de aprendizaje automático de la información y sus usos ;-).
  • 6.- Evaluar los resultados del Experimento. El modelo generado en el paso anterior se aplica sobre el En Azure Machine Learning disponemos del módulo Evaluate Model que nos ayuda en esta tarea. Una buena técnica es aplicar varias técnicas en el paso anterior y evaluar la que nos ofrece mejores resultados. En el siguiente enlace se muestra un ejemplo.
    AzureML Evaluar Experimento
Publicado en Azure, Machine Learning | Etiquetado | 1 comentario

Información del Sistema en PowerShell

System Information en PowerShell

Se enumeran comandos útiles de PowerShell para determinar información del Sistema:

  • Versión de PowerShell
    (Get-Host).Version
    
  • PowerShell de 32 bits
  • # $True it's running PowerShell 32 bits
    # $False it's running PowerShell 64 bits
    [IntPtr]::size -eq 4
    
  • Versión de Sistema Operativo
    $major = [environment]::OSVersion.Version.Major
    $minor = [environment]::OSVersion.Version.Minor
    

    En función del valor de estas variables y la siguiente tabla anexa podemos determinar el Sistema Operativo.

    Sistema Operativo $major $minor
    Windows 8.1 6 3
    Windows Server 2012 R2 6 3
    Windows 8 6 2
    Windows Server 2012 6 2
    Windows 7 6 1
    Windows Server 2008 R2 6 1
    Windows Server 2008 6 0
    Windows Vista 6 0
    Windows Server 2003 R2 5 2
    Windows Home Server 5 2
    Windows Server 2003 5 2
    Windows XP Professional x64 Edition 5 2
    Windows XP 5 1
    Windows 2000 5 0
  • Versión de Internet Information Server
  • Get-ItemProperty "HKLM:\software\microsoft\InetStp";
    
Publicado en PowerShell, Sistemas | Deja un comentario

Ejecutar comando PowerShell al crear la maquina virtual de Azure

En la anterior entrada vimos la posibilidad de crear una maquina de Azure mediante Powershell. En esta nueva maquina nos puede resultar interesante que se ejecute un comando PowerShell para acabar de configurar ciertos aspectos de la misma. Así dispondríamos de la maquina lista para nuestro uso; sin necesidad de realizar nosotros ninguna tarea repetitiva.

Ejecutando el comando en la creación de la maquina

  • 1.- Creamos el script a ejecutar en la maquina virtual. Por ejemplo test.ps1.
    #Script that creates a directory 
    mkdir("c:\basura2");
    
  • 2.- Ejecutamos NewMachineOnAzure con el nuevo parámetro RunScript donde se indica el script a ejecutar.
    ./NewMachineOnAzure -RunScript "test.ps1"
    
  • 3.- De esta manera al crear la maquina nos ejecutará nuestro script. Podemos visualizar, si lo vemos necesario el log de ejecución en el fichero
    C:\WindowsAzure\Logs\Plugins\Microsoft.Compute.CustomScriptExtension\1.2\CustomScriptHandler.log de la maquina virtual.
    Log de Ejecución Script

    Log de Ejecución Script

Como funciona

Hay un comando de PowerShell Set-AzureVMCustomScriptExtension que permite indicar un script a ejecutar. El script debe estar disponible en una url.

  • 1.- Creamos un contenedor publico donde subir el script.

    $containerStorage = "scripts";	
    New-AzureStorageContainer $containerStorage -Permission Blob
    
  • 2.- Subimos el fichero de script al contenedor.
    $file = ".\" + $RunScript
    Set-AzureStorageBlobContent -Blob $RunScript -Container $containerStorage -File $file
    
  • 3.- Indicamos el script a ejecutar, indicando la url del fichero subido en el paso anterior.
    $fileUri = "https://" + $StorageAccountName + ".blob.core.windows.net/" + $containerStorage + "/" + $RunScript;
    $vmConfig = $vmConfig | Set-AzureVMCustomScriptExtension -FileUri $fileUri -Run $RunScript
    

Nuevo Script NewMachineOnAzure

Os adjunto el nuevo script actualizado ;-)

################################################################################################################################################################  
# This script Create a Virtual Machine on Azure
#
# To run the script
#  
# ./NewMachineOnAzure -NameMachine "testrodrijp"
################################################################################################################################################################  
Param(  
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $NameMachine = "",
# Specifies the size of the instance. Allowed values are ExtraSmall, Small, Medium, Large, ExtraLarge, A5, A6,
# A7, A8, A9, Basic_A0, Basic_A1, Basic_A2, Basic_A3, Basic_A4, Standard_D1, Standard_D2, Standard_D3,
# Standard_D4, Standard_D11, Standard_D12, Standard_D13, Standard_D14.	
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $InstanceSize = "Small",
# ImagesFor Example to Search Windows 2008 images
# Get-AzureVMImage | Where { $_.ImageName -like "*2008*" } 
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $Image = "bd507d3a70934695bc2128e3e5a255ba__RightImage-Windows-2008R2-SP1-x64-iis75-v5.8.8",
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $User = "administrador",
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $Password = "Poner1Passw",
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $TimeZone = "GMT Standard Time",
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $ServiceName = "",
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $Location = "West Europe",
#The storage account name must be unique to Azure and must be between 3 and 24 characters in length and use lowercase letters and numbers only.	
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $StorageAccountName = "",
        [Parameter(ValueFromPipeline=$true)]
	[string] $RunScript = ""
)

#Setting Default Parameters
if ($NameMachine -eq "") {
	$NameMachine = "a" + [guid]::NewGuid().ToString("N").substring(0,14);
}
if ($ServiceName -eq "") {
	$ServiceName = $NameMachine;
}
if ($StorageAccountName -eq "") {
	$StorageAccountName = $NameMachine;	
}
$StorageLabel = $NameMachine + "Storage";

#Log-in on Subscription
Add-AzureAccount

#Create Storage Account needed by Azure Virtual Machine & Setting it on AzureSubscription
New-AzureStorageAccount -StorageAccountName $StorageAccountName -Label $StorageLabel -Location $Location
$SubscriptionName =  (Get-AzureSubscription -Current).SubscriptionName
Set-AzureSubscription -SubscriptionName $SubscriptionName -CurrentStorageAccountName $StorageAccountName

#Create Virtual Machine
$vmConfig = New-AzureVMConfig -Name $NameMachine -InstanceSize $InstanceSize -Image $Image
$vmConfig = $vmConfig | Add-AzureProvisioningConfig -Windows -AdminUserName $User -Password $Password -TimeZone $TimeZone
if ($RunScript -ne "") {
	$containerStorage = "scripts";	
    New-AzureStorageContainer $containerStorage -Permission Blob
	$file = ".\" + $RunScript
    Set-AzureStorageBlobContent -Blob $RunScript -Container $containerStorage -File $file
	$fileUri = "https://" + $StorageAccountName + ".blob.core.windows.net/" + $containerStorage + "/" + $RunScript;
	$vmConfig = $vmConfig | Set-AzureVMCustomScriptExtension -FileUri $fileUri -Run $RunScript
}
$vmConfig | New-AzureVM -ServiceName $ServiceName -Location $Location

Write-Host "Virtual Machine: " $NameMachine " creatted!!!"
Publicado en Azure, PowerShell | Etiquetado | Deja un comentario

PowerShell y Creación de una maquina virtual en Azure a tan solo un click

Siguiendo con PowerShell, disponemos también de la librería Microsoft Azure PowerShell. Esta librería nos permite trabajar directamente contra Azure sin necesidad de usar el portal. A tan solo un click podemos crear una máquina que nos puede ser muy útil, en diferentes operativas:

  • Para realizar test en diferentes entornos.
  • Realizar pruebas de instalacción de aplicativos.
  • Para crear rápidamente entornos de preproducción/producción.

Crear una maquina virtual con un Script de PowerShell

  • 1.- Descargar Modulo de Azure PowerShell en el siguiente enlace: http://go.microsoft.com/fwlink/p/?linkid=320376&clcid=0x40a
  • 2.- Importar el Modulo instalado en PowerShell
    Import-Module "C:\Program Files (x86)\Microsoft SDKs\Azure\PowerShell\ServiceManagement\Azure\Services\ShortcutStartup.ps1"
    
  • 3.- Ejecutar script de Creación de Maquina Virtual
    ./NewMachineOnAzure
    

    o

    ./NewMachineOnAzure -NameMachine "testrodrijp"
    

Script NewMachineOnAzure

Por defecto la maquina que se crea es Small, en West Europe y utiliza una Imagen de Windows 2008. En el script se pueden sobrescribir estos parámetros por defecto. Por ejemplo, para una maquina Medium con un Ubutu:

./NewMachineOnAzure -InstanceSize "Medium" -Image "0b11de9248dd4d87b18621318e037d37__RightImage-Ubuntu-12.04-x64-v5.8.8"

Hay un comando de PowerShell New-AzureQuickVM que permite realizar gran parte de la funcionalidad de este script. En nuestro caso hemos utilizado otra combinación de llamadas (New-AzureVMConfig, Add-AzureProvisioningConfig y New-AzureVM) que nos permite desplegar más parámetros adicionales. Por ejemplo en nuestro caso la maquina virtual por defecto usa horario UTC.

################################################################################################################################################################  
# This script Create a Virtual Machine on Azure
#
# To run the script
#  
# ./NewMachineOnAzure -NameMachine "testrodrijp"
################################################################################################################################################################  
Param(  
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $NameMachine = "",
# Specifies the size of the instance. Allowed values are ExtraSmall, Small, Medium, Large, ExtraLarge, A5, A6,
# A7, A8, A9, Basic_A0, Basic_A1, Basic_A2, Basic_A3, Basic_A4, Standard_D1, Standard_D2, Standard_D3,
# Standard_D4, Standard_D11, Standard_D12, Standard_D13, Standard_D14.	
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $InstanceSize = "Small",
# ImagesFor Example to Search Windows 2008 images
# Get-AzureVMImage | Where { $_.ImageName -like "*2008*" } 
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $Image = "bd507d3a70934695bc2128e3e5a255ba__RightImage-Windows-2008R2-SP1-x64-iis75-v5.8.8",
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $User = "administrador",
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $Password = "Poner1Passw",
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $TimeZone = "GMT Standard Time",
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $ServiceName = "",
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $Location = "West Europe",
#The storage account name must be unique to Azure and must be between 3 and 24 characters in length and use lowercase letters and numbers only.	
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $StorageAccountName = ""
)

#Setting Default Parameters
if ($NameMachine -eq "") {
	$NameMachine = "a" + [guid]::NewGuid().ToString("N").substring(0,14);
}
if ($ServiceName -eq "") {
	$ServiceName = $NameMachine;
}
if ($StorageAccountName -eq "") {
	$StorageAccountName = $NameMachine;	
}
$StorageLabel = $NameMachine + "Storage";

#Log-in on Subscription
Add-AzureAccount

#Create Storage Account needed by Azure Virtual Machine & Setting it on AzureSubscription
New-AzureStorageAccount -StorageAccountName $StorageAccountName -Label $StorageLabel -Location $Location
$SubscriptionName =  (Get-AzureSubscription -Current).SubscriptionName
Set-AzureSubscription -SubscriptionName $SubscriptionName -CurrentStorageAccountName $StorageAccountName

#Create Virtual Machine
$vmConfig = New-AzureVMConfig -Name $NameMachine -InstanceSize $InstanceSize -Image $Image
$vmConfig = $vmConfig | Add-AzureProvisioningConfig -Windows -AdminUserName $User -Password $Password -TimeZone $TimeZone
$vmConfig | New-AzureVM -ServiceName $ServiceName -Location $Location

Write-Host "Virtual Machine: " $NameMachine " creatted!!!"

Script DeleteMachineOnAzure

También tenemos la posibilidad de borrar la maquina virtual creada con otro script.

./DeleteMachineOnAzure -NameMachine "testrodrijp"

OJO!!! también se borra automáticamente la cuenta de Storage asociada. Si la cuenta que creamos en su día al crear la maquina la hubiésemos usado para otros servicios, podríamos tener problemas ;-).

################################################################################################################################################################  
# This script Delete a Virtual Machine on Azure
#
# To run the script
#  
# ./DeleteMachineOnAzure -NameMachine "testrodrijp"
################################################################################################################################################################  
Param(  
	[Parameter(ValueFromPipeline=$true, Mandatory=$True)]  	
	[string] $NameMachine,
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $ServiceName = "",
#The storage account name must be unique to Azure and must be between 3 and 24 characters in length and use lowercase letters and numbers only.	
	[Parameter(ValueFromPipeline=$true)]  	
	[string] $StorageAccountName = ""
)

#Setting Default Parameters
if ($ServiceName -eq "") {
	$ServiceName = $NameMachine;
}
if ($StorageAccountName -eq "") {
	$StorageAccountName = $NameMachine;	
}

#Log-in on Subscription
Add-AzureAccount

Remove-AzureVM -ServiceName $ServiceName -Name $NameMachine -DeleteVHD;

#Remove Azure Storage Account
$SubscriptionName =  (Get-AzureSubscription -Current).SubscriptionName;
Set-AzureSubscription -SubscriptionName $SubscriptionName -CurrentStorageAccountName $StorageAccountName;
#Wait until VHD are deleted (is Asynchronous Operation).
$AlredyExist = $true;
while($AlredyExist) 
{
	Write-Host "Waitting VHD deleted..."
	$AlredyExist = $false;
	$blobs = Get-AzureStorageBlob -Container "vhds" | select Name;
	foreach($blob in $blobs)
	{
		if ($blob.Name.EndsWith(".vhd")) { $AlredyExist = $true; }
	}
	Start-Sleep -m 20000
}
#VHD are deleted but there's a *.status file ¿?. 
$blobs = Get-AzureStorageBlob -Container "vhds" | select Name;
foreach($blob in $blobs)
{
	Remove-AzureStorageBlob -Container "vhds" -Blob $blob.Name 
}

Remove-AzureService -ServiceName $ServiceName -Force;
Remove-AzureStorageAccount -StorageAccountName $StorageAccountName  

Write-Host "Virtual Machine: " $NameMachine " removed!!!"
Publicado en Azure, PowerShell | Etiquetado | 1 comentario

PowerShell y Administración de IIS

PowerShell, es una tecnología que permite ejecutar comandos de Windows. Es muy útil para realizar tareas repetitivas como instalaciones complejas de aplicaciones, procesos de mantenimiento…

Compatibilidad

En función de las diferentes versiones de Windows tendremos acceso a las diferentes versiones de PowerShell:

  • Windows Server 2003: No viene instalado por defecto, pero se puede instalar hasta la versión de PowerShell 2.0. Requiere previamente de instalar NET Framework 2.0. Si quisieramos instalar PowerShell 2.0 y previamente estuviera instalado PowerShell 1.0; deberiamos desinstalarlo o eliminar la clave del registro HKLM\SOFTWARE\Microsoft\Powershell\1.
  • Windows Server 2008 anterior a SP2:No viene instalado por defecto, pero se puede instalar hasta la versión de PowerShell 2.0 x86 o PowerShell 2.0 x64. Si opcionalmente queremos usar el editor integrado de PowerShell debemos instalar Microsoft .NET Framework 3.5 Service Pack 1.
  • Windows Server 2008 SP2: Viene instalado por defecto PowerShell 2.0.
  • Windows Server 2012:Disponible PowerShell 3.0 y PowerShell 4.0.

Compatibilidad Librería WebAdministration

En PowerShell se pueden añadir librerías que aportan más funcionalidad para trabajar en configuraciones más especificas del Sistema. Por ejemplo, PowerShell incorpora la libreria WebAdministration para trabajar con configuraciones del IIS. Para ello debemos activar IIS Management Console en nuestro servidor.

  • IIS 6.0: No hay librería disponible. Una alternativa que disponemos es la ejecución de Objectos WMI de IIS.
  • IIS 7.0: Previamente debemos instalar el PowerShell Snap-In for IIS 7.0
    Add-PSSnapIn WebAdministration
    
  • IIS 7.5 o Superior: Por defecto esta instalada.
    Import-Module WebAdministration
    

Creación de un Application/Web Site en IIS

El siguiente ejemplo de PowerShell crea una aplicación en el IIS; independiente de la versión de IIS de este.
Los parámetros necesarios son:

  • appName: Nombre de la aplicación.
  • appPath: Directorio de instalación.
  • appDefaultDocument: Pagina por defecto.
  • appPoolName: Application pool que usará la aplicación.

Adicionalmente internamente fuerza que la aplicación se ejecute en NET 4.0 en modo integrado.

################################################################################################################################################################  
# This script Create IISWebApp
#
# To run the script
#  
# ./CreateIISWebApp -appPath "C:directory" -appName "ExampleApp" -appDefaultDocument "Start.aspx" -appPoolName "DefaultAppPool"
################################################################################################################################################################  

Param(  
    [Parameter(Mandatory=$true, ValueFromPipeline=$true)]  
    [string] $appPath,  
    [Parameter(Mandatory=$true, ValueFromPipeline=$true)]  
    [string] $appName, 
    [Parameter(ValueFromPipeline=$true)]  
    [string] $appDefaultDocument = "", 
	[Parameter(Mandatory=$true, ValueFromPipeline=$true)]  
	[string] $appPoolName
)

$appPoolNameNetFrameworkVersion = "v4.0"
$appPoolNameManagedPipelineMode = "Integrated"
$appEnableAnonymousAuthentication = $true


Write-Host "###### CreateIISWebApp ######"
Write-Host "######appPath:"$appPath  
Write-Host "######appName:"$appName  
Write-Host "######appDefaultDocument:"$appDefaultDocument  
Write-Host "######appPoolName:"$appPoolName  

$iisVersion = Get-ItemProperty "HKLM:softwaremicrosoftInetStp";
Write-Host "Creating Web Application"$appName" on IIS:" $iisVersion.MajorVersion"."$iisVersion.MinorVersion

if ($iisVersion.MajorVersion -eq 6)
{
    $DefaultWebSiteWmiName = "W3SVC/1/ROOT/";
    $AppNameWmiName = $DefaultWebSiteWmiName + $appName;
    $creationArgs = @{Name = ($AppNameWmiName)}
    $vDir = set-wmiinstance -Class IIsWebVirtualDir -Namespace rootmicrosoftiisv2 -Arguments $creationArgs;
    $vDir.Put();
    $filter = "Name = '" + $AppNameWmiName + "'"
    $vDirSetting = get-wmiobject -Class IIsWebVirtualDirSetting -Namespace rootmicrosoftiisv2 -Filter $filter 
    $vDirSetting.AppFriendlyName = $appName
    $vDirSetting.Path = $appPath
    if ($appDefaultDocument -ne "") {
        $vDirSetting.Properties["DefaultDoc"].Value = $appDefaultDocument + "," + $vDirSetting.Properties["DefaultDoc"].Value
    }
    $vDirSetting.Put();
    $vDir = get-wmiobject -Class IIsWebVirtualDir -Namespace rootmicrosoftiisv2 -Filter $filter 
    $vDir.AppCreate3(2, $appPoolName, 1);
    c:WINDOWSMicrosoft.NETFrameworkv4.0.30319aspnet_regiis -s $AppNameWmiName
    return
}
if ($iisVersion.MajorVersion -eq 7)
{
    if ($iisVersion.MinorVersion -ge 5)
    {
        Import-Module WebAdministration;
    }           
    else
    {
        if (-not (Get-PSSnapIn | Where {$_.Name -eq "WebAdministration";})) {
            Add-PSSnapIn WebAdministration;
        }
    }
}
if ($iisVersion.MajorVersion -ge 7)
{
        Import-Module WebAdministration;
}

$siteName = "Default Web Site"
$appNamePath = "IIS:sites" + $siteName + "" + $appName
$app = New-WebApplication -Name $appName -ApplicationPool $appPoolName -PhysicalPath $appPath -Site $siteName

$DefaultDocumenentfilter = "/system.WebServer/defaultdocument/files"

if ($appDefaultDocument -ne "") {
    Write-Host "   -Setting Default Document:"$appDefaultDocument"..."
	Add-WebConfiguration $DefaultDocumenentfilter $appNamePath -atIndex 0 -Value @{value=$appDefaultDocument}
}

Set-WebConfigurationProperty -filter /system.WebServer/security/authentication/AnonymousAuthentication -name enabled -value $appEnableAnonymousAuthentication -PSPath $appNamePath

Nota

Para poder ejecutar scripts; es necesario autorizar a PowerShell ;-)

Set-ExecutionPolicy Unrestricted
Publicado en IIS, PowerShell, Sistemas | Etiquetado , , , | Deja un comentario

Número de usuarios conectados a la Web

SignalR nos permite conocer el numero de usuarios conectados a una aplicación Web.

Como funciona

SignalR nos ofrece eventos para registrar conexiones o desconexiones al Hub.

  • Al iniciar una conexión $.connection.hub.start(); al iniciar nuestra pagina Web, se dispara el evento OnConnected.
  • Al parar una conexión $.connection.hub.stop(); al cerrar nuestra pagina Web; se dispara el evento OnDisconnected.
  • Si cerramos el navegador a los 30 segundos por defecto se dispara el evento OnDisconnected.

En estos eventos:

  • En el evento OnConnected añadimos la conexión (ConnectionId) en una lista de Usuarios conectados.
  • En el evento OnDisconnected eliminamos la conexión (ConnectionId) de la lista de Usuarios conectados.

public class KnowUserHub : Hub
{
        /// <summary>
        /// The list of users connected.
        /// </summary>
        public static List<string> Users = new List<string>();

        /// <summary>
        /// The OnConnected event.
        /// </summary>
        public override System.Threading.Tasks.Task OnConnected()
        {
            string clientId = GetClientId();

            if (Users.IndexOf(clientId) == -1)
            {
                Users.Add(clientId);
            }
            return base.OnConnected();
        }

        /// <summary>
        /// The OnReconnected event.
        /// </summary>
        public override System.Threading.Tasks.Task OnReconnected()
        {
            string clientId = GetClientId();
            if (Users.IndexOf(clientId) == -1)
            {
                Users.Add(clientId);
            }

            return base.OnReconnected();
        }

        /// <summary>
        /// The OnDisconnected event.
        /// </summary>
        public override System.Threading.Tasks.Task OnDisconnected()
        {
            string clientId = GetClientId();

            if (Users.IndexOf(clientId) > -1)
            {
                Users.Remove(clientId);
            }

            return base.OnDisconnected();
        }

        /// <summary>
        /// Get's the currently connected Id of the client.
        /// This is unique for each client and is used to identify
        /// a connection.
        /// </summary>
        /// <returns>The client Id.</returns>
        private string GetClientId()
        {
            return Context.ConnectionId;
        }

}

Para conocer el número de usuarios conectados; podemos obtenerlo fácilmente ;-).

   var userCount = KnowUserHub.Users.Count;
Publicado en SignalR | Etiquetado , , | Deja un comentario