Hacker Newsnew | past | comments | ask | show | jobs | submit | mmulet's commentslogin

I use chafa in term.everything[0], and I have nothing but good things to say about it! hpjansson is a great maintainer too, if anything even seems like it's wrong with chafa he will chime in with a fix or a suggestion[1] (I'm not the only one he does this with too [2][3]). I would definitely recommend this lib for anyone doing terminal graphics.

[0]https://github.com/mmulet/term.everything

[1]https://github.com/mmulet/term.everything/issues/5

[2]https://lobste.rs/s/qh6lil/chafa_terminal_graphics_for_21st_...

[3]https://github.com/wong-justin/vic/issues/1#issue-2586904982


One of the really cool things about chafa is that it has both sixel and kitty graphic renderers! (and iterm2 images as well) So you can output kitty if the terminal supports it, but fall back to ascii if it doesn’t.


Ah, very cool!


I ran into this issue when porting term.everything[0] from typescript to go. I had some c library dependencies that I did need to link, so I had to use cgo. My solution was to do the build process on alpine linux[1] and use static linking[2]. This way it statically links musl libc, which is much friendlier with static linking than glibc. Now, I have a static binary that runs in alpine, Debian, and even bare containers.

Since I have made the change, I have not had anyone open any issues saying they had problems running it on their machines. (Unlike when I was using AppImages, which caused much more trouble than I expected)

[0] https://github.com/mmulet/term.everything look at distribute.sh and the makefile to see how I did it.

[1]in a podman or docker container

[2] -ldflags '-extldflags "-static"'


IMO this is the best approach, but it is worth noting that musl libc is not without its caveats. I'd say for most people it is best to tread carefully and make sure that differences between musl libc and glibc don't cause additional problems for the libraries you are linking to.

There is a decent list of known functional differences on the musl libc wiki:

https://wiki.musl-libc.org/functional-differences-from-glibc...

