viernes, 19 de marzo de 2010

Quince segundos de fama en Twision

En el mundo de internet, no solo entre "frikis" y "geeks" recalcitrantes, y especialmente en la red social Twitter están de moda los mensajes que el astronauta de la agencia espacial japonesa Soichi Noguchi, que da la casualidad que tambien es twitero, @Astro_soichi, y envía con fotos tomadas en su tiempo libre desde la Estación Espacial Internacional (ISS) a Twitter como entretenimiento.

Soichi, normalmente en cada uno de sus envíos adjunta una foto y un pie de foto en el que indica lo que se puede ver en la misma, pero el pasado 16 de Octubre de 2010, rompió esta forma de actuar. No se si por desconocer el nombre de la ciudad que había fotografíado, o por conertir su actividad en una adivinanza a nivel mundial.

La foto en cuestión que publicó fue la siguiente:

Fotografía tomada por @Astro_Soichi

Cuando me quedé mirando la foto por primera vez, estaba un poco despistado, pues el no ver la entrada de la Ria despista un poco, pero al fijarme en el puente de la derecha (Puente de Rande) y la forma de los muelles del puerto de la ciudad me dije: "Coño, si esto es Vigo". Rápidamente vi los comentarios que habían incluido en la página en que estba la foto, y la verdad es que la gente estaba algo despistadilla, exceptuando uno que dijo símplemente "Spain?", otros apuntaban a Estambul, Montenegro, el Canal de la Mancha. Finalmente me lancé e un frenesí de twits escribiendo los siguientes:
@Astro_Soichi http://twitpic.com/18x0jv - Vigo, Spain. I'm there!!! 11:51 AM Mar 16th via TwitPic


@Astro_Soichi http://twitpic.com/18x0jv - Vexo Vigo, vexo Cangas, tamen vexo Redondela... Eng: I see Vigo, I see Cangas, I also see Redond 11:54 AM Mar 16th via TwitPic


@Astro_Soichi http://twitpic.com/18x0jv - What i have won??? 11:56 AM Mar 16th via TwitPic


@Astro_Soichi http://twitpic.com/18x0jv - You can see Rande Bridge on le right (http://www.grijalvo.com/Albaiges/Puente_de_Rande.jpg) 11:58 AM Mar 16th via TwitPic


@Astro_Soichi http://twitpic.com/18x0jv - You can see PSA Factory on the left (white building) and close to it Balaidos Stadium. 11:59 AM Mar 16th via TwitPic


@Astro_Soichi http://twitpic.com/18x0jv - On the north side you can see Cangas do Morrazo (left) and Moaña (center). 12:00 PM Mar 16th via TwitPic


@Astro_Soichi http://twitpic.com/18x0jv - Top-left corner Barra Beach (http://www.lugaresnaturistas.org/Pontevedra/barra1.jpg) 12:02 PM Mar 16th via TwitPic


@Astro_Soichi http://twitpic.com/18x0jv - http://saudade.blogia.com/upload/20051114145117-volvo-vigo2.jpg Volvo Ocean Race Start in Vigo on 12:16 PM Mar 16th via TwitPic


@Astro_Soichi http://twitpic.com/18x0jv - More on the left that what pic shows Cies Islands (http://www.guardian.co.uk/travel/2007/feb/16/be 12:24 PM Mar 16th via TwitPic

Al día siguiente para sorpresa mía, comprobé la repercusión que este juego a las adivinanzas había causado en los medios de comunicación, pues tanto La Voz de Galicia, que dedicaba su contraportada al tema, como Xornal.com , así como Antena 3 Televisión como Veo7 en su nuevo programa Twision, se hacían echo del juego entre el astronauta japonés y los twiteros. De hecho en Twision me nombraron, cosa que me hizo mucha ilusión, aunque me lo perdí por culpa de mi santa esposa.

Ayer, antes del programa fuimos a cenar a casa de mi madre, y tras la cena, empezamos a ver el programa allí. Mi mujer, que el tema de la tecnología lo lleva fatal, de hecho, ni siquiera se cree que los twits de  @melchormiralles sean de él, sino que dice que son de "algún currito" de Veo7, empezó, con el apoyo de mi madre, que desde que me casé parece que es mi suegra, a protestar,  y a decir que se quería ir para casa, que el programa era una chufa, que yo era un tarao de internet, que tenía sueño (lo típico), y se puso tan pesada, que aprovechando la publicidad tras la entrada a saco de @pablo_vfr salimos escopeteados para casa. Pero claro, tardamos 15 minutos, y al llegar y encender la tele sólo pude ver a Melchor Miralles despidiendo el programa. Ahora que un seguidor del programa me ha enviado el video del mismo, que majísimo es @jjimenez, le voy a hacer #FF hasta el verano por lo menos todos los viernes, lo voy a cargar en el teléfono y ponerselo a todas horas. Y es que yo también puedo ser muy insistente.

