jueves, 8 de febrero de 2018

¿Hello World en Sonic Pi?

¿Hello World en Sonic Pi?

Llevo un tiempo programando en Sonic PI, un entorno de programación que posee un lenguaje propio orientado al aprendizaje de la programación y que nos permite interpretar o crear nuestra propia música. Sonic PI está desarrollado por el Laboratorio de Computadoras de la Universidad de Cambridge y se distribuye de manera gratuita en diferentes versiones (Windows, MacOS, Raspberry Pi y Linux) bajo licencia MIT



Hace unos días empecé a preparar materiales de Sonic Pi para un curso y como buen profesor de un nuevo lenguaje intenté seguir la tradición preparando el típico "Hola Mundo" con el que muchos de los manuales de programación de diferentes lenguajes suelen comenzar, sin embargo en Sonic Pi lo que se programa es música y aunque el lenguaje tiene la instrucción print que nos muestra en el panel de salida el texto que pasemos como argumento pensé que no tenía mucho sentido comenzar el aprendizaje de un lenguaje diseñado para crear música con un programa que diga "Hola Mundo".



Muy soso para todas las posibilidades de este lenguaje.... ;-)

Por lo tanto empecé a pensar que debía existir alguna melodía que tuviera el significado de "Hola Mundo" y evidentemente para alguien ligeramente friki como yo la hay. No sé si habéis visto esa película de Steven Spielberg que se llama "Encuentros en la tercera fase"....

Encuentros en la tercera Fase de Steven Spielberg

En la que se utiliza una combinación de notas musicales como un código para comunicarse con los extraterrestres a modo de un "Hola Mundo". Por lo tanto y después de investigar un poco ya que de oído ando un poco flojo fui capaz de implementar estas 10 simples instrucciones que pueden ser un buen ejemplo de "Hola Mundo" en este lenguaje y que nos puede dar una idea de lo que se puede hacer con una sintaxis simple y fácil de entender.


De hecho existen muchas más posibilidades y estoy seguro que mi aportación podría mejorarse, ¿te animas a descargar Sonic Pi y empezar a aprender programación implementando alguna melodía? :-)

sábado, 7 de octubre de 2017

Dos horas de diferencia entre Windows 10 y Linux, problemas en el reloj del sistema en equipos con arranque dual

Un curioso problema que se me ha dado en equipos con arranque dual Linux-Windows ha sido que la hora del sistema variaba bastante dependiendo del Sistema Operativo arrancado. Si en algún momento necesitaba cambiar de Sistema Operativo experimentaba un misterioso "viaje en el tiempo" y si, por ejemplo cerraba sesión en Linux a las 13:05 cuando entraba en Windows eran las 11:06 (dejemos un minutito extra para el cierre de un sistema y el arranque de otro).



La variación en mi caso era de dos horas más en Linux (o dos horas menos en Windows) aunque investigando el tema he visto que dependiendo de la zona horaria podemos tener otras variaciones. Esto sucede debido a que en Linux la hora del reloj del sistema se trata en formato UTC  mientras que en el caso de Windows se interpreta en formato de hora local. Puesto que cada sistema trabaja con el reloj de la BIOS de manera diferente vamos a tener un curioso desfase horario salvo que solucionemos el problema. De las dos posibles soluciones, configurar Linux para que gestione el formato en hora local o configurar Windows para que use UTC personalmente prefiero esta última, así que dejaré aquí los pasos para arreglarlo por si alguien se encuentra este problema y quiere solucionarlo, debo decir que en foros he encontrado muchas variaciones distintas con posibles soluciones, yo dejo la mía probada al 100%. :-)

Editando el registro de Windows 

Necesitamos editar el registro de windows, aunque se puede hacer desde línea de comandos en mi caso lo hice directamente desde el editor de registro de Windows. Basta hacer clic en el botón Inicio de Windows y tecleamos regedit:


Después de que el sistema nos pregunte si queremos continuar con esta acción nos encontramos el editor de registro. 


En la parte de la izquierda de la ventana vamos desplegando el árbol de claves hasta llegar a la siguiente ruta:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation

Si lo hemos hecho correctamente nos encontraremos con una pantalla como la siguiente....


Ahora debemos crear un nuevo valor, en el caso de que nuestra versión de Windows sea de 64 bits debemos crear un QWORD mientras que si es de 32 bits el valor a crear será del tipo DWORD. Para añadirlo podemos hacerlo desde el menú Edición > Nuevo y elegimos el tipo de valor a crear o simplemente en el menú contextual que sale al hacer clic derecho sobre el panel derecho de la ventana.




El nombre del valor a crear en los dos casos es RealTimeIsUniversal y su valor debe ser 1.




