WEBVTT captioned by sachac NOTE Introduction 00:00:00.000 --> 00:00:03.999 Hi, this is Dave O'Toole, and today 00:00:04.000 --> 00:00:07.799 I'll be giving a presentation on tracking health data 00:00:07.800 --> 00:00:12.759 with Emacs, Org Mode, and Gnuplot. 00:00:12.760 --> 00:00:16.079 So Gnuplot is the well-known scientific 00:00:16.080 --> 00:00:19.039 and mathematical plotting application. 00:00:19.040 --> 00:00:24.639 You feed it text files full of names, dates, numbers, 00:00:24.640 --> 00:00:27.199 data points, and you get out a nice graph. 00:00:27.200 --> 00:00:31.119 You can spit out SVG. You can spit out PNG graphics. 00:00:31.120 --> 00:00:33.639 In this case, we're using an SVG. NOTE How to take daily health journal items 00:00:33.640 --> 00:00:36.839 What I'm going to show you today 00:00:36.840 --> 00:00:39.839 is how to take daily health journal items: 00:00:39.840 --> 00:00:42.119 in other words, things like I exercised 00:00:42.120 --> 00:00:44.319 such and such number of minutes today, 00:00:44.320 --> 00:00:47.399 I got X hours of sleep last night, 00:00:47.400 --> 00:00:51.479 I used such and such number of pieces of nicotine gum, 00:00:51.480 --> 00:00:54.559 say five pieces. So let's see, 00:00:54.560 --> 00:00:58.439 we've got this whole picture here, all right, 00:00:58.440 --> 00:00:59.359 and I've tracked here... 00:00:59.360 --> 00:01:02.319 This is a month of data from my life. 00:01:02.320 --> 00:01:05.159 This is... I'm not showing all the variables, 00:01:05.160 --> 00:01:08.519 but this is what I felt comfortable sharing 00:01:08.520 --> 00:01:14.239 in order to help people who might have a need to track, 00:01:14.240 --> 00:01:15.919 either because of a chronic condition, 00:01:15.920 --> 00:01:18.599 or just because of a health improvement goal 00:01:18.600 --> 00:01:20.959 or what have you, people who might need to 00:01:20.960 --> 00:01:23.319 track health data in a way 00:01:23.320 --> 00:01:24.959 that's a little bit more robust 00:01:24.960 --> 00:01:26.599 than just one or two variables 00:01:26.600 --> 00:01:29.839 and just weight or just blood pressure. 00:01:29.840 --> 00:01:33.079 So in this case, I've got exercise, 00:01:33.080 --> 00:01:36.399 I've got the number of hours of sleep, 00:01:36.400 --> 00:01:38.559 the number of doses of nicotine, 00:01:38.560 --> 00:01:40.799 (that's the yellow line here), 00:01:40.800 --> 00:01:44.199 and this is referring to nicotine gum. 00:01:44.240 --> 00:01:45.559 What we're going to be talking about 00:01:45.560 --> 00:01:47.839 is looking at connections, the idea 00:01:47.840 --> 00:01:49.879 that plotting your data can actually 00:01:49.880 --> 00:01:52.119 help you figure out what's going on. 00:01:52.120 --> 00:01:53.079 This is just one month. 00:01:53.080 --> 00:01:55.439 I've been doing this for a couple of months now, 00:01:55.440 --> 00:01:57.559 but I felt comfortable showing one month 00:01:57.560 --> 00:01:59.439 with a limited subset of the variables. NOTE How to set up your org templates 00:01:59.440 --> 00:02:02.239 What I'm going to be doing in this presentation 00:02:02.240 --> 00:02:05.279 is showing you how to set up your org templates 00:02:05.280 --> 00:02:08.799 so that you can, you know, hit a hotkey 00:02:08.800 --> 00:02:11.839 to capture today's data with an org template-- 00:02:11.840 --> 00:02:14.199 or in this case yesterday's. Usually I'm saying, okay, 00:02:14.200 --> 00:02:15.639 yesterday this happened, 00:02:15.640 --> 00:02:17.479 because you don't know until the day's over 00:02:17.480 --> 00:02:19.719 how many pieces of nicotine gum you ate 00:02:19.720 --> 00:02:21.439 or how many hours you slept. 00:02:21.440 --> 00:02:25.959 So usually we're recording data for the previous day. 00:02:25.960 --> 00:02:28.079 We can set up a capture template 00:02:28.080 --> 00:02:30.919 so that it fills a little org entry. One for exercise, 00:02:30.920 --> 00:02:34.279 one for sleep, one for nicotine, one for distress. 00:02:34.280 --> 00:02:36.919 Here distress is just 1 to 10: 00:02:36.920 --> 00:02:38.559 how bad do you feel today? 00:02:38.560 --> 00:02:41.639 It's not a scientific measure, but you know, 00:02:41.640 --> 00:02:43.359 many, many things ask you to rate 00:02:43.360 --> 00:02:47.119 on a scale of 1 to 10, how bad is the anxiety, 00:02:47.120 --> 00:02:49.639 how bad is the general level of stress, 00:02:49.640 --> 00:02:51.679 and so without a lot of complication, 00:02:51.680 --> 00:02:53.159 I just rate that one to ten. 00:02:53.160 --> 00:02:58.799 Pain, okay, we won't have to get into any details, 00:02:58.800 --> 00:03:00.959 but if there is a level of chronic pain, well, 00:03:00.960 --> 00:03:04.239 I put that between 1 and 10. As we can see here, 00:03:04.240 --> 00:03:07.319 during the period that I've shown you, it's pretty low. 00:03:07.320 --> 00:03:11.919 There's some. If you miss a dose of medication, 00:03:11.920 --> 00:03:13.599 you can track that, in this case 00:03:13.600 --> 00:03:17.639 with a big ugly red triangle, you know. 00:03:17.640 --> 00:03:24.279 You can see, I can see here that in mid-, in late September, 00:03:24.280 --> 00:03:29.199 sorry, in early to mid-October, 00:03:29.200 --> 00:03:30.999 I stopped using the nicotine gum 00:03:31.000 --> 00:03:32.959 and probably should have cut down more gradually 00:03:32.960 --> 00:03:34.759 because my sleep suffered. Look at this. 00:03:34.760 --> 00:03:37.199 The sleep line is down here, okay? NOTE How to do it in GNU Emacs 00:03:38.320 --> 00:03:39.519 What I'm going to do now, 00:03:39.520 --> 00:03:40.879 now that I've shown you the graph 00:03:40.880 --> 00:03:44.799 and some of the things that are useful about it, 00:03:44.800 --> 00:03:46.639 I'm going to actually take a step back 00:03:46.640 --> 00:03:50.319 and show you from start to finish how you can do this 00:03:50.320 --> 00:03:53.319 in GNU Emacs, and I have a little template generator 00:03:53.320 --> 00:03:56.279 that you can use if you'd like. 00:03:56.280 --> 00:03:59.919 All right, so let's go back. 00:03:59.920 --> 00:04:01.479 Let's step back from this file. 00:04:01.480 --> 00:04:07.599 We're going to split the screen, and on the left side, 00:04:07.600 --> 00:04:09.839 I'm going to put the underlying Org file 00:04:09.840 --> 00:04:10.919 that generates this graph. 00:04:10.920 --> 00:04:16.839 Let me shrink that a little bit. NOTE Overview of the presentation 00:04:16.840 --> 00:04:22.759 All right, I'm going to work my way backwards 00:04:22.760 --> 00:04:26.519 from the template to the template generator, 00:04:26.520 --> 00:04:28.439 meaning that you'll be able to spit out, 00:04:28.440 --> 00:04:31.839 given your own specification of health variables, 00:04:31.840 --> 00:04:33.519 you'll be able to have it spit out 00:04:33.520 --> 00:04:38.159 a custom Gnuplot script like this 00:04:38.160 --> 00:04:41.319 that's preset up with the definitions 00:04:41.320 --> 00:04:43.159 for the column view in Org mode. 00:04:43.160 --> 00:04:45.399 I'm assuming a little bit of familiarity 00:04:45.400 --> 00:04:47.199 with Org mode and Gnuplotting, 00:04:47.200 --> 00:04:51.959 but I'll try to explain as much as I can as I go along. NOTE The journal 00:04:51.960 --> 00:04:59.039 The journal here is where... okay, okay, one moment. 00:04:59.040 --> 00:05:03.519 So as you can see, there's a sub-entry here 00:05:03.520 --> 00:05:06.279 for each day that I've included from my data set 00:05:06.280 --> 00:05:08.559 starting on September 13th of this year 00:05:08.560 --> 00:05:10.399 and ending on October 17th. 00:05:10.400 --> 00:05:16.959 And there's an Org property drawer with 00:05:16.960 --> 00:05:22.999 the corresponding names of each field and the value. 00:05:29.800 --> 00:05:36.759 Now the idea here is that the columns specify... 00:05:36.760 --> 00:05:40.639 if you know a little bit about Org mode, 00:05:40.640 --> 00:05:43.479 what happens is that you... 00:05:43.480 --> 00:05:50.919 let's say that I hit the key for my journal template, 00:05:50.920 --> 00:05:52.799 which... Mine is very similar. NOTE The capture buffer 00:05:52.800 --> 00:06:00.879 This is the capture buffer for today's date, 00:06:00.880 --> 00:06:02.679 and if you're recording yesterday's date, 00:06:02.680 --> 00:06:04.519 you can just flip it like that if you need to. 00:06:04.520 --> 00:06:08.639 Then I say, yesterday, I remember 00:06:08.640 --> 00:06:11.159 I went for about a one-mile walk, 00:06:11.160 --> 00:06:14.119 so that's probably about 20 minutes, 00:06:14.120 --> 00:06:16.519 and that I had such and such, 00:06:16.520 --> 00:06:19.079 I had eight and a half hours of sleep, let's say. 00:06:19.080 --> 00:06:22.479 I estimate how many pieces of nicotine gum I have. 00:06:22.480 --> 00:06:25.799 I try to count as closely as I can, how much distress, 00:06:25.800 --> 00:06:26.359 you know what I mean, 00:06:26.360 --> 00:06:28.279 whether or not I missed a dose of medication. 00:06:28.280 --> 00:06:32.399 Then when you hit C-c C-c, 00:06:32.400 --> 00:06:39.799 it captures that to the end of your Org file. 00:06:39.800 --> 00:06:46.679 Now what this shows is that... I cut and paste it in. 00:06:46.680 --> 00:06:48.159 I've been keeping these entries every day for months, 00:06:48.160 --> 00:06:51.319 and that I cut and pasted in a month of data. NOTE The columnview table 00:06:51.320 --> 00:07:00.799 Now I'm going to dig in a little bit to the Gnuplot script. 00:07:00.800 --> 00:07:07.759 This here, all this stuff, is one component of the graph, 00:07:07.760 --> 00:07:11.359 and I'll go over how it works. 00:07:11.360 --> 00:07:19.319 First, the items through this column declaration here, 00:07:19.320 --> 00:07:30.199 and the id:myid, this columnview table here, 00:07:30.200 --> 00:07:34.919 #+BEGIN: columnview, this whole bit here, 00:07:34.920 --> 00:07:39.879 is going to get filled in with the corresponding columns, 00:07:39.880 --> 00:07:43.039 exercise minutes, sleep hours, nicotine doses. 00:07:43.040 --> 00:07:53.559 And then it gets pumped out by Org mode into a file 00:07:53.560 --> 00:07:59.840 that looks like this: tab-separated values 00:07:59.841 --> 00:08:03.479 with an ISO-style date at the beginning. NOTE Gnuplot 00:08:03.480 --> 00:08:10.359 So what we're going to do is we're going to go through 00:08:10.360 --> 00:08:14.479 the Gnuplot portion of this, 00:08:14.480 --> 00:08:16.359 and I'm going to enlarge the font a little. 00:08:21.280 --> 00:08:23.719 I'm going to go line by line through the Gnuplot portion. 00:08:23.720 --> 00:08:30.639 Now, my template generator will give you one like this. 00:08:30.640 --> 00:08:33.119 You don't have to write this from scratch. 00:08:33.120 --> 00:08:35.679 But I'm going to go through it line by line 00:08:35.680 --> 00:08:37.479 because if you do use the template, 00:08:37.480 --> 00:08:42.199 then it'll help to have gone through it line by line, 00:08:42.200 --> 00:08:46.679 because you're probably going to have to modify it. 00:08:46.680 --> 00:08:49.119 So first, we're going to clear the graphics 00:08:49.120 --> 00:08:50.199 from any previous runs 00:08:50.200 --> 00:08:53.799 so that if we reuse the same Gnuplot process, 00:08:53.800 --> 00:08:57.759 we're not overwriting the old-- 00:08:57.760 --> 00:09:00.719 that we are completely overwriting the old image. 00:09:00.720 --> 00:09:03.319 So that's the purpose of this line here. NOTE Output parameters 00:09:03.320 --> 00:09:08.559 The output parameters: we want to put out an SVG file. 00:09:08.560 --> 00:09:13.639 Font Arial, that's funny, 00:09:13.640 --> 00:09:16.119 but I don't know what font it's actually ending up choosing, 00:09:16.120 --> 00:09:16.879 but it looks fine. 00:09:16.880 --> 00:09:19.639 Then we want it to be square, 00:09:19.640 --> 00:09:21.919 so I'm giving it 900 by 900 pixels, 00:09:21.920 --> 00:09:23.719 even though it is a scalable vector graphic. 00:09:23.720 --> 00:09:29.159 We're putting it in the same folder as the org file, 00:09:29.160 --> 00:09:30.799 example.svg. 00:09:30.800 --> 00:09:39.519 These lines here set it up to use the Org mode format 00:09:39.520 --> 00:09:42.679 that we showed in the other file over here. 00:09:42.680 --> 00:09:48.359 The time format is four-digit year, two-digit month, 00:09:48.360 --> 00:09:50.359 two-digit day. 00:09:50.360 --> 00:09:56.479 The time format doesn't specify here the time, 00:09:56.480 --> 00:09:59.599 but that doesn't seem to mess it up. 00:09:59.600 --> 00:10:02.439 This line "set datafile separator" means that 00:10:02.440 --> 00:10:04.239 the separators between that 00:10:04.240 --> 00:10:06.959 and between all the other fields are tabs, 00:10:06.960 --> 00:10:08.919 which is what Org mode does 00:10:08.920 --> 00:10:10.999 when it spits out a table by default. 00:10:11.000 --> 00:10:15.479 Okay, along to the next lines. NOTE Time series data 00:10:15.480 --> 00:10:18.119 We're going to set up for time series data, 00:10:18.120 --> 00:10:22.807 meaning that the x-axis is going to be time, 00:10:22.808 --> 00:10:26.119 x2tics 1 format. 00:10:26.120 --> 00:10:30.399 I believe this means that every day has one tick 00:10:30.400 --> 00:10:32.879 and that this tells it that the first-- 00:10:32.880 --> 00:10:39.359 unfortunately, I forget the exact meaning of this one line. 00:10:39.360 --> 00:10:44.959 I'm just going to move on. We want one X tick per day, 00:10:44.960 --> 00:10:46.519 and because X is in seconds, 00:10:46.520 --> 00:10:50.319 it's 24 hours times 60 minutes times 60 seconds. 00:10:50.320 --> 00:10:55.639 This line "set grid xtics" gives us 00:10:55.640 --> 00:10:57.279 a vertical line on each day of the graph. 00:10:57.280 --> 00:10:58.319 I'll pull up the graph 00:10:58.320 --> 00:11:00.039 just so that it's a little easier to see. 00:11:00.040 --> 00:11:03.919 All these vertical lines, one on each day, 00:11:03.920 --> 00:11:06.199 that's given to you by "set grid xtics". 00:11:06.200 --> 00:11:10.159 One Y tick every five points. 00:11:10.160 --> 00:11:13.719 So here at five pieces of nicotine, 00:11:13.720 --> 00:11:15.959 we've got a five, at ten pieces – well, 00:11:15.960 --> 00:11:19.679 we don't want to eat ten pieces, but ten, fifteen, twenty. 00:11:19.680 --> 00:11:25.479 Rotating the labels to make them fit a little bit better, 00:11:25.480 --> 00:11:28.039 that's this part here where the labels are sideways, 00:11:28.040 --> 00:11:30.639 and even with just one month of data, 00:11:30.640 --> 00:11:35.159 they're getting a little crowded. 00:11:35.160 --> 00:11:41.399 This "set key box lc" just makes the line around the key, 00:11:41.400 --> 00:11:44.039 the legend here, a little bit less severe. 00:11:44.040 --> 00:11:51.079 set xtics format: this makes it so that, for example, 00:11:51.080 --> 00:11:53.479 I've done a United-States-style date here 00:11:53.480 --> 00:11:55.279 with the month and then the day. 00:11:55.280 --> 00:11:58.839 You don't necessarily have to do that. 00:11:58.840 --> 00:12:01.959 You can have whatever you want. 00:12:01.960 --> 00:12:03.079 This xtics format, 00:12:03.080 --> 00:12:06.319 that relates to how the dates are printed. 00:12:06.320 --> 00:12:12.519 Remember that over here, this set timefmt, 00:12:12.520 --> 00:12:15.159 that relates to how the dates are formatted 00:12:15.160 --> 00:12:16.999 in the Org mode output. 00:12:17.000 --> 00:12:18.319 So remember, those are two... 00:12:18.320 --> 00:12:19.519 You don't want to mix those up. 00:12:19.520 --> 00:12:23.799 All right, "yrange [0:40]". 00:12:23.800 --> 00:12:28.719 Thus far, my exercise sessions have all been 00:12:28.720 --> 00:12:31.479 less than 30 minutes, and nothing's gone over 30. 00:12:31.480 --> 00:12:35.839 If you have a health variable 00:12:35.840 --> 00:12:38.119 that is in a significantly different range, 00:12:38.120 --> 00:12:41.639 you may need to get a slightly more complicated 00:12:41.640 --> 00:12:43.719 Gnuplot script because it is possible to plot 00:12:43.720 --> 00:12:46.479 multiple yranges in one plot 00:12:46.480 --> 00:12:48.719 if you have a variable that uses a different range. 00:12:48.720 --> 00:12:49.759 It's just a little trickier. 00:12:49.760 --> 00:12:55.919 These parts here, aside from the fact 00:12:55.920 --> 00:12:59.079 that you might make some changes that relate to 00:12:59.080 --> 00:13:01.319 the date and your country format, 00:13:01.320 --> 00:13:03.239 are going to be the same. 00:13:03.240 --> 00:13:05.919 This is like boilerplate for almost anything. NOTE Health variables 00:13:05.920 --> 00:13:09.799 Now here are the parts that are going to vary 00:13:09.800 --> 00:13:13.399 depending on what health variables you want to store. 00:13:13.400 --> 00:13:18.039 There are three main sections here. 00:13:18.040 --> 00:13:28.719 One is setting the different line types that are used. 00:13:28.720 --> 00:13:32.479 Setting linetype 1 with line width 2, line color RGB. 00:13:32.480 --> 00:13:34.959 Unfortunately, Gnuplot is a little bit cryptic, 00:13:34.960 --> 00:13:36.879 which is why I've made this template generator 00:13:36.880 --> 00:13:37.999 that I'll show you in a moment. 00:13:38.000 --> 00:13:43.039 I pick a color. So this is exercise, forest green. 00:13:43.040 --> 00:13:49.279 Point size 1, meaning you get 00:13:49.280 --> 00:13:51.599 these little green triangles about that size. 00:13:51.600 --> 00:13:54.719 But the point type 9 is the pointing up triangle. 00:13:54.720 --> 00:13:59.519 Line type 2, purple. So that's the sleep line. 00:13:59.520 --> 00:14:02.999 So we're just establishing these different line types 00:14:03.000 --> 00:14:04.719 that we've given arbitrary numbers. 00:14:04.720 --> 00:14:08.959 Now onto the next section. 00:14:08.960 --> 00:14:12.919 Oh, before I move on here, 00:14:12.920 --> 00:14:16.119 you can see point type 11 for line 5, which is red. 00:14:16.120 --> 00:14:18.079 And that's the missed medications line, 00:14:18.080 --> 00:14:20.639 so you get a triangle that's upside down 00:14:20.640 --> 00:14:22.679 because that's point shape 11. NOTE Goal lines 00:14:22.680 --> 00:14:27.879 All right. The next section here is the goal lines. 00:14:27.880 --> 00:14:33.440 There are horizontal dashed lines here 00:14:33.441 --> 00:14:37.359 at 8 purple hours of sleep, because 8 hours is the goal. 00:14:37.360 --> 00:14:41.519 So there's a horizontal line at Y = 8. 00:14:41.520 --> 00:14:43.879 For pieces of nicotine gum, 00:14:43.880 --> 00:14:46.959 I'm trying to keep it to around 5 right now. 00:14:46.960 --> 00:14:52.519 So my goal line is at 5. So these... 00:14:52.520 --> 00:14:56.759 Here, a goal of at least 20 minutes of exercise. 00:14:56.760 --> 00:14:59.079 Sometimes I get more, sometimes I get less. 00:14:59.080 --> 00:15:02.199 There's a green line and a 20, showing that that's the goal. 00:15:02.200 --> 00:15:06.479 These lines here are actually the goal lines. 00:15:06.480 --> 00:15:09.119 You can specify the goal for each one 00:15:09.120 --> 00:15:11.999 in the template generator that I'll show you. NOTE The Gnuplot command 00:15:12.000 --> 00:15:28.079 The last part is the actual plot command. 00:15:28.080 --> 00:15:30.199 So the dependent... So okay, 00:15:30.200 --> 00:15:34.919 these all start with 1, "using 1" against this variable. 00:15:34.920 --> 00:15:41.599 So $2... This is a ternary operator here 00:15:41.600 --> 00:15:49.199 that says if the value of the second column is zero, 00:15:49.200 --> 00:15:52.359 then don't plot a point. In other words, 00:15:52.360 --> 00:15:56.079 not a number means it won't plot a point. 00:15:56.080 --> 00:15:58.919 The template generator lets you skip over 00:15:58.920 --> 00:16:02.119 the details of that. It sticks this in there. 00:16:02.120 --> 00:16:02.759 I'll show you. 00:16:02.760 --> 00:16:09.399 So we only want to plot a point when the value is non-zero. 00:16:09.400 --> 00:16:12.479 If there was no exercise, we're not plotting a point. 00:16:12.480 --> 00:16:15.759 The with construct means we'll plot data 00:16:15.760 --> 00:16:21.340 using date against exercise with points, 00:16:21.341 --> 00:16:25.519 the title is "exercise (minutes)", line type 1. 00:16:25.520 --> 00:16:29.839 Remember, we established line type 1 up here 00:16:29.840 --> 00:16:35.079 as being forest green, point style 1, 00:16:35.080 --> 00:16:37.599 point type 9, green triangles. 00:16:37.600 --> 00:16:42.399 Now I'm going to show 1 against column 3, 00:16:42.400 --> 00:16:43.919 which is "hours of sleep". 00:16:43.920 --> 00:16:46.039 This one is plotted with lines, 00:16:46.040 --> 00:16:48.599 so we don't specify a point type or point size, 00:16:48.600 --> 00:16:51.719 just a line type 2. And remember, you can see 00:16:51.720 --> 00:16:55.240 that line type 2 is defined as purple 00:16:55.241 --> 00:16:57.359 with point type 1, point size 1. 00:16:57.360 --> 00:16:59.959 Okay, so I did specify point size and point type, 00:16:59.960 --> 00:17:01.479 but because I'm not plotting with points, 00:17:01.480 --> 00:17:02.279 those are ignored. 00:17:02.280 --> 00:17:08.799 Here we come to the line with nicotine. 00:17:08.800 --> 00:17:11.559 The fourth column is the nicotine number, 00:17:11.560 --> 00:17:13.199 the fourth column from the Org mode file. 00:17:13.200 --> 00:17:16.007 So here you can see how we're telling Gnuplot 00:17:16.008 --> 00:17:19.799 to take each column of the tab-separated Org mode file 00:17:19.800 --> 00:17:21.119 and put it into the graph. 00:17:21.120 --> 00:17:25.959 The line types are set up here. 00:17:25.960 --> 00:17:30.799 The goal lines are set up here. 00:17:30.800 --> 00:17:35.559 And then the actual plot command is set up here. NOTE The template generator 00:17:35.560 --> 00:17:41.319 So now we're going to work further backwards 00:17:41.320 --> 00:17:42.959 from this Gnuplot template 00:17:42.960 --> 00:17:46.559 to the template generator that I used to make it. 00:17:46.560 --> 00:18:01.959 Now I'm not going to go into 00:18:01.960 --> 00:18:03.759 all of the details of the code, 00:18:03.760 --> 00:18:06.159 but what I am going to show you is that 00:18:06.160 --> 00:18:10.679 there's a variable called `health-factors`. 00:18:10.680 --> 00:18:15.839 And what this does, this `health-factors-from-list` 00:18:15.840 --> 00:18:20.919 lets you specify, with a property list 00:18:20.920 --> 00:18:22.679 of keyword and value pairs 00:18:22.680 --> 00:18:24.799 (here's the keyword name and the value is exercise), 00:18:24.800 --> 00:18:28.199 the goal that I want 20 minutes of exercise, 00:18:28.200 --> 00:18:30.199 that the unit is minutes, 00:18:30.200 --> 00:18:36.159 that the color is forest green, and so on. 00:18:36.160 --> 00:18:39.439 The aspects of the Gnuplot setup 00:18:39.440 --> 00:18:43.559 have been abstracted here. 00:18:43.560 --> 00:18:49.279 Eight hours of sleep is the goal here. 00:18:49.280 --> 00:18:54.039 The hours are units. What color, 00:18:54.040 --> 00:18:55.119 what thickness of the line. 00:18:55.120 --> 00:19:00.079 Here we specify the number of points. 00:19:00.080 --> 00:19:01.279 There's references online 00:19:01.280 --> 00:19:05.199 that show you what point types are what shapes in Gnuplot, 00:19:05.200 --> 00:19:11.479 and so on and so forth. NOTE The code that creates a template 00:19:11.480 --> 00:19:17.399 I'll walk through the code a little bit that does this, 00:19:17.400 --> 00:19:20.439 that actually takes these pieces, 00:19:20.440 --> 00:19:24.399 that takes this specification of what your variables are 00:19:24.400 --> 00:19:30.439 and turns it into a template. 00:19:30.440 --> 00:19:37.959 First, I'm using EIEIO, 00:19:37.960 --> 00:19:41.719 the object system that's included with GNU Emacs. 00:19:41.720 --> 00:19:45.119 It's a reasonable facsimile 00:19:45.120 --> 00:19:47.319 of the Common Lisp Object System. 00:19:47.320 --> 00:19:51.239 What I'm going to be doing here 00:19:51.240 --> 00:19:56.199 is defining a class with each of those items, 00:19:56.200 --> 00:19:58.479 those properties that we talked about in that list 00:19:58.480 --> 00:20:01.319 that lets you specify name, what the goal is, 00:20:01.320 --> 00:20:04.239 what the units are, and the Gnuplot things 00:20:04.240 --> 00:20:06.559 (the Gnuplot parameters like thickness, 00:20:06.560 --> 00:20:13.239 plot type, and all that) into a class that will then 00:20:13.240 --> 00:20:16.519 spit out the template once you feed it 00:20:16.520 --> 00:20:27.759 some of these health factor objects. So just a moment. 00:20:27.760 --> 00:20:34.479 For example, you can see that this template 00:20:34.480 --> 00:20:46.319 originally came from being generated by this code here. 00:20:46.320 --> 00:20:52.959 To use the template, 00:20:52.960 --> 00:20:55.399 to use this little template generator... 00:20:55.400 --> 00:21:06.279 See, here's where it spits out the line type 00:21:06.280 --> 00:21:07.439 given the pieces. 00:21:07.440 --> 00:21:09.679 This is all just text formatting. 00:21:09.680 --> 00:21:11.319 This is one of the things that Emacs Lisp 00:21:11.320 --> 00:21:13.159 just really excels at. 00:21:13.160 --> 00:21:19.519 I need to take a piece of data 00:21:19.520 --> 00:21:22.639 like a list of health information, 00:21:22.640 --> 00:21:25.679 a list of health variables, what their units are, 00:21:25.680 --> 00:21:28.119 and how they're supposed to be formatted in Gnuplot, 00:21:28.120 --> 00:21:30.199 and go from that to the nice template. 00:21:30.200 --> 00:21:31.719 So that's pretty much the whole thing. 00:21:31.720 --> 00:21:40.999 I want to see if there's anything I missed. NOTE The power of the chart 00:21:41.000 --> 00:21:51.519 Bring up the chart. 00:21:51.520 --> 00:21:54.279 This has been really useful 00:21:54.280 --> 00:21:59.599 for communicating with healthcare professionals 00:21:59.600 --> 00:22:04.399 because you are both on the same page 00:22:04.400 --> 00:22:05.879 about exactly what is happening, 00:22:05.880 --> 00:22:10.679 what's been happening because if... Let's say 00:22:10.680 --> 00:22:15.239 that you're tired when you talk to your care provider. 00:22:15.240 --> 00:22:17.559 Well, if you have objective information 00:22:17.560 --> 00:22:18.839 that you've been recording every day, 00:22:18.840 --> 00:22:22.399 that you're ahead of the game, really, 00:22:22.400 --> 00:22:25.119 because you don't need, necessarily, the presence of mind 00:22:25.120 --> 00:22:27.679 to be able to give your care provider 00:22:27.680 --> 00:22:30.039 a complete picture of what's going on in your world. 00:22:30.040 --> 00:22:33.039 If you can find those few minutes a day to enter-- 00:22:33.040 --> 00:22:34.399 not even a few minutes, 00:22:34.400 --> 00:22:37.759 really just a minute to enter the data 00:22:37.760 --> 00:22:39.839 and say what happened yesterday... 00:22:39.840 --> 00:22:42.759 I'm finding over these months 00:22:42.760 --> 00:22:45.039 that I've been more in touch with my health when I can-- 00:22:45.040 --> 00:22:49.919 not forced, but when I have the habit, 00:22:49.920 --> 00:22:52.159 the consistent habit every single day 00:22:52.160 --> 00:22:55.839 of recording that data--I'm accountable to myself. 00:22:55.840 --> 00:22:57.359 It's interesting. 00:22:57.360 --> 00:23:01.039 I guess it gets into a little bit of ideas 00:23:01.040 --> 00:23:02.439 about the Quantified Self 00:23:02.440 --> 00:23:05.239 and how holding yourself accountable 00:23:05.240 --> 00:23:09.919 can change what you do and what the outcomes are. 00:23:09.920 --> 00:23:14.159 Just look at this here. 00:23:14.160 --> 00:23:17.279 Without getting into too much detail, 00:23:17.280 --> 00:23:19.679 one of the reasons I track my sleep is because, 00:23:19.680 --> 00:23:22.039 as you can see, my sleep 00:23:22.040 --> 00:23:26.759 is not as well-regulated as most people, 00:23:26.760 --> 00:23:31.439 and that's why I need to do that. 00:23:31.440 --> 00:23:34.440 This was a time... 10, 12, 00:23:34.441 --> 00:23:36.639 here's 14 hours of sleep, that's depression. 00:23:36.640 --> 00:23:43.519 It oscillates a little bit. But then below the goal line, 00:23:43.520 --> 00:23:45.639 the things are a little more normal here. 00:23:45.640 --> 00:23:46.919 This is a little more normal. 00:23:46.920 --> 00:23:52.079 But then, really, without thinking about it too much, 00:23:52.080 --> 00:23:56.239 I cut out the nicotine, and my sleep suffered. 00:23:56.240 --> 00:24:00.199 Just the fact that I'm able to look and see that connection 00:24:00.200 --> 00:24:01.359 is really amazing to me. 00:24:01.360 --> 00:24:02.759 Maybe I would have anyway, 00:24:02.760 --> 00:24:05.239 but looking at the whole months of data, 00:24:05.240 --> 00:24:07.399 there have been many things to discuss 00:24:07.400 --> 00:24:09.919 and many things to think about. NOTE Thanks 00:24:09.920 --> 00:24:12.159 Because this is a short presentation, 00:24:12.160 --> 00:24:13.839 I probably should wrap up. 00:24:13.840 --> 00:24:18.239 I just want to thank the whole Emacs community 00:24:18.240 --> 00:24:23.319 for being there and for including me in the conference 00:24:23.320 --> 00:24:27.079 and I hope to participate next year as well. 00:24:27.080 --> 00:24:29.240 Thank you so much.