; Vince y el mundo del software: script
Mostrando entradas con la etiqueta script. Mostrar todas las entradas
Mostrando entradas con la etiqueta script. Mostrar todas las entradas

viernes, 9 de enero de 2015

Configurar SBCL Lisp en Emacs con SLIME y luego compilar el buffer de salida

Hola! Ufff! cuánto tiempo, pero estaba metido en otras yerbas así que no he tenido tiempo (también abandoné el blog de descargas, espero poder actualizar algo allí también).

Bueno, a lo mío:
Me propuse como meta aprender lisp ahora en vacaciones, al menos lisp. Buscando, encontré que hay más de un compilador/intérprete, pero me decanté por SBCL ¿Por qué? Pues: 1.- CLISP no se actualiza hace años (2010), y tiene muchos errores que ya parece abandonado, además tuve una mala experiencia. 2.- SBCL es sucesor de CMUCL, así que sería bobo instalar el segundo. 3.- SBCL es más rápido.
Quizás me pase a otro después, pero por ahora estoy en ese.
 Aún estoy recién aprendiendo lo básico, y sé bastante poco.

Como estoy aprendiendo, uso bastante la consola interactiva, sin embargo la de sbcl tiene un problema: No se puede retroceder (teclas de movimiento), sólo escribir y borrar. Lo cual es bastante molesto.
Buscando una solución me encontré con slime, sin embargo muchos tutoriales para instalarlo en emacs simplemente no me funcionaron, eso hasta que encontré este. Lo robaré para explicar en español lo mismo, ya que me funcionó y así lo encuentran más fácil en google xD
El link original está en:

http://stackoverflow.com/questions/12607716/setting-the-slime-in-emacs

Como yo uso Linux mint, que es sucesor de Ubutu, que es sucesor de Debian, para instalarlo se usa en una consola (o en el centro de software que odio):

$ sudo apt-get install sbcl

Si usan Fedora o RedHat, en vez de "apt-get" usan "yum", si usan otra distro supongo que sabrán instalar paquetes, o buscan en google.

Luego instalan el emacs, yo uso el emacs24, simplemente porque el xemacs hace dolor en los ojos y el emacs23 suena más antiguo (no lo he probado). para instalarlo usan:

$ sudo apt-get install emacs24

Luego de eso instalan el quicklisp, que es con el cual instalarán slime (copio).

$ sudo apt-get install wget 
$ cd ~/Downloads
$ wget http://beta.quicklisp.org/quicklisp.lisp 
$ sbcl --load ./quicklisp.lisp

Tip para novatos: Recordar que el signo de peso significa que se pone en la terminal, como usuario normal. El asterisco de abajo significa que ya están en la consola interactiva de sbcl.

* (quicklisp-quickstart:install) 
* (ql:add-to-init-file)
* (ql:quickload "quicklisp-slime-helper") 
* (quit)

Luego de eso en su carpeta personal (/home/<usuario>) crean el archivo ".emacs". Recuerden activar ver los archivos ocultos en su navegador de archivos. Si tienen dudas pueden hacerlo desde línea de comandos con el comando:

$ nano ~/.emacs

para usar nano, que es un editor en consola fácil de usar y tiene ayudita abajo (recordar que el ^ es Ctrl, es decir que si dice "^x" apretan Ctrl+x).
Si le tienen miedito a la consola pueden usar gedit (si lo tienen instalado), para ello:

$ gedit ~/.emacs

Luego en el archivo copian y pegan lo siguiente:

(setq inferior-lisp-program "sbcl --noinform")
(load (expand-file-name "~/quicklisp/slime-helper.el"))

En el link aparecen las líneas al revés, pero el orden aparentemente no importa.
El "--noinform" es para que no les salga el mensaje de bienvenida de sbcl.

Luego de todo eso abran el emacs, y apreten M x, escriben "slime" y apretan intro.
Ahora quedarán pasmados con lo anterior, porque apretarán "M x" y no les saldrá nada xD Pues me costó encontrar, y quizás ustedes sabían, pero el "M" es de "Meta" así que apretan Alt+x, escriben abajito "slime" (sin comillas), y apretan intro. (si leen en algún manual que apreten C x es Ctrl+x)
Les saldrá la consola interactiva, pero abajo (si usan el emacs24 como yo), así que apretan el click derecho en la barra de abajito de la subventana, donde dice:

U:%%- *GNU Emacs* Top L5 (Fundamental)

Quizás les salga algo distinto, pero similar. con el click izquierdo la borran.
Luego para cambiar de tipo de subventana clickan el izquierdo en el nombre para avanzar y el derecho para retroceder. El nombre es lo que está en negritas entre los asteriscos (en el caso de slime, será algo como *slime-repl sbcl*).

Ahora viene lo otro... tienen la consola interactiva y todo, pero qué pasa si quieren guardar el código y luego compilarlo... pues será una auténtica odisea.
Lo primero que tienen que hacer es guardar el buffer, así que van al menú "File" y luego a "Save as" (para guardar el buffer), y seleccionan ruta y nombre.

El problema es que el buffer no es compilable. Para arreglar eso, hice un pequeño script en python que hace la magia de volver el buffer compilable (comenta los resultados, borra el prompt "CL-USER>", y elimina las líneas con error de compilación (deja los warnings)). Ese script lo subí a github, y lo pueden encontrás acá:

https://github.com/vincegeratorix/slime-cleaner

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.

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

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.

miércoles, 25 de diciembre de 2013

Descargar cursos de coursera y dejarlos como a mi me gusta

Tras encontrar el script para descargar cursos de edx, encontré otro para cursos de coursera. Dejo acá el link a la página, recuerden instalarlo con pip, que es más fácil; ahí mismo sale la info.
Para usarlo basta con leer la información; pero para no dejar tan pelado este post, les doy una ayuda en español:
Para descargar un curso:
$ coursera-dl -u <correo electrónico> -p <password> -n "txt" <dirección curso>
el -n "txt" es para ignorar los txt, es opcional, pero yo lo uso porque no quiero que me descargue los txt.
La dirección del curso es la última parte de la url. La url de un curso es de la forma:
https://class.coursera.org/<dirección curso>
por ejemplo:
https://class.coursera.org/insidetheinternet-003
entonces la "dirección curso" es: insidetheinternet-003
Más información y para ayuda:
$ coursera-dl -h

Todo bien ahí. Pero el problema es que descarga cada video en una carpeta separada, junto a los subtitulos, ppt, pdf, etc. Pero personalmente me gusta tener todos los videos de una semana juntos, junto a su subtitulo correspondiente.
Para lograr eso, creé un script en bash, que mueve los .mp4 y .srt a la carpeta anterior.
Para ilustrarlos, al usar el script "coursera-dl" queda de la siguiente forma:

dirección curso
├── Semana 1
│   ├── Video 1 Semana 1
│   │   ├── Diapos Video1 Semana 1.pdf
│   │   ├── Diapos Video1 Semana 1.ppt
│   │   ├── Video1 Semana1.mp4
│   │   └── Video1 Semana1.srt
│   ├── Video 2 Semana 1
│   │   ├── Diapos Video2 Semana 1.pdf
│   │   ├── Diapos Video2 Semana 1.ppt
│   │   ├── Video2 Semana1.mp4
│   │   └── Video2 Semana1.srt
├── Semana 2
│   ├── Video 1 Semana 2
│   │   ├── Diapos Video1 Semana 2.pdf
│   │   ├── Diapos Video1 Semana 2.ppt
│   │   ├── Video1 Semana2.mp4
│   │   └── Video1 Semana2.srt
 etc...

 Luego de usar mi script, queda así:

dirección curso
├── Semana 1
│   ├── Video 1 Semana 1
│   │   ├── Diapos Video1 Semana 1.pdf
│   │   └── Diapos Video1 Semana 1.ppt
│   ├── Video 2 Semana 1
│   │   ├── Diapos Video2 Semana 1.pdf
│   │   └── Diapos Video2 Semana 1.ppt
│   ├── Video1 Semana1.mp4
│   ├── Video1 Semana1.srt
│   ├── Video2 Semana1.mp4
│   └── Video2 Semana1.srt
├── Semana 2
│   ├── Video 1 Semana 2
│   │   ├── Diapos Video1 Semana 2.pdf
│   │   └── Diapos Video1 Semana 2.ppt
│   ├── Video1 Semana2.mp4
│   └── Video1 Semana2.srt
 etc...

El script es bastante sencillo, y se los dejo En este link. Además, lo dejo acá para que lo vean. Pueden modificarlo para sus propósitos personales:

#!/bin/bash
IFS=$'\x0A'$'\x0D'
salida=$(ls -F | grep /)
for carpetai in $salida
do
 cd $carpetai
 find -regextype posix-egrep -regex ".*(mp4|srt)$" |xargs -I{lecciones} mv "{lecciones}" .
 cd ..
done

sábado, 21 de diciembre de 2013

Descargar videos de edx y más

Alerta: El script de edx-downloader ha sido actualizado y no es compatible con la versión mostrada acá, por lo que la versión de acá no funciona ahora. Este post tiene sólo fines históricos. No me he dado el tiempo de modificar el script nuevo, y nada presagia que lo haga, al menos en el futuro cercano.

Hola, dejé botado este blog un tiempo, y es que no había mucho que contar. Pero acá estoy de vuelta.
El tema de ahora es simple: Resulta que soy un ávido seguidor de los moocs (Cuando me queda tiempo libre), dígase coursera, udacity, edx, y en español, miríadax.
En Coursera se puede descargar el material fácilmente, lo cual me sirve para verlo en mi tablet mientras viajo, o cuando no tengo internet o lo estoy usando para otra cosa. Sin embargo, el resto de páginas no tiene una forma fácil de descargar el material, al menos no a simple vista. Eso hasta que me encontré con el edx-dl.py, un script en python para descargar vídeos con sus subtitulos respectivos, de los cursos que uno está inscrito, y las semanas que uno escoga (Poniéndole números consecutivos de dos dígitos). Dejo el script en Este Link, y como respaldo, Acá también en pastebin; aunque recomiendo usar el link original para darle más descargas al autor. Para descargarlo de la web del autor deben hacer un clone al git del autor, para ello, pon en la consola (en linux):
git clone https://github.com/shk3/edx-downloader.git
Debes tener instalado git.
El script es muy bueno, pero le encontré cosas que no me gustaron:
Cuando uno está descargando, y de repente falla, se apaga el pc, se corta la conexión, etc, hay que empezar de nuevo el script, poniendo el usuario, contraseña, y esperar que cargue toda la información (si son muchas lecciones puede tardar varios minutos). Claro que los vídeos y subtítulos descargados no los descarga nuevamente, pero sí que los revisa uno por uno (al igual que mi script).
¿Mi solución? Pues estuve metiéndole mano al script y logré lo siguiente:
-Un script para descargar los subtítulos solamente, ya sea de youtube como de edx, con los números consecutivos de 3 dígitos. Además muestra en consola todos los links de youtube.
-Otro script que toma un archivo con los links de youtube y los descarga con las opciones que uno le especifique, y con los correspondientes números consecutivos de 3 dígitos.
Dejo En Este Link el script para los subtitulos con los números consecutivos.
Y En Este Otro Link el otro script para descargar de youtube los videos con los números consecutivos.
Para ejecutar cualquiera, deben tipear en la consola:
python "nombre del script"
En "nombre del script" basta arrastrar el script si es que usan un emulador de consola que permita el drag and drop.
Espero les sirva, saludos!

sábado, 11 de mayo de 2013

Transformar mp4 a mp3 en masa en Linux

Buenas. Me he encontrado con un pequeño problema. Y es que tenía que convertir unos archivos de video MP4 a formato MP3 (extraer el audio y convertirlo a mp3 básicamente).
Lo primero que pensé fue usar ffmpeg, pero me encontré que estaba "deprecated" (descontinuado), así que busqué en google.
Me encontré con este post, pero sólo resolvía el problema de convertir 1 solo archivo; y yo necesitaba convertir una carpeta llena de muchos archivos mp4 a mp3.
Luego me encontré con este otro post, el cual convierte los mp4 a mp3, pero usa ffmpeg, el cual ya no sirve.
Así que lo que hice fue "combinar" ambos scripts en uno solo. El cual les dejo en este link de pastebin.
Para ejecutarlo, lo guardan en un archivo de texto, le ponen extensión .sh y lo ejecutan en la carpeta que contiene los archivos .mp4.
El algoritmo NO es recursivo (no entra a las subcarpetas).
Eso, y ojalá les sirva.
Si tiene un problema, miren los comentarios en los posts originales, ahí se dedican a solucionar posibles problemas.
este script deja los mp3 en la misma carpeta, para moverlos fácilmente ejecuten:
$ mv *.mp3 /carpeta/destino
Saludos.