WEBVTT captioned by tom 00:00:00.000 --> 00:00:05.453 Hey, I'm Gopar and this is the 00:00:05.454 --> 00:00:07.639 Real Estate and Org Mode Table Formulas talk. 00:00:07.640 --> 00:00:09.879 Not very creative, but it is what it is. 00:00:09.880 --> 00:00:13.051 Now I just want to say that everything I talk about here 00:00:13.052 --> 00:00:15.902 is in the Org Mode in the Emacs manual. 00:00:15.903 --> 00:00:17.909 I posted a link to the web version, 00:00:17.910 --> 00:00:20.479 but it should be inside of Emacs as well. 00:00:20.480 --> 00:00:25.096 Now before I start, I want to showcase the end goal. 00:00:25.097 --> 00:00:26.806 That way you know if you guys want to 00:00:26.807 --> 00:00:28.739 actually see the talk or not. 00:00:28.740 --> 00:00:30.491 So I always think that's pretty cool to see 00:00:30.492 --> 00:00:31.517 what you're actually going to build 00:00:31.518 --> 00:00:32.679 before you start building it. 00:00:32.680 --> 00:00:34.285 Alright. So let me start off with the goal, 00:00:34.286 --> 00:00:38.762 the end goal. Here we have a simple table formula 00:00:38.763 --> 00:00:42.613 and we have some constants, some values inside the list-- 00:00:42.614 --> 00:00:44.639 inside the table, I'm sorry, 00:00:44.640 --> 00:00:47.672 and some other stuff that we will get to, 00:00:47.673 --> 00:00:49.279 but for now... I don't want to spoil too much. 00:00:49.280 --> 00:00:50.327 I just want to give you a demo 00:00:50.328 --> 00:00:51.799 of how it actually works. 00:00:51.800 --> 00:00:56.094 We have a few values. Let me first go over the constants. 00:00:56.095 --> 00:00:57.581 We have PMI, which stands for 00:00:57.582 --> 00:00:57.590 private mortgage insurance, 00:00:57.591 --> 00:01:00.536 so it's insurance that you'll have to pay 00:01:00.537 --> 00:01:03.639 depending on how much money you put into the deal. 00:01:03.640 --> 00:01:06.067 The property tax, which is self-explanatory, 00:01:06.068 --> 00:01:09.316 the tax that you owe for owning the property, 00:01:09.317 --> 00:01:11.106 and then home insurance, 00:01:11.107 --> 00:01:13.439 and the interest rate at the loan that you get. 00:01:13.440 --> 00:01:15.666 So, here we have a few columns. 00:01:15.667 --> 00:01:17.411 The first one is called House, 00:01:17.412 --> 00:01:20.623 which I usually just put a description of the house 00:01:20.624 --> 00:01:21.126 with the link of the posting, 00:01:21.127 --> 00:01:22.493 the price of the house, 00:01:22.494 --> 00:01:26.189 the percentage down payment (this I play around with 00:01:26.190 --> 00:01:27.473 to see how much the deal will be structured), 00:01:27.474 --> 00:01:30.528 the down payment (which is calculated from 00:01:30.529 --> 00:01:31.754 the previous two columns), 00:01:31.755 --> 00:01:34.144 the monthly mortgage (which is calculated as well), 00:01:34.145 --> 00:01:37.995 and then the tenant income (which is what I suppose 00:01:37.996 --> 00:01:41.005 would be an example of the tenant income 00:01:41.006 --> 00:01:42.752 that I can potentially make off the property, 00:01:42.753 --> 00:01:45.539 the 1% rule and the ROI. 00:01:45.540 --> 00:01:47.707 I'll quickly go over the last two columns. 00:01:47.708 --> 00:01:49.200 So first is the 1% rule. 00:01:49.300 --> 00:01:50.879 The 1% rule is essentially 00:01:50.880 --> 00:01:53.588 a "rule," in quotes, that says that 00:01:53.589 --> 00:01:56.277 if a property matches this specific formula, 00:01:56.278 --> 00:01:58.319 it is a good deal to look into. 00:01:58.320 --> 00:02:00.889 So for example, the first two pass, 00:02:00.890 --> 00:02:02.676 and the last one does not pass. 00:02:02.677 --> 00:02:04.104 The last one, at a quick glance, 00:02:04.105 --> 00:02:05.471 we can just ignore it and say, 00:02:05.472 --> 00:02:06.476 "hey, that's not going to fly," 00:02:06.477 --> 00:02:07.999 we'll just ignore it. 00:02:08.000 --> 00:02:09.890 I won't go too much into details. 00:02:09.891 --> 00:02:11.519 That's just a brief summary. 00:02:11.520 --> 00:02:14.148 So now the ROI is the return on investment. 00:02:14.149 --> 00:02:17.599 So it says "how much of a return am I getting 00:02:17.600 --> 00:02:18.959 on the amount that I invested?" 00:02:18.960 --> 00:02:21.167 So let's say you put in $12,000, 00:02:21.168 --> 00:02:23.455 and at the end of the year, you cashflow $6,000. 00:02:23.456 --> 00:02:26.126 So if you calculate the ROI off of that, 00:02:26.127 --> 00:02:28.476 you get a 50% return on investment. 00:02:28.477 --> 00:02:30.085 In two years, you'll make your money back, 00:02:30.086 --> 00:02:31.733 which is pretty good. 00:02:31.734 --> 00:02:32.718 Then all the rest of the years, 00:02:32.719 --> 00:02:34.347 you'll just slowly be reaping in all that, 00:02:34.348 --> 00:02:36.639 all the excess cash flow. 00:02:36.640 --> 00:02:40.039 But yeah, that's it in a nutshell. 00:02:40.040 --> 00:02:42.269 So let me demo it real quick. 00:02:42.270 --> 00:02:44.258 So for example, I'm going to change the down payment, 00:02:44.259 --> 00:02:45.744 but I want you to pay attention 00:02:45.745 --> 00:02:48.213 to this column [down payment] 00:02:48.214 --> 00:02:49.839 and the monthly mortgage column. 00:02:49.840 --> 00:02:51.726 So right here [down payment] is $25,000, 00:02:51.727 --> 00:02:53.472 and here [monthly mortgage] is around $1,200, 00:02:53.473 --> 00:02:55.179 a little under $1,300. 00:02:55.180 --> 00:02:57.349 So what happens if I say, you know, 00:02:57.350 --> 00:02:58.795 what I'm going to change the down payment 00:02:58.796 --> 00:03:00.948 to 5% instead, because I just 00:03:00.949 --> 00:03:02.559 don't want to put 10. 00:03:02.560 --> 00:03:04.125 So let's just put say 5. 00:03:04.126 --> 00:03:06.274 Then I tab out of here, and voila - 00:03:06.275 --> 00:03:08.522 you see it updated to half of $25,000. 00:03:08.523 --> 00:03:09.946 So now it's $12,000, 00:03:09.947 --> 00:03:10.689 and this [monthly mortgage] went up 00:03:10.690 --> 00:03:12.233 over actually $1,300, 00:03:12.234 --> 00:03:14.783 and then this [1% rule] hasn't changed at all 00:03:14.784 --> 00:03:17.679 and the ROI is there. 00:03:17.680 --> 00:03:19.147 So one thing that I should mention is 00:03:19.148 --> 00:03:20.193 everything that I'm putting here 00:03:20.194 --> 00:03:21.279 is just example numbers, 00:03:21.280 --> 00:03:25.634 should not be taken into literal real estate advice. 00:03:25.635 --> 00:03:26.859 I just want to put that out there. 00:03:26.860 --> 00:03:28.367 These are just examples to show you 00:03:28.368 --> 00:03:30.519 how you can potentially make it on your own, 00:03:30.520 --> 00:03:32.239 do the formulas on your own. 00:03:32.240 --> 00:03:35.650 Alright, so another cool thing that I did was 00:03:35.651 --> 00:03:37.737 if there is no tenant income and I tab, 00:03:37.738 --> 00:03:40.048 it says "Enter Tenant Income". 00:03:40.049 --> 00:03:41.032 So if I don't put anything, 00:03:41.033 --> 00:03:42.399 it will automatically tell me, hey, 00:03:42.400 --> 00:03:44.919 I can't calculate without the tenant income. 00:03:44.920 --> 00:03:46.607 I can also do this right here [ROI field], 00:03:46.608 --> 00:03:48.475 say the same thing, Enter Tenant Income, 00:03:48.476 --> 00:03:50.563 but I just didn't put it for whatever reason, but 00:03:50.564 --> 00:03:53.812 after this video, you should be easily able to 00:03:53.813 --> 00:03:57.399 put it without much struggle. 00:03:57.400 --> 00:04:00.130 Alright, so if that's something you're interested in, 00:04:00.131 --> 00:04:02.239 then keep watching. 00:04:02.240 --> 00:04:05.239 So let's go over the basics first. 00:04:05.240 --> 00:04:07.399 So, how do we create a table? 00:04:07.400 --> 00:04:10.368 Well, we can do M-x org-table-create. 00:04:10.369 --> 00:04:14.301 If we run that it, will prompt us in a minibuffer. 00:04:14.302 --> 00:04:16.892 It says table size, columns times row. 00:04:16.893 --> 00:04:18.177 Usually it's rows times columns, 00:04:18.178 --> 00:04:19.502 but it is what it is. 00:04:19.602 --> 00:04:20.465 So let's just leave 00:04:20.466 --> 00:04:24.959 the default of 5 times 2, and voila, we get this. 00:04:24.960 --> 00:04:26.399 Beautiful. Awesome. 00:04:26.400 --> 00:04:29.510 So the other way is using the magical C-c C-c 00:04:29.511 --> 00:04:32.401 in Org Mode, which basically is context-aware 00:04:32.402 --> 00:04:36.053 and does anything, does the right thing like, 00:04:36.054 --> 00:04:38.599 almost 100% of the time, which is pretty amazing. 00:04:38.600 --> 00:04:42.431 Alright, let's just say I write a pipe, some words, 00:04:42.432 --> 00:04:44.679 and then another pipe, Gopar, and then 00:04:44.680 --> 00:04:47.268 another pipe. Let's just say we're trying to 00:04:47.269 --> 00:04:50.599 write it out via text, because in Org mode 00:04:50.600 --> 00:04:51.546 everything has text. 00:04:51.547 --> 00:04:53.379 There's nothing fancy about it. 00:04:53.380 --> 00:04:57.672 If I do C-c C-c, Org mode should automatically be 00:04:57.673 --> 00:04:59.839 context-aware that this area is a table. 00:04:59.840 --> 00:05:04.294 So, C-c C-c, boom. So if I press enter, another column. 00:05:04.295 --> 00:05:06.963 If I press tab, it should automatically move me. 00:05:06.964 --> 00:05:09.391 So yeah, so that's pretty much it. 00:05:09.392 --> 00:05:11.919 That's how you get started into the column. 00:05:11.920 --> 00:05:15.591 So, I'm assuming most of the people here already know that. 00:05:15.592 --> 00:05:17.959 This is just the primary basic review. 00:05:17.960 --> 00:05:19.807 So, let's first go... 00:05:19.808 --> 00:05:22.819 Let's go dive right into our first formula. 00:05:22.820 --> 00:05:24.766 So I copied some values over here, 00:05:24.767 --> 00:05:27.696 just to save time, and the columns. 00:05:27.697 --> 00:05:29.163 So, let's go ahead and say that 00:05:29.164 --> 00:05:30.749 we have single family house, 00:05:30.750 --> 00:05:33.018 and the price is a hundred thousand. 00:05:33.019 --> 00:05:34.163 And, Let's say that I want the price, 00:05:34.164 --> 00:05:36.431 the down payment that I want to put is 10%. 00:05:36.432 --> 00:05:40.527 Right. Alright. 10%. Now if I tab 00:05:40.528 --> 00:05:42.393 or go to the next column, nothing happens. 00:05:42.394 --> 00:05:43.879 Why is that? Well, it's because 00:05:43.880 --> 00:05:44.984 (you probably guessed it) 00:05:44.985 --> 00:05:47.755 we haven't written or tied any table formulas. 00:05:47.756 --> 00:05:49.563 So we're saying, alright, enough talk. 00:05:49.564 --> 00:05:50.440 How do we do that? 00:05:50.540 --> 00:05:52.093 Well, the answer is very simple. 00:05:52.094 --> 00:05:54.983 We do a pound sign (#), if I can find it. 00:05:54.984 --> 00:05:58.712 #+ and then we do TBL for table 00:05:58.713 --> 00:06:01.119 and then FM for formula. 00:06:01.120 --> 00:06:03.428 So, table formula, and the column. 00:06:03.429 --> 00:06:04.934 So this, you're already halfway 00:06:04.935 --> 00:06:07.063 to writing your first table formula. 00:06:07.064 --> 00:06:09.171 So let's say we want to automatically, 00:06:09.172 --> 00:06:10.978 Let's just, for exercise, 00:06:10.979 --> 00:06:13.189 we want to put the down payment, 00:06:13.190 --> 00:06:14.615 just put some type of value in there, 00:06:14.616 --> 00:06:16.382 just to make sure that it's working. 00:06:16.383 --> 00:06:20.992 So the way Org Mode refers to columns is, 00:06:20.993 --> 00:06:24.140 we start with the dollar sign ($) and then 00:06:24.141 --> 00:06:26.868 we put the number that the column is. 00:06:26.869 --> 00:06:29.113 Indexes start with one, not a zero. 00:06:29.114 --> 00:06:31.623 As most of us watching are programmers, 00:06:31.624 --> 00:06:33.792 we're probably used to starting with zero, 00:06:33.793 --> 00:06:34.959 but it starts with one. 00:06:34.960 --> 00:06:38.330 So one, two, three, four, five. 00:06:38.331 --> 00:06:39.654 So down payment is the fifth column, 00:06:39.655 --> 00:06:42.303 we say five, and then we say equal to, 00:06:42.304 --> 00:06:44.288 let's say Gopar. 00:06:44.289 --> 00:06:47.937 Then we do C-c C-c to evaluate it, 00:06:47.938 --> 00:06:50.545 and the table is automatically updated. 00:06:50.546 --> 00:06:50.857 Look at that. 00:06:50.957 --> 00:06:55.862 So when you do just this, dollar sign ($) 5, 00:06:55.863 --> 00:06:57.706 it updates every single column. 00:06:57.806 --> 00:07:00.679 There is a way to specify that this cell only and 00:07:00.680 --> 00:07:03.224 this cell only but this is out of scope and it's 00:07:03.324 --> 00:07:05.639 not that hard it's just not in this video. 00:07:05.640 --> 00:07:08.774 I would recommend, I commend you, or, actually 00:07:08.874 --> 00:07:12.999 I recommend that you go check out the manual for that. 00:07:13.000 --> 00:07:17.624 All right so, let's say we want to do some basic 00:07:17.724 --> 00:07:19.224 arithmetic we want to do some list values 00:07:19.324 --> 00:07:20.390 instead of just putting in text. 00:07:20.490 --> 00:07:21.440 So how do we do that? 00:07:21.540 --> 00:07:24.457 Well, we have to pull the expression that we want 00:07:24.557 --> 00:07:25.007 to put in. 00:07:25.107 --> 00:07:27.859 So, for example, if we want to add we'll do 20 plus 00:07:27.959 --> 00:07:31.357 20 and if we do C-c C-C to evaluate it, it should 00:07:31.457 --> 00:07:34.224 update every single column, the entire column, 00:07:34.324 --> 00:07:38.540 the fifth column I mean and, tada, it does. 00:07:38.640 --> 00:07:41.799 Cool! So now let's say we want to do a little bit 00:07:41.899 --> 00:07:42.556 more advanced. 00:07:42.656 --> 00:07:44.907 Let's say we want to add the previous column to 00:07:45.007 --> 00:07:47.007 this column, so how do we refer to this one? 00:07:47.107 --> 00:07:50.890 Well, 1-2-3-4 is the fourth column, so we would 00:07:50.990 --> 00:07:55.831 just simply do $4 and this should automatically 00:07:55.931 --> 00:07:58.057 be referring to this column (% DP). 00:07:58.157 --> 00:08:02.190 So we'll do 10 + 20, it's going to be 30 over here, 00:08:02.490 --> 00:08:04.174 and let's do C-C C-c. 00:08:04.274 --> 00:08:07.024 Ooh, error, what happened? 00:08:07.124 --> 00:08:08.874 Oh my god, oh my god. 00:08:08.974 --> 00:08:11.719 Well, this seems scary but no worries. 00:08:11.720 --> 00:08:14.077 This is where debugging comes in pretty handy, 00:08:14.078 --> 00:08:16.740 which is actually our next section as you can see. 00:08:16.940 --> 00:08:19.324 So, what happens if we do, if we go into the 00:08:19.424 --> 00:08:21.340 debugging section, what is the first step? 00:08:21.440 --> 00:08:24.790 Well, the first step is to try out, is to enable 00:08:24.890 --> 00:08:26.416 formula debugger. 00:08:26.516 --> 00:08:31.294 So, if you do C-c {, it will turn on a minor mode 00:08:31.394 --> 00:08:35.509 that whenever you evaluate a table formula, 00:08:35.510 --> 00:08:38.290 the debugger will be enabled, 00:08:38.291 --> 00:08:39.357 will automatically kick in. 00:08:39.457 --> 00:08:41.073 And if you want to disable the debugger, 00:08:41.074 --> 00:08:43.774 you just run the command again, and it will turn off. 00:08:43.874 --> 00:08:46.607 So, let's go ahead and run it. C-c {. 00:08:46.608 --> 00:08:48.790 As you can see in the mini buffer, it says, 00:08:48.791 --> 00:08:51.441 "formula debugging has been turned on". Awesome! 00:08:51.541 --> 00:08:53.157 So if we go back to our table 00:08:53.158 --> 00:08:58.400 and we try to run this, and see what's going on, we see... 00:08:58.500 --> 00:09:00.440 Oh, first off, before we look 00:09:00.441 --> 00:09:01.390 at the buffer that just opened, 00:09:01.391 --> 00:09:02.490 look at the mini buffer, 00:09:02.491 --> 00:09:04.974 it says "Debugging Formula. Continue to next?" 00:09:05.074 --> 00:09:07.874 So if you have multiple or a series of formulas, 00:09:07.974 --> 00:09:09.690 it will say, "hey, do you want to debug this one 00:09:09.691 --> 00:09:10.374 or the next one?" 00:09:10.474 --> 00:09:11.958 So this is just saying, "hey, do you want to go 00:09:12.058 --> 00:09:13.090 into the next formula?" 00:09:13.190 --> 00:09:14.990 And since there's no next formula, 00:09:14.991 --> 00:09:16.057 debugger will just exit out 00:09:16.058 --> 00:09:18.199 and leave you with the other buffer to see. 00:09:18.299 --> 00:09:19.949 For now, we'll just click no. 00:09:20.049 --> 00:09:22.590 Right now, it doesn't matter if you click yes or no 00:09:22.591 --> 00:09:23.540 because there's only one formula, 00:09:23.640 --> 00:09:26.072 but we'll just click no, and let's go ahead and 00:09:26.172 --> 00:09:27.657 pay attention to the new buffer. 00:09:27.757 --> 00:09:29.807 Well, over here it might seem a little confusing, 00:09:29.808 --> 00:09:32.390 but don't worry, we're just going to ignore most of this. 00:09:32.490 --> 00:09:33.890 The first thing that we're going to pay 00:09:33.990 --> 00:09:35.457 attention is to the original. 00:09:35.557 --> 00:09:38.067 So it says, okay, this is the original, so we have 00:09:38.167 --> 00:09:41.124 a quote expression, which is just trying to add the 00:09:41.324 --> 00:09:41.740 fourth column. 00:09:41.840 --> 00:09:42.840 And if we go over here 00:09:42.841 --> 00:09:44.207 once everything is finalized, 00:09:44.208 --> 00:09:47.107 it says "hey, we're trying to add this 10, 00:09:47.207 --> 00:09:50.240 but it's actually a string 10, and added to 20. 00:09:50.340 --> 00:09:52.325 So of course it's going to be an error, so now we 00:09:52.425 --> 00:09:53.999 know what the error is. 00:09:54.099 --> 00:09:56.090 So you're saying all right cool, awesome, now how 00:09:56.190 --> 00:09:58.840 do we transform that string into a number? 00:09:58.940 --> 00:10:02.607 Well, Org Mode formulas have these flags 00:10:02.608 --> 00:10:05.674 that you can use, and essentially a flag looks like this. 00:10:05.774 --> 00:10:10.257 It's a semicolon (;) followed by some letter 00:10:10.258 --> 00:10:13.270 or some identifier 00:10:13.370 --> 00:10:16.490 that will let Org mode know that hey, 00:10:16.590 --> 00:10:18.290 this should be turned into a number 00:10:18.291 --> 00:10:20.207 or this should be turned into whatever. 00:10:20.307 --> 00:10:22.724 There's different ones for alpha literal 00:10:22.725 --> 00:10:23.863 and for a bunch of... 00:10:23.963 --> 00:10:25.274 I think there's even "i" for "integer", 00:10:25.474 --> 00:10:26.819 so it depends what you want. 00:10:26.919 --> 00:10:28.202 So for now we're just going to put "number" 00:10:28.203 --> 00:10:29.490 because it's a real number. 00:10:29.590 --> 00:10:33.699 If we do this and the debugger is still on, 00:10:33.707 --> 00:10:35.274 (remember because it automatically 00:10:35.374 --> 00:10:36.374 stays on until we turn it off), 00:10:36.474 --> 00:10:41.540 if we reevaluate the the formula, 00:10:41.640 --> 00:10:43.624 we should be able to see it. 00:10:43.724 --> 00:10:47.379 But first, before I do that, let's check step two. 00:10:47.479 --> 00:10:52.240 I'll now rerun formulas with C-c * and table, 00:10:52.340 --> 00:10:54.639 which calls org-table-recalculate. 00:10:54.640 --> 00:10:58.507 To do this, you actually have to be inside the table. 00:10:58.607 --> 00:11:02.354 Otherwise, Org mode will try to do some other stuff 00:11:02.454 --> 00:11:04.325 because it is context-aware, so depending on 00:11:04.425 --> 00:11:06.324 the context it might do something else. 00:11:06.424 --> 00:11:09.124 So if we do C-c *... 00:11:09.224 --> 00:11:12.724 As you can see the debugger has kicked in, 00:11:12.824 --> 00:11:14.102 says, "Do you want to continue to next?" 00:11:14.202 --> 00:11:17.580 Let's press yes (y), and it has been applied. 00:11:17.680 --> 00:11:20.971 So as you can see, it only updated one column-- 00:11:21.071 --> 00:11:22.977 I'm sorry, one row--and the thing is, 00:11:23.077 --> 00:11:28.007 when you run this, the recalculate, it will only 00:11:28.107 --> 00:11:30.361 run for the current row that you're in. 00:11:30.461 --> 00:11:32.785 If you want to run for the entire table, 00:11:32.885 --> 00:11:36.240 you're going to do C-u C-c *. 00:11:36.340 --> 00:11:38.407 Before I do that, let me turn off the debugger 00:11:38.507 --> 00:11:40.807 since we no longer are in need of it. 00:11:40.907 --> 00:11:44.977 So C-c {, and debugging has been turned off. 00:11:45.077 --> 00:11:50.807 Now let me do C-u C-c * and as you can see 00:11:50.808 --> 00:11:54.320 the other rows also calculated, updated as well. 00:11:54.420 --> 00:11:54.924 Beautiful! 00:11:55.024 --> 00:11:58.507 So as I mentioned, feel free to look / browse the 00:11:58.607 --> 00:12:00.107 documentation for more flags 00:12:00.108 --> 00:12:02.640 because each flag has its own special meaning 00:12:02.641 --> 00:12:07.139 and will do different things, which is pretty cool. 00:12:07.140 --> 00:12:08.124 All right, cool. 00:12:08.224 --> 00:12:10.007 We're done with debugging and we fixed it. 00:12:10.107 --> 00:12:12.075 So there, now we know how to create formulas 00:12:12.076 --> 00:12:14.207 and how to debug them whenever they break, 00:12:14.307 --> 00:12:15.040 which is awesome. 00:12:15.140 --> 00:12:18.324 All right, but remember how I said that you can 00:12:18.424 --> 00:12:23.659 only debug... Whenever you run recalculate, 00:12:23.660 --> 00:12:25.340 It will only run the first formula? 00:12:25.440 --> 00:12:28.439 Well, let's say you want to have multiple formulas? 00:12:28.539 --> 00:12:30.807 This is completely valid, except the bad thing is 00:12:30.907 --> 00:12:34.090 that you have to do C-c C-c C-c on each each one, 00:12:34.190 --> 00:12:39.457 because C-u C-c * won't recalculate everything. 00:12:39.557 --> 00:12:40.350 It won't. 00:12:40.450 --> 00:12:41.557 Sadly, it doesn't do it. 00:12:41.657 --> 00:12:44.189 There is a way that you can do it, 00:12:44.289 --> 00:12:46.459 which is hacking together some elisp. 00:12:46.460 --> 00:12:47.474 You can probably find it 00:12:47.475 --> 00:12:48.707 or you can probably make it yourself 00:12:48.807 --> 00:12:51.107 if you look around, but that's out of scope for this. 00:12:51.207 --> 00:12:57.099 So now, how do we... We can write all the formulas 00:12:57.100 --> 00:12:59.007 we want in one single line. 00:12:59.107 --> 00:13:01.740 There's a way to to distinguish 00:13:01.741 --> 00:13:03.340 when one ends and one begins 00:13:03.341 --> 00:13:04.707 and that is the double colon (::). 00:13:04.807 --> 00:13:07.607 So right there, and a new formula will begin. 00:13:07.707 --> 00:13:08.374 So for example, 00:13:08.474 --> 00:13:12.224 let's say for the seventh column we say "gopar". 00:13:12.324 --> 00:13:17.407 If I do C-c C-c, it'll run every single thing 00:13:17.507 --> 00:13:19.226 so that... "gopar". Tada! 00:13:19.326 --> 00:13:20.624 There, awesome. 00:13:20.724 --> 00:13:22.440 But this is going to get very annoying if you're 00:13:22.540 --> 00:13:25.007 simply trying to edit formulas like this, right? 00:13:25.107 --> 00:13:26.933 So that's where the nicer debugging, 00:13:27.033 --> 00:13:28.790 nicer editing section comes in. 00:13:28.890 --> 00:13:32.299 So, yes, just like as mentioned, table calls 00:13:32.300 --> 00:13:33.507 only the first formula. 00:13:33.607 --> 00:13:36.349 So what's the step onto this nicer editing section? 00:13:36.449 --> 00:13:40.424 Try out "C-c ," or `org-edit-special`. 00:13:40.524 --> 00:13:44.557 So let's go back to the table formula and call it... 00:13:44.657 --> 00:13:47.590 oh my god, look at that, 00:13:47.690 --> 00:13:49.890 a new buffer just for editing, 00:13:49.990 --> 00:13:52.599 and each formula is in its own line to make 00:13:52.699 --> 00:13:54.624 it easier, which is beautiful! 00:13:54.724 --> 00:13:58.715 So, let's just say I want to do another calculation. 00:13:58.815 --> 00:14:02.607 Let's do eight times eight, which should be 64, 00:14:02.707 --> 00:14:04.740 and we have no need of putting this flag 00:14:04.741 --> 00:14:07.440 because the flag only affects it on the input coming in. 00:14:07.540 --> 00:14:09.074 I should have mentioned that earlier. 00:14:09.174 --> 00:14:10.774 Only input coming in. 00:14:10.874 --> 00:14:13.174 There is ways to affect the output, 00:14:13.274 --> 00:14:16.474 which we'll also cover in this topic later on, 00:14:16.574 --> 00:14:19.131 but for now, you can either leave the end flag 00:14:19.231 --> 00:14:21.990 or leave it out. It will still work fine. 00:14:21.991 --> 00:14:23.507 Let's just leave it out for now. 00:14:23.508 --> 00:14:26.624 Let's just do C-c C-c to make sure 00:14:26.625 --> 00:14:28.774 that everything is working. 00:14:28.874 --> 00:14:30.690 64. Beautiful. 00:14:30.790 --> 00:14:33.066 So there you have it. You can have multiple formulas 00:14:33.166 --> 00:14:34.778 just stacked up into one line, 00:14:34.878 --> 00:14:36.390 and whenever you need to edit it, 00:14:36.391 --> 00:14:38.257 just go into that into that line 00:14:38.357 --> 00:14:41.024 and "C-c ,", and tada! 00:14:41.124 --> 00:14:44.350 You have this ready, good to go, and for editing. 00:14:44.450 --> 00:14:45.824 Oh and if you want to exit out, 00:14:45.825 --> 00:14:48.940 also just do "C-c ," again and you're back. 00:14:49.040 --> 00:14:51.890 I did not mention that. Sweet! 00:14:51.990 --> 00:14:54.774 So now we know how to have 00:14:54.775 --> 00:14:57.006 a better editing experience. Sweet! 00:14:57.106 --> 00:15:00.240 So now comes the formatting section which I talked about. 00:15:00.340 --> 00:15:01.874 So what's the first step? 00:15:01.974 --> 00:15:05.507 Well for formatting, Org mode uses 00:15:05.508 --> 00:15:08.574 the printf function from C. 00:15:08.674 --> 00:15:10.374 So those who are familiar with C, 00:15:10.375 --> 00:15:12.823 you'll feel right at home because the way you format it 00:15:12.923 --> 00:15:13.940 is exactly the same way. 00:15:14.040 --> 00:15:16.557 So for example, this will print off 00:15:16.558 --> 00:15:18.873 a floating number with two decimal points. 00:15:18.973 --> 00:15:21.540 As you can see here, this is how you will use it. 00:15:21.640 --> 00:15:26.324 It will be after the semicolon and it will be "%.2f". 00:15:26.424 --> 00:15:28.157 So let's go ahead and test that out. 00:15:28.158 --> 00:15:30.590 Actually, let's go ahead to our latest function-- 00:15:30.690 --> 00:15:32.340 I mean, to our latest formula. 00:15:32.440 --> 00:15:33.840 Let's go ahead to the nicer buffer 00:15:33.841 --> 00:15:39.207 and let's do, Ctrl... Let's enter the semicolon, 00:15:39.208 --> 00:15:45.324 and then let's put the percent sign, we do 2f. 00:15:45.424 --> 00:15:49.174 Actually, let's make it five 00:15:49.175 --> 00:15:52.590 just to differentiate from the formula, and let's see. 00:15:52.690 --> 00:15:57.174 Let's run it, and tada! 00:15:57.274 --> 00:16:00.179 So yeah, as you can see, five decimal points. 00:16:00.180 --> 00:16:01.857 and if we want zero decimal points, we can also 00:16:01.957 --> 00:16:04.957 just move point zero, and tada! 00:16:05.057 --> 00:16:06.124 Just like that. 00:16:06.224 --> 00:16:08.774 We can also just leave it as is how it was before, 00:16:08.874 --> 00:16:10.874 because before, we didn't even actually need it, 00:16:10.875 --> 00:16:13.014 but yeah, just an example. 00:16:13.114 --> 00:16:15.090 And just a reminder, there are 00:16:15.091 --> 00:16:17.357 plenty more ways of formatting, 00:16:17.358 --> 00:16:19.640 just look at the documentation. 00:16:19.740 --> 00:16:21.724 There will be more. Basically every single thing 00:16:21.725 --> 00:16:25.574 that you need, just use the documentation as reference. 00:16:25.674 --> 00:16:28.340 Cool! So now we know how to debug, 00:16:28.341 --> 00:16:29.774 how to write formulas 00:16:29.775 --> 00:16:32.824 and how to get a better, nicer editing buffer 00:16:32.825 --> 00:16:35.124 for the formula so we don't have to do it all 00:16:35.125 --> 00:16:36.240 in a single line. 00:16:36.340 --> 00:16:38.657 So, what about conditional prompts, like I was 00:16:38.757 --> 00:16:43.390 showing in the first table in the end goal? 00:16:43.490 --> 00:16:47.299 Well that's actually pretty simple because we already 00:16:47.300 --> 00:16:48.324 know how to do this. 00:16:48.424 --> 00:16:51.133 Yes, if you think about it for a second, if we are 00:16:51.233 --> 00:16:54.221 able to pull lisp s-expressions, then we are able to 00:16:54.321 --> 00:16:56.290 basically do it already. Here's an example. 00:16:56.390 --> 00:17:01.807 We're saying if the second column is empty, is zero-- 00:17:01.907 --> 00:17:04.619 so actually, this should be with the N flag 00:17:04.620 --> 00:17:06.940 because we will transform empty values as zero, 00:17:07.040 --> 00:17:08.819 and that's how Org mode will read those. 00:17:08.820 --> 00:17:12.424 It's saying if the second flag is zero, 00:17:12.425 --> 00:17:16.952 then I want you to put "Enter the values." 00:17:17.052 --> 00:17:20.440 And if it's not empty, we're going to put 00:17:20.540 --> 00:17:22.190 "Values entered." We're going to recognize. 00:17:22.290 --> 00:17:24.240 So let's go ahead and actually do this. 00:17:24.540 --> 00:17:28.990 So let's grab this, and let's type it in. 00:17:29.090 --> 00:17:36.457 So let's go ahead. "Enter the values," because it 00:17:36.557 --> 00:17:37.390 doesn't have any. 00:17:37.490 --> 00:17:42.440 So let's go ahead and say "Hello EmacsConf" 00:17:42.441 --> 00:17:47.224 and let's go ahead and run it again. 00:17:47.324 --> 00:17:48.457 Since there are values, 00:17:48.458 --> 00:17:51.574 it's going to overwrite what's here and put value entered. 00:17:51.674 --> 00:17:53.398 So let's go ahead. 00:17:53.498 --> 00:17:55.690 Tada, so there you go. 00:17:55.790 --> 00:18:00.524 So that is pretty much how you do conditional props, 00:18:00.624 --> 00:18:01.940 which is pretty straightforward 00:18:01.941 --> 00:18:02.724 once you think about it 00:18:02.725 --> 00:18:05.440 because if you are able to insert Lisp expressions, 00:18:05.441 --> 00:18:08.240 then you are able to just do that check 00:18:08.241 --> 00:18:11.074 and do the conditional check yourself. 00:18:11.174 --> 00:18:13.540 So, custom formulas. 00:18:13.640 --> 00:18:15.324 Yeah, you'll see what I mean. 00:18:15.424 --> 00:18:19.924 We want to be able to put our own custom functions, 00:18:20.024 --> 00:18:23.890 and you probably have an idea how to do this already. 00:18:23.990 --> 00:18:27.059 Yes, we also know how to do this already. 00:18:27.060 --> 00:18:30.357 Before I continue, I'm going to say that I already 00:18:30.457 --> 00:18:31.940 have some formulas that I use 00:18:31.941 --> 00:18:33.374 which are not part of this talk 00:18:33.375 --> 00:18:37.390 because they're just functions that calculate some stuff. 00:18:37.490 --> 00:18:39.990 So for example, they calculate the monthly mortgage, 00:18:40.090 --> 00:18:43.257 the monthly PMI, property tax, homeowners insurance, 00:18:43.357 --> 00:18:44.757 so a bunch of other stuff. 00:18:44.857 --> 00:18:49.729 I have these functions already and they are a bit off, 00:18:49.829 --> 00:18:52.212 but for this example, they're doing everything. 00:18:52.312 --> 00:18:54.390 It's close enough, so don't worry too much. 00:18:54.490 --> 00:18:56.824 Just an example, you can have your own function 00:18:56.924 --> 00:18:59.213 that does something else like calculate 00:18:59.313 --> 00:19:01.540 a REI B rental or something like that. 00:19:01.640 --> 00:19:03.219 So you can do whatever you want. 00:19:03.220 --> 00:19:04.724 As long as you can call via Lisp, 00:19:04.824 --> 00:19:07.899 you can call it in Org mode, in the table formulas. 00:19:07.900 --> 00:19:11.337 So let's exit out of there. 00:19:11.437 --> 00:19:13.807 Now that we know how to do everything, 00:19:13.808 --> 00:19:20.924 let me go back to the original table and go from there. 00:19:21.024 --> 00:19:26.524 Let me close all these out actually. 00:19:26.624 --> 00:19:29.524 Now let's go back and revisit this table, 00:19:29.624 --> 00:19:31.619 since we'll be much, much more familiar 00:19:31.620 --> 00:19:35.418 except for one thing, which I will explain. 00:19:35.518 --> 00:19:38.040 So we have the constants right there 00:19:38.041 --> 00:19:39.690 and we have the house prices 00:19:39.691 --> 00:19:42.499 and we have everything just like I mentioned before. 00:19:42.500 --> 00:19:44.023 The main part that we want to look at 00:19:44.123 --> 00:19:45.024 is the table formula. 00:19:45.124 --> 00:19:47.474 So let's open up our special editing buffer, 00:19:47.574 --> 00:19:49.674 "C-c ,", 00:19:49.774 --> 00:19:52.390 and as you can see, I have some right here. 00:19:52.490 --> 00:19:53.524 So, the fifth column I'm saying, 00:19:53.624 --> 00:19:55.824 "Hey, we're gonna call this function 00:19:55.924 --> 00:19:58.557 rei-calculate-down-payment, and I'm gonna 00:19:58.657 --> 00:20:00.757 pass in the third column and fourth column 00:20:00.758 --> 00:20:02.339 and I'm going to pass in t." (true) 00:20:02.340 --> 00:20:05.874 I believe this is just to normalize, 00:20:07.174 --> 00:20:12.057 to convert to the proper decimal place, 00:20:12.157 --> 00:20:14.079 so let's not worry too much about that. 00:20:14.179 --> 00:20:16.690 Then for the sixth column, we're going to say 00:20:16.790 --> 00:20:18.045 "I calculate the monthly mortgage." 00:20:18.145 --> 00:20:20.124 We're going to pass in the third column 00:20:20.224 --> 00:20:21.339 the INTEREST_RATE, which we have 00:20:21.439 --> 00:20:22.979 defined over here in the constants. 00:20:22.980 --> 00:20:26.274 The 30, I believe this is for 30 years, 00:20:26.374 --> 00:20:29.323 PMI, the PROPERTY_TAX and HOME_INSURANCE, 00:20:29.423 --> 00:20:30.774 and then the fourth column. 00:20:30.874 --> 00:20:33.824 Then everything is going to be accepted as numbers, 00:20:33.924 --> 00:20:35.074 and we're going to have two decimals 00:20:35.174 --> 00:20:36.174 at the end of the place. 00:20:36.274 --> 00:20:37.507 So, what else? 00:20:37.607 --> 00:20:40.074 Over here is where we have our conditionals. 00:20:40.174 --> 00:20:42.274 We're saying, "hey, if the seventh column is 0, 00:20:42.374 --> 00:20:44.302 press 'Enter Tenant Income'." 00:20:44.402 --> 00:20:48.407 Over here as well, if the seventh column is zero, 00:20:48.507 --> 00:20:51.724 we're going to press 'Enter Tenant Income' 00:20:51.824 --> 00:20:53.605 and for this one we're going to say, 00:20:53.705 --> 00:20:55.940 "Hey, we're going to normalize the price." 00:20:56.040 --> 00:20:59.240 I believe this is a 1% rule. 00:20:59.340 --> 00:21:01.390 This could have been extracted into a function, 00:21:01.490 --> 00:21:03.939 but I just did the calculation right here. 00:21:04.239 --> 00:21:07.890 This, I believe, is the ROI, 12 months. 00:21:07.990 --> 00:21:11.007 This is just calculating the cash flow. 00:21:11.107 --> 00:21:14.907 This is a very rudimentary function or formula. 00:21:15.407 --> 00:21:16.732 Do not use this because there is way more 00:21:16.733 --> 00:21:18.840 to go into calculating the cash flow 00:21:18.841 --> 00:21:21.499 and also, it differs from person to person. 00:21:21.599 --> 00:21:23.774 Some people are more conservative, 00:21:23.874 --> 00:21:26.959 other people are way more liberal, so it just 00:21:26.960 --> 00:21:28.874 depends how you want to calculate it. 00:21:28.974 --> 00:21:34.240 As you can see, we have the N flag for numeric number 00:21:34.241 --> 00:21:36.090 and then we're saying we're formatting 00:21:36.190 --> 00:21:37.694 to one decimal place. 00:21:37.794 --> 00:21:43.207 The %% sign is just to input a percent sign as itself. 00:21:43.208 --> 00:21:45.419 Otherwise, Org mode is going to think 00:21:45.420 --> 00:21:47.940 it's some type of a formatter, which it's not. 00:21:48.040 --> 00:21:49.140 If you do... As I mentioned, 00:21:49.240 --> 00:21:51.690 if you've used the printf function in C or C++, 00:21:51.790 --> 00:21:55.507 then you probably know how to use it. 00:21:55.607 --> 00:22:01.824 Okay, so this is pretty much everything in a nutshell. 00:22:01.924 --> 00:22:04.970 So, one thing that I do want to say 00:22:05.070 --> 00:22:06.379 is the last section, 00:22:06.479 --> 00:22:07.774 which is automatically updating, 00:22:07.874 --> 00:22:10.174 which is the part that blew my mind 00:22:10.175 --> 00:22:11.457 when I realized that Org Mode can do this. 00:22:11.557 --> 00:22:12.477 So how do we do it? 00:22:12.577 --> 00:22:14.659 Well, you probably guessed just from looking at 00:22:14.660 --> 00:22:18.324 at the first table that we have right now. 00:22:18.424 --> 00:22:20.774 We add a column at the beginning 00:22:20.874 --> 00:22:22.857 of the table with a percent (%)-- 00:22:22.957 --> 00:22:24.857 I'm sorry, with the pound sign (#) 00:22:24.957 --> 00:22:28.457 or hashtag as the younger kids call it. 00:22:28.557 --> 00:22:31.045 So this is what we do. 00:22:31.145 --> 00:22:32.819 We added a column at the beginning of the 00:22:32.820 --> 00:22:34.984 table, we do pound sign (#). 00:22:35.084 --> 00:22:35.790 So this is what it's for. 00:22:35.890 --> 00:22:38.839 This lets Org mode know that "hey, 00:22:38.840 --> 00:22:41.140 I want the values, the table formulas, 00:22:41.240 --> 00:22:43.957 to automatically run on each tab change." 00:22:44.057 --> 00:22:46.240 Now I believe that you can make it so that 00:22:46.340 --> 00:22:49.123 it changes, so that it updates on every keystroke. 00:22:49.223 --> 00:22:51.024 I think that's too much. 00:22:51.124 --> 00:22:53.007 And then you can also make it so that 00:22:53.107 --> 00:22:56.019 only certain rows update or certain columns. 00:22:56.020 --> 00:22:58.219 There's a plethora of things that you can do. 00:22:58.319 --> 00:23:00.924 You should definitely read up on the documentation, 00:23:01.024 --> 00:23:03.425 because you will probably make a way better talk, 00:23:03.525 --> 00:23:06.974 a way more advanced talk than I on this one, 00:23:07.074 --> 00:23:09.574 so I'm looking forward for that. 00:23:09.674 --> 00:23:12.459 But this is essentially how you build 00:23:12.460 --> 00:23:15.507 a Org mode table formula that will help you know 00:23:15.508 --> 00:23:17.125 if a property is correct. 00:23:17.225 --> 00:23:22.340 So, let's go ahead and as a final out to this demo, 00:23:22.440 --> 00:23:25.419 let's go ahead and enter a new column. 00:23:25.420 --> 00:23:30.174 Org-mode automatically puts the pound sign (#), 00:23:30.274 --> 00:23:35.440 which is awesome, and let's just say 'Emacs House', 00:23:35.540 --> 00:23:39.590 and let's say it is 100k. 00:23:39.690 --> 00:23:44.339 So 100k, and as you can see it's already trying to 00:23:44.340 --> 00:23:46.040 calculate the monthly mortgage, 00:23:46.140 --> 00:23:47.090 but we'll see about that, 00:23:47.190 --> 00:23:49.879 and let's just put 10% down. 00:23:49.880 --> 00:23:53.057 So 10% of 100k should be 10,000. 00:23:53.157 --> 00:23:56.407 So 10,000, correct, and the monthly mortgage is that 00:23:56.408 --> 00:24:00.090 and let's just say the tenant income is, 00:24:00.190 --> 00:24:01.657 as you can see right here, 00:24:01.757 --> 00:24:05.874 tenant income is, let's say 1500. 00:24:05.974 --> 00:24:07.274 Is it passing the 1% rule? 00:24:07.374 --> 00:24:09.424 Yep! What's my ROI? 00:24:09.524 --> 00:24:13.879 118%, which is kind of cool actually. 00:24:13.880 --> 00:24:14.707 That's a nice deal. 00:24:14.907 --> 00:24:17.657 So this is a rudimentary way of 00:24:17.757 --> 00:24:20.319 calculating deals in Org mode. 00:24:20.419 --> 00:24:44.380 I hope you found it interesting, and yeah, that is it.