From: [email protected]
Date: 2017-11-10
Subject: Journal to Timesheet

A  couple  tricks  I  use to keep a work journal and generate daily
summaries for my timesheet. Even  if  you  don't  need  to  keep  a
timesheet, this is a good way to track your accomplishments.

When  I was a developer, I had to track my time in quarter-hour in-
crements. I never really liked doing this  but,  after  10+  years,
it's  a  tough  habit to break. These days, the requirements aren't
quite as strict, but I still keep track of what I'm doing  through-
out  the  day.  It helps me show others what I've been doing and it
helps me understand what I've accomplished. This can be very  valu-
able,  say,  during  scrum  meetings  or when I have to fill out my
timesheet at the end of the week.

Journal

My journal is a simple text file that I maintain in Vim. Each jour-
nal entry goes on one line, and each line follows a consistent for-
mat. It looks like this:

```
1995-10-29 04:28 Back from jail! The feds broke my computer, but I think Cereal forgot about the French fry incident.
1995-10-25 20:47 So, Crash is getting blackmailed. Weird. I gave him some stuff I downloaded from the Gibson and now we are eating pizza.
1995-10-23 03:32 Righteous hack! I hacked a Gibson and I have proof!
1995-10-06 23:52 Nikon told me that hacking a bank across state lines stupid, and now I owe Cereal some fries.
1995-10-04 02:12 Hacked a bank! I'm finally going to get some respect from the guys.
1995-09-15 18:54 Thinking about a handle. Maybe ULTRALaser?
```

As you can see, each line begins with a date and time and  includes
a  short message about, in this example, what Joey Pardella was do-
ing in the Fall of 1995. I write my journal in  reverse-chronologi-
cal  order with the most recent entry at the top.  I do this, most-
ly, because that's where my eyes land when I first look at a  docu-
ment. Unlike Joey, I usually have several entries per day.

So  that I'm not writing timestamps manually, I use this mapping in
Vim:

 ```
 nnoremap gs :pu! =strftime('%Y-%m-%d %H:%M')<cr>A<space>
 ```

This inserts the timestamp at the beginning of the line and puts me
into  insert  mode. This is handy in other documents, too. When I'm
taking notes, I can insert a timestamp quickly. Being able  to  see
these timestamps can be very helpful later on.

Summarizing

At the end of the week, it's nice to be able to see a daily summary
of what I did over the course of the week. For that, I use the fol-
lowing script:

```bash
#!/usr/bin/bash
awk '
BEGIN {FS=" ";ORS="";days=1;prevdt="";msg=""}
{
       dt = $1
       if (dt != prevdt) {
               if (prevdt != "") {
                       print msg "0
                       days++
                       if (days>5)
                               exit
               }
               print "0 dt "0
               prevdt = dt
               msg = ""
       }
       $1 = "";$2 = ""
       msg = $0 msg
}' journal.txt | sed 's/  */ /g;s/^ //'
```

This  gathers  up  the  journal  entries for the last five days and
prints them out as paragraphs. I can run this in the terminal  (Git
bash,  in  my case), or from within Vim. Then I just copy and paste
the text for each day into my daily timesheet entry. If you  create
your  journal in chronological order, this script can be simplified
somewhat. In my case, because awk processes files top-down, I  have
to  accumulate journal entries, prepending, and then print them af-
ter the date changes. If I were to treat this as a normal,  chrono-
logical  log file, my summaries will appear in reverse order within
each day; it reads a little weird.