Logo de Torre de Babel
Portada Libros Artículos Perfil Scholar

PowerShell: la consola avanzada de Windows

Son muchos los usuarios de Windows que, en alguna ocasion, han recurrido a la ventana Símbolo del sistema para realizar alguna operación puntual. Los usuarios más avanzados incluso escriben sus propios guiones, los conocidos y antiguos archivos .BAT heredados del DOS, pero son pocos los que aprovechan una de las características más interesantes de las últimas versiones de Windows: PowerShell.

PowerShell es una línea de comandos que permite la ejecución interactiva de tareas, por una parte, así como un lenguaje avanzado para la codificación de scripts que facilitan, por ejemplo, las tareas de administración del sistema. A dierencia de la línea de comandos básica, la de PowerShell reconoce un extensísimo conjunto de órdenes, denominadas genéricamente cmdlets, agrupados en múltiples categorías. En principio el comando fundamental es get-help que, como es fácil imaginar, facilita el acceso a toda la ayuda de PowerShell.

Como es habitual, la salida de un comando puede enviarse como entrada a la de otro mediante el operador |, lo cual permite, simplemente encadenando tres órdenes, obtener resultados como el de la imagen inferior: una tabla de los procesos que hay en marcha en el sistema ordenados descendentemente según el consumo de CPU.

La línea de comandos de PowerShell

Con los comandos de PowerShell es posible conocer los procesos en ejecución, obtener información del hardware del sistema, controlar los servicios iniciándolos o deteniéndolos, configurar redes y, en general, realizar cualquier tarea de administración que podamos imaginar, incluso de manera remota, controlando desde una máquina local un ordenador situado en otro lugar.

Cuando se utiliza para escribir guiones, PowerShell ofrece un lenguaje con estructuras condicionales y de repetición similares a las de los lenguajes modernos. En Windows 7 y Windows Server 2008 incluso se cuenta con un entorno de desarrollo integrado, llamado ISE (Integrated Scripting Environment), que ya viene incluido en el sistema y que, como se aprecia en la imagen inferior, facilita un editor, un depurador y una consola interactiva para realizar pruebas.

El entorno integrado de PowerShell

Si quieres saber más sobre PowerShell, una simple búsqueda te servirá. Los sitios de referencia son obviamente los de Microsoft, especialmente el Windows PowerShell Blog y la sección Scripting con Windows PowerShell de TechNet.


Publicado el 26/6/2010

Cómo actualizar referencias cruzadas en Microsoft Word

Word, el conocido programa de procesamiento de textos de Microsoft, cuenta con las opciones necesarias para asignar automáticamente títulos a tablas, figuras e ilustraciones, generar tablas de contenidos y tablas de referencias a todos esos elementos y, además, introducir referencias cruzadas en el texto. Una referencia cruzada es, por ejemplo, la mención de una tabla o una figura en un párrafo de texto a través de su número, la posición (anterior/posterior) o número de página en que se encuentra.

Aunque las referencias cruzadas pueden introducirse manualmente, simplemente escribiendo véase la figura 5 en la página 12, esto tiene varios inconvenientes: el número de figura puede cambiar, porque se introduzca otra antes o se elimina una de las que le preceden, y la página en que se encuentra también puede ser otra a medida que se trabaje en el documento. Por ello es recomendable usar la opción que ofrece Word para introducir estas referencias cruzadas, opción que permite elegir entre los elementos numerados existentes en el documento e introducir en el texto lo que se desee: solamente el número, el número y el epígrafe, el título completo, la página en que se encuentra, etc.

Referecias cruzadas en Word 2010

Esta opción, al igual que la que introduce elementos como el índice de contenido o el índice alfabético, inserta en el documento no el texto simple (aunque así lo parezca) que corresponde a la referencia, sino un código de campo que se actualiza para reflejar el número correcto, la página correcta, etc. ¿Cuándo se produce esa actualización? Por defecto se procede a actualizar automáticamente las referencias cuando se imprime el documento, pero no por ejemplo cuando simplemente se guarda o, sencillamente, cuando queremos verlas actualizadas para asegurarnos de que son correctas. Siempre se puede, sin embargo, proceder a la actualización manual, situando el cursor encima de la referencia y pulsando F9.

