Hosts Virtuales en Apache 2 (Ubuntu)

Lo que sigue es una breve nota técnica que me sirva (y a otros) como recordatorio para la próxima vez , dado que hoy he perdido un rato con la configuración de un host virtual en Ubuntu (en Fedora lo tenía todo ya hecho, y sólo era copiar y pegar 🙂

En /etc/apache2 disponemos de varios subdirectorios, dos de ellos importantes para nuestra tarea. El primero sites-available y el segundo sites-enabled.

Los ficheros de configuración de los hostings virtuales se configuran en sites-available. El segundo subdirectorio sólo contiene enlaces a aquellos virtulhost que queremos activar.

Queremos crear un virtualhost de nombre hackit. Es decir, cuando ponga en mi navegador http://hackit me debe de llevar a la página principal de ese host. Si pongo http://localhost me llevará al virtualhost por defecto (distinto del de hackit).

Lo primero, creo una nueva entrada en /etc/hosts (mantengo lo que había y añado lo siguiente):

127.0.0.1 hackit

Copio los archivos del nuevo site en /var/www/hackit.

Comienza el procedimiento de configuración del nuevo virtualhost en Apache2:

$ cd /etc/apache2/sites-available

Edito las dos primeras líneas del fichero default para que queden así:

NameVirtualHost *:80
<VirtualHost *:80>
$ cp default hackit

Edito hackit para que las primeras líneas queden así:

<VirtualHost *:80>
ServerAdmin webmaster@hackit

ServerName hackit

DocumentRoot /var/www/hackit
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/hackit>
$ cd /etc/apache2

El siguiente comando, a2ensite (available2enablesite) crea un enlace en sites-enable al site que le indiquemos (es decir, activa el virtualhost que acabamos de crear)

# a2ensite hackit

Comprobamos:

$ ls -al sites-enabled/

Recargamos apache2:

#/etc/init.d/apache2 force-reload
Listo!

Python Challenge: aprende a programar jugando

Hacía tiempo que no me divertía tanto con un juego informático. Teóricamente www.pythonchallenge.com es una web para aprender a programar en Python, pero puede usarse cualquier otro lenguaje. El objetivo es encontrar la solución a distintos problemas que plantea cada nivel de este reto. Hay 33 niveles, a cada cual más complejo 🙂 Los 4 primeros son facilitos, basta con pensar un poquito y conocer cómo calcular potencias, manipular cadenas de texto, expresiones regulares, leer ficheros de texto… en tu lenguaje de programación favorito. Pero a partir del nivel 5 la cosa se complica… y se pone interesante. No hay premios en sentido estricto; el mejor premio es la satisfacción que da pasar cada nivel con tus propios conocimientos y herramientas. Cuando encuentres la clave de un nivel, para poder pasar al siguiente, basta con que la pongas en la url. Por ejemplo, si la url del primer nivel 0 es http://www.pythonchallenge.com/pc/def/0.html bastaría con que cambiaras 0.html por el texto de tu solución: http://www.pythonchallenge.com/pc/def/texto_de_tu_solucion.html

Si te atascas en algún nivel, puedes encontrar pistas en los foros. Si tampoco así consigues pasar, puedes preguntar en los comentarios de este post, y si hay alguien que haya llegado a la solución, podrá ayudarte (evitad spoilers!!!!) 😉

¡Ojo! Es muy, muy adictivo 🙂

Jornada en la Facultad Informática de Donostia

El próximo martes 22, si estudias o trabajas cerca de Donostia (San Sebastián), probablemente te interese acudir a la jornada que hemos organizado bajo el título:
Cómo trabajar con Software Libre en la FACULTAD (y sobrevivir 😉

Entre los temas a tratar:

+ Cómo ganar dinero con software libre en la Facultad (Juanan Pereira)

+ Google Summer of Code:
+ Desarrollo de aplicaciones en GNOME. Caso práctico: EVINCE
(Iñigo Martínez)
+ Desarrollo de plugins para Moodle. Caso práctico: Epaile
(Arkaitz Garro)

+ Diseña tu propia distro Linux con EHUX 3.
(Aitor Cuartango)

Será en el salón de grados de la Facultad de Informática de Donostia, de 16 a 18. ¡Anímate!

Cómo recuperar el password de admin en MySQL

Recientemente, instalando una aplicación para la gestión de reservas, me llevé la desagradable sorpresa de que en el script SQL de carga de datos, se eliminaban los permisos del usuario root y los dejaba con los mínimos posibles (visualizar tablas y editarlas, pero sin poder crear nuevas BBDD, ni usuarios, ni tablas, ni…) O sea, un desastre. Pero buscando en Internet, encontré la forma de recuperar todos los permisos del usuario root. Incluso se puede usar el método que describo a continuación para resetear el password de root en MySQL a otro que conozcamos (por si se nos olvida el original).

Lo primero, parar/matar los procesos de MySQL que ya estén en marcha:

 /etc/init.d/mysql stop

Relanzar el servidor MySQL, PERO indicándole que no tenga en cuenta ninguna gestión de permisos
(¡via libre!)

  /usr/bin/mysqld_safe --skip-grant-tables &

Conectar con MySQL, SIN password, a la BBDD principal de gestión (que lleva el nombre mysql)

mysql -h your_hostname mysql

Darle permisos al root para TODO. Indicar el nuevo password:

mysql

update user

set Select_priv='Y',

          Insert_priv='Y',

          Update_priv='Y',

          Delete_priv='Y',

          Create_priv='Y',

            Drop_priv='Y',

          Reload_priv='Y',

        Shutdown_priv='Y',

         Process_priv='Y',

            File_priv='Y',

           Grant_priv='Y',

      References_priv='Y',

           Index_priv='Y',

           Alter_priv='Y',

         Show_db_priv='Y',

           Super_priv='Y',

Create_tmp_table_priv='Y',

     Lock_tables_priv='Y',

         Execute_priv='Y',

      Repl_slave_priv='Y',

     Repl_client_priv='Y',

     Create_view_priv='Y',

       Show_view_priv='Y',

  Create_routine_priv='Y',

   Alter_routine_priv='Y',

     Create_user_priv='Y'
     Password = PASSWORD('contraseña')
WHERE User='root';

Recargar los nuevos privilegios:

 FLUSH PRIVILEGES;

Salir del cliente MySQL. Parar MySQL y volverlo a lanzar normal:

 /etc/init.d/mysql start

Bufff! menos mal que existe este método 🙂

Cómo deshabilitar el sonido del altavoz interno

Suelo usar mucho los atajos de teclado Bash y el historial de comandos. En concreto, Ctrl-R y empiezo a teclear el comando que necesito. Si Bash encuentra un patrón que coincide con lo que estoy tecleando, perfecto, lo suelo usar o editar. Si no, Bash no hace «nada». Y lo pongo entre comillas porque cuando no encuentra ningún patrón que case, sí que hace una cosa: pitar (beep del altavoz interno). Y el dichoso pitidito me estaba volviendo loco. Sabía que había un comando para deshabilitarlo, pero no me acordaba y tampoco quería perder tiempo buscándolo. Hasta que me ha empezado a salir humo por las orejas. Ahí me he convencido a mí mismo para dedicarle 30 segundos a buscar la solución:

xset -b

Ese comando deshabilita el altavoz interno. Paz.