Algunos comandos básicos de GNU/Linux

Tal vez no seas un administrador de Linux, pero puede que te interese conocer ciertos comandos para trabajar con el terminal. Ya sea por curiosidad, porque estás haciendo un curso o por si algún día te encuentras con algo que requiera hacerse desde la línea de comandos, este conocimiento nunca sobra

Seguidamente os listo una serie de comandos básicos para la administración de Linux por terminal, que te ayudarán a llevar a cabo tareas simples de administración y mantenimiento del sistema.

  • man: Si estás empezando man es el comando más importante. Este comando te permite conocer toda la información sobre otros comandos, sacar el «manual» para conocer sus opciones, qué hace, etc. Se utiliza poniéndolo seguido del comando que quieres conocer, por ejemplo man ls te mostraría la información sobre el comando ls.
  • su y sudo: El comando su (switch user) te permite cambiar tu login por el de otro usuario. Por su parte sudo te permite realizar una acción concreta como los permisos de root, el superusuario del sistema. El comando su en muchos sistemas te permite además loguearte como superusuario (por eso mucha gente cree que significa super-user) haciendo su -root. Tanto para usar sudo como para loguearte como root con su se te requerirá la contraseña del sistema.
  • grep: Grep nos permite buscar un texto plano que coincida con una expresión regular. Por ejemplo grep «foo» /etc/passwd devolverá todas las líneas del archivo passwd que contengan la cadena foo. Se puede usar la opción -i para que busque la cadena con variaciones (mayúsculas, acentos) o -r para que busque recursivamente en todo el árbol de directorios.
  • ps: Si queremos saber el status de un proceso nuestra herramienta es el comando ps. Combinado con grep, además, te dará la información de ese proceso buscando por el nombre, por ejemplo ps -ef | grep apache nos devolvería el status del proceso apache.
  • kill:«Computer, kill Flanders»… Homer Simpson debe creer que el comando funciona así, pero no… xDDD Kill nos permite «matar» un proceso concreto del sistema, ya sea porque se haya quedado bloqueado o por necesidades de memoria. Usando el anterior comando ps podrás ver el id de los procesos, id que necesitarás para liquidarlos con kill. Por ejemplo kill 1111. A veces no te dejará matar así un proceso por cuestiones de seguridad (otros dependen de él, hay riesgo de pérdida de datos…). Si crees que es absolutamente necesario matar el proceso puedes forzar su eliminación con la opción -9 tal que así: kill -9 1111
  • clear: Si tienes el terminal lleno de texto, demasiado «enguarrado» basta con ejecutar clear y «limpiará» la pantalla. Realmente no elimina lo que has escrito antes, simplemente mete un montón de líneas de texto vacías para sacar de tu vista todas esas líneas, que se pueden hacer muy engorrosas.
  • hostname: El nombre del equipo al que estás conectado.
  • cp: Copia el archivo que elijas en la ubicación que quieras. Por ejemplo cp hola.txt holacaracola.txt hará una copia del primer archivo en uno llamado como el segundo. En este caso las hemos hecho en el mismo directorio, pero podíamos haber especificado otro poniendo toda la ruta en el archivo de origen o destino.
  • mv: Su funcionamiento es similar a cp, con la diferencia de que en lugar de hacer una copia lo que hace es mover el archivo original a la nueva ubicación. Funciona como el cortar de Windows.
  • pwd: ¿Onde carallo estou? El comando pwd te dice en qué directorio te encuentras.
  • rm: El comando utiliado para borrar un archivo. Si utilizas la opción -i el sistema te pedirá, como medida de seguridad, que confirmes la acción. Si quieres borrar una carpeta con todo su árbol de hijos has de usar la opción -rf para forzar el borrado recursivo.
  • uname: Nos devuelve en una línea un resumen con la información del sistema operativo: versión, kernel…
  • date: Nos muestra la fecha del sistema
  • ls: Lista todos los archivos de un directorio. Con la opción -l muestra el nombre largo de archivo, con la opción -la muestra el nombre de archivo encolumnado, con la opción -F muestra el tipo de fichero.
  • touch: Crea un fichero vacío.
  • updatedb: Actualiza la base de datos de archivos en todos los sistemas de ficheros.
  • find: Busca un archivo a partir del directorio que le digamos, tal que así find / -name «nombreDelFichero» buscaría a partir del directorio raíz un fichero con el nombre indicado.
  • locate: Busca un archivo en concreto en todo el sistema de archivos. Recuerda usar updatedb antes para que sea verdaderamente efectivo.