La actualización manual es directa y simple para renovar una tabla de contenidos o un índice alfabético, pero si el documento está lleno de referencias cruzadas obviamente no vamos a recorrerlas una a una pulsando F9. ¿Cómo actualizarlas todas de una sola vez, independientemente de su tipo? No hay más que seleccionar el documento completo, en la versión en castellano de Word pulsando Control-E, y a continuación pulsar F9.


Publicado el 25/6/2010

Píldora histórica (7)

Los exitosos y célebres PDP-8 y PDP-11, de la desaparecida DEC (Digital Equipment Corporation), fueron precedidos por un sistema mucho menos famoso: el PDP-5. Éste introdujo en 1963, año en que fue presentado, muchas de las bases en que se asentaría el éxito de sus sucesores.

El PDP-5 se construyó en torno a un controlador digital de 12 bits diseñado por DIGITAL dos años antes, siendo la primera máquina en contar con esta arquitectura que después heredarían otros desarrollos. La memoria típica consistía en 1024 ó 4096 palabras de 12 bits, contando entre sus registros con un contador de programa (PC), un registro de instrucción (IR) y un acumulador (AC).

Esquema de bloques del PDP-5

Lo más interesante del PDP-5, no obstante, fue la introducción del primer diseño de un bus que permitía conectar periféricos sin los problemas que planteaba la estructura radial empleada hasta ese momento en la mayoría de los ordenadores. DIGITAL fabricó 116 unidades de esta máquina, que tenía un coste de 27.000 dólares de la época, dejándolo de producir en 1967, con la llegada del PDP-8.


Publicado el 21/6/2010

Consolas virtuales en Linux ... y gazapo en libro

Cuando comencé a trabajar con Unix, a mediados de los años 80, la primera impresión fue de desencanto y fascinación al tiempo. Fascinación porque había leído las posibilidades multiusuario y multitarea de este sistema y desencanto porque la primera vez que inicié el sistema me encontré con una consola de texto, como la del DOS de aquellos tiempos. En la consola se introducía una orden, se obtenía un resultado y se volvía al símbolo del sistema, reiniciando el ciclo, como en DOS, pensaba yo al principio, hasta que descubrí en pocos días la gestión de tareas en segundo plano, las consolas virtuales que habrían las puertas a una multitarea más palpable y la posibilidad de conectar múltiples pantallas y teclados (terminales) a través de simples conexiones serie.

Las consolas virtuales eran el medio que permitía interactuar con varias aplicaciones simultáneamente a través de una interfaz de texto, usando una sola pantalla y teclado. Al iniciar el sistema normalmente te encontrabas en la primera de esas consolas, pudiendo a cambiar a cualquier otra con la combinación de teclas Alt-Control-Fn. De esta manera se podía iniciar sesión como varios usuarios diferentes y trabajar de manera simultánea con un cierto programa, algo que resultaba muy útil para probar localmente aplicaciones que se desarrollaban para funcionar en entornos multiusuario. El número de consolas virtuales disponibles era un parámetro ajustable.

Inicio de sesión en la consola virtual de Ubuntu Karmic Koala
Inicio de sesión en la consola virtual de Karmic Koala ejecutándose en VirtualBox

Llevo usando Linux desde el año 93 cuando instalé la primera distribución de Linux a la que tuve acceso, una Slackware que venía en una pila de discos, y desde entonces he probado infinidad de ellas. A pesar de que con el tiempo tanto Unix como Linux han incorporado escritorios gráficos, una característica que sigue presente ahí son las consolas virtuales, un recurso que suelo utilizar cuando quiero trabajar exclusivamente con la consola prescindiendo de todo lo demás. Además es un recurso útil cuando se necesitan solventar problemas, especialmente si el entorno gráfico se bloquea y no hay manera de reiniciarlo.

