20201113, no-nonsense, low-change platform
.
A recent thread on hacker news discuses the hassle of software changing
underneath you.
https://news.ycombinator.com/reply?id=25083633&goto=item%3Fid%3D25044031%2325083633
I ran OSX between 2004 and 2011. Several releases changed the behaviour of the
window manager. I found this frustrating. Since 2011, I have been running the
minimal linux setup described here. It is nearly a ten year configuration, and
should go beyond that.
Steps,
Install the latest debian stable.
Discard the default desktop environment. These tend to change every few
years. Instead, pick a simple and stable window manager that you could
compile from source if you ever needed to. e.g. dwm or openbox.
Create a console menu for launching things that you need at startup. e.g.
wireless, dhcp. (Example below) On each boot, you will have a few seconds
of inconvenience manually running your init from this menu. This removes
your dependence on stuff that is tied to the desktop environment, such as
network configurtion panels.
Get two external drives, and organise an encrypted backup rotation. You
probably need (1) a script that mounts the device; (2) a script that
rsyncs your data to it; (3) a script that syncs and unmounts the device.
Pick a stable TTY and colour/font combination you like. Configure file
~/.Xdefaults for this. (Example below)
Invest in your CLI editor and other tools. Tmux is excellent, and the
Hogan Tmux book is a good and thin guide. Also, Visidata is worth a look.
Every three years, do this,
Get a new disk. Install the new debian stable to it, and rotate across
your home directory. Discard the old disk.
Replace your backup disks.
When chosing hardware: get a case with good airflow, overspec the PSU, chose a
decent motherboard, steer towards low power-draw parts. If you go Ryzen you
can get ECC RAM too.
-- menu script (run as root)
#!/usr/bin/python
from collections import OrderedDict
import os
import sys
class CleanExit(Exception):
pass
class bcol:
ENDC = '\033[0m'
BLUE = '\033[94m'
GREEN = '\033[92m'
HEADER = '\033[95m'
WARNING = '\033[93m'
FAIL = '\033[91m'
BOLD = '\033[1m'
UNDERLINE = '\033[4m'
class Option(object):
def __init__(self, name, cb):
self.name = name
self.cb = cb
def prompt(d_options):
os.system('clear')
for k, o in d_options.items():
print '%s%2s%s/ %s'%(bcol.BLUE, k, bcol.ENDC, o.name)
print '.',
cmd = raw_input()
if cmd == 'q':
raise CleanExit()
elif cmd in d_options:
d_options[cmd].cb()
else:
print 'ERR'
pause()
def pause():
print '[paused]'
raw_input()
def cmd_halt():
os.system('sudo halt')
def cmd_home_wifi():
os.system('sudo wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/20170626.aa.home.conf')
def cmd_may_paris():
os.system('sudo wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/20161007.aa.may.paris.conf')
def cmd_phone_wpa():
os.system('sudo wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/20160902.aa.phone.wpa.conf')
def cmd_invert():
os.system('xcalib -alter -invert')
def cmd_dhclient_query():
os.system('ps -ef | grep dhclient')
pause()
def cmd_dhclient_killall():
os.system('sudo killall dhclient')
pause()
def cmd_dhclient_launch():
os.system('sudo dhclient wlan0')
pause()
def cmd_ifconfig():
os.system('ifconfig')
pause()
def cmd_see_listeners():
os.system('sudo lsof | grep LISTEN')
pause()
def cmd_redshift():
os.system('/home/cturner/saga/20160212.memlab.cturner.ab.redshift/redshift/src/redshift -l 51:0')
def cmd_slock():
os.system('slock')
def main():
d_options = OrderedDict()
def o(name, cb):
d_options[str(len(d_options))] = Option(name, cb)
o('slock', cmd_slock)
o('halt', cmd_halt)
o('wpa:home', cmd_home_wifi)
o('wpa:phone', cmd_phone_wpa)
o('invert', cmd_invert)
o('dhclient query', cmd_dhclient_query)
o('dhclient killall', cmd_dhclient_killall)
o('dhclient launch', cmd_dhclient_launch)
o('ifconfig', cmd_ifconfig)
o('see listeners', cmd_see_listeners)
o('redshift', cmd_redshift)
while True:
prompt(d_options)
if __name__ == '__main__':
try:
main()
except CleanExit:
pass
except EOFError:
print
pass
except KeyboardInterrupt:
print
pass
finally:
os.system('stty sane')
-- ~/.Xdefaults
*color5: #9932CC
*color6: #87CEEB
*color10: #77E768
*color12: #6495ED
*color8: #454545
*color3: #96833F
*color13: #DA70D6
*color14: #B0E0E6
*color15: #FFFFFF
*color9: #ff918b
*background: #000000
*color0: #222222
*color4: #4682B4
*color7: #C0C0C0
*color2: #299E1B
*foreground: #fafafa
*color11: #D0B249
*color1: #c90a00
xterm*font: xft:terminus:size=14
xterm*scrollColor: #000000
xterm*scrollBar_right: true
xterm*urlLauncher: chromium
xterm*scrollBar: false
xterm*geometry: 112x22
URxvt*font: xft:terminus:size=10
URxvt*scrollColor: #000000
URxvt*scrollBar_right: true
URxvt*urlLauncher: chromium
URxvt*scrollBar: false
URxvt*geometry: 120x28