<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.brandon-rodriguez.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Brodriguez</id>
	<title>Dev Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.brandon-rodriguez.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Brodriguez"/>
	<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/Special:Contributions/Brodriguez"/>
	<updated>2026-05-07T12:14:35Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Django/Production&amp;diff=819</id>
		<title>Django/Production</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Django/Production&amp;diff=819"/>
		<updated>2026-01-09T12:51:42Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Correct permission values&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following is an attempt at detailing steps to push a Django project into production.&lt;br /&gt;
&lt;br /&gt;
Note that this page makes references to several system root folders, particularly {{ ic |srv}} and {{ ic |opt}}. For details on what root folders are generally meant for, see https://help.ubuntu.com/community/LinuxFilesystemTreeOverview.&lt;br /&gt;
&lt;br /&gt;
However, having said that, these folders are not set in stone and if you have reason to change directory paths, that&#039;s okay as long as you change all references to such.&lt;br /&gt;
&lt;br /&gt;
{{ note | Most of this page will assume you have root account access, as that&#039;s required for Apache/Nginx setup anyways. If you don&#039;t, then consult the provider of your webhosting for how they recommend to proceed. }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pre-Setup ==&lt;br /&gt;
If not yet done, create an appropriate database instance for your project. Note that SqLite is not sufficient, as it&#039;s unlikely to be able to handle throughput necessary for a server. [[Programming/MySQL | MySQL]]/[[Programming/PostgreSQL | PostgreSQL]]/Oracle/etc are designed for this.&lt;br /&gt;
&lt;br /&gt;
Also update your project package requirements to include the {{ ic |uWSGI}} Python package. This is required for Apache/Daphne (aka Nginx) to interface with a Python virtual environment.&lt;br /&gt;
&lt;br /&gt;
== Base Project Setup ==&lt;br /&gt;
=== Project Location ===&lt;br /&gt;
First, create directories and clone your project to the desired location on the server. The recommended location is somewhere like:&lt;br /&gt;
 /src/web_serve/django/&amp;lt;project_name&amp;gt;/&lt;br /&gt;
&lt;br /&gt;
=== Initial Production Settings Values ===&lt;br /&gt;
Then edit your project settings for bare minimum production values to get it up and running. This likely includes things like:&lt;br /&gt;
* Connection settings for the production database.&lt;br /&gt;
* Static file serve locations.&lt;br /&gt;
* Logging setup.&lt;br /&gt;
* Allowed Hosts setting.&lt;br /&gt;
* Secret Key setting.&lt;br /&gt;
* Any possible custom project settings, required to get the project running.&lt;br /&gt;
&lt;br /&gt;
While you&#039;re editing the settings file(s), it&#039;s recommended to set these as well, but technically it can wait until the end of the project setup.&lt;br /&gt;
* Email settings.&lt;br /&gt;
* Security settings.&lt;br /&gt;
* Any possible custom project settings, required for long-term stability &amp;amp; security&lt;br /&gt;
&lt;br /&gt;
{{ todo | Document Django settings file production values. }}&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
If your project has any custom installation scripts, now might be a good time to run them. Otherwise, install system dependencies (such as [[Apt-Get Packages]]) and then run the standard {{ ic |manage.py}} setup commands.&lt;br /&gt;
&lt;br /&gt;
==== Apt Package Installation ====&lt;br /&gt;
Assuming use of an Ubuntu server, common system packages for production are:&lt;br /&gt;
* The desired [[Apt-Get#Python |Python version]] to serve your project.&lt;br /&gt;
* [[Apt-Get Packages#Apache | Apache packages]], for a standard Django install (alternatively, can use Nginx if you&#039;d prefer).&lt;br /&gt;
* [[Apt-Get Packages#Nginx | Nginx packages]], if using Django Channels.&lt;br /&gt;
* [[Apt-Get Packages#Redis | Redis packages]], also if using Django Channels.&lt;br /&gt;
&lt;br /&gt;
Note that these are the bare minimum for a standard Django install. Depending on your project, you might need other things such as [[Apt-Get Packages#Npm/NodeJs | NPM packages]] to manage [[Programming/JavaScript]] files.&lt;br /&gt;
&lt;br /&gt;
==== Setup Python Environment ====&lt;br /&gt;
After installing system packages, you can create a [[Programming/Python/Setup#Virtual Environments | Python Virtual Environment]] to serve your project from.&lt;br /&gt;
&lt;br /&gt;
The recommended location is something like:&lt;br /&gt;
 /opt/env/&amp;lt;environment_name&amp;gt;/&lt;br /&gt;
&lt;br /&gt;
Once created, remember to load the environment to your console, and then install project packages. (ex: {{ ic |pip install -r requirements.txt}} from project root).&lt;br /&gt;
&lt;br /&gt;
==== Manage.py Setup Commands ====&lt;br /&gt;
{{ Note | Before this step, if your project has any static files (CSS or JavaScript) to compile, you should probably do that here.}}&lt;br /&gt;
&lt;br /&gt;
Once all system packages are installed and the environment is setup, we can finally run our manage.py commands.&lt;br /&gt;
&lt;br /&gt;
Depending on your project, you may have additional custom commands to install. But the standard default ones are (in order):&lt;br /&gt;
* {{ ic |python manage.py migrate}}&lt;br /&gt;
* {{ ic |python manage.py collectstatic}}&lt;br /&gt;
* {{ ic |python manage.py check}}&lt;br /&gt;
&lt;br /&gt;
{{ warn | Note that we don&#039;t run {{ ic |python manage.py makemigrations}} in production. This is because migration files should always be created and committed in development, and then pushed up after thorough testing.}}&lt;br /&gt;
&lt;br /&gt;
==== Project Permissions ====&lt;br /&gt;
Permissions should be set such that both the expected user(s) and apache/nginx can access project files.&lt;br /&gt;
&lt;br /&gt;
Nginx seems to assume the user is {{www-data}}. You should probably also create a group that all users belong to. Thus we set folder/file permissions to {{ ic |www-data:&amp;lt;group_name&amp;gt;}}.&lt;br /&gt;
&lt;br /&gt;
In both cases, you&#039;ll probably want to set permissions such that:&lt;br /&gt;
* Users/groups both have read/write/execute permissions on folders.&lt;br /&gt;
* Users/groups both have read/write permissions on files.&lt;br /&gt;
* Other users have no access on folders or files.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll want to make sure to set these permissions on:&lt;br /&gt;
* Project folders&lt;br /&gt;
* Static folders associated with the project&lt;br /&gt;
* The local virtual environment&lt;br /&gt;
* Project logging folders&lt;br /&gt;
* Any other files/folders that your website will need direct access to.&lt;br /&gt;
&lt;br /&gt;
For more details on permissions, see [[Linux/Permissions | Linux Permissions]].&lt;br /&gt;
&lt;br /&gt;
==== Post-Installation Notes ====&lt;br /&gt;
At this point, your project should be set up enough to run via {{ ic |python manage.py runserver}} and project UnitTests should pass when run.&lt;br /&gt;
&lt;br /&gt;
While we definitely don&#039;t want to serve the project as it is now (and you shouldn&#039;t be able to load pages in a web browser at this point), these act as a good check to make sure everything is handling correctly so far.&lt;br /&gt;
&lt;br /&gt;
If you get any errors at this stage, go back and troubleshoot it before proceeding.&lt;br /&gt;
&lt;br /&gt;
{{ todo | apache setup? }}&lt;br /&gt;
&lt;br /&gt;
== Nginx Setup ==&lt;br /&gt;
If you&#039;re using Django Channels, then you must use Nginx to serve the project. Apache is physically incapable of handling the asynchronous websocket connections that channels uses.&lt;br /&gt;
&lt;br /&gt;
=== Configuring Volatile Project Files ===&lt;br /&gt;
First, we want to configure our &amp;quot;volatile&amp;quot; project files. This includes our project runtime process, our web-socket files, and other entities pertaining to our project, which only exist during runtime.&lt;br /&gt;
&lt;br /&gt;
It&#039;s recommended to put these in the {{ ic |/run/&amp;lt;process_name&amp;gt;/}} directory and associated logs in the {{ ic |/var/log/&amp;lt;process_name&amp;gt;/ directory}}.&lt;br /&gt;
&lt;br /&gt;
This can be done by creating the following files with the respective contents:&lt;br /&gt;
{{ hc |/etc/tmpfiles.d/daphne.conf|&lt;br /&gt;
d /run/daphne 0775 www-data www-data -&lt;br /&gt;
d /var/log/daphne 0775 www-data www-data -&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ hc |/etc/tmpfiles.d/uwsgi.conf|&lt;br /&gt;
d /run/uwsgi 0775 www-data www-data -&lt;br /&gt;
d /var/log/uwsgi 0775 www-data www-data -&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Once the files are created, we can execute them with&lt;br /&gt;
 sudo systemd-tmpfiles --create&lt;br /&gt;
&lt;br /&gt;
For more details on these tmpfiles, see https://manpages.ubuntu.com/manpages/bionic/man5/tmpfiles.d.5.html&lt;br /&gt;
&lt;br /&gt;
=== uWSGI Configurations ===&lt;br /&gt;
uWSGI is essentially a project meant to &amp;quot;provide a common api and configuration style&amp;quot; for hosting services from various different languages.&lt;br /&gt;
&lt;br /&gt;
It&#039;s effectively the interface we use to connect Nginx and Django together.&lt;br /&gt;
&lt;br /&gt;
For this, first we create the following folder and set ownership to {{ ic |www-data}}:&lt;br /&gt;
 sudo mkdir -p /etc/uwsgi/sites&lt;br /&gt;
 sudo touch /etc/uwsgi/sites/&amp;lt;project_name&amp;gt;.ini&lt;br /&gt;
 sudo chown www-data:www-data /etc/uwsgi -R&lt;br /&gt;
&lt;br /&gt;
Next, we add a configuration file for our project:&lt;br /&gt;
{{ hc |/etc/uwsgi/sites/&amp;lt;project_name&amp;gt;.ini|&lt;br /&gt;
&amp;lt;nowiki&amp;gt;[uwsgi]&lt;br /&gt;
project = &amp;lt;project_name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Django Settings.&lt;br /&gt;
chdir = /srv/web_serve/django/%(project)&lt;br /&gt;
home = /opt/env/&amp;lt;virtual_env_name&amp;gt;&lt;br /&gt;
module = &amp;lt;project_settings_folder&amp;gt;.wsgi:application&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Process Settings.&lt;br /&gt;
master = true&lt;br /&gt;
processes = 5&lt;br /&gt;
threads = 2&lt;br /&gt;
uid = www-data&lt;br /&gt;
gid = www-data&lt;br /&gt;
chmod-socket = 664&lt;br /&gt;
pidfile = /run/uwsgi/%(project).pid&lt;br /&gt;
socket = /run/uwsgi/%(project).sock&lt;br /&gt;
wsgi-file = %(chdir)/settings/wsgi.py&lt;br /&gt;
manage-script-name = true&lt;br /&gt;
vacuum = true&lt;br /&gt;
max-requests = 5000&lt;br /&gt;
logto = /var/log/uwsgi/%n.log&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
For this config, note to change:&lt;br /&gt;
* {{ ic |&amp;lt;nowiki&amp;gt;project = &amp;lt;project_name&amp;gt;&amp;lt;/nowiki&amp;gt;}} (the second line) to match your project&#039;s root folder name.&lt;br /&gt;
* {{ ic |&amp;lt;nowiki&amp;gt;home = /opt/env/&amp;lt;virtual_env_name&amp;gt;&amp;lt;/nowiki&amp;gt;}} (the seventh line) to match your virtual environment location.&lt;br /&gt;
* {{ ic |&amp;lt;nowiki&amp;gt;module = &amp;lt;project_settings_folder&amp;gt;.wsgi:application&amp;lt;/nowiki&amp;gt;}} (the eigth line) to match your project settings folder.&lt;br /&gt;
* {{ ic |&amp;lt;nowiki&amp;gt;wsgi-file = %(chdir)&amp;lt;/nowiki&amp;gt;/settings/wsgi.py}} (5th to last line) to point to the actual uwsgi file in your project.&lt;br /&gt;
&lt;br /&gt;
While these settings won&#039;t work for all projects, they should be a good starting point for the average small Django project to get up and running.&lt;br /&gt;
&lt;br /&gt;
=== Nginx Configurations ===&lt;br /&gt;
There are many ways to setup a nginx server, with some basics located at [[Programming/Nginx]].&lt;br /&gt;
&lt;br /&gt;
{{ todo | Document making server more secure with possible SSL params. }}&lt;br /&gt;
&lt;br /&gt;
Recommended steps for serving a Django project are as follows:&lt;br /&gt;
* First, it&#039;s strongly recommended to [[Programming/Nginx#HTTPS and SSL | set up HTTPS]] and redirect all server traffic to HTTPS.&lt;br /&gt;
* Set up [[Programming/Nginx#Example 1: Serving static | static file handling]] for the {{ ic |/media}} and {{ ic |/static}} urls (or whatever the equivalent is for your specific Django project).&lt;br /&gt;
* If applicable, set up [[Programming/Nginx#Example 2: Redirecting Specific Requests | request redirects]] for your project, where needed.&lt;br /&gt;
* Define your core [[Programming/Nginx#Example 3: Passing Requests to UWSGI | UWSGI request handler]], preferably via [[Programming/Nginx#Reusable Location Blocks | reusable location blocks]].&lt;br /&gt;
* Finally, if using something that needs websocket request handling (such as [https://channels.readthedocs.io/en/stable/ DjangoChannels], then we need an additional handler. The following code snippet passes requests to Daphne for DjangoChannels handling (this assumes websockets are all served under a root url of {{ ic |example.com/ws/}}):&lt;br /&gt;
{{ hc |/etc/nginx/sites-available/&amp;lt;project_name&amp;gt;.conf|&lt;br /&gt;
&amp;lt;nowiki&amp;gt;    # Send websocket connections to Daphne.&lt;br /&gt;
    location /ws {&lt;br /&gt;
        proxy_pass http://unix:/run/daphne/&amp;lt;project_name&amp;gt;.sock;&lt;br /&gt;
        proxy_http_version 1.1;&lt;br /&gt;
        proxy_set_header Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        proxy_redirect off;&lt;br /&gt;
        proxy_set_header Host $host;&lt;br /&gt;
        proxy_set_header X-Real-OP $remote_addr;&lt;br /&gt;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
        proxy_set_header X-Forwarded-Host $server_name;&lt;br /&gt;
    }&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Systemd Service File Configurations ===&lt;br /&gt;
The systemd service files are effectively how Linux determines what processes should start on boot. They are located in the {{ ic |/etc/systemd/system/}} folder.&lt;br /&gt;
&lt;br /&gt;
For our project, we will create two files here:&lt;br /&gt;
{{ hc |/etc/systemd/system/daphne.service|&lt;br /&gt;
&amp;lt;nowiki&amp;gt;[Unit]&lt;br /&gt;
Description=Daphne server for Django web projects&lt;br /&gt;
After=syslog.target network.target uwsgi.service&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
ExecStart=/opt/env/&amp;lt;virtual_env_name&amp;gt;/bin/daphne -u /run/daphne/&amp;lt;project_name&amp;gt;.sock &amp;lt;project_settings_folder&amp;gt;.asgi:application&lt;br /&gt;
Restart=always&lt;br /&gt;
Type=simple&lt;br /&gt;
WorkingDirectory=/srv/web_serve/&amp;lt;project_name&amp;gt;&lt;br /&gt;
User=www-data&lt;br /&gt;
Group=&amp;lt;group_name&amp;gt;&lt;br /&gt;
StandardOutput=syslog&lt;br /&gt;
StandardError=syslog&lt;br /&gt;
KillSignal=SIGQUIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ hc |/etc/systemd/system/uwsgi.service|&lt;br /&gt;
&amp;lt;nowiki&amp;gt;[Unit]&lt;br /&gt;
Description=uWSGI Application Server in Emperor Mode&lt;br /&gt;
After=syslog.target network.target&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
ExecStart=/opt/env/&amp;lt;virtual_env_name&amp;gt;/bin/uwsgi --emperor /etc/uwsgi/sites&lt;br /&gt;
Restart=always&lt;br /&gt;
Type=notify&lt;br /&gt;
User=www-data&lt;br /&gt;
Group=&amp;lt;group_name&amp;gt;&lt;br /&gt;
StandardOutput=syslog&lt;br /&gt;
StandardError=syslog&lt;br /&gt;
KillSignal=SIGQUIT&lt;br /&gt;
NotifyAccess=all&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Once the files are created, tell the system to reload:&lt;br /&gt;
 sudo systemctl daemon-reload&lt;br /&gt;
 sudo systemctl start daphne&lt;br /&gt;
 sudo systemctl enable daphne&lt;br /&gt;
 sudo systemctl start uwsgi&lt;br /&gt;
 sudo systemctl enable uwsgi&lt;br /&gt;
&lt;br /&gt;
Check for possible errors with:&lt;br /&gt;
 journalctl -xe&lt;br /&gt;
&lt;br /&gt;
If no errors occur, then everything is good and your project is officially serving in production. Verify by trying to access your site in a browser.&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Python/PipEnv&amp;diff=818</id>
		<title>Python/PipEnv</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Python/PipEnv&amp;diff=818"/>
		<updated>2025-12-29T07:57:42Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Update docs for installing pipenv&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PipEnv is an attempt to make Python Pip behave more like [https://getcomposer.org/ Composer] (from Php/Laravel).&lt;br /&gt;
&lt;br /&gt;
In other words, this is meant to streamline project package/environment management. You tell PipEnv what packages you care about, and it effectively installs + manages versions (and sub-dependency versions) for you.&amp;lt;br&amp;gt;&lt;br /&gt;
This data is stored in files called {{ ic |PipFile}} and {{ ic |PipFile.lock}}, at your project root.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Official docs can be found at https://docs.pipenv.org/&lt;br /&gt;
&lt;br /&gt;
This page shows quick, basic options for ease of use.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Linux Setup ==&lt;br /&gt;
Before using PipEnv, it&#039;s recommended to add some additional settings to the local system environment.&lt;br /&gt;
To do this, edit the user&#039;s local {{ ic |.bashrc}} file (or equivalent) and add the following:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Update terminal path to find PipEnv:&lt;br /&gt;
 export PATH=&amp;quot;$PATH:/home/&amp;lt;username&amp;gt;/.local/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Update PipEnv settings to always use venv folders in project:&lt;br /&gt;
 export PIPENV_VENV_IN_PROJECT=true&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Reminder to restart terminal after saving changes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Important Commands ==&lt;br /&gt;
&lt;br /&gt;
=== Install Commands ===&lt;br /&gt;
Install PipEnv for Mac:&lt;br /&gt;
 brew install pipenv&lt;br /&gt;
&lt;br /&gt;
Install PipEnv for Linux:&lt;br /&gt;
Set and load up a virtual environment {{ic |python&amp;lt;version&amp;gt; -m venv .venv}} for the local project. Then run:&lt;br /&gt;
 pip install pipenv&lt;br /&gt;
Note that this only installs pipenv for that environment. You will need to repeat for every project.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Package Management Commands ===&lt;br /&gt;
{{ note | For the below commands, you can also add the {{ ic |--dev}} flag, which tells PipEnv to install optional &amp;quot;dev-packages&amp;quot; to the local Python environment. Aka, those dependencies that were defined in the &amp;quot;development section&amp;quot; of the PipFile.}}&lt;br /&gt;
&lt;br /&gt;
Install current project dependencies to the local Python environment, as listed in PipEnv files:&lt;br /&gt;
 pipenv sync&lt;br /&gt;
&lt;br /&gt;
Update project dependencies listed in PipEnv files, then install them to the local python environment:&lt;br /&gt;
 pipenv install&lt;br /&gt;
&lt;br /&gt;
Update a specific dependency (warning - may also update unrelated dependencies):&lt;br /&gt;
 pipenv update &amp;lt;dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uninstall a specific dependency with:&lt;br /&gt;
 pipenv uninstall &amp;lt;dependency&amp;gt;&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Apt-Get_Packages&amp;diff=817</id>
		<title>Apt-Get Packages</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Apt-Get_Packages&amp;diff=817"/>
		<updated>2025-04-10T02:05:56Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Update docker install instructions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists the &#039;&#039;&#039;apt-get&#039;&#039;&#039; commands to install various packages.&amp;lt;br&amp;gt;&lt;br /&gt;
For general information about &#039;&#039;&#039;apt-get&#039;&#039;&#039; usage, see [[Apt-Get]].&lt;br /&gt;
&lt;br /&gt;
{{ todo | Where applicable, remove content from this page and put on the language/application&#039;s main wiki page (ex: [[Python]]). Then just import installation text from that page to here. That way it&#039;s consistent across the wiki. }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== System Utilities ==&lt;br /&gt;
&lt;br /&gt;
=== Gparted ===&lt;br /&gt;
A helpful hard drive management tool, with a user-friendly GUI.&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install gparted&lt;br /&gt;
&lt;br /&gt;
=== Extra Hard Drive Utils ===&lt;br /&gt;
Used, for example, in network share mounting.&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install cifs-utils&lt;br /&gt;
&lt;br /&gt;
=== Compiz Config ===&lt;br /&gt;
For managing detailed desktop settings Ubuntu 16.04.&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install compizconfig-settings-manager&lt;br /&gt;
&lt;br /&gt;
=== Gnome Tweaks ===&lt;br /&gt;
For managing detailed desktop settings of Ubuntu 18.04.&lt;br /&gt;
 sudo add-apt-repository universe&lt;br /&gt;
 sudo apt install gnome-tweaks&lt;br /&gt;
&lt;br /&gt;
=== Gnome Extensions ===&lt;br /&gt;
For generally customizing the gnome desktop.&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install gnome-shell-extensions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== System Other ==&lt;br /&gt;
&lt;br /&gt;
=== Build Essential ===&lt;br /&gt;
A package that essentially contains references to other packages.&amp;lt;br&amp;gt;&lt;br /&gt;
Generally common to install for software development.&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install build-essential&lt;br /&gt;
&lt;br /&gt;
=== DKMS ===&lt;br /&gt;
A package used to rebuild system kernels after a kernel update.&amp;lt;br&amp;gt;&lt;br /&gt;
Generally needed if you manually upgrade kernels on your machine, or if running as a VM.&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install dkms&lt;br /&gt;
&lt;br /&gt;
=== OpenConnect ===&lt;br /&gt;
Allows easy VPN connections through the terminal.&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install openconnect&lt;br /&gt;
&lt;br /&gt;
=== Nvidia ===&lt;br /&gt;
&lt;br /&gt;
==== Base Drivers ====&lt;br /&gt;
If no drivers are detecting on initial install, find default preferred drivers with:&lt;br /&gt;
 sudo ubuntu-drivers autoinstall&lt;br /&gt;
 sudo prime-select nvidia&lt;br /&gt;
&lt;br /&gt;
==== Cuda ====&lt;br /&gt;
With proper Nvidia drivers already installed:&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install nvidia-cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
=== Chrome ===&lt;br /&gt;
Installs the standard Google Chrome web browser.&lt;br /&gt;
&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install chromium-browser&lt;br /&gt;
&lt;br /&gt;
=== Gimp ===&lt;br /&gt;
Gimp is a free image editor tool.&lt;br /&gt;
&lt;br /&gt;
 sudo apt install gimp&lt;br /&gt;
&lt;br /&gt;
=== VLC ===&lt;br /&gt;
VLC is an all-encompassing media player. It can handle just about any standardized media format you could throw at it.&lt;br /&gt;
&lt;br /&gt;
VLC is not available directly via apt. However, it can be installed with the &amp;lt;code&amp;gt;snap&amp;lt;/code&amp;gt; manager:&lt;br /&gt;
 sudo apt install snapd&lt;br /&gt;
 sudo snap install vlc&lt;br /&gt;
&lt;br /&gt;
=== LaTeX ===&lt;br /&gt;
For creating and editing pdf files.&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install texlive-full texmaker&lt;br /&gt;
&lt;br /&gt;
=== DropBox ===&lt;br /&gt;
For storing and managing files in the cloud.&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install nautilus-dropbox&lt;br /&gt;
&lt;br /&gt;
=== KeePass ===&lt;br /&gt;
For storing passwords securely.&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install keepass2&lt;br /&gt;
&lt;br /&gt;
=== qbit Torrent ===&lt;br /&gt;
For torrent tracking.&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install qbittorrent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Communication ==&lt;br /&gt;
&lt;br /&gt;
=== Slack ===&lt;br /&gt;
Slack is not available directly via apt. However, it can be installed with the &amp;lt;code&amp;gt;snap&amp;lt;/code&amp;gt; manager:&lt;br /&gt;
 sudo apt install snapd&lt;br /&gt;
 sudo snap install slack --classic&lt;br /&gt;
&lt;br /&gt;
=== Discord ===&lt;br /&gt;
Discord is not available directly via apt. However, it can be installed with the &amp;lt;code&amp;gt;snap&amp;lt;/code&amp;gt; manager:&lt;br /&gt;
 sudo apt install snapd&lt;br /&gt;
 sudo snap install discord&lt;br /&gt;
&lt;br /&gt;
=== Telegram ===&lt;br /&gt;
Telegram is not available directly via apt. However, it can be installed with the &amp;lt;code&amp;gt;snap&amp;lt;/code&amp;gt; manager:&lt;br /&gt;
 sudo apt install snapd&lt;br /&gt;
 sudo snap install telegram-desktop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== General Programming ==&lt;br /&gt;
&lt;br /&gt;
=== Git and Gitk ===&lt;br /&gt;
Installed on most distro&#039;s by default, but not always. Pretty essential for anything programming. If not present, can be installed with:&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install git gitk&lt;br /&gt;
&lt;br /&gt;
=== VirtualBox ===&lt;br /&gt;
VirtualBox is a free way to create and run Virtual Machines.&lt;br /&gt;
&lt;br /&gt;
Since this seems to be updated frequently, see https://www.virtualbox.org/wiki/Linux_Downloads for up to date details.&amp;lt;br&amp;gt;&lt;br /&gt;
It&#039;s recommended to specifically choose the newest version, as the base command seems to generally install an out-of-date version.&lt;br /&gt;
&lt;br /&gt;
=== Docker ===&lt;br /&gt;
Docker does to software what VirtualMachines do to operating systems. &amp;lt;br&amp;gt;&lt;br /&gt;
Essentially, docker creates individual, stand-alone environments (or containers) that allow a set of software to run.&lt;br /&gt;
&lt;br /&gt;
For install instructions, see https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository&lt;br /&gt;
&lt;br /&gt;
=== MySQL Workbench ===&lt;br /&gt;
A useful and easy interface for interacting with MySQL servers.&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install mysql-workbench&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programming Languages ==&lt;br /&gt;
&lt;br /&gt;
=== Npm/NodeJs ===&lt;br /&gt;
Npm &amp;amp; NodeJs are bundled together. Npm has turned into the standard project manager for anything JavaScript.&lt;br /&gt;
&lt;br /&gt;
To install:&lt;br /&gt;
 curl -sL https://deb.nodesource.com/setup_15.x | sudo -E bash -&lt;br /&gt;
 sudo apt install nodejs&lt;br /&gt;
&lt;br /&gt;
=== SASS ===&lt;br /&gt;
Sass is a CSS pre-processor language, that upgrades CSS from just a &amp;quot;markup language&amp;quot; to a working &amp;quot;programming language&amp;quot;. Very useful.&lt;br /&gt;
&lt;br /&gt;
The current latest recommended means of installing SASS is dart-sass, via Npm:&lt;br /&gt;
 sudo npm install -g sass&lt;br /&gt;
&lt;br /&gt;
=== MySQL ===&lt;br /&gt;
Installs MySQL server and runs initial install setup.&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install mysql-server&lt;br /&gt;
 sudo mysql_secure_installation&lt;br /&gt;
&lt;br /&gt;
=== Php ===&lt;br /&gt;
 {{ Note | As of summer 2020, these packages seem to work with the current version of Laravel and Php. }}&lt;br /&gt;
 sudo apt install php php-all-dev php-common php-dev php-bcmath php-bz2 php-cli php-curl php-gd php-imap php-json php-intl php-ldap php-mbstring php-mysql php-xml php-zip&lt;br /&gt;
&lt;br /&gt;
To install an older version of Php, specify the number. Ex:&lt;br /&gt;
 sudo apt install php7.4 php7.4-common php7.4-dev php7.4-bcmath php7.4-bz2 php7.4-cli php7.4-curl php7.4-gd php7.4-imap php7.4-json php7.4-intl php7.4-ldap php7.4-mbstring php7.4-mysql php7.4-xml php7.4-zip&lt;br /&gt;
&lt;br /&gt;
If trying to install really old versions of php, you may first need:&lt;br /&gt;
 sudo add-apt-repository ppa:ondrej/php&lt;br /&gt;
&lt;br /&gt;
==== Laravel ====&lt;br /&gt;
Laravel is a Php based web framework.&lt;br /&gt;
&lt;br /&gt;
To install Laravel:&lt;br /&gt;
* First install the desired Php version, using the above steps.&lt;br /&gt;
* Download composer from https://getcomposer.org/download/&lt;br /&gt;
* Add execution permissions {{ ic |sudo chmod +x &amp;lt;path_to_composer_file&amp;gt;}}&lt;br /&gt;
* Move composer file with {{ ic |sudo mv &amp;lt;path_to_composer_file&amp;gt; /usr/local/bin/composer}}&lt;br /&gt;
* Restart terminal&lt;br /&gt;
* Run {{ ic | composer global require laravel/installer }}&lt;br /&gt;
&lt;br /&gt;
(Optional) To update what version of php that composer uses, run:&lt;br /&gt;
  php&amp;lt;version&amp;gt; /usr/local/bin/composer update&lt;br /&gt;
Where {{ ic |&amp;lt;version&amp;gt;}} corresponds to the version of Php you&#039;d like composer to use. Note that this version of Php must be installed on your system for the command to work.&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
Depending on your version of Ubuntu, you might only have certain Python versions available for install. To correct this, run:&lt;br /&gt;
 sudo add-apt-repository ppa:deadsnakes/ppa&lt;br /&gt;
 sudo apt update&lt;br /&gt;
&lt;br /&gt;
Then you can install the desired Python version.&lt;br /&gt;
For example, some more recent versions are {{ ic |python3.6}}, {{ ic |python3.7}}, or {{ ic |python3.8}}.&lt;br /&gt;
 sudo apt install python&amp;lt;version&amp;gt;&lt;br /&gt;
 sudo apt install python&amp;lt;version&amp;gt;-dev&lt;br /&gt;
 sudo apt install python&amp;lt;version&amp;gt;-venv&lt;br /&gt;
&lt;br /&gt;
If you get an error when trying to use Pip or run the &#039;&#039;&#039;python -m venv&#039;&#039;&#039; command, you might also need to run the following:&lt;br /&gt;
 sudo apt install python3-pip&lt;br /&gt;
&lt;br /&gt;
==== PipEnv ====&lt;br /&gt;
For Python environment management.&lt;br /&gt;
&lt;br /&gt;
First add the following to the system path:&lt;br /&gt;
 PATH=&amp;quot;$PATH:/home/&amp;lt;username&amp;gt;/.local/bin&amp;quot;&lt;br /&gt;
 PIPENV_VENV_IN_PROJECT=true&lt;br /&gt;
&lt;br /&gt;
Then install with the following command:&lt;br /&gt;
 python3 -m pip install --user pipenv&lt;br /&gt;
&lt;br /&gt;
== Programming IDEs ==&lt;br /&gt;
&lt;br /&gt;
=== Sublime Text ===&lt;br /&gt;
A text editor that, by itself, isn&#039;t very impressive. But it has a lot of support for extensions and customization, which make it as good as most standard IDE&#039;s.&lt;br /&gt;
&lt;br /&gt;
==== Ubuntu22 ====&lt;br /&gt;
 wget -qO - https://download.sublimetext.com/sublimehq-pub.gpg | sudo gpg --dearmor -o /usr/share/keyrings/sublimetext-keyring.gpg&lt;br /&gt;
 echo &amp;quot;deb [arch=amd64 signed-by=/usr/share/keyrings/sublimetext-keyring.gpg] https://download.sublimetext.com/ apt/stable/&amp;quot; | sudo tee /etc/apt/sources.list.d/sublime-text.list&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install sublime-text&lt;br /&gt;
&lt;br /&gt;
==== Ubuntu20 ====&lt;br /&gt;
 wget -qO - https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key add -&lt;br /&gt;
 echo &amp;quot;deb https://download.sublimetext.com/ apt/stable/&amp;quot; | sudo tee /etc/apt/sources.list.d/sublime-text.list&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install sublime-text&lt;br /&gt;
&lt;br /&gt;
=== Pycharm ===&lt;br /&gt;
An IDE created specifically for Python. Made by the JetBrains people. &lt;br /&gt;
&lt;br /&gt;
PyCharm is not available directly via apt. However, it can be installed with the {{ ic |snap}} manager:&lt;br /&gt;
* Community&lt;br /&gt;
 sudo apt install snapd&lt;br /&gt;
 sudo snap install pycharm-community --classic&lt;br /&gt;
* Professional&lt;br /&gt;
 sudo apt install snapd&lt;br /&gt;
 sudo snap install pycharm-professional --classic&lt;br /&gt;
&lt;br /&gt;
=== VsCode ===&lt;br /&gt;
A lightweight version of VisualStudio. Has support for many different languages.&lt;br /&gt;
&lt;br /&gt;
VsCode is not available directly via apt. However, it can be installed with the &amp;lt;code&amp;gt;snap&amp;lt;/code&amp;gt; manager:&lt;br /&gt;
 sudo apt install snapd&lt;br /&gt;
 sudo snap install code --classic&lt;br /&gt;
&lt;br /&gt;
=== R Studio ===&lt;br /&gt;
An interface for programming with the [[R | R language]].&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install r-base&lt;br /&gt;
&lt;br /&gt;
Then follow the steps at https://rstudio.com/products/rstudio/download-server/debian-ubuntu/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Server Packages ==&lt;br /&gt;
&lt;br /&gt;
=== Apache ===&lt;br /&gt;
Apache is one of the two most common web solutions for serving HTTP/HTTPS requests on a server.&lt;br /&gt;
&lt;br /&gt;
Apache itself comes preinstalled on most modern Ubuntu installations, although most of the related packages do not.&lt;br /&gt;
&lt;br /&gt;
To install apache itself, run:&lt;br /&gt;
 sudo apt install apache2 apache2-dev&lt;br /&gt;
&lt;br /&gt;
To install dependencies for serving [[Programming/Django]] ([[Programming/Python]]) projects, run:&lt;br /&gt;
 sudo apt install libapache2-mod-wsgi-py3&lt;br /&gt;
&lt;br /&gt;
=== Nginx ===&lt;br /&gt;
Nginx is the other of the two most common web solutions for serving HTTP/HTTPS requests on a server.&lt;br /&gt;
&lt;br /&gt;
Note that with their default values, only one of Apache/Nginx can be enabled at a time. It is possible to get them running together, but it takes effort and manual configuration.&lt;br /&gt;
&lt;br /&gt;
Having said that, to get nginx to run, you&#039;ll (initially) need to disable Apache with:&lt;br /&gt;
 sudo systemctl stop apache2&lt;br /&gt;
 sudo systemctl disable apache2&lt;br /&gt;
&lt;br /&gt;
You can then install nginx with:&lt;br /&gt;
 sudo apt install nginx&lt;br /&gt;
&lt;br /&gt;
=== Redis ===&lt;br /&gt;
Redis is a &amp;quot;in-memory data struct store&amp;quot; that is sometimes used in web projects to help manage and cache data.&lt;br /&gt;
&lt;br /&gt;
Install with:&lt;br /&gt;
 sudo apt install redis-server&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Programming/PostgreSQL/Databases&amp;diff=816</id>
		<title>Programming/PostgreSQL/Databases</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Programming/PostgreSQL/Databases&amp;diff=816"/>
		<updated>2025-04-04T06:52:59Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Update section to allow database privileges&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ note | Unless otherwise specified, all commands from this page assume you&#039;re in the [[PostgreSQL#Basics | PostgreSQL shell]]. }}&lt;br /&gt;
&lt;br /&gt;
== General Commands ==&lt;br /&gt;
&lt;br /&gt;
=== Show All Databases ===&lt;br /&gt;
 \l&lt;br /&gt;
&lt;br /&gt;
=== Show Currently Selected Database ===&lt;br /&gt;
 SELECT current_database();&lt;br /&gt;
&lt;br /&gt;
=== Create a New Database ===&lt;br /&gt;
 CREATE DATABASE &amp;lt;database_name&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
=== Load a Database ===&lt;br /&gt;
 \c &amp;lt;database_name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Delete a Database ===&lt;br /&gt;
{{ warn | Note that this action cannot be undone. }}&lt;br /&gt;
 DROP DATABASE &amp;lt;database_name&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
=== Set Database Privileges ===&lt;br /&gt;
 GRANT ALL PRIVILEGES ON DATABASE &amp;lt;database_name&amp;gt; TO &amp;lt;user_name&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
On newer installations of Postgres, you may also need the following command for the user to properly create/modify tables:&lt;br /&gt;
 # First, load the desired database:&lt;br /&gt;
 \c &amp;lt;database_name&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 # Then run command:&lt;br /&gt;
 GRANT ALL ON SCHEMA public TO &amp;lt;user&amp;gt;;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Database Backups ==&lt;br /&gt;
=== Export Database to file ===&lt;br /&gt;
 pg_dump -Fc -U &amp;lt;user_name&amp;gt; -d &amp;lt;database_name&amp;gt; &amp;gt; &amp;lt;file_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional Flags:&lt;br /&gt;
* {{ ic |-h &amp;lt;host&amp;gt;}} - Allows specification of host, such as for connecting to a remote server.&lt;br /&gt;
* {{ ic |-p &amp;lt;port&amp;gt;}} - Allows specification of port, such as for non-standard installations that don&#039;t use the default port {{ ic |5432}}.&lt;br /&gt;
&lt;br /&gt;
=== Import Database from File ===&lt;br /&gt;
 pg_restore -U &amp;lt;user_name&amp;gt; -d &amp;lt;database_name&amp;gt; &amp;lt;file_location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional Flags:&lt;br /&gt;
* {{ ic |-h &amp;lt;host&amp;gt;}} - Allows specification of host, such as for connecting to a remote server.&lt;br /&gt;
* {{ ic |-p &amp;lt;port&amp;gt;}} - Allows specification of port, such as for non-standard installations that don&#039;t use the default port {{ ic |5432}}.&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=SSH&amp;diff=815</id>
		<title>SSH</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=SSH&amp;diff=815"/>
		<updated>2024-01-31T07:28:21Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Update to elaborate on the IdentitiesOnly value in the ssh config&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SSH stands for &amp;quot;Secure Shell&amp;quot;. It&#039;s used to securely connect to remote machines.&lt;br /&gt;
&lt;br /&gt;
Most common uses are to securely access repositories in sites like Github, GitLab, or Bitbucket. Or to gain access to a remote machine&#039;s terminal (such as if you&#039;re the admin of said machine).&lt;br /&gt;
&lt;br /&gt;
SSH authentication can be done through either a standard &amp;quot;username + password&amp;quot; combination, or through SSH Keys. Note that SSH Keys are generally considered more secure, as it&#039;s a physical code that the user needs access to.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SSH Keys ==&lt;br /&gt;
&lt;br /&gt;
=== What are SSH Keys ===&lt;br /&gt;
At their core, SSH keys are based of &amp;quot;difficult to solve&amp;quot; mathematical problems. Generally speaking, these problems have &amp;quot;two part&amp;quot; solutions, where the &#039;&#039;&#039;PublicKey&#039;&#039;&#039; and &#039;&#039;&#039;PrivateKey&#039;&#039;&#039; each represent a part of said solution.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;PublicKey&#039;&#039;&#039; is intended to be shared publicly, such as stored on GitHub for future authentication attempts. The &#039;&#039;&#039;PrivateKey&#039;&#039;&#039; is meant to be stored locally on your machine, and should always be kept secret.&lt;br /&gt;
&lt;br /&gt;
Essentially, when you try to authenticate, these two keys can be used together create a valid solution to the mathematical problem, with minimal computational cost. Meanwhile, because the difficulty of the problem they represent, finding the solution is actually very computationally costly without both keys. Usually, this comes down to simply guessing an unfathomably large number of possible pairs for the &amp;quot;correct&amp;quot; solution.&lt;br /&gt;
&lt;br /&gt;
=== Types of SSH Keys ===&lt;br /&gt;
{{ Note | Note that there will never be a universally &amp;quot;best&amp;quot; key type, per say, as new key types are being discovered with time. Furthermore, computers are always improving, so keys that &amp;quot;are very secure&amp;quot; right now may not be so in 10 years. }}&lt;br /&gt;
&lt;br /&gt;
There are multiple SSH Key types, where each key type represents a different mathematical problem.&lt;br /&gt;
&lt;br /&gt;
As of writing this (in year 2020), there appear to be four main types of SSH keys:&lt;br /&gt;
* &#039;&#039;&#039;RSA&#039;&#039;&#039; - Based off the &amp;quot;difficulty of factoring very large numbers&amp;quot;.&lt;br /&gt;
** Recommend a minimum strength of 2048 bits. 4096 is preferred for systems that support it.&lt;br /&gt;
** One of the oldest key types, so virtually all devices support it at this point.&lt;br /&gt;
* &#039;&#039;&#039;DSA&#039;&#039;&#039; - Based off the &amp;quot;Discrete Logarithm&amp;quot; problem.&lt;br /&gt;
** Considered essentially equal to RSA as far as security.&lt;br /&gt;
** Faster than RSA in some respects, while slower in others.&lt;br /&gt;
* &#039;&#039;&#039;ECDSA&#039;&#039;&#039; - A specific version of the DSA problem, called the &amp;quot;Elliptic Curve Discrete Logarithm&amp;quot; problem.&lt;br /&gt;
** Keys for this can be much smaller than RSA, while still providing as much security as RSA does.&lt;br /&gt;
* &#039;&#039;&#039;ED25519&#039;&#039;&#039; - Yet another improvement of ECDSA, using the &amp;quot;Twisted Edwards Curve&amp;quot;.&lt;br /&gt;
** Once again, can use smaller key sizes while being as secure as RSA.&lt;br /&gt;
** Has the added benefit of being very fast to verify if you have both keys.&lt;br /&gt;
** Generally newer than other key types, so not all devices/systems support it yet (even if most do by this point).&lt;br /&gt;
&lt;br /&gt;
Generally speaking as of writing this, it seems ED25519 is the preferred type, with RSA as a fallback for systems that don&#039;t yet support ED25519.&lt;br /&gt;
&lt;br /&gt;
=== Generating SSH Keys ===&lt;br /&gt;
As stated above, it&#039;s currently best to try an &#039;&#039;&#039;ED25519&#039;&#039;&#039; key first. If it&#039;s not supported by your system yet, then fallback to &#039;&#039;&#039;RSA&#039;&#039;&#039; of at least 2048 bits.&lt;br /&gt;
&lt;br /&gt;
Creating an ED25519 Key:&lt;br /&gt;
 ssh-keygen -t ed25519 -C &amp;quot;&amp;lt;your_email&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Creating a RSA Key:&lt;br /&gt;
 ssh-keygen -o -t rsa -b &amp;lt;bit_length&amp;gt; -C &amp;quot;&amp;lt;your_email&amp;gt;&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;bit_length&amp;gt;&#039;&#039;&#039; - Specifies a key bit length of either 2048, 3072, or 4096. Generally higher is better.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Either of the above commands will start the process to create a new key pair.&lt;br /&gt;
* Hit enter to use the default path. Alternatively, retype the path and change the {{ ic |id_rsa}} to a filename of your choice.&lt;br /&gt;
** If you change the filename, make it something useful and descriptive.&lt;br /&gt;
** For example, if making a RSA key for GitHub, it might be good to change the name to something like {{ ic |github_rsa}}.&lt;br /&gt;
** This allows you to have multiple keys, where each key corresponds to a different service or use case.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Connecting Via SSH ==&lt;br /&gt;
Connecting via SSH can be as simple as a single command, at least if authenticating via username + password:&lt;br /&gt;
&lt;br /&gt;
 ssh &amp;lt;username&amp;gt;@&amp;lt;server_name_or_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If connecting via an SSH Key, then you probably want to [[SSH#SSH Config Files | Use a Config file]].&lt;br /&gt;
&lt;br /&gt;
Once the config file is set up, then you can connect with:&lt;br /&gt;
 ssh &amp;lt;config_Host_value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SSH Config Files ==&lt;br /&gt;
It&#039;s possible to create config files for SSH connections. This is particularly recommended when regularly connecting to different servers/repositories on a single machine.&lt;br /&gt;
&lt;br /&gt;
Config file should be located at {{ ic |~/.ssh/config}}.&lt;br /&gt;
&lt;br /&gt;
Syntax is (generally) as follows:&lt;br /&gt;
 Host &amp;lt;corresponding_value&amp;gt;&lt;br /&gt;
     HostName &amp;lt;corresponding_value&amp;gt;&lt;br /&gt;
     &amp;lt;ssh_option&amp;gt; &amp;lt;corresponding_value&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Comments can also be added with {{ ic |#}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Possible options are as follows:&lt;br /&gt;
* &#039;&#039;&#039;Host&#039;&#039;&#039; - Required. Can be any arbitrary value. This is what is typed locally to call this specific SSH configuration.&lt;br /&gt;
** Generally, this is either the same as &#039;&#039;&#039;HostName&#039;&#039;&#039; or an abbreviation of such. But in reality, you can think of it as an alias.&lt;br /&gt;
* &#039;&#039;&#039;HostName&#039;&#039;&#039; - Required. This is the actual address to connect to.&lt;br /&gt;
** Ex: An IP address if connecting to a production server. Or &amp;quot;github.com&amp;quot; if connecting to GitHub. Etc.&lt;br /&gt;
* &#039;&#039;&#039;Port&#039;&#039;&#039; - Required if port is not 22. Self explanatory.&lt;br /&gt;
* &#039;&#039;&#039;User&#039;&#039;&#039; - The username to try to authenticate with, on the server itself.&lt;br /&gt;
** If not provided, then attempts to use the name of the local user invoking the ssh call.&lt;br /&gt;
* &#039;&#039;&#039;PreferredAuthentications&#039;&#039;&#039; - Specifies the order which the client should attempt to authenticate with. Most common options are &#039;&#039;&#039;publickey&#039;&#039;&#039; or &#039;&#039;&#039;password&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;IdentitiesOnly&#039;&#039;&#039; - Indicates if attempts to connect to the Hostname should ONLY use keys indicated in the config file. See below section for further details.&lt;br /&gt;
* &#039;&#039;&#039;IdentityFile&#039;&#039;&#039; - If applicable, the file to attempt to authenticate through.&lt;br /&gt;
** Ex: In the below examples, we use a {{ ic |github_rsa}} key and a {{ ic |bitbucket_ed2}} key, respectively.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Config File Example ===&lt;br /&gt;
Shows a good example of how a full config may generally look.&lt;br /&gt;
&lt;br /&gt;
 # GitHub repo connection.&lt;br /&gt;
 Host github&lt;br /&gt;
     User git&lt;br /&gt;
     Hostname github.com&lt;br /&gt;
     Port 22&lt;br /&gt;
     PreferredAuthentications publickey&lt;br /&gt;
     IdentitiesOnly yes&lt;br /&gt;
     IdentityFile /home/my_user/.ssh/github_rsa&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 # BitBucket repo connection.&lt;br /&gt;
 Host bitbucket&lt;br /&gt;
     User my_user&lt;br /&gt;
     Hostname bitbucket.org&lt;br /&gt;
     Port 22&lt;br /&gt;
     PreferredAuthentications publickey&lt;br /&gt;
     IdentitiesOnly yes&lt;br /&gt;
     IdentityFile /home/my_user/.ssh/bitbucket_ed2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== On Using IdentitiesOnly ===&lt;br /&gt;
From manual testing, this arg doesn&#039;t seem to harm anything as long as you define all your connections in the config file. With this in mind, then it seems to be best to always set `IdentitiesOnly yes` for every entry in the config. Then just make sure to always add new entries into your config, every time there&#039;s a new ssh authentication you need (frankly, you should be always adding to the config anyways, it&#039;s just easier in the long run).&lt;br /&gt;
&lt;br /&gt;
Think of the following edge-case scenarios:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Scenario 1 - You want to connect to some site with ssh, but using a password and not a generated ssh key ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is fine, set everything as needed similar to the above examples. The only difference being that you won&#039;t need the `IdentityFile` line (you want to provide a password, not provide a key), and that you want to set {{ ic |PreferredAuthentications password}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Scenario 2 - You want to connect to a site to access repos on two or more different accounts (such as github) ====&lt;br /&gt;
Because you&#039;re connecting to repos, and not as a full ssh authentication login, you can&#039;t specify the user account in the config (it uses `git` as a base value for username)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Short Answer&#039;&#039;&#039;: {{ ic |IdentitiesOnly yes}} accounts for this.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Long Answer&#039;&#039;&#039;: Every time you try to authenticate, your ssh might actually send multiple different auth attempts, when multiple sets of credentials match the Hostname. (To Verify, you can try to connect with extra-verbose ({ic |-vvv}} flag) prior to adding the `IdentitiesOnly` line). In essence, ssh does not magically know how it&#039;s meant to connect unless you tell it. So it might try to incorrectly guess and lead to behavior that &amp;quot;seems dumb&amp;quot; to you as the end user. Such as trying to prompt for a password when the proper entry is clearly in the config.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
By setting the {{ ic |IdentitiesOnly yes}} line, you&#039;re telling ssh &amp;quot;this connection to the HostName is definitely defined in here, even if the first one or two you try end up wrong.&amp;quot; So it will only try values explicitly in the config file, and give up if has exhausted all applicable config entries.&lt;br /&gt;
&lt;br /&gt;
{{ note | If you have many different accounts to a single host (three accounts, four, or even more), then it&#039;s possible this method won&#039;t be enough either. Even when forced to only try specific config entries, it still might run out of authentication attempts and error before getting to the &amp;quot;correct one&amp;quot;. See https://superuser.com/a/272613 for more information in that case. But if you only have two or maybe three accounts to a single hostname, then most likely it will work just by setting the {{ ic |IdentitiesOnly yes}} line.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Scenario 3 - You have many entries (15+) in your config file ====&lt;br /&gt;
&lt;br /&gt;
I&#039;m not sure of the exact point this starts happening, but there are some instances when ssh config credentials start being problematic, once you have too many entries in your config.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now this might have been fixed, it was last observed in 2021 or so. But at least at the time, after a certain threshold of config entries, you might start getting prompts to enter a password, despite having a proper config entry defined and wanting to connect password-less. Or alternatively, you might get an authentication error, despite having a properly defined config entry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Basically, the reason for this is kind of similar to above {{ ic |Scenario 2}}, only this case seems to be more of a bug, where the number of config entries makes behavior stupid, and it starts trying entries where the HostName doesn&#039;t actually make sense.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In either case, setting the {{ ic |IdentitiesOnly yes}} line seems to fix this, as it forces ssh to only check values explicitly defined in the config.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Passing Your PubKey to the Remote Service ==&lt;br /&gt;
Essentially, this allows secure connections via your credentials, without having to enter your password anymore. It&#039;s generally considered more secure, and thus recommended.&lt;br /&gt;
&lt;br /&gt;
=== Setting Up Keys for Remote Repositories ===&lt;br /&gt;
This allows connect to things like GitHub and Gitlab, and to pull and push repositories of code easier.&lt;br /&gt;
&lt;br /&gt;
The process is generally fairly straightforward:&lt;br /&gt;
* First, log into the associated website, and find the page to upload SSH Keys for your user account.&lt;br /&gt;
* After [[SSH#Generating SSH Keys | Generating a SSH Key]], find the newly created PublicKey location.&lt;br /&gt;
** On Linux, the default location will be something like {{ ic |~/.ssh/&amp;lt;key_name&amp;gt;.pub}}.&lt;br /&gt;
* Copy the full contents of the PublicKey file, and paste it into the box on the website.&lt;br /&gt;
* Give a meaningful title if provided an option to. Ex: {{ ic |Home_Desktop_GitHub}}.&lt;br /&gt;
* Save and [[SSH#Testing SSH Keys | Test Your SSH Key]].&lt;br /&gt;
&lt;br /&gt;
==== Testing SSH Keys ====&lt;br /&gt;
For remote repositories, they usually have a built in method to test your key once uploaded.&lt;br /&gt;
&lt;br /&gt;
Usually, this is done via terminal, via something like {{ ic |ssh -T git@&amp;lt;website&amp;gt;}}.&lt;br /&gt;
* Ex: To test a key on GitHub, you would use {{ ic |ssh -T git@github.com}}.&lt;br /&gt;
* To troubleshoot, you can add the &#039;&#039;&#039;-v&#039;&#039;&#039;, &#039;&#039;&#039;-vv&#039;&#039;&#039;, or &#039;&#039;&#039;-vvv&#039;&#039;&#039; flags, where each one provides a little bit more information.&lt;br /&gt;
&lt;br /&gt;
=== Setting up Password-less Server Credentials ===&lt;br /&gt;
This allows you to remote into a server (via Terminal) without entering your password every time. &lt;br /&gt;
&lt;br /&gt;
First, you&#039;ll need to be able to make SSH connections using passwords. If not already enabled on the server, then enable it with the following:&lt;br /&gt;
* Note that this requires enabling at least one user that can log in with a standard password. AWS EC2, for example, does not create such a user by default.&lt;br /&gt;
* Edit the file {{ ic |/etc/ssh/sshd_config}}.&lt;br /&gt;
* Update the line {{ ic |PasswordAuthentication}} to &#039;&#039;&#039;yes&#039;&#039;&#039;.&lt;br /&gt;
* Restart the service with {{ ic |sudo service ssh restart}}.&lt;br /&gt;
&lt;br /&gt;
Next, pass your public key to the server with the command:&lt;br /&gt;
 ssh-copy-id -i &amp;lt;public_key_to_pass&amp;gt; &amp;lt;server_address&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test that it works by connecting to the server with ssh. It should connect without asking for a password.&lt;br /&gt;
&lt;br /&gt;
Finally, disable ssh connections with passwords to make the server more secure:&lt;br /&gt;
* Edit the file {{ ic |/etc/ssh/sshd_config}}.&lt;br /&gt;
* Update the line {{ ic |PasswordAuthentication}} to &#039;&#039;&#039;no&#039;&#039;&#039;.&lt;br /&gt;
* Restart the service with {{ ic |sudo service ssh restart}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SSH not Prompting for Password ==&lt;br /&gt;
https://askubuntu.com/a/419562&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Docker&amp;diff=814</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Docker&amp;diff=814"/>
		<updated>2023-07-19T22:42:16Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Add command&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{ todo | Page is very incomplete. Notes of learning docker/kubernetes here. }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
[https://www.docker.com/ Docker] creates and runs &#039;&#039;&#039;containers&#039;&#039;&#039;, which are sand-boxed processes, isolated from all other processes, with their own allocated cpu/memory/etc.&lt;br /&gt;
&lt;br /&gt;
Each docker container is &amp;quot;meant to do exactly one thing, and do it well&amp;quot;. So it&#039;s common to have a docker stack comprised of multiple containers. For example, one container to run your main application, and another for your database.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Docker Sub Parts ===&lt;br /&gt;
&lt;br /&gt;
Core Parts:&lt;br /&gt;
* &#039;&#039;&#039;Image&#039;&#039;&#039; - A definition of docker logic, which can be spun up and run as a &#039;&#039;&#039;container&#039;&#039;&#039;.&lt;br /&gt;
** Due to how docker works, any number of containers can be build from this image, and it will run on any OS that supports docker.&lt;br /&gt;
* &#039;&#039;&#039;Container&#039;&#039;&#039; - A unique, running instance of a docker &#039;&#039;&#039;image&#039;&#039;&#039;.&lt;br /&gt;
** Multiple containers can be created from a single image.&lt;br /&gt;
* &#039;&#039;&#039;Volume&#039;&#039;&#039; - An location for docker to persist data to long-term.&lt;br /&gt;
** Allows data to last even as a container is started, stopped, and restarted.&lt;br /&gt;
** Also allows multiple containers to share a set of data, so long as the data is put into the volume.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Setup:&lt;br /&gt;
* &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039; - A file that defines the docker service to run.&lt;br /&gt;
* &#039;&#039;&#039;Dockerfile&#039;&#039;&#039; - A file that defines the actual commands the docker instance should execute once it is created, in order to setup the intended container service.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{ todo |Are the below two commands useful? Needed?}}&lt;br /&gt;
These two files should be put into the same directory. Then {{ ic |cd}} into the directory and build it with {{ ic |docker-compose run}}.&lt;br /&gt;
&lt;br /&gt;
Finally, start the service with {{ ic |docker-compose up -build -d}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Docker Commands ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Commands to Launch Containers ====&lt;br /&gt;
&lt;br /&gt;
Launch a built image as a new container instance:&lt;br /&gt;
 docker run -d &amp;lt;image_name&amp;gt;&lt;br /&gt;
Where {{ ic |image_name}} - Corresponds to the name of the image you wish to create a container of.&lt;br /&gt;
* See below sections for additional useful optional args.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker run -d my-cool-image&lt;br /&gt;
&lt;br /&gt;
{{ warn |With the above command, data will NEVER persist long term. If the container is ever restarted or rebuilt, all data in the container will be lost. See Mounting Subsection for solutions.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Port Mapping Subsection =====&lt;br /&gt;
&lt;br /&gt;
To expose ports of a container instance to the host, we use port mapping.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Command follows the format of:&lt;br /&gt;
 -p &amp;lt;host&amp;gt;:&amp;lt;host_port&amp;gt;:&amp;lt;container_port&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* {{ ic |host}} - Corresponds to the host address to connect to. Often {{ ic |127.0.0.1}}.&lt;br /&gt;
* {{ ic |host_port}} - Corresponds to the port to use on the host machine for mapping.&lt;br /&gt;
* {{ ic |container_port}} - Corresponds to the port to connect to on the container.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker run -d -p 127.0.0.1:3000:3000 my-cool-image&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Command Mount Subsection =====&lt;br /&gt;
&lt;br /&gt;
To persist data long term, we need to add some form of &#039;&#039;&#039;mount&#039;&#039;&#039; subcommand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Volume Mount:&lt;br /&gt;
* &#039;&#039;&#039;Volume Mount&#039;&#039;&#039; - Allows persisting data for docker instances.&lt;br /&gt;
** Follows the format {{ ic |&amp;lt;nowiki&amp;gt;--mount type=volume,src=&amp;lt;volume_name&amp;gt;,target=&amp;lt;filepath_in_container&amp;gt;&amp;lt;/nowiki&amp;gt;}}.&lt;br /&gt;
*** Where:&lt;br /&gt;
**** {{ ic |volume_name}} - Corresponds to the name of the already-created docker &#039;&#039;&#039;volume&#039;&#039;&#039; to mount.&lt;br /&gt;
**** {{ ic |filepath_in_container}} - Corresponds to the filepath the volume should mount to, within the container. Ex: {{ ic |/etc/my_volume}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker run -d --mount type=volume,src=my-volume,target=/etc/my_volume my-cool-image&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bind Mount:&lt;br /&gt;
* &#039;&#039;&#039;Bind Mount&#039;&#039;&#039; - Allows sharing data between host machine and container, via linking filepaths (similar to a [[Linux/Hard Drive Management#Sym_Links | symlink]]).&lt;br /&gt;
** Follows the format {{ ic |&amp;lt;nowiki&amp;gt;--mount type=bind,src=&amp;lt;filepath_on_host&amp;gt;,target=&amp;lt;filepath_in_container&amp;gt;&amp;lt;/nowiki&amp;gt;}}.&lt;br /&gt;
*** Where:&lt;br /&gt;
**** {{ ic |filepath_on_host}} - Corresponds to a folder located on HOST machine, to share with container.&lt;br /&gt;
**** {{ ic |filepath_in_container}} - Corresponds to the filepath the volume should mount to, within the container. Ex: {{ ic |/etc/my_volume}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker run -d --mount type=bind,src=/srv/my_project/share_folder,target=/etc/my_volume my-cool-image&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Command Network Subsection =====&lt;br /&gt;
&lt;br /&gt;
Docker &#039;&#039;&#039;networks&#039;&#039;&#039; are used to allow containers to connect and communicate among each other.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Attach Network:&lt;br /&gt;
 --network &amp;lt;network_name&amp;gt;&lt;br /&gt;
Where {{ ic |network_name}} - Is the docker virtual network to connect in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker run -d --network my_network my-cool-image&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== General Commands ====&lt;br /&gt;
&lt;br /&gt;
List all live docker containers:&lt;br /&gt;
 docker ps&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
List all (including stopped) docker containers:&lt;br /&gt;
 docker ps --al&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Access a given running container:&lt;br /&gt;
 docker exec &amp;lt;container_id&amp;gt;&lt;br /&gt;
Where {{ ic |container_id}} is the id of the container you wish to access.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Build docker image from the {{ ic |Dockerfile}} in current directory:&lt;br /&gt;
 docker build -t &amp;lt;image_name&amp;gt;&lt;br /&gt;
Where {{ ic |image_name}} is the name you wish to give the image.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stop running docker container:&lt;br /&gt;
 docker stop &amp;lt;container_id&amp;gt;&lt;br /&gt;
Where {{ ic |container_id}} is the id of the container you wish to stop.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Remove existing docker container:&lt;br /&gt;
 docker rm &amp;lt;container_id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OR combine the above two commands with:&lt;br /&gt;
 docker rm -f &amp;lt;container_id&amp;gt;&lt;br /&gt;
Where {{ ic |container_id}} is the id of the container you wish to stop.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Create a new volume to allow persisting data long-term:&lt;br /&gt;
 docker volume create &amp;lt;volume_name&amp;gt;&lt;br /&gt;
Where {{ ic |volume_name}} is the name the volume should use.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examine logs of running docker instance:&lt;br /&gt;
 sudo docker logs -f &amp;lt;container_name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kubernetes ==&lt;br /&gt;
&lt;br /&gt;
[https://kubernetes.io/ Kubernetes] is a an architecture that runs and manages docker-like containers for applications.&lt;br /&gt;
&lt;br /&gt;
{{ note | This is a simplified overview of useful commands for using Kubernetes. For full official docs, see https://kubernetes.io/docs/concepts/overview/}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kubernetes Sub Parts ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Control Plane&#039;&#039;&#039; - Where decisions are made.&lt;br /&gt;
** Generally has 3 of these running, to ensure availability.&lt;br /&gt;
* &#039;&#039;&#039;Worker Node&#039;&#039;&#039; - A location where something might be running.&lt;br /&gt;
** Can have any number of these, as needed.&lt;br /&gt;
** Parts:&lt;br /&gt;
*** &#039;&#039;&#039;Kubletes&#039;&#039;&#039; - Manages one or more PODS, each POD being a group of docker-style containers.&lt;br /&gt;
*** &#039;&#039;&#039;Kube Proxy&#039;&#039;&#039; - Ensures communication is fluid between all parts.&lt;br /&gt;
*** &#039;&#039;&#039;Controller&#039;&#039;&#039; - Helps control all other aspects, to ensure it does what it&#039;s meant to.&lt;br /&gt;
* &#039;&#039;&#039;External Resources&#039;&#039;&#039; - Various outside resources that the &#039;&#039;&#039;Control Plane&#039;&#039;&#039; and &#039;&#039;&#039;Worker Nodes&#039;&#039;&#039; do work with.&lt;br /&gt;
** Ex: Storage, load balancers, etc.&lt;br /&gt;
* &#039;&#039;&#039;API&#039;&#039;&#039; - An interface for humans to interact with the &#039;&#039;&#039;Control Planes&#039;&#039;&#039;.&lt;br /&gt;
** Most interactions with the &#039;&#039;&#039;API&#039;&#039;&#039; involve telling Kubernetes &amp;quot;this is the state I want everything to be in&amp;quot;. Kubernetes then figures out how to make that happen.&lt;br /&gt;
** Parts:&lt;br /&gt;
*** &#039;&#039;&#039;Scheduler&#039;&#039;&#039; - Determines what should happen, when, and where.&lt;br /&gt;
*** &#039;&#039;&#039;Controller Manager&#039;&#039;&#039; - Manages the controllers.&lt;br /&gt;
*** &#039;&#039;&#039;Key-Value Store&#039;&#039;&#039; - Effectively a &amp;quot;database of possible states&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Kubernetes Commands ===&lt;br /&gt;
&lt;br /&gt;
{{ todo | Figure out common/useful commands and add here. }}&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Docker&amp;diff=813</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Docker&amp;diff=813"/>
		<updated>2023-07-19T22:33:40Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Add command&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{ todo | Page is very incomplete. Notes of learning docker/kubernetes here. }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
[https://www.docker.com/ Docker] creates and runs &#039;&#039;&#039;containers&#039;&#039;&#039;, which are sand-boxed processes, isolated from all other processes, with their own allocated cpu/memory/etc.&lt;br /&gt;
&lt;br /&gt;
Each docker container is &amp;quot;meant to do exactly one thing, and do it well&amp;quot;. So it&#039;s common to have a docker stack comprised of multiple containers. For example, one container to run your main application, and another for your database.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Docker Sub Parts ===&lt;br /&gt;
&lt;br /&gt;
Core Parts:&lt;br /&gt;
* &#039;&#039;&#039;Image&#039;&#039;&#039; - A definition of docker logic, which can be spun up and run as a &#039;&#039;&#039;container&#039;&#039;&#039;.&lt;br /&gt;
** Due to how docker works, any number of containers can be build from this image, and it will run on any OS that supports docker.&lt;br /&gt;
* &#039;&#039;&#039;Container&#039;&#039;&#039; - A unique, running instance of a docker &#039;&#039;&#039;image&#039;&#039;&#039;.&lt;br /&gt;
** Multiple containers can be created from a single image.&lt;br /&gt;
* &#039;&#039;&#039;Volume&#039;&#039;&#039; - An location for docker to persist data to long-term.&lt;br /&gt;
** Allows data to last even as a container is started, stopped, and restarted.&lt;br /&gt;
** Also allows multiple containers to share a set of data, so long as the data is put into the volume.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Setup:&lt;br /&gt;
* &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039; - A file that defines the docker service to run.&lt;br /&gt;
* &#039;&#039;&#039;Dockerfile&#039;&#039;&#039; - A file that defines the actual commands the docker instance should execute once it is created, in order to setup the intended container service.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{ todo |Are the below two commands useful? Needed?}}&lt;br /&gt;
These two files should be put into the same directory. Then {{ ic |cd}} into the directory and build it with {{ ic |docker-compose run}}.&lt;br /&gt;
&lt;br /&gt;
Finally, start the service with {{ ic |docker-compose up -build -d}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Docker Commands ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Commands to Launch Containers ====&lt;br /&gt;
&lt;br /&gt;
Launch a built image as a new container instance:&lt;br /&gt;
 docker run -d &amp;lt;image_name&amp;gt;&lt;br /&gt;
Where {{ ic |image_name}} - Corresponds to the name of the image you wish to create a container of.&lt;br /&gt;
* See below sections for additional useful optional args.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker run -d my-cool-image&lt;br /&gt;
&lt;br /&gt;
{{ warn |With the above command, data will NEVER persist long term. If the container is ever restarted or rebuilt, all data in the container will be lost. See Mounting Subsection for solutions.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Port Mapping Subsection =====&lt;br /&gt;
&lt;br /&gt;
To expose ports of a container instance to the host, we use port mapping.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Command follows the format of:&lt;br /&gt;
 -p &amp;lt;host&amp;gt;:&amp;lt;host_port&amp;gt;:&amp;lt;container_port&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* {{ ic |host}} - Corresponds to the host address to connect to. Often {{ ic |127.0.0.1}}.&lt;br /&gt;
* {{ ic |host_port}} - Corresponds to the port to use on the host machine for mapping.&lt;br /&gt;
* {{ ic |container_port}} - Corresponds to the port to connect to on the container.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker run -d -p 127.0.0.1:3000:3000 my-cool-image&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Command Mount Subsection =====&lt;br /&gt;
&lt;br /&gt;
To persist data long term, we need to add some form of &#039;&#039;&#039;mount&#039;&#039;&#039; subcommand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Volume Mount:&lt;br /&gt;
* &#039;&#039;&#039;Volume Mount&#039;&#039;&#039; - Allows persisting data for docker instances.&lt;br /&gt;
** Follows the format {{ ic |&amp;lt;nowiki&amp;gt;--mount type=volume,src=&amp;lt;volume_name&amp;gt;,target=&amp;lt;filepath_in_container&amp;gt;&amp;lt;/nowiki&amp;gt;}}.&lt;br /&gt;
*** Where:&lt;br /&gt;
**** {{ ic |volume_name}} - Corresponds to the name of the already-created docker &#039;&#039;&#039;volume&#039;&#039;&#039; to mount.&lt;br /&gt;
**** {{ ic |filepath_in_container}} - Corresponds to the filepath the volume should mount to, within the container. Ex: {{ ic |/etc/my_volume}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker run -d --mount type=volume,src=my-volume,target=/etc/my_volume my-cool-image&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bind Mount:&lt;br /&gt;
* &#039;&#039;&#039;Bind Mount&#039;&#039;&#039; - Allows sharing data between host machine and container, via linking filepaths (similar to a [[Linux/Hard Drive Management#Sym_Links | symlink]]).&lt;br /&gt;
** Follows the format {{ ic |&amp;lt;nowiki&amp;gt;--mount type=bind,src=&amp;lt;filepath_on_host&amp;gt;,target=&amp;lt;filepath_in_container&amp;gt;&amp;lt;/nowiki&amp;gt;}}.&lt;br /&gt;
*** Where:&lt;br /&gt;
**** {{ ic |filepath_on_host}} - Corresponds to a folder located on HOST machine, to share with container.&lt;br /&gt;
**** {{ ic |filepath_in_container}} - Corresponds to the filepath the volume should mount to, within the container. Ex: {{ ic |/etc/my_volume}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker run -d --mount type=bind,src=/srv/my_project/share_folder,target=/etc/my_volume my-cool-image&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Command Network Subsection =====&lt;br /&gt;
&lt;br /&gt;
Docker &#039;&#039;&#039;networks&#039;&#039;&#039; are used to allow containers to connect and communicate among each other.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Attach Network:&lt;br /&gt;
 --network &amp;lt;network_name&amp;gt;&lt;br /&gt;
Where {{ ic |network_name}} - Is the docker virtual network to connect in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker run -d --network my_network my-cool-image&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== General Commands ====&lt;br /&gt;
&lt;br /&gt;
List all live docker containers:&lt;br /&gt;
 docker ps&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
List all (including stopped) docker containers:&lt;br /&gt;
 docker ps --al&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Access a given running container:&lt;br /&gt;
 docker exec &amp;lt;container_id&amp;gt;&lt;br /&gt;
Where {{ ic |container_id}} is the id of the container you wish to access.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Build docker image from the {{ ic |Dockerfile}} in current directory:&lt;br /&gt;
 docker build -t &amp;lt;image_name&amp;gt;&lt;br /&gt;
Where {{ ic |image_name}} is the name you wish to give the image.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stop running docker container:&lt;br /&gt;
 docker stop &amp;lt;container_id&amp;gt;&lt;br /&gt;
Where {{ ic |container_id}} is the id of the container you wish to stop.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Remove existing docker container:&lt;br /&gt;
 docker rm &amp;lt;container_id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OR combine the above two commands with:&lt;br /&gt;
 docker rm -f &amp;lt;container_id&amp;gt;&lt;br /&gt;
Where {{ ic |container_id}} is the id of the container you wish to stop.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Create a new volume to allow persisting data long-term:&lt;br /&gt;
 docker volume create &amp;lt;volume_name&amp;gt;&lt;br /&gt;
Where {{ ic |volume_name}} is the name the volume should use.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kubernetes ==&lt;br /&gt;
&lt;br /&gt;
[https://kubernetes.io/ Kubernetes] is a an architecture that runs and manages docker-like containers for applications.&lt;br /&gt;
&lt;br /&gt;
{{ note | This is a simplified overview of useful commands for using Kubernetes. For full official docs, see https://kubernetes.io/docs/concepts/overview/}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kubernetes Sub Parts ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Control Plane&#039;&#039;&#039; - Where decisions are made.&lt;br /&gt;
** Generally has 3 of these running, to ensure availability.&lt;br /&gt;
* &#039;&#039;&#039;Worker Node&#039;&#039;&#039; - A location where something might be running.&lt;br /&gt;
** Can have any number of these, as needed.&lt;br /&gt;
** Parts:&lt;br /&gt;
*** &#039;&#039;&#039;Kubletes&#039;&#039;&#039; - Manages one or more PODS, each POD being a group of docker-style containers.&lt;br /&gt;
*** &#039;&#039;&#039;Kube Proxy&#039;&#039;&#039; - Ensures communication is fluid between all parts.&lt;br /&gt;
*** &#039;&#039;&#039;Controller&#039;&#039;&#039; - Helps control all other aspects, to ensure it does what it&#039;s meant to.&lt;br /&gt;
* &#039;&#039;&#039;External Resources&#039;&#039;&#039; - Various outside resources that the &#039;&#039;&#039;Control Plane&#039;&#039;&#039; and &#039;&#039;&#039;Worker Nodes&#039;&#039;&#039; do work with.&lt;br /&gt;
** Ex: Storage, load balancers, etc.&lt;br /&gt;
* &#039;&#039;&#039;API&#039;&#039;&#039; - An interface for humans to interact with the &#039;&#039;&#039;Control Planes&#039;&#039;&#039;.&lt;br /&gt;
** Most interactions with the &#039;&#039;&#039;API&#039;&#039;&#039; involve telling Kubernetes &amp;quot;this is the state I want everything to be in&amp;quot;. Kubernetes then figures out how to make that happen.&lt;br /&gt;
** Parts:&lt;br /&gt;
*** &#039;&#039;&#039;Scheduler&#039;&#039;&#039; - Determines what should happen, when, and where.&lt;br /&gt;
*** &#039;&#039;&#039;Controller Manager&#039;&#039;&#039; - Manages the controllers.&lt;br /&gt;
*** &#039;&#039;&#039;Key-Value Store&#039;&#039;&#039; - Effectively a &amp;quot;database of possible states&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Kubernetes Commands ===&lt;br /&gt;
&lt;br /&gt;
{{ todo | Figure out common/useful commands and add here. }}&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Adobe/Photoshop&amp;diff=812</id>
		<title>Adobe/Photoshop</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Adobe/Photoshop&amp;diff=812"/>
		<updated>2023-07-18T19:43:32Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Correct link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://www.adobe.com/products/photoshop.html Photoshop] is an [https://www.adobe.com/ Adobe] product made for creation and manipulation of 2D images.&lt;br /&gt;
&lt;br /&gt;
Specifically, 2D pixel-based images. For 2D vector images, see [[Adobe/Illustrator | Illustrator]].&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Adobe/Illustrator&amp;diff=811</id>
		<title>Adobe/Illustrator</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Adobe/Illustrator&amp;diff=811"/>
		<updated>2023-07-18T19:43:13Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Correct link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://www.adobe.com/products/illustrator.html Illustrator] is an [https://www.adobe.com/ Adobe] product made for creation and manipulation of 2D images.&lt;br /&gt;
&lt;br /&gt;
Specifically, 2D vector-based images. For 2D pixel images, see [[Adobe/Photoshop | Photoshop]].&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Photoshop&amp;diff=810</id>
		<title>Photoshop</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Photoshop&amp;diff=810"/>
		<updated>2023-07-18T19:42:22Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Brodriguez moved page Photoshop to Adobe/Photoshop&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Adobe/Photoshop]]&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Adobe/Photoshop&amp;diff=809</id>
		<title>Adobe/Photoshop</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Adobe/Photoshop&amp;diff=809"/>
		<updated>2023-07-18T19:42:22Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Brodriguez moved page Photoshop to Adobe/Photoshop&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://www.adobe.com/products/photoshop.html Photoshop] is an [https://www.adobe.com/ Adobe] product made for creation and manipulation of 2D images.&lt;br /&gt;
&lt;br /&gt;
Specifically, 2D pixel-based images. For 2D vector images, see [[Adobe/Illustrator]].&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Illustrator&amp;diff=808</id>
		<title>Illustrator</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Illustrator&amp;diff=808"/>
		<updated>2023-07-18T19:42:10Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Brodriguez moved page Illustrator to Adobe/Illustrator&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Adobe/Illustrator]]&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Adobe/Illustrator&amp;diff=807</id>
		<title>Adobe/Illustrator</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Adobe/Illustrator&amp;diff=807"/>
		<updated>2023-07-18T19:42:10Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Brodriguez moved page Illustrator to Adobe/Illustrator&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://www.adobe.com/products/illustrator.html Illustrator] is an [https://www.adobe.com/ Adobe] product made for creation and manipulation of 2D images.&lt;br /&gt;
&lt;br /&gt;
Specifically, 2D vector-based images. For 2D pixel images, see [[Adobe/Photoshohp]].&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Other&amp;diff=806</id>
		<title>Other</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Other&amp;diff=806"/>
		<updated>2023-07-18T19:41:47Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Update links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Documentation for various non-programming related topics.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Art Programs ==&lt;br /&gt;
* [[Adobe]]&lt;br /&gt;
** [[Adobe/Illustrator]]&lt;br /&gt;
** [[Adobe/Photoshop]]&lt;br /&gt;
* [[Blender]]&lt;br /&gt;
* [[Maya]]&lt;br /&gt;
* [[zBrush]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Engines ==&lt;br /&gt;
* [[Unreal Engine]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Music ==&lt;br /&gt;
* [[Music Theory]]&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Adobe/Illustrator&amp;diff=805</id>
		<title>Adobe/Illustrator</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Adobe/Illustrator&amp;diff=805"/>
		<updated>2023-07-18T19:41:29Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Create page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://www.adobe.com/products/illustrator.html Illustrator] is an [https://www.adobe.com/ Adobe] product made for creation and manipulation of 2D images.&lt;br /&gt;
&lt;br /&gt;
Specifically, 2D vector-based images. For 2D pixel images, see [[Adobe/Photoshohp]].&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Adobe/Photoshop&amp;diff=804</id>
		<title>Adobe/Photoshop</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Adobe/Photoshop&amp;diff=804"/>
		<updated>2023-07-18T19:40:43Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Create page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://www.adobe.com/products/photoshop.html Photoshop] is an [https://www.adobe.com/ Adobe] product made for creation and manipulation of 2D images.&lt;br /&gt;
&lt;br /&gt;
Specifically, 2D pixel-based images. For 2D vector images, see [[Adobe/Illustrator]].&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Other&amp;diff=803</id>
		<title>Other</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Other&amp;diff=803"/>
		<updated>2023-07-18T14:11:17Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Add links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Documentation for various non-programming related topics.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Art Programs ==&lt;br /&gt;
* [[Blender]]&lt;br /&gt;
* [[Photoshop]]&lt;br /&gt;
* [[Maya]]&lt;br /&gt;
* [[zBrush]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Engines ==&lt;br /&gt;
* [[Unreal Engine]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Music ==&lt;br /&gt;
* [[Music Theory]]&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Docker&amp;diff=802</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Docker&amp;diff=802"/>
		<updated>2023-07-06T04:48:31Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Save commands&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{ todo | Page is very incomplete. Notes of learning docker/kubernetes here. }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
[https://www.docker.com/ Docker] creates and runs &#039;&#039;&#039;containers&#039;&#039;&#039;, which are sand-boxed processes, isolated from all other processes, with their own allocated cpu/memory/etc.&lt;br /&gt;
&lt;br /&gt;
Each docker container is &amp;quot;meant to do exactly one thing, and do it well&amp;quot;. So it&#039;s common to have a docker stack comprised of multiple containers. For example, one container to run your main application, and another for your database.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Docker Sub Parts ===&lt;br /&gt;
&lt;br /&gt;
Core Parts:&lt;br /&gt;
* &#039;&#039;&#039;Image&#039;&#039;&#039; - A definition of docker logic, which can be spun up and run as a &#039;&#039;&#039;container&#039;&#039;&#039;.&lt;br /&gt;
** Due to how docker works, any number of containers can be build from this image, and it will run on any OS that supports docker.&lt;br /&gt;
* &#039;&#039;&#039;Container&#039;&#039;&#039; - A unique, running instance of a docker &#039;&#039;&#039;image&#039;&#039;&#039;.&lt;br /&gt;
** Multiple containers can be created from a single image.&lt;br /&gt;
* &#039;&#039;&#039;Volume&#039;&#039;&#039; - An location for docker to persist data to long-term.&lt;br /&gt;
** Allows data to last even as a container is started, stopped, and restarted.&lt;br /&gt;
** Also allows multiple containers to share a set of data, so long as the data is put into the volume.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Setup:&lt;br /&gt;
* &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039; - A file that defines the docker service to run.&lt;br /&gt;
* &#039;&#039;&#039;Dockerfile&#039;&#039;&#039; - A file that defines the actual commands the docker instance should execute once it is created, in order to setup the intended container service.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{ todo |Are the below two commands useful? Needed?}}&lt;br /&gt;
These two files should be put into the same directory. Then {{ ic |cd}} into the directory and build it with {{ ic |docker-compose run}}.&lt;br /&gt;
&lt;br /&gt;
Finally, start the service with {{ ic |docker-compose up -build -d}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Docker Commands ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Commands to Launch Containers ====&lt;br /&gt;
&lt;br /&gt;
Launch a built image as a new container instance:&lt;br /&gt;
 docker run -d &amp;lt;image_name&amp;gt;&lt;br /&gt;
Where {{ ic |image_name}} - Corresponds to the name of the image you wish to create a container of.&lt;br /&gt;
* See below sections for additional useful optional args.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker run -d my-cool-image&lt;br /&gt;
&lt;br /&gt;
{{ warn |With the above command, data will NEVER persist long term. If the container is ever restarted or rebuilt, all data in the container will be lost. See Mounting Subsection for solutions.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Port Mapping Subsection =====&lt;br /&gt;
&lt;br /&gt;
To expose ports of a container instance to the host, we use port mapping.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Command follows the format of:&lt;br /&gt;
 -p &amp;lt;host&amp;gt;:&amp;lt;host_port&amp;gt;:&amp;lt;container_port&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* {{ ic |host}} - Corresponds to the host address to connect to. Often {{ ic |127.0.0.1}}.&lt;br /&gt;
* {{ ic |host_port}} - Corresponds to the port to use on the host machine for mapping.&lt;br /&gt;
* {{ ic |container_port}} - Corresponds to the port to connect to on the container.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker run -d -p 127.0.0.1:3000:3000 my-cool-image&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Command Mount Subsection =====&lt;br /&gt;
&lt;br /&gt;
To persist data long term, we need to add some form of &#039;&#039;&#039;mount&#039;&#039;&#039; subcommand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Volume Mount:&lt;br /&gt;
* &#039;&#039;&#039;Volume Mount&#039;&#039;&#039; - Allows persisting data for docker instances.&lt;br /&gt;
** Follows the format {{ ic |&amp;lt;nowiki&amp;gt;--mount type=volume,src=&amp;lt;volume_name&amp;gt;,target=&amp;lt;filepath_in_container&amp;gt;&amp;lt;/nowiki&amp;gt;}}.&lt;br /&gt;
*** Where:&lt;br /&gt;
**** {{ ic |volume_name}} - Corresponds to the name of the already-created docker &#039;&#039;&#039;volume&#039;&#039;&#039; to mount.&lt;br /&gt;
**** {{ ic |filepath_in_container}} - Corresponds to the filepath the volume should mount to, within the container. Ex: {{ ic |/etc/my_volume}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker run -d --mount type=volume,src=my-volume,target=/etc/my_volume my-cool-image&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bind Mount:&lt;br /&gt;
* &#039;&#039;&#039;Bind Mount&#039;&#039;&#039; - Allows sharing data between host machine and container, via linking filepaths (similar to a [[Linux/Hard Drive Management#Sym_Links | symlink]]).&lt;br /&gt;
** Follows the format {{ ic |&amp;lt;nowiki&amp;gt;--mount type=bind,src=&amp;lt;filepath_on_host&amp;gt;,target=&amp;lt;filepath_in_container&amp;gt;&amp;lt;/nowiki&amp;gt;}}.&lt;br /&gt;
*** Where:&lt;br /&gt;
**** {{ ic |filepath_on_host}} - Corresponds to a folder located on HOST machine, to share with container.&lt;br /&gt;
**** {{ ic |filepath_in_container}} - Corresponds to the filepath the volume should mount to, within the container. Ex: {{ ic |/etc/my_volume}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker run -d --mount type=bind,src=/srv/my_project/share_folder,target=/etc/my_volume my-cool-image&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Command Network Subsection =====&lt;br /&gt;
&lt;br /&gt;
Docker &#039;&#039;&#039;networks&#039;&#039;&#039; are used to allow containers to connect and communicate among each other.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Attach Network:&lt;br /&gt;
 --network &amp;lt;network_name&amp;gt;&lt;br /&gt;
Where {{ ic |network_name}} - Is the docker virtual network to connect in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker run -d --network my_network my-cool-image&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== General Commands ====&lt;br /&gt;
&lt;br /&gt;
List all docker containers:&lt;br /&gt;
 docker ps&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Access a given running container:&lt;br /&gt;
 docker exec &amp;lt;container_id&amp;gt;&lt;br /&gt;
Where {{ ic |container_id}} is the id of the container you wish to access.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Build docker image from the {{ ic |Dockerfile}} in current directory:&lt;br /&gt;
 docker build -t &amp;lt;image_name&amp;gt;&lt;br /&gt;
Where {{ ic |image_name}} is the name you wish to give the image.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stop running docker container:&lt;br /&gt;
 docker stop &amp;lt;container_id&amp;gt;&lt;br /&gt;
Where {{ ic |container_id}} is the id of the container you wish to stop.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Remove existing docker container:&lt;br /&gt;
 docker rm &amp;lt;container_id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OR combine the above two commands with:&lt;br /&gt;
 docker rm -f &amp;lt;container_id&amp;gt;&lt;br /&gt;
Where {{ ic |container_id}} is the id of the container you wish to stop.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Create a new volume to allow persisting data long-term:&lt;br /&gt;
 docker volume create &amp;lt;volume_name&amp;gt;&lt;br /&gt;
Where {{ ic |volume_name}} is the name the volume should use.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kubernetes ==&lt;br /&gt;
&lt;br /&gt;
[https://kubernetes.io/ Kubernetes] is a an architecture that runs and manages docker-like containers for applications.&lt;br /&gt;
&lt;br /&gt;
{{ note | This is a simplified overview of useful commands for using Kubernetes. For full official docs, see https://kubernetes.io/docs/concepts/overview/}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kubernetes Sub Parts ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Control Plane&#039;&#039;&#039; - Where decisions are made.&lt;br /&gt;
** Generally has 3 of these running, to ensure availability.&lt;br /&gt;
* &#039;&#039;&#039;Worker Node&#039;&#039;&#039; - A location where something might be running.&lt;br /&gt;
** Can have any number of these, as needed.&lt;br /&gt;
** Parts:&lt;br /&gt;
*** &#039;&#039;&#039;Kubletes&#039;&#039;&#039; - Manages one or more PODS, each POD being a group of docker-style containers.&lt;br /&gt;
*** &#039;&#039;&#039;Kube Proxy&#039;&#039;&#039; - Ensures communication is fluid between all parts.&lt;br /&gt;
*** &#039;&#039;&#039;Controller&#039;&#039;&#039; - Helps control all other aspects, to ensure it does what it&#039;s meant to.&lt;br /&gt;
* &#039;&#039;&#039;External Resources&#039;&#039;&#039; - Various outside resources that the &#039;&#039;&#039;Control Plane&#039;&#039;&#039; and &#039;&#039;&#039;Worker Nodes&#039;&#039;&#039; do work with.&lt;br /&gt;
** Ex: Storage, load balancers, etc.&lt;br /&gt;
* &#039;&#039;&#039;API&#039;&#039;&#039; - An interface for humans to interact with the &#039;&#039;&#039;Control Planes&#039;&#039;&#039;.&lt;br /&gt;
** Most interactions with the &#039;&#039;&#039;API&#039;&#039;&#039; involve telling Kubernetes &amp;quot;this is the state I want everything to be in&amp;quot;. Kubernetes then figures out how to make that happen.&lt;br /&gt;
** Parts:&lt;br /&gt;
*** &#039;&#039;&#039;Scheduler&#039;&#039;&#039; - Determines what should happen, when, and where.&lt;br /&gt;
*** &#039;&#039;&#039;Controller Manager&#039;&#039;&#039; - Manages the controllers.&lt;br /&gt;
*** &#039;&#039;&#039;Key-Value Store&#039;&#039;&#039; - Effectively a &amp;quot;database of possible states&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Kubernetes Commands ===&lt;br /&gt;
&lt;br /&gt;
{{ todo | Figure out common/useful commands and add here. }}&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Docker&amp;diff=801</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Docker&amp;diff=801"/>
		<updated>2023-07-06T03:32:45Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Add various commands and such&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{ todo | Page is very incomplete. Notes of learning docker/kubernetes here. }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
[https://www.docker.com/ Docker] creates and runs &#039;&#039;&#039;containers&#039;&#039;&#039;, which are sand-boxed processes, isolated from all other processes, with their own allocated cpu/memory/etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Docker Sub Parts ===&lt;br /&gt;
&lt;br /&gt;
Core Parts:&lt;br /&gt;
* &#039;&#039;&#039;Image&#039;&#039;&#039; - A definition of docker logic, which can be spun up and run as a &#039;&#039;&#039;container&#039;&#039;&#039;.&lt;br /&gt;
** Due to how docker works, any number of containers can be build from this image, and it will run on any OS that supports docker.&lt;br /&gt;
* &#039;&#039;&#039;Container&#039;&#039;&#039; - A unique, running instance of a docker &#039;&#039;&#039;image&#039;&#039;&#039;.&lt;br /&gt;
** Multiple containers can be created from a single image.&lt;br /&gt;
* &#039;&#039;&#039;Volume&#039;&#039;&#039; - An location for docker to persist data to long-term.&lt;br /&gt;
** Allows data to last even as a container is started, stopped, and restarted.&lt;br /&gt;
** Also allows multiple containers to share a set of data, so long as the data is put into the volume.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Setup:&lt;br /&gt;
* &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039; - A file that defines the docker service to run.&lt;br /&gt;
* &#039;&#039;&#039;Dockerfile&#039;&#039;&#039; - A file that defines the actual commands the docker instance should execute once it is created, in order to setup the intended container service.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{ todo |Are the below two commands useful? Needed?}}&lt;br /&gt;
These two files should be put into the same directory. Then {{ ic |cd}} into the directory and build it with {{ ic |docker-compose run}}.&lt;br /&gt;
&lt;br /&gt;
Finally, start the service with {{ ic |docker-compose up -build -d}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Docker Commands ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Commands to Launch Containers ====&lt;br /&gt;
&lt;br /&gt;
Launch a built image as a new container instance:&lt;br /&gt;
 docker run -dp &amp;lt;ports_to_map&amp;gt; &amp;lt;optional_mount_command&amp;gt; &amp;lt;image_name&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* {{ ic |ports_to_map}} corresponds to the {{ ic |HOST:PORT:PORT}} values to map the container ports to the host.&lt;br /&gt;
** Ex: A value of {{ ic |127.0.0.1:3000:3000 }} would map port 3000 on localhost to port 3000 on the container.&lt;br /&gt;
* {{ ic |optional_mount_command}} - Optional. See below for mount command explanations.&lt;br /&gt;
* {{ ic |image_name}} - Corresponds to the name of the image you wish to create a container of.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker run -dp 127.0.0.1:3000:3000 my-cool-image&lt;br /&gt;
&lt;br /&gt;
{{ warn |With the above command, data will NEVER persist long term. If the container is ever restarted or rebuilt, all data in the container will be lost.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Command Mount Subsection =====&lt;br /&gt;
&lt;br /&gt;
To persist data long term, we need to add some form of &#039;&#039;&#039;mount&#039;&#039;&#039; subcommand.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Volume Mount:&lt;br /&gt;
* &#039;&#039;&#039;Volume Mount&#039;&#039;&#039; - Allows persisting data for docker instances.&lt;br /&gt;
** Follows the format {{ ic |&amp;lt;nowiki&amp;gt;--mount type=volume,src=&amp;lt;volume_name&amp;gt;,target=&amp;lt;filepath_in_container&amp;gt;&amp;lt;/nowiki&amp;gt;}}.&lt;br /&gt;
*** Where:&lt;br /&gt;
**** {{ ic |volume_name}} - Corresponds to the name of the already-created docker &#039;&#039;&#039;volume&#039;&#039;&#039; to mount.&lt;br /&gt;
**** {{ ic |filepath_in_container}} - Corresponds to the filepath the volume should mount to, within the container. Ex: {{ ic |/etc/my_volume}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker run -dp 127.0.0.1:3000:3000 --mount type=volume,src=my-volume,target=/etc/my_volume my-cool-image&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bind Mount:&lt;br /&gt;
* &#039;&#039;&#039;Bind Mount&#039;&#039;&#039; - Allows sharing data between host machine and container, via linking filepaths (similar to a [[Linux/Hard Drive Management#Sym_Links | symlink]]).&lt;br /&gt;
** Follows the format {{ ic |&amp;lt;nowiki&amp;gt;--mount type=bind,src=&amp;lt;filepath_on_host&amp;gt;,target=&amp;lt;filepath_in_container&amp;gt;&amp;lt;/nowiki&amp;gt;}}.&lt;br /&gt;
*** Where:&lt;br /&gt;
**** {{ ic |filepath_on_host}} - Corresponds to a folder located on HOST machine, to share with container.&lt;br /&gt;
**** {{ ic |filepath_in_container}} - Corresponds to the filepath the volume should mount to, within the container. Ex: {{ ic |/etc/my_volume}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 docker run -dp 127.0.0.1:3000:3000 --mount type=bind,src=/srv/my_project/share_folder,target=/etc/my_volume my-cool-image&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== General Commands ====&lt;br /&gt;
&lt;br /&gt;
List all docker containers:&lt;br /&gt;
 docker ps&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Access a given running container:&lt;br /&gt;
 docker exec &amp;lt;container_id&amp;gt;&lt;br /&gt;
Where {{ ic |container_id}} is the id of the container you wish to access.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Build docker image from the {{ ic |Dockerfile}} in current directory:&lt;br /&gt;
 docker build -t &amp;lt;image_name&amp;gt;&lt;br /&gt;
Where {{ ic |image_name}} is the name you wish to give the image.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stop running docker container:&lt;br /&gt;
 docker stop &amp;lt;container_id&amp;gt;&lt;br /&gt;
Where {{ ic |container_id}} is the id of the container you wish to stop.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Remove existing docker container:&lt;br /&gt;
 docker rm &amp;lt;container_id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OR combine the above two commands with:&lt;br /&gt;
 docker rm -f &amp;lt;container_id&amp;gt;&lt;br /&gt;
Where {{ ic |container_id}} is the id of the container you wish to stop.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Create a new volume to allow persisting data long-term:&lt;br /&gt;
 docker volume create &amp;lt;volume_name&amp;gt;&lt;br /&gt;
Where {{ ic |volume_name}} is the name the volume should use.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kubernetes ==&lt;br /&gt;
&lt;br /&gt;
[https://kubernetes.io/ Kubernetes] is a an architecture that runs and manages docker-like containers for applications.&lt;br /&gt;
&lt;br /&gt;
{{ note | This is a simplified overview of useful commands for using Kubernetes. For full official docs, see https://kubernetes.io/docs/concepts/overview/}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kubernetes Sub Parts ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Control Plane&#039;&#039;&#039; - Where decisions are made.&lt;br /&gt;
** Generally has 3 of these running, to ensure availability.&lt;br /&gt;
* &#039;&#039;&#039;Worker Node&#039;&#039;&#039; - A location where something might be running.&lt;br /&gt;
** Can have any number of these, as needed.&lt;br /&gt;
** Parts:&lt;br /&gt;
*** &#039;&#039;&#039;Kubletes&#039;&#039;&#039; - Manages one or more PODS, each POD being a group of docker-style containers.&lt;br /&gt;
*** &#039;&#039;&#039;Kube Proxy&#039;&#039;&#039; - Ensures communication is fluid between all parts.&lt;br /&gt;
*** &#039;&#039;&#039;Controller&#039;&#039;&#039; - Helps control all other aspects, to ensure it does what it&#039;s meant to.&lt;br /&gt;
* &#039;&#039;&#039;External Resources&#039;&#039;&#039; - Various outside resources that the &#039;&#039;&#039;Control Plane&#039;&#039;&#039; and &#039;&#039;&#039;Worker Nodes&#039;&#039;&#039; do work with.&lt;br /&gt;
** Ex: Storage, load balancers, etc.&lt;br /&gt;
* &#039;&#039;&#039;API&#039;&#039;&#039; - An interface for humans to interact with the &#039;&#039;&#039;Control Planes&#039;&#039;&#039;.&lt;br /&gt;
** Most interactions with the &#039;&#039;&#039;API&#039;&#039;&#039; involve telling Kubernetes &amp;quot;this is the state I want everything to be in&amp;quot;. Kubernetes then figures out how to make that happen.&lt;br /&gt;
** Parts:&lt;br /&gt;
*** &#039;&#039;&#039;Scheduler&#039;&#039;&#039; - Determines what should happen, when, and where.&lt;br /&gt;
*** &#039;&#039;&#039;Controller Manager&#039;&#039;&#039; - Manages the controllers.&lt;br /&gt;
*** &#039;&#039;&#039;Key-Value Store&#039;&#039;&#039; - Effectively a &amp;quot;database of possible states&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Kubernetes Commands ===&lt;br /&gt;
&lt;br /&gt;
{{ todo | Figure out common/useful commands and add here. }}&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Docker&amp;diff=800</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Docker&amp;diff=800"/>
		<updated>2023-07-06T01:17:12Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Update page formatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{ todo | Page is very incomplete. Notes of learning docker/kubernetes here. }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
The {{ ic |docker-compose.yml}} file defines the docker service to run.&lt;br /&gt;
&lt;br /&gt;
The {{ ic |Dockerfile}} file defines the actual commands the docker instance should execute once it is created, in order to get our service.&lt;br /&gt;
&lt;br /&gt;
These two files should be put into the same directory. Then {{ ic |cd}} into the directory and build it with {{ ic |docker-compose run}}.&lt;br /&gt;
&lt;br /&gt;
Finally, start the service with {{ ic |docker-compose up -build -d}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kubernetes ==&lt;br /&gt;
&lt;br /&gt;
Kubernetes is a an architecture that runs and manages docker-like containers for applications.&lt;br /&gt;
&lt;br /&gt;
{{ note | This is a simplified overview of useful commands for using Kubernetes. For full official docs, see https://kubernetes.io/docs/concepts/overview/}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kubernetes Sub Parts ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Control Plane&#039;&#039;&#039; - Where decisions are made.&lt;br /&gt;
** Generally has 3 of these running, to ensure availability.&lt;br /&gt;
* &#039;&#039;&#039;Worker Node&#039;&#039;&#039; - A location where something might be running.&lt;br /&gt;
** Can have any number of these, as needed.&lt;br /&gt;
** Parts:&lt;br /&gt;
*** &#039;&#039;&#039;Kubletes&#039;&#039;&#039; - Manages one or more PODS, each POD being a group of docker-style containers.&lt;br /&gt;
*** &#039;&#039;&#039;Kube Proxy&#039;&#039;&#039; - Ensures communication is fluid between all parts.&lt;br /&gt;
*** &#039;&#039;&#039;Controller&#039;&#039;&#039; - Helps control all other aspects, to ensure it does what it&#039;s meant to.&lt;br /&gt;
* &#039;&#039;&#039;External Resources&#039;&#039;&#039; - Various outside resources that the &#039;&#039;&#039;Control Plane&#039;&#039;&#039; and &#039;&#039;&#039;Worker Nodes&#039;&#039;&#039; do work with.&lt;br /&gt;
** Ex: Storage, load balancers, etc.&lt;br /&gt;
* &#039;&#039;&#039;API&#039;&#039;&#039; - An interface for humans to interact with the &#039;&#039;&#039;Control Planes&#039;&#039;&#039;.&lt;br /&gt;
** Most interactions with the &#039;&#039;&#039;API&#039;&#039;&#039; involve telling Kubernetes &amp;quot;this is the state I want everything to be in&amp;quot;. Kubernetes then figures out how to make that happen.&lt;br /&gt;
** Parts:&lt;br /&gt;
*** &#039;&#039;&#039;Scheduler&#039;&#039;&#039; - Determines what should happen, when, and where.&lt;br /&gt;
*** &#039;&#039;&#039;Controller Manager&#039;&#039;&#039; - Manages the controllers.&lt;br /&gt;
*** &#039;&#039;&#039;Key-Value Store&#039;&#039;&#039; - Effectively a &amp;quot;database of possible states&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Kubernetes Commands ===&lt;br /&gt;
&lt;br /&gt;
{{ todo | Figure out common/useful commands and add here. }}&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Docker&amp;diff=799</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Docker&amp;diff=799"/>
		<updated>2023-07-06T00:55:55Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Add initial kubernetes section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{ todo | Page is very incomplete. Notes of learning docker/kubernetes here. }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
The {{ ic |docker-compose.yml}} file defines the docker service to run.&lt;br /&gt;
&lt;br /&gt;
The {{ ic |Dockerfile}} file defines the actual commands the docker instance should execute once it is created, in order to get our service.&lt;br /&gt;
&lt;br /&gt;
These two files should be put into the same directory. Then {{ ic |cd}} into the directory and build it with {{ ic |docker-compose run}}.&lt;br /&gt;
&lt;br /&gt;
Finally, start the service with {{ ic |docker-compose up -build -d}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kubernetes ==&lt;br /&gt;
&lt;br /&gt;
Kubernetes is a an architecture that runs and manages docker-like containers for applications.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Consists of:&lt;br /&gt;
* &#039;&#039;&#039;Control Plane&#039;&#039;&#039; - Where decisions are made.&lt;br /&gt;
** Generally has 3 of these running, to ensure availability.&lt;br /&gt;
* &#039;&#039;&#039;Worker Node&#039;&#039;&#039; - A location where something might be running.&lt;br /&gt;
** Can have any number of these, as needed.&lt;br /&gt;
** Parts:&lt;br /&gt;
*** &#039;&#039;&#039;Kubletes&#039;&#039;&#039; - Manages one or more PODS, each POD being a group of docker-style containers.&lt;br /&gt;
*** &#039;&#039;&#039;Kube Proxy&#039;&#039;&#039; - Ensures communication is fluid between all parts.&lt;br /&gt;
*** &#039;&#039;&#039;Controller&#039;&#039;&#039; - Helps control all other aspects, to ensure it does what it&#039;s meant to.&lt;br /&gt;
* &#039;&#039;&#039;External Resources&#039;&#039;&#039; - Various outside resources that the &#039;&#039;&#039;Control Plane&#039;&#039;&#039; and &#039;&#039;&#039;Worker Nodes&#039;&#039;&#039; do work with.&lt;br /&gt;
** Ex: Storage, load balancers, etc.&lt;br /&gt;
* &#039;&#039;&#039;API&#039;&#039;&#039; - An interface for humans to interact with the &#039;&#039;&#039;Control Planes&#039;&#039;&#039;.&lt;br /&gt;
** Most interactions with the &#039;&#039;&#039;API&#039;&#039;&#039; involve telling Kubernetes &amp;quot;this is the state I want everything to be in&amp;quot;. Kubernetes then figures out how to make that happen.&lt;br /&gt;
** Parts:&lt;br /&gt;
*** &#039;&#039;&#039;Scheduler&#039;&#039;&#039; - Determines what should happen, when, and where.&lt;br /&gt;
*** &#039;&#039;&#039;Controller Manager&#039;&#039;&#039; - Manages the controllers.&lt;br /&gt;
*** &#039;&#039;&#039;Key-Value Store&#039;&#039;&#039; - Effectively a &amp;quot;database of possible states&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=MediaWiki:Common.css&amp;diff=798</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=MediaWiki:Common.css&amp;diff=798"/>
		<updated>2023-07-06T00:40:10Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Add todo style&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Styling for code snippets. */&lt;br /&gt;
pre, .mw-code, code {&lt;br /&gt;
    background-color: #f5fcff;&lt;br /&gt;
    border-color: #999999;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* General styles for template boxes. */&lt;br /&gt;
.wiki-template-box {&lt;br /&gt;
    padding: 5px;&lt;br /&gt;
    margin: 0.5em;&lt;br /&gt;
    background-color: #f8f9fa;&lt;br /&gt;
    border: thin solid #eaecf0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.wiki-template-box.tip {&lt;br /&gt;
    background-color: #ddffdd;&lt;br /&gt;
    border-color: #bbddbb;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.wiki-template-box.note {&lt;br /&gt;
    background-color: #ddddff;&lt;br /&gt;
    border-color: #bbbbdd;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.wiki-template-box.warn {&lt;br /&gt;
    background-color: #ffdddd;&lt;br /&gt;
    border-color: #ddbbbb;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.wiki-template-box.todo {&lt;br /&gt;
    background-color: #fffcf5;&lt;br /&gt;
    border-color: #ddbbbb;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Template:Todo&amp;diff=797</id>
		<title>Template:Todo</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Template:Todo&amp;diff=797"/>
		<updated>2023-07-06T00:38:06Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Create page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
== Description ==&lt;br /&gt;
A template used to describe WIP/unfinished content.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
{{bc|&amp;lt;nowiki&amp;gt;{{Todo|Something needing work updating.}}&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
{{Todo|Something needing work or updating.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&amp;lt;div class=&amp;quot;wiki-template-box todo&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;ToDo:&amp;lt;/strong&amp;gt; {{{1}}}&amp;lt;/div&amp;gt;&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Docker&amp;diff=796</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Docker&amp;diff=796"/>
		<updated>2023-07-05T20:00:13Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Create page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{ todo | Page is very incomplete. Notes of learning docker here. }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The {{ ic |docker-compose.yml}} file defines the docker service to run.&lt;br /&gt;
&lt;br /&gt;
The {{ ic |Dockerfile}} file defines the actual commands the docker instance should execute once it is created, in order to get our service.&lt;br /&gt;
&lt;br /&gt;
These two files should be put into the same directory. Then {{ ic |cd}} into the directory and build it with {{ ic |docker-compose run}}.&lt;br /&gt;
&lt;br /&gt;
Finally, start the service with {{ ic |docker-compose up -build -d}}.&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Linux&amp;diff=795</id>
		<title>Linux</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Linux&amp;diff=795"/>
		<updated>2023-07-05T19:53:50Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Add link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General Linux Management ==&lt;br /&gt;
* [[Linux/User Management | User Management]]&lt;br /&gt;
* [[Linux/Hard Drive Management | Hard Drive Management]]&lt;br /&gt;
* [[Linux/Crontab | Crontab]]&lt;br /&gt;
* [[Linux/Screen  |Screen]]&lt;br /&gt;
* [[Linux/Swap Space | Swap Space]]&lt;br /&gt;
* [[Linux/Uncomplicated Firewall | Uncomplicated Firewall]]&lt;br /&gt;
* [[SSH]]&lt;br /&gt;
* [[Linux Tar Files | Tar Files]]&lt;br /&gt;
* [[Linux/General Server Management | General Server Management]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ubuntu ==&lt;br /&gt;
* [[Ubuntu Troubleshooting]]&lt;br /&gt;
* [[Apt-Get]]&lt;br /&gt;
* [[Apt-Get Packages]]&lt;br /&gt;
* [[Ubuntu Desktop Configuration]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Arch Linux ==&lt;br /&gt;
* [[Arch Troubleshooting]]&lt;br /&gt;
* [[Pacman]]&lt;br /&gt;
* [[Pacman Packages]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
* [[Docker]]&lt;br /&gt;
* [[VirtualBox]]&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Linux&amp;diff=794</id>
		<title>Linux</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Linux&amp;diff=794"/>
		<updated>2023-05-07T01:27:42Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Correct link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General Linux Management ==&lt;br /&gt;
* [[Linux/User Management | User Management]]&lt;br /&gt;
* [[Linux/Hard Drive Management | Hard Drive Management]]&lt;br /&gt;
* [[Linux/Crontab | Crontab]]&lt;br /&gt;
* [[Linux/Screen  |Screen]]&lt;br /&gt;
* [[Linux/Swap Space | Swap Space]]&lt;br /&gt;
* [[Linux/Uncomplicated Firewall | Uncomplicated Firewall]]&lt;br /&gt;
* [[SSH]]&lt;br /&gt;
* [[Linux Tar Files | Tar Files]]&lt;br /&gt;
* [[Linux/General Server Management | General Server Management]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ubuntu ==&lt;br /&gt;
* [[Ubuntu Troubleshooting]]&lt;br /&gt;
* [[Apt-Get]]&lt;br /&gt;
* [[Apt-Get Packages]]&lt;br /&gt;
* [[Ubuntu Desktop Configuration]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Arch Linux ==&lt;br /&gt;
* [[Arch Troubleshooting]]&lt;br /&gt;
* [[Pacman]]&lt;br /&gt;
* [[Pacman Packages]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
* [[VirtualBox]]&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Programming/Git&amp;diff=793</id>
		<title>Programming/Git</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Programming/Git&amp;diff=793"/>
		<updated>2023-05-07T01:26:55Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Add some additional commands&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Git&#039;&#039;&#039; is the current, most common way of applying &#039;&#039;&#039;Version Control&#039;&#039;&#039; to programming projects.&lt;br /&gt;
&lt;br /&gt;
Effectively, it&#039;s like making backups of your code, but doing so in a very organized way that&#039;s universally accepted by the entire programming community.&lt;br /&gt;
&lt;br /&gt;
While there are plenty of different GUI interfaces for using git, it&#039;s best to learn how to use it from the command line. That way, no matter what OS or environment you&#039;re in, you&#039;ll always know what you&#039;re doing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
If you&#039;ve never used git before, I strongly recommend looking into https://learngitbranching.js.org/ before anything else.&lt;br /&gt;
&lt;br /&gt;
At minimum, I recommend doing the first three lessons to get started. If you plan to do any coding with others, then the first row of the &#039;&#039;&#039;Remote&#039;&#039;&#039; lessons is also strongly encouraged.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
Download the latest installer from https://git-scm.com/download/win&lt;br /&gt;
* {{ TODO | Check current install options. }}&lt;br /&gt;
&lt;br /&gt;
=== Arch Linux ===&lt;br /&gt;
 sudo pacman -Syu git tk&lt;br /&gt;
&lt;br /&gt;
=== Ubuntu ===&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt install git gitk&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
Once installed on your machine, you&#039;ll need to set some default values.&lt;br /&gt;
&lt;br /&gt;
The two required defaults are:&lt;br /&gt;
 git config --global user.name &#039;&amp;lt;your_name&amp;gt;&#039;&lt;br /&gt;
 git config --global user.email &#039;&amp;lt;your_email&amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
Where &#039;&#039;&#039;&amp;lt;your_name&amp;gt;&#039;&#039;&#039; and &#039;&#039;&#039;&amp;lt;your_email&amp;gt;&#039;&#039;&#039; are your actual first+last name, and email, surrounded by single quotes.&lt;br /&gt;
&lt;br /&gt;
Optionally, you can also change the default text editor for commands like {{ ic |git commit}} via:&lt;br /&gt;
 git config --global core.editor &#039;&amp;lt;text_editor&amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
Where &#039;&#039;&#039;&amp;lt;text_editor&amp;gt;&#039;&#039;&#039; is your preferred text editor, such as &#039;&#039;&#039;notepad&#039;&#039;&#039;, &#039;&#039;&#039;nano&#039;&#039;&#039;, or &#039;&#039;&#039;vim&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Using Git ==&lt;br /&gt;
Once you get used to it, git really isn&#039;t as complicated as it might initially seem.&lt;br /&gt;
&lt;br /&gt;
Having said that, here are some important concepts to keep in mind:&lt;br /&gt;
* Before you use any other git commands, you&#039;ll need to create or pull a git repo.&lt;br /&gt;
** This can be done with either the {{ ic |git init}} or {{ ic |git clone &amp;lt;repo_url&amp;gt;}} commands.&lt;br /&gt;
* &#039;&#039;&#039;Committing&#039;&#039;&#039; - Committing a file essentially means &amp;quot;saving the changes to the git repo, so that it&#039;s preserved.&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;Staging&#039;&#039;&#039; - Staging a file is an intermediary step between changing the file, and committing it.&lt;br /&gt;
** The point of staging is that you can ensure you only commit changes you intended to add. And you can double check for typos/bugs, etc.&lt;br /&gt;
&lt;br /&gt;
=== Gitk ===&lt;br /&gt;
&#039;&#039;&#039;Gitk&#039;&#039;&#039; is a common GUI extension to git, that can be brought up from the command line.&lt;br /&gt;
&lt;br /&gt;
It shows all sorts of useful information, such as commits (with visual branch merges), who wrote the commit, date, files changed in commit, etc. Very strongly recommend learning to use.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Git Commands ==&lt;br /&gt;
&lt;br /&gt;
=== Basic Commands ===&lt;br /&gt;
The most basic of commands. You&#039;ll use these often.&lt;br /&gt;
&lt;br /&gt;
To check the current staging status of the project:&lt;br /&gt;
 git status&lt;br /&gt;
&lt;br /&gt;
To check more detailed status of the project:&lt;br /&gt;
 gitk&lt;br /&gt;
&lt;br /&gt;
To stage a single changed file:&lt;br /&gt;
 git add &amp;lt;path_to_file&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To stage all changed files and subfolders in a given folder:&lt;br /&gt;
 git add &amp;lt;path_to_folder&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To stage all changed files in repo:&lt;br /&gt;
 git add -A&lt;br /&gt;
&lt;br /&gt;
To unstage a file or folder:&lt;br /&gt;
 git reset &amp;lt;path_to_file_or_folder&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To create a commit of all staged files:&lt;br /&gt;
 git commit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Repo Management Commands ===&lt;br /&gt;
Commands that aren&#039;t used often, but are essential to managing git projects long term.&lt;br /&gt;
&lt;br /&gt;
To create a new git repo with the current directory as root:&lt;br /&gt;
 git init&lt;br /&gt;
&lt;br /&gt;
To set a url for the current project:&lt;br /&gt;
 git remote add origin &amp;lt;git_repo_url&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To change a url for the current project:&lt;br /&gt;
 git remote set-url origin &amp;lt;git_repo_url&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push all local commits to the project url:&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
To pull all commits that aren&#039;t yet on the local machine:&lt;br /&gt;
 git pull&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Branch Commands ===&lt;br /&gt;
Commands that pertain to managing branches. Fairly essential for larger, group projects.&lt;br /&gt;
&lt;br /&gt;
To display all existing local branches:&lt;br /&gt;
 git branch&lt;br /&gt;
&lt;br /&gt;
To create a new branch using the current commit:&lt;br /&gt;
 git branch &amp;lt;branch_name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To select a different branch:&lt;br /&gt;
 git checkout &amp;lt;branch_name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To merge the contents of a different branch into the current one:&lt;br /&gt;
 git merge &amp;lt;branch_name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To delete an existing branch:&lt;br /&gt;
 git branch -d &amp;lt;branch_name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Show all known branches, including from origin:&lt;br /&gt;
 git branch -a&lt;br /&gt;
&lt;br /&gt;
Remove any local references to remote branches that are now gone:&lt;br /&gt;
 git remote prune origin&lt;br /&gt;
&lt;br /&gt;
=== Tag Commands ===&lt;br /&gt;
Git tags are useful placeholders which target a specific commit, giving it the project meaningful label (such as a version number) at a given place in project history.&lt;br /&gt;
&lt;br /&gt;
To create a tag at the currently checked-out commit:&lt;br /&gt;
 git tag &amp;lt;tag_name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push all created tags from local to remote:&lt;br /&gt;
 git push --tags&lt;br /&gt;
&lt;br /&gt;
To delete a tag locally:&lt;br /&gt;
 git tag -d &amp;lt;tag_name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To delete a tag on remote:&lt;br /&gt;
 git push origin --delete &amp;lt;tag_name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced Commands ===&lt;br /&gt;
{{ warn | These commands can potentially break your repo or make you lose code if you don&#039;t know what you&#039;re doing. But they can be very powerful if you&#039;re comfortable with git. }}&lt;br /&gt;
&lt;br /&gt;
To tell git to assume a file is unchanged (Only persists on the local machine):&lt;br /&gt;
 git update-index --assume-unchanged &amp;lt;path_to_file&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To undo the above command:&lt;br /&gt;
 git update-index --no-assume-unchanged &amp;lt;path_to_file&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To completely reset the project to the status of the last commit (changes will be lost!):&lt;br /&gt;
 git reset --hard&lt;br /&gt;
&lt;br /&gt;
==== Rebasing ====&lt;br /&gt;
Rebasing is effectively a fancy way of saying &amp;quot;editing previous commits&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Generally, it&#039;s fine to do if the commits you&#039;re editing are all local, and not yet pushed up to the server yet. But unless you know what you&#039;re doing, it&#039;s strongly recommended to avoid rebasing if the commits you want to edit are already pushed.&lt;br /&gt;
&lt;br /&gt;
To start a rebase:&lt;br /&gt;
* First, look at your commit history (either via something like gitk, or exploring the online repo).&lt;br /&gt;
* Find the commit directly prior to the one you wish to edit. Note the first 6 or so letters and digits of the commit hash.&lt;br /&gt;
* In a terminal, run:&lt;br /&gt;
 git rebase --interactive &amp;lt;first_6_values&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At this point, a new view will open up with your text editor of choice. It will display all commits from the current one, all the way until it finds the commit indicated by those 6 hash values.&lt;br /&gt;
&lt;br /&gt;
For each commit, you can choose one of multiple options. Most common are:&lt;br /&gt;
* &#039;&#039;&#039;pick&#039;&#039;&#039; - Leave commit as-is. No changes. This is the default.&lt;br /&gt;
* &#039;&#039;&#039;edit&#039;&#039;&#039; - Select commit for editing.&lt;br /&gt;
* &#039;&#039;&#039;drop&#039;&#039;&#039; - Remove commit and associated changes from project.&lt;br /&gt;
&lt;br /&gt;
If you selected any commits for editing, then the project will go through them, in order of oldest to newest. Make the changes you wish, stage the files with {{ ic |git add}}, and then update the commit with:&lt;br /&gt;
 git commit --amend&lt;br /&gt;
&lt;br /&gt;
Once you&#039;re done editing the commit and wish to move on, use:&lt;br /&gt;
 git rebase --continue&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Git Log Tree ====&lt;br /&gt;
This is a long command that shows the git repo tree in a terminal-friendly output:&lt;br /&gt;
 git log --graph --simplify-by-decoration --pretty=format:&#039;\&#039;&#039;%d&#039;\&#039;&#039; --all&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Recommended to save this to the {{ ic |.bashrc}} file, such as via:&lt;br /&gt;
 gbtree=&#039;git log --graph --simplify-by-decoration --pretty=format:&#039;\&#039;&#039;%d&#039;\&#039;&#039; --all&#039;&lt;br /&gt;
==== Repo Statistics ====&lt;br /&gt;
Generally speaking, these commands aren&#039;t used much.&amp;lt;br&amp;gt;&lt;br /&gt;
For example different developers will have different sizes of commits. And even if they were consistent, one person might have higher quality code than the other, which these can&#039;t measure.&lt;br /&gt;
&lt;br /&gt;
Having said that, these commands may still be useful on rare occasion. More as a general approximation than a direct metric.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To see the number of total commits per author:&lt;br /&gt;
 git shortlog -sne&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To see the number of code lines updated by an author:&lt;br /&gt;
 git log --numstat --pretty=&amp;quot;%H&amp;quot; --author=&amp;quot;&amp;lt;author_name&amp;gt;&amp;quot; &amp;lt;start_commit&amp;gt;..&amp;lt;end_commit&amp;gt; | awk &#039;NF==3 {plus+=$1; minus+=$2} END {printf(&amp;quot;+%d, -%d\n&amp;quot;, plus, minus)}&#039;&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;author_name&amp;gt;&#039;&#039;&#039; - Should be replaced by the author&#039;s commit name. Can be seen when using the &#039;&#039;&#039;gitk&#039;&#039;&#039; command.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;start_commit&amp;gt;&#039;&#039;&#039; - The hash for the commit to start checking from.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;end_commit&amp;gt;&#039;&#039;&#039; - The hash for the commit to check up through.&lt;br /&gt;
&lt;br /&gt;
{{ note | For the above, the first 6 or so characters of the hash should be enough. Commit hashes can be found via the &#039;&#039;&#039;gitk&#039;&#039;&#039; command. Most online repository sites (GitHub, Bitbucket, etc) also display commit hashes. }}&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Linux/General_Server_Management&amp;diff=792</id>
		<title>Linux/General Server Management</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Linux/General_Server_Management&amp;diff=792"/>
		<updated>2023-05-07T01:23:06Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Add hostname values&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== HostName Management ==&lt;br /&gt;
The &#039;&#039;&#039;HostName&#039;&#039;&#039; is the value that displays such as when connecting via an ssh terminal.&lt;br /&gt;
&lt;br /&gt;
=== Display Current HostName ===&lt;br /&gt;
&lt;br /&gt;
 hostname&lt;br /&gt;
&lt;br /&gt;
To view additional information, use:&lt;br /&gt;
 hostnamectl&lt;br /&gt;
&lt;br /&gt;
=== Change HostName ===&lt;br /&gt;
&lt;br /&gt;
 sudo hostnamectl set-hostname &amp;lt;desired_new_name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Datetime Management ==&lt;br /&gt;
These commands control what datetime your system uses.&lt;br /&gt;
&lt;br /&gt;
=== View Current System Timezone ===&lt;br /&gt;
 cat /etc/timezone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== View Current System Date ===&lt;br /&gt;
 date&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Set System Timezone ===&lt;br /&gt;
 sudo timedatectl set-timezone &amp;lt;timezone&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 sudo timedatectl set-timezone America/New_York&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Linux/Datetime_Management&amp;diff=791</id>
		<title>Linux/Datetime Management</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Linux/Datetime_Management&amp;diff=791"/>
		<updated>2023-05-07T01:20:44Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Brodriguez moved page Linux/Datetime Management to Linux/General Server Management&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Linux/General Server Management]]&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Linux/General_Server_Management&amp;diff=790</id>
		<title>Linux/General Server Management</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Linux/General_Server_Management&amp;diff=790"/>
		<updated>2023-05-07T01:20:44Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Brodriguez moved page Linux/Datetime Management to Linux/General Server Management&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== View Current System Timezone ==&lt;br /&gt;
 cat /etc/timezone&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== View Current System Date ==&lt;br /&gt;
 date&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Set System Timezone ==&lt;br /&gt;
 sudo timedatectl set-timezone &amp;lt;timezone&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 sudo timedatectl set-timezone America/New_York&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Programming/Arrays&amp;diff=789</id>
		<title>Programming/Arrays</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Programming/Arrays&amp;diff=789"/>
		<updated>2023-05-05T06:20:06Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: test&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Arrays are one of the most common data structures.&lt;br /&gt;
&lt;br /&gt;
For the most basic implementation (that most languages use), arrays are a sequential block of memory, where items are placed one after another from beginning to end. In other words, you can think of an array as a sequential, non-interrupting list of items.&lt;br /&gt;
&lt;br /&gt;
Specifying an index declares which item number you wish to examine in the list.&lt;br /&gt;
&lt;br /&gt;
{{ Note | The first array index for most (but not all) languages will start at 0. This is contradictory to what most people expect when being introduced to arrays, who will (naturally) assume it starts at 1.}}&lt;br /&gt;
&lt;br /&gt;
Generally speaking, the syntax for arrays in most languages uses [ ] (square brackets).&lt;br /&gt;
 Ex: [1, 2, 3, 4, 5, 6, 10]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Managing Arrays ==&lt;br /&gt;
Computers generally need to be explicitly told what to do. This is no exception for arrays. Thus, when an array is created, an explicit size needs to be provided so the computer understands how large to make it.&lt;br /&gt;
&lt;br /&gt;
Furthermore, in most languages, each array can only hold one single data type. To be able to allocate multiple data types, either use multiple arrays or consider making an array of predefined [[Structs]].&lt;br /&gt;
&lt;br /&gt;
{{ Tip | Some languages, such as JavaScript and Python are intelligent enough to handle array sizing for you, in the background. However, for most languages such as C, C#, and Java, you have to manage the size of the array yourself.}}&lt;br /&gt;
&lt;br /&gt;
=== Resizing Arrays ===&lt;br /&gt;
Since array sizes need to be explicitly defined, they can&#039;t be arbitrarily expanded or shrunken. To change the size of an already existing array, create a new array of the desired size, then loop through the indexes of the old one and copy each value over.&lt;br /&gt;
&lt;br /&gt;
For example, achieving this in C# may look as follows:&lt;br /&gt;
 // Original array creation. Has 4 total elements, with indexes 0 through 3.&lt;br /&gt;
 old_array = new string[4] { &amp;quot;Apple&amp;quot;, &amp;quot;Orange&amp;quot;, &amp;quot;Pineapple&amp;quot;, &amp;quot;Pear&amp;quot; };&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 // Updating array to hold another element.&lt;br /&gt;
 // Following the advice below, we upgrade our array to a size of 8.&lt;br /&gt;
 new_array = new string[8];&lt;br /&gt;
 for (int index = 0; index &amp;lt; old_array.Length; index++) {&lt;br /&gt;
     new_array[index] = old_array[index];&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Furthermore, consider keeping the array size as a power of 2. This is for two reasons:&lt;br /&gt;
# Due to how computer memory management works, powers of 2 tend to be the most efficient, space-wise.&lt;br /&gt;
# This forces creation of multiple new index values, instead of just one. That way, the array doesn&#039;t need to be recreated for each individual new index added. Instead it&#039;s recreated once in a while, and the extra indexes effectively provide a buffer for future additions.&lt;br /&gt;
&lt;br /&gt;
For example, if you need an array of 5 elements, use a size of 8 (aka &amp;lt;math&amp;gt;2^3&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Then, at a later date, say you hypothetically need to increase the size of this array to be four times larger (20 elements). Create a new array of size 32 (aka &amp;lt;math&amp;gt;2^5&amp;lt;/math&amp;gt;), and then copy those initial 5 elements over from the original array.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Multi-Dimensional Arrays ==&lt;br /&gt;
{{ Todo | Add this section. }}&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Programming/Arrays&amp;diff=788</id>
		<title>Programming/Arrays</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Programming/Arrays&amp;diff=788"/>
		<updated>2023-05-05T06:19:59Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;test&lt;br /&gt;
&lt;br /&gt;
Arrays are one of the most common data structures.&lt;br /&gt;
&lt;br /&gt;
For the most basic implementation (that most languages use), arrays are a sequential block of memory, where items are placed one after another from beginning to end. In other words, you can think of an array as a sequential, non-interrupting list of items.&lt;br /&gt;
&lt;br /&gt;
Specifying an index declares which item number you wish to examine in the list.&lt;br /&gt;
&lt;br /&gt;
{{ Note | The first array index for most (but not all) languages will start at 0. This is contradictory to what most people expect when being introduced to arrays, who will (naturally) assume it starts at 1.}}&lt;br /&gt;
&lt;br /&gt;
Generally speaking, the syntax for arrays in most languages uses [ ] (square brackets).&lt;br /&gt;
 Ex: [1, 2, 3, 4, 5, 6, 10]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Managing Arrays ==&lt;br /&gt;
Computers generally need to be explicitly told what to do. This is no exception for arrays. Thus, when an array is created, an explicit size needs to be provided so the computer understands how large to make it.&lt;br /&gt;
&lt;br /&gt;
Furthermore, in most languages, each array can only hold one single data type. To be able to allocate multiple data types, either use multiple arrays or consider making an array of predefined [[Structs]].&lt;br /&gt;
&lt;br /&gt;
{{ Tip | Some languages, such as JavaScript and Python are intelligent enough to handle array sizing for you, in the background. However, for most languages such as C, C#, and Java, you have to manage the size of the array yourself.}}&lt;br /&gt;
&lt;br /&gt;
=== Resizing Arrays ===&lt;br /&gt;
Since array sizes need to be explicitly defined, they can&#039;t be arbitrarily expanded or shrunken. To change the size of an already existing array, create a new array of the desired size, then loop through the indexes of the old one and copy each value over.&lt;br /&gt;
&lt;br /&gt;
For example, achieving this in C# may look as follows:&lt;br /&gt;
 // Original array creation. Has 4 total elements, with indexes 0 through 3.&lt;br /&gt;
 old_array = new string[4] { &amp;quot;Apple&amp;quot;, &amp;quot;Orange&amp;quot;, &amp;quot;Pineapple&amp;quot;, &amp;quot;Pear&amp;quot; };&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 // Updating array to hold another element.&lt;br /&gt;
 // Following the advice below, we upgrade our array to a size of 8.&lt;br /&gt;
 new_array = new string[8];&lt;br /&gt;
 for (int index = 0; index &amp;lt; old_array.Length; index++) {&lt;br /&gt;
     new_array[index] = old_array[index];&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Furthermore, consider keeping the array size as a power of 2. This is for two reasons:&lt;br /&gt;
# Due to how computer memory management works, powers of 2 tend to be the most efficient, space-wise.&lt;br /&gt;
# This forces creation of multiple new index values, instead of just one. That way, the array doesn&#039;t need to be recreated for each individual new index added. Instead it&#039;s recreated once in a while, and the extra indexes effectively provide a buffer for future additions.&lt;br /&gt;
&lt;br /&gt;
For example, if you need an array of 5 elements, use a size of 8 (aka &amp;lt;math&amp;gt;2^3&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Then, at a later date, say you hypothetically need to increase the size of this array to be four times larger (20 elements). Create a new array of size 32 (aka &amp;lt;math&amp;gt;2^5&amp;lt;/math&amp;gt;), and then copy those initial 5 elements over from the original array.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Multi-Dimensional Arrays ==&lt;br /&gt;
{{ Todo | Add this section. }}&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Programming/C/Memory_Model&amp;diff=787</id>
		<title>Programming/C/Memory Model</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Programming/C/Memory_Model&amp;diff=787"/>
		<updated>2023-04-23T02:47:39Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Add more about pointers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Both [[ Programming/C | C]] and [[ Programming/C++ | C++]] force the programmer to manage pointers and memory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is a manual process. This is also both a blessing and a curse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On one hand, the programmer can potentially manage references and variable/object deconstruction (aka, what many languages refer to as &amp;quot;garbage collection&amp;quot;) much better than any language that has garbage collection built-in and handled automagically.&amp;lt;br&amp;gt;&lt;br /&gt;
In other words, a given [[ Programming/C | C]]/[[ Programming/C++ | C++]] program can potentially be magnitudes more efficient.&lt;br /&gt;
&lt;br /&gt;
On the other hand, if not careful, or if they don&#039;t know what they&#039;re doing, a programmer can introduce many bugs and unintentional problems by incorrect manual garbage collection.&amp;lt;br&amp;gt;&lt;br /&gt;
A set of memory can be allocated that&#039;s too small. So memory references overlap and garble data. Or data can be forgotten about, potentially hanging in memory and taking up space far far longer than it would have been around with automatic garbage collection.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pointers and memory management is one of the biggest differences between C/C++ and any other language.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Computer Memory ==&lt;br /&gt;
&lt;br /&gt;
A computer&#039;s memory is a series of locations called &#039;&#039;&#039;addresses&#039;&#039;&#039;. Each memory address:&lt;br /&gt;
* Can contain a set amount of data, represented as a given amount of 1&#039;s and 0&#039;s.&lt;br /&gt;
* Is represented with a unique identifier number.&lt;br /&gt;
&lt;br /&gt;
{{ todo | Document binary, at least basics. }}&lt;br /&gt;
&lt;br /&gt;
The 1&#039;s and 0&#039;s are called &#039;&#039;&#039;Binary&#039;&#039;&#039;. The computer automatically converts data to binary to store it in memory, and then back to the original format, so we as humans can understand it. Similarly, the computer will automatically determine the unique identifiers that correspond to each address space.&lt;br /&gt;
&lt;br /&gt;
So while it&#039;s potentially useful to understand these underlying concepts, we as programmers don&#039;t (usually) need to directly deal with these concepts.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{ Note | For very large pieces of data, we can chain together memory addresses to store more information. Thus, different addresses have varying sizes. }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Stack Memory Vs Heap Memory ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stack ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;stack&#039;&#039;&#039; is a contiguous section of memory that contains memory for local variables. Every program has a unique stack generated at runtime.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It is called &amp;quot;the stack&amp;quot; because variables are placed in stack-order.&amp;lt;br&amp;gt;&lt;br /&gt;
Aka, a program starts, and the {{ ic |main()}} function (as well as any corresponding local variables) are immediately placed on the stack.&amp;lt;br&amp;gt;&lt;br /&gt;
Any time another function is called, that is placed directly on top of the current existing stack (along with any corresponding local variables for that function).&lt;br /&gt;
&lt;br /&gt;
In this way, when a function is done executing, it will always be on the top of the stack, and will thusly be popped off the stack, as it is no longer required.&lt;br /&gt;
&lt;br /&gt;
This process repeats until all functions for the program have completed, and the program&#039;s {{ ic |main()}} function finally terminates.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Due to how this works, the stack size for any given function is known at compile time. This memory is allocated at application start up.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;Stack Overflow&#039;&#039;&#039; error is when functions on the stack nest too deep, and the application runs out of the stack memory that was assigned at program startup.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Heap ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;heap&#039;&#039;&#039; is a section of memory that allows variables to be dynamically allocated during runtime. This is done via calls with the {{ ic |new}} keyword, {{ ic |malloc()}} calls, or other similar functions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note that, unlike the stack, everything in the heap is manually allocated by the programmer.&lt;br /&gt;
&lt;br /&gt;
Similarly, it everything in the heap should be manually unallocated when no longer used. Any instance when a program does NOT release allocated heap memory is a memory leak.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As long as the OS has enough memory available, memory of any size can be allocated.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pointers ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;pointer&#039;&#039;&#039; is simply a variable that says &amp;quot;there is something here at this specific location in memory, and I expect it to be of x size.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In other words, pointers are references to specific locations in memory. Any value can have a pointer created for it, regardless of it the value is on the stack or heap.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The actual size of a pointer depends on the OS. For example, in a 64-bit OS, the pointer is really just a 64-bit unsigned integer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When possible, it&#039;s better to pass pointers around, as it&#039;s faster to pass a pointer than, say a whole class object. Aka, pointers are often preferable to copying a value.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Implicit Vs Explicit References ===&lt;br /&gt;
&lt;br /&gt;
Pointers are defined by using the {{ ic |*}} character after the variable type. We can also get the memory location of a value by using the {{ ic |&amp;amp;}} character before a variable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is an &#039;&#039;&#039;implicit&#039;&#039;&#039; example. In this code, it will look like and be treated as if it were a standard variable.&lt;br /&gt;
 // Create int with value of &amp;quot;5&amp;quot;.&lt;br /&gt;
 int my_int = 5;&lt;br /&gt;
 &lt;br /&gt;
 // Create pointer to above int.&lt;br /&gt;
 int&amp;amp; my_pointer = my_int;&lt;br /&gt;
 &lt;br /&gt;
 // We can then reference as if it were any standard variable.&lt;br /&gt;
 printf(&amp;quot;%d&amp;quot;, my_pointer);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is an &#039;&#039;&#039;explicit&#039;&#039;&#039; example. In this code, it will look like and be treated as a pointer.&lt;br /&gt;
 // Create int with value of &amp;quot;5&amp;quot;.&lt;br /&gt;
 int my_int = 5;&lt;br /&gt;
 &lt;br /&gt;
 // Create pointer to above int.&lt;br /&gt;
 int* my_pointer = &amp;amp;my_int;&lt;br /&gt;
 &lt;br /&gt;
 // We must then use pointer syntax to actually get our value.&lt;br /&gt;
 printf(&amp;quot;%d&amp;quot;, *my_pointer);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{ warn |If you ever have a variable on the heap (created via {{ ic |new}}, {{ ic |malloc()}}, or similar)}} that no longer has a pointer referencing it, then that is a memory leak}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Misc Advice ==&lt;br /&gt;
&lt;br /&gt;
* Be careful when copying any non-trivial variables, such as classes.&lt;br /&gt;
** Any class variables such as pointers will be copied as-is. This means when the copy is destroyed, the pointer is de-referenced for all classes.&lt;br /&gt;
** This would then potentially cause errors for any other copies (or the original) when trying to access the pointer or deconstruct those as well.&lt;br /&gt;
* With classes, it&#039;s generally best to define manually constructors and deconstructors. This can, for example, help avoid the above problem, as well as other potential problems.&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Programming/C/Memory_Model&amp;diff=786</id>
		<title>Programming/C/Memory Model</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Programming/C/Memory_Model&amp;diff=786"/>
		<updated>2023-04-23T01:53:40Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Update page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Both [[ Programming/C | C]] and [[ Programming/C++ | C++]] force the programmer to manage pointers and memory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is a manual process. This is also both a blessing and a curse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On one hand, the programmer can potentially manage references and variable/object deconstruction (aka, what many languages refer to as &amp;quot;garbage collection&amp;quot;) much better than any language that has garbage collection built-in and handled automagically.&amp;lt;br&amp;gt;&lt;br /&gt;
In other words, a given [[ Programming/C | C]]/[[ Programming/C++ | C++]] program can potentially be magnitudes more efficient.&lt;br /&gt;
&lt;br /&gt;
On the other hand, if not careful, or if they don&#039;t know what they&#039;re doing, a programmer can introduce many bugs and unintentional problems by incorrect manual garbage collection.&amp;lt;br&amp;gt;&lt;br /&gt;
A set of memory can be allocated that&#039;s too small. So memory references overlap and garble data. Or data can be forgotten about, potentially hanging in memory and taking up space far far longer than it would have been around with automatic garbage collection.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pointers and memory management is one of the biggest differences between C/C++ and any other language.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Computer Memory ==&lt;br /&gt;
&lt;br /&gt;
A computer&#039;s memory is a series of locations called &#039;&#039;&#039;addresses&#039;&#039;&#039;. Each memory address:&lt;br /&gt;
* Can contain a set amount of data, represented as a given amount of 1&#039;s and 0&#039;s.&lt;br /&gt;
* Is represented with a unique identifier number.&lt;br /&gt;
&lt;br /&gt;
{{ todo | Document binary, at least basics. }}&lt;br /&gt;
&lt;br /&gt;
The 1&#039;s and 0&#039;s are called &#039;&#039;&#039;Binary&#039;&#039;&#039;. The computer automatically converts data to binary to store it in memory, and then back to the original format, so we as humans can understand it. Similarly, the computer will automatically determine the unique identifiers that correspond to each address space.&lt;br /&gt;
&lt;br /&gt;
So while it&#039;s potentially useful to understand these underlying concepts, we as programmers don&#039;t (usually) need to directly deal with these concepts.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{ Note | For very large pieces of data, we can chain together memory addresses to store more information. Thus, different addresses have varying sizes. }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Stack Memory Vs Heap Memory ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stack ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;stack&#039;&#039;&#039; is a contiguous section of memory that contains memory for local variables. Every program has a unique stack generated at runtime.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It is called &amp;quot;the stack&amp;quot; because variables are placed in stack-order.&amp;lt;br&amp;gt;&lt;br /&gt;
Aka, a program starts, and the {{ ic |main()}} function (as well as any corresponding local variables) are immediately placed on the stack.&amp;lt;br&amp;gt;&lt;br /&gt;
Any time another function is called, that is placed directly on top of the current existing stack (along with any corresponding local variables for that function).&lt;br /&gt;
&lt;br /&gt;
In this way, when a function is done executing, it will always be on the top of the stack, and will thusly be popped off the stack, as it is no longer required.&lt;br /&gt;
&lt;br /&gt;
This process repeats until all functions for the program have completed, and the program&#039;s {{ ic |main()}} function finally terminates.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Due to how this works, the stack size for any given function is known at compile time. This memory is allocated at application start up.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;Stack Overflow&#039;&#039;&#039; error is when functions on the stack nest too deep, and the application runs out of the stack memory that was assigned at program startup.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Heap ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;heap&#039;&#039;&#039; is a section of memory that allows variables to be dynamically allocated during runtime. This is done via calls with the {{ ic |new}} keyword, {{ ic |malloc()}} calls, or other similar functions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note that, unlike the stack, everything in the heap is manually allocated by the programmer.&lt;br /&gt;
&lt;br /&gt;
Similarly, it everything in the heap should be manually unallocated when no longer used. Any instance when a program does NOT release allocated heap memory is a memory leak.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As long as the OS has enough memory available, memory of any size can be allocated.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pointers ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;pointer&#039;&#039;&#039; is simply a variable that says &amp;quot;there is something here at this specific location in memory, and I expect it to be of x size.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In other words, pointers are references to specific locations in memory. Any value can have a pointer created for it, regardless of it the value is on the stack or heap.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Misc Advice ==&lt;br /&gt;
&lt;br /&gt;
* Be careful when copying any non-trivial variables, such as classes.&lt;br /&gt;
** Any class variables such as pointers will be copied as-is. This means when the copy is destroyed, the pointer is de-referenced for all classes.&lt;br /&gt;
** This would then potentially cause errors for any other copies (or the original) when trying to access the pointer or deconstruct those as well.&lt;br /&gt;
* With classes, it&#039;s generally best to define manually constructors and deconstructors. This can, for example, help avoid the above problem, as well as other potential problems.&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Programming/C/Memory_Model&amp;diff=785</id>
		<title>Programming/C/Memory Model</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Programming/C/Memory_Model&amp;diff=785"/>
		<updated>2023-04-22T20:33:09Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Expand page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Both [[ Programming/C | C]] and [[ Programming/C++ | C++]] force the programmer to manage pointers and memory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is a manual process. This is also both a blessing and a curse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On one hand, the programmer can potentially manage references and variable/object deconstruction (aka, what many languages refer to as &amp;quot;garbage collection&amp;quot;) much better than any language that has garbage collection built-in and handled automagically.&amp;lt;br&amp;gt;&lt;br /&gt;
In other words, a given [[ Programming/C | C]]/[[ Programming/C++ | C++]] program can potentially be magnitudes more efficient.&lt;br /&gt;
&lt;br /&gt;
On the other hand, if not careful, or if they don&#039;t know what they&#039;re doing, a programmer can introduce many bugs and unintentional problems by incorrect manual garbage collection.&amp;lt;br&amp;gt;&lt;br /&gt;
A set of memory can be allocated that&#039;s too small. So memory references overlap and garble data. Or data can be forgotten about, potentially hanging in memory and taking up space far far longer than it would have been around with automatic garbage collection.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pointers and memory management is one of the biggest differences between C/C++ and any other language.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Computer Memory ==&lt;br /&gt;
A computer&#039;s memory is a series of locations called &#039;&#039;&#039;addresses&#039;&#039;&#039;. Each memory address:&lt;br /&gt;
* Can contain a set amount of data, represented as a given amount of 1&#039;s and 0&#039;s.&lt;br /&gt;
* Is represented with a unique identifier number.&lt;br /&gt;
&lt;br /&gt;
{{ todo | Document binary, at least basics. }}&lt;br /&gt;
&lt;br /&gt;
The 1&#039;s and 0&#039;s are called &#039;&#039;&#039;Binary&#039;&#039;&#039;. The computer automatically converts data to binary to store it in memory, and then back to the original format, so we as humans can understand it.&amp;lt;br&amp;gt;&lt;br /&gt;
Similarly, the computer will automatically determine the unique identifiers that correspond to each address space.&amp;lt;br&amp;gt;&lt;br /&gt;
So while it&#039;s potentially useful to understand these underlying concepts, we as programmers don&#039;t (usually) need to directly deal with these concepts.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{ Note: For very large pieces of data, we can chain together memory addresses to store more information. Thus, different addresses have varying sizes. }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Stack Memory Vs Heap Memory ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Stack ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;stack&#039;&#039;&#039; is a contiguous section of memory that contains memory for local variables. Every program has a unique stack generated at runtime.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It is called &amp;quot;the stack&amp;quot; because variables are placed in stack-order.&amp;lt;br&amp;gt;&lt;br /&gt;
Aka, a program starts, and the {{ ic |main()}} function (as well as any corresponding local variables) are immediately placed on the stack.&amp;lt;br&amp;gt;&lt;br /&gt;
Any time another function is called, that is placed directly on top of the current existing stack (along with any corresponding local variables for that function).&lt;br /&gt;
&lt;br /&gt;
In this way, when a function is done executing, it will always be on the top of the stack, and will thusly be popped off the stack, as it is no longer required.&lt;br /&gt;
&lt;br /&gt;
This process repeats until all functions for the program have completed, and the program&#039;s {{ ic |main()}} function finally terminates.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Due to how this works, the stack size for any given function is known at compile time. This memory is allocated at application start up.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;Stack Overflow&#039;&#039;&#039; error is when functions on the stack nest too deep, and the application runs out of the stack memory that was assigned at program startup.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Heap ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;heap&#039;&#039;&#039; is a section of memory that allows variables to be dynamically allocated during runtime. This is done via calls with the {{ ic |new}} keyword, {{ ic |malloc()}} calls, or other similar functions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note that, unlike the stack, everything in the heap is manually allocated by the programmer. Similarly, it everything in the heap should be manually unallocated when no longer used.&lt;br /&gt;
&lt;br /&gt;
As long as the OS has enough memory available, memory of any size can be allocated.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pointers ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;pointer&#039;&#039;&#039; is simply a variable that says &amp;quot;there is something here at this specific location in memory, and I expect it to be of x size.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In other words, pointers are references to specific locations in memory. Any value can have a pointer created for it, regardless of it the value is on the stack or heap.&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Programming/C_Sharp&amp;diff=784</id>
		<title>Programming/C Sharp</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Programming/C_Sharp&amp;diff=784"/>
		<updated>2023-04-22T19:54:53Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Add some notes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;C# is a higher level version of C. It was designed by Microsoft, and for the longest time, was generally only supported on Windows.&lt;br /&gt;
&lt;br /&gt;
It&#039;s used often in large, enterprise/business scale projects, due to having solid scaffolding for enforcing consistency through the project, which allows many people to work on a given project with less maintenance overhead. This is accomplished via things like required strong typing and good support for the [[interface class]] structure.&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
* Classes are always passes by reference.&lt;br /&gt;
* Structs and value types (when not part of a class) are always passed by value.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
&lt;br /&gt;
=== Inline Comments ===&lt;br /&gt;
 // This is an inline comment.&lt;br /&gt;
&lt;br /&gt;
=== Block Comments ===&lt;br /&gt;
Because there is minimal difference in C# between inline and block comments, these are really only useful when declared above a class or function declaration line.&lt;br /&gt;
&lt;br /&gt;
This is because C# knows to treat this as documentation and adds special logic around it. For example, hovering over a class instantiation will display the block comment data for that class.&lt;br /&gt;
&lt;br /&gt;
 /// This is a block comment.&lt;br /&gt;
 /// Comment line 2.&lt;br /&gt;
 /// Another block comment line.&lt;br /&gt;
&lt;br /&gt;
=== Block/Region Declaration ===&lt;br /&gt;
Regions are used for organizational purposes, and allow for code folding at the click of a button. To be useful, both the start and end must be declared.&lt;br /&gt;
&lt;br /&gt;
 #region MyRegionName&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 #endregion MyRegionName&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Variables ==&lt;br /&gt;
Variables are strongly typed in C#. That means that you must declare the type (bool, int, string, etc) as well as the variable name.&lt;br /&gt;
&lt;br /&gt;
=== Variable Definition ===&lt;br /&gt;
 bool a_bool = true;&lt;br /&gt;
 bool b_bool = false;&lt;br /&gt;
 string my_var_1 = &amp;quot;This is &amp;quot;;&lt;br /&gt;
 string my_var_2 = &amp;quot;a string.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
=== Variable Usage ===&lt;br /&gt;
 Console.WriteLine(&amp;quot;Printing variable values.&amp;quot;);&lt;br /&gt;
 Console.WriteLine(a_bool);&lt;br /&gt;
 Console.WriteLine(b_bool);&lt;br /&gt;
 Console.WriteLine(my_var_1 + my_var_2);&lt;br /&gt;
&lt;br /&gt;
=== Variable Casting ===&lt;br /&gt;
Variables will be treated as the originally indicated type until a cast statement is used.&lt;br /&gt;
&lt;br /&gt;
For example, to convert a boolean to an int, use:&lt;br /&gt;
 bool a_bool = true;&lt;br /&gt;
 int converted_bool = Convert.ToInt32(a_bool);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== If Statements ==&lt;br /&gt;
&lt;br /&gt;
=== Basic If ===&lt;br /&gt;
 if (x == y)&lt;br /&gt;
 {&lt;br /&gt;
     // Logic if true.&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Full If ===&lt;br /&gt;
 if (x == y)&lt;br /&gt;
 {&lt;br /&gt;
     // Logic if true.&lt;br /&gt;
 } else if ( x &amp;amp;&amp;amp; (y || z) )&lt;br /&gt;
 {&lt;br /&gt;
     // Logic for &amp;quot;else if&amp;quot; true.&lt;br /&gt;
 } else&lt;br /&gt;
 {&lt;br /&gt;
     // Logic for false.&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Switch/Case Statements ===&lt;br /&gt;
 switch (my_var)&lt;br /&gt;
 {&lt;br /&gt;
     case &amp;quot;1&amp;quot;:&lt;br /&gt;
         // Logic for case value of &amp;quot;1&amp;quot;.&lt;br /&gt;
         break;&lt;br /&gt;
     case &amp;quot;a&amp;quot;:&lt;br /&gt;
         // Logic for case value of &amp;quot;a&amp;quot;.&lt;br /&gt;
         break;&lt;br /&gt;
     case &amp;quot;test&amp;quot;:&lt;br /&gt;
         // Logic for case value of &amp;quot;test&amp;quot;.&lt;br /&gt;
         break;&lt;br /&gt;
     default:&lt;br /&gt;
         // Logic for no match.&lt;br /&gt;
         break;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
Functions in C# are syntactically handled similarly to C, with a few modifications. The format is:&lt;br /&gt;
 &amp;lt;accessibility&amp;gt; &amp;lt;return_type&amp;gt; &amp;lt;function_name&amp;gt;(&amp;lt;args&amp;gt;)&lt;br /&gt;
 {&lt;br /&gt;
     // Function logic here.&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 public void MyFunc(int my_int, string my_string)&lt;br /&gt;
 {&lt;br /&gt;
     // Function logic here.&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Accessibility ===&lt;br /&gt;
Accessibility levels indicate what can and cannot access the given variable or function. The most types are as follows:&lt;br /&gt;
&lt;br /&gt;
{{ note | See [https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/accessibility-levels this link] to see the all levels in the Microsoft docs. }}&lt;br /&gt;
* &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt; - Anything can access it.&lt;br /&gt;
* &amp;lt;code&amp;gt;protected&amp;lt;/code&amp;gt; - This class and all inheriting children can access it.&lt;br /&gt;
* &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt; - Only this class can access it. Not even inheriting children have access.&lt;br /&gt;
&lt;br /&gt;
=== Return Type ===&lt;br /&gt;
The return type is exactly that. Aka, the type of the variable that the function returns on function exit. If a variable does not return anything, then the type of &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; type.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Basic Data structures ==&lt;br /&gt;
&lt;br /&gt;
=== Arrays ===&lt;br /&gt;
Arrays are one of the most common data structures. See [[Arrays]] for more info.&lt;br /&gt;
&lt;br /&gt;
In C#, all indexes for a given array must hold the same data type.&lt;br /&gt;
&lt;br /&gt;
==== Declaring Arrays ====&lt;br /&gt;
Declare an array by specifying the type, followed by brackets, followed by the array name.&lt;br /&gt;
 string[] my_array;&lt;br /&gt;
&lt;br /&gt;
Then we can initialize the array by declaring the number of indexes. For example, to declare 4 indexes, use:&lt;br /&gt;
 my_array = new string[4];&lt;br /&gt;
&lt;br /&gt;
If you want to initialize with pre-populated values, you can take it a step further with something like:&lt;br /&gt;
 my_array = new string[4] { &amp;quot;Index 0&amp;quot;, &amp;quot;Index 1&amp;quot;, &amp;quot;Some String Value&amp;quot;, &amp;quot;Final Index&amp;quot; };&lt;br /&gt;
&lt;br /&gt;
Finally, note that you can combine declaration and initialization into one line.&lt;br /&gt;
&lt;br /&gt;
==== Accessing Array Values ====&lt;br /&gt;
The syntax to access an array is as follows:&lt;br /&gt;
 // Update index 1.&lt;br /&gt;
 my_array[1] = &amp;quot;Test Index 1&amp;quot;;&lt;br /&gt;
 // Read index 1.&lt;br /&gt;
 Console.WriteLine(my_array[1]);&lt;br /&gt;
&lt;br /&gt;
To access all array indexes in order, use a standard for loop.&lt;br /&gt;
 for (int index = 0; index &amp;lt; my_array.Length; index++)&lt;br /&gt;
 {&lt;br /&gt;
     Console.WriteLine(my_array[index]);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Dictionaries ===&lt;br /&gt;
Dictionaries can be incredibly powerful. See [[Dictionaries]] for more info.&lt;br /&gt;
&lt;br /&gt;
==== Declaring Dictionaries ====&lt;br /&gt;
Similarly to C# arrays, once the data type is declared in a dictionary, it cannot be changed. However, note that &amp;quot;keys&amp;quot; and &amp;quot;values&amp;quot; in a dictionary can each hold a different, unique data type.&lt;br /&gt;
&lt;br /&gt;
For example, to declare a dictionary of string keys and int values, use:&lt;br /&gt;
 Dictionary&amp;lt;string, int&amp;gt; my_dict = new Dictionary&amp;lt;string, int&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
==== Accessing Dictionary Values ====&lt;br /&gt;
To set new key-value pairs, use:&lt;br /&gt;
 my_dict.Add(&amp;lt;key&amp;gt;, &amp;lt;value&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
To read an existing key-value pair, use:&lt;br /&gt;
 my_dict[&amp;lt;key&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
To update an existing key-value pair, use:&lt;br /&gt;
 my_dict[&amp;lt;key&amp;gt;] = &amp;lt;updated_value&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
To remove an existing key-value pair, use:&lt;br /&gt;
  my_dict.Remove(&amp;lt;key&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
Here&#039;s an example of a dictionary for a hypothetical business trying to track count of items sold.&lt;br /&gt;
&lt;br /&gt;
 // Create our dict.&lt;br /&gt;
 Dictionary&amp;lt;string, int&amp;gt; product_sold = new Dictionary&amp;lt;string, int&amp;gt;();&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 // Add initial values.&lt;br /&gt;
 product_sold.Add(&amp;quot;Ice Cream&amp;quot;, 50);&lt;br /&gt;
 product_sold.Add(&amp;quot;Burgers&amp;quot;, 56);&lt;br /&gt;
 product_sold.Add(&amp;quot;Pizza&amp;quot;, 102);&lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 // Sold another pizza. Update value.&lt;br /&gt;
 product_sold[&amp;quot;Pizza&amp;quot;] += 1;&lt;br /&gt;
&lt;br /&gt;
=== Structs ===&lt;br /&gt;
Structs are essentially a means to group sets of variables together. They are handled very similarly to C structs.&lt;br /&gt;
&lt;br /&gt;
Unlike C# arrays or dicts, structs are able to combine as many variable types as desired.&lt;br /&gt;
&lt;br /&gt;
==== Struct Declaration ====&lt;br /&gt;
First, declare the struct type itself.&amp;lt;br&amp;gt;&lt;br /&gt;
If familiar with classes, this will look a lot like declaring a simplified class that has only class variables and nothing else.&lt;br /&gt;
 struct MyStructObject&lt;br /&gt;
 {&lt;br /&gt;
     public bool test_bool;&lt;br /&gt;
     public int test_int;&lt;br /&gt;
     public string test_string;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Once the struct type is declared, we can create instances of it to use.&lt;br /&gt;
 MyStructObject a_struct = new MyStructObject();&lt;br /&gt;
&lt;br /&gt;
==== Accessing Struct Items ====&lt;br /&gt;
Structs are basically containers for holding the associated variables within. Thus, we can easily access the contained variables with syntax that should look fairly familiar.&lt;br /&gt;
 // Set or update struct values.&lt;br /&gt;
 a_struct.test_bool = true;&lt;br /&gt;
 a_struct.test_int = 5;&lt;br /&gt;
 a_struct.test_string = &amp;quot;My test string&amp;quot;; &lt;br /&gt;
 &amp;amp;nbsp;&lt;br /&gt;
 // Print struct values.&lt;br /&gt;
 Console.WriteLine(a_struct.test_bool);&lt;br /&gt;
 Console.WriteLine(a_struct.test_int);&lt;br /&gt;
 Console.WriteLine(a_struct.test_string);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Classes ==&lt;br /&gt;
A class can be thought of as a struct that can have functions built into it.&lt;br /&gt;
&lt;br /&gt;
Classes are generally defined in new, separate files. A good rule of thumb is to only include multiple classes in one file if they are nested, inner subclasses within the first class.&lt;br /&gt;
&lt;br /&gt;
{{ note | In C#, class variables and methods are often called with &amp;lt;code&amp;gt;this.&amp;lt;value&amp;gt;&amp;lt;/code&amp;gt;, to help differentiate between local and class level values. However, this is optional and will not always be followed. }}&lt;br /&gt;
&lt;br /&gt;
=== Class Variables ===&lt;br /&gt;
To declare class level variables, declare the variable name and type in the class, but don&#039;t assign to it.&lt;br /&gt;
&lt;br /&gt;
For organization, it&#039;s recommended to do this at the very top of the class, and enclose it within a region.&lt;br /&gt;
&lt;br /&gt;
 class MyClass&lt;br /&gt;
 {&lt;br /&gt;
     #region Variables&lt;br /&gt;
     &amp;amp;nbsp;&lt;br /&gt;
     bool test_bool;&lt;br /&gt;
     int test_int;&lt;br /&gt;
     string test_string;&lt;br /&gt;
     &amp;amp;nbsp;&lt;br /&gt;
     #endregion Variables&lt;br /&gt;
     &amp;amp;nbsp;&lt;br /&gt;
     ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Constructor ===&lt;br /&gt;
A constructor is essentially the logic that&#039;s ran on class instantiation.&lt;br /&gt;
&lt;br /&gt;
To declare a constructor, declare a method with the same name as the class and &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt; accessibility.&lt;br /&gt;
&lt;br /&gt;
If your class needs to be able to handle multiple possible sets of passed arguments, then create one constructor for each.&lt;br /&gt;
&lt;br /&gt;
For example, this is a constructor for a class that takes 0 arguments.&lt;br /&gt;
 class MyClass&lt;br /&gt;
 {&lt;br /&gt;
     ...&lt;br /&gt;
     &amp;amp;nbsp;&lt;br /&gt;
     public MyClass()&lt;br /&gt;
     {&lt;br /&gt;
          // Constructor logic here.&lt;br /&gt;
     }&lt;br /&gt;
     &amp;amp;nbsp;&lt;br /&gt;
     ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Properties ===&lt;br /&gt;
Properties are a &amp;quot;safer&amp;quot; way to read (get) and update (set) class variables.&lt;br /&gt;
&lt;br /&gt;
Effectively, properties are functions that handle a single variable, and allow for custom logic to clean/validate your variable before saving it to the class or returning it for use outside of the class.&lt;br /&gt;
&lt;br /&gt;
Minimum property syntax (to both set and get) is as follows:&lt;br /&gt;
 class MyClass&lt;br /&gt;
 {&lt;br /&gt;
     #region Variables&lt;br /&gt;
     &amp;amp;nbsp;&lt;br /&gt;
     string test_string;&lt;br /&gt;
     &amp;amp;nbsp;&lt;br /&gt;
     #endregion Variables&lt;br /&gt;
     &amp;amp;nbsp;&lt;br /&gt;
     ...&lt;br /&gt;
     &amp;amp;nbsp;&lt;br /&gt;
     public string TestString&lt;br /&gt;
     {&lt;br /&gt;
         get { return this.test_string; }&lt;br /&gt;
         set { this.test_string = value; }&lt;br /&gt;
     }&lt;br /&gt;
     &amp;amp;nbsp;&lt;br /&gt;
     ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
If we want to expand this to show how it can be useful, we can validate our value first.&lt;br /&gt;
 class MyClass&lt;br /&gt;
 {&lt;br /&gt;
     #region Variables&lt;br /&gt;
     &amp;amp;nbsp;&lt;br /&gt;
     string test_string;&lt;br /&gt;
     &amp;amp;nbsp;&lt;br /&gt;
     #endregion Variables&lt;br /&gt;
     &amp;amp;nbsp;&lt;br /&gt;
     ...&lt;br /&gt;
     &amp;amp;nbsp;&lt;br /&gt;
     public string TestString&lt;br /&gt;
     {&lt;br /&gt;
         get&lt;br /&gt;
         {&lt;br /&gt;
             // First check if our string is a known bad value.&lt;br /&gt;
             if (this.test_string == &amp;quot;I&#039;m an invalid value, ohno!&amp;quot;)&lt;br /&gt;
             {&lt;br /&gt;
                 // Invalid value detected! Return something else as a fallback.&lt;br /&gt;
                 return &amp;quot;Default string value.&amp;quot;&lt;br /&gt;
             } else&lt;br /&gt;
             {&lt;br /&gt;
                 // If we got here, then the string is valid. Return that.&lt;br /&gt;
                 return this.test_string;&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         set&lt;br /&gt;
         {&lt;br /&gt;
             // Check if our provided value is valid before setting.&lt;br /&gt;
             // In this case, we simply make sure it&#039;s 3 characters or greater.&lt;br /&gt;
             if (this.test_string.Length &amp;gt; 2)&lt;br /&gt;
             {&lt;br /&gt;
                 this.test_string = value;&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
     &amp;amp;nbsp;&lt;br /&gt;
     ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Class Functions ===&lt;br /&gt;
Class functions are declared and handled the same way as any other C# function. See functions section.&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Programming/C/Memory_Model&amp;diff=783</id>
		<title>Programming/C/Memory Model</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Programming/C/Memory_Model&amp;diff=783"/>
		<updated>2023-04-22T19:15:33Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Import memory sections for C++ page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Both [[ Programming/C | C]] and [[ Programming/C++ | C++]] force the programmer to manage pointers and memory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is a manual process. This is also both a blessing and a curse.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On one hand, the programmer can potentially manage references and variable/object deconstruction (aka, what many languages refer to as &amp;quot;garbage collection&amp;quot;) much better than any language that has garbage collection built-in and handled automagically.&amp;lt;br&amp;gt;&lt;br /&gt;
In other words, a given [[ Programming/C | C]]/[[ Programming/C++ | C++]] program can potentially be magnitudes more efficient.&lt;br /&gt;
&lt;br /&gt;
On the other hand, if not careful, or if they don&#039;t know what they&#039;re doing, a programmer can introduce many bugs and unintentional problems by incorrect manual garbage collection.&amp;lt;br&amp;gt;&lt;br /&gt;
A set of memory can be allocated that&#039;s too small. So memory references overlap and garble data. Or data can be forgotten about, potentially hanging in memory and taking up space far far longer than it would have been around with automatic garbage collection.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pointers and memory management is one of the biggest differences between C/C++ and any other language.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Computer Memory ==&lt;br /&gt;
A computer&#039;s memory is a series of locations called &#039;&#039;&#039;addresses&#039;&#039;&#039;. Each memory address:&lt;br /&gt;
* Can contain a set amount of data, represented as a given amount of 1&#039;s and 0&#039;s.&lt;br /&gt;
* Is represented with a unique identifier number.&lt;br /&gt;
&lt;br /&gt;
{{ todo | Document binary, at least basics. }}&lt;br /&gt;
&lt;br /&gt;
The 1&#039;s and 0&#039;s are called &#039;&#039;&#039;Binary&#039;&#039;&#039;. The computer automatically converts data to binary to store it in memory, and then back to the original format, so we as humans can understand it.&amp;lt;br&amp;gt;&lt;br /&gt;
Similarly, the computer will automatically determine the unique identifiers that correspond to each address space.&amp;lt;br&amp;gt;&lt;br /&gt;
So while it&#039;s potentially useful to understand these underlying concepts, we as programmers don&#039;t (usually) need to directly deal with these concepts.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: For very large pieces of data, we can chain together memory addresses to store more information. Thus, addresses defined by pointers have varying sizes.&amp;lt;br&amp;gt;&lt;br /&gt;
This is how one can make addresses overlap.&lt;br /&gt;
&lt;br /&gt;
For example, let&#039;s say a programmer makes two sequential int address pointers. So we have {{ ic |&amp;lt;nowiki&amp;gt;... | open memory | int pointer #1 | int_pointer #2 | open memory |...&amp;lt;/nowiki&amp;gt;}}.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Normally, one assigns a standard integer value to each location and this is fine.&lt;br /&gt;
HOWEVER, if one assigns a larger data type to &amp;quot;int pointer #1&amp;quot;, then it will overflow into the address space of &amp;quot;int pointer #2&amp;quot;, overriding any bits that might have already been there.&amp;lt;br&amp;gt;&lt;br /&gt;
Furthermore, if this other data type is somehow excessively large, it might overflow enough that it continues on past the entirety of &amp;quot;int pointer #2&amp;quot;, and overrides even more memory address space.&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Programming/C%2B%2B&amp;diff=782</id>
		<title>Programming/C++</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Programming/C%2B%2B&amp;diff=782"/>
		<updated>2023-04-22T19:12:39Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Further update page links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== General C/C++ Shared Pages ==&lt;br /&gt;
* [[Programming/C++/Compiling Code | Compiling Code]]&lt;br /&gt;
* [[Programming/C++/Memory Model | Memory Model]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== C++ SubPages ==&lt;br /&gt;
* [[Programming/C++/Syntax | Syntax]]&lt;br /&gt;
* [[Programming/C++/Pointers and Memory Management | Pointers and Memory Management]]&lt;br /&gt;
* [[Programming/C++/Objects and Data Structures | Objects and Data Structures]]&lt;br /&gt;
* [[Programming/C++/Headers and File Including | Headers and File Including]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiling C++ ==&lt;br /&gt;
To run any C++ code, it must first be compiled.&lt;br /&gt;
&lt;br /&gt;
To do this, in terminal, cd to the desired directory and run {{ ic |g++ &amp;lt;path_to_file&amp;gt; -o &amp;lt;name_of_file_to_create&amp;gt;}}.&lt;br /&gt;
&lt;br /&gt;
This will generate a new executable file, based on the compiled code.&amp;lt;br&amp;gt;&lt;br /&gt;
Run this file via {{ ic |./&amp;lt;name_of_created_file&amp;gt;}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For further details of how the compilation process works, see [[Programming/C++/Compiling Code | Compiling Code]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Types of Errors ==&lt;br /&gt;
&lt;br /&gt;
* Compile Time Errors - Errors that happen during file compile.&lt;br /&gt;
** Syntax Errors - Errors that happen from incorrect typed syntax for the given language.&lt;br /&gt;
** Type Errors - Errors that happen due to mismatch of declared type and attempted type usage.&lt;br /&gt;
* Link Time Errors - Errors that happen when trying to combine compiled files into a single executable program.&lt;br /&gt;
** Ex: Using a function that was never defined, or {{ ic |Main()}} instead of {{ ic |main()}}.&lt;br /&gt;
* Run Time Errors - Errors that happen during program execution.&lt;br /&gt;
** Ex: Divide-by-zero errors, or attempting to open a file mid-runtime and said file doesn&#039;t exist.&lt;br /&gt;
* Logic Errors - Soft errors that don&#039;t cause an actual crash. But can cause a program soft-lock, or general unintended behavior.&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Programming/C%2B%2B&amp;diff=781</id>
		<title>Programming/C++</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Programming/C%2B%2B&amp;diff=781"/>
		<updated>2023-04-22T19:06:49Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Update page links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== General C/C++ Shared Pages ==&lt;br /&gt;
* [[Programming/C++/Compiling Code | Compiling Code]]&lt;br /&gt;
* [[Programming/C++/Memory Model | Memory Model]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== C++ SubPages ==&lt;br /&gt;
* [[C++/Syntax]]&lt;br /&gt;
* [[C++/Pointers and Memory Management]]&lt;br /&gt;
* [[C++/Objects and Data Structures]]&lt;br /&gt;
* [[C++/Headers and File Including]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiling C++ ==&lt;br /&gt;
To run any C++ code, it must first be compiled.&lt;br /&gt;
&lt;br /&gt;
To do this, in terminal, cd to the desired directory and run {{ ic |g++ &amp;lt;path_to_file&amp;gt; -o &amp;lt;name_of_file_to_create&amp;gt;}}.&lt;br /&gt;
&lt;br /&gt;
This will generate a new executable file, based on the compiled code.&amp;lt;br&amp;gt;&lt;br /&gt;
Run this file via {{ ic |./&amp;lt;name_of_created_file&amp;gt;}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Types of Errors ==&lt;br /&gt;
&lt;br /&gt;
* Compile Time Errors - Errors that happen during file compile.&lt;br /&gt;
** Syntax Errors - Errors that happen from incorrect typed syntax for the given language.&lt;br /&gt;
** Type Errors - Errors that happen due to mismatch of declared type and attempted type usage.&lt;br /&gt;
* Link Time Errors - Errors that happen when trying to combine compiled files into a single executable program.&lt;br /&gt;
** Ex: Using a function that was never defined, or {{ ic |Main()}} instead of {{ ic |main()}}.&lt;br /&gt;
* Run Time Errors - Errors that happen during program execution.&lt;br /&gt;
** Ex: Divide-by-zero errors, or attempting to open a file mid-runtime and said file doesn&#039;t exist.&lt;br /&gt;
* Logic Errors - Soft errors that don&#039;t cause an actual crash. But can cause a program soft-lock, or general unintended behavior.&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=C%2B%2B/Memory_Model&amp;diff=780</id>
		<title>C++/Memory Model</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=C%2B%2B/Memory_Model&amp;diff=780"/>
		<updated>2023-04-22T19:05:48Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Changed redirect target from C/Memory Model to Programming/C/Memory Model&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Programming/C/Memory Model]]&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=C/Memory_Model&amp;diff=779</id>
		<title>C/Memory Model</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=C/Memory_Model&amp;diff=779"/>
		<updated>2023-04-22T19:05:28Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Changed redirect target from Programming/C++/Memory Model to Programming/C/Memory Model&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Programming/C/Memory Model]]&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=C%2B%2B/Compiling_Code&amp;diff=778</id>
		<title>C++/Compiling Code</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=C%2B%2B/Compiling_Code&amp;diff=778"/>
		<updated>2023-04-22T19:05:12Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Changed redirect target from C/Compiling Code to Programming/C/Compiling Code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Programming/C/Compiling Code]]&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=C/Compiling_Code&amp;diff=777</id>
		<title>C/Compiling Code</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=C/Compiling_Code&amp;diff=777"/>
		<updated>2023-04-22T19:04:49Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Changed redirect target from Programming/C++/Compiling Code to Programming/C/Compiling Code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Programming/C/Compiling Code]]&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Programming/C%2B%2B/Compiling_Code&amp;diff=776</id>
		<title>Programming/C++/Compiling Code</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Programming/C%2B%2B/Compiling_Code&amp;diff=776"/>
		<updated>2023-04-22T19:04:22Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Brodriguez moved page Programming/C++/Compiling Code to Programming/C/Compiling Code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Programming/C/Compiling Code]]&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Programming/C/Compiling_Code&amp;diff=775</id>
		<title>Programming/C/Compiling Code</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Programming/C/Compiling_Code&amp;diff=775"/>
		<updated>2023-04-22T19:04:22Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Brodriguez moved page Programming/C++/Compiling Code to Programming/C/Compiling Code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TODO: Populate page&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Programming/C%2B%2B/Memory_Model&amp;diff=774</id>
		<title>Programming/C++/Memory Model</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Programming/C%2B%2B/Memory_Model&amp;diff=774"/>
		<updated>2023-04-22T19:04:21Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Brodriguez moved page Programming/C++/Memory Model to Programming/C/Memory Model&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Programming/C/Memory Model]]&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Programming/C/Memory_Model&amp;diff=773</id>
		<title>Programming/C/Memory Model</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Programming/C/Memory_Model&amp;diff=773"/>
		<updated>2023-04-22T19:04:21Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Brodriguez moved page Programming/C++/Memory Model to Programming/C/Memory Model&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TODO: Populate page&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=C/Memory_Model&amp;diff=772</id>
		<title>C/Memory Model</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=C/Memory_Model&amp;diff=772"/>
		<updated>2023-04-22T19:04:07Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Brodriguez moved page C/Memory Model to Programming/C++/Memory Model&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Programming/C++/Memory Model]]&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=Programming/C/Memory_Model&amp;diff=771</id>
		<title>Programming/C/Memory Model</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=Programming/C/Memory_Model&amp;diff=771"/>
		<updated>2023-04-22T19:04:07Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Brodriguez moved page C/Memory Model to Programming/C++/Memory Model&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TODO: Populate page&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
	<entry>
		<id>https://wiki.brandon-rodriguez.com/index.php?title=C/Compiling_Code&amp;diff=770</id>
		<title>C/Compiling Code</title>
		<link rel="alternate" type="text/html" href="https://wiki.brandon-rodriguez.com/index.php?title=C/Compiling_Code&amp;diff=770"/>
		<updated>2023-04-22T19:03:56Z</updated>

		<summary type="html">&lt;p&gt;Brodriguez: Brodriguez moved page C/Compiling Code to Programming/C++/Compiling Code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Programming/C++/Compiling Code]]&lt;/div&gt;</summary>
		<author><name>Brodriguez</name></author>
	</entry>
</feed>