danielquinn

joined 2 years ago
[–] danielquinn@lemmy.ca 6 points 3 days ago (3 children)

This all appears to be based on the user agent, so wouldn't that mean that bad-faith scrapers could just declare themselves to be typical search engine user agent?

[–] danielquinn@lemmy.ca 7 points 3 days ago (6 children)

I've been thinking about setting up Anubis to protect my blog from AI scrapers, but I'm not clear on whether this would also block search engines. It would, wouldn't it?

[–] danielquinn@lemmy.ca 3 points 4 days ago (1 children)

Was it "social media" or was it specific tech companies trading rage for clicks? I find it hard to believe that Mastodon & Lemmy would be comparable to X & Facebook in this area.

[–] danielquinn@lemmy.ca 5 points 4 days ago* (last edited 4 days ago)

I use them quite heavily in combination with Cookie Autodelete. I then create a separate profile for each surveillance capitalist service I work with. So for example, here's my list of containers:

A screenshot of my container list

Every time I visit one of these sites, Firefox opens them in the respective container, and the cookies they create are isolated to that container. When I'm in the LinkedIn container, Cookie AutoDelete nukes every cookie that isn't from LinkedIn (including Google, GitHub, etc.). When I'm not in any container, all cookies are deleted everywhere.

Basically it's a nice way to leverage Cookie Autodelete without having to whitelist Big Tech for all my browsing.

[–] danielquinn@lemmy.ca 0 points 5 days ago

Yes. It would.

[–] danielquinn@lemmy.ca 17 points 5 days ago (11 children)

I should hope that they're right. We should return what was stolen.

[–] danielquinn@lemmy.ca 3 points 5 days ago

You do not need to pave green space to build homes. There's plenty of paved, ugly, low-density areas in desperate need of upgrades. The problem is the British public's obsession with that idea that everyone needs their own patch of grass and two cars.

[–] danielquinn@lemmy.ca 7 points 5 days ago (3 children)

As someone else said here, programmers are not a monolith. However, I've seen it multiple times on the job and in social media where programmers are using these tools to write code voluntarily. The code produced is often garbage, and I have to reject it at review time, but there are a lot of programmers using these things willingly.

[–] danielquinn@lemmy.ca 18 points 1 week ago
[–] danielquinn@lemmy.ca 40 points 1 week ago (8 children)

I had a job interview a few weeks ago where the lead developer straight-up said that he doesn't have any tests in the codebase because "it's just writing your code twice". I thought he was joking. Unfortunately he was not.

I didn't end up getting the job, perhaps because I made it clear that I thought he was very wrong. I think I dodged a bullet.

[–] danielquinn@lemmy.ca 6 points 1 week ago (1 children)

Why would they do that? The current system ensures that at least one of them will always be in charge, and they effectively have the same politics.

[–] danielquinn@lemmy.ca 4 points 1 week ago

They already do.

 

Evelyn Woods (aka eevee) has posted some venerable takes over the years (she also wrote my personal favourite rant of all time: "PHP: A Fractal of Bad Design"), but this one, where she connects industry's generic idea of "content" to what she refers to as a "Whatever machine" is really quite excellent.

 

I think a lot of people out there are fundamentally misunderstanding the reasoning behind the big tech companies (and their investors) pushing AI into everything. We want to believe that it's just tech bros trying to woo idiot investor cash into their systems — and it is that, a little bit anyway — but the big players: Microsoft, Google, Meta, and even Visa know exactly what they're doing and it's not good news for the rest of us.

Anyway, I wrote this a few days ago to break down the problem as I see it. I'm hoping it proves helpful.

 

I've been a Steam customer for a very long time, having spent a few thousand dollars over the years with them. Like many of you, I've got a (small?) group of games that I bought and barely-if-ever played, and I'm cool with that. As they say, piracy is a service problem, and Steam is just... easy.

That was until I bought my Deck. Suddenly, I had two devices on which I could play my games: my proper gaming rig upstairs and my Deck plugged into the TV downstairs.

I also however, have a kid that likes video games, so sometimes I let her play a few games on the TV... and that's where everything breaks down. If she's playing Lego Marvel on the Deck, my copy of Dyson Sphere Program flakes out upstairs with a warning that "someone else is playing a game, so this game will have to shut off" or some nonsense like that.

I'm suddenly face to face with the fact that I don't actually own my games and those few thousand dollars weren't spent on what I expected. It's... enraging to put it gently.

I can appreciate that there would be an attempt to prevent me from playing the same game on two devices (though I think that's bullshit too), but to prevent me from playing two different games on two different machines when both are legally purchased running on my own hardware is not ok.

 

I find the whole "Ctrl+b followed by another key" way of navigating tmux to be too cumbersome to warrant a switch away from something like Tilix where I can hit Ctrl+Alt+| and the screen splits vertically, or Alt+Left to switch to the terminal on the left. I think it's the mandatory release of all keys followed by more keys that does it.

Is there a way to tell tmux to understand that "Alt+Left means switch to the terminal on the left" and bypass the whole Ctrl+b song and dance altogether?

 

I'm a web developer, mostly with Python and have close to zero Java or Kotlin experience, but I want to build a bunch of tools for my phone where I can Share a URL (for example) to an app that simply takes that URL string and sends an HTTP POST request to a pre-arranged URL with some pre-arranged headers or POST data.

So basically I'm looking for an app that:

  • Lets you define a series of endpoints
  • Accepts share intents from other apps to then bring up a selector asking "Which endpoint do you want to send this to?", sends it, and exits.

It seems a little nuts that I should have to develop a separate app for each endpoint, when the app experience isn't really something I'm interested in. Can someone here point me to an app that already does something like this? I'd prefer a FOSS option if possible, but at this point I don't even know what to search for.

Example use-cases:

  • Send a YouTube URL to a service that downloads said video and stores it on a share on my VPN
  • Send a text snippet to a service that stores that snippet as a Markdown file for use as ideas for future blog posts
  • Send an article URL to a service that strips the ads and images out and saves a Markdown file for future reading.
 

cross-posted from: https://lemmy.ca/post/33126960

 

From time to time, often after I've restored from sleep or finished playing a Steam game, one of my CPU cores is pinned at 100% with no indication of what might be doing it. Running htop, btop, or GNOME system monitor all show the same thing: CPU0 at 100% while the rest are doing near-nothing, and no process in particular seems to be using those resources.

If I restart, it's back to normal, and sometimes I can play a game in Steam or let the computer go to sleep and it doesn't do this, but it happens often enough that's annoying/confusing so I'd like to know if there's a way to either (a) diagnose which processes are using which CPU cores, or (b) somehow "reset" the checking of these values to make sure that something's not just being misreported.

This is a desktop system running Arch & GNOME.

62
Developing with Docker (danielquinn.org)
submitted 9 months ago* (last edited 9 months ago) by danielquinn@lemmy.ca to c/python@programming.dev
 

I've been writing code professionally for 24 years, 15 of which has been Python and 9 years of that with Docker. I got tired of running into the same complications every time I started a new job, so I wrote this. Maybe you'll find it useful, or it could even start a conversation, but this post has been a long time coming.

Update: I had a few requests for a demo repo as a companion to this post, so I wrote one today. It includes a very small Django demo user Docker, Compose, and GitLab CI.

 

...so I found out how to fix it

 

It would seem that I have far too much time on my hands. After the post about a Star Trek "test", I started wondering if there could be any data to back it up and... well here we go:

Those Old Scientists

Name Total Lines Percentage of Lines
KIRK 8257 32.89
SPOCK 3985 15.87
MCCOY 2334 9.3
SCOTT 912 3.63
SULU 634 2.53
UHURA 575 2.29
CHEKOV 417 1.66

The Next Generation

Name Total Lines Percentage of Lines
PICARD 11175 20.16
RIKER 6453 11.64
DATA 5599 10.1
LAFORGE 3843 6.93
WORF 3402 6.14
TROI 2992 5.4
CRUSHER 2833 5.11
WESLEY 1285 2.32

Deep Space Nine

Name Total Lines Percentage of Lines
SISKO 8073 13.0
KIRA 5112 8.23
BASHIR 4836 7.79
O'BRIEN 4540 7.31
ODO 4509 7.26
QUARK 4331 6.98
DAX 3559 5.73
WORF 1976 3.18
JAKE 1434 2.31
GARAK 1420 2.29
NOG 1247 2.01
ROM 1172 1.89
DUKAT 1091 1.76
EZRI 953 1.53

Voyager

Name Total Lines Percentage of Lines
JANEWAY 10238 17.7
CHAKOTAY 5066 8.76
EMH 4823 8.34
PARIS 4416 7.63
TUVOK 3993 6.9
KIM 3801 6.57
TORRES 3733 6.45
SEVEN 3527 6.1
NEELIX 2887 4.99
KES 1189 2.06

Enterprise

Name Total Lines Percentage of Lines
ARCHER 6959 24.52
T'POL 3715 13.09
TUCKER 3610 12.72
REED 2083 7.34
PHLOX 1621 5.71
HOSHI 1313 4.63
TRAVIS 1087 3.83
SHRAN 358 1.26

Discovery

Important Note: As the source material is incomplete for Discovery, the following table only includes line counts from seasons 1 and 4 along with a single episode of season 2.

Name Total Lines Percentage of Lines
BURNHAM 2162 22.92
SARU 773 8.2
BOOK 586 6.21
STAMETS 513 5.44
TILLY 488 5.17
LORCA 471 4.99
TARKA 313 3.32
TYLER 300 3.18
GEORGIOU 279 2.96
CULBER 267 2.83
RILLAK 205 2.17
DETMER 186 1.97
OWOSEKUN 169 1.79
ADIRA 154 1.63
COMPUTER 152 1.61
ZORA 151 1.6
VANCE 101 1.07
CORNWELL 101 1.07
SAREK 100 1.06
T'RINA 96 1.02

If anyone is interested, here's the (rather hurried, don't judge me) Python used:

#!/usr/bin/env python

#
# This script assumes that you've already downloaded all the episode lines from
# the fantastic chakoteya.net:
#
# wget --accept=html,htm --relative --wait=2 --include-directories=/STDisco17/ http://www.chakoteya.net/STDisco17/episodes.html -m
# wget --accept=html,htm --relative --wait=2 --include-directories=/Enterprise/ http://www.chakoteya.net/Enterprise/episodes.htm -m
# wget --accept=html,htm --relative --wait=2 --include-directories=/Voyager/ http://www.chakoteya.net/Voyager/episode_listing.htm -m
# wget --accept=html,htm --relative --wait=2 --include-directories=/DS9/ http://www.chakoteya.net/DS9/episodes.htm -m
# wget --accept=html,htm --relative --wait=2 --include-directories=/NextGen/ http://www.chakoteya.net/NextGen/episodes.htm -m
# wget --accept=html,htm --relative --wait=2 --include-directories=/StarTrek/ http://www.chakoteya.net/StarTrek/episodes.htm -m
#
# Then you'll probably have to convert the following files to UTF-8 as they
# differ from the rest:
#
# * Voyager/709.htm
# * Voyager/515.htm
# * Voyager/416.htm
# * Enterprise/41.htm
#

import re
from collections import defaultdict
from pathlib import Path

EPISODE_REGEX = re.compile(r"^\d+\.html?$")
LINE_REGEX = re.compile(r"^(?P<name>[A-Z']+): ")

EPISODES = Path("www.chakoteya.net")
DISCO = EPISODES / "STDisco17"
ENT = EPISODES / "Enterprise"
TNG = EPISODES / "NextGen"
TOS = EPISODES / "StarTrek"
DS9 = EPISODES / "DS9"
VOY = EPISODES / "Voyager"

NAMES = {
    TOS.name: "Those Old Scientists",
    TNG.name: "The Next Generation",
    DS9.name: "Deep Space Nine",
    VOY.name: "Voyager",
    ENT.name: "Enterprise",
    DISCO.name: "Discovery",
}


class CharacterLines:
    def __init__(self, path: Path) -> None:
        self.path = path
        self.line_count = defaultdict(int)

    def collect(self) -> None:
        for episode in self.path.glob("*.htm*"):
            if EPISODE_REGEX.match(episode.name):
                for line in episode.read_text().split("\n"):
                    if m := LINE_REGEX.match(line):
                        self.line_count[m.group("name")] += 1

    @property
    def as_tablular_data(self) -> tuple[tuple[str, int, float], ...]:
        total = sum(self.line_count.values())
        r = []
        for k, v in self.line_count.items():
            percentage = round(v * 100 / total, 2)
            if percentage > 1:
                r.append((str(k), v, percentage))
        return tuple(reversed(sorted(r, key=lambda _: _[2])))

    def render(self) -> None:
        print(f"\n\n# {NAMES[self.path.name]}\n")
        print("| Name             | Total Lines | Percentage of Lines |")
        print("| ---------------- | :---------: | ------------------: |")
        for character, total, pct in self.as_tablular_data:
            print(f"| {character:16} | {total:11} | {pct:19} |")


if __name__ == "__main__":
    for series in (TOS, TNG, DS9, VOY, ENT, DISCO):
        counter = CharacterLines(series)
        counter.collect()
        counter.render()
view more: next ›