Overall, though, the vast majority of software works perfectly or near perfectly on musl libc, and that makes this a very compelling option indeed, especially since statically linking glibc is not supported and basically does not work. (And obviously, if you're already using library packages that are packaged for Alpine Linux in the first place, they will likely already have been tested on musl libc, and possibly even patched for better compatibility.)


That is a nice approach. I'll have to give that a try with rclone. I tried lots of things in the past but not using Alpine which is a great idea

Another alternative is

https://github.com/ebitengine/purego

You can use this to dynamic load shared objects / DLLs so in the OP example they could disable systemd support if the systemd shared object did not load.

This technique is used in the cgofuse library ( https://github.com/winfsp/cgofuse ) rclone uses which means rclone can run even if you don't have libfuse/winfsp installed. However the rclone mount subcommand won't work.

The purego lib generalizes this idea. I haven't got round to trying this yet but it looks very promising.


I am using purego indirectly in two pet projects of mine. While it has its own issues it definitely solves the issue of cross-compilation.

In this particular case it may be that they will need to write a wrapper to abstract differences between the systemd C API if it is not stable, but at least they still can compile a binary from macOS to Linux without issues.

The other issue as other said is to use journalctl and just parse the JSON format. Very likely that this would be way more stable, but not sure if it is performant enough.


I use `-ldflags '-extldflags "-static"` as well.

From the .go file, you just do `// #cgo LDFLAGS: -L. -lfoo`.

You definitely do not need Alpine Linux for this. I have done this on Arch Linux. I believe I did not even need musl libc for this, but I potentially could have used it.

I did not think I was doing something revolutionary!

In fact, let me show you a snippet of my build script:

  # Build the Go project with the static library
  if go build -o $PROG_NAME -ldflags '-extldflags "-static"'; then
    echo "Go project built with static library linkage"
  else
    echo "Error: Failed to build the Go project with static library"
    exit 1
  fi

  # Check if the executable is statically linked
  if nm ./$PROG_NAME | grep -q "U "; then
    echo "Error: The generated executable is dynamically linked"
    exit 1
  else
    echo "Successfully built and verified static executable '$PROG_NAME'"
  fi
And like I said, the .go file in question has this:

  // #cgo LDFLAGS: -L. -lfoo
It works perfectly, and should work on any Linux distribution.


I use alpine for this [1] reason, but I will admit that this is a premature-optimization. I haven’t actually ran into the problem myself.

——

Your code is great, I do basically the same thing (great minds think alike!). The only thing I want to add is that cgo supports pkg-config directly [2] via

  // #cgo pkg-config: $lib

So you don’t have to pass in linker flags manually. It’s incredibly convenient.

[1]https://stackoverflow.com/questions/57476533/why-is-statical...

[2]https://github.com/mmulet/term.everything/blob/def8c93a3db25...


Thanks! I did not use pkg-config because the compiled .c is the one I have written specifically for this Go program. :D I did it all on my own system as well (Void Linux).


> do the build process on alpine linux and […] statically link musl libc

IIRC it used to be common to do builds on an old version of RHEL or CentOS and dynamically link an old version of glibc. Binaries would then work on newer systems because glibc is backwards compatible.

Does anyone still use that approach?


If you need glibc for any kind of reason, that approach is still used. But that won’t save you if no glibc is available. And since the folks here want to produce a musl build anyways for alpine, the easier approach is to just go for musl all the way.


Note that you don't have to compile on an Alpine system to achieve this. These instructions should work on most distros:

https://www.arp242.net/static-go.html


> and even bare containers.

Strange, i thought the whole point of containers was to solve this problem.


The whole point of containers is to ship almost the whole OS with the application (It is a technical implementation of the "works on my machine" concept). If the OS you put in your container (by just pulling in a prebuilt image from somewhere) doesn't have the necessary things, then the application would fail to work just the same as if you ran it on the bare operating system with the the same missing libraries.


Depends how much you care about the size and security footprint of your container images.


Static linking doesn't solve security issues either.


Static linking can be a layer of defence against some security issues, depending on your circumstances.

But what I said was "reduced security footprint", considering the trade offs between a single statically linked binary and a full (or even cut down) Linux distribution.


What troubles did you have with AppImages?



Huh. Does term.everything just work, or are there some gotchas? This seems like it could be supremely useful!


It works so far! No major gotchas that I know of yet. From the perspective of the apps, they are just talking to a normal Wayland compositor, so everything works as expected. Just try it for your workflow, and if you run into any problems just open an issue and I’ll fix it.


I didn't see an explanation in the README that part of what the first GIF[1] shows is an effect created by video editing software (and not a screencapture that's just demonstrating the program actually running). "Screen images simulated" are the words usually chosen to start off the disclaimers in fine print shown at the bottom of the screen when similar effects appear in commercials. I think that it would make sense to adopt a similar explanation wrt the effect used for the GIF.

1. <https://github.com/mmulet/term.everything/blob/main/resource...>


Why would an open source project need to have any disclaimer? They are not selling anything.


Because lying is wrong even when open source projects do it.


I think it is a big stretch calling this visual effect lying.

I don’t know if it is a cultural American thing or just difference in interpretation but I had no difficulty understanding that this was a visual effect. But in my country ads don’t come with disclaimers. Do you feel like these disclaimers are truly helpful?


I don't feel that the person I responded to is lying or being intentionally deceptive.


> “in commercials where such effects appear”

Good thing this isn’t a commercial then.


A version of game and watch donkey kong using only CSS and HTML (no javascript!).

You can play the game here: kong.xn--8ws00zhy3a.com


This is exceptionally cool! It looks like this post isn’t getting much love though. I’ll see if I can get this post added to the second chance pool[1] and get it added to the front page!

[1]https://news.ycombinator.com/item?id=26998308


Added! Thanks for requesting this.

All: if you seen a particularly good submission that has fallen through the cracks, please email hn@ycombinator.com so we can take a look and maybe put it in the second-chance pool (https://news.ycombinator.com/pool, explained at https://news.ycombinator.com/item?id=26998308), so it will get a random re-upment on HN's front page.

(Yes, it's permissible to request this for your own stuff, but we like it better when it's something you just ran across randomly and realized was interesting—as mmulet did in this case!)


Wow good to know, thank you guys!


Very cool!


thanks!


This is cool. I love games where they don’t belong!


This looks useful! A lot of the time, I open a Space to work on a project and I want all my folders arranged in a certain way. Until now, I’ve been using Shortcuts, but it would be nice if Finder just remembered where everything should go.


Depends on what resolution your terminal is set to. (Not the resolution of the GUI app you use, just the resolution you display it). At low resolution (640x480) it’s pretty performant, but at 4K I can hear my fans going full blast.


You will be able to copy/paste with term.everything once I implement the Wayland copy/paste interface (wl_data_device_manager).


OMG! That'd be AMAZING. But it still wouldn't render GUI text as terminal font text right?


That’s right, it will still be pixelfied text. We could run ocr on the images then convert to text, but that’s an entirely new can of worms. Make a feature request issue on GitHub if you’re interested,


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: