GnuPG

Si has agregado un repositorio de ppa.launchpad.net a mano y al intentar leerlo con update te da el siguiente mensaje:

Error de GPG: http://ppa.launchpad.net precise Release: Las firmas siguientes no se pudieron verificar porque su llave pública no está disponible: NO_PUBKEY 4F4EA0AAE5267A6C

No te preocupes, el problema viene dado porque no tienes instalada la clave GPG, lo cual se soluciona de la siguiente manera:

:~$ gpg –keyserver subkeys.pgp.net –recv-key E5267A6C && gpg -a –export $PUBKRY | sudo apt-key add -

Como puedes ver, la única precaución que debes tener es poner en el parámetro –recv-key los últimos 8 caracteres del error anterior. Si todo ha ido bien te dirá cuantas claves ha importado y terminará con un OK.

Fácil, rápido y para toda la familia. Pero si tienes problemas lo vemos en los comentarios.

bash

Prácticamente todos los servidores Linux incorporan un servidor de correo, así que es probable que nunca se te haya planteado este problema, pero hay veces que necesitas enviar un correo desde un servidor SMTP externo. Ésto es muy fácil de conseguir gracias a nuestro amigo telnet. Sin embargo, hoy queremos hacerlo de manera automática desde un script bash, es decir, sin tener que ir introduciendo los comandos telnet y además desde una cuenta de correo que requiere autenticación. Viene muy bien para programar tareas que envíen emails al finalizar, por ejemplo.

No me enrollo más, primero el código del script y luego una breve explicación:

#!/bin/bash
(
sleep 2
echo "HELO smtp.midominio.com"
sleep 2
echo "auth login"
sleep 2
echo "bWNsYXJlbnguY29tQGdtYWlsLmNvbQ=="
sleep 2
echo "TWNMYXJlblg="
sleep 2
echo "MAIL FROM:micorreo@midominio.com"
sleep 2
echo "RCPT TO:destino@sudominio.com"
sleep 2
echo "DATA"
sleep 1
echo "SUBJECT:texto_del_asunto"
sleep 1
echo "FROM:remitente"
sleep 1
echo ""
sleep 1
echo ""
sleep 1
echo "Cuerpo del mensaje"
sleep 1
echo ""
sleep 1
echo "."
sleep 2
echo "QUIT"
) | telnet servidor_smtp 25

Si estás familiarizado con telnet te será fácil entender el código, aunque quizá la tercera y la cuarta línea (sin contar los sleeps) te sorprendan, es la clave para hacer que todo esto funcione. Usuario y password deben ir codificados en base64. El resto es un telnet normal que ejecutarías por consola. Lo explico igualmente:

  1. HELO smtp.midominio.com: inicia la comunicación con el servidor que va a enviar el email
  2. auth login: le dice al servidor SMTP que la cuenta que vamos a usar para enviar el email requiere autenticación
  3. bWNsYXJlbnguY29tQGdtYWlsLmNvbQ==: usuario en base64
  4. TWNMYXJlblg=: contraseña en base64
  5. MAIL FROM:micorreo@midominio.com: dirección de correo que envía el email
  6. RCPT TO:destino@sudominio.com: destinatario del email
  7. DATA: le indicamos al servidor que estamos listos para enviarle todos los datos del email
  8. SUBJECT:texto_del_asunto: el asunto del email
  9. FROM:remitente: el remitente puede ser una dirección de correo o simplemente un nombre
  10. Dejando un espacio es suficiente, pero yo dejo dos para que no se haga líos
  11. Cuerpo del mensaje: el texto del email
  12. Antes del QUIT hay que poner un punto (.) para indicarle que ya hemos terminado de darle los datos
  13. QUIT: termina la comunicación
  14. telnet servidor_smtp 25: hace todo lo anterior tras conectarse por telnet al servidor_smtp por el puerto 25

No me voy a meter a profundizar en el telnet a un servidor SMTP porque obviamente hay muchísimas más opciones para decirle qué y cómo mandar el email, pero eso ya os lo dejo a vuestro gusto e investigación. Lo importante: poner entre paréntesis todas las instrucciones que queremos mandar por telnet y que el usuario y la contraseña para autenticarnos en el servidor estén en base64, puedes convertirlos desde esta web.

Ante cualquier problema, duda o errata los comentarios están activados.

AspClassic

