28 octubre 2011

Sistema R2D100: Rol Rápido de Dados de 100

Hace un par de años quise preparar una partida de rol para la víspera de Todos los Santos, aunque finalmente la hice más tarde, pero me encontré con el problema de que no merecía la pena preparar fichas ni tratar de adaptar un sistema de juego para tan sólo un par de horas de partida tras una cena; al fin y al cabo sólo quería una narrar una historia tipo thriller y que mis amigos lanzasen algún dado ocasional en caso de necesidad.

Por todos estos motivos, ideé un pequeño sistema componiendo distintos aspectos de algunos de los sistemas que he probado. Así que tras darle varias vueltas y añadirle, posteriormente, un par de pinceladas, escribí en una libreta lo que quise bautizar como sistema R2D100, o lo que es lo mismo, sistema de Rol Rápido de Dados de 100.

Finalmente, tras estos dos años aparcado en mi libreta, he decidido pasarlo a limpio y compartirlo con vosotros.

Observaréis similitudes con el sistema Chaosium o D100, con los dados drmáticos de 7º Mar o los puntos dramáticos de Eyes Only o con las dificultades del sistema D20; espero que no lo toméis como un agravio, sino como un homenaje y una fuente de inspiración.

Aquí lo tenéis:

R2D100

Sistema por porcentaje, dificultades y bonus o malus otorgados por el DJ.

El sistema se basa en la interpretación: los bonos que da el DJ son clave, así como la dificultad que este establece.

Una tirada es mejor cuanto menor es el resultado en el D100.

Tirada típica

Una tirada típica en el sistema R2D100 sigue de la siguiente forma:

  1. El jugador declara lo que quiere que realice su personaje
  2. El DJ anuncia (o no) la dificultad en porcentaje de éxito
  3. El jugador explica como piensa realizar la acción
  4. El DJ otorga una bonificación o una penalización en función de esta explicación
  5. El jugador lanza el D100 y resta los modificadores a la tirada, si el resultado es menor o igual que la dificultad, la prueba tiene éxito

Cabe decir que los bonificadores a la tirada se restan a esta, mientras que los penalizadores se suman, siguiendo la siguiente fórmula: D100 - modificadores; esto quiere decir que si tenemos un modificador de -10 (penalización) nuestra tirada sería 1D100 + 10.

El combate y las heridas

Cuando un PJ desea atacar a otro PJ, PNJ o ente, el jugador realiza una tirada enfrentada con el defensor; si el atacante obtiene un resultado menor en la tirada que el defensor, impacta y realiza un daño igual al resultado de la división entera de la diferencia dividido entre 10. Ejemplo:

Un atacante realiza una tirada enfrentada de ataque y obtiene un 53 en el dado, mientras que el defensor obtiene un 74; por tanto, el atacante impacta e inflige (74-53)/10 = 2 puntos de daño al defensor.

Para determinar el orden de iniciativa, se lanza un 1D10; mientras más alto sea nuestro resultado, nuestro PJ actuará antes. Sin embargo, las declaraciones de acciones se hacen de forma inversa; él último declara primero, el penúltimo segundo, etc.

Puntos de vida y muerte

Cada PJ tiene 10 puntos de vida. Cuando a causa de las heridas llega a 0, el PJ se desmaya. En caso de llegar a puntos negativos (-1 o menos), el PJ empieza a desangrarse, perdiendo un punto de vida por minuto. Cuando un personaje llega a -10 puntos de vida, el PJ muere.

Haciendo el sistema no volátil: utilización de fichas

En un principio, el sistema ha sido diseñado para poder utilizarse sin necesidad de fichas. Sin embargo, es posible hacer uso de ellas mediante las siguientes reglas.

Características

Cada jugador cuenta con 6 características principales:

  • Fuerza
  • Agilidad
  • Habilidad
  • Resistencia
  • Percepción
  • Cultura

Dado que el sistema trata de centrarse en la interpretación, no se ha añadido una característica que refleje el Carisma o las habilidades sociales que pueda tener el PJ; sin embargo, como sabemos que no todo el mundo es igual y que existen personas más extrovertidas que otras, opcionalmente se puede añadir una séptima característica: Comunicación.

Cada característica puede tomar un valor mínimo de -10 y un valor máximo de 15; todas empiezan con un valor de 0, pero se puede disminuir este valor para gastar los puntos de aprendizaje en otra característica o habilidades (ver Aprendizaje y experiencia).

Los puntos de vida de nuestro personaje si utilizamos este método es de 10 + Resistencia.

Habilidades

El sistema no define unas habilidades predefinidas; en su lugar deja a elección del DJ o, si este lo permite, del jugador la elección de las habilidades que pueda tener un PJ.

Sea como sea, sólo se puede llegar a tener 50 puntos como máximo en cada habilidad.

Las tiradas

Las tiradas se realizan de la misma forma que antes, salvo en el hecho de que ahora, además de restarle el modificador a la tirada, restaremos también la característica sobre la cual se apoya la habilidad junto con esta. Por ejemplo, si quisiéramos realizar una acrobacia deberíamos tirar 1D100 - Agilidad - Saltar - modificadores, mientras que si quisiésemos realizar un salto de altura, deberíamos lanzar 1D100 - Fuerza - Saltar - modificadores.

Esta regla se aplica también al combate; por ejemplo, si quisiésemos esquivar un golpe, deberíamos emplear la característica de Agilidad junto con la habilidad de Esquivar, si la tuviésemos, o si quisiéramos acertar con un disparo a alguien restaríamos la característica de Percepción a la tirada.

En cuanto a la iniciativa en el combate, ahora se determina con un 1D10 + Agilidad.

Aprendizaje y experiencia

Cuando creamos nuestra ficha, tenemos 100 puntos de experiencia a repartir entre características y habilidades. Por cada 10 puntos de experiencia que guardemos, podemos obtener un punto dramático o PD (ver Puntos Dramáticos).

Después de la creación del personaje el PJ puede obtener experiencia para repartir en aquellas habilidades que haya realizado con éxito durante la partida. De esta forma, cuando un jugador obtiene éxito en una tirada, se marca la habilidad correspondiente; al finalizar la partida el jugador lanza 1D100 con la habilidad marcada como dificultad, si falla la tirada, el jugador gana 1D10/2 (redondeando hacia arriba) puntos que puede gastar inmediatamente en esa habilidad o puede guardarlos para poder obtener un PD. Ejemplo:

Un jugador acierta la habilidad de Buscar, con la que tiene un 32%. Al final de la partida, lanza 1D100 para comprobar si puede aumentarla, sacando un 42; dado que la tirada es mayor que la habilidad, el jugador falla la tirada y puede sumar un 1D10/2. Tira y obtiene un 5, que dividido entre 2 redondeando hacia arriba queda 3, con lo que el jugador puede gastar 3 puntos para subir su habilidad de buscar o bien guardarlos para reunir 10 puntos y así ganar un PD.

Puntos Dramáticos

Un punto dramático, o PD, es un punto que puedes gastar en una situación dramática para inclinar la balanza a tu favor. Por ejemplo, si tu personaje acaba de recibir un ataque que normalmente lo mataría o lo dejaría inconsciente, puedes gastar un punto dramático para cambiar el resultado de la acción, dando una explicación lógica de porqué no ha ocurrido; en este caso, por ejemplo, podríamos decir que la pistola de nuestro enemigo se ha quedado encasquillada.

Un punto dramático también puede ser usado para aumentar nuestro bonificador en +25%; evidentemente, sólo es posible gastar un punto dramático por acción.

Un saludo,
Morpheus

06 octubre 2011

Mostrar http en Firefox 7

Saludos,

Acabo de actualizar el Iceweasel, el Firefox en Debian con el nombre y los iconos cambiados, a la versión 7, y como ya andaba esperando, ha desaparecido el protocolo http de la barra de direcciones (el https y otros, como el ftp, siguen apareciendo).