Para el que lo quiera, aquí tiene la dirección de la página con la foto donde originalmente la colgó @Astro_Soichi, mis comentarios no aparecen pues sólo lo hacen los más recientes. http://twitpic.com/photos/Astro_Soichi

Y el que quiera ver los 15 segundos de fama: http://vimeo.com/10293847 a partir del minuto 46 y 35 segundos.

martes, 8 de diciembre de 2009

Desencriptar una cadena en Java

En prácticamente todas las aplicaciones, siempre es necesaria la encriptación de algún tipo de información. El ejemplo más simple son las contraseñas de usuario, información personal o cualquier tipo de información sensible dentro del ámbito de la aplicación.

Anteriormente, habíamos visto un mecanismo para encriptar contraseñas y convertir el texto encriptado en una cadena almacenable en una base de datos o fichero sin problemas de codificación, mediante el API estandar de Java.

Veamos ahora cómo sería el proceso inverso:

  String cadena = "WZMLNsMJeI2PDCPuWudVucLfRyQlffqA" +
                  "1yYKWLOLuCv2SzIcw0Aegh6w3o6FjQ3T";
  String semilla = "0123456789";
  String cadenaDesencriptada = null;
  String tmp = new String( ( semilla.trim().concat("99999999") ).substring(0, 8 ) );
      
  byte[] claveDesc = new BASE64Decoder().decodeBuffer( cadena );
  SecretKeySpec desKey = new SecretKeySpec( tmp.getBytes(), "DES");
      
  Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
  cipher.init(Cipher.DECRYPT_MODE, desKey);
      
  cadenaDesencriptada = new String(cipher.doFinal(claveDesc));


Tras ejecutar el anterior código, obtendríamos la cadena original "No se a quien odio más, a Batman o a Guti" dentro de la variable cadenaDesencriptada.

Evidentemente, todo el código del ejemplo habrá que incluirlo dentro del correspondiente bloque try-catch y realizar la gestión de excepciones adecuada según nuestra aplicación.

Ver artículo: Encriptar una cadena en Java

miércoles, 2 de diciembre de 2009

Manifiesto “En defensa de los derechos fundamentales en internet”

Compas


Ante la inclusión en el Anteproyecto de Ley de Economía sostenible de modificaciones legislativas que afectan al libre ejercicio de las libertades de expresión, información y el derecho de acceso a la cultura a través de Internet, los periodistas, bloggers, usuarios, profesionales y creadores de internet manifestamos nuestra firme oposición al proyecto, y declaramos que…


1.- Los derechos de autor no pueden situarse por encima de los derechos fundamentales de los ciudadanos, como el derecho a la privacidad, a la seguridad, a la presunción de inocencia, a la tutela judicial efectiva y a la libertad de expresión.

2.- La suspensión de derechos fundamentales es y debe seguir siendo competencia exclusiva del poder judicial. Ni un cierre sin sentencia. Este anteproyecto, en contra de lo establecido en el artículo 20.5 de la Constitución, pone en manos de un órgano no judicial -un organismo dependiente del ministerio de Cultura-, la potestad de impedir a los ciudadanos españoles el acceso a cualquier página web.

3.- La nueva legislación creará inseguridad jurídica en todo el sector tecnológico español, perjudicando uno de los pocos campos de desarrollo y futuro de nuestra economía, entorpeciendo la creación de empresas, introduciendo trabas a la libre competencia y ralentizando su proyección internacional.

4.- La nueva legislación propuesta amenaza a los nuevos creadores y entorpece la creación cultural. Con Internet y los sucesivos avances tecnológicos se ha democratizado extraordinariamente la creación y emisión de contenidos de todo tipo, que ya no provienen prevalentemente de las industrias culturales tradicionales, sino de multitud de fuentes diferentes.

5.- Los autores, como todos los trabajadores, tienen derecho a vivir de su trabajo con nuevas ideas creativas, modelos de negocio y actividades asociadas a sus creaciones. Intentar sostener con cambios legislativos a una industria obsoleta que no sabe adaptarse a este nuevo entorno no es ni justo ni realista. Si su modelo de negocio se basaba en el control de las copias de las obras y en Internet no es posible sin vulnerar derechos fundamentales, deberían buscar otro modelo.

