Entries tagged 'cat:Code' (Page 3)

Setting Screen Brightness To Any Value With A Three-Step Keyboard Shortcut (Linux)

Entry created on 2021-07-08 author:steeph (374) cat:Code (31) cat:Computer (78) cat:Displays (5) cat:Linux (36) cat:Scripts (28) lang:en (253)

Initially out of necessity because the brightness keys of my new laptop didn't work out of the box (the driver was aded to my distro not a month later, which should have been acceptable, but I didn't know that at first), I was looking for a way to set the backlight brighness of my laptop's internal screen easily, without typing a command in a shell. What I ended up using I like even better than the usual + and - keys.

I'm using i3wm and dmenu. The way I set screen brightness is

  • 1) I enter the shortcut (mod+B in my case)
  • 2) I enter a number and
  • 3) I hit Enter.
  • It's simple to implement. Just put this line in the i3 config file:

    
    bindsym $mod+b exec \
      thatbright=$(echo "1000\n2000\n3000\n4000\n5000\n6000\n7000\n100\n10" \
      | dmenu -p "How bright though?") && echo $thatbright \
      > /sys/class/backlight/*/brightness
    

    You can put it into one line (without the \s inbetween) if you want.

    You could easily change that to a two-step or single shortcut if you like. I like the three-step version because it allows me to choose from one of seven brightness modes easily but also lets me enter a value below or between those pre-sets without taking up more than one key.

    Code Explanation

    First, the variable thatbright is set to the number that dmenu outputs, which can be one of the numbers that are echoed to the pipe (selected with arrow keys or completed when typed in dmenu) or another number that is entered into dmenu. If that was suggessful, the value is written to /sys/class/backlight/*/brightness. If you have multiple backlights in /sys/class and you only want to set one or if your shell doesn't support wild cards in paths, you can change the * to whatever applies to your system, e.g. intel_backlight.

    Scripts/Commands to set the screen brightness

    The simplest script that sets the screen brightness in Linux is probably the one-liner from above: echo $1 > /sys/class/backlight/*/brightness. This sets the raw numerical value. You need to know what a sensible range of numbers is and what the maximal accepted value is (look at '/sys/class/backlight/[YOUR_BACKLIGHT]/max_brightness'). But there are more elaborate scripts, like bbacklight by Giuseppe Eletto with which you set the brightness with a percentage value.

    SBWG 0.8.10

    Entry created on 2021-05-24 author:steeph (374) cat:Bash (31) cat:Code (31) cat:Computer (78) cat:Linux (36) cat:Projects (41) cat:SBWG (18) cat:Scripts (28) cat:Software (53) lang:en (253) top:Projects:Code:Bash Scripts:SBWG (16)

    So, I'm still making slow process with SBWG. I had more fun with it when I was out and implementing new features. But I find it important to finish version 1.0.0 with the currently defined set of festures and goals, which include finishing documentation, testing and code hardening, which are less fun for me.

    I've always treated the third level of the version number (x.x.thisone) as a means to declare a new version done when I feel like having achived something. So today I declare version 0.8.10 as done. There really isn't much left to do to meet my milestones for v0.9.0. And from there on it will only be testing and possibly a little bit of code improvements to get to my set goals for v1.0.0.

    I'm looking forward to this not only because I'll like the feeling of having achived a goal, but also it will mean that I'll be free again to introduce new features. I still have more ideas than necessary about what to do with SBWG.

    But right now I'm enjoing the fact that I'm able to make myself believe that it's okay to move on as slowly as I want and let my colloquial executive dysfunction do its think without impacting my feeling of self-worth oo much.

    Bash script to burn your CPU easily

    Entry created on 2021-05-16 author:steeph (374) cat:Bash (31) cat:CPUs (5) cat:Code (31) cat:Computer (78) cat:Scripts (28) cat:Software (53) lang:en (253) top:Projects:Code:Bash Scripts (23)

    When making my own CPU cooler or testing some other stuff I sometimes need to create as high of a CPU load as possible. After typing while true; do true; done for the one-too-manyth time I finally decided to create an alias for that. But that didn't feel neat enough. So I made this simple Bash script.

    
    #!/bin/bash
    
    if [ "$#" -ne "1" ]
    then
      echo "I need one argument and one argument only: Number of threads to start."
      echo "Hint: You have $(nproc) CPU cores."
      exit 1
    fi
    
    if [[ "$1" =~ ^[0-9]+$ ]]
    then
      n="$1"
    else
      echo "Argument needs to be a number: Number of threads to start."
      echo "Hint: You have $(nproc) CPU cores."
      exit 1
    fi
    
    trap "pkill -P $$; exit 0" SIGHUP SIGINT SIGTERM
    
    while [ "$n" -gt 1 ]
    do
      while true; do true; done &
      n=$((n-1))
    done
    echo "Started $1 threads to burn your CPU."
    pidof -x "$(basename -- $0)"
    while true; do true; done
    

    Download

    For a simpler script, you can also just use this three-liner without any arguments to stress all CPU cores:

    
    #!/bin/bash
    yeah() { while true; do true; done& }
    threads=$(nproc)
    for i in $(seq 1 $threads); do yeah; done
    

    Bash script to quickly open and close a wifi hotspot

    Entry created on 2021-05-15 author:steeph (374) cat:Bash (31) cat:Code (31) cat:Computer (78) cat:Scripts (28) cat:Software (53) cat:WiFi (1) lang:en (253) top:Projects:Code:Bash Scripts (23)

    I needed a wifi hotspot to test some phones. So I looked up how to create one quickly and learned about nmcli. It wasn't quick and easy enough for my taste. So here is how I do it from now on.

    The Bash script maintains only one connection (named quick-hotspot). You can't create multiple connections or access points with it. Not intentionally, but also not accidentally because you forgot that you still have a hotspot enabled from the last time you needed one. (I know I would at some point.)

    Examples:

    
    hotspot # Creates and enables a hotspot with a random name and a random 8-digit password.
    hotspot down # Disables the hotspot if it was enabled.
    hotspot ⊿ⴼͳΞⵖⵡ∃ doctorwho # Creates and enables a hotspot with the SSID "⊿ⴼͳΞⵖⵡ∃" and the password "doctorwho".
    hotspot . password # My use case: quick and short and I don't want to type a complicated password on the phones. SSID: ".", PW: "password"
    hotspot down # Deactivates the hotspot regardless of the SSID you used.
    

    If you activate a hotspot while one is already active, it just changes the SSID and password so that no two connections created by this script are ever active at the same time. I'm sure there already is a program that solves this better. But it was fun for me to create and I felt like sharing.

    Click here to download the bash script.

    Content:

    #!/bin/bash
    
    # Quickly create and activate a WiFi hotspot - optionally defining SSID and password - and deactivate it again when you don't need it anymore.
    
    usage() {
      echo "Usage: $(basename $0) ssid passphrase"
      echo "       $(basename $0) down"
      echo "       $(basename $0)"
      exit 1
    }
    
    activate() {
      # If the connection "quick-hotspot" doesn't already exist...
      if ! nmcli connection show | grep quick-hotspot; then
        # ... then create it.
        nmcli connection add type wifi ifname '*' con-name quick-hotspot autoconnect no ssid "$ssid"
      else
        # ... else change the SSID of the existing connection.
        nmcli connection modify quick-hotspot ssid "$ssid"
      fi
      # Make the connection an access point
      nmcli connection modify quick-hotspot 802-11-wireless.mode ap 802-11-wireless.band bg ipv4.method shared
      # Change the password
      nmcli connection modify quick-hotspot 802-11-wireless-security.key-mgmt wpa-psk 802-11-wireless-security.psk "$pw"
      # Enable the connection
      nmcli connection up quick-hotspot
    }
    
    case $# in
      0)
        ssid=$(</dev/urandom tr -dc A-Z] | head -c8; echo "")
        echo "SSID: $ssid"
        pw=$(shuf -i 10000000-99999999 -n 1) 
        echo "PW: $pw"
        activate
        ;;
      1)
        if [ $1 == down ]; then
          nmcli connection down "quick-hotspot"
          exit 0
        else usage
        fi
        ;;
      2)
        ssid="$1"
        if ! [ ${#2} -ge 8 ]; then
          echo "$(basename $0): Password needs to be 8 characters or longer."
          exit 1
        else
          pw="$2"
          activate
        fi
        ;;
      *)
        usage
        ;;
    esac
    

    See also: My Reddit Post

    SBWG 0.8.9

    Entry created on 2021-05-15 author:steeph (374) cat:Bash (31) cat:Code (31) cat:Computer (78) cat:Linux (36) cat:Projects (41) cat:SBWG (18) cat:Scripts (28) cat:Software (53) lang:en (253) top:Projects:Code:Bash Scripts:SBWG (16)

    Lately I'm making only slow progress with SBWG. I'm determined to make this something that I'm comfortable with sharing as 1.0.0 online. Something that works and could arguably be called a somewhat finished peace of software. That doesn't mean that the todo list won't be huge at the point I change the version number to 1.0.0. But it should be in a relatively good state for what I've decided it will encompass at version 1.0.0. "Relatively" because it's still also a learning project and I would write many things differently if I started over, which means I'll have to rewrite them at some point to be satisfied with SBWG.

    So, the goal and roadmap is set for v0.9.0 and v1.0.0 and a large part of what is still to be done is documentation and other things I don't enjoy doing as much as starting to implement new features. I'm holding back on working on things that are not on that roadmap so that I don't introduce new bugs and the need of further testing. First I want to improve what SBWG can already do.

    That means that there won't be many interesting changes in the coming weeks (or maybe even months). Today I've decided to call what I've currently got version 0.8.9 and publish it on the project page.

    Go To Navigation Page
    Show/Hide Navigation