Hey everyone, we're back with that net comp. So We did a little troubleshooting and it seems like Miguel just muted us He was all the way down. That's we couldn't hear us.  I mean, yeah, I know it's true It's true, but the content was so good and I would talk it with cam so for our next speaker was right here Say hi say hi cam Hey everybody, so we were like talking behind the scenes like well, we'll let Miguel do Miguel stuff And then we'll come back and go about it. But anyway, now we got cam here.net comp talking about Have your raspberry have your pie. I need it too. Let's talk about that cam Sure. So before we start. Hey Miguel if you're watching man, I'm so sorry. I had to cut you off I was really digging your talk So one of the most exciting features of Dot net core is its cross platform compatibility So this applies not just to server and desktop environments But also to iot devices raspberry pi is arguably the ultimate iot platform because it packs a very broad range of Functionality into a credit card size device that's affordable for students hobbyists and professionals So what we're going to cover in this talk, let me Share this Where's my display? There we go What we're going to cover is We're going to talk about the basics Where's my slide? There it is Uh, so we're going to talk about developing deploying and debugging dot net core code on the raspberry pi There's a lot less that goes into it than you would think. Um, this is actually going to seem kind of 100 level stuff Then we're going to talk about gpio GPio stands for general purpose input and output it refers to This header here on the motherboard Um, it's a collection of pins that we can use for all kinds of input and output purposes What we're going to use it for today are some pretty simple demonstrations We're going to control an led and we're going to control a reversible motor We're going to turn a motor on and we're going to be able to make it go uh forward or backward And then after we play with the gpio pins a little bit We're going to take it a step further and use our iot device on the internet. We're going to uh integrate a few Components with some cloud services We've got a sensor that we're going to use to alert us when a door is open or closed And the final thing we're going to do is we're going to control an array of leds using cortana here on my desktop So with that let's start at the very beginning. Hey cam really question Quick question somebody wants to know what version of the raspberry pi you're using So i'm using a raspberry pi Three model b not the b plus although the b plus is a very incremental upgrade over the b. It just has adds it's like a rev on Bluetooth and it adds a power over ethernet header. Oh, wow So yeah, we're using yeah, so we're using the 3b Um, but the demos that I have out on github and I'll share that lincoln a little bit Should work on should work on the 2 the 3 the 3b. I don't know about the zero I haven't tried it on the zero, but I I'd be I'd be interested in hearing what what uh, what your experience is with that Awesome. Thanks, man. So sure So i'm going to jump right into a demo I'm going to show you how easy it is to get dot net code running on the raspberry pi now I'm not going to go through, you know, where to get the raspberry pi and the operating system and all that It's out there on the internet. It's easy to find We're going to start Where I've got a raspberry pi device sitting here on my desk. It's connected to my network And it's running the raspbian os with ssh enabled. So all we need to do is write some code. So let's get to it So i'm just going to pop open a new visual studio window here And we're just going to file new project ASP.net core web application And i'm going to call it Pi demo Ah, I already have a pi demo folder. How about pi demo 2? That's creative I'm just going to take all the defaults. So it's going to be an ASP.net core 2.1 razor web application. All right So that's done. There's really no need to review this boilerplate. I'm sure anybody who's done an ASP.net core applications seen it all I think I will go ahead and we'll just change some text On the index razor page just so we can say that we changed it There we go And let's run it locally real quick to make sure it works and that I didn't somehow break anything All right, so that's it's working. That's fine. Now we need to get it onto the raspberry pi Well to get it on the raspberry pi. I need to package it up as a deployment first There are two ways we can do deployments in dot net core There's a framework dependent deployment that expects the framework to be Installed on the operating system or there's a self-contained deployment that has all the dependencies along with the executable I'm going to go with the self-contained deployment. So I don't have to worry about getting the dot net framework The dot net core of runtime and framework installed on on my device Now I could Package that we are in pi demo 2. I could publish that rather dot net publish dash r for To make it a self-contained deployment targeting linux dash arm And that that will work that that will do exactly what I want it to but since I use a visual studio to Build the application. It seems to me like I should probably use visual studio to at least publish it Before I before I ftp it out to the device So let's take a look at how to do that really quick Just like publishing to azure. We're going to right click on the project and go down to publish But I'm going to publish to a folder I'm going to put this folder. I'm going to put it in the root. I'm just going to call it a pi demo 2 pub Then we're going to set a few advanced options I'm going to go with the debug configuration because I'm going to be showing you debugging here in a minute Uh target framework is that is net core app 2 1 Deployment mode is not going to be framework dependent. It's going to be self-contained And target runtime. Well, you'll notice linux dash arm isn't in the list. That's okay. I got you We're going to pick linux dash x64 Save the profile and create it I'm going to go ahead and rename it just so uh, I I know what the file name for the profile is we're going to rename it Pi profile Now before I click publish I'm going to come over here to my properties node under the project and there's a folder for publish profiles If we look in there, there's my pi profile And this is the profile and there's the linux dash x64 runtime identifier I'm going to change that to linux dash arm and save it And now I can come back over here and I can click publish And it's going to do its thing All right, so it's done. Let's see what we've got You know a border that I put I put in c pi demo 2 pub So there we go. We've got a whole bunch of files in here. We've actually got 355 files in there But uh, that's that's everything that our application needs to run on the device Uh, let's ftp that out there because it's going to take a few seconds to transfer and before we look at the files Hey cam Yeah, there's a couple questions in here and the people are wondering um, skull crusher for life Is asking if your stuff contained will it package the required dependencies there and saving space on the raspberry pi Um, you know, I don't know of all of the all of the deployments I've done It does seem to grow if I'm doing asp.net versus say a console. So I'm inclined to say yes, but to be honest I haven't looked that closely Um, I I it is a bigger transfer from asp.net So I'm inclined to say yes, and I'm I'm hoping that somebody has a more definitive answer Gotcha because there's a follow-up when someone's saying is there a performance difference between publishing a self-contained or framework independent? So I would I would assume that framework can be bigger though, wouldn't you? Well, I wouldn't assume there's any type of performance difference. It's the same It's the same binaries that are are being read in at runtime.  All right. No, it's all good. Go ahead continue answer Well, I see another question just popped up. Jose wants to know which of us is running on the raspberry pi And that is I'm running the latest version of raspy in linux So, um, yeah, so we're gonna grab this publish location. Where was it? Where did I call it? I probably need to refresh locally. There it is pi demo pub And I'm going to connect to my raspberry pi over sf tp in file zilla file zilla is an open source file transfer client Um I actually have a profile already set up sf tp uses the same username and credentials as ssh So when you set up your pi and you go into the configuration tool to turn on, uh, like wi-fi and things You'll also want to turn on the ssh service Let's make a little location. So you see we're in our home directory for the pi user I'm going to make a location To store that, uh, we'll just call it pi demo Actually pi demo 2 There we go And I'll come over here control a drag and drop And let it go and this will take a couple of seconds. It's uh, about 93 megs total with all the dependencies While that's doing that. I want to come over and I won't actually look in that folder And we see a lot of things that you would see in a typical, uh, asp.net core deployment, right? Like your app settings Uh dot json files and we go down and there's a whole bunch of dlls and pieces of the framework and compatibility shims for linux and all kinds of things Um, then we get down and we see like we have pi demo 2 dot dl and pi demo 2 dot views dot dl Those are also what we would expect to see in a razor app But we also have this file right here this file that has no extension Pi dash demo 2 no extension. That's actually the executable file. That's actually what we're going to run in linux There's probably a term for that. I'm really more of a windows guy anyway So I if there's a terminology there that I'm not aware of I'd love for somebody to tell me But um, all right, so our file transfer is done So we should in theory be able to ssh out to the shell on my raspberry pi and Should be able to run it right Well, not so fast Uh, here's let me go ahead and type in the command pi demo 2 permission denied If you're not familiar with linux linux has a mechanism whereby we don't just run any file willy-nilly We have to give files permission to run And the way we do that is the chmod command So i'm going to give it Uh permissions So now it should be able to run give it a few seconds to jit All right, it's running Now I can't look at the website yet though because We're running as a as a kestrel application. Whoops wrong uh wrong Zoom it. Uh, we're running as a kestrel application And kestrel by default if you don't tell it otherwise Is only listening on the loopback adapter localhost port 5000 So we can change that right you can change it in code We can go to you know the the programs.cs and come in here and when we're Creating our web host we can add a dot use urls right for example But what we can also do is just at the command line. I'm going to control c to end the program And i'm going to run it again, but this time i'm going to pass in a switch urls http http colon slash slash star so every adapter port 5000 All right, so now we're running and we're listening on all the network adapters on the device So we should be able to go to my browser And I should be able to go http colon slash slash raspberry pi port 5000 Well that wasn't what I wanted. Why are you searching edge? You should not be searching You didn't search earlier There it goes it's loading this time All right, so there's our website running on the device. So that's really all there was to it. I mean Dot net cores cross platform We really should be able to pick up an application and run it on any platform without any significant changes Now debugging the application is where it gets just a tiny bit trickier, but it's still not that difficult I'm going to leave the application running I'm going to come back over to visual studio I'm going to get rid of this little change I made there we go and We're going to go to debug and attach to process and in the connection type When you come in here, it's usually going to say default and it's going to list all your local processes But we're going to select ssh The connection target is going to be your username at the network address And it'll prompt you for a password. It's not going to prompt me because it's got my credentials cached already But I'll hit enter And there's my list of running processes on on the raspberry pi and there's pi demo 2 So we can just attach right to him It asks it's asking us what type of code we're debugging. So this is managed code I'm looking at the while it's attaching. I'm looking at the chat I do have like a foot tall deadpool character standing here on my desk, by the way um All right, so it's running. Uh, let's set a breakpoint real quick I'm going to go into the razor page I'm going to set a breakpoint where it drops out of the on-get method So in theory, we should be able to come back over here to our browser refresh the page and hit the breakpoint So it's going to take a couple seconds this first time because there's a little warm-up involved But pretty quickly we do hit the breakpoint. All right, so let's continue I'm going to hit refresh again You notice it hits the breakpoint much quicker that time So that's how we debug in visual studio. You can debug in visual studio code too But there's a little bit more involved. There's a dependency that you have to install on the pi And I've got a link to a walkthrough to that on the github page for this talk. I'll be sharing that url later all right so That's pretty much all we need to do to get an asp.net core app running Now I want to talk about some of the device specific features of of the raspberry pi specifically GPIO right Now before we start talking about GPIO, we have to talk a little bit about just a tiny bit about electrical engineering Now, let me preface this. I am not an electrical engineer There are probably plenty of you in the audience who have Way more experience in electrical engineering than I do I've been probably going to mess up terminology and for that I sincerely apologize feel free to correct me in the chat Or twitter or whatever So The hello world app when it comes to gpio is blinking and led To do that i'm using a few devices here that I want to make you familiar with The first one Is this little blue thing right here on my device? It's black on one I think it's green on another one, but it's it's called a cobbler or breakout board The idea behind this cobbler or breakout board is that I can hook On the raspberry pi itself a ribbon cable that connects the gpio header to the header on this cobbler and Then plug the cobbler into a breadboard which makes it easy to connect Wires to these various pins on the raspberry pi and and have a visual representation of what i'm connecting to Now the breadboard itself if you've never used a breadboard and breadboards were new to me until recently The breadboard itself is a device that's used for prototyping circuits without doing any soldering Which is really handy for me because i'm awful at soldering So the way it works is all these ports on the breadboard are connected to other ports on the edge We've got ports running down the length of the device And in the middle We've got ports that run on either side of the median And what this allows us to do like I said is to plug our cobbler into the breadboard And then use jumper wires and kind of play operator You remember the old cartoons where the operators would plug in the the plugs into the switchboard and it's kind of like that Again, i'm not going to go into the circuit or why the led works or why there's a resistor there or anything like that But what's important Is to know that to turn on the led i need to turn on gpio 17 that's pin 17 I just arbitrarily picked pin 17 There's no reason to pick it over any other one I just arbitrarily picked that one and it feeds power to this rail down here on the bottom Which feeds power to the resistor which feeds power to the led Which is connected the cathode the out pin on the led is connected to this row right here Which goes back to the ground pin on the header So um, that's the circuit Now before I show you the code that's going to run this circuit I need to show you a feature of the raspbian operating system that's fundamental to how the code works So let's drop out of the slide here And i'm going to go back over To my shell And what I want to show you Is a virtual file system location on the raspbian operating system So this slash class slash gpio And what this file system location allows us to do is it allows us to control our gpio pins directly through the shell Let me let me demonstrate So if I look at the contents of this directory, we have a few different locations We have locations named export and unexport and we have three Representing gpio chips. Uh, we're just concerned with export and unexport at this moment Now to open pin 17 I'm going to write the text 17 And i'm going to pipe it to that export location So now if I look at the directory contents notice That I have right here A gpio 17 location So if we change our directory to gpio 17 And look at the contents We have a few other locations and what we're concerned with here are direction and value So whenever we open a pin, we need to set a direction We need to tell the device whether to whether to generate current or expect current coming into the pin like a ground pin um The way we do that is we write again. We just write a text value And in this case out we want the pin to generate a current echo out to Direction All right, so direction is out and then we can turn on the uh led turn it off and on Uh by writing one or zero to the value location and to show you an actual breadboard with the led I've got a little camera rig here. I actually had to do a little bit of a rube goldberg contract contraption where I'm remoting into another machine driving the camera because Skype does not like this camera And um, you can see that this this circuit is exactly the same as it was on the schematic I showed you a second ago Or I mean I've got it plugged into pin 17 the blue wire right down to the wire color I really wanted to make it so you could reconstruct this at home without too much effort So um So yeah, we should be able to just write one to the value And it should be able to it should turn the led on. Let's let's try it echo one to value And there we go we turned on an led Now let's turn it off There we go And then we can close the pin by echoing 17 to unexport All right, if we if we look at the directory again 17 has been closed So How do we do this in dot net? Well, there are apis to do it um, certainly now I uh, uh Did not use any of the other apis that are out there and we're going to talk about that later near the end of the talk I actually rolled my own and um This gpa gpio dot net project in the uh demos folder on the github repository for this talk Um has a gpi open class Now in that class Um, we just have three properties number direction and value And we'll come back to the getters and setters for value here in a second when we Initialize the the object We are requiring a pin number in a direction in the constructor Right, and we're setting those right off the bat And we're writing those out to that location. So we're opening the pin then later on we're setting the direction And then we're setting a default value, right? So we have an optional parameter on the constructor That that sets a default value of pin value dot low. Wait, wait, wait low. What's that mean? We talked one and zero well in in, um in Gpio terms high is one low is zero I don't know why all right. This goes back to me saying i'm not an electrical engineer I'm sure somebody in the audience can probably tell us why um, but uh Uh, but that's that's the terminology. So that's what I went with The other thing that this class does is in the event That we set pin direction in in other words, we're expecting current So we're gonna watch to see if the circuit is broken. Um, I kick off a task asynchronous task That I call pin watcher That just actually pulls the value every 10 milliseconds and uh fires off an event if If the value changes to either high or low Why am I polling there? Why didn't I use like a file system watcher? Well, I tried using the file system watcher and it doesn't like that virtual file system thing So, uh, I had to use kind of this hacky cluchy method Um, there is an api out there that will do it kind of the right way directly in memory But it's not quite baked yet and we'll get to that So my hello world led program Where was the code for that? There it is All it does When we run the code is it's going to new up my gpio pin class with pin 17 direction out And we're going to loop five times. We're going to turn it on wait a second turn it off. Wait a second That's all we're going to do now gpio pin. It implements I disposable because I I made it. I wrote it in such a way that it it is Consider it and closes the pins that it opens So, uh, we want to use the using pattern to make sure that we dispose of it properly So with that I've already got it built. I've already got it deployed Let's just go ahead and run it. Let me Get the breadboard up where we can see it. There we go And sure enough it works All right, so on one hand. Yeah, that's pretty cool We can control an led through hardware that you know kind of like low level on the metal hardware But on another level big deal. We turned on an led, right? Well That little piece of functionality being able to open and close a pin open and close a circuit like that Gives opens up a whole world of possibilities for us Let me illustrate The next demo I'm going to show you is this circuit now I realize this circuit looks kind of nasty has lots of wires and relays and things like that But it's really not that bad. Um, I'm actually switching out my breadboards while I'm talking. Um So I've got two relay modules attached to attached to my breadboard And what we need to take away from this is that the first relay module The one on the top there it's only using one of its two relays because these are dual relay modules It's connected to pin 21 and all it does is Open and close the circuit turn this motor on and off that's all it does Now the other one the the Second relay module has two relays on it and we are actually using both of those But what I want to point out Is that they are both hooked up to the same pin in fact, let's zoom in a little bit there You can see Those are both hooked up to pin 27 Both of them Now, why would I do that? Well, the reason I did that is because I wired this circuit in such a way that when These two relays on the second relay module are turned off Power flows one way through the circuit And then when we have turned them both on at the same time we use a different set of wires And power flows the other way reversing the polarity of the motor Okay So we're going to I see somebody likes my zooming. Oh, it's scott. Hey scott. You like my zooming skills, huh? So I'm going to Switch out let me plug in this breadboard Really quick This again, this breadboard is Exactly what's on the schematic. I showed you Right down to the wire color. I I paid a lot of attention to detail I 3d printed a little bushing to hold my motor so we can make it more visible for you And I put a little spinner on the on the shaft So when the motor's spinning you have a visual representation of it So, uh, let's uh, take a look at the dot net code that goes along with that real quick before we run it This is the motor project in the demo solution. We'll start with the motor class The motor class, um, it's actually really simple when we knew it up We pass in in the constructor a Power pin number and a polarity pin number And we knew up those gpio pins Um, and notice we set a default value of pin value high Why on earth would we do that? Well, it has to do with the way the relays are expecting, uh, current from the device It turns out that my relay modules, um, expect pin value high to be on and pin value low to be off Uh, it's just how the how the relay modules were designed. So I'm just rolling with it So when we call on we set pin value to low turns the motor on when we call off We set high turns the motor off and then I just arbitrarily chose high and low for forward and reverse Um, the program code That launches that motor class. I just made a little command line interpreter, right? So, um, it news up the motor using the using iDisposable pattern again and, uh, Sits in a loop Looking for commands on off reverse forward and exit and those are all pretty self-explanatory So let's go ahead and run it Uh, need to put the breadboard where you can see it. There we go. Uh, yep. I know it's a directory executable, please There we go All right valid commands on off forward reverse and exit. So let's try on The motor's spinning All right, let's reverse it. All right. It's going the other way Let's go ahead and just turn the motor off So you'll notice it's still reversed and the the relay that controls reverse and forward is, um It works independently of the relay that controls on or off so we can set it back forward again Turn it on again and off So that's a practical application Beyond just turning a light on and off.  You could connect relays to lamps to you these relays actually support up to 15 amps On a 110 volt circuit so you could control your your uh, your your household lighting with one of these if you were so inclined All right, so We've put the things in internet of things. We've been looking at the gpio pens But this is all everything we've done so far has been Constrained locally to my raspberry pi right here on my desk What I want to do now Is I want to show you a few projects that I did To give you some ideas of things that you can do with this using some services out in the cloud And to start i'm going to dive right in With that door alert sensor. I told you about now Let me switch out my breadboards bear with me for a few seconds Hey cam. So what I've got now Hey cam Yes, everybody's loving you. This is amazing You're doing a great job man I appreciate that you never know how a talk is going to be received until you do it And this is a brand new talk I mean this is this is this is up there I appreciate that So, um, what i'm going to show you now is we're actually going to use pin direction in right We're going to mod we're going to watch a circuit to see if it gets you know See if it's opened or closed and uh, what i'm using are these little magnetic This little magnetic read switch So the the whole idea behind a read switch is when the magnet is present The switch is closed So the circuit is connected and when the magnet is not present the switch is open So the circuit is disconnected and let me zoom in a little bit here So I can show you you can't really make out the text on the breadboard But the blue wire is three volt power And that's going to the read switch and then pin 20 right there Is uh, that's going to be in that's going to be what's watching to see if the power is coming into the pin or not And firing off events in our code So let's look at that code real quick So we understand what's going on This is the door watcher program So I'm going to skip right down here to main And all I'm doing is I'm newing up that pin on port 20 direction in And I'm wiring up a couple of events uh contact switch high and contact switch low If we go look at those two events, they both do practically the same thing They pass a message off to a method called post status And what post status does is it kicks off an asynchronous task That serializes a message and if you're wondering what that What the uh what that looks like there's not much to it. It's just a single property on that class um It serializes that message to json and it posts it To an azure logic app now I chose an azure logic app for this because they are dead simple to set up Um, we can go look at it real quick This is the logic app. It has uh, it has a single trigger and a single action The trigger is just an http webhook. So you saw back in back in the code. I'm, um, I'm posting to a http location And uh, there's the the schema for the message that maps matches the class in my uh in my project And then what it does with that message there's a billion different connectors that we can choose from in in logic apps I chose slack in this case just because it would be easy to uh show here on the screen share But you could use something like twilio You could log it in an excel spreadsheet if you want to know who came and left your office all day You could set that up and I'm not who but what time people came and left and when the doors opened You could you could rig up a home security system You could do stuff like that and make it go to your phone go wherever that's kind of kind of the magic of something like logic apps So let's look You can see where I was I was actually trying this earlier. I have meant to reset this. Um, this is my this is my slack room right here and Go back to the gpio. Let's Move this over here And I exit my motor program Whoops There we go And let's run the door watcher program All right, so now it's waiting for the switch So you can see up in the breadboard. I'm going to put the uh magnet next to the switch It's going to take a few seconds to wake up the logic app the first time But after that It's basically Sub-second so there we go there's a a uh A uh home security system made with a raspberry pi and a five dollar read switch Okay Now for my final uh demonstration of cloud integrations that we can do I want to actually use cortana um to Drive like I said, I have an array of leds that I want to be able to instruct cortana to turn these leds on and off Um, there's a problem with this however And I've got a slide to illustrate that The problem is that the way this is going to work So I'm actually going to do this with the cortana integration on ift if this than that. It's a it's a service It's a lot like logic apps Um, it's it's a lot simpler though It has a single trigger and a single action if a happens then b And cortana actually has some actions out there that are pretty robust that are really easy to use I'm going to show you that here in a second So my thought was well, we could trigger cortana. We could invoke cortana Dot net bot is going to help me with that if I can ever click there we go We're going to invoke cortana and that's going to set off the trigger in ift, right And then ift could maybe fire off a webhook to hit a web api on my raspberry pi, right? I mean that seems to make sense The problem is we're here in my home office. We're behind my firewall I could open a port on my firewall, but I'm not going to do that What if I was in a location where I couldn't open a port on my firewall? Uh, so the traffic's not going to get through and that's not going to work So we have to come up with another solution So the way this is going to work Is we're going to use a couple other services We're going to use an azure logic app and an azure service bus message queue And the way it's going to go is when we first start the application It's going to make an outbound connection from behind my firewall To the message queue where it's going to watch the queue And uh, it's going to wait for new messages Then at some future time we can invoke cortana Which will fire off the trigger on if this than that Which will send a we use a webhook and post post that webhook on another azure logic app Which that logic app will in turn Create a service bus message and put it on the queue Where it's immediately picked up and acted on by our application All right, so I'm going to walk through all the code on that and then we're actually going to demo it We close that So let's start with the Service bus queue. There's actually nothing to the service bus queue I already have a service bus namespace. I created there's no I just took all the defaults And then there's two queues I put in there. I had one for another demo that I'm not that I If not going to be doing and I have this one here called cortana There's all default. I made no changes whatsoever. Just uh file new basically Now the logic app let's check out that logic app that logic app Again is pretty simple. It's pretty much the same as the other one We've got a webhook here, right with a simple schema that's expecting um a single property called color And the action that that logic app is going to take is it's going to Send a message to a service bus queue named cortana And I've already done all the wiring up and it walks you through it the first time you you set it up Okay, so that's the that's the the two azure components. It's a service bus queue and the logic app Let's go look at the dot net code really quick Don't don't do this by the way. Don't don't hard code your connection strings. I was rushed. I was rushed You put your connection strings someplace where they belong, please So what we do is we open up these three pins And uh Then we connect to the service bus queue and we watch it We register some handlers to handle the handle the messages as they're posted And then we uh, we just say, okay, we're waiting for cortana Now the handlers are actually pretty simple. They're very similar to the To the door watcher app. Actually the same kind of thing Where all we're doing is we're looking at that message Right and we're looking first thing we're doing when we get down to the process color text It has to go through several levels of of process messages and handlers and so forth But when it gets down to process color text, we're just looking if it's red We turn on the red light if it's yellow we turn on the yellow if it's green we turn on the green Again, you're going to say, okay, but why is this pin value low and not pin value high? I'm going to explain that in just a second. This one's actually pretty easy to understand for me anyway um And then if if it's not red yellow or green, we're going to blink all the leds is kind of an error state to say Hey, yeah, this isn't this isn't a color you asked for purple and we don't have purple So the final thing that we need to do to get this all wired up is we need to set up Cortana And she thinks i'm talking to her hold on there we go. Um So i've logged into my ift account we're going to make a new applet. I'm going to say if this And this is going to be Cortana And we're going to say a phrase with text What do you want to say? I'm going to say turn on the and then you see it says down here that Says down here that the dollar sign is the token for the uh for the text ingredient They call it so the the text that we want to pass on to the uh to our action So we're going to say turn on the dollar sign light Also, just add dollar sign light please is another option And what do I want cortana to say in response? How about we have her say Sure I'll send a message to turn on the dollar sign light So there's our trigger Yeah, I see out in the chat they're asking where's the device integration this this is this is poor man's cortana integration You're absolutely right. We can we could write cortana code to live on a pi device using the windows iot But this is more i'm going to use some uh some integrations from my desktop here to automate stuff Like in my house or office or whatever So the trigger was cortana and then that is going to be a In this case another webhook We're going to make a web request And I have my webhook url over here in my notes Authentication is baked into that url has a I believe an oauth token in it Going to post application json and then what we're going to post The shape of that message is Whoops wrong Copy and paste There we go. That's the shape of the message just a single property called color And I don't want notifications So there we go. We made a new applet. It's all wired up and ready to go The only other thing we need to do is uh, we need to hook up the breadboard that has the leds So let me do that very quickly There we go Now I told you that the reason that there's a very Easy to understand reason why we're using low instead of high to turn on these leds And that that reason is The uh Well, what's the hot key for a line? So the 3.3 volt Uh wire here is going to this rail which is providing power to All of these resistors which are in turn providing power to the leds And then the cathodes from the leds are connected to their respective ports Since the cathodes the outputs from the leds are connected to the ports The ports are going to be blocking the connection when they're high And when they're set to one But they're going to be allowing the connection when they're set to zero So that's why low is going to turn them on and high is going to turn them off You'll notice also The red and the yellow happen to be glowing a little and I think the green is too It's just not coming through on the camera That's because we haven't opened the pins and there's just a little bit of background voltage flowing across the pins yet When we open the pins in the rastering operating system, you'll see that those that little glow will go away So let's just go ahead and run it. It should all be wired up and ready to go now all right So let's try this Hey Cortana turn on the green light I'll send a message to turn on the green light There we go. It was that quick Let's try it again Hey Cortana Oh, that's me. Yeah, sorry. I've I've clicked when I shouldn't I've hey Cortana Or I'll just click turn on the yellow light Well now I've gone and confused her Sure I'll send a message to turn on the yellow light. All right Let's try a color that we don't have Hey Cortana Turn on the purple light I'll send a message to turn on the purple light Well, I don't know how the I don't know how good the frame rate on the frame rate on skype is But you should have seen all the lights blinking in quick succession to show that we don't have a purple light One more thing I want to try Hey Cortana Hey Cortana Oh, she heard me say hey Cortana twice My my poor little surface is I'm I can just hear the cpu burning I'm just going to click the mic You don't have to put on the red light Not Roxanne and you're not staying and that's a really lame 80s music joke For those of you youngins that was a joke about the police They were a really cool band in the 80s and you should go check them out on spotify Um, all right, so That is it for our integration demos Which leaves us one more point of discussion And that point of discussion is what now? Well, I encourage you to go check out my github Uh, it's at that address right there github.com slash camslope soper slash have your pie There you'll find my notes uh with everything you need to know I've got links to where you can get the operating systems and uh some some advice about which devices to buy and and uh Which components to buy to build these I've got all my schematics all my demos including some demos that I didn't use And all these slides. I'll also put a link to this Talk on that github so you can refer to it in the future The other thing I wanted to talk about is you should go take a look at system.devices.gpio That is a package that is currently in pre-release. It is targeted for.net core 30 It is very early in development and the api surface is very likely to change before release It's designed for all kinds of iot platforms that use gpio Raspberry pi included and it's kind of a an easy one to feature because it's so ubiquitous There's a few there's actually a reason why I didn't use system.devices.gpio it mostly works But the demo that I had where we were watching the read sensor It locked up my raspberry pi pretty consistently every time I demoed it. So, um, I ended up not using it But it is like I said early pre-release and it doesn't use that kind of hacky mechanism that I used In in the file system. It does support pulse width modulate. I'm sorry pulse width modulation So that's the ability to kind of ramp up and ramp down power on a pin So you can make a make a make leds, uh for for example You could make leds brighter or dimmer and it also supports spi and i2c Which are serial interfaces for talking to things like temperature sensors and humidity sensors Finally the team has asked me to point out to you guys that they're looking for contributors If you're uh, if this is something that you're really interested in and this is in your wheelhouse by all means Go check out their github and and send them a few pull requests So with that I'd like to see if we have any other questions Hey camp, I think everybody's afraid of asking questions. So you just literally dropped the the virtual mic here everybody's been loving it the just the demo was On point Like literally if I I'm a little bit bro crushing on you my friend just fyi Just just have that in the back of your mind while I'm saying this but like IOT demos are hard because I'm literally sweating bullets that things will not work But everything worked amazing for you, bud. Yeah, you did. This is awesome. Dang Well, thank you. I I appreciate that Yeah, everybody Go ahead I'm just gonna say so if there aren't any more questions I just want to say I hope everyone found this Informative and enjoyable and I really hope you found yourself inspired with some ideas to go implement in your own Raspberry Pi projects You can again check out my github check out my twitter You can always hit me up and I'll I'll try to help you out and and do check out the system.devices.gpio project Because that is going to be the official.net core support in the future Nice. Awesome. Thank you so much. Well, I'm camspired It's a good thing we're in the afternoon. That's right. That's right. I'm thinking that and I heard I'm too loud So I will keep it down. Thank you so much for taking the time talking to us Everybody we're going to go to a quick break Learn about functions in azure and then we'll be right back where it's jeremy our next presenter. Thank you so much


QuickBooks Online 2022 bank reconciliation myth-busting. Get ready because it's go time with QuickBooks Online 2022. Here we are in our gig-rate-guitars practice file. We set up with a 30-day free trial. Holding down control, scrolling up a bit to get to the 1-2-5% currently in the home page, otherwise known as the get things done page. A change to the accounting view is something you can do by going to the cog up top and switch to the accounting view down below. We will be toggling back and forth between the two views either here or by jumping over to the practice file or the sample company currently in the accounting view. Going back over to our get-grade-guitars, opening up a few tabs. We can put reports in by going to the tab up top, right clicking on it and duplicating it. Back to the tab to the left, right clicking on it and duplicating it again. As that is thinking, I'm going to jump on over to our sample company file, which is in the accounting view, noting that the reports in the accounting view are on the left-hand side here. If we go back to the business view, second tab, reports are going to be located under the business overview. And then in the reports on the left-hand side, closing up the hamburger, let's open up that balance sheet report. Looking at the good old balance sheet, we're going to change the dates up top from January. We're just going to look at January this time. So, 0101222, it's already there, 0131222. That's what we want. I'll run it again. And then I'm going to go to the income statement, just looking for January as well. Looking at the business overview, the reports. And then we're going to go into the profit and loss, the income statement. Close up the hamburger. We're then on the month of January, same kind of thing here. So, I'm going to go back to the first tab. We are of course focused in on the cash account. We're going to be reconciling the cash account in our books to the cash account on the bank side of things, using the bank statement as of a point in time, that in this case, be in January 31st, 2022. Note, however, we're not just trying to verify that the cash ending balance as of in this case January 31st, 2022 is correct. We also want to look at the details, kind of like drilling down on the cash account and verifying that all the transactions that are going into that ending balance of cash are correct as well. And noting that the double entry accounting system has a second side to each transaction and cash is in essence the lifeblood of the company. This is part of every flow that we are doing within the accounting system. In other words, it's in the purchasing process or expense cycle. It's in the sale cycle or accounts receivable cycle. It's in the employees cycle. So we can verify those transactions that have cash in them. Then we're getting a huge internal control, not just over cash, but over all the other cycles in the accounting process. That's really what we're after and that level of internal control is second really only to the double entry accounting system itself. In other words, by using the accounting software, you're using a double entry accounting system. That means your balance sheet is in balance. That means your trial balance has an equal number of debits and credits. The accounting software itself will not allow you, for the most part, to do anything that will be out of balance. So whenever you put something into the software and it's like, I can't do that because it's going to put me out of balance and I'm not going to let you put me out of balance. That's one of the major internal controls that we have in accounting. But it's not going to stop us from making any errors. For example, we could still make errors if we had the double entry accounting system by omitting a transaction, just not including it at all or entering a transaction twice or having a transaction that has the same dollar amount. That has the same debit and credit, but they're both wrong. They're both miskeed. The second internal control is of course the bank reconciliation. And so that is going to pick up some of those other errors. If we omitted a transaction that went through the bank, then we're going to see it during the bank reconciliation process. If we data input the wrong amount, we're going to see that in the bank reconciliation process if there's a cash component to it. If we entered something twice, we're going to see that in the bank reconciliation process. So it's a huge internal control that we want to have not just for cash, but for the whole accounting system. If you have accounting software from my perspective as basically a tax preparer or if I was doing an audit or something like that or a review. If someone is using the double entry accounting system through software, that gives a huge level of assurance. I feel a lot better than if someone was to make the books by hand at this point in time. And two, if they're doing the bank reconciliation properly, that then is the next biggest thing in a general sense where I'm feeling, okay, I feel a lot more comfortable that things are going fairly smoothly with the bookkeeping processes. Either of those things are not done, then I feel a lot less secure about the process that's being made. It doesn't mean it's wrong per se, but it means that the potential of those two controls mean that there's a lot more ways that things can go wrong. That those things will not be picked up with these two big internal controls. Okay, there's two myths with the bank reconciliation. We want to take a look at one is the idea that the process of reconciling is actually the bank reconciliation. Those two things are not really the same thing. The bank reconciliation is actually a report that we're going to generate at the end of the process. And the reason people typically think of the process of reconciling as the bank reconciliation is because reconciling is what we actually do. We go through and we tick and tie everything off. But if an auditor was to ask you for something to say, hey, where's the bank reconciliation? It would be the report that is generated after you do the reconciling process. The second kind of myth I want to look at is just the idea that when you use bank feeds because we have bank feeds that can go into here. In other words, an automatic connection to the bank that somehow that is eliminating the need for the bank reconciliation. That's not true, although it does change in some cases and that'll be dependent on the type of bookkeeping system we have in terms of how the bank reconciliation could be done. So hopefully it'll make it easier, but it doesn't mean you're going to stop the bank reconciliation process altogether. So let's take a look at those two items. So when we go through the process of a bank reconciliation, basically what we're doing is we're going to be taking our information that's going to be coming from the general ledger here and ticking and tying it off, matching it up. This is my mock bank statement to the transactions that are in the bank statement. And that's going to be basically the process. We'll do that by going into the software. We'll say that we're going to go into the hamburger left-hand side. It's under the bookkeeping area on the left-hand side. And we won't actually go into it right now, but it's on the reconcile tab at the bottom. If you go into the get started, what it'll basically do is pull in the general ledger numbers in essence that we have entered on our side. And we'll in essence just be ticking and tying them off to what is on the balance sheet. I'm going to open my balance sheet back up because I opened it up on the wrong tab here. So let's open the balance sheet back up, go back into the balance sheet and then close up the hamburger. So if I drill down on the cash account, in essence, we're just going to be looking at our transactions here and tying each of these transactions off to the bank statement. And that gives us some assurance that of course we entered the transaction and the bank entered the transaction. So we got that kind of double assurance and it cleared the bank, which gives us some more confidence that the transaction is a legitimate transaction. So the fact that we do that and then it'll say that we've completely reconciled if we do that process to the point where we've got a zero balance. We'll go over this in more detail in the future, but the system will say, hey, look, you've reconciled it and then I hit the reconcile button. A lot of times we think about that as the bank reconciliation, but that's the process of reconciling because what will happen here is we'll typically find everything that's on the bank statement. The general process will be if it's on the bank statement, then we're going to have to tick it off on our books. It's got to be in our general ledger unless the bank statement is wrong. What if there's something on the bank statement that's not in our books? Well, if it's not wrong, which usually it's not, the bank is usually right, then we have to add it to our books because the bank says that was this transaction. We're going to have to put it in our books and then we can take it off. So everything on the bank statement generally will have to be on our books unless the bank statement is wrong, which isn't typically the case. However, if it's on our books and it's not on the bank statement, it could possibly be a legitimate thing, especially if we're doing a separate transaction as we enter the data separate from the bank and it's something close to the end of the month and most likely or especially if we're using checks, actual physical checks, because those are going to have the longest lag time between the point that we write the check and the point that they actually clear the bank resulting in a timing difference. So that's what we're looking for. We're looking for these timing differences, which will be very, they'll definitely be there, especially when we have the checks that we're still writing. This timing difference does go down in time, of course, when we have electronic transfers. So the bank reconciliation process should be easier as we have the electronic transfers because you don't got this big lag time between when you write the check and when it clears the bank. So that's really what that difference is what you're looking for. So after you check everything off, then really what the system is doing is taking the items that were not checked off and those are going to be the items that were put in our system that has not yet cleared the bank and it's going to create a bank reconciliation looking something like this that will be tying out what's on the bank to the book. Now, this is just, this is not exactly what we'll create in this one, but it'll look pretty similar. And so we've got the clear balance here. Notice really you're starting here. There's two bank reconciliations we'll look at in QuickBooks. They usually have a summary report which we're looking at here and a detailed report. The summary reports easier to read, but it actually doesn't have the detail that you want. So I'll talk about that in a second here. But the detailed reports, it's kind of overwhelming with all the data. So we'll look at both of those reports after we do the bank reconciliation. Let's just look at the summary here. This cleared balance represents the items that we tick off in our system because we saw them on the bank statement. So the cleared balance to 61-241-85, for example, ties out to the cleared balance on the bank statement. And then we've got the unclear transactions, the items that we did not take off. These are the things that QuickBooks is going to create as the reconciling items. The ones that basically we know about because we entered them haven't cleared the bank most likely because of timing differences. And here's where the problem is, I would like to see those six. If you gave this to an auditor and just said, yeah, there's six items that add up to this amount that is the difference. They're going to say, well, what are those actual items? Because that's the point. We want to know what the difference is exactly. And so that's why this statement doesn't give you all the detail. Let's just say these six items. But in any case, you get the idea that these items are the unclear items. That's the difference. That's the reconciliation. That's how we get to the cleared balance to what's on our bank statement. So this would be on our books. Then if we go back into our books for the cash account on the balance sheet as of January 31st, so that would be matching out right here. It doesn't exactly right now because we're going to have some adjustments that we're going to be needing to enter as we go through the bank reconciliation process. But that's the general idea of it. And if I can drill down exactly what this difference is, then I can be confident not only about these differences, but about all the other ones. Because if I can reconcile exactly, then that gives me a huge increased level of assurance that all the transactions are correct. So in other words, I'm not just trying to find out whether or not these ones that have not yet cleared will clear, which I can do, because I can then look in February after the reconciliation date to see if these unclear items have been cleared in the following month. If they have, which we would expect them to, that's great. But that's not really the main goal of the reconciliation. The main goal is to say these are legitimate transactions that result in a legitimate difference. And if I can tie that out exactly, then I can basically be way more confident about all the other transactions, the whole thing that's in basically the double entry accounting system. And as we can see, if you go into the cash account, we have the most type of transaction types in cash because cash is the lifeblood of the business. It goes into every other cycle here. So that means that if I can get assurance on all these transactions, then I have assurance on the other side of the double entry accounting system, which gives me a huge level of internal control over the rest of it as well. Okay, so now let's think about the kind of myth about, well, what if I turn on bank feeds? If I turn on bank feeds, then I don't need to do the bank reconciliation, right? Because then I'm connected to the bank, so I don't have to do the bank reconciliation. That's not exactly true. However, you could have a very simplified version of the bank reconciliation. For that, let's take a look at a flow chart. This is a flow chart from the desktop version, but it's just a flow chart. So we're just thinking about the flow chart here. And remember, it really depends on how complex your accounting system is. If you're using a cruel type of transactions, you're still going to have some transactions that are not cash related. And so you're going to have a little bit more complexity in the accounting system, just in terms of how you're going to apply the bank feeds in. You can still use bank feeds, but it's going to be a little bit more complex to put them in place. If you're on a cash basis and you're still using the full accounting system, you would be using register transactions as you make the sales transactions, for example. So you would still be entering the data on your side, and then the bank would be entering their transactions. However, it's possible in some industries, if you're in a more simplified industry and able to do this, such as gig work, for example, such as if you get your money from like Amazon and you're not tracking inventory or anything complex like that, or if you get your money from like a platform like YouTube or something like that, or AdSense, or you're getting revenue for royalties or something like that. Well, then when you get the money, you're probably just saying, I'm just going to take the deposit and record it as income when I receive it. In other words, you're kind of on a cash basis, but you're not doing the sales receipt in that case. You're simply recording the deposit when it clears the bank. So you're kind of moving even further from a cash basis to a more simplified method than the cash basis, which is one where you're just going to build your financial statements from the bank information. So in that sense, you're just going to wait till everything clears the bank if you're on that method, and you would only be on that method if you're in an industry that allows you to be on that method. So if you're in an industry where I have a cash register in front of me, I can't really do that because I'm going to have to use the cash register to record the transactions. If I'm in an industry where I have to invoice the customers, then I have to invoice the customers because that's what the industry standard is. But if I'm in an industry where I'm just going to collect the money and put it into the checking account, then that would be the most simplified way we can do the bank feeds because then the bank feeds, we can just wait till it clears the bank and record our books based on the bank. Now that's different than a full service accounting system, even a cash-based one, because in a full service accounting system, for example, in a cash-based one, we would be recording the sales receipt when we make the sale, then typically making the deposit on our side, and then we would be comparing what we deposited on our side to what cleared the bank. You see, that's a much bigger internal control because now we entered it on our own separately and then the bank entered it on their own based on our deposit. And when we compare those two, we're comparing two different sets of books done one internally, the other externally. If on the other hand you go into the system where you're dependent on the bank to make the transaction, you're waiting till it clears the bank to make the transaction, you no longer have two sets of books. You're just making your books based on what the bank did. There's nothing really wrong with that, but that's a much more simplified system and you're losing a lot of the internal control. So if you were to do that, then the bank reconciliation process would be a whole lot easier because when you do the bank reconciliation process, there aren't going to be any outstanding checks or outstanding deposits on the check side of things on the cash outflows. If you make all of your payments with electronic transfers, you don't write any checks and then you don't record any of the bills or checks when you write the check, but you just wait till they clear the bank and then you record those items when they clear the bank. Then again, you're not on a cash basis. You're on a basis further simplified than a cash basis. You're dependent on the bank to record all of your transactions. That means that of course, there's not going to be any reconciling items when you do the bank reconciliation because there are no outstanding checks. There are no outstanding deposits because you waited till they cleared the bank before you recorded them. So you still want to do the bank reconciliation in that case, although it should be really easy to do because what's in our book should match what's on the bank's books. So what you're doing with the bank reconciliation process there is just tying out and making sure that you didn't miss any transactions within the bank feed process and that no transactions were duplicated in the bank feed process. So it's still important, but it's a lot easier. But if you're doing a full service accounting system, then you're going to have to enter the transactions in some way on your side and then you're going to have to match them to what was entered on the bank. In that case, you can still use the bank feeds because the bank feed will pull in a deposit. So let's say we made the deposit on our side, sales receipt, and then the deposit for $100. And then the bank feed, also we pulled in that $100. What the bank feed will do is match out what they pulled in to the $100 we deposited and it'll basically reconcile. So it will help us kind of doing the reconciliation process as we enter the bank feeds. It's not going to help us record the transaction because we're still going to record it on our end. But the bank feed can help us tie out what's on the books to on our side and possibly make the reconciliation process faster in that case. So those are going to be kind of the myth-busting there. It's possible to simplify the process if you're dependent on the bank feeds, but some industries are not going to be basically, you can't just wait until it clears the banks if you're in certain industries. Okay, so that's going to be the general idea here. So basic takeaways. The bank reconciliation is going to be important for pretty much all businesses, large businesses, small businesses, businesses on a cash basis, a cruel basis. And even if you're dependent on the bank, it's a huge internal control that you want to put in place in your accounting system. And so we'll get into basically the details of it, the reconciliation process and future presentations. And we'll do that in a step-by-step process. And just remember, as you're doing the bank reconciliation, you're not trying to just fix the bank account, the cash account, or make sure it's correct. You're trying to get a reconciliation on all of the accounts, right? If the cash account was off by $5 or something like that, that's not really a big deal. However, if your reconciliation is off by $5, it might be because you're missing like 10 deposits and 20 checks or something like that that happens to net out to $5. So the idea when you're reconciling and the reason you want to do it, which might motivate you to make sure to do it, would be that you're getting a huge internal control check, not only just with the bank account, but with all the other transactions that are involved, or at least those that involve cash, and cash is involved in all the major accounting cycles.


Sharon having multiple languages on their website for the commission for the conservation of Antarctic marine living resources. Yes. Excellent. All right. Welcome, Dane. Thank you. So I'll just give a quick introduction about myself before I go into it. So I have been a developer in Drupal before. I now am more in the project management side of things. Working at Camelow, which is based just down the road here in Hobart. And so, yeah, we're going through working with a multi-language infrastructure. So about Camelow. Camelow, as you've just heard, is the commission for the conservation of Antarctic marine living resources. It was established in Canberra in 1982 by International Treaty, which is why we are actually based here in Australia. Hobart being the optimal place because it's where Antarctic things happen. The objective for the commission is obviously to protect the Antarctic marine life, but allowing to provide the rational use so that we can still actually fish and use the resources. As of this year, we're actually at 26 members. We've gone up by one. The Netherlands actually joined us this year. They used to be one of the signing countries, so that number has gone down to 10. And the 26 members are the ones who make the decisions at our yearly meetings. As I mentioned, our headquarters is actually located here in Hobart, literally up the road on Macquarie Street, near the Ibis for anyone who's staying in that area. And we operate in four languages. And this comes from the fact that we're part of the Antarctic treaty system. And their languages are English, French, Russian and Spanish. And so therefore, we also have to support English, French, Russian and Spanish. We actually currently have multiple websites in operation. And we're looking in the future of having even more websites in operation. But we'll get to that later. Just a quick information about the actual area that we look after. So here's the map of our convention area. It's roughly 10% of the Earth's oceans that we actually look after. And so therefore, all the information we're presenting is about this ocean area. And as you can see on the map, it's also divided into areas and sub-areas. And we have to provide all the information for those areas. If you'd like to explore more about the areas, we do have a GIS site, which you can actually go to. You can play around with it. You can put different things on the map, like the EZs in the area, and see where the NPAs are located as well. That site isn't in Drupal, I should add. These are the main websites which we have. So the top four are our Drupal sites. We have a couple of other Drupal sites, but they're quite minor. And we have a couple of other websites which are not Drupal. The main sites that I'll be talking about today will be the main website, which is camela.org, and our meeting server, which is meetings.camela.org. Those websites have full multilingual functionality, whereas sites like groups is done in English only because of the quick, the speed that people have to be able to communicate in it. So we support that one in English. And our ECDS, which I'll give a quick information about right now, is our catch documentation scheme. This is a scheme which is for the specifically the species of toothfish. And this actual server has partial translation. But what this server actually does is it allows us to keep track of all toothfish all around the world when they're caught, and also where they're exported to, and the process of actually getting from ocean to the actual table. And so this system actually allows us to know exactly how many toothfish are being caught. I'm not going to go into full depth about the modules, but this is just a brief list of the modules that are used to do translation on the websites. So obviously we have the localization update to improve the localization. We have the multilingual internationalization, multilingual entity translation, and we have numerous other extensions for these, as well as numerous custom built modules. So I'm not going to go into full detail on these, but this is what we use to actually achieve our goals. The key goal for translation for our websites is that we should be able to have everything available in those four official languages. So about our main website, the current design of the main website was built in 2012 by the local development agency here, 80 options. And they're still the organization that we use to develop the website. It was built in Drupal 7. It contains a lot of functionality. I'm not going to go into details of all the functionality, or we'd be here till next week. But we do have currently in it over 40,000 nodes, and that is growing on a daily basis. Most of these nodes also have revisions. And when we're dealing with translation, that means we have to keep translating all of those revisions. Now, Camilla has internally, we have our own translation team. We have two of each of the three languages that are not English. And they do all the translation of all the content that is on the site. And so what we're going to be going into next is how we work through doing that translation. This is an example of a translator page on the website. So I've just done the about Camilla page. As you can see, so top left is English, top right is French, bottom left is Russian, and bottom right is Spanish. And so as you can see, we have a complete translation of all of those. The menus is completely translated. The links, the quick links and related pages are completely translated. And this means that anyone who's on this site can travel around the website in their language and see all the content of the language. We don't just have translations on the content as well. Because one of the key things about this website is being the organization we are with the 26 members. Those 26 members actually all have users who are actually registered on this site. And we'll get into that a little bit more later. But it means that we're not just translating the front end of the page that the public can see, but we're also translating functional back end items as well. To achieve this, we have a translation workflow that we work through to make sure that everything gets translated. It starts obviously when a page is created. This is just a standard page, the page about the convention area. As you can see, we have a standard title, a standard body. This then gets copied into a HTML file and saved into a directory where the translators can actually find the file so they can put it into their translation software, which helps to look for consistent phrases or consistent words to assist with their translating. Lovely tool that they can have. But one of the key things that they do as a translator is that they are actually checking everything to make sure that the English and the language that they translate it to is accurate and has the same meaning. The next step of the translation workflow is we have to actually then set up the content to actually be available for the translation. So for the example here, you can see that currently the information for Northern Warrior page has not been set up to be translated to French, Russian, and Spanish. So what we would do is we would actually then add the translation for that language. And when we add that translation, we set its workflow. So it will have in there a workflow status. We send that to assign to translator. That then allows it so that the translators can actually see that piece of work. So, yeah. And this is then what the translators see. And so I took this image this morning so that we would get a clear picture of what's currently in the translator's backlog for the website. So the translators aren't just translating the website. So that's why we've got two of each. Right now they're actually translating all the report text from the meeting we had. But this view here gives them an idea of all the things that they're translating for the website. And as you can see in this view, what we have is we have, so the Russian and the Spanish. So for example with the conservation measures for 2019-20 season, this is a circular that's going to go out to the members only to tell them the current status of the conservation measures for the next season that's about to happen. If I look at this list right now, I can see because the French isn't on the list, the French has been translated. The English as part of our workflow is put in there so that when we go to this list and all we see is the English one on here, we know that that has been completed with translation. There is an example on here where we don't have the English showing and that's where we've got the schedule of conservation measures in force 2019-20. That's because the English is actually already published. It got published before the other languages and the other languages are being translated. So we have two slightly different approaches that happen for things. Circular says one document has another, but this view allows the translators to see specifically their translations. We also obviously have when you're looking at a specific content type, the status of the specific translation. So looking again at that translate view that we looked at before, this shows that we have the English one published and this is the one I was talking about before that the English wasn't showing in the list. So the English is already published. You can see that the French has been translated but not published. What actually happens when the translators have finished translating it is they actually put it into a pending approval status. So it's still not published at that point and that allows for another check to make sure that the actual translation is correct. So I'm expecting that that French one will probably go live at some stage during today. As I mentioned before, it's not just content that we have translated. I'm not sure how easy this is to see on the screen, but if you look at it, you'll be able to see that on the left we have the English and on the right I have, I think it's the Spanish, might be the French. I can't remember which one I grabbed. So basically what we have is an example where we have a majority of the back-end content translated and this specific form here is actually part of our meeting document request. So for those who are members of the site, they can download the Antarctic Peninsula under a 1.5 degree global warming scenario document automatically, but for anyone who's not a member of the commission, we have attached to the document so you can see the list of documents this form and it's available in the four languages up until a point. So there are a few things which haven't actually been translated on this form and it even passes down to user creation and that comes because of the fact that the members actually create, so each member nation has allocated what we call party administrators and those party administrators, they actually create the accounts for their members that they wish to be able to have access to the site and so this form I have on the left the English and I have on the right the Russian and that means that you can see that what we have is the vast majority of that user creation form is translated into Russian so that the Russian party admins can create a user in their own language. So that was really the main website. Another one of our key servers is our meeting server. Now this server I have been corrected slightly on when it was when it was built. I believe the original meeting server itself meeting functionality was built in 2016. The current design was built in about 2018 for the site. It's also in Drupal 7 at the moment and it's used for multiple different meetings during the year. So in the meetings during the year it's mostly used as an English only server but it does have the translations in there for field names and those sorts of things for non-English speakers to be able to still get some translation but during the two week commission and scientific committee meetings this website has everything translated into four languages within reason obviously because things are changing very quickly we can't always get everything translated because of the small translation team but the key thing about it is all documents will be in all languages all final report texts for adoption will be in all languages and that's done on the fly during the meeting. Now this server I'll go to this page here so this is what the meeting server looks like which is from the pictures which you've seen before is vastly different to the main website at the moment. You can see we have the translations down on the right for people and this is a very simple setup of the meeting server at the moment. This is an example of the kind of translation which is happening on the the meeting server so these are what we call report text. I can't show you more than what's on the screen there because these are actually confidential documents so what I'm showing you here is the absolute maximum that I can show you of how this works but what happens is during the meetings we have what we're called raptors and they draft documents that has all the notes all the minutes of the meeting and that document of the minutes of the meeting during the meeting itself will be uploaded to the meeting server through different versions to actually in English because the raptors will be doing it in English initially and then when that document has been signed off by the chair of the meeting it then goes to our translators who translate it and upload the translated version of that document to the meeting server and this is the final result we get before we go into adopting the meeting. Now I should also point out that this meeting is is so important with language that we actually also have live interpretation at the meeting and that means that when you're listening on everyone listens to with with headphones and or earphones if they want to wear earphones instead they can they will actually hear everything in their language but the people who speak French Spanish and Russian can speak their own language and it will get translated to English or vice versa the English will get translated to them or the Spanish will get translated to English and then to French and Russian and just a large combination of languages happening during these meetings and this server helps to support all that. So this is an example of the report text uploading or uploading of a new version of report text so as you can see this is for agenda item three of the report and what it has as you can see is it actually has four versions in it at this point in time and they're all visible to anyone who has access to the meeting server this as you can see we have translation for the vast majority of the form obviously you can see status the status title name the version number are not but the vast majority of the rest of this form is actually translated and as I said earlier on one of the key goals of of us is to have as much of the sites actually translated to these four languages we possibly can so there's and there's always room for us to do improvement on these these items and I've also attached the so that first page was English and French and this is the Russian and the Spanish versions of the of the same form so you can see the same thing everything for all the languages is translated with the exception of a few of the titles at the moment so what does the future look like for this infrastructure basically we're always looking to constantly improve the translation and and eliminate any oddities that that are happening for examples as we saw on some of those forms some of the things that are not translated we're currently in the very early stages of a two-year project that will upgrade all our sites the Drupal 8 working with 80 options on delivering that as well as separating out the functional parts of the sites into actual separate sites that's mainly for our main website which has a large amount of functionality in it not all of it is actually related to the other parts of the website we're also looking to have a new design for the entire web infrastructure developed by 2021 um and as I mentioned we're in the early stages at the moment and the first phase of this delivery is we're delivering a new purpose built authentication server in Drupal 8 and I know that there'll be people who potentially wonder why are we building an authentication system in Drupal 8 well one of the key things is that the translation there's not a lot of authentication tools out there which can actually operate in the four languages the way we need it to operate and so therefore we're actually got 80 options building us a authentication um in Drupal 8 and I've wrapped up pretty early but does anyone have any questions I'm just wondering how much if any you rely on automatic translation systems that's actually a very good question um we obviously with some of the functionality with some of the titles of the forms and fields and things like that there is some automated translation um the philosophy that I I'm going to go be going forward with most of it is to limit the automated translation in terms of using other people's translations the idea is we will use automated translation in terms of being able to have words and phrases but it needs to be our own dictionary because and this is one of the key things which the translators have actually told me in the last couple of months is they're not happy with some of the the translations that have happened through the localization for example they the problem is is that some of those translations don't have the context of where that item actually is and so therefore the translation is technically correct but it's not right for that context um and so there will be a bit of a balance of automating that stuff so that we don't have to get the translators to translate everything but also allowing the translators to make those calls on what words should actually be used um so does that answer your question you mentioned using various custom built modules this is with the translation um you want to know what kind of um customizations you did there and what why and why you needed it and what purpose um that's that's a harder one for me to answer because obviously I haven't been involved but maybe um Tony from 80 options would be able to help out with that one so from memory because the the site was sort of launched when Drupal 7 was pretty new and at that time the entity translation module didn't exist yet so the very first instance was all node based translations so when you add a translation you're adding an extra node and then Drupal 7 matured the entity translation module came on and then you could have translations within the same the same node um so there's some custom work that had to be done to make sure that the translators had a common workflow um despite there being those two approaches because of how Drupal 7 sort of developed over the the lifecycle of the site yeah so it was mostly around trying to make the process easy for the translators so they would have a sort of an easy to-do list these are the pages that needed translations updated anyone else yes I'd like to hear about the process of migrating to Drupal 8 so are you like updating only the core and that's it or are you migrating all the content in a new newly created site yeah um that's probably a very good question actually so we as um the commission we have to keep everything that we have so for us to go to Drupal 8 all the data which is currently in the websites is going to have to be migrated to the Drupal 8 version and I'm not um I guess I should say what's the right words for it I'm I feel sorry for 80 options because they're going to have to deal with that migration um and um but we're also going to have to deal with making sure that that migration goes and everything is actually over onto the new system um one of the things which we do have as well um which I can possibly show is we because of that requirement we actually do have our previous site still available online um you just have to know where it is to find it um and that means that we have kept all our information from our previous sites as well um which will probably be probably be what happens with this site as well it'll probably still exist in some form um it'll just be shuffled off to the side somewhere so that if if we ever find that something's missing we can go back to it and get it into the into the new site but yeah the main aim would be to get a hundred percent over if we can the the process of migrating the translation of translated content um isn't that um problematic I don't think in most cases except that the the early iteration of the site was using that node based translation um and because it's developed so that we still have some translations that are in different nodes and the rest are in entities that that'll be one complication with the migration process that will have to overcome but um but for any other site that that you might have that you're going through the same process if you were lucky enough to jump on Drupal 7 when entity translation was the norm um then I don't think the migration to Drupal dates translation method would be um too problematic last chance no all right well let's thank Dain


Invasive weeds can reduce crop yield. Invasive insects can destroy leaves, seeds and fruits. Plant diseases can have a deadly impact on entire ecosystems. If the risk is not managed and mitigated, the presence of these pests poses serious threats to agriculture and hinder international trade. The International Plant Protection Convention, IPPC, helps governments and farmers prevent and control the introduction and spread of pests of both cultivated and natural plants and plant products. It is the only global organization that works to develop international standards for phytosanitary measures, ISPs, ensuring the same benchmark level information to help all countries trade plant products and commodities safely and protect the environment. Each year, the 184 Nation Commission of Phytosanitary Measures, the CPM, meets to adopt standards developed through a transparent and inclusive process. On average, it takes seven years for a standard to go through the four stages required for its development and adoption. Every two years, countries can identify specific plant health problems that require international harmonization and propose topics for new standards. The CPM's Standards Committee oversees the new standards development. With 25 members representing all FAO regions, it assembles expert working groups and technical panels to ensure the scientific quality of the proposed standard. Next, all IPPC contracting parties and regional plant protection organizations participate in the review process to guarantee that standards are both science and consensus-based. After each consultation, the Standards Committee reviews and revises the draft. Once approved, it is proposed for adoption. If there are no objections, the standard is adopted at the annual general session of the CPM by the plant health community. The world now benefits from more than 100 standards that cover a diversity of issues and contribute to food security, protection of the environment and safe trade.