First off, before I start, I'd really like to say a big thank you to the organizers of this conference, all of the sponsors and the volunteers and the beautiful city of Wellington for hosting us. Thank you very much. All right, welcome to uplifting content with AI with a focus on NLP Cloud and ChatGPT. In this presentation today, I'll be showing you how you can integrate AI services into Drupal and to do that in a scalable way. Before we jump in, I'd just like to take you through a few foundational ideas that are sitting underneath this presentation. The first one is that Drupal is a content experience platform. And by that, I mean that the content is at the center of the universe there. We're trying to bring the AI smarts into Drupal rather than copying and pasting content out to AI services. A really favorite saying of mine is that data matures like wine and applications like fish. It's nice to hear a few chuckles there. I often hear people say, oh, I think it's the other way around. But really, it's all about the content. And ideally, your content is going to be getting better over time. It's going to have higher quality. It's going to be more structured. It's going to be future-proofed and capable of serving different applications. So that's very much an idea behind the uplifting of the content that we're discussing today. Also, we're looking at tools for authors, editors, and marketers. Of course, you can write custom AI applications or integrations with Drupal. But here, we're looking at exposing those to the editors to make their day-to-day lives a little bit easier. And we want to do this in an automated way. So by that, I mean that augmentations and content uplifting can happen, say, for example, when nodes are saved automatically. So it's not just an editor working on one piece of content at a time manually. Things can be automated. And then we can scale that out as well so we can then apply this AI uplift to many content items across the whole corpus. And the aim here is to unlock productivity gains for your editors. OK, 2023. What an amazing year it's been so far for AI. Each week that goes by, there's a whole string of announcements that are made. This is the Gartner Hype Cycle for AI for last year, 2022. And on the vertical axis there, you have the expectations. And you can see there's an awful lot of technologies climbing the hill there from innovation trigger up to a peak of inflated expectations. You'll see generative AI at the top there, or nearing the top. And it's fair to say we're right at the zenith of that first hump there when it comes to generative AI, certainly with the release of chat GPT. AI is very much in the public consciousness. There are other technologies here as well. We have natural language processing, AI cloud services, and data labeling and annotation. We'll be touching on all of those today. OK, so we're going to be looking at two AI services. The first one is chat GPT. I've been talking to a couple of developers here at the conference, and many of them are using co-pilot to great effect in their day-to-day development. Chat GPT has been the fastest growing service in humankind. I think it reached a million users in the first week. And of course it's gone from strength to strength to capture the imaginations of a lot of people. The underlying engine, chat GPT-4, is a big step up from GPT-3. And it's now capable of being used on a very wide range of domains and use cases. The other service I'll be showing today is that of NLP cloud. I could have picked any number of services here, but I did pick NLP cloud because it contrasted somewhat with the approach taken by chat GPT. NLP cloud works on textual content. But it does vary from open AI's offerings in that it hosts many different models. So NLP cloud will take open models, host them on their servers, and give you access to them via APIs. So you have a lot more choice there in the APIs that you would like to use. Here are some of them. As I said, most of them are concerned with operating on text. And you can see that the models they're using are actually some of the earlier ones that open AI release back when they were open. One of the very interesting ones there is classification. And this is where we're able to classify content according to a controlled vocabulary. This is something that's harder to do with GPT-4, which will just create the next best keyword. Here we can use a controlled vocabulary, and we'll be seeing that in use later. So there are the two services we'll be looking at. We do have three Drupal modules that we'll be using to bring all of this together. The first is the Augmento model. So shout out to Naveen and Elio there who've worked on a lot of the code for that. Augmento is a system, a plugin-based system for integrating different AI services into Drupal. There are a number of services that have been implemented. The ecosystem is growing. We'll be having a look at ChatGPT, an LP cloud there. But as you can see, there are many others to try out as well. We'll also be using a module called the Event Condition Action, or ECA module. This is a very impressive module in my mind. It took me a little while to find it, but now that I have, I'm quite happy. ECA is like rules for Drupal 7. It's like a ground-up rewrite which makes use of the event APIs in Drupal and the actions API as well. And it basically allows you to orchestrate different processes in a visual way. So ECA does this through this tool called BPMN, Business Process Model and Notation. So this is ISO standard, it's a no-code visual tool for dragging and dropping and creating these processes. And it gets exported out as XML, and then that can be imported into Drupal to drive other configuration. So in this particular case, on the left we have a trigger, an event, and this one is pre-save content. So when content is being saved, just before it gets saved, that's the event that's being triggered. And then the label on that first edge there is auto-populate. That's actually a condition saying, has that auto-populate flag been set? And if so, okay, let's run the rest of it and we then have the actions which are the rectangles there. And we'll be going into those in a little bit more detail. So this is quite a simple linear one. You can, of course, create sort of more advanced ones. And it's really sort of fun to play with if you want to put together some cool logic based on your core Drupal installation. And there is another module, ECA VBO. This does what it says on the tin. It just integrates ECA interviews bulk operations. This is where the scalability comes in. So we're able to apply these augmentors and actions across the whole corpus. So that UI that you get there is you have an admin screen and you can configure up these actions now through VBO and apply them to multiple objects at a time.  I like to think things in Drupal are simple, but then when you lay them out like this, you do see there are quite a number of moving parts. You know, on the left you have the external services. Augmentor brings them in. Augmentor has implemented the actions API, which makes it available to ECA. And of course, ECA is integrating with these bulk operation. All the ones in green, this is where the editors can uplift the content. So Augmentor has a plug-in for the WYSIWYG. It has a field widget on the node edit screen to bring in content. And on the ECA side of things, of course, you can set up automations and bulk operations. Okay, so let us pray to the demo gods. I saw a presentation yesterday where the demo gods were not kind and I did not want to anger them today. So I did preemptively record a video.  It's a rapid pace one, but we're just going to go through what this looks like in Drupal. Okay, so this is a demo site that I've got with Augmentor enabled. And we're going to go in and have a look at the augmentors now. Okay, so it's a plug-in system. And you can see there that we have many augmentors defined, just sort of testing out a few things. Down the bottom you can create new ones and, of course, you can create a ChatGPT one or various NLP cloud one. But we're not creating new ones today. We're just going to have a look at the ones that already exist. So we're going to go up and have a look at this Ask ChatGPT, one that we've created. This is very, very simple. You can see it's got the OpenAI connection there. We're setting a context to the system saying you're a helpful assistant. And we're just passing the input through as the prompt there. This is the simplest of all the inputs. We're basically just saying whatever the editor types, we're just going to send that through to ChatGPT and get that one back. So that's the first Augmentor very sort of simple setup. We do have another couple of ChatGPT ones here. The first one is social message. So this would be great for creating social messages for LinkedIn or Twitter. And we can prime the ChatGPT to be a helpful marketer. And we can ask it to write an engaging piece for us. And then we have summarise, very similar. We're just asking it to summarise for a second grader. So you can see you can define any prompts that you like, plug them in. So you can really define, you know, ask sort of ChatGPT what you want of it. Here's NLP Cloud. This is the blog post generator one or new article. It's very much more targeted. You don't really have to send any parameters over there. Basically, you send an input and you get the output back. And the next one is the classifier. This is an NLP Cloud classifier from a control vocabulary. In this case, the configuration screen is a bit more advanced. You can say for content audience, use that control vocabulary to classify the content. And you want to reach that threshold as a score to beat, basically. And yeah, basically, that's it for the augmenters, right? So hopefully that gives you a flavour of how we're able to configure up these different plugins. Now we're going to whiz over and have a look at ECA in the back end there. So you go to the workflow section and then you've got ECA. We've got two. One is the auto one, which will happen on node save. And the second one there is a bulk one. So we've had a quick look at this one already, but the circle represents an event that gets fired. The auto populate there is a condition. And we're checking a field on the node there, making sure that was set. And then we've got two augmenters here. So the first one is the social message one. So we're getting the title and the body out of the node that's being operated on. They're the source fields that we're getting it from. And then we have a target field of the social message. That's the field we're going to write the data in. And then we've got the augmenter down here. We're going to be using the social message one that we just saw configured. So that's the heart of what's going on here. And then we have a couple of flags that we can set on the node. So the first one is set the check. That's saying, hey, editors, you've got to check this content. It's been auto populated. Please make sure that you go in and make sure it's all OK. And then the second one there is to deselect the auto. So we just want to turn off a flag as well to make sure it's not run again. And finally, we have the message there as well. It's just a reassuring message to the user at the end so that they're all feeling comfortable that their content has been updated. Now, this is the bulk one. I'm not going to talk through all of this just now. We will have a bit more of a look at that later. But it is very similar to what we're already running. OK, so I'm going to flip over to the next one. So we've seen how the back end has been configured. So it's going to be like a site builder kind of set up there. Now we're going to have a look at what the editor experience is. So we have our trusty create article page. You're going to see three things here. We're going to be playing around in the node edit screen and giving augmenters a bit of an exercise in the node edit. We're going to see that auto populate flag kick in on node save. The bulk operation is a bit of a go as well. So let's kick this one off. So the first thing I'm going to do is I'm going to go down to the body and I'm going to paste in an article that I want to know about. It's basically about the best books for youths. Now there's that augmented drop down there in the WYSIWYG. So augmenters can be exposed into the WYSIWYG and we've selected the chat GPT one. So probably a little bit fast on that. But basically there's an Ajax call going back into the back end of Drupal. There's a private API connection made to the API at OpenAI. The wheel starts turning there and a response will be generated. This is quite a demanding operation because there's a number of relatively large response being built. That will then get sent back to Drupal and then the result will be sent through back to the front end and that's going to then be populated into this WYSIWYG. So we've now got a nice article coming back and you can see even down the bottom there it's even talking about the themes and things like that that we asked it to do in the summary. Up the top we're now doing generate headline. This is an NLP cloud augmenter and using the field widget. So NLP cloud has produced that headline and sent it back. We've now got another field widget here to summarize and this is going to be using chat GPT summarize augmenter that we saw. That's now come back. I think that's probably a really key feature there. We've also got social message and you'll remember that we asked chat GPT to pretend that it was a marketer and was going to write engaging marketing content and you'll see that the language that's coming back here is a little bit more sales-y, so to speak. And then finally down the bottom, we've got our audience sort of field here. So you remember we had that classifier one. I've clicked the button now. The content is going off to NLP cloud and it's returned, I was a bit quick on that, but just one youth field there and then we were able to populate that taxonomy field. So that's sort of stage one. It's like playing around on the node edit screen. You've seen the WYSIWYG stuff working and you've seen the field widgets going. Now we're just going to go into stage two now. Just pretend I'm a really lazy editor and I haven't written my summary or my social message and I want to auto-populate those. So that's what we're going to go in and see just now. So I'm clicking that auto-populate checkbox there and that's saying to ECA model, okay, you're going to have to run. So I'm just blanking those out. Now we're going to save and this is where the ECA model is going to kick in. You can see that it's an article. You can see that that field has been clicked and now it's going to be running those other actions. So we're going to be doing the summary, the social message and we're going to be setting those two. Okay, so that's come back. Let's have a look, see what's happened. Okay, so we can see the auto-generate flag has been turned off, so that's worked. The check has been turned on. The summary field has been filled in and also we now have a social message there as well. So that's basically a little success there for the auto-population of the content. This may be helpful if you have editors as a general practice and not filling in their summaries particularly well. The final part of the demo now is we're just going to look at the bulk populate. So we're just once again going to blank out the content and we're just going to set the checkboxes again. So we're getting rid of the check. We're doing the bulk populate one now. So this is the flag that the bulk population will be running on and we'll save that. That should save very quickly because there's no auto operations happening. We're coming over into the views, the admins section and we've got our special augment view here and you can see that we have this one action, this one VBO action that's been defined and we're able to select that and apply it to that particular item. Now this does take a little while to chug through so I'm just going to flip back here to the model. This first event is the interesting one. You can see at the top right that that was a VBO event and we're once again sort of similar pattern of having the condition there and then our sort of actions that are all operating on the various fields. With VBO there is a slight difference. You do have to set the save, right? You do have to save that entity after it's being processed. So you've got the save entity set the message. Cool, so we're going to flip back and magically that VBO has run. We've had one update. We're just going to come in and we can see now that the field has been unset, the check's field has been set and once again these fields have been unpopulated. So that is the conclusion of the demo basically. I think when you're looking at this you can hopefully see some of the possibilities that are here, especially if you have, say, sites with thousands of nodes without a summary. You can use a tool such as this to bulk populate those. Cool. All right, thank you demo gods. So what have we seen here? So hopefully there's a few cogs turning, wheels spinning there, how you might be able to use this on your site. Of course we can create contents and summarize, extract keywords from controlled vocabularies. Using tools such as chat GBT is just great for producing content outlines and skeletons. And also for fixing content as well, there's just a whole wide range of applications and using that WYSIWYG feature, you're easily able to do that. And finally it's possible to transform content as well. I haven't really shown that today, but you can do text-to-speech, speech-to-text and many others, depending on which augmenters you've implemented. There are of course a few warnings we really probably have to mention. I've got to admit a certain degree of excitement and fear when I see technologies like this. Sure, it is absolutely amazing what large language models can do these days. And I do have more than one fear, but one of the main ones in terms of content is that we're just going to see a lot of auto-generated content on the web. I think as time goes by it's going to be more difficult for us to trust what we're reading. It has a machine written that or a human. And of course with this sort of auto-generation of content, there is the danger of losing real insights, losing that tone of voice, losing real authenticity and trustworthiness. So I think as time goes by this is really going to be something that people value, that tone of voice and that human touch. It's very important to have an editor in the middle. Large language models can hallucinate. They have biases. They can sometimes just return content that you don't want. That's why you need an editor in the middle to do and edit as needed. And you'll see I had those little check boxes there telling editors that, hey, this content has been auto-populated. You really should check it. It's going to be a lot of disruption. I know that's obvious. We've seen many artists on the web complaining about how their livelihood and their ways of working have been totally destroyed by these generative models. I'm sure that's going to be the case for many content creators. We all change the way we all work. Of course, it's also going to change business models and just totally change industries and companies as well. So the trick here is to stay ahead of the curve, work out how AI can work for you and how you're able to take advantage of that to avoid the tidal wave that's coming up. Okay, so today we have seen content being produced by NLP Cloud and ChatGPT. And ChatGPT and GPT4 are the big ticket items these days everyone's talking about. But really, this is just the beginning. In the last couple of weeks, there was a Google memo that was leaked and it was titled We Have No Mote and Neither Does Open AI. And basically, the memo was talking about how Google now no longer has any intellectual property that is not widely known. And basically, the genies out of the bag, people know how to use these models and to build them. And the memo mentioned open source there, but basically by open source, I think it just means the open community building things. So more open models, they'll be more efficient, they'll be less costly, they're faster to train, and they'll be less restrained. There's many guardrails in ChatGPT. So we're just going to be seeing a whole lot more action in this space. Using tools such as Augmentary is a nice flexible way because you're able to pull in these different models as they come about. It really is an amazing time to be alive. Okay, whoops, I skipped one slide there. So the question is now over to you guys. Hopefully you've got a few ideas from the presentation today and I'll throw it back to you. How are you going to uplift your content? Thank you. I can't actually give you a number. I will say that, because I just don't have that off the top of my head, when OpenAI's GPT-3 was out, people were saying, oh yeah, it is quite expensive and then they cut the prices by 10. They're now a tenth of what they used to be. So there's certainly a lot more competitive now. But yeah, OpenAI has traditionally been seen as one of the more expensive services, but I guess they're running a lot of compute to return those. But now that Microsoft's come on and put in a lot more money, I think they're investing in their infrastructure a lot more and those prices are coming down. OpenAI also fixed up a lot of their terms of service, around privacy and things like that. So they've definitely become a lot more enterprise focus as the services become more popular. Yes, yes. My demo site was a bookshop demo and it had books about youth and adult. So I had put that in as a taxonomy, just youth and adult. And those two terms were sent off to NLP Cloud with the content and then NLP Cloud worked out, oh, this is about youth. I'm going to return that youth keyword. So I did have to fine tune up that threshold value a little bit, so it may be a bit hit and miss, but it's a pretty cool feature. That is probably not going to work in really out there domains. You've got to remember these language models are trained on a generic area. So if you had a super specific taxonomy, it may not work for you, but I think for general things, it should work. What is the intellectual property of an article like that? Good question. Now, recently there's been a court, I think, I don't know if it's in US or Europe, who said that there is no copyright in that because it's been produced by a generative AI. And I think it was around an album cover that someone had made for a band. People started copying that album cover and there was no copyright in that. OpenAI has recently changed its terms of conditions saying you do have copyright in that. There's copyright in the response and in the prompt. That's what OpenAI is saying. I don't know what the courts are going to say. They're actually at odds with what OpenAI is trying to do in their terms. So I think the law may well have to catch up in this area. Yes, I don't know the answer to that. So the question was, will auto-generated content be penalized from an SEO perspective? Yes, it is an arms race as to if you can detect what's being written by an AI or not. So who knows? Google may well do that. But I think Google may well like pushing stuff that is getting attention anyway. This is my fear. You may get all this auto-generated content that's getting attention and that will still perform very well in search engine results. So it's probably the assumption now that's going to change. Yeah. Oh, yeah, yeah, yeah. So, I mean, there's many APIs. Like, you know, of course, Dali2 has got an OpenAI API and stuff like that. We haven't implemented any of those because I think people probably going to want to play around with the image creation process and an iterative thing with the prompt. They're probably going to play with it and fine tune it and just get it the way they want. And Drupal, like a little thumbnail on Drupal is probably not the best way to do that. But we could implement that, but we haven't because I think the way people would work with that would be more visual sort of way in another system. But there's no reason why you couldn't have a thumbnail being generated in an automatic way as well on bulk. We haven't tested that yet or implemented that, but that's certainly possible. Yes, this is all pretty cutting edge. I've got to say, so I mean, we started this module a few or six months ago. Of course, like with ChatGPT, there's been a huge amount of interest. There are other ChatGPT modules out there that are sort of working in a different way. Not such a pluggable way, but just getting wired in across the Drupal interface as well and haven't looked at the attraction of those. But you know, Drees has spoken of those and I imagine they got pretty good. There's momentum there as well. So yeah, obviously very new area and we're just trying to, yeah, this stuff with ECA that we've been doing is all pretty recent. Same with ECA module as well. It's just sort of hitting and stride and the VBO one's only got 40 users or something, so it is all sort of quite a new area. Sorry, will we be able to get into GovCMS? Well, in the Drupal 7 version of GovCMS, I think rules was in there, if I'm correct. And the criteria in the early days of GovCMS was a module should be reusable and flexible and rules or ECA is an excellent candidate from that perspective. So I think there is a lot of value that can be brought into that, but that's a matter for GovCMS. You can go work on it, Jenny.


Welcome back to another review everyone, I am going to be discussing Banshee at Kings Island, the 2014 Bolliger and Mabillard inverted coaster. Banshee opened in the year 2014 and is a massive BNM invert. It stands at 167 feet tall, features a 150 foot drop, a top speed of 68 miles per hour and seven inversions along its 4124 feet of track. I got the chance to visit Kings Island and ride this beautiful coaster in August of 2019 and it was definitely one of the most anticipated rides at Kings Island for myself. It is the third BNM invert I have been on and I am a big fan of the other inverts I had ridden previously to this. I was very curious about Banshee especially because of the newer BNM Vesta Straints featured, the same restraints you will find on BNM Wing Coasters which I have always liked for the most part. After going through the queue and coming up to the station, you will see that this station is nicely themed and made to look like an old cathedral. It looks really cool, but there is no story presented, it just adds a nice atmosphere to the ride. You will then load into the sleek trains, very similar to all other BNM inverts. They are pretty comfortable, admittedly I did feel like these vests were a bit tighter than the ones I have experienced on Thunderbird, Gatekeeper and Valraven though. During my day at Kings Island I got two rides on Banshee. I would have liked to have gotten another ride, but it was a busy day and lines for this get extremely long. I rode in the very front on my first ride and the back on my second ride. After departing the church and climbing to the 167 foot peak here, you will hear the infamous Banshee scream before you plummet down this really steep, twisting 150 foot drop which starts off the ride really well. You will then go into a huge dive loop, then followed by a vertical loop that circles around the lift hill. After the loop you will travel up into a 0G roll like you will find on most BNM inverts and it has decent whip. After the 0G roll you will hit the most unique element on this ride, the super forceful pretzel knot inversions.  It is basically a dive loop followed by an emelman and the forces are just ridiculous. Following this you have a second vertical loop followed by an upward banking turn to the right which leads you into a highlight of the ride, an inline twist where you slowly roll to the left. You will end the ride by twisting out of the roll then going through a tight downward helix to the left then twist up to the right and into the final breaks ending your 55 second 4124 foot long ride on the Banshee. I have a lot to talk about with this ride. Banshee is an amazing looking ride and it really has a nice unique color scheme that looks great as you are walking up to it in the plaza near drop tower and bat along with one of the coolest entrances for any coaster with a banshee sign and fog pouring out of it. And of course you have the great cathedral style station. Really nice looking overall. There is nothing really elaborate in terms of theming. Just the cathedral aesthetic, sign, banshee scream then of course you have the headstones throughout the entrance and queue one of them paying respects to son of beast which used to occupy some of the land banshee sits on. The next thing I want to talk about is how unique banshee is for a B&M invert. It has a fantastic layout which features some of the commonplace elements inverts are known for but it switches the typical ordering around a bit and also includes unique elements for one thing instead of the typical vertical loop right after the first drop you first go through the dive loop before the vertical loop and there are also two vertical loops featured on the ride as far as completely unique elements you have the pretzel knot element not to be confused with pretzel loops on B&M flyers this is the only currently operating roller coaster in the world to feature a pretzel knot the only other coaster that featured this element according to RCDB was the legendary shuttle coaster moonsault scramble that was at Fuji Q Highland in Japan from 1983 until 2000 banshee also features the slow inline twist at the end of the ride which provides some great hang time I have to note as well that like many coasters at Kings Island this one makes some pretty nice use of the terrain in that area talking about the actual ride experience I had on banshee I have to say that it was a much more intense ride than I thought it would be once you hit the zero G roll the ride really starts to whip you through the inversions and really press you to your seat with sheer positive g-force that was a very pleasant surprise to me not that I thought banshee would be a forceless ride by any means much on the contrary I just wasn't expecting that amount of sheer force as the layout is pretty large and drawn out with that being said I was very much let down by banshee in a certain regard and that was the smoothness this is the newest B&M invert as of 2019 and my rides I got on banshee were extremely rattly it was honestly too much and it really took away from the enjoyment quite a bit which is really unfortunate to me though there was no headbanging due to the Vestrestraints the roughness of the ride just basically took all of that added comfort and threw it out the window there really is no logical reason why this five-year-old inverted coaster should be so rough when raptor and afterburn which are both 20 years old or more are still providing very smooth rides safer maybe the slightest rattle at times and because this ride is so intense it just amplified the roughness of the ride for that reason I don't know if I could really ride this coaster more than twice in a row if the line weren't so long I don't know if this roughness is a new problem that just began this year but in any case it desperately needs to be resolved even though the headache inducing roughness was a very big issue to me I still did think this ride was very good nonetheless as it really has a lot going for it the speed intensity and uniqueness of this coaster I'll just make this a really good ride and I could only imagine this ride climbing up a couple spots in my overall rankings next year if the roughness has dealt with taking everything into account and looking at banshee not only from my personal experience but also from an objective standpoint I will give banshee a score of 8.5 out of 10 it is a standout coaster among the great lineup at kings island and I currently have it ranked just inside of my overall top 15 of 86 total coasters and right in the middle of the three bnm inverts I have currently ridden afterburn at carowinds still being my favorite what are your thoughts on banshee at kings island and have you experienced this roughness I thought it may have just been a bad day for the ride when I happened to visit in august but then not long after my visit another enthusiast released a video talking about similar ride experiences they had on it earlier in the season drop your thoughts on banshee in the comment section I would love to discuss thank you all so much for watching this review be sure to like this video if you found it helpful and subscribe for more awesome content on roller coasters and amusement parks coming your way like my page coaster daddy on facebook and follow me at coaster daddy official on instagram thanks again for watching this is coaster daddy bye


