Back on-line!
Feb. 28, 2023

Episode 3: Cloudflare Workers and Breaking 11ty

Episode 3: Cloudflare Workers and Breaking 11ty

Episode 3: Cloudflare Workers and Breaking 11ty

The player is loading ...
Ok, What Went Wrong?

Cloudflare Workers and Breaking 11ty

Transcript
1 00:00:00,000 --> 00:00:02,580 (upbeat music) 2 00:00:02,580 --> 00:00:14,460 - Hello, welcome to Okay, What Went Wrong? 3 00:00:14,460 --> 00:00:15,340 Episode three. 4 00:00:15,340 --> 00:00:19,840 As always, I'm Michael Sean Becker and joining me 5 00:00:19,840 --> 00:00:22,160 - Is Zane Becker-Byrd, how's your day been today? 6 00:00:22,160 --> 00:00:23,440 - It has been a day. 7 00:00:23,440 --> 00:00:24,280 It's been a good day. 8 00:00:24,280 --> 00:00:25,100 How have you been? 9 00:00:25,100 --> 00:00:26,780 - That is fair. 10 00:00:26,780 --> 00:00:28,980 - No, it's been good. 11 00:00:28,980 --> 00:00:29,820 It's been good. 12 00:00:29,820 --> 00:00:31,820 Honestly, we'll get into this a little bit. 13 00:00:31,820 --> 00:00:35,980 A lot of Cloudflare and GitHub actions in the day job, 14 00:00:35,980 --> 00:00:37,620 which we'll talk about. 15 00:00:37,620 --> 00:00:40,420 I also have been dealing with a lot of Git stuff, 16 00:00:40,420 --> 00:00:43,180 not GitHub specific, but just Git in general. 17 00:00:43,180 --> 00:00:47,140 Yeah, I love that as a creative writing major, 18 00:00:47,140 --> 00:00:48,140 you're having the exact same problems 19 00:00:48,140 --> 00:00:49,820 I'm having at my tech job. 20 00:00:49,820 --> 00:00:51,260 It's just fantastic to me. 21 00:00:51,260 --> 00:00:53,180 Yeah, well, I mean, I don't use Dropbox, 22 00:00:53,180 --> 00:00:55,420 so I sync all of my projects through GitHub 23 00:00:55,420 --> 00:00:57,660 because that's what I decided I was gonna be doing 24 00:00:57,660 --> 00:00:58,500 in high school. 25 00:00:58,500 --> 00:01:00,180 choices were made. 26 00:01:00,180 --> 00:01:01,780 - Yeah, they're good choices. 27 00:01:01,780 --> 00:01:06,780 Now I don't have to worry about Google Drive Edit history. 28 00:01:06,780 --> 00:01:07,820 - Yeah. 29 00:01:07,820 --> 00:01:08,660 - Obsolete. 30 00:01:08,660 --> 00:01:11,360 We're using version control software here. 31 00:01:11,360 --> 00:01:13,780 It's going great though. 32 00:01:13,780 --> 00:01:15,500 - Good. 33 00:01:15,500 --> 00:01:16,340 - All right. 34 00:01:16,340 --> 00:01:17,580 - So you mentioned Cloud Fair Workers. 35 00:01:17,580 --> 00:01:21,540 What's the situation with that? 36 00:01:21,540 --> 00:01:23,460 - Oh yeah, no, I can kick us off this week. 37 00:01:23,460 --> 00:01:27,700 So at my day job, we are in the process of, 38 00:01:27,700 --> 00:01:33,560 We have a Gatsby cloud app that we're in the process of working on our next hosting situation. 39 00:01:33,560 --> 00:01:39,480 One of the problems with switching hosts is Gatsby cloud, well, Gatsby generates a redirect 40 00:01:39,480 --> 00:01:46,080 file that redirect file has all of our, all of our like, we call them vanity URLs where 41 00:01:46,080 --> 00:01:55,260 the, it's a short link and then redirects to UTMs. 42 00:01:55,260 --> 00:02:02,580 But one of the things that we are needing to work through is getting those vanity URLs 43 00:02:02,580 --> 00:02:07,560 pointed because there's a cap inside Cloudflare pages on how many they'll take. 44 00:02:07,560 --> 00:02:10,960 They'll take like 2,000 and we have like 42,000. 45 00:02:10,960 --> 00:02:13,140 So there's a big discrepancy there. 46 00:02:13,140 --> 00:02:19,420 So what the current plan is, is to use KV store, which is a key value store inside of 47 00:02:19,420 --> 00:02:22,780 of Cloudflare pages, Cloudflare workers, excuse me, 48 00:02:22,780 --> 00:02:25,900 that will then do a lookup before it even gets 49 00:02:25,900 --> 00:02:26,740 to the website. 50 00:02:26,740 --> 00:02:27,920 There's two things that this is gonna accomplish. 51 00:02:27,920 --> 00:02:30,580 One, it's going to pull out all of our redirects 52 00:02:30,580 --> 00:02:31,420 from the site. 53 00:02:31,420 --> 00:02:36,420 So if like 42,000 line file that we're no longer 54 00:02:36,420 --> 00:02:38,080 gonna have to generate when we're doing 55 00:02:38,080 --> 00:02:39,580 a static site generation. 56 00:02:39,580 --> 00:02:42,700 So that's gonna cut down on build time. 57 00:02:42,700 --> 00:02:44,740 But the other thing it's gonna do is it's going to allow us 58 00:02:44,740 --> 00:02:47,860 to not have to rebuild the site if somebody updates 59 00:02:47,860 --> 00:02:49,140 one of these redirects. 60 00:02:49,140 --> 00:02:52,760 So there's a lot of positive things that come out of this, but I've never used 61 00:02:52,760 --> 00:02:56,100 CloudFlare workers before, so I'm having to learn how to do this. 62 00:02:56,100 --> 00:03:00,600 And on Friday, one of my coworkers, um, and I kind of like slammed our head 63 00:03:00,600 --> 00:03:03,720 against a wall, trying to get a local environment set up because you're 64 00:03:03,720 --> 00:03:09,040 talking about functions that exist on the edge, like out at a serverless instant 65 00:03:09,040 --> 00:03:13,180 instance, and serverless is basically just somebody else's computer that 66 00:03:13,180 --> 00:03:14,780 you don't control any of the pieces of. 67 00:03:14,780 --> 00:03:16,680 Yeah. 68 00:03:16,680 --> 00:03:17,240 And yeah, 69 00:03:17,240 --> 00:03:19,520 It's not that there's no server, it's just not your server. 70 00:03:19,520 --> 00:03:19,960 Correct. 71 00:03:19,960 --> 00:03:20,160 Yeah. 72 00:03:20,160 --> 00:03:25,480 You're, you're basically just renting almost, uh, what you use time. 73 00:03:25,480 --> 00:03:29,520 And, but getting a local environment set up for that when like the 74 00:03:29,520 --> 00:03:32,720 runtime doesn't matter and like how it's containerized doesn't matter. 75 00:03:32,720 --> 00:03:33,920 It's just the function. 76 00:03:33,920 --> 00:03:38,120 And especially when it's based on a trigger where it's like, go to the 77 00:03:38,120 --> 00:03:41,480 website, do this thing, figuring out how to make that work. 78 00:03:41,480 --> 00:03:42,880 And our read me was a little bit out of date. 79 00:03:42,880 --> 00:03:46,080 So it just took a little bit of time to kind of like sort through that. 80 00:03:46,520 --> 00:03:49,860 And once we got that done, once he got that done, 81 00:03:49,860 --> 00:03:53,200 I completely benefited from all the work that he did. 82 00:03:53,200 --> 00:03:54,360 We now have a local environment. 83 00:03:54,360 --> 00:03:55,680 So I can start this process. 84 00:03:55,680 --> 00:03:57,300 But one of the things that we're having to do 85 00:03:57,300 --> 00:04:02,100 is I'm manually having to update this one file right now. 86 00:04:02,100 --> 00:04:04,040 Because one of the problems that you have in Gatsby 87 00:04:04,040 --> 00:04:08,900 is if you have a query parameter on a string, on a URL, 88 00:04:08,900 --> 00:04:11,640 and you redirect, it will do one of two things. 89 00:04:11,640 --> 00:04:13,720 It will see the query parameter 90 00:04:13,720 --> 00:04:16,340 and do just take you to that query parameter 91 00:04:16,340 --> 00:04:20,300 and not actually execute the additional query parameter redirect, or it just won't work. 92 00:04:20,300 --> 00:04:27,500 So like an Instagram where a lot of social media stuff happens, tax on this 93 00:04:27,500 --> 00:04:34,220 thing called FBC ID, which is a Facebook click ID that breaks our redirects. 94 00:04:34,220 --> 00:04:36,020 And we discovered that back like in November. 95 00:04:36,020 --> 00:04:38,460 So we're still just trying to unwind all of this stuff. 96 00:04:38,460 --> 00:04:41,420 And the cloud filler worker is the right way to go about doing this. 97 00:04:41,500 --> 00:04:46,680 And the other thing is it opens up so many new ways that you can work with static 98 00:04:46,680 --> 00:04:50,380 sites, because I'm not sure if you've looked into Cloudflow workers yet. 99 00:04:50,380 --> 00:04:53,800 I have, I don't understand it. 100 00:04:53,800 --> 00:04:55,920 This is perfect. 101 00:04:55,920 --> 00:04:59,440 Cause like I did not understand it either, but basically if you think of it this way, 102 00:04:59,440 --> 00:05:04,780 it is a function that runs off of triggers on your website. 103 00:05:04,780 --> 00:05:06,640 That can be a number of things. 104 00:05:06,640 --> 00:05:09,840 You can call it directly as if you were calling an API endpoint. 105 00:05:09,840 --> 00:05:11,020 They call those web hooks. 106 00:05:11,020 --> 00:05:15,120 You can set it up so it triggers off of an event. 107 00:05:15,120 --> 00:05:19,360 Like I go to a URL, it fires this function and then basically you get that, 108 00:05:19,360 --> 00:05:21,600 of that event fed into the function. 109 00:05:21,600 --> 00:05:23,120 And then you can do things based on that. 110 00:05:23,120 --> 00:05:26,400 So you can basically do a comparison being like, if this string exists, 111 00:05:26,400 --> 00:05:27,960 then do this thing. 112 00:05:27,960 --> 00:05:32,080 We just set up the microbin and in the same way that that now has 113 00:05:32,080 --> 00:05:35,340 redirects on short codes, you basically can set that up in a key value 114 00:05:35,340 --> 00:05:36,760 store inside of cloud flare. 115 00:05:36,760 --> 00:05:40,540 And at the free tier, you can do a lot with it. 116 00:05:40,540 --> 00:05:41,540 Yes. 117 00:05:41,540 --> 00:05:47,780 So, if you think about those functions in terms of, you know when, like you're taking 118 00:05:47,780 --> 00:05:51,300 computer science, a function is called by something. 119 00:05:51,300 --> 00:05:52,740 Yeah, yeah. 120 00:05:52,740 --> 00:06:01,060 So the thing that is calling the function is either a web event, a trigger on a URL, 121 00:06:01,060 --> 00:06:02,900 or a, well, actually it's the same. 122 00:06:02,900 --> 00:06:06,740 It's just that the routing to that URL is directly to the function and then does not 123 00:06:06,740 --> 00:06:08,460 return a web page. 124 00:06:08,460 --> 00:06:11,980 But Cloudflare workers can actually step in as you're rendering a page. 125 00:06:11,980 --> 00:06:14,980 So let's say zane beckerberg.com, your website. 126 00:06:14,980 --> 00:06:19,820 You write a Cloudflare worker that goes, if you're coming from the UK, like if your geolocation 127 00:06:19,820 --> 00:06:25,820 is the UK, redirect to this other, or like in Cloudflare workers, you can actually say, 128 00:06:25,820 --> 00:06:30,500 okay, go get this HTML snippet out of the key value store and stick it in the header 129 00:06:30,500 --> 00:06:32,320 of the website. 130 00:06:32,320 --> 00:06:37,560 So you can, from a static site perspective, you can alter what you are sending to the 131 00:06:37,560 --> 00:06:42,880 browser without actually having to run a server because you are using Cloudflare's infrastructure 132 00:06:42,880 --> 00:06:47,800 to do so. 133 00:06:47,800 --> 00:06:50,600 So it's just programming? 134 00:06:50,600 --> 00:06:51,600 It is. 135 00:06:51,600 --> 00:06:52,600 It is. 136 00:06:52,600 --> 00:06:55,320 It's just your writing functions and the calling functions. 137 00:06:55,320 --> 00:06:58,400 Well, that's what this all basically boils down to. 138 00:06:58,400 --> 00:07:03,600 But if you take the, if you think about a computer or like your phone and it has a runtime 139 00:07:03,600 --> 00:07:09,240 and it like software operates in it, I've felt this way for a long time, but the web 140 00:07:09,240 --> 00:07:11,300 is a platform in and of itself. 141 00:07:11,300 --> 00:07:12,300 Yes. 142 00:07:12,300 --> 00:07:18,000 The way we trigger functions is by calling URLs and functions will either return a human 143 00:07:18,000 --> 00:07:23,920 readable website or machine readable objects or like a combination of two, like a Jason 144 00:07:23,920 --> 00:07:29,920 object is kind of human readable, but it's really designed for consumption by a machine. 145 00:07:29,920 --> 00:07:31,960 It's not in binary. 146 00:07:31,960 --> 00:07:35,160 As a noted human, I would beg to differ on the JSON thing. 147 00:07:35,160 --> 00:07:36,160 That's fair. 148 00:07:36,160 --> 00:07:37,160 That's fair. 149 00:07:37,160 --> 00:07:38,160 XML is human readable. 150 00:07:38,160 --> 00:07:39,160 JSON is terrifying. 151 00:07:39,160 --> 00:07:40,160 Yes. 152 00:07:40,160 --> 00:07:41,160 JSON is just... 153 00:07:41,160 --> 00:07:47,880 I think this is someone who works with JSON files quite a bit in my spare time, trying 154 00:07:47,880 --> 00:07:50,360 to get everything into XML. 155 00:07:50,360 --> 00:07:51,360 Yeah. 156 00:07:51,360 --> 00:07:53,040 If you think about the way all of those applications 157 00:07:53,040 --> 00:07:56,100 and functions work, all they are doing is calling. 158 00:07:56,100 --> 00:08:00,940 So the web is just the transport mechanism to do that. 159 00:08:00,940 --> 00:08:05,160 And the activator is these universal resource locator. 160 00:08:05,160 --> 00:08:09,180 You are literally locating a resource on the internet 161 00:08:09,180 --> 00:08:11,160 that you're asking for a response from 162 00:08:11,160 --> 00:08:14,000 by passing it parameters, which is just a function. 163 00:08:19,840 --> 00:08:21,200 - Yeah, the way you're describing it 164 00:08:21,200 --> 00:08:23,240 sounds very intuitive. 165 00:08:23,240 --> 00:08:25,080 - If you break it down and don't think about it 166 00:08:25,080 --> 00:08:26,920 in terms of web pages, 167 00:08:26,920 --> 00:08:29,440 you start to wrap your head around it in a different way. 168 00:08:29,440 --> 00:08:32,400 And that's when phone development makes more sense, 169 00:08:32,400 --> 00:08:35,620 because all phones are doing is they're fetching data 170 00:08:35,620 --> 00:08:38,760 from an external endpoint that then does a bunch of stuff 171 00:08:38,760 --> 00:08:42,800 and returns formatted data that the client on your end 172 00:08:42,800 --> 00:08:45,240 then takes and sticks into fields. 173 00:08:45,240 --> 00:08:47,400 That's it, that's all these things are doing. 174 00:08:48,560 --> 00:08:51,060 All of this hubbub, all the billions of dollars 175 00:08:51,060 --> 00:08:53,020 is like text into form fields. 176 00:08:53,020 --> 00:08:54,460 That's it, that's all it is. 177 00:08:54,460 --> 00:09:00,540 - I guess probably a good thing to ask is like, 178 00:09:00,540 --> 00:09:03,380 so how do you write the functions for Cloudflare? 179 00:09:03,380 --> 00:09:05,860 I guess probably a good starting point would be like, 180 00:09:05,860 --> 00:09:07,500 what language do you need to know? 181 00:09:07,500 --> 00:09:10,180 - You're about to love the answer here. 182 00:09:10,180 --> 00:09:12,260 There's two languages it supports. 183 00:09:12,260 --> 00:09:13,300 Guess the first one. 184 00:09:13,300 --> 00:09:15,420 - JavaScript. - That's correct. 185 00:09:15,420 --> 00:09:16,560 Guess the second one. 186 00:09:17,980 --> 00:09:18,820 - Yeah, that's true. 187 00:09:18,820 --> 00:09:20,320 - I'm just making sure that that's true. 188 00:09:20,320 --> 00:09:21,820 I'm pretty sure that's true. 189 00:09:21,820 --> 00:09:24,140 Yeah, native Rust support on Cloudflare workers, 190 00:09:24,140 --> 00:09:26,380 phew, I am saying from that. 191 00:09:26,380 --> 00:09:27,540 - That's really cool. 192 00:09:27,540 --> 00:09:29,460 - Yeah, so if you ever wanna, 193 00:09:29,460 --> 00:09:32,820 if someone wants to back door Rust into their infrastructure, 194 00:09:32,820 --> 00:09:33,660 Cloudflare workers, 195 00:09:33,660 --> 00:09:35,140 you can go to the Cloudflare workers 196 00:09:35,140 --> 00:09:36,980 and you can go to the Cloudflare workers. 197 00:09:36,980 --> 00:09:38,980 - Yeah, and then you can go to the Cloudflare workers. 198 00:09:38,980 --> 00:09:40,980 - Yeah, and then you can go to the Cloudflare workers. 199 00:09:40,980 --> 00:09:42,980 - Yeah, and then you can go to the Cloudflare workers. 200 00:09:42,980 --> 00:09:44,980 - Yeah, and then you can go to the Cloudflare workers. 201 00:09:44,980 --> 00:09:46,980 - Yeah, and then you can go to the Cloudflare workers. 202 00:09:46,980 --> 00:09:49,660 infrastructure, Cloudflare workers, because no one will know what they're doing. 203 00:09:49,660 --> 00:09:54,020 Um, it is one of the, one of the issues in looking at like software 204 00:09:54,020 --> 00:09:57,740 development and trying to figure out, okay, how do we architect this so that 205 00:09:57,740 --> 00:10:02,500 we can expand and we have an understanding of exactly what our systems look like. 206 00:10:02,500 --> 00:10:06,260 The only issue with Cloudflare workers is they kind of exist outside of your 207 00:10:06,260 --> 00:10:08,420 system where they can, if you're not careful about it. 208 00:10:08,420 --> 00:10:08,700 It's. 209 00:10:08,700 --> 00:10:12,420 It's like kind of a black box. 210 00:10:12,460 --> 00:10:17,460 It's not like a pure black box, but it's like a gray box. 211 00:10:17,460 --> 00:10:18,220 It's it. 212 00:10:18,220 --> 00:10:20,700 And the thing is, it's not intuitive to know that it's there, 213 00:10:20,700 --> 00:10:23,100 especially when it steps in on other requests. 214 00:10:23,100 --> 00:10:28,200 This is where like marketing scripts, a Google tag manager. 215 00:10:28,200 --> 00:10:29,900 I don't know if you're familiar with these at all. 216 00:10:29,900 --> 00:10:33,780 Basically what they do is they are systems that set up to inject. 217 00:10:33,780 --> 00:10:37,900 JavaScript into your website from third parties. 218 00:10:37,900 --> 00:10:39,420 Sounds great. 219 00:10:40,140 --> 00:10:44,780 The problem is you are injecting JavaScript from other companies on your website that 220 00:10:44,780 --> 00:10:45,780 you don't have control over. 221 00:10:45,780 --> 00:10:46,420 Yeah. 222 00:10:46,420 --> 00:10:51,100 Typically when someone says the phrase is web development and injection, you're 223 00:10:51,100 --> 00:10:54,580 talking about a security vulnerability or a SQL bug. 224 00:10:54,580 --> 00:10:57,700 That is, as you get more into the internet, you will discover that most of what we 225 00:10:57,700 --> 00:11:01,180 built on top of were bugs in the system that we exploited without question. 226 00:11:01,180 --> 00:11:03,700 And JavaScript. 227 00:11:03,700 --> 00:11:07,900 And also, I mean, I was just lumping JavaScript in security vulnerability that 228 00:11:07,900 --> 00:11:09,940 we did not intend for it to be the way that it was. 229 00:11:09,940 --> 00:11:15,320 But yeah, but the thing about Cloudflare workers that you have to be careful of is like, let's 230 00:11:15,320 --> 00:11:20,220 say yours and mine sites that we're working on, which we're going to talk about in a minute. 231 00:11:20,220 --> 00:11:26,100 The idea that you have a common guys, that's a tease. 232 00:11:26,100 --> 00:11:31,900 The way that static site generation works, you can create those pages and then intercept 233 00:11:31,900 --> 00:11:33,420 those calls and add things. 234 00:11:33,420 --> 00:11:38,260 So if you take like our podcast feed, for example, let's say we did not add the value 235 00:11:38,260 --> 00:11:41,200 block at time of publish. 236 00:11:41,200 --> 00:11:44,740 What you could do is set up a Cloudflare worker, and this is actually the way the podcast index 237 00:11:44,740 --> 00:11:45,740 works. 238 00:11:45,740 --> 00:11:53,020 It steps in before it delivers that RSS feed to a client and injects code into it to be 239 00:11:53,020 --> 00:11:57,300 like, "Oh, here's the value block that was not included." 240 00:11:57,300 --> 00:12:01,380 So it allows you to do dynamic things on static files. 241 00:12:01,380 --> 00:12:02,380 Yeah. 242 00:12:02,380 --> 00:12:10,580 See, I'm the type of person who at that point I would probably just spring for a server. 243 00:12:10,580 --> 00:12:14,420 Because I don't know if that's just because I'm what I'm used to or... 244 00:12:14,420 --> 00:12:18,940 Yeah, and I mean, you and I are in an interesting situation where we have built out our own 245 00:12:18,940 --> 00:12:24,180 infrastructure be it our home lab of Raspberry Pi clouds that has Docker on it so we can 246 00:12:24,180 --> 00:12:25,920 deploy pretty much anything. 247 00:12:25,920 --> 00:12:29,940 We have the Oracle Cloud instance that we can have Docker on and we can basically deploy 248 00:12:29,940 --> 00:12:30,940 anything. 249 00:12:30,940 --> 00:12:33,520 like low cost or free instances. 250 00:12:33,520 --> 00:12:36,540 One of the things that we're talking about at work is the 251 00:12:36,540 --> 00:12:42,540 idea that when you have a large website managing that and not 252 00:12:42,540 --> 00:12:46,460 having to have the infrastructure to support, it is much easier to 253 00:12:46,460 --> 00:12:50,060 create a JavaScript HTML CSS page and cash the crap out of it at 254 00:12:50,060 --> 00:12:54,620 the edge on cloud flare than it is to run a load balanced stat, 255 00:12:54,620 --> 00:12:56,740 a server generated page server. 256 00:12:56,740 --> 00:13:00,340 There's so many more issue vectors that you can have. 257 00:13:00,820 --> 00:13:04,620 beyond just like, yes, there are with JavaScript, but like you're, you're now 258 00:13:04,620 --> 00:13:06,940 introducing another layer of complexity. 259 00:13:06,940 --> 00:13:10,860 So it's, it's separations of concerns and layer of complexities and how you 260 00:13:10,860 --> 00:13:15,340 break those into smaller chunks so that they are easily maintained and 261 00:13:15,340 --> 00:13:16,420 supportable on the call. 262 00:13:16,420 --> 00:13:17,740 Yeah. 263 00:13:17,740 --> 00:13:22,740 I think, I think probably what it comes down to with a lot of this type of stuff. 264 00:13:22,740 --> 00:13:27,580 Uh, Cloud for workers, static site versus dynamic. 265 00:13:27,580 --> 00:13:30,460 It's how complex you want to be able to do something. 266 00:13:30,460 --> 00:13:31,980 Mm hmm. 267 00:13:31,980 --> 00:13:36,140 Because if you want like an entire if you want an entirely dynamic site, 268 00:13:36,140 --> 00:13:42,260 static sites aren't good for you, which which sounds really obvious. Right. 269 00:13:42,260 --> 00:13:47,740 But but of course, like the complexity comes at the 270 00:13:47,740 --> 00:13:50,060 in between those two. 271 00:13:50,060 --> 00:13:54,620 Yeah, like complexity allows for you're able to do more things, 272 00:13:54,620 --> 00:13:55,780 but then you have to support that. 273 00:13:55,780 --> 00:13:58,380 And that's that's the trade. Yeah. 274 00:13:58,380 --> 00:14:01,500 Complexity is great if you want to be complex. 275 00:14:01,500 --> 00:14:03,100 Correct. It. 276 00:14:03,100 --> 00:14:05,020 However, it is more complex. 277 00:14:05,020 --> 00:14:08,640 So you have to do you have to support that complexity. Mm hmm. Yeah. 278 00:14:08,640 --> 00:14:13,180 Basically, we're just saying the same thing over and over again. 279 00:14:13,180 --> 00:14:16,640 You can you can tell it's late. 280 00:14:16,640 --> 00:14:19,980 Before we move on to the next section, I do want to kind of put out there. 281 00:14:19,980 --> 00:14:22,180 I think one of the things I'd like to see us start doing 282 00:14:22,180 --> 00:14:24,940 is doing some promotion for the show specifically. 283 00:14:25,840 --> 00:14:31,280 Yes. I found a couple of products that allow us to take clips and have like text and then 284 00:14:31,280 --> 00:14:35,800 it will do an audio waveform so that we can post those to Instagram. I know we are both 285 00:14:35,800 --> 00:14:39,680 very much Fedverse, open source, all that stuff. I want to leverage. 286 00:14:39,680 --> 00:14:43,360 I think I still have an Instagram account. What I want to do is kind of leverage that 287 00:14:43,360 --> 00:14:48,320 and see what we can do. Because this is a value for value podcast. I want people to 288 00:14:48,320 --> 00:14:53,080 be getting things from the information we're talking about. I have sent this to a couple 289 00:14:53,080 --> 00:14:54,240 people and they're like, wow, that was great. 290 00:14:54,240 --> 00:14:55,560 I had no idea what you were talking about. 291 00:14:55,560 --> 00:14:57,960 I'm like, you are probably not the audience for the show. 292 00:14:57,960 --> 00:15:00,000 Um, but that's fair. 293 00:15:00,000 --> 00:15:03,200 Uh, so yeah, so I want to start doing some promotion on that. 294 00:15:03,200 --> 00:15:08,560 Um, I posted this on my mass on account that we were go, that we're, uh, recording today. 295 00:15:08,560 --> 00:15:13,400 I also want to play around with the live item tag where we could actually broadcast live 296 00:15:13,400 --> 00:15:14,400 potentially. 297 00:15:14,400 --> 00:15:19,360 Um, if for no other reason, then I want to experiment with that and see how it works. 298 00:15:19,360 --> 00:15:20,640 Like that's what the show is for me. 299 00:15:20,640 --> 00:15:22,800 It's just like, Ooh, something to play with. 300 00:15:22,800 --> 00:15:26,120 Just as a warning for anyone in the future 301 00:15:26,120 --> 00:15:29,080 who is listening to a live show, 302 00:15:29,080 --> 00:15:30,880 there will be technical difficulties. 303 00:15:30,880 --> 00:15:32,840 - That's the fun of a live show. 304 00:15:32,840 --> 00:15:34,160 (laughing) 305 00:15:34,160 --> 00:15:35,000 - You're correct. 306 00:15:35,000 --> 00:15:36,040 - That's correct. 307 00:15:36,040 --> 00:15:39,880 - Cool, so yeah, those are all the things I had on my list. 308 00:15:39,880 --> 00:15:41,480 What's on your show notes today? 309 00:15:41,480 --> 00:15:46,720 - I'm doing my best not to groan into the microphone 310 00:15:46,720 --> 00:15:48,040 'cause I know that sounds terrible. 311 00:15:48,040 --> 00:15:48,880 - Please don't do that. 312 00:15:48,880 --> 00:15:51,840 - But yes, noted, acknowledged, and seen. 313 00:15:52,720 --> 00:15:55,160 I would like to verbally express my frustration. 314 00:15:55,160 --> 00:15:58,760 Now, let's get into it. 315 00:15:58,760 --> 00:16:00,460 My site broke. 316 00:16:00,460 --> 00:16:06,200 My my site broke and I don't know why. 317 00:16:06,200 --> 00:16:09,600 You still don't know why I tried debugging it. 318 00:16:09,600 --> 00:16:14,600 It was it while I was while I was finishing up the. 319 00:16:14,600 --> 00:16:21,140 CSS configurations, the the 11D RSS plugin. 320 00:16:21,140 --> 00:16:24,640 started throwing errors. 321 00:16:24,640 --> 00:16:26,680 And I still don't know why. 322 00:16:26,680 --> 00:16:30,180 And the reason I don't know why is because I reinstalled the levity. 323 00:16:30,180 --> 00:16:32,740 You broke my content. 324 00:16:32,740 --> 00:16:34,580 That is, and by the way, that config. 325 00:16:34,580 --> 00:16:35,720 That is a rite of passage. 326 00:16:35,720 --> 00:16:37,880 You have broken production. Congratulations. Yeah. 327 00:16:37,880 --> 00:16:41,380 So everything's working again. 328 00:16:41,380 --> 00:16:43,180 You turned it off and on again, didn't you? 329 00:16:43,180 --> 00:16:46,320 Yeah. The one issue I had with that, 330 00:16:46,320 --> 00:16:49,080 it was a flawless situation. 331 00:16:49,080 --> 00:16:53,000 Except between me making the initial install of it, 332 00:16:53,000 --> 00:16:56,200 levity and the current levity version, 333 00:16:56,200 --> 00:16:59,000 they removed. 334 00:16:59,000 --> 00:17:02,880 So many node modules. 335 00:17:02,880 --> 00:17:04,400 Yeah, it's amazing. 336 00:17:04,400 --> 00:17:06,720 I. So. 337 00:17:06,720 --> 00:17:11,080 But I still kept the same get repository. 338 00:17:11,080 --> 00:17:14,760 So they were all still logged in the get repository. 339 00:17:14,760 --> 00:17:17,800 So then I had to learn some new get commands. 340 00:17:17,800 --> 00:17:20,240 You checked in your node module directory, didn't you? 341 00:17:20,240 --> 00:17:22,120 I did. Yeah, I did. 342 00:17:22,120 --> 00:17:24,160 You want to get ignore your node module directory. 343 00:17:24,160 --> 00:17:28,840 Yeah, I wasn't sure whether Cloudflare needed me to do that or not. 344 00:17:28,840 --> 00:17:33,600 So the build process in Cloudflare pages will build that and then upload. 345 00:17:33,600 --> 00:17:36,000 So there's two ways to look at this. 346 00:17:36,000 --> 00:17:37,320 One is to copy. 347 00:17:37,320 --> 00:17:42,360 Like if you want to use GitHub as a just like launch mechanism 348 00:17:42,360 --> 00:17:47,000 where you like it builds in stores and then you copy that distribution out. 349 00:17:47,680 --> 00:17:50,800 Great. If you want to check in your distribution, basically, you can do that. 350 00:17:50,800 --> 00:17:51,120 Yeah. 351 00:17:51,120 --> 00:17:55,600 But the thing about checking in node modules is you just discover the problem. 352 00:17:55,600 --> 00:18:01,000 When you put those into git history, what you are basically doing is then you have to manage them. 353 00:18:01,000 --> 00:18:04,920 And those are derivable assets. 354 00:18:04,920 --> 00:18:09,680 So like the package JSON file is the recipe to build out node modules. 355 00:18:09,680 --> 00:18:14,240 So you don't need to include it because you have the recipe to rebuild it at any point. 356 00:18:14,800 --> 00:18:20,160 Yeah, the basically as far as I see it, the pros and cons are is if you check everything 357 00:18:20,160 --> 00:18:24,360 into your get repository, your builds are very deterministic. 358 00:18:24,360 --> 00:18:24,960 Sure. 359 00:18:24,960 --> 00:18:31,440 They will always compile if it compiles locally, it will compile when you push it. 360 00:18:31,440 --> 00:18:35,960 And if somebody deletes a node module from the node repository like the node. 361 00:18:35,960 --> 00:18:38,840 Oh, Lord, I forgot the word of it. 362 00:18:38,840 --> 00:18:42,200 If you delete it from the node repository, it's not the get repository. 363 00:18:42,200 --> 00:18:44,160 It's not the package. 364 00:18:44,160 --> 00:18:46,800 Yeah, from the package library. 365 00:18:46,800 --> 00:18:48,460 Okay, that's just fantastic. 366 00:18:48,460 --> 00:18:52,960 - I use Python, Rust, and LISPS, 367 00:18:52,960 --> 00:18:55,240 so I barely know what I'm talking about here. 368 00:18:55,240 --> 00:18:56,080 - That's fair. 369 00:18:56,080 --> 00:18:59,540 But if you delete it, if someone was to remove, 370 00:18:59,540 --> 00:19:05,920 if someone was to remove the package from the, 371 00:19:05,920 --> 00:19:10,280 from your registry, that's what it is, package registry. 372 00:19:10,280 --> 00:19:12,280 Wow, it's the end of the day. 373 00:19:12,280 --> 00:19:15,500 If someone was removed package registry, then you couldn't install your site. 374 00:19:15,500 --> 00:19:19,000 Do you know the story about this about a pad left? 375 00:19:19,000 --> 00:19:20,320 I think it was pad left. 376 00:19:20,320 --> 00:19:21,560 Um, I do not. 377 00:19:21,560 --> 00:19:32,000 There was a, um, JavaScript, uh, library that, um, everyone used. 378 00:19:32,000 --> 00:19:38,000 And it basically did padding and the guy got really frustrated and he deleted 379 00:19:38,000 --> 00:19:44,500 it and like tons of stuff, stop building because it no longer existed, which is why there's 380 00:19:44,500 --> 00:19:46,140 a couple of different ways that you can manage this. 381 00:19:46,140 --> 00:19:52,940 You can either set up your own, um, cache of those packages so that you can install 382 00:19:52,940 --> 00:19:53,940 from yours. 383 00:19:53,940 --> 00:19:57,960 That's what we do with our Docker containers on our local network is we cache a Docker 384 00:19:57,960 --> 00:20:01,160 container just in case it gets deleted upstream. 385 00:20:01,160 --> 00:20:02,160 We still have access to it. 386 00:20:02,160 --> 00:20:03,160 Yeah. 387 00:20:03,160 --> 00:20:04,160 And then you can fork it. 388 00:20:04,160 --> 00:20:05,640 Yes, exactly. 389 00:20:05,640 --> 00:20:10,120 you can do what you did and check in your node module directory. Yeah, it it worked. 390 00:20:10,120 --> 00:20:18,160 It worked wonderfully until I sent you a screenshot or something. I think it was 82,000 lines of 391 00:20:18,160 --> 00:20:25,760 code were gone. Yeah, which props to the 11D team for producing that amount of dependencies. 392 00:20:25,760 --> 00:20:34,400 Yeah. However, I did have to learn the get get add dash u command, which updates it to 393 00:20:34,400 --> 00:20:37,160 the working directory. I don't regret anything. 394 00:20:37,160 --> 00:20:43,020 No, this is a great learning, except for the nine commits of just me manually 395 00:20:43,020 --> 00:20:46,280 doing the things until I realized someone's done this before. 396 00:20:46,280 --> 00:20:48,320 There's probably a built in command. 397 00:20:48,320 --> 00:20:50,480 And then I spent 30 minutes Googling. 398 00:20:50,480 --> 00:20:56,240 Uh, I spent more time trying to find the command than doing it the tedious way, 399 00:20:56,240 --> 00:20:58,340 which is just how this works. 400 00:20:58,340 --> 00:21:02,060 Uh, but then I, this literally described my job. 401 00:21:02,060 --> 00:21:03,820 That's all you've described right there. 402 00:21:03,820 --> 00:21:10,940 Yes, I. But yeah, it was it was a nightmare, but everything's working now. 403 00:21:10,940 --> 00:21:15,540 Once again, this started because a plug in broke and I had no idea why. 404 00:21:15,540 --> 00:21:19,300 I have to say I'm more and more impressed by 11 day. 405 00:21:19,300 --> 00:21:23,220 One of the there was a post on Mastodon this last week 406 00:21:23,220 --> 00:21:26,420 where they were showing how much JavaScript is required 407 00:21:26,420 --> 00:21:28,940 on a bunch of these different frameworks. 408 00:21:28,940 --> 00:21:30,780 And it was like Gatsby, Next. 409 00:21:30,780 --> 00:21:33,060 J. Jess. And they all had like JavaScript on them. 410 00:21:33,340 --> 00:21:37,860 And it was like 11 D and Astro and like they require zero render 411 00:21:37,860 --> 00:21:43,540 JavaScript in the browser to work because they default to HTML and CSS. 412 00:21:43,540 --> 00:21:46,320 And I did a conversation about this today. 413 00:21:46,320 --> 00:21:49,940 That is really the direction personally that I'm trying to go. 414 00:21:49,940 --> 00:21:53,820 Strip things down as simply as possible and then build on top of it. 415 00:21:53,820 --> 00:22:00,660 And I say that because for years, years and years and years, I relied very 416 00:22:00,660 --> 00:22:04,620 heavily on very large frameworks to do things. 417 00:22:04,620 --> 00:22:09,060 And it put me in a situation where I became overly dependent on those frameworks. 418 00:22:09,060 --> 00:22:15,620 And I kind of lost the plot on how to do this stuff from a very basic baseline level. 419 00:22:15,620 --> 00:22:19,620 And if you're not building on the fundamentals, you're abstracting things away. 420 00:22:19,620 --> 00:22:25,020 And as far away as they get abstracted, you start to not have like it, you start 421 00:22:25,020 --> 00:22:27,140 to lose the understanding of how things work. 422 00:22:27,140 --> 00:22:28,900 It's why I'm doing all the home web stuff. 423 00:22:28,900 --> 00:22:31,900 Yeah, I am. 424 00:22:31,900 --> 00:22:36,700 The 11 D lack of HTML is really help. 425 00:22:36,700 --> 00:22:40,260 I'm sorry, that was the wrong sentence. 426 00:22:40,260 --> 00:22:42,660 The 11 D lack of JavaScript. Cool. 427 00:22:42,660 --> 00:22:48,540 No lack of lack of HTML is a different. 428 00:22:48,540 --> 00:22:49,540 Then it's nothing. 429 00:22:49,540 --> 00:22:52,060 Then it's just text files. 430 00:22:52,060 --> 00:22:55,260 Yeah, or it's or it's entirely JavaScript rendering the site. 431 00:22:55,260 --> 00:22:58,220 It's a dynamic site rendering on the client side, 432 00:22:58,340 --> 00:23:00,600 Which is a wonderful recipe for things not working. 433 00:23:00,600 --> 00:23:03,440 It's all shadowed down at that point. 434 00:23:03,440 --> 00:23:05,940 But the lack of JavaScript in the rendered 435 00:23:05,940 --> 00:23:13,200 Alepni output is it is very useful to understand. 436 00:23:13,200 --> 00:23:16,100 Like you have like an input and then you have an output. 437 00:23:16,100 --> 00:23:21,900 I like that because that allows me to actually know what my site is going to do. 438 00:23:24,900 --> 00:23:26,900 CSS, HTML. 439 00:23:26,900 --> 00:23:35,700 That for most things, most websites, that is all you need. 440 00:23:35,700 --> 00:23:39,540 And then there's everything else which you have. 441 00:23:39,540 --> 00:23:43,620 PHP, JavaScript, yada, yada, yada. 442 00:23:43,620 --> 00:23:49,940 But I feel like if you're able to make a working site for what you want with 443 00:23:50,620 --> 00:23:54,940 HTML and CSS, that should be what you that should be what you do first 444 00:23:54,940 --> 00:23:58,540 and then add all of the scripting and. 445 00:23:58,540 --> 00:24:03,980 Stuff on top of that, because if you don't have that foundation, 446 00:24:03,980 --> 00:24:09,740 you you don't have a site, you have you have a you have a new gizmo. 447 00:24:09,740 --> 00:24:16,940 I mean, there are exceptions, like say you're making like a browser game in 448 00:24:16,940 --> 00:24:20,260 that you've compiled down to WebAssembly. 449 00:24:20,260 --> 00:24:22,260 I don't think you should need to. 450 00:24:22,260 --> 00:24:26,860 I don't think you should need to write the game in HTML 451 00:24:26,860 --> 00:24:30,060 before you before you can make the game. Yeah. 452 00:24:30,060 --> 00:24:33,500 But but stuff like a blog is good to. 453 00:24:33,500 --> 00:24:38,200 It's good to know what you're making before you make it. 454 00:24:38,200 --> 00:24:40,900 Super complex. 455 00:24:40,900 --> 00:24:41,540 Absolutely. 456 00:24:41,540 --> 00:24:42,800 Basically the thing. 457 00:24:42,800 --> 00:24:47,040 And I mean, both of us are working with 11 day now. 458 00:24:47,040 --> 00:24:50,140 And like the baseline of that is Markdown files. 459 00:24:50,140 --> 00:24:54,140 and a template that renders out an HTML page. 460 00:24:54,140 --> 00:24:59,140 I am in the process of looking at something, 461 00:24:59,140 --> 00:25:02,140 trying to figure out, trying to see if I can find, 462 00:25:02,140 --> 00:25:05,140 they've just, it is going to be moving. 463 00:25:05,140 --> 00:25:07,140 Right now it's called Netlify CMS. 464 00:25:07,140 --> 00:25:08,140 Oh no, it's Decap. 465 00:25:08,140 --> 00:25:09,140 Decap CMS. 466 00:25:09,140 --> 00:25:12,140 I'm going to put this in the show notes. 467 00:25:12,140 --> 00:25:18,140 What it allows you to do is it sits in your browser 468 00:25:18,140 --> 00:25:23,140 and allows you to edit the Markdown files. 469 00:25:23,140 --> 00:25:28,300 And it exposes the front matter as parameters. 470 00:25:28,300 --> 00:25:31,320 And, but the other thing that it does 471 00:25:31,320 --> 00:25:33,680 is it also sets up a workflow with draft and publish. 472 00:25:33,680 --> 00:25:35,660 You can still go in and edit the HTML, 473 00:25:35,660 --> 00:25:37,840 like edit the Markdown files directly, 474 00:25:37,840 --> 00:25:39,620 but it basically creates a branch for each one. 475 00:25:39,620 --> 00:25:41,720 So you can build, like you can, 476 00:25:41,720 --> 00:25:46,720 it gives you a publishing workflow inside the browser 477 00:25:47,100 --> 00:25:49,720 for when you want to ramp into that. 478 00:25:49,720 --> 00:25:51,900 Like you can still just use markdown files 479 00:25:51,900 --> 00:25:53,000 on the command line, 480 00:25:53,000 --> 00:25:56,760 but let's say you want a little bit more of a GUI for it, 481 00:25:56,760 --> 00:25:57,940 or you wanna hand this off to someone 482 00:25:57,940 --> 00:25:59,100 who's maybe not as technical 483 00:25:59,100 --> 00:26:02,180 and they wanna contribute or write something for you. 484 00:26:02,180 --> 00:26:05,860 It's a plusing application, like it pluses up. 485 00:26:05,860 --> 00:26:10,140 - It sounds like kind of like the, 486 00:26:10,140 --> 00:26:14,580 kind of like a WordPress setup in a way. 487 00:26:14,580 --> 00:26:21,060 It is, but it is headless and it very much is reliant on the Markdown files that are 488 00:26:21,060 --> 00:26:24,020 there as opposed to being database driven. 489 00:26:24,020 --> 00:26:26,300 It literally just sits on top of your head. 490 00:26:26,300 --> 00:26:28,740 No sequel version of WordPress. 491 00:26:28,740 --> 00:26:29,340 Kinda. 492 00:26:29,340 --> 00:26:30,180 Yeah, kinda. 493 00:26:30,180 --> 00:26:31,980 I mean, it uses the local file system. 494 00:26:31,980 --> 00:26:35,100 That's like, it uses the files the same way that you would if you were editing 495 00:26:35,100 --> 00:26:39,620 them through like VIM, Emacs, Obsidian, but it's through the browser. 496 00:26:39,620 --> 00:26:42,020 Other more popular text editors. 497 00:26:42,020 --> 00:26:42,740 Yeah. 498 00:26:42,740 --> 00:26:44,260 I threw an Emacs there for you. 499 00:26:44,260 --> 00:26:47,300 B.S. Code. Yeah. Notepad. 500 00:26:47,300 --> 00:26:51,080 Made a I made made a post in Notepad once it was 501 00:26:51,080 --> 00:26:55,140 it was it was it was an intentional challenge. 502 00:26:55,140 --> 00:26:57,180 And it worked. 503 00:26:57,180 --> 00:26:59,080 You can you can use any text editor to do this. 504 00:26:59,080 --> 00:27:02,520 That's one of the reasons why I'm liking these systems is the simplicity 505 00:27:02,520 --> 00:27:05,860 and being able to get up and publish is one of the things that like the implosion 506 00:27:05,860 --> 00:27:10,660 of Twitter was really nice to see just people kind of going back to basics 507 00:27:10,660 --> 00:27:14,120 on a lot of this stuff and like owning their own things and realizing that like 508 00:27:14,120 --> 00:27:16,520 RSS never stopped being a thing. 509 00:27:16,520 --> 00:27:17,700 Like it's been a thing. 510 00:27:17,700 --> 00:27:18,040 Yeah. 511 00:27:18,040 --> 00:27:18,560 Forever. 512 00:27:18,560 --> 00:27:22,320 Google, the death of Google feeds did not kill RSS. 513 00:27:22,320 --> 00:27:22,520 Yeah. 514 00:27:22,520 --> 00:27:24,120 It killed people. 515 00:27:24,120 --> 00:27:27,600 It killed a bunch of people thinking about it. 516 00:27:27,600 --> 00:27:28,100 Yeah. 517 00:27:28,100 --> 00:27:35,320 I mean, from Google reader to feedly to feed bin to like tiny RSS running 518 00:27:35,320 --> 00:27:39,280 our own server, like there's this line of like somebody else doing it. 519 00:27:39,280 --> 00:27:41,160 Oh, I can pay somebody to do this. 520 00:27:41,160 --> 00:27:42,360 Oh, I can spin up one. 521 00:27:42,360 --> 00:27:43,680 There's so many flavors of that. 522 00:27:43,680 --> 00:27:49,480 But yeah, like Google the first time I ever lost trust in Google was when they killed reader 523 00:27:49,480 --> 00:27:55,920 Because it was just like such a fundamental piece of so many workflows and there's like nope. We're not gonna do that anymore 524 00:27:55,920 --> 00:28:01,900 Yeah, I on the topic of RSS. I recently transitioned my 525 00:28:01,900 --> 00:28:07,500 Having a YouTube account to having a having an opml file 526 00:28:09,200 --> 00:28:14,000 So now so now what I do is my RSS reader will tell me hey 527 00:28:14,000 --> 00:28:18,820 There's a new YouTube video and then I download it onto my computer and then I watch it. Yeah, it's really 528 00:28:18,820 --> 00:28:24,320 Inconvenient you don't recommend anyone do that you've invented the internet DVR 529 00:28:24,320 --> 00:28:29,300 Yeah, pretty much amazing. Don't do it guys 530 00:28:29,300 --> 00:28:31,960 Your YouTube account is fine 531 00:28:31,960 --> 00:28:35,380 That the web browser works fine. Yeah 532 00:28:35,980 --> 00:28:39,860 Well Zane, thank you again for another half an hour really appreciate it 533 00:28:39,860 --> 00:28:45,060 My pleasure we I almost pulled the oh I need to do something this afternoon 534 00:28:45,060 --> 00:28:47,680 I'm very glad that like we just pushed it back half an hour 535 00:28:47,680 --> 00:28:53,020 Yeah jokes on you. I don't have a social life. So I'm just always here fair. No, that's fair 536 00:28:53,020 --> 00:28:56,980 That's and I mean I have a job. So that's very similar to the same thing. So 537 00:28:56,980 --> 00:29:00,400 Well, I appreciate you spending your time with me 538 00:29:00,400 --> 00:29:03,900 Where can people find you on the interlet? 539 00:29:05,540 --> 00:29:10,540 pixelfed.social/atzane, 540 00:29:10,540 --> 00:29:13,620 8dr-hnt, 541 00:29:13,620 --> 00:29:18,560 103.social@zane, 542 00:29:18,560 --> 00:29:23,140 and that's it currently, still working on that website. 543 00:29:23,140 --> 00:29:24,340 - Cool. - It'll be here next week, 544 00:29:24,340 --> 00:29:25,540 guys, I promise. 545 00:29:25,540 --> 00:29:30,260 - And for me, you can find me at msp@103.social. 546 00:29:30,260 --> 00:29:33,420 The rest of my links are all at msp.link, 547 00:29:33,420 --> 00:29:35,720 GitHub, LinkedIn, all that other nonsense. 548 00:29:35,720 --> 00:29:42,220 Yeah, Zane, have a lovely weekend and or rest your week and then I'll see you next Tuesday. 549 00:29:42,220 --> 00:29:44,060 Thank you. I'll see you. 550 00:29:44,060 --> 00:29:54,060 [MUSIC] 551 00:29:54,060 --> 00:29:56,640 (upbeat music) 552 00:29:56,640 --> 00:29:59,220 (upbeat music) 553 00:29:59,220 --> 00:30:01,800 (upbeat music) 554 00:30:01,800 --> 00:30:04,380 (upbeat music) 555 00:30:04,380 --> 00:30:06,960 (upbeat music) 556 00:30:06,960 --> 00:30:09,540 (upbeat music) 557 00:30:09,540 --> 00:30:12,120 (upbeat music) 558 00:30:12,120 --> 00:30:14,700 (upbeat music) 559 00:30:14,700 --> 00:30:17,280 (upbeat music) 560 00:30:17,280 --> 00:30:19,860 (upbeat music) 561 00:30:19,860 --> 00:30:22,440 (upbeat music) 562 00:30:22,440 --> 00:30:25,020 (upbeat music) 563 00:30:25,020 --> 00:30:27,600 (upbeat music) 564 00:30:27,600 --> 00:30:56,640 [Music] 565 00:30:56,640 --> 00:31:06,640 [MUSIC]