En la Guía práctica de Ubuntu que publiqué a principios de este año, concretamente en el último capítulo, explico cómo recurrir a la consola virtual precisamente en situaciones como la mencionada, cuando el entorno gráfico no responde. En las páginas 306 y 307 se hace referencia al atajo de teclado que permite acceder a la primera consola virtual, pero por un error tipográfico en la página 306 se indica que es Control-Alt-1 cuando debería aparecer Control-Alt-F1. Sin embargo en la página 307 sí aparece correctamente, por lo que confío en que los lectores prueben ambas y se den cuenta del pequeño fallo.

Aprovecho para dar las gracias desde aquí al lector que ayer tarde se puso en contacto conmigo para comunicarme el error que, lógicamente, será subsanado en posteriores ediciones del libro.


Publicado el 17/6/2010

Píldora histórica (6)

Aunque las configuraciones de máquinas multiprocesador (con varios procesadores y/o varios núcleos por procesador) puedan parecernos una tendencia actual, en realidad el primer sistema multiprocesador data del año 1961: el Burroughs B5000. Frente a su compentencia, este sistema contaba con instrucciones de bajo nivel específicas para solicitar el bloqueo de un procesador, efectuar operaciones de lectura-escritura atómicas que no podían ser interrumpidas para evitar problema de sincronización, etc. Su arquitectura permitió el desarrollo de versiones concurrentes de COBOL y ALGOL, lenguajes de uso común por entonces, hace ya casi medio siglo.


Publicado el 14/6/2010

Herramientas para programar shaders (y III) - FX Composer

La tercera herramienta que me ha parecido interesante, ya que complementa en cierta manera a las anteriores, es nVidia FX Composer. Como sería de esperar, al ser un programa desarrollado por nVidia, el lenguaje empleado para codificar los shaders no es OGLSL, siendo posible elegir entre HLSL, Cg y COLLADA Fx Cg.

Lo más interesante de este programa es que, como puede verse en la figura inferior, permite comprobar los shaders sobre DirectX 9, DirectX 10 y OpenGL. No hay más que abrir la lista y seleccionar la API, obteniéndose la visualización del efecto de manera inmediata. De esta forma es posible diseñar un mismo conjunto de shaders para DirectX y OpenGL, sin que importe el lenguaje de shading empleado originalmente.

Entorno de desarrollo de FX Composer

Salvo por las opciones ya citadas, que permiten elegir el lenguaje de shading y el API sobre el que se ejecutarán los shaders, FX Composer no se diferencia demasiado de ShaderDesigner. Hay un editor de código para escribir los shaders, una ventana de propiedades, un panel de previsualización y una serie de funciones que permiten establecer la geometría sobre la que se probarán los efectos, luces, texturas, etc.

Otra posibilidad interesante de este programa es la de convertir los shaders de un lenguaje a otro, por ejemplo de HLSL a Cg, con una simple opción de menú. También es capaz de analizar el rendimiento de los shaders en distintas configuraciones hardware.

Tras la introducción de estas tres herramientas, la última mini-serie de esta serie de artículos sobre programación de shaders estará dedicada al desarrollo de algunos ejemplos sencillos, diseñando vertex shaders, pixel shaders y geometry shaders. Para ello se recurrirá a la herramienta Shader Maker descrita en una entrada previa y se utilizará el lenguaje OGLSL.


Publicado el 10/6/2010

Guía práctica ASP.NET 4.0

Portada del libro

La plataforma .NET llega a su versión 4.0 con la disponibilidad de Visual Studio 2010, una actualización que afecta a muchos de los servicios y ASP.NET, el motor de páginas de servidor Web, no es una excepción. Mejoras en los editores y diseñadores, en la generación del código enviado a los clientes, la velocidad, etc., se conjungan con novedades como el nuevo marco de aplicación ASP.NET MVC o la generación dinámica de páginas web a partir de la información contenida en bases de datos, facilitando las operaciones más habituales.

