Potential benefits
Running tests
- test BEFORE (
src_test) and AFTER (pkg_postinst) installation
- test if and how services break if they are not reloaded
- test buildsystem configuration
- sandbox enforces strict and consistent build rules
- benchmarking with different compilation flags and libraries versions/releases
Configuration matrix
We can test across Cartesian product of different configuration settings, like:
- USE flags
- MAKEOPTS
- CFLAGS, CXXFLAGS, CPPFLAGS, LDFAGS, RUSTFLAGS, etc.
- arches (cross-compilation or run in qemu)
- static linking
- supported releases & versions of libraries (eg. glibc & musl)
Also, we could create diffs of installed files across different merges.
Reproducibility
- mini overlay with ::gentoo or any other (eg. company's own) as master
- record VCS (eg. git) hash of the dependent overlays
Binaries
- grab dependencies from binhosts
- distribute built binaries (maybe upload to a company's own artifacts server)
- make AppImages
Getting there
How do we run this?
Do we want to write a proper tool, which we probably do or do we just run Portage + shells scripts?
Do we want to run under root, user, in eprefix, maybe all in docker?
Configuration files
The .portci directory contains the configuration.
Bug 799626
Link: bugs.gentoo.org/799626
Instead of using Ansible, Python, Yaml or Scheme we might use something similar to this for simple configuration, or if gets merged to upstream Portage the better.
Worth mentioning is the idea from Michał Górny who proposes to configure portage with toml files, like the example given in the bug report.
|
|
[package.unmask]
~virtual/libcrypt-2
[package.use.mask]
sys-libs/libxcrypt -system -split-usr
[package.use.force]
sys-libs/glibc -crypt
|
Also, package.x + Toml == a match made in heaven, it looks very nice!
Make gallery-dl work like youtube-dl
A configuration file to download everything into current directory, like yotube-dl does.
File: ~/.config/gallery-dl/config.json
|
|
{
"directory": [],
"base-directory": "./"
}
|
Switching from a git repository hosting
For nearly 2 years I have been synchronizing settings between my Gentoo machines via a git repository that is installed system-wide via portage itself.
This actually gets a little tiresome and slow as the package that installs the configuration has to be re-installed each time we want to update the settings.
So I thought it could be cool if I can just push files around between my machines with one command. Now: we can use rsync or scp but /etc/portage is owned by root so we either have to change the permissions to a user we use to ssh or a group that user is in.
Portage users
First change portage permissions of /etc/portage, now all users in the portage group will be able to modify the configuration
|
|
chown -R root:portage /etc/portage
chmod -R g+w /etc/portage
|
Synchronizing
We can do a rsync from different machine with:
|
|
rsync -r /etc/portage REMOTEHOST:/etc --exclude=".git" --exclude="make.profile" --copy-unsafe-links
|
Reminder that this can also be done as a cron job!
Portage snapshots with git
Probably the best thing I got out of genlica is that I engineered a script to automatically do a git commit of the changes to the portage configuration.
Emerge git
|
|
emerge --noreplace --verbose dev-vcs/git
|
Copy the file that does the snapshots
|
|
mkdir -p /etc/portage/postsync.d
curl -o /etc/portage/postsync.d/99-degitmerge.sh "https://gitlab.com/xgqt/genlica/-/raw/master/portage/postsync.d/99-degitmerge.sh"
|
How it should be?
I imagine that a web browser should have been a "window" to the Internet world that provides easy and efficient way to graphically access resources exposed by multiple protocols: HTTP(S), (S)FTP, Gopher, Gemini, etc…
How it is?
Only few protocols are supported!
Recently FTP support got "deprecated" in Firefox. It can still be enabled in
by setting network.ftp.enabled to true. FTP support is announced to be completely gone in FF 90. Chrome dropped FTP some time ago. # BUT! Luckily we have Emacs! GNU Emacs has packages to support all kinds of protocols. - eww which is a simple HTTP(S) browser like w3m (also renders images) - tramp allows you to access files by SSH - elpher allows you to access Gemini and Gopher sites (graphically) - ange-ftp allows you to connect to FTP servers - and finally net-utils which wraps around system utilities to provide interactive mode for many protocols, ie.: gopher, irc, ntp, pop3, www
Also see: Fast-Racket at Racket's GitHub Wiki
Creating binaries
You can create portable binaries with Racket's raco command! Use raco exe and raco distribute.
More -> https://docs.racket-lang.org/raco/exe.html
Sample games
Racket provides a executable plt-games, when ran (from console) it opens a menu of miscellaneous games, among them: jewel, minesweeper, aces, spider, checkers. & more (20 games total).
Plots
You can plot data in 2d & 3d forms.
2D
Sample code:
|
|
#lang racket/base
(require racket/gui/base racket/math plot)
(plot-new-window? #true)
(plot (function sin (- pi) pi #:label "y = sin(x)"))
|
3D
Sample code:
|
|
#lang racket/base
(require racket/gui/base racket/math plot)
(plot-new-window? #true)
(plot3d
(surface3d (lambda (x y) (* (cos x) (sin y)))
(- pi) pi (- pi) pi)
#:title "An R × R → R function"
#:x-label "x" #:y-label "y" #:z-label "cos(x) sin(y)")
|
Browser
There's a included library to render web pages, just "(require browser)".
Sample code:
|
|
#lang racket
(require browser)
(open-url "https://xgqt.gitlab.io/")
|
FFI
You can use Racket's Foreign Function Interface to interact with non-Racket libraries to make use of very fast libraries written in (mainly) FORTRAN & C.
For example sci uses FFI for CBLAS & LAPACK.
Parallelism
For greater speed up with parallel execution there are futures, places and distributed places (for distributed programming).