bjornsno

@bjornsno@lemm.ee
2 Post – 45 Comments
Joined 1 years ago

I know you didn't mean it like this, but the result from this line of thinking is that we only try to put women on equal footing with men in tech when it's convenient for men because times are good. Which in turn means we never put women on equal footing because the needs of men always come first.

Put differently women have to deal with being women in tech on top of times being desperate, men only have to deal with times being desperate. Things like this are why spaces like these are necessary in the first place, and if you break them down at the first discomfort you're not a working class hero fighting the capital, you're tearing down women and setting everyone back.

47 more...

Lol lawsuits for naming elected officials in a news article? Sounds like America.

6 more...

Quick feedback: your css transitions are way too long, opening the hamburger menu should not make me feel like I'm waiting for it to open.

Also you've gone for the card layout on the app list, however cards create the expectation that they are actionable yet clicking them does nothing. At least make the app names clickable.

2 more...

When individual humans reach a certain level of power and wealth they tend to self isolate. This is a natural response, they need to start to see themselves as different and set apart from regular humans, because the things they need to do to keep growing their wealth and power start to become increasingly inhuman.

Here's a link to an article full of the insane things billionaires have tried to justify, in their own little books, and these are just the things they are happy to share. The complete disconnect from their reality and ours becomes terribly pain to see once you read their thoughts.

Why is the joke with Java always factories? Factories are really super useful in a dependency injection context.

39 more...

Have you tried kitty? It's seriously nice if you can live with the occasional "oh no I sshed to a server that doesn't have the correct terminfo files and now none of the normal terminal navigation features work"

3 more...

Help I'm destitute, what should I do? Step one: buy Bitcoin.

My brother in Christ, that is dependency injection. Just because you don't want to call the spade a spade anymore doesn't make it not so.

7 more...

Not judging you for your reasons, but you don't speak for everyone so calm down with the "we" pronoun.

1 more...

This is great but I literally can't use the base app on my S20. Like clicking on Google search hits causes the app to freeze. Trying to scroll up on a page triggers a reload 30% of the time. I want to use Firefox but it's nowhere near good enough, and adding extensions on top of that state is not going to help.

8 more...

I feel like this wasn't even that long ago? I was quite surprised when my content suddenly started being sponsored by them again.

That... seems to be a bit of a leap. You've got to assume that challenged women are representative of the whole population. To issue a challenge you probably have some reason to suspect.

I'm using 555 open with hyprland. No issues and I can finally suspend and resume, using the NVreg_PreserveVideoMemoryAllocations=1 module param after being unable to all year.

Imo stick to amd. I was like you, I thought the Nvidia card would be an upgrade and I thought the rumors of how bad Nvidia was had to be at least a little exaggerated, but honestly it's a constant pita. Aside from the suspend issue I've had random minor system upgrades cause kernel panics and fry my boot more than once this year. That bug is still unresolved btw, their response time leaves much to be desired.

Having dockerized ollama just work is nice, but it's not worth it, and they seem to be close to a working vulkan based runner for that anyway.

Imo it's only a tool to understand and explain situations, not so much a tool to solve problems. Definitely understanding the forces that make up the conflict might help you solve a problem, but the solution will depend on what kind of forces are involved.

You can just get around this by using some css tricks to display the dollar and pound signs.

If I may ask, why do we want to enable tearing now? There are pages and pages across the wikis on how to fix tearing...

2 more...

If you want to do this, what you probably want is to pump your logs into a log drain, something like betterstack is good. They then allow you to set up discrepancy thresholds and can send you emails when something seems to be out of the ordinary. There's probably a self hosted thing that works the same way but I've never found a simple setup. You can do the whole Prometheus, influxdb, grafana setup but imo it's too much work, and then you still have to set up email smtp separate from that.

You're gonna have a tough time talking to others about your code if you don't agree on common terminology. Function invocation is just function invocation, it doesn't say anything about the form of the parameters or composition. Dependency injection is a well known and commonly understood method of facilitating decoupling and composition by passing a function's dependencies as parameters. From your comments you're talking about the second, but refusing the name, for... reasons?

2 more...

You should definitely figure out some infra as code system now while it's manageable. Normally I'd recommend docker-compose as it's very easy to learn and has a huge ecosystem, but since you're using proxmox you might need to look at ansible like the other commenter said. Having IaC with git makes it so much easier to test new stuff, roll changes back, and all that good stuff, in addition to solving your original problem of forgetting what is running where.