Veamos la situación en la que queremos mostrar un fichero, típicamente un PDF, un Excel o algún otro documento no HTML que queramos plasmar en la web, pero no queremos que el usuario conozca la URL del mismo para que sólo sea accesible desde la propia web, y no copiando la dirección en cualquier navegador. Una buena manera de conseguir ésto es sacando los ficheros fuera del sitio web, así ya no son accesibles vía URL. Pero el problema es: ¿y cómo muestro un fichero que está fuera del raíz de mi sitio web?

Pongámonos en situación. Si el sitio web está definido en el IIS en la ruta C:\webs\misitioweb, los ficheros que queremos ocultar vía URL los pondremos en C:\webs\docs. Obviamente, desde un ASP que esté dentro de misitioweb no vamos a poder acceder a docs, ya que está fuera del sitio web y el famoso Server.MapPath no admite “..” para subir de nivel fuera del mismo. Así que aquí viene la magia: el objeto “ADODB.Stream”. Sé que hay gente que podría pensar en utilizar el objeto FSO, pero éste sólo lee datos ASCII así que para PDFs o Excels no nos va a servir. Vamos al código:

rutadoc = "C:\webs\docs\documento.pdf"
Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = 1 ' Tipo binario, poniendo 0 sería tipo texto
objStream.LoadFromFile rutadoc
Response.ContentType = "application/pdf" ' El MimeType que corresponda
Response.BinaryWrite objStream.Read ' Aquí muestro el fichero
objStream.Close
Set objStream = Nothing

Creo que es bastante fácil de entender, simplemente creamos un objetivo de tipo Stream, lo abrimos, cargamos el objeto con el fichero en binario que queremos mostrar y lo mostramos. Funciona perfectamente bien y conseguimos el objetivo: mostrar un fichero en la web que está fuera en una ruta del sitio web, y por tanto, no es accesible mediante una URL escrita en el navegador directamente. Sólo una precaución, para que el Response.BinaryWrite funcione en Chrome y Firefox, es obligatorio poner el Response.ContentType correcto. Internet Explorer no lo necesita.

Espero que le sirva de ayuda a alguien y ante cualquier duda los comentarios están activados. Saludos.

Hay gente que tiene un don especial, y no estoy hablando de esos timadores que se inventan tu futuro por teléfono, hablo de personas que te dejan con la boca abierta, que te sorprenden con su talento por encima de la media. En este caso ha sido Anthony Vicent, de los Ten Second Songs, quien se ha metido en el saco de mis ídolos absolutos. No hay más que darse una vuelta por su canal de YouTube para darse cuenta de la espectacular voz de este chico, y la forma de adaptarse a todo tipo de estilos musicales (rock, rap, pop, heavy, reggae…) es lo que termina de encumbrarle. Sin más, os dejo In the end de Linkin Park cantada por el señor Vincent de 20 formas diferentes, absolutamente increíble (4:15):

Pues ya son 10 años por aquí

Diez años

La pena es haber estado 2 lustros escribiendo en un blog irrelevante mientras que otros, como Mark Zuckerberg, lanzaban el mismo año lo que les haría millonarios. Pero mejor no pensar en ello y hacer balance del pasado, porque normalmente la pregunta es: ¿dónde te ves dentro de 10 años? Cuando lo divertido es: ¿te veías así hace 10 años? Y no, obviamente no, ni parecido.

Hace 10 años todavía estaba en la universidad, trabajando en el circuito del Jarama los fines de semana y dando clases particulares después de la facultad. Mis sueños eran irme a estudiar fuera, probablemente para no volver, vivir en algún país del norte de Europa o dar el salto a EE.UU. o Japón, dedicarme a la investigación en el campo de la robótica y la inteligencia artificial, aprender idiomas… ya sabes, todo eso que no ha pasado y que probablemente ya no pase.

Nunca me he sentido muy de aquí, y no estoy hablando de patriotismo, pero al final echas raíces y te acostumbras. En estos 10 años ha muerto gente, pero también han nacido. He perdido buenas amistades y he ganado otras tantas. Nada fuera de la lógica habitual. Pero, a pesar de no haber cumplido las expectativas, creo que he seguido un camino del que no puedo arrepentirme demasiado. He viajado por todo el mundo, he ido a todos los conciertos que una persona puede soportar, he practicado los deportes que me entusiasman, tengo un trabajo que me gusta y le importo a las personas importantes. Creo que la ambición que tenía hace 10 años no se conformaría con ésto, como es lógico, pero puedo decir que tampoco ha sido un desastre.

