# Apple corner
MacOS is a BSD derivative that constantly does things differently under the
hood. While most things are Unix compatible, some things are just different

### Basic setup
MacOS requires a few manual interventions to get the system working

    # spctl --master-disable
Reveals the option in "Security & Privacy" to run apps from any developer

    ~/Library/Sounds/madoka_error.aiff
Sound files stored in this directory are available under Sound -> Sound Effects

    ~/Library/KeyBindings/DefaultKeyBinding.dict
Allows basic remapping for system-wide key binds. Use `skhd` for complex hotkeys

### Basic commands

    $ echo 'hello' | pbcopy
    $ pbpaste > note.txt
Interact with the system clipboard through terminal. This does not work for
images. Install `pngpaste` for that functionality

    $ say 'something'
Says string with system voice. Useful as a notification for when a task is done

    $ afplay
Plays the audio of an audio file, such as an `mp3` or `wav`

### Disk Utility

    $ diskutil list
Lists all the volumes the system currently sees. This works for unmounted and
encrypted partitions as well

    $ diskutil mount disk1s1
Mounts `disk1s1`. Most useful to mount USB drives without physically reseeding

    $ diskutil apfs unlockVolume disk1s1
Unlocks and mounts an apple file system volume

### Launch daemon
Systemd for MacOS. It will automatically load scripts in designated directories
on login. It can also be controlled manually through `launchctl`

    $ launchctl load -w ~/Library/LaunchAgents/com.skhd.plist
    $ launchctl unload -w ~/Library/LaunchAgents/com.skhd.plist
Loads and starts the skhd daemon. `<key>Label</key>` must be the same to unload

    # launchctl list | grep skhd
Check the status of a running process. First number is the PID, second number is
the exit code. If the second number isn't 0 or there's no PID something broke

    /Users/emiliko/Library/LaunchAgents/com.launcher.plist
This file will be started automatically on emiliko's login. All paths provided
in must be absolute paths from root. Use `/Users/emiliko/` not `~/`

    /Users/emiliko/Library/LaunchAgents/com.launcher.plist
    <key>StandardOutPath</key>
    <string>/tmp/skhd.out</string>
    <key>StandardErrorPath</key>
    <string>/tmp/skhd.err</string>
Redirects stdout and stderr. Watch these files with `tail -f /tmp/skhd.err | nl`

### Installing SSHFS on Mac
To set up ssh filesystem (sshfs) on a mac, follow these steps on the client:

    $ brew install --cask osxfuse
Installs `osxfuse`. This is an open source tool to extend your mac's fs support

    https://osxfuse.github.io/
    $ curl https://github.com/osxfuse/sshfs/releases/download/osxfuse-sshfs-2.5.0/sshfs-2.5.0.pkg
Recently brew removed sshfs from its supported casks, since it relies on closed
source code. Instead, you'll need to install it directly from the download link

See ssh_notes for using SSHFS

### OSA script
MacOS's GUI can often be controlled through the use of Apple's `osascript`.
Notably, this can allow shell programs to give GUI notifications

    osascript -e 'display notification "'"${message}"'
Sends the system notification with the contents of `$message`

    osascript -e 'display notification "'"${msg}"'" with title "Skhd"'
Adds a "Skhd" as a title to the notification

    osascript -e 'display notification "'"${msg}"'" with title "Skhd" subtitle
    "Could not save image"'
Further adds a subtitle for the notification

    afplay $(defaults read .GlobalPreferences.plist \
        | awk '/sound.beep.sound"/ { gsub(/(.*= ")|(";)/, "", $0); print }')
Plays the default system error sound through the current audio output device


## FreeBSD corner
Keep in mind that MacOS is based on a really old FreeBSD and NetBSD kernel, so
many sections here will somewhat apply to Macs as well

#### Users and groups
Various commands for managing system permissions. Many can be, at least
somewhat, run the user themselves with their password

    # adduser
    # rmuser
    $ chpass  # edit user account settings, like login name and expiry
    $ passwd  # change a user's password
    $ pw      # a cli frontend for the settings files above. More advanced
https://docs.freebsd.org/en/books/handbook/basics/#users-modifying

    /etc/group
    $ id emiliko
Shows groups a user belongs to. User seems to implicitly belong to their group

    rwxr-x---x  .
    rwxr-x-r--  secret_file
    rwxr-x-rw-  no_touching
Oddly, the `x` on the directory here means means all other users:
 - Can `cd` into the directory
 - Cannot `ls` in this directory
 - Can read the file `secret_file` using something like `vim secret_file`
 - Can write to `no_touching`. Vim can only do this with `:x!` not `:w!`

    # service sshd restart
Reboots the ssh daemon. Users connected through ssh won't lose connection, if
the reboot is successful
[//]: # ex: set ft=markdown:tw=80: