Hacking
Happiness comes out of contentment, and contentment always comes out of service.
--Harbhajan Singh YogiThere is no easy walk to freedom anywhere, and many of us will have to pass through the valley of the shadow of death again and again before we reach the mountaintop of our desires.
--Nelson MandelaThere are no happy endings in history, only crisis points that pass.
--Isaac Asimov
From me to you
My download area is accessible via HTTPS/HTTP at ftp.sdaoden.eu. It provides -latest symbolic links, e.g., s-web42-latest.tar.gz.asc. The ∞ git(1) repositories are hosted via HTTPS and HTTP at git.sdaoden.eu/cgit/; To clone, replace /cgit/ with /scm/, as in git.sdaoden.eu/scm/. (You could wait five minutes after reading this before cloning from scratch.) Most projects are mirrored for free under my account at ∞ sdaoden@∞ SourceForge.net, and some are also available under the nice and clean interface of ∞ repo.or.cz — thank you!
sdaoden.eu uses the ∞ GNU Mailman mailing-list manager, so users can manage their settings either via web browser by going to lists.sdaoden.eu, or by sending a mail with only the content help to LISTNAME-request@lists.sdaoden.eu. A receive-only very low-volume announcement list covering all my projects is S-announce at lists dot sdaoden dot eu.
I maintain a port collection for ∞ Crux Linux with a few additional little things which are not available by default.
-
S - n a i l (later S - m a i l x) — v14.9.19 (“Tufted titmouse (Indianermeise)”), 2020-04-26
Announcement <> .tar.xz / .tar.xz.asc <> .tar.gz / .tar.gz.asc <> Manual
ML s-mailx@ with archive (also at ∞ The Mail Archive, and via gmane.mail.s-mailx.general, thanks!)
Repository git.sdaoden.eu/{cgit,scm}/s-nail.git, branches[master,stable/{stable,latest},release/{stable,latest},(timeline),(unix-mail),(bsd-Mail),(next)]
Commit logs of[master,stable/*,release/*]are posted to s-mailx-commit@
Repository mirror: ∞ repo.or.cz/s-mailx.git ∞ Coverity Scan: ∞ S-nail (project 444) -
S-nail provides a simple and friendly environment for sending and receiving mail. It is intended to provide the functionality of the POSIX ∞ mailx(1) (∞ Wikipedia) command, but is MIME capable and optionally offers extensions for line editing, S/MIME, SMTP and POP3, among others. It divides incoming mail into its constituent messages and allows the user to deal with them in any order.
It offers many COMMANDS and
INTERNAL VARIABLES for manipulating messages
and sending mail.
It provides the user simple editing capabilities to ease the composition of
outgoing messages, as well as providing the ability to define and send to
names which address groups of users,
and increasingly powerful and reliable non-interactive scripting capabilities.S-nail ships with ∞ KaOS. I am happy and prowd that ∞ “Fossies” — the Fresh Open Source Software Archive ∞ included S-nail in its software collection that sails so close to the wind! And Packages or recipes exist, sometimes under the name mailx. Always up-to-date versions seem to be available at ∞ archlinux (∞ Wiki), ∞ Crux, ∞ Fedora, ∞ FreeBSD, ∞ Gentoo, ∞ OSUKISS, and ∞ Slackware, as well as macOS (via ∞ Homebrew or ∞ MacPorts). Lagging behind a bit, also due to project policies and release cycles, are ∞ Debian and deriviates, and ∞ OpenBSD. At various levels of actuality are ∞ Alpine Linux, ∞ Funtoo, and ∞ The Void (Linux) distribution, as well as Gavin ∞ AUR (s-nail-git).
There are no prerequisites but a normal Unix environment (make(1), an ISO C89 C compiler etc.) and it is also possible to work directly with a repository checkout. The repository layout has been extended after release v14.8.10, and is documented in the projects README file. Users which are only interested in stable changes, but which do not want to wait for releases to gain, e.g., bugfix commits, should probably track only the [stable/stable] branch. Users which also accept backward incompatible changes can track [master], it will eventually be used to create new major or minor releases. To clone the entire repository and locally select what you want, do
$ git clone https://git.sdaoden.eu/scm/s-nail.git $ cd s-nail $ git checkout master $ make CONFIG=MAXIMAL tangerine
It is possible to save a quite a bit of disk space. With a newer ∞ git(1) you can say
$ git clone --single-branch -b stable/stable \ https://git.sdaoden.eu/scm/s-nail.gitBut even otherwise you can be selective:
$ mkdir s-nail.git $ cd s-nail.git $ git init $ git remote add origin -t stable/stable -t 'release/*' -t timeline \ https://git.sdaoden.eu/scm/s-nail.git $ git fetch -v -
m d o c m x — v2, 2015-05-12
Code is part ofS-roff<> Manual
∞ groff(1) enhancement request: ∞ https://savannah.gnu.org/bugs/?45034 -
The mdoc(7) manual semantic markup language does not support any kind of anchoring: whereas you can exactly state what x is whenever you refer to it – variable, function etc. –, you have no option to define the exact place where x is itself defined, or whether it is at all defined in a given manual page.
Also, whereas mdoc(7) does support differentiation in between anchors and references for headlines (.Sh / .Ss and .Sx, respectively), referencing a headline is only of notational interest, the reference is in no way “active”, never.
mdocmx(7) extends mdoc(7) by adding all the missing functionality and more, including (dependent on the output device) referencable external manuals, with a single new multiplexer command: .Mx.
And because non-multipass troff(1) implementations are not capable to generate forward references to anchors not yet defined there is a preprocessor necessary to circumvent this problem: mdocmx(1), implemented in portable sh(1) and awk(1). (A nice property of mdocmx(7) is that it “knows” whether a document has been preprocessed or not, therefore making it possible to distribute preprocessed manuals and still being backward- and forward-compatible.)
For extended user control all parts of the usual manual pipeline require the environment variable MDOCMX_ENABLE=1 to be set to a non-empty value (it must be non-empty because of ∞ groff(1) deficiencies). E.g., on a system where ∞ groff(1) as well as ∞ less(1) have been patched to support mdocmx(7), the following shell functions could be used to read mdoc(7) manuals directly (use ^A, i.e., control-A in less(1) to jump to anchors or read external manuals):
mdoc() { ( MDOCMX_ENABLE=1; export MDOCMX_ENABLE : ${MDOCMXFLAGS:=-dmx-toc-force=tree} mdocmx.sh "${1}" | groff -Tutf8 -mdoc ${MDOCMXFLAGS} | LESS= less --RAW-CONTROL-CHARS --ignore-case --no-init ) }How does it work?
For output devices like HTML or PDF mdocmx(7) will use the corresponding and well-known support troff(1) macro packages to generate anchor and reference information.
For the TTY output device (grotty(1) in ∞ groff(1)) it will inject context information (anchor?, link? and their name) directly via a new troff(1) \X'' command; The TTY output device therefore needs to be extended in order to understand this new command. The context information will then be written to the PAGER as backspace-escaped text — since on Unix backspace-escaped sequences are used to create manual page style formatting information (bold text, text underlining, etc.) since decades, most tested pagers are able to silently ignore those sequences. (Despite the fact that “backspace” is the control character to delete the character before it.)
If the Pager has been extended to actually interpret the backspace-escaped sequences as anchor and reference context information, it can use its normal search facilities to search for anchors and could also offer the possibility to startup man(1) to follow external manual page references.
Note that due to the way that mdoc(7) is implemented section and subsection headers may not contain macro recursions. Please see the referenced ∞ groff(1) enhancement request for more on this; the next mdocmx(7) iteration will generate warnings for such use cases (at least in the preprocess); just as stated in the enhancement request mdoc(7) itself has to be rewritten in order to overcome this restriction.
-
S - W e b 4 2 — v0.9.3, 2020-05-16
.tar.gz.asc / .tar.gz <> Manual
Repository git.sdaoden.eu/{cgit,scm}/s-web42.git, branch[master] -
One more option to manage your website. A camel approach to website building. ∞ vim(1) and it actually generated what you are looking at.
-
S - S y m O b j — v0.8.2, 2016-10-24
.tar.gz.asc / .tar.gz (via ∞ CPAN) <> Manual
Repository git.sdaoden.eu/{cgit,scm}/s-symobj.git, branch[master] -
Throw an eye on my Symbol table and Object ∞ perl(1) module, it offers a somewhat easy symbol table and object creation/management. It is also available in the ∞ Comprehensive Perl Archive Network.
I am using ∞ perl(1) since 1997 in many projects and for a lot of purposes. In all that time i have not found a single bug! Hoooray and thanks, ∞ perl(1) porters!
-
S - T o o l b o x
• S-cdda — v0.8.3, 2020-06-13 — .tar.gz.asc / .tar.gz
Repository git.sdaoden.eu/{cgit,scm}/s-toolbox.git, branch[master]
-
The README as of 2020-06-13:
A repo of some small tools ========================== Somewhat useful: entropy-saver.c: Linux: for my use cases i find it annoying that "entropy_avail" is not incremented when i restore the saved random seed that machines have collected so hard. This little program touches this count also. ... 2019-01-21: Small fixes, and take care for EAGAIN (Bernd Petrovitsch). 2019-01-24: use syslog(3) instead; also test EBUSY (Bernd Petrovitsch). fan-adaptive.sh: "Adaptive", more generic, and much more easily adaptable successor of fancontrol.sh. For now with simulator and MacBook Air model support. See the script header for more. ... 2019-04-09: add a SIGTSTP handler which only stops fans. find-command.sh: Find an executable command within a POSIX shell. which(1) is not standardized, and command(1) -v may return non-executable, so here is how it is possible to really find a usable executable file. Thanks to Robert Elz (kre). ... 2019-02-05: truly support presets again (e.g. "awk=nawk TESTFUN ..."). git-topic-creator.pl: To ease maintaining of topic branches i use a linear history, so that i can use ``$ git rebase -i`` for fixups and squashes, without having to worry about recreation of topic branches. Instead i tag commit messages, and use this script to create the topics once i am finished. Read the --help output for more, and make use of verbosity when you use it first. 2013-09-13: newer git(1) reverse ``rev-parse`` output: adjusted. gmane-fetch.pl: Download NNTP articles from Gmane.org and Gwene.org, incrementally, and store them in (append them to) a local MBOX. Read and adjust the script header for documentation and configuration. ... 2017-07-24: add support for multiple servers and add gwene.org. quote-rndtrip.sh: Round trip quote strings in POSIX (and elder) shell(s). Thanks to Robert Elz (kre). 2019-05-27: ensure outer driver(s) do not leak variabes (Steven Penny). s-cdda.c (manual in s-cdda.1; s-cdda.makefile) v0.8.2: Access digital audio CDs (TOC, MCN, ISRC, CD-TEXT, audio tracks). Developed in 2020 on then current operating-systems and hardware. Not tested with CD-Extra etc (only proofed logically. 2020-03-03: base even track reading upon SCSI MMC commands. And port to DragonFly BSD, FreeBSD, NetBSD, and OpenBSD. 2020-03-10: add CD-TEXT language selection support, drop long options, use regular getopt.h parser. Fix manual installation path. ..2020-03-16: bugfixes, specific audio track lead-out information (in parts different TOC dump format) zte.sh: Control a ZTE modem (MF79 and many others according to web search) from the command line. Needs curl(1) and OpenSSL(1). .. 2018-12-26: "login" now asks until there is a password, but PASSWORD= could still be set to avoid that. You likely do not wanna know: arena-manager: Offers some automatized operations on revision control repositories, like updating, (fast-forward) merging, garbage-collecting. backup.sh: My private backup script. Simple (uses tar(1)), but does some stuff which i need for my work flow (backups data which is in local repo clones but not yet pushed to their "real" counterparts). Needs perl(1). P.S.: it is fantastic to have a filesystem with snapshots thats can be "send" in addition! ... 2016-08-27: FIX faulty xarg/tar -c invocations (Ralph Corderoy) 2019-05-10: extend exclude glob. btrfs-snapshot.sh: Simple script to deal with BTRFS snapshots. ... 2019-09-29: allow directories as arguments to receive-ball. cdoc-freebsd.S: FreeBSD 5.3 x86 prog to open/close /dev/cdrom tray. May work on newer ones, but have not tried it in a while. It had 416 object file bytes when everything was placed in ``.text`` (no .EH frames back then). gen-uushar-wrapper: Creates a shell archive similar to uushar as below, except that the archive (1) consists only of executable file members, and (2) will be itself executable. Run the generated shell archive script to invoke any of its programs. Upon first invocation the wrapper creates a hidden directory in $TMPDIR to unpack its members. Without arguments it shows its contents and the creation date. Simply execute it, it guides through the archive creation process. ... 2016-01-05: port to FreeBSD: uudecode(1) does not honour /dev/stdout in-stream, so give -o command line option. real-periodic.sh: A _real_ periodic for NetBSD, FreeBSD, DragonFly BSD and OpenBSD that ensures that the daily/weekly/monthly maintenance stuff is executed, even if your laptop is running only one hour a day. Invoke this once per hour in the roots crontab and disable the usual periodic stuff of your system instead. Note it does not deal with timezone and DST (daylight saving time) switches, but instead only checks the day of the year that is reported by date(1). E.g., on my FreeBSD 10.0 box:: # do daily/weekly/monthly maintenance 15 * * * * root /usr/bin/nice -n 15 /usr/libexec/real-periodic.sh #1 3 * * * root periodic daily #15 4 * * 6 root periodic weekly #30 5 1 * * root periodic monthly ... uushar (manual in uushar.1): Writes a sh(1) shell script to standard output that recreates the file hierarchy specified by the command line operands. Directories will be recreated and must be specified before the files they contain. Compared to the well-known shar(1) program, uushar(1) adds optional compression and an uuencode(1)/uudecode(1) binary safe layer:: $ uushar [-(Z|z|J|j)] file ... It is easy to insert trojan horses into uushar files. It is thus strongly recommended that all shell archive files be examined before running them through sh(1). Archives produced using this implementation of uushar may be easily examined with the command:: $ grep '^[^X#]' shar.file ... # s-it-mode -
S - r o f f — working on it
Repository git.sdaoden.eu/{cgit,scm}/s-roff.git, branches[master,stable/{stable,latest},release/{stable,latest},(next)]
Commit logs of[master,stable/*,release/*]s-roff-commit@
Repository mirror: ∞ repo.or.cz/s-roff.git -
S-roff is a text processor that formats text. It accepts lines of text interspersed with lines of format control information and formats the text into a printable, paginated document having a user-designed style. S-roff offers unusual freedom in document styling: arbitrary style headers and footers; arbitrary style footnotes; multiple automatic sequence numbering for paragraphs, sections, etc; multiple column output; dynamic font and point-size control; arbitrary horizontal and vertical local motions at any point; and a family of automatic overstriking, bracket construction, and line-drawing functions.
S-roff is a fork of ∞ groff(1), stripped-down to not include any ∞ X.org related facility, the output devices grolj4 and grolbp as well as most contributed packages. The fork happened on the last commit that is still GPL2 licensed (1.19.2-574-gecbf4f1), but almost all changes up to and including v1.22.3 are included, as well as further bug reports.
The plan is to make it UTF-8 clean all through the toolchain, to make it more user friendly, e.g., by adding automatic detection of required preprocessors. Nonetheless keeping backward compatibility and accessibility of individual subcomponents, like nroff, troff and all the preprocessors.
I would like to see the manual all in manual pages (mdoc).
I really would like to have builtin support for TTF/OTF fonts.
All of this is mid– to long–term.First i will completely rework the build system and adapt
this codebase to not need any autotool, but only the shell and make,
just the same easy way as is used for S-nail, then perform a lot of
rather invisible but desired code overhauling, like implementing consistent
argument parsing etc.
I hope this step can be finished in summer 2021,
followed by an early initial release.
From you to me
I love C, ∞ perl(1) and dig plain old sh(1) and awk(1) more and more. I would love C++ (again) if it would be a plain C with classes; maybe not even automatic ctors and dtors. (If i really would go for learning a new language i think i would most likely have a go with ∞ Nim or ∞ Julia. I will however have to and look forward to dig into ∞ Lua.) I have discovered ∞ mksh(1) and use it on all my real-work boxes for years; but ∞ bash is there, too. Whereas ∞ Dropbear SSH is sometimes used for outlined SSH cases, almost all of SSH is driven by the omnipresent ∞ OpenSSH. Since about year 2000 i am a fan (though not a sophisticated user) of ∞ vim(1), it gave up in an endless loop twice. I am thankful for being able to use ∞ git(1) for version control today, after a lot of distress with other VCSs.
When on X(1) i was used to run the fantastic ∞ ahwm(1) window manager from about 2002/3 to November 2018, may Alex Hioreanu himself refer to it as historical or not; but ... i am now using ∞ cwm(1). Because i mostly stay within the ∞ tmux(1) terminal multiplexer, to which i have switched (back) after about six years of using ∞ screen(1), i am satisfied with the minimalistic ∞ st(1) terminal — ∞ rxvt-unicode and its server mode served me very well before that. ∞ lynx(1) for browsing if text based browsing is possible, thus decreasingly often, which i dislike, and ∞ Firefox (pre-compiled) otherwise. Mail messages are being passed through ∞ bogofilter for Bayesian filtering, i have written and use a ∞ LMDB backend for and with it. I ended up using solely ∞ groff(1) for document preparation, viewing PDFs with ∞ mupdf(1); i do use ∞ Ghostscript.com from the same source.
It would also not work without enscript, less, curl, openssl, all the compression tools, the filesystems and their tools, dhcpcd, wpa_supplicant, and all the other network tools, multimedia tools like ffmpeg, vorbis-tools, ogg123, sox, faad2, faac, of course xorg, and all the free compilers out there, gcc, clang, pcc and tinyc, and tools surrounding object files.
I am very thankful for being able to use virtual machines via ∞ QEMU: it is so handy to have a bunch of operating systems at hand for immediate testing, just as necessary! I have used ∞ FreeBSD for about ten years, and again since 2015. It and ∞ Crux-∞ Linux with nice SysV init are my development boxes. I am also using ∞ archlinux, ∞ NetBSD, ∞ OpenBSD and ∞ The Void (Linux) distribution, and there are VMs with other systems, like ∞ DragonFly. I am in favour of BSD, it is a complete, self-contained environment, with good and up-to-date documentation. Just like ∞ Crux-∞ Linux.
While looking around for ∞ Unicode aware software i have been pointed to the ∞ Plan9 from Bell Labs operating system, which has been unknown to me before, and its ∞ 9atom and ∞ 9front extenders, which unfortunately have all died in the meantime, except for the latter; sometimes i wish i would have known Plan9 15 years earlier, and that it would have been licensed under BSD copyright back then, who knows how that relationship would have ended.
This server
The server sdaoden.eu is driven by the ∞ Alpine Linux operating system (after a month of a quick-and-dirty (via inetd) setup ∞ FreeBSD system) with ∞ tc(8) (iproute2) traffic shaping in combination with an ∞ iptables(8) firewall. ∞ Dnsmasq caches DNS queries. ∞ OpenSSH handles SSH, ∞ OpenNTPD synchronizes the system clock. ∞ Postfix manages SMTP and provides mailing lists via ∞ GNU Mailman. Web pages are served by the ∞ lighttpd web server and ∞ cgit makes the ∞ git(1) repositories accessible via HTTPS/HTTP for browsing purposes. Most services of sdaoden.eu are secured with a free certificate obtained from ∞ Let's Encrypt, which is managed by cron job via ∞ dehydrated. The server is a VM hosted by ∞ Portunity with the use of green energy.