lunes, 8 de septiembre de 2014

Vim: ejecutar comandos el crear cierto tipo de archivos

La idea es esta: cada vez que vaya a crear un archivo .{cpp|h} quiero ejectuar algun comando/script desde vim. En este caso el comando es copiar un template de ycm (ycm_extra_conf.py) para programar en C++, y este archivo se deberá copiar en cada directorio que vaya a crear un nuevo codigo C++.

El procedimiento es sencillo una vez encontramos la manera, y simplemente debemos agregar esta linea a nuestro $HOME/.vimrc :
autocmd FileType cpp silent! !cp $HOME/devel/program/c/ycm/.ycm_extra_conf.py $(pwd) && notify-send "a copy of ycm was moved for C++ code to $(pwd)/"

Lo cual funciona como esperado, pero... cada vez que editemos/creemos un nuevo cpp en el mismo directorio, esa funcion *siempre* se ejecutará, lo cual copiará el mismo archivo y mostrará el mismo mensaje de forma repetitiva, cosa que se torna un bastante incomodo despues de cierto tiempo. Entonces lo mas conveniente es hacer una funcion que verifique si el archivo ycm ya existe en el directorio actual y si existe pues salimos, si no existe, lo copiamos.

La funcion en cuestión quedará de esta manera:
function! Ycm_check()
let file_path= getcwd()."/"
if filereadable(file_path.".ycm_extra_conf.py")
return
else
!cp $HOME/devel/program/c/ycm/.ycm_extra_conf.py $(pwd) && notify-send "a copy of ycm was moved for C++ code to $(pwd)/"
endif
endfunction

autocmd FileType cpp silent! call Ycm_check()

Un screenshot:

miércoles, 2 de julio de 2014

Error: activated service 'org.freedesktop.systemd1' failed

Nos enfrentamos a un error que causa que el sistema no roconozca ciertos ACPI events, lo cual nos deja sin suspension, botones fin funcionar (boton de encendido, ej) y una serie de errores en nuestro syslog.

Resulta que este problem es producto de una actualizacion de systemd que rompe la captura y transmision de eventos entre ACPI y D-Bus porquee systemd no inicia con los permisos necesarios para poder "comunicar" estos eventos. Como podemos ver en bugs #731649 y #729576 (el segundo dando una explicacion mucho mas detallada entre desarrolladores como Ian Jackson, fundador de Debian) se entiende quee la solucion es instalar un paquete sacado de ese mismo hilo como "workaround": systemd-shim.

Despues de eso los servicios son reiniciados automaticamente y magicamente todo vuelve a la normalidad. Vemos en el source de ese paquete que entre otras cosas hace registrar systemd en D-Bus de forma adecuadad para que dicho error no sea generado y tanto systemd, d-bus y acpi vivan felices.

Definitivamente tener Debian Testing algunas veces nos saca de la rutina ^_^

martes, 11 de febrero de 2014

Busybox >= 1.21.0-2exp | <= 1.21.0-5exp rompe todos los kernels >= 3.11 en Debian Jessie (testing)

Y principalmente lo que rompe es el arranque, resultando en un kernel panic. Este problema lo tuve por mas de un mes y no tenia tiempo de buscarle solucion hasta hace unos dias.

Lo que sucede es que despues de actualizar busybox a las versiones mencionadas empieza a ocurrir el problema y manualmente debes seleccionar un kernel inferior para arrancar el sistema. La solucion es facil: revertir la actualizacion de busybox:
$ sudo apt-get install busybox=1:1.21.0-1

Despues de eso es necesario reinstalar la ultima version del kernel para que actualice el initramfs y todos sean felices.

Ese bug esta arreglado en la version experimental de busybox. Aqu el changelog:
busybox (1:1.21.0-6exp) experimental; urgency=low
...
...
* fix busybox initramfs hook to actually _run_ (make it executable)
and actually strip leading /usr from applet paths. Stupid.
(Closes: #732256)

miércoles, 5 de febrero de 2014

TODO.TXT: Gestionar tareas en bash

Si sos de los nuestros, esos que se proponen hacer mil cosas y terminan haciendo nada... esto te puede ayudar.

Existen N aplicaciones para llevar una lista de tus tareas y prioridades mediante interfaces graficas muy guapas, pero te toma mas tiempo revisarlas, marcarlas y priorizarlas que llevarlas a cabo. Algunos super-users suelen crear archivos de textos que se muestran en la consola al iniciarlas, llevar manualmente el control de tareas en un archivo de texto y otras muchas opciones ya que este procedimiento suele ser mas eficiente que cualquier aplicaciones grafica. Y ese archivo de texto plano... muchas veces es llamado todo.txt

Esta joya se define a sí misma como
If you’ve got a file called todo.txt on your computer right now, you’re in the right place. Countless software applications and web sites can manage your to-do list with all sorts of bells and whistles. But if you don’t want to depend on someone else’s data format or someone else’s server, a plain text file is the way to go.

TODO.TXT es un poderoso y simple script en bash que permite gestionar tareas, priorizar y marcar como terminadas mediante la consola (CLI). Todo esto es manejado mediante archivos de textos planos que tambien nos permitiran manipularlos a nuestro antojo. Manos a la obra:

Decargamos el paquete comprimido que contiene tres archivos que conforman la aplicacion. Una vez descargado ubicamos los archivos en sus respectivos directorios:
$ tar -xzf todo.txt_cli* && cd todo.txt_cli*
$ mkdir ~/.todo
$ mv -v todo.sh ~/.todo && chmod +x ~/.todo/todo.sh
$ mv -v todo.cfg ~/.todo/config # lo renombramos porque es necesario
$ sudo mv -v todo_completion /etc/bash_completion.d/

Y listo, ahora solo resta agregar dos lineas al .bashrc para que podamos encontrar todo.sh al momento de ejecutarlo en la consola:
$ echo -e "alias t=\"~/.todo/todo.sh\"\ncomplete -F _todo t" >> .bashrc
$ source .bashrc

Ahora simplemente con hacer $ t add "Mi primer tarea" vamos a poder empezar a crear y gestionar nuestras tareas ^_^. Si quieren saber como usar la aplicacion pues los invito a que vean el screencast de la pagina oficial, tambien pueden hacer $ t help y van a tener una muy clara explicacion de como sacarle el jugo a esta app.

Personalmente no quiero que esta herramiente sea otro de los muchos metodos que he intentado para poder llevar un control de mis tareas pendientes y que al final termino en lo mismo, asi que ademas de mi fuerza de voluntad agregue una pequeña linea a mi script de inicio para que me muestre la cantidad de tareas y cuantas tengo que son urgentes de seguir. La linea en sí es esta:
notify-send -i "cab_view" "TODO" "Rocordá que tenes $(cat ~/.todo/todo.txt | wc -l) tareas pendientes\
\nde las cuales $(cat ~/.todo/todo.txt | grep "^(A)" | wc -l) son urgentes"

Con este resultado:

Tambien me gustaria agregarlo a mi barra de estado, pero debo integrarlo en conky para poder extraer esa informacion.. por ahorita no estoy muy interesado en ello.

En fin, eso es todo. Espero les sea de utilidad ;)