agnos.is

The agnos.is blog

Published: 2024-09-17T22:35:38+00:00

Two blog posts and two updates in one day. I have now just published 0.5.0 of the OpenStreetMap tool for OpenWbeUI.

Install it from OpenWebUI.com Get the code from agnos.is Git

The reason why this update is getting another blog post is because I added support for searching for Ways in OpenStreetMap, which makes search results much, much more accurate.

While many map features in OSM are nodes, or single points on the map, many others are defined as “ways,” or shapes on the map. Buildings, roads, areas (parks, parking lots, etc), and everything else that you can draw with a line is considered a “way.” In our case, we're mostly concerned with the buildings.

By changing the Overpass Turbo query, I was able to get the bounding information for Ways, which is basically the set of GPS coordinates that make up its shape. Calculate the center coordinate, and we can now add these Ways to the search results!

Of course, the 0.5.0 update includes everything from the 0.4.0 update:

  • Complete rewrite of search result handling to prevent incorrect OSM map links being generated, and bad info given.
  • New setting: Instruction Oriented Interpretation. Controls the result interpretation instructions given to the LLM.
  • The Instruction Oriented Interpretation setting is also a user valve that can be controlled on a per-chat basis.
  • Added ability to search for: public transit, schools/universities, libraries, bike rental locations, car rental locations.

License: CC-BY-SA-4.0.

Written by: @[email protected]

Published: 2024-09-17T20:22:27+00:00

I just published version 0.4.0 of the OpenStreetMap tool for OpenWebUI. This tool allows large language models (LLMs) to search OpenStreetMap to find points of interest near addresses and locations.

Install it from OpenWebUI.com Get the code from agnos.is Git

I rewrote the search result handling to ensure that links to OpenStreetMap are generated more accurately. I noticed that Mistral-Nemo was generating bad links: either the GPS coordinates would be the right numbers, but the wrong sign (negative or positive flipped), or the URL itself was invalid despite having the right GPS coordinates.

  • Result handling now generates a Markdown result list for increased accuracy.
  • Each entry includes a simple bullet list consisting of the GPS coordinates, address, etc.
  • The entry also includes a generated OSM map link.

A new setting called “Instruction Oriented Interpretation” has also been added. This setting controls the level of detail of the instructions sent to the language model. It should improve result consistency, especially with models like Hermes 3. You can also toggle the setting on a per-chat basis for more fine-grained control. Finally, the search functionality has been expanded to include public transit, schools and universities, libraries, bike rental locations, and car rental locations.

License: CC-BY-SA-4.0.

Written by: @[email protected]

Published: 2024-08-27T13:05:09+02:00

runit is being removed from Gentoo.

With the removal of runit from the Gentoo package repository, I have finally been forced to migrate to something new for managing user services on a system without systemd.

Gentoo's “default” init service is OpenRC, a modern alternative to the traditional SysV init (or other SysV-esque, like upstart) that was commonplace in most Linux distros up until ~2015, when systemd started taking over basically everywhere. Today, the landscape is very different:

  • Most distros use systemd. Debian, Ubuntu, Arch all use this by default, and usually ONLY support it, officially.
  • These distros have often been forked specifically to remove systemd, to varying degrees of success (Devuan, Artix).
  • There is a class of independent distros, like Void, that use other init systems.

Gentoo has, for a very long time, used OpenRC as its default init system. But Gentoo also has official support for systemd. Because of this dual support, the efforts of the Gentoo developers have resulted in major applications that would otherwise have hard systemd dependency being able to run on other init systems. Most notably, patches for the GNOME desktop are maintained by Gentoo developers to make it work with OpenRC.

User Services on OpenRC

One of the biggest missing features in OpenRC, for me, is user services. This is something systemd does very well. You just stick —user on a systemctl command, and you can run unprivileged services from your local user account.

User services are perfect for things like:

  • syncthing
  • rclone mounts
  • Protonmail Bridge

They're great for anything that needs to run all the time and stay out of your way.

https://wiki.gentoo.org/wiki/OpenRC/User_services OpenRC does not truly support user services. The best support for a “user service” with OpenRC is running a system-level service as a specific user. This is fine for basic single-user use cases, but still requires root access to modify or create new services. There are some other approaches in the wiki, but they are (in my opinion) even more hacky or complicated.

