My personal website
git clone git://
Log | Files | Refs

index.txt (22790B)

      1 Hello! I am Cem, and this is my little blog that I rarely ever use. I am a
      2 Software Engineering student at the Berlin CODE university, the maintainer of
      3 Carbs Linux, and I occasionally compose music (mostly jazz and classical).
      5 My repositories are really scattered, so see the [software] section if you
      6 are looking for one of my works.
      8 This page is curl friendly! Just replace '.html' with '.txt', and you will be
      9 able to view this site in your favourite pager! In your terminal simply type:
     11     curl -sL | less
     14 [software]: /software.html
     16 [RSS Feed](/rss.xml) | [Blog Index](/blog.html)
     18 ********************************************************************************
     20 My thoughts on execline
     21 ================================================================================
     22 [Permalink](/blog/20211012-execline.html)
     24 Date: Oct 12 2021
     27 With the gaining popularity of the [s6-rc], I have recently decided to check out
     28 [execline]. It is a shell-like scripting language that is built around chaining
     29 commands together. There is no interpreter, there is no 'built-in' functionality
     30 even though the docs might make you think there are. Execline is best described
     31 as a suite of tools that imitate the functionality of a shell.
     33 There are a ton of information on the execline's page, especially discussing
     34 why skarnet prefers execline instead of `/bin/sh`. Those points are mostly
     35 valid, shells are a nightmare, and they suck at being compliant to the POSIX
     36 specification. What I don't agree with the [why not sh] page, however, is the
     37 part on performance. Even though execline does not have an interactive shell
     38 implementation of its own, it is still much slower than other shells simply by
     39 its design. Since the design of execline is built on process chaining, it
     40 requires spawning new processes for things as basic as variable declaration.
     41 Variable manipulation is the cheapest operation you would expect from a shell,
     42 but in execline, every operation costs the same regardless of how simple it is.
     44 Throughout my weeks of toying around with execline, I have came to the
     45 conclusion that execline is much better in simple scripts only. Execline is
     46 as usable as any shell out there, but even with its advantages over `sh`,
     47 execline is only better if it's simple. Execline is really good for certain
     48 specific situations such as service scripts (as used in s6-rc), or where you
     49 were already meant to chain a couple of commands together. After all, skarnet
     50 already presents these limitations on the website of execline.
     52 Execline can be leveraged as how s6-rc compiles service databases with other
     53 utilities, but I don't think it can be used as a shell replacement itself. It's
     54 not the next shiny thing to jump on to replace all your shell scripts with
     55 (unless you have really basic shell scripts). It does not have the flexibility
     56 nor the performance of the shell for scripts that can be considered a little
     57 over than the "basic".
     60 [s6-rc]:
     61 [execline]:
     62 [why not sh]:
     64 ********************************************************************************
     66 Reimplementing `sysmgr` in C
     67 ================================================================================
     68 [Permalink](/blog/20201002-reimplementing-sysmgr-in-c.html)
     70 Date: Oct 02 2020
     73 For a while, I have been thinking about implementing [sysmgr] in C. I started
     74 thinking about the inefficiencies of sysmgr. POSIX sh isn't particularly
     75 designed to have ultimate control over child processes. There are basic job
     76 management features that are _just enough_ for sysmgr to do its job. The
     77 biggest pain is having to use tools like `sleep(1)` and `kill(1)`. Calling
     78 sleep every second, and using the kill command to check whether a process is
     79 alive or not is extremely inefficient. Some shells _do_ include these commands
     80 built-in, but it isn't specified by POSIX, but one should never take this as
     81 granted.
     83 Lately, I have been adding C utilities to sysmgr to make it more efficient. This
     84 defeats the initial purpose of sysmgr, being a service manager in pure POSIX
     85 shell. My main purpose, however, is making sysmgr efficient and simplistic. It
     86 mostly imitates `runit` without dealing with all the complexity of the
     87 over-thinked `supervise` directory, nor the logging stuff. Most of these can be
     88 handled by the service script itself anyway. That's why instead of this ugly
     89 C/POSIX sh hybrid, I decided to implement it all in C.
     91 I am not a C expert or anything, I am learning a lot as I am writing the
     92 program. I want it to be C99 and portable (for BSD). It's currently not
     93 functional at all, but, you can see its current state [here].
     95 [sysmgr]:
     96 [here]:
     98 EDIT Oct 10 2020:
    100 I did the initial release of this C version of sysmgr, which is more stable,
    101 and performant than the POSIX sh version. It still has rough edges, but is
    102 completely usable.
    104 ********************************************************************************
    106 Trust in Distributed Environments
    107 ================================================================================
    108 [Permalink](/blog/20200908-trust-in-distributed-environments.html)
    110 Date: Sep 08 2020
    113 A few days ago, in the `#kisslinux` IRC channel, jedahan mentioned an
    114 implementation for trust in the package manager. While I was intrigued by the
    115 idea initially, I decided not to implement this for the upcoming 4.0.0 release.
    116 That is because the package manager and the distribution itself is already
    117 centered on trust. However, this idea made me think a lot about "trust" in
    118 distributed environments.
    120 Who and what would you trust? Would you trust Microsoft? Would you trust a
    121 binary? Would you only trust a so called "reproducible" build?
    123 Jedahan mentioned the possibility that a repository maintainer could create a
    124 package that would be normally in the distribution so they could mess your
    125 system up. He suggested a "source" system where you know where each package
    126 comes from. This way the package manager can warn you when the source of a
    127 package is changed. As I have said this idea intrigued me at the beginning, but
    128 here is why it is complex and unnecessary.
    130 The package manager would warn you every time you fork a package and apply your
    131 changes. Both with kiss and CPT, you already see git logs when the repositories
    132 are fetched. Those logs address each and every file that has been edited, added,
    133 removed, or renamed. CPT also has support for rsync, which is called verbosely.
    134 While not as descriptive, rsync also shows what's changed/added and what's
    135 deleted.
    137 Also, back on April, I have added submodule support to my fork of kiss, which
    138 Dylan adapted on May 19. I have added this feature because it solves a similar
    139 issue. I want to have only some packages from a repository and leave the rest
    140 of them. This way I am the one in control of what goes inside my repositories.
    142 Minor annoyances aside, would this solve the issue of trust? Maybe this evil
    143 repository maintainer decides to botch a package that was already in their
    144 repository not provided by your distribution. Should we then track the source
    145 files, build files as well? But those change all the time.
    147 I believe that this environment is as trustworthy as it can get, a repository
    148 system with package build instructions that easy to read and understand, easy to
    149 history check, easy to limit, and easy to allow. KISS and Carbs Linux have a
    150 single maintainer. I maintain Carbs and Dylan maintains KISS. You are not
    151 trusting an organization, you are trusting individuals that you can easily
    152 converse on the internet. The same goes for most community repository
    153 maintainers out there. Trying to implement more would be a "security theater"
    154 that would be a hassle for the maintainers, the users and the package manager
    155 without a noticeable benefit to any.
    157 ********************************************************************************
    159 wpa_add script
    160 ================================================================================
    161 [Permalink](/blog/20200828-wpa-add-script.html)
    163 Date: Aug 28 2020
    166 I have this script named `wpa_add`, which I use to easily add new WiFi when I
    167 am outside, possibly in a cafe. I have written this script because I don't like
    168 the way my girlfriend looks at me while thinking that I am an absolute moron for
    169 not using Windows 10, and the entirety of Linux is a circlejerk. It is only
    170 natural that she thinks this way. I use my own distribution that doesn't have
    171 things like `dbus`, or `NetworkManager`, or one of those common desktop
    172 environments. You could install it by creating a simple package, but I am happy
    173 to not have any of those in my system.
    175 This script uses wpa-supplicant to add a new network and reconfigure. It uses
    176 dmenu for input, however you could replace dmenu calls with some command line
    177 prompts. I am doing the following assumptions:
    178 - You can manipulate `wpa_supplicant` without root access.
    179 - The configuration is on `/etc/wpa_supplicant.conf`.
    180 - You can edit `/etc/wpa/supplicant.conf`.
    182 If you want to ensure the above just do the following (as root):
    184 ```sh
    185 # Add yourself to the wheel group if you aren't already.
    186 adduser user wheel
    188 # Change the ownership of /etc/wpa_supplicant.conf
    189 chown root:wheel /etc/wpa_supplicant.conf
    191 # Make sure the configuration can be edited by the wheel group.
    192 chmod 664 /etc/wpa_supplicant.conf
    193 ```
    195 Your `wpa_supplicant` configuration must include the following line (or something similar):
    197 ```plaintext
    198 ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=wheel
    199 ```
    202 Here is the script
    204 ```sh
    205 #!/bin/sh
    206 # Script to add wpa_supplicant networks through dmenu
    208 if [ "$1" ]; then
    209     name=$1
    210 else
    211     name=$(dmenu -p "Please enter network name, leave empty if you want to search" <&-)
    212 fi
    214 [ "$name" ] || {
    215     wpa_cli scan
    216     name=$(
    217     wpa_cli scan_results | sed 1,2d | while read -r _ _ _ _ ssid _; do
    218         # Hidden wifi are not to be returned
    219         [ "$ssid" ] || continue
    220         echo "$ssid"
    221     done | sort -u | dmenu -l 10 -p "Please choose WiFi")
    222     [ "$name" ] || exit 1
    223 }
    225 pass=$(dmenu -P -p "Please enter your password, leave empty if the network has open access.")
    227 if [ "$pass" ]; then
    228     wpa_passphrase "$name" <<EOF>> /etc/wpa_supplicant.conf
    229 $pass
    230 EOF
    231 else
    232     printf 'network={\n\tssid="%s"\n\tkey_mgmt=NONE\n\tpriority=-999\n}\n' "$name" >> /etc/wpa_supplicant.conf
    233 fi
    235 wpa_cli reconfigure
    236 ```
    239 As I have said, you could do something similar in a command-line-only tool as
    240 well. This one uses `fzf` on WiFi selection.
    242 ```sh
    243 #!/bin/sh -e
    245 stty="$(stty -g)"
    246 trap "stty $stty" EXIT INT TERM HUP
    248 if [ "$1" ]; then
    249     name=$1
    250 else
    251     printf 'Network Name, leave empty if you want to search: '
    252     read -r name
    253 fi
    255 [ "$name" ] || {
    256     wpa_cli scan >/dev/null
    257     name=$(
    258     wpa_cli scan_results | sed 1,2d | while read -r _ _ _ _ ssid _; do
    259         # Hidden wifi are not to be returned
    260         [ "$ssid" ] || continue
    261         echo "$ssid"
    262     done | sort -u | fzf --prompt "Please choose WiFi: ")
    263 }
    265 [ "$name" ] || exit 1
    267 stty -echo
    268 printf 'Please enter your password, leave empty if the network has open access.\nPassword: '
    269 read -r pass
    271 if [ "$pass" ]; then
    272     wpa_passphrase "$name" <<EOF>> /etc/wpa_supplicant.conf
    273 $pass
    274 EOF
    275 else
    276     printf 'network={\n\tssid="%s"\n\tkey_mgmt=NONE\n\tpriority=-999\n}\n' "$name" >> /etc/wpa_supplicant.conf
    277 fi
    279 wpa_cli reconfigure
    280 ```
    282 These scripts can be found as a gist [here](
    284 ********************************************************************************
    286 Static linking
    287 ================================================================================
    288 [Permalink](/blog/20200828-static-linking.html)
    290 Date: Aug 28 2020
    293 While I was working on a new initramfs generator for Carbs, I was once again
    294 reminded of the advantages of static linking software. Previously, I was using
    295 some really dumb script that was just basically using the package manager as a
    296 library for building the whole initramfs system from scratch. This system
    297 structure was completely statically linked, and the whole thing weighed around
    298 1.3MiB.
    300 Now, while `rd` (the small script that I had written) was good enough for me, it
    301 wouldn't be a fit to distribute with the system. It doesn't deal with dynamic
    302 binaries, kernel modules or library installation. So I have written this script
    303 that deals with those (kernel modules aren't done yet, though).
    305 The issue with build systems today are that the binaries are built dynamically
    306 unless you build the whole thing static. As long as there are shared libraries,
    307 the binaries will be dynamic as well. That's why the core repository of Carbs
    308 still contains dynamic binaries for gcc, binutils, util-linux and some other
    309 packages.
    311 The size of the new image with exactly the same binaries is a whopping 1.9MiB.
    312 While a size increase of 600KiB might not seem like a huge deal, I just want to
    313 tell you that busybox is static in both images, leaving ONLY TWO binaries that
    314 I install to my image; fsck and e2fsck. By switching from a static binary to
    315 dynamic + lib for only two programs, you require 600 KiB more space, and I have
    316 been talking about a gzip compressed cpio archive throughout this whole post.
    318 ********************************************************************************
    320 Starting X without Xinit
    321 ================================================================================
    322 [Permalink](/blog/20200812-starting-x-without-xinit.html)
    324 Date: Aug 12 2020
    327 Most people who don't use a desktop environment use the `startx` command to
    328 initialize their X windowing system. Now, `startx` is a shell script that runs
    329 the C program `xinit` which basically runs `xorg-server`. Using xinit obviously
    330 has some nice perks. It makes some checks and runs your .xinitrc file. We don't
    331 need any of that though. Here is my X launcher:
    333 ```sh
    334 #!/bin/sh
    336 export DISPLAY=${DISPLAY:-:0}
    337 trap "$HOME/.xinitrc" USR1
    339 (
    340     trap '' USR1
    342     exec X -keeptty :0 vt1
    343 ) &
    345 wait
    346 ```
    348 You need to keep in mind that your .xinitrc should be an executable.
    350 ********************************************************************************
    352 Why I dislike Arch and Gentoo
    353 ================================================================================
    354 [Permalink](/blog/20200508-why-i-dislike-arch-and-gentoo.html)
    356 Date: May 08 2020
    359 Over the years, I have used many many Linux distributions. The reason I am
    360 now using a distribution maintained by me, is because I am never truly satisfied
    361 about other people's work. Not that they are bad at they do, it's just that
    362 they don't share the same vision as me. And I have felt this way with almost
    363 every distribution I have used.
    366 Arch Linux
    367 --------------------------------------------------------------------------------
    369 Arch Linux itself feels like it became a 'meme distribution'. Their user-base
    370 is a cult-like community that think they are superior for using Arch Linux.
    371 Now, you might be an Arch user, and might not be like this. I used Arch for
    372 a long time, and didn't feel this way, ever. I only see this level of cultism
    373 for Arch and systemd.
    375 If you ever call Arch bloated on an online community website, you will get
    376 lots of crap for it. But in fact, Arch Linux is bloated. Now this isn't due
    377 to having too many packages in the base installation. This is because of their
    378 packaging of software.
    380 Arch enables almost every single option in the package configuration, meaning
    381 lots of unnecessary dependencies, and packages with humongous sizes.
    383 Pacman is a rather slow package manager, and missing alternatives. For me,
    384 an alternatives system is a must.
    386 If you want to use a better binary distribution, use Void Linux. They have
    387 saner package configurations, and the environment just feels more UNIXy. xbps
    388 is really fast, and has an alternatives system.
    391 Gentoo Linux
    392 --------------------------------------------------------------------------------
    394 This will be the longer part, because my dislike for Gentoo is bigger than
    395 my dislike towards Arch. If you want to see how NOT to maintain a distribution,
    396 check out Gentoo.
    398 I've used Gentoo for a few months, and I'm saying this right out of the
    399 gate. Portage is the slowest piece of software that I have ever used on
    400 Linux. Maybe that's because I deliberately avoid software using Python,
    401 but Portage is most probably the slowest package manager that is being
    402 used.
    404 Portage depends on Bash, Python, and GNU wget. I have got a line count from
    405 `cloc`, doing a `find . \( -name '*.sh -o -name '*.py' \) -exec cloc {} +`.
    406 The source code of just `*.sh` and `*.py` files are over 100k lines of code.
    407 Then I got curious and runned cloc against the whole repository. Here is
    408 the output.
    410 ```
    411 --------------------------------------------------------------------------------
    412 Language                      files          blank        comment           code
    413 --------------------------------------------------------------------------------
    414 Python                          703          20009          21411         102180
    415 Bourne Shell                     13            643            678           3911
    416 Bourne Again Shell               44            583            434           3172
    417 diff                             17             31            298            574
    418 YAML                              6             32             80            573
    419 XSD                               1             27             27            494
    420 C                                 2             56            128            291
    421 make                              1              7              6             19
    422 INI                               1              1              0             15
    423 reStructuredText                  1              5              4              9
    424 XSLT                              1              0              0              5
    425 --------------------------------------------------------------------------------
    426 SUM:                            790          21394          23066         111243
    427 --------------------------------------------------------------------------------
    428 ```
    430 That's quite a lot.
    432 Portage is a package manager that tries to ease the configuration process of
    433 packages, but at the process makes it terribly complex to compose packages,
    434 and adds billions of portage configuration options. Configuring your first
    435 kernel is literally easier than configuring portage in a way you want. Users
    436 just do not know that they would be better off doing an LFS build for a much
    437 stabler system. My system was broken countless times while using Gentoo.
    438 Maintaining a Gentoo system is honestly harder than maintaining my own
    439 distribution.
    441 **EAPI**, probably the worst thing about the Portage ecosystem. It is the most
    442 complex, hard to read, hard to learn packaging system ever made. Creating a
    443 USE flag system shouldn't have been this hard.
    445 ********************************************************************************
    447 Editor Wizardry
    448 ================================================================================
    449 [Permalink](/blog/20200413-editor-wizardry.html)
    451 Date: Apr 13 2020
    454 To this day, I have tried lots of IDEs and text editors. Visual Studio, PyCharm,
    455 Sublime, Notepad++, Vim, Emacs, Pico, Atom, etc. The list goes on. I have even
    456 unironically used ed, and ironically used cat for a while.
    458 I have settled down after years and years of "editor-hopping". I now have 3
    459 main editors that I use on a daily basis! Yeah, you have read it correct. I use
    460 3 editors on a daily basis. Those are,
    462 - sed
    463 - vi (not vim)
    464 - emacs
    467 Emacs
    468 --------------------------------------------------------------------------------
    470 Emacs is a beast. Defining Emacs as a text-editor is wrong. It is a lisp
    471 interpreter, with text manipulation abilities.
    473 Now, I do like the concept of Integrated Development Environments. It's a shame
    474 that all of them suck. With Emacs I can fine-tune everything according to my
    475 taste, install the packages I need, configure them the way I like. With IDEs you
    476 get some nice plugins, and a tiny bit of customization, but that's it. You get
    477 an environment limited by the vision of someone else. Not to mention that most
    478 IDEs are proprietary software.
    480 I have stopped using Vim, because it is only meant to be a text editor. You can
    481 extend its features with plugins, but you can really see the impact with just a
    482 few of them. Vimscript is also really primitive, that's why people write plugins
    483 with Python, JS, and such. This further affects the speed of Vim. Most Emacs
    484 packages I have encountered are written in pure lisp. I have over 70 packages,
    485 yet my load time and overall speed is better than when I had Vim with 8 plugins.
    488 ### Cons
    490 - **It comes with too many unnecessary features** Emacs comes with multiple IRC
    491   clients, a mail reader, rss reader etc. I don't think they are badly
    492   implemented or anything, I would just prefer building up as I want to instead.
    493 - **The defaults are not intuitive** Now, I haven't actually tried any of them,
    494   but there is a reason "Emacs distributions", such as "Spacemacs", "DOOM
    495   Emacs", "Centaur" exist. The base of Emacs, even with its unnecessary
    496   features, is unintuitive and complicated.
    498 Also, let's not forget that Emacs uses an ancient Lisp dialect.
    501 Vi
    502 --------------------------------------------------------------------------------
    504 I mostly use Emacs when I am dealing with projects. If my aim is to just make
    505 simple changes when I am on the terminal, I just pop up vi provided by busybox.
    506 I just like that it is fast and featureless. It barely gets the job done, and
    507 that's why I like it.
    510 ### Cons
    512 - **No syntax highlighting** Syntax highlighting is an important feature for me
    513   but I have learned to live without it. Since I don't edit large files with it,
    514   this is not the biggest con.
    515 - **Hard to configure** Busybox vi only has a limited featureset, which makes
    516   it hard to configure. It doesn't read an `rc` file, it uses the `$EXINIT`
    517   variable instead. Available options are limited. For example, you cannot
    518   convert the "tab" action to use space instead of tabs.
    519 - **No visual selection support** Sadly, `v/V` isn't implemented in busybox vi.
    522 Sed
    523 -------------------------------------------------------------------------------
    525 I use sed for when I am making small changes to small files, because it is
    526 faster than opening a file, making a change, saving, and exiting. Using regular
    527 expressions are much faster and efficient at such things.
    529 ### Cons
    531 - **Risky unless you know what you are doing** Since sed is operated on regex,
    532   you need to be extra careful. You are running that regex on the entire file
    533   without an option to 'undo' (unless you have a sed that has a backup
    534   implementation).