¿Y dentro de 10 años más? Pues espero que el blog siga, la actividad no es frenética, pero siempre viene bien tomar algunos apuntes por aquí o soltar cualquier cosa que quiera volver a ver dentro de un tiempo. Ésto no es más que un “diario en la nube”, tanto para lo personal como para lo profesional y lo cómicofestivo. Respecto a mi vida, lo más seguro es que no acierte absolutamente nada, aunque cuanto mayor te haces, menos bruscos son los cambios. Supongo que lo único que sí tengo un poco claro es que seguiré trabajando en lo mismo, o parecido, o en la evolución tecnológica de lo que hago ahora (que en esto de la informática nunca se sabe…), pero respecto al lugar o al éxito es demasiado difícil de aventurar.

Nada más por hoy. Si el trabajo, la familia, las redes sociales y el RBP me lo permiten, intentaré escribir más a menudo por aquí, pero no prometo nada. Salud.

Redireccionar una web desde el Apache

Redireccion web

Creo que a estas alturas ya todo el mundo sabrá que los buscadores, Google, penalizan bastante el contenido duplicado, es por eso que la misma web accedida desde dos URLs diferentes es una mala práctica a la hora de posicionarla. Es decir, mclarenx.com y www.mclarenx.com son webs distintas con el mismo contenido, y eso hay que evitarlo.

La mayoría de las webs utilizan la redirección 301 en el .htaccess para, por ejemplo, todo el tráfico que venga desde mclarenx.com lo redireccione a www.mclarenx.com. Y eso es suficiente, funciona y es lo que queremos que haga, porque así mclarenx.com nunca tendrá contenido.

Sin embargo, hoy voy a explicaros como hacer exactamente lo mismo, pero a nivel de Apache. La razón de hacerlo así es brindar a tus clientes un servidor web con redirección automática y sin duplicidad de contenidos, lo que mejorará su posicionamiento sin hacer nada, muy útil para quien tiene una web pero no conocimientos.

Abrimos el fichero para editarlo:

:~$ sudo nano /etc/apache2/sites-available/miweb

Normalmente tendrás algo parecido a esto:

<VirtualHost *:80>
  ServerName www.mclarenx.com
  # Además de todos los <Directory>, DocumentRoot, Options, etc.
</VirtualHost>

Todo eso debe quedar exactamente igual. Lo importante es crear un segundo en el que vamos a agregar la redirección:

<VirtualHost *:80>
   ServerName mclarenx.com
   RedirectMatch permanent ^/(.*) http://www.mclarenx.com/$1
</VirtualHost>

Ambos bloques deben quedar independientes dentro del mismo fichero. Quien haya utilizado la redirección en el .htaccess le resultará muy familiar la nomenclatura, y es que finalmente hace lo mismo, pero sin tener que depender del desarrollador, ya que el subdominio www suele estar presente en prácticamente todas las webs, así que mejor incluirlo de serie en el Apache, y utilizar el .htaccess para las florituras.

Obviamente, tras modificar el fichero hay que ponerlo en producción:

:~$ cd /etc/apache2/sites-available/
:~$ sudo a2ensite miweb
:~$ sudo service apache2 reload

Archivos-bat

Tienes un BAT que realiza justo las tareas que necesitas sin un software externo, y quieres programarlo para que se ejecute en un Windows Server 2008 R2… pero no lo hace. El BAT está perfecto, lo lanzas desde consola y funciona sin problemas, pero a la hora en que le has puesto en el Programador de Tareas que se ejecute… no lo hace.

Bien, dependiendo lo que haga el BAT en cuestión, este problema puede ser de varias índoles. Sin embargo, si el BAT se ejecuta perfectamente y si estamos totalmente seguros de haber configurado bien el Programador de Tareas en cuanto a permisos, tiempos y demás, la solución la encontraremos en un parámetro que aparece como opcional pero no lo es: Iniciar en.

Así es amigos, es tan sencillo como ir a la pestaña “Acciones” y, además de poner el programa o script que vamos a ejecutar, en el campo “Iniciar en (opcional):” hay que escribir la ruta donde está el BAT que queremos ejecutar.

Si por ejemplo nuestro fichero BAT está en C:\scripts\prueba.bat, en el campo “Iniciar en” hay que poner C:\scripts

Tan fácil como imposible de adivinar. Microsoft una vez más luciéndose. Ese opcional…