https://github.com/navi-desu/openrc/ Luckily, there is now a fork of OpenRC (called OpenRC-Navi) that adds user service support to OpenRC. The fork is available in Gentoo as sys-apps/openrc-navi. The original is available as sys-apps/openrc.

Using OpenRC-Navi User Services

Creating user services with the fork of OpenRC is straightforward; it's basically the same as creating system services.

Official User Service Guide OpenRC Service Script Guide

In summary:

  • Service scripts go in ~/.config/openrc/init.d/
  • Use the —user (or -U) parameter with rc-service, rc-update, etc.

Caveats

At the time of writing, here are some issues I ran into while porting my runit scripts to OpenRC scripts:

  • supervise-daemon does not currently work with user services. A permission denied error occurs.
  • Paths using ~/ (tilde for home) don't work correctly. I had to specify absolute paths to avoid some odd file not found errors.

Example

Here is an example user service for an rclone mount.

The service meant to be symlinked, one for each specific rclone mountpoint to be created. For example, if you have an rclone mountpoint called nextcloud:, then you would need to execute shell some commands like this:

ln -s ~/.config/openrc/init.d/rclone-mount ~/.config/openrc/init.d/rclone-mount.nextcloud
echo 'RCLONE_REMOTE=nextcloud:"' >> ~/.config/openrc/conf.d/rclone-mount.nextcloud
echo LOCAL_MOUNTPOINT=/mnt/nextcloud"' >> ~/.config/openrc/conf.d/rclone-mount.nextcloud
rc-update -U add rclone-mount.nextcloud default
rc-service -U rclone-mount.nextcloud start

Alternatives

Instead of using a fork of OpenRC, there are a few alternatives on a Gentoo system:

  • s6: Another init system that continues to be supported.
  • runit: runit might be saved by a proxy maintainerb and not removed.

Hopefully, the user service feature of OpenRC-Navi makes its way back upstream into the main version of OpenRC.

License: CC-BY-SA-4.0.

Written by: @[email protected]

Published: 2024-08-09T21:05:33+02:00

There is a housing crisis everywhere in the Western world. I have noticed in each of the three countries I've lived in (USA, Iceland, The Netherlands). The specifics differ between countries, but the end result is always the same: lack of housing drives prices up rapidly, pricing most people out of the market. At what point will it break?

Iceland

Nowhere near enough new construction. Massive interest rates (~10% in 2024).

Netherlands

Nitrogen crisis. Government deadlock and bickering over unrelated issues. Nothing built. Attempting to solve problems by blaming external parties.

USA

Increasingly dystopian wealth inequality.

Filed under: culture, thoughts License: CC-BY-SA-4.0.

Written by: @[email protected]

Published: 2024-08-05T21:09:57+02:00

I have been working on a new project: AI filters and function-calling tools for Open-WebUI. Open-WebUI is an open source UI for Large Language Models, built on top of ollama, AUTOMATIC1111, and other leading open AI technologies.

You can find Open-WebUI here.

Large language models are all the rage right now. They are definitely overhyped, but they're also a paradigm shift in computing. Newer, more powerful, more accurate models come out every 3 months. They get better and better at automatically calling APIs automatically and informing their responses.

Filters and Tools in Open-WebUI enables a lot of ChatGPT-like functionality on top of what is already built in.

An OpenStreetMap tool is my biggest contribution so far.

The OSM tool is surprisingly accurate when used with the latest models like Llama 3.1 and Mistral Nemo.

The project page is here. The full repository is here.

Filed under: ai License: CC-BY-SA-4.0.

Written by: @[email protected]

Published: 2024-05-23T23:23:34+02:00

I have posted the first review of a board game I've played extensively. Hopeflly more coming soon. You can read the review below.

Board Game Thoughts – Pandemic

License: CC-BY-SA-4.0.

Written by: @[email protected]

Published: 2024-05-22T23:48:58+02:00

Work on the AI game is once again progressing, albeit slowly. I have been working on adding basic interactive commands, focusing on the abiity for the character to stand, sit, crouch, etc first.

Physical Movement

These commands will become useful later when I add more complex interactions with the environment. Right now, only the event handlers are implemented. This means that when the LLM 'decides' that a target needs to stand, sit, kneel, etc, that character (including the player) will do so! For the player, this will be the result of entering a command, or later, possibly the result of another character causing it.

