bjornsno

@bjornsno@lemm.ee
2 Post – 59 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...

Currently live in the Republic of Ireland and I have no idea what you're talking about? Were you here on Saint Patrick's Day? There's a significant amount of Palestinian flags in windows here for pretty obvious reasons but other than that I don't think I've seen a flag since, again, Paddy's day.

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...

The sign actually would give me an increased sense of security yeah.

Obviously a lunatic out to do a mass shooting would disregard the sign but your average gun wielder might be offended and take their business elsewhere – and statistically that's the one who's more likely to shoot me. That's my logic as a Norwegian who's lived there for just a year anyway.

22 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...

I mean, that still allows zendesk to reply with "oh yeah that's also why we're not paying the bounty"

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.

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.

Fair enough, though a person with a gun is much more likely to shoot me than a person without a gun. Any measure to reduce the amount of people in my vicinity carrying guns has my full support. If 1/1000 (number pulled out of my ass obviously) gun owners end up shooing someone, and you reduce the amount of people around me carrying guns from 1000 to 10, you've just dramatically increased my statistical probability of living a full life.

I actually looked and couldn't find the murder rate in the population of gun owners with basic googling but the actual number doesn't matter when it's being compared to 0.

13 more...

Look are you really trying to argue that the amount of people with guns in my vicinity is irrelevant to my chances of getting shot?

4 more...

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.

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

Big Giant Circles - The Glory Days

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.

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!

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...

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.

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...

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.

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.

The question was whether or not a sign saying guns not allowed at a mall would make me feel more safe there. I would see them, I might bump into them, it's a mall. The argument that most of them are sane and reasonable doesn't reassure me much when we're talking about people with a magic kill button.

4 more...

You've done your division twice there, it seems. The ~45000 is the number after you take away the suicides.. So pretty much 1/2000, so I guess I was pretty close.

Of course the only correct number of gun deaths among civilians is 0, do you disagree with that? As for your comparison to vehicular deaths, let's remember the context here. The question is whether or not I feel safer in a place that doesn't allow guns or one that does. So you should really be asking if I think it's better to walk on the sidewalk or in the road shared with cars. Of course I might still get hit by a car on the sidewalk, but where would you feel safer?

4 more...

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()