Hiparco

Recetas y trucos de GNU/Linux e informática en general

Alojado en http://guimi.net

Instalar controladores gráficos en GNU/Linux.

 

Controlador propietario NVIDIA

En Debian se puede configurar el driver de NVIDIA de manera sencilla, con permisos de administrador (root), con:

 module-assistant update
 module-assistant prepare
 module-assistant auto-install nvidia

Para ajustar la configuración:

 aptitude install nvidia-xconfig nvidia-settings
 nvidia-xconfig

Reiniciamos el entorno gráfico.

 nvidia-settings

Si funciona correctamente debería cargar el logo de NVIDIA al cargar el gestor gráfico.

 

Controlador Catalyst para tarjetas ATI

En Debian se puede configurar el driver Catalyst de ATI de manera sencilla con:

 aptitude -r install fglrx-control fglrx-driver
 aticonfig --initial

Aceleración gráfica en GNU/Linux

Instalamos las utilidades de MESA para verificar el uso de la aceleración gráfica:

 aptitude install mesa-utils

Verificamos el uso de aceleración gráfica (Direct Rendering):

 glxinfo | grep -i direct
direct rendering: Yes

Si no indica “Yes” no tenemos aceleración gráfica 3D y necesitaremos otro controlador gráfico:
Instalar controladores gráficos en GNU/Linux.

Hacemos una prueba rápida de funcionamiento:

 glxgears [-printfps]

Según la versión es necesaria la opción o no.

7095 frames in 5.0 seconds = 1418.880 FPS
6991 frames in 5.0 seconds = 1398.073 FPS

 
Una vez activada la aceleración gráfica se puede activar el escritorio 3D y efectos (Compiz Fusion), cuyo rendimiento dependerá mucho de la tarjeta y el controlador utilizados.

Flash Player / Flash Plugin en GNU/Linux

Debian viene con un programa libre de flash instalado (si instalas el servidor X y un escritorio por la vía simple) que lamentablemente todavía no funciona todo lo bien que debería. En concreto no reproduce bien vídeos, que es prácticamente lo único que yo uso.

Para instalar el Adobe Flash Player basta con hacer:

 aptitude install flashplugin-nonfree

Si se desea instalar manualmente (no hay porqué) se descarga de su web, se descomprime el archivo y se copia en la carpeta correspondiente.
Por ejemplo, para sistemas 32 bits, hay que bajar y descomprimir el Flash Player para linux de la página de Adobe y descomprimirlo:

 wget http://fpdownload.macromedia.com/get/flashplayer/pdc/11.1.102.55/install_flash_player_11_linux.i386.tar.gz
 tar xzf install_flash_player_11_linux.i386.tar.gz

Copiamos el plugin en el directorio común:

 cp libflashplayer.so /usr/lib/mozilla/plugins/

Solo falta reiniciar el navegador si estaba abierto.

Flash Player para 64 bits

Receta original de enchufado.

Primero realizamos la instalación normal del plug-in vista arriba.
Después instalamos el wrapper para plugins netscape:

 aptitude install nspluginwrapper

Por último generamos el envoltorio para el plugin de adobe:

 nspluginwrapper -i /usr/lib/mozilla/plugins/libflashplayer.so

Solo falta reiniciar el navegador si estaba abierto.

Fijar la tarjeta de sonido con alsactl

Si disponemos de más de una tarjeta de sonido puede ser necesario utilizar alsaconf para indicar al sistema qué tarjeta deseamos usar.
Después con alsamixer ajustamos los volúmenes.

Para que el sistema ‘recuerde’ lo que le hemos indicado debemos ejecutar:

 alsactl store

Para recuperar la configuración usamos:

 alsactl restore

Esto último puede indicarse en un script de inicio (en init.d) o al inicio de la sesión gráfica, por ejemplo.

En Gnome ‘Escritorio->Preferencias->Sesiones->Programas al inicio‘.

Generar un espacio común para distintos usuarios

Una receta sencilla y rápida para generar un espacio común para distintos usuarios. En el ejemplo creamos una carpeta “/home/usuarios” con permisos para todos los usuarios del grupo “users”.
Hay que ejecutar los comandos con permisos de administrador (root).

 cd /home
mkdir usuarios
chmod 2775 usuarios/
chown root:users usuarios/
ls -ld usuarios
drwxrwsr-x  2 root users 4096 2007-04-01 17:02 usuarios
 

Habilitar plug-in Java en Iceweasel (Mozilla Firefox) – Squeeze

Recordemos que los plugins Java son fuente de muchos problemas y es mejor si no lo tenemos. En todo caso se recomienda activarlo solo cuando se vaya a usar y solo para cosas fiables.