En mi caso y simplemente realizando estos pasos ya he conseguido que la hora en los dos sistemas esté coordinada. En la wiki de Ubuntu he leído que es recomendable deshabilitar la Herramienta de Servicios de Tiempo de windows (W32tm.exe) mediante el siguiente comando:


Aunque en mi caso no ha sido necesario y por el momento no he vuelto a hacer viajes en el tiempo al pasar de Windows a Ubuntu o viceversa. Por otro lado también existe otra solución, como pasar la hora de Linux a formato Local Time, podéis verlo en el enlace inferior de la Wiki de Ubuntu

Saludos
Jorge

Fuente: Ubuntu Wiki- Multiple boot systems time conflicts 


domingo, 27 de agosto de 2017

Cómo evitar que Windows bloquee el acceso a las unidades NTFS en instalaciones duales Windows-Linux

Por motivos de trabajo utilizo un portátil en el que tengo instalado Windows 10 y Ubuntu 16.04. En el equipo cambié la unidad de DVD original por un caddy con un disco duro en el que tengo varias particiones NTFS a las que accedo desde los dos sistemas operativos, sin embargo y después de reinstalar la partición Windows me encontré con un problema, cada vez que accedía a las particiones en Windows estas quedaban bloqueadas para el acceso desde Linux. El sistema me mostraba el siguiente error al intentar entrar:


Las primeras veces no me di cuenta de cuál era la causa del problema y me dediqué a resolver el "síntoma" más que atacar la "enfermedad", para ello utilizaba ntfsfix:


Y aunque esto me dejaba acceder de nuevo a la partición desde Linux era un poco molesto tener que ejecutar ntfsfix cada vez que me ocurría. Empecé a investigar un poco y leyendo los mensajes de error me fijé especialmente en este texto... The NTFS partition is in an unsafe state. Please resume and shutdown Windows fully (no hibernation or fast restarting), parecía que Windows no cerraba las particiones correctamente al apagar y estas quedaban en un estado de "hibernación" o "inicio rápido" que hacía que el sistema de ficheros de Linux no pudiese acceder para evitar causar algún tipo de problemas. Así que volviendo a Windows intenté ver dónde podía configurar esos estados en las unidades de disco duro y después de trastear un poco encontré esta opción:


Dentro de las Opciones de energía del Panel de Control hay un enlace que permite Cambiar las acciones de los botones de inicio/apagado. Al acceder al enlace se nos presenta una pantalla en la que aparece el famoso "Inicio Rápido" al que se refería el mensaje de error de Ubuntu y que en mi equipo estaba activado:


Investigando un poco qué era esa opción descubrí que permite que los equipos Windows arranquen más rápidamente ya que los discos se quedan en un estado de hibernación. Este estado es el que impide a Linux acceder a las particiones ya que al no estar "desmontadas" de manera adecuada Linux no puede acceder a ellas ya que podría dañarlas si realizase algún cambio. Deshabilitando esa opción en Windows conseguí de nuevo acceder a las particiones desde Linux y la única diferencia que note fue que Windows tardaba un poco más apagar el equipo que antes. 


Saludos
Jorge

sábado, 4 de marzo de 2017

Transparencias de introducción a XPATH y XSLT para la asignatura de Lenguajes de Marcas

Hola,

Por si a alguien le sirve de ayuda dejo aquí las transparencias que utilizo en la asignatura Lenguajes de Marcas del Ciclo Formativo de Grado Superior de Administración de Sistemas Informáticos en Red para dar una sencilla introducción a la transformación de documentos XML mediante XPath y XSLT.

 INTRODUCCIÓN A XPATH



INTRODUCCIÓN A XSLT

Introducción a XSLT de Jorge Castellanos Vega

Espero que os sirva :-)

Saludos
Jorge

jueves, 23 de febrero de 2017

Profeeeee! he olvidado la contraseña de MySQL

Cuando uno lleva impartiendo clases de bases de datos bastante tiempo hay algunas situaciones que son recurrentes, no importa el software utilizado, la versión, las máquinas o la procedencia del alumnado, siempre hay algún alumno que en el día menos pensando justo en el momento de acceder a MySQL comenta... "Profeee, no me acuerdo de la contraseña de MySQL". Esta situación, tan habitual a la vuelta de vacaciones la suelo resolver en dos pasos:
  • La primera vez ayudo al alumno indicando los pasos para recuperar la contraseña
  • La segunda vez le recuerdo que ya le expliqué cómo lo hacía y que como buen informático es el momento de que recupere el acceso a su servidor. Esto que podría ser interpretado como de "mal profesor" suele dar mejores resultados ya que no conozco ningún alumno que una vez que se haya enfrentado al problema y lo haya resuelto por si mismo me haya vuelto a decir eso de "Profeee!, he olvidado la contraseña de MySQL".