What's up guys EvilD here co-founder of Amikumu. I just wanted to give you all a quick video update on what's happening with Amikumu. You probably just realized I'm speaking in English. Well I've decided to do this video in English because Amikumu has a ton of supporters outside the Esperanto community and I know a few of them have come across to this channel so I just wanted to reach out to them. So first up thanks a lot for helping us get there. Yesterday we smashed obviously our main goal 8,500 euros but then today we also smashed our first stretch goal which was for more efficient and better marketing and now we're heading on to our next stretch goal which is for adding events into the app. So of course keep sharing around, keep sharing for all your friends, Twitter, Facebook, email if you know anyone who's interested in languages and maybe they work at a festival or at a university department or at a school share it with them because it's amazing the places that we are getting support from. I've heard so many different stories of ways people are thinking up how to use Amikumu like things that we didn't even think of and we're like actually you know what that is a great idea that is a great idea like for instance I'm speaking with some travel bloggers at the moment and they could see a really good use for Amikumu for when they're doing their travel blogging so when they're traveling from one country to the next finding people locally who can help them out now I thought you know that's pretty good but then I've heard from other people that said you know they could even be used in a hospital environment if you need to find someone else nearby who speaks a particular language to help out and I was like you know what totally didn't even think about that so it is amazing the amount of ways people are thinking up how to use this app and it's obvious that there is so many applications for it because people are just coming in at a left right and center and just throwing support at us so I absolutely love it I'm sorry if I haven't managed to respond to everyone's comments because it's actually midnight here in Sydney and I'm making this video as kind of a way to just reach out to everyone and say thank you but we are not done yet we are we our goal was 8,500 euros but we got a 20,000 stretch goal so in my eyes we're halfway there let's see if we can get all the way there let's see if we can totally smash it and bring this campaign into the mainstream if we get there and we smash all the way up to that 20k in like I don't know a week imagine that in a week I reckon the newspapers will be all over this mainstream would be all over this especially locally here I could get a ton of local stories happening out of that interest stories I'm sure some of the bigger blogs out there would be really interested in this application so the more that we share this around the bigger it's going to grow the faster it's going to grow and not just that the more useful it's going to be for all you guys because the more people who know about this that means the more people are locally who are going to use the app when it comes out and we all want that don't we so basically that's it there was a few other things I wanted to say but my brain's fried I'm ready to get asleep oh by the way I'm on VK that's for those who don't know that's like the Russian Facebook there's going to be a link down here I'll put a link in so yes that's all I hope you've enjoyed this video if you did give a like share around a few friends sub to my channel if you haven't already and I'll see you all in the next video and if you're not there I will find you and you won't enjoy that Jacob, Jake, James, John, Youp, Jay-Z Knuckles, Lupe, Marguerite Kilpac, Marvin Antz, Matthew Kova, Miguel, Paolo, Rafa, Sarah S.C., Shane Power, the Igor Kai, Tommy Linsley