Hay muchos comandos más, desde luego, todo un mundo de ellos, ya que no nos hemos metido en temas como configuración de red, permisos, gestión de usuarios… Pero estos yo creo que son los más útiles para el usuario básico.

Ejemplos varios de canvas (html5)

Canvas es, probablemente, el elemento más potente de HTML5. Mayormente nos da una funcionalidad similar a las animaciones flash en una parte de la pantalla, pero utilizando javascript. En principio es para un contexto 2D pero ya hay una librería (three.js) que te permite utilizar gráficos 3D (de momento no soportada por todos los navegadores). En los primeros manuales de HTML5 que cayeron en mis manos este elemento venía muy mal explicado, te decían que se podía «dibujar» usando javascript… y ale, vía.

Para utilizar canvas en tu web debes incluir una etiqueta canvas, que por defecto será invisible y tendrá un tamaño de 300*150 px. Luego, en javascript, debes inicializar un contexto tal que así:

var ctx = document.querySelector('canvas').getContext('2d');

Tras haber definido un contexto bidimensional, podemos empezar a dibujar. El API da la posibilidad de utilizar rectángulos, arcos, círculos… El siguiente código dibujaría un rectángulo, con un reborde más oscuro:

ctx.fillStyle='rgb(0, 255, 0)';
ctx.fillRect(10,20,50,50);
ctx.strokeStyle='rgb(0,182,0)'
ctx.lineWidth=5;
ctx.strokeRect(9,19,52,52);

En fin, esto es lo más básico, pero tienes múltiples opciones: degradados, imágenes complejas, animaciones, interactividad… En lugar de currarme un tutorial más complejo te remito a varios enlaces para que veas la pontencia de Canvas:

Bueno, con estos ejemplos ya puedes ver más o menos la potencia de este elemento y tener varios tutoriales para iniciarte en la creación de aplicaciones con canvas.

Formularios HTML5 con jQueryMobile

Tras la iniciación a la maquetación con jQueryMobile que publiqué ayer, toca complementarla con una introducción a los formularios.

Como es habitual en todo formulario HTML, los campos estarán encerrados entre etiquetas form, con su action y su method definidos. Existen varios tipos de controles, que son mas que suficientes para poder crear formularios complejos, que puedes consultar aquí.

Una de las opciones que nos reporta jQueryMobile es la de poder crear formularios «mini», con una versión más pequeña de sus controles para facilitar la visualización en las pantallas de los móviles. Para ello debemos añadir el atributo data-mini=”true” en el controlgroup.

El atributo placeholder (del que también hablamos en este blog) juega un papel importante aquí. Si quieres ocultar la etiqueta label por motivos de accesibilidad pero que los lectores de pantalla puedan leerla, podras servirte de la clase ui-hidden-accessible y, con el atributo placeholder, usar el elemento de formulario con la etiqueta dentro.

Para deshabilitar un elemento del formulario usaremos el atributo disabled. En el caso de que necesitemos aplicar el estilo disabled a un elemento que no sea un control de formulario, podemos utilizar la clase ui-disabled sobre el elemento.

Ahora un ejemplo de un formulario con las etiquetas como placeholder y controles mini, para ilustrar lo explicado.

<form action="procesar.php" method="post" id="formEjemplo">
    <div data-role="fieldcontain">
        <fieldset data-role="controlgroup" data-mini="true">
            <legend>Login ejemplo:</legend>
            <label for="user" class="ui-hidden-accessible">Usero:</label>
            <input type="text" name="user" id="user" value="" placeholder="User" />
            <label for="password" class="ui-hidden-accessible">Usuario:</label>
            <input type="password" name="password" id="password" value="" placeholder="password" />
        </fieldset>
    </div>
</form>

Si usas un contenedor para controles de formularios (que es un elemento de jQueryMobile) y quieres ocultar la etiqueta y usar el texto placeholder, tienes que ocultarla en los atributos del div con class=»ui-hide-label» en lugar de en los del label, como en este ejemplo:

<div data-role="fieldcontain" class="ui-hide-label">
    <label for="user">Usero:</label>
    <input type="text" name="user" id="user" value="" placeholder="User" />
</div>

Y con esto ya puedes empezar a hacer tus formularios optimizados para móviles.

Iniciación a jQueryMobile: Maquetando web para móviles con HTML5

