Certificado SSL en Node.js y Express

Ayer instalé mi primer certificado oficial. Se trata de un Positive SSL de Comodo, de unos 4 euros al año. Comprado en DonDominio para más detalles: Comodo Positive SSL

Llevaba unos cuantos días usando un certificado casero o “self-signed certificate” (Creating a Self-Signed SSL Certificate) porque aun no tenía comprado el dominio. Pero ayer ya me decidí así que voy a explicar cuáles fueron los pasos, ya que en realidad es mucho más sencillo de lo que pudiera parecer, claro que la primera vez es más complicado. Además para Node.js no es que haya muchos tutoriales, así que creo que merece la pena.

Bueno, primer paso, comprar el certificado. Para ello hay que rellenar un formulario, el CSR (Certificate Signing Request) con los siguientes datos:

  • Dominio/Subdominio
  • Empresa/Organización
  • Sección/Departamento
  • Email
  • País, provincia y localidad

Esto está muy bien, claro que cuando no eres una empresa pueden surgir dudas ¿verdad? Al menos ese fue mi caso, ¿qué pongo en “empresa”? ¿es importante o puedo poner cualquier cosa? Tras consultar con el soporte técnico de DonDominio (muy majos dicho sea de paso) me informan de que al tratarse de un certificado de validación de dominio (y no de validación de empresa) se puede poner el dominio. Y en la sección o departamento pues… otro tanto de lo mismo. Así que el CSR quedaría tal que:

  • Dominio: www.midominio.com (Sí, con el www. No pasa nada porque este certificado en concreto funcionará también para el dominio sin www)
  • Empresa: MiDominio.com
  • Sección: MiDominio

Vale, con esto se genera el CSR y DonDominio nos proporciona la que será nuestra clave privada. Debemos guardar esto en un archivo, que llamaremos midominio.com.key para más adelante, y tendrá un aspecto tal que así:

Completado el proceso de compra ya solo falta esperar a que nos llegue el email de verificación, que es básicamente un link que debemos pulsar. En pocos minutos (muy pocos de hecho) Comodo nos enviará un email con un archivo .zip adjunto. Dentro de ese zip vienen tres ficheros:

  • AddTrustExternalCARoot.crt (Root CA Certificate)
  • PositiveSSLCA2.crt (Intermediate CA Certificate)
  • www_midominio_com.crt (Your PositiveSSL Certificate)

Bien, por ahora vamos a ignorarlos, ya que DonDominio nos enviará también un email con estos mismos datos, peeeero más preparaditos. Concretamente nos adjunta dos archivos:

  • certificate.crt: El certificado SSL
  • certificate.ca-crt: Los certificados SSL intermediarios

Pues bien, en realidad el primero de ellos (certificate.crt) es justamente idéntico al www_midominio_com.crt que nos envió Comodo. Y el otro, el certificate.ca-crt es en realidad la concatenación del AddTrustExternalCARoot.crt con el PositiveSSLCA2.crt. Se pueden copiar y pegar tal cual en un archivo, no tiene misterio. El aspecto que tiene es una cosa parecida a esto:

Y con esto ya lo tenemos todo, ahora vamos a montarlos en el servidor:

Lógicamente deberás cambiar el __dirname+"/ssl/certificate.ca-crt"  por la ruta donde hayas metido los archivos. Pero hemos terminado, así de sencillo, todo en menos de 10 minutos.

Etiquetado con: , ,
Publicado en: Programación

Activar y configurar autenticación en MongoDB

Por defecto MongoDB no tiene activada la autenticación. Esto significa que cualquiera puede entrar a MongoDB, incluso remotamente si el firewall no tiene el puerto 27017 bloqueado.

Bien, esto es muy cómodo durante el desarrollo, no hay que preocuparse de usuarios y contraseñas, y podemos usar Robomongo para administrar MongoDB remotamente y de forma visual. Pero a la hora de salir a la luz es cuando menos un suicidio en toda regla. Vamos a activar la autenticación y a configurar un par de usuarios.

Doy por supuesto que MongoDB está instalado, sea manualmente o vía gestor de paquetes tipo apt-get. Si aun no tienes MongoDB instalado, en la web oficial tienen varios tutoriales, como por ejemplo éste para Ubuntu: Instalar MongoDB en Ubuntu

Bien, vamos a empezar por crear un usuario administrador, algo así como el usuario root pero para mongo. Este usuario podrá a su vez crear y modificar otros usuarios, sus permisos, etc. Muy sencillo:

  • Entramos en la consola de MongoDB escribiendo mongo
  • Seleccionamos la base de datos  admin  escribiendo use admin
  • Creamos el usuario. Necesitamos usuario y contraseña, por ejemplo “admin” y “mipassword”, escribiendo:
  • Ok, ahora vamos a editar el archivo de configuración  /etc/mongodb.conf  para activar la autenticación. Basta con descomentar la línea #auth = true
  • Finalmente reiniciamos mongo, en Ubuntu si hemos instalado MongoDB vía apt-get bastará con escribir: service mongodb restart

Bien, ya tenemos nuestro usuario superadministrador, y MongoDB ya solo permite entrar con ese usuario salvo que estemos en local. Por defecto cualquier usuario local puede entrar en MongoDB, así que nuestro cambio solo habrá afectado a los accesos remotos. Si no queremos que mongo autorice ninguna conexión local sin autenticar, deberemos añadir enableLocalhostAuthBypass=0  al archivo de configuración de MongoDB.
Pues vamos a probarlo, entramos como administradores a la consola de MongoDB:

Bien, nos pide la pass y estamos dentro. Esta era la primera parte del tutorial, crear un usuario admin y activar la autenticación. Sin embargo nos queda otra parte. Ahora vamos a crear un usuario con poderes más reducidos, concretamente para que trabaje solo sobre la base de datos “proyecto”, vamos a ello.

  • Entramos a la consola de MongoDB con un usuario con permisos de admin, como acabamos de ver: mongo localhost/admin -u admin -p
  • Seleccionamos la base de datos en la que vayamos a crear un usuario: use proyecto
  • Agregamos un usuario con permisos para leer, escribir y administrar esta DB:
  • Reiniciamos MongoDB, service mongodb restart
  • Ya solo nos falta modificar nuestra aplicación. Si estamos usando Mongoose por ejemplo, cambiaremos el acceso inseguro de antes por el acceso con usuario y contraseña:

 

Bien pues con esto ya hemos terminado. Si queréis saber más sobre los usuarios y los permisos en MongoDB os remito a la documentación oficial:
http://docs.mongodb.org/manual/tutorial/add-user-to-database/
http://docs.mongodb.org/manual/reference/user-privileges/

Etiquetado con:
Publicado en: Programación

Node.js web scraping example

nodejs web scraping

Today DigitalOcean.com will be reaching a million droplets created. The users who spins the millionth droplet and sends a tweet will receive 10.000$ in hosting credit!

But I don’t want to waste time, refreshing the page, nor come back and see the million has been reached. So I made a small script with node.js to email me every 1000 droplets =)

This is the basic scraping part of the script, just for fun haha

Enjoy, and good luck!

Etiquetado con: ,
Publicado en: Programación

UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xc3 in position 2: ordinal not in range(128)

Sí, lo sé, el título es feo, pero es que el error es feo de verdad!

Estaba revisando el panel de control de TopMetin.net, una web que hice en Django cuando de pronto, al ir a revisar los comentarios ZASCA error 500. Insisto, y el mensaje hace otro tanto. Hmmm, qué raro, es como si hubiese algún comentario jodiendo el listado de comentarios… vale, vamos a revisar los errores, allí encontraré al causante:

El error salta en un archivo interno de django. Preocupante, estoy acostumbrado a que los fallos vengan del código que yo escribo… Bueno, no será para tanto, tiene pinta de que alguien ha escrito algo extraño en un comentario pienso para mis adentros. Se me ocurre revisar los comentarios en la página, en vez de en el panel de administrador. Así de paso averiguo en qué servidor se ha escrito el comentario para ir estrechando el rango.
Total, voy servidor por servidor (son pocos, cosa de 1 minuto) y no peta por ningún lado. Hmmm, esto empieza a mosquearme, vuelvo al panel de control, despistado y me da por ir pinchando en todos los modelos:

Users correcto, Comments sigue petando, Payments correcto, Servers correcto, Tags correcto, Uptimes correcto, Votes peta. WTF tú también?

No cunda el pánico, tengo una idea, son momentos de crisis y recurro al arma más potente de todo Ingeniero Informático: buscar el error en Google!!
Salen muchas cosas, bien, StackOverflow copa los primeros resultados, ahahá esto está hecho. O no… que si UTF-8, que si Unicode… si vale, es evidente que se trata de un caracter “extraño” que ASCII no traga, eso ya lo había deducido, pero por qué peta en el admin de django y no en la página??? No consigo dar con el problema, Google me ha fallado. Está bien, vayamos al origen del problema, algún dato en la base de datos es especial, tan especial que nunca había petado hasta ahora, por tanto examinemos la base de datos: entro a la BD y voy directo a la tabla de comentarios. Ordeno los resultados para ver los más recientes primero y doy un vistazo rápido… nada. Consulto en Google a qué caracteres puede corresponder el 0xc3 por afinar la vista y veo que se trata de alguna vocal acentuada o una eñe, qué típico, vuelvo a la búsqueda pero no doy con ello. Curiosamente ningún comentario lleva tildes en las primeras 3 letras (el error dice posición 2, por tanto debe ser la tercera letra…). En la tabla de comentarios no hay nada más que eso, comentarios,fechas y números de usuarios y servers. Decido ver la tabla de votos, ya que también peta al listarlos… pero ahí hay menos, solo fechas, IPs e IDs. Y entonces surge la pregunta del millón: ¿qué tienen en común comentarios y votos? Si petan los dos, no será por cosas distintas, de hecho el error es idéntico. Y la respuesta es inmediata: el usuario. Vale, el usuario vota y comenta, pero si es el usuario ¿por qué no peta al listar usuarios? ¿y por qué en el admin y no en la web?

Aparto la vista de la pantalla y junto todos los datos: un usuario, probablemente su nombre, contiene caracteres acentuados o eñes y se está intentando mostrar como ASCII al listar comentarios y votos en el panel de administrador. Ok, vayamos al código, por ejemplo el del Vote que es más sencillo:

¿No hay muchas Strings ahí verdad? De hecho solo hay una, que es precisamente la String que se usa para representar el voto en el panel de administración. Una String que concatena el nombre del usuario que vota y el nombre del servidor. Sí, ahí está el problema, es una String sin ninguna codificación en concreto, por tanto usa ASCII por defecto. FAIL!!

¿Cómo solucionarlo? Sencillo, tan fácil como añadir una letra, sólo una:

¿Se aprecia la “u” delante de la String? Pues así se le dice a Python que la String es Unicode. Basta poner eso ahí y en la clase Comments (y ya de paso en todas partes jeje) para solucionar el dichoso problema. Reiniciamos apache y a correr.

Etiquetado con: , , , , ,
Publicado en: Programación

Ventana bordes redondeados en Java

Ventana bordes redondeadosVamos a crear una ventana que podamos decorar a nuestro gusto. Ideal para pequeños diálogos o como splash screen de nuestro programa. Hasta no hace mucho si se quería hacer algo así en Java había que hacer una captura de pantalla y usar eso como fondo, dando la sensación de que “se ve lo que hay detrás de la ventana” y por tanto imitando una ventana transparente.
Pero claro, cuando el fondo cambia, o es un vídeo, la técnica de la captura de pantalla peta. O hay que hacer capturas cada poco tiempo, ocultando nuestra ventana y volviendo a mostrarla. Esto es una ñapa.

Así que os traigo una solución más avanzada, y más sencilla, que he encontrado aquí. He cambiado un poco la idea, ya que lo que yo quería era hacer una ventana de bordes redondeados.

La clave está en crear un panel con su propio método paint() y meterlo en una ventana transparente:

Y para hacer la ventana transparente:

 


Os dejo el código completo:

Y el proyecto de Eclipse, con las imágenes: Tuto VentanaRedondeada

Nota: Si en Eclipse os sale un error diciendo:

Id a las Propiedades del proyecto, Java Build Path, pestaña Libraries y borrad la JRE System Library (remove). A continuación volvemos a añadirla, pulsando en Add Library y seleccionando JRE System Library. Arreglado.

Etiquetado con:
Publicado en: Programación

Minitutorial Node.js y MongoDB

No voy a explicar cómo usar MongoDB con Node.js, esto solo es un pequeño tutorial previo a programar nada:
instalar MongoDB, iniciarlo, dejarlo corriendo, instalar Node y npm, crear una app Express y ponerlo a funcionar.

1. Instalar MongoDB manualmente:

(si prefieres el modo automático: Install MongoDB y salta al paso 5 de este tuto)

  • Descargar (muy recomendable que sea de 64bits): http://www.mongodb.org/downloads
  • Descomprimir:
    > tar xvzf mongodb-linux-x86_64-2.4.6.tgz
  •  Entrar en la carpeta ‘bin‘ del paquete descomprimido y crear un archivo ‘mongodb.config‘ con el siguiente contenido:
    dbpath=/home/[usuario]/mongodb/data
  • Si no existe dicha ruta, crearla.

2. Ejecutar MongoDB manualmente:

  •  Desde la carpeta ‘bin’ de MongoDB ejecutar:
    > ./mongod --config mongodb.config

3. Si en vez de manualmente se quiere dejar MongoDB corriendo como un servicio:

4. Entrar a la consola de MongoDB:

  • Desde la carpeta ‘bin‘ de MongoDB ejecutar:
    > ./mongo
  • Se nos mostrará la consola, podemos probar a ejecutar:
    > db.version()

5. Crear una app con Express:

  • - Instalamos Node.js si no lo tenemos ya:
  • Instalamos npm (gestor de módulos de Node.js):
    > sudo apt-get install npm
  • Creamos la carpeta para nuestra app:
    > mkdir miapp
  • Creamos el archivo package.json de nuestra app:
    > cd miapp
    > nano package.json 
  • Al haber puesto las dependencias, al ejecutar el siguiente comando (dentro de /home/[user]/miapp/) se instalarán:
    > npm install
  • Finalmente solo tenemos que crear la app como tal:
    > nano app.js 
  • Y para arrancar nuestra app:
    > node app.js
  • Para dejarla corriendo usar forever (npm install forever -g && forever start /home/[user]/miapp/app.js)

 

Links interesantes:
Node.js y MongoDB: http://fernetjs.com/2012/08/buenos-amigos-nodejs-mongodb/
API REST con Node.js, Express, Mongoose y MongoDB: http://pixelhandler.com/blog/2012/02/09/develop-a-restful-api-using-node-js-with-express-and-mongoose/

Etiquetado con: , , ,
Publicado en: Programación

Arduino: configurar un módulo bluetooth

HC-07 Bluetooth Module for Arduino

HC-07 Bluetooth Module for Arduino

De entre todos los módulos que hay para Arduino, el bluetooth es en mi opinión el más interesante. Es muy barato, muy sencillo (no tiene más que 2 pines quitando alimentación y tierra), funciona como un puerto serie, es compatible con cualquier cacharro moderno como móviles y portátiles… y puede dar mucho juego.

Yo compré uno por 7$ en Aliexpress, el modelo HC-07 (no todos son iguales, los comandos AT pueden variar). Ahora están más baratos:
HC-07 bluetooth

Pero eso ya es cosa vuestra, yo os voy a dejar un pequeño programa para cargar en Arduino y que os permita configurar el módulo bluetooth. Sí, hay que configurar cosas como el nombre, el pin o la velocidad. No es complicado, basta con conectar los pines TX y RX del módulo bluetooth a un par de pines de Arduino, por ejemplo el 10 y el 11. Le diremos a nuestro Arduino que use esos dos pines como si fuesen un puerto serie y enlazaremos la entrada y salida con el puerto serie de nuestro Arduino. De esta forma, cuando escribas en el monitor serie, Arduino enviará eso al módulo bluetooth, y cuando el módulo responda, Arduino nos enchufará su respuesta en el monitor serie:

Cargad el programa, abrid el monitor serie y escribid los comandos que queráis, por ejemplo para cambiar el nombre del dispositivo:
AT+NAMEsalvatore

Recordad que si cambiáis la velocidad del módulo, la próxima vez que queráis configurarlo deberéis editar esta línea en el setup:

Eso es todo, espero que os sirva. Cualquier duda, respondo en los comentarios.

Etiquetado con:
Publicado en: Programación

Arduino: dos ejemplos para displays de segmentos

Recientemente he tenido que aprender a usar pantallitas de 4 dígitos con 7 segmentos en Arduino. Es decir, algo como ésto:

4 digit, 7 segment display

4 digit, 7 segment display

Como pasa con todo la primera vez siempre cuesta. Y más si hay distintos tipos de displays y por tanto varias formas de hacer las cosas según el modelo que te haya caído a ti (los chinos no son muy dados a mandar manuales de uso para estas cosas). Y no son sutilezas, más bien hay dos formas, totalmente opuestas, así que os voy a dejar un par de ejemplos.
Antes de verlos decir que en cualquier caso es necesario entender que la pantalla hay que pintarla una y otra vez. Es decir, no basta con pintar y dejarlo encendido, porque eso es imposible. Básicamente porque en realidad “pintar la pantalla” no es una tarea, son cuatro: pintar el primer dígito, luego el segundo, luego el tercero y finalmente el cuarto.
Y cuando digo “luego” quiero decir unos milisegundos más tarde. No se pueden hacer las cuatro tareas a la vez, sólo se puede pintar de dígito en dígito. Seguramente esto se entienda viendo un esquema de pines:

Esquema de pines

Como podéis ver hay 4 pines, uno para cada dígito. Esos son los pines que usaremos para seleccionar el dígito que queramos pintar. ¿Se entiende ahora lo de que son 4 tareas que no se pueden hacer a la vez?
Pues visto esto, vamos a los casos concretos:

Primer ejemplo:

Para el display de la primera imagen, que es de tipo cátodo común y tiene 12 pines (por cierto, ojo que un trasto de estos te deja casi sin pines en arduino!), comprado en Dealextreme por 2$:

Ahora que más o menos tenemos la idea, vamos a ver código de verdad:

Segundo ejemplo:

Este otro display es casi igual, solo que tiene dos puntos en medio y por tanto un pin más, pero lo importante es que el funcionamiento es opuesto al que acabamos de ver:

¿Diferente verdad? Veamos código de verdad:

Eso es todo, espero que os sirva, a mi me llevó varias horas dar con la fórmula para cada uno de los displays :P

Etiquetado con:
Publicado en: Programación

Empiece la fiesta

Al final he decidido hacerme un blog.

Nada de páginas propias y experimentos, un simple blog. Es menos divertido y no hay que programar, pero me permite añadir cosas rápidamente: pegar un cacho de código, un tutorial o cualquier cosa y olvidarme.

Así que WordPress al canto y ahora ¡a escribir!

Publicado en: Uncategorized