Hey, it's Angie, DC student at SCU. Did you know that chin tucks are typically one of the key exercises recommended for keeping the head aligned above the spine rather than drifting forward into poor posture? Poor posture can be a contributing factor to neck pain due to increased stress on the cervical spine and its supporting structures. When done regularly and with proper form, chin tucks can help improve the neck strength, flexibility and function. Let me show you how to perform this exercise. Set up right and look straight ahead with your ears directly over your shoulders. You can use your finger as a guide but place it on your chin. Without moving your finger, pull the chin and head straight back until a good stretch is felt at the base of the head and top of the neck. Hold that for 5 seconds, then bring the chin forward again to your finger. Repeat this exercise for a total of 10 times, which equals out to 1 minute of your day. This serves as a constant reminder to use for good posture. Thank you. Till next time.


Good morning, everyone. All right, so some updates, class-wise, course-wise, logistics stuff. So the TA and I decided on office hours. So there's office hours every day of the week. So the TA has Monday, Tuesday, and Friday. I have Wednesday, Thursday, and we tried to stagger the time throughout the week. We're all posted up on the syllabus and on the website. If you cannot, throughout the entire semester, you already know you can't make any of these office hours. Send me an email right now so we can move it around and maybe adjust some things or have a second office hours. So you can see the TA has three hours. I have an hour and a half a week. So please take advantage of that, four and a half hours. Questions, comments? Other questions, other comments on things? Oh, so for the Google group, you have to go to it and then you subscribe to it? Or is that how it works? So we can keep track of who's on there. Should we do it? I did it through my ASU email, but it doesn't matter. As long as you have your name or your ASU ID or something that we can link that to the LTU. Cool beans. So here we have it. You have to be approved for that, right? Yeah. Yeah, the TA will go through and approve it daily. So don't worry about that. Anything else? Last word? How did the office hours look? Any opinion? OK, good. Just one thumbs up. There you go. That guy is speaking for you all 125 of you. One thumbs out? I can't make any of those. Is that any email? Yeah, I know. We're also both available by appointment. So if you have an email, we can find a time that works. Happy to do that. No, no, no. Cool. All right. So let's get back to it. OK, so we were talking about how does your computer, how does the actual physical hardware of your computer understand your instructions and what you want it to do, right? You're the programmer. You're trying to tell this machine to do something. You want to speak English to it, right? And tell it to, I don't know, add one plus one and then show a GUI with a form. I want these form boxes. And whenever anybody inputs these values, I want to check if they're valid, right? I mean, that would be a kind of cool way to do it. But you can barely get Siri to put an appointment on your phone or remind you to do something, right? So we're not quite there yet. So we talked about programs that translate what you, the programmer, intend what you want to have happen and translate that into the assembly language that the CPU actually understands. And that's how you can actually get computation performed. We talked about compilers, which translate from a programming language to an executable binary, typically. We talked about interpreters, which look at a program in a programming language itself and then actually perform those computations themselves and perform actual behaviors. And then we talked about this new kind of term, transpiler, transpiler, which is translating basically from one programming language to another. So how do they work? Witchcraft. Witchcraft. Yes, it's witchcraft and magic. It's turtles all the way down. No, so that's why we're here. So that's why you're taking this class. For some of you, probably, how many of your CS majors? Yeah, would you rather do your course to take this Say like it's a bad thing. I think some students could interpret it as a bad thing, which is understandable. But really, I do think this is one of the most important classes that you take because you get to learn how actual compilers are built. And this is a tool that you use every single day throughout your career. You're compiling code. You're writing code. You're testing things. You're using a compiler. And so if you don't know how it works, if you have a lumberjack not knowing how a saw works or something, it's like, I don't know. I just put it against the tree and it cuts things. You want to understand your tools. And what I also really like about this class, so who loves theory and theoretical stuff? Some of you. And who loves practical, hands-on programming stuff. So this class is a mix of the two things, which is very interesting. So the theory, so why do we study theory? Why do we care about theory? Because we say, and your professors make you. Because it's fun. Because it's fun. So you know what to make. So you know what to make. Without knowing the theory behind something, we have no idea if it actually works. Yeah, if you don't know the theory behind something, how do you know that it actually works, right? I guess it can lead into new practical applications. Yeah, you could say something is theoretically possible. So can you actually, what do you need to do practically to make that work? Or if you demonstrate that, yeah, something is really practical, but the theory doesn't support that. Well, now maybe you should change your theory to match what you can actually do. So yeah, all those things, all those reasons are reasons why I like to think about it. Theory kind of tells us what's possible, right? So when we look at the theory in this class, we're going to be talking about infinite sets and what kinds of claims we make about infinite sets and grammars and languages, right? We're kind of studying something very broad and really interesting. And the great thing about this class is that theory is not just theoretical. We're going to be proving stuff more learning theorems and lemmas and proofs. We're going to actually be using that and applying that in the construction of a compiler and in the understanding of a programming language. So I think this is really key. So yeah, kind of the theory is going to enable us to define what we can and cannot do in a programming language. So you'll be able to say, hey, I want to write this programming language. I want to do this certain thing. Can I actually do that? Does the theory allow me to do that? Or what's already been proven that I know definitely I can do it? And the practice. So this is something that's really interesting. So I guess from the vague, high-level idea that I'm trying to convey about compilers, I don't know. Are you going to use them all the time? No. Probably? No? You're not going to use a compiler ever? I have to work with one. Huh? Get to work with one. Yeah, you have to work with one. Are you going to be writing a compiler? No, probably not. Maybe not. It could be in this class. But you could, right? I mean, there's nothing. All a compiler does is translate one language to another, right? I mean, at a very, very high level, that's how I think about it, is translation, one language to another. So these kinds of things happen in computing all the time, even if we don't call them a compiler. So what does a browser do? Reads web pages. Reads web pages. What's the actual, what's a web page look like? Anybody right-click and view source? Yeah. Browsers are going to translate to HTML, CSS, JavaScript, so on into an image that you can interact with. Yeah, so right, it takes this text. So the website sends you just text. Just a series of bytes. And then your browser takes that and translates it into a GUI interface that you can interact with, right? And so that is, if you think about it, that's another type of a compiler where it's compiling from HTML to a GUI interface that you can actually play with. And then you have cascading style sheets and JavaScript and all these other dynamic parts in there that's also just this translation. So browsers do it all the time. What about, how do video games save, know where you left off in between gameplays? Save files? What's a save file? Whatever the game company thinks of it. At a high level, what's a game file? What's a save file?   So the game says, OK, you want to save your state. Boom, I'm going to write this file to the computer. And then later, when you come back and you say, I want to resume where I was, well, it has to take in this series of bytes and turn it into a game state, right? It's just exactly the same thing. Or if you're talking about the newer games where you have all the replays and that kind of stuff, right, it's the same thing. It's a file that just describes what happened in the game. And then later on, some other component takes that as input and runs it through the game engine and shows you what's actually happening. So all of these are all examples of compilers. They happen all the time, XML parsing, I don't know, random kinds of input, unstructured reports from some other legacy system. These things come up all the time. And so, and also building on top of that, so you can build domain-specific languages, so you can build a language specifically for flying planes or flying drones or building a game, right? These things happen all the time. Static analysis is a huge thing, so that's kind of my background. Using the compiler techniques, we're able to look at a program and say, identify what possible security vulnerabilities it has. So we say, oh, look, there's a path through the program and this data can flow from here to here and look, there can be a SQL injection vulnerability here. And that's based on in using these things, the theory and the practice here of compilers. So that's why I really like this class, all this kind of stuff. This comes up all the time, but it's not often called a compiler, but it still uses the theory of techniques we're gonna learn here. Okay, so what is this? Some language. Use an appropriate language, like. The BF. Yes. So what is BF at a high level? You don't have to say the name of it, what is it? It's an internal language. Yeah, this is a program, this is a programming language. Or this is a program written in a programming language called BF. And when you run this program in this programming language, as somebody said, it's turn complete, which means it has the exact same expressive powers as any other language.  And they have online, they have a bunch of different BF interpreters, if you wanna learn more about it, the language. I'll be honest, I took this one to be, I don't know how to write BF. It's not something you do. Why would you want to? Because of that resource. It'd be cool. It was this. Is this a program? Yes. Unless it's white text that we can't see. Unless it's white text we can't see. Then it's white. So we've embedded a program in the PowerPoint slide into the pixels of the slide. Maybe. Maybe. I didn't, but it's good. Yeah, so this is white space. And this is, all the underscores here are spaces and all the slash ends are new lines and the slash t's are tabs. And so this is a program written in the programming language, white space.  And this outputs hello world of spaces. That's kind of cool. But if you notice, they just complete it.  What are this? Is this a program? Mm-hmm. What language is it? It looks like Python. It looks like a Python. Python, I think it could also be Ruby, I think some of you said, but I was intending it to be Python. Yeah, so this is a lot simpler than those other ones, but you know, it's a program. What about this? Yeah. Haskell. So Haskell is a crazy, lazy evaluation functional, very functional programming language. And so this is a simple hello world Haskell program. This is an x86 assembly program for output hello world. This is actually pretty easy. Once you get used to reading this kind of stuff. So which is actually a programming language? Are all of them programming languages? Yes, yes. None of them? Nothing is programming language. Some of these things are tricking you that it's really just letters on a screen and they don't mean anything until you run them through a compiler and actually perform some computation. Even if that was true, that doesn't mean that somebody couldn't retroactive would make it a programming language. Say that again? Sorry. I mean even if that was true that none of them were, it's somebody could go forward and make them into a programming language. Somebody could go forward and make them into a programming language, yeah? But wouldn't that mean that any text could be a programming language? Does it mean that any text could be a programming language? I think that means that it can. I mean, if three characters of white space can be a programming language, I feel like anything can be a programming language. Yeah, so what's the commonality? I mean, are some of them programming languages and some of them are not, some of them you've heard about, some of them are not? They're all programming languages. They're all programming languages. Everything's a program, but I compile and execute you. Programming languages is what I'm getting to. I was referring to the example. All of the examples were programming languages. All of the examples were programming languages. I mean, just text on a screen, not a programming language, but when it's got syntax and can be compiled down and executed then it is a programming language. Yeah, so they're programming languages kind of because somebody said so, right? In essence, they said, hey, I'm gonna define programs that look like this are in my programming language and these specific constructs mean this thing. So that when you see three white spaces in a row, it means print, and when you see five white spaces followed by a new line, that means add one or whatever. I have no idea how it actually works, but something like that, right? There has to be some structure to these programming languages. It can just be random gibberish, right? So if you just said, aha, that wall is a programming language. Well, it doesn't really make sense. I mean, maybe you have to have some kind of structure to it, right? Okay, so this is an overview of kind of where we're going in this class and this is program interpretation at the super high level. And this is why it's so interesting. So you have your source file, which is just in bytes. So you have a bunch of bytes coming in, right, which have essentially at this point, no meaning. There's just numbers on your hard drive, ones and zeros in the magnetic disks, or I don't really know how SSDs work. I think it's still memory or something like that. Yeah, it's just all bunch of ones and zeros. So these bytes are coming in to what we're gonna learn about a lexer. And the lexer's job is to take this sequence of bytes. It's got stuck in the loop. Okay, so the lexer takes in this, could be random input, anything, and outputs a series of more abstract tokens. It says, okay, here's an identifier, or here's a function call, or here's the definition of a function. All of the special characters that you have in your language, like all the keywords, all that kind of stuff, are listed up in the token so that that way the program can actually reason about them. Where the parser takes all this stream of tokens. So all it has is this, hey, this token, this token, this token, this token. And then tries to make sense out of it and say, hey, can this actually, is this a real program that can look like a program? So it builds up a parse tree. And this parse tree is passed to usually some kind of semantic analysis, which answers the question, is it a valid parse tree, right? So can you write a valid C program that isn't actually valid C, that's valid syntax of C, but can't execute and run? I've done that. I think we've all done that, right? So any time you have a type error, that's this, you have this problem, right? Your program may be valid syntactically C, but it's not valid C semantics. Then that valid parse tree gets passed to the back end, where the back end code then takes that and then spits out whatever you're computing to. So it can, if it's an interpreter, it's gonna perform some computation and do something. If it's like a compiler like GCC, it's gonna output an x86 binary that you can then execute. Okay, so what kind of things make a program valid? Syntax. Syntax, what is syntax? Correct. What does it ask? It's following the structure of the language. The structure of the language. Yeah, so it kind of says, from the point of validity, if you think about it, it kind of means, so what does it mean to look like a valid program? How do I separate random bytes from bytes that are actually a series of bytes that are part of my programming language? So that's what Syntax is trying to answer. What does semantics answer? The logic behind it, if it's valid logic? Yeah, so the logic behind it. So what does it mean for a program to be valid? So let's say you have something that's syntactically valid. What does it mean? What does a print statement mean? When I say a plus b, what does that actually mean? What's going to happen? And these are really important questions. These are things that you as the programmer need to know because how can you use a language? So Syntax tells you, hey, this is how you write a valid program. Syntax says, here's how to write a valid program that does what you want it to do. What about correctness? Is correctness important? Yes, absolutely. What question is it trying to answer? Did you do it right? Did you do it right? Is the program the correct one for the job, right? So is this actually the program that you wanted to write where that needed to be written? Any questions? This is kind of the high level, finishing the high level overview of the course and where we're trying to go here. We'll see. I'm gonna close out of this chat that popped up. Okay, all right. Questions? And cool. So now I'm gonna do something a little different. First, what I'm gonna do is, okay, so we're gonna do something different, something I haven't done before that I'm gonna try. So I've noticed from last semester that there were some, I don't know, so this is definitely, I think I tried to get this point across on Monday, but this is definitely the, should be one of the hardest classes you've had up to this point, programming-wise. And it's by design. So I kind of created this lecture. What I wanna talk about today is, what are some skills you should be developing now and that will help you in this class and throughout your careers that'll be a better programmer. So I talked to some of my friends who are in industry, some of my PhD students in my lab to kind of boil it down to what are, what do we think is essential as far as programming skills? And I'll say this has almost nothing to do with actual programming itself. So it's kind of more about enabling you to be more efficient and more effective as a programmer. So you need to be learning constantly. So I know, at this stage, you're probably maybe overwhelmed with all the stuff you have to learn, right? You're always, there's always something new to learn. The beauty about the industry that we're in is that never changes. So I guess unless you decide to go in and program cobalt mainframes for a living, which actually I've heard you make serious money doing because nobody knows how to program cobalt mainframes.  So that's good. So yeah, so thinking about like when I started in computer science, the hotness was Java. It was all about Java. Like all the classes were in Java, Java was the wave of the future. It was right once run everywhere. Is Java hot now? That's a cool programming language. What do you guys think? It's cool. Python, it's not super old, but yes. What else? Ruby on Rails. Ruby, Ruby on Rails, yeah. That actually came out while I was in college. It was mind blowing, it was awesome. Anything else, that's it? JavaScript. JavaScript, yeah, that's a huge one, right? So not only JavaScript in the browser, right? With Node.js, you can run JavaScript on your server side now, right? So you can write your entire web application both in JavaScript. So JavaScript on the front end for the client side and JavaScript on the back end, which is huge. And to get to take advantage of all the improvements of the JavaScript interpreters that are inside browsers, so, which is another compiler, right? It's another interpreter. Okay, so yeah, so you're, I can't guarantee many things, I don't know, in life in general in computer science, you're gonna always have to be learning whether it's Internet of Things, whether it's, I don't know, some of you are probably gonna have to do automobile programming craziness at some point because automobiles are getting more complex, computing's getting in all these different areas. I mean, you need to be able to constantly learn and constantly be learning. If you're ever at the point where you're like, man, I don't think I've learned anything in the last year, you're doing something wrong and you're setting yourself up for pigeonholing and, I don't know, stagnation really. So what are, I don't know, a couple key skills. What do you guys think is important for being able to constantly learn? What kind of skills? Learning how to use the resources that are becoming increasingly available. Yes, that's I think, that's actually why the first thing on there is searching, right? So, you have to be able to know how to search and find out your own answers, right? So, Googling for errors is obviously the first step. You know, you've got to get good at this and you've got to understand and you've got to wade through parse things. The more you do this though, the more you realize it's very tempting to just tighten an error, find that first thing, get the little command you need to type in to fix it and then go back and fix it and then never think about it again. It's very tempting because it's fast, right? Like, bam, I've got a problem, Google it, solve it. But if you don't realize why you made that problem or why that problem came up in the first place or why this fix actually helps, you're just going to do it again in the future and you're Googling that same thing and you're going to see that purple link in there that says you visited this page 20 times and you keep having this problem, right? So, you know, and it's a trade-off. Like, you're learning how to be engineers and you're going to be making trade-offs when you do things, right? So, it's about do I need to get this fixed absolutely right now or can I take the 30 seconds, the minute to maybe read all the Stack Overflow responses and all the comments, right? To understand if there's more context in there than I'm missing, why this thing came up. What could I have read? What documentation could I have read to figure out this answer, right? So, that way, you're kind of not just using the, you're not using Google as like a debugging system. You're using it to increase and learn and improve your own knowledge about the systems that you use every day. In that case, it can be very effective. Also, finding documentation, so this is something that took me a long time to do, but, you know, it's silly, but down like whatever language you're using, Python, whatever, have a local copy of the documentation. You know, storage is cheap. You can download the entire Python docs.  You know, it's fast to search through. You can search through it very quickly. You can have it there if you're on a train or plane or whatever, you still have access to that and you can be productive. It actually makes a big difference. There's a lot less of a mental gap when you're trying to search for something and you know it's right there on your computer as opposed to, okay, let's open up Google and search for this thing that I'm having. It can be actually very helpful. What I mean by this is navigation documentation. This is the point I'd be like, what does this mean? Yeah. Maybe bookmarks within your saved document? Yeah, I think being able to, yeah, so being familiar with the documentation, yeah. So if it was like Python library, you know, you have the modules on the left. So I know if, okay, I have a problem with, how do I use OS, I don't know, P open, no, that's not an OS. I don't remember, but if I'm using some module and I want to use some feature of a class of that, where do I look in the documentation to easily do that? Or how do I, for Linux commands, which we'll kind of look at, how do I run the man command to find out more information or how do I run one of the common help options on a command so I can get more information about how this thing actually works? Okay, so you gotta be able to search. What would be another thing? What happens when you find something? Get it to the next. What was it? You have to be able to understand it. Understand it, yeah, you gotta be able to read it, right? I mean, I know this sounds, and when I talk about essential, I'm talking about the essential skills, right? You gotta be able to read and comprehend and remember what you read, right? And be able to put it in context. The thing that kills me about Ruby on Rails and some of these other languages is that you search for a problem, you find a blog post, and you see, oh yeah, you just do this thing to fix it. You go fix it, it doesn't work, and you go back and you realize that blog post was written six years ago for Ruby 1.0 or 2.0, and it doesn't apply to 4.0 or whatever the current version is. Like, it happens all the time. It's because I didn't, this is personal, I'm speaking personally. So because I didn't take the time to read the blog post to see when it was posted, to see how fresh and how relevant that information is. So what are man pages? Yeah, manual pages on Linux. So you can type, so man is just a command, thanks for manual. And you put the command you wanna learn about. So if you wanna learn about the cat command, you type man cat, and then it'll show you a nice list. Oh, look at that in a second. It'll show you all the documentation you'd ever wanna know about the cat command, all the options it has, all the cool stuff. So these things are important. Reading documentation, what about reading specifications? Is that important? Why is that important? Yeah, in the back. If what you're trying to do is even possible with what you have to go with. Yeah, so actually that's a very good, honestly this is the way I think of programming, is I have a problem I wanna solve, and I have my toolbox of languages and frameworks that I know how to apply. And so I need to know which one's appropriate for the given task. So, yeah, the specification. So this is actually important. This is one of the things we're trying to teach you in this class. So the assignments are gonna be essentially specifications. It's like, hey, if you want a program that does this, that takes in this input, performs this computation and provides this output. And just like, what happens on a compiler if you forget a semicolon, like a C program? It errors out. It errors out, right, it's not correct. It doesn't matter that it's only one character. It might error out. Okay, it might error out, that's a good point. Nine times out of 10, it will error or perform incorrectly, right? And so this is why, you know, reading the specifications is very important. It gets very important, especially in the network world, right? If you and I are gonna communicate, our programs wanna communicate with each other, we have to have some specification for how this communication should happen, right? So all HTTP, IP, SNTP, everything has a specification and the implementations of those have to follow that. If you don't follow that, then our programs gonna talk to each other and everything just falls apart. Questions? This, honestly, I had debated if this should be first or not. So what is touch typing? Yeah, in the back. Say it again. So if you can type that touch in the keyboard, that's awesome. Without looking at the keyboard. Without looking at the keyboard. Yeah, yeah, yeah. If you can, yeah. Someday that would be super awesome and then I can get rid of this. If we just plug in more grain. With the thought or with speech?  Oh, it's creepy. Weird. I think it's fun though. Just interprets your thoughts. So why is this important? We're not typists, we're not secretaries. It just makes you faster. It's not data entry specialists. Makes you faster. Makes you faster. Is that important? Yeah. Why?  What's the one thing you can never get more of? Time. Time, right? Time, it's the one thing you're, well, maybe I shouldn't phrase it like this. 15 minutes you spend in this class today and you're never gonna be able to get back this class. I'm trying to make it worth your while, but you gotta think about that for everything, right? When you're programming, when you're at the computer, what else might it be important? Yeah, over there. Say it again? Checking error when you're typing. Yeah, you can check an error when you're typing, right? So if you're not looking down at your keyboard while you're typing, you can actually look at what you're doing and maybe spot errors. That's a good point. Well, I'll just hand it over to you again. Being a competent typist will save you a lot of time in typos instead of real problems. Yeah, being a competent typist can help with typos. Yeah, that definitely cuts down on typos.  Wait, so I just go back here? Like a proper technique in typing can reduce the risk of a preventative stress injury. Yeah, your wrist. So my advisor for my PhD, he has to wear like, when it's on serious writing things, he has to wear like a wrist guard, basically. Like, he's got a really bad RSI. It's a serious problem in our industry, right? Because we're in front of computers every day typing and I don't know, maybe it seems like a far away problem because you're young and your bodies are malleable and stuff. But, you know, it happens, man.  Somebody said something else. I think you said something.   So that's, it sounds mean. It's not meant to be mean, but I'll tell you why this came to my attention. So my story in this domain is, I mean, I grew up on a computer, probably like many of yous, been using it since I was very, very, very young. So I thought I was an amazing type or tightest, I guess would be the correct word. So I, you know, I didn't do home row. I didn't do anything like that. I could kind of get away with not looking, but I would just go wherever. Like there's a very weird natural kind of style. And I thought it was awesome. And I thought, and all throughout college, I was like, I'm the best. Why would I ever change this? Then I got to Microsoft and it was that.  So my group at Microsoft, we had bug triage meetings. So every week we get together, we put on the board, the screen, all the bugs that have been filed in the last week.  Should we fix them? Should we not fix them? What's the severity? All this kind of stuff. And normally the project manager leads those meetings, but she was gone. And so I was like, oh yeah, I'll totally step up and take those meetings. So I was new and trying to be very outgoing. I was like, yeah, I'll totally do that. As I was doing it, I realized like, oh man, I am making a lot of mistakes with people looking at me while I'm typing. And I'm leaving this meeting, right? They're seeing everything I'm typing in as I'm doing it.  And so that's, it wasn't really until that point that I realized, oh, I need to actually do something about this. So I did, I don't know if it was a half hour an hour, I practiced daily at Microsoft until I got to the point where now I can touch type, but I use home row and I'm so much faster. So this is why nobody ever told me this. This is part of the reason why I want to tell you this. So it's gonna pay dividends. It's a compounding thing, right? The earlier you start doing this, the more it's gonna impact you in your daily life and I mean the arguments against this is, well, I'm a computer scientist, right? I need to think and think about a problem and think about it and then I'll write down the solution. It doesn't matter how fast I write it down because I should be thinking more, which is valid. That's a valid argument, but the problem is if there's any kind of impedance between your thought in your brain and getting it on your screen, it's just gonna slow you down because it doesn't matter how smart you are, you're never gonna get the correct solution the first time, you're gonna have to backtrack, do different things, try different things, and if it's taking you longer than other people to do that, just to physically put keys to the keyboard, you know, you're at a disadvantage. So this is a little humble brag. So this is my word per minute score that I just did last night. I don't know. It says it's pro, that sounds super weird, but I don't know. 82 words per minute with like six errors. So yeah, it's fine. You know, I do a lot of writing. I do a lot of, it helps when I write like grants or papers or emails or anything, even without programming, yeah. Do you recommend like certain like online kind of? I couldn't get, I just, I don't remember. I just looked for like free touch typing things and I just used whichever one. Yeah, no, it was a long time ago, but I did that probably about six years ago. So yeah, if you do this now, you'll be much better. You'll be far above your peers. All right, the next topic is tricky. So we're gonna approach this. So your editor, right, your text, your editor. So I'll start this off by saying, I'm not gonna get any religious wars about what technology is better than the other because I don't think it's productive and it's not my goal right now to sway you to, you know, demand that you choose one thing or the other. But when you think about it, so programming, right, it's your brain to the computer. You want something to appear on the screen, right? So it goes through your brain and then to your fingers, right? So that's what touch typing is about, is making sure you can type, I can't do it. Okay, yeah, making sure you can type, right? Very quickly, so that part's not slow. And so the editor part is the thing that takes in what you're typing, right, and makes it on the screen. So really, I like to think of it as your editor is really your main tool, your main instrument to crash the program. And I do literally mean craft, like a craftsman crafts a- Sculptor. Yeah, like sculpting or, I don't know the tools involved in sculpting, like the chisel and hammer. And hammer, maybe more than that. Yeah, chisel and hammer or, yeah, so like chefs use the best possible knife that they can, right? The sharpest knife, even if it takes them a half hour to sharpen it every day or something or they've got to clean it in a special way, right? They're gonna use the best knife that they possibly can to cut stuff. Mechanics are gonna use the best wrench, right? Because they don't want something that's gonna break halfway through when they're underneath the car trying to fix something, right? They want to use the best possible tool. And I ran out of metaphors, I went with baking next. So bakers use the best knife. I'm sure there exist some ovens that are better than others, right? And I'm sure bakers know exactly about them where they can specify, and they have crazy different kinds of ovens where you can control humidity, all this kind of stuff which can affect whatever you're cooking or baking. And not only this, not only do they use the best, but they know the ins and outs of whatever thing that they're using, right? So the chefs know, hey, this is exactly how many times I need to sharpen this knife and this is how I need to sharpen it. Do I need to use a wet stone? Do I need to use a leather strop? You know, what's the best practices for that? And they constantly talk about it. They constantly try to, you know, get the newest or the best steel or something like that. So really investing time in learning your editor is critical, absolutely critical, because this is gonna be your best tool. So a little segway, because this is where all this is going. So we're talking about efficiency. The mouse is evil. I guess I should update this. The mouse and track that are evil. I didn't think about that. Why are they evil? Because they're not efficient. It's one less hand you have to type. One less hand. Do you type one handed? You can. I can. I mean, with the mouse, I would not type like that. I've heard of my own a couple of times. Ah, okay. When you have to, you definitely can. Yes, that's true. What else? Why are mice evil? Yeah. It's a lot slower when you compare it to like keyboard shortcuts. Yeah, so it's slow. Fundamentally, it's slow. So this is actually the best thing I took away. I took an HCI, human computer interface class at UC San Barbara. And the best thing I took away was this. So they have this model called the keystroke level model and the details aren't important, but it models how fast different user interactions are. The idea is if you're gonna build a system, before you build it, you wanna predict how fast is the user gonna be at performing a certain task, which is hard to do. You have to build the system first usually and then show it to a user and then you realize they're really slow at it. And so you have to then go back and fix it, but this allows you to do that before. And so what they did is they looked at people and they took an average of how long people take to execute certain tasks. So something like pressing a key either on the mouse or on the keyboard is if you're a very fast typist, it can be 0.08 seconds per character, just fast. Average typist is about 0.28 seconds. A slow typist is like 1.2. This is crazy. Can you think about 1.2 seconds between typing every, imagine how long it would take to type in an assignment. One Mississippi, one Mississippi, one Mississippi. You'd have to start the day at the sign just to get it done the first time. Yeah, you do have to start the day at the sign. But yes. Just get your first iteration. So these are just for pressing keys. So then for moving your hands from the keyboard to the mouse or the mouse to the keyboard, right? Because it's not an automatic thing. You have to like find the mouse and find it and then find where it is on the screen. So they measured that it's about 0.4 seconds. And then you have to point the mouse, right? You have to point the mouse cursor from wherever it is. So you have to find it, and then you have to look at your target on the screen, and then you have to move your mouse of your hand so that the digital mouse pointer moves over there, right? How long does that take? Two seconds. Two seconds? A little high. One second. One second? So it's about eight or from 0.8 to 1.1 seconds, depending on the distance that you have to go. So let's put this all together. So if you're using a mouse to do something, think about it's a simple, let's say you want to drag and drop something from the menu bar, right? So we don't know what the mouse is, we have to move to the mouse, we have to go to the menu, we have to click it, and then we have to click on one of the drop down entries, right? So we first are going to move our hands from the keyboard to the mouse, then we're going to point the mouse, then we're going to click it, then we have to point the mouse again, and then we're going to press the left mouse button, and we're going to move from the mouse to the keyboard, taking 2.82 seconds. Select one thing from the keyboard.  So that's why all these things come together, right? So you definitely don't want to be in here, you want to get as close to that as possible because it maximizes the game. So, why do I talk about this? You want an editor where you almost never have to use a mouse. That should be your ultimate goal, is to get comfortable with whatever editor you choose, such that you never have to leave the keyboard. It's going to be slower. And yeah, I don't know, we looked at that thing. They'll say it was, I don't know, it's a difference of a second, maybe you're setting yourself a second.  When you're moving a window around, you're losing another second, right? So your goals should be efficiency, right? I don't want anything to get in the way of me and editing text. So what editors do you guys use? I'll also guess some, but yeah. The sublime text. Huh, sublime text? Yeah, I've heard that's a good one. No path plus plus. No path plus plus. IntelliJ. IntelliJ. Vim. Vim. Eclipse. Eclipse. Is that it? Netbeams? Yeah. It's called C-Lion from JetBrains. What was it? C-Lion. C-Lion? It's a JetBrains. A C-Lion? Yeah. Oh, interesting. Okay, I know the complex. JetBrains. I've heard of it. Okay, so I'm gonna suggest two old school choices. One of them was already said, Vim. The beauty of Vim is that it's installed everywhere and it has, I'm not gonna get into it. There's tons of resources, but it has a dual mode so that you can switch between editing and writing text or composing text and Emacs. The great, the awesome thing about Emacs is it's, well, it's written in a programming language that's incredibly extensible. So you can literally write new functions. You can bind keys to different things. I'll show you something in a second. So it's super extensible. It has a single mode. Honestly, whatever, as long as you're an efficient, right, this is the key thing.  So let's see how this works. Oh, man, we don't have time. Okay, I'm gonna go back at the end. I have an example of showing you some cool stuff you can do in Emacs, but I won't do that now. Here's some stuff if you want. So I use Emacs, so I'll push it just slightly. Lots of beginners' tutorials, some of my favorite things. I use Emacs macros all the time for manipulating and refactoring data. Okay, so editors are definitely important. The command line is also incredibly important. So you should be getting familiar with the Unix, POSX, Linux command line because it really is an amazing tool. So you can compose commands together to execute commands. You can conditionally execute commands. You can do output redirection. So you can say, run this command and output it to a file, which is very handy. You can run things in the background. You can sleep things. And, you know, it's designed not to be used with a mouse, right? So you never have to go to a mouse. I will say, you know, for all these things, there's definitely a learning curve, right? So you have to invest the time to learn it. But eventually, right, that builds up and that builds up and then you're saving a lot of time. So lots of stuff. You can find those interesting things about how to use. Oh, command line foo is really interesting. They have a lot of command line snippets for doing various things. Okay, I'm gonna try and breeze through this so I can maybe have time for demo, but I don't know. Okay, debuggers, who uses a debugger? What do the rest of you use when you have not perfect code? A defining rod. A defining rod. Is that your brain? Magic ball or witchcraft. Witchcraft, magic. Seriously, how do you find errors in your program? Usually whatever ID I end up using. A print statement. A print statement, yeah. That is a legit form of a debugger. That's true. It's very crude, I would say. And you have to be very careful because you run it, you get the output, right, and then it's done. So this is another area that I would invest time in. So the beauty about a debugger is it'll let you inspect a running program to find out what went wrong. So with a GDV and a C program, I can debug that program, I can connect to it, and then I can say, hey, what's the value in this pointer? What does this thing point to? What's this field's value? And then I can think, how did it possibly get there? So it can help me, I like it a little bit better, I mean, not a little bit. I like it better than print F debugging because I can, you don't always know the questions you want to have answered when you're doing print F debugging, right? You may think, oh, I'm gonna print out what the value of this pointer is, right?  And then you have to say, okay, now what do I need? And then you have to put in another print statement and then run the program again. So it's this efficiency thing, right? To debugger, you're connected to this process at this exact moment in time of its execution. So you can say, okay, what's the value of this pointer? Huh, it's null, that's weird. Then what's the value of this other pointer that I just copied from? Oh, that's null too, great. And then you can kind of work your way back and using your knowledge of the code that you wrote with the debugging output. And oftentimes it's really cool, it's also really great for prototyping. So as you're developing, I sometimes use a debugger because especially in languages like Python or newer languages, you can evaluate functions and expressions in the context of the currently running program. You can even do this with GDB. So you can, let's say, call one of your own functions with whatever parameters you want as it's currently not running, but as it's paused, essentially. So this gives you more insight into the program. Say, huh, what happened? This thing just got called, what happened? So I suggest if you're using your IDE's debugger, like Eclipse, it's using GDB under the hood. So GDB is the GNU debugger, I believe, I may have just made that up, but I assume that's what the G stands for. And it's a command line debugger for Linux, once again. This is where the trade-off between mouse being evil and debuggers becomes a little more fuzzy because having the visual debugger is nice because you can look at your code, you can hover over things, you can get a dropdown and sometimes you can hover over those objects so it can make exploration a little easier. But becoming familiar with GDB is definitely very helpful because other languages have other things. So Python has, is it PBB? High PBB, so far? PBB, I think it's PDB, right? Yeah, you can PDB set trace and debugs. And then this is, so this is kind of what I said. So becoming an engineer, as you know, when to use a debugger and when to use printf, these are all really important things. And these will help you in this class, it'll help you in other classes, it'll help you in your career. Yeah, being able to use these tools, right, effectively is really the goal. Any questions, so far? All right, here's some advanced topics if you wanna go, you know, a little bit more advanced. Bash scripting, so being able to write scripts so to automate frequently run tasks, all this kind of stuff, Bash is really awesome.  I have, I think I looked yesterday, well maybe, maybe I'll show you on Friday. Maybe I'll save the demos for Friday. But my Emacs file with all my customizations, I think it's like 250, 300 lines and it's just stuff I've collected over the years to do cool things or new modes or new functionality. And it's like code snippets I find online, other editors have good plugins, all that kind of stuff.  I don't know, steel, what else would be good? I don't know, not a nice person. But the point is, it's not just a tool that you use, right, you can actually shape it to yourself and your needs. Okay, you should definitely be learning version control systems. This maybe you can, we'll eventually get in the central. So you honestly should be learning Git because that's kind of the standard. Subversion is also good to learn. And honestly, really, you should be using that stuff for this class. It's going to happen, you know, the fact that Visual Studio ended up saving your file as all zeros for some strange reason. That's not a good excuse.   And I guess even if what you're doing is creating different versions literally of your file with different names, as long as you're doing something, but so yeah, this is more advanced, I don't think it's absolutely necessary. Another thing that's very handy is unit testing. So if you want to learn more about how to write correct code, unit tests are a great way to start to be able to actually have some assurance that the code you wrote is actually correct. And this can help you in your classes if you get better and better because you can write a little function, write the test for it. And then now you know, great, that function is solid. And you have those tests that will carry you forward throughout the project. But that's it. Questions, I guess, before we have anything burning? All right, see you on Friday.


Today, I'm pleased to announce that the province is providing eight million dollars over the next two years to assist with the installation, the upgrade, the replacement of playground equipment for public elementary and middle schools all across British Columbia. And I have spent a fair amount of time in my life so far in playgrounds like the one behind me doing parent supervision and working my way down the slides. The real winners with respect to this announcement today are the guys behind us. They're slightly smaller than I am in most cases and they are going to benefit enormously from having this investment in safe healthy playgrounds to have activity in each and every day. What's especially important I would say is that this provides an opportunity to level the playing field. So not all schools have been fortunate enough to have a parent community that can raise the funds to provide a playground such as we've got here. So providing the opportunity for other schools to have this experience is really exciting for us and I'm very appreciative of that. They aren't just used during school hours either they're used before and after school in some cases they're also used by community groups they're a real amenity that make our neighborhoods better places to live and now every public elementary and middle school in British Columbia that wants a playground is going to have one. Thanks very much.