Η μέθοδος Pomodoro για διαχείρηση χρόνου και μια υλοποίηση σε Bash

Η μέθοδος Pomodoro

Η μέθοδος Pomodoro αναπτύχθηκε από τον Francesco Cirilli το 1980 και είναι μια μέθοδος για την διαχείριση χρόνου. Το Pomodoro χωρίζει την δουλεία που πρέπει να γίνει σε διαστήματα των 25 λεπτών με ένα διάλειμμα των 5 λεπτών ανάμεσα στις υποεργασίες. Κάθε 4 κύκλους κάνουμε ένα διάλειμμα μισής ώρας. Η μέθοδος μας βοηθά στην συγκέντρωση μιας και έχουμε ένα χρονικό διάστημα να κάνουμε κάτι απλό, χωρίς να καούμε στην προσπάθεια.

Θα βρείτε πολλές εφαρμογές για Pomodoro με μια απλή αναζήτηση. Παρουσιάστε στα σχόλια την αγαπημένη σας.

Η μέθοδος Pomodoro (ντομάτα στα Ιταλικά) πήρε το όνομα της από τους μετρητές κουζίνας σε σχήμα ντομάτας. Δεν βρήκα στην τοπική αγορά και αγόρασα ένα από το eBay. Σκάλες καλύτερο να έχεις ένα τέτοιο δίπλα στο πληκτρολόγιο από οποιαδήποτε εφαρμογή.

Μιας και σε λίγο θα ξεκινήσουν οι σχολές και οι εργασίες δοκιμάστε την μέθοδο Pomodoro σε συνδυασμό με το anoise. Θα με ευχαριστείτε :grinning:

Μπορούμε να κάνουμε Pomodoro και με απλές εφαρμογές χρονικών υπενθυμίσεων όπως το kteatime ή με κάποιο applet για το γραφικό σας περιβάλλον.


Τα ξυπνητήρια του kteatime

Απλό Pomodoro με Bash

Ας δούμε πως μπορούμε να φτιάξουμε ένα απλό Pomodoro Timer με απλές εντολές στο κέλυφος. Θα κρατήσω τους χρόνους μικρούς για εύκολες δοκιμές. Αυτό που θα κάνουμε δεν αντικαθιστά πλήρως μια καλή εφαρμογή, αλλά θα δούμε στην πορεία κάποιες απλές τεχνικές.

Για παράδειγμα έστω ότι θέλουμε για παράδειγμα ότι θέλουμε να παίξουμε κάποιο ήχο σε σε 60 δευτερόλεπτα από τώρα.

sleep 60 && paplay "/usr/share/sounds/linuxmint-login.wav"

Απλό μεν αλλά δεν θα λειτουργήσει αν κλείσουμε το τερματικό :sleepy:. Όταν κλείνουμε το τερματικό θα σταλεί σήμα τερματισμού (για την ακρίβεια το σήμα HUP) σε κάθε εφαρμογή που έχει ξεκινήσει από αυτό το τερματικό.

Η λύση είναι να χρησιμοποιήσουμε την εντολή nohup(1). Θα πρέπει να βάλουμε την εντολή σε ένα υπο-κέλυφος (subshell) μιας και τρέχουμε δυο εντολές:

nohup bash -c "sleep 60 && \
paplay /usr/share/sounds/linuxmint-login.wav" >/dev/null & 

τι γίνετε αν θέλω μετά από 15 λεπτά; sleep 900;

Ευτυχώς το bash μπορεί να κάνει απλές αριθμητικές πράξεις :

nohup bash -c "sleep $((5*60)) && \
paplay /usr/share/sounds/linuxmint-login.wav"  > /dev/null &

Τέλος ας καθαρίσουμε την έξοδο γιατί δεν μας ενδιαφέρει:

nohup bash -c "sleep $((5*60)) && \
paplay /usr/share/sounds/linuxmint-login.wav"  > /dev/null 2>&1 &

Η έκδοση της εντολής sleep(1) των GNU coreutils επιτρέπει να δώσουμε την χρονική διάρκεια σε μονάδες χρόνου και η εντολή μπορεί να απλοποιηθεί σε sleep 5m.

Πριν συνεχίσουμε μια παρατήρηση: Οι μέθοδοι αυτοί είναι κατάλληλοι για σύντομα χρονικά διαστήματα, και όταν δεν μας ενδιαφέρει η χρονική ακρίβεια. Μικρή διαφορά έχει αν πέσουμε λίγα δευτερόλεπτα έξω σε μια εφαρμογή Pomodo. Αλλά αν θέλουμε να φτιάξουμε κάτι σαν ένα ξυπνητήρι, δεν θέλουμε να κάνουμε πράξεις με δευτερόλεπτα, και θέλουμε να συνεχίσει να υπάρχει ακόμα και μετά από μια διακοπή ρεύματος.

