Author: skp

Dart and Nginx

I’ve been enjoying Flutter a lot. I’ve written a couple of apps, and I’m getting a good handle on the dart language. Now, I’d like to use dart for the whole system rather than having half of my code in PHP and the other half in Dart/Flutter.

I found the solution in Dart Shelf. The code is hosted at GitHub, and it can easily be installed as any other Dart package.

The best use case is that I can have a shared package between the Flutter front-end and the Dart shelf back-end. So, I can create, for example, a Transaction class that represents a transaction in my system. I can give the class toJson() and fromJson() methods that will convert between a Json-formatted string. Then, I can easily send it from the Flutter front-end to the back-end and have the same code running on both sides. I only maintain it in one place.

So, I learned how to make all that work pretty quickly. The challenge is how do I push that out onto a server already setup as a website. The server is using Nginx, and I don’t want to replace all the other stuff that Nginx is already doing.

Read More

Ubuntu 21.04: Programming Apps

I got really behind proof-reading and finalizing these notes. So, I’m publishing them after I already installed the next version. Better late than never, right?

VirtualBox

I use Virtualbox to run Windows and some development virtual machines.

sudo apt install virtualbox

Then, I went to File > Host Network Manager and clicked the “Create” button because some of my machines rely on vboxnet0.

Tools

sudo apt install \
        vim \
        vim-gtk3 \
        git-cola \
        meld
mkdir ~/.vimtmp
  • Vim (gtk version is for the Gvim – Gui): The improved Vi editor. It’s handy to be used to the key combinations for when I get to work on servers at work.
  • Git-Cola: is a Gui for Git, and it will also install Git as a dependency
  • Meld: a text compare tool

To setup Git, I ran the following commands:

git config --global user.name "my name"
git config --global user.email my.email@email.com

Visual Studio

I’ve been using Visual Studio for my Angular Development. I could use it for Flutter development, but I prefer Android Studio for that. I just downloaded the deb package from the website.

sudo apt install  ~/Downloads/code_1.58.2-1626302803_amd64.deb

I have a few extensions that I have been installing. They are quick to install using Ctrl+P and then these commands:

  • ext install johnpapa.angular-essentials
  • ext install humao.rest-client
  • ext install raagh.angular-karma-test-explorer
  • ext install hbenl.vscode-jasmine-test-adapter
  • ext install dart-code.flutter

Node JS

I use Node JS here and there for different projects. Here’s what I did to install it…

sudo apt install nodejs 
sudo apt install npm 
sudo npm install npm@latest -g
sudo npm install -g gulp 
sudo npm install -g grunt 
sudo npm link @angular/cli

Flutter

I’m finding that I enjoy Flutter most these days. I referred to the instructions as I installed.

I used the snap method to install it:

sudo snap install flutter --classic

First things first, I had to run flutter doctor. That downloads the biggest part of flutter.

flutter doctor

I installed the “additional Linux requirements”:

sudo apt-get install clang cmake ninja-build pkg-config libgtk-3-dev

I downloaded Android Studio from the website. I just installed it by extracting it into the bin directory:

mkdir ~/bin/studio
tar -xzvf ~/Downloads/android-studio-ide-202.7486908-linux.tar.gz -C ~/bin/studio

Once extracted, I used the menu editor (MenuLibre) to create a launcher:

  • command: ~/bin/studio/android-studio/bin/studio.sh
  • icon: ~/bin/studio/android-studio/bin/studio.svg

To allow the programs to run on the Linux desktop, I ran this command:

flutter config --enable-linux-desktop

MySQL and PHP

I use MySQL and PHP on the backend of several projects. To make it easy to develop with those, I installed both this way:

sudo apt install mariadb-server-10.5 \
                  php7.4-fpm \
                  php-mysql \
                  composer

Note: By doing php7.4-fpm instead of just php7.4, it avoids installing the whole Apache web server.

Rather than restoring the database from my old computer, I’ll just do a refresh from my production server. I did have to prep the database:

sudo mysql
create database matthew;
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost';
Dell XPS 15

Ubuntu 21.04: Essentials

I’m a little late to the party here. I’ve been fighting with this install for 6 months! It got to the point that my laptop wouldn’t suspend and would crash when I would reboot. The next version of Ubuntu was released before I could get this proof read and published!

Restoring Files

I’ve been keeping a list of the files that I restore so I don’t forget anything. I like formatting the drive and starting from scratch, but I have to be careful what I copy back, otherwise it defeats the purpose. Maybe this list will help you think through what you need to backup and restore on your system:

  • ~/.ssh: connection keys for SSH connections 
  • ~/app: (as in application development) this is where I keep my play space for programming projects
  • ~/Documents: where most of my regular files, like documents, of course
  • ~/DigitalEagleServices: work-related files
  • ~/Insync: OneDrive files (saves times resyncing from the Internet)
  • ~/.config/google-chrome: my Google Chrome browser profile, restores bookmarks, last used tabs, browser history, etc.
  • ~/.remmina: the configuration for Remmina, the remote desktop software 
  • ~/.sword: the data files for the sword project, which I use with Xiphos
  • ~/.vim: my custom configurations for the Vi editor
  • ~/.vimrc: the actual configuration file for the Vi editor
  • ~/.local/share/fonts: extra fonts that I have collected over the years
  • /etc/NetworkManager/system-connections: this saves all of my wireless connections and VPN connections (I’m not sure this worked this time)
  • .local/share/applications: I review this directory for shortcuts to apps that I use
  • ~/bin: certain programs and scripts that I installed manually
  • ~/Zotero: research data, depending on how you installed it may be in ~/snap/zotero-snap/common/Zotero
  • ~/.config/obs-studio: my setup (scenes, etc) for OBS Studio

Permissions are important for the SSH files. Here’s how I fixed them:

chmod 600 ~/.ssh/*
chmod 644 ~/.ssh/authorized_keys2
chmod 644 ~/.ssh/known_hosts
chmod 644 ~/.ssh/config
chmod 644 ~/.ssh/*.pub

The network manager connection files also have to have certain permissions. So, it is easier to restore them to my Downloads directory and then use these commands:

cd ~/Downloads/system-connections/
chmod 600 *
sudo chown root:root *
sudo cp * /etc/NetworkManager/system-connections/
sudo service NetworkManager restart

Screenshots

Flameshot is my current screenshot tool. I need it installed sooner than later to help document. First off, it’s easy to install with:

sudo apt install flameshot

To make it better, I like it mapped to the print screen button. That way I get the control of Flameshot for every screenshot. Here’s the commands I can run on the command-line to make that happen:

gsettings set org.gnome.settings-daemon.plugins.media-keys screenshot '[]'
 gsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings "['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/']"
 gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/ name 'flameshot'
 gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/ command '/usr/bin/flameshot gui'
 gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/ binding 'Print'

Finally, I went to Configuration > General and checked “Launch at startup”.

Note: My old favorite was Shutter. I haven’t installed it and gone back to it yet.

Browser

My favorite browser so far has been Google Chrome. I could make arguments for other browsers, but Chrome has been my favorite for a while. I downloaded the browser package from Google’s Website and installed it by double clicking on it in the Downloads folder (opened in the Software Center).

Don’t forget, I also restored my profile in ~/.config/google-chrome to keep all of my bookmarks and such. After that, I just had to sign in to my Google account at the upper right corner of the browser because it said the sync was paused. I had to sign in to all of the websites because it lost the session, but that was no big deal. I was back in business where I left off.

I also went to System Settings > Default Applications and set the default for Web to Chrome.

Password Management

On past installations, I have used KeePass2. Since getting into Flutter, I found AuthPass, which is a KeePass implementation in Flutter. So, I’m jumping ship and going for it. Their blog post documents an Apt repo, but that didn’t work. Here’s what I tried:

sudo add-apt-repository ppa:codeux.design/authpass
sudo apt-get install authpass

Here’s the error you get when you try to update:

E: The repository 'http://ppa.launchpad.net/codeux.design/authpass/ubuntu hirsute Release' does not have a Release file.
 N: Updating from such a repository can't be done securely, and is therefore disabled by default.

Instead, I found a snap that I could install:

sudo snap install authpass

Cloud Syncs

Dropbox is the easiest cloud to get working. I don’t use it as much, but it’s nice to have. I just downloaded it from the website. I installed it and the dependency with:

sudo apt install python3-gpg
sudo apt install ~/Downloads/dropbox_2020.03.04_amd64.deb

After installing, it popped open a prompt to start Dropbox. That places the indicator icon by the clock. It also downloaded the “proprietary” binary required to make it work. It also opened a browser window to do the log in. I had trouble making that work until I signed into the website first and then connected the desktop client.

OneDrive itself doesn’t have a sync client. So, I have been using InSync. I just downloaded that from their website. Then, I installed with:

sudo apt install ~/Downloads/insync_3.4.2.40983-focal_amd64.deb

Like Dropbox, a short while after installing, it prompts to start InSync:

It starts by asking which account type you want to sync. When I picked Microsoft OneDrive, it opened the browser to a sign in page.

After signing in, this window took me through a few steps. I accepted the defaults until I got to the folders to sync. Then, I picked my folder for KeePass and for Joplin.

Work Software

I use VMWare Horizon for connections. I downloaded it from the website and installed with these commands:

cd ~/Downloads/
sudo chmod +x VMware-Horizon-Client-2103-8.2.0-17742757.x64.bundle
sudo apt install python
sudo ./VMware-Horizon-Client-2103-8.2.0-17742757.x64.bundle

I accepted the default for all of the questions after accepting the agreements. I had no problems with the install.

Teams is another key software needed for work. It allows me to chat and screenshare with others. I downloaded the official client from the website. I downloaded the deb file for the desktop client.

sudo apt install ~/Downloads/teams_1.4.00.13653_amd64.deb

Display

I have an Nvida card, so I wanted to install the driver. Last Ubuntu version automatically installed the drvier. This time, I had to do it myself. I opened the Additional Drivers app an selected the 465 driver:

After trying the 465 and 470 drivers for a while, I found it was locking up a lot. Chrome and Teams would crash everytime I would open the laptop lid up. I guess restoring after a suspend caused memory issues. Worse, it would lock up everytime I would disconnect from my D6000 dock. So, I tried the 450 driver I had on the previous version of Ubuntu.

Battery

I haven’t done some good testing to confirm, but I think Power Top has doubled my battery life. I installed with:

sudo apt-get install tlp powertop
sudo tlp start
sudo tlp-stat -s

Just because it’s fun to see as the years go by, here’s the stats:

--- TLP 1.3.1 --------------------------------------------
 +++ System Info
 System         = Dell Inc.  XPS 15 7590
 BIOS           = 1.10.0
 Release        = Ubuntu 21.04
 Kernel         = 5.11.0-22-generic #23-Ubuntu SMP Thu Jun 17 00:34:23 UTC 2021 x86_64
 /proc/cmdline  = BOOT_IMAGE=/vmlinuz-5.11.0-22-generic root=/dev/mapper/vgubuntu-root ro quiet splash vt.handoff=7
 Init system    = systemd v247 (247.3-3ubuntu3.1)
 Boot mode      = UEFI
 +++ TLP Status
 State          = enabled
 RDW state      = enabled
 Last run       = 11:30:47 PM,     10 sec(s) ago
 Mode           = AC
 Power source   = AC

Networking

To be prepared for any VPN requirement, I install all the VPNs:

sudo apt install vpnc \
    network-manager-vpnc \
    network-manager-openconnect \
    network-manager-openconnect-gnome \
    openconnect \
    network-manager-iodine \
    network-manager-openvpn \
    network-manager-strongswan \
    network-manager-openvpn-gnome  \
    network-manager-iodine-gnome \
    network-manager-vpnc-gnome

Productivity

LIbreOffice comes pre-installed. But, to keep it up to date, I added the official repository:

sudo add-apt-repository ppa:libreoffice/ppa

For Bible study software, I use Xiphos. Remember up in the backup section, I restored the .sword directory for the Bible text and commentaries.

sudo apt install xiphos

I’ve been using Zotero off and on for a while now. It’s hard to figure out the best way to install in a way that keeps it automatically updated. I finally found a place that claims to update the repository within 24 hours of updates. So, I’ll use that.

wget -qO- https://github.com/retorquere/zotero-deb/releases/download/apt-get/install.sh | sudo bash
sudo apt update
sudo apt install zotero

Restoring the data directory was a big challenging because I had use the snap before. I had to move the data from ~/snap/zotero-snap/common/Zotero to ~/Zotero

I’ve been using Joplin as my notes application. I installed it from the software center, but I noticed it was a snap app:

snap install joplin-desktop

After installing, I went to Tools > Options > Synchronization, and I changed the target to OneDrive. After that, I exited back out to the main app and clicked the Synchronize button. That took me through the login process.

Printing

The cups-browsed service is very annoying because it adds printers that don’t get removed. So, a laptop that travels around a bit just collects printers that never get removed.

sudo systemctl stop cups-browsed
sudo systemctl disable cups-browsed

To install my Dell E525W printer, I downloaded the driver from the Dell website. I unzipped and installed the deb package:

cd ~/Downloads/
unzip Printer_E525w_Driver_Dell_A00_Linux.zip
sudo apt install ./dell-color-mfp-e525w_1.0-28_all.deb

I have found the settings app unreliable for working with printers. So, I used the cups web interface at http://localhost:631. I added an IPP printer with the URL ipp://DELLA40A1E/ipp/ and the PPD file located at: /usr/share/cups/model/Dell/Dell_Color_MFP_E525w.ppd.gz

Application Package Systems

Ubuntu comes with the ability to use DEB packages and snap packages. I used this to add AppImages:

cd ~/Downloads/
 wget "https://github.com/AppImage/appimaged/releases/download/continuous/appimaged-x86_64.AppImage"
 chmod a+x appimaged-x86_64.AppImage
 ./appimaged-x86_64.AppImage --install

And, I added Flatpak:

sudo apt install flatpak

Misc Utilities

Here are just a few utilities that I install:

sudo apt install menulibre \
       p7zip-full p7zip-rar \
       synaptic \
       gnome-tweak-tool
  • Menu Libre is a menu editor that makes it easy to add .desktop files to the menu system
  • 7Zip is handy for compression, although I rarely use it
  • synaptic just makes it easier to see what is installed
  • gnome-tweak-tool has a few settings that lets you tweak your system

Balena Etcher is one more utility that is great for putting images onto USB drivers for installing. I downloaded the AppImage from their website.

To finished the tweaks, I opened the regular settings app and made these changes:

  • Changed the time display on the top bar to 12 hour display under Date & Time > Time Format
  • Added the percentage by the battery indicator under Power > Suspend & Power Button > Show Battery Percentage (at the bottom)
  • Added the an avatar picture for my login under Users > click on the picture

In the Tweaks app (Gnome Tweak Tool), I made the following setting changes:

  • Added the weekday to the date with Top Bar > Clock > Weekday
  • Changed the modal behavior by unchecking Windows > Attach Modal Dialogs

Extensions

Before I can install any extensions, I had to install the chrome plugin:

sudo apt install chrome-gnome-shell

I also had to have this extension from the Chrome Store. Actually, I just restored my Chrome profile so the extension came with that.

So, then, these are the extensions that I like:

I retired these two extensions. I list them because maybe I’ll go back:

  • Caffeine: the tool I used to use stop the computer from going to sleep
  • Do Not Disturb Button: I used to use this for hiding notifications during meetings. It’s no longer maintained.

Media Apps

I’ve had issues with old versions of Gimp and collaborating with others . According to Gimp’s website, 2.10.24 is the latest version. Gimp came installed as a snap and it is actually the latest version. So, I left it alone.

sudo apt install inkscape \
         xournal
  • Inkscape: My go to program for drawing (vector-based drawing)
  • Xournal: I use it for annotating PDFs

These are the programs I use with audio:

sudo apt install audacity \
           soundconverter \
           musescore3 \
           easytag
  • Audacity: good for editing sound
  • soundconverter: good for changing sound formats
  • Musescore: good for working with sheet music
  • Easytag: good for changing the files’ meta-data

Video-related

These are the basic programs I like:

sudo apt install mplayer \
       vlc \
       youtube-dl
  • mplayer: simple video player
  • vlc: good player that will play about anything
  • youtube-dl: makes it easy to download things from YouTube

For the codecs, I installed:

sudo apt install \
      libdvdnav4 \
      libdvd-pkg \
      gstreamer1.0-plugins-bad \
      gstreamer1.0-plugins-ugly \
      ubuntu-restricted-extras
sudo dpkg-reconfigure libdvd-pkg 

Note: If you forget that second (reconfigure) command, you’ll get errors like this every apt install:

libdvd-pkg: apt-get check failed, you may have broken packages. Aborting…
 N: Download is performed unsandboxed as root as file '/home/skp/Downloads/insync_3.4.2.40983-focal_amd64.deb' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)

For OBS, I repeated what I did on the last version of Ubuntu:

sudo apt install ffmpeg
sudo add-apt-repository ppa:obsproject/obs-studio
sudo apt install obs-studio

I found most of the plugins and such came over by restoring the config directory. One thing I did have to do was download the plugin from Dev47Apps and put it into ~/.config/obs-studio/plugins

Finally, I use Kdenlive for editing videos. I just downloaded the AppImage from their download page.

Resources

Video in Flutter

I started a quick app to try to organize a group of photos, which I intend to turn into a video. The problem is that I have a bunch of videos in the batch as well that I need to review. I thought I could get the video to work inside my app, but long story short, I wasn’t able to figure it out. I don’t think video is supported on the Linux platform. Maybe if I was working on Android, it would be a different story.

Anyway, maybe some of my notes will be helpful if you are trying things similar.

Read More

Switching to Joplin from OneNote

OneNote works great for the most part. I use(d) it on Linux through the browser and on Android. But, I just can’t rely on it:

Sometimes, I’ll get this message:

I can refresh the browser page, and it’ll go away, but it seems to just get worse and worse. It’s frustrating. I’ve finally reached the point that it is time to look for something else.

Joplin

I ran across Joplin. It has an Android app that will synchronize, and it also allows pasting screenshots. Those were my two big feature requests in a note-taking app.

Read More

Setting Up OBS for Teams

I’ve been wanting to level up my meeting look and sound for a while. I’ve been hearing about how you can output OBS Studio as a virtual camera so that you can use it as your webcam in Microsoft Teams. So, here are my notes on how I set it all up.

Installing Virtual Camera

First, I Installed the loopback camera module from the Ubuntu repository:

sudo apt install v4l2loopback-dkms

Originally, I had some issues with the plugin installation, so I might have taken a few extra steps here. But, it works, so I don’t have any complaints.

To make it automatically load on boot, I added this line to the end of /etc/modules:

sudo bash -c 'echo v4l2loopback >> /etc/modules'

Then, I added this line to the modprobe conf file:

sudo bash -c 'echo options v4l2loopback video_nr=5 card_label="vcam" > /etc/modprobe.d/v4l2.conf'

Finally, to use it the first time (without having to reboot), I ran the modprobe command. I’m not sure if this was necessary.

sudo modprobe v4l2loopback

Now, the OBS plugin makes starting and stopping the stream easier. I downloaded the plugin deb package from the github release page. Then, I installed the deb from the commandline:

sudo apt install ~/Downloads/obs-v4l2sink.deb

For some reason, the Deb package apparently places the files in the wrong place. I copied the files into my user plugins directory (which I had to create first).

cd ~/.config/obs-studio
mkdir plugins
cd plugins
cp -r /usr/share/obs/obs-plugins/v4l2sink/ .
mkdir -p $HOME/.config/obs-studio/plugins/v4l2sink/bin/64bit 
cp /usr/lib/obs-plugins/v4l2sink.so $HOME/.config/obs-studio/plugins/v4l2sink/bin/64bit

After that, the plugin shows up in the tools menu.

DroidCam OBS

On my new setup, I have my laptop off to the side. That means that the webcam built into the laptop isn’t in the best position. Instead, I’d like to use the camera on my phone as the camera for the meeting. The best way I found is with the DroidCam app/plugin.

First, I installed the app on my phone. it’s DroidCam on the play store.

I downloaded the plugin from Dev47Apps. I extracted the zip file to $HOME/.config/obs-studio/plugins

After installing, you can add a “DroidCam OBS” source to your scene.

OBS Setup

To make it work, I opened two different instances of OBS. The bottom is for the webcam, and the top is for desktop sharing.

On the bottom one, I opened a Windowed projector. I right clicked on the preview, and selected “Windowed Projector”.

Then, in the top window, I was able to add a “Window Capture” source.

Then, I started the virtual camera on the bottom window so that Teams could use that one. You can find it in the menu at Tools > v4l2loopback.

You just have to hit Start and then you can close this window.

Finally, in the Teams device settings, I selected “vcam” as my Camera device. That pulls in the output from OBS:

Lastly, Teams has not given me the option to share a single window. It only allows me to select one of my desktops. So, I can use the top OBS window to control what shows. I just output that OBS on my 3rd screen that I can share on the Teams call. I can do that by right clicking on the preview window and selecting Fullscreen Projector (Preview) > Display 3.

Resources