WEBVTT 00:00.000 --> 00:14.800 So, hello everyone, I'm Elias Verif, I do open source stuff related to the maps have been 00:14.800 --> 00:25.000 doing for 15 years, lately I've been writing this open street map editor called Evridor. 00:25.000 --> 00:33.560 But here in the half ago, I got a grant from an OLED to develop plug-ins functionality 00:33.560 --> 00:34.560 for it. 00:34.560 --> 00:40.360 So, the entire year I've been working on plug-ins and that's basically the reason for this 00:40.360 --> 00:47.920 talk, because I learned something quite a lot, actually, new about writing those 00:47.920 --> 00:50.520 maps as well. 00:50.520 --> 00:59.840 And let me start with a bit of over-real, like most of us know here that, well, J.S. Catography 00:59.840 --> 01:06.640 in general is hard, and not in just the way that's like doing things are hard in 01:06.640 --> 01:15.600 J.S. in just spatial, but also like creating software is pretty hard, because if you 01:15.600 --> 01:24.280 look at this, that we don't only have like QJS, right? We have so many different 01:24.280 --> 01:30.840 just spatial systems, like grass and JVC, like sagger, like smaller ones, like leaf 01:30.840 --> 01:38.640 and open layers, so many different stuff, like why do we need them, even? Because every 01:38.640 --> 01:47.480 single one of those does something different. There are so many use cases for JVC, you 01:47.480 --> 02:00.320 can say that like every business tasks, just QJS, like everything has some JVC, and 02:00.320 --> 02:06.280 because the world is so different, so the use cases are just so different, so we need 02:06.280 --> 02:16.520 like all the help we can get. So this comes to that, when you create a super big J.S. 02:16.520 --> 02:22.680 working like 20 years coding stuff, you got like 1,000 buttons, so the panels, and then 02:22.680 --> 02:30.120 a client comes in, in a quiz, a feature that has never been done before, none of the buttons 02:30.120 --> 02:38.520 solves it. So, and like, what do you do? Like, add another button, like, there are enough 02:38.520 --> 02:47.280 already. And from the, like, perspective of the clients, like, what do you do when you 02:47.280 --> 02:53.680 got this thing that you cannot do because JS is hard, and there is no ready-made solution, 02:53.760 --> 03:04.000 because everything is different. Like, you can compare JS to transport. Most of you have 03:04.000 --> 03:10.680 flew in here or took about a train, planes and trains are like proper big JS, like QJS, 03:10.680 --> 03:20.560 like, I don't know, grass, and they get you to a city, but then you might need to take 03:20.640 --> 03:27.840 the bus and bus, buses are basically those plugins you can find in QJS and everywhere. Those 03:28.880 --> 03:35.280 may solve your, like, task at hand, like, I don't know, preparing some layouts and, 03:38.000 --> 03:44.240 parsing some data. And yeah, those are actually quite like, like, buses, because they're like, 03:44.880 --> 03:51.360 companies that profit on creating new plugins, like bus lanes and their bus lines, like, 03:51.360 --> 03:57.040 entire providers and their small companies that operate a single bus. So, yeah, kind of like that. 03:57.040 --> 04:04.240 But then, again, like, those are only get you that far. There are quite a chance that you got 04:04.240 --> 04:11.680 like dating some, like, PDF that kind of discounts or, you need some results in some 04:11.680 --> 04:17.200 strategic format. So, what do you do when you go to the bus stop, how do you get to home? And 04:18.400 --> 04:25.200 that's, like, when interesting things start. Like, from the position of clients, that's why 04:25.200 --> 04:32.320 you need your spatial experts. Those are never going out of the market, because, like, every path is 04:32.320 --> 04:40.960 different. Like, if you're doing GIS, I could say that, like, you're not going out of business, 04:40.960 --> 04:50.880 because no amount of L and so on that. But, also, that's where things start interesting for, 04:50.880 --> 04:58.640 like, experts for developers, because that's when you can experiment. Like, the most important 04:58.720 --> 05:07.040 button in QJS is actually, like, this menu item that's hidden, open Python console. 05:09.120 --> 05:14.480 So, there's this big GIS that you can make maps in, but you open this small console. It 05:14.480 --> 05:21.120 comes out, it looks like nothing. But, you type things in it, and you find out there's an object 05:21.120 --> 05:26.560 that gives you access to all the menus, all the maps, all the layers with some experimentation and 05:26.640 --> 05:33.760 googling, because the documentation is awful, as always. You can find out that you can, like, 05:33.760 --> 05:39.040 add layers to can iterate through objects. That's basically how I started writing plugins with 05:39.040 --> 05:45.760 QJS. I just had a task at hand that nothing else solved it, like, something simple, like, 05:45.760 --> 05:53.680 iteration of objects. And from that, like, it's pretty easy to, like, download, copy that into 05:53.680 --> 06:02.240 file and publish a plugin. And that's how, like, at least the function grows, like, turns out 06:02.240 --> 06:11.440 that's basically every single big GIS content has some plugin functionality. So, like, if you're 06:11.440 --> 06:16.880 Google, then you find only QJS plugins, because so many people do in this, but actually, every 06:16.960 --> 06:24.880 single, just special system has something. So, yeah, basically, that's what makes GIS, not just 06:25.600 --> 06:34.880 map editing in the app, but also just open the console and, uh, hacking away at, uh, adding stuff. 06:37.040 --> 06:42.800 Now, back to open sheet map. In open sheet map, there's just, did any of you use 06:42.800 --> 06:51.440 JSON before? Oh, nice. Pretty quite a lot of people from all the sequence here. So, this looks 06:51.440 --> 06:57.760 awful, right? Because, uh, it got pretty steep running curve. It got hundreds of buttons, 06:58.400 --> 07:05.040 there and there and a lot of menus and so many panels and, like, it, it was written by Germans and it 07:05.120 --> 07:13.840 shows, uh, and looks at, it can, it can do everything, right? Because, like, access to everything, 07:13.840 --> 07:20.240 there is an open statement, but, uh, there's a problem. Like, open sheet map is simple in theory. 07:20.960 --> 07:28.480 Nulls, ways, iteration, stecks, nothing else. How hard could it be? But the problem is, like, 07:28.480 --> 07:34.480 with a simple data model, you get, like, the layer that few people speak that's, uh, on top of 07:34.480 --> 07:42.240 those, uh, simple features and that's people and every human is different. Every country is different. 07:42.240 --> 07:47.680 So, they, you got local specifics, you got ideas of people, how things should be mapped, 07:47.680 --> 07:54.480 you got people who are really into power lanes, lines, or railways who create, like, 07:54.480 --> 08:02.480 elaborate schemas to map those. So, you, of course, got to have plugins, including Joseph, 08:03.200 --> 08:10.320 and the list of super, super big, like, uh, there are new plugins published, like, every week, 08:10.320 --> 08:19.600 I guess, so quite a lot. And, uh, how do you do those? There is a documentation, which is basically 08:19.920 --> 08:25.440 two pages in the weekend, and after that, you have to go and start the source code, 08:25.440 --> 08:31.680 because in open source, the documentation is always bad with a very few exceptions. 08:33.280 --> 08:40.800 And that's how people get into coding plugin. Like, you clone somebody else's plugin, or you 08:40.800 --> 08:47.120 peek into, uh, just some source code, you look at how other people do stuff, and you, like, 08:47.360 --> 08:52.560 put together your thing from how other people have done similar things. 08:53.600 --> 09:00.400 Like, coding a plugin is basically an exercise in studying the core source code of 09:00.400 --> 09:08.160 Joseph, in this case. So, by the way, you've published a couple, and I did publish a couple, 09:09.680 --> 09:15.840 you're pretty much ready to join the maintainers of Joseph, because plugins are in Java, 09:15.840 --> 09:24.000 just within Java, and interfaces are similar. So, now, you know, the intersection of how just works, 09:24.640 --> 09:30.480 welcome to maintainers. That's how Joseph goes. I think Joseph currently is the most 09:31.120 --> 09:36.720 actively developed software in open statement, which is a miracle, because it's also one of the 09:36.720 --> 09:42.720 oldest software in open statement. It's almost, it's oldest for the same itself. 09:43.600 --> 09:50.400 And it's got, like, half a dozen maintainers, which work every day. It's, like, awesome. 09:50.400 --> 09:57.360 I want that. For all of my source projects, of course. And that's basically how people usually 09:57.360 --> 10:04.960 get to be maintainers when we, like, uh, things with adults, with plugins. Like, 10:05.920 --> 10:11.280 making some plugins for QJS, may need me to do some pull requests to the QJS core, 10:11.280 --> 10:17.600 because, like, interfaces are similar. Yeah, plugins in Python, but QJS in C++, 10:17.600 --> 10:26.240 no big difference though. So, it happens. And yeah, I want it for myself. I have been working on 10:26.320 --> 10:34.480 every door app for past three and a half years. And, uh, it has grew pretty big, uh, and, like, 10:34.480 --> 10:40.560 full featured. Uh, if you haven't, uh, mapped with it, I strongly suggested, because it's 10:40.560 --> 10:46.560 pretty fun. It doesn't require to know all the snap tags, or data model, or all the systems, 10:46.560 --> 10:53.920 we just map simple stuff. Uh, it is a mobile application. It's very different from, like, 10:53.920 --> 11:02.080 desktop applications, from QJS and JOSOM in different styles. And yeah, it has its, um, dances. 11:02.960 --> 11:08.720 I have been developing it in what I call, like, Apple philosophy, in that, uh, first, 11:09.680 --> 11:16.800 every door is feature complete. Like, no more features, uh, like, it does what it needs, like, 11:16.880 --> 11:24.000 for modes, uh, and, uh, people usually ask me to add something more. Just, no, it's complete. 11:24.560 --> 11:29.840 And the second thing is, it's very opinionated. Like, uh, some people know, 11:29.840 --> 11:35.920 process really like to add settings, configuration, uh, configuration panel for every door is, 11:35.920 --> 11:42.720 like, one screen, and no more. Like, every single decision, like, I walked around, 11:42.720 --> 11:48.640 mapped a bit, and chose the best value for, like, everything new constants. It works for me. 11:49.680 --> 11:54.640 It works for me. It doesn't work for other people. Like, with Openation software usually happens. 11:55.200 --> 11:58.720 Like, uh, you see, this all the time in OpenStitMap can, 11:58.720 --> 12:07.040 can JOSOM be easier, like, a D, can a D be a bit faster, like, JOSOM, and, like, have more features. 12:07.120 --> 12:11.600 Can JOSOM be, like, a bit more native, like, near-cutter, and this push may be, 12:11.600 --> 12:18.960 we could, like, implement, uh, process from JOSOM because format is similar. And, like, 12:20.240 --> 12:26.480 can, like, go map have, uh, tasks from street companies. Can this push be a bit more understandable, like, 12:27.040 --> 12:32.800 so this is, like, uh, people use some software, but they look at other software, and 12:33.680 --> 12:40.080 can, can we take some features on that to hear? So, if, well, maintain a three, if followed 12:40.080 --> 12:47.840 older requests, I think we would end up with a single, like, editor that's, like, every single other one. 12:49.680 --> 12:54.800 And, of course, people have been asking me to do stuff as well. Like, 12:55.360 --> 13:02.080 I think after StitComplete has become the most popular opposite my application. Like, every single editor 13:02.320 --> 13:12.800 has been asked to add tasks, quests, like, in street complete. And, uh, people come asking to do 13:12.800 --> 13:22.000 other stuff, like, uh, bicycle activities group from, uh, Netherlands, I think, or from Denmark, 13:22.560 --> 13:29.600 came and asked me, can I just make a custom build of every door, focus on just mapping bicycle 13:29.680 --> 13:36.160 barriers, because, like, they need to give it 200 volunteers, so they collect the data all over the 13:36.160 --> 13:42.720 country. Uh, or can I make a custom build of every door for mapping bus stop infrastructure, 13:43.280 --> 13:50.160 because there's, like, in general, that working on that and, you know, by the end, uh, they need to 13:50.240 --> 13:58.800 upload it to custom server, and, uh, do this whole, uh, like, uh, data analyzing things stuff. 14:00.560 --> 14:08.960 Can I, like, make a custom build for humanitarian opportunity to collect the data on settlement 14:08.960 --> 14:19.840 and stuff? The big, big question is, can I make a custom every door for so many 14:19.920 --> 14:28.320 different non-commercials, non-profit and full-party groups? And, if I have been doing that, I, 14:29.760 --> 14:37.440 I won't have free time ever, right? And, nobody actually will pay me for that. So that's also, 14:38.000 --> 14:44.240 okay, so this led me to the thing that's actually been playing actually from the start to edit 14:44.320 --> 14:51.040 and plugins to every door. And the rest is about how to make a plugin, because the problem is 14:51.040 --> 14:58.080 where we're on the phone. On the phone, like, first it's small, you cannot, like, copy files 14:58.080 --> 15:05.760 and it easily, especially on iPhones. And, uh, there's app stores, uh, that's, like, for a 15:05.840 --> 15:16.080 bit modification of application behavior, how do I even add one to the mobile app? Well, plugins 15:16.080 --> 15:23.600 are not actually required to code, but are so many other options. Like, you can use static files, 15:25.360 --> 15:34.640 like, configuration files. Like, if you type something in JSON or XML or, uh, something, 15:34.720 --> 15:40.400 and upload it to a phone, and the app changes its behavior, it's a plugin. 15:41.440 --> 15:49.200 Why not, like, some apps do that, Osmond, like, the most feature, featureful, uh, 15:49.200 --> 15:55.520 navigation app for a phone, they support plugins, and plugins are basically some configuration 15:55.520 --> 16:01.600 with some web data packaging, and it works. Like, you can download Wikipedia data, for example, 16:01.680 --> 16:06.240 and put it on the map. It's really simple on site. It just map data for Wikipedia points. 16:08.000 --> 16:14.240 It works. Why not do that, because it's pretty simple. And, as I said, every door is open and 16:14.240 --> 16:21.200 native, but people have always been requesting to change some stuff, to change the defaults 16:21.200 --> 16:29.760 for presets, web editing, to change, like, colors and icons for objects on the map, to change, 16:29.760 --> 16:37.360 like, how long the object stays confirmed. In every door, if you do no change, but, 16:37.360 --> 16:45.200 like, the object to old, you can market it. This shop is still there, and it stays for two months, 16:45.200 --> 16:54.720 I think. Uh, so, yeah, actually quite a lot of things to change, and people have been asking 16:54.720 --> 17:03.600 if a lot changed it. So, I got that grant last December, last December, last December. 17:04.800 --> 17:11.120 And, actually, been working for, like, couple months, full time, managed to do something 17:12.160 --> 17:21.760 in and, uh, well, uh, we can write jammals. Jammal is, uh, excellent format for typing by hand. 17:21.760 --> 17:28.480 It has a Norway problem. Uh, some, some you must know it. Uh, I caught it, of course. Uh, 17:28.480 --> 17:35.760 had to create some override for that. But generally, you can write a plugin in jammal, and change 17:36.560 --> 17:45.520 quite a lot of things, actually. You can change icons, like, packaging them with, uh, this file. 17:45.600 --> 17:52.000 You can put your JSON from top of the map. You can even replace entire modes with, like, 17:52.800 --> 18:00.720 just specific, like, making bicycle barriers and bicycle parking, like, uh, just one tap, 18:00.720 --> 18:05.680 and you're adding, uh, you know, bicycle parking with typing capacity and stuff. 18:06.560 --> 18:13.920 This is all done with, with the text file. And this looks pretty powerful. Like, uh, 18:14.560 --> 18:22.480 now those plugin packages can be automatically generated. So if you're, like, hosting a 18:22.480 --> 18:30.480 mapping party, you can make a website that, uh, basically, you choose an area to walk in, 18:30.480 --> 18:35.360 you choose type of features and it generates the plugin that shows you with your JSON, where you 18:35.360 --> 18:42.480 should suppose to go and leaves on the those features to add that you should be focused on. 18:43.600 --> 18:50.960 So again, pretty awesome. But then just covers code. It doesn't cover, like, integrations, for 18:50.960 --> 18:59.600 example. You cannot code anything in yellow. And looking at JSON at QJS with so many people 19:00.480 --> 19:08.400 doing stuff that don't require, like input from maintainers. Like, uh, I think I want a good 19:08.400 --> 19:14.560 life. I want to not do anything and just people code stuff they need for themselves. And I just 19:14.560 --> 19:24.480 work on my own stuff. So, and for that, I obviously need code. And for code, I probably need to 19:24.480 --> 19:32.720 suffer because it's really hard to make something third-party around inside your application on 19:32.720 --> 19:42.320 a phone. Like, very few people have done that. It's like, can be deemed almost impossible. How many 19:42.320 --> 19:48.880 apps on your phone actually support plugins that you can code? For most of you, I'm pretty sure 19:48.960 --> 19:54.960 of the number is zero. Maybe one because, like, browsers support plugins. But browsers support 19:54.960 --> 20:01.200 plugins because they have JavaScript engines guilty. Right? There's like, this only single, 20:02.240 --> 20:10.320 just special app that supports plugin, Qfield. It supports, like, plugins in QML and JavaScript. 20:10.400 --> 20:23.280 And, like, uh, it's, uh, it is weird. They allowed that. But, uh, also, it's not really easy 20:23.280 --> 20:28.800 writing plugins because when I opened the plugin directory, every single one of them was written 20:28.800 --> 20:34.480 by Qfield maintainers. There's not a single plugin that somebody else has had a good reason. 20:35.120 --> 20:44.880 Uh, but, yeah, that's basically the only thing. And that's also because, uh, QT engine has 20:44.880 --> 20:52.960 JavaScript interpreter inside, uh, which is weird, but it's happens. I have, I'm, I've been 20:52.960 --> 21:00.080 reading writing every door in Flutter and Dart. And they don't have JavaScript. They don't have 21:00.160 --> 21:07.680 Python. They don't have, look, have nothing. So, how they even make plugins with code. Well, 21:07.680 --> 21:14.560 turns out that, uh, one person, uh, if some play has been doing for several years, uh, 21:14.560 --> 21:24.800 Dart of all library that's basically, uh, compiles and executes Dart code inside a Dart application, 21:25.760 --> 21:31.280 which sounds complex and is complex. I still don't understand how it works. But it works. 21:31.280 --> 21:38.400 It's super janky because not a single, like popular package has been using it. So, it is missing quite a lot 21:38.400 --> 21:47.360 of stuff. It's, uh, uh, uh, I have spent like months trying to make it work, but it works in jail. 21:47.360 --> 21:57.360 Uh, uh, so that's like one problem solved that many others. Like, just writing, working on Dart 21:57.360 --> 22:03.120 well, I have created multiple repositories so that people can create plugins. It's not as simple as 22:03.120 --> 22:10.800 writing one Wikipedia, like those offers on QT. So, what does it do? So, I had to do, I had to become 22:10.880 --> 22:18.480 Dart of all maintainer because the package actually is like long dropped and, uh, it needed maintaining. 22:20.240 --> 22:26.560 After that, every door for three years, I have been developing it like, you know, a snowball, like, 22:26.560 --> 22:33.280 I've got a core and then, uh, I take a feature, plop it on top, another feature plop when it looks 22:33.280 --> 22:39.200 pretty round. I publish it as a release and then plops some more things on top and that's another release. 22:39.200 --> 22:47.600 That's how like, uh, Hobbit development goes. And now, if I need to make it extendable, 22:47.600 --> 22:55.920 I actually need to, like, take every part away, like, decompile the entire, like, architecture, 22:55.920 --> 23:03.840 structure of it and then somehow put it together in an extendable way. So that's, for example, 23:03.920 --> 23:09.600 adding one plugin is easier. It can do whatever it wants with your code, adding two plugins, 23:09.600 --> 23:17.040 and they will start interacting with each other, removing plugins when, like, some code has 23:17.040 --> 23:22.480 added stuff to your list, to your, like, added some listeners and then you need to remove it. 23:23.040 --> 23:28.880 And it's much harder than it is. Hope, uh, it was quite a lot of work. 23:29.440 --> 23:35.040 Uh, and that's basically what I spend a good part of the year on, uh, basically, 23:35.040 --> 23:42.160 restructuring the entire app. Now it works. They have been couple plugins published for 23:42.160 --> 23:50.320 VQD data for, uh, panoramic integration, which are, like, CPU image, it works. The work has 23:50.320 --> 23:57.840 still not been, uh, still not done, because so many stuff to do, those, like, sometimes it feels, like, 23:58.960 --> 24:05.920 impossible, like, uh, unending tasks of, like, deconstructing, fixing, 24:05.920 --> 24:11.520 ductival, patient, things in. I have done a plugin in two weeks and then two, it took amounts 24:11.520 --> 24:21.200 to just make it run, uh, so super, super weird. And when I'm done, there's also a problem with 24:21.280 --> 24:28.960 versioning, because the moment you add plugins to your software, that software has an API, an 24:28.960 --> 24:36.640 API has to be stable, because people update your software, plugins still need to run. And that's, 24:36.640 --> 24:43.680 like, basically, when I'm done, I cannot change my application much, because that would change 24:43.760 --> 24:50.000 a lot of APIs. Uh, but that every door is feature complete, helps. But again, 24:50.960 --> 24:57.120 this means that the development is pretty set and stolen after you publish the first version of 24:57.120 --> 25:05.520 this plugin. So yeah, that has been, like, uh, unending struggle that still continues. I really 25:05.520 --> 25:11.920 hope to publish the first version of this plugin in a couple of months. Hopefully, uh, and, uh, 25:12.000 --> 25:19.680 I often, like, want to put it away, because, like, every day I have to think about what I'm presenting 25:19.680 --> 25:26.800 here, I have to focus on the target and the goal for this always, basic integrations is to make 25:26.800 --> 25:34.560 every door a platform, not just an opposite map either. Like, a platform that can integrate, like, 25:35.360 --> 25:40.400 panoramic, you integrate with different system with humanitarian, opposite map, 25:41.280 --> 25:49.840 team systems with map alerts, for tasks with, like, everything. And integrations require to just 25:49.840 --> 25:57.680 deconstruct what even is every door. When do we stop? Like, few fields have stopped at adding 25:57.680 --> 26:06.080 buttons to mainstream. I probably will be stopping at, when everything can be over-edum. Like, 26:06.160 --> 26:10.240 we don't need to open a seat map. In just data set of points that I displayed on the map. 26:11.680 --> 26:18.480 That's, like, the minimum, like, uh, what you can get very dark. And on top of that, you can 26:18.480 --> 26:25.200 build your own thing. But if you think of it, uh, that's even just, you can do without it. You can 26:25.200 --> 26:34.880 make a game on every door platform in the future, probably. So, like, I guess the point of it is 26:34.880 --> 26:43.040 where I need to focus. And the plugins are pretty powerful when you get your mind in it. 26:43.920 --> 26:52.160 But yeah, three things that, uh, pretty hard is changing the entire architecture of your app. 26:52.160 --> 26:57.840 So, it allows plugins. Find a thing that runs code on mobile. I still don't know what happens 26:57.840 --> 27:03.360 when I submit it to App Store. Maybe they will say that's no, we don't allow changing the 27:03.360 --> 27:10.560 functionality of the app. And making the app fixed because plugins make use API. And API 27:10.560 --> 27:15.760 means you kind of just change anything as you wish. Okay. So, thank you. 27:16.480 --> 27:18.480 Thank you. 27:25.040 --> 27:28.160 We go like one minute. So, if anyone has one question. 27:34.800 --> 27:42.560 Yeah, I see. Uh, uh, I think you, you can just scream. I do. 27:43.520 --> 27:45.520 Is there what? 27:49.520 --> 27:56.800 Yeah, uh, two alpha versions have been, uh, yeah, is there a beta for trying this thing out? 27:56.800 --> 28:03.440 Yes, uh, on GitHub of every door, you can find two alpha versions, the letter one, 28:03.440 --> 28:11.200 later one supports like quite a lot, like changing, uh, how the map looks, changing the editor of 28:11.280 --> 28:18.480 all things like everything. So, yeah, try it out if you want. Okay, the sole. Thank you, everyone. 28:18.480 --> 28:21.360 And, uh, don't forget to map.