6.- Consideramos que las industrias culturales necesitan para sobrevivir alternativas modernas, eficaces, creíbles y asequibles y que se adecuen a los nuevos usos sociales, en lugar de limitaciones tan desproporcionadas como ineficaces para el fin que dicen perseguir.

7.- Internet debe funcionar de forma libre y sin interferencias políticas auspiciadas por sectores que pretenden perpetuar obsoletos modelos de negocio e imposibilitar que el saber humano siga siendo libre.

8.- Exigimos que el Gobierno garantice por ley la neutralidad de la Red en España, ante cualquier presión que pueda producirse, como marco para el desarrollo de una economía sostenible y realista de cara al futuro.

9.- Proponemos una verdadera reforma del derecho de propiedad intelectual orientada a su fin: devolver a la sociedad el conocimiento, promover el dominio público y limitar los abusos de las entidades gestoras.

10.- En democracia las leyes y sus modificaciones deben aprobarse tras el oportuno debate público y habiendo consultado previamente a todas las partes implicadas. No es de recibo que se realicen cambios legislativos que afectan a derechos fundamentales en una ley no orgánica y que versa sobre otra materia.

domingo, 22 de noviembre de 2009

Encriptar una cadena en Java

En prácticamente todas las aplicaciones, siempre es necesaria la encriptación de algún tipo de información. El ejemplo más simple son las contraseñas de usuario, información personal o cualquier tipo de información sensible dentro del ámbito de la aplicación.

Veamos cómo podemos codificar una cadena cualquiera utilizando el API estandar de Java.

        String claveEncriptada = null;
        String claveOriginal = "No se a quien odio más, a Batman o a Guti";
        String semilla = "0123456789";

        // Generamos una clave secreta.
        SecretKeySpec desKey = new SecretKeySpec(new String((semilla.trim().concat("99999999")).substring(0, 8)).getBytes(), "DES");
        Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, desKey);
        byte[] claveEncriptadaBytes = cipher.doFinal( claveOriginal.getBytes() );
        claveEncriptada = new BASE64Encoder().encode( claveEncriptadaBytes );






Evidentemente el código mostrado anteriormente habrá que incluirlo en un método con su generador de clave y su bloque try-catch.

Como podemos ver, la cadena que tratamos de codificar es: "No se a quien odio más, a Batman o a Guti" y el resultado que obtendríamos si ejecutaramos las instrucciones del listado sería: "WZMLNsMJeI2PDCPuWudVucLfRyQlffqA1yYKWLOLuCv2SzIcw0Aegh6w3o6FjQ3T".

La semilla, es utilizada por el algoritmo de encriptación para cifrar la cadena. Si quisieramos desencriptar la cadena obtenida, necesitaríamos la semilla para poder hacerlo. Es como la llave que abre la caja fuerte que contiene el contenido desencriptado original. A la hora de realizar una aplicación es de suma importancia que cada dato que encriptemos tenga una semilla diferente para no comprometer el total de la información en el caso de que la misma sea descubierta. El mecanismo para la elección debe ser elegido cuidadosamente para dificultar el trabajo a un posible "ladrón" que quisiera acceder a la información.

Es importante tener en cuenta que la encriptación genera una cadena de bytes, los cuales, transformados en una cadena de carácteres podría implicar la existencia de carácteres extraños en la misma, cosa que nos podría dar problemas a la hora de almacenar la información encriptada en una base de datos si no tenemos en cuenta que podemos insertar dicho tipo de cadenas a la hora de almacenarlas en fichero o base de datos. Para evitar dicho problema, utilizamos el codificación BASE64.

Ver artículo: Desencriptar una cadena en Java

Gracias a Gomstor por encontrar un error en el código que ya ha sido corregido.

sábado, 14 de noviembre de 2009

DNI, NIF, NIE

Muchas veces, a la hora de escribir un programa, hacer una web, etc, nos vemos en la necesidad de recoger información personal de un usuario, y en algunos casos, entre dicha información nos encontramos con el NIF/NIE de alguna persona.

Siempre que me he puesto a buscar por internet adelante, he encontrado montones de scripts que validan, calculan y formatean los NIFs, pero nunca he encontrado uno que me sirviera para los números de identificación de extranjeros, NIE.

