• Activity
  • Votes
  • Comments
  • New
  • All activity
    1. What does your self-hosted server setup look like?

      Hoping we can get some discussion on self hosting setups throughout the community and help anyone who may be interested with common setups and finding interesting software. Hardware Currently...

      Hoping we can get some discussion on self hosting setups throughout the community and help anyone who may be interested with common setups and finding interesting software.

      Hardware
      Currently running everything on a Dell 7050 SFF (intel i5-7500 and 16GB RAM) which suits my needs perfectly. Had used an older SFF before (i forget which) and a cheap older model mac mini (2012 I think) for self hosting before, but those were not the right choice as I didn't properly understand what hardware encoding was at the time. The i5-7500 handles all the media I have when transcoding is needed. Only thing it can't do is AV1, but my setup avoids those anyway.

      Operating System
      Distro Hopping habits are hard to break and that "itch" unfortunately carry over to the server. Currently running Ubuntu 22.04 LTS for a few months now, but feeling like a change is needed soon. I've used Ubuntu, Debian, and Fedora for servers before and they each have their own little problems that make me eventually switch. I am considering maybe doing a Proxmox setup so I can spin up a VM whenever that itch comes, but not sure if they added complexity is worth it in the long run.

      Software
      Yay, the best part! My self hosting stack has changed a ton over the years. Everything in my stack is in a docker container through a set of badly written compose files (planning on redoing things, cleaning things up, making things consistent, etc.). I'll just do a rundown of everything with a brief description of what it is:

      • Plex Gives me a Netflix like streaming experience at home. Currently working on shifting things over to JellyFin as Plex is starting to grow increasingly buggy for me.
      • Sonarr Automatically tracks and downloads all my shows. I have two instances of this running, one for normal tv shows and another for anime
      • Radarr Automatically tracks and downloads all my movies.
      • Prowlarr Sowers the high seas for what Sonarr and Radarr are looking for and gives them the "linux iso".
      • rdt-client Probably different to most peoples setups. I use a debrid service (not sure why people call them that), to download my "linux iso's" for me and I do a direct download from them. Much quicker and no torrenting traffic on my end. Also it's also cheaper than paying for a VPN usually.
      • File Browser A good web ui for managing files
      • Nginx Proxy Manager Is a reverse proxy for all of my services and gives me HTTPS for everything. Gets rid of the annoying browser warnings.
      • Tailscale The most recent addition to my setup. Allows me to access my network anywhere. Similar to a VPN (I know it uses wireguard under the hood), but does a lot of magic for you and just makes everything work and connect together, its really cool.
      • Adguard Home Gives me a local DNS server that does DNS level ad blocking. Never given me problems and it works well, but I am thinking of reducing the complexity of my setup and removing it. There tons of DNS servers out there that can do the same thing and I don't mind trusting a few of them (like quad9 or mullvad dns).
      • Watchtower It monitors all my docker containers and keeps them up-to-date. If a new version is out, it will automatically download the latest version and restart the container and delete the old container version. I know its not the best idea, but its only cause a break 1 time with 1 container in the couple years I've run this setup.
      • Homepage Literally the homepage for all my services. I've tried a lot of different ones and Homepage is easily the best. Simple, but powerful to configure.

      Keen eyes may have noticed the lack of backup software. I'll get around to that, eventually.

      47 votes
    2. Looking for a remote storage provider to use for storing backups

      I'm looking for mountable remote storage that I can use for my backup solution at home. I'm trying to get set up with backuppc and need to be able to mount a large remote filesystem to store my...

      I'm looking for mountable remote storage that I can use for my backup solution at home. I'm trying to get set up with backuppc and need to be able to mount a large remote filesystem to store my archives. I've tried renting a 1TB storage box from Hetzner, but my account was rejected (I assume because of a recent legal name change). Can anybody recommend a similar provider of remote storage that I can rent and mount onto my server?

      27 votes
    3. What programming/technical projects have you been working on?

      This is a recurring post to discuss programming or other technical projects that we've been working on. Tell us about one of your recent projects, either at work or personal projects. What's...

      This is a recurring post to discuss programming or other technical projects that we've been working on. Tell us about one of your recent projects, either at work or personal projects. What's interesting about it? Are you having trouble with anything?

      30 votes
    4. What programming/technical projects have you been working on?

      This is a recurring post to discuss programming or other technical projects that we've been working on. Tell us about one of your recent projects, either at work or personal projects. What's...

      This is a recurring post to discuss programming or other technical projects that we've been working on. Tell us about one of your recent projects, either at work or personal projects. What's interesting about it? Are you having trouble with anything?

      27 votes
    5. Firefox refuses to use fonts in ~user/.config/fontconfig/fonts.conf

      I have the following on my fonts.conf <?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <fontconfig> <alias> <family>system-ui</family> <prefer> <family>FreeSans</family> </prefer>...

      I have the following on my fonts.conf

      <?xml version="1.0"?>
      <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
      <fontconfig>
        <alias>
          <family>system-ui</family>
          <prefer>
            <family>FreeSans</family>
          </prefer>
        </alias>
      </fontconfig>
      

      But when websites use font-family: system-ui firefox just ignores this and uses Cantarell anyway, which I don't even know where it is getting it from. (Not Firefox font preferences).

      Any idea how to make firefox respect my fonts.conf?

      This is Linux with i3.

      11 votes
    6. Is it normal to stress about your codebase becoming bad?

      Lately, I've been working on a game in Godot. I've having a lot of fun, but I keep stressing out about my codebase becoming bad. I'm worrying about amassing technical debt, and having to rewrite...

      Lately, I've been working on a game in Godot. I've having a lot of fun, but I keep stressing out about my codebase becoming bad. I'm worrying about amassing technical debt, and having to rewrite huge amounts of code because of bad practices.

      I've been reading best practices documentation for Godot, and learning about game programming patterns, but it's still a worry for me.

      I'm wondering if this is a normal feeling, and how more experienced developers manage it.

      24 votes
    7. Framework laptop users: what's your build?

      The Framework laptop is a completely modular, upgradeable laptop that comes pretty close to higher end laptops in terms of performance and "feel". For those of you who have/want a Framework...

      The Framework laptop is a completely modular, upgradeable laptop that comes pretty close to higher end laptops in terms of performance and "feel". For those of you who have/want a Framework laptop, what does your build look like?

      I've got:

      • 11th Gen Framework with Intel i5 (not the most powerful, but I wanted to get something quickly and relatively inexpensively)
      • Dual booting Ubuntu and Fedora right now since they appear to have the best Linux compatibility and Framework community support
      • Expansion ports: USB-C on the left and right so I can plug the charger in from a multitude of angles and directions! And I've got a grab bag of MicroSD, standard USB, etc. that can be switched out.
      • I'll upgrade the system at some point -- unsure of whether I should stick with Intel or move to the new AMD board. I guess I'm not really sure of the benefits of doing so...

      What OS are you using? What's your laptop build, and what plans do you have in the future? Have you had any major issues thus far?

      24 votes
    8. Why do some Flatpak software recognize system settings, while others do not?

      Recently, I upgraded my PC to Debian 12 and chose KDE as my Desktop Environment. For this fresh installation, I decided to maintain only the core packages managed by "apt" and started using...

      Recently, I upgraded my PC to Debian 12 and chose KDE as my Desktop Environment. For this fresh installation, I decided to maintain only the core packages managed by "apt" and started using Flatpak for my apps.

      Some Flatpak apps perform flawlessly out of the box, such as LibreOffice and QGIS. They adjust the language to my localization and adopt the theming from my system effortlessly. However, others like Obsidian and Zotero require manual adjustment of settings by modifying the configuration files.

      I understand that Flatpak applications are sandboxed, so I initially expected them not to recognize my system configuration files. However, I am puzzled as to why some apps do recognize them while others don't. I have attempted to read some documentation on Flatpak itself, and if I understand correctly, Flatpak has the capability to read from system configuration files. However, I haven't fully grasped how it accomplishes this (is there anything to do with portals?) and why it only applies to certain packages.

      9 votes
    9. Can someone ELI5 how lemmy instances work?

      Some of the things I'm concerned about are browsing across unconnected instances - will I need twenty accounts to follow all of the groups? What is the likelihoood of an instance dissapearing? How...

      Some of the things I'm concerned about are browsing across unconnected instances - will I need twenty accounts to follow all of the groups? What is the likelihoood of an instance dissapearing? How do you gauge the culture of an instance? Is the https://redditmigration.com/ actually being populated by real admins of those subreddits? Are there any gotchas from joining an instance that I should be aware of? Thanks!

      21 votes
    10. When consuming an API with state rate limits, how should one handle not exceeding them?

      My typical approach is one that I believe is pretty common: Reading the response header for current count and waiting if the limit is reached. However, I am currently working with a couple of APIs...

      My typical approach is one that I believe is pretty common: Reading the response header for current count and waiting if the limit is reached.

      However, I am currently working with a couple of APIs which don't implement that and are currently set up with rate limits on an honesty system.

      Is it a case of throwing sleep statements into you code, or using some kind of "bucket" and "lock" system?

      I'd be interested to see any simple implementation people have used (the simpler the better).

      9 votes
    11. Need help solutioning Microsoft APIM

      We have a backend that kind of does REST APIs but cannot handle simple Bearer tokens for authorization and cannot produce the full set of HTTP error codes (the platform just doesn't allow, for...

      We have a backend that kind of does REST APIs but cannot handle simple Bearer tokens for authorization and cannot produce the full set of HTTP error codes (the platform just doesn't allow, for example HTTP 501 to be returned programmatically). There is no Swagger for the API.

      The thought was to use Microsoft API Management Services as a proxy of sorts. It would handle the Bearer token upfront, and then just proxy / wildcard the requests/responses to the backend. The hard part is that it needs to parse the return response, and if there is something like "{ errorCode: 501 }" property in the JSON, it needs to return HTTP 501 instead of the regular payload.

      Does anyone have any experience in setting this up? It seems like the basic policy processing won't cut it, and so function apps and logic apps seem to be the ticket. We want to keep this facade layer as thin as possible. Microsoft APIM is the only platform we're allowed to consider at this time.

      4 votes
    12. Docker Nextcloud AIO Mastercontainer update failing

      I've got a problem with my nextcloud and as tildes is my favourite nice place to ask for tech-support, maybe somebody here can help me with that. I can start and run Nextcloud AIO without any...

      I've got a problem with my nextcloud and as tildes is my favourite nice place to ask for tech-support, maybe somebody here can help me with that.

      I can start and run Nextcloud AIO without any problems. I can update the subcontainers without any problems. But the update of the Mastercontainer always fails and I don't kno why, only that it has to be something with docker.sock and permissions, but I could not resolve the issues, and google does not seem to be helpful (or I'm looking for the wrong stuff).

      my update logs:

      time="2023-06-14T12:47:59Z" level=debug msg="Sleeping for a second to ensure the docker api client has been properly initialized."
      time="2023-06-14T12:48:00Z" level=debug msg="Making sure everything is sane before starting"
      time="2023-06-14T12:48:00Z" level=info msg="Watchtower 1.5.3"
      time="2023-06-14T12:48:00Z" level=info msg="Using no notifications"
      time="2023-06-14T12:48:00Z" level=info msg="Only checking containers which name matches \"nextcloud-aio-mastercontainer\""
      time="2023-06-14T12:48:00Z" level=info msg="Running a one time update."
      time="2023-06-14T12:48:00Z" level=debug msg="Checking containers for updated images"
      time="2023-06-14T12:48:00Z" level=debug msg="Retrieving running containers"
      time="2023-06-14T12:48:00Z" level=debug msg="FIXME: Got an status-code for which error does not match any expected type!!!" error="Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?" module=api status_code=-1
      time="2023-06-14T12:48:00Z" level=error msg="Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?"
      panic: runtime error: invalid memory address or nil pointer dereference
      [signal SIGSEGV: segmentation violation code=0x1 addr=0x30 pc=0x9f4a22]
      
      goroutine 1 [running]:
      github.com/containrrr/watchtower/pkg/metrics.NewMetric({0x0, 0x0})
      	/home/runner/work/watchtower/watchtower/pkg/metrics/metrics.go:31 +0x22
      github.com/containrrr/watchtower/cmd.runUpdatesWithNotifications(0xc0002fd830)
      	/home/runner/work/watchtower/watchtower/cmd/root.go:375 +0x15e
      github.com/containrrr/watchtower/cmd.Run(0xc00033c300?, {0xc000281300?, 0x4?, 0x4?})
      	/home/runner/work/watchtower/watchtower/cmd/root.go:168 +0x570
      github.com/spf13/cobra.(*Command).execute(0xc00033c300, {0xc0000300b0, 0x4, 0x4})
      	/home/runner/go/pkg/mod/github.com/spf13/cobra@v1.6.1/command.go:920 +0x847
      github.com/spf13/cobra.(*Command).ExecuteC(0xc00033c300)
      	/home/runner/go/pkg/mod/github.com/spf13/cobra@v1.6.1/command.go:1044 +0x3bc
      github.com/spf13/cobra.(*Command).Execute(...)
      	/home/runner/go/pkg/mod/github.com/spf13/cobra@v1.6.1/command.go:968
      github.com/containrrr/watchtower/cmd.Execute()
      	/home/runner/work/watchtower/watchtower/cmd/root.go:71 +0x52
      main.main()
      	/home/runner/work/watchtower/watchtower/main.go:13 +0x17
      
      

      my startup command

      sudo docker run \
      --sig-proxy=false \
      --name nextcloud-aio-mastercontainer \
      --restart unless-stopped \
      --publish 8080:8080 \
      -e APACHE_PORT=11000 \
      -e APACHE_IP_BINDING=127.0.0.1 \
      --volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \
      --volume /var/run/docker.sock:/var/run/docker.sock:ro \
      nextcloud/all-in-one:latest
      

      output after start:

      Trying to fix docker.sock permissions internally...
      Creating docker group internally with id 998
      WARNING: No swap limit support
      Initial startup of Nextcloud All-in-One complete!
      You should be able to open the Nextcloud AIO Interface now on port 8080 of this server!
      E.g. https://internal.ip.of.this.server:8080
      
      If your server has port 80 and 8443 open and you point a domain to your server, you can get a valid certificate automatically by opening the Nextcloud AIO Interface via:
      https://your-domain-that-points-to-this-server.tld:8443
      ++ head -1 /mnt/docker-aio-config/data/daily_backup_time
      + BACKUP_TIME=04:00
      + export BACKUP_TIME
      + export DAILY_BACKUP=1
      + DAILY_BACKUP=1
      ++ sed -n 2p /mnt/docker-aio-config/data/daily_backup_time
      + '[' '' '!=' automaticUpdatesAreNotEnabled ']'
      + export AUTOMATIC_UPDATES=1
      + AUTOMATIC_UPDATES=1
      + set +x
      {"level":"info","ts":1686746753.2700157,"msg":"using provided configuration","config_file":"/Caddyfile","config_adapter":""}
      {"level":"info","ts":1686746753.2748601,"msg":"failed to sufficiently increase receive buffer size (was: 208 kiB, wanted: 2048 kiB, got: 416 kiB). See https://github.com/quic-go/quic-go/wiki/UDP-Receive-Buffer-Size for details."}
      [14-Jun-2023 12:45:53] NOTICE: fpm is running, pid 106
      [14-Jun-2023 12:45:53] NOTICE: ready to handle connections
      
      

      I tried to change permissions on /var/run/docker.sock
      I tried to change permissions on /lib/systemd/system/docker.sock

      same but with restart of docker.sock
      same but with restart of docker.sock and docker.service

      nothing helped

      does somebody know where I go wrong or can me point in the right direction to resolve this problem? It's not a game stopper as I can update the container manually, but it is annoying.

      edit: it runs on a ubuntu server 20.04.6 LTS

      6 votes
    13. [PC build] - AM4 or AM5 for low-power non-gaming build with lots of storage?

      My main needs are: Not too pricey Very low idle power At least 6 x SATA I don't need a beefy GPU (the iGPU will be more than I need) or lots of CPU performance (I'll probably pick one of the...

      My main needs are:

      • Not too pricey
      • Very low idle power
      • At least 6 x SATA

      I don't need a beefy GPU (the iGPU will be more than I need) or lots of CPU performance (I'll probably pick one of the cheapest compatible CPU).

      AM5 is still pretty expensive and the cheap(-ish) motherboards mostly only have 4 x SATA so I would need an extension card. But I'm considering it because 5nm vs 7nm should improve the power efficiency, right? What kind of improvements should I expect there?

      Are there any other reasons to go for AM5? I might prefer it for emotional reasons (the lastest and greatest always feels better) so I could use some input from kind strangers.

      I could also just wait a bit longer. When should I expect the low-end AM5 comonents to become cheaper?

      13 votes
    14. Distrohoppers, what's your flavor this week?

      I feel like a good Linux distro discussion is a good fit here. I'm only half-joking about the 'week' part. Whether it's the flavor of the week or your 10 year distro, I'd be curious to know what...

      I feel like a good Linux distro discussion is a good fit here.

      I'm only half-joking about the 'week' part. Whether it's the flavor of the week or your 10 year distro, I'd be curious to know what you have installed right now and what you like about it.

      I'll start. I've been moving all of my servers and even my desktop and laptop to Alpine Linux. It's fast, it's stable, has a wide variety of packages available and the package manager apk.

      It's easy to configure with openrc. Easy to diagnose any problems. And honestly I haven't had a problem yet with musl that I couldn't work around. Gotta say I'm quite smitten with it.

      47 votes
    15. Basic How To Help: How do I build/install/??? a python windows desktop widget

      How do I launch an egg directory? I found a package that I want to use. It's a windows desktop widget. I downloaded the source from Git and unzipped. Installed Python 3.11 in powershell. Executed...

      How do I launch an egg directory?
      I found a package that I want to use. It's a windows desktop widget. I downloaded the source from Git and unzipped. Installed Python 3.11 in powershell. Executed py setup.py --install from inside the unzipped package directory.
      Python reports it installed into C:\users\user\appdata\local\programs\python\python311\lib\site-packages[package].egg.
      What do I do to launch the package? I've tried py [package]. The .egg inside that directory appears to be a directory. I tried simply ps: [package]. Nothing seems to launch it.
      Kindly help.

      Edit: I've since learned my efforts are moot because the widget I was trying to install requires dependencies that are no longer available, and also .egg is a deprecated (and perhaps poorly implemented) way to use python. Thanks to everyone for their help

      5 votes
    16. I'm planning my first PC Build, does anyone have some advice/input on what I've got so far?

      Please help lol Type Item Price CPU Intel Core i7-12700KF 3.6 GHz 12-Core Processor $239.99 @ Newegg CPU Cooler Noctua NH-D15 chromax.black 82.52 CFM CPU Cooler $119.95 @ Amazon Motherboard Asus...

      Please help lol

      Type Item Price
      CPU Intel Core i7-12700KF 3.6 GHz 12-Core Processor $239.99 @ Newegg
      CPU Cooler Noctua NH-D15 chromax.black 82.52 CFM CPU Cooler $119.95 @ Amazon
      Motherboard Asus ROG STRIX Z690-A GAMING WIFI D4 ATX LGA1700 Motherboard $299.99 @ Amazon
      Memory \*Corsair Vengeance LPX 32 GB (4 x 8 GB) DDR4-3200 CL16 Memory $94.99 @ Amazon
      Storage Samsung 970 Evo Plus 1 TB M.2-2280 PCIe 3.0 X4 NVME Solid State Drive $54.99 @ Amazon
      Storage Seagate Barracuda Compute 2 TB 3.5" 7200 RPM Internal Hard Drive $49.99 @ Amazon
      Video Card MSI RTX 3060 Ventus 3X 12G OC GeForce RTX 3060 12GB 12 GB Video Card $289.99 @ Amazon
      Power Supply Corsair RM750 750 W 80+ Gold Certified Fully Modular ATX Power Supply
      Prices include shipping, taxes, rebates, and discounts
      Total $1249.88
      *Lowest price parts chosen from parametric criteria
      Generated by PCPartPicker 2023-06-06 10:27 EDT-0400
      16 votes
    17. The ideal backend language to write web apps in 2023?

      I know quite a controversial and opinionated question, one that might easily get blasted with downvotes on a site like StackOverflow or even Reddit! Nevertheless, one which I believe is still...

      I know quite a controversial and opinionated question, one that might easily get blasted with downvotes on a site like StackOverflow or even Reddit! Nevertheless, one which I believe is still relevant to ask and useful one even in 2023.

      The problem with backend web technologies is that we are overwhelmed with choices. Whilst getting spoilt with choices seems like a useful thing sometimes, it might easily be an impediment in decision making too. Based on my experience, there are a bunch of useful stacks and I will work on any of them if you pay me to work as a freelance coder. Each has its own pros and cons but I'm yet to find the ideal one which according to me is something that should be easy to code and deploy while also better performing at the same time.

      • ASP.NET: C# is the language I started coding web apps with in my last company and ASP.NET web forms was quite the rage back then. PHP was also gaining traction in the open source world and the webdev was mostly divided between the Enterprisey .NET aristocrats of Microsoft world and the poor PHP peasants of the FOSS world! One good thing about ASP.NET was performance. Since MS controlled the whole stack, they also put great efforts at making it work faster. The bad thing, of course, was dependence on a closed tech stack and a closed black box that generated JS functionality on its own.
      • PHP: When I resigned from that company and started freelancing, I came to know about open source, linux, XAMPP, etc. That was when I realized that my own attitudes and thinking was more attuned to the FOSS peasant mindset than the wealthy aristocrat's! I didn't earn quite as much in freelancing with WP, Drupal, SuiteCRM, CodeIgniter, etc. but I found great happiness and contentment in being part of the open source process. Till date, PHP remains my favorite language for backend development and most of my web projects involve CodeIgniter or even pure PHP.
      • Python: Flask is what got me interested in Python web development. The sheer minimalism and flexibility of that framework is what I found quite remarkable and quite a rarity in the frameworks world. And jinja2 template system was just fantastic. The other framework called django is more popular I think and I've worked on that too but Flask still remains my favorite. Flask is good in performance dept. too but I think it gets tricky once you start scaling with too many users.
      • Java: I've never really bothered with Java web development except a few tutorial experiments on the Apache TomEE server. The multi-layered approach that Java takes not only has very steep learning curve but unless you're a very gifted programmer, it's practically impossible to beat the performance of interpreted PHP/Flask!
      • NodeJS: Again, not much work here except brief hobby projects like http-live-simulator. The npm packaging system really turned me off initially with so many packages and issues with that system in the earlier days. Nowadays, I've heard that it's much usable but I've never gotten into it.

      And now, we also have the evolving languages like Golang, Rust, etc. taking their baby steps towards web development too! Are any of them worth giving a try? If someone were to ask you for a backend tech stack recommendation while giving equal weightage to performance, developer productivity and ease of deployment, which one will you suggest?

      23 votes
    18. Making infinite scrollable lists for web without a constantly expanding DOM

      A common theme in web development, and the crux of the so-called "Web 2.0" is scrolling through dynamic lists of content. Tildes is such an example: you can scroll through about 50 topics on the...

      A common theme in web development, and the crux of the so-called "Web 2.0" is scrolling through dynamic lists of content. Tildes is such an example: you can scroll through about 50 topics on the front page before you reach a "next" button if you want to keep looking.

      There's a certain beauty in the simplicity of the next/previous page. When done right it's fast, it's easy, and fits neatly into a server-side rendered model. However, it does cause that small bit of friction where you need to hit the next button to go forward -- taking you out of the "flow", so-to-speak. It's slick, but it could be slicker. Perhaps more importantly, it's an interesting problem to solve.

      A step up from the next/previous button is to load the next page of content when you reach the end of the list, inserting it below. If the load is pretty fast, this will hardly interrupt your flow at all! The ever-so-popular reddit enhancement suite does precisely that for reddit: instead of a next button, when you reach the bottom, the next page of items simply plops into place. If the loading isn't fast enough, perhaps instead of loading when they reach the last item, you might choose to load when they hit the fifth from last item, etc.

      To try to keep this post more concrete, and more helpful, here's how this type of pagination would work in practice, in typescript and using the Intersection Observer API but otherwise framework agnostic:

      /**
       * Allows the user to scroll forever through the given list by calling the given loadMore()
       * function whenever the bottom element (by default) becomes visible. This assumes that
       * loadMore is the only thing that modifies the list, and that the list is done being modified
       * once the promise returned from loadMore resolves
       *
       * @param list The element which contains the individual items
       * @param loadMore A function which can be called to insert more items into the list. Can return
       *   a rejected promise to indicate that there are no more items to load
       * @param triggerLoadAt The index of the child in the list which triggers the load. Negative numbers
       *   are interpreted as offsets from the end of the list. 
       */
      function handlePagination(list: Element, loadMore: () => Promise<void>, triggerLoadAt: number = -1) {
          manageIntersection();
          return;
      
          function handleIntersection(ele: Element, handler: () => void): () => void {
              let active = true;
              const observer = new IntersectionObserver((entries) => {
                  if (active && entries[0].isIntersecting) {
                      handler()
                  }
              }, { root: null, threshold: 0.5 });
              observer.observe(ele);
              return () => {
                  if (active) {
                      active = false;
                      observer.disconnect();
                  }
              }
          }
      
          function manageIntersection() {
              const index = triggerLoadAt < 0 ? list.children.length + triggerLoadAt : triggerLoadAt;
              if (index < 0 || index >= list.children.length) {
                  throw new Error(`index=${index} is not valid for a list of ${list.children.length} items`);
              }
      
              const child = list.children[index];
              const removeIntersectionHandler = handleIntersection(child, () => {
                  removeIntersectionHandler();
                  loadMore().then(() => {
                      manageIntersection();
                  }).catch((e) => {});
              });
          }
      }
      

      If you're sane, this probably suffices for you. However, there is still one problem: as you scroll,
      the number of elements on the DOM get longer and longer. This means they necessarily take up
      some amount of memory, and browsers probably have to do some amount of work to keep
      track of them. Thus, in theory, if you were to scroll long enough, the page would get slower and
      slower! How long "long enough" is would depend mostly on how complicated each item is: if each one
      is a unique 20k element svg, it'll get slow pretty quickly.

      The trick to avoid this, and to get a constant overhead, is that when adding new items below, remove the same number of items above! Of course, if the user scrolls back up they'll be expecting those items to be there, but no worries, the handlePagination from before works just as well for loading items before the first item.

      However, this simple change is where a key problem arises: inserting elements below doesn't cause any layout shift, but inserting an item above ought to--right?

      The answer is: it depends on the browser! Back in 2017 chrome realized that it's often convenient to be able to insert items into the dom above the viewport, and implemented scroll anchoring, which basically ensures that if you insert an item 50px tall above the viewport, then scroll 50px down so that there's no visual layout shift. Firefox followed suite in 2019, and edge got support in 2020. But alas, safari both on mac and ios does not support scroll anchoring (though they expressed interest in it since 2017)

      Now, there's two responses to this:

      • Surely Safari support is coming soon, they've posted on that bug as recently as April! Just use simpler pagination for now
      • Pshhhh, just implement scroll anchoring ourself!

      Of course, I've gone and done #2, and it almost perfectly works. Here's the idea:

      • Right before loadMore, find the first item in the list which is inside the viewport. This is the item whose position we don't want to move. Use getBoundingClientRect to find it's top position.
      • Perform the DOM manipulation as desired
      • Use getBoundingClientRect again to find the new top of that item.
      • Insert (or remove) the appropriate amount of blank space at the top of the list to offset the change in client rect (note that if there's scroll anchoring support in the browser this should always be zero, which means this effectively works as progressive enhancement)

      Now, the function to do this is a tad too long for this post. I implemented it in React, however, and combined it with some stronger preloading object (we don't need all the items we've fetched from the API on the DOM, so we can use before, onTheDom, after lists to avoid getting a bunch of api requests just from scrolling down and up within the same small number of items).

      What's interesting is that it still works perfectly on chrome even with scroll-anchoring disabled (via overflow-anchor: none), but on Safari there is still, sometimes, 1 frame where it renders the wrong scroll position before immediately adjusting. Because I implemented it in react, however, my current hypothesis is I have a mistake somewhere which causes the javascript to yield to the renderer before all the manipulations are done, and it only shows up on Safari because of the generally higher framerates there

      If it's interesting to people, I could extract the infinite list component outside of this project: I certainly like it, and in my case I do expect people to want to quickly scroll through hundreds to thousands of items, so the lighter DOM feels worth it (though perhaps it wouldn't if I had known, when starting, how painful getting it to work on Safari would be!).

      What do you think of this type of "true" infinite scrolling for web? Good thing, neutral thing, bad thing? Would you use it, if the component were available? Would you remove it, if you saw someone doing this? Are there other questions about how this was accomplished? Is this an appropriate post for Tildes?

      11 votes
    19. Linux newbies: ask your questions

      Whether you're new to distro installs or aiming to delve deeper, feel free to ask any questions here - remember, no question is stupid! I'll do my best to answer, and if I can't, someone here...

      Whether you're new to distro installs or aiming to delve deeper, feel free to ask any questions here - remember, no question is stupid!

      I'll do my best to answer, and if I can't, someone here likely can, or at least guide you in the right direction.

      Background: I've been a Linux user since 2007, starting with Ubuntu Feisty Fawn after losing my Windows XP product key. I've performed countless installs, worked in web hosting NOCs, and use multiple distros daily, including Proxmox.

      If you prefer, don't hesitate to PM me directly!

      30 votes
    20. Fortnightly Programming Q&A Thread

      General Programming Q&A thread! Ask any questions about programming, answer the questions of other users, or post suggestions for future threads. Don't forget to format your code using the triple...

      General Programming Q&A thread! Ask any questions about programming, answer the questions of other users, or post suggestions for future threads.

      Don't forget to format your code using the triple backticks or tildes:

      Here is my schema:
      
      ```sql
      CREATE TABLE article_to_warehouse (
        article_id   INTEGER
      , warehouse_id INTEGER
      )
      ;
      ```
      
      How do I add a `UNIQUE` constraint?
      
      5 votes
    21. Programming Challenge: Mini Calendar Display

      It has been a while since the last time we did something like a programming challenge, so here's one for ya. The life story of the author before you get to the recipe I've been working on a little...

      It has been a while since the last time we did something like a programming challenge, so here's one for ya.

      The life story of the author before you get to the recipe

      I've been working on a little "today" website, showing what day it is, if it's a significant date for holiday/independence/... reasons, and one of the things I wanted was a small calendar display that showed the full month and days in each week. Like how XFCE's Clock plugin does it.

      So I got to figuring it out and after finishing it up I thought this could be a nice little programming challenge. It has one input (the date) that can be in any of the rows and columns, and it's up to you to figure out all the rest.

      Here's how mine looks in about 250ish lines of TypeScript (TSX technically) and SCSS.


      The Recipe

      Make a mini calendar display that shows all the days of the current month and at least one day of each adjacent month. So for example for May 2023: the 31 days in May, the 30th of April and the 1st of June should at least be visible.

      It can be in any language with any method of rendering; simple text, TUI/GUI toolkit, web-based, raytraced in some game engine, nixie tubes, whatever.

      Bonus Points

      • Highlight the current day name in the first row, if you're including day names.
      • Highlight the current day number, wherever it is.
      • Highlight the current week row, wherever it is.
      • Differentiate the days of current month and the days of the other adjacent months, wherever they are.

      Some Tips

      The week number

      If your programming language of choice doesn't have a built-in way to get the week number, like JavaScript doesn't, this website may have you covered.

      Testing

      Make sure to test multiple different input dates, I thought I was finished with my display until I tried some other dates and noticed that there were still some bugs left to squash.

      Starting

      If you know what the first day in the calendar should be, counting up is as easy as "one two three"!

      Weeks

      If you use 6 weeks in the display, you will always have enough space to fit all the current month's days and the minimum 1 day of the adjacent month's too.


      Showcase

      If at all possible and with at least a few entries I will try to run all the submissions myself and create a little showcase website for it.

      16 votes
    22. Fortnightly Programming Q&A Thread

      General Programming Q&A thread! Ask any questions about programming, answer the questions of other users, or post suggestions for future threads. Don't forget to format your code using the triple...

      General Programming Q&A thread! Ask any questions about programming, answer the questions of other users, or post suggestions for future threads.

      Don't forget to format your code using the triple backticks or tildes:

      Here is my schema:
      
      ```sql
      CREATE TABLE article_to_warehouse (
        article_id   INTEGER
      , warehouse_id INTEGER
      )
      ;
      ```
      
      How do I add a `UNIQUE` constraint?
      
      3 votes
    23. How do I convert a dictionary in sqlite3, and I want to convert it to something usable by StarDict. Is that possible?

      I don't know if my question makes any sense, and it's okay to say "No, sorry, it doesn't work like that". I have a (pirated) dictionary that has the words and definitions in an sqlite3 database...

      I don't know if my question makes any sense, and it's okay to say "No, sorry, it doesn't work like that".

      I have a (pirated) dictionary that has the words and definitions in an sqlite3 database format.

      I want to convert this into something that can be used by either Fora, GoldenDict, or StarDict.

      Fora can use StarDict, DSL, XDXF, Dictd, and TSV/Plain dictionaries

      GoldenDict can use Babylon .BGL, StarDict .ifo/.dict./.idx/.syn, Dictd .index/.dict(.dz), and ABBYY Lingvo .dsl source files.

      I've found lots of software that goes the other way - it'll take a dictionary and dump it into an sqlite database. But it doesn't go the otherway.

      Is what I'm asking for coherent, does it make any sense?

      (I'd prefer Windows, or FreeBSD, but at this point I'd install Linux to get it done).

      9 votes
    24. Linux mini computers

      Do any of you have mini computers in your home? My roommate recently bought a plex server and has stated self hosting. I also wanted to get a mini computer to do my own self hosting but was...

      Do any of you have mini computers in your home?

      My roommate recently bought a plex server and has stated self hosting. I also wanted to get a mini computer to do my own self hosting but was wondering if there were any Linux based computers on the market.

      21 votes
    25. I want to learn programming

      I currently don't know anything about programming so am considering picking this up on the side in case I loose my current job and need a backup plan. Anyone knows any good books or online courses...

      I currently don't know anything about programming so am considering picking this up on the side in case I loose my current job and need a backup plan. Anyone knows any good books or online courses or anything else for self-learning?

      My friends said programming is too broad a subject and what you need to learn depends heavily on what fields you want to go in, which I'm ashamed to admit also know nothing about. So I guess I need some career advice too if possible.

      22 votes