====== Linux ====== Linux is a beautiful example of clean engineering. Form follows function and function follows coherent thoughts. The following is a collection of notes. ===== Adding passwordless users ===== To add a sudo user that doesn't have a password you have to first add a user with a password, and then delete the password. This activates the password. sudo adduser usernameyoulike # give the user any temp password # the following command removes the password sudo passwd -d usernameyoulike # add the user to the sudoers list usermod -aG sudo usernameyoulike ===== udev ===== I fell in a deep rabbit hole with ''%%udev%%'' whilst building Primo. Here is a comprehensive guide about ''%%udev%%'' [[http://www.reactivated.net/writing_udev_rules.html|link]]. To get all the information about a USB device: udevadm info -a -p $(udevadm info -q path -n /dev/video1) Some commands have changed since the bible has been written. To test, you can use the test function of ''%%udevadm%%''. Problem is that you have to give it the top level device path in ''%%sysfs%%''. For example, an arduino plugged into Primo and showing up as ''%%ttyACM1%%'', this was ''%%/sys/bus/usb/devices/1-6%%''. To find the top level device path, use the command above and substitute in the port name. To test an Arduino: udevadm test /sys/bus/usb/devices/1-6 To restart the ''%%udev%%'' system: sudo udevadm control --reload-rules && udevadm trigger You will still need to unplug/replug stuff!! Or do a reboot. Some pitfalls I came across. You cannot change device names! You can only add symlinks to them. The symlink did not work for the Tara uvc_camera. I think this is issue has to do with the fact that the Tara has some weird shit with the way the USB host onboard handles the two cameras. Here's some other commands: Lists the possible device attribute keys and their values along with the parents of the device. udevadm info --attribute-walk /dev/bus/usb// Lists the device attributes and their values. udevadm info -a /dev/video0 Reload udev rules udevadm control --reload-rules && udevadm trigger ==== USB Information ==== To get info on ''%%hidraw%%'' devices: cat /sys/class/hidraw/hidraw2/device/uevent # Arduino with Encoder code # For some readon the serial thingy doesn't work # SSUBSYSTEMS=="usb", ATTRS{iSerial}=="5563930383435181B021", ATTRS{idVendor}=="2a03", ATTRS{idProduct}=="0043", SYMLINK+="ard-enc # SUBSYSTEMS=="usb", ATTRS{idVendor}=="2a03", ATTRS{idProduct}=="0043", ATTRS{idSerial}=="Arduino_Srl_Arduino_Uno_5563930383435181B021", SYMLINK+="ard-enc" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2a03", ATTRS{idProduct}=="0043", SYMLINK+="ard_enc", MODE="0666" # Add a symlink to the stereo camera. This doesn't work with seecam's driver and you # need to reference the device ID. When doing ''%%lsusb%%'', use ''%%sudo%%''!! If you don't, you won't be able to see devices whose permissions haven't been properly set. Shows the USB version of the devices with that vendor id: sudo lsusb -v | grep 2560 -A 10 | grep bcdUSB ===== cron ===== Cron is used to automate the running of jobs. I use it to run a backup script and a VimWiki html generate script. To add a job to cron you must edit the crontab file. You do this by running the following command: crontab -e This will load up the default editor (you can change this to be vim by running export EDITOR=vim) and open the crontab file. Cron has an interesting way of setting up timing intervals, look this up online. Here's some examples: # Run every minute *\1 * * * * ~/paul_scripts/update_wiki_html.sh # Run on the 45th minute of every hour 45 * * * * ~/paul_scripts/cronjob.sh To check the cron logs, type the following: grep CRON /var/log/syslog This will show you what jobs where run last. Cron discards the output of these jobs if no MTA is setup, and don't worry about this. ===== Display Manager ===== I use the XFCE display manager because it was the only one that allowed my laptop dock and 2 external monitor system to work properly. ==== Workspaces ==== Set the number of rows in the workspace to 2. That way you get a nice grid. ==== Terminal ==== I use the ''%%xfce4-terminal%%''. I have all nicely setup with a config file that resides in ''%%~/.config/xfce4/terminal%%''. ===== Moving Windows ===== To move windows around we need the following packages. sudo apt-get install xdotool sudo apt-get install wmctrl Get the move window script from storage. Add following keyboard shortcut application commands: : /home/paul/paul_scripts/move-to-next-monitor -l : /home/paul/paul_scripts/move-to-next-monitor -r This information was gathered from [[http://unix.stackexchange.com/questions/48456/xfce-send-window-to-other-monitor-on-keystroke|here]]. ===== Taskwarrior and Timewarrior ===== I use taskwarrior and timewarrior as a task keeping daily ==== Installing ==== Use pre-built debians for both taskmanager and timewarrior. You have to copy a file to get taskwarrior to use timewarrior. cp /usr/share/doc/timewarrior/ext/on-modify.timewarrior ~/.task/hooks ===== Remote Desktop ===== I have tried every remote desktop option I could find. The best solution in terms of ease of use, performance, and reliability has been TeamViewer. In any case here's a bunch of notes of ones I've tried. ==== VNC Notes ==== Using default VNC server on Linux machine. Using xvnc4viewer (RealVNC viewer) on xubuntu (xfce) desktop. using the x11 VNC server on the server. Port 5900 and 5901. Running into security issues with the VNC server stuff. Tried: VNC-Server: * x11vnc with ssl * tightvncserver Viewer: * realvnc viewer (vncviewer) * xtightvncviewer * remmina VNC viewer I keep getting "Server did not offer supported security type". Trying out the RealVNC server and viewer. Installing RealVNC on Primo using wget and a Debian pkg. Gave up on installing RealVNC because you need the premium version for headless operation which is what I have. The server that worked was this: sudo x11vnc -xkb -noxrecord -noxfixes -noxdamage -display :0 -auth /var/run/lightdm/root/:0 -usepw Issue is getting the x11vnc server to load before a login has occurred, which is what makes all this VNC shit complicated. I used vncviewer on the client computer to talk to it. Problem is that it is slow. I don't think there is anything we can do it. It is also slow through the LAN. I've attributed this issue to running headless. ===== Headless Operation ===== I ran into a bunch of issues by running the Primo computer headless, meaning without a display attached to it. The first time I noticed this was when I ran the computer without a display attached to it. It would run extremely slow when trying to remote into it. I then would plug in a display and bam, everything would run nice and fast. The reason for this is because without a display attached, the onboard GPU does not properly initialize. Everything relating to graphics becomes slow when running headless. X forwarding is slow, steaming video is slow, remote desktop with team viewer and VNC, and any remote video stuff. To diagnose the problem we see what drivers are being used for the graphics operation. glxinfo|egrep "OpenGL vendor|OpenGL renderer*" If no hardware acceleration is detected, such when using a non professional grade display, a virtual driver such as this one will be detected: OpenGL vendor string: VMware, Inc. OpenGL renderer string: Gallium 0.4 on llvmpipe (LLVM 3.8, 256 bits) To solve this problem I found the following solutions: ==== Dummy Plug ==== There are cheap dummy plugs that trick the video card into thinking that there is a display attached. The[[https://www.kickstarter.com/projects/devjoshi/headless-ghost|Headless Ghost]] is one of them. I bought the [[https://www.amazon.com/gp/product/B06XT1Z9TF/ref=oh_aui_search_asin_title?ie=UTF8&psc=1|cheap knockoff from Amazon]] which worked great. ==== Use a Display ==== The other obvious solution is to use a display. I purchased an [[http://amzn.to/2sQ8fEy|800x480 TFT LCD screen with a touch screen designed for the Raspberry Pi for 40 bucks]]. ===== CLI Shortcuts ===== Here are some command line shortcuts. * $_ gives the argument of the last command * . (dot command) same as source. This executes a list of commands. That is all. * use ssh -X if you want to ssh with an X server To remove all files except for one in ''%%zsh%%'': setopt extendedglob rm -- ^file.txt ==== Clipboard ===== To pump out contents of file to clipboard: sudo apt install xclip cat file | xclip -selection clipboard ====== Window File Subsystem for Linux ====== This thing is awesome! For setting up ssh keys, xclip doesn't work. Use the following: clip.exe < ~/.ssh/id_rsa.pub ===== SSH Access ===== For setting up external ssh access I did the following: Reinstall openssh for some reason: sudo apt-get purge openssh-server sudo apt-get install openssh-server From an elevated powershell I ran this to change the port to 2222 to not interfere with any windows services: New-NetFirewallRule -DisplayName "Allow Inbound Port 2222" -Direction Inbound -LocalPort 2222 -Protocol TCP -Action Allow I added the following to sshd_config: Port 2222 PermitRootLogin no AllowUsers paul I created an authorized hosts file and imported the keys. I tested the connection by running this on the server: sudo service ssh stop sudo /usr/sbin/sshd -d Then on the client I ran a debug version of an ssh server to see if I was receiving incoming connections. ssh name@server -p 2222 I then monitored the server and make sure I could see the connection. The debug client quit out cause it didn't have correct paths to the keys, but the test was a success cause it validated the port pass through. I then restarted the regular service like this: sudo service ssh start