Installing Stuff Notes

The power of scripting frequently lies in using other programs.


The value of coding from scratch

Has diminished RAPIDLY, moreso because of AI


Why write anything twice?


Why I harp on Bash

It's the most versatile/powerful way
to use OTHER PEOPLES code


(probably)



So you want to grab some code and use it?


After all, what's the difference between


PROGRAMMING and USING?


Option 1. Grab a WHOLE "OS"


Real Machines (e.g. Pis) or


Virtualizations

You know this quite a bit already...


Distributions

Usually ISOs
We've been dealing with general, but


Specialized Distributions

Very common and useful these days
Especially with Raspberry Pis
(We'll come back later, but Docker, and LXC can do these in "Containers"


BITS OF SOFTWARE

- Text editors
- Games
- Web Servers
- anything, really.


IN THE BEGINNING

When the USERS were also the ADMINS/DEVELOPERS


(Windows/Mac users, I'm guessing it felt like
"Buy the physical disc in a store"
or
"Download and hope for the best, as it litters your drive"


and then just jumped to APP STORES?


Again, the problem:

(this is a completely made up example)


E.g. you install Libreoffice Calc (like Excel)
and also
A TI-graphing calculator app


Which both use a "lib-math.."


Again the problem

And now you delete one of them.


Or they use different versions.


How do you deal with this?


App Stores

Nice right? Curated, rated, clean set of apps


That get rid of themselves when you remove them


..theoretically


Us Linux snobs...


We saw app stores, and were like


Oh, you mean like "package managers using repositories"


wait...y'all gotta PAY for the apps lol


A related problem: Configurations

Windows: e.g. .ini files, or dropdown menus with "preferences"


Linux: Dotfiles, which can litter your home drive


Linux


Was *terrible* at first:


COMPILE THE PROGRAM YOURSELF.



Package Managers (classic)

(the precursor to app stores)
Try to track and manage libraries et al


Package Managers - Debian Family

This is Ubuntu, Mint, Pop, MX LINUX


apt/ apt-get
(synaptic, which is a gui version)
(aptitude, which is similar)


Also, the less preferred "dpkg", used to install "debs"


Package Managers - Red Hat Family

Fedora, Red Hat


RPM


Package Managers - Arch Family

Arch, Manjaro


pacman



MODERN ERA

Linux is beginning to adopt the bifurcation
for better or for worse
of END USERS v. ADMIN/DEVELOPER


End User -Really easy

The really easy stuff
"Software Centers"


End User - Newer Package Managers

- Snap
- Flatpak
- AppImage


Generally, the benefit here is (supposed to be)
"software is always being worked on"


Snap and Flatpak

More or less, their own sandboxed "systems"


"Snap" requires "Ubuntu approval,"


Which is why people like it less.


Flatpak


Winning, I hope.


Things are weirdly named in it; but it's what the Steam Deck uses.


AppImage


Lol, forget "libraries" etc.


Just put LITERALLY EVERYTHING IN ONE FILE!



But all of this is mostly "apps"

"Complete" bits of software, but we're doing backend stuff.


(there is some crossover)



The occasional "Installer helper"

Like "Tasksel"
or a Direct Download Shell script
that's actually an installer..speaking of


Direct Downloads


Raw Binaries or Shell scripts


Downloaded installers


Use at your own risk (but never say never)


On Direct Downloads

Theoretically very dangerous
Practically? In Linux? Probably not so much.
Especially if:


Direct Download precautions


So yes, maybe
curl http:XXX | bash
isn't so evil.


Speaking of homework, Git

Git, like Linux, is exactly what you get when a genius does his own thing;


It's great, people use it, and other parties can build on top and centralize it.


(also, it might be a *tad* depressing when you realize that there are 1000x programmers)


Github

Presently still a great resource.
Reasonably safe place to download and run code from "raw"
See also, Gitlab and other competitors.


Git

(there is a LOT more to say about git.
we spend an entire class period on it in 5367)



ADMIN

A lot of the times, the above will work.
But, you're tinkering, so you may need to dig deeper.


ADMIN - Language Specific

If you're using cutting edge, you may need to know about the specific languages


Java

Tends to not be too bad; you mostly just have to have your Java up to date
and run the Jar file
(disclaimer, the vast majority of my real life knowledge here is Minecraft)


Javascript

Can be messy, of course.


There is node/npm


Python

For such an otherwise clean language;
installing packages with it can be very confusing:
Mostly owing to


Python

Resolving conflicting libraries and versions can be done
in a number of ways, all decent, but all different.

  1. Just install the thing on your system. If it's a singular system you're good
  2. Virtual Environments. Confusing, but useful
  3. If possible, Jupyter Notebooks et al.

CONTAINERS

Enter Docker.
Amazingly good idea that mostly works.


Docker

Put things in "Containers."
Not as heavy as entire VMs
But walled off from everything.


Why not just apps like the end users?

END USERS usually don't need "special configs"
or "opening things to the internet"



Docker

Very cool thing about docker is PORTABILITY.
Their metaphor is "everything in shipping containers"


Docker

Also, it's own ecosystem. Frequently you can be like "install directly"
or "use a docker container"


The latter usually makes complicated above stuff into


"docker run hello-world"


(with some more flags to point to folders and ports for the net.



Too good to be true?


Kind of.


The Good: "Docker" uses a completely open standard.


Meaning, other programs can step in and replace it (e.g. podman)


Kind of like eg. Word and Libreoffice or Google Docs


Kind of Like Linux itself


The presence of these others probably keeps Docker pretty good.



The great: Docker Compose


What if you have not a simple "hello-world"


but


docker run -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro 
--restart always --log-opt max-size=1g nginx


Just put it in a file


name: <your project name>
services:
	nginx:
		ports:
			- 80:80
		volumes:
			- /var/run/docker.sock:/tmp/docker.sock:ro
		restart: always
		logging:
			options:
				max-size: 1g
		image: nginx

The ugly - Docker Desktop


Probably useful for some, but big bloated thing
that Docker's trying to use to make things "too easy"



I'm reminded EXACTLY of


The difference between
Command Line MySQL
and
Mysql-Workbench


(might work for y'all but meh)


And here, I still haven't figured it out.