Sin embargo la última vez que me ha ocurrido esta situación me di cuenta de que había un pequeño cambio en la sintaxis de la sentencia de establecimiento de contraseña a partir de la versión 5.7.6 de MySQL por lo que a partir de este momento es importante ser consciente de qué versión de MySQL estamos utilizando. Para ello podemos utilizar el siguiente comando desde el prompt de linux:

$ mysql -V

En mi caso ya estoy trabajando con una versión posterior a la 5.7.6. En todo caso la mayoría de pasos para recuperar la contraseña en todas las versiones son similares y solo cambia la sentencia final.

1. Paramos el servicio

$ sudo service mysql stop

2. Lo arrancamos de nuevo sin cargar las tablas de permisos:

$ sudo mysqld_safe --skip-grant-tables &

En el caso de que nuestro servidor permitiese conexiones remotas, opción que viene deshabilitada por defecto con la opción de bind_address en el fichero de configuración de MySQL podría ser interesante la incorporación de la opción --skip-networking en la instrucción anterior.

3. Accedemos al servicio como usuario root, pero ahora no es necesaria la contraseña

$ mysql -u root


4. Y cambiamos la contraseña con una sentencia SQL... Pero claro, en este paso es donde hay que estar atento porque dependiendo de nuestra versión de MySQL el comando será diferente dentro del prompt MySQL.

Para versiones de MySQL anteriores a la 5.7.6 normalmente realizaba los dos pasos siguientes:

Acceder al esquema mysql.

mysql > use mysql;

Y cambiar el valor de la contraseña directamente con una sentencia SQL de actualización:

mysql > UPDATE user SET password=PASSWORD("NuevaContraseña") WHERE user='root';

Otra posibilidad que es la que recomienda el propio manual de MySQL y que no solía usar es:

mysql > SET PASSWORD FOR 'root'@'localhost' = PASSWORD('NuevaContraseña');

Que además parece que hasta el momento funciona en todas las versiones.

Sin embargo, la documentación oficial de MySQL indica que para versiones 5.7.6. y posteriores se debe usar:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'nuevaContraseña';

Esto es debido a que a partir de esta versión de MySQL los comandos de gestión de usuarios han cambiado. Es más, la sentencia UPDATE que solía utilizar ahora genera este error que inicialmente te deja bastante despistado.

mysql> ERROR 1054 (42S22): Unknown column 'password' in 'field list'

En todo caso con las dos otras opciones que indico todo debería funcionar y nuestro alumno despistado podría volver a acceder a su servidor MySQL simplemente  arrancando de nuevo el servicio después de los cambios anteriores.

$ sudo service mysql restart


viernes, 3 de febrero de 2017

Una práctica sencilla para el aula de redes, chat vintage mediante Netcat

Netcat es una herramienta de red que permite escribir y leer en puertos UDP y TCP sobre el protocolo TCP/IP,  Conocida como la "Navaja suiza de los Hackers" por su versatilidad tiene muchas aplicaciones. Personalmente una de las que más me gusta por el toque "vintage"es la posibilidad de crear un chat entre terminales de diferentes equipos con un par de instrucciones. Entiendo que en la época de whatsapp, telegram y similares esto queda un poco desfasado pero para aprender a usar la herramienta es una práctica sencilla y que llama bastante la atención en el aula.

Pasos a realizar

Necesitamos dos máquinas que se vean en red, en mi caso he usado dos máquinas virtuales de Ubuntu 16 sobre VirtualBox. En la primera de ellas he ejecutado la siguiente instrucción:


Simplemente para saber qué puertos están abiertos. Es cierto que hay 65535 pero más vale no tentar a la suerte y evitar elegir un puerto utilizado. Además esta orden también nos puede servir para instruir a los alumnos sobre algunas de las opciones de netstat y las divertidas maneras de formar palabras para recordar las opciones del comando.

En este caso y puerto que tenemos puertos libres de sobra he elegido el 45678.


Con esta instrucción indicamos a Netcat que ponga un proceso en escucha (-l de listen) bajo protocolo UDP (la opción -u) en el puerto 45678 (opción -p)

Ahora nos vamos a la máquina remota donde ejecutaremos la instrucción:


Donde especificaremos que queremos establecer una conexión en UDP (opción -u) a la ip 192.168.143 en el puerto 45678

