• 0 Posts
  • 27 Comments
Joined 2 years ago
cake
Cake day: July 3rd, 2023

help-circle





  • Lol I drove at least a mile with my Thinkpad on top of the car. Some dude next to me at a stop light honking and miming saved me. Got up to 40mph with it still on top though!

    Also did this with my cell phone and numerous water bottles. I really need to stop considering the roof a viable temporary storage location.



  • Hmm the type of thinking that implies Linux users only say bad things about Apple because they don’t know what they’re talking about? :)

    You can 100% run 32 bit binaries on Linux systems so the answer is all of them. The need for libraries isn’t the same as the complete inability to do so, any program with dependencies of course needs them and they of course have to be compatible. Hell with binfmt_misc you can even run arm32/aarch64 binaries, but that’s not fair I guess since it’ll be transparent qemu emulation, although still pretty cool.

    Also my view of this meme isn’t that it’s implying that there are no issues, just that it doesn’t force things on you or stop you from doing things which is generally true.


  • I’m pretty sure the meme is factually correct: you can’t run 32 bit applications on current versions of macOS. Unless something has changed recently that I don’t know of. Doesn’t iOS also force updating apps? I have a vague memory of my partner not being able to use an “old” version of an app and also not being able to update it so they simply couldn’t use it. That could be on the app developer though. Both of those a relevant to “old apps”.

    If the meme is referring only to arm64 then eh I guess it’s a bit of a stretch but whatever, it’s a meme.

    I agree there are many more, and much more annoying, criticisms though.



  • As long as it’s installed on a device you control it’s pretty easy to sniff TLS traffic from an Android application, even if they’re pinning certs. I do this all the time for work. Frida makes it extremely easy, even giving you the ability to edit boringssl if something important is happening in native code. I’ve had to do this a couple times.

    If you don’t have root you’ll have to recompile the application though which could matter if you need the signature to not change, but that isn’t a common requirement.

    It’d be nice to have a better way to test though; I’ve wanted to check out Waydroid. Some coworkers just use an emulator which works great if it doesn’t need specific hardware.


  • This doesn’t seem to be a Rust problem, but a modern development trend appearing in a Rust tool shipped with Cargo. The issue appears to be the way things are versioned and (reading between the lines maybe?) vendoring and/or lockfiles. Lockfiles exist in a lot of modern languages and package managers: Go has go.sum, Rust has Cargo which has Cargo.lock, Python has pip which gives a few different ways to pin versions, JavaScript has npm and yarn with lock files. I’m sure there are tons of others. I’m actually surprised this doesn’t happen all the time with newer projects. Maybe it does actually and this instance just gains traction because people get to say “look Rust bad Debian doesn’t like it”.

    This seems like a big issue if you want your code to be packaged by Debian, and it doesn’t seem easy to resolve if you also want to use the modern packaging tools. I’m not actually sure how they resolve this? There are real benefits to pinning versions, but there are also real benefits to Debian’s model (of controlling all the dependencies themselves, to some extent Debian is a lockfile implemented on the OS level). Seems like a tough problem and seems like it’ll end up with a lot of newer tools just not being available in Debian (by that I mean just not packaged by Debian, they’ll likely all run fine on Debian).





  • It doesn’t violate any rules… Imagine both the “speaker” and the “text” are being updated by separate threads. A program that would eventually display the behavior in this meme is simple, and I’m a bit embarrassed to have written it because of this comment:

    #include <pthread.h>
    #include <stdio.h>
    
    char* speakers[] = {
        "Alice",
        "Bob"
    };
    int speaker = 0;
    
    void* change_speaker(void* arg)
    {
        (void)arg;
    
        for (;;) {
            speaker = speaker == 0 ? 1 : 0;
        }
    }
    
    char* texts[] = {
        "Hi Bob",
        "Hi Alice, what's up?",
        "Not much Bob",
    };
    int text = 0;
    
    void* change_text(void* arg)
    {
        (void)arg;
        for (;;) {
            switch (text) {
            case 0:
                text = 1;
                break;
            case 1:
                text = 2;
                break;
            case 2:
                text = 0;
                break;
            }
        }
    }
    
    int main(int argc, char* argv[])
    {
        pthread_t speaker_swapper, text_swapper;
    
        pthread_create(&text_swapper, NULL, change_text, NULL);
        pthread_create(&speaker_swapper, NULL, change_speaker, NULL);
        for (int i = 0; i < 3; ++i) {
            printf("%s: %s\n", speakers[speaker], texts[text]);
        }
    }