Este libro es la actualización del que escribí hace algún tiempo sobre ASP.NET 3.5. Aparte de revisar los contenidos ya existentes, esta nueva guía ha crecido en tamaño precisamente para dar cabida a esa novedades, llegando a las 352 páginas respecto a las 320 de la anterior. Como es habitual, en la sección Libros puedes encontrar todos los detalles sobre éstos y los demás libros que he publicado hasta el momento, incluyendo imágenes de sus portadas y el índice completo de contenidos.


Publicado el 7/6/2010

Píldora histórica (5)

Tras los éxitos obtenidos en el funcionamiento del ENIAC y estando en desarrollo computadoras tan importantes (históricamente) como UNIVAC y BINAC, el número de marzo de 1949 de la influyente revista Popular Mechanics publicaba un artículo titulado Brains that Click que merece la pena leer (está disponible al completo de forma gratuita) nada más que por las fotografías de los sistemas de la época. Casi al final de dicho artículo, en la página 268, el autor se atreve a avanzar que, dados los avances experimentados por la electrónica en aquellos años, no sería descartable que los ordenadores del futuro tuviesen menos de 1000 tubos de vacío y pesasen menos de 1.5 toneladas, mucho más ligeros que el ENIAC (con 30 toneladas).


Publicado el 5/6/2010

Paralelismo de bucles en Visual Basic 2010

Los microprocesadores que equipan los ordenadores personales, incluso los portátiles, cada vez incorporan un mayor número de núcleos y, además, suelen contar con tecnologías adicionales (como el Hyper-Threading) que hacen posible la ejecución de más de un hilo por parte del mismo núcleo. Actualmente no es raro que un equipo doméstico sea capaz de ejecutar 8 threads en paralelo, número que se irá incrementando (Intel ya está fabricando muestras de microprocesadores con 50 núcleos).

Esta evolución del hardware afecta de lleno a los programadores que, para aprovechar toda la potencia que tienen a su alcance, no tienen más remedio que paralelizar su código, viéndoselas con la gestión de hilos, los problemas de sincronización, uso de semáforos, monitores, barreras, etc. No obstante, también hay alternativas sencillas aplicables a casos concretos, como el paralelismo para bucles que ofrece Visual Basic 2010 (en realidad la plataforma .NET 4.0).

Para poder efectuar una comparativa simple, supongamos que recibimos un vector de datos que han de ser sometidos a un proceso de cierta complejidad de manera independiente, es decir, el tratamiento de un elemento del vector no afectará al resto. Ese proceso complejo podría ser, por ejemplo, calcular su factorial un millón de veces. Es lo que hace el código siguiente:


        ' Vector con los valores de partida
        Dim valores = {13, 19, 12, 8, 20, 15, 12}

        ' Una función que se encarga de calcular el factorial
        ' 1 millón de veces para consumir tiempo
        Dim Factorial = Function(valor As Integer) As ULong
                            Dim resultado As ULong
                            For indice = 0 To 1000000
                                resultado = 1
                                Dim n = valor
                                While n
                                    resultado *= n
                                    n -= 1
                                End While
                            Next
                            Return resultado
                        End Function

        ' Obtener y mostrar el factorial para cada valor del vector
        For Each Valor In valores
            Console.WriteLine("El factorial de {0} es {1}",
                                Valor, Factorial(Valor))
        Next

El código que se encarga de calcular el factorial se ha introducido como función lambda asignada a una variable, aunque se podría tanto haber codificado como una función corriente como haberse introducido directamente en el propio bucle, no es algo que afecte al comportamiento del programa. La ejecución de éste provocará que los resultados vayan apareciendo lentamente por la consola y, como se aprecia en la imagen inferior, en el mismo orden en que aparecen los valores en el vector original, ya que se está procesando de manera secuencial.