As part of this work, I aim to revamp the event generation system somewhat, moving towards the 'one-of' idea, where the LLM can produce specific output for each event type. This will allow for more flexibility in the future.

Vector Database?

As the point of the Ai game is to enable experimentation, I am considering integrating a vector database into the project.

The primary candidate is Marqo.ai because of its document-in-document-out nature.

This makes it easy to use, and the game works with a document model anyway (all entities are serializable to JSON). Use of a vector database would completely replace the ArangoDB database and its graph edges. That means relations between the entities will be fuzzy rather than absolutely defined, which may not actually be a good thing!

  • Pro: allows for organic creation of relationships between entities and scenes.
  • Con: relations may not make sense in some cases, or be missing when they should be present.

Swapping to a vector database may require keeping certain relationships in a “proper” database, in order to make sure that the connections between them are maintained. For example, we don't want to have the player's items mysteriously disappear and reappear based on the feelings of the vector database's clustering algorithm.

License: CC-BY-SA-4.0.

Written by: @[email protected]

Published: 2024-04-04T21:57:22+02:00

I have reorganized the links on the micromobility pages and removed the level of nesting of the electric-vehicles directory. I also finally filled in the “Why?” page.

Section: Micromobility Electric Scooters: Why? Electric Scooters: Safety

License: CC-BY-SA-4.0.

Written by: @[email protected]

Published: 2024-04-02T22:09:49+01:00

About 4 months ago, I was laid off due to my company losing a large chunk of their customer base (itself due to the recession/inflation/take your pick). I started applying to new roles immediately, confident that my 15 years of experience in the software industry would make this an easy endeavor. I was wrong. I thought that much of my work being available as open source projects online would be enough to demonstrate my skills to potential employers. I was wrong on that too.

The Job Hunt

It took four months and about 55 job applications to find a new role. In the end, I found a job at a great company full of great people. They don't have a ridiculous interview process or use coding tests. Their offer came first, and it was also a company that I had hoped I'd get a job at in the first place! Lucky me!

Their process was:

  • 1 hour introductory interview.
  • 1 hour technical interview.
  • A final references check (no action required on my part).

The entire process was essentially a vibe check to see if the company and I have similar values, and also a chance for us to talk in-depth about their platform and the tech behind it. Of course, it was also a chance for them to get to know about my skills, and for me to get to know about their situation and how they do things.

The recruitment process for this position took about a month, but only because of delays caused by external factors. The actual decision was made after 2 weeks, and the rest of the formalities took a bit longer. At the time I signed my new employment contract, I was still in another active recruitment process that had been going on for 6 weeks. Unlike the place I joined, this other company was still actively engaged in the hiring process (interviewing other candidates, making final decisions, etc).

Endless Interviews

On the same day that I signed my employment contract, the other company said that it would take them another week to reach a decision. That brings the total length of time for this other job application to 7 weeks.

Yes, 7 weeks.

The interview process began around mid-February, and consisted of the following:

  • 30 minute introductory call.
  • 1 hour technical interview/discussion.
  • Technical assignment (admittedly: fairly-scoped, at least).
  • 1.5 hour interview consisting of presenting the assignment and a systems design discussion.

After the last stage, there would have been a final formalities interview with a member of management. That makes 6 total steps! Or 5, if you consider the assignment review and systems design interview one event.

Just ... What?

I've only interviewed a few times since starting my professional career, as I tend to stay at one place for 4+ years. And each of those times, I've only had one or two interviews before getting an offer or rejection. Things have changed in the past decade. Almost every role I interviewed for during this job search required some variation of the complicated process detailed above. I didn't really have a choice, so I didn't decline most of those companies.

The Worst Offenders

Sometimes the tests would be before any further interviews, and other times they'd be after. The process above wasn't even the worst one. Among the businesses employing a convoluted interview process, there were a few places I actually declined to continue after learning about their hiring process. They had even MORE steps than the above process.

Highlights include:

  • Multiple coding tests, including a leetcode-style algorithms test and a domain-specific “service implementation.”
  • Intro call not considered part of the recruitment process, and a psychological “soft skills” test + coding test would be administered before a series of 3 interviews.
  • Two time-limited live coding tests for a position that expected US eastern time availability from central Europe (i.e. work until 8pm every day).