¿Qué es eso del NIE? Pues muy sencillo, es un NIF para extranjeros. En un principio puede parecer una chorrada, pero no lo es en absoluto. Por ejemplo: Un inglés, llamémosle Paul Gascoigne, por ejemplo, quiere comprarse un pisito en Benidorm para pasar sus vacaciones en alguna terraza de la ciudad nadando en cerveza. Para realizar la compra necesitará un número de identificación ante hacienda (que somos todos, incuidos algunos extranjeros). Un NIF no se le puede dar, pues es sólo para personas con nacionalidad española. Por eso David, deberá obtener un NIE antes de poder adquirir su pisito-resaquero.

Básicamente un NIE es lo mismo que un NIF pero en el que se ha cambiado su primer dígito por una letra, que puede ser X, Y o Z. Por otro lado, a la hora de calcular la letra final, estas X,Y o Z se substituyen por un 0, 1 o 2 respectivamente, a partir de este momento, el cálculo es exáctamente el mismo que para el NIF.

A continuación muesto una serie de funciones javascript para validar y calcular automáticamente tanto NIF como NIE:

/*
  * Por CNG (www.trapallada.com).
  */
  function esNumerico(x)
  {
    var expresionRegularNDigitos = /^(\d*)$/;
    return x.match(expresionRegularNDigitos);
  }

  function esNifNie(x)
  {
    var expresionRegularNIE = /^[X-Z0-9]{1}[0-9]{7}$/;
    return x.match(expresionRegularNIE);
  }

  function obtenLetraNIF ( dni, destino )
  {
    dni.value = dni.value.toUpperCase();
    if ( esNifNie( dni.value ) )
    {
      var nifTmp = '';
      if ( esNumerico( dni.value ) )
      {
        nifTmp = dni.value;
      }
      else
      {
        switch( dni.value.charAt(0).toUpperCase() )
        {
          case 'X': nifTmp = dni.value.replace(/X/gi, "0");
                    break;
          case 'Y': nifTmp = dni.value.replace(/Y/gi, "1");
                    break;
          case 'Z': nifTmp = dni.value.replace(/Z/gi, "2");
                    break;
          default:  alert('NIF/NIE incorrecto');
        }
      }

        if ( nifTmp.length == 8 )
        {
          var cadena = 'TRWAGMYFPDXBNJZSQVHLCKET';
          var posicion = nifTmp % 23;
          destino.value = cadena.charAt(posicion);
        }
        else
        {
          destino.value = '';
        }
      }
      else
      {
        alert('NIF/NIE incorrecto');
      }
    }  
  }


Para probar este código deberemos incluir un inputbox html que realice las llamadas adecuadas:







CC-GNU LGPL


Este software está sujeto a la CC-GNU LGPL o superior.

domingo, 8 de noviembre de 2009

Convertir código ASP a PHP.

Problema: Dispongo de una web que hice hace tiempo utilizando tecnología ASP con conexiones a una base de datos access y ahora:

1- Quiero cambiar de tipo de servidor en mi proveedor de hospedaje a uno en linux para pagar menos al mes.

2- Quiero dejar de utilizar mi web para utilizar alguna herramienta de publicación como Wordpress o un CMS.

En ambos casos me gustaría poder seguir utilizando algunas de mis funciones ASP sin tener que recodificar todo manualmente, ya que eso me haría perder bastante tiempo.

Solución: ¡¡¡asp2php!!!

Se trata de un programita que te permite convertir código asp a php, respetando bastante la estructura original de los fichero, por lo que te será fácil retocar el código php generado si no tienes demasiados conocimientos de php, aunque sea símplemente por comparación con el archivo ASP original.

Pero veamos un ejemplo con los resultados de la conversión:

' Por CNG (www.trapallada.com).
Function getLiteral(intIdLiteral)
Set DB = Server.CreateObject("ADODB.Connection")
Set RS = Server.CreateObject("ADODB.Recordset")
DB.Mode = adModeReadWrite
DB.Open "dsn=miDSN;"

strSQL = "select literal from tLiterales where id=" + CStr(intIdLiteral)
RS.Open strSQL, DB, 3, 2
If RS.EOF or RS.BOF Then
strLiteral= "null"
Else
strLiteral= Trim(RS.Fields(0).Value)
End If
RS.Close
DB.Close
getLiteral= strENUNCIADO
End Function

generaría

