jueves, 28 de julio de 2016

Mini servidor HTTP & CGI con Perl6

Después de preparar la presentación de Una introdución a Perl 6 me llamó mucho la atención las funcionalidades que ofrece Perl6 sobre programación reactiva y gestión de eventos, así que después de mostrar cómo funciona un servidor HTTP con Perl5 me propuse hacerlo también con Perl6.

Con Perl6 es un poco distinto en cuanto a sintaxis y soporte multihilo pero la forma de gestionar HTTP es la misma. En cuanto al soporte multihilo existe la clase IO::Socket::Async.listen que proporciona la creación y puesta a la escucha de sockets asíncronos con soporte multihilo, de forma que por cada conexión crea un hilo alojado en un pool que Perl6 gestiona internamente.

La prueba de concepto la puedes encontrar aquí.

Este mini servidor web funciona en Windows y GNU/Linux con Rakudo Perl6 instalado y un par de módulos de Perl6 (URI y URI::Escape) que interpretan de forma adecuada las URIs que llegan al servidor.

La parte CGI se realiza mediante módulos de Perl6 y con el resto tenemos un servidor web funcional pero muy básico (solo contempla los códigos HTTP 200 y 404).

El frontal se compone de HTML, CSS y Javascript con JQuery para gestionar la conexión asíncrona con el script CGI de Perl6 que hace de servicio web.


sábado, 21 de mayo de 2016

Contando hilos en GNU\Linux

Actualmente estoy bastante interesado en Perl6, sobre todo en la parte de cómo trata la concurrencia y el manejo de hilos. Perl6 incorpora una serie de objetos de alto nivel que facilitan estas situaciones. En este enlace tienes información en relación a ello.

Mientras tanto y realizando pruebas, he visto que en GNU/Linux hay una forma bastante elegante para comprobar el número de hilos abiertos de un script de Perl6 en ejecución, o de cualquier otro proceso:

while sleep 1; do ps -eLf | grep -v grep | grep -c script.pl6; done

Viene a decir: cada segundo (while sleep 1) lista los procesos activos (ps -eLf), no tengas en cuenta el proceso actual de grep (grep -v grep) y busca el número de veces que aparece el texto "script.pl6" (grep -c script.pl6).


domingo, 21 de febrero de 2016

Funcionamiento de un Servidor Web

En éste documento muestro el funcionamiento de un servidor web utilizando Perl; desde cómo crear un socket y ponerlo a la escucha, cómo hablar HTTP de forma básica y cómo utilizar las capacidades multihilo para lograr la máxima rapidez y eficiencia.

lunes, 7 de diciembre de 2015

diresp v3 - Tamaños de directorios más rápido

Después de ver cómo funciona la creación y gestión de múltiples hilos (multithreading) en la API de Windows, decidí aplicarlo a la herramienta diresp, de forma que calcule el espacio de cada directorio actual en su propio hilo. El resultado es significativamente más rápido.

Puedes descargar la versión 3 de diresp (diresp3.exe) desde este enlace.

miércoles, 8 de abril de 2015

diresp v2 - Tamaños de directorios

Hablamos de la versión 2 de diresp.exe, la herramienta presentada en el post anterior que muestra los tamaños de los directorios que se encuentran en el directorio actual.

La versión 2 está reescrita completamente en C y en su ejecución incorpora un texto de estado mostrando los directorios detectados e informando por cual va.

Otra de las novedades es la ordenación del listado de directorios por tamaños de menor a mayor, así podemos ver antes el directorio más nutrido.

La herramienta es bastante útil en unidades NTFS cortas de espacio, para detectar rápidamente dónde se concentran los archivos más pesados y eliminarlos o moverlos para liberar espacio, o simplemente averiguar qué directorios son los más pesados.

Actualmente solo está disponible la versión 3 clicando aquí.

lunes, 20 de octubre de 2014

diresp - Tamaños de directorios

Una de las situaciones más comunes en el ámbito de los sistemas operativos donde es necesaria una intervención rápida es la falta de espacio en disco. En estos casos, los administradores de sistemas tenemos que averiguar cómo está distribuido el espacio en disco y determinar qué archivos se pueden eliminar o mover.

La forma más rápida de diagnosticar estas situaciones es averiguar el tamaño de los directorios que cuelgan de un directorio dado. De esta forma podemos comprobar si los tamaños de estos directorios son razonables o no.

Para facilitar la tarea y conseguir esta información lo antes posible, he creado la herramienta diresp.exe. La versión actualmente disponible es la 3 y puedes descargarla en éste enlace.

Para mayor comodidad, conviene copiar esta herramienta en un directorio con Path, como C:\Windows\System32, después abrir la línea de comandos cmd, ubicarse en el directorio padre donde queremos comprobar los tamaños de sus directorios y ejecutar diresp3.exe.

Es posible que tarde un poco en listar los resultados dependiendo del número de subdirectorios y archivos, pero éstos aparecen ordenados por tamaño indicando el nombre del directorio hijo correspondiente. Una vez ubicado el directorio con tamaño sospechoso, podemos acceder a él y ejecutar de nuevo la herramienta (esta vez te aseguro que irá más rápido) hasta confirmar el directorio problemático.

lunes, 16 de junio de 2014

Consultas a SQLServer desde Powershell

Si necesitas lanzar una consulta a una base de datos de SQLServer y que además permita cambiarla rápidamente, puedes utilizar Powershell y la clase System.Data.SqlClient.SqlConnection de .NET de la siguiente manera:

$consulta = "SELECT Name FROM sys.databases"
$srv = "nombreServidor"
$db = "master"

$conex = New-Object System.Data.SqlClient.SqlConnection
$conex.ConnectionString = "Server=$srv;Database=$db;Integrated Security=True"
$conex.Open()
$adaptadorSQL = New-Object System.Data.SqlClient.SqlDataAdapter
$resultado = New-Object System.Data.DataTable
$cmdSQL = New-Object System.Data.SqlClient.SqlCommand
$cmdSQL.CommandText = $consulta
$cmdSQL.Connection = $conex
$adaptadorSQL.SelectCommand = $cmdSQL
$contador = $adaptadorSQL.Fill($resultado)

$resultado

  • La variable $consulta contiene la cadena con la consulta que queramos realizar.
  • La variable $srv indica el nombre del servidor SQLServer en cuestión donde se realizará la consulta.
  • La variable $db es el nombre de la base de datos a consultar en el servidor indicado.
  • La variable $resultado contiene el resultado de la consulta en formato DataTable.

El resultado de esta consulta lista todas las bases de datos del servidor indicado.

Si la base de datos en cuestión está contenida en una instancia nombrada, la variable $servidor debe incluir el nombre de la instancia de la siguiente manera: nombreServidor\nombreInstancia.

Este tipo de scripts es especialmente útil para incluirlos en alguna tarea programada y recibir información con un intervalo determinado.