@juliank@mastodon.social
@juliank@mastodon.social avatar

juliank

@juliank@mastodon.social

Debian Developer, Ubuntu Core Developer, Software Engineer II at Canonical. Your friendly neighborhood APT maintainer. Vegan. He/him.

Love cooking, cycling, walking, music, and netflix.

This profile is from a federated server and may be incomplete. Browse more on the original instance.

juliank, (edited ) to random
@juliank@mastodon.social avatar

Just uploaded a new build of @keepassxc to Debian unstable, this adds a separate keepassxc-minimal package, and a transitional package that depends on keepassxc-full | keepassxc-minimal; so people upgrading (or new installing) will get the full experience again.

This is still 2.7.7, mind you. 2.7.8 I need to go look at some day when I'm not killing myself with apt solver work!

juliank, to random
@juliank@mastodon.social avatar

Fresh off the presses: New blog post: The new APT 3.0 solver

https://blog.jak-linux.org/2024/05/14/solver3/

Comments here.

juliank, to random
@juliank@mastodon.social avatar

FWIW, this is the confusion matrix of characters that APT hashes the same.

0 '\x00' ' '
1 '\x01' !
2 '\x02' "
3 '\x03' #
4 '\x04' $
5 '\x05' %
6 '\x06' &
7 '\x07' '
8 '\x08' (
9 '\t' )
10 '\n' *
11 '\x0b' +
12 '\x0c' ,
13 '\r' -
14 '\x0e' .
15 '\x0f' /
16 '\x10' 0
17 '\x11' 1
18 '\x12' 2
19 '\x13' 3
20 '\x14' 4
21 '\x15' 5
22 '\x16' 6
23 '\x17' 7
24 '\x18' 8
25 '\x19' 9
26 '\x1a' :
27 '\x1b' ;
28 '\x1c' <
29 '\x1d' =
30 '\x1e' >
31 '\x1f' ?
64 @ `
91 [ {
92 \ |
93 ] }
94 ^ ~
95 _ '\x7f'

juliank, to random
@juliank@mastodon.social avatar

So what you may possibly really want is:

  1. Mark the roots
  2. Determine the transitive closure of the roots
  3. Apply unit propagation
  4. Order the version objects in the transitive closure
  5. Order the possible solutions for each dependency
  6. Order all dependencies (clauses) by a static ordering functions
  7. while (unsolved dependency):
    apply unit propagation
    choose the first dependency that is unsolved
    make a choice
    try the choice or try not the choice.
juliank, (edited ) to random
@juliank@mastodon.social avatar

Nutella, arguably the most prominent Italian product on the planet, will get a vegan version in autumn. 👀

juliank, to random
@juliank@mastodon.social avatar

I really like the concept of watch literals in current sat solvers but I am worried to some extent if I can achieve the same ordering constraints I currently have with the priority queue of unresolved dependencies (clauses).

In a 2 watched literals solver, backtracking is free. In solver3 it is somewhat unreasonably expensive.

juliank, to random
@juliank@mastodon.social avatar

The AGPL is stulid.

Stalwart mail server is Affero GPL licensed. Can you legally use it? Remember that you need to point each client at the specific source code the binary was built from.

This provision isn't restricted to protocols intended for humans. You need to advertise the source code location to everyone connecting over JMAP, SMTP,IMAP,POP3 - whatever protocols you use.

If the protocol has no means to advertise the source code, you are fucked. You have no way to be compliant.

juliank, to random
@juliank@mastodon.social avatar

This apt-cache why command is different from what you expect but it's a PoC.

$ apt-cache why inlibmutter
role-desktop:amd64 -> role-desktop:amd64=2024.03.04.1736.48 -> gnome-shell-extension-manager:amd64=0.5.1-1 -> gnome-shell:amd64=46.1-1ubuntu1 -> gir1.2-mutter-14:amd64=46.1-2ubuntu1 -> libmutter-14-0:amd64=46.1-2ubuntu1 -> libmutter-14-0:amd64

juliank, to random
@juliank@mastodon.social avatar

apt-cache can't tell you here why pbuilder is installed:

$ aptitude why pbuilder
i ansible-role-devel Depends ubuntu-dev-tools
i A ubuntu-dev-tools Recommends pbuilder | cowbuilder | sbuild

$ apt-cache why pbuilder
pbuilder:amd64=0.231build1 -> pbuilder:amd64

That's because pbuilder is autoremovable under the current solver3 regime, so it didn't find a reason to keep it - it picked sbuild to satisfy the Recommends above (as sbuild is manually installed).

juliank, to random
@juliank@mastodon.social avatar

I probably ought to publish the ignition file configuring this machine with its docker, home-assistant, mosquitto, database, unifi, whisper, and weather service containers.

Or whatever that was

juliank, to random
@juliank@mastodon.social avatar

It's very hard to find stuff about SAT solving, you just get "how to master your SATs"

juliank, to random
@juliank@mastodon.social avatar

Binary search for dependency solution: Given a dependency A->1|2|3|4|5|6, we:

  1. Queue the common dependencies of all choices.
  2. Divide and conquer in log(N) branch points. Take the first half of dependencies, and try to solve their common dependencies. If it fails, backtrack to the 2nd half.
  3. Repeat until we have installed a single dependency.

I don't know if this makes sense. The first step certainly does, but the rest may be to crazy if the packages are not strongly related.

juliank, (edited ) to random
@juliank@mastodon.social avatar

I think I had a revelation about source-based pinning upgrading. It's path-dependent.

It's like if you add Breaks: binary (<< ${version-of-the-binary-in-the-source}) for each binary in your source package.

So you have three binaries A,B,C, they all depend on each other, e.g. A depends: B (>= 1), C (>= 1).

Now version 2 comes along and removes C; you are left with A Depends: B (>= 2), B: Depends: A (>= 2).

Upgrading either A or B will upgrade the other package, but C can remain installed.

juliank, to random
@juliank@mastodon.social avatar

I've said before but my goal is to make the pinning source-package based.

In practical terms this is equivalent to applying the 100 pin to all binaries in the source version matching an installed binary version.

This also means if you have foo=1 installed, foo/bar=1 in the repo, and foo/bar=2 in another pinned to 1, no longer would bar=2 bar the candidate (but foo=1), but bar=1 would be the candidate as bar=2 is pinned lower than installed foo=1

juliank, to random
@juliank@mastodon.social avatar

Heh I was hacking on APT solver too much so I didn't notice the ethernet connection from router to switch had degraded to 100 Mbit/s. It downgrades every couple months, not sure hwy.

juliank, to random
@juliank@mastodon.social avatar

Planning to add an AppArmor profile to APT using hats to restrict ourselves when running in the normal directories.

Notably none of apt, hooks, dpkg will have any access to /home.

Hooks get write access to /var and temporary directories and read access to /usr/etc.

APT process itself needs at least four different hats to switch between downloading indices, building the cache, downloading debs and installing them.

juliank, to random
@juliank@mastodon.social avatar

Play Emerson, Lake & Palmer on bright headphones to get good percussion/cymbal work impressions.

juliank, to random
@juliank@mastodon.social avatar

Why is the answer to "do you mind"

"Yeah sure"

And not "no"

juliank, to random
@juliank@mastodon.social avatar

One thing that becomes really interesting are versioned Recommends. Consider

X Recommends: A (>= 2) | B

Let X become available before A=2. The solver will install B.

Arguably a better solution is to ignore lower bounds on Recommends and instead optimize for "eventual satisfaction". i.e. we install A=1 now because A=2 will become available later and then satisfy the Recommends.

juliank, to random
@juliank@mastodon.social avatar

PubGrub is an interesting dependency solver, but it's worth pointing out the field of language package managers it is for is quite different from APT's use case.

PubGrub primarily focuses on version selection, because you'll have hundreds of versions per package and you need to navigate all the package's requirements to find the right set of versions.

APT is different. Each package normally has one, at most two versions. Instead you have lots of package choices to make.

juliank, to random
@juliank@mastodon.social avatar

solver3 found the problem so complex it didn't find the full solution, running it again made it find more upgrades, huh.

juliank, to random
@juliank@mastodon.social avatar

Ratatouille, or: olive oil with vegetables

juliank, to random
@juliank@mastodon.social avatar

Shoot:

could not balance this transaction:
real postings' sum should be 0 but is: 0.0083659€

And my Go decimal class knows that there is a value != 0 left but it just prints out 0.

juliank, to random
@juliank@mastodon.social avatar

I'm going to say it's still mighty impressive how well Google performs compared to DuckDuckGo.

DuckDuckGo gives me 3 results, ignoring some terms.

Google I give less terms, it probably correlates that with all my emails, and then gives me the relevant results straight.

Not only does it find any, it also shows them directly.

It's a marvelous piece of engineering no privacy focused search engine can even remotely compete with.

juliank, to random
@juliank@mastodon.social avatar

I seem to have forgotten to wipe down the knife yesterday so now it has a black tip. Oh noes.

image/jpeg

  • All
  • Subscribed
  • Moderated
  • Favorites
  • megavids
  • mdbf
  • ngwrru68w68
  • InstantRegret
  • magazineikmin
  • thenastyranch
  • rosin
  • khanakhh
  • tacticalgear
  • Youngstown
  • slotface
  • Durango
  • kavyap
  • DreamBathrooms
  • JUstTest
  • ethstaker
  • GTA5RPClips
  • modclub
  • tester
  • anitta
  • osvaldo12
  • cisconetworking
  • everett
  • cubers
  • Leos
  • provamag3
  • normalnudes
  • lostlight
  • All magazines