Just find the simplest IaC solution possible. Unless you are gunning for a job in infrastructure you don't need to go into kubernetes or terraform or anything like that, you just need something reproducible that you can easily understand and modify.

2 more...

Oooh look at Epicure over here, just casually getting in his 8 hours of sleep. Brag more king.

On a serious note, the capitalists have commercialized all of this. Getting enough to eat might be doable with a meager income technically, but eating well and healthy is expensive. Getting a good bed in a nice living space that facilitates rest well costs a fortune. So you need two middle class plus jobs to afford it for yourself and your partner, which comes with its own set of stressors.

The small things in life are also actively commercialized. A coffee with friends? Better save up for the chain cafe prices. A movie night in? Remember to pay your Netflix subscription. A hike? Gotta pay for gas to get there, depending on where you live. I'm not saying it's impossible to have small things for free/cheap, it's just not that easy. There's also going to be constant social pressure, through advertisement or influencers, first or secondhand, to do all the things they tell you will make you more happy. You'll have to actively resist that, which in turn can cause you to become distanced from your social circle.

God forbid you get sick, the health insurance and pharmaceutical industry will fleece you and in some countries leave you with crippling debt, making all of the above out of reach for you.

All of this to say: money isn't just something you have to chase after for the sake of it in our current society, it's an absolute necessity to try to have more than what you think you actually need in the moment to get by and enjoy the small things. It might sound cliche, but "society is like stacked against us, man" is actually a completely true statement.

This doesn't really install it, though, you can't update or permanently edit and config, set up users, or anything like that. I would guess OP wants something more like booting the ISO in a VM, allocating a thumb drive to that VM, and then installing a full system to it with a boot loader.

Guestbook didn't work, after recaptcha it just said POST failed. Oh and you need a visitor counter!

Big Giant Circles - The Glory Days

I'm between The Black Parade (the album) by My Chemical Romance, an alt rock opera masterpiece imo, and Hamilton, the Broadway cast recording. I feel like the former might not work as well when removed from its time, but I bet it still would blow my mind.

Oh for sure for sure. I just know that a lot of people use their homelab to learn skills that they can put on their resume when looking for a job. It's totally fair to over engineer your self hosting setup if that's your goal.

What are you talking about? At least in Java and PHP you can absolutely declare constructor and function parameters as interfaces. As you say that's exactly what they're for.

1 more...

Hey! Just popping in to tell you that Soren and Daniel have a podcast together called Quick Question, and it's really quite great.

Ah, fooled by the title yet again!

Came to write basically this. I would try caddy but my compose file is 600 lines long now and half of that is traefik labels, I can't be arsed with the migration.

I do have nightly off-site backups, that's true. Still, having the git repo be on the same machine doesn't seem right to me.

You asked for my python script but now I can't seem to load that comment to reply directly to it. Anyway, here's the script, I haven't bothered to upload the repo anywhere. I'm sure it isn't perfect but it works fine for me. The action for opening evolution when you click the tray icon is specific to hyprland so will probably need to be modified to suit your needs.

import asyncio
import concurrent.futures
import logging
import signal
import sqlite3
import sys
from pathlib import Path
from subprocess import run

import pkg_resources
from inotify_simple import INotify, flags
from PySimpleGUIQt import SystemTray

menu_def = ["BLANK", ["Exit"]]

empty_icon = pkg_resources.resource_filename(
    "evolution_tray", "resources/inbox-empty.svg"
)
full_icon = pkg_resources.resource_filename(
    "evolution_tray", "resources/inbox-full.svg"
)

inotify = INotify()

tray = SystemTray(filename=empty_icon, menu=menu_def, tooltip="Inbox empty")

logging.getLogger("asyncio").setLevel(logging.WARNING)
handler = logging.StreamHandler(sys.stdout)
logger = logging.getLogger()
logger.setLevel("DEBUG")
logger.addHandler(handler)


def handle_menu_events():
    while True:
        menu_item = tray.read()
        if menu_item == "Exit":
            signal.raise_signal(signal.SIGTERM)
        elif menu_item == "__ACTIVATED__":
            run(["hyprctl", "dispatch", "exec", "evolution"])
            # tray.update(filename=paused_icon)

        logger.info("Opened evolution")