A la hora de programar webs para móvil el framework de javascript jQueryMobile, basado en jQuery, nos ofrece una gran productividad, simplificando profundamente las cuestiones de maquetación. Si ya conoces jQuery y jQueryUI la curva de aprendizaje será muy pequeña.

Este framework es compatible con todos los navegadores y sistemas operativos móviles actuales, es ligero (20kb), casi no utiliza imágenes, se puede combinar con PhoneGAP para realizar aplicaciones nativas y es libre y gratuito.

A la hora de crear la estructura, como en cualquier web, lo primero es empezar por la cabecera (la etiqueta HEAD). Ahí agregamos las referencias necesarias a jQuery, jQuery Mobile y el theme básico de CSS. Para definir el ancho de pantalla utilizamos meta viewport, lo dejaremos definido con la constante width=device-width y la escala mínima y máxima a 1; initial-scale=1.0 maximum-scale=1.0.

Una vez que hemos terminado de referenciar las librerías necesarias, creamos la estructura de la plantilla principal de la página utilizando HTML5, y luego definimos las areas de contenido (content region) que proporciona jQueryMobile. El atributo data-role nos permitirá maquetar con comodidad y estructurar la página. Especificaremos la página (data-role=”page”), el encabezado (data-role=”header”), el contenido (data-role=”content”) y el pié (data-role=”footer”). Estos data-role los utiliza jQueryMobile para en Widgets funcionales y con los estilos del theme utilizado las secciones definidas.

Creo que lo mejor es un ejemplo que ilustre lo comentado:

<!DOCTYPE html>
<html>
<head>
    <title>Página prueba</title>
    <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0;" />
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0-rc.1/jquery.mobile-1.1.0-rc.1.min.css" />
    <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
    <script src="http://code.jquery.com/mobile/1.1.0-rc.1/jquery.mobile-1.1.0-rc.1.min.js"></script>
</head>
<body> 
 
<!-- Página principal -->
<section data-role="page" data-title="Página de inicio">
 
    <header data-role="header">
        <h1>HW</h1>
    </header>
    <!-- end header -->
 
    <section data-role="content">
        <p>Hello world!</p>
    </section>
    <!-- end content -->
 
    <footer data-role="footer">
        <p>DonnieRock 2012</p>
    </footer>
    <!-- end footer -->  
 
</section>
<!-- end page -->
 
</body>
</html>

Pero el verdadero cambio respecto a la programación web tradicional es el concepto «page within page». Dentro del mismo documento están incrustadas todas las páginas. De ahí que en el ejemplo de arriba utilizaramos el atributo data-role=page, porque tendremos que definir varias páginas, que se diferenciarán entre ellas por su atributo id, que será obligatorio para poder navegar entre ellas.

La navegación entre distintas páginas de un mismo documento es bastante sencilla, tenemos que poner en el ‘href’ del enlace el ‘id’ de la página destino y ya está. Podemos especificar el tipo de transición con el atributo data-transition, la transición por defecto es slide pero existen varias que puedes consultar en la página de jQuery. También podemos definir la dirección de la transición con el atributo data-direction.

Recuperaré el código del primer ejemplo, con alguna modificacación, para explicar esto:

<!DOCTYPE html>
<html>
<head>
    <title>Página prueba</title>
    <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0;" />
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0-rc.1/jquery.mobile-1.1.0-rc.1.min.css" />
    <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
    <script src="http://code.jquery.com/mobile/1.1.0-rc.1/jquery.mobile-1.1.0-rc.1.min.js"></script>
</head>
<body> 
 
<!-- Página principal -->
<section data-role="page" id="page1" data-title="Página de inicio">
 
    <header data-role="header">
        <h1>HW</h1>
    </header>
    <!-- end header -->
 
    <section data-role="content">
        <p>Hello world!</p>
    </section>
    <!-- end content -->

    <footer data-role="footer">
        <p>
            DonnieRock 2012 
           <a href="#page2" data-role="button" data-transition="slidedown">Ir a la página 2</a>
        </p>
    </footer>
    <!-- end footer -->  
 
</section>
<!-- end page 1-->

<!-- Segunda página -->
<section data-role="page" id="page2" data-title="Página 2">
 
    <header data-role="header">
        <h1>HW2</h1>
    </header>
    <!-- end header -->
 
    <section data-role="content">
        <p>Hello, again, world!</p>
    </section>
    <!-- end content -->
 
    <footer data-role="footer">
        <p>
            DonnieRock 2012 
           <a href="#page1" data-role="button" data-transition="slidedown" data-direction="reverse">Ir a la página 1</a>
        </p>
    </footer>
    <!-- end footer -->  
 
</section>
<!-- end page 2-->
 
</body>
</html>

Finalmente nos queda por elegir el «theme». Podemos crearlo fácilmente con el ThemeRoller que hay en la web de jQueryMobile, con multitud de themes que podemos crear y asignar a cada componente que usemos en nuestra aplicación. También hay themes ya predefinidos, si no queremos rompernos la cabeza. Los themes son diferenciados por una letra identificativa, gracias a la cual podemos identificar el theme y aplicarlo a cualquier componente que queramos, usando el atributo data-theme. Tienes información sobre los distintos themes en la página de jQueryMobile. El theme además puede ser modificado con facilidad tocando los archivos css.

<section data-role="page" id="page1" data-title="Página de inicio" data-theme="b">
 
    <header data-role="header">
        <h1>HW</h1>
    </header>
    <!-- end header -->
 
    <section data-role="content">
        <p>Hello world!</p>
    </section>
    <!-- end content -->

    <footer data-role="footer">
        <p>
            DonnieRock 2012 
           <a href="#page2" data-role="button" data-transition="slidedown">Ir a la página 2</a>
        </p>
    </footer>
    <!-- end footer -->  
 
</section>

Bueno, espero con esto ya tienes unas nociones básicas de cómo empezar. Más adelante tocaré otros temas, como los formularios o la integración con PhoneGAP, de momento podéis ir ojeando esto.

Eliminar virus GEMA / virus policía / virus gendarmerie

Ayer me mensajearon durante el concierto de Michael Schenker preguntándome por el virus GEMA. Por el nombre no caía, pero luego ya vi que es el virus de «Somos la policía, paga 50 euros o no te desbloqueamos». Bueno, es ya la cuarta vez que me preguntar en un mes. Lo primero, si te llega un e-mail de la policía avisándote de una multa ¿Por qué te lo crees? Si la policía quisiera contactar contigo lo harían mediante una carta certificada, algo que les permita garantizar el saber que lo has recibido, no un e-mail. La prevención es la mejor defensa, dado que la ingeniería social suele ser el mejor ataque.

Si ya estáis infectados tampoco os preocupéis, todo es salvable. La primera versión del virus se podía liquidar entrando en modo seguro con funciones de red y pasando un antivirus en la nube, pero la última mutación era más cabrona, no te permitía el arranque en modo seguro. En ese caso lo primero que tienes que hacer es entrar en la BIOS de tu equipo y configurar el orden de arranque para que inicie por USB o por CD-ROM. Para los usuarios con menos experiencia es complicado explicar cómo hacerlo, porque cada fabricante de placas base o equipos va a su bola con la BIOS, tienen menús diferentes y se entra de forma diferente. En el caso de mi equipo, un Packard Bell, se entra pulsando F2, pero recuerdo haber reparado algún ACER que pedía pulsar ESC y en un sobremesa viejo (AMD k6 con placa ASUS) se entraba pulsando tabulador. Sobre cómo cambiar el arranque también depende de la bios que tengáis (la bios es un programa, a fin de cuentas, y no es un estandar, por lo que los menús pueden estar organizados de distintas formas). Si no sabes cómo acceder a la bios lo mejor es que le preguntes a algún amigo que tenga algo más de pericia para que te lo haga.

Una vez configurado el arranque por USB o por CD-ROM (algunos equipos antiguos no permiten arranque por USB) necesitas un cd de recuperación para eliminar el virus. En este enlace al siempre util Foro Spyware os explican cómo crear un USB arrancable o un cd-rom, con el software de Kaspersky para recuperar el equipo. Seguís esos pasos y deberíais tener todo solucionado.

Sobre la bios, repito lo mismo, cada una es un mundo. Si no sabéis, preguntad porque es una zona muy sensible del equipo. Este método ha sido probado en dos equipos y ha funcionado, por lo que en principio debería funcionaros, sacando que haya aparecido otra versión más del virus (que ya sería rizar el rizo).

Cinco alternativas libres a popular software privativo.

La facilidad para piratear software para Windows ha llevado a los usuarios a abusar del software privativo, que le salía virtualmente gratis por obra y gracia de alguna descarga. ¿Podría esta situación cambiar?¿Podría tornarse este software en casi inistalable sin pasar por caja? Está claro que, de momento, no interesa a muchos fabricantes dificultar el acceso a su software, ya que esperan que la implantación entre usuarios les de grandes ventas en el ámbito corporativo. Pero los cambios de tendencia en dicho ámbito, sobre todo en empresas grandes, puede llevar a una modificación de esta tendencia, llevando también a un endurecimiento de las medidas anti copia.