Si la costumbre os puede tanto como a mí, podéis volver a ver el http en vuestra barra de direcciones configurándolo en la dirección about:config, poniendo el siguiente parámetro a false:

browser.urlbar.trimURLs

En la fuente de la cual he extraído la información también se menciona como eliminar el resaltado del dominio de la barra de direcciones; para ello tenéis que poner también a false lo siguiente:

browser.urlbar.formatting.enabled

Fuente: Techdows

Un saludo,
Morpheus

08 septiembre 2011

Poniendo a punto el YP-CP3 en Lignux

Hace poco, mi antiguo reproductor portátil (aka MP3), un Sansa Clip+ de 4GB dejó de funcionar; por suerte, me entraba en garantía y Fnac me hizo una tarjeta regalo por el mismo precio que este. Por desgracia, fue una gran pérdida, pues ese Sansa tenía ampliación de memoria por tarjeta microSD y reproducía Flac y Ogg (Vorbis).

Tras recibir la tarjeta, me puse a buscar un reproductor que tuviese las mismas características o similares en el catálogo de Fnac; sin embargo, lo único que me aparecían eran Samsung's, pero anteriormente ya había tenido uno y me había dado ciertos problemillas, además de que al final el conector USB, que estaba ensamblado dentro del propio artefacto, como los reproductores que estaba encontrando en el catálogo, dejó de funcionar bien y varias veces casi lo rompo debido a un golpe accidental.

Visto que no podía encontrar ningún reproductor que se ajustase a mis necesidades, envie un correo electrónico a los 3 Fnac's que hay en Barcelona, y me consiguieron encontrar una buena alternativa que se ajustase a mis necesidades, que no se encontraba en el catálogo, pero con el que contaban, y seguramente cuenten aún, con existencias en el Fnac de l'Illa Diagonal: el Samsung YP-CP3 (especificaciones), un reproductor de vídeo y audio (aka MP4), que acepta Flac y Vorbis y además se conecta al PC mediante un cable, con lo cual no corre el peligro de estropearse como mi anterior reproductor Samsung. Como podréis imaginar, es el reproductor que finalmente he adquirido.

Este reproductor, a la par que interesante, cuenta con cierta falta de soporte en Lignux; ya que pese a que se conecta sin ningún problema, no acaba de sincronizarse bien con Rhythmbox, y el programa que cabría instalar para poder sacarle toda la potencia (Emodio) requiere de Internet Explorer y el reproductor Windows Media, por lo tanto no se puede instalar mediante Wine. Pues bien, este artículo va a tratar de los pequeños parches que he realizado para poder utilizar sin problema este, de momento, gran reproductor.

Sincronizando con Rhythmbox

En primer lugar, quería aprovechar la capacidad de las últimas versiones de Rhythmbox de sincronizarse con los reproductores multimedia, y para ello apliqué un viejo truco, que es añadir un archivo con nombre .is_audio_player en la raíz del sistema de ficheros del dispositivo; sin embargo, este archivo puede especificar más información sobre el reproductor que quizás, y en mi caso, en una Debian Testing, no se encuentren en el paquete media-player-info, quedando mi archivo .is_audio_player de la siguiente forma:

output_formats=audio/mpeg,audio/x-ms-wma,application/ogg,audio/ogg,audio/flac,audio/x-wav,image/jpeg,text/plain,video/x-ms-wmv,video/x-msvideo
input_formats=audio/mpeg
audio_folders=Music/

(Fuente: FAQ Rhythmbox)

Transfiriendo las listas de reproducción

Una vez que Rhythmbox reconoce bien el reproductor y les transfiere las pistas en los formatos que acepta (si no, primero las transformaría a mp3), sería interesante conseguir que las listas de reproducción definidas en Rhythmbox pudiesen reproducirse también en el reproductor; sin embargo, el CP3 sólo acepta listas en formato SPL (un formato propio de Samsung) y WPL, el formato de Windows Media, pero Rhythmbox deja las listas en la raíz del sistema en formato PLS.

Indagando un poco por internet, encontré, entre otros, que el proyecto libmtp ya había programado una utilidad para este tipo de listas; sin embargo, el reproductor no se conecta mediante MTP, así que no podía servirme de mucho. Pese a esto, también encontré cierta información en los foros de anythingbutipod (1 y 2), obteniendo jutno con un par de pruebas las características necesarias para preparar un archivo SPL que reconociese el reproductor:

  • Las primeras dos líneas deben ser la especificación de que se trata de un archivo SPL y la versión del formato (1.00 o 2.00 según el firmware), junto con un espacio en blanco:
    SPL PLAYLIST
    VERSION 1.00
    
  • Cada canción debe especificarse en una línea con su ruta siguiendo el siguiente formato: \Music\Ruta\Archivo 1.mp3
  • Un espacio en blanco y una línea indicando que se acabado la lista:
    END PLAYLIST
  • El archivo debe estar codificado en formato UTF-16
  • Los saltos de línea deben estar especificados en formato CR+LF (Windows)

Siguiendo estas reglas, obtenemos un archivo SPL válido; ahora lo que nos falta es convertir las listas en PLS a este formato. Para tal fin, yo he hecho un pequeño script en Shell y AWK, que he bautizado como pls2spl.sh y que, dada la ruta donde se encuentra el reproductor, lee todas las listas sincronizadas por Rhythmbox, que por defecto se guardan en la raíz, y una vez transformadas las mueve a la carpeta Playlists:

#!/bin/bash

# Script AWK que transforma un archivo PLS al formato SPL
awk='BEGIN {
 FS="/";
 OFS="\\";
 print "SPL PLAYLIST\nVERSION 2.00\n";
}

/[Ff]ile([0-9]+)=/ { # Sólo nos interesan las rutas de los archivos
 printf "%s", gensub("[Ff]ile([0-9]+)=", OFS, 1, $1);
 for(i=2; i <= NF; i++) printf "\\%s", $i;
 printf "\n";
}

END {
 print "\nEND PLAYLIST";
}'

TMPFILE=/tmp/spl;

# Función para obtener el nombre del archivo en una ruta
function filename() {
 echo echo $i | awk 'BEGIN{FS="/"} {print $NF}';
}

readonly DIR=Playlists; # Donde se guardan las listas de reproducción

