Raspberry Pi. Paso 1: Instalar Raspbian

Raspbian

Introducción

Como para cualquier ordenador que se precie, lo primero debería ser elegir el sistema operativo que queremos utilizar. Ya sé que muchos os limitáis al Windows que viene por defecto en vuestros PCs pero aquí hay que elegir otra cosa, sobre todo porque la tarjeta microSD que compráis vendrá sin SO. Aunque bien es cierto que la nueva Raspberry Pi 2 es compatible con Windows 10, yo voy a explicar todo el proceso basándome en Raspbian: un Debian Linux adaptado a las capacidades de la RPi. Elijo este SO porque es el más versátil y el que nos permite instalar y modificar más cosas, además de poder convertirlo en casi cualquiera de los demás.

No quiero extenderme mucho en explicaciones previas, sólo decir que existe un modo de iniciarse en Raspberry Pi con NOOBS (instalador muy sencillo y básico), además de otros sistemas operativos como Snappy Ubuntu Core (todavía muy verde), RaspBMC (un SO más ligero centrado en XBMC), Openelec (más ligero todavía y sólo para utilizar XBMC), Pidora (Fedora adaptado a la RPi) o incluso Risc OS (sistema no basado en Linux) o RetroPie (un SO dedicado a la emulación de videoconsolas antiguas).

Descargar la imagen del sistema operativo

Esto es lo más fácil, entramos en la web de descargas oficial de Raspberry Pi, buscamos Raspbian y le damos a “Download ZIP”. A día de hoy la última versión es la Debian Wheezy del 31 de enero de 2015, aunque este tutorial sirve para cualquier versión.

http://www.raspberrypi.org/downloads/

Una vez descargado el ZIP, hay que descomprimirlo para obtener el fichero .img que hay dentro.

Instalar Raspbian en la tarjeta microSD

Como ya expliqué, la tarjeta debe ser al menos de 4 GB, de hecho el SO ocupará algo más de 3, así que mejor si es de 8 GB o más. A partir de aquí voy a explicar como se hace desde un PC con Linux, si tienes Windows puedes ver un tutorial aquí, y si tienes Mac aquí.

Antes de meter la tarjeta en el PC, que no hace falta que esté formateada porque este proceso lo hará, vamos a listar los dispositivos que tenemos conectados:

df -h

Después introducimos la tarjeta en el ordenador, bien mediante un lector de tarjetas o un adaptador USB y volvemos a hacer:

df -h

Habrá una línea nueva que empezará con la ruta del nuevo dispositivo, debería ser algo así:

/dev/sdc1

Variará en función de cada sistema, pero casi seguro que empezará por /dev/sd seguido por una letra y un número, en el ejemplo sería c1. Si por casualidad has introducido una trajeta SD particionada, aparecerán varias líneas nuevas pero todas con la misma raíz, algo tipo:

/dev/sdc1
/dev/sdc2

Ahora vamos a desmontar la unidad para poder modificarla:

umount /dev/sdc1

Si hay varias particiones de tu sdc, hay que desmontarlas todas.

Por fin vamos a copiar la imagen del sistema operativo en nuestra tarjeta microSD. El comando es el siguiente:

dd if=/ruta/descarga/zip/2015-01-31-wheezy-raspbian.img of=/dev/sdc bs=1M

Donde if es la ruta donde está el .img que descomprimimos del ZIP, of es el nombre del dispositivo que desmontamos antes (sin número de partición) y bs es el tamaño de los bloques a copiar. Este punto es importante. Normalmente con un tamaño de bloque de 4M sería suficiente, pero yo recomiendo que se copie en bloques de 1M para mayor seguridad. Eso sí, tarda muchísimo más, y lo peor de todo es que el comando dd no muestra absolutamente ninguna información del progreso de la copia, así que nos toca esperar a que termine sin ningún indicativo de nada, pero no desesperéis que acaba terminando en algún momento y nos muestra el resultado de lo copiado. Consejo: si no estás seguro si se ha quedado colgado el PC, mira la lucecita del lector de tarjetas, si parpadea es que está trabajando.

Fin

No hace falta hacer nada más en el PC. Sacamos la tarjeta, la metemos en la Raspberry Pi y debería arrancar sin ningún problema. Por cierto, reitero que lo ideal es alimentar la RPi con un típico cargador de móvil microUSB, a ser posible de 2A (aunque con 1A también funciona) y utilizar un cable HDMI para utilizar la TV como monitor. Cuantos más periféricos vayamos a conectar a la RPi, más alimentación necesitará, por eso recomiendo siempre el cargador de 2A.

Y todo este rollo para que al final sólo sea meter la tarjeta microSD en el PC, desmontarla y ejecutar el dd. No tiene más.

Mañana veremos qué hacer en el primer arranque y la configuración básica imprescindible para que todo esto tome forma.

Lo que necesitas saber de la Raspberry Pi

El señor Eben Upton, CEO fundador de Raspberry Pi, ha anunciado hoy mismo la mayor evolución que ha sufrido la RasPi desde su existencia: La Raspberry Pi 2, el salto de calidad definitivo para convertirse en el centro de entretenimiento de salón por excelencia. Cierto es que alberga muchísimos más ámbitos, como la domótica, pero aquí hablaremos de lo típico.

Con 1 GB de RAM DDR2 a 400 MHz, un procesador ARM Cortex-A7 Quad-Core a 900 MHz, ranura para microSD, 4 puertos USB y uno Ethernet, tenemos todas las armas necesarias para montar un servidor multimedia, un servidor de descargas e incluso nuestra propia nube privada o un emulador de consolas antiguas. Y todo ello por el módico precio de 35 dólares americanos.

Pero ¿qué necesitamos realmente? Esto no es plug&play ni mucho menos. Cuando compramos una Raspberry Pi estamos comprando una placa base, un hardware que por sí mismo no hace absolutamente nada, y además necesitamos algún hardware extra para hacer que sea el rey del salón.

Kit básico:

  1. Raspberry Pi
  2. Cable HDMI
  3. Cable alimentación (cargador de móvil, mejor si es de 2A)
  4. Tarjeta microSD (mínimo 4GB)
  5. Disco duro USB (para almacenar las películas, series, etc.)
  6. Cable de red Ethernet

Periféricos opcionales:

  1. Caja/carcasa (muy recomendable)
  2. Teclado/ratón USB
  3. Antena WiFi USB
  4. HUB USB (por si 4 no cumplen lo que pretendes montar)
  5. Mandos de juegos USB

Con los 6 primeros puntos puedes tener un centro multimedia para ver tus películas y series favoritas (XBMC o Kodi), un gestor de descargas directas y torrents (pyLoad y Transmission), un servidor de ficheros para compartirlos con toda tu red (samba), emuladores de juegos y videoconsolas antiguas (retropie) o incluso tu propio Dropbox (ownCloud), y todo ello accesible desde cualquier lugar del mundo (ddclient). Y las posibilidades son infinitas.

Pero básicamente, es un ordenador muy pequeñito y que consume muy poca energía, ideal para el salón y tenerlo encendido 24 horas descargando cosas o dando servicios web, de nube o ftp.

Mañana los pasos a seguir para instalar el sistema operativo en la tarjeta SD: imprescindible para el primer arranque un teclado USB cualquiera, no hace falta ratón, después no hará falta ni el teclado.

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.

ACTUALIZACIÓN: Me han preguntado mucho al respecto del siguiente error:

El Programador de tareas no pudo iniciar la acción "C:\Windows\SYSTEM32\cmd.exe" n la instancia "{7e37057d-42e1-4d5b-bc76-936eb69e6e6d}" de la tarea "\TareaDePrueba". Datos adicionales: valor del error: 2147942667.

Esto ocurre porque si la ruta del BAT tiene espacios, por ejemplo: C:\Ejecutables BAT\prueba.bat, en el campo “Programa o script” probablemente pongas la ruta con comillas (“), pues bien, en “Iniciar en” debes poner C:\Ejecutables BAT sin las comillas. Con eso funciona perfectamente.

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.