26
12
27
74
28
11

Been running a screenshot pipeline for visual regression testing and hit something annoying — the same page renders slightly differently depending on the host OS. CentOS 7 vs Ubuntu 22.04 vs Alpine in Docker all produce different pixel outputs for identical URLs with identical Chrome versions.

The culprit is mostly font rendering. FreeType versions differ, fontconfig has different defaults, and some distros ship with subpixel antialiasing enabled while others don't. The result is text that's a pixel or two off, which is enough to trigger visual diff alerts on every single run.

Things I've tried:

  • Pinning the Chrome version — helps with browser-level rendering but doesn't fix OS-level font differences
  • Using --font-render-hinting=none — reduces cross-platform variance significantly but text looks slightly worse
  • Installing identical font packages everywhere — tedious but necessary. fonts-liberation + fonts-noto covers most cases
  • Running everything in the same Docker image — the nuclear option, but it works. If every environment uses the same base image, font rendering is identical

The Docker approach is what I settled on. Built a custom image with Chrome, all the fonts I need, and locked the FreeType version. Screenshots are now consistent across dev machines, CI, and production.

Curious if anyone else has run into this and found a cleaner solution. The font rendering inconsistency feels like something that should have a standard fix by now but apparently doesn't.

Side benefit of fixing this: once your baselines are stable, visual regression testing actually becomes useful instead of a noise generator.

29
12

Key takeaway: High-throughput organizations are highly sensitive to long cycle times, potentially indicating that bottlenecks like review wait times are particularly acute for these orgs. For lower-throughput teams, there is no meaningful relationship between cycle time and throughput, suggesting bottlenecks exist elsewhere.

30
16

Communities for example with YouTube (or Fediverse) videos that explains innovative concepts or tools.

Or discussions about new up and coming software.

Or talks about industry standard tooling and procedures.

31
20

I made Open Terminal, a global chat where everyone shares the same space.

It uses WebSockets for real time messaging, so messages appear instantly as people join and chat.

The interface has a terminal inspired vibe, with a few simple commands you can use to interact with the chat.

I built it mostly because I thought it would be fun to see what happens when you put everyone in one chat room.

People on X and Hacker News seemed to love it, so I wanted to share it here too.

Open Terminal

32
13
33
-28
submitted 1 week ago* (last edited 1 week ago) by inari@piefed.zip to c/programming@programming.dev
34
89
submitted 1 week ago* (last edited 1 week ago) by inari@piefed.zip to c/programming@programming.dev
35
17
submitted 1 week ago* (last edited 1 week ago) by Mexigore@lemmy.world to c/programming@programming.dev

Say I have a system that I want to enable or disable, what do you think is best: to write two separate functions EnableSystem() and DisableSystem() OR have a singular function with the parameter to indicate the desired state, SystemState(bool state)?

I was wondering if there is a standard for this or a preference?

I would argue that having two separate functions is better since different things might happen under those functions but what if it is the situation where it really is just as simple as a 1 or a 0. Example if we have an LED we want to turn on an off it would just be passing the value of the parameter state.

Situation one:

void LEDEnable() {
     GPIOPinSet(LED_PIN, true);
}

void LEDDisable() {
     GPIOPinSet(LED_PIN, false);
}

Situation two:

void LEDState(bool state) {
     GPIOPinSet(LED_PIN, state);
}
36
94

cross-posted from: https://feddit.org/post/34303745

The last three months have not looked good for Bun. It started as one of the most impressive individual engineering projects I have seen, but has now turned into this weird AI-powered creature with continuous false promises and an increasingly frustrated community.

37
27

This started as a joke and turned into something I actually use.

I work across a lot of git worktrees at once, and every terminal looked identical. I kept typing into the wrong one.

So now each session hatches an ASCII creature into the status line. It's derived by hashing the session id, so nothing is chosen and nothing is persisted anywhere - delete the cache and the same session draws the same creature. Some species are rarer than others and a few are shiny, which was a mistake, because I now open extra worktrees hoping for a good roll.

The face also tracks how tidy the worktree is: uncommitted files, unpushed commits, how far behind trunk you are. A small animal looking miserable about your working tree turns out to be more persuasive than any pre-commit hook I've installed.

