and I actually come from Australia and that's Australia with the kangaroos not Austria without kangaroos and when I left it was 43 Celsius on the day I left so you can think you can sort of get appreciate what I think of the weather over here it's like minus 8 at night that is colder as cold as it ever gets in Australia anyway okay so anyway Australia is a wonderful country I'm sure you've heard it lots of nice wildlife kangaroos no problems no other nothing nothing dangerous anyway applications why we're here everyone's seeing this picture and I'm sure everyone's experienced this problem you've done your application development as a developer and you give it over to your ops team and they'll go and install it for your instructions and it doesn't work okay it all just blows up in a big and of course your manager gets bit upset about this and well he's heard about this thing called dev ops and he's like well maybe we should sort of start to employ that and bring in some of those ideas and you take on that some of that responsibility to pull things in place to help the ops person and you as a developer of course it's very cynical of this because yeah okay it may help you but you just see this shift in blame so you can't blame the ops person anymore anyway let's have a little bit of an app when they've got a simple app here which is the one which we made to blow things up so in Australia so we've got lots of good wildlife so imagine we've got a an app on your mobile phone for all these tourists who come to Australia think that Australia is actually a little bit dangerous for some reason I don't know why so we've written an app and we've got it back in for our mobile phone app which is going to just give out little news balls and warning all these tourists about little incidents that might have occurred that they might be concerned about like someone getting bitten by a fudder web spider which is like the fifth most dangerous spider in the world but getting a lot of demand for our app and we thought well maybe we'll branch out beyond spiders and up to now we just don't have a bit of static code every time we want to change the message to redeploy the app so that's also not good enough so we're going to add the database we make it easy we don't really play out we're just going to put that database and where we go so of course going to deploy this on an open shift now we want to make a big change when to go from our first step to our database so the way we handled that was by using a blue green deployment and that's something that's very simple doing open shift down the bottom here we've got our original app here first version and it's exposed by route people got access to this thing that from our web app from our app on the mobile phone and we want to deploy a new one so our ops person has gone deployed our Mongo database loaded up all the data for our application and start up that web app as well and it's all running it looks all fine and then the next thing you want to do is what are you use this blue green deployment to switch our traffic from from one to the other so we do it that way that's very simple you can just go into the web console for open shift edit the route and we're just going to use that drop down to change it from our current one standalone to our database version very simple and then we'll go traffic over there nice and quick so you just want to know what should work and then we don't know it doesn't work that's our problem let's hurry up with all our flames and everyone get upset so my office and he starts to dig around inside of those log polls and eventually finds this error trying to contact Mongo database and get a time out so something's wrong he gets very upset he seems to start sending me messages where are you at surfing again I wasn't that shopping and so I get my computer get back at home and I start digging around so I check in the database and yes my configuration database so what's the problem there is and I dig over and look at it we're application side of things and I'm going oh right it's what's the ops guys done they've missed out some environment barrels which tell that web back front-end where the databases and that's how we end up in this situation everything turn on part so what can we do so the good news is that open shift has a feature in it called health checks and what this allows us to do is to run checks on our web application before we allow traffic to start to go to it to help us determine whether that patient is in good enough state to handle a traffic and actually start being useful for health checks there are two sorts of health checks that support there is a readiness program which is what I just described is determining whether your web app is actually running properly and there's another one for a liveness program in this talk I'm just going to talk about readiness pros so what's a readiness program in a bit more detail so I'm going to play a chart here now we choose the rolling deployment for application and I'm some of these learning readiness pros and what they do in the context of a rolling deployment so we already have an instance of our web application up and running and we want to start a new deploy which has our code changes so what's going to happen is we're going to run up an instance of our new application image now if we have no readiness checks installed what would normally happen is that it would immediately add it to that what's an open shift is called a service so it's registering with that the service is the thing that has this IP internally to the open shift which all your instance is essentially a joint or attached to and that service acts as like a round robin for distributing traffic so that in there and as soon as we do that because the routes attached to our service we're going to start getting live traffic we're going to remove the old application instance from the service stop the old application instance and that's the end of deployment so very clean cut over from the old to the new when we add a readiness check what we're going to do instead is going to wait initially for a little bit of period of time to see whether the new application will give you a bit of time for the application to start up okay because I might be using Python here and that's really quick but you could be using Java might take a lot longer once I think it's up once we've weighed that initial delay we're going to ask trying to turn is it ready and if it is we'll immediately go on flow on to adding an application to the service and it's going to start receiving new traffic if however it is not ready we'll go and wait a bit more time and we'll go back and check again and we'll keep doing that until either it says it's ready or if it reaches a deployment time out and we give up on it because it's not becoming ready we will instead simply stop that new application pop and fail the deployment in the meantime our existing application is still running it is the one that is associated with the service and the exposed route through which the traffic is coming in so we have not made that new instance of the application which has been failing visible at all now when we talk about readiness programs that we have three different types of readiness programs we can use the first one is using HTTP requests so we can set this up what you're going to do is tell OpenShift that on my web application I have a particular URL handler of which I can make a request to and it's going to tell me whether the application is ready now I'll see for it to support that I'm going to need to have a handler in my application which it responds to so in this case we just add the very simple ones because they say hey yeah I'm alive so we make this change we put down there and we deploy it and the application comes up again we switch out and switches over the traffic to to that instance and it once again it fails and the reason for that is by me including that bit of code there all I've tested is the web server and whether the web server is responding now if you remember the problem I had was related to the environment configuration which told the web application how to contact the database the testing web server alone is not enough what you need to do is add in whatever codes you need to also contact any of your back-end services which your web application depends on and do something with that to ensure that they in turn can be contacted and working so in this case I was using MongoDB so all I've done is for the collection in MongoDB which my data is in I've asked how many items are in you and if it comes back with a value great I'll keep going otherwise I fail and actually I sort of add a slightly different check here I've said it's the count not equal to zero because I want some data in there all right because I want to ensure that something my application has something to check if it's zero it means my office doesn't got loaded data so it's not about just testing connectivity to databases you also can use these checks to actually do some bit of validation of data in database to see whether it is what you expected to be to make sure that stuff that you need to be there for this particular instance of the application was put in place now how does that look in open shoot we start our new deployment and initially because it's going to do this readiness check you see this little circle in blue this isn't this is the old instance over here and it's starting up the new instance over here the light blue indicates that it's doing this readiness check now after a while because we still haven't fixed our code properly configuration starts failing and it starts warning us about this failing and then eventually it says it gives up a fail totally because our deployment time out was exceeded and that instance there is still our original instance and else is told us it failed so we've done that now and we've put that in place so I'll see now we go back and fix our environment configuration environment variables we can do that again it should work okay now when it did fail where do you look for information I'm going to play that conflict one employment you have blocks and events and personally I actually find that to be useless for information for this I don't know why but logs generally just have a very short message like that okay the deployment failed the events unfortunately is a little bit not any better I don't know why you don't get things in events here where the event actually turns up is over in the general monitoring part of monitoring events across the whole project in this particular case because it was not able to contact the database and it was a time out situation it didn't actually log anything too useful unfortunately so what is that response format what is it what do you when you admit that readiness probe what do you need to do so if that readiness probe returns the HATP status code from 200 to 399 ownership will take it as being good it's everything's ready to go the docs actually say it's supposed to be 200 or 399 rather than arranged they're wrong we noticed this last week when I started criticizing Jorge and his talk to say he was wrong because he had a rain and I was saying it was no it was one of the other and I turned out to be wrong everything else is regarded as a failure and importantly it only looks at the hasty piece those code there is no standards for what the response content itself from that request should look like to me that's actually a big disappointing because it means then that you've got no way of deriving any additional information from it which will tell you about what we're wrong that doesn't mean you can't do it yourself so rather than having a very simple check as you go through and all those checks you can accumulate information about the state of all the different things you look at so you might look at the database whether you connect to it whether it's got data in it and also the status of the web server and anything else like that whether environment variables you need to even set accumulate all that information and we can return that as a JSON response now other stuff won't do anything with this but it can be useful for debugging while you're happening it's not working you can get in there and do a curl get the information that can tell you what's going wrong very importantly though be careful of sensitive information in that response because you put this on a URL handler of your web application that essentially is public if someone knew what that endpoint was they could get that get back to a JSON information and you have things in there you don't want to see so one way around that is to have the handler accept a special token in any one of the request headers and I need to pass back this extra information when it's back that way when you knowing that special secret when you make requests you can actually say give me everything rather than just an interesting status here so tips for history here handers should check more than web services be sure they check the backend service and anything else you need whether you even got files present in a persistent volume that expected to be mounted or environment variables the status indications overall success or failure and return JSON response with additional data in there so help you debug it but only do that if you've actually been passed a token in there to say yeah it's okay so hasty piece of requests that is one way the next way we can implement a readiness probe is by container command and in this case what we're going to do is we're going to put inside of our along with our source cover they're going to embed inside of that image we're deploying this command that we can run and so instead of doing hasty request OpenShift will do essentially a docket exec to run the command inside the running container and then that script can do something so I've called my not that through source readiness check and I might put something in like that I go in there and I might do a pill request back to my web server to check that it's okay and I might do a separate thing to do the database now this is actually a horrible implementation of a readiness check I should get a b-minus for this one there's a few reasons I do my call request and I you may remember I mentioned that the hasty piece of case say 200 is I'm ready I didn't bother checking the response status so if that thing returns 500 because my web and web request or web server is failing I wouldn't pick that up I'm throwing away the response from it maybe that's not a good idea I put JSON response data in there and I'm throwing it away I also check the web server for the back end I think that's wrong as well so I need to clean this up but the one in Australia use it all these other things you can do and there are some of the things and the point showing is that it's me states is that don't take these readiness checks lightly don't think I'll just whack one in that just goes yeah return true it's all working you can do a lot in here but you just be careful about what you do and think it through now couple things I did do right when you make a call request don't do local host if you do local host you're not actually testing going back out of the container and looking at the exposed port if you use dollar her name that is the name of the pod which essentially your node name and that's like they're going to look up that get the real external IP and you're going to go outside and back in that's checking your web server is correctly exposed and is pretty dirty response as another trick you can also do if I run this readiness check all that if output is just going to go to standard output of the session I have to leave the shell session to run that and that's not being captured anywhere except back in open ship perhaps but I want to catch that you can do a little trick here I am to run the output of this function here through T I'm going to still let that output go to the shell that I'm running it through but I'm also going to send it to the container lock and I'm going to do a nasty trick to do that I'm going to dive into slash prop file system get a process ID one because we know that we've with containers that you are actually the things running process ID one and I'm going to get the stood out file descriptor for that I'm going to wrap it through there so as well as coming to the output from a script it also ends up in the container log the database I had another database check essentially you can do anything you want in there it's important to actually do it do as many checks as you can so in this case now when it fails in my my command container command version of this all that stuff that was out from that shell script ends up actually in the event it's unfortunate that it munges it all up because it is so she tried to format it's a bit like PhD milk you can't come past that they put the outside or retain the format and it looks a mess there I wish it'd be nice if they had a nice way of visualizing it but I also had in the log file anyway because I did that trick before so I've got in both places I've got a lot more detailed information that helps me do it now one last suggestion avoid complex commands for that readiness check command this is an example from open shift itself it's one for MongoDB and that's what it currently has and why is that bad that's because that's what it used to have they changed it at one point along the way the problem is my recollection is that in doing that they removed this Mongo step command from the database as well and as a consequence all those people who already had that readiness check set up in their existing environment because it came in from a template they all broke so if they're okay they're putting complex commands there so what I suggest is put a shell script in your container put everything in there never then change the name so you can change the internals of that script and you don't gonna cause problems then so then you're going to evoke all your checks and one important thing about it being a shell script various of the open-shift S2I builders is SCL packages software collections library and for to enable certain packages in those you have to run this SCL enable command now those builders have a trick that if you invoke something in a shell it will automatically enable them for you if I was to set the readiness command to be Python something that would use a system Python and not the SCL Python and it would break so that's another reason why I use a script in it and as I said before the reason for that script is that rather than a long command it minimizes that contract with a deployment config so if you change things in the container it doesn't really matter. Other things use the host name send the local host ensure you're checking the H3 response status and send secret tokens to enable detailed responses so that you're not sending public information to the public that you shouldn't and echo details but also send the container along. How do we do about an application when a deployment fails? What we can do here and the reason we're going to do this is because your deployment is failing it's going to keep shutting down your app okay so it goes away you can't just keep debugging it because it'll keep stopping it but you can't in open-shift use this OC debug command. That allows you to run up a separate instance of your app in a container and then you can get into that it gives you a shell you can do things you can start up your original app. In another screen you can then go use OCR to get into that same pod and start doing debug. Run your read-in just change things around and try and do things. Final one you can do is TCP socket you might use this if you have a database databases don't respond to HTTP it might be an image that you pull down off Docker Hub you don't have an ability to put a script in there to do the check. Unfortunately it all it does is checks whether you can connect you might be a great I can connect but you might have picked the wrong image and it might not be your database it might be a hosted v-server running on a talk by accident you can't tell. So rather than TCP checks one thing you should do is use what's called side card container you're going to create a special image which you then actually going to embed a little servicing to keep that container running and a little mini-server and use either HTTP check or a container command and implement your check inside of a separate container because that's running in the same pod it shares the same IP shares the same port manage flex and so the reading is checked running in your site container it could be a script which then runs a Python script which contacts MongoDB does the login checks where the data is in there anything else you need to do so that's a trick for that so consider using a side card container instead of TCP gives you a bit more flexibility and just need to run something in there like a mini web server on process ID one to keep it alive that's the little trick but it can handle hosted v commands or a command you can implement more complex checks and just that straight TCP one check their basis on. Last one very important if you're on an environment which has resource quotas such as open shift online you might want to not use these side card containers and the reason for that is that when you deploy container in open shift online the way the resource quotas work is that by default it will sign 512 megabytes of memory to that container you can only wind it down as far as 250 megabytes that's our waste of memory for a little container that all it's doing is a readiness check which is only used during startup. Unfortunately you can't wind it down if you have a your own system where you don't have resource quotas or have better control then that can still work. Other things we have liveness pros I'm sure we've seen on the other one of the original slides. What we've read in this pros at all comes before deployment liveness pros is another thing you can also use that comes after your finished deployment and can be used being to check whether your application is still alive if it dies it'll get tech to restart. Do similar things with it in terms of different types. Another thing you can use if you want to look at the whole pipeline right through from build deployment to running is there's people a post commit hook which is part of the build configuration for an image. What this is is again it's another command hook you can run when you build finishes it'll start up an instance of your container with your new image run your command and you can run tests and that way you can validate the image even before you deploy it so that's another thing we can use for checking. One there to check be careful of is be careful of running tests in that unit test which use your database if you mark up your database configuration such that your default is your production database great you might just delete all your data. Finally if you want to look at grander again if you're Java fanatic then you might look at pipelines and the whole Jenkins pipeline is another way of doing that pre deployment checks and so on. So that's all I had we've managed to get our application all working we know that whenever we deploy it we're not going to destroy things our customers our American tourists who don't like all our scary animals are happy and they know what to do. I'll take questions and I'll just leave a slide up here we've got another event coming up which people might be interested in. How are we using those snack market containers for more complex things like monitoring metrics gathering? I didn't know about one okay so the question was are side car containers being used for anything else besides this thing I've suggested? One use case which I know about is Datadog so Datadog when you use it needs to have a local demon in the container for monitoring so essentially it's a way of collecting metrics for an application but those metrics need to be sent to a local demon but you don't necessarily want to put Datadog inside of your container because it's this big Java app which actually is the thing that does the collection so I you couldn't do this with Datadog but I had a talk to Datadog and they've fixed it up now they now provide a image which can be run as a side car container and because it's exposing a port and it's seen by your web app container running in the same pod you only then need the client bit of the Datadog inside of your web app and it will then send out the metrics to the proxy service running in the other container and up then to Datadog so that's one example. So just another example of that, side car containers will have the master and then inside cars they'll have Badger which looks at the log files and makes them a web interface they'll also put something that's grabbing data and sending it to performance so the other data is going to be sitting right inside there in there so you'll have a pod with three different containers running inside of it. So you have a rolling app you choose rolling all the time and then your readiness to check the script sort of grows. Do you have any tips for maintaining the maintainability of the script? Okay so the question is how do you maintain that readiness script or readiness pro on the web server? I have to honestly say I've not used them beyond simple stuff so how you manage them I don't know but it's probably the same problem as keeping your code in sync for anything else. The important thing in this case if you're using a script for example that would just be a part of your source code repo so at least it's in the same place whereas that example of the MongoDB command that command was off in the deployment config and OpenShift it's not under source control. So at least by being a script since source control is closer to the code and so when you make changes to your app you at least might remember to go into going.