// Por CNG (www.trapallada.com).
function getLiteral($intIdLiteral)
{
extract($GLOBALS);

// $DB is of type "ADODB.Connection"
// $RS is of type "ADODB.Recordset"
echo $adModeReadWrite;
$DB=mysql_connect("servidorDDSS","","");
mysql_select_db("",$DB);

$strSQL="select literal from tLiterales where id="+($intIdLiteral);
$rs=mysql_query($strSQL);
if (($RS==0) || ($RS_BOF==1))
{
$strLiteral="null";
}
else
{
$strLiteral=trim((0)->$Value);
}
mysql_close($DB);
$function_ret=$strLiteral;
return $function_ret;
}


El programa funciona en línea de comandos, pero para evitar lo engorroso del mismo, existen diferentes frontales para windows, MacOX e incluso para entorno web.  Yo sólo he probado el asp2php shell, con resultados magníficos por cierto. Lo único que hay que hacer es descomprimir el los archivos de asp2php y de asp2php shell en la misma carpeta.

jueves, 16 de abril de 2009

Ashton Kutcher vs CNN Breaking News

twitter_128x128De vez en cuando, el tedio habitual en que Internet se ha convertido para mi últimamente, se ve roto por algún video chorra o alguna polémica internetera. El pasado martes, me vi en una de esas situaciones.

Resulta, que el pasado lunes 13, al amigo Ashton Kutches (aplusk) no se le ocurrió otra cosa que grabar y publicar en youtube un video en el que reta a  CNN Breaking News (cnnbrk) de una manera muy particular. Si alcanza un millón de seguidores en Twitter antes que la CNN irá a casa de Ted Turnes (propietario de CNN) a todar el timbre y salir corriendo.


Al día sieguiente un video con el presentador de CNN Breaking News, Larry King,  contestaba al actor diciendole que no tenía nada que hacer, que la CNN era muy grande y que perdería, y aprovechó para invitarlo al programa para entrevistarlo.




El reto de Kutcher, se ha convertido en lo más entretenido de Internet últimamente. En el momento del reto CNN iba bastante por delante de él, y ayer le sacaba unos 8.000 seguidores por la mañana, aunque a la noche había conseguido recortar la distancia a 4000. Durante la noche del jueves al viernes (horario europeo) Kutcher ha tomado la delantera, y el resultado en el momento de escribir este artículo es:


Ashton Kutcher 995.251 - CNN Breaking News 994.249


¿Qué pasará en la lucha de David contra Goliath, Goliath contra Goliath?

miércoles, 25 de marzo de 2009

Codificación de los acentos en páginas web

file-html-128Generalmente cuando uno prepara una página web estática se limita a escribir "a saco" el texto que esta debe mostrar, incluyendo acentos y carácteres especiales. Esto no supone un problema si utilizamos un editor de páginas web que automáticamente fije la codificación del contenido, aunque lo lógico sería utilizar los tags de HTML para su correcta visualización. Por ejemplo, se deberá usar á (a aguda) para mostrar una á.

El problema se puede presentar al crear una página web dinámicamente, ya sea con ASP, jsp, php o cualquier otra tecnología en la que los textos que se deben mostrar se obtienen de una fuente de datos como una tabla de una base de datos y que han sido introducidos por terceros. En algunos casos, como sobre todo sucede con el navegador Firefox nos podemos encontrar con sorpresas, como ver unos rombitos en el lugar de alguna vocal acentuada. Ver un ejemplo (sólo firefox).

Para evitar este problema, deberemos incluir en la cabecera de la página el siguiente meta tag:

<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type"></meta>

Lo que informa al navegador de la codificación que debe utilizar para interpretar los carácteres de la página mostrada.

Otra opción es obligar al servidor a incluir dicho tag automáticamente. Esto se hace añadiendo al archivo .htaccess lo siguiente:

AddType text/html;charset=ISO-8859-1 .html

miércoles, 18 de marzo de 2009

Parámetros en línea de comandos en java

Una de las cosas más engorrosas a la hora de preparar una pequeña aplicación java en línea de comandos,al igual que en otros lenguajes de programación, es el tener que controlar todos los parámetros que se le pasan a la aplicación, el orden de los mismos, que vayan separados al estilo -s -l -r o -slr...

Existe un proyecto de Martian Software Inc. llamado JSAP, que será de gran ayuda para este tipo de cosas. Lo descubrí casi de casualidad y me parece una maravilla. Pero veamos un ejemplo: Imaginemos un programa que lee de un archivo una serie de datos, los procesa, y los escribe en un archivo de salida, exceptuando los datos que generan alguna incidencia que son grabados en un tercer archivo de errores, la aplicación además parará cuando se produzcan un número de errores igual al indicado en otro parámetro, es decir el clásico problema de metodología Warnier.