A Sane Interview Process

As explained above, the role I ended up signing for had a hiring process consisting of two interviews. The first was with the director of software engineering and was somewhere between an intro call, vibe check, and technical interview. It felt like talking about software day jobs while hanging out at a bar.

The second interview was technically (ha) a technical interview, but it had much the same vibe as the first. A few formal questions about how I would handle scenario X or Y were asked, but otherwise it was very smooth and very laid-back.

There were no tests. No endless processes that linger for weeks and weeks. The final step was to check my references, and that was it.

Everybody is FAANG!

Many companies today seem to think that they're Google or Facebook. A 20-man startup demanded refactoring and implementation of purposefully bad code at multiple layers of a web application in a domain I was unfamiliar with. This took me about a week, and then they said my code wasn't senior-level quality. Right. They didn't even do me the courtesy of reviewing it with me in person.

If I had more options during the job search, I would have immediately and politely declined any recruitment process that involved a take-home test. Unfortunately, almost every company in this country seems to have a take-home test. There was only one interview process here that didn't, consisting of two interviews (I was ultimately rejected, which was fine, because it was not a good cultural fit).

Many businesses seem to have an unspoken expectation that they are the only place to which you are applying. Perhaps I should've started giving my hourly rate when presented with a test. I don't think anyone would've taken me up on it.

The Layoffs of 2024

The software job market has shifted—in many places—to the advantage of employers. With mass layoffs at the big tech firms, and smaller firms following suit (either because they want to, or have to), there's a lot of competition for new roles. That allows companies to be selective in who they recruit. And perhaps they HAVE to be selective. With coding boot camps and the rise of generative AI, many people can just BS their way into a job they can't actually perform.

The demand for software engineers where I currently live is actually still very high. Yet, many businesses employ a ridiculously rigorous recruitment process. Why? Likely because of the dearth of CAPABLE candidates, and it's apparently difficult to find a person who can actually prove that they're capable.

But this approach can and does backfire. Not only does it irritate candidates (see: this entire blog post), but companies can also lose out on good talent. The company that spent over 6 weeks taking me through their recruitment process lost any chance of having me simply because they were too slow! With every business wanting candidates to do these tests and numerous interviews, I had to be picky about which ones I spent my time on.

I have a life and family, and free time is in very short supply. I can't just sit down for 8 straight hours and work on contrived programming scenarios all day. On the rare occasions I CAN sit down for 8 straight hours and work on contrived programming scenarios, I want to work on my OWN contrived programming scenarios.

That allowed me to create things like gemfreely ...

... or the AI-driven text adventure game.

Standardization of Industry

The software industry is transforming, and not necessarily for the better. It's one of the only industries where this kind of ridiculousness is prevalent. One way to fix it could be to require actual licensing and testing for one to call themselves a software engineer. Actual engineers of physical materials have to do this, and for good reason. Broken software is usually less dangerous than say, a broken bridge, but the principle behind the idea is the same. Software permeates more and more of our everyday lives, and regulation is bound to happen at some point. We are seeing it already with efforts in Europe to apply the CE marking to software products.

A tiered certification system would be wonderful. The vast majority of developers would probably have some basic certification that demonstrates they are knowledgeable about software design and can provably engineer a system. More specialized and intensive certifications would be required for high-stakes industries like finance, healthcare, rocketry, etc. This would hopefully make most of this ridiculous interviewing and testing go away. Ideally, interviews would be more about cultural fit and vibe checks, which is a very important factor. Perhaps even more important than raw skill.

Lessons Learned

This job search was largely an exercise in frustration, and a reminder of what happens in situations where there is an imbalance of power between two parties. To be fair, I had plenty of interviews. Getting interviews was not the problem. Advancing further in the application process usually was..

I didn't keep super detailed records of the job search, but I kept enough data for some rough numbers.

  • Of ~55 job applications, I had ~17 interviews.
  • Of those 17: 4 advanced to final interview stages.
  • Of those 4: 1 offer was given, 1 ended in rejection. 2 ended in limbo.
  • Of the original 55: ~13 applications were ghosted completely.

My positive response rate (i.e. getting an interview) was around 30%. Most of the 17 interviews I had were intro calls only, and the recruitment process halted due to one of the following:

  • Them declining to move forward after the intro call.
  • Them declining to move forward after a coding test or technical interview.
  • Me declining to move forward with the application.

