9 de julio de 2013

Cambiar la resolución de la pantalla con xrandr y cvt

Cuando se enciende un ordenador o se enchufa un monitor, se lee de dicho monitor una información llamada EDID que contiene los datos sobre las frecuencias a las que funciona el monitor o las resoluciones soportadas.

Con xrandr podemos cambiar la resolución gráfica de la pantalla a través de la línea de comandos sin usar las opciones correspondientes a nuestro entorno de escritorio. Obviamente esto sólo tiene sentido si se ejecuta el comando desde una de las terminales virtuales con un servidor gráfico como X corriendo.

Algunos de los usos básicos de xrandr son:

Listar los monitores y las resoluciones que soportan
Basta con ejecutar el comando xrandr en la consola y nos devolverá los monitores enchufados, incluyendo su código. Por ejemplo, en mi caso al ejecutar xrandr se devuelve esto:

$ xrandr
Screen 0: minimum 320 x 200, current 1366 x 768, maximum 32767 x 32767
VGA1 connected 1366x768+0+0 (normal left inverted right x axis y axis) 410mm x 230mm
   1152x864       75.0  
   1024x768       75.1     70.1     60.0  
   832x624        74.6  
   800x600        72.2     75.0     60.3     56.2  
   640x480        72.8     75.0     66.7     60.0  
   720x400        70.1  
   1280x720       59.9  
   1366x768       59.8* 

Como veis en la parte superior del código devuelto, mi monitor lo detecta como VGA1. Este es un código que tendremos que usar en el resto de funciones para que xrandr sepa con qué monitor estamos trabajando (con el nuestro, con una TV o con un proyector...). También se muestran las distintas resoluciones que soporta y las frecuencias de refresco a las que funciona el monitor.

Establecer un modo de pantalla
Podemos establecer un modo de pantalla usando el comando:

$ xrandr --output <dispositivo> --mode <resolucion>

Donde <dispositivo> es el código del dispositivo con el que estamos trabajando (por ejemplo, VGA1 en mi caso), y <resolucion> es la resolución de pantalla que queramos usar y que por supuesto debe estar en la lista. Por ejemplo:

$ xrandr --output VGA1 --mode 1366x768

Añadir nuevos modos de pantalla no detectados
En algunos casos el EDID puede no ser leído correctamente y podría no ser posible establecer alguna resolución en concreto. Esto puede ser un problema ya que si estamos configurando un monitor TFT o un proyector no podríamos establecer la resolución óptima y eso podría tener el inconveniente de que la visión del monitor no será nítida, tal vez la resolución de aspecto no coincida...

Para solucionar eso podemos crear modos nuevos con la ayuda de otro programa llamado cvt. Con cvt podremos crear Modelines, que son definiciones de modos gráficos que pueden ser procesados por xrandr y establecidos como resoluciones.

Para usar cvt tenemos que usar dos o tres parámetros. Como mínimo tenemos que indicarle el ancho y el alto de la resolución que queremos crear, aunque también podemos indicarle la frecuencia de refresco. Por ejemplo:

$ cvt 1280 720       # 1280x720, frecuencia predeterminada
$ cvt 1280 720 60    # 1280x720, 60 Hz de refresco

Nos devolverá una línea con la información que le hemos pedido:

$ cvt 1280 720
# 1280x720 59.86 Hz (CVT 0.92M9) hsync: 44.77 kHz; pclk: 74.50 MHz
Modeline "1280x720_60.00"   74.50  1280 1344 1472 1664  720 723 728 748 -hsync +vsync

Este código podemos introducirlo en xrandr para añadir la resolución nueva. Tendremos que descartar la primera línea, que empieza con la almohadilla, ya que no es útil. Nos interesa la segunda línea, la que empieza con Modeline, aunque tampoco nos interesa esa palabra, sino que sólamente querremos introducir el bloque "1280x720_60.00"   74.50  1280 1344 1472 1664  720 723 728 748 -hsync +vsync.

Para agregar este modo a xrandr tenemos que usar la siguiente secuencia de comandos:

1. Crear el modo
Simplemente ejecutando el comando
$ xrandr --newmode <línea de Modeline>

