Saludos a todos:
Si alguien de aquí se acuerda, hace un tiempo pregunté por el método de
organización Getting Things Done de David Allen [0], en español esta
traducido como Haz las cosas (aunque el libro se llamaba organízate con
eficacia, cosas de los traductores).
El caso es que he venido trastabillando con el asunto utilizando la
suite PIM de Kde, Kontact, pero no me convence porque todos los procesos
son manuales y procesar una tarea de la bandeja de entrada es arduo.
Buscando alternativas, finalmente me he decidido por utilizar
Taskwarrior, la utilidad de línea de comando. En la misma página de
Taskwarrior se referencia una útil guía para adaptar TaskWarrior al uso
con HlC (españolizando GTD), esta:
http://cs-syd.eu/tags/GTD.html
La he adaptado, e incluso he cambiado algunas cosas sobre lo que hace
Tom pero, para procesar la bandeja de entrada, Tom lo hace manualmente,
y eso, a mi, no me convence, porque ya he pasado por ahí con Kontact y,
personalmente, necesito algo más automático.
Así que estoy montando un guión en Bash para procesar la bandeja de
entrada, he ahí la razón por lo que estos días estoy «dando guerra» en
el canal de Telegram con Bash.
Mi idea, es crear un proceso semi-automático que me pregunto que hay que
hacer con la tarea:
a) Hacerla en menos de dos minutos.
b) Archivarla para futuro (o dejarla en ideas-proyectos algún día)
c) Delegarla
d) Borrarla (si ya no hay nada más que hacer con ella)
e) Añadirla como referencia a un proyecto
Eso en un primer paso, después la cosa se va dividiendo si se trata solo
de una tarea o es un proyecto de varias tareas, etc.
(Aquí: http://www.jesusda.com/blog/index.php?id=275 tenéis un enlace con
un gráfico de proceso pintado en bonito.)
El caso es que para que quede medianamente bonito he pensado en utilizar
dialog tras leer (muy, muy rápido) alguna que otra referencia [1] [2] y
ver que no era una cosa muy difícil de manejar.
Antes de seguir voy a poner el guión, o por donde voy ahora:
#!/bin/bash
## Guión de procesamiento de la bandeja de entrada de HlC
## implementada en
## TaskWarrior
# Licencia: GPL v3.0
# Funciones
function analiza_tarea() {
tarea_json=$(task $1 export)
}
function recopila() {
tareas=$(task bandeja_id |awk '$1~/[0-9]+/&&NF>2{print $1}')
for i in $tareas; do
procesar_bandeja $i
done
}
function procesar_bandeja() {
id_tarea=$1
tarea_json=$(task "$id_tarea" export)
# Intento de procesar con Python
# echo $tarea_compl | python -c 'import json,sys;
# obj=json.load(sys.stdin); print obj[0]["description"]'
Titulo=$(echo "$tarea_json" | jq '.[].description')
F_entrada=$(echo "$tarea_json" | jq '.[].entry')
F_modif=$(echo "$tarea_json" | jq '.[].modified')
Energia=$(echo "$tarea_json" | jq '.[].energia')
Tiempo=$(echo "$tarea_json" | jq '.[].tiempo')
# Procesamiento de comentarios
Total_comentarios=$(echo "$tarea_json" | jq '.[].annotations |length')
if [$Total_comentarios != "0"]
then
for i in $Total_comentarios; do
orden_jq=".[].annotations[${i}].entry"
#Comentario_"$i"=$(echo "$tarea_json" | jq
'.[].annotations['$i'].entry')
Comentario=$(echo "$tarea_json" | jq "$orden_jq")
echo $Comentario_"$i"
done
fi
echo $Total_comentarios
echo $(echo $tarea_json) |jq '.[] | length'
}
# Cuerpo principal, llama a la función recopila para procesar la bandeja.
echo -e "\n Procesando la bandeja de entrada,"
echo -e "\n se realiza por orden de entrada de elementos, tal y como
dice HlC."
echo -e "\n Aquí tienes el listado completo de elementos para procesar:"
task bandeja_entrada
if read -t 15 -p "¿Continuas el proceso? [S/N]" continuar
then
case $continuar in
S|s) recopila ;;
N|n) echo "Saliendo"
exit ;;
esac
else
echo -e "\n ¡Eres muy lento!"
fi
Como veis, lo primero que hace es lanzar un listado de las cosas
existentes en la bandeja de entrada (task bandeja_entrada), a partir de
ahí lanza la pregunta si sigues o si no (con control de tiempo para
lentorros) y, si sigues, llama a la función «recopila».
La función «recopila» saca las id de cada cosa en la bandeja de entrada
y va llamando para cada una de ellas a la función «procesar_bandeja».
(Aquí hay que dar las gracias a nuestro experto en AWk @Klashxx, esa
parte es suya.)
La función «procesar_bandeja» es la que se lleva el premio gordo.
En teoría lo que he pensado es mostrar un dialogo donde se muestren los
siguientes detalles de la tarea:
- Título.
- Fecha de entrada.
- Fecha de modificación.
- Energía.
- Tiempo.
- Comentario 1, 2, …, n (Si hubiere más de uno)
Como procesar la salida directa de TaskWarrior a la consola puede
suponerme mucho dolor de cabeza, lo que se me ocurrió es exportar la
tarea a formato Json y, tras mucho buscar y probar, encontré la utilidad
jq (instalable mediante apt-get en Debian) que te permite procesar datos
Json.
¿Donde esta ahora el problema? Pues en los comentarios, porque no se
sabe si va a existir uno, ninguno, dos o chorrocientos (a veces anoto
cosas y después voy añadiendo cosas que se me ocurren después).
jq puede acceder a esos comentarios de la siguiente forma:
jq '.[].annotations[0].entry
jq '.[].annotations[0].description
jq '.[].annotations[1].entry
jq '.[].annotations[2].entry
El problema que tengo en el guión es que no soy capaz de expandir la
variable «i» que recorre el bucle for de los comentarios.
Y en esas estoy, seguro que después encuentro otros problemas, pero, por
el momento estoy en este.
Agradezco opiniones para salir de este atolladero; o para reformar
completamente el programa si se tercia, no tengo problema en eso.
Añado la salida en Json de una tarea de la bandeja de entrada (ignorar
lo que ponga en los comentarios, en ese punto de las pruebas era muuuy
tarde):
$ task 7 export
[
{"id":7,"description":"Pues un título
descriptivo.","energia":"M","entry":"20160718T234255Z","modified":"20160720T122709Z","status":"pending","tags":["bandeja_entrada"],"uuid":"ac043334-2922-4aae-ab04-3843b397df00","annotations":[{"entry":"20160718T234255Z","description":"Se
habla de un perro piloto, pero a estas alturas, ¿quien
sabe?"},{"entry":"20160720T122709Z","description":"Pues quiero añadir
otro comentario para probar el procesamiento."}],"urgency":1.71644}
]
Por si alguno quiere ver la salida original de TaskWarrior sobre la
misma tarea:
$ task 7 information
Name Value
ID 7
Description Pues un título descriptivo
2016-07-19 01:42:55 Se habla de un perro piloto, pero a
estas alturas, ¿quien sabe
2016-07-20 14:27:09 Pues quiero añadir otro comentario
para probar el procesamiento.
Status Pending
Entered 2016-07-19 01:42:55 (3d)
Last modified 2016-07-20 14:27:09 (2d)
Tags bandeja_entrada
Virtual tags ANNOTATED PENDING READY TAGGED UDA UNBLOCKED
UUID ac043334-2922-4aae-ab04-3843b397df00
Urgency 1.716
Energía M
annotations 0.9 * 1 = 0.9
tags 0.8 * 1 = 0.8
age 0.008 * 2 = 0.016
1.716
Date Modification
2016-07-19 01:42:55 Annotation of 'Se habla de un perro piloto, pero a
estas alturas, ¿quien sabe?' added
2016-07-20 14:27:09 Annotation of 'Pues quiero añadir otro comentario
para probar el procesamiento.' added.
Ayer pedí algo de ayuda también en el IRC de TaskWarrior, creo que
podéis encontrar el registro aquí:
https://botbot.me/freenode/taskwarrior/
Aunque tenéis que subir hasta el día 21.
No me enrollo más.
Gracias a todos.
Salud y Revolución.
Lobo.
[0] ¿Alguien usando GTD en el foro?
[1] https://zenon.wordpress.com/2007/11/27/xdialog-ventanas-en-scripts/
[2] http://www.gacetadelinux.com/es/lg/issue101/sunil.html
Libertad es poder elegir en cualquier momento. Ahora yo elijo GNU/Linux,
para no atar mis manos con las cadenas del soft propietario.
Porque la libertad no es tu derecho, es tu responsabilidad.
http://www.mucharuina.com
Desde El Ejido, en Almería, usuario registrado Linux #294013
http://www.counter.li.org