What lessons did I learn from the application process?

  • You don't need a LinkedIn account to get an interview!
  • It doesn't take long to write a cover letter.
  • Coding tests always take longer than they say.

Cultural Fit: a Performance

In many ways, it's all a performance: the interviews, the coding tests, all of it. And it's a performance that we've all convinced ourselves we need to do in order to succeed. The number of what I'd call “genuine interactions” during this job search was quite low. These were almost always at the places where my application advanced to final stages. Many of the other interviews felt rigid and “overly professional.”

I suppose it's a difference of personality. Different people fit in with different working cultures. For me, “professional” doesn't mean overly rigid or formal. In fact, it means rather the opposite. I find that self-discipline and an innate dedication to success pair rather naturally with a relaxed work environment.

In a company composed of highly motivated and knowledgeable individuals, success will usually follow. It's an organic, infectious culture, in the best way possible. The team self-organizes around completing the task at hand, and motivation flows from supporting one another and seeing concrete success. In my experience, at my past 3 jobs, this has always led to a tight-knit team that knows how to succeed AND have fun.

This job search taught me exactly what I should look for in a company, and what to avoid.

During the interview process:

  • A rapport between the candidate and interviewer(s) needs to be established during recruitment.
  • If initial interactions don't feel right, you likely won't fit in.
  • What feels right to one person may not feel right to another.

Coding Tests: the Magic Incantation

The coding tests, in particular, felt like guessing the correct mystical incantation that the interviewers wanted, in order to advance. I know my skills and what I am or am not capable of. In the test that I failed, my code style was not enough to their liking, and they said my unit tests were not complete enough.

But how far should I need to go? It's a simplified test scenario that shouldn't require fully production-grade code. Many interviewers even emphasize that point. But if you don't put enough effort in to make it complete, you could easily miss the one thing that they silently expected you to do.

This job search taught me:

  • You should avoid these tests.
  • If you can't avoid them, you shouldn't spend too much time on them.
  • Decline tests that seem overbearing or overly complex.
  • Be THOROUGH on any test you decide to complete (which might require spending time).

Are the Tests Necessary?

If you've made it this far in the post, you can probably guess that I despise coding tests. Despite that, I think they are sometimes necessary. They ARE useful for filtering out those who don't know how to actually develop software. This doesn't mean they should be used all the time, or as a “first line of defense.” If a candidate has code out in the open, it should be easy to evaluate their skills. Someone who has a demonstrated track record of contributions to open source projects and creating their own well-documented software shouldn't be subject to a coding test.

If a test MUST be employed:

  • It should focus only on what would be day-to-day problems.
  • It should not be long.
  • It should have a narrow focus, not require a full implementation of all parts of the stack.

One of the tests I did met these requirements. It took me perhaps 8 hours over 3 days, and it was focused very specifically on the company's message passing setup. No database was required, and my test harness was a jQuery-powered web UI I yoinked from a 10 year old Spring tutorial.

In contrast, the test I failed met only the first requirement. It WAS focused on the company's day-to-day problems, but it was wide in scope and took many hours. It involved cleaning up and implementing a miniature service with an N-tier architecture.

Conclusion

Job hunting sucks. Job hunting when you don't have a job can be demoralizing and make you question your sanity. I was fortunate enough to have 3 months of severance (thanks, European workers' rights laws!), and only needed to cover one month with the final severance + unemployment benefits. I also got a LOT of practice interviewing, and I learned exactly what I do and do not want in a job.

I wish I didn't have to go through so much frustration and rejection to learn these lessons, but it is what it is. In the end, I am employed at a place that seems like a very good fit and that will give me a chance to make an impact. I am happy.

License: CC-BY-SA-4.0.

Written by: @[email protected]

Published: 2024-03-28T12:06:27+01:00

This is a test for webmentions. It should only affect the HTML site.

Test 1 Test 2 Test 3 Test 4 Test 5 Test 6 Test 7 Test 8 Test 9 Test 10 Test 11 Test 12 Test 13 Test 14 Test 15 Test 16 Test 17 Test 18 Test 19 Test 20 Test 21 Test 22 Test 23

License: CC-BY-SA-4.0.

Written by: @[email protected]