donde <línea de Modeline> es lo que nos ha devuelto CVT, como ya hemos dicho a partir de la palabra Modeline pero sin incluir ésta misma. Por ejemplo:

$ xrandr --newmode "1280x720_60.00"   74.50  1280 1344 1472 1664  720 723 728 748 -hsync +vsync

2. Añadir el modo a una pantalla
Una vez creado el modo tendremos que añadir ese modo que hemos configurado a un monitor usando el comando

$ xrandr --addmode <dispositivo> <modo>

de modo que <dispositivo> es el dispositivo gráfico al que lo queremos añadir (como VGA1), y <modo> es el nombre del modo que hemos creado, que es ese código que venía entre comillas en la línea generada con cvt, por ejemplo, "1280x720_60.00". De modo que esto se podría hacer así:

$ xrandr --addmode VGA1 1280x720_60.00

Ahora podemos ejecutar xrandr a secas para ver como ya ha sido añadido a la lista y podríamos establecer ese modo simplemente haciendo xrandr --set VGA1 --mode 1280x720_60.00. Como se ve, este código entre comillas que viene generado por CVT identifica al modo. Si os resulta un poco incómodo siempre podéis cambiarlo por algo más simplificado como por ejemplo "1280x720" a secas.

7 de julio de 2013

Directorios de usuario en Apache2 con userdir + PHP activo

Si tienes un ordenador multiusuario que tenga habilitado un servidor web y te interesa que cada usuario pueda tener su propia porción de dicho servidor para almacenar sus propios archivos, el mod userdir te resultará muy útil, ya que le da a cada usuario del sistema un directorio propio dentro del servidor, que se encuentra dentro de su carpeta de usuario, por lo que dentro de dicho directorio de usuario tendrá total control sobre los archivos y carpetas ahí alojados.

Para habilitar el mod userdir lo único que hay que hacer es ejecutar el comando para activar complementos de Apache indicando que se quiere activar userdir, y reiniciar el servicio de Apache2 para que los cambios se tengan en cuenta:

# a2enmod userdir
# service apache2 restart

Hecho eso, todos los usuarios son libres de crear una carpeta en su HOME llamada public_html. Para acceder a esa carpeta desde el servidor web, sólo hay que navegar en el navegador a la subcarpeta /~[usuario], donde ~ es el símbolo de la tilde, que puede ser escrito usando el carácter Alt Gr + 4 en un teclado estándar, y donde [usuario] es el nombre de usuario de Linux. Por ejemplo, si tu usuario es foo, tu carpeta será /home/foo/public_html, y para acceder desde un navegador web habrá que navegar hasta http://localhost/~foo, por ejemplo.

Por defecto PHP5 no está activado en los directorios de user_dir, pero esto es algo que podemos habilitar accediendo al archivo de configuración de PHP5, php5.conf, que por defecto se debería encontrar en la ubicación /etc/apache2/mods-enabled/php5.conf (dando por hecho que PHP5 está activo). Recuerda que necesitas ser superusuario o root para poder hacer los cambios que vamos a hacer.

Dentro de ese archivo encontrarás una sección cuyo contenido será algo parecido a esto:

<IfModule mod_userdir.c>
    <Directory /home/*/public_html>
        php_admin_value engine Off
    </Directory>
</IfModule>

Habrá que comentar o eliminar la línea que dice php_admin_value engine Off. Hecho eso, guardar los cambios en el archivo, y volver a reiniciar el servicio de Apache2 para que se actualicen las configuraciones usando de nuevo el comando

# service apache2 restart

Hecho eso, podrás crear archivos PHP dentro de las carpetas public_html y comprobarás que puedes ejecutar códigos PHP.

5 de julio de 2013

Descomprimir tarballs (.tar.gz) desde la terminal

Del mismo modo que anteriormente comentamos cómo crear archivadores en formato tarball desde la terminal, hoy vamos a ver cómo descomprimirlos. Si no tenemos acceso a un entorno gráfico (por ejemplo, porque sea una sesión de SSH o porque no haya ningún entorno instalado), o si no queremos usar el entorno para hacer algo que se puede hacer desde la terminal, podemos descomprimir archivadores de tipo .tar.gz usando comandos en la terminal.

Para descomprimir un archivador, podemos usar simplemente el siguiente comando tar, suponiendo que el archivo se llame archivador.tar.gz (probablemente no, así que tendrás que sustituirlo por el nombre del tarball que estás intentando descomprimir):

tar -zxvf archivador.tar.gz

Con esto extraerás el archivo en la carpeta en la que te encuentres. Si dentro del archivador hay una carpeta con todos los archivos dentro, se extraerá tal cual esa carpeta con todos sus archivos, dentro de ella. Si dentro del archivador hay varios archivos directamente en la raíz, la carpeta en la que te encuentres se llenará con todos esos archivos. Tenlo en cuenta.

Por eso, puedes cambiar el directorio en el que se extraen los archivos usando el parámetro -C, un espacio, y el directorio en el que quieres extraer los archivos. Por ejemplo, para extraer el archivador Informes2012.tar.gz en la carpeta ~/Documentos/AntiguosInformes, independientemente de donde se encuentre originalmente el archivador, el comando que puede usarse es:

tar -zxvf archivador.tar.gz -C ~/Documentos/AntiguosInformes

El resto de parámetros que se usan al principio del comando tar son:

  • x: Indica que se quiere extraer un archivador.
  • z: Indica que el archivador está comprimido en formato GZip, por lo que antes de extraer el archivador habrá que descomprimirlo.
  • v: Pide que se muestre en pantalla los nombres de los archivos según se van extrayendo. Para hacerlo más silencioso puede omitirse esta letra, en cuyo caso no verás esa información.
  • f: Indica que se quiere trabajar con un archivo, cuyo nombre se indica a continuación (por eso el nombre del archivador se escribe tras la F).

3 de julio de 2013

Comprimir tarballs (.tar.gz) desde la terminal

Si no podemos trabajar con un entorno gráfico en nuestra máquina Linux, porque no haya ningún entorno instalado, o porque estemos trabajando en una sesión SSH, o porque simplemente no nos da la gana abandonar la terminal para comprimir o descomprimir un archivo o una carpeta, podemos usar la terminal para crear tarballs (esos archivos comprimidos que terminan en .tar.gz) o para descomprimirlos.

Si queremos comprimir un conjunto de archivos y carpetas, la forma más rápida es usar el comando CD para ir a la carpeta padre en la que se encuentre la carpeta cuyos archivos queremos comprimir. Por ejemplo, si queremos comprimir los archivos que se encuentran dentro del directorio ~/Documentos/Abril_2013, nos iremos a la carpeta ~/Documentos ya que es donde se encuentra la carpeta Abril_2013, cuyos archivos queremos comprimir.

Una vez dentro, ejecutamos el siguiente comando para comprimir esa carpeta en un archivo llamado anteriores.tar.gz. Este nombre es un ejemplo, cámbialo por el nombre que quieras que tenga pero terminado siempre en .tar.gz:

tar -czvf anteriores.tar.gz Abril_2013

Esto archivará el contenido de la carpeta en un archivador llamado anteriores.tar y luego lo comprimirá para crear anteriores.tar.gz. Los cuatro parámetros en forma de letra que indicamos al principio significan lo siguiente:
  • c: Indica que queremos crear un archivo.
  • z: Indica que queremos comprimir ese archivo usando Gzip (.gz).
  • v: Indica que queremos que nos muestre por pantalla los archivos que ha procesado. Podemos omitir esta letra si queremos que no nos escriba en pantalla esa información.
  • f: Indica que debe crear un archivo con los datos procesados, cuyo nombre se indica a continuación.
Si queremos comprimir varios archivos o carpetas en un mismo archivador; por ejemplo, queremos crear un archivador con dos carpetas, o no queremos irnos a la carpeta superior porque hay archivos en la carpeta que no queremos incluir, podemos simplemente irnos directamente a la carpeta donde se encuentran los archivos que queremos comprimir (por ejemplo ~/Documentos/Abril_2013) y ejecutar el siguiente comando, indicando tras el nombre del archivador los nombres de todos los archivos y carpetas a comprimir separados por espacios. Si un archivo tiene espacios debemos anteponer una barra lateral (\) delante del espacio del archivo para que no lo considere como una separación entre dos archivos:

tar -czf anteriores.tar.gz InformeVentas.pdf InformeCompras.pdf Informe\ Resultados.pdf