Hay otra receta para instalar el plug-in Java en Debian Wheezy.

Primero instalamos el plugin con (Debian Squeeze):

aptitude install sun-java6-plugin

Como usuario:

cd
mkdir .mozilla/plugins
cd .mozilla/plugins
ln -s /usr/lib/jvm/java-6-sun/jre/lib/i386/libnpjp2.so .
rm libjavaplugin_oji.so

Reiniciamos el navegador y podemos probar la instalación, por ejemplo, en la página de Java.

Truncar el pwd

Truncar el pwd que aparece en PS1.
Solo recomendable en usuarios, no en root.
Esto nos permite ver algo así:

 :.+cion/Prueba_de_d$ pwd
/home/guimi/direccion/Prueba_de_d

Para ello editamos el archivo del usuario ~/.bashrc:

 vi ~/.bashrc
# Funcion para truncar el pwd extraida de Debian-Administration.org
#+ <a href="http://www.debian-administration.org/articles/548" class="externo">http://www.debian-administration.org/articles/548</a>
#+ posted by mikhailian
function truncate_pwd
{
 if [ $HOME == $PWD ]
 then
   newPWD="~"
 elif [ $HOME ==  ${PWD:0:${#HOME}} ]
 then
   newPWD="~${PWD:${#HOME}}"
 else
   newPWD=$PWD
 fi

  local pwdmaxlen=15
  if [ ${#newPWD} -gt $pwdmaxlen ]
  then
    local pwdoffset=$(( ${#newPWD} - $pwdmaxlen  ))
    newPWD=".+${newPWD:$pwdoffset:$pwdmaxlen}"
  fi
}

PROMPT_COMMAND=truncate_pwd
PS1="${ttyname}@\[${HOST_COLOUR}\]\h\[${RESET_COLOR}\]:\${newPWD}\\$ "

Conocer la arquitectura de nuestro sistema (32 o 64 bits)

Tenemos varias opciones.

Podemos mostrar información del sistema instalado (toda)

guimi:~$ uname -a
Linux guimi 2.6.32-5-686 #1 SMP Mon Feb 25 01:04:36 UTC 2013 i686 GNU/Linux

O solo el nombre de la arquitectura instalada

guimi:~$ uname -m
i686

En este caso está instalada la arquitectura “i686″ que se utiliza 32 bits. Pero es un modo indirecto de saberlo.

Podemos mirar directamente la configuración del sistema instalado y ver que los bits del sistema:

guimi:~$ getconf LONG_BIT
32

Pero si lo que queremos es conocer la capacidad de nuestro equipo, podemos consultar el micro:

guimi:~$ lscpu
Architecture:          i686
CPU op-mode(s):        32-bit, 64-bit
CPU(s):                2
Thread(s) per core:    1
Core(s) per socket:    2
CPU socket(s):         1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 23
Stepping:              10
CPU MHz:               1999.000
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              6144K 

Ya puestos, podemos consultar toda la información del micro:

guimi:~$ cat /proc/cpuinfo 
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 23
model name	: Pentium(R) Dual-Core  CPU      E5200  @ 2.50GHz
stepping	: 6
cpu MHz		: 1203.000
cache size	: 2048 KB
physical id	: 0
siblings	: 2
core id		: 0
cpu cores	: 2
apicid		: 0
initial apicid	: 0
fdiv_bug	: no
hlt_bug		: no
f00f_bug	: no
coma_bug	: no
fpu		: yes
fpu_exception	: yes
cpuid level	: 10
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc arch_perfmon pebs bts aperfmperf pni dtes64 monitor ds_cpl est tm2 ssse3 cx16 xtpr pdcm lahf_lm
bogomips	: 5000.20
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

processor	: 1
vendor_id	: GenuineIntel
cpu family	: 6
model		: 23
model name	: Pentium(R) Dual-Core  CPU      E5200  @ 2.50GHz
stepping	: 6
cpu MHz		: 1203.000
cache size	: 2048 KB
physical id	: 0
siblings	: 2
core id		: 1
cpu cores	: 2
apicid		: 1
initial apicid	: 1
fdiv_bug	: no
hlt_bug		: no
f00f_bug	: no
coma_bug	: no
fpu		: yes
fpu_exception	: yes
cpuid level	: 10
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc arch_perfmon pebs bts aperfmperf pni dtes64 monitor ds_cpl est tm2 ssse3 cx16 xtpr pdcm lahf_lm
bogomips	: 5000.05
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

Manejo de cadenas y funciones en scripts bash (bash strign functions)

Dejo aquí un pequeño script con ejemplos de uso de funciones de cadenas y funciones de script.

#!/bin/bash
#
# bash_string_functions.sh
# Por Guimi 2013/01 - http://www.guimi.net
#

# Declaración sin la palabra 'function'
muestra_texto () {
	# Esta asignación no es necesaria
	# La realizo en esta primera función por claridad, en las siguientes trabajaremos con $1
	string_recibida=$1
	echo "La longitud de '$string_recibida' es '${#string_recibida}'"
	echo "A partir del caracter 3 tenemos '${string_recibida:3}'"
	echo "A partir del caracter 3, los siguientes 4 caracteres son '${string_recibida:3:4}'"
}

# Declaración con la palabra 'function'
function muestra_substring () {
	[[ $1 =~ "uno" ]] && echo -n "uno SÍ está en la cadena -- " || echo -n "uno NO está en la cadena -- "
	echo $1
}

# Declaración con la palabra 'function' sin ()
function prueba_substring {
	# Con ${string#substring} recortamos (eliminamos) de string lo que aparece ANTES de LA PRIMERA aparición de substring, empezando por el principio.
	muestra_substring ${1#*.}
	# Con ${string##substring} recortamos (eliminamos) de string lo que aparece ANTES de LA ULTIMA aparición de substring, empezando por el principio.
	muestra_substring ${1##*.}
	# Con ${string%substring} recortamos (eliminamos) de string lo que aparece ANTES de LA PRIMERA aparición de substring, empezando por el final.
	muestra_substring ${1%.*}
	# Con ${string%%substring} recortamos (eliminamos) de string lo que aparece ANTES de LA ULTIMA aparición de substring, empezando por el final.
	muestra_substring ${1%%.*}
}

prueba_reemplazar () {
	# Reemplazamos la PRIMERA aparición de '.' por '#'
	echo ${1/./-}
	# Reemplazamos TODAS las apariciones de '.' por '#'
	echo ${1//./-}
}

datos_script () {
	# Mostramos directorio, nombre y la extensión
	directorio=$(dirname $1)
	nombre_base=$(basename $1)
	extension="${nombre_base##*.}"
	nombre_base="${nombre_base%.*}"
	echo  "$directorio / $nombre_base . $extension"
}

# Función que devuelve un resultado
existe_string_demo () {
	if [ -n "$string_demo" ]
	then
		echo "SÍ"
	else
		echo "NO"
	fi
}

# Generamos una cadena
string_demo="uno.dos.tres.cuatro.cinco"
# Lanzamos las funciones
muestra_texto $string_demo && echo ""
prueba_substring $string_demo && echo ""
prueba_reemplazar $string_demo && echo ""

respuesta=$(existe_string_demo) && echo "La variable string_demo $respuesta existe"
unset string_demo
respuesta=$(existe_string_demo) && echo "La variable string_demo $respuesta existe" && echo ""

# Pasamos el nombre del script ($0) como parámetro
datos_script $0

# Terminamos
exit 0

Prueba de ejecución del script:

La longitud de 'uno.dos.tres.cuatro.cinco' es '25'
A partir del caracter 3 tenemos '.dos.tres.cuatro.cinco'
A partir del caracter 3, los siguientes 4 caracteres son '.dos'

uno NO está en la cadena -- dos.tres.cuatro.cinco
uno NO está en la cadena -- cinco
uno SÍ está en la cadena -- uno.dos.tres.cuatro
uno SÍ está en la cadena -- uno

uno-dos.tres.cuatro.cinco
uno-dos-tres-cuatro-cinco

La variable string_demo SÍ existe
La variable string_demo NO existe

. / bash_string_functions . sh

Modifica metadatos de libros-e

Aquí dejo un script para modificar/consultar los metadatos de una biblioteca de libros-e.
La idea base es que puedo partir de una biblioteca organizada con subdirectorios y modificar/consultar todos los libros-e.
Para casos más sencillo basta con ebook-meta del que este script es tan solo un ‘wrapper’.

#!/bin/bash
#
# libros-e_metadata.sh
# Por Guimi 2013/01 - http://www.guimi.net
#

####################################
# REQUISITOS
# calibre -> ebook-metadata


####################################
#### ERRORES
E_PARAMINVAL=64     # Parametro invalido

####################################
#### AYUDA
muestra_ayuda ()
{
  echo "Use `basename $0` -h para ver la ayuda" >&2
}

muestra_ayuda_larga ()
{
  more << EOF

libros-e_metadata.sh
(c) 2013 Guimi (http://guimi.net)
This software is under the GNU Public License (GPL) v.2

Este script utiliza ebook-meta (calibre) para modificar y mostrar metadatos de ficheros epub de forma recurrente (subdirectorios)

Options:
---------
  -a
  --auto
	Utiliza el nombre del fichero para escribir el autor y titulo del libro en los metadatos
	Presupone el siguiente formato de nombre de archivo: autor-titulo.epub
	Ademas presupone que [autor] es: [1er apellido]_[resto] o [solo una palabra]

	Ejemplos:
		Platon-Escritos_completos.epub
		Sagan_Carl-Cosmos-ed.aniversario.epub

  -h
  --help
    Muestra esta ayuda

  -l
  --limpia
	Borra los metadatos de los campos comentarios, titulo de orden, productor y publicación

  -m [metadatos]
  --metadatos [metadatos]
	Escribe los metadatos dados, utilizando ebook-meta (ver ebook-meta --help)
	La cadena de metadatos debe estar entrecomillada

	Ejemplo:
		libros-e_metadata.sh -m "-l es -c 'Excelente libro'"

  -v
  --verbose
    Muestra todos los metadatos

EOF
}


####################################
# PARAMETROS

# Parámetros por omisión
string_parametros=""

# Comprobacion de parametros
while [ $# -gt 0 ]; do    # Mientras tenemos parámetros...
  case "$1" in
    -a|--auto) # Escribe metadatos a partir del nombre de fichero
      AUTO='0'
      ;;
    -h|--help) # Muestra la ayuda larga
	  muestra_ayuda_larga
      exit 0
      ;;
    -l|--limpia) # Limpia algunos metadatos
	  LIMPIA='0'
      ;;
    -m|--metadatos) # Escribe metadatos
      # Comprobando si hay mas parámetros
      if [ -z "$2" ]
      then
        echo "Error: Falta la cadena de metadatos" >&2
        muestra_ayuda
        exit $E_PARAMINVAL
      else
        string_parametros="$2"
        shift
      fi
      ;;
    -v|--verbose) # Muestra todos los metadatos
      VERBORREICO='0'
      ;;
    -*) # Parametro desconocido
      echo "Error: Parametro desconocido $1" >&2
      muestra_ayuda
      exit $E_PARAMINVAL
      ;;
  esac
  shift # Pasar al siguiente parámetro
done


####################################
# BUCLE PRINCIPAL
# Listamos los ficheros, incluidos subdirectorios
#

# Modificamos el separador de archivos (IFS), por si algun fichero contiene espacios en el nombre
SAVEIFS=$IFS
IFS=$'\n'
# Realizamos el bucle
for x in `find . -type f -iname "*.epub" | sort`
do
	# Limpiamos la cadena de comando del bucle anterior (si lo hubiere)
	string_comando=""

	# COMPROBAMOS SI HEMOS DE ESCRIBIR AUTOR Y TITULO A PARTIR DEL NOMBRE DEL FICHERO
	if [ -n "$AUTO" ]
	then
		# Tomamos los datos del nombre del fichero
		nombre_base=$(basename "$x")
		nombre_base="${nombre_base%.*}"
		libro_autor="${nombre_base%%-*}"
		libro_autor_esp="${libro_autor//_/ }"
		libro_autor_apellido="${libro_autor_esp%% *}"
		libro_autor_resto="${libro_autor_esp#* }"
		libro_autor_largo="$libro_autor_resto $libro_autor_apellido"
		libro_autor_orden="$libro_autor_apellido, $libro_autor_resto"
		libro_titulo="${nombre_base#*-}"
		libro_titulo_esp="${libro_titulo//_/ }"
		#echo  "[$libro_autor_largo] [$libro_autor_orden] [$libro_titulo]"

		# Anotamos los parametros para el conversor
		string_comando="-a '$libro_autor_largo' --author-sort '$libro_autor_orden' -t '$libro_titulo_esp' --title-sort ''"
	fi

	# COMPROBAMOS SI HEMOS DE LIMPIAR METADATOS
	if [ -n "$LIMPIA" ]
	then
		# Anotamos los parametros para el conversor
		string_comando=$string_comando" -c '' -p '' -k '' -d '' --title-sort ''"
	fi

	# COMPONEMOS LA ORDEN E INDICAMOS POR QUÉ FICHERO VAMOS
	if [ -n "$VERBORREICO" ]
	then
		comando="ebook-meta $string_comando $string_parametros '$x'"
		echo  "----------- $x ----------"
	else
		if [ "$string_comando" == "" ] && [ "$string_parametros" == "" ]
		then
			comando="ebook-meta '$x' | grep -e Title -e Author -e Language"
			echo  "----------- $x ----------"
		else
			comando="ebook-meta $string_comando $string_parametros '$x' > /dev/null"
			echo  "$x ..."
		fi
	fi

	# LANZAMOS EL CONVERTIDOR
	eval $comando

done
# Restauramos el separador de archivos (IFS)
IFS=$SAVEIFS

####################################
# Terminamos
exit 0