Servoy 2019.09 Launch – Part 2 – Updates to the NGDesktop
Servoy 2019.09 Launch – Part 2 – Updates to the NGDesktop
Hi, welcome to today’s webinar and joining me today again is Shan Leflen Shan. Good morning. Good morning, Jan. And we don’t have any screen yet. So let’s see if we can get that set up. Great. I’m seeing something popping in. There we go. Fantastic. We’ll start again. I missed the stars. Yeah. I’ll wait. That is the star gazing. Fantastic. So today, yet, installment is number two on the launch of 2019.09, which I think on Monday, we by accident announced a Servoy v9, but it is 0 2019.09 as we name them after the month in which they’re released to make it simple for everybody. And again, we welcome anybody that has any questions or comments or suggestions to post them in the questions channel, which I will be monitoring. And as usual, until Servoyworld, we will be pestering you with this slide. Thank you for subscribing. Make sure to come to join. We have quite a few people already signed up. The hotel is starting to run out of rooms. So if you want to book, this is the place to go to meet other Servoydevelopers to meet all of the Servoystaff will be happy to see and talk to you there and maybe even have a beer if we have some time left after coding at Haggathons. And quite some content for today. So Shan, the floor is yours. And my screen is, well, you saw my screen. Okay, just checking it’s visible. So today’s part number two. And I think now we get into more of the fund demo stuff because in part number one, we just did kind of an overview of everything that’s new in servo. So we’re going to do that for 2019, oh, nine, which included some odds and ends, but there’s two bigger parts of it that we want to demo, and that’s what we’ll do today and on Friday. So today is all about building hybrid desktop applications. So what that means is building web applications like you always can do in Servoybut deploying those in a way that they are running as native applications on the operating system of the desktop or the device of your choice. And so what that offers is a tighter integration with the local environment and also the real feeling of a native application. So something you can double click and launch and that kind of thing. So for some of the key demos, we’re doing today and some of the enhancements that have been added since the first release of this project is working with the local file system being able to execute system commands and actually being able to export the binary so you can test them and put them into production. And we have already customers that are doing just that. So we’ll just jump right into the demos and then we’ll do an overview of what we’ve seen. I do want to point out that we did release the first version of the NG Desktop project in 2019-06 earlier this year. And that was basically like a skeleton release to show that it’s running and that it’s working. And this time we’ve added the file system plugin and the system command plugin and the ability to do the exports and we’ll be adding more enhancements every quarter. So this is kind of just what’s new. So let me jump into the demo. I’m going into my Servoy developer IDE and what I’ve done is built a small example application this morning for this webinar. And I’m going to launch this by clicking the launch button and now if you haven’t gotten into the NG Desktop yet and you will see there is a launch NG Desktop client button here. This is what we did in 2019-06. And instead of launching, typically what it does is opens up your default browser and launches it there. And now you can see we’re in a native application. We have a menu across the top. You can see that we have a real physical window here with the ability to expand and restore and minimize. And of course the regular HTML5 application that you built running in here. So for the first examples, we’re going to do some basic file integration which is sort of run through all of the capabilities that we have today. And I’m just going to start simple with making a message and writing a file. So I have a message here, hello world. Maybe I want to add an exclamation mark to it. And now I’m going to write this file. And you’ll notice that it’s prompting me to pick a place to directory to save the file. And it’s also giving me a default file name that I can change. And you’ll notice this is also a native file explorer that you get with your OS. So I’m going to go ahead and save this as helloworld.txt. And if I go to, if I go to that same directory I have here, ng.stop examples. You can see that helloworld.txt was written at 11.06 a.m., which was a few seconds ago. And I can open that up in Notepad. And you can see there it is, hello world. There’s another way that I could write this file. I could, let me go ahead and add a few more exclamation marks. And I’m going to pick a second option to write the file. And this time it doesn’t show the dialogue. Instead, I specify programmatically the path where I want to store the file. It’s in the same directory. And if I come back over here, you can see that the timestamp is now 11.07. And if I open this again in Notepad, no path telling me it was modified to reload it. So now you can see I have the extra exclamation marks. So there’s two ways to write the file. One is sort of, you know, with the default file explorer, the other one is the unattended where you specify the path name programmatically. Going back to our examples, suppose that we want to read that file back in. So what I’m going to do is come over here to Notepad and let’s add hello, Servoy world. And I’m going to save it and come back to the ng desktop client here and choose read file. Again, it’s prompting me to select a file. So here I can double click that. So I use the OS specific file explorer. And you can see now the text was updated. I wrote it back to a local variable here. And we have the same capability to do an unattended read. So maybe what I’ll do is capitalize, Servoy. And this time I’m going to do the read file to option. And you can see now that unattended, there was no dialog to have me choose. I programmatically specified the path name to read that in. So let’s take a pause here and jump into the code and just kind of see how this works. So I’m in the JavaScript file associated with that form that form is called basic example. And I want to look at the right file method, which was the first thing we did. So well, first of all, what I did is I grabbed the home directory, sort of the user’s home directory for this operating system and the current user. and use that as the route for where I’m going to work for all of these examples. And so the very first thing I did was the plugins ng desktop file dot home directory. And that returns a string of what the home directory is. And you can see I had it printed out here. It’s the SQL and users in Windows. That’s something that just comes with your operating system. You may be wondering if this is the first time you’ve seen the ng desktop at all or the ng desktop file plugin where does this come from? It doesn’t ship with the core. It’s sort of shipped as an extension because you could think of the ng desktop as a container or a bridge to the local file system. So as we make enhancements, as people request things and new projects come up, we’ll be shipping those as extensions. And just like anything else, we add extensions through the package manager. And you can see that under my Servoypackages, I have added ng desktop file and ng desktop utils. And you can get those by right-clicking the package manager, right-clicking this and opening up the package manager. So back to the right file example, what I’ve done is I’ve in the first example where we use the file browser, I sort of specified a default file name, helloworld.txt. And then I converted the string from that form variable, which is just up here message. I converted that into bytes using one of our utility methods. I suppose we could add a method to just write a string instead of the bytes that would be no problem. And then I call the ng desktop file plugin again and I write the bytes out and I pass in that specified file name. Notice that it’s not a complete fully qualified path name. So it’s not telling it where to write the file. It’s just saying this is what the default file name should be and you saw that’s what showed up in the file explorer. The unattended version of that that we did is right here, it’s this right file two method and it’s basically the same thing, except for instead of specifying just the file name, I specified a fully qualified path name which included the home directory and that intermediate directory that I created, it was actually created the very first time I click right file and I called it ng desktop examples and then the complete path there. But the same thing, you basically give it an array of bytes that you want to write and you either give it a file name or a full path name or null. If you do null then it won’t, it’ll still show the file explorer but it won’t give you a default file name to choose from. So that was writing the file. The other examples we looked at were reading the file. So in the refile method, what I did is call the ng desktop file read file method and then it’s asynchronous because a file could be very smaller, it could be quite large and it takes a while to read it. So in this case, you specify a callback and I have another method here called on file read and that’s handled down here and what it does is it returns back the file path and then this JS upload object, which is kind of a link to the uploaded file and you don’t have to worry about memory management or anything in this implementation. What happens is the file is streamed to the server and then if it’s a very small file, you can just get the bytes directly because it’s all in memory and if it’s a very large file, it’s actually sitting in a temp file so you don’t have to worry that it’s going to upload 500 megabytes, it’s going to blow up your session, it won’t be held in memory, there’s an optimized limit for that. So this is actually a new data type that’s new in server y 2019, 09 and you can see that the code complete on file, you can get bytes, you can get some information about the file that was uploaded and there’s this boolean method is in memory, which will let you know if it’s already cached or if it’s larger than you can actually get, you can write it to a real file. So what we did in the second example is specify the full path and that was the unattended read file where it just didn’t show the dialogue or anything. And I called the file get string, which just reads the contents of the file as a string and I wrote it back into the variable and you can see that the variable is updated with the contents of the file. Let’s go back to the example and continue with some more stuff. Suppose, well, let’s do the right file example again and this time I’m going to give it a different file name. I’ll call it Hello World 2 and save that and you can see that over here now it was written to a new file and suppose I want to list files that are in a directory, I’m going to list the files that are in that directory here and you can see that there’s the two files. There’s also this other directory here and we’ll get into that. That was when I was testing the export, I wrote it there so we could find it later and I just left it there. So that’s another directory that’s sitting there. So with the ng desktop file plugin, you are able to pick a directory and say, I’ll list all of the files that are there and those files could be real files or folders. And so you could recurServoy iterate down through a directory, you could build your own file explorer if you were so inclined. It’s up to you how you use that, but basically you get a list of the files that are there and then you can work with those. In this case, I just printed out the file names. Suppose that we wanted to delete a file. What I’m going to do is delete the Hello World file and you can see that what I did is I under the hood, I relisted the files that are there and you can see the Hello World file disappeared from my list. I’m going to go ahead and rewrite that file in the unattended mode. So you can see now that it’s back with the content that I put in there. And now what I want to do is get some information about that file. So you can see that it’s four bytes. It was created about a minute ago and the modification is the same as the creation date because I haven’t touched it yet. And the type is file, it could be file or directory. So you can get some information about the file. If I were to come in here and say, modify this and save it and come back here and get the file stats again and update them, you can see that the size of the file increased by one byte and also the modified timestamp now reflects what I just did a few seconds ago. So if you want to get the stats about a file and there’s a lot more that’s available than what I printed out here, you can just call a method to get that. Why don’t we take another break and go back in under the hood and take a look at how that works. So moving on to the list files example here, again, what I did is I took that directory which is the user home directory plus the example directory that I made. And I just used that as my path and I called this NG desktop file list or and pass in the path that you want. And that just returns back an array of strings. And all I did was join those together with a carriage return and set that back to that message variable so that it was printed out in the text box that it was bound to. So very easy to list a file to list the contents of the directory. And if you wanted to, you could pick a directory beneath that and list it again. And like I said, do it recurServoy if you needed to. And the other thing I did was I deleted the file. And again, that’s you just take the absolute path that you want to delete and you call delete file. There is a callback that you can pass in as an optional argument if there was an error suppose the file was open in another program and you didn’t have access or something like that. There’s an on error callback that you could specify if you failed to delete a file for some reason. In that particular example, you’ll notice that I also called list files again which reprinted out the list of files to that message because that’s what made the list of files there after I pushed delete the hello world.txt went away. And then the last example that we just did was getting the stats on a file. Again, this is just one liner in the ng desktop file plug-in. You specify the path name and it will return this stats object and it has a bunch of information in it and you’ll get code complete on that object as well. And so what I did is just sort of printed that out back to that message. I had to format the creation and modification time stamps because those are return to milliseconds since the epoch and that’s easy to format. And I made a little utility method for that. Let’s continue to our next example. We’ll do working with temp files and this should be pretty easy. Suppose that, we’ll just put a new message in here. This is a temp file. Suppose I want to work with temp files. This is a common requirement for applications. Maybe you want to put something on the local workstation for just for the, while the session’s running and then you don’t want to worry about clutter it up. You want it to be automatically cleaned up. That’s what temp files are for. That’s what the OS will manage for you. So I’m going to go ahead and write this out to the temp file. You can see the path name it was here to my local temp directory. And I’m going to navigate to that. Excuse me. I believe that’s app data. Yeah, it will cool. Now I forgot what it was. Let me do that again. I have data local temp and then ng desktop. So temp. ng desktop examples. And so there’s the hello world TXT that I wrote to a temp folder. And if I open that up in no pad, you can say you can see that it says this is a temp file. So this, this because it’s a temp folder recognized by the operating system will be cleaned up. You don’t have to worry about junking up the user’s file system. So if you just want to stash stuff there, you can. Of course, in an HTML5 application, you can always use local web storage. And we have a whole other webinar about that as well. But temp files are a bit different. Let’s do, we’ll quickly take a look at that under the hood. Here’s the method here temp file again. One liner in the plugin, I’m calling plugins.ng desktop file.temperature. And that will return the string path to your temp directory on your operating system. And then you can append whatever you want to it. And then write the file to it. So I call it right file again with that path. And then I just made a notification. So again, one liner to get the temp directory. And then you can do with it what you want. So the next thing I want to do is show you how to run an executable on our system command on the local file system. So this is not specifically, you know, I overlated, but it is integrating with the desktop. So I’m going to push, let me just go into open. Go back. All right, so that’s my new message. I’m going to write the file. Let’s do the unattended right. So that just kind of reoverwrote the file. And now what I’m going to do is open it in notepad. And there you can see this is going to open notepad. I chose the program to open that file. Now, suppose that I want to open it in notepad, and then I want to monitor the file. And when the file has changed, I want to read the contents back into the application. So I’m going to turn on file watching. And so now we’re going to monitor that file. I’m going to open it again in notepad. I made a change. And I’m going to save this. And if I come back to developer here, you can see there’s a notification that the file was updated. And you can see that the contents made it back into that little message variable. So it sort of did a round trip. So let’s take a look at how we opened the file in another program and how we monitored the file for changes. So first of all, let’s go to the open file method. And what I did is I found the executable for notepad in this case. And I took the full path to my hello world TXT file. And I called another one liner in the plugin. This is a different plugin by the way. You can see I have ng Desktop file here, which looks like this. And ng Desktop U-Tills has a few other methods in it. So I called ng Desktop U-Tills.xq command. And I pass in the path to the program that I want to run. And then whatever arguments that program is going to expect. So in this case, I’m just saying, I want to open up this file path in no pad exe. So then in the file watching example, what I did is I connected to that little toggle switch here. If I can turn on and off the file watching, I connected a handler to that called toggle file watch. So this method gets run every time that switch changes. And what I do is, well, yeah, I specify the path of the file I want to watch. And I remove it because if it’s turned on, I probably want to remove it. So I just remove it. And then if it’s now on, I add file watching. So it’s really two methods here. One is unwatch file. That’s if you want to remove it and you pass in the path. And the other one is to watch file. And in that case, you specify the path. But then of course, you have to specify the callback because it’s asynchronous of what happens when the file changes. So I called this on file change method. And this passes back the path of the file that was modified. And so what I did in this case is I did the unattended read file that we already walked through that example. So I won’t go into that. But basically I got the notification. I ran the file back in and wrote the contents back to that message variable. And then I popped a notification to say that the file was updated and what the path was. So that happened because I modified the file. That would get qualified to lead to the file as well. You could also specify file watching on a directory. And then you get a notification if anything happens inside that directory. So if you added a file to the directory or you removed file from the directory, then you would get a notification on that as well. So you can add multiple file watchers and do some recursive stuff too if you wanted to drill down into a directory within a directory and watch two of them or something like that. So how you use this is up to you. But one of the use cases for this might be, there’s lots of machinery hardware that works with like ASCII files and people need to do integrations with them. And what they basically do is write or monitor some proprietary ASCII file that’s associated with that piece of hardware. Say it’s a medical device that’s waiting for an image to come back from a radiographer or something. And a lot of times the metadata about that will just be like a little ASCII file and you just watch a directory and wait for a file to pop up and then you can read it in. So we get in business applications, we get stuff like this all the time and all of it requires the desktop. So that was a real simple example. What I wanted to do is I made another example to try to contextualize this in perhaps a real application and show everything to you end to end because that was kind of overview. So we’ll just do this real quick and we can go in and look at the code. I have our usual example data here with some orders. I have a list of orders. I’m going to make this a bit smaller by putting in, I don’t know, a city, Buenos Aires. And I’m going to go ahead and click this button down here, edit and Excel. And now you can see that it’s opened up the records that were in that search result. I’ll just expand these. In Excel as the CSV file. And then suppose, I don’t know, suppose I changed the date on this to 2019 and I wanted to save it. If I come back to the application, you can see that I get a notification that the file was modified and you want to apply the changes and I click yes. I actually didn’t write the code to read the file and update the record. But we get things like this and projects come up where people need to pass control to another application and then watch a file or something and then if something happens, maybe read that file back in, is a bit more of a realistic example than notepad. So I’ll take you through the code real quickly, but everything that you just saw is built upon the smaller examples I just did. So if we go into the advanced examples and we go to the first method, which is to export the orders, you can see that I use the text export to generate the CSV. I convert that into bytes and then I just call right file. I made it as sort of a hard-coded location. You could do this as a temp file if you wanted something like that. And then I immediately added a file watcher and you can see that all I do is in case it was already added, I removed it and then I added. And then I call this NG desktop utils execute command again, which was the same thing that opened up notepad in the previous example, except in this case, I’m opening up Excel and I’m specifying the file that I wanna edit in Excel. So now I’ve opened an Excel and I’m watching it. So when I saved it, I just need to handle it in the callback and you can see here, that’s when I showed that dialog. Close this a bit here. That’s when I showed the dialog and then if the input was the S, I could read that CSV file back in and reapply the record changes or whatever it might be, but I figured you get the point. We don’t need to go through that. So that’s a more real world example that ties everything together and not in these little separate steps, but a continuous user flow. So I hope that sort of establishes the kinds of things you could do with this. Let’s just do a quick overview and then I see there’s some questions coming in already and we’ll try to finish on time. So again, what’s new in this release is that we’ve added support to work with a local file system and we did some IO examples for reading files, writing files, deleting files, looking at what’s inside directories, getting information about files like their size when they were last modified, et cetera. We showed how to work with the temp file. So if you want to write stuff that gets cleaned up automatically by the operating system, you can. We also showed how you can monitor files or directories for changes and then respond to what might happen in there. And then finally, we saw how you can run system commands, which really could be anything. But in this case, we were opening files with programs to try to connect it with everything. So that’s all been added since the last quarter release. Some other things we did, well, first before that, I wanted to pause and in case you are already a Servoy user and you’re feeling a bit confused about the ng desktop file plugin because there is already something called plugins.file, the regular file plugin that’s been in Servoy since the beginning, what do you do? Well, it’s quite simple. The regular file plugin works as it always has. In web clients, like the ng client, it runs server side. And so if it’s still really useful, people use it all the time to write files and read files and do everything they want on the machine where the application server is running. So there’s a million use cases for this, but suppose that you periodically scan a directory and there’s where imports come in and you read those and do bulk imports back into your database or something and do that on a schedule. You would use the file plugin for that and we’re on a completely server side. So that works the same as always. Also that file plugin works on the local machine for our classic desktop client, the real native client, or what we call smart client. So that works the same as it always has on the smart client as well. So for those of you that are used to the file plugin, nothing has changed, this is just added because HTML5 applications don’t by default have direct connection to the desktop and to the local file system. So the ng desktop project gives them that access and bridges that to the desktop so that all runs client side. So just to clarify that, I did see some confusion on this in the past. Deploy ng desktop, I didn’t do the demo, let me jump into that, it’s just take me a second. Bring up the IDE. So suppose we build our application and now we want to distribute a binary, we’re able to easily test it and debug it just the same in server-wide developer in the IDE, but suppose that we wanted to deploy this now. What you do is you do right-click it and you go down to export solution. And now you’ll see a new option called ng desktop export. You can also do the generic Eclipse export and then under server-wide, you will see ng desktop file. You’ll get by default the application URL will point to a local host where you’re running server-wide developer that makes sense because you can quickly test your binary. And then you pick your platform, Windows Mac and Linux, we support all three, but it will generate a different binary depending on which you choose. It’s not a cross-platform binary, obviously anymore. And then you choose where to save it. Now one thing I want to point out is that all you’re really exporting here is a kind of container because remember your application is still a web application. It still runs on a web server. It’s still updated when you make updates to it and deploy your application in the cloud. So what we’re creating here is the kind of binary that points the ng desktop client that points it to the right application URL. I’m gonna skip clicking finisher because well it takes about a minute or 30 seconds to generate the export and go into that directory, not the temp directory, the other one, this one. Where we had the ng desktop export. So what you’ll get is a directory like this and an executable. I’m gonna close this one because it’s running developer, it will conflict with it. And I’ll double click ng desktop exe here. Oh, this is demo.storeway.com. I was playing with it and I did another one. So let’s go ahead and go through the example. I will click export solution and g desktop export. I’m doing the local host one for Windows and I click finish. What I was doing there, well, this exports is I was gonna show how you can also just pick any URL because what you’re exporting right now doesn’t have anything to do with the active solution. It’s just saying I wanna point to this URL, I want this OS architecture and that’s it. Pretty cool and should we maybe do one or two questions? Well, this is running. Oh, wow. Sure. A lot of questions. There’s a lot of questions. Wow. Okay, let’s do our questions. All right, the first one, I actually this is more a comment from NF. I guess you put this in as a test to see people are paying attention. And what says is it ng desktop or desktop? Oh, misspelled the, I’ve been doing that all day. I’ve been misspelling desktop with a KS. So very good observation from when I woke up early. Not honestly. Good news with the plugin. I was checking your code. The plugin is named correctly. Kim says does ng desktop file utils interface with other devices such as USB ports, cameras, et cetera. So the, the utils is just for executing system commands, which can be used to build on to make more complex scenarios. So it’s not anything there by default. It’s going to work with your camera, for example. Although we on a, I guess you mean a webcam. We have a project for webcam. We also have a project for, for phone cameras. But, but for example, scanner, it’s not going to know about that by default. It’s more of a foundation that we can build upon. So we are looking into things like integrating with scanners in the next version. But at some point, it becomes very specific to what you’re doing. And that’s why it’s good that this is an open source project because we can, we can build upon it pretty easily in those that are wanting to can also build upon it. So we’re excited to hear about some of the things that we’re doing. We’re excited to hear about what use cases you have and what you need to do with native desktop applications. Cool. Yeah. So the short answer is yes, you can. If you know the path to whatever you want to integrate with and executable, and then you can do it. However, we are looking at more default integrations as well. Question from Paul. Does the NG desktop plugin have the capability to monitor a directory? Yes. So in the example, I was monitoring a specific file, but you can attach that to a directory. And as I said before, you can, you will get notifications when a file is added or removed to that directory. Oh, it’s pretty cool. You’ve known that. Thus the right file automatically create files that are part of the file name if they don’t already exist. There’s a question from Richard. Yes. Yeah. So in that example, actually, the first time I ran this, I just put in the path name and it wrote the intermediate directory to get to the file. So the, the intermediate directory NG desktop examples didn’t exist and it was written when I wrote the full path name. I’m going to, I’m going to abandon the, the export example. It basically just runs the same solution. It just, I don’t have to launch it from Servoy developer. I don’t know why I think it’s running longer because of the go to meeting, but last time it took about 30 seconds to finish. What I wanted to say about the deployment part though is that. Just keep in mind that it’s still a cloud application. You don’t have to redistribute that binary, re export that binary every time you make a change to your application. Your application is still like a SaaS app where when you make a change, it’s deployed to everyone automatically keeps up to date because that’s really just a container that points to. To your application. So only when the architecture changes like, you know, a new plugin was added to work with your scanner or something like that. Do you need to then redistribute the binary? Cool. Question from Steve when opening a file and application on the client, how do we know if the client is macOS or Windows? How do we know if the client is macOS or Windows? I don’t know. I think there is still a method for that in the ng client where you can get the OS architecture because it is in fact in the user agent string. So it’s not really specific to the ng desktop in this case. You can know that about the client session. So just like you would annul days get the get the operating system is the way to do. Yeah, and I think we have a method for that in the sfy utils project. So scope.sfy utils. And then you can get the you can get the OS name from there. Sure, somebody’s going to test it for us and post it on the forum in 10 minutes. Question from Abel. There’s a lot of questions by the way, so I’ve never seen so many questions. I can run around to that question from Abel. Since 0.201906, Servoy, I guess it’s slightly unrelated, is not installed using easy pack jar file for Linux, but it’s just a tar folder to be uncompressed. I downloaded that file version, but I didn’t get the usual easy pack, easy pack jar file. I think that is I think that is correct. That is a tar file. There’s some technical reason for that, which I saw it in the forum. John has a question of their limitations on which programs can open files. Does it work with any operating system? It works with Windows, Mac and Linux. And you are limited by what system commands you can already run. So in Windows, for example, if I can run a bad file, then the commands I can call on the bad file, I could call from that, that, that, you tilt plug in. Yeah, I would say the limitation is you need to know the path. And there are some shortcuts you can use on Mac and now you can use the command open, which will try to find the helper file. So you need to know a little bit about the operating system that your customer is using, because, sir, if it does not really know, if an executable exists, I mean, you could try to, with the util, try to figure out if that file is there. That’s about it. Question from Paul, is there a command line exporter for NG desktop? A command line exporter. No, there’s not a command line. And you mean to automate the NG desktop binary. No, this time there’s not. You have to export it manually from the IDE. But keep in mind that you only have to export when the architecture changes. So it’s not a very frequent that you need to make those updates, not like when you update your application. All right. Question from Rafi and Richard, when will printers be supported? We’ve had a lot of feedback about printers. It’s we’re looking into it. It’s just that in many cases, like we can show the printer select dialog, but if you want to just have it unattended to go to a printer, we really need to know specifically which printer and there’s a lot of sort of, you know, custom specific stuff to do that. It’s not a generic protocol, we just say send to printer xyz. So we are looking into that. You can send us your specific use cases with what you want to do. If it’s just a print dialog, that’s something that we’re looking into. We think that we can have that fairly soon. Where you say I want to print something. And then you show the printer. But there’s also the question of what are you printing? Are you printing a PDF or do you have some print job that is coming from some other system? So we need more information from you about your use cases. So we’re actually asking you to post on the forum or to contact me or Yawn directly or post through support.sirway.com. All right. Send us feedback. The question from Navide, desktop client is an excellent addition to zero-point clients. Thank you. I need to ask one, can we run two screens from a single solution and two can we run two separate screens from different solutions to the same server? Question one is no. And question two is yes. So we’ve been asked a few times. It’s now that we have a native window. Can we do like multi native window application? So each window is its own client session in this case because it is a web application. So if you open another window, it will be another client session. However, we already have customers that are able to have two in the browser case to browser tabs open. That are communicating via the broadcaster plugin which we introduced last year. So now it’s easier to have one client session talk to another one and you can set up how that works. So it’s conceivable that you can open up another window and then you can if you need to communicate between the two windows for some reason, you can do that. But it wouldn’t be window to window would be through the server. So yeah, it’s good to keep in mind that each window is its own client server side. So you can run multiple but communicate through the server. Marco has two questions. If I have to deploy NG desktop in an on premise installation, how can I change the server URL? Do you have to right now make different binaries for each branch each on premise installation? Because you have to change that URL to the app server. One binary put a deployment. Yeah. Okay. If you don’t like it. Do we could externalize that and have it in some config file where you can change it afterwards. But right. So this is time to come to Siroy World guys and corner Shana say we really need this tomorrow. Then there’s a question from Chai Tanya. I’m not sure if I entirely understand it. But let’s try how hard is it to check if a database backup file gets modified or not using watch file? I don’t know quite how to answer that. But I can imagine that if you’re monitoring a database backup file would be server side and you’d probably use the file watcher plug in which is part of the file plug and stuff from ages ago. So we already support that server side client side. Yeah, you can monitor directory or a file. So. Yeah, you have to know more about it. You can you can monitor any files so that can also be a database backup whether it is server or client side. Yeah. Another question from Marco is electron uses no JS RPM repository. Is it possible to use this live reason any desktop? Is it possible to use RPM library? Yeah, I talked to me at Siroy World. I don’t want to get into no JS and electron in this in this meeting. It’s this is high level what what the project can do. Okay, that’s it’s a good another good suggestion to come to server world. Um. Question from Juan Antonio. I got a little bit late for this webinar. Juan Juan Juan you need to learn when you come to the webinar. Maybe you said already, but does the client need Java installed? No way. No Java required the binary will be will be stand along. Yeah. And Juan, one of the key reasons we made this client is because Java on the desktop is is probably going away in the future. It’s already getting harder. So one of the points of anti desktop is to not have a dependency on on Java. So it’s a native executable for Windows Linux and Mac. No Java requirements. Um. Steve says we need to know in order to find the correct executable to launch Excel for instance. And I think that we sort of discussed that yes, you need to know where that is. Um, maybe there are operating system utils to figure out where executables are. On Mac and I can use the open command is there something similar on Windows shell that you know. I think so. I was looking for it, but I put this together fairly quickly. So I just found the exe to make sure it would work. Um, there there’s the the. The one that runs server side of the execute program also has the open. So there’s some examples of that in our documentation about the the the right open command. So I think I think it’s clear to me. We probably need to have a few more examples of execute program. Um, to show the different things you can do with it because I know some of our guys are doing some really neat stuff like running visual basic scripts and calm and things like that. So you can get deep into. You can get deep into the desktop and what you need to do there. It’s possible. But you need to know what you’re what you’re trying to call. So I think we’ll have a few more examples. We have actually a whole session on hybrid applications at sort of a world where we’re going to go. We’re going to go deep for the NIST as well. Cool. Um, and there’s a question from Paul. But and then we’ll take the other answer to the forum because it’s just keep coming up. So really surprised about how many people asking questions today. A question right by Paul for the generated binaries are the executable signed or do we need to sign them ourselves. Uh, yeah, good question. I think they’re unsigned. Um, right now. Um, yeah, I forget. We talked about this, but now I forget. So what to take that offline. Okay. All right. Always with the hard question. We will, uh, this one suggestion from Juan Carlos, which is a good one to post all the questions in the webinar recording. Sometimes we don’t do that if they’re, they’re very specific. But in this case, they are all very useful. So we will post the whole questions section as well to, uh, to the recorded webinar. Although we, of course, typically like you guys to come to the live sessions for the top, not additional version. Um, okay, guys, we will see you all on Friday. And when we’re going to talk about the part three and is it secret? About three, Sean, or can you give us a hint on what you’re going to show? No, it’s not secret. We announced it already through social media and the push notification of the IDE. It will be about a web services. So we’ve made some enhancements to publishing web services and document web services. So there’s quite some stuff to go over in that. Uh, yeah, on real quick, I also want to point out the, the home page for these two projects and she desktop file and then she desktop utils here are the links. We have sort of beta releases there. Now we’re going to be putting those live on the web package manager. Uh, we’re doing that sometime today and we will consider that a beta release because there are already there are still some cases on the file plug and for example that are working their way to being resolved, but we think it’s good enough to release for people to test with. There’s already customers that are, are using this in production. In fact, so, um, so I just want to point that out that it won’t be on the web package manager till later today, but you can go to the GitHub project site if you want it right away. Cool. All right, guys, thanks all for attending. Um, we’re always pleasantly surprised if you show up with large numbers, which you’re all doing this this week and asking a lot of questions that really makes it more interactive for everybody and of interest. And of course, Sean, thanks for all the hard work in setting this up and making the examples and presenting so thoroughly. Thanks and we will see you all on Friday.