Η μοντέρνα λύση για απόλυτους χρόνους είναι το systemd και ίσως να την παρουσιάσουμε αναλυτικά σε ένα επόμενο άρθρο.

Μια κάπως καλύτερη λύση

Ας κάνουμε κάτι καλύτερο θα χρησιμοποιήσουμε την εντολή ]notify-send(1) για να στέλνουμε ειδοποιήσεις και θα παίζουμε κάποιον ήχο στο τέλος. Ας αφήσουμε τα πολλά λόγια και ας δούμε τον κώδικα:

#!/usr/bin/env bash
#  Usage tomato ["task name"] [mins] [click_interval]

task=${1:-"Starting pomodoro task"}
mins=${2:-25}
interval=${3:-10};

TICKS="yes"
APP_NAME="Pomodoro"
SND_DONE="/usr/share/sounds/linuxmint-login.wav"
SND_CLICK="/usr/share/sounds/LinuxMint/stereo/system-ready.ogg"
PLAYER='paplay'
BAR_WIDTH=40;

total_sec=$(( mins * 60 ))
loops=$((total_sec / interval))

# Pomodoro time start: notify user
notify-send "${APP_NAME}" "Start: ${task}"

# Progress bar loop
SECONDS=0
for ((i=0; i<loops; i++)); do
    duration=$SECONDS;
    percentage="$(( 100 - 100*(total_sec - duration)/total_sec ))"

    bar1_w=$(( percentage * BAR_WIDTH / 100 ));
    bar2_w=$(( BAR_WIDTH - bar1_w ));
    bar1_s=$(printf "%${bar1_w}s" | tr " " "#")
    bar2_s=$(printf "%${bar2_w}s" | tr " " ".")
    bar_s="${bar1_s}${bar2_s}"
    
    min="$(( (total_sec - duration) / 60 ))"
    sec="$(( (total_sec - duration) % 60 ))"
    time_s="${min}:${sec}"

    perc_s="${percentage}%"
    printf "\r%s " "${task}: ${bar_s} Time Left ${time_s} (${perc_s})"
    
    # Did time pass?
    if (( duration > total_sec )); then
        break;
    fi
    sleep "$interval";

    [ "${TICKS}" == "yes" ] && ${PLAYER} "${SND_CLICK}" 2> /dev/null
done
printf "\r\033[K%s: Done! \n" "${task}"

# Time end: play sound and notify
${PLAYER} "${SND_DONE}" 2> /dev/null
notify-send "${APP_NAME}" "End: ${task}"

Ο κώδικας είναι μεγάλος και έχει κάποια κόλπα. Στην αρχή έχει κάποιες μεταβλητές που τον αλλάζουν και τον φέρνουν στα γούστα μας. Για να φτιαχτεί το progress bar κάνουμε χρήση του χαρακτήρα \r που είναι σαν να πάντα το Home. Η ακολουθία χαρακτήρων '\r\033[K' θα σβήσει όλη την γραμμή.

Επειδή παίζουμε ένα ήχο ‘κλικ’ κάθε 10 δευτερόλεπτα οι χρόνοι μας θα είναι λάθος και θα πρέπει να αφαιρέσουμε τον χρόνο που θέλει αυτός ο ήχος. Αλλά κάνουμε χρήση της μαγικής μεταβλητής '$SECONDS' του BASH και τερματίζουμε τον βρόχο πρόωρα. Δείτε πως συγκρίνουμε τις μεταβλητές με βάση την αριθμητική του τιμή.

Υπάρχουν και κάποια μαθηματικά :hot_face:. Αλλά δεν είναι τίποτα παραπάνω από την απλή μέθοδο των τριών. Είδατε που το Δημοτικό είναι χρήσιμο;

Το καλό με το Bash είναι πως δεν πρέπει να τα ξέρεις όλα αυτά για να το γράψεις.
Τα ξέρει όλα το google :grin:.

Μια καλή άσκηση είναι να δοκιμάσεις να το γράψεις σε κάτι άλλο όπως σε Python :python: . Ή να φτιάξεις ένα plugin για το status bar του tmux. Γράψτε μας τις λύσεις σας στα σχόλια.

Διαβάστε

Η καλύτερη εισαγωγή στην τεχνική, με όμορφες έγχρωμες εικόνες, απο την Pragmatic Press.

8 Likes

:smile: στα repositories του debian μπορείτε να βρείτε το πακέτο gnome-shell-pomodoro
και εδώ το git page για περισσότερα. εμένα με έχει βολέψει πολύ :v:

το kteatime ποτέ δεν μου φάνηκε αρκετό προσωπικά, αν και έχει αρκετές επιλογές για διαφορετικά timers, προτιμώ την λύση του gnome-shell-pomodoro που σου εμφανίζει ένα διάφανο pop-up στην οθόνη ώστε να σου υπενθυμίσει ότι το διάλειμμα αρχίζει ή τελειώνει. Βοηθάει στο focus :nerd_face:

2 Likes