ctr1

joined 1 year ago
[–] ctr1@fl0w.cc 2 points 1 month ago* (last edited 1 month ago)

Ah nice! Thanks for the suggestion. Yeah --preview is a great feature that is good to remember.

And true, it's better to use find -executable than ls. Although in my case I would use -type f -o -type l since I want to include symlinks (often I will cd into my local bin folder and ln -s $(which [cmd]) to add it to my launcher). I'm using ls since I only put executables in there and using relative file paths so that it's nicer to look at. But cd or sed would work as well

Yeah the xargs + i3-msg part is a bit clunky but I'm not sure what else to do, since the terminal window needs to close immediately, which prevents the application from running. I tried a few variations with nohup and launching in the background, but haven't found another solution. But I'm sure there's a way

[–] ctr1@fl0w.cc 4 points 1 month ago (2 children)

I use fzf with a popup terminal:

# example for i3
bindsym $mod+Return exec --no-startup-id kitty -T _menu_ -e bash -c 'ls $HOME/.local/bin/ | fzf | xargs -r -I{} i3-msg -t command exec $HOME/.local/bin/{}'
for_window [title="_menu_"] floating enable
for_window [title="_menu_"] resize set 600 800

I like this approach because it's simple and configurable. I prefer to see only the symlinks/scripts that I put in my local bin folder, but it can easily be extended to support .desktop files, multiple folders, filtering, etc.

[–] ctr1@fl0w.cc 2 points 2 months ago

I alternate between helix and vim depending on the task, and their key bindings are kind of opposite from each other in a lot of ways. I've found that switching back and forth has kept me on my toes a bit and I don't feel as locked in to one editor as I did with vim before trying helix.

So I’m now stuck with my customized neovim, devoid of any hope of abandoning this strange addiction.

I would also try getting used to the defaults or a minimal config, which is also a good way to feel at home in the editor regardless of the system

[–] ctr1@fl0w.cc 2 points 7 months ago* (last edited 7 months ago)

Ah, nice idea. I've tried a few different ways of doing this, and I think what you're seeing is a discrepancy in how the compiler handles member access into incomplete types. It seems that, in your examples, the compiler is allowing -> decltype(f.private_msg) within the class, but I think it's not selecting do_something outside of it because it uses decltype(t.private_msg). In my case, I'm not even able to do that within the class.

For example, since I'm not able to use decltype(f.private_msg) inside the class, I'm using decltype(private_msg) instead, which causes an error at the do_something declaration related to incomplete type (presumably because of the t.private_msg usage):

// candidate template ignored; member access into incomplete type
template 〈class T〉 auto do_something(T &t) -> decltype(t.private_msg);
class Foo {
        const char *private_msg = "You can't touch me!";
        friend auto do_something〈〉(Foo &f) -> decltype(private_msg);
};
template 〈〉 auto do_something(Foo &f) -> decltype(f.private_msg) {
        return f.private_msg;
}

My reasoning is that removing the t.private_msg from the declaration works:

template 〈class Ret, class T〉 auto do_something(T &t) -> Ret;
class Foo {
        const char *private_msg = "You can't touch me!";
        friend auto do_something〈〉(Foo &f) -> decltype(private_msg);
};
template 〈〉 auto do_something(Foo &f) -> decltype(f.private_msg) {
        return f.private_msg;
}
static Foo foo{};
// this works, but Ret cannot be deduced and must be specified somehow:
static auto something = do_something〈const char*〉(foo);

The reason your second example works is because the friend template inside the class acts as a template declaration rather than a specialization, which isn't specialized until after Foo is complete:

// the do_something inside Foo is a declaration, meaning this isn't used
// template 〈class T〉
// auto do_something(T &t) -> decltype(t.private_msg);
class Foo {
        const char *private_msg = "You can't touch me!";
        template 〈class T〉 // t.private_msg is allowed because T is not Foo yet
        friend auto do_something(T &t) -> decltype(t.private_msg);
};
template 〈〉 auto do_something(Foo &f) -> decltype(f.private_msg) {
        return f.private_msg;
}
[–] ctr1@fl0w.cc 2 points 7 months ago* (last edited 7 months ago) (2 children)

I think the issue is that Foo is incomplete when you're declaring the friend, so I think it's impossible. I just tried it and g++ ignores the target candidate due to "member access into incomplete type", which makes sense since std::begin is already defined and calls .begin(). The closest you can get is to use another friend to expose arr and overload std::begin manually, but that's a bit silly 😅

[–] ctr1@fl0w.cc 2 points 7 months ago* (last edited 7 months ago)

I suppose the most tangible benefit I get out of it is embedding a custom initramfs into the kernel and using it as an EFI stub. And I usually disable module loading and compile in everything I need, which feels cleaner. Also I make sure to tune the settings for my CPU and GPU, enable various virtualization options, and force SELinux to always remain active, among other things.

[–] ctr1@fl0w.cc 2 points 8 months ago

I have this device and use it to store my keepassxc and onlykey backups, and it's useful to me because I've stopped using passwords (I only need to remember the pins for these devices which can unlock my keepass dbs that have everything else).

It seems secure enough for my use case, especially since the files I store in it are themselves encrypted (the onlykey backup still requires a pin), but I still want them to be difficult to access.

I've had to rely on it before but only because I didn't prepare a backup onlykey ahead of time- ideally it should be one of many recovery methods. But so far it's worked great for me.

[–] ctr1@fl0w.cc 5 points 9 months ago

Maybe try programming? It's incredibly exciting once you get the hang of it. It can be frustrating at times but it's really rewarding. Since becoming my hobby/job its given me an endless source of things to do at home. Plus it can open up new career paths :)

[–] ctr1@fl0w.cc 4 points 10 months ago

mpd + ncmpcpp

[–] ctr1@fl0w.cc 5 points 1 year ago

I usually use Awk to do the heavy lifting within my Bash scripts (e.g. arg parsing, filtering, stream transformation), or I'll embed a Node.JS script for anything more advanced. In some cases, I'll use eval to process generated bash syntax, or I'll pipe into sh (which can be a good way to set up multiprocessing). I've also wanted to try zx, but I generally just stick to inlining since it saves a dependency.

[–] ctr1@fl0w.cc 3 points 1 year ago

I started by writing small scripts to automate things, but really got into it after learning how fun it can be to make the computer do stuff. I also see it as a kind of creative outlet, but in general I just want to learn how to fix anything in software if I'm not satisfied with how it works.

[–] ctr1@fl0w.cc 22 points 1 year ago (1 children)

I use LUKS-encrypted LVM volumes to store everything (and transfer via SSH or HTTPS), but would use GPG if I needed to encrypt individual files.

view more: next ›