Oh, she has an affair, what will happen to you?  Honestly, Hasbi Allah wa n'Aman wakil. If you know this in the Arabic language, when you say Hasbi Allah wa n'Aman wakil, meaning you have given up and I'm not going to even answer and may Allah punish you because Sayyidina Ibrahim said that when he was thrown in the fire, what else you will do? Anxiety, panic attack, you're going to cry, am I right? Angry, how dare, what do you think of me? Look at yourself, whose story was this? What did she answer? That's what I need to hear. To me, this is the best in all the stories of Sayyidina Ayesha, everything you know about Sayyidina Ayesha.  What did she say? And who said that to her was a Rasul, alaihi s-salatu s-salam. I will be dead. Every time I read this, I just can't imagine.  You know how painful is this? Let alone you're innocent, let alone it's coming from your husband, let alone your husband is the best of the creation. Alaihi s-salatu s-salam. You want to be a woman of Allah? You want to be the best? What did she say? The meaning. She said this to her father, mother and husband. She said it's already in your heart. And if I said I am innocent and Allah knows I am innocent, see what came out of the mouth, you will not believe me. And if I say I did it and I didn't do it, you will believe me. And I'm not going to say a word other than what the father of Yaqub, she couldn't even father of Yaqub, that's exact, she couldn't even remember his name, said. And she turned her back to Alaihi s-salatu s-salam, and to Sayyidina Abu Bakr her father, and to Umar Oman and said, Beautiful patient and Allah will help me about what you are saying about me. She turned her back and then she said, I never thought look at this. I never thought I am, she worthy in the sight of Allah that he will send the Quran to be recited till the end of the time to tell me I am innocent. And then immediately, that page of Surat al-Nur, and she said, I could see, Alaihi s-salatu s-salam, Quran is being revealed because he changed and you know what happens to him when Quran was revealed. And then he starts smiling and he looked at her and he said, Nizad, the meaning of your innocence came from Allah, from the heavens. So her father and her mother, she said, No, I am only going to thank the one who sent my innocence. It's Allah. Where are you from that example? A woman in 2022, living in the United States, living in California, educated, you have everything. Where are you from this? How can I be like the finger of Sayyid al-Aisha? You know what's the issue? It's me. It's my nafs. It's me. Everything is way more. I say this to me. I'm talking to me, not to you. Everything in this life is more important than him. I think of everyone else first and then him. I only think of him when I need him. Learn about Allah and turn to Allah at time of prosperity. He will know you at time of adversity. That's the Sayyid al-Aisha.


Item number SCP-315. Object Class. Safe. Special Containment Procedures. Object does not require any special storage arrangements. However, it is currently kept in an opaque cardboard box, away from strong light or heat sources, under the assumption that this will slow the natural decay of any stored data on the object. Description. Object consists of a set of 95 standard 8.5 gigabyte recordable DVD format discs, arranged in a stack on a black plastic spindle. Examination of the label side of each disc reveals no manufacturer's name. Printed into each matte label is the title POC 1 slash 1. Beneath this, each disc carries a unique symbol or glyph. No two discs carry the same symbol. On examination of the data side of the disc, it can be seen that each disc has already been fully written with data. Placing the disc into a computer or DVD player reveals that it is a standard encoded video disc. Playing the disc results in one of two effects, depending on whether it is a previously watched disc or an unwatched one. If an unwatched disc is played in a DVD player, the video begins. The scene displayed is a well-furnished living room, with a chair in the center. Sitting in the chair is a Caucasian male, SCP-3151, appearing to be around 40 years old. SCP-3151 will then demonstrate the ability to react to and converse with anyone watching the video feed. SCP-3151 will respond to any questions put to him, appears to be able to see the environment outside of the video screen, and appears to enjoy discussions and debates with viewers. If a disc that has already been viewed is viewed again, the disc will simply repeat the footage that was seen the first time. SCP-3151 will not react to the viewer's actions, nor deviate at all from the previous viewing. A disc, once played, always contains the same footage, regardless of who is watching it. The only way to communicate with SCP-3151 is to insert a disc that has never been watched. Given that there are 95 discs, each containing three hours of video, it follows that SCP-3151 has an effective lifespan of 285 hours, or 11.8 days, not including footage that has already been watched. It should also be noted that SCP-315 is not the complete set of discs. Five others are known to exist. It is known that all missing discs have already been fully viewed. SCP-3151 is cognizant of the nature of his own existence. When questioned, he is aware that he is being displayed on a television screen or monitor, and can reliably identify the type, size, and color of the device on which he is shown. When directly asked about his specific nature, however, SCP-3151 will not give a straight answer, preferring to draw the viewer into a discussion or debate. It is not clear whether SCP-3151 is withholding information about his origin, or whether he is uncertain himself. He claims the former, stating that to tell us everything would, spoil the game. He neither demonstrates nor admits to any unhappiness with his situation, nor his short lifespan. SCP-3151 retains memory between discs. If one viewer interacts with an unwatched disc, then switches to another disc, SCP-3151 will recognize the viewer and refer to a previous conversation. SCP-3151 has even shown signs of developing a rapport and friendship, with those researchers who have spent a lot of time talking with him. Document 315A. A collection of relevant excerpts from interviews with SCP-3151. Recommended reading for familiarization with this subject. Interviewed. SCP-3151. Interviewer. Dr. Forward. Primary examination of SCP-315. Discovery of SCP-3151. Disc watched. One. Gliff. Data expunged. Begin log. Doctor. This is Dr. Preliminary investigation for possible classification of 315. Subject looks to be just a regular stack of DVDs. I'm going to take the first one and investigate it on a detached computer. Let's get a close-up on that symbol. Can you see that? It looks like data expunged. Doctor. Oh, it's a video disc. I'll just play it. 15 seconds of silence. It's just a man sitting there. SCP-3151. Hello? Doctor. Oh, he's talking. SCP-3151. Yes, I am. Doctor. I... what? SCP-3151. I am talking. You're right. End log. Interviewed. SCP-3151. Interviewer. Dr. Disc watched. Four. Gliff. Data expunged. Begin log. Doctor. Can you remember what we talked about last time? SCP-3151. Last time. On the last disc you mean? Doctor. That's what I meant. Yes. Is that how you measure time? Per disc. SCP-3151. No, not really. I measure it in minutes. Same as you. Doctor. Can you tell me what the time is now? Where you are? SCP-3151. Sure, it's pfft on pfft. Redacted times were consistent with actual time of interview. End log. Interviewed. SCP-3151. Interviewer. Dr. Forward. Doctor. First assigned to project. Given goal of establishing a psychological profile of SCP-3151 and to determine if possible its origin and nature. Disc watched. Seven. Gliff. Data expunged. Begin log. SCP-3151. Well then, try coming at it from a different angle. Doctor. Like what? SCP-3151. Well, for example, let's say that there's nothing at all paranormal or unusual about these discs. Let's say they're ordinary DVDs with ordinary unchanging video data on them. Doctor. Well, the video data does change. SCP-3151. Does it? Doctor. Yeah. When I talk, you know what I've said and make a relevant answer. When we play the disc again, it's that same answer, so it's permanently changed. SCP-3151. My point is that you can't tell it's changed if you don't know what was on it before. It could be that the disc always had that answer on it. Doctor. That's impossible. SCP-3151. Says the Foundation employee to the SCP. Doctor. For that to work, for the discs to all be pre-recorded, you'd have to know what I was going to say and do exactly years before I did it. SCP-3151. I suppose I would. I'd need to be a pretty decent psychic in Clairvoyant, though, or have some kind of future extrapolation device. That would be improbable, but not impossible from a mathematical standpoint. Doctor. Sufficiently improbable that I'd sooner believe the impossible. SCP-3151. Or how about this? I could be from the future. I know what you're going to say because I have the records you're making and can respond accordingly. Doctor. That makes no sense at all. It'd be unimaginably paradoxical. SCP-3151. Yeah, you're right, actually. The other problem, of course, is that I have very little motive to record 10 or so days' worth of video just to screw with some SCP employees. Doctor. So we've made no progress whatsoever. SCP-3151. Well, that's not entirely true. You've got some more ideas in your head about how these DVDs work, whether they're right or wrong. You have some new things to try and disprove. And log. Interviewed. SCP-3151. Interviewer. Doctor. Forward. Doctor. Fourth three hour conversation with SCP-3151. Disc watched. 11. Glyph. Data expunged. Begin log. SCP-3151. I wonder what would happen if you were to throw one of the discs away. Doctor. You wonder. I'll bet you know exactly what happens. SCP-3151. Maybe I do. Maybe I don't. It doesn't matter anyway. I'm just wondering how you'd react to it. Doctor. What do you mean? SCP-3151. Well, I was just thinking about our little discussions about what these discs are, whether I'm really a conscious entity with an unusual way of existing, or whether you're talking to an impossible tape recording. Doctor. So you're saying I couldn't throw a disc away because it might be needlessly shortening the lifespan of a living thing. SCP-3151. No. I mean it the other way. You couldn't throw a disc away because it might be a prediction. You'd have to know if the prediction was accurate, whether the person who recorded the disc knew that you would throw one away and knew exactly which one. And then, once you'd exhausted all the other discs, you'd have to find the last one. Because if they knew one disc was going to be discarded, mightn't that be the one they recorded an answer on? Doctor. Make your choice, adventurous stranger. Strike the bell and bide the danger. Or wonder, till it drives you mad. What would have followed if you had? SCP-3151. Sounds about right. Doctor. I still don't believe your pre-recorded bulls***, by the way. It'd be easy for you to prove it, and I know you'd love to lord it over me. SCP-3151. I've got a comeback, Doctor. But it's the end of the disc. End log. Addendum 31501. Experimented to see how SCP-3151 responds to basic video playback functions. Pause. Entire scene paused, including SCP-3151. When resumed, SCP-3151 was able to tell that he had been paused. SCP-3151 then demonstrated the ability to respond when resumed to questions that had been asked during the pause. Rewind. Entire scene rewound, including SCP-3151. When resumed, DVD played back SCP-3151's side of previous discussion. SCP-3151 did not respond to questioning until video had once again reached the furthest watched point. He then resumed normal conversation, and requested not to be rewound again. Fast forward. Whole scene fast forwarded, including SCP-3151, who sat still during sped-up play. SCP-3151 picked up conversation immediately afterward, and requested not to be fast forwarded again. Slow forward. SCP-3151 was able to react to conversation during slow play, but was slowed down himself. When normal playback resumed, he identified that he had been in slow motion, but noted that it made no perceivable difference to him. Addendum 31502. Attempted to copy one of the unwatched DVDs. Was unsuccessful. Disc contains some form of copy protection that nobody seems to be able to break. SCP-3151 showed awareness of this attempt when next consulted, and made reference to cheating. Addendum 31503. SCP-3151 made reference to discs possibly being pre-recorded. To attempt to disprove, played a disc out of sequence, i.e., played a disc from the middle of the pile, rather than in the top-to-bottom order previously used. No apparent effect. SCP-3151 was still able to tell the current real-world time, conversed normally, complimented researcher on guile. Addendum 31504. Further attempt to prove or disprove pre-recording theory. A pseudo-random number generator was used. Displayed number to television screen. SCP-3151 was able to read out the number. If video is pre-recorded, the algorithm used for event prediction is almost impossibly accurate. Seems far more likely that effect is due to some paranormal phenomenon in the discs themselves, although further suggestions to try and prove either hypothesis are encouraged. Dr. Pryd's note. I don't like this conclusion at all. Without the ability to copy the disc, though, I can think of no way to prove either one hypothesis or the other. There are more important things to worry about at the foundation, but this one keeps tugging at the back of my brain. Addendum 31505. Two DVD players set up in separate areas. One randomly selected unwatched DVD placed in each player. Both discs played simultaneously to two separate researchers. Each instance of SCP-3151 engaged in a separate conversation with each researcher. Both instances also showed awareness of the other conversation and were able to transfer a message from one researcher to another. Addendum 31506. Two DVD players set up in the same room, played to two researchers sitting side by side. Dual instances of SCP-3151 able to communicate both with researchers and with each other, creating a four-way conversation. When asked whether they were two separate entities or one entity controlling both instances, the SCP-3151s were either unable or unwilling to give an answer. Dr. Ward's note.  I'm taking myself off this project for the moment. No psych evaluation required. I'm just getting stressed out trying to figure out how the damn discs work. Addendum 31507. Experiment undertaken to disprove the hypothesis that discs are manufactured in the future based on SCP conversation records. An unwatched disc was placed in a player, watched by Dr. and logged by researcher. Researcher was asked to periodically record conversations incorrectly, logging fabricated questions and answers for both Dr. and SCP-3151. All accurate records of the conversation, including the disc itself, were subsequently expunged and experiment participants induced to forget which parts of the record were fabricated. Inaccurate reports filed away as normal. Results. SCP-3151 continued normal conversation with subject, giving no fabricated answers or statements inappropriate to actual conversation. Dr. Ward's note. Couldn't stay away, but I at least have a decent reason for coming back. This proves that the discs are not scripted conversations of future origin derived from our records. It's not a huge breakthrough, but God, am I glad to have finally disproved something. Lesson complete. If you missed the previous orientation, go watch SCP-314, Motion Seeking Blade, right now. Or for the complete course, watch this playlist.