El programa debería ejecutarse con un comando del estilo de:

java com.trapallada.programa -i entrada.txt -o salida.txt -e errores.txt -n 500


donde los parámetros podrían ser aparecer en cualquier orden.

/*
* Por CNG (www.trapallada.com).
*/
public static void main(String[] args)
{
try
{
JSAP jsap = new JSAP();

// Se crean los diferentes parámetros:
// Parámetro del fichero de entrada
FlaggedOption optEntrada = new FlaggedOption("Fichero de Entrada")
.setStringParser(JSAP.STRING_PARSER)
.setRequired(true)
.setShortFlag('i')
.setLongFlag("input");

// Parámetro del fichero de salida
FlaggedOption optSalida = new FlaggedOption("Fichero de Salida")
.setStringParser(JSAP.STRING_PARSER)
.setRequired(true)
.setShortFlag('o')
.setLongFlag("output");

// Parámetro del fichero de errores
FlaggedOption optErrores = new FlaggedOption("Fichero de Errores")
.setStringParser(JSAP.STRING_PARSER)
.setRequired(true)
.setShortFlag('e')
.setLongFlag("errores");

// Parámetro del fichero de número de errores (no obligatorio)
FlaggedOption optNumeroErrores = new FlaggedOption("Número de Errores")
.setStringParser(JSAP.INTEGER_PARSER)
.setRequired(false)
.setShortFlag('n')
.setLongFlag("numErrores");

// Registramos los parámetros
jsap.registerParameter(optEntrada);
jsap.registerParameter(optSalida);
jsap.registerParameter(optErrores);
jsap.registerParameter(optNumeroErrores);

// Se procesan los argumentos de la línea de comandos
JSAPResult config = jsap.parse(args);

// Si se produce algún error generamos el mensaje de error con JSAP.
if (!config.success())
{
System.err.println();
System.err.println("Uso: java " + Lector.class.getName());
System.err.println(" " + jsap.getUsage());
System.err.println();
System.exit(1);
}

// Se recogen los datos del la configuración cargada desde los
// parámetros de la línea de comandos.
String entrada = config.getString(optEntrada.getID());
String salida = config.getString(optSalida.getID());
String errores = config.getString(optErrores.getID());
Integer numErrores = new Integer(config.getInt(optNumeroErrores.getID()));
}
catch (Exception e)
{
e.printStackTrace();
}
}

Esto sería lo que devolvería la ejecución de la clase en el caso de no poner nada a continuación de la llamada a la misma (sin parámetros).

Uso: java com.trapallada.programa
(-i|--input) <Fichero de Entrada> (-o|--output) <Fichero de Salida> (-e|--errores) <Fichero de Errores> [(-n|--numErrores) <Número de Errores>]

miércoles, 4 de marzo de 2009

Menos da una piedra

ppEso es lo que debe estar pensando "nuestro amiguito Marianico el Corto", y no, no me refiero al lamentable personaje de los programas de televisión tipo José Luis Moreno.

La verdad es que desde 2004 y el Rubalcabazo, es la primera vez que los Populares pueden presumir de haber ganado algo de verdad. Pero, si se ojean un poco los datos, sin necesidad de profundizar gran cosa podemos ver un par de datos que son como para que los dirigentes del PP se preocupen un poco, y claro, RuizGa, el superhéroe de las páginas interiores de El Pais se frote las manos y se dedique a preparar sus zapatos de la primera comunión para ponerselos al minuto de que se lleven los restos de "Marianico y sus peones".

En Galicia el PP ha sacado mayoría absoluta, pero en votos sólo ha subido 4000 (aún falta el voto de la inmigración), pero en el Pais Vasco, ha bajado la friolera de 65.000, lo que supone un neto de una pérdida de 61.000. ¿Es realmente esto como para sacar pecho? Sobre todo, teniendo en cuenta dos cosas: En Galicia, son muchos los que han apelado al voto útil para echar e los nacionalistas (esa corriente política que convierte en mierda todo lo que toca), y en el Pais Vasco, había 8 escaños más a repartir entre todos, y aún así, han perdido 2.

¿Qué pasará en las europeas cuando a la gente le importe "un huevo" su voto y decida castigar los bandazos de Marianico y demás con un voto de castigo a UPyD o la abstención? Lo veremos en junio.