#Comprobaciones iniciales
if (( $# < 1 )); then
 echo "Por favor, especifica la ruta al dispositivo (ex: /media/ypcp3)";
 exit 1;
elif (( $# > 1 )); then
 echo "Sólo puedes especificar un dispositivo";
 exit 1;
fi

# Preparamos el awk para transformar el archivo pls
awkfile=pls2spl.awk;
echo "$awk" > $awkfile;

# Nos aseguramos de que $DEVICE no tenga un barra al final
DEVICE=$(echo $1 | awk '{if ( substr($0, length($0),1) == "/") print substr($0, 0, length($0)-1); else print $0 }' );

IFS=$(echo -e "'\n'");
for i in $(ls -1 $DEVICE/*.pls); do
 awk -f $awkfile $i > $TMPFILE;

 # Transformamos a CRLF (Windows) y a Unicode-16
 sed s/$/'\r'/ $TMPFILE | iconv -f UTF-8 -t UTF-16 -o $DEVICE/$DIR/$(filename $i | sed s/.pls/.spl/) -;

 echo -n "Se ha convertido ";
 filename $i;

 rm $TMPFILE;
 rm $i;
done

rm $awkfile;

He de hacer notar que en el archivo .is_audio_player se podría haber especificado en qué carpeta debe guardar Rhythmbox las listas. Si lo hiciésemos, Rhythmbox especificaría la ruta del archivo de la forma file:///media/cp3/Music/archivo%201.mp3, lo cual no es una ruta válida para el formato SPL; debido a esto, he preferido mantener el comportamiento por defecto de Rythmbox, lo cual facilita la conversión, evitando el texto escapado, es decir, las construcciones del tipo %20.

Convirtiendo los vídeos

Pese a que según las especificaciones de la página web el reproductor acepta WMV, MPEG4, AVI, MP4, ASF, según las especificaciones del manual de usuario el reproductor sólo reproduce los siguientes formatos de vídeo:

AVI/SVI: MPEG-4 Perfil simple de vídeo (640x480, 800kbps), MP3 Audio
RM/RMVB: Vídeo Real Media (640x480, 800kbps), Real Audio
WMV: Vídeo WMV9 (640x480, 500kbps), Audio WMA

Con tal de poder transformar los vídeos con comodidad al formato AVI que especifica, y sobre todo poder realizar el escalado de forma automática manteniendo la proporción, he realizado un pequeño script para Avidemux valiéndome de lo que he aprendido con la entrada anterior; además, este script lo he añadido como ajuste personalizado dentro de mi carpeta personal, tal y como explican en la wiki de Avidemux. En el script, que os muestro a continuación, podréis notar que he realizado ciertas operaciones para poder realizar el escalado; si es necesario, podéis encontrar una gran referencia y fuente de información sobre javascript en el w3schools.

//AD  <- Needed to identify//
//--automatically built--

var app = new Avidemux();

//** Video **
// ** Preparing
var maxw=640, maxh=480; // Max permited by device
var resx=400, resy=240, dratio=resx/resy; // dratio=15/9=5/3 (Display)

//** Postproc **
app.video.setPostProc(3,3,0);
app.video.fps1000 = 25000;

//** Scaling **
var width=app.video.width;
var height=app.video.height;
var vratio=width/height;

if (width >= height) {
 width=resx=maxw; // Video will fit up to device
 height=Math.round((width/vratio)/2)*2; // Values must be pair
 resy=resx/dratio;

 if (height > resy || height > maxh) {
  height=resy; // To preserve display and video ratio
  width=Math.round((height*vratio)/2)*2; // Values must be pair
  resx=resy*dratio;
 }
}
else { // Improbably
 height=resy=maxh;
 width=Math.round((height*vratio)/2)*2;
 resx=resy*dratio;

 if (width > resx || width > maxw) {
  width=resx;
  height=Math.round((width/vratio)/2)*2;
  resy=resx/dratio;
 }
}

app.video.addFilter("resize","w="+width,"h="+height,"algo=1");

// ** Filling with black to preserve aspect ratio (padding)

var padw=(resx-width)/2, padh=(resy-height)/2;

app.video.addFilter("addblack","left="+padw,"right="+padw,"top="+padh,"bottom="+padh);

//** Video Codec conf **
app.video.codecPlugin("92B544BE-59A3-4720-86F0-6AD5A2526FD2", "Xvid", "CBR=800", "?xml version='1.0'?><XvidConfig><presetConfiguration><name><default></name><type>default</type></presetConfiguration><XvidOptions><threads>0</threads><vui><sarAsInput>true</sarAsInput><sarHeight>1</sarHeight><sarWidth>1</sarWidth></vui><motionEstimation>high</motionEstimation><rdo>dct</rdo><bFrameRdo>false</bFrameRdo><chromaMotionEstimation>true</chromaMotionEstimation><qPel>false</qPel><gmc>false</gmc><turboMode>false</turboMode><chromaOptimiser>false</chromaOptimiser><fourMv>false</fourMv><cartoon>false</cartoon><greyscale>false</greyscale><interlaced>none</interlaced><frameDropRatio>0</frameDropRatio><maxIframeInterval>300</maxIframeInterval><maxBframes>2</maxBframes><bFrameSensitivity>0</bFrameSensitivity><closedGop>false</closedGop><packed>false</packed><quantImin>1</quantImin><quantPmin>1</quantPmin><quantBmin>1</quantBmin><quantImax>31</quantImax><quantPmax>31</quantPmax><quantBmax>31</quantBmax><quantBratio>150</quantBratio><quantBoffset>100</quantBoffset><quantType>mpeg</quantType><intraMatrix><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value></intraMatrix><interMatrix><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value></interMatrix><trellis>true</trellis><singlePass><reactionDelayFactor>16</reactionDelayFactor><averagingQuantiserPeriod>100</averagingQuantiserPeriod><smoother>100</smoother></singlePass><twoPass><keyFrameBoost>10</keyFrameBoost><maxKeyFrameReduceBitrate>20</maxKeyFrameReduceBitrate><keyFrameBitrateThreshold>1</keyFrameBitrateThreshold><overflowControlStrength>5</overflowControlStrength><maxOverflowImprovement>5</maxOverflowImprovement><maxOverflowDegradation>5</maxOverflowDegradation><aboveAverageCurveCompression>0</aboveAverageCurveCompression><belowAverageCurveCompression>0</belowAverageCurveCompression><vbvBufferSize>0</vbvBufferSize><maxVbvBitrate>0</maxVbvBitrate><vbvPeakBitrate>0</vbvPeakBitrate></twoPass></XvidOptions></XvidConfig>");

//** Audio **
app.audio.reset();
app.audio.codec("Lame",128,20,"80 00 00 00 01 00 00 00 01 00 00 00 09 00 00 00 00 00 00 00 ");
app.audio.normalizeMode=0;
app.audio.normalizeValue=0;
app.audio.delay=0;
app.audio.mixer="NONE";
app.setContainer("AVI");
setSuccess(1);
//app.Exit();

//End of script

Sin embargo, pese a haber realizado este script, y siendo Avidemux un gran programa, como mínimo de transcodificación de archivos; me he encontrado con vídeos que sufrían ciertos problemas al ser transcodificados, como por ejemplo un desfase en el audio respecto al vídeo, que han hecho que utilice también otro gran programa: ffmpeg (sí, sé que mencioné que lo encontraba un poco complicado, pero para usarlo habitualmente; una vez establecidos unos parámetros que no van a variar, no lo he encontrado tan complicado). Pues con tal de realizar el mismo trabajo que con Avidemux, he hecho otro script (sí, también sé que últimamente estoy algo pesado con ellos) que se encarga también de mantener la proporción del archivo a la hora de escalarlo:

#!/bin/bash

# Constantes
readonly resx=400;
readonly resy=240;
readonly maxw=640;
readonly maxh=480;

IFS=$(echo -e "\n");

# Comprobaciones
if (( $# < 1 )); then
 echo "Debes especificar los vídeos a codificar";
 exit 1;
fi


# Funciones

# Recoge información sobre el vídeo en $width y $height
# $1 -> Ruta al archivo de vídeo
function getInfo() {
 local video=$(ffmpeg -i $1 2>&1 | grep -iw "video:")
 local size=$(echo $video | egrep -o "[0-9]+x[0-9]+");

 width=$(echo $size | cut -d"x" -f1);
 height=$(echo $size | cut -d"x" -f2);
}

# $1 -> Elemento a dividir
# $2 -> Width
# $3 -> Height
function divPerRatio() {
 echo $(( ($1 * $3) / $2 ));
}

# $1 -> Elemento a multiplicar
# $2 -> Width
# $3 -> Height
function mulPerRatio() {
 echo $(( ($1 * $2) / $3 ));
}

# Pre: haber obtenido la información de $width y $height (con getInfo)
# Retorna el tamaño del vídeo ($x $y) y la resolución en pantalla ($rx $ry)
function getRes() {
 if (($width >= $height)); then
  x=$maxw;
  rx=$x; # Para encajar el vídeo en el dispositivo
  y=$(divPerRatio $x $width $height);
  ry=$(divPerRatio $rx $resx $resy);

  if (($y > $ry || $y > $maxh)); then
   y=$ry; # Para conservar la proporción del dispositivo y el vídeo
   x=$(mulPerRatio $y $width $height);
   rx=$(mulPerRatio $ry $resx $resy);
  fi
 else # Improbable
  y=$maxh;
  ry=$y;
  x=$(mulPerRatio $y $width $height);
  rx=$(mulPerRatio $ry $resx $resy);

  if (($x > $rx || $x > $maxw)); then
   x=$rx;
   y=$(divPerRatio $x $width $height);
   ry=$(divPerRatio $rx $resx $resy);
  fi
 fi
}


# Main
for (( f=1 ; f <= $# ; f++ )); do
 file=${!f};

 # Añadimos extension si no la tiene
 if ! echo $file | egrep "\..{1,3}$" > /dev/null; then
  ln $file $file.ln;
  file=$file.ln;
  LKD=1;
 fi

 getInfo $file;
 getRes;

 posx=$(( ($rx - $x)/2 ));
 posy=$(( ($ry - $y)/2 ));

 output=$(echo $file | sed -r s/'\..{1,3}$'/.cp3.avi/);

 # Ejecución
 ffmpeg -i $file -ab 128k -acodec libmp3lame -vcodec libxvid -b 800k -r 25 -s ${x}x$y -vf pad="$rx:$ry:$posx:$posy" $output;

 # Borramos archivo con extensión
 if (( $LKD )); then
  LKD=0;
  rm $file;
 fi
done

Como podréis comprobar, transforma todo aquellos vídeos que se le pasen como argumento al script; por ejemplo:

./ypcp3.ffmpeg.sh video1.mp4 video2 video3.wmv

Pues hasta aquí hemos llegado. Espero que este artículo os haya sido de ayuda, y si no, a mí me ha resultado útil para mantener estos scripts y esta información como apunte en mi blog.

Un saludo,
Morpheus

01 septiembre 2011

Cambiando el tamaño de tus vídeos con Avidemux

Siguiendo en la línea de la entrada anterior, voy a seguir en esta entrada explicando cómo transformar diversos vídeos (en alta definición) en vídeos más pequeños pero con una calidad aceptable; en mi caso, y en mi percepción, se trata de un resultado más que aceptable.

Para ello, he utilizado Avidemux; sí, sé que podría haber usado MEencoder (de MPlayer) o FFmpeg, pero aunque ya los he utilizado alguna vez, me resulta difícil configurar todas las opciones del codificador mediante la línea de comandos. Entonces os preguntaréis: ¿cómo piensas hacerlo con Avidemux? Pues la respuesta es a medias.

Pero primero, vayamos por pasos. Antes de nada, debemos tener instalado avidemux (junto a su interfaz de línea de comandos, CLI):

# aptitude install avidemux-cli avidemux

Ahora, abrimos uno de los vídeos que queramos recodificar con él. Una vez hecho esto, configuramos todos los parámetros de vídeo y audio que querremos que tengan nuestros vídeos; en mi caso, escalar los vídeos a la mitad de su tamaño mediante el filtro dimensionar y ponerle una tasa de bits constante de 1500 kbps (que ya está puesto por defecto):

Tras ello, vamos a Archivo -> Guardar Proyecto como... y lo guardamos con la extensión .js, pues se guardarán los parámetros de nuestro proyecto como un archivo en javascript. Una vez hecho esto, abrimos el archivo con un editor de texto y eliminamos las siguientes líneas:

// 01 videos source 
app.load("/ruta/al/video.ext");
//01 segments
app.clearSegments();
app.addSegment(0,0,3017);
app.markerA=0;
app.markerB=3016;

Eliminar estas líneas es necesario ya que son configuraciones dependientes del vídeo que hemos abierto para guardar el script. Los marker son las marcas que definen el segmento de vídeo que vamos a transformar, y como comprenderéis, son diferentes para cada vídeo, motivo por el cual no se deben establecer aquí; lo mismo para la ruta.

Una vez creado y modificado el script de configuración, es hora de utilizarlo; para ello, debemos ejecutar la siguiente línea:

avidemux2_cli --force-alt-h264 --load video.ext --run script.js --save video.res.ext --quit

Los parámetros utilizados son:

--force-alt-h264
Para que en los vídeos que estén codificados con H.264 se habran correctamente sin necesidad de preguntar al usuario; lo pongo porque la mayoría de las cámaras gravan en MOV, que no deja de ser, en la gran mayoría de veces, un contenedor de este codec.
--load
Para cargar el vídeo que deseamos.
--run
Para ejecutar el script que hemos guardado anteriormente.
--save
Para indicar dónde debe guardar el vídeo recodificado.
--quit
Para finalizar el programa en cuanto haya acabado.

Una vez contamos con el script y conociendo cuál es el comando a ejecutar, para recodificar diversos vídeos deberíamos ejecutar el siguiente comando (en bash):

for i in `ls *.ext`; do
 output=$(echo $i | sed s/.ext/sca.ext/);
 avidemux2_cli --force-alt-h264 --load $i --run script.js --save $output --quit;
done

De esta forma, se transformarán todos los archivos con la extensión ext utilizando la configuración almacenada en script.js.

Si queréis realizar algo un tanto más complejo, podéis modificar parte del javascript, como yo he hecho a la hora de establecer el escalado, haciendo que el vídeo se escale en la proporción que hayas establecido en la variable scale:

//** Scaling **
var scale=1/2;
var width=app.video.width*scale;
var height=app.video.height*scale;

displayInfo("Video will be scaled to "+width+"x"+height+" pixels.");

app.video.addFilter("resize","w="+width,"h="+height,"algo=1");

Si aún así queréis hacerlo todo más compacto, podéis incluir el propio javascript dentro de otro script en bash. Os presento como ejemplo el que he realizado para convertir mis vídeos (atención a las comillas de las variables y los \' que he puesto en la versión del xml):

#!/bin/bash

DIR=/tmp/sca
SCRIPT='//AD  <- Needed to identify//
//--automatically built--

var app = new Avidemux();

//** Video **
//** Postproc **
app.video.setPostProc(3,3,0);

app.video.fps1000 = 25000;

//** Filters **

//** Scaling **
var scale=1/2;
var width=app.video.width*scale;
var height=app.video.height*scale;

displayInfo("Video will be scaled to "+width+"x"+height+" pixels.");

app.video.addFilter("resize","w="+width,"h="+height,"algo=1");

//** Video Codec conf **
app.video.codecPlugin("32BCB447-21C9-4210-AE9A-4FCE6C8588AE", "x264", "2PASSBITRATE=1500", "<?xml version='\'1.0\''?><x264Config><presetConfiguration><name>&lt;default&gt;</name><type>default</type></presetConfiguration><x264Options><fastFirstPass>true</fastFirstPass><threads>0</threads><deterministic>true</deterministic><sliceThreading>false</sliceThreading><threadedLookahead>-1</threadedLookahead><idcLevel>-1</idcLevel><vui><sarAsInput>true</sarAsInput><sarHeight>1</sarHeight><sarWidth>1</sarWidth><overscan>undefined</overscan><videoFormat>undefined</videoFormat><fullRangeSamples>true</fullRangeSamples><colorPrimaries>undefined</colorPrimaries><transfer>undefined</transfer><colorMatrix>undefined</colorMatrix><chromaSampleLocation>0</chromaSampleLocation></vui><referenceFrames>3</referenceFrames><gopMaximumSize>250</gopMaximumSize><gopMinimumSize>0</gopMinimumSize><scenecutThreshold>40</scenecutThreshold><periodicIntraRefresh>false</periodicIntraRefresh><bFrames>3</bFrames><adaptiveBframeDecision>1</adaptiveBframeDecision><bFrameBias>0</bFrameBias><bFrameReferences>strict</bFrameReferences><loopFilter>true</loopFilter><loopFilterAlphaC0>0</loopFilterAlphaC0><loopFilterBeta>0</loopFilterBeta><cabac>true</cabac><openGop>disabled</openGop><interlaced>disabled</interlaced><constrainedIntraPrediction>false</constrainedIntraPrediction><cqmPreset>flat</cqmPreset><intra4x4Luma><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value></intra4x4Luma><intraChroma><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value></intraChroma><inter4x4Luma><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value></inter4x4Luma><interChroma><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value></interChroma><intra8x8Luma><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value></intra8x8Luma><inter8x8Luma><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value><value>16</value></inter8x8Luma><analyse><partitionI4x4>true</partitionI4x4><partitionI8x8>true</partitionI8x8><partitionP8x8>true</partitionP8x8><partitionP4x4>false</partitionP4x4><partitionB8x8>true</partitionB8x8><dct8x8>true</dct8x8><weightedPredictionPframes>smart</weightedPredictionPframes><weightedPrediction>true</weightedPrediction><directPredictionMode>spatial</directPredictionMode><chromaLumaQuantiserDifference>0</chromaLumaQuantiserDifference><motionEstimationMethod>hexagonal</motionEstimationMethod><motionVectorSearchRange>16</motionVectorSearchRange><motionVectorLength>-1</motionVectorLength><motionVectorThreadBuffer>-1</motionVectorThreadBuffer><subpixelRefinement>7</subpixelRefinement><chromaMotionEstimation>true</chromaMotionEstimation><mixedReferences>true</mixedReferences><trellis>finalMacroblock</trellis><fastPSkip>true</fastPSkip><dctDecimate>true</dctDecimate><psychoRdo>1</psychoRdo><psychoTrellis>0</psychoTrellis><noiseReduction>0</noiseReduction><interLumaDeadzone>21</interLumaDeadzone><intraLumaDeadzone>11</intraLumaDeadzone></analyse><rateControl><quantiserMinimum>10</quantiserMinimum><quantiserMaximum>51</quantiserMaximum><quantiserStep>4</quantiserStep><maximumConstantRateFactor>0</maximumConstantRateFactor><averageBitrateTolerance>1</averageBitrateTolerance><vbvMaximumBitrate>0</vbvMaximumBitrate><vbvBufferSize>0</vbvBufferSize><vbvInitialOccupancy>0.9</vbvInitialOccupancy><ipFrameQuantiser>1.4</ipFrameQuantiser><pbFrameQuantiser>1.3</pbFrameQuantiser><adaptiveQuantiserMode>variance</adaptiveQuantiserMode><adaptiveQuantiserStrength>1</adaptiveQuantiserStrength><mbTree>true</mbTree><frametypeLookahead>40</frametypeLookahead><quantiserCurveCompression>0.6</quantiserCurveCompression><reduceFluxBeforeCurveCompression>20</reduceFluxBeforeCurveCompression><reduceFluxAfterCurveCompression>0.5</reduceFluxAfterCurveCompression></rateControl><accessUnitDelimiters>false</accessUnitDelimiters><spsIdentifier>0</spsIdentifier><sliceMaxSize>0</sliceMaxSize><sliceMaxMacroblocks>0</sliceMaxMacroblocks><sliceCount>0</sliceCount><hrd>none</hrd></x264Options></x264Config>");

//** Audio **
app.audio.reset();
app.audio.codec("Faac",128,4,"80 00 00 00 ");
app.audio.normalizeMode=0;
app.audio.normalizeValue=0;
app.audio.delay=0;
app.audio.mixer="NONE";
app.setContainer("MP4");
setSuccess(1);
//app.Exit();

//End of script';

SCRNAME="script.js";

echo "$SCRIPT" > $SCRNAME;

mkdir -p $DIR;
for i in `ls *.MOV`; do
 output=$(echo $i | sed s/.MOV/sca.mp4/);
 avidemux --nogui --force-alt-h264 --load $i --run $SCRNAME --save $DIR/$output --quit;
 rm $DIR/$output.stat*;
done

rm $SCRNAME;

Fuentes utilizadas:

Pues eso es todo. Espero que este pequeño tutorial y el de la entrada anterior os hayan sido de ayuda; desde luego, para mí lo han sido, reduciendo unos 7,9 GB de imágenes y vídeos en tan solo 2,6 GB.

Espero no haber sido muy cargante con estas últimas entradas, pero quería conservar como apuntes este pequeño trabajo, que estoy bien seguro que me serán de utilidad en el futuro.

Un saludo,
Morpheus

30 agosto 2011

Cambiando el tamaño de tus fotos con Imagemagick

Después de las vacaciones es probable que te encuentres con un montón de fotos, como es mi caso; si además esas fotos están hechas con una cámara de 13 Mpx, te encontrarás con que tienes fotos que ocupan muchísimo espacio. Si la alta resolución de esas imágenes no es una prioridad para ti, pero sí para la persona que ha hecho las fotos, sino hubiese bastado con reducir la resolución en la propia cámara; puedes escalar esas fotografías para que ocupen menos utilizando el programa Imagemagick y el comando convert.

Para ello, lo primero que tenemos que hacer es instalar Imagemagick:

# aptitude install imagemagick

Una vez instalado, tan solo queda hacer uso del comando convert. La forma de usarlo es la siguiente:

convert [opciones] archivo_origen.extensión [opciones] archivo_destino.extensión

Para escalar las fotografías usaremos las opciones -resize WidthxHeight -quality 95. También se puede ser más concreto especificando la opción -filter filtro, puediendo encontrar información sobre ello aquí; aunque según esa información el filtro Cubic no funciona bien aumentando las imágenes, hasta ahora yo lo he usado sin notar ninguna pérdida considerable al reducirlas.

Sabiendo esto, podríamos escalar todas las imágenes con la opción -resize Widthx o -resize xHeight, que escalarían las imágenes preservando la proporción, usando el siguiente comando:

convert *.jpg -quality 95 -resize Widthx img.%03d.jpg

Por desgracia, esto haría que las fotos verticales fuesen más grandes que las horizontales, lo cual puede resultar un engorro. Para evitar esto, he hecho un pequeño script en Bash que hace uso de el comando identify, también del proyecto Imagemagick, que da información sobre las imágenes que especifiquemos. De esta forma, con el siguiente comando obtenemos la resolución de la imagen, que más tarde utilizaremos en el script:

identify -format "%wx%h" imagen.jpg

Finalmente, os dejo con el script, que básicamente transforma todas las imágenes del directorio donde se encuentra el script y las deja en el directorio DIR; las imágenes medirán como máximo WIDTH pixels de altura o de anchura:

#!/bin/bash

EXEC="convert"
EXECOPT="-quality 95 -filter Cubic -resize"
WIDTH=2856 # Esto da aproximadamente 6 Mpx para fotografías con una proporción 4:3
DIR=/tmp/sca

mkdir $DIR;
for i in `ls *.JPG`; do
 aux=`identify -format "%wx%h" $i`;
 w=`echo $aux | cut -f1 -d"x"`;
 h=`echo $aux | cut -f2 -d"x"`;
 resize=`echo ${WIDTH}x`;

 if (( $w < $h )); then resize=`echo "x$WIDTH"`; fi
 
 echo "$i: ${w}x$h -> $resize";
 output=`echo $i | sed s/.JPG/sca.jpg/`;
 eval $EXEC $i $EXECOPT $resize $DIR/$output;
done

Este script esta basado en otro que había hecho antes, que simplemente transforma el lado más pequeño de la imagen en el más grande:

#!/bin/bash

EXEC="convert"
EXECOPT="-quality 95 -filter Cubic -resize"

for i in `ls *.jpg`; do
 aux=`identify -format "%wx%h" $i`;
 w=`echo $aux | cut -f1 -d"x"`;
 h=`echo $aux | cut -f2 -d"x"`;
 resize=`echo ${h}x`;

 if (( $w < $h )); then resize=`echo "x$w"`; fi
 
 #echo "$i: ${w}x$h -> $resize";
 
 eval $EXEC $i $EXECOPT $resize `echo $i | sed s/.jpg/sca.jpg/`;
done

Espero que esta entrada os sirva de ayuda y podáis reducir esas cientos de imágenes de vuestras vacaciones.

Un saludo,
Morpheus

15 agosto 2011

A Conxura de Conxo en Dramatis Personae 7

Como ya os dije, os avisaría en cuanto fuese publicada la nueva Dramatis Personae, donde se ha publicado mi partida, A Conxura de Conxo.

La revista, que cuenta con 174 páginas, de las que soy responsable de 22, trata sobre el juego de rol Aquelarre, que ya he mencionado varias veces, ampliando de forma no oficial sus reglas y su contenido (por eso es un fanzine). Podéis descargarla en el siguiente enlace: http://www.megaupload.com/?d=EV3E7NVU; y si queréis ojear los otros números, podéis hacerlo desde www.dramatispersonae.eu.

En cuanto a mi partida, podréis encontrarla en la página 97; espero que os guste. ;)

Actualización 11 de marzo del 2012: Dado que la web de DP aún no ha actualizado sus enlaces a la revista, os dejo el enlace de respaldo extraído de Akelarre Advanced, y también os enlazo al PDF que monté al presentar el módulo.

Un saludo,
Morpheus

25 julio 2011

Iniciando sesión como root sin GDM

Aprovecho que me he puesto a escribir para mostrar un pequeño truco para iniciar sesión como usuario root con interfaz gráfica sin usar GDM.

Para ello, primero iniciamos sesión en una terminal virtual (sin X), ya que en la terminal que ofrece GNOME dbus da problemas; para acceder a ella, pulsamos Ctrl + Alt + Fn, siendo n un número del 1 al 6. Una vez iniciada la sesión, ejecutamos el siguiente comando, siendo m un número de visor (display), normalmente mayor que 0: Xorg :m & gnome-session --display :m

Este comando inicia una instancia del servidor Xorg en el display :m y lo deja ejecutándose en segundo plano; tras ello, inicia una sesión de gnome en el display :m.

Una vez cerrada la sesión de GNOME, el servidor Xorg seguirá funcionando en la terminal virtual que dejamos abierta; si queremos cerrarlo, podemos ejecutar fg
(Ahora pulsamos el habitual Ctrl+c para cerrar el programa que se encuentra en primer plano)
o bien kill %n siendo n el número de trabajo de esa terminal; puedes ver los trabajos ejecutados con el comando jobs.

Un saludo,
Morpheus

Hibernando en Debian

Desde hace algún tiempo he estado tratando de asimilarme a Debian, pues hay varias cosas que hace tiempo que me hastían de Ubuntu, pese a que aún no he encontrado una distribución con unos repositorios tan completos sin tener que añadir externos; es por eso que últimamente ando usando Linux Mint en vez de Ubuntu.

Sin embargo, decidí actualizar de Linux Mint 10 a 11 haciendo un cambio de repositorios (cosas que desaconsejaban desde Linux Mint, pero es que quería intentar ahorrarme la configuración e instalación de programas una vez reinstalado el sistema operativo), lo cuál me ha llevado a tener un problema con dependencias y demás con el propio kernel.

Por suerte, contaba con una instalación de Linux Mint Debian Edition (LMDE), con lo cuál he aprovechado para pasar un par de días instalado en él, a ver si consigo no echar a faltar demasiado los repositorios de Ubuntu, desde Linux Mint, pues usa los repositorios d Ubuntu como base.

Una vez actualizado, he recordado uno de los escollos que tenía con Debian (además de unos cuantos detalles que en Ubuntu te los dejan hechos), y era la hibernación: si quiero reiniciar para pasar un rato jugando en Windows, me gusta poder hacerlo sin preocuparme de lo que dejo a medias; sin embargo, en Debian no conseguía que funcionase correctamente. Tras analizar algunos logs y mensajes del kernel y buscar en diversas fuentes, he encontrado la manera de arreglarlo.

Para poneros en contexto sobre mi situación, diré que tras analizar los registros de /var/log/pm-powersave.log y /var/log/pm-suspend.log, y leer el siguiente mensaje durante el inicio del sistema (boot): Invalidating stale software suspend images, me dí cuenta de que el problema estaba en la restauración; es decir, que el sistema hibernaba bien (guardaba la imagen en disco), pero al iniciar, no la restauraba.

Para solucionar este problema, basta con añadir en la línea de kernel de grub del archivo /boot/grub/grub.cfg (en mi caso, grub2) la opción resume:

linux /boot/vmlinuz-2.6.39-2-amd64 root=UUID=root ro resume=UUID=swap quiet

Donde root es el UUID de la partición del sistema y swap es el UUID de la partición de swap.

Cabe decir que, si se actualiza el grub, el archivo volverá a cambiar y la opción de restaurar desaparecerá; para evitar esto, la opción de resum podéis añadirla al archivo /etc/default/grub, en la variable GRUB_CMDLINE_LINUX:

GRUB_CMDLINE_LINUX="resume=UUID=swap"

Una vez hecho esto último, ejecutáis como usuario root:

# update-grub

A partir de ahora, cada vez que hibernes, Debian restaurará la imagen del sistema, dejando el pc como cuando lo hibernaste.

Espero que a alguien le sirva de ayuda, al igual que a mí.

Actualización 16 de marzo de 2012: Como método alternativo al del grub, podéis poner la misma línea en /etc/initramfs-tools/conf.d/resume; tened en cuenta las mayúsculas:

RESUME=UUID=swap

Después de esto, ejecutáis el siguiente comando como root:

# update-initramfs -u

Un saludo,
Morpheus

01 julio 2011

Algunos avisos para las nuevas versiones de Firefox

Dado que voy con los repositorios de Lignux, a penas he notado las mejoras y cambios del nuevo Firefox (de hecho, ahora mismo sigo desde un firefox 3.6.18); sin embargo, he estado trasteando un poco con Firefox 4 y 5 y ha habido ciertos cambios en lo que se podía configurar desde Opciones.

Una de ellas es el antiguo aviso para guardar las pestañas. Para recuperarlo, tienes que entrar en about:config, prometer que vas a tener cuidado, y poner la siguiente condición a cierto (puedes utilizar el filtro de opciones para encontrarla más rápidamente): browser.showQuitWarning

Actulización: Cabe decir que se puede configurar en opciones la posibilidad de que Firefox recuerde las pestañas y ventanas de la última sesión; sin embargo, creo que recordar que en la versión 4 había problemas con esta opción y no acababa de funcionar correctamente. En fin, lo importante es que se pueda configurar Firefox de la manera que le vaya mejor a cada uno.

Otro de los avisos que ahora ya no se pude configurar, al menos con Firefox 5, es todos aquellos avisos relacionados con la seguridad y el envío de información no cifrada; en mi opinión, es un aviso que va muy bien si andas en alguna red wifi. En concreto, el aviso que propongo es el de que se va a proceder a enviar información por un canal no cifrado; para ello, ponemos a true el siguiente parámetro en about:config: security.warn_submit_insecure

Un saludo,
Morpheus

25 mayo 2011

¡Feliz día del Orgullo Friki a todos!

Pues eso, que os deseo un feliz día del orgullo friki a todos, aunque seguro que más de uno anda de exámenes (yo próximamente).

Cabe decir que si no fuese por NoPuedoCreer ¡se me hubiese olvidado!

Así que ya sabéis, hoy toca reivindicar el frikismo; yo lo hago de esta forma, publicando en un blog que no lee casi nadie que hoy es tal día. XD

Un saludo,
Morpheus

19 mayo 2011

Mañana, el último SLQH

Ayer me lo comentó mi chica, pero pensaba que se equivocaba; no podía ser que SLQH desapareciese.

Sin embargo, la realidad es bien distinta.

¿Qué decir sobre este magnífico programa? Por mi parte, que lo cogí tarde (empecé a verlo de en el 2008/9), y que aunque lo disfrutaba y disfruto, tener que estudiar o organizarse cuando tienes varias cosas que hacer es incompatible con ver la televisión todos los días 2 o 3 horas (ahora 1) ya que tuve una época que enlazaba SLQH con Numb3rs, que la estoy viendo ahora desde el principio por eMuleTV, y con Caso Abierto. Sin embargo, no me ha dejado de gustar, aunque bien es cierto que desde que dejaron de poder emitir imágenes de otra cadena, y desde que se fue Ángel Martín, la cosa había alicaído un poco, pero no por ello dejan de ser buenos y de hacer un programa con humor.

En mi opinión, tras marcharse Ángel y haber hecho los 1000 programas, deberían haber dejado el programa, o bien haberle dado otro enfoque y tomárselo con más calma, cosa que han hecho, reduciendo el tiempo del programa (a veces creo que se alargaba en demasía, pero sólo algunas veces). También es cierto que, una vez han vuelto, no esperaba que dejasen el programa, ya que para qué acabar en el 1010 cuando puedes cerrar 1000 programas MUY dignos.

En fin, Sé Lo Que Hicisteis quedará en mi memoria como un gran programa de televisión, junto a El Informal, otro de los grandes, y en el que también participaron Patricia Conde y Miki Nadal.

Sólo queda darle ánimos a todo el equipo de SLQH y deciros: ¡Mañana no os perdáis el último de SLQH!, yo no pienso hacerlo.

Un saludo,
Morpheus

04 mayo 2011

Reflexión sobre la muerte de Osama Bin Laden

Desde que me enteré que Bin Laden había sido matado por EEUU, una espina se clavó en mi cabeza.

Lo primero que pensé, tras oír varias versiones del objetivo de EEUU en cuanto a capturarlo o matarlo, fue que, si yo hubiese sido presidente, no lo hubiese hecho público, al menos si mi objetivo hubiese sido asesinarle. En caso contrario, dado el resultado, hubiese dejado muy claro que mi objetivo era capturarle para enjuiciarlo, y me hubiese asegurado de que murió en la operación porque no quedó otra opción, y si no fuese así, me hubiese encargado de que rodaran cabezas por ello; sin embargo, EEUU ha variado la versión sobre la muerte de Bin Laden, que unido con la falsa fotografía de su muerte, han hecho volar la imaginación conspiranoica de los menos conspiranoicos. Con todo, pienso que el resultado de todo esto y la forma de presentarlo no ha sido nada elegante hablando en clave política.

Pero dejemos las cuestiones de inteligencia y política cinematográficas para hablar de un tema que creo que es más serio.

Desde EEUU, y retransmitido por los medios locales, se ha dicho de que con la muerte de Bin Laden por fin se ha hecho justicia, y hemos visto como miles de personas celebraban su muerte perpetrada por el gobierno estadounidense, que no digo que no tengan motivos para hacerlo, pero tengo que decir que esto me resulta un tanto frívolo.

En primer lugar, porque creo que, hasta que no quede claro cuál era el objetivo principal de EEUU, si matarle o capturarle, esto me parece venganza; como tal, creo que nos estamos haciendo un flaco favor a nosotros mismos y quienes nos rodean si confundimos la venganza con la Justicia (así, con mayúscula). Esto no quiere decir que EEUU no tuviese motivos para cobrarse una venganza, pero entonces yo lo reconocería como tal.

Este punto creo que es importante, porque creo que, moralmente, hubiese sido una mayor victoria si este... terrorista, por no decir una barbarie, hubiese sido juzgado y condenado por un estado (teóricamente) democrático y de derecho; otra cosa es que hubiese sido condenado a muerte o no, cosa más que segura, y lo que cada uno pueda pensar sobre ello, pero creo que esto le hubiese dado más legitimidad a su muerte.

Hasta hoy pensaba que era el único que había reparado en este detalle, pero esta mañana he escuchado algunos titulares en la radio y me he dado cuenta de que, por suerte, no soy el único que piensa así: Ignacio Escolar ha dicho que la venganza no es Justicia; [...] hasta los nazis tuvieron un juicio en Núremberg en su blog; el diputado por Izquierda Unida, Gaspar Llamazares, que el fin no justifica los medios y el terrorismo de Estado no es forma legítima de lucha contra el terrorismo y hoy, en el diario Público, analizan también este punto.

En segundo lugar, y ligando en parte con el anterior punto, tengo que señalar que la gente no está celebrando que se haya encontrado a Osama Bin Laden y haya sido capturado, sino que se celebra que ha muerto o que se le ha matado y los gobiernos de distintos países felicitan al estadounidense por ello (Zapatero, al menos, ha dicho hoy en el congreso que preferiría que hubiese respondido ante la justicia). Quizá sea por haber estudiado durante años en un colegio cristiano (no os confundáis, soy ateo); quizá sea los valores que me han inculcado mis padres; quizá sean los valores de libertad, igualdad y fraternidad o quizás los que yo haya aprendido por mi cuenta al crecer; pero esto me resulta de una catadura moral un tanto pobre.

Finalmente sólo huelga decir que yo sólo soy una persona, con sus opiniones, defectos y virtudes, y que podéis hacerme caso o no. En cuanto a la muerte de Bin Laden, puedo decir que me alegro de que hayan inhabilitado a un terrorista que ha hecho tanto mal, tanto en EEUU como en España como en otros tantos países, pero no puedo celebrar que haya muerto, ni decir que ha pagado por sus crímenes porque no ha sido juzgado, simplemente ha muerto a tiros en una operación militar.

Un saludo,
Morpheus

04 abril 2011

Al final el empeño merece la pena

Al menos eso puedo decir tras esta semanita, en primer lugar porque el miércoles recibí, por fin, mi ejemplar del juego de rol Aquelarre, y segundo porque el lunes me notificaron que había sido ganador del concurso de módulos de Aquelarre organizado por la revista electrónica Dramatis Personae.

Como podréis imaginar, presenté la partida de la que ya he hablado un par de veces; la verdad es que tuve suerte al organizarse este concurso justo cuando estaba a punto de finalizar el documento, y también es cierto que mi partida no es nada del otro mundo, y si algunos módulos que he visto últimamente se hubiesen presentado, yo tampoco hubiese ganado.

La partida, titulada A Conxura de Conxo, que llevaba desde agosto de 2008 preparando, con un total de 121 horas de edición según mi editor de texto, OpenOffice, y que he dirigido dos veces, no siempre de la forma que esperaba, ha ocupado unas 32 páginas; 7 de ellas son de trasfondo, es decir, contexto y ambientación.

La verdad es que, como ya he dicho más de una vez, he tardado tanto en completarla por mi falta de constancia, mis cambios constantes en la trama y mi esfuerzo en centrarla en una historia real, en concreto en los alrededores de la muerte del arzobispo de Santiago en el año 1316, cuando, tras ella, los compostelanos se alzaron en armas contra el señorío de la iglesia hasta el año 1320, año en que los representantes de la rebelión compostelana fueron asesinados en el castillo de la Rocha Forte, en el actual barrio de Santiago, Conxo; posteriormente, en el año 1467, el castillo fue destruido por los irmandiños.

Estoy bastante contento, ya que una de las cosas que me propuse era acabar una historia, cosa que creo que nunca he hecho, al menos yo sólo, y para mí era un paso necesario si algún día llego a escribir algo más extenso, que la verdad es que me gustaría. Por otra parte, estoy también muy contento porque hay alguien que me ha otorgado un reconocimiento por ella, es decir, que ha considerado que no era una historia, como mínimo, cutre; digo esto principalmente porque siempre que he empezado a escribir algo siempre me ha parecido bastante típico o cutre; me gustaría hacer algo capaz de enganchar.

Así pues, traté de que la historia tratase de no revelar quién merecía estar bajo sospecha hasta los últimos capítulos, cosa que, dirigiéndola, no conseguí; espero que si alguien la dirige lo consiga.

Os estaréis preguntando dónde podéis leerla; siento deciros que tendréis que esperar a que salga el séptimo número de Dramatis Personae, donde saldrá publicada. Pese a esto, sí que os puedo dar un pequeño avance; espero que os guste:

Prólogo

Es el año 1294 y Xisela, una niña de cinco años, es atacada, junto con sus padres, por unos bandidos al volver de la poblada ciudad de Santiago de Compostela a la parroquia de Conxo, tras haber asistido a la misa celebrada recientemente en la catedral con motivo del año jacobeo.

Sus padres mueren ante la aterrorizada mirada de Xisela, que teme por su vida. Sin embargo, esos bandidos mueren en un parpadeo, cuando están a punto de finalizar el trabajo y asesinarla a ella. Aparece, entonces, una figura de entre los árboles colindantes al camino: es una anciana que se acerca con un extraño caminar hacia ella para tratar de curar sus heridas y consolarla. Se llama Branca, y a partir de entonces será su protectora.

Branca es una meiga, el fruto de la unión entre una humana y el demonio de la magia negra, Agaliarepth. Tiene ya más de 300 años y vive aislada y sola en el bosque, alejada de los humanos que, generación tras generación, cada vez la odian más; a ella y a su magia.

Seis años después, en el Viernes Santo del año 1300, Andreia, una chiquilla de nueve años, huye despavorida; intenta evitar a una turba de gente que está propinando una paliza mortal a sus padres, alentados por Rodrigo González, el arzobispo de Santiago, pues se tratan de judíos, los asesinos de Cristo... y también se tratan de los prestamistas del clérigo.

Vagando por el bosque, con sus ropajes raídos, su cara sucia y su estómago vacío, es encontrada por Xisela, que la lleva con Branca; tras vestirla y alimentarla, la acogerán en su hogar, aunque Andreia no dirá ni una palabra hasta pasado un mes, ocultando su condición de judía.

Durante cinco años, Andreia, al igual que Xisela, recibió los conocimientos de Branca, que les enseñaría a protegerse, a mantenerse ocultas y a no revelar sus secretos.

En cuanto salga publicada la revista, os informaré.

¡Gracias por llegar hasta aquí! n.n

Actualización 15/08/2011: Ya ha salido publicado el séptimo número de Dramatis Personae, donde podréis encontrar mi partida.

Un saludo,
Morpheus

02 abril 2011

Tercera edición de Aquelarre, ya entre nosotros


Portadas de Aquelarre, portada alternativa a la derecha.

Tras esperar más de un año desde que me hice mecenas de este, para mí magnífico, juego de rol, la tercera edición de Aquelarre ya está entre nosotros, o al menos, entre aquellos que nos ofrecimos como mecenas. Si quieres saber qué es lo que trae, aquí puedes encontrar una buena lista de ello.

Tengo que decir que el libro, con más de 536 páginas satinadas a color, ha quedado genial (podéis ver las fotos del libro que he hecho en mi cuenta de flickr); no en vano, muchos la han llamado la edición definitiva, y si no lo es, tal y como dijo Manuel J. Sueiro, el editor, Si ésta no es la edición definitiva de Aquelarre, me encantará ver la que lo sea, la verdad.

El interior del manual
Fotografía del interior del libro, con el marcador de tela que viene con él. Se puede observar el reflejo del papel satinado.

Estoy muy contento de haber participado en el proceso como mecenas, ya que además de recibir el libro en formato pdf, unos dados de diez caras con el símbolo del juego y aparecer en los créditos, hemos recibido el manual en casa y con un certificado firmado por los autores (Ricard Ibáñez y Antonio Polo) certificando que el manual es uno de los 300 ejemplares que son propiedad de los mecenas.

El certificado de Mecenazgo
Este es el certificado de mecenazgo.

Este fin de semana se pondrán están a la venta los 32 primeros ejemplares (16 con cada portada, la de aspecto de códice y la de la ilustración, que es la que yo poseo) en las VIII Jornadas de Rol y Estrategia de Sevilla, y a lo largo de la semana que viene se irán mandando los primero ejemplares en preventa.

Los Dados
Los dados de Aquelarre; podéis comprarlos, exclusivamente, en la web de NoSoloRol, exceptuando el blanco color marfil, exclusivo para mecenas.

Poco más puedo añadir que no se haya dicho ya, a parte de recomendaros que si os gusta la historia medieval, las leyendas de gamusinos, follets, meigas, sorguiñas, Santas Compañas y otras tantas cosas que os han podido contar, probablemente, vuestros abuelos sobre vuestra región, además de interesaros por las historias que hay detrás de los arcángeles y demonios, Aquelarre os gustará. Sólo tenéis que acercaros a vuestra tienda de rol más cercana o bien encargarlo aquí.

Tras esto, sólo me queda felicitar a los autores y a la editorial, NoSoloRol, por el libro; ha sido un parto largo, pero la criatura, que ha pesado dos quilos, es preciosa.

Por último, tal y como solía decir un viejo lobo amigo del diablo, Que las bendiciones de Adonai sean con vosotros.

Un saludo,
Morpheus

14 marzo 2011

La pena de muerte según "Salvados"

Acabo de ver el reportaje emitido por Salvados (en la Sexta) sobre la pena de muerte.

Bajo mi punto de vista, el reportaje me ha parecido bastante parcial; sin embargo, eso no quiere decir que no sea interesante ni que no me haya gustado. La verdad es que creo que Jordi (el Follonero) ha llevado muy bien el reportaje y, aunque, como ya he dicho, a mí me ha parecido ofrecer una visión bastante en contra de la pena, creo que ha mostrado bien los argumentos de ambas partes, además de la situación que pueden vivir un juez, un alcaide y un ex preso respecto a este tema.

Quiero recordar aquél post que escribí hace ya cuatro años en el que ya hablaba sobre la pena de muerte. En él mencionaba la página web en la que el estado de Tejas publica las ejecuciones llevadas a cabo desde el 1982 junto a las últimas voluntades de los ejecutados. También recomendaba la película La Vida de David Gale; hoy, en el reportaje, Jordi ha regalado la película El Verdugo, una película de Berlanga que por aquél entonces mi profesora de sociales nos recomendó ver y en la que se relata la historia de un verdugo que se ha convertido en tal con tal de conseguir un piso y que, pese a esperar no tener que hacerlo, finalmente tiene que realizar una ejecución; aún no la visto, supongo que será momento de hacerlo.

Si queréis ver el reportaje, en estos momentos no está en la página web, pero seguro que a lo largo de esta semana estará colgado en la pestaña de "Programas Completos".

Antes de irme, tengo que reconocer que últimamente los reportajes que hacen en Salvados me resultan mucho más interesantes de lo que parecían ser cuando empezaron a emitir, o al menos, lo que a mí me parecían ser; si podéis, aprovechad para ver los reportajes de las últimas semanas.

Un saludo,
Morpheus

11 febrero 2011

Parafraseando a Coca Cola

En relación con Juan Gómez-Jurado, tras una disputa con un #FamosoCantante en la que le retaba a dar su libro gratis.

Via Barrapunto.

Un saludo,
Morpheus