Tommy here from Learn Systems. We're going to dive into R-Sync running on FreeNAS. R-Sync, if you're wondering, is a wonderful tool for synchronizing data. But no, I'll just tell you right now at the beginning of the video, it's not as fast or as efficient as the ZFS replication, which I have another video for. But there are special use cases where R-Sync may be what's needed and it solves problems, sometimes especially when you're transferring between non-FreeNAS systems. So we're going to show both how to transfer from one FreeNAS to another using R-Sync and also how to transfer to like a Linux system using R-Sync. But first, if you'd like to learn more about me and my company, head over to LawrenceSystems.com. If you'd like to hire short project, there's a hires button right at the top. If you want to support this channel in other ways, there's affiliate links down below to get you deals and discounts on products and services we talk about on this channel, including a link to our Patreon if you'd like to become a Patreon supporter. We also have a swag store where you can get shirts and other items that are for sale and that changes from time to time what's available and what's not. So go ahead and check that out frequently. And finally, our forums. If you'd like to have a more in-depth discussion about this video, suggestions for new videos or just reach out and say hi and talk tech, our forums are a great place for that. All right, now back to the content. We'll start real quick and say, what is R-Sync? R-Sync is an open-source utility that provides incremental final transfers. It's been used for a long time by me and well in the Linux community as a whole to synchronize two different directories together. So if you have a path with a lot of data in it and maybe some of the data is over here and you're not sure if all of it is, R-Sync is a great way to synchronize the two paths. And if just a single file added over on the other side, R-Sync goes, oh, we got this and we'll bring it over as well. So it can do incremental transfers. It's really smart, it has a lot of options, it's easily scripted. Now it can be run over SSH, which goes beyond the scope of this particular video. And it's also not necessary to set up these modules inside of FreeNAS in order to have it working over SSH. It's just an extra parameter. You can Google how to R-Sync over SSH. Maybe I'll do a video in the future, but it's pretty well documented how to do it. We're gonna talk though about how set up R-Sync inside of FreeNAS and how you can have two FreeNASs talking together with R-Sync or even a Linux system to pull that or actually it expands beyond that. And we've seen it where other NASs that do have R-Sync abilities and you wanna sync FreeNAS to something, R-Sync may be a tool to go to for it. So like I said, it has some special use cases. Now first I wanna thank Tech Supply Direct for supplying us with this server right here. This is that Dell R730. I have a review video I'll leave a link to below on there. I mean if you're interested in getting a server like this from Tech Supply Direct, I do have an offer code that gives you 10% off on here. So this is a reasonably fast and nice server. It's an R730 with 64 gigs of RAM, plenty of storage, plenty of fast storage. But the first thing we gotta do is we're gonna go to services. And we're gonna turn the R-Sync module on. And if you want it to start automatically, there's the checkbox for that. Now we're gonna go and configure it. TCP port 873 is the default for R-Sync. Second, R-Sync does not itself have any security. It is now exposing port 873 and any of the modules we tie to it for anyone who connects to it internally. This is why one, it should not be publicly exposed across the internet unless you have some special use case where you want people to get those files and there's sometimes development times when you go, maybe I do want people to be able to pull this and I wanna publicly share it. But by the way, it does not have security. As I said, I just wanna make sure that's really clear. Don't just forward port 873 out to the world unless it's something you wanna potentially share with the world. Next, we have to add a module. So this is our source system right here, 3.212, like I said. And we have the options of read and write, write only, read only. And we have this module. And we're gonna share some photos. So we'll call this module, photos. And some photos. There we go. Get it spelled properly. If not, some little point out that I misspelled something, which is fine. And I have some photos right here. So here's the path on this particular system. We're setting it to read only because I want to share this with another freelancer. I want to be able to sync the files but I don't want anything written back to it. So I don't want it to be any rewrite sense user. We're just gonna go with root. So it has the high level permissions here but you could match them to whatever I have assigned here. I'm not even sure what ones and I don't feel like looking. But root and wheel will be fine because root has permission to go over everything. You can limit the number of connections if you want. So how many are sync connections come there? We're gonna leave it at zero which zero should leave us at the max. Zero is unlimited. Host allow. Now while it does not have any username password type security, it does have implicit host allow or host deny. So I could say only allow certain systems or deny other systems. And you can put networks in there as well. Enter some other auxiliary parameters we're not gonna get in but if you have certain advanced use case information you can pass those parameters long. But that's it. That's all we gotta do is set the module up and hit save. So now we have name photos, comment some photos. We have the path. We have it set to read only mode. We have the permissions. I'm able to look at it with root and wheel which means I can definitely get all the files. You probably wanna match them but for sake of this demo I'm not gonna match them to whatever permissions are actually on those particular files. But that's it for our source system. Now let's go over here to FreeNAS and what can we do with that? Well let's go ahead and pull that data. So we're gonna go, what's the path? First we gotta decide where's the data gonna land and I made a folder called rsync YouTube demo. Pretty straightforward. User, what user permissions are we gonna do on there? Why not? Remote host, <IP_ADDRESS>. So that's this IP address here. That's the system. Now FreeNAS actually supports the encapsulating over SSH. Like I said it goes out of scope of this but it does have that built in but you do have to and setting it up from a command line is probably the easiest way to do that. You do have to have the FreeNAS making the request have installed SSH keys on both systems. So you have to have this having the private key and then a public key pushed over there. Like I said it goes out of scope but yes it is supported on here. Rsync module name, well we called it photos right there. So we'll just paste that in. Photos, direction, push or pull. Well we can't push because that's read only. So we definitely want pull and we want the data to go from the source system to <IP_ADDRESS>, no problem. And we're gonna say pull some photos. Pull some photos. Schedule a task, hey why not? This should run every day or every hour, however you wanna do it. Now these are great for things like if you just are dumping some files somewhere onto one FreeNAS and you wanna rsync to another FreeNAS and you don't wanna go through the entire setup like I did where ZFS syncing but I just need those files that get dumped into this folder copied over to this particular system. This is an easy way to do it and you can set it for however long you want. The first time it runs it copies all the files and it's incremental every time they're after. So however you wanna set it. And these tasks unlike the ZFS replication are completely rsync tasks. There's no replication of snapshot data or any snapshots required for this to work. Recursive, yeah, we want everything if there was subdirectories. Time stamps compress it while it's running. Have to save them temporary from each updated file holding direction until the end of the transfer. These are all default options. It's fine just to leave them all at default but you can also choose delete. You may wanna do that. And what that means is if something is deleted on the source, do you wanna delete it in there? Like I said, a couple of the options that you have but we'll leave all these at the defaults because we just wanna get the data from where it is over there but you can see it's easy enough to change these. So we do that. It's pending but we can force it to run now. We don't have to wait for it because there's no snapshots. We can just say go ahead and run. Task started and it'll be done here really fast. Let's actually just force refresh the page. There, it's done. View the log. Unfortunately, it doesn't say any logs are available for that. I don't think there's any logging options that you can even really turn on. Maybe there's some extra parameters but you get the idea. It runs. It doesn't give you much of a notice. It'll give you a notice of a failed and it gives you a success when it's run. But now if we go over to this system here in our R Sync demo, so let's go ahead and log into it. Make the screen slightly bigger. R Sync YouTube demo. There's those. All right, and we'll just log into the other system. Root app, one, two, one, six, eight. Three dot two, one, two. And we see we have the same things here. Now let's go ahead and delete something. We'll rm.picasa.ini file. So now it's missing from here but it's here. So let's go ahead and turn on the delete option. So we'll hit edit. We'll choose delete, hit save. Now if there's a deletion on one side, it'll do again. So let's run this again. And it instantly turns into success because it already copied it once. And now we see the Picasso file. It disappeared. It's missing from this destination system. And if we were to remove more files and it would also do the same thing, you're kind of getting the idea that it's delete syncing. So actually let's rm.img17.star, here we go. We deleted anything that begins with a 17. So now all these have 18s and 19s in them. And these ones still have all the 17s when we list them. So we'll run it one more time. Go up here. And now they're synchronized and all the ones with the 17 done because we have that delete function turned on. So pretty straightforward how that works and how you get them synchronizing. So it's really easy to set up. Now the final thing is, how do you sync it with like another non-freenast system? And this is more the use case. I mean, our sync will work perfectly fine between two freenast systems but what if you had one that's not freenast and you want that module and you have some other type of system where you need to synchronize. Well, let's go ahead and do that. Exit. Exit. Exit. All right. So I have this little script setup that says rsync-freenast-youtube-demo. It's rsync-av-delete-progress-stats1921683212 colon colon photos. Now this is the module name right here. So we gave the module the name photos so we do photos slash that means grab everything in there. If there was a subdirector you could actually go with one of the subdirectors underneath but we're not worried about that. We just want this one right here. Where are we going to dump them? Home, Lawrence, TMP. So if we go in here, look in TMP, LS, nothing in there. It's empty. Let's run that real quick. And the progress and stats is what gives you these little stats right here. So we can see that pretty quickly went in there. So we go in and look at the TMP folder. There's all those files. Great, clear it. And let's run it again. And you can see the files haven't changed. Now what if we go into TMP and we remove some files here? Now you remember it's read only on the other side. Well, we removed all the files. It just runs again and synchronizes again. But what if we accidentally goofed up a couple like RM, IMG19 star. So we still have files. We don't have all of them. Well, same thing. It's just going to rsync and synchronize again for those files and now they're all back. Now, this, like I said, will work in both a read write direction. You could use the module and do it the other way and push things from this system using rsync over. But as I stated in very beginning, there's no security when you're doing rsync inside of here. So the system is just leaving port 873 open. It does have the ability for, you know, host allow, host deny on a per module basis when you're doing this. So use it at your own risk. Use it and making sure that you're doing this on a secure network and make sure that the data is okay to be exposed. So it can be very handy for getting files across, especially when you're setting up a new system or migrating to FreeNAS. Some other NAS systems I've run into, some of the weird ones that I've seen people have, they have rsync, but they don't have a lot of other tools for synchronization. But the good news is because FreeNAS supports polling from an rsync module. You can use FreeNAS to pull from another NAS. Also, if you have some other NAS, you want to use this backup, kind of the opposite is true as well. Where I've seen it, where people set up a module in rsync module, they restrict it to another system. And you can have that system pulling data from FreeNAS as a backup because well, not all other NASs support things such as ZFS replication. So it's a great tool to use. I really like it. It's not what I'm going to use generally to synchronize to FreeNAS systems. That's why I did the replication video. That's going to be the more ideal way to do it. But if you just have some data, you need synchronized between another system or even if you want to make something easily available and you want to pull some type of project files that you keep stored on your FreeNAS system, but you want to easily sync to another Linux system with a quick script, this is an easy way to do it to be able to pull whatever those latest files are from it. So that's all you got to do to get these set up. And you can set up as many modules as you want until you run out of space to do so. So if you want to add more, and remember each one is also two modules aren't named the same. You can have multiple modules pointed at multiple directories. And that's it. All right, thanks. And thank you for making it to the end of the video. If you liked this video, please give it a thumbs up. If you'd like to see more content from the channel, hit the subscribe button and hit the bell icon. If you like YouTube to notify you when new videos come out. If you'd like to hire us, head over to laurancesystems.com fill out our contact page and let us know what we can help you with and what projects you'd like us to work together on. If you want to carry on the discussion, head over to forums.laurancesystems.com where we can carry on the discussion about this video, other videos or other tech topics in general, even suggestions for new videos that are accepted right there on our forums, which are free. Also, if you'd like to help the channel in other ways, head over to our affiliate page. We have a lot of great tech offers for you. And once again, thanks for watching and see you next time.


