• 43 Posts
  • 2.29K Comments
Joined 6 years ago
cake
Cake day: May 31st, 2020

help-circle
  • Yeah, one of the largest pieces of software humanity has created, next to Google Chrome and the Linux kernel, which are all around 30 million lines of code.

    To give a frame of reference: With a team of 5 full-time devs at my dayjob, we can dish out a codebase of about 20 thousand lines over the course of two years.

    A browser might be somewhat quicker to build, because the requirements are relatively clear at this point and you can start implementing many standards in parallel. But yeah, it’s still just an insane amount of code.




  • Oof, I was just talking about making things declarative there. If you want to configure it the old-fashioned way, like you would on other distros, then those difficulties don’t apply.

    In more general terms, though, it’s a bit of a double-edged sword. The Nix package repository has more packages than other package managers: https://repology.org/repositories/graphs

    So, the chance of finding an obscure software, that’s already packaged, is rather high.
    Here’s the online package search, if you want to check the availability of some of the obscure software you use: https://search.nixos.org/packages

    But then, yeah, the flipside is that, from what I understand, you can’t just download a random executable off of the internet and run it, because of the Filesystem Hierarchy Standard not being adhered to, as the post also mentions.
    You can set up Flatpaks, and I believe AppImages would work, because those also live in their own FUSE filesystem. Well, and there is ways to emulate the FHS layout to get normal applications to run, too.

    But yeah, way out of my field of expertise there. I have only one software installed which isn’t packaged for Nix, which is a program I wrote myself.
    And to get sufficient FHS emulation for that, I just needed this line in my config:

    programs.nix-ld.enable = true;
    

    More complex programs will need a bit of extra configuration: https://wiki.nixos.org/wiki/Nix-ld

    (I could also add a flake.nix file into my software’s repository, though, which would make it so it could be installed straight from my repo, as if it was packaged.)






  • Oh wow, what the hell. I’m not actually familiar with C++ (just with Rust which gets similar reactions with the ampersands), but that’s insane that it just copies shit by default. I guess, it comes from a time when people mostly passed primitive data types around the place. But yeah, you won’t even notice that you’re copying everything, if it just does it automatically.

    And by the way, Rust did come up with a third meaning for passing non-references: It transfers the ownership of the object, meaning no copy is made and instead, the object is not anymore allowed to be used in the scope that passed it on.
    That’s true, except for data types which implement the Copy trait/interface, which is implemented mostly for primitive data types, which do then get treated like C++ apparently treats everything.


  • Yeah, I can understand the frustration. IMHO the Home-Manager way of doing things has some merits:

    • You can (generally) manage the installation of packages together with their configuration.
    • You can override individual configuration values for different machines (which I guess, you can also do via templating in chezmoi).
    • Some programs don’t have a particularly readable configuration file or spread this configuration out over multiple files, or save all kinds of additional garbage into their configuration file which you don’t want to persist. Home-Manager can work around all these issues, and in such a case is likely also better documented than the original configuration file.

    That last point is one that’s particularly relevant for me, because KDE Plasma’s configuration files are largely terrible. Home-Manager, together with Plasma-Manager, is the only sane way I know of, to automate the panel configuration in KDE.

    But yeah, if you don’t use software with terrible configuration files, then I can certainly understand preferring dumb templating. I have also decided against using the Home-Manager-specific modules in places, or might only translate into the Home-Manager-specific module when I actually want to vary configuration values between two machines.


    Just to give a quick impression of how terrible the KDE panel configuration is, this is a snippet out of the fittingly-called plasma-org.kde.plasma.desktop-appletsrc file:

    [ActionPlugins][0]
    MiddleButton;NoModifier=org.kde.paste
    RightButton;NoModifier=org.kde.contextmenu
    
    [ActionPlugins][1]
    RightButton;NoModifier=org.kde.contextmenu
    
    [Containments][1122]
    activityId=f588743a-9bab-4f56-8f90-3616085ab6e0
    formfactor=0
    immutability=1
    lastScreen=1
    location=0
    plugin=org.kde.plasma.folder
    wallpaperplugin=org.kde.color
    
    [Containments][1122][Wallpaper][org.kde.color][General]
    Color=#79740e
    

    Ah sorry, that doesn’t actually show any of the panel configuration, because KDE mixes configuration for the panel and desktop widgets and the Activities feature (like workspaces, but with separate wallpapers and widgets for each Activity) all into the same file.
    So, here’s a snippet that actually shows the panel configuration, from just a few lines below the first snippet:

    [Containments][1807]
    activityId=
    formfactor=3
    immutability=1
    lastScreen[$i]=0
    location=5
    plugin=org.kde.panel
    wallpaperplugin=org.kde.image
    
    [Containments][1807][Applets][1808]
    immutability=1
    plugin=org.kde.plasma.showActivityManager
    
    [Containments][1807][Applets][1810]
    immutability=1
    plugin=org.kde.plasma.pager
    
    [Containments][1807][Applets][1810][Configuration][General]
    showOnlyCurrentScreen=true
    showWindowIcons=true
    wrapPage=true
    
    [Containments][1807][Applets][1811]
    immutability=1
    plugin=org.kde.plasma.panelspacer
    
    [Containments][1807][Applets][1812]
    activityId=
    formfactor=0
    immutability=1
    lastScreen=-1
    location=0
    plugin=org.kde.plasma.systemtray
    popupHeight=432
    popupWidth=432
    wallpaperplugin=org.kde.image
    

    What those numbers in e.g. [Containments][1807][Applets][1812] are? Ah, they just count those from 0 to infinity, whenever you add a widget through the UI.
    And in case you were wondering since when INI allows for nesting section keys via [multiple][brackets]: It doesn’t. That’s a custom extension of the INI format, specifically in use by KDE.

    Like, man, I love KDE for its features, but this is the stuff of nightmares.








  • Well, to me, it sounded like they themselves can’t rely on prefers-color-scheme, which is why the manual toggle is necessary, but it doesn’t hurt to support it for other folks.

    I guess, that does mean that a solution without persistence is going to be annoying, but yeah, I don’t think that’s solvable without JS. One could ensure that the JS is entirely optional, so that when the user blocks it, you simply get no persistence, but that’s probably about it…


  • Ephera@lemmy.mltoProgrammer Humor@lemmy.mlSenior devs...
    link
    fedilink
    English
    arrow-up
    4
    ·
    3 days ago

    In my experience, this happens in two ways. Yeah, sometimes a senior just overdoes it due to a lack of experience or shitty requirements or whatever.

    But it also happens a lot that juniors just don’t understand why the layer makes sense to introduce. For example, juniors will readily intermix IO and logic, because they don’t yet understand that this makes code untestable and adds a load of additional complexity into already complex logic code. From that viewpoint, pulling all the IO code out will look like unnecessary complexity, when it’s not.


  • Ah yeah, I guess, users would expect some action to happen when they click that toggle, not just for it to change from automatic-dark to manual-dark.

    Perhaps the simplest non-JS and non-persistent solution would then be to have it pick the color-scheme automatically by default, but if the checkbox is checked, then set the colors to the opposite.

    So, probably something like this:

    body {
      color-scheme: light dark;
    
      color: light-dark(black, white);
      background-color: light-dark(white, black);
    }
    @media (prefers-color-scheme: dark) {
      body:has(#theme-toggle:checked) {
        color-scheme: light; /*opposite*/
      }
    }
    @media (prefers-color-scheme: light) {
      body:has(#theme-toggle:checked) {
        color-scheme: dark; /*opposite*/
      }
    }
    

    You could probably even theme the checkbox to show a sun or a moon, depending on the current color scheme. 🙃