Single static Go binary, no runtime dependencies. The status line executes once a second in every open session, so that path reads two small cache files and never shells out to git - the expensive work happens in a throttled background probe.

Mine, so take the enthusiasm with salt.

38
-23

Ambitious, humble, honest.

This has been an amazing development led by the mind behind Swift, LLVM and OpenCL. A language compiled to native code on CPU as well as GPU!

And no pretensions about growing the "right" syntax. It has Python's exact syntax because it is already familiar.

And they just made good on their promise of open-sourcing the full compiler. Hopefully, it has no mandatory dependency on Modular Max which is thier proprietary thing built on Mojo.

39
19
40
123
submitted 1 week ago* (last edited 1 week ago) by Vosh@programming.dev to c/programming@programming.dev

The ultimate gathering for the world's best office suite.

When: September 10—12, 2026

Where: Pordenone, Italy 🇮🇹

Why: To learn, have fun and plot against Microsoft Office

If you need a VISA, please get in touch with the organization team by sending an email at conference@libreoffice.org as soon as possible, to get an invitation letter.

If you need an accommodation, please get in touch at conference@libreoffice.org. The local tourism organization will handle requests based on your needs, providing an accommodation with an agreed discounted rate.

41
78

You can ignore it, tie it to unrelated company initiatives, or feign ignorance and simply not offer solutions that add to it. Or… you can adopt more above-board techniques such as Crawl/Walk/Run and the Reverse Farmer’s Rule, which reframe projects so that confronting tech debt is an upfront part of the plan.

42
38
submitted 1 week ago* (last edited 1 week ago) by Vosh@programming.dev to c/programming@programming.dev
43
-15
submitted 1 week ago* (last edited 1 week ago) by HaraldvonBlauzahn@feddit.org to c/programming@programming.dev

At the Linux Foundation’s Open Source Summit, the Linux creator argued that AI-written code claims are misleading — and warned that a wave of low-quality, AI-generated bug reports is quietly burning out the maintainers who keep open source running.

[...]

Speaking on stage, Torvalds said the framing misses an obvious historical parallel. Compilers have translated essentially all shipped source code into machine code for decades, he noted, yet no engineer describes their software as “compiler-written.” AI, in his view, belongs in the same category — a powerful productivity layer sitting on top of human design and understanding, not a replacement for it.

44
106
45
45
46
4
47
0
48
285
49
19

Hey, I'm trying to create a pipeline that takes files from a flat directory source/ that contains files with names formatted as yyyy-mm-dd-some-file-name.md and processes them with the output being created in destination/yyyy/mm/dd/some-file-name.md. I managed to string together an ugly script that converts the source path to destination path, but the problem is that make says that there is no rule to make the target. Here is my code so far:

SOURCE := $(wildcard source/*.md)
DESTINATION := $(foreach f,SOURCE,destination/$(shell echo $(notdir $(f)) | sed -E 's/^([0-9]{4})-([0-9]{2})-([0-9]{2})-(.*)\.md$$/\1\/\2\/\3\/\4.md/'))

$(DESTINATION): $(SOURCE)
	@mkdir -p $(dir $(shell echo $(notdir $@) | sed -E 's/^([0-9]{4})-([0-9]{2})-([0-9]{2})-(.*)\.md$$/\1\/\2\/\3/'))
	/bin/bash ./myscript.sh $< > $@

I believe that make sees that there are no target directories yet and just aborts the rule, but I'm not knowledgeable enough and just starting out with that tool. I would appreciate some guidance if any of you folks know a bit of Make.

50
33
view more: ‹ prev next ›

Programming

28283 readers
121 users here now

Welcome to the main community in programming.dev! Feel free to post anything relating to programming here!

Cross posting is strongly encouraged in the instance. If you feel your post or another person's post makes sense in another community cross post into it.

Hope you enjoy the instance!

Rules

Rules

  • Follow the programming.dev instance rules
  • Keep content related to programming in some way
  • If you're posting long videos try to add in some form of tldr for those who don't want to watch videos

Wormhole

Follow the wormhole through a path of communities !webdev@programming.dev



founded 3 years ago
MODERATORS