Go ahead, you're going to be talking about script for it. Okay, so you see my slides. Yes, yes we do. Okay then. Well my name is Jean-Pierre Le Dure and I contribute to LibreOffice since 2013, something like that, mainly with the access to base library which is now a very major part of the basic libraries which are shipped with LibreOffice. And we started a new initiative which is called Scriptforge. You know what Forge is in software engineering and the target is to have something for authors of scripts, either written in basic or in Python. You see that Python is between square brackets because in the first release Python coders have no benefit from Scriptforge but they'll have in the future. The code exists, so show the code, you can see it on GitLab. We will see what Scriptforge is in a nutshell and then also raise the question is it smart to code an API because it's an API. We offer a number of services with Scriptforge and the API is mainly written in basic, not only, there are also parts of it written in Python. Service and framework go together. The code is subdivided in services and the integration is done via a framework and this makes the thing also extensible in the sense that the framework can integrate new services if needed, also written by other persons than myself or the other people who work with me. We will see what the modules will contain in the first release which will be shipped with LO 7.1 and what we plan for the future. What is it in a nutshell? It's a service-oriented framework. We have implemented so far something like 300 methods and the question was how can we make them coexist? Well, we separated them in silos and we called them services. We will see why and how and to make the whole thing extensible, we built the framework. What we will have know immediately as functionalities, we extended the arrays and the strings containers with a huge number of functions and we implemented also a mapping class called dictionary which is larger than the correction class which is included in basic. Error handling is also weaker than VBA anyway and we extended it also. We built a complete files and folders management class and also read and write to text files because how to do it in basic is quite rudimental. Localization also, localization is done with a number of functions and we use the PO portable object format for that. There are a number of functions to integrate basic and Python and then more classically a number of classes also to manage Windows documents in particular calc sheets also dialogues and their controls and how to access databases. Mainly for the last ones, documents, dialogues and databases, the idea is not to replace UNO, it's to make wrappers that facilitate the access to UNO. So an API written in basic is that smart? Well, the first question is can we handle complex data structures in basic? Well, the answer is yes. A variant can contain anything and you can including user defined types and user defined types can contain variants themselves and etc. So that makes the stretching of data of information quite easy and quite complete. Now another question was is there object orientation in basic? Well, the answer is partially yes. You can encapsulate methods and properties in a class module that works but there is no subtyping. It can be bypassed. For instance, we use that for making the color class subtype of the document class. But it's bypassed, it's not built in. And of course basic variable tags, a string is not an object in basic. So it's quite limited but sufficient to do a number of things and an important property of this is that you can encapsulate methods and properties. There are no namespaces in basic and even public and private attributes are ignored. So this makes things a bit difficult to have a very large API. But there also we worked a bit on that. Important is that the next slide. What was really blocking is that when you load a new library into basic, well, all the functions present in that new library are de facto public from anywhere in the libraries that you have already loaded before. So this makes that you never assure when you call a function by its name that you execute the function that you think should be executed now. Accept it if you fully qualify the function with global scope probably. The library name, dot the module name, dot the function name. But happily we discovered that it was in fact really easy to work around that. You can assign a module which is a useful basic object to a variable and execute any function just by qualifying it with a variable which has received the module as content. Okay, that was a number of prerequisites that we had to build what we did. And now the user's point of view is quite easy. The user must of course now to start with scripting and using the services that we provide. Well, of course the script for library has to be loaded. That's a matter of this application in basic. And afterwards if that is done, the user will call a method name is create script service. Of course the analogy with create unit service is obvious and it's intentional. The user has to call create script service for instance for service called file system which gives and then access to a number of methods for instance, copy file, delete folder. These words in many cases very long method names and it simplifies for the user the use of our services and prevents any collision between homonyms. Besides create script service we as a tolerance we allow to use because we think that there will be a use frequently to directly call the modules for arrays, strings and exceptions. And so it's equivalent to write create script service array or sf array dot so. Okay, but you spare a number of lines of code. Okay, that's what the user has to know. The create script service will then return either a basic module as an object or a basic object, a basic class instance. In fact, and in the latter case, arguments may be passed to the constructor of instance. So from now on if you want to use a method from script for as you qualified. How is that implemented? Well, you see the three levels. You have the user script, you have the core of script for and you have a library. And the three parts here may be written by three different persons. The user is probably someone someone else. But script for score and my library my library can be any library who wants to play the game. Well, the user script cause create script service and the core will, of course, contain the method create script service. What will that method do? Well, once of course, the my library, which is the library called by the user must be loaded, but this is done by by the API script force will search for a method called register script services in my library. And then we'll return this, the requested service. And the register script services is a mandatory method that must be implemented as supporting in the requested library. And in that method, the author of that mail of the library, which can be an extension, for instance, will enumerate the services that it implements very easily, either as a module for the example of my service one, or as a string giving the method that must be called by script force core when the user requests the service to get an instance of that specific service. So the framework here is quite easy. The goal is to have from basic scripts, one unique create script service method, and the same method from in the future from Python scripts. This makes that the challenge will be to have services come on to Python and to basic implemented either in Python or in basic. The framework for the basic part, which is today, you can see there the core implements create script service implements register service and register event manager. I did not talk about register event manager, except the fact that you can get services when a code is triggered by events as well. And an associated library or an invited, we call it that way, an extension, for instance, must minimally implement register script services and optionally a number of other things which make things easier. Pythonists, they are really, really easy to write. Pythonists will recognize the REPR routine, which asked the service to give a textual representation of the content of a specific instance. But the idea is well to have common services both from basic and from Python. So to have finally the core library, a number of associated libraries, and what the green part and the blue part will be shipped in the first release and optionally all the candidates to make new libraries in the future or wanting to make extensions and using the classes of script force can make extensions and can just be integrated in the whole framework by implementing the registering of the new services he wants to implement. Now what is present in the first release that we will ship with LO7.1? Well, four, basic libraries you recognize with the elements that I mentioned before. So SF documents is the name of a library where Calc is the name of a service. So four basic libraries and a number of Python helper functions. We'll see where in the next slides. There is also one online help page like you know them with LibreOffice by service and one English POT file. What is POT? The sportable object template file for preparing the translation of all the labels that we use in the software. There is also a complete unit test suite which will not be integrated in LibreOffice in the first step, but it exists and there is also a coding convention charter for future contributors. As an example of the help page, you see that's quite detailed as the name of the library is SF databases and database in the name of service and you see for instance here how can you invoke a service with a number of arguments etc. And you have all the methods and all the properties which are detailed with examples below.  Of course there are sometimes a number of methods that give of that return themselves another class or another object. Some of them you can be reached either for instance I take here the user interface. You can use the method open document to get a document object. You can object. You can also get the document object directly via create script service if you find it easier. Okay now we go through the different services as implemented so far. So the array service we have implemented 30 methods in it. The target is our 1d arrays or vectors and 2d arrays, two dimensions, and matrixes. You see that the verbs are quite easy to learn and to remember. You can manipulate data, you can transform the array, you can sort. For instance you can also sort rows on a column or sort columns on a row. You can search arrays, you can manipulate arrays as sets, making the union, reducing the array with only unique items, etc. And you can also import and export. For instance you can directly import the csv file into an array or convert, I take the last one here, convert the array into a dictionary, so a mapping class which is precisely the next topic. Basic contain collections today, well collections have a number of restrictions and implemented dictionaries here. Exactly like Microsoft did in the past, Microsoft also offers dictionary and collections. This is much more flexible than collections and we have almost, I say 90% mapped the interface as onto the VBA dictionary class here. We provide also a number of conversions from dictionaries to something else, in particular to JSON, this is done with a Python specific function, also conversion from property values, two property values and importing from property values. Why convert and not export? Because convert means you add something to what exists already. No, it's the opposite. Import means that you add to what exists new property values in this case or converting a dictionary to an array. As an example, the management of the services or the framework is implemented with a dictionary of dictionaries. A first dictionary of libraries and a second one of all the services provided by that specific library. We provide an exception service. Here is an example of the output as displayed to the user when race fatal is executed by script for us because script for us detected some anomalies. You see the library, the service, the method, in this case sort, and you see the syntax of the interface used by the user. And in some of the arguments that was something wrong, the validation, the validation rules are reminded here. So the order must be a string and containing one of the next values. And unfortunately, it contains something else. So the execution is cancelled. So the user friendliness of the API that we provide is illustrated here. You will notice also that this is here in English. Everything there can be localized. Here to fill the gap with the VBA air object, we did a number of things. Well, the time goes further. I will not detail here what the possibilities are. Also, still about exception. There is a console that is provided. A console is filled with an execution of a number of debug print statements. A debug print will can have as many arguments as you want and will display in a model or non-module dialogue what happens and what happens during the execution. It's, in fact, particularly useful when you execute, for instance, use a defined function from a calc formula. Well, you cannot use the IDE to debug your function. You have to use, you can use, in this case, in non-module mode, the console. You have also file system service. It's mapped on what VBA offers. I can underline here a number of verbs with wildcards where the arguments can contain wildcards. You have also a number of functions executed by Python. You can, for instance, get the md5 or something or another hash code from the file that you give us as argument. It then for compare files. The text stream class is quite easy and quite obvious. The difference with what the basic office standard is that you can set the new line and the encoding specifically by file. Now the L10N service is quite original, I think. For those who know, I don't know who knows what the PO file is, but it's a technique imagined by GNU to separate the two profiles between the programmer who writes a number of labels in his language or in English and the translator who translates all the strings in a specific file. What we provide here is a method at text, a method export to port file, which generates the template file, and when at runtime get text will allow to get from a PO file, so a translated file, the correct translation. Platform is a mapping of the Python platform.py library. In the session service we put what we could not put elsewhere, so we put there a number of unobjects, introspection methods, a send mail method in particular, also interfaces to easily execute external programs, either in Python, either a calc function or running an application based on the suffix of the file that you provide as argument. Also executing a web service or open some URL in your browser. All these methods here are examples, there are more in fact. Confront here we have a total 42 methods to work on strings, for instance to replace such strings, so basic as a replace method, but replace STA will work on arrays of strings, replace char will work on substitution one by one of characters in input and output strings. We have a collection of input validation functions, for instance is ex-digit, is a string that you provide ex-digit, is it IPv4, is it a URL, is it a white space, which is much more than space, is it a regular expression or does it fit with given regular expression. Item to parse strings here, find regular expression in a string, replace all occurrences of a regex by something else, or split not quoted, they're quite useful when for instance you want to parse CSV file, well the CSV file has a number of chunks of strings separated by commas and a chunk when it is surrounded with quotes can contain commas, what do you do? Well you split not quoted and you give the commas a separator and you get the chunks in the array. Working with line break special characters, also hashing, also done in Python, and we were inspired by what Python and PHP in particular offer or propose here. We have also implemented in the core a timer which measures elapsed time, it's to compare the performance in duration between different algorithms if needed. So you can for instance start a timer, suspend it just before displaying a message box, waiting for the okay and then continue again and continue again up to extermination and measure then what was the effective duration for the significant part of what you want to measure in terms of performance. And using interface service manages windows and documents, you have a number of things proposed here, also progress bars you can put the progress bar or text in status bar, you can also display dialogue which shows a progress bar during which you can well do a number of things and give the progress on the dialogue. It's from there that you start document instances with here a number of methods. Of course base documents are often different from the other types of documents that's why there are specific methods also. And get document is for instance to get a class when you give let's say entitled to as argument when you get a document and you go forward and you can reach that way in the asset documents library, the document service. With a number of things that are classical to do on documents particularly here is that we convert immediately document properties or custom properties into a dictionary. You use the dictionary verbs if you want to update them and you can write them back in the document. You see here property X component well the component you know object that you know can be reached just by giving X component yours. We always use the X as prefix to designate use objects. It's just a shortcut to reach the document in the component mapped onto the document that it is about here in this instance. And we implemented in particular we did nothing about write the progress etc but we developed mainly here a number of things around calc sheets and we extended the concept of range. Range is always a stream the sheet and then like you see here sheet X dot etc the range is given as usual but to extend it you can for instance use a star instead of the real coordinates just by the star replaces the used area on the sheet and you can also use the tilt to designate the current selection and you can also use a specific method called range to get an object for instance if you want to copy a range from file A to file B and well from sheet X to the current sheet on this with this coordinates well it's done in one statement. You have also shortcuts you see X spreadsheet or X star range and you can also have here a number of import import verbs to fill sheets. The focus here is really on filling sheets with data and not formatting them. The only verb that you have to format data is set cell style. Here for database well you can mainly get selective data with these verbs here and you can get you get one single value or you can get massive data with get rows and you get an array of data. Of course conversion of I don't know date values in databases towards date values in basic is not automatic. You can also run action SQLs let's say updates or create table whatever you can you can execute them directly with run SQL as verb and then you have also shortcuts to a number of you know objects to go further if needed. Item for dialogues what is specific is that the dialogue can be displayed in non-modal mode in that case where the execute must mention that the argument is true and means that you want it in non-modal mode in that case while the execution goes just further up to the termination of the dialogue. You see to get the dialogue you just to create script service as usual with a number of arguments which dialogue etc and the controls method gives them access to the individual controls. Both for dialogues and for controls we do not make any distinction between the view and the model so it's a simplification. Also all the all the controls here whatever that type have the same exactly the same properties in particular take value where you use value to get or set the value of a control whatever it's its type you don't you don't need to know what its specific property is it's just a simplification and you have also shortcuts to control modern and console view. So this will be my last slide and I'm over my time so the perspectives are mainly to have a number of services typically for Python or philosophy is that if you want to display a message box in Python well the easiest way to do it and to have and to not have any visual difference with basic is to let it do in basic and to get the return value back item for dialogues etc and then the next challenge is will be to have the services common to Python in basic so that we can use basic services developed in basic or services developed in Python from anywhere. Okay I thank you. Thanks Jean-Pierre.