So, hello everyone, I'm Elias Verif, I do open source stuff related to the maps have been
doing for 15 years, lately I've been writing this open street map editor called Evridor.
But here in the half ago, I got a grant from an OLED to develop plug-ins functionality
for it.
So, the entire year I've been working on plug-ins and that's basically the reason for this
talk, because I learned something quite a lot, actually, new about writing those
maps as well.
And let me start with a bit of over-real, like most of us know here that, well, J.S. Catography
in general is hard, and not in just the way that's like doing things are hard in
J.S. in just spatial, but also like creating software is pretty hard, because if you
look at this, that we don't only have like QJS, right? We have so many different
just spatial systems, like grass and JVC, like sagger, like smaller ones, like leaf
and open layers, so many different stuff, like why do we need them, even? Because every
single one of those does something different. There are so many use cases for JVC, you
can say that like every business tasks, just QJS, like everything has some JVC, and
because the world is so different, so the use cases are just so different, so we need
like all the help we can get. So this comes to that, when you create a super big J.S.
working like 20 years coding stuff, you got like 1,000 buttons, so the panels, and then
a client comes in, in a quiz, a feature that has never been done before, none of the buttons
solves it. So, and like, what do you do? Like, add another button, like, there are enough
already. And from the, like, perspective of the clients, like, what do you do when you
got this thing that you cannot do because JS is hard, and there is no ready-made solution,
because everything is different. Like, you can compare JS to transport. Most of you have
flew in here or took about a train, planes and trains are like proper big JS, like QJS,
like, I don't know, grass, and they get you to a city, but then you might need to take
the bus and bus, buses are basically those plugins you can find in QJS and everywhere. Those
may solve your, like, task at hand, like, I don't know, preparing some layouts and,
parsing some data. And yeah, those are actually quite like, like, buses, because they're like,
companies that profit on creating new plugins, like bus lanes and their bus lines, like,
entire providers and their small companies that operate a single bus. So, yeah, kind of like that.
But then, again, like, those are only get you that far. There are quite a chance that you got
like dating some, like, PDF that kind of discounts or, you need some results in some
strategic format. So, what do you do when you go to the bus stop, how do you get to home? And
that's, like, when interesting things start. Like, from the position of clients, that's why
you need your spatial experts. Those are never going out of the market, because, like, every path is
different. Like, if you're doing GIS, I could say that, like, you're not going out of business,
because no amount of L and so on that. But, also, that's where things start interesting for,
like, experts for developers, because that's when you can experiment. Like, the most important
button in QJS is actually, like, this menu item that's hidden, open Python console.
So, there's this big GIS that you can make maps in, but you open this small console. It
comes out, it looks like nothing. But, you type things in it, and you find out there's an object
that gives you access to all the menus, all the maps, all the layers with some experimentation and
googling, because the documentation is awful, as always. You can find out that you can, like,
add layers to can iterate through objects. That's basically how I started writing plugins with
QJS. I just had a task at hand that nothing else solved it, like, something simple, like,
iteration of objects. And from that, like, it's pretty easy to, like, download, copy that into
file and publish a plugin. And that's how, like, at least the function grows, like, turns out
that's basically every single big GIS content has some plugin functionality. So, like, if you're
Google, then you find only QJS plugins, because so many people do in this, but actually, every
single, just special system has something. So, yeah, basically, that's what makes GIS, not just
map editing in the app, but also just open the console and, uh, hacking away at, uh, adding stuff.
Now, back to open sheet map. In open sheet map, there's just, did any of you use
JSON before? Oh, nice. Pretty quite a lot of people from all the sequence here. So, this looks
awful, right? Because, uh, it got pretty steep running curve. It got hundreds of buttons,
there and there and a lot of menus and so many panels and, like, it, it was written by Germans and it
shows, uh, and looks at, it can, it can do everything, right? Because, like, access to everything,
there is an open statement, but, uh, there's a problem. Like, open sheet map is simple in theory.
Nulls, ways, iteration, stecks, nothing else. How hard could it be? But the problem is, like,
with a simple data model, you get, like, the layer that few people speak that's, uh, on top of
those, uh, simple features and that's people and every human is different. Every country is different.
So, they, you got local specifics, you got ideas of people, how things should be mapped,
you got people who are really into power lanes, lines, or railways who create, like,
elaborate schemas to map those. So, you, of course, got to have plugins, including Joseph,
and the list of super, super big, like, uh, there are new plugins published, like, every week,
I guess, so quite a lot. And, uh, how do you do those? There is a documentation, which is basically
two pages in the weekend, and after that, you have to go and start the source code,
because in open source, the documentation is always bad with a very few exceptions.
And that's how people get into coding plugin. Like, you clone somebody else's plugin, or you
peek into, uh, just some source code, you look at how other people do stuff, and you, like,
put together your thing from how other people have done similar things.
Like, coding a plugin is basically an exercise in studying the core source code of
Joseph, in this case. So, by the way, you've published a couple, and I did publish a couple,
you're pretty much ready to join the maintainers of Joseph, because plugins are in Java,
just within Java, and interfaces are similar. So, now, you know, the intersection of how just works,
welcome to maintainers. That's how Joseph goes. I think Joseph currently is the most
actively developed software in open statement, which is a miracle, because it's also one of the
oldest software in open statement. It's almost, it's oldest for the same itself.
And it's got, like, half a dozen maintainers, which work every day. It's, like, awesome.
I want that. For all of my source projects, of course. And that's basically how people usually
get to be maintainers when we, like, uh, things with adults, with plugins. Like,
making some plugins for QJS, may need me to do some pull requests to the QJS core,
because, like, interfaces are similar. Yeah, plugins in Python, but QJS in C++,
no big difference though. So, it happens. And yeah, I want it for myself. I have been working on
every door app for past three and a half years. And, uh, it has grew pretty big, uh, and, like,
full featured. Uh, if you haven't, uh, mapped with it, I strongly suggested, because it's
pretty fun. It doesn't require to know all the snap tags, or data model, or all the systems,
we just map simple stuff. Uh, it is a mobile application. It's very different from, like,
desktop applications, from QJS and JOSOM in different styles. And yeah, it has its, um, dances.
I have been developing it in what I call, like, Apple philosophy, in that, uh, first,
every door is feature complete. Like, no more features, uh, like, it does what it needs, like,
for modes, uh, and, uh, people usually ask me to add something more. Just, no, it's complete.
And the second thing is, it's very opinionated. Like, uh, some people know,
process really like to add settings, configuration, uh, configuration panel for every door is,
like, one screen, and no more. Like, every single decision, like, I walked around,
mapped a bit, and chose the best value for, like, everything new constants. It works for me.
It works for me. It doesn't work for other people. Like, with Openation software usually happens.
Like, uh, you see, this all the time in OpenStitMap can,
can JOSOM be easier, like, a D, can a D be a bit faster, like, JOSOM, and, like, have more features.
Can JOSOM be, like, a bit more native, like, near-cutter, and this push may be,
we could, like, implement, uh, process from JOSOM because format is similar. And, like,
can, like, go map have, uh, tasks from street companies. Can this push be a bit more understandable, like,
so this is, like, uh, people use some software, but they look at other software, and
can, can we take some features on that to hear? So, if, well, maintain a three, if followed
older requests, I think we would end up with a single, like, editor that's, like, every single other one.
And, of course, people have been asking me to do stuff as well. Like,
I think after StitComplete has become the most popular opposite my application. Like, every single editor
has been asked to add tasks, quests, like, in street complete. And, uh, people come asking to do
other stuff, like, uh, bicycle activities group from, uh, Netherlands, I think, or from Denmark,
came and asked me, can I just make a custom build of every door, focus on just mapping bicycle
barriers, because, like, they need to give it 200 volunteers, so they collect the data all over the
country. Uh, or can I make a custom build of every door for mapping bus stop infrastructure,
because there's, like, in general, that working on that and, you know, by the end, uh, they need to
upload it to custom server, and, uh, do this whole, uh, like, uh, data analyzing things stuff.
Can I, like, make a custom build for humanitarian opportunity to collect the data on settlement
and stuff? The big, big question is, can I make a custom every door for so many
different non-commercials, non-profit and full-party groups? And, if I have been doing that, I,
I won't have free time ever, right? And, nobody actually will pay me for that. So that's also,
okay, so this led me to the thing that's actually been playing actually from the start to edit
and plugins to every door. And the rest is about how to make a plugin, because the problem is
where we're on the phone. On the phone, like, first it's small, you cannot, like, copy files
and it easily, especially on iPhones. And, uh, there's app stores, uh, that's, like, for a
bit modification of application behavior, how do I even add one to the mobile app? Well, plugins
are not actually required to code, but are so many other options. Like, you can use static files,
like, configuration files. Like, if you type something in JSON or XML or, uh, something,
and upload it to a phone, and the app changes its behavior, it's a plugin.
Why not, like, some apps do that, Osmond, like, the most feature, featureful, uh,
navigation app for a phone, they support plugins, and plugins are basically some configuration
with some web data packaging, and it works. Like, you can download Wikipedia data, for example,
and put it on the map. It's really simple on site. It just map data for Wikipedia points.
It works. Why not do that, because it's pretty simple. And, as I said, every door is open and
native, but people have always been requesting to change some stuff, to change the defaults
for presets, web editing, to change, like, colors and icons for objects on the map, to change,
like, how long the object stays confirmed. In every door, if you do no change, but,
like, the object to old, you can market it. This shop is still there, and it stays for two months,
I think. Uh, so, yeah, actually quite a lot of things to change, and people have been asking
if a lot changed it. So, I got that grant last December, last December, last December.
And, actually, been working for, like, couple months, full time, managed to do something
in and, uh, well, uh, we can write jammals. Jammal is, uh, excellent format for typing by hand.
It has a Norway problem. Uh, some, some you must know it. Uh, I caught it, of course. Uh,
had to create some override for that. But generally, you can write a plugin in jammal, and change
quite a lot of things, actually. You can change icons, like, packaging them with, uh, this file.
You can put your JSON from top of the map. You can even replace entire modes with, like,
just specific, like, making bicycle barriers and bicycle parking, like, uh, just one tap,
and you're adding, uh, you know, bicycle parking with typing capacity and stuff.
This is all done with, with the text file. And this looks pretty powerful. Like, uh,
now those plugin packages can be automatically generated. So if you're, like, hosting a
mapping party, you can make a website that, uh, basically, you choose an area to walk in,
you choose type of features and it generates the plugin that shows you with your JSON, where you
should suppose to go and leaves on the those features to add that you should be focused on.
So again, pretty awesome. But then just covers code. It doesn't cover, like, integrations, for
example. You cannot code anything in yellow. And looking at JSON at QJS with so many people
doing stuff that don't require, like input from maintainers. Like, uh, I think I want a good
life. I want to not do anything and just people code stuff they need for themselves. And I just
work on my own stuff. So, and for that, I obviously need code. And for code, I probably need to
suffer because it's really hard to make something third-party around inside your application on
a phone. Like, very few people have done that. It's like, can be deemed almost impossible. How many
apps on your phone actually support plugins that you can code? For most of you, I'm pretty sure
of the number is zero. Maybe one because, like, browsers support plugins. But browsers support
plugins because they have JavaScript engines guilty. Right? There's like, this only single,
just special app that supports plugin, Qfield. It supports, like, plugins in QML and JavaScript.
And, like, uh, it's, uh, it is weird. They allowed that. But, uh, also, it's not really easy
writing plugins because when I opened the plugin directory, every single one of them was written
by Qfield maintainers. There's not a single plugin that somebody else has had a good reason.
Uh, but, yeah, that's basically the only thing. And that's also because, uh, QT engine has
JavaScript interpreter inside, uh, which is weird, but it's happens. I have, I'm, I've been
reading writing every door in Flutter and Dart. And they don't have JavaScript. They don't have
Python. They don't have, look, have nothing. So, how they even make plugins with code. Well,
turns out that, uh, one person, uh, if some play has been doing for several years, uh,
Dart of all library that's basically, uh, compiles and executes Dart code inside a Dart application,
which sounds complex and is complex. I still don't understand how it works. But it works.
It's super janky because not a single, like popular package has been using it. So, it is missing quite a lot
of stuff. It's, uh, uh, uh, I have spent like months trying to make it work, but it works in jail.
Uh, uh, so that's like one problem solved that many others. Like, just writing, working on Dart
well, I have created multiple repositories so that people can create plugins. It's not as simple as
writing one Wikipedia, like those offers on QT. So, what does it do? So, I had to do, I had to become
Dart of all maintainer because the package actually is like long dropped and, uh, it needed maintaining.
After that, every door for three years, I have been developing it like, you know, a snowball, like,
I've got a core and then, uh, I take a feature, plop it on top, another feature plop when it looks
pretty round. I publish it as a release and then plops some more things on top and that's another release.
That's how like, uh, Hobbit development goes. And now, if I need to make it extendable,
I actually need to, like, take every part away, like, decompile the entire, like, architecture,
structure of it and then somehow put it together in an extendable way. So that's, for example,
adding one plugin is easier. It can do whatever it wants with your code, adding two plugins,
and they will start interacting with each other, removing plugins when, like, some code has
added stuff to your list, to your, like, added some listeners and then you need to remove it.
And it's much harder than it is. Hope, uh, it was quite a lot of work.
Uh, and that's basically what I spend a good part of the year on, uh, basically,
restructuring the entire app. Now it works. They have been couple plugins published for
VQD data for, uh, panoramic integration, which are, like, CPU image, it works. The work has
still not been, uh, still not done, because so many stuff to do, those, like, sometimes it feels, like,
impossible, like, uh, unending tasks of, like, deconstructing, fixing,
ductival, patient, things in. I have done a plugin in two weeks and then two, it took amounts
to just make it run, uh, so super, super weird. And when I'm done, there's also a problem with
versioning, because the moment you add plugins to your software, that software has an API, an
API has to be stable, because people update your software, plugins still need to run. And that's,
like, basically, when I'm done, I cannot change my application much, because that would change
a lot of APIs. Uh, but that every door is feature complete, helps. But again,
this means that the development is pretty set and stolen after you publish the first version of
this plugin. So yeah, that has been, like, uh, unending struggle that still continues. I really
hope to publish the first version of this plugin in a couple of months. Hopefully, uh, and, uh,
I often, like, want to put it away, because, like, every day I have to think about what I'm presenting
here, I have to focus on the target and the goal for this always, basic integrations is to make
every door a platform, not just an opposite map either. Like, a platform that can integrate, like,
panoramic, you integrate with different system with humanitarian, opposite map,
team systems with map alerts, for tasks with, like, everything. And integrations require to just
deconstruct what even is every door. When do we stop? Like, few fields have stopped at adding
buttons to mainstream. I probably will be stopping at, when everything can be over-edum. Like,
we don't need to open a seat map. In just data set of points that I displayed on the map.
That's, like, the minimum, like, uh, what you can get very dark. And on top of that, you can
build your own thing. But if you think of it, uh, that's even just, you can do without it. You can
make a game on every door platform in the future, probably. So, like, I guess the point of it is
where I need to focus. And the plugins are pretty powerful when you get your mind in it.
But yeah, three things that, uh, pretty hard is changing the entire architecture of your app.
So, it allows plugins. Find a thing that runs code on mobile. I still don't know what happens
when I submit it to App Store. Maybe they will say that's no, we don't allow changing the
functionality of the app. And making the app fixed because plugins make use API. And API
means you kind of just change anything as you wish. Okay. So, thank you.
Thank you.
We go like one minute. So, if anyone has one question.
Yeah, I see. Uh, uh, I think you, you can just scream. I do.
Is there what?
Yeah, uh, two alpha versions have been, uh, yeah, is there a beta for trying this thing out?
Yes, uh, on GitHub of every door, you can find two alpha versions, the letter one,
later one supports like quite a lot, like changing, uh, how the map looks, changing the editor of
all things like everything. So, yeah, try it out if you want. Okay, the sole. Thank you, everyone.
And, uh, don't forget to map.