En todo caso, a nivel de software doméstico hay opciones libres muy válidas. Alguno me dirá «son menos potentes»… como si para quitarse los granos de una foto necesitara un software de 700$.

  • Comencemos por la suite ofimática Libre Office, heredera del OpenOffice ahora en manos del gigante Oracle. Incluye un pequeño gestor de bases de datos, un procesador de textos, una hoja de cálculo, un programa para elaboración de diagramas y circuitos, otro para la creación de presentaciones de diapositivas… en fin, ofimática básica. Una alternativa libre al tan implantado Microsoft Office que puedes descargar desde aquí
  • Recién salida está la última versión de GIMP, la 2.8 con (al fin) ventana única. GIMP es el software libre (licencia GPL) de manipulación de imágenes más popular, constituyendo una sólida alternativa a Photoshop, sobre todo a nivel doméstico. Es un pelín más complejo en su uso pero muy potente, con capacidad de sobra para el usuario doméstico (y para muchos profesionales). Aquí tienes la web oficial
  • ¿Utilizas un gestor de correo en tu equipo en lugar de tirar de webmail? Hasta los popes de lo privativo se están pasando a Mozilla Thunderbird. Simple, intuitivo, fácil de configurar y con una tremenda portabilidad (no tienes ni que exportar los contactos, basta un copy/paste de la carpeta con los mismos y tienes tus contactos en otro dispositivo… incluso pasándolos de Windows a Linux). A nivel de herramientas para la programación, bases de datos y trabajo en red es donde el software libre tiene un mayor desarrollo, y Thunderbird es una gran prueba, siendo el software más exitoso de su categoría en múltiples comparativas. Descárgalo ya y comienza a liberar tu correo.
  • Aunque suene a perogrullada todavía mucha gente utiliza Internet Explorer. Hay que reconocer que Explorer 9 no está tan mal como sus predecesores, pero todavía hay mucha gente con Explorer7 por ahí, y creedme cuando os digo que eso nos rompe bastante la cabeza a los programdores cuando trabajamos en diseño web. Y ¿por qué usar explorer 7 teniendo alternativas tan válidas como Mozilla Firefox? seguro, fiable, robusto… y libre. Y no es el único, también está Chromium bajo licencia BSD y, más o menos, Google Chrome (libre más non tropo… es libre el navegador, pero no todos los componentes de Google). También tienes Opera, aunque no es libre pero sí freeware, cargado de múltiples funcionalidades.
  • Y para terminar esta lista, un reproductor multimedia. Es posible que todavía tires de Windows Media Player, pero para la reproducción doméstica nada mejor que VLC. Incluye su propio paquete de driver y codecs para descargarte del coñazo de actualizaciones, parches y descargas, tiene una gran comunidad por detrás dando soporte y muchas actualizaciones periódicas. Como reproductor de vídeo es el mejor, como reproductor de música es pasable (para poner canciones en casa, sobrado, para pinchar en un local… tienes opciones mejores como la versión gratis de Virtual DJ o el software libre Mixx), para hacer streaming tampoco te lo recomendaría… pero volvemos a lo principal: hablamos de usuario doméstico, y para el usuario doméstico es cómodo, intuitivo y compatible con casi todo lo que puedas descargar. Puedes descargarlo aquí

Me gustaría recomendar un antivirus libre, per la verdad es que el único relativamente extendido (ClamWin) no es demasiado recomendable. Hay buenas alternativas como Avast y Avira, no son libres pero al menos son gratis.

En todo caso, tienes alternativas libres para tu software doméstico más usual. Apoya a estos proyectos, porque puede que un día el software privativo sea la única opción… y el panorama, tanto económico como a nivel de tus derechos como usuario, se tornaría aterrador.

Cinco juegos indie para Windows

Como en el pasado ya hice una entrada de juegos para linux y como en Aerilon suelen hacerlas bastante decentemente y con cierta periodicidad, he decidido crear una pequeña entrada sobre juegos indie para Windows, seleccionando los cinco que más me han enganchado en los últimos tiempos. Algunos son gratis, otros no, algunos muy famosos, otros menos.

  • Braid: El plataformas indie por excelencia, Braid. Con unos gráficos en 2D cuidadísimos, una historia profundamente filosófica (que no se por qué, pero me recordó a El Principito) y una mecánica de juego muy original, que nos permite movernos no sólo en el espacio sino también en el tiempo de juego. Braid
  • A Flipping good time: Otro plataformas, este con la gracia de tener que cambiar la dirección de la gravedad para ir superando las fases. Gratis y divertido, reconozco que todavía no me lo he acabado (estoy en ello). No es muy largo pero en ciertos momentos puede volverse desquiciante, aunque puedes acumular una buena cantidad de vidas. Puedes descargarlo desde aquí
    A Flipping good Time
    A Flipping good Time
  • Machinarium: Llamadme machista, pero creo que la estética de este juego lo denota como orientado al público a femenino. Eso no quita que por muy machote que seas no puedas disfrutar de esta maravilla de rompecabezas. Te puedes romper la cabeza mucho rato haciendo y deshaciendo, moviendo cosas de un lado para otro, combinando los elementos de la forma más peregrina… mientras muebles a un adorable cacharro que parece el hijo de Johnny5 (el robot de la película Cortocircuito, no el guitarrista de Marilyn Manson) con una cucaracha. Puedes descargarlo desde aquí Machinarium
  • Stealth Bastard: Reconozco que no es muy difícil, sobre todo si hace años te pasaste el The Lost Vikings. Mezcla de plataformas con puzzle, tiene la ventaja de ser gratuito y de ofrecerte varios niveles para descargar. También puedes intentar batir tu record de velocidad para superar los diversos niveles. Puedes descargarlo desde su página oficial Stealth Bastard
  • World of Goo: Curioso juego de puzzles con un potente motor físico donde, haciendo uso de bolas pegajosas que se unen entre ellas deberás construir estructuras. Gráficamente original, divertido, con una banda sonora muy agradable, una mecánica de juego muy intuitiva y una dificultad progresiva y a veces exasperante, World of Goo garantiza horas de diversión, y te dejará con ganas de más niveles. Puedes descargarlo desde aquí. WOG

Comentar que aparte de para Windows estos juegos existen en otras plataformas (XBOX, MacOS, iOS, Linux, Nintendo Wii… depende del juego), por lo que aunque hayas decidido prescindir de las ventanas del colega Bill Puertas no tienes, necesariamente, por qué quedarte si disfrutarlos.

Usando librerías .dll de .NET en SQL-Server2008

Aunque normalmente no se recomiende tener la lógica de negocio en el lado del servidor de la base de datos, en algunos casos puede resultar interesante el hacerlo. Microsoft, en su empeño (por otra parte loable) de lograr una integración total entre sus servicios, nos permite utilizar nuestras .dll creadas en .NET (sea en VB.NET o en C#.NET o en C++) dentro de nuestra base de datos SQL-Server como «código gestionado».

Iré construyendo poco a poco un ejemplo para que veáis, paso a paso como se realiza esto. Lo primero es activar clr para que nos permita la integración con .NET tal que así:

USE [basedatosdeejemplo]
go
sp_configure 'clr enabled', 1
go
reconfigure
go

Seleccionamos la base de datos a utilizar, configuramos clr como ‘enabled’ (armado, activado) con el parámetro 1 y ejecutamos reconfigure para que el cambio tenga efecto. Acuérdate de poner el parámetro (en este caso 1) y de ejecutar reconfigure.

El primer paso está realizado. Lo siguiente es crear el ensamblado para la librería, definiendo el esquema y el tipo de permisos.


CREATE ASSEMBLY [Utilidades]
AUTHORIZATION [dbo]
FROM 'C:\LibreriaEjemplo.dll'
WITH PERMISSION_SET = SAFE
GO

Creamos el ensamblado con el nombre «Utilidades» (podemos darle el que queramos mientras no sea una palabra reservada), con el esquema dbo (podríamos haber utilizado cualquiera de los disponibles), en FROM le especificamos la dirección del archivo en disco mediante una cadena de texto con la ruta y finalmente los permisos, en este caso SAFE.

SAFE es el permiso más restrictivo que hay, el más «seguro» para nuestro equipo pues limita mucho lo que pueda hacer la librería. En caso de que uses liberías de terceros es el permiso que te reportará más seguridad. Existe también el permiso EXTERNAL_ACCESS, que permite que el código acceda a ciertos recursos externos (registro, archivos, red) y el permiso UNSAFE, que da control sin restricciones a la librería sobre los recursos de la máquina. Si usas una librería propia puedes usar UNSAFE, pero si usas una de un tercero piensa que pueden entrañar riesgos de seguridad.

Con lo puesto ya tenemos la librería disponible en nuestra base datos. ¿Y ahora qué? Ahora simplemente puedes usar las clases y métodos de dicha librería en tu base. Puedes crear tus tipos de datos propios usando sus objetos, incluir sus métodos en procedimientos o triggers. En este ejemplo vamos a suponer que la librería importada tiene una clase Point que guarda las coordenadas de un eje X y un eje Y junto a un valor booleano, y tiene también una función GetCoordsAsText que muestra un mensaje largo con las coordendas. Vamos a crear un tipo de datos Point, usarlo en una tabla, acceder a los valores y usar el método GetCoordsAsText en una función. Pondré comentarios para ir explicando el proceso

--Creamos el tipo de datos Point como un objeto de la clase Point.
--Para acceder a la clase point tenemos que usar el método external name de SQL-Server
--accediendo a la clase mediante el nombre del assembly que creamos antes y el namespace de la clase (en 
--este caso point)
create type Point
external name Utilidades.Point 
go

--Creamos la tabla

create table dbo.Points
(
	id int identity primary key,
	valor Point
);
go

--Para acceder a los datos de la tabla debemos usar un método que nos devuelva
--los valores almacenados dentro del objeto en forma de texto (en este caso .X para el valor X, .Y para 
--el valor Y o .ToString() para sacar ambos en una columna como texto).

select id,
			valor.X as X,
			valor.Y as Y,
			valor.ToString() as Completo
from dbo.Points

--Si intentáramos acceder al objeto a pelo, como voy a poner debajo, nos devolvería el valor del objeto
--sin convertir (un churrazo con la dirección de memoria del puntero)

select valor from dbo.Points --así nos saldría un churo tipo 0x0000000100020000303000000

--También podríamos usar los métodos de la librería en una función, trigger, función de agregado,
--cursor... En este caso haremos una función que acceda a GetCoordsAsText (que está en la clase 
--UserFunctions)

create function dbo.CoordenadasComoTexto
returns nvarchar(50)
as
    external name Utilidades.UserFunctions.GetCoordsAsText

Y con esto tendríais la función que simplemente ejecuta el método definido en la dll y un tipo de datos igual al objeto. Las posibilidades de esto son muy grandes, así que podéis ir profundizando.

Aplicaciones offline en HTML5

Lee una página web offline siempre había sido posible. Descargabas la página y las hojas de estilos y listo, ya podías ojearla. Pero ¿y las aplicaciones? Eso ya era otra cosa, ahí ya estabas limitado.

HTML5 llega con la posibilidad de la creación de aplicaciones offline. Imaginemos que hemos puesto un juego creado en una etiqueta canvas con javascript (uno mismamente como CanvasRider), y queremos que el usuario pueda usarla aunque no esté conectado. Lo que tenemos que hacer es crear un archivo app.manifest listando los archivos que tienen que descargarse. Algo así:

#Cache para la aplicación offline
#HTML
index.html
#Javascript
_js/aplicacion.js
#CSS
_css/aplicacion.css
#Imágenes
_img/imagen1.png
_img/imagen2.png
_img/imagen3.png
_img/animacion.gif

Una vez hecho el archivo .manifest hay que enlazarlo con la web. Lo primero es meterlo como atributo en la etiqueta html del archivo hmtl principal:

<html manifest = "app.manifest" >

Se debe configurar el tipo MIME correcto en el servidor para que reconozca bien el archivo. Si usas Apache en la carpeta /conf/ encontrarás la carpeta mime.types, debes añadir al final:

#HTML5 applicacion cache_offline access
text/cache-manifest manifest

Si por lo que sea no puedes acceder a este archivo (tal vez porque tu empresa de hosting no te lo permita), puedes crear un archivo .htaccess en la carpeta web con este texto:

AddType text/cache-manifest .manifest

Cuando el usuario visita el sitio, el navegador compara los archivo manifest (local y remoto) y comprueba si son iguales. Si el archivo remoto cambió el navegador descarga todos los archivos listados en él. Es posible forzar al navegador a cargar determinados recursos siempre de la red, por medio de la instrucción NETWORK. Por ejemplo, si quisiéramos que una imagen siempre sea cargada desde el servidor, dentro del archivo manifest habría que declararlo así:

NETWORK:
imagen1.png

El problema de hacer esto es que si la aplicación se utiliza offline la imagen se tratará de cargar desde el servidor. Para solucionar esto se puede utilizar otra instrucción que especifica que si no existe conexión se cargue un archivo local, y si la hay se cargue el archivo desde el servidor. Este es la instrucción FALLBACK:

FALLBACK
imagen1.png imagen1Local.png

Y no sólo esto, sino que también podemos especificar que en caso de que estemos sin conexión se muestre la misma imágen para todas las imágenes de la página, tal que así:

FALLBACK
_img/ _img/imagen1Local.png

Mientras los archivos manifest se comparan y se descargan los nuevos archivos varios eventos se disparan en un objeto llamado ApplicationCache. Con este objeto, por ejemplo, podemos actualizar al usuario con los nuevos archivos descargados sin necesidad de volver a lanzar la aplicación.

El objeto window.applicationCache tiene varios métodos, pero los más destacados y útiles son:

  • cache.status: Nos muestra el estado de la app mediante una serie de constantes.
    • 0 = uncached
    • 1 = idle
    • 2 = checking
    • 3 = downloading
    • 4 = updateready
    • 5 = obsolete
  • cache.update(): Llama al proceso de descarga de cache. Lanza una excepción INVALID_STATE_ERR en caso de que no exista cache que actualizar.
  • cache.swapCache(): Cambia la cache mas reciente en caso de que exista uno, si no, arroja una excepción de tipo INVALID_STATE_ERR

Un pequeño ejemplo de cómo lograr actualizar la aplicación con los archivos nuevos sin recargarla:

cache = window.applicationCache;
cache.addEventListener('updateready',function{
    cache.swapCache();
},false);

Ubuntu Studio, la alternativa libre para tener tu estudio casero.

¿Eres de los que gustan de grabarse sus propias canciones en casa? ¿Te ha desquiciado trabajar con Windows? ¿Tu colega maquero te está comiendo la oreja para que te compres una manzanita? ¡Espera! Antes deberías probar la alternativa democrática (como diría Flecha Verde).

Ya ayer Aerilon comentaba el tema y en su página podréis encontrar también información sobre versiones antiguas del SO y tutoriales sobre el software que incluye.

Pero ¿qué te aporta UbutuStudio? UbuntuStudio es un sistema operativo pensado para el trabajo en el audiovisual. Ya seas un músico que se quiere grabar su maqueta casera, un videoartista, un tío que monta vídeos de bodas y comuniones o un programador de videojuegos, UbuntuStudio te ofrece un buen paquete de herramientas libres, drivers y estabilidad. Ofrece además soporte durante tres años, el liviano escritorio XFCE 4.8, kernel 3.2.14 de baja latencia.

En cuanto al audio, lo más destacable (lo que ya destaca Aerilon en su blog) es lo siguiente:

  • Ardour DAW
  • El previo de guitarra Guitarix
  • Audacity 2.0
  • QTractor DAW
  • Para el control de sesiones Gladish
  • Hydrogen Drum Machine 0.96
  • JAMin para la masterización
  • El editor de partituras MuseScore
  • Patchange y QjackCTL

Pero me reitero, que para temas de audio lo mejor es una visita a Aerilon. Pero como ya he dicho, no sólo de audio vive UbuntuStudio. También ofrece opciones para vídeo, como las siguientes:

  • El editor para stopmotion Stopmotion
  • El editor de vídeo Kino
  • El reproductor de vídeo sincronizable con JACK XJadeo

Y como no, un buen puñado para trabajar con gráficos:

  • El programa de animación 3D Blender
  • El software para edición de tipografías FontForge
  • El legendario editor gráfico GIMP
  • El editor vectorial Inkscape
  • El programa de animación 2D Synfig
  • La aplicación para publicaciones Scribus
  • El software para el «cosido» (stitching) de imágenes panorámicas Hugin

Herramientas libres para audio, video o diseño. Puedes grabarte tu propia maqueta, diseñar la portada, maquetar el libreto y editar el videoclip… ¿La calidad del resultado? Como siempre, depende de la calidad del artista. Tal vez como sistema operativo único no sea la mejor opción, por estar muy especializado en el trabajo de edición, pero puedes instalarlo junto a tu distri de Linux o a un Windows, para tener UbuntuStudio como tu herramienta para la edición, y por otra parte tu otro SO para las tareas de usuario medio. Puedes descargarlo desde softpedia en este link