• 0 Posts
  • 383 Comments
Joined 2 years ago
cake
Cake day: June 30th, 2023

help-circle



  • At one point I developed a habit of converting any recursive algorithm I was writing into a loop instead, since I knew function calls have overhead and all recursion really does is lets you use the calling stack and flow control as an invisible data structure.

    Then I got a question about parsing brackets properly during an interview and wrote a loop-based parser to solve it and the guy had to fish for a bit before I remembered recursion and realized that’s the answer he was looking for. My mind just wouldn’t consider using a whole calling stack when an integer would do the trick faster.


  • Ok, first take a deep breath and calm down. Airspeed low is a good thing, you need to take this slowly! If the shaking of the steering wheel bugs you too much, they are adjustable, you just need to push it away from you.

    Now one of the biggest dangers to planes flown randomly around the sky is other planes, so you need to get on the radio with air traffic control and request permission to crash and they can give you a clear vector from your current position to a suitable crash site.

    If you’re lucky, there will be a nearby deserted island, in which case surviving the crash will make a much more interesting story than a plane crashing on a deserted island and everyone dying (or maybe the island will be purgatory or something and you really did die, or maybe purgatory will be a version where you didn’t crash… Be prepared to be very confused, especially since you won’t get to see any of the flashbacks that gives context to everyone who will lie about everything, even stupid shit like miraculously being able to walk again or other things that would be cool to talk about).

    Oh, that is unless you’re one of the few adults on a plane full of kids, in which case, sorry, you’re fucked.



  • That assumes SetTimeout() is O(1), but I suspect it is O(log(n)), making the algorithm O(n*log(n)), just like any other sort.

    Did some looking into the specifics of SetTimeout() and while it uses a data structure with theoretical O(1) insertion, deletion, and execution (called a time wheel if you want to look it up), the actual complexity for deletion and execution is O(n/m) (if values get well distributed across the buckets, just O(n) if not) where m is the number of buckets used. For a lot of use cases you do get an effective O(1) for each step, but I don’t believe using it as a sorting engine would get the best case performance out of it. So in terms of just n (considering m is usually constant), it’ll be more like O(n²).

    And it’s actually a bit worse than that because the algorithm isn’t just O(n/m) on execution. It needs to check each element of one bucket every tick of whatever bucket resolution it is using. So it’s actually non-trivially dependent on the wait time of the longest value. It’s still a constant multiplier so the big O notation still says O(n) (just for the check on all ticks), but it might be one of the most misleading O(n)'s I’ve ever seen.

    Other timer implementations can do better for execute and delete, but then you lose that O(1) insertion and end up back at O(n*log(n)), but one that scales worse than tree sort because it is literally tree sort plus waiting for timeouts.

    Oh and now, reading your comment again after reading about SetTimeout(), I see I misunderstood when I first read it and thought you meant it was almost as fast as bucket sort, but see now you meant it basically is bucket sort because of that SetTimeout() implementation. Bucket sort best case is O(n), worst case is O(n²), so I guess I can still do decent analysis lol.


  • Yeah, I can say that covers most of the “troubleshooting” I’ve had to do with games that don’t work. I usually go in thinking “uh oh, maybe it’s time for me to have to check a bunch of proton versions, this will be a pain” only to see that it’s trying to run it natively and switching to proton at all resolves any issues.

    The only other thing that comes to mind is that I use dvorak and something about the way keyboard layouts are handled means it tries to “preserve” the bindings when I switch layouts in game, so it keeps the messed up QWERTY keys but dvorak layout even when I switch (and can tell it’s switched from typing things like in chat). Most games let me rebind the keys so I just need to go through the bindings, hitting the key currently bound each time as if I was using QWERTY and it rebinds. Though I suspect that due to the “preserve the layout” behaviour that keyboard input is handled specially by proton and maybe I can tweak settings to get the desired behaviour (ie, changing layouts in game means I want the bindings to change).


  • It is a translation layer, but the bit you added “to native code” sounds like you’re misunderstanding what translation layer means.

    Games use a collection of APIs (DirectX is a set of APIs, but there’s others to handle offer operations like network access and such) to interact with OS functionality, and also receive communicarion back from the OS (the windows message loop). Proton and wine are implementations of those APIs that translate the API calls to their equivalent in linux, as well as setting up their own message loop that translates messages from the linux kernel and UI system into their windows equivalent before sending them to the registered windows messaging loop functions.

    A simple example would be if a function header in windows looks like int32 SomeFuncWin( int64 index, char* name ), but looks like int32 SomeFuncLinux( std::string name, int64 index ), then the translation would be something like:

    int32 SomeFuncWin( int64 index, char* name ) {
    std:string TranslatedName( name );
    return SomeFuncLinux( TranslatedName, index );
    }

    So it doesn’t change/translate any of the code of the program itself, it just provides the environment that behaves exactly like a windows environment by translating the “hey could the OS do this for me?” requests from windows to linux. Note that not all translations are that simple, there might need to be more processing on the values, missing arguments might need to be filled in, irrelevant arguments ignored, sometimes data needs to be translated to another format, etc.

    The speed ups can come from improved efficiency in the underlying implementations (which Vulkan has, as I understand even using a translation layer from DX to Vulkan in windows can result in better performance) or having fewer services running in the background.



  • Yeah, when I got my most recent GPU, my plan had been to also get a 4k monitor and step up from 1440p to 4k. But when I was sorting through the options to find the few with decent specs all around, I realized that there was nothing about 1440p that left me dissapointed and the 4k monitor I had used at work already indicated that I’d just be zooming the UI anyways.

    Plus even with the new GPU, 4k numbers weren’t as good as 1440p numbers, and stutters/frame drops are still annoying… So I ended up just getting an ultra-wide 1440p monitor that was much easier to find good specs for and won’t bother with 4k for a monitor until maybe one day if it becomes the minimum, kinda like how analog displays have become much less available than digital displays, even if some people still prefer the old ones for some purposes. I won’t dig my heels in and refuse to move on to 4k, but I don’t see any value added over 1440p. Same goes for 8k TVs.


  • You’ve gotta either interest someone with the knowledge to pursue it or actually go to the college and gain the knowledge yourself. Because the truth is, unless you can motivate someone to do your thing, your thing isn’t going to be as interesting to others as it is to you, even if it would be revolutionary. There’s a good chance the idea relies on phenomena that only exist because of a lack of understanding (if you aren’t able to go from idea to proof of concept), or maybe require a solution to a very hard problem just hiding below the surface.

    Plus, even with the motivation, if you don’t know enough to do the thing and aren’t in a financial position to control the operation’s finances, there’s a good chance you’ll be discarded once you are no longer needed, which in this case is once they understand your idea. That “sorry, not interested” might actually be a “go away, this is interesting but I don’t think you’ll add anything more to this, so I’ll do it alone”.

    So instead of thinking “this is cool but I have no idea how”, think, “what do I need to learn to better understand my idea and its execution?” Hell, even being able to break it up into discrete and complete steps would be a great start because then you can start hiring out those different steps if you can’t do them, without having to give away the whole thing.


  • Stats require a sample from a smaller population that represents the entire population. Phone polls don’t include people a) without phones b) who ignore unknown calls c) who decline to reply to poll calls and d) who lie to poll calls (at least not accurately). I know I’ve been tempted to lie when someone reaches out on behalf of a politician I don’t like, though usually I just ignore the texts.

    Exit polls can be similarly affected, though the dynamics are a bit different.





  • Just note that (unless they’ve changed the default), you need to enable a setting in Steam to make it always use proton, or it will look like reality matches up with your previous expectations. I believe the setting is under compatability in the steam global settings.

    Also be aware that the steam deck compatability icon cares about two things that might not apply to a linux desktop: it loses points for keyboard/mouse centric games (which work fine if you actually use a kb/m instead of controller), and it also cares about how that game will perform on steam deck hardware, though if your gaming PC isn’t very strong, that one might be useful for you.

    Protondb has the more accurate compatability info, though it’s crowd sourced, so might not have up to date info on more obscure titles (though it does seem kinda like every single game has at least a small community obsessed with it that consider it the greatest game).



  • When I was in school, I wanted a Linux machine (since my school stuff was mostly linux and I wanted to be able to work locally instead of having to ssh in to school machines) but wasn’t comfortable doing it on my main PC, so I bought a cheap laptop and inatalled linux on that. Had the extra bonus of being smaller and lighter than my gaming laptop that was my main PC at the time, too.

    Your options will probably be a bit more expensive (and apologies for suggesting a solution that involves throwing money at it if you aren’t in a position to get even a relatively cheap one) since it’s running windows and needs the hardware for that, including TPM if your school stuff requires win 11 (though if you can get away with win 10 or 7, you could probably get a cheaper machine). Though on the other hand, your tasks might not require a GPU, which can save a lot right there.

    Then you can truly isolate your personal stuff from winsows, especially if you set your LAN up to never let the windows machine know that the linux machine even exists.

    I also use this with consoles to play games I’d like to try but they have DRM or anticheat that I don’t want on my PC. Also kinda doing it with work, though the laptop belongs to them.