Hacker News new | ask | show | jobs
by G4Vi 1286 days ago
Author here. Nice comparison. By default (and the released) APPerl binaries do not self-modify (they use the non-self modifying ape loader) however on unix-like they install the APE loader to`$HOME/.ape`and use that ELF executable to run the APE. To skip the fork+exec to the ape loader, they can be assimilated with `--assimilate`, that does turn the APE executable into ELF.

There is a kernel patch to add APE (Actually Portable Executable) support to Linux removing the need for the the apeloader or assimilating. I'm not sure what the status is on that.

3 comments

I forgot to mention APPerl and StaticPerl have many overlapping use cases, but APPerl is more tailored to application packaging. APPerl is built with a patch to Perl adding argv[0] script execution, allowing the APPerl binary to turn into a binary for any of the embedded scripts, with a rename or symlink rather then needing to pass flags the Perl executable to load modules.
Update on the APE Linux kernel support (for fork/ --assimilate)less APE execution. jart informed me: "It's in the process of being emailed out to the kernel developers. I anticipate it'll be merged within the next three months."
Could you suggest a way to do electron-like apps in APPerl?

I'm thinking of serving content on 127.0.0.2. There is no need for a high performance server like nginx, but serving files and having some CGI capability would be a plus.

I'd be interested in suggestions for the HTTP server part and maybe an example for how do serve an index.pl file that reads payload files packaged in the APPerl binary (ex: .js, .jpg)

I would first create a script that runs a web server that performs as expected (serving files, and handling dynamic functionality in the script or in a perl module, or by paths to cgi scripts as needed). I rolled by own for packing my personal http media server (MHFS), but there's plenty of HTTP servers on CPAN. I'm not sure which one's are best.

Then, I would create a custom build of APPerl using Perl::Dist::APPerl 's apperlm and modifying the apperl-project.json to pack in the script, CPAN modules, cgi files, and the static resources into a APPerl binary. When bundled into APPerl, the script can read the files embedded in APPerl from the /zip path.

Perl::Dist::APPerl (with tutorial on building apps): https://metacpan.org/pod/Perl::Dist::APPerl

MHFS's APPerl packaging config: https://github.com/G4Vi/MHFS/blob/master/apperl/apperl-proje...

> there's plenty of HTTP servers on CPAN. I'm not sure which one's are best.

Same. I know about HTTP::Daemon, HTTP::Tiny and HTTP::Server::Simple

If you have tried one of the 3 and can confirm it works with APPerl, it might save time?

If not, first with HTTP::Daemon (since it shows how to bind to a given IP in https://gist.github.com/mikkun/6388508, unlike HTTP::Tiny) I will try to release something similar to redbean but based on perl and DBD::SQLite

> When bundled into APPerl, the script can read the files embedded in APPerl from the /zip path.

That much I knew, but I was afraid there might be extra things needed

> MHFS's APPerl packaging config: https://github.com/G4Vi/MHFS/blob/master/apperl/apperl-proje...

Thank you! Then I might go with MHFS at first (tweaking its index.pl), if only because it's been tested by you with APPerl :)

> HTTP::Daemon, HTTP::Tiny and HTTP::Server::Simple

I haven't tested any. Pure Perl servers should be the easiest to get working. The Cosmopolitan Libc doesn't support fcntl F_SETFL O_NONBLOCK on Windows yet, and so non-blocking / event loop servers may be a no-go for now.

> I will try to release something similar to redbean but based on perl and DBD::SQLite

I'd like to see this.

> Then I might go with MHFS at first

I wouldn't consider MHFS's HTTP server "production ready" and suffers from the above mentioned O_NONBLOCK issue, but I'm curious how it would go.

If you haven't already, feel free to join the Redbean/Cosmopolitan Libc discord to discuss. (There's a link on the APPerl webpage).

FYI, building on windows make it detect Trojan:Win32/Wacatac.H!ml

I used your perl.com as an input. Fake positive? Or have you been infected?

Also, even if I cpan install the modules and have:

         "perl_repo_files" : {"cpan" : [
            "HTML-Template",
            "URI",
            "Class-Inspector",
            "HTTP-Daemon",
            "HTTP-Status",
            "IPC-Open2"
         }
I get:

C:\test> .\test.com Can't locate HTTP/Daemon.pm in @INC (you may need to install the HTTP::Daemon module) (@INC contains: . /zip/lib/perl5/site_perl/5.36.0/x86_64-cosmo /zip/lib/perl5/site_perl/5.36.0 /zip/lib/perl5/5.36.0/x86_64-cosmo /zip/lib/perl5/5.36.0) at /zip/bin/test line 9. BEGIN failed--compilation aborted at /zip/bin/test line 9.

Do I need to use https://github.com/G4Vi/MHFS/blob/master/apperl/download_pac... or something else to put the dependencies pm files in the zip?

It's mostly likely a false positive, but you're welcome to build from source with apperlm. The polygot binary format including the compressed ZIP archive probably sets off the scanners. The official APPerl binaries are compiled and uploaded by Github Actions: https://github.com/G4Vi/Perl-Dist-APPerl/blob/master/.github...

apperlm does not download perl module dependencies right now, but download_package.pl can be used to download dependencies. apperlm mostly just acts as a glorified front-end to Info-ZIP when doing a build of a "nobuild" config (building off of existing apperl)

download_package.pl example https://github.com/G4Vi/MHFS/blob/6db6ad24886ca0ea335a050228...

Edit: You can see what files were packed into it by renaming with .zip extension and opening with Windows Explorer.

Edit 2: "perl_repo_files" just specifies where to copy files to inside of the perl source tree. It is only used if you are building APPerl from source (it is unused if you are building a "nobuild" config). IPC-Open2 should already be bundled in the full perl.com as it's included in the perl5 repo: https://github.com/G4Vi/perl5/tree/cosmo-apperl/ext/IPC-Open...