Moving my Fediverse account to emacs.ch
I have moved my main Fediverse account from @xgqt@fosstodon.org to @xgqt@emacs.ch.
The new account’s RSS feed can be found at emacs.ch/users/xgqt.rss.
I have moved my main Fediverse account from @xgqt@fosstodon.org to @xgqt@emacs.ch.
The new account’s RSS feed can be found at emacs.ch/users/xgqt.rss.
First let’s prepare a suitable nginx configuration file.
This one is pretty bare but it works well for our case:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
worker_processes 1; daemon off; pid ./nginx/temp/nginx.pid; error_log /dev/stdout info; events { worker_connections 1024; } http { client_body_temp_path ./nginx/temp/client 1 2; proxy_temp_path ./nginx/temp/proxy; fastcgi_temp_path ./nginx/temp/fastcgi; uwsgi_temp_path ./nginx/temp/uwsgi; scgi_temp_path ./nginx/temp/scgi; server { listen 127.0.0.1:8080; server_name localhost; access_log /dev/stdout; error_log /dev/stdout info; root ./; location / { autoindex on; } } } |
Server config is set up for serving all static files from the current directory.
Based on how you want to store _temp_path files it might be necessary to create (or clean up) additional directories, for example:
1 2 |
rm -r ./nginx/temp mkdir -p ./nginx/temp |
1 |
nginx -c ./nginx.conf -p ./ |
BTW, you may want to replace ./ with "$(pwd)" and occurrences in the config with static paths.
Some of no-dependency-except-itself http servers it’s good to know about:
1 |
python3 -m http.server -b 127.0.0.1 8080 |
1 |
busybox httpd -f -p 127.0.0.1:8080 -v |
You can read more about configuring busybox’s httpd on OpenWRT docs.
Emerge qemu with static-user USE enabled and your wanted architectures.
1 2 3 4 5 6 7 8 |
app-emulation/qemu QEMU_SOFTMMU_TARGETS: aarch64 arm x86_64 app-emulation/qemu QEMU_USER_TARGETS: aarch64 arm x86_64 app-emulation/qemu static-user dev-libs/glib static-libs sys-apps/attr static-libs sys-libs/zlib static-libs dev-libs/libpcre2 static-libs |
Enable qemu-binfmt:
1 |
rc-update add qemu-binfmt default |
Start qemu-binfmt:
1 |
rc-service qemu-binfmt start |
/chroots/gentoo-arm64-musl-stable)mkdir -p /chroots/gentoo-arm64-musl-stable/var/cache/distfilesbwrap
ro-bind mount the qemu emulator binary (eg qemu-aarch64)bash)Chroot with bwrap:
1 2 3 4 5 6 7 8 9 10 |
bwrap \ --bind /chroots/gentoo-arm64-musl-stable / \ --dev /dev \ --proc /proc \ --perms 1777 --tmpfs /dev/shm \ --tmpfs /run \ --ro-bind /etc/resolv.conf /etc/resolv.conf \ --bind /var/cache/distfiles /var/cache/distfiles \ --ro-bind /usr/bin/qemu-aarch64 /usr/bin/qemu-aarch64 \ /usr/bin/qemu-aarch64 /bin/bash -l |
By default you would probably have something like this, the user-mode network:
1 2 3 4 5 |
<interface type="user"> <mac address="00:00:00:00:00:00"/> <model type="virtio"/> <address type="pci" domain="0x0000" bus="0x01" slot="0x00" function="0x0"/> </interface> |
Bridges can be easily created using the NetworkManager’s TUI tool called nmtui.
1 2 3 4 5 6 7 8 |
<interface type="bridge"> <mac address="00:00:00:00:00:00"/> <source bridge="br1"/> <target dev="vnet2"/> <model type="virtio"/> <alias name="net0"/> <address type="pci" domain="0x0000" bus="0x06" slot="0x00" function="0x0"/> </interface> |
Be sure the following options are enabled (1):
net.ipv4.ip_forwardnet.ipv4.conf.all.send_redirectsand the following options are disabled (0):
net.bridge.bridge-nf-call-iptablesAs a part of my work of modernizing the way .NET SDK packages are distributed in Gentoo I delved into packaging a from-source build of PowerShell for Gentoo using the dotnet-pkg eclass.
Packaging pwsh was a little tricky but I got a lot of help from reading the Alpine Linux’s APKBUILD. I had to generate special C# code bindings with ResGen and repackage the PowerShell tarball. Other than this trick, restoring and building PowerShell was pretty straight forward with the NuGet package management support from the dotnet-pkg.eclass.
Alternatively if you do not want to build PowerShell you can install the binary package, I have in plans to keep that package around even after we get the non-binary app-shells/pwsh into the official Gentoo ebuild repository.
But why stop on PowerShell when we can also package multiple PS modules?
Installing modules via Portage has many benefits:
PowerShell’s method of finding modules is at follows: check paths from the PSModulePath environment variable for directories containing valid .psd1 files which define the PS modules.
By default pwsh tries to find modules in paths:
~/.local/share/powershell/Modules/usr/local — /usr/local/share/powershell/ModulesModules directory inside the pwsh home — for example /usr/share/pwsh-7.3/ModulesBecause we do not want to touch either /usr/local nor pwsh home, we embed a special environment variable inside the pwsh launcher script to extend the path where pwsh looks for PS modules. The new module directory is located at /usr/share/GentooPowerShell/Modules.
1 2 |
dotnet-pkg-utils_append_launchervar \ 'PSModulePath="${PSModulePath}:/usr/share/GentooPowerShell/Modules:"' |
So every PowerShell module will install it’s files inside /usr/share/GentooPowerShell/Modules.
To follow PS module location convention we add to that path a segment for the real module name and a segment for module version. This also enables us to have proper multi-slotting because most of the time the modules will not block installing other versions.
Take a look at this example from the app-pwsh/posh-dotnet–1.2.3 ebuild:
1 2 3 4 5 6 |
src_install() { insinto /usr/share/GentooPowerShell/Modules/${PN}/${PV} doins ${PN}.psd1 ${PN}.psm1 einstalldocs } |
And that is it. Some packages do not even need to be compiled, they just need files placed into specific location. But when compilation of C# code is needed we have dotnet-pkg to help.
The binary packages generated by user can have architecture-specific optimizations because they are generated after they were compiled by the host Portage installation.
In addition binpkgs are generated from ebuilds so if there is a USE flag incompatibility on the consumer system then the binpkg will not be installed on the host and Portage will fall back to from-source compilation.
Those binary packages can use two formats: XPAK and GPKG.
XPAK had many issues and is getting superseded by the GPKG format. Beware of upcoming GPKG transition and if you must use XPAKs then you should explicitly enable it in your system’s Portage configuration.
To host a binary package distribution server see the Binary package guide on the Gentoo wiki.
Binary packages in ::gentoo (the official Gentoo repository) have the
-bin suffix.
Those packages might have USE flags but generally they are very limited in case of customizations or code optimizations because they were compiled either by a Gentoo developer or by a given package upstream maintainer (or their CI/CD system).
Those packages land in ::gentoo mostly because it is too hard (or even impossible) to compile them natively by Portage. Most of the time those packages use very complicated build systems or do not play nice with network sandbox like (e.g. Scala-based projects) or use very large frameworks/libraries like (e.g.
Electron).
They can also be added to the repository because they are very
desirable either by normal users (e.g. www-client/firefox-bin) or for (from-source) package
bootstrapping purposes (e.g. dev-java/openjdk-bin). Such packages are sometimes generated from the regular source packages inside ::gentoo and later repackaged.
The file lit.site.cfg has to be inspected for any incorrect calls to executables. For example see src_prepare function form dev-lang/boogie.
Because we will need to specify how many threads should lit run we need to inherit multiprocessing to detect how many parallel jobs the portage config sets.
1 |
inherit multiprocessing
|
Ensure that dev-python/lit is in BDEPEND, but also additional packages may be needed, for example dev-python/OutputCheck.
1 2 3 4 5 6 7 |
BDEPEND=" ${RDEPEND} test? ( dev-python/lit dev-python/OutputCheck ) " |
To deal with bad test you can simply remove the files causing the failures.
1 2 3 4 5 6 7 8 9 |
local -a bad_tests=( civl/inductive-sequentialization/BroadcastConsensus.bpl civl/inductive-sequentialization/PingPong.bpl livevars/bla1.bpl ) local bad_test for bad_test in ${bad_tests[@]} ; do rm "${S}"/Test/${bad_test} || die done |
--threads $(makeopts_jobs) specifies how many parallel tests to run.
--verbose option will show output of failed tests.
Last lit argument specifies where lit should look for lit.site.cfg and tests.
1 2 3 |
src_test() { lit --threads $(makeopts_jobs) --verbose "${S}"/Test || die } |
Recently while browsing the Alpine git repo I noticed they have a function called snapshot, see: https://git.alpinelinux.org/aports/tree/testing/dart/APKBUILD#n45 I am not 100% sure about how that works but a wild guess is that the developers can run that function to fetch the sources and maybe later upload them to the Alpine repo or some sort of (cloud?) storage.
In Portage there exists a pkg_config function used to run miscellaneous configuration for packages. The only major difference between src_snapshot and that would of course be that users would never run snapshot.
Probably only the network sandbox would have to be lifted out… to fetch the sources of course.
But also a few (at least one?) special directories and variables would be useful.
Configure the following for Portage.
1 |
dev-util/pkgcheck emacs |
Emerge the following packages:
app-emacs/company-ebuilddev-util/pkgcheckCompany-Ebuild should pull in app-emacs/ebuild-mode, if that does not happen, then report a bug ;-D
Add the following to your user's Emacs initialization file. The initialization file is either ~/.emacs.d/init.el or ~/.config/emacs/init.el for newer versions of GNU Emacs.
1 2 3 4 5 6 7 8 |
(require 'ebuild-mode) (require 'company-ebuild) (require 'flycheck) (require 'flycheck-pkgcheck) (add-hook 'ebuild-mode-hook 'company-ebuild-setup) (add-hook 'ebuild-mode-hook 'flycheck-mode) (add-hook 'ebuild-mode-hook 'flycheck-pkgcheck-setup) |
We can also configure our environment using a use-package macro that simplifies the setup a little bit.
To use the below configuration the app-emacs/use-package package will have to be installed.
1 2 3 4 5 6 7 8 9 |
(require 'use-package) (use-package ebuild-mode :defer t :mode "\\.\\(ebuild\\|eclass\\)\\'" :hook ((ebuild-mode . company-ebuild-setup) (ebuild-mode . flycheck-mode) (ebuild-mode . flycheck-pkgcheck-setup))) |
The :defer t and :mode "..." enable deferred loading which theoretically speeds up GNU Emacs initialization time at the cost of running the whole use-package block of ebuild-mode configuration when the :mode condition is met.
If you prefer to follow my posts on Fosstodon via RSS, then here is the link: fosstodon.org/users/xgqt.rss.
Force web UI dark mode
1 |
--enable-features=WebUIDarkMode --force-dark-mode |
Accelerated video decoding and GPU support
1 |
--enable-accelerated-video-decode --enable-gpu
|
1 |
--enable-reader-mode |
Use the cache directory /run/user/1000/chrome/cache
1 |
--disk-cache-dir=${XDG_RUNTIME_DIR}/chrome/cache |
Sawn a window of size 1200x900
1 |
--window-size=1200,900 |
The file /etc/chromium/default is sourced by the Chromium launcher, that's why we can sue bash syntax here.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#!/usr/bin/env bash # Dark interface # Force web UI dark mode CHROMIUM_FLAGS="${CHROMIUM_FLAGS} --enable-features=WebUIDarkMode --force-dark-mode" # Hardware acceleration # Accelerated video decoding and GPU support CHROMIUM_FLAGS="${CHROMIUM_FLAGS} --enable-accelerated-video-decode --enable-gpu" # Reader mode CHROMIUM_FLAGS="${CHROMIUM_FLAGS} --enable-reader-mode" # Runtime cache # Use the cache directory /run/user/1000/chrome/cache CHROMIUM_FLAGS="${CHROMIUM_FLAGS} --disk-cache-dir=${XDG_RUNTIME_DIR}/chrome/cache" # Window size # Sawn a window of size 1200x900 CHROMIUM_FLAGS="${CHROMIUM_FLAGS} --window-size=1200,900" |
If you use www-client/chromium-bin, then the config is located at /etc/chromium/default and CHROMIUM_FLAGS is CHROMIUM_BIN_FLAGS.
Sometimes while the Emacs GUI window is tiled to a side or maximized small gaps may appear around the window. This "bug" can be worked around by:
Emacs daemon can help with that. But before you run emacs --daemon, I need You to know that there might be a better way:
1 2 |
(unless (or noninteractive (server-running-p)) (server-start)) |
Adding the above to Your Emacs config will cause Emacs to start a daemon after it is opened (and no other Emacs servers are running), this also does not require --daemon flag.
After the daemon is started You can open files by right-clicking on them and selecting to open them in "Emacsclient".
Furthermore: You also utilize --iconic and add emacs --iconic to your Plasma startup. This is way better than using emacs --daemon because you can just click on your taskbar to open the minimized Emacs window. Also, Emacs will load all Your graphical libraries and configurations so Your theme will look properly and not as if Emacs was being used on the console.
Sadly I have not found any theme that would look like Plasma. I use the spacemacs theme which looks a little bit similar, especially the background color comes close to Breeze's dark background color.
Note that the theme which You load with the function load-theme is a different thing that the GTK theme Emacs uses.
The GTK theme should be enabled if Your Emacs version is built with GTK support. On Gentoo this setting is controlled with the gtk USE flag. Also the flag toolkit-scroll-bars can be enabled for a look of scroll-bars consistent with the selected toolkit.
There is a different approach to theming Your Emacs that loading a theme defined in ELisp - You can use a ~/.Xresource file.
If you do not load any theme in your configuration Emacs will by default read the .Xresources file, unless the --no-x-resources flag is used.
Here are a few Xresources config files that come close to the default Breeze theme:
Emacs can be built with FreeDesktop's D-Bus support to communicate over the dbus protocol. This can come handy when using ERC as it has a setting to enable desktop notifications on mentions (erc-desktop-notifications.el).
The dbus interface can also be utilized to query desktop-oriented daemons, for example this library talks to the Bluetooth daemon.
Those are some ELisp libraries that I found while browsing GitHub, they might be useful for somebody who delves into KDE app development.
In addition to async-shell-command and start-process-shell-command I wrote this small library that may come handy.
Sadly the KDE team did not add support to emulate Emacs-like keys in Plasma itself, but some applications like, for example Kate have configuration options to customize the key bindings. This is a repository explaining how to setup Kate's bindings.
With this commit first GNU Emacs integration was merged into the pkgcheck repository.
Huge thanks to Sam James and Arthur Zamarin for support and interest in getting this feature done.
The Flycheck integration is unreleased as of now, this will (hopefully) change in the future, but for now You need live versions of snakeoil, pkgcore and pkgcheck.
File: /etc/portage/package.accept_keywords/pkgcore.conf
1 2 3 |
dev-python/snakeoil ** sys-apps/pkgcore ** dev-util/pkgcheck ** |
Also You will need to unmask app-emacs/flycheck and its dependencies.
File: /etc/portage/package.accept_keywords/emacs.conf
1 2 3 |
app-emacs/epl app-emacs/pkg-info app-emacs/flycheck |
Install pkgcheck with the emacs USE flag enabled.
File: /etc/portage/package.use/pkgcore.conf
1 |
dev-util/pkgcheck emacs |
Afterwards run:
1 2 |
emerge -1av dev-python/snakeoil sys-apps/pkgcore dev-util/pkgcheck emerge -av --noreplace dev-util/pkgcheck |
Following is what I would suggest to put into your Emacs config file:
1 2 3 4 5 6 7 8 |
(require 'ebuild-mode) (require 'flycheck) (require 'flycheck-pkgcheck) (setq flycheck-pkgcheck-enable t) (add-hook 'ebuild-mode-hook 'flycheck-mode) (add-hook 'ebuild-mode-hook 'flycheck-pkgcheck-setup) |
If You are using use-package:
1 2 3 4 5 6 7 8 9 10 11 |
(use-package flycheck :ensure nil) (use-package ebuild-mode :ensure nil :hook ((ebuild-mode . flycheck-mode))) (use-package flycheck-pkgcheck :ensure nil :custom ((flycheck-pkgcheck-enable t)) :hook ((ebuild-mode . flycheck-pkgcheck-setup))) |
The lines with :ensure nil are there to prevent use-package from trying to download the particular package from Elpa (because we use system packages for this configuration).
Instead of changing CSS style for Your Racket projects documentation, You may be interested in compiling Markdown files generated form Scribble source into HTML documentation website.
Create docs directory and mkdocs.yml config file in current directory, along with a dummy index.md file in docs folder.
1 |
mkdocs new . |
Edit the name of the project.
Replace Racket-Project with your project name.
1 2 |
--- site_name: Racket-Project |
Generate markdown files form scribble documentation.
Replace Racket-Project.scrbl with path to your scribble documentation main source file.
1 |
scribble --markdown --dest ./docs --dest-name index.md Racket-Project.scrbl |
Compile HTML documentation from the markdown source.
1 |
mkdocs build
|
HTML files should appear in the site directory.
Some features, like search for example are only available when running the mkdocs server.
1 |
mkdocs serve
|
Some scribble functions do not look good or work correctly for markdown-to-HTML compilation by MkDocs.
table-of-contents - looks like a source block
index-section - letter links do not work
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
site_name: Racket-Ebuild site_author: xgqt@riseup.net site_description: library to ease ebuild creation site_url: https://gitlab.com/gentoo-racket/racket-ebuild repo_name: gentoo-racket/racket-ebuild repo_url: https://gitlab.com/gentoo-racket/racket-ebuild plugins: - search theme: name: material extra: social: - icon: fontawesome/brands/gitlab link: https://gitlab.com/gentoo-racket/racket-ebuild |
First using a needle or a toothpick click a button on the right side of the laptop (indicated by a bent arrow), this will start the machine up in BIOS selection menu where you choose the BIOS setup option.
Then, in the BIOS menu disable option to check laptop charge level while it is shut down. If not disabled it will interfere with key combination that has to be pressed while laptop is shut down. This can be turned back after the advanced BIOS menu is enabled.
After that "Exit saving changes" and shutdown.
I thought it was a joke at first but it really is true that a special combination of keys has to be pressed depending on the laptop model (while it is shut down).
For my laptop it is as follows:
1 2 3 |
F4 4 r f v F5 5 t g b F6 6 y h n |