How to Set up Visual Studio for Local Development
In this webinar, Lars Sørensen, Solution Architect from Dynamicweb Partner Enablement, shows you how to set up a local Dynamicweb development environment and shares some tricks to debug your solution.
Lars demonstrates one approach for setting up a local Dynamicweb development environment and discusses the pros and cons of alternative approaches. The session will cover setup for both C# and Razor/template development.
The environment setup covers setup in:
- Visual Studio
- SQL Server Management Studio
- Internet Information Services
Speaker 1: Greetings, everyone. It's now one o'clock in Central Europe, and I'd like to invite you to this webinar where I'm going to show you how I set up a local development environment. My name is Lars Sørensen. I have been working with Dynamicweb on and off for many, many years. Currently, I'm in partner Enablement and consultancy team. And the purpose of this team is basically to make life easier for you, our partners. And we offer a range of services to assist you in terms of selling, analyzing, scoping, training, implementing, performance testing, performance optimization, debugging, and yeah, you name it. We have a lot of services that we can offer you in order to make our life easier, and your life easier, of course. One of the initiatives that we also want to launch in this team is we'd like to host a monthly webinar about technical matters. And this is the first one, we launched it today. Also, just last week, we launched the blog on our documentation portion. And every now and then, we put a new blog entry on some topic, technical related, for you on the blog. And as for today, I am afraid we will be a little over time compared to what we've planned. So I made a blog post for you to post your questions and so on. So if you go to the documentation website, switch over to community, here you go... community and go to the web blog over here. And we have a blog for listing questions and comments and so on. I'll upload the video once it is processed also, so you can watch it offline also and we can have a further discussion on the topic in the future also. Also, after this webinar, if you want to share the details, tips and tricks of your own setup, feel free to do so. It'll be nice to see what other people are doing also. Right. The background for this webinar, in my work, I meet up with a lot of developers and I see many different ways of setting up your developing environment. And some use a local development environment. Others just use the local Visual Studio and then commit to a shared development environment. All of this might have a local solution, but they share the database and there might be other variations still. And whenever I show the way that I set up my local development environment, I have many people says, "It's actually quite easy." And some even say you should make a webinar on this. And that's why we're here today, to do that. And it's actually not a new thing the way that I'm doing my setup. I've been sticking with more or less the same way since the, back in the ____ [inaudible 00:03:32-inaudible 00:03:32], because you can see the details on it, but it allows me to separate the standard and custom files and so on into some separate locations. And it prevents me from mixing up things, so I can easily see what's standard and what's custom. And that's what I like just to demonstrate to you today.
Speaker 1: First of all, let's just have a look at the basic architecture of DynamicWeb, because DynamicWeb consists of basically three things. We have an application up here, like this. This is the core application that runs everything that goes on, both in the front end and in the back end on the logic, and so on. And we have our solution. Specific folders down here. We have the files, for example, the setup looks a bit like we're setting up in our cloud environment. So if you crank open one of our cloud services, it would look a bit like this, with all the applications up here, and the solutions down here. But in the solution folders, we have the files directory, at least. We may have other directories also. But this is the one that points to the last update, and the last update is the database. So basically we have applications. We have a file folder with a solution specific design templates, download files, system settings, item types and what have you. And then we have the database that contains all the data.
Speaker 1: In this demonstration, I'll start by setting up a standard DynamicWeb solution. Then I will convert that into a custom solution, and then demonstrate how I do debugging and development using this setup. Let me just start by saying I'm mainly a back end developer. I can read, I can write, [inaudible 00:05:38-00:05:38] code also, but I really can't make it look pretty. So that's the perspective you have to see this setup for. It might be adaptable to your situation if you are doing front end exclusively, but you'll have to be the judge of that yourself. And of course, I'd be happy to discuss it on the blog. If you happen to be commenting on something like this. Great. Let's get on with it.
Speaker 1: And I'll start by installing a standard DynamicWeb. And like I just mentioned, this was basically the same way I've been doing it for almost 20 years since we left the [accessible 00:06:16-00:06:16] platform. That's not quite true, because when I did the preparation of this webinar, I noticed that we couldn't actually do it in the same way anymore. So I had to do it a bit differently. Usually I would start by setting up a website in MIS. Then I would map this website inside Visual Studio as an ASP.Net website. But that's not an option any more, because if I do that, it will just map it as a classic .net and not as .net or the standard thing, which is what will be needing when moving forward towards [inaudible 00:07:03-00:07:06]. Yes, I did. I always set up on IIS Express rather than using in Visual Studio. And we'll get into more detail about why that is. But let's just get started.
Speaker 1: In here, we have Visual Studio. I start by setting up a new project. Yeah [pause]. And I want this to be an [inaudible 00:07:35-00:07:35]core web application. Over here, I want this to be in [inaudible 00:07:41-00:07:41]. [pause] And I've already made a folder for the webinar. Yes, so let's put it into this one. And on this one, when working up [pause]. This one. Choose, Yes. [pause] So I have a solution for you here, right now. The next thing I'll do... this is where I'll put my my templates and files and all that stuff. But for now, we won't run anything from this folder because our templates won't compile. We don't need to run anything for this, but we just need somewhere to host it in Visual Studio. So we can do our development and our debugging also.
Speaker 1: So now I'll switch over to the IIS. Here, I create a new website. So [inaudible 00:08:57-00:09:04]. Copy this one down to the host. Name down here. And we have a setting in [Algenis 00:09:12] that anything that ends with [inaudible 00:09:14-00:09:15], that would just point to 127.001 IP 157.000 run, which will run on your local host. So that's a nice little trick. You don't have to set up ports or do anything in terms of your [inaudible 00:09:28-00:09:28] changes or set up the host files or anything for this to work. It's just works. Right. I'll point out the solution folder on... I'll try again. The solution webinar, and this was the file as I told you I just created before in Visual Studio. So I point this one out. I'm sorry, that's not right. I want to point out the DynamicWeb application folder. This is the [inaudible 00:09:57-00:09:57] application. This is the one we want for our root directory of the website. Then, I'll create a virtual directory instead that points to the files. This one is files. And this one would point to solution webinar and this one. I said files, but this is webinar, but right now we don't have any files, so we'll just have DynamicWeb create one for us. So it's Okay. Yeah. And now we have something that looks a bit like the basic structure of a DynamicWeb. It has an admin folder, a bin directory and it always also has our files. The files here contain whatever we had inside our Visual Studio. Right. But we're not able to run anything yet. But we will be in a little while to go and I'm still working [inaudible 00:10:55-00:10:55]. I'll need a bit of time to suggest find itself the first time, so, if you're watching the rerun of this, you could easily just fast-forward 20 seconds or so and [pause]. I assume you see that DynamicWeb, because that's the next level you're going through here. Right! This is to install that offers to install our files directory and the database also for us. So I'll just click start, create new files folder: Yes, that's good. [pause] It's just a moment to see what happened there, just if I refresh my files over here. Now, you see I have the system and template folders and also along with... if I go up here, I also have global settings, for example, where you have [inaudible 00:12:06-00:12:09] the settings for it. Right.
Speaker 1: And next, we'll set up the database on my local [inaudible 00:12:20-00:12:20] server. [pause] Okay, and let's just switch over to the [inaudible 00:12:35-00:12:36] studio. Now, I'll finish this one over here. I also have a webinar database. So let's continue... as administrator. [pause] And not until this thing. The thing is that we don't have a license on this one, but let's just set one up and then, for this demonstration, i'll just apply for a free trial. In real life scenario, you'll log on to the license management system. [inaudible 00:13:28-00:13:27], that you're currently working for, and then choose a development license for this one. But I'll just get a retrial. [pause] Okay. Right. So now we have a running DynamicWeb, at least we can access the back end. Let's see if we can make something at the front end also. [inaudible 00:13:55-00:14:27]. Okay, so we have the website with one page that we can show in the front end. Okay, great.
Speaker 1: The next thing I'll do now, let's just have a look at what happened inside Visual Studio, once we do this. Now, we also have our system templates folder in here, and we have our global settings and what else will we get from from DynamicWeb when you look into this file directory. Right. And in order to do some development of this one, I will... we could actually do that now because we have something that we can start working our templates on. And actually, let's just have a look at what we did here. Because this could serve as our templates project. Inour organizations, we have different kinds of developers. We have developers, like myself, who is exclusively back end developers, can do a little bit of other thing. Then we have developers who are exclusively front end developers. And then again, we have some who are full stack.
Speaker 1: Now, the reason why, what I've set up here is the kind of, you can call this files or templates project, because then I can keep the templates development going on in one project. And what we'll do next, we will set up a custom [inaudible 00:15:52-00:15:54] classes and so on, because then we can keep the class library development and so on over there instead. So we don't mix things up. But let's just add some [inaudible 00:16:07-00:16:07] to this one, so that we can... actually let's not, let's just try and see what we have right now. [pause] That's the sign for this template set. If we switch to paragraph down here and go to the default. That is, in fact, the template that we see on the paragraph right here. We see here that we've some red underlines under the expressions that we have in this one, so let's just deal with that. If we add [inaudible 00:16:52-00:16:52] manager here. And we'll add a reference to... [pause] [inaudible 00:17:16-00:17:22]. Yes. [pause] From now on, the red underlines are going over here.
Speaker 1: And we can use the methods that we've used to interact with our template and yes, we can use [inaudible 00:17:51-00:17:54]. Or we can use integers, we can get this and get that and have our... and yeah, basically to merge the data from the system into our template. We can also use the template text. Excel. If we update from here, we get a list of all the templates that are available inside the paragraph context. Right. This was how we've usually used to do it. Now there's a bit more modern way to do this, so we can have actually, we call it intelligence inside the templates over here. So if we add this one instead. [pause] Like this... [inaudible 00:18:58-00:19:02]. Right. And you like so much that. And we have something different... [pause] And then we have all the properties that are available on the paragraph we've modeled over here. Right. Let's just try to do something with it, see if we can make something different, looking different. So. If you just add a couple of paragraphs over here [pause]. [inaudible 00:19:46-00:19:54] [pause]. Sorry [pause]. Let's replaced this here. And you... [inaudible 00:20:15-00:20:19] output. So great. The template text won't work in this context. So let's just get rid of that and see this one. And try to [inaudible 00:35-00:20:36]. Yeah. Great. We still have to continue here, but it's much more convenient to work with the intellisense option rather than the template text, there is text in the template text.
Speaker 1: And one other thing... Because we're not running this from inside Visual Studio. So if you want to do any debugging, debugging in the end, the template here, we have to switch to the attached processor, which attaches to the processor. Now, you need to have Visual Studio opened as an administrator to do this. I've just made the setting in mine, so it does that all the time. Then we need to figure out or find a way down to the application tool, the user that's running on [inaudible 00:21:26-00:21:26]. [inaudible 00:21:30-00:21:33] so I'll attach to this one [pause]. And see, it still runs. Over here, we can add the break point and we've reached the break point over here also. So we can see what's in the text, for example, we can find, make some changes to it and just continue. And it works the same way as it would if you're running the debugger from Visual Studio. Right.
Speaker 1: Now, let's try and convert this thing into a custom solution. So what is really necessary in order to run the DynamicWeb as a custom solution in the front end is - let's switch over here to the application folder. This one takes care of everything in the admin, but we need a bin directory. We also need a global ASCII and we need a web config. So what I'll do, I'll just copy these three... And so... Yeah, move this into here, to make a new folder called [inaudible 00:22:50-00:22:59]. Since you're here. Now, I need to do a bit of remodeling of my website here in IIS, because now I have the necessary files to run the front end in my isolated environment over here. So I like to remap my root territory of my website to this folder instead. So I open the basic settings over here. Currently this is mapped to my standard [inaudible 00:23:36-00:23:36]. I'll expand the solutions webinar and I have the application here. You see this continues to bin folder. So I'll point this one out and click 'Okay.' And let's see what happens. [pause] And this will be recycled. I also just have to wait a little while to load the configuration. [pause]
Speaker 1: So now we have front end running on the custom application. Now, the admin, we can move the mapping of the map of the admin, so this one can be found right now. So we'll just have to do the same that we did with the file, search it down here. We've just created a virtual directory for the admin folder. [pause] I have one out here, admin. Okay. And yeah, it stretches the admin. [pause] So now you can access the admin folder. Perfect. Now, the setup we've made now, completely separates our custom application from the standard application. The only trace we have of the standard application is, in fact, inside the global ASCII. Let's just have a look at that one. This one is mapped to the DynamicWeb Admin Global. So it would be the DynamicWeb processing [inaudible 00:26:39-00:26:40] add all requests that are coming in. And obviously also our files. So that's where we started because that's our basic customizations that goes on inside files.
Speaker 1: Now let's try and set up a project for doing our customizations also. And what I'll do now is I'll create a new project for this one. This could just be a class library... like this one. Because the majority of what we do when we are doing extensions in DynamicWeb is basically class libraries that either provide us or subscribe us or extend us, or what have you. So that's a... It's a great one, and yes, we're still in the webinar folder. [pause] And... It'll create a new class for us. We don't want this one. We do, however, want a reference to this one, or in this one, or [inaudible 00:27:52-00:27:53] it is called now. So we'll go to click it, and then we'll add DynamicWeb. [pause] Here we go. So we just add the latest version here. [pause]
Speaker 1: With this product template, let's just try and build this thing, see what we get. Right now, we're building into the application directory in one of the folder that we've just added. So, I always wanted to build into the bin directory of my development solution. So let's just do some modification over here. This one, and choose that as output path into, not this one, into the application directory. Great. But I would also add post build [inaudible 00:29:25-00:29-26], but I find this even easier. So, let's just try one more time to build it and let's just see what we get, because this is the path that is being built into. But even though I pointed out the bin directory down here, it adds a new subfolder to this one, [inaudible 00:29:47-00:29:50] 2.0, and then it adds the [inaudible 00:29:52-00:29:52]. I don't want that because then I have to copy it around. And I don't know if it's a bug in the framework or what have you, but it's definitely something that has been bugging me. And so what I'll do, there is a way to fix this. Sorry, not like this. Let me go to file explorer over here. And Notepad. And then there's a small chunk of [inaudible 00:30:19-00:30:19] just add to it over here, which I don't remember by heart, so I'll just copy it. [pause] So I enter the property group [inaudible 00:30:41-00:30:41] a node called [inaudible 00:30:42-00:30:42] target framework to output path equals force. So it does what it says, it doesn't append the framework to the output path.
Speaker 1: So, let's try and build it one more time. [pause] [inaudible 00:31:00-00:31:05] clause, just the... [pause] So now it builds into the bin directory of my application directory, this is exactly what we want. Okay, and see if we got this one here. Now we have a webinar application DLL in the bin directory. Great. Now let's do some developments on this one before we load it, because we just have to wait for it to load. So let's create a new class on this one. And when you're working with, making extensive to DynamicWeb, a lot of what you're doing is creating notifications of subscribers. So I thought we'd just do one here and... It tunes our page title observer, which I think is actually one of the first notification subscribers that were ever introduced in DynamicWeb. I'm not going to get into details what a notification of subscriber is, we just ask and code and see if we [inaudible 00:32:19-00:32:19] get some information from the page title like up here.
Speaker 1: the Let's see if we can do some modification to the page title using our [inaudible 00:32:33-00:32:33] library. Yeah, so [pause] Let's build this one and see what happens. [pause] [inaudible 00:33:34-00:33:36]. And watch what goes on up here. Now, its says Welcome, which was the title of that when I created the page in the back end. [pause] Okay, so now we see, it changed to page number one up here. In terms of debugging, we can do exactly the same that we did with the templates just before, attach it to the same process. In fact, when we've already set it up, we can reattach it to the process, so we don't have to choose which process we want to work with and we can do our debugging, sort of breakpoint right here. Let's go on. Now we hit the break point also like we did before. I can't do that here. But we could go in and change the output of the variable if we wanted to. [pause] I set this project up just using the download files from our documentation portal, because I think I find it much more easy and definitely faster to set it up like that. I can also set it up using Visual Studio, but it just takes a lot of time for everything to download and setup in Visual Studio and even then. Yeah, I've tried a couple of times. I still have to do some modifications to the setup. And one of the reasons why I like this way, basically, I like working with... what you say. I like the fact that we have something that is separate because up here, we have the the files solution up here. We don't need to do any, what we call it... we don't need to run this or we don't need to build this or anything. In fact, we can just remove these two things. The only thing we need this project for is to do modifications to our templates. We can also do modifications to our item types if we want to, and interact with our source code repository. But basically why it's set up like this, like a project. is so we can have Intellisense and work with that inside Visual Studio. The only thing that we will deploy from this is templates and perhaps some configuration files and so on. But nothing that needs to be compiled, at least not by Visual Studio. And then, of course, I can have all my [inaudible 00:37:03-00:37:03] classes in this directory down here and keep that separate both from the files up here and also from the standard setup in DynamicWeb. This actually makes it very easy for me to check if I have a bug, if it's caused by DynamicWeb or if it's caused by my customizations, because it can simply map this one, then root the directory back to a standard [inaudible 009:37:30-00:37:30]. I still have the exception here. If yes, Okay, something's going on inside DynamicWeb, the standard application that we need to deal with. If not, okay, it must be my customizations that are causing these issues. And this is, in many cases, very helpful to decide how to approach fixing or tracking the bug consistently.
Speaker 1: In terms of debugging, there are a few other tricks that I'm also using. I'm sure you know, at least some of them, if we start with the debug. If it's true, [pause] will give us a table containing everything that's been going on during the processing of the web page, perhaps not everything, but at least everything where a developer has thought that it would be interesting for us to get some metrics about what's going on. You can see for each of the processes, this is the check mark that's added. You can see how long did it take, or at least how long did it take since the last check mark, and how long has it taken to process the page up until here or in total while processing this page. This is not something exclusive. So you can actually, if you... that's the right one, you can actually populate or add to this table. So we could add in a DynamicWeb front end page view, current, execution and [inaudible 00:39:20-00:39:20]. And just typing a message here. And then this will give you an entry in the table here. So for example, if you have a method that's doing some heavy processing, add one at the beginning, add one to the end, and then you'll have an indication of how long it takes to do this processing and see whether it's something that kills your performance.
Speaker 1: Let's say there's an equivalent one for the database statistics. This one is called [inaudible 00:39:51-00:39:53]. Right now, there's nothing in here because this page is already loaded into the cache. I think actually if we just do like this, open incognito and then at least we should get some information about. Yeah. Now it starts adding some system statistics, and I'm able to see on the secret statements that have been thrown against the database during the processing of this page. This is very convenient for the front end, but not sufficient for the back end because what goes on the back end, you really don't have any clue about, or you might have some clue about it. But sometimes you're just wondering what on earth is DynamicWeb is doing or you might have to initiate some information in terms of integration. You want to see what's actually being added to the database when you click this button. So, one of my favorite parts is to load, and you probably tell that I threw one hell of a party, but I load the secret profile and... Right now, I don't really have much more running on my computer, but if I click this one and do click on the colour, you'll see that I can find out which database I'd like to monitor. Now, I'm at the webinar, you see, this is life. So if we have multiple databases that we would like to monitor, we just do like this and click Okay and pick one. And this will just trace every statement that is thrown against the database. So let's try and move one to the end. Yeah, you see, I click, it's already starts populating the table over here with a lot of queries thrown at the database. And this is everything that will... [pause] take all the queries, not only queries, but also inserts and updates and what have you. So it's a good and it's a very handy tool to get more acquainted to what goes on in the database. And there's also an option for this if you're running a [inaudible 00:32:39-00:32:39] database. But, yeah, I'm running a local database. If you're using this [inaudible 00:42:45-00:42:45] server express, you don't have access to this one, I believe. But the developer version will have access to this one.
Speaker 1: One final thing I'd like to show you, because, I mentioned that we could also install DynamicWeb through [inaudible 00:43:11-00:43:11]. I did that. So let's go here to DynamicWeb folder and see what we can do here, because here, I had a DynamicWeb application installed [inaudible 00:43:36-00:43:38]. But what you see here, this one installs everything. So this one, it contains also the acronyms. Is that the right one? [pause] But this one can change everything, the admin and everything. So. And this one, we can do our debugging using the Visual Studio and IIS Express. And let's just try and load this one. [pause] And while it is loading, I've seen many scenarios where DynamicWeb application is actually hosted like this, so you have everything in one folder, you have the standard application, you have files directory, you may even have custom modules or the kinds of customizations in the same folder. And well, it's very convenient because when you're doing development, because it's kind of like the way you're used to working, you can just load everything into Visual Studio and you can do your debugging from within Visual Studio.
Speaker 1: The pain usually comes when you need to upgrade the solution, because when that happens, you actually need to upgrade files that are already in production. So you might have to overwrite these files, for example, going from 9.10.0 to 9.10.1. You have to overwrite all the files of the entire solution. And doing that on something that is already used by another process can give you some errors. So you might have to take the website out of service while you're doing the update. And even then, you are stuck to overriding different files on the server, which, a lot of stuff can happen, a lot of bad stuff can happen, if they can get permission, they can be occupied or what have you. But now I am actually ready to run this thing from Visual Studio. And it's just trying to do some visual comparison to what we've got, to one that's running IIS because basically it's the same functionality being carried out. So I look at this one over here. Just to move this one. But something interesting and something that at least for me, it's also a trial for using the IIS approach to load the... Yes, we can inspect the toolbar down here. Have the button switched on. If I load this page, you'll see this one loaded in 140 milliseconds. I'll do the same over here. It loads in four point thirty two, four point thirty three in this scenario. Of course, this metric, they change and I may just have to [inaudible 00:47:12-00:47:12] warm this one up a bit, but I'll never get close to the same metrics that we have while running on the IIS. Let's clear this one. So we just do like this. Otherwise it wouldn't be fair. And this is for a very simple page. This one contains basically my title up here with the customization and some text. It is very rare that are dealing with that simple content set up in DynamicWeb. And also, if we are going to have a content that is deep in the structure that we need to load the website from, Visual Studio, navigate down deep in the structure and perhaps going to a check outflow or what have you in order to do our development and perhaps to do our debugging. It just takes a long time to do this with the IIS Express. You can set the project up to run a specific page when you start the debugger or even to add some [inaudible 00:48:24-00:38:25] to the parameters, to the address, to pretend to do an automated log on, to automatic add to basket or something like that. But it just takes a lot of time. I'm not very patient. And that's one of the reasons why I also prefer the IIS approach over here. But I see. Just the thing that I can have the things separate, that I don't need to mix it up, and I don't need any risks in terms of when I do the update. In fact, let's have a look at what we can do in terms of the update. With this more lightweight approach, if you go to dot DynamicWeb, you go to the downloads and then just get the latest [inaudible 00:49:10-00:49:14]. And this one into... here we go. So our DynamicWeb directory. [pause] Yeah. This one. And let's exit. We have an upgrade to the DynamicWeb application. Actually all I need to do in terms of updating IIS and that comes with a bit of preparation. So what I'll do up here, I have the admin of my standard application up here. I'll just point out the admin of my update application here. Like this one. What happens now if I switch this one, switch over to the admin here. [pause]
Speaker 1: And I mentioned when updating using the full application and files in one directory taken out of service - of course, it will always be taken out of service when you start messing with the DLLs, but there are two, one is doing it when you're cutting files and so on, you have to take it out for a short period of time until everything is done. Here we are mainly doing a recycle. But you see what happens up here? [Inaudible 00:51:09-00:R51:10], that we have a version conflict that it wants to deal with. So let's just... Seems like logging to the Admin. [pause]
Speaker 1: And you can see working with this, just take some time, so whatever you can do to it to reduce the time spent. I'm totally fine with that. Great. What you have here is just a large list of all the [inaudible] that have been updated during the process. Let it just finish. And one has to live with that. What it did was it detected that we had a version conflict, so it copied actually. We go here. It did make a copy of the assemblies we have in this directory belonging to the application where we have the Admin and then copied those into the bin directory. One thing that sometimes causes a problem is the web config and let's see if that's the situation here also. [pause] It looks like so. So what we do about this is - you switch, update it from here. So I select this one, so, and into our solution directory here. This one. Let me do a system update. There are application specific settings inside the web configs. So I never use the web config in the customizations. If I need something as a setting, I make either a global setting. That's an API for reading and writing back to that file. Whenever I do that, I quickly regret that I did something that was global instead of something that was isolated to a website, for example. So in these modern times, we use website settings from the [inaudible 00:54:17-00:54:18] and just add the settings to that. It could also be a web service that we want to access. But in admin, we do the implementation of something like this, so that it's not dependent on something inside the web config, but some information that we can maintain elsewhere. So now we've actually done with the upgrade, now we are running 9.10.1. And besides just copying the web config, DynamicWeb has done all the hard work for us.
Speaker 1: Great. Okay, sorry, we are ten minutes over time, so sorry for taking so much of your time. As soon as the recording of this session is ready, I'll upload it to the [inaudible] that I showed before. Go to the [inaudible 00:55:13-00:55:15] website, community and to the [inaudible 00:55:14-00:54:14] and then you'll find the post on the top for this setting. So please share your thoughts about this. I'd also be happy - and I'm sure other people also would be happy - to have some insight in how you set up your development or what tools or tricks and so on that you're using.
Speaker 1: We have a few other webinars coming up: the ones that we have planned so far is for the 16th of April, same time, at one o'clock. I'll later be working, building a custom app for DynamicWeb, a few more templates. Then we have another one coming up on the 7th of May, also at one o'clock, about exchanging custom data between DynamicWeb and business central. So those are the two ones we have planned so far. If you have any topics that you'd like us to cover, either in a blog post or in the webinar, let's hear from you: just reach out and see what we can do. But then for now, I just thank you very much for joining in. I hope you'll enjoy your weekend and hope to see you next time also. Bye for now!