; Vince y el mundo del software: 2014

viernes, 25 de julio de 2014

Frases diarias y un pequeño truco

Hola! Esta vez les traigo una forma de tener frases diarias, en dos formatos: Notificación al inicio, y al iniciar sesión (abrir una terminal, etc).
Para poner frases diarias al inicio de sesión, tienen que ir al siguiente post (no lo hice yo, sólo lo indexo):
http://blog.desdelinux.net/como-mostrar-una-frase-interesante-cada-vez-que-inicias-gnome/
Y para frases en el inicio de sesión, en la terminal, es el siguiente truco:
Abrir (o crear si no está) el archivo ".bashrc" en su carpeta personal. En mi caso es "/home/vincegeratorix/.bashrc". Recordar activar ver los archivos ocultos en su visor de archivos; generalmente en la pestaña "ver".
Una vez en su .bashrc basta poner el siguiente comando:
 shuf -n 1 "<archivo_texto>"
En mi caso es:
shuf -n 1 '/home/vincegeratorix/quote/quote.txt'
Recordar poner comillas si es que tiene espacios. Lo mejor es ponerle comillas siempre, para evitarse malos ratos.
El archivo "quote.txt" tiene que tener una frase por línea. El original que viene en el script de más arriba traía unas pocas frases en inglés, así que me dediqué a ponerle frases en español. Las primeras 101 frases las saqué de acá, y son relacionadas a informática. Las que siguen son relacionadas a ciencia, y vienen de acá, acá, y acá.
El archivo de texto con las frases acá: http://pastebin.com/6mqVHCCa
Hay algunas repetidas, pero como saca al azar no importa.

Bonus

Y ahora un Bonus
Resulta que a veces me he visto en la situación de hacer un comando, pero a veces éste falla, y quiero saber cuando falla para rehacerlo o saber el momento exacto cuando falló (ya que usualmente cuando falla un comando, y uno está e̶n̶ ̶f̶a̶c̶e̶b̶o̶o̶k̶ haciendo tareas, no sabe cuándo falló, ni cuánto tardó en hacerse el comando. Para evitar esto, y mostrar un mensaje en pantalla que diga el momento exacto en parar, y cuánto tardó, simplemente al momento de hacer el comando, ejecutar lo siguiente:
{ time <comando>; } 2> out.txt && date >> out.txt && cat out.txt |zenity --text-info
donde <comando> es el comando a ejecutar. Por ejemplo si quisieran ejecutar "echo hola", lanzan:
{ time echo hola; } 2> out.txt && date >> out.txt && cat out.txt |zenity --text-info
Eso sí tengan en cuenta que crea un archivo "out.txt" en la carpeta, el cual podrían eliminar agregando: "&& rm out.txt" al final, para que lo borre. No lo puse, pero es una buena práctica para no llenar de "out.txt" por todos lados xD.
sería todo por hoy, espero le haya servido.

sábado, 3 de mayo de 2014

Nueva sección: Material de aprendizaje

Hola! Les traigo buenas nuevas! Acabo de crear una "página" en el blog dedicada a compartir material de aprenizaje gratuito, principalmente moocs o cursos de universidades. El enfoque es publicar páginas con material de buen nivel, más que llenar de videotutoriales (sin desmerecerlos, que yo aprendí a programar gracias a videotutoriales de personas entusiastas).
Pueden ir a través del links a la derecha, en la sección de "Páginas", o directamente clickando en este link.
Saludos!

domingo, 13 de abril de 2014

Saber cuando se desconectó la energía en el notebook

Hola nuevamente! Les traigo un nuevo script.
Resulta que yo uso notebook, y lo tengo con la batería puesta. Resulta que ultimamente se ha cortado la luz varias veces, y yo no me he dado cuenta ya que como uso la batería puesta, no hay nada que me avise cuando se encuentra "off-line" u "on-line". Para ello he diseñado un pequeño script, que manda un mensaje en caso que se haya desconectado el cable (o se cortó la luz).
Como dependencias sólo necesita 'acpitool' y 'zenity'.
Copien el script a un archivo con extensión sh, ojalá sin espacios, luego denle permisos de ejecución (chmod 777 archivo.sh), y pónganlo que se ejecute en el inicio; para ello yo usé el menú de "aplicaciones al inicio" de gnome, pero pueden ponerlo en el .bashrc de su home, o en inittab, o de cualquier forma que se ejecute al inicio.
Dejo el sccript, y en pastebin también:
Obviamente el script es para linux.

#!/bin/bash
bandera=true
while [ true ]; do
 
 salida=$(acpitool |grep off-line)
 if [  -n "$salida" ]  &&   $bandera  ;
 then
  bandera=false
  #echo "está off line"
  zenity --info --text="La batería está off line"
  
 elif [ ! -n "$salida" ];
 then
 
  bandera=true
  #echo "está on line"
 fi
 sleep 30s
done

jueves, 10 de abril de 2014

Breve y sencilla explicación del bug de OpenSSL "HeartBleed"

El bug recientemente parchado de openssl, llamado "heartbleed", ha estado muy en boca de todo el mundo recientemente. Bueno, al menos del mundo informático, e incluso ha ido más allá.
OpenSSL es la implementación de protoclos de seguridad SSL/TLS más famosa y usada. Los mencionados protocolos son los que se usan para encriptar información en internet. Y se usan en, por ejemplo, https (el candadito en la url), ftps, ssh, etc.
La idea de usar esta encriptación, es por ejemplo en https (lo más usado por los usuarios entre los mencionados anteriormente), que nadie pueda leer la información entre tú y la página web. De esta manera puedes pasar una contraseña a la página web y estar seguro que nadie podrá leerla y saber cuál es haciendo un análisis de tráfico web (o sea por ejemplo alguien espiando tu internet, como puede incluso ser gente de los proveedores de internet o la policía que analice tu tráfico).
Para compartir tráfico encriptado entre usuario y servidor, hay que iniciar una sesión TLS entre ambos, tras lo cual se comparten de manera segura la clave que usarán para cifrar y descifrar los mensajes. Ahora, el problema en SSLv2 y anteriores, es que si pasaba cierto tiempo desde que se inició la sesión tls y no habían paquetes entre las partes, la sesión TLS se cerraba, teniendo que inicarla nuevamente, creando las claves y todo eso, lo cual era tiempo y gasto computacional. Eso se mejoró con la versión 3 de SSL, que implementa un sistema llamado "heartbeat" (latido del corazón, como para avisar que aún sigues vivo), con el cual podías mantener abierta una sesión TLS más tiempo.
Para ello, el cliente manda un mensaje de tipo "TLS1_HB_REQUEST", con dos campos: El payload (el mensaje), y el tamaño del payload. Luego el servidor le manda otro mensaje de vuelta llamado "TLS1_HB_RESPONSE" que copia el payload y lo manda de vuelta, para 'configurar' la respuesta. Los campos del mensaje response del servidor incluyen el mismo payload y el mismo largo.
El truco viene en que OpenSSL no comprueba que el payload tenga el mismo largo que el que se mandó en el campo "largo". Esto hace que OpenSSL "crea ciégamente" que el payload tiene ese largo (sin comprobarlo), y envía de vuelta lo que debiera ser el payload. Pero el truco consiste en mandar un payload de 1 byte, y un campo "largo" diciendo que nuestro payload mide 64KB, es decir varios miles de veces más. Lo que hará OpenSSL será empezar copiando desde el payload, hasta 64KB más adelante de lo que haya en la memoria ram (el payload reside en la ram, entonces copia desde el comienzo del payload hasta 64kilo bytes más adelante, haya lo que haya), copiando así trozos de memoria ram pertenecientes a OpenSSL que no eran parte del payload, sino de trozos de código y datos del mismo OpenSSL.
El problema es que OpenSSL contiene contraseñas, las claves de cifrado, y muchas otras cosas sensibles; de manera que mandando continuamente mensajes truqueados, obtendremos cada vez 64kb de memoria de trozos aleatorios del programa, pudiendo obtener potencialmente gigas y gigas de trozos, que incluyen contraseñas, claves, etc.
Dejo un mono explicativo:


Este fallo se reportó varios años antes, pero no ha sido sino hasta el reciente 7 de abril 2014 que se ha publicado el parche para que no siga ocurriendo. Hasta que las páginas no actualicen su versión de OpenSSL seguirá ocurriendo el problema, y los servidores serán potenciales víctimas de ataques. Eso sí, esto sólo roba las contraseñas que están en la memoria RAM, es decir sólo los ingresos recientes, o activos, así que la recomendación sería no ingresar hasta que sea reportado el que actualizaron el software y repararon el problema.

Fuentes:
Blog de Chema alonso, un experto en seguridad http://www.elladodelmal.com/2014/04/heartbleed-y-el-caos-de-seguridad-en.html
Video explicativo en inglés del fallo, con monitos http://parkerati.com/my-quick-video-post/

domingo, 2 de marzo de 2014

Transformar todos los txt a html de una carpeta y escaparlos

¡Hola! Acá nuevamente con un script. Tal vez les latee tanto script, pero así es la vida de un informático, al menos la mía, que cuando quiero hacer algo busco como hacerlo, y si no lo encuentro... ¡Pues hago un script que lo haga! XD
Esta vez quería escapar muchos txt, para así transformarlos a html; para ello necesito transformar los carácteres prohibidos en html a su forma escapada, y luego los saltos de línea transformarlos a "<br />". Bueno, no quité los saltos de línea, simplemente le agregué el tag. Y puse un mensaje de advertencia para prevenir ejecutarlo sin querer, ya que los efectos pueden ser nefastos.
Además, no quería escapar los &, ya que habían algunos txt ya medio escapados, pero si no es su caso borran la línea marcada y ya está.

Para ejecutarlo, simplemente van a la carpeta donde están todos los txt y ejecutan el script, luego de la pregunta, transformará todos los txt a html y les cambiará la extensión.

Acá el script y también en Pastebin. Compártelo y cópialo tanto como quieras.
 
#!/usr/bin/python
# -*- coding: utf-8 -*-
#Por Erick Francisco Merino Menares @vincegeratorix
import os
import re
import sys
import cgi
import codecs
print "esto cambiara los saltos de linea por br, sólo si está seguro proceda"
entrada = raw_input("si/no: ")
if entrada != "si":
 print "decidió salir"
 sys.exit(0)
txts = ([f for f in os.listdir(os.getcwd()) if re.match(".+(\\.(?i)([tT][xX][tT]))$", f)])
for i in xrange(len(txts)):
 f=codecs.open(txts[i], encoding='utf-8', mode="r")
 string = f.read()
 f.close() 
 reemplazado = cgi.escape(unicode(string)).encode('ascii', 'xmlcharrefreplace')
 reemplazado = unicode(reemplazado.replace("\n", "aqui va el tag br, que el maldito script no me lo escapa, vean el link de pastebin\n<br />"))
#Esta línea de abajo lo pueden quitar, es para "antiescapar" los ampersand
 reemplazado = unicode(reemplazado.replace("&amp;", "&")) 
 archivo=codecs.open(txts[i], encoding='utf-8', mode="w")
 archivo.write(reemplazado)
 archivo.close()
 nombre = str(txts[i])
 nombreHtml = nombre.replace(".txt", ".html")
 os.system("mv " + nombre + " " + nombreHtml)
print "terminó con exito"

martes, 28 de enero de 2014

Descargar el padrón electoral y ponerle los nombres a los pdf

Nota: Cambiaron la página del padron electoral, ahora está en: http://presidenciales.servel.cl/Padron/padronDefinitivo.html sin embargo no es tan fácil descargarlo (con wget no funcionaría), ya que los links ya no están en duro, sino con javascript, lo que hace que se necesite un script para rescatar los archivos. Yo personalmente NO lo haré, pero si alguien se anima a hacer las expresiones regulares o con algúna forma rescata los archivos *facilmente* (es decir sin descargar uno por uno), que lo comparta y me avise, sería muy bueno.


Hola! En este nuevo artículo vengo recargado de más scripts y tutoriales.
Resulta que en Chile, el Servicio Electoral tiene a disposición pública el padrón electoral. Sin embargo descargarlos de a uno e irle poniendo los nombres es toda una odisea, que tardaría varias horas de aburrimiento. Para evitar eso, me puse a hacer un script que lo haga automático.

La primera parte consiste en descargar los pdf, para esto no se necesita mucho script, simplemente basta con una instrucción en la consola para los que tenemos Linux. La instrucción es:
wget -r -l1 http://oficial.servel.cl/PadronComunal/Arica/alfabetico_comunal.html

Desglosándola, vemos lo siguiente:
wget: El comando para descargala
-r: Para descargar todos los links dentro de la página
l1: pero sólo los links de esta página, en caso de haber páginas que contengan más links, éstos últimos no serán descargados, dado que el nivel de recursión es 1. En este caso particular pareciera no servir, pero siempre hay que ser precavido.

Luego de descargar los pdf, tenemos que acceder a ellos. Par ello primero vamos a la siguiente dirección:
~/servel/oficial.servel.cl/PadronComunal/Arica
Ahí está un archivo html y una carpeta con los pdf. Como vemos, los pdf tienen nombres crípticos, que no nos sirven. Para no darme la lata de estar cambiándole los nombres uno por uno, creé un mix de script en bash y python para realizarlo, que dejo en este link (Pueden hacerle copia de respaldo).

Para ejecutar bien el script, tienen que dejar los dos archivos dentro de la carpeta anteriormente mencionada, junto al archivo html.
Ejecutan el script.sh en una terminal. Luego les pedirá la carpeta de los pdf, para ello simplemente arrastra la carpeta que contiene los pdf a la terminal, la cual debiera ser:
~/servel/oficial.servel.cl/PadronComunal/Arica/archivos comuna auditado

¡Y listo! Ya tienen el padrón electoral chileno con nombres claros en los pdf.