Si tampoco se ejecuta con eso, tu problema seguramente sea de permisos. En la pestaña “General” selecciona “Ejecutar tanto si el usuario inició sesión como si no” y “Ejecutar con los privilegios más altos”. Al aceptar nos pedirá las credenciales del usuario y listo.

Instalar TP-Link TL-WN725N v2 en Linux Mint

tp-link-tl-wn725n

El TP-Link TL-WN725N se hizo bastante famoso en el mundillo Linux, especialmente para los poseedores de una Raspberry Pi, por su reducidísimo tamaño, por una instalación sencilla y por la calidad fabulosa a coste ridículo. Sin embargo, eso era con la v1 que montaba el chip RTL8188CU, ya que con la v2 que monta el RTL8188EU la cosa se ha complicado un poco. Por suerte no es demasiado difícil instalar el controlador del nuevo chip, así que os lo explico en 10 sencillos pasos desde la consola. Y como casi todo tutorial apto para Linux Mint, funciona de igual manera para Ubuntu y cualquiera de sus derivados (como lo es el propio Mint).

  1. Instalar GIT (o actualizarlo si ya lo tienes instalado):
    :~$ sudo apt-get install build-essential git
  2. Descargar el driver desde GIT:
    :~$ git clone git://github.com/liwei/rpi-rtl8188eu.git
  3. Acceder a la carpeta donde se descargó el driver:
    :~$ cd rpi-rtl8188eu
  4. Compilar el driver:
    :~$ make
  5. Instalar el driver:
    :~$ sudo make install
  6. Escanear los módulos:
    :~$ sudo depmod -a
  7. Actualizar la memoria del kernel:
    :~$ sudo update-initramfs -u
  8. Cargar el nuevo módulo al kernel:
    :~$ sudo modprobe -v 8188eu
  9. Conectar el adaptador WiFi a un puerto USB.
  10. No hace falta reiniciar el equipo, el Network Manager ya debería reconocer el adaptador y mostrar las redes WiFi disponibles. Si no es así, con desactivar y volver a activar la red desde el propio Network Manager debería ser suficiente.

Como veis es muy sencillo y rápido, pero si os atascáis en algún punto u os surgen dudas ya sabéis que en los comentarios solucionaré lo que esté en mi mano.

Validar IBAN en JavaScript

IBAN

Si a estas alturas no has adaptado todavía tus aplicaciones web a la nueva normativa es porque te ha pillado el toro, sin discusión. Pero más allá de este pequeño detalle, si necesitas comprobar el IBAN con JavaScript y no logras dar con la tecla, no te preocupes, intentar dividir un número de 26 cifras en JavaScript es una tarea bastante compleja, como ya habrás descubierto si has caído aquí. Por suerte hay una forma diferente de calcular el módulo que con el operador ‘%’. Vamos allá.

// Función que devuelve los números correspondientes a cada letra
function getNumIBAN(letra){
var letras = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
return letras.search(letra) + 10;
}

// Función que calcula el módulo sin hacer ninguna división
function mod(dividendo, divisor){
var cDividendo = '';
var cResto = '';

for (var i in dividendo){
var cChar = dividendo[i];
var cOperador = cResto + '' + cDividendo + '' + cChar;

if (cOperador &lt; parseInt(divisor)){
cDividendo += '' + cChar;
}else{
cResto = cOperador % divisor;
if (cResto == 0){
cResto = '';
}
cDividendo = '';
}
}
cResto += '' + cDividendo;
if (cResto == ''){
cResto = 0;
}
return cResto;
}

// El típico trim que inexplicamente JavaScript no trae implementado
function trim(texto){
return texto.replace(/^\s+/g,'').replace(/\s+$/g,'');
}

// Función que comprueba el IBAN
function validaIBAN(IBAN){
IBAN = IBAN.toUpperCase();
IBAN = trim(IBAN); // Quita espacios al principio y al final
IBAN = IBAN.replace(/\s/g, ""); // Quita espacios del medio
var num1,num2;
var isbanaux;
if (IBAN.length != 24){ // En España el IBAN son 24 caracteres
return false;
}else{
num1 = getNumIBAN(IBAN.substring(0, 1));
num2 = getNumIBAN(IBAN.substring(1, 2));
isbanaux = IBAN.substr(4) + String(num1) + String(num2) + IBAN.substr(2,2);
resto = mod(isbanaux,97);
return (resto==1);
}
}