Si todo lo hemos hecho de manera correcta observaremos que lo que se escribe en la máquina Andrómeda se muestra en la pantalla de Casiopea y viceversa. A partir de este momento la práctica en el aula se puede modificar para que los alumnos aprendan el funcionamiento de las conexiones a nivel UDP vs TCP con diferentes pruebas utilizando el comando. También se puede ver qué ocurre si un tercer alumno intenta conectarse al mismo puerto como cliente y ver como el comando netstat muestra ahora los puertos abiertos. Las posibilidades son muchas y solo habrá que vigilar que no usen esta técnica para comunicarse en un examen.... :-P




domingo, 22 de enero de 2017

Backup físico en MySQL de bases de datos con motor de almacenamiento InnoDB

En ocasiones queremos migrar una base de datos MySQL de un servidor a otro de la manera más rápida posible. De las múltiples opciones de copia de seguridad existentes la copia física estará siempre entre las más rápidas. Sin embargo dependiendo del motor de almacenamiento tendremos que aplicar una técnica u otra, en este caso vamos a ver cómo realizar una copia física de base de datos sobre el motor de almacenamiento InnoDB que es uno de los más comunes entre los que cumplen las características ACID de MySQL


Comenzando...

Para comenzar hemos creado una instalación de MySQL 5.7.17. en una máquina virtual de Ubuntu 16.04 Desktop de nombre "Antares", en esa instalación hemos creado una pequeña base de datos denominada portable que nos servirá para comprobar que la migración se ha realizado correctamente.

Imagen 1. Estado de la base de datos original (máquina Antares)

Apagado lento del servidor

En primer lugar, se hace necesario pasar el servidor para realizar una copia de archivos en un estado seguro, para asegurarnos que la parada el servidor se hace de la mejor manera posible debemos consultar el valor de la variable de servidor innodb_fast_shutdown que especifica la manera en la que se va a realizar la parada del sistema:

  • Si el valor es 0 InnoDB realiza un apagado lento limpiando y fusionando el buffer de cambios antes de apagar.
  • Si el valor es 1(por defecto) el servidor se apaga pero no realiza esas operaciones (proceso conocido como apagado rápido)
  • Si el valor es 2 InnoDB aplica sus logs y se apaga en frío de manera similar a una caída de la aplicación. No se perderán las transacciones aplicadas pero las operaciones de recuperación al iniciar su servidor pueden tomarse su tiempo.

En nuestro caso cambiamos el valor a 0.



Imagen 2. Cambiando el valor de innodb_fast_shutdown

A continuación nos aseguramos que conocemos la ruta del directorio de datos de MySQL (habitualmente /var/lib/mysql), en todo caso lo podemos consultar en la variable de servidor datadir.



Una vez que estamos seguros de la ubicación de los datos detenemos el servidor.


Haciendo el backup de los archivos

Ahora simplemente tenemos que hacer una copia de los archivos originales, para ello basta mirar el manual de MySQL que indica para estos casos cuáles son los archivos importantes:


  • Archivos de datos InnoDB (archivos ibdata y .ibd).
  • Archivos .frm correspondientes a las tablas InnoDB.
  • Archivos de registro Innodb (archivos ib_logfine).
  • Archivo de configuración my.cnf. Muy útil en el caso de que el servidor destino tenga una configuración distinta.
Imagen 3. Generando un archivo comprimido con los datos necesarios para el backup


Restaurando en el servidor de destino


A continuación y con el archivo de backup listo nos movemos a nuestro servidor de destino (hostname Andromeda) que tiene una configuración similar al original. En este caso trabajaremos a partir de una instalación limpia en otra máquina:

Imagen 4. Estado de la base de datos MySQL en el equipo destino antes de restaurar

En primer lugar y para evitar problemas realizamos un apagado lento del servidor, tal y como hicimos en el servidor original. Esto realmente puede no ser necesario pero uno ha visto ya muchas cosas raras cuando en informática no se toman todas las precauciones...


Imagen 5. Apagado lento del servidor


Accedemos al directorio de datos donde restauraremos el archivo de backup:

Imagen 6. Directorio de datos equipo de destino antes de restaurar


Descomprimimos el archivo:

Imagen 7. Descomprimimos el archivo de backup

Después borramos nuestra copia de seguridad del directorio de datos de MySQL, cerramos sesión con el usuario root y lanzamos de nuevo el servicio MySQL, si hemos hecho todo correcto veremos que en la máquina en la que hemos realizado la restauración aparece la base de datos original y podemos realizar operaciones sobre ella sin problemas. No hay que olvidar que puede que queramos volver a establecer el apagado lento a valor 1, para ello basta modificar el valor de la variable como se hizo para establecerlo a 0.

Imagen 8. Base de datos restaurada en otro equipo y funcionando




¿Hello World en Sonic Pi?

¿Hello World en Sonic Pi? Llevo un tiempo programando en  Sonic PI , un entorno de programación que posee un lenguaje propio orientado al...