Resultado de la ejecución del programa

Si durante la ejecución del programa examinamos la actividad del microprocesador (puede servir el propio Administrador de tareas de Windows) observaremos que solamente uno de los núcleos presenta una actividad significativa, como en la imagen inferior. El uso de CPU por parte del programa dependerá del número de núcleos que se tengan, no pasando del 25% para cuatro núcleos, del 13% para ocho y así sucesivamente, porque no usa más que un hilo durante toda su vida.

Uso de CPU por parte del programa

Dado que en este caso concreto la evaluación de un elemento del vector no influye en los demás, nada nos impediría realizar todos los cálculos en paralelo creando un hilo por cada elemento del vector. Pero en luga de crear explícitamente el hilo, facilitando los parámetros correspondientes, y sincronizar el programa principal con todos los hilos para mostrar el resultado una vez terminen, podemos recurrir a la clase System.Threading.Taks.Parallel introducida en la versión 4.0 de la plataforma .NET. Ésta nos permite recodificar el bucle que hay al final del programa de la siguiente forma:


        Parallel.ForEach(valores,
                Sub(valor)
                    Console.WriteLine("El factorial de {0} es {1}",
                                    valor, Factorial(valor))
                End Sub)

Sigue siendo un bucle de tipo For Each, que recorre cada uno de los elementos del vector valores, pero ahora no lo hace de manera secuencial, sino ejecutando todos los ciclos en paralelo (siempre que haya núcleos suficientes, claro está). Lo primero que notaremos es que el consumo de CPU por parte de la aplicación ahora es mucho más agresivo, pudiendo llegar fácilmente al 100%. Esto se refleja en la actividad de los núcleos, como puede verse en la imagen siguiente:

Uso de CPU por parte del programa

Otra diferencia, aparte de que el programa tardará mucho menos en finalizar la ejecución y ofrecer los resultados, es que éstos no aparecerán necesariamente en el orden en que se encontraban los valores en el vector de origen. De hecho el orden variará de forma clara, como en la imagen inferior, ya que el cálculo para los números más pequeños concluirá antes que para los grandes.

Resultado de la ejecución del programa

También existe un método Parallel.For que funciona de manera análoga a un bucle Forclásico, pero ejecutándose en paralelo. Lo único necesario para poder usar estas construcciones es agregar la cláusula Imports System.Threading.Tasks al inicio del módulo y, lógicamente, compilar el código para la versión 4.0 de la plataforma .NET.


Publicado el 3/6/2010

Herramientas para programar shaders (II) - ShaderDesigner

Al igual que Shader Maker (ver entrada del 17 de mayo), ésta es una herramienta dirigida específicamente al desarrollo de shaders con OGLSL, por lo que se parte de los mismos requerimientos: disponer de un controlador de vídeo actualizado que soporte las últimas versiones de OpenGL.

Es un programa creado por la desaparecida empresa TyphoonLabs que puede obtenerse gratuitamente desde el sitio de esta empresa o bien como parte del OpenGL SDK. La última versión data de abril de 2009 y, aunque aprovecha las características de OpenGL 3.0, únicamente contempla el desarrollo de VS y PS, pero no de GS.

Como se aprecia en la figura inferior, la interfaz del programa tiene el aspecto típico de un entorno de desarrollo, ofreciendo un editor de shaders, paneles para la modificación de propiedades, una previsualización del shader en funcionamiento y diferentes opciones para la aplicación de texturas, uso de luces y selección de la geometría sobre la que se quieren probar los efectos.

Entorno de desarrollo de ShaderDesigner

El inconveniente de esta herramienta es que no permite trabajar con GS y, además, está limitada al lenguaje de shading de OpenGL, al igual que Shader Maker.


Publicado el 1/6/2010

Histórico
Curso de shaders

Torre de Babel - Francisco Charte Ojeda - Desde 1997 en la Web