Con esto deberías tener suficiente, siempre se pueden hacer más comprobaciones para afinar un poco, como validar que los dos primeros caracteres sean letras y el resto números, o adaptar comprobaciones de longitud y posición para cada país, pero eso ya se lo dejo a cada uno, que aquí lo complicado es lo del módulo.

Para terminar, voy a dejar la explicación de la normativa, supongo que ya la conoceréis de sobra pero nunca está demás leerlo sin parafernalia lingüística:

El IBAN está compuesto por 2 letras que son el código del país, 2 números que hacen de dígitos de control y hasta un máximo de 30 posiciones más para la cuenta, la cantidad exacta depende del país. En España son 20 dígitos para la cuenta, así que tendremos los IBAN de 24 caracteres en total.

La manera de comprobar que un IBAN es correcto es siguiendo los siguientes pasos (ejemplo: ES38 0081 0283 4100 0111 1416):

  • Transformar las letras en números según la siguiente serie: A = 10, B = 11, C = 12, etc. Por lo tanto para España sería E = 14 y S = 28
  • Pasar tanto los códigos de las letras del país como los dígitos de control al final de la numeración, quedando así: 0081 0283 4100 0111 1416 142838
  • Obtener el resto de dividir éste último número entre 97 (mod 97)
  • Si el resto es 1, el IBAN es correcto, en otro caso no lo es

Espero que os sirva y ante cualquier duda ya sabéis, comentarios aquí abajo.

Trucos para apostar: La martingala

Loser vs Winner

Si os ha picado el gusanillo de las apuestas online, seguro que cuando habéis empezado a trastear por Internet en busca del truco que os hiciese de oro, os habéis acabado topando con la martingala.

La martingala, aunque parezca extraño, no es la prima francesa de vuestro amigo Martín, sino un método totalmente infalible de apostar online. Tomad nota que os explico:

Así funciona la martingala

Este truco del almendruco vale en principio para apuestas con dos opciones equivalentes, pero he visto por ahí que mucha gente lo utiliza para apostar a partidos de fútbol, u otros acontecimientos deportivos.

Se trata de apostar una unidad a un suceso, por ejemplo, al lanzar una moneda, a que salga cara. Si ganamos, lo celebramos y llamamos a nuestros amigotes para reírnos de ellos por tener que trabajar para ganar pasta. Si perdemos, volvemos a apostar al mismo suceso el doble que la vez anterior.

Imaginaos que apostamos 3 veces y acertamos a la cuarta. Habremos apostado 1+2+4+8=15, y sacaremos 8×2=  tachaaaaan ¡16! Vale, ganamos 1, quizá no sea mucho pero esto se puede repetir varios millones de veces y… perderlo todo.

Por qué no funciona la martingala

Sí, esto de la martingala funciona la mayoría de las veces, pero hay malas rachas en las que necesitaremos apostar bastante. Hay que tener en cuenta que la cantidad que apostamos se dobla cada vez, es decir que en la décima apuesta tenemos que apostar: 1-2-4-8-16-32-64-128-256-¡¡512!! Eso en la décima apuesta, que antes ya habremos perdido otros 511 euros antes.

En resumen, la martingala funcionaría si fuésemos lo suficientemente ricos como para pasar de hacer apuestas en internet para ganar 4 duros, pero con una capacidad económica normal, es relativamente probable que una de las veces que comencemos la progresión esta se alargue hasta que nos quedemos sin dinero y no podamos seguir subiendo la apuesta. Eso sin contar que las casas de apuestas suelen tener un límite máximo de lo que se puede apostar o ganar con una apuesta.

Entonces…

¿Qué funciona en las apuestas?

Lo que funciona es divertirse un rato sin grandes aspiraciones. Si nos gusta el deporte, analizar los partidos, estadísticas y rachas de los equipos, y siempre el sentido común. Si alguien tiene la gallina de los huevos de oro no lo va a compartir en Internet, así que desconfía.

Está claro que conocer las distintas estrategias es mejor que no hacerlo, y gracias a Internet investigando un poco es fácil “formarse” en la materia.

Si quieres probar tus propias estrategias, puedes hacerlo en Betsson, una casa de apuestas de origen sueco que ofrece una buena variedad de posibilidades. Pero recuerda: no existe la fórmula mágica para forrarse, si así fuera, todos seríamos millonarios y los casinos que tanto me gustan no existirían, lo cual me pondría muy triste.