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.