def get_all_databases():
    cache_path = Path.home() / ".cache" / "evolution" / "mail"
    return list(cache_path.glob("**/folders.db"))


def check_unread() -> int:
    unread = 0
    for db in get_all_databases():
        conn = sqlite3.connect(db)
        cursor = conn.cursor()
        try:
            cursor.execute("select count(*) read from INBOX where read == 0")
            unread += cursor.fetchone()[0]
        except:
            pass
        finally:
            conn.close()

    if unread > 0:
        tray.update(filename=full_icon, tooltip=f"{unread} unread emails")
    else:
        tray.update(filename=empty_icon, tooltip="Inbox empty")

    return unread


def watch_inbox():
    while True:
        for database in get_all_databases():
            inotify.add_watch(database, mask=flags.MODIFY)
        while inotify.read():
            logger.info("New mail")
            logger.info(f"{check_unread()} new emails")


async def main():
    executor = concurrent.futures.ThreadPoolExecutor(max_workers=1)
    loop = asyncio.get_running_loop()
    check_unread()

    watch_task = asyncio.wait(
        fs={
            loop.run_in_executor(executor, watch_inbox),
        },
        return_when=asyncio.FIRST_COMPLETED,
    )
    await asyncio.gather(watch_task, loop.create_task(handle_menu_events()))


def entrypoint():
    signal.signal(signal.SIGINT, signal.SIG_DFL)
    signal.signal(signal.SIGTERM, signal.SIG_DFL)

    try:
        asyncio.run(main())
    except Exception as e:
        logger.exception(e)


if __name__ == "__main__":
    entrypoint()

While this sounds right, it is probably a path to depression. At this point I'm pretty much qualified for any web dev job I want, and I know I'd be one of the best hires they ever made, but I also know the interview gods are fickle bastards. I can easily see myself getting a string of rejections and taking a hard hit to my mental health.

An interview is not a fair assessment of your skill and fit, it's just the best tool we have for the job. Therefore, don't let the outcome of interviews tell you how good you are or what you're ready for. Imo you kinda just know these things.

As for OP, sounds like they're maybe still learning rule 1 of software development; the job is 90% figuring out how to do shit, it's not actually so much about what you already know, although that certainly helps with the figuring out part. Once you've figured out how to figure out most of the problems that come up in your job, you're more than ready for a new challenge, if you want one.

I manage computer systems.

  • What's a computer? It's a fancy calculator that can make moving paintings very quickly
  • What's a calculator? A fancy automatic loom that can do math like an abacus
1 more...

Thought you were OP for a second there, as they were talking about composability. Whether it's dependency injection or not depends on what shape your parameters take. If you're doing functional programming and you're passing handlers and connections etc. as params, that's dependency injection. If you're only passing strings and objects and such and the function has to do a bunch of logic to decide how to handle its params, that's not dependency injection.

I'm sorry to be the one to break it to you but every job becomes a job, if you know what I mean. I'm my own boss, work from home, doing programming which is my passion. I still love programming, but work is work. Not saying you shouldn't try to find enjoyment in it, just don't want you to expect it to be fun as shit no matter what the job description says. Just try to find one that doesn't make you miserable and focus on that work life balance.

I'll try that, but since I haven't been able to find any related issues I'm pretty sure it's a configuration error on my part. Hehe the regretfully long post. Next step will probably be to open an issue on authentik's GitHub but since I think it's a pebkac I would prefer not to waste their time.

I honestly just did it to try to get cleaner logs having the container only be responsible for the proxying.

Again The issue on the repo. The developers recommend just using the app feature of the browsers to get similar functionality without the security concerns.

I'd be a bit concerned with having the git repo also be hosted on the machine itself. If the drives break it's all gone. I could of course have two remotes but then pushing changes still becomes a multi step procedure.

4 more...

If you look at the repo, the very first line in the readme links to an issue that briefly explains why you should care.

Unmaintained software comes in two categories:

  1. The software is done. It does exactly what it was meant to do and it was written in a language and in such a way as to be pretty future proof. Examples are some basic code libraries or command line utilities.
  2. The software had to be updated all the time to keep up with changing environments and security problems, so the dev got sick of it and dropped it. Or a better solution came along so the developer felt free to finally drop the burden.

Nativefier falls in the second category and the second clause. Don't use it.

2 more...