viernes, 1 de octubre de 2010

El Cambio, Change, Exchange, Weschel Climático

A pesar de adorar las teorías de la conspiración, y es que en el fondo siempre he sido y seré un romántico empedernido, siempre he sido bastante esceptico y receloso ante las teorías milagro, esos grandes descubrimientos con los que los gurús nos sorprenden de vez en cuando, y con sus consecuencias que van a cambiar a la el planeta y la humanidad de un día para otro, poniendolos en peligro. Pero me dejo ya de rodeos.

Pongamos un par de ejemplos:
  • La lluvia ácida: Recuerdo que allá por los 80, hasta estudié en el colegio la reacción química que se producía en la atmósfera entre los dióxidos de azufre, el agua y el oxígeno. Era un pelígro terrorífico que podía acabar con las construcciones de las ciudades en menos de 10 años, que afectaría a las especies animales e incluso a la humana, y patatín y patatán. La lucha contra la lluvia ácida era uno de los mantras de Greenpeace.
  • El agujero de la capa de ozono: El caso del agujero de la capa de ozono supuso una movilización a nivel internacional, aunque yo la llamaría fraude a nivel internacional. Los medios han dado la matraca con el crecimiento del mismo, con los CFCs de los aerosoles y neveras, la pegatinas con la frase: "Amigo del ozono"... Pero recientes investigaciones prueban que dicho agujero tiene sus orígenes en causas naturales y que aparece y crece periódicamente.
Los defensores de la teoría del cambio climático dicen que los escépticos son financiados por las compañías petroleras que no quieren ver comprometido su negocio, que tienen argumentos científicos, pero dichos defensores no tienen en cuenta u obvian los ciclos solares,  además de ser subvencionados por las multinacionales de energías renovables. Argumentos como que el el aumento de C02 puede ser catastrófico no se sostienen por si mismos, en la época de los dinosaurios había 6.000 ppm frente a las 380 ppm actuales. En aquella época además no había casquetes polares. La tácticas de los “calentólogos” se basan en el miedo: “Si sube el CO2 vendrá una catástrofe, es una gas contaminante”. La civilización que empieza en el neolítico surge debido a un aumento del CO2 que provoca la actual época interglacial.

Todo esto, además se suele adornar con un envoltorio de pseudo-telepredicador catastrofista: se extenderá la malaria, el sida, fiebres, terrorismo… igual que cuando se pregonaba de los peligros del agujero de la capa de ozono para la piel.

Ahora, con estos precedentes y con todos los informes que contradicen las teorías de los llamados "calentólogos" ¿Qué hacemos? Está claro que el cuidado del medio ambiente debe ser una prioridad de todos, de hecho, procuro educar a mis hijas en este sentido, pero una cosa es preservar nuestro planeta y otra hacer caso a las modas, para que cuatro espavilados se lo lleven crudo por dar conferencias con datos falsificados, y por encima el Nóbel de la Paz.

    sábado, 17 de abril de 2010

    Fin de semana: ¿Tiempo libre?

    RelojPor fin un fin de semana en el que vuelvo a la normalidad. Una de las pegas de haberme venido a vivir a una zona de veraneo, es que los amigos y familiares sólo vienen el fin de semana, y es raro el fin de semana que no tienes un compromiso por ese motivo. Cuando no es un pariente cercano que quiere ver a las niñas, es algún amigo que "no me ve desde hace meses", o un pariente no tan cercano que quiere que le vayamos a ver con las niñas porque sus hijos no le dan nietos, etc.

    Este fin de semana por fin lo tengo entero para mi, mi mujer y las niñas, salvo un par de cosas como alisar un montón de tierra en el jardín para posar sobre él una piscina hinchable en verano y no tener que montar una tarima, plantar cesped en una zona del jardín que estamos renovando, estudiar dos temas del P.E.R. que me estoy sacando, podar el limonero de una vez, pasar la segadora en el jardín, avanzar un poco en un programa que estoy preparando para el Club Náutico del que soy vocal, y escribir este post, cosa que me he impuesto, pues hacía mucho que no escribía ningúno. Supongo que el fin de semana acabará y no habré conseguido hacer todo, poque uno no es superman, las niñas entran en modo Armagedon de vez en cuando, mi mujer siempre anda pidiendo que haga cosas absurdas, cosa provocada por su ansia de ordenar la casa una y otra vez, y uno mismo, al estar de fin de semana, se disipa con cierta facilidad, de todas maneras a ver si mañana antes de acostarme, puedo completar este posto con mis logros del fin de semana.

    En resumen, que ¡por fin puedo dedicarle un fin de semana entero a mi mujer y a mis hijas!

    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?