This repository has been archived on 2025-02-21. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
swift-mhoush.com/content/articles/2023-09-26-introduction-to-programming-for-hvac-4.md

206 lines
7.0 KiB
Markdown

---
tags: HVAC, programming, software
---
# Introduction to Programming for HVAC Part-4
This article builds upon our [last](https://mhoush.com/posts/introduction-to-programming-for-hvac-3/) article, so make sure to catch up
before continuing with this article.
## Arguments
Before we start creating our program that will remove the background from images let's go over arguments in shell scripts. Arguments are
supplied to shell scripts are separated by a space `" "`, as opposed to options which start with a `-<character>` or `--<word>`.
To illustrate this, let's change our `hello-world` script we wrote in the last article.
**Move into our scripts directory:**
```bash
cd ~/.local/bin
```
**Make a copy of the hello-world script:**
```bash
cp hello-world greet
```
Above we make a copy of the hello-world file and name the copy `greet`.
**Open the greet file:**
```bash
open -a TextEdit greet
```
> **Note:** Because the greet file is an executable, in order to open it in the `TextEdit` application we must supply the `-a` option.
> Otherwise it will just run our `greet` program in another terminal. Use `man open` to read more about the open command.
**Edit the greet file:**
```bash
#!/bin/sh
echo "Hello, ${1}!"
```
Make sure to save `⌘s` the file.
Take note that the quotes need to be changed to `"` (double quotes) from our original `hello-world` program.
The `${1}` is indicating that we will insert / interpret the first argument passed to our program and insert it at that location. Arguments
are interpreted in order they are passed in with `${0}` always representing the filename of the program that is called (generally not needed
/ used in your scripts).
**Test it out:**
```bash
./greet Michael
```
![greet-output](/articles/images/2023-09-26-greet-output.png)
If you'd like to supply multiple words (or arguments that contain spaces) as a single argument then you can wrap them in quotes.
```bash
./greet "Michael Housh"
```
> **Tip:** Wrapping in quotes is especially useful for commands that take file paths, if any of the folders or file names contain spaces.
## More Useful Program
At this point, it's time to build a more useful program that we can use. First, we must download some dependencies for our program.
**Install imagemagick:**
```bash
brew install imagemagick
```
> **Note:** If you'd like to check out the documentation / website for imagemagick you can run `brew home imagemagick`.
This will take a bit for brew to install imagemagick and it's dependencies. When it's completed, we can check to make sure that imagemagick
is installed by running the following command.
```bash
magick --version
```
It should output something along the lines of this below.
```bash
Version: ImageMagick 7.1.1-17 Q16-HDRI aarch64 21569 https://imagemagick.org
Copyright: (C) 1999 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI Modules OpenMP(5.0)
Delegates (built-in): bzlib fontconfig freetype gslib heic jng jp2 jpeg jxl lcms lqr ltdl lzma openexr png ps raw tiff webp xml zlib
Compiler: gcc (4.2)
```
> **Tip:** Don't forget, you can use the `clear` command to clear the terminal.
**Create our script:**
```bash
touch mktrans
```
We are going to name our script `mktrans` as a short for make transparent.
**Open the file:**
```bash
open mktrans
```
**The program:**
```bash
#!/bin/bash
# The input file path, passed in as the first argument.
inputfile="${1}"
# The color to make transparent, optionally passed in as the second argument.
# by default we handle / make white backgrounds transparent.
color="${2:-white}"
# Use the built-in basename command to normalize the input file name
# this will convert a file path, such as ~/Pictures/my-image.png to my-image.png.
fullfilename=$(basename -- "$inputfile")
# Use the text of the `fullfilename` up to the first '.' as the file name.
filename="${fullfilename%%.*}"
# Use the text after the last '.' as the file extension.
extension="${fullfilename##*.}"
# Create the output file name to use.
#
# For an input file of `input.png`, our output name would be
# `input-transparent.png`.
#
# This will output the file in the directory that we are
# in when we use our script (which may different than where
# the image is located)
outputfile="${filename}-transparent.${extension}"
# Make the magick happen :)
convert "${inputfile}" -fuzz 10% -transparent "${color}" "${outputfile}"
```
I've included comments in the program above, which is good practice, as there is high odds that you will forget what is going on when / if
you open the file up in the future to look at it. We are using a lot of what is called parameter expansion magic in this file. You can read
up more on what we are doing in the [bash documentation](https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html).
This script is far from perfect, there are a lot of things to be improved upon. For example, if you download / save the banner image of this
post and run this script, it will also remove some color in the wizards beard, eyes, and eye brows. However, it does work very well for my
general use case, which is to remove the background from screenshots of pdf documents. It should be noted that it will not work on all types
of images, some image types do not allow transparency, so it is safest to call this with input image being a `.png` image type, however you
can use the `imagemagick` program that we downloaded to convert other image types to `.png`, but that will be left up to you to figure out.
## Using Our Program
This is going to assume that you have download the banner image at the top of this article. You can do this by right-clicking and choosing
`Save As`. This should save the image in your downloads folder, and you can keep the name of `part4-banner.png`.
**Make the program executable:**
```bash
chmod u+x mktrans
```
**Make the image background transparent:**
```bash
./mktrans ~/Downloads/part4-banner.png
```
**Open the image:**
```bash
open part4-banner-transparent.png
```
It should look like below.
![banner-transparent](/articles/images/2023-09-26-part4-banner-transparent.png)
> **Note:** If you are viewing this site in _light_ mode, the image does not look that bad. Hit the moon button in the top above my profile
> image to see some of the flaws of our program.
---
> **Tip:** Remove the image from the `~/.local/bin` by using `rm part4-banner-transparent.png`. Be aware that the `rm` command can not be
> undone, so use with caution / knowledge. It is safer, until you are more comfortable to use the `Finder` application and move the file to
> the trash. In `Finder`, you can show hidden directories by typing `⌘.` or go directly to the folder by typing `⇧⌘G` (shift + command + G)
> and in the pop-up typing `~/.local/bin`.
---
That is it for this article. In the upcoming articles we will setup our `shell` environment so that we can use the commands we've built
without having to navigate to the `~/.local/bin` directory. Thank